| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- 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-<id>].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-<id>].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()
|