anki-generator/anki_generator/main.py

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()