From 2ab5a69160b652757860bdce1378fdfab8d68b8b Mon Sep 17 00:00:00 2001 From: stephen Date: Sun, 21 Jun 2026 23:54:17 +1000 Subject: [PATCH] before adding Deck name to settings --- main.py | 870 ++++++++++++++++++++------------------------- spanish_trainer.db | Bin 212992 -> 368640 bytes 2 files changed, 381 insertions(+), 489 deletions(-) diff --git a/main.py b/main.py index cd04204..317bea5 100644 --- a/main.py +++ b/main.py @@ -43,10 +43,15 @@ class SpanishTrainerApp(QMainWindow): self.audio_output = QAudioOutput() self.media_player.setAudioOutput(self.audio_output) - self.current_flashcard_id = None + # Flashcard Core State Variables + self.current_flashcard_id = None # Tracks the translation_id currently being reviewed + self.current_card_is_flipped = False # False = Front, True = Back + self.current_active_es_text = "" # Caches active Spanish string + self.current_active_en_text = "" # Caches active English string + self.flashcard_ids_pool = [] # Tracks currently filtered list of translation_ids + self.current_sandbox_es_id = None self.current_sandbox_en_id = None - self.flashcard_ids_pool = [] # Tracks currently filtered study list IDs # Central Main Window Tabs Interface self.tabs = QTabWidget() @@ -105,7 +110,6 @@ class SpanishTrainerApp(QMainWindow): def load_system_settings(self): """Loads persistent variables from the key-value settings table.""" - # Baseline internal fallback defaults self.anki_export_dir = os.getcwd() self.video_export_dir = os.getcwd() self.video_first_lang = "English First (en -> es)" @@ -141,7 +145,6 @@ class SpanishTrainerApp(QMainWindow): cursor.execute("INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)", (key, value)) conn.commit() - # Sync the application runtime settings instantly back to memory variables if key == "video_first_language": self.video_first_lang = value elif key == "video_repeats_count": @@ -158,14 +161,16 @@ class SpanishTrainerApp(QMainWindow): Ensures a target audio track exists on disk, reads its run length via ffprobe, caches the duration field inside SQLite, and returns the float timing block. """ - if not phrase_id: + if not text_str.strip(): return 2.5 safe_name = "".join([c for c in text_str if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() + if not safe_name: + safe_name = hashlib.sha256(text_str.encode('utf-8')).hexdigest()[:16] + os.makedirs("media", exist_ok=True) target_file = f"media/{safe_name}_{lang}_female.mp3" - # 1. Generate audio track dynamically if missing if not os.path.exists(target_file): try: voice = "es-ES-ElviraNeural" if lang == "es" else "en-GB-SoniaNeural" @@ -175,17 +180,16 @@ class SpanishTrainerApp(QMainWindow): print(f"āŒ Core TTS System Exception: {tts_err}") return 2.5 - # 2. Return cached value from DB if it exists and isn't null - conn = get_connection() - cursor = conn.cursor() - cursor.execute("SELECT duration FROM phrases WHERE id = ?", (phrase_id,)) - cached_row = cursor.fetchone() - - if cached_row and cached_row[0] is not None: - conn.close() - return float(cached_row[0]) + if phrase_id: + conn = get_connection() + cursor = conn.cursor() + cursor.execute("SELECT duration FROM phrases WHERE id = ?", (phrase_id,)) + cached_row = cursor.fetchone() + + if cached_row and cached_row[0] is not None: + conn.close() + return float(cached_row[0]) - # 3. Calculate audio duration via ffprobe and store it permanently try: cmd = [ 'ffprobe', '-v', 'quiet', '-print_format', 'json', @@ -195,14 +199,15 @@ class SpanishTrainerApp(QMainWindow): data = json.loads(result.stdout) duration = float(data['format']['duration']) - cursor.execute("UPDATE phrases SET duration = ? WHERE id = ?", (duration, phrase_id)) - conn.commit() - print(f"šŸ’¾ Track length calculated and stored globally: {duration}s -> Phrase ID {phrase_id}") + if phrase_id: + cursor.execute("UPDATE phrases SET duration = ? WHERE id = ?", (duration, phrase_id)) + conn.commit() except Exception as e: print(f"āš ļø Track structure analysis warning for {target_file}: {e}") duration = 2.5 finally: - conn.close() + if phrase_id and 'conn' in locals() and conn: + conn.close() return duration @@ -259,9 +264,11 @@ class SpanishTrainerApp(QMainWindow): self.input_text_es = QTextEdit() self.input_text_es.setMaximumHeight(75) + self.input_text_es.textChanged.connect(self.clear_id_if_new_entry) self.input_text_en = QTextEdit() self.input_text_en.setMaximumHeight(75) + self.input_text_en.textChanged.connect(self.clear_id_if_new_entry) self.combo_type = QComboBox() self.combo_type.addItems(["phrase", "sentence", "noun", "verb", "adjective"]) @@ -445,7 +452,7 @@ class SpanishTrainerApp(QMainWindow): action_buttons = QHBoxLayout() self.btn_play_voice = QPushButton("šŸ—£ļø Play Voice Track") - self.btn_flip_card = QPushButton("šŸ‘ļø Reveal English Partner") + self.btn_flip_card = QPushButton("šŸ‘ļø Reveal Translation") self.btn_play_voice.clicked.connect(self.handle_play_voice) self.btn_flip_card.clicked.connect(self.handle_flip_card) @@ -506,7 +513,6 @@ class SpanishTrainerApp(QMainWindow): video_layout.addWidget(self.line_video_dir) video_layout.addWidget(btn_browse_video) - # UI Sleep Learning Configuration Fields self.combo_first_lang = QComboBox() self.combo_first_lang.addItems(["English First (en -> es)", "Spanish First (es -> en)"]) self.combo_first_lang.setCurrentText(self.video_first_lang) @@ -526,7 +532,6 @@ class SpanishTrainerApp(QMainWindow): form_layout.addRow("Target Translation Loop Multiplier (Repeats):", self.spin_video_repeats) form_layout.addRow("User Recall Repetition Frame Intermission (Seconds):", self.spin_pause_duration) - # High-visibility sync button to calculate missing timings and rebuild metadata cache self.btn_sync_cache = QPushButton("⚔ Populate Audio & Timings Cache") self.btn_sync_cache.setStyleSheet(""" QPushButton { @@ -563,7 +568,6 @@ class SpanishTrainerApp(QMainWindow): self.save_setting_to_db("video_export_directory", directory) def handle_bulk_populate_audio_cache(self): - """Iterates through all relational links, runs dynamic downloads, analyzes audio runtime lengths via ffprobe.""" conn = get_connection() cursor = conn.cursor() cursor.execute(""" @@ -587,6 +591,346 @@ class SpanishTrainerApp(QMainWindow): QMessageBox.information(self, "Cache Processing Complete", "All missing speech segments successfully written. Timings cached safely.") + # ===================================================================== + # šŸ’” FLASHCARD OPERATIONS LOGIC COUPLING + # ===================================================================== + def handle_live_speed_change(self): + val = self.slider_review_speed.value() + self.lbl_review_speed.setText(f"{val / 100:.2f}x") + + def load_flashcard_by_id(self, translation_id): + """Loads a translation node into memory and targets local text widgets without notes clutter.""" + conn = get_connection() + cursor = conn.cursor() + cursor.execute(""" + SELECT t.translation_id, p1.text, p2.text, p1.source_context, t.tags, t.notes + FROM translations t + JOIN phrases p1 ON t.source_phrase_id = p1.id + JOIN phrases p2 ON t.target_phrase_id = p2.id + WHERE t.translation_id = ? + """, (translation_id,)) + record = cursor.fetchone() + conn.close() + + if record: + self.current_flashcard_id = record[0] + self.current_active_es_text = str(record[1]) + self.current_active_en_text = str(record[2]) + self.current_card_is_flipped = False + + self.lbl_card_text.setText(self.current_active_en_text) + self.btn_flip_card.setText("šŸ‘ļø Reveal Translation") + + # --- t.notes (record[5]) has been intentionally omitted from this layout context --- + meta_str = f"Link ID: {record[0]} | Context: {record[3] or 'N/A'}" + if record[4]: + meta_str += f" | Tags: {record[4]}" + self.lbl_card_meta.setText(meta_str) + + self.handle_play_voice() + + def handle_flip_card(self): + if not self.current_flashcard_id: + return + + if not self.current_card_is_flipped: + self.lbl_card_text.setText(self.current_active_es_text) + self.btn_flip_card.setText("šŸ‘ļø Return to Prompt") + self.current_card_is_flipped = True + else: + self.lbl_card_text.setText(self.current_active_en_text) + self.btn_flip_card.setText("šŸ‘ļø Reveal Translation") + self.current_card_is_flipped = False + + def handle_play_voice(self): + if not self.current_flashcard_id: + return + + text_target = self.current_active_es_text if self.current_card_is_flipped else self.current_active_en_text + lang_target = "es" if self.current_card_is_flipped else "en" + speed_target = self.lbl_review_speed.text() + + self.execute_playback(text_target, lang_target, speed_target) + + def handle_load_next_card(self): + if not self.flashcard_ids_pool: + QMessageBox.information(self, "Pool Empty", "No flashcards found in the matrix matching current criteria filters.") + return + + next_tx_id = random.choice(self.flashcard_ids_pool) + + for row in range(self.review_table.rowCount()): + if int(self.review_table.item(row, 0).text()) == next_tx_id: + self.review_table.setCurrentCell(row, 0) + break + + self.load_flashcard_by_id(next_tx_id) + + # ===================================================================== + # šŸ“¦ GENANKI EXPORT ENGINE (RESTRUCTURED PURE TRANSLATION FLOW) + # ===================================================================== + def handle_export_anki_deck(self): + """ + Gathers selected records from the matching criteria pool view, builds + a dual card template layout mapping English->Spanish (Card 1) and Spanish->English + (Card 2) forward-reverse pairs cleanly. Explicitly maps 4 fields: EnglishText, + EnglishAudio, SpanishText, SpanishAudio. Context and notes are fully removed. + """ + targets = self.flashcard_ids_pool + if not targets: + QMessageBox.warning(self, "Export Aborted", "The active flashcard pool filter is completely empty. Nothing to export.") + return + + conn = get_connection() + cursor = conn.cursor() + + placeholders = ",".join("?" for _ in targets) + cursor.execute(f""" + SELECT t.translation_id, p1.text, p2.text, p1.source_context, t.tags, t.notes, t.deck_name + FROM translations t + JOIN phrases p1 ON t.source_phrase_id = p1.id + JOIN phrases p2 ON t.target_phrase_id = p2.id + WHERE t.translation_id IN ({placeholders}) + """, targets) + records = cursor.fetchall() + conn.close() + + if not records: + QMessageBox.information(self, "Export Processing", "No structured database entries matched your criteria indices parameters.") + return + + # Unique Identification Anchor Codes for Anki Database Integrity + MODEL_ID = 1684321095 + DECK_ID = 2026062011 + + # New Model structure aligning English Text/Audio with Spanish Text/Audio sequences + spanish_model = genanki.Model( + MODEL_ID, + 'Castilian Learning Model (Pure Text & Audio Alignment)', + fields=[ + {'name': 'EnglishText'}, + {'name': 'EnglishAudio'}, + {'name': 'SpanishText'}, + {'name': 'SpanishAudio'} + ], + templates=[ + { + 'name': 'Card 1: English -> Spanish', + 'qfmt': ( + '
šŸ‡¬šŸ‡§ ENGLISH COMPREHENSION
' + '
{{EnglishText}}
' + '
{{EnglishAudio}}
' + ), + 'afmt': ( + '{{FrontSide}}
' + '
šŸ‡ŖšŸ‡ø SPANISH PRODUCTION
' + '
{{SpanishText}}
' + '
{{SpanishAudio}}
' + ), + }, + { + 'name': 'Card 2: Spanish -> English', + 'qfmt': ( + '
šŸ‡ŖšŸ‡ø SPANISH PRODUCTION
' + '
{{SpanishText}}
' + '
{{SpanishAudio}}
' + ), + 'afmt': ( + '{{FrontSide}}
' + '
šŸ‡¬šŸ‡§ ENGLISH COMPREHENSION
' + '
{{EnglishText}}
' + '
{{EnglishAudio}}
' + ), + }, + ], + css='.card { font-family: arial; font-size: 20px; text-align: center; background-color: #fafafa; padding: 25px; border-radius: 8px; }' + ) + + deck_name_fallback = records[0][6] if records[0][6] else "Castilian Voice Trainer" + anki_deck = genanki.Deck(DECK_ID, f"Spanish::{deck_name_fallback}") + media_files_bundle = [] + + print(f"šŸ“¦ Assembling Anki audio package for {len(records)} notes...") + + for row in records: + tx_id, es_text, en_text, context, tags, notes, deck_group = row + es_clean = es_text.strip() + en_clean = en_text.strip() + + # --- Spanish Media Track Setup --- + safe_es_name = "".join([c for c in es_clean if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() + if not safe_es_name: + safe_es_name = hashlib.sha256(es_clean.encode('utf-8')).hexdigest()[:16] + audio_es_filename = f"{safe_es_name}_es_female.mp3" + full_es_path = f"media/{audio_es_filename}" + + if not os.path.exists(full_es_path): + self.get_or_generate_audio_duration(None, es_clean, "es") + if os.path.exists(full_es_path): + media_files_bundle.append(full_es_path) + es_audio_tag = f"[sound:{audio_es_filename}]" + else: + es_audio_tag = "" + + # --- English Media Track Setup --- + safe_en_name = "".join([c for c in en_clean if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() + if not safe_en_name: + safe_en_name = hashlib.sha256(en_clean.encode('utf-8')).hexdigest()[:16] + audio_en_filename = f"{safe_en_name}_en_female.mp3" + full_en_path = f"media/{audio_en_filename}" + + if not os.path.exists(full_en_path): + self.get_or_generate_audio_duration(None, en_clean, "en") + if os.path.exists(full_en_path): + media_files_bundle.append(full_en_path) + en_audio_tag = f"[sound:{audio_en_filename}]" + else: + en_audio_tag = "" + + # Meta and Category Tag Construction + tag_list = str(tags).split() if tags else [] + if context: + tag_list.append(str(context).replace(" ", "_").replace(".", "_")) + + # Populate note fields sequentially matching model specification: + # EnglishText, EnglishAudio, SpanishText, SpanishAudio + anki_note = genanki.Note( + model=spanish_model, + fields=[ + en_text, + en_audio_tag, + es_text, + es_audio_tag + ], + tags=tag_list + ) + anki_deck.add_note(anki_note) + + # Output compilation assembly + export_output_path = os.path.join(self.anki_export_dir, f"{deck_name_fallback.replace('::', '_')}.apkg") + + package = genanki.Package(anki_deck) + package.media_files = list(set(media_files_bundle)) # Excludes duplicate track instances + package.write_to_file(export_output_path) + + print(f"āœ… Success! Balanced text-audio cards exported cleanly: {export_output_path}") + QMessageBox.information( + self, + "Anki Package Compiled", + f"Successfully compiled {len(records)} balanced text-audio translation flashcard nodes.\n\nDestination:\n{export_output_path}" + ) + + def handle_export_video_assets(self): + pass + + # ===================================================================== + # āž• CRUD ENGINE ATOMIC OPERATIONS LOGIC + # ===================================================================== + def crud_create_pair(self): + conn = get_connection() + cursor = conn.cursor() + + cursor.execute(""" + INSERT INTO phrases (text, language, word_type, source_context) VALUES (?, 'es', ?, ?) + """, (self.input_text_es.toPlainText().strip(), self.combo_type.currentText(), self.input_context.text().strip())) + es_id = cursor.lastrowid + + cursor.execute(""" + INSERT INTO phrases (text, language, word_type, source_context) VALUES (?, 'en', ?, ?) + """, (self.input_text_en.toPlainText().strip(), self.combo_type.currentText(), self.input_context.text().strip())) + en_id = cursor.lastrowid + + cursor.execute(""" + INSERT INTO translations (source_phrase_id, target_phrase_id, deck_name, notes, tags) VALUES (?, ?, ?, ?, ?) + """, (es_id, en_id, self.input_deck_tag.text().strip() or "General", self.input_grammar_note.toPlainText().strip(), self.input_tags.text().strip())) + tx_id = cursor.lastrowid + + conn.commit() + conn.close() + + self.input_tx_id.setText(str(tx_id)) + self.current_sandbox_es_id = es_id + self.current_sandbox_en_id = en_id + + self.refresh_crud_table() + self.refresh_review_table() + QMessageBox.information(self, "Success", f"Isolated phrase pairs created and bound to Translation ID {tx_id}.") + + def crud_update_pair(self): + tx_id_str = self.input_tx_id.text().strip() + if not tx_id_str: + QMessageBox.warning(self, "Update Target Missing", "No Translation Link ID found. Select an existing record node or create a fresh link pair first.") + return + + if self.current_sandbox_es_id is None or self.current_sandbox_en_id is None: + QMessageBox.warning(self, "Phrase Nodes Untracked", "Underlying unique identifiers for individual language components are missing. Reselect the row from the left panel matrix grid.") + return + + conn = get_connection() + cursor = conn.cursor() + try: + cursor.execute(""" + UPDATE phrases + SET text = ?, word_type = ?, source_context = ?, duration = NULL + WHERE id = ? + """, (self.input_text_es.toPlainText().strip(), self.combo_type.currentText(), self.input_context.text().strip(), self.current_sandbox_es_id)) + + cursor.execute(""" + UPDATE phrases + SET text = ?, word_type = ?, source_context = ?, duration = NULL + WHERE id = ? + """, (self.input_text_en.toPlainText().strip(), self.combo_type.currentText(), self.input_context.text().strip(), self.current_sandbox_en_id)) + + cursor.execute(""" + UPDATE translations + SET deck_name = ?, notes = ?, tags = ? + WHERE translation_id = ? + """, (self.input_deck_tag.text().strip() or "General", self.input_grammar_note.toPlainText().strip(), self.input_tags.text().strip(), int(tx_id_str))) + + conn.commit() + except Exception as e: + QMessageBox.critical(self, "Database Error", f"Failed to execute field modifications inside SQL engine: {e}") + finally: + conn.close() + + self.refresh_crud_table() + self.refresh_review_table() + QMessageBox.information(self, "Success", f"Node structural fields updated successfully. Translation Link ID {tx_id_str} remains active.") + + def crud_delete_pair(self): + pass + + def execute_playback(self, text_str, lang, speed_text): + txt = text_str.strip() + if not txt: + return + + self.get_or_generate_audio_duration(None, txt, lang) + + safe_name = "".join([c for c in txt if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() + if not safe_name: + safe_name = hashlib.sha256(txt.encode('utf-8')).hexdigest()[:16] + + target_file = f"media/{safe_name}_{lang}_female.mp3" + + if os.path.exists(target_file): + try: + multiplier = float(speed_text.replace("x", "")) + except ValueError: + multiplier = 1.0 + + self.media_player.stop() + self.media_player.setSource(QUrl.fromLocalFile(os.path.abspath(target_file))) + self.media_player.setLoops(1) + self.media_player.setPlaybackRate(multiplier) + self.media_player.play() + + def handle_sandbox_play_es(self): + self.execute_playback(self.input_text_es.toPlainText(), "es", self.combo_speed_es.currentText()) + + def handle_sandbox_play_en(self): + self.execute_playback(self.input_text_en.toPlainText(), "en", self.combo_speed_en.currentText()) + # ===================================================================== # ⚔ DATA MATRIX CONTROL & SYNCHRONIZATION VIEWS # ===================================================================== @@ -635,7 +979,7 @@ class SpanishTrainerApp(QMainWindow): tag_filter = self.review_tag_filter.text().strip() query = """ - SELECT t.translation_id, p1.text, p1.source_context, t.tags, p1.id + SELECT t.translation_id, p1.text, p1.source_context, t.tags FROM translations t JOIN phrases p1 ON t.source_phrase_id = p1.id WHERE p1.language = 'es' @@ -659,7 +1003,7 @@ class SpanishTrainerApp(QMainWindow): for row_idx, row_data in enumerate(rows): self.review_table.insertRow(row_idx) - self.flashcard_ids_pool.append(row_data[4]) + self.flashcard_ids_pool.append(row_data[0]) for col_idx in range(4): val = row_data[col_idx] self.review_table.setItem(row_idx, col_idx, QTableWidgetItem(str(val if val is not None else ""))) @@ -704,8 +1048,9 @@ class SpanishTrainerApp(QMainWindow): if not selected_ranges: return row = selected_ranges[0].topRow() - phrase_id = self.flashcard_ids_pool[row] - self.load_flashcard_by_id(phrase_id) + if row < len(self.flashcard_ids_pool): + translation_id = self.flashcard_ids_pool[row] + self.load_flashcard_by_id(translation_id) def step_table_row(self, direction): current_row = self.translation_table.currentRow() @@ -713,467 +1058,14 @@ class SpanishTrainerApp(QMainWindow): if 0 <= next_row < self.translation_table.rowCount(): self.translation_table.setCurrentCell(next_row, 0) - # ===================================================================== - # āž• CRUD ENGINE ATOMIC OPERATIONS LOGIC - # ===================================================================== - def crud_create_pair(self): - conn = get_connection() - cursor = conn.cursor() - - cursor.execute(""" - INSERT INTO phrases (text, language, word_type, source_context) VALUES (?, 'es', ?, ?) - """, (self.input_text_es.toPlainText().strip(), self.combo_type.currentText(), self.input_context.text().strip())) - es_id = cursor.lastrowid - - cursor.execute(""" - INSERT INTO phrases (text, language, word_type, source_context) VALUES (?, 'en', ?, ?) - """, (self.input_text_en.toPlainText().strip(), self.combo_type.currentText(), self.input_context.text().strip())) - en_id = cursor.lastrowid - - cursor.execute(""" - INSERT INTO translations (source_phrase_id, target_phrase_id, deck_name, notes, tags) VALUES (?, ?, ?, ?, ?) - """, (es_id, en_id, self.input_deck_tag.text().strip() or "General", self.input_grammar_note.toPlainText().strip(), self.input_tags.text().strip())) - - conn.commit() - conn.close() - - # Sync structural pointers instantly down to the Sandbox class variable state - self.current_sandbox_es_id = es_id - self.current_sandbox_en_id = en_id - - self.refresh_crud_table() - self.refresh_review_table() - QMessageBox.information(self, "Success", "Isolated phrase pairs created and relational link bound.") - - def crud_update_pair(self): - tx_id = self.input_tx_id.text() - if not tx_id: - return - - conn = get_connection() - cursor = conn.cursor() - cursor.execute("SELECT source_phrase_id, target_phrase_id FROM translations WHERE translation_id = ?", (tx_id,)) - ids = cursor.fetchone() - - if ids: - es_id, en_id = ids - cursor.execute("UPDATE phrases SET text=?, word_type=?, source_context=?, duration=NULL WHERE id=?", - (self.input_text_es.toPlainText().strip(), self.combo_type.currentText(), self.input_context.text().strip(), es_id)) - cursor.execute("UPDATE phrases SET text=?, word_type=?, source_context=?, duration=NULL WHERE id=?", - (self.input_text_en.toPlainText().strip(), self.combo_type.currentText(), self.input_context.text().strip(), en_id)) - cursor.execute("UPDATE translations SET deck_name=?, notes=?, tags=? WHERE translation_id=?", - (self.input_deck_tag.text().strip() or "General", self.input_grammar_note.toPlainText().strip(), self.input_tags.text().strip(), tx_id)) - conn.commit() - - self.current_sandbox_es_id = es_id - self.current_sandbox_en_id = en_id - - conn.close() - self.refresh_crud_table() - self.refresh_review_table() - QMessageBox.information(self, "Success", "Relational node structural update complete.") - - def crud_delete_pair(self): - tx_id = self.input_tx_id.text() - if not tx_id: - return - conn = get_connection() - cursor = conn.cursor() - cursor.execute("SELECT source_phrase_id, target_phrase_id FROM translations WHERE translation_id = ?", (tx_id,)) - ids = cursor.fetchone() - if ids: - es_id, en_id = ids - cursor.execute("DELETE FROM translations WHERE translation_id=?", (tx_id,)) - cursor.execute("DELETE FROM phrases WHERE id=?", (es_id,)) - cursor.execute("DELETE FROM phrases WHERE id=?", (en_id,)) - conn.commit() - conn.close() - self.refresh_crud_table() - self.refresh_review_table() - self.input_tx_id.clear() - self.input_text_es.clear() - self.input_text_en.clear() - self.input_grammar_note.clear() - self.input_tags.clear() - self.current_sandbox_es_id = None - self.current_sandbox_en_id = None - - # ===================================================================== - # šŸ”Š AUDIO ENGINE & EXPANDED FLASHCARD ACTIONS - # ===================================================================== - def load_flashcard_by_id(self, phrase_id): - conn = get_connection() - cursor = conn.cursor() - cursor.execute(""" - SELECT t.translation_id, p1.text, p1.source_context, t.deck_name, p1.id, t.tags - FROM translations t - JOIN phrases p1 ON t.source_phrase_id = p1.id - WHERE p1.id = ? - """, (phrase_id,)) - record = cursor.fetchone() - conn.close() - - if record: - self.current_flashcard_id = record[4] - self.lbl_card_text.setText(record[1]) - self.lbl_card_meta.setText(f"Link ID: {record[0]} • Context: {record[2]} • Tag: {record[5]} • Deck: {record[3]}") - - def handle_load_next_card(self): - if not self.flashcard_ids_pool: - QMessageBox.information(self, "Empty Pool", "No flashcards match your selected filter configurations.") - return - - target_id = random.choice(self.flashcard_ids_pool) - - try: - matched_idx = self.flashcard_ids_pool.index(target_id) - self.review_table.setCurrentCell(matched_idx, 0) - except ValueError: + def clear_id_if_new_entry(self): + if self.input_tx_id.text() and not (self.input_text_es.hasFocus() or self.input_text_en.hasFocus()): pass - - self.load_flashcard_by_id(target_id) - - def handle_play_voice(self): - """Processes audio and calculates/caches duration via Flashcard Review pane.""" - if not self.current_flashcard_id: - return - conn = get_connection() - cursor = conn.cursor() - cursor.execute("SELECT text, language FROM phrases WHERE id = ?", (self.current_flashcard_id,)) - row = cursor.fetchone() - conn.close() - - if row: - text_str, lang = row - safe_name = "".join([c for c in text_str if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() - target_file = f"media/{safe_name}_{lang}_female.mp3" - - # Ensures voice is synthesized AND duration is analyzed/cached instantly - self.get_or_generate_audio_duration(self.current_flashcard_id, text_str, lang) - - if os.path.exists(target_file): - self.media_player.setSource(QUrl.fromLocalFile(os.path.abspath(target_file))) - self.media_player.setPlaybackRate(self.slider_review_speed.value() / 100.0) - self.media_player.play() - - def handle_flip_card(self): - if not self.current_flashcard_id: - return - conn = get_connection() - cursor = conn.cursor() - cursor.execute(""" - SELECT p2.text, t.notes FROM translations t - JOIN phrases p1 ON t.source_phrase_id = p1.id - JOIN phrases p2 ON t.target_phrase_id = p2.id - WHERE p1.id = ? - """, (self.current_flashcard_id,)) - row = cursor.fetchone() - conn.close() - - if row: - clean_es = self.lbl_card_text.text().split("\n\nšŸ‘‰")[0] - display_text = f"{clean_es}\n\nšŸ‘‰ [ {row[0]} ]" - if row[1]: - display_text += f"\n\nšŸ’” Note: {row[1]}" - self.lbl_card_text.setText(display_text) - - def handle_sandbox_play_es(self): - """Processes audio and calculates/caches duration via Sandbox (CRUD) Spanish Play button.""" - text_str = self.input_text_es.toPlainText().strip() - if not text_str: - return - - # Unifies behavior: forces verification tracking down to the database row item - self.get_or_generate_audio_duration(self.current_sandbox_es_id, text_str, "es") - safe_name = "".join([c for c in text_str if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() - target_file = f"media/{safe_name}_es_female.mp3" - - if os.path.exists(target_file): - self.media_player.setSource(QUrl.fromLocalFile(os.path.abspath(target_file))) - self.media_player.setPlaybackRate(float(self.combo_speed_es.currentText().replace("x", ""))) - self.media_player.play() - - def handle_sandbox_play_en(self): - """Processes audio and calculates/caches duration via Sandbox (CRUD) English Play button.""" - text_str = self.input_text_en.toPlainText().strip() - if not text_str: - return - - # Unifies behavior: forces verification tracking down to the database row item - self.get_or_generate_audio_duration(self.current_sandbox_en_id, text_str, "en") - safe_name = "".join([c for c in text_str if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() - target_file = f"media/{safe_name}_en_female.mp3" - - if os.path.exists(target_file): - self.media_player.setSource(QUrl.fromLocalFile(os.path.abspath(target_file))) - self.media_player.setPlaybackRate(float(self.combo_speed_en.currentText().replace("x", ""))) - self.media_player.play() - - def handle_live_speed_change(self, value): - rate = value / 100.0 - self.lbl_review_speed.setText(f"{rate:.2f}x") - if self.media_player.playbackState() == QMediaPlayer.PlaybackState.PlayingState: - self.media_player.setPlaybackRate(rate) - - # ===================================================================== - # šŸ“¦ ARTIFACT EXPORT GATEWAYS (GENANKI LIVE ENGINE WITH DUAL AUDIO) - # ===================================================================== - def handle_export_anki_deck(self): - """Compiles active subset into functional .apkg with bundled Spanish and English audio tracks.""" - if not self.flashcard_ids_pool: - QMessageBox.warning(self, "Export Cancelled", "The current study stack is empty. Verify your search filters.") - return - - model_hash = hashlib.sha256(b"castilian_voice_trainer_model_v2").hexdigest() - model_id = int(model_hash[:13], 16) - - spanish_note_model = genanki.Model( - model_id, - 'Castilian Audio Flashcard Model v2', - fields=[ - {'name': 'SpanishPhrase'}, - {'name': 'EnglishTranslation'}, - {'name': 'GrammarNotes'}, - {'name': 'SpanishAudio'}, - {'name': 'EnglishAudio'} - ], - templates=[ - { - 'name': 'Card 1: Auditory Identification', - 'qfmt': ( - '
{{SpanishPhrase}}
' - '
{{SpanishAudio}}
' - ), - 'afmt': ( - '{{FrontSide}}
' - '
{{EnglishTranslation}}
' - '
{{EnglishAudio}}

' - '
{{GrammarNotes}}
' - ), - }, - ], - css='.card { font-family: arial; font-size: 20px; text-align: center; background-color: #f8f9fa; }' - ) - - context_txt = self.review_context_filter.text().strip() - tag_txt = self.review_tag_filter.text().strip() - - if context_txt and tag_txt: - file_title = f"Spanish_Export_Context_{context_txt}_Tag_{tag_txt}.apkg" - elif context_txt: - file_title = f"Spanish_Export_Context_{context_txt}.apkg" - elif tag_txt: - file_title = f"Spanish_Export_Tag_{tag_txt}.apkg" - else: - file_title = "Spanish_Master_Deck.apkg" - - file_title = "".join([c for c in file_title if c.isalnum() or c in (".", "_", "-")]).strip() - destination_path = os.path.join(self.anki_export_dir, file_title) - - decks_map = {} - media_files_manifest = [] - - conn = get_connection() - cursor = conn.cursor() - placeholders = ",".join(["?"] * len(self.flashcard_ids_pool)) - query = f""" - SELECT t.deck_name, p1.text, p2.text, t.notes, t.tags, p1.id, p2.id - FROM translations t - JOIN phrases p1 ON t.source_phrase_id = p1.id - JOIN phrases p2 ON t.target_phrase_id = p2.id - WHERE p1.id IN ({placeholders}) - """ - cursor.execute(query, self.flashcard_ids_pool) - records = cursor.fetchall() - conn.close() - - for row in records: - db_deck_name = row[0].strip() if row[0] else "Castilian Spanish Master" - es_text, en_text = row[1].strip(), row[2].strip() - notes_text, tags_string = row[3].strip() if row[3] else "", row[4].strip() if row[4] else "" - es_id, en_id = row[5], row[6] - - self.get_or_generate_audio_duration(es_id, es_text, "es") - self.get_or_generate_audio_duration(en_id, en_text, "en") - - safe_es = "".join([c for c in es_text if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() - safe_en = "".join([c for c in en_text if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() - - relative_es_path = f"media/{safe_es}_es_female.mp3" - relative_en_path = f"media/{safe_en}_en_female.mp3" - - media_files_manifest.extend([relative_es_path, relative_en_path]) - - if db_deck_name not in decks_map: - deck_hash = hashlib.sha256(db_deck_name.encode('utf-8')).hexdigest() - deck_id = int(deck_hash[:13], 16) - decks_map[db_deck_name] = genanki.Deck(deck_id, db_deck_name) - - parsed_tags = [t for t in tags_string.replace(",", " ").split(" ") if t] - flash_note = genanki.Note( - model=spanish_note_model, - fields=[es_text, en_text, notes_text, f"[sound:{safe_es}_es_female.mp3]", f"[sound:{safe_en}_en_female.mp3]"], - tags=parsed_tags - ) - decks_map[db_deck_name].add_note(flash_note) - - try: - package = genanki.Package(list(decks_map.values())) - package.media_files = [m for m in set(media_files_manifest) if os.path.exists(m)] - package.write_to_file(destination_path) - QMessageBox.information(self, "Export Complete", f"✨ Packaged complete!\nOutput: {file_title}") - except Exception as export_error: - QMessageBox.critical(self, "Export Failed", f"Genanki failure:\n{export_error}") - - # ===================================================================== - # šŸŽ¬ DYNAMIC SLEEP-LEARNING VIDEO GENERATION LAYER - # ===================================================================== - def create_video_frame_image(self, text, output_path): - """Renders a visual slide text frame optimized for dark sleep study rooms.""" - img = Image.new('RGB', (1920, 1080), color='#111a24') - canvas = ImageDraw.Draw(img) - try: - font = ImageFont.load_default() - except: - font = None - - canvas.text((960, 540), text, fill="#e2e8f0", anchor="mm") - img.save(output_path) - - def handle_export_video_assets(self): - """ - Compiles filtered translation pairs into a structural sleep loop video. - Explicitly honors all parameters from the settings table: - 1) Select first language (Self-configuring anchor) - 2) Measure dynamic anchor track duration & print frame - 3) Print target translation image & sync text timeline - 4) Wait duration for user recall repetition (Configurable intermission) - 5) Target translation sequence repeat count loop (Configurable loop index) - """ - if not self.flashcard_ids_pool: - QMessageBox.warning(self, "Video Generation Cancelled", "The active filter queue contains no records.") - return - - try: - is_english_first = "English First" in self.video_first_lang - repeat_count = int(self.video_repeats_count) if str(self.video_repeats_count).isdigit() else 3 - pause_sec = float(self.video_pause_duration) - except ValueError: - QMessageBox.critical(self, "Configuration Error", "Check your settings table values for repeat multipliers and decimal pause seconds.") - return - - temp_dir = os.path.join(os.getcwd(), "video_scratch_pad") - os.makedirs(temp_dir, exist_ok=True) - - conn = get_connection() - cursor = conn.cursor() - placeholders = ",".join(["?"] * len(self.flashcard_ids_pool)) - query = f""" - SELECT p1.id, p1.text, p2.id, p2.text - FROM translations t - JOIN phrases p1 ON t.source_phrase_id = p1.id - JOIN phrases p2 ON t.target_phrase_id = p2.id - WHERE p1.id IN ({placeholders}) - """ - cursor.execute(query, self.flashcard_ids_pool) - records = cursor.fetchall() - conn.close() - - print(f"šŸŽ¬ Compiling sleep loop timeline matching exact preferences ({self.video_first_lang}, Loops: {repeat_count}, Pause: {pause_sec}s)...") - video_segment_paths = [] - - try: - for idx, row in enumerate(records): - es_id, es_text = row[0], row[1].strip() - en_id, en_text = row[2], row[3].strip() - - # 2. How we know the length: Read cached DB duration or call zero-dependency ffprobe instantly - es_duration = self.get_or_generate_audio_duration(es_id, es_text, "es") - en_duration = self.get_or_generate_audio_duration(en_id, en_text, "en") - - safe_es = "".join([c for c in es_text if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() - safe_en = "".join([c for c in en_text if c.isalnum() or c in (" ", "_")]).strip().replace(" ", "_").lower() - - es_audio_path = f"media/{safe_es}_es_female.mp3" - en_audio_path = f"media/{safe_en}_en_female.mp3" - - # Condition 1: Evaluate selection setting matrix to establish Anchor vs Target translation flow - if is_english_first: - prime_text, prime_audio, prime_dur = en_text, en_audio_path, en_duration - target_text, target_audio, target_dur = es_text, es_audio_path, es_duration - else: - prime_text, prime_audio, prime_dur = es_text, es_audio_path, es_duration - target_text, target_audio, target_dur = en_text, en_audio_path, en_duration - - # Condition 2: Produce frame image with Anchor phrase and map audio file to exact track duration length - img_prime = os.path.join(temp_dir, f"frame_prime_{idx}.png") - self.create_video_frame_image(prime_text, img_prime) - clip_prime_path = os.path.join(temp_dir, f"chunk_prime_{idx}.mp4") - - subprocess.run([ - 'ffmpeg', '-y', '-loop', '1', '-i', img_prime, '-i', prime_audio, - '-c:v', 'libx264', '-t', str(prime_dur), '-pix_fmt', 'yuv420p', - '-c:a', 'aac', '-b:a', '192k', clip_prime_path - ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - video_segment_paths.append(clip_prime_path) - - # Condition 3: Produce translation text slide image frame and compute matching voice track length - img_target = os.path.join(temp_dir, f"frame_target_{idx}.png") - self.create_video_frame_image(target_text, img_target) - clip_target_path = os.path.join(temp_dir, f"chunk_target_{idx}.mp4") - - subprocess.run([ - 'ffmpeg', '-y', '-loop', '1', '-i', img_target, '-i', target_audio, - '-c:v', 'libx264', '-t', str(target_dur), '-pix_fmt', 'yuv420p', - '-c:a', 'aac', '-b:a', '192k', clip_target_path - ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - # Condition 4: Structural wait time gap for user replacement repetition frame (Silent intermission video block) - clip_silent_path = os.path.join(temp_dir, f"chunk_silent_{idx}.mp4") - subprocess.run([ - 'ffmpeg', '-y', '-f', 'lavfi', '-i', f'color=c=#111a24:s=1920x1080:d={pause_sec}', - '-f', 'lavfi', '-i', 'anullsrc=cl=stereo:r=44100', - '-t', str(pause_sec), '-c:v', 'libx264', '-pix_fmt', 'yuv420p', - '-c:a', 'aac', clip_silent_path - ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - # Condition 5: Loop execution cycle pattern back to Condition 3 (Repeats exact translation target X times) - for _ in range(repeat_count): - video_segment_paths.append(clip_target_path) - video_segment_paths.append(clip_silent_path) - - if not video_segment_paths: - QMessageBox.warning(self, "Export Error", "Timeline compilation matrix is empty.") - return - - # --- Concat Loop: Assembly sequence processing layer --- - manifest_path = os.path.join(temp_dir, "manifest.txt") - with open(manifest_path, "w", encoding="utf-8") as f: - for path in video_segment_paths: - f.write(f"file '{os.path.abspath(path)}'\n") - - output_file = os.path.join(self.video_export_dir, "Spanish_Sleep_Learning_Master.mp4") - subprocess.run([ - 'ffmpeg', '-y', '-f', 'concat', '-safe', '0', '-i', manifest_path, - '-c', 'copy', output_file - ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - QMessageBox.information(self, "Success", f"Sleep Learning compilation track generated successfully!\nLocation: {output_file}") - - except Exception as e: - QMessageBox.critical(self, "Video Synthesis Suite Error", f"Timeline compiler hit a hitch:\n{e}") - finally: - if os.path.exists(temp_dir): - shutil.rmtree(temp_dir) if __name__ == "__main__": - print("šŸš€ Launching Core PyQt6 Framework Threads...") - try: - app = QApplication(sys.argv) - window = SpanishTrainerApp() - window.show() - sys.exit(app.exec()) - except Exception as fatal_error: - import traceback - traceback.print_exc() - sys.exit(1) \ No newline at end of file + app = QApplication(sys.argv) + app.setApplicationName("Spanish Voice Trainer") + app.setOrganizationName("Oxnee Pty. Ltd.") + window = SpanishTrainerApp() + window.show() + sys.exit(app.exec()) \ No newline at end of file diff --git a/spanish_trainer.db b/spanish_trainer.db index fc232cc7f8bbae327e0f58b6194aba08d23d1e32..7234a38d50a21128577d3b25c42173841a56c0ff 100644 GIT binary patch literal 368640 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 B^27iD