diff --git a/utils_imdb.py b/utils_imdb.py new file mode 100644 index 0000000..98055de --- /dev/null +++ b/utils_imdb.py @@ -0,0 +1,31 @@ +import json +import urllib.request +import urllib.parse +from utils import with_disk_cache + +@with_disk_cache('imdbapi_info') +def get_imdb_info(imdb_id: str) -> dict: + """ + Fetch IMDb info from imdbapi.dev as a fallback or replacement for M-Team. + """ + query = urllib.parse.quote(imdb_id) + url = f"https://api.imdbapi.dev/search/titles?query={query}" + + req = urllib.request.Request(url, headers={ + 'accept': 'application/json', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0' + }) + + try: + with urllib.request.urlopen(req) as response: + data = json.loads(response.read().decode()) + if data and "titles" in data and len(data["titles"]) > 0: + # Return the matching title info + for title in data["titles"]: + if title.get("id") == imdb_id: + return {"code": "0", "message": "SUCCESS", "data": title} + return {"code": "0", "message": "SUCCESS", "data": data["titles"][0]} + except Exception as e: + print(f"Error fetching from imdbapi for {imdb_id}: {e}") + + return {"code": "1", "message": "NOT_FOUND", "data": {}} diff --git a/workflow.py b/workflow.py index 75f5d53..782f580 100644 --- a/workflow.py +++ b/workflow.py @@ -3,6 +3,7 @@ import time from pathlib import Path from utils import DEFAULT_DL_DIR, DEFAULT_JELLYFIN_DIR +from utils_imdb import get_imdb_info from utils_mteam import ( mteam_imdb_info, search_mteam_torrents, @@ -240,17 +241,25 @@ def process_local_file(fs_path: Path, title_dir: str, imdb_id: str, jellyfin_bas apply_rename_mapping(mapping, base_src_dir=src_dir_for_mapping, base_dst_dir=jellyfin_base) print(f"Finished processing local file: {fs_path.name}") -def process_imdb_workflow(imdb_id: str, dl_dir: str = DEFAULT_DL_DIR, jellyfin_base_dir: str = DEFAULT_JELLYFIN_DIR): +def process_imdb_workflow(imdb_id: str, dl_dir: str = DEFAULT_DL_DIR, jellyfin_base_dir: str = DEFAULT_JELLYFIN_DIR, imdb_source: str = "mteam"): """ Workflow to automatically find, download, and map torrents for an IMDb ID into a Jellyfin library. """ - print(f"=== [0] Fetching IMDB info for {imdb_id} ===") - imdb_info = mteam_imdb_info(imdb_id) - if 'data' not in imdb_info: - raise ValueError(f"Failed to get IMDB info from M-Team: {imdb_info}") + print(f"=== [0] Fetching IMDB info for {imdb_id} from {imdb_source} ===") - title = imdb_info['data'].get('title', 'Unknown_Title') - year = imdb_info['data'].get('year', '') + if imdb_source == "imdbapi": + imdb_info = get_imdb_info(imdb_id) + if 'data' not in imdb_info or not imdb_info['data']: + raise ValueError(f"Failed to get IMDB info from imdbapi: {imdb_info}") + title = imdb_info['data'].get('primaryTitle', 'Unknown_Title') + year = imdb_info['data'].get('startYear', '') + else: + imdb_info = mteam_imdb_info(imdb_id) + if 'data' not in imdb_info: + raise ValueError(f"Failed to get IMDB info from M-Team: {imdb_info}") + title = imdb_info['data'].get('title', 'Unknown_Title') + year = imdb_info['data'].get('year', '') + title_dir = f"{title} ({year})" print(f"Found Title: {title_dir}") @@ -291,7 +300,8 @@ if __name__ == "__main__": parser.add_argument("imdb_id", type=str, help="The IMDb ID to process (e.g., tt38872297)") parser.add_argument("--dl-dir", type=str, default=DEFAULT_DL_DIR, help="The qBittorrent download directory") parser.add_argument("--jellyfin-dir", type=str, default=DEFAULT_JELLYFIN_DIR, help="The base Jellyfin library directory") + parser.add_argument("--imdb-source", type=str, choices=["mteam", "imdbapi"], default="mteam", help="The source for IMDb metadata (mteam or imdbapi)") args = parser.parse_args() - process_imdb_workflow(args.imdb_id, dl_dir=args.dl_dir, jellyfin_base_dir=args.jellyfin_dir) + process_imdb_workflow(args.imdb_id, dl_dir=args.dl_dir, jellyfin_base_dir=args.jellyfin_dir, imdb_source=args.imdb_source)