Files
UHD_Media_Tool/apps/server/test/scrape/gen-scrape-mp.py
T
rootandClaude Opus 5.5 f38eca419e feat(server): scrapeMedia 刮削任务,入库后自动刮削(SCR-1)
- 文件道任务 scrapeMedia:NFO 原子写入、图片经图片缓存下载(并发 4,失败不阻塞 NFO)、只补缺失 / 全部覆盖
- 设置 organize.scrapeAfterImport / scrapeMode / scrapeImages / scrapeEpisodeThumbs
- POST /library/{id}/scrape、详情 scrape 状态;files/scrape writeNfo 与 scrape-batch write 走同一任务
- 迁移 0057_media_scrape、原因码、审计 organize.scrape
- 与 MP 输出的 NFO 差分测试(apps/server/test/scrape)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-30 22:36:14 +08:00

52 lines
2.1 KiB
Python

"""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")