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]>
This commit is contained in:
1 parent
861f799615
commit
f38eca419e
24 files changed
+1740
-15
No files matched your search
@@ -0,0 +1,51 @@
|
||||
"""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")
|
||||
Reference in new issue
Block a user