fix(media): TMDb's v3 key travels as a query parameter; Bearer is a JWT only
The first tvdb-grade TV plan built 49,771 moves with not ONE TMDb answer: every search and every external_ids call came back 401. The credential on this box is the v3 key (~/.config/secrets/tmdb, `api_key=`), and TMDb takes a v3 key only as the `api_key` query parameter — a v4 request token is the only thing the Bearer header accepts. Measured on the same credential in one pass: the query form resolves `New Girl (2011)`, the Bearer form raises HTTP 401. tmdb_request() now picks the transport from the shape it was handed (three dot-separated segments = a JWT → Bearer, anything else → query parameter), and the old header comment's reasoning is corrected: a token in argv is world-readable in /proc/<pid>/cmdline, but this URL is built inside the process and never reaches argv, so the query form leaks nothing. The failure mode that let it look like a finished plan is fixed with it. The 401s were stderr-only, so the summary printed a confident move count while every series folder still carried the metadata provider's folder-echo name — the exact junk this contract exists to undo. Provider health is now part of the summary line and of the exceptions file, and a test covers it offline with `env -u TMDB_API_KEY`: a plan that asked and could not ask says NOT provider-complete in both places, and still writes the moves it can justify, because the answers that did arrive are worth their rename.
This commit is contained in:
1 parent
0a365274b6
commit
32b58dd787
3 files changed
+73
-13
No files matched your search
@@ -181,10 +181,13 @@ python3 scripts/media-census.py probe --root /mnt/entropy/TVShows \
|
||||
# seeking the array again. It is also the only column the film arm reads, and
|
||||
# only for a file with no marker and no provider row (4,794 of 58,551 today,
|
||||
# all of them covered by a re-key that costs seconds, not an hour).
|
||||
# 3. The plan. --tmdb needs TMDB_API_KEY, --tvdb needs ~/.config/secrets/tvdb
|
||||
# (`api_key=`, never argv); both write into the SAME cache file, so the plan is
|
||||
# reproducible offline afterwards. Run it once to fill the cache, then again:
|
||||
# the second run is the one whose numbers are quoted.
|
||||
# 3. The plan. --tmdb needs TMDB_API_KEY — the v3 key in ~/.config/secrets/tmdb,
|
||||
# which travels as the `api_key` query parameter. Only a v4 request token is
|
||||
# accepted as a Bearer header, and the wrong shape answers 401 on EVERY call,
|
||||
# which the summary line flags as NOT provider-complete. --tvdb reads its
|
||||
# `api_key=` line from ~/.config/secrets/tvdb, never argv. Both write the SAME
|
||||
# cache file, so the plan is reproducible offline afterwards: run it once to
|
||||
# fill the cache, and quote the second run.
|
||||
# Paths are only strings to a dry run, so this step can run on the workstation
|
||||
# against scp'd TSVs — which is where the two provider secrets live.
|
||||
python3 scripts/media-shows.py --root /mnt/entropy/TVShows --enum /tmp/tv_enum.tsv \
|
||||
|
||||
Reference in new issue
Block a user