import json import os import re def sanitize_filename(name): # Remove illegal characters for most filesystems and Jellyfin name = re.sub(r'[\\/:*?"<>|]', '', name) name = name.replace('【', '').replace('】', '') name = name.replace('《', '').replace('》', '') name = name.replace('(', '').replace(')', '') name = name.replace(' ', '.') name = re.sub(r'\.+', '.', name) # Replace multiple dots with one return name.strip('.') def transform_entry(entry): # Try to extract year and english title for Jellyfin year = None title = entry.get("english") or entry.get("chinese") chinese = entry.get("chinese", "") tmdb_id = entry.get("tmdb_id") # Extract year from chinese field if present m = re.match(r"(\d{4})[- ]", chinese) if m: year = m.group(1) # Build new filename: English.Title.Year.[tmdbid-].ext transformed_files = [] for f in entry.get("media_files", []): ext = os.path.splitext(f)[1] # If extension ends with '1' (e.g., .mp41, .mkv1), strip the '1' if len(ext) > 1 and ext[-1] == "1": ext = ext[:-1] if title: base = sanitize_filename(title) parts = [base] if year: parts.append(year) if tmdb_id: parts.append(f"[tmdbid-{tmdb_id}]") new_name = ".".join(parts) + ext transformed_files.append({ "original": f, "suggested": os.path.join(os.path.dirname(f), new_name) }) else: transformed_files.append({ "original": f, "suggested": f }) # Add Jellyfin-friendly fields result = dict(entry) result["jellyfin_title"] = sanitize_filename(title) if title else None result["jellyfin_year"] = year result["jellyfin_media_files"] = transformed_files return result # def transform_entry(entry): # # Try to extract year and english title for Jellyfin # year = None # title = entry.get("english") or entry.get("chinese") # chinese = entry.get("chinese", "") # tmdb_id = entry.get("tmdb_id") # # Extract year from chinese field if present # m = re.match(r"(\d{4})[- ]", chinese) # if m: # year = m.group(1) # # Build new filename: English.Title.Year.[tmdbid-].ext # transformed_files = [] # for f in entry.get("media_files", []): # ext = os.path.splitext(f)[1] # if title: # base = sanitize_filename(title) # parts = [base] # if year: # parts.append(year) # if tmdb_id: # parts.append(f"[tmdbid-{tmdb_id}]") # new_name = ".".join(parts) + ext # transformed_files.append({ # "original": f, # "suggested": os.path.join(os.path.dirname(f), new_name) # }) # else: # transformed_files.append({ # "original": f, # "suggested": f # }) # # Add Jellyfin-friendly fields # result = dict(entry) # result["jellyfin_title"] = sanitize_filename(title) if title else None # result["jellyfin_year"] = year # result["jellyfin_media_files"] = transformed_files # return result # def transform_entry(entry): # # Try to extract year and english title for Jellyfin # year = None # title = entry.get("english") or entry.get("chinese") # chinese = entry.get("chinese", "") # # Extract year from chinese field if present # m = re.match(r"(\d{4})[- ]", chinese) # if m: # year = m.group(1) # # Build new filename: English.Title.(Year).ext # transformed_files = [] # for f in entry.get("media_files", []): # ext = os.path.splitext(f)[1] # if title: # if year: # new_name = f"{sanitize_filename(title)}.{year}{ext}" # else: # new_name = f"{sanitize_filename(title)}{ext}" # transformed_files.append({ # "original": f, # "suggested": os.path.join(os.path.dirname(f), new_name) # }) # else: # transformed_files.append({ # "original": f, # "suggested": f # }) # # Add Jellyfin-friendly fields # result = dict(entry) # result["jellyfin_title"] = sanitize_filename(title) if title else None # result["jellyfin_year"] = year # result["jellyfin_media_files"] = transformed_files # return result def main(): with open("ghibli_imdb_results.json", "r", encoding="utf-8") as f: data = json.load(f) transformed = {"matched": [], "unmatched": []} for section in ["matched", "unmatched"]: for entry in data.get(section, []): transformed[section].append(transform_entry(entry)) with open("ghibli_jellyfin_ready.json", "w", encoding="utf-8") as f: json.dump(transformed, f, ensure_ascii=False, indent=2) if __name__ == "__main__": main()