75 lines
2.6 KiB
Python
75 lines
2.6 KiB
Python
import os
|
|
import argparse
|
|
import logging
|
|
from datetime import datetime
|
|
import shutil
|
|
import glob
|
|
from typing import List, Tuple, Optional
|
|
from pathlib import Path
|
|
|
|
from anki_generator.clients.llm import AnthropicClient
|
|
from anki_generator.clients.unsplash import UnsplashClient
|
|
from anki_generator.card_generator import CardGenerator, GermanDeckPackage
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def read_word_list(file_path: str) -> List[Tuple[str, str]]:
|
|
"""Read word list from file"""
|
|
words = []
|
|
logger.info("Reading file: %s", file_path)
|
|
with open(file_path, 'r', encoding='utf-8') as f:
|
|
for line in f:
|
|
logger.debug("Processing line: %s", line.strip())
|
|
# Expected format: word,source
|
|
word, source = line.strip().split(',', 1)
|
|
words.append((word.strip(), source.strip()))
|
|
logger.debug("Added word: %s with source: %s", word.strip(), source.strip())
|
|
return words
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description='Generate Anki cards for German vocabulary')
|
|
parser.add_argument('--input', required=True, help='Input file with words and sources')
|
|
parser.add_argument('--output', help='Output file name (optional)')
|
|
parser.add_argument('--deck-name', default='German Vocabulary', help='Name of the Anki deck')
|
|
|
|
args = parser.parse_args()
|
|
|
|
logger.info("Starting Anki card generation")
|
|
|
|
try:
|
|
llm_client = AnthropicClient()
|
|
unsplash_client = UnsplashClient()
|
|
|
|
generator = CardGenerator(llm_client, unsplash_client)
|
|
|
|
words = read_word_list(args.input)
|
|
|
|
deck, media_files = generator.create_deck(words, args.deck_name)
|
|
|
|
output_dir = "output"
|
|
os.makedirs(output_dir, exist_ok=True)
|
|
|
|
if not args.output:
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
output_file = os.path.join(output_dir, f"german_vocab_{timestamp}.apkg")
|
|
else:
|
|
output_file = os.path.join(output_dir, args.output)
|
|
|
|
media_paths = []
|
|
for media_file in media_files:
|
|
media_path = os.path.join(output_dir, os.path.basename(media_file))
|
|
if os.path.exists(media_file) and media_file != media_path:
|
|
shutil.copy2(media_file, media_path)
|
|
media_paths.append(media_path)
|
|
|
|
package = GermanDeckPackage(deck, media_paths)
|
|
package.write_to_file(output_file)
|
|
logger.info("Deck and media files saved in: %s", output_dir)
|
|
|
|
except Exception as e:
|
|
logger.error("Error: %s", str(e))
|
|
raise
|
|
|
|
if __name__ == "__main__":
|
|
main()
|