Some checks failed
Build / build (push) Failing after 13m30s
Items from RSS feeds that have no media ID (tmdb/imdb/tvdb) are now enriched automatically using TMDB's search API. The release name is parsed to extract a clean title and year, then searched against TMDB to retrieve the TMDB ID before validation. - Add media/tmdb package with SearchMovies, SearchShows, and ExtractTitleAndYear (parses torrent release names) - Add EnrichFeedItemWithTmdbId to media.Client, called in rss/process.go before the ID validation switch - Add --run-now flag to nabarr run to trigger all feeds immediately - Wire media.Client through rss.Client and rssJob - Merge feature/add-tag-option (tag support for Sonarr/Radarr) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
74 lines
1.2 KiB
Go
74 lines
1.2 KiB
Go
package rss
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/lefelys/state"
|
|
"github.com/robfig/cron/v3"
|
|
"github.com/rs/zerolog"
|
|
|
|
"github.com/l3uddz/nabarr/cache"
|
|
"github.com/l3uddz/nabarr/cmd/nabarr/pvr"
|
|
"github.com/l3uddz/nabarr/logger"
|
|
"github.com/l3uddz/nabarr/media"
|
|
)
|
|
|
|
type Client struct {
|
|
cron *cron.Cron
|
|
cache *cache.Client
|
|
pvrs map[string]pvr.PVR
|
|
media *media.Client
|
|
jobs []*rssJob
|
|
|
|
log zerolog.Logger
|
|
}
|
|
|
|
func New(c Config, cc *cache.Client, pvrs map[string]pvr.PVR, m *media.Client) *Client {
|
|
return &Client{
|
|
cron: cron.New(cron.WithChain(
|
|
cron.Recover(cron.DefaultLogger),
|
|
)),
|
|
cache: cc,
|
|
pvrs: pvrs,
|
|
media: m,
|
|
jobs: make([]*rssJob, 0),
|
|
|
|
log: logger.Child(logger.WithLevel(c.Verbosity)),
|
|
}
|
|
}
|
|
|
|
func (c *Client) RunAll() {
|
|
for _, job := range c.jobs {
|
|
job.Run()
|
|
}
|
|
}
|
|
|
|
func (c *Client) Start() state.State {
|
|
c.cron.Start()
|
|
|
|
st, tail := state.WithShutdown()
|
|
ticker := time.NewTicker(1 * time.Second)
|
|
|
|
go func() {
|
|
for {
|
|
select {
|
|
case <-tail.End():
|
|
ticker.Stop()
|
|
|
|
// shutdown cron
|
|
ctx := c.cron.Stop()
|
|
select {
|
|
case <-ctx.Done():
|
|
case <-time.After(5 * time.Second):
|
|
}
|
|
|
|
tail.Done()
|
|
return
|
|
case <-ticker.C:
|
|
}
|
|
}
|
|
}()
|
|
|
|
return st
|
|
}
|