package media import ( "fmt" "strconv" "strings" "github.com/rs/zerolog" "github.com/l3uddz/nabarr/logger" "github.com/l3uddz/nabarr/media/omdb" "github.com/l3uddz/nabarr/media/tmdb" "github.com/l3uddz/nabarr/media/trakt" "github.com/l3uddz/nabarr/media/tvdb" "github.com/l3uddz/nabarr/util" ) type Client struct { trakt *trakt.Client omdb *omdb.Client tvdb *tvdb.Client tmdb *tmdb.Client log zerolog.Logger } func (c *Client) EnrichFeedItemWithTmdbId(item *FeedItem) { if c.tmdb == nil { return } // skip if a valid ID is already present hasId := (item.TvdbId != "" && !util.StringSliceContains([]string{"0", "1"}, item.TvdbId)) || (item.ImdbId != "" && strings.HasPrefix(item.ImdbId, "tt")) || (item.TmdbId != "" && !util.StringSliceContains([]string{"0", "1"}, item.TmdbId)) if hasId { return } title, year := tmdb.ExtractTitleAndYear(item.Title) if title == "" { return } var tmdbId int switch { case util.ContainsMovieCategory(item.Categories): if id, err := c.tmdb.SearchMovies(title, year); err == nil && id > 0 { tmdbId = id } case util.ContainsTvCategory(item.Categories): if id, err := c.tmdb.SearchShows(title, year); err == nil && id > 0 { tmdbId = id } default: return } if tmdbId > 0 { item.TmdbId = strconv.Itoa(tmdbId) c.log.Info(). Str("release", item.Title). Str("clean_title", title). Int("year", year). Int("tmdb_id", tmdbId). Msg("Enriched item with TMDB ID via title search") } } func New(cfg *Config) (*Client, error) { // validate trakt configured (it is mandatory) if cfg.Trakt.ClientId == "" { return nil, fmt.Errorf("trakt: no client_id specified") } var tmdbClient *tmdb.Client if cfg.Tmdb.ApiKey != "" { tmdbClient = tmdb.New(&cfg.Tmdb) } return &Client{ trakt: trakt.New(&cfg.Trakt), omdb: omdb.New(&cfg.Omdb), tvdb: tvdb.New(&cfg.Tvdb), tmdb: tmdbClient, log: logger.Child(logger.WithLevel(cfg.Verbosity)), }, nil }