Add 13 new grammar notes with 1010 exercises from video extraction

Scraped a 4h Spanish fundamentals YouTube video (transcript + OCR on
14810 frames), extracted structured content across 52 chapters, and
generated fill-in-the-blank quizzes for every grammar topic.

- 13 new GrammarNote entries (articles, possessives, demonstratives,
  greetings, poder, al/del, prepositional pronouns, irregular yo,
  stem-changing, stressed possessives, present/future perfect, present
  indicative conjugation)
- 1010 generated exercises across all 36 grammar notes (new + existing)
- Fix tense guide parser to handle unnumbered *Usages* blocks
- Rewrite 6 broken tense guide bodies (imperative, subj pluperfect,
  subj future) with numbered usage format
- Bump courseDataVersion 5→6 with TenseGuide refresh on upgrade
- Add docs/spanish-fundamentals/ with raw transcripts, polished notes,
  structured JSON, and exercise data

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-04-16 08:40:05 -05:00
parent ff4f906128
commit 47a7871c38
297 changed files with 114661 additions and 14 deletions

View File

@@ -0,0 +1,703 @@
{
"notes": [
{
"noteId": "ser-vs-estar",
"title": "Ser vs. Estar",
"category": "Core Concepts",
"swift_let": "serVsEstarExercises",
"prefix": "se",
"prompt": "Choose ser or estar:",
"status": "existing_populated",
"target_count": 37,
"seed_count": 22,
"needed": 15,
"source_chapters": [
{
"id": "05",
"title": "The Verb Ser"
},
{
"id": "07",
"title": "The Verb Estar"
},
{
"id": "38",
"title": "Past Participles As Adjectives"
}
]
},
{
"noteId": "por-vs-para",
"title": "Por vs. Para",
"category": "Core Concepts",
"swift_let": "porVsParaExercises",
"prefix": "pp",
"prompt": "Choose por or para:",
"status": "existing_populated",
"target_count": 25,
"seed_count": 10,
"needed": 15,
"source_chapters": [
{
"id": "33",
"title": "Por & Para"
}
]
},
{
"noteId": "preterite-vs-imperfect",
"title": "Preterite vs. Imperfect",
"category": "Past Tenses",
"swift_let": "preteriteVsImperfectExercises",
"prefix": "pi",
"prompt": "Choose the correct tense:",
"status": "existing_populated",
"target_count": 64,
"seed_count": 49,
"needed": 15,
"source_chapters": [
{
"id": "25",
"title": "Past Tense for Regular Verbs (Preterite)"
},
{
"id": "26",
"title": "Past Tense of Ser and Ir"
},
{
"id": "27",
"title": "Irregular Verbs in the Past - Part 1"
},
{
"id": "28",
"title": "Irregular Verbs in the Past - Part 2"
},
{
"id": "31",
"title": "Imperfect Tense"
},
{
"id": "40",
"title": "Past Perfect Tense"
}
]
},
{
"noteId": "subjunctive-triggers",
"title": "Subjunctive Triggers",
"category": "Subjunctive",
"swift_let": "subjunctiveTriggerExercises",
"prefix": "st",
"prompt": "Subjunctive or indicative?",
"status": "existing_populated",
"target_count": 60,
"seed_count": 45,
"needed": 15,
"source_chapters": [
{
"id": "46",
"title": "Understanding the Subjunctive"
},
{
"id": "47",
"title": "Verbs in the Present Subjunctive"
},
{
"id": "48",
"title": "Examples in the Present Subjunctive"
},
{
"id": "49",
"title": "Past Subjunctive (Imperfect Subjunctive)"
},
{
"id": "50",
"title": "Present Perfect Subjunctive"
},
{
"id": "51",
"title": "Past Perfect Subjunctive"
}
]
},
{
"noteId": "reflexive-verbs",
"title": "Reflexive Verbs",
"category": "Verb Types",
"swift_let": "reflexiveVerbsExercises",
"prefix": "rv",
"prompt": "Choose the correct reflexive form:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 13,
"needed": 17,
"source_chapters": [
{
"id": "29",
"title": "Reflexive Verbs"
},
{
"id": "30",
"title": "Reciprocal Reflexive Verbs"
}
]
},
{
"noteId": "object-pronouns",
"title": "Direct & Indirect Object Pronouns",
"category": "Pronouns",
"swift_let": "objectPronounsExercises",
"prefix": "op",
"prompt": "Choose the correct pronoun:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 24,
"needed": 6,
"source_chapters": [
{
"id": "17",
"title": "Direct Object Pronouns"
},
{
"id": "18",
"title": "Indirect Object Pronouns"
},
{
"id": "19",
"title": "Combining DOPs & IOPs"
}
]
},
{
"noteId": "gustar-like-verbs",
"title": "Gustar-Like Verbs",
"category": "Verb Types",
"swift_let": "gustarLikeVerbsExercises",
"prefix": "gv",
"prompt": "Choose the correct form:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 8,
"needed": 22,
"source_chapters": [
{
"id": "20",
"title": "The Verb Gustar"
}
]
},
{
"noteId": "comparatives-superlatives",
"title": "Comparatives & Superlatives",
"category": "Adjectives",
"swift_let": "comparativesSuperlativesExercises",
"prefix": "cs",
"prompt": "Choose the correct comparison:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 8,
"needed": 22,
"source_chapters": [
{
"id": "34",
"title": "Comparatives & Superlatives"
}
]
},
{
"noteId": "conditional-if-clauses",
"title": "Conditional & If-Clauses",
"category": "Verb Tenses",
"swift_let": "conditionalIfClausesExercises",
"prefix": "ci",
"prompt": "Choose the correct form:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 14,
"needed": 16,
"source_chapters": [
{
"id": "43",
"title": "Conditional Tense"
},
{
"id": "44",
"title": "Conditional Perfect Tense"
}
]
},
{
"noteId": "commands-imperative",
"title": "Commands (Imperative)",
"category": "Verb Tenses",
"swift_let": "commandsImperativeExercises",
"prefix": "ct",
"prompt": "Choose the correct command:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 17,
"needed": 13,
"source_chapters": [
{
"id": "36",
"title": "Familiar Tú Commands"
},
{
"id": "37",
"title": "Nosotros Commands"
}
]
},
{
"noteId": "saber-vs-conocer",
"title": "Saber vs. Conocer",
"category": "Core Concepts",
"swift_let": "saberVsConocerExercises",
"prefix": "sc",
"prompt": "Choose saber or conocer:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 12,
"needed": 18,
"source_chapters": [
{
"id": "23",
"title": "The Verb Saber"
},
{
"id": "24",
"title": "The Verb Conocer"
}
]
},
{
"noteId": "double-negatives",
"title": "Double Negatives",
"category": "Sentence Structure",
"swift_let": "doubleNegativesExercises",
"prefix": "dn",
"prompt": "Choose the correct negative:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 8,
"needed": 22,
"source_chapters": [
{
"id": "35",
"title": "How Negatives Work"
}
]
},
{
"noteId": "adjective-placement",
"title": "Adjective Placement",
"category": "Sentence Structure",
"swift_let": "adjectivePlacementExercises",
"prefix": "ap",
"prompt": "Choose the correct placement:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 7,
"needed": 23,
"source_chapters": [
{
"id": "08",
"title": "Descriptive Adjectives"
}
]
},
{
"noteId": "tener-expressions",
"title": "Tener Expressions",
"category": "Core Concepts",
"swift_let": "tenerExpressionsExercises",
"prefix": "te",
"prompt": "Choose the correct expression:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 8,
"needed": 22,
"source_chapters": [
{
"id": "14",
"title": "The Verb \"Tener\""
}
]
},
{
"noteId": "personal-a",
"title": "The Personal 'a'",
"category": "Sentence Structure",
"swift_let": "personalAExercises",
"prefix": "pa",
"prompt": "Is the personal 'a' needed?",
"status": "existing_populated",
"target_count": 15,
"seed_count": 0,
"needed": 15,
"source_chapters": []
},
{
"noteId": "relative-pronouns",
"title": "Relative Pronouns (que / lo que)",
"category": "Sentence Structure",
"swift_let": "relativePronounsExercises",
"prefix": "rp",
"prompt": "Choose the correct relative pronoun:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 8,
"needed": 22,
"source_chapters": [
{
"id": "45",
"title": "Que & Lo que"
}
]
},
{
"noteId": "future-vs-ir-a",
"title": "Future vs. Ir + a + Infinitive",
"category": "Verb Tenses",
"swift_let": "futureVsIrAExercises",
"prefix": "fi",
"prompt": "Choose the correct future form:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 15,
"needed": 15,
"source_chapters": [
{
"id": "13",
"title": "The Verb \"Ir\""
},
{
"id": "41",
"title": "Future Tense"
}
]
},
{
"noteId": "accent-marks-stress",
"title": "Accent Marks & Stress",
"category": "Pronunciation",
"swift_let": "accentMarksStressExercises",
"prefix": "am",
"prompt": "Does this word need an accent?",
"status": "existing_empty",
"target_count": 30,
"seed_count": 6,
"needed": 24,
"source_chapters": [
{
"id": "02",
"title": "Spanish Fundamentals"
}
]
},
{
"noteId": "se-constructions",
"title": "Se Constructions",
"category": "Advanced",
"swift_let": "seConstructionsExercises",
"prefix": "sx",
"prompt": "Choose the correct se-construction:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 0,
"needed": 30,
"source_chapters": []
},
{
"noteId": "estar-gerund-progressive",
"title": "Estar + Gerund (Progressive)",
"category": "Verb Tenses",
"swift_let": "estarGerundProgressiveExercises",
"prefix": "eg",
"prompt": "Choose the correct form:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 6,
"needed": 24,
"source_chapters": [
{
"id": "06",
"title": "The Present Progressive"
}
]
},
{
"noteId": "spanish-suffixes",
"title": "Spanish Suffixes",
"category": "Word Building",
"swift_let": "spanishSuffixesExercises",
"prefix": "ss",
"prompt": "Choose the correct suffix:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 0,
"needed": 30,
"source_chapters": []
},
{
"noteId": "common-irregular-verbs",
"title": "Common Irregular Verbs",
"category": "Irregular Verbs",
"swift_let": "commonIrregularVerbsExercises",
"prefix": "ir",
"prompt": "Choose the correct form:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 0,
"needed": 30,
"source_chapters": []
},
{
"noteId": "types-of-irregular-verbs",
"title": "Types of Irregular Verbs",
"category": "Irregular Verbs",
"swift_let": "typesOfIrregularVerbsExercises",
"prefix": "ti",
"prompt": "Choose the correct form:",
"status": "existing_empty",
"target_count": 30,
"seed_count": 0,
"needed": 30,
"source_chapters": []
},
{
"noteId": "present-indicative-conjugation",
"title": "Present Indicative Conjugation",
"category": "Core Concepts",
"swift_let": "presentIndicativeConjugationExercises",
"prefix": "pic",
"prompt": "Choose the correct present form:",
"status": "new",
"target_count": 30,
"seed_count": 6,
"needed": 24,
"source_chapters": [
{
"id": "03",
"title": "Conjugating Verbs (Present)"
}
]
},
{
"noteId": "articles-and-gender",
"title": "Articles & Gender",
"category": "Core Concepts",
"swift_let": "articlesAndGenderExercises",
"prefix": "ag",
"prompt": "Choose the correct article:",
"status": "new",
"target_count": 30,
"seed_count": 7,
"needed": 23,
"source_chapters": [
{
"id": "04",
"title": "Articles"
}
]
},
{
"noteId": "possessive-adjectives",
"title": "Possessive Adjectives",
"category": "Adjectives",
"swift_let": "possessiveAdjectivesExercises",
"prefix": "poa",
"prompt": "Choose the correct possessive:",
"status": "new",
"target_count": 30,
"seed_count": 6,
"needed": 24,
"source_chapters": [
{
"id": "09",
"title": "Possessive Adjectives"
}
]
},
{
"noteId": "demonstrative-adjectives",
"title": "Demonstrative Adjectives",
"category": "Adjectives",
"swift_let": "demonstrativeAdjectivesExercises",
"prefix": "da",
"prompt": "Choose the correct demonstrative:",
"status": "new",
"target_count": 30,
"seed_count": 6,
"needed": 24,
"source_chapters": [
{
"id": "10",
"title": "Demonstrative Adjectives"
}
]
},
{
"noteId": "greetings-farewells",
"title": "Greetings & Farewells",
"category": "Core Concepts",
"swift_let": "greetingsFarewellsExercises",
"prefix": "gt",
"prompt": "Choose the correct greeting:",
"status": "new",
"target_count": 30,
"seed_count": 6,
"needed": 24,
"source_chapters": [
{
"id": "11",
"title": "Useful Greetings & Farewells"
}
]
},
{
"noteId": "poder-infinitive",
"title": "Poder + Infinitive",
"category": "Irregular Verbs",
"swift_let": "poderInfinitiveExercises",
"prefix": "pdi",
"prompt": "Choose the correct form of poder:",
"status": "new",
"target_count": 30,
"seed_count": 6,
"needed": 24,
"source_chapters": [
{
"id": "12",
"title": "The Verb \"Poder\""
}
]
},
{
"noteId": "al-del-contractions",
"title": "al & del Contractions",
"category": "Core Concepts",
"swift_let": "alDelContractionsExercises",
"prefix": "adc",
"prompt": "Choose the correct contraction:",
"status": "new",
"target_count": 30,
"seed_count": 7,
"needed": 23,
"source_chapters": [
{
"id": "15",
"title": "al & del"
}
]
},
{
"noteId": "prepositional-pronouns",
"title": "Prepositional Pronouns",
"category": "Pronouns",
"swift_let": "prepositionalPronounsExercises",
"prefix": "prp",
"prompt": "Choose the correct pronoun:",
"status": "new",
"target_count": 30,
"seed_count": 7,
"needed": 23,
"source_chapters": [
{
"id": "16",
"title": "Prepositional Pronouns"
}
]
},
{
"noteId": "irregular-yo-verbs",
"title": "Irregular Yo Verbs",
"category": "Irregular Verbs",
"swift_let": "irregularYoVerbsExercises",
"prefix": "iy",
"prompt": "Choose the correct yo form:",
"status": "new",
"target_count": 30,
"seed_count": 10,
"needed": 20,
"source_chapters": [
{
"id": "21",
"title": "Irregular Yo Verbs"
}
]
},
{
"noteId": "stem-changing-verbs",
"title": "Stem-Changing Verbs",
"category": "Irregular Verbs",
"swift_let": "stemChangingVerbsExercises",
"prefix": "scv",
"prompt": "Choose the correct form:",
"status": "new",
"target_count": 30,
"seed_count": 6,
"needed": 24,
"source_chapters": [
{
"id": "22",
"title": "Stem-Changing Verbs"
}
]
},
{
"noteId": "stressed-possessives",
"title": "Stressed Possessive Adjectives",
"category": "Adjectives",
"swift_let": "stressedPossessivesExercises",
"prefix": "spo",
"prompt": "Choose the correct stressed possessive:",
"status": "new",
"target_count": 30,
"seed_count": 6,
"needed": 24,
"source_chapters": [
{
"id": "32",
"title": "Stressed Possessive Adjectives"
}
]
},
{
"noteId": "present-perfect-tense",
"title": "Present Perfect",
"category": "Verb Tenses",
"swift_let": "presentPerfectTenseExercises",
"prefix": "pft",
"prompt": "Choose the correct present-perfect form:",
"status": "new",
"target_count": 30,
"seed_count": 8,
"needed": 22,
"source_chapters": [
{
"id": "39",
"title": "Present Perfect Tense"
}
]
},
{
"noteId": "future-perfect-tense",
"title": "Future Perfect",
"category": "Verb Tenses",
"swift_let": "futurePerfectTenseExercises",
"prefix": "fpt",
"prompt": "Choose the correct future-perfect form:",
"status": "new",
"target_count": 30,
"seed_count": 7,
"needed": 23,
"source_chapters": [
{
"id": "42",
"title": "Future Perfect Tense"
}
]
}
]
}