"""SCR-1 刮削差分:用 MP 上游的 TmdbScraper(themoviedb/scraper.py)从同一份 TMDB 原始响应生成 NFO,写 scrape-mp.json。 用法(MP 仓库根目录,用其 .venv): cd /opt/moviepilot-plus/upstream/MoviePilot && PYTHONPATH=. \ .venv/bin/python /opt/uhd_media_tool/apps/server/test/scrape/gen-scrape-mp.py 只记录行为输出,不复制 MP 源码。MediaInfo 用 MP 自己的 set_tmdb_info(TMDB 详情 → 统一字段), 季 / 集直接喂 TMDB 季详情(与 MP get_metadata_nfo 取到的一致)。图片命名按 MP 代码行为登记在 nfo-mp-diff.test.ts。 """ import json import pathlib from app.domain.context import MediaInfo from app.domain.projection.tmdb import configure_image_url_builder from app.modules.themoviedb.scraper import TmdbScraper HERE = pathlib.Path(__file__).parent raw = json.loads((HERE / "tmdb-raw.json").read_text(encoding="utf-8")) # 启动组合根里注入的 TMDB 图片地址(settings.TMDB_IMAGE_URL,原图) configure_image_url_builder(lambda p: f"https://image.tmdb.org/t/p/original/{p.removeprefix('/')}") s = TmdbScraper() def xml(doc) -> str: return doc.toprettyxml(indent=" ", encoding="utf-8").decode("utf-8") def media(info: dict, media_type: str) -> MediaInfo: mi = MediaInfo() mi.set_tmdb_info({**info, "media_type": media_type}) return mi out = {} out["movie"] = xml(s._TmdbScraper__gen_movie_nfo_file(mediainfo=media(raw["/movie/157336"], "movie"))) out["tvshow"] = xml(s._TmdbScraper__gen_tv_nfo_file(mediainfo=media(raw["/tv/95396"], "tv"))) season = raw["/tv/95396/season/1"] out["season1"] = xml(s._TmdbScraper__gen_tv_season_nfo_file(seasoninfo=season, season=1)) for ep in season["episodes"]: n = ep["episode_number"] out[f"s01e{n:02d}"] = xml( s._TmdbScraper__gen_tv_episode_nfo_file(tmdbid=95396, episodeinfo=ep, season=1, episode=n) ) out["seasonPosterName"] = TmdbScraper.get_season_poster(season, 1)[0] out["seasonSpecialsPosterName"] = TmdbScraper.get_season_poster({"poster_path": "/x.jpg"}, 0)[0] (HERE / "scrape-mp.json").write_text(json.dumps(out, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") print(f"写入 {len(out)} 项 → scrape-mp.json")