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