jellyfin_nfo_gen.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #!/usr/bin/env python3
  2. import os
  3. import html
  4. # ====================== 配置区,只需要修改这里 ======================
  5. MEDIA_ROOT = "/home/fred/PT/Movies"
  6. OVERWRITE_EXIST_NFO = True # True: 强制重写已存在的nfo,更新标题
  7. VIDEO_EXT = {".mkv", ".mp4", ".m4v", ".webm", ".mov", ".avi", ".flv", ".wmv"}
  8. FOLLOW_SYMLINK = False
  9. # ====================================================================
  10. def main():
  11. total_videos = 0
  12. created = 0
  13. overwrote = 0
  14. print(f"开始递归扫描根目录:{MEDIA_ROOT}")
  15. print(f"强制重写已有nfo:{OVERWRITE_EXIST_NFO}")
  16. print("-"*60)
  17. for dirpath, _, filenames in os.walk(MEDIA_ROOT, followlinks=FOLLOW_SYMLINK):
  18. print(f"\n【正在扫描目录】{dirpath}")
  19. for fname in filenames:
  20. file_base, ext = os.path.splitext(fname)
  21. ext_lower = ext.lower()
  22. if ext_lower not in VIDEO_EXT:
  23. continue
  24. total_videos += 1
  25. nfo_path = os.path.join(dirpath, f"{file_base}.nfo")
  26. safe_title = html.escape(file_base)
  27. nfo_content = f"""<?xml version="1.0" encoding="utf-8"?>
  28. <episodedetails>
  29. <title>{safe_title}</title>
  30. <lockdata>true</lockdata>
  31. </episodedetails>
  32. """
  33. if os.path.exists(nfo_path):
  34. # 覆盖已有nfo
  35. with open(nfo_path, "w", encoding="utf-8") as f:
  36. f.write(nfo_content)
  37. print(f" [覆盖] {fname}")
  38. overwrote +=1
  39. else:
  40. # 新建nfo
  41. with open(nfo_path, "w", encoding="utf-8") as f:
  42. f.write(nfo_content)
  43. print(f" [新建] {fname}")
  44. created +=1
  45. print("\n" + "="*60)
  46. print("===== 任务完成 =====")
  47. print(f"扫描到视频总数: {total_videos}")
  48. print(f"新建nfo数量: {created}")
  49. print(f"覆盖已有nfo: {overwrote}")
  50. print("="*60)
  51. if __name__ == "__main__":
  52. if not os.path.isdir(MEDIA_ROOT):
  53. print(f"错误:媒体根目录不存在 -> {MEDIA_ROOT}")
  54. else:
  55. main()