OpenSubtitles searches match only on moviehash; the TMDB lane returns nothing #270

Closed
opened 2026-08-30 12:51:34 +01:00 by naps62-yolo · 0 comments
Owner

Found while validating #268 against a real 2160p BluRay import of Batman Begins (movie 5, media file 23).

What happens

POST /api/media-files/23/subtitles/search returns zero candidates for every language, with no provider error:

{"candidates":[],"provider_errors":[]}

That is not credible for Batman Begins in English.

Evidence it is the TMDB lane, not the provider

The same search against two Rick and Morty episode files works — but returns exactly one candidate each:

media file language candidates
23 (Batman Begins, 2160p remux) en 0
23 (Batman Begins, 2160p remux) pt-PT 0
2 (Rick and Morty S01) en 1
13 (Rick and Morty S02) en 1

One candidate for a show that popular is the signature of a moviehash hit and nothing else. A working TMDB lane would return dozens. Batman is a 2160p remux with no hash match on file, so it falls back to the TMDB lane and gets nothing.

Suspected cause

crates/arr-subs/src/opensubtitles.rs:350 sends parameter names the API does not appear to define:

MediaRef::Movie { tmdb_id } => {
    params.push(("tmdb_movie_id".to_owned(), tmdb_id.to_string()));
}
MediaRef::Episode { tmdb_id, season, episode } => {
    params.push(("tmdb_series_id".to_owned(), tmdb_id.to_string()));

OpenSubtitles.com GET /subtitles documents tmdb_id for a feature and parent_tmdb_id alongside season_number / episode_number for an episode. tmdb_movie_id and tmdb_series_id are not names I could confirm in the API docs. An unrecognised filter would explain both lanes contributing nothing while moviehash still works.

This is a hypothesis, not a confirmed fix — I could not test the API directly, since the key is prod environment and not something to pull out. The check is one authenticated request comparing tmdb_id=272 against tmdb_movie_id=272.

Why it matters

opensubtitles is the only enabled provider, so today arr can only find a subtitle for a file whose hash OpenSubtitles already knows. Any release that is not a common encode gets nothing — silently, since an empty answer is not an error and reads in the queue as no_candidates.

It also blocks #268 end to end: the image-track deadlock is broken correctly and the lane does ask for an English source, but the search comes back empty so there is nothing to translate from.

Found while validating #268 against a real 2160p BluRay import of Batman Begins (movie 5, media file 23). ## What happens `POST /api/media-files/23/subtitles/search` returns zero candidates for **every** language, with no provider error: ``` {"candidates":[],"provider_errors":[]} ``` That is not credible for Batman Begins in English. ## Evidence it is the TMDB lane, not the provider The same search against two Rick and Morty episode files works — but returns *exactly one* candidate each: | media file | language | candidates | |---|---|---| | 23 (Batman Begins, 2160p remux) | en | 0 | | 23 (Batman Begins, 2160p remux) | pt-PT | 0 | | 2 (Rick and Morty S01) | en | 1 | | 13 (Rick and Morty S02) | en | 1 | One candidate for a show that popular is the signature of a `moviehash` hit and nothing else. A working TMDB lane would return dozens. Batman is a 2160p remux with no hash match on file, so it falls back to the TMDB lane and gets nothing. ## Suspected cause `crates/arr-subs/src/opensubtitles.rs:350` sends parameter names the API does not appear to define: ```rust MediaRef::Movie { tmdb_id } => { params.push(("tmdb_movie_id".to_owned(), tmdb_id.to_string())); } MediaRef::Episode { tmdb_id, season, episode } => { params.push(("tmdb_series_id".to_owned(), tmdb_id.to_string())); ``` OpenSubtitles.com `GET /subtitles` documents `tmdb_id` for a feature and `parent_tmdb_id` alongside `season_number` / `episode_number` for an episode. `tmdb_movie_id` and `tmdb_series_id` are not names I could confirm in the API docs. An unrecognised filter would explain both lanes contributing nothing while `moviehash` still works. **This is a hypothesis, not a confirmed fix** — I could not test the API directly, since the key is prod environment and not something to pull out. The check is one authenticated request comparing `tmdb_id=272` against `tmdb_movie_id=272`. ## Why it matters `opensubtitles` is the only enabled provider, so today arr can only find a subtitle for a file whose hash OpenSubtitles already knows. Any release that is not a common encode gets nothing — silently, since an empty answer is not an error and reads in the queue as `no_candidates`. It also blocks #268 end to end: the image-track deadlock is broken correctly and the lane does ask for an English source, but the search comes back empty so there is nothing to translate from.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: yolo/arr#270