feat: fallback to TMDB external_ids when Trakt rejects tmdbId
All checks were successful
Docker / docker (push) Successful in 1m49s

When Trakt returns a non-404 error (e.g. 403) for a tmdbId lookup,
fetch the imdbId from TMDB's /external_ids endpoint and retry the
Trakt call using the imdbId. Trakt often knows a movie/show by its
imdbId even when it does not recognise the tmdbId.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
dev
2026-03-03 18:44:56 +00:00
parent 93cf3fb8ec
commit da86a1d419
4 changed files with 84 additions and 2 deletions

View File

@@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"strconv"
"strings"
"github.com/l3uddz/nabarr/media/trakt"
)
@@ -21,7 +22,24 @@ func (c *Client) GetShowInfo(item *FeedItem) (*Item, error) {
if errors.Is(err, trakt.ErrItemNotFound) {
return nil, fmt.Errorf("trakt: get show: show with %sId %q: %w", mdp, mdi, ErrItemNotFound)
}
return nil, fmt.Errorf("trakt: get show: show with %sId %q: %w", mdp, mdi, err)
// fallback: if we queried by tmdbId and have TMDB configured, try fetching
// the imdbId from TMDB and retry Trakt — Trakt may know the show by imdbId
// even when it doesn't recognise the tmdbId (returns 403).
if c.tmdb != nil && mdp == "tmdb" {
if tmdbIdInt, convErr := strconv.Atoi(mdi); convErr == nil {
if imdbId, extErr := c.tmdb.GetShowExternalIds(tmdbIdInt); extErr == nil && strings.HasPrefix(imdbId, "tt") {
t, err = c.trakt.GetShow("imdb", imdbId)
}
}
}
if err != nil {
if errors.Is(err, trakt.ErrItemNotFound) {
return nil, fmt.Errorf("trakt: get show: show with %sId %q: %w", mdp, mdi, ErrItemNotFound)
}
return nil, fmt.Errorf("trakt: get show: show with %sId %q: %w", mdp, mdi, err)
}
}
// transform trakt info to MediaItem