| import json |
| import os |
| import logging |
| from pathlib import Path |
| import tvdb_v4_official |
| from utils import save_to_json |
|
|
| THETVDB_API_KEY = os.getenv("THETVDB_API_KEY") |
| CACHE_DIR = os.getenv("CACHE_DIR") |
| SAVE_DIR = os.path.join(CACHE_DIR, "metadata") |
| logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') |
|
|
| |
| tvdb = tvdb_v4_official.TVDB(THETVDB_API_KEY) |
|
|
| def get_series_info(series_id): |
| """Fetch series information including episodes from TVDB.""" |
| try: |
| series = tvdb.get_series_extended(series_id, meta="episodes") |
| logging.info("Series info fetched successfully.") |
| return series |
| except Exception as e: |
| logging.error(f"Error fetching series info: {e}") |
| return None |
|
|
| def filter_episode_data(episode): |
| """Filter episode data to include only necessary fields.""" |
| return { |
| "id": episode.get("id"), |
| "seriesId": episode.get("seriesId"), |
| "name": episode.get("name"), |
| "aired": episode.get("aired"), |
| "runtime": episode.get("runtime"), |
| "overview": episode.get("overview"), |
| "image": episode.get("image"), |
| "imageType": episode.get("imageType"), |
| "isMovie": episode.get("isMovie"), |
| "number": episode.get("number"), |
| "absoluteNumber": episode.get("absoluteNumber"), |
| "seasonNumber": episode.get("seasonNumber"), |
| "finaleType": episode.get("finaleType"), |
| "year": episode.get("year") |
| } |
|
|
|
|
|
|
| async def fetch_and_cache_seasons(series_id, original_title): |
| """Fetch and cache episodes for a given series ID asynchronously.""" |
| series_info = get_series_info(series_id) |
| if not series_info: |
| logging.error("Series info could not be fetched.") |
| return |
|
|
| |
| try: |
| all_episodes = tvdb.get_series_episodes(series_id, lang="eng").get('episodes', []) |
| except Exception as e: |
| logging.error(f"Error fetching episodes for series ID {series_id}: {e}") |
| return |
| |
| |
| all_seasons = {} |
| for episode in all_episodes: |
| season_number = episode.get('seasonNumber') |
| |
| if season_number == 0: |
| season_key = "Specials" |
| else: |
| season_key = f"Season {season_number}" |
| |
| if season_key not in all_seasons: |
| all_seasons[season_key] = [] |
| |
| filtered_data = filter_episode_data(episode) |
| all_seasons[season_key].append(filtered_data) |
| |
| |
| series_folder = Path(SAVE_DIR) / str(original_title) |
| series_folder.mkdir(parents=True, exist_ok=True) |
| |
| |
| for season_key, episodes in sorted(all_seasons.items()): |
| episodes_sorted = sorted(episodes, key=lambda e: e.get('number')) |
| season_file = series_folder / f"{season_key}.json" |
| await save_to_json(episodes_sorted, season_file) |
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
| |
|
|