2021-02-14 16:18:26 +00:00
|
|
|
package sonarr
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
2022-04-01 20:42:05 +01:00
|
|
|
"net/http"
|
|
|
|
|
"strings"
|
|
|
|
|
"time"
|
|
|
|
|
|
2021-02-14 16:18:26 +00:00
|
|
|
"github.com/l3uddz/nabarr"
|
|
|
|
|
"github.com/l3uddz/nabarr/cache"
|
|
|
|
|
"github.com/l3uddz/nabarr/logger"
|
|
|
|
|
"github.com/l3uddz/nabarr/media"
|
|
|
|
|
"github.com/l3uddz/nabarr/util"
|
|
|
|
|
"github.com/rs/zerolog"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Client struct {
|
2021-06-11 08:21:38 +01:00
|
|
|
pvrType string
|
|
|
|
|
name string
|
|
|
|
|
testMode bool
|
|
|
|
|
testModeAdd bool
|
2021-02-14 16:18:26 +00:00
|
|
|
|
2021-06-11 08:21:38 +01:00
|
|
|
rootFolder string
|
|
|
|
|
qualityProfileId int
|
|
|
|
|
languageProfileId int
|
2021-02-14 16:18:26 +00:00
|
|
|
|
2021-02-20 20:01:04 +00:00
|
|
|
// options
|
|
|
|
|
searchMissing bool
|
|
|
|
|
addMonitored bool
|
|
|
|
|
skipAnime bool
|
|
|
|
|
|
2021-02-14 16:18:26 +00:00
|
|
|
apiURL string
|
|
|
|
|
apiHeaders map[string]string
|
|
|
|
|
|
|
|
|
|
cache *cache.Client
|
|
|
|
|
cacheTempDuration time.Duration
|
|
|
|
|
cacheFiltersHash string
|
|
|
|
|
|
|
|
|
|
queue chan *media.FeedItem
|
|
|
|
|
|
|
|
|
|
m *media.Client
|
2021-02-21 14:01:21 +00:00
|
|
|
http *http.Client
|
2021-02-14 16:18:26 +00:00
|
|
|
log zerolog.Logger
|
|
|
|
|
ignoresExpr []*nabarr.ExprProgram
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func New(c nabarr.PvrConfig, mode string, m *media.Client, cc *cache.Client) (*Client, error) {
|
|
|
|
|
l := logger.New(c.Verbosity).With().
|
|
|
|
|
Str("pvr_name", c.Name).
|
|
|
|
|
Str("pvr_type", c.Type).
|
|
|
|
|
Logger()
|
|
|
|
|
|
|
|
|
|
// set config defaults (if not set)
|
|
|
|
|
if c.CacheDuration == 0 {
|
|
|
|
|
c.CacheDuration = 24 * time.Hour
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// set api url
|
|
|
|
|
apiURL := ""
|
|
|
|
|
if strings.Contains(strings.ToLower(c.URL), "/api") {
|
|
|
|
|
apiURL = c.URL
|
|
|
|
|
} else {
|
2021-06-11 08:21:38 +01:00
|
|
|
apiURL = util.JoinURL(c.URL, "api", "v3")
|
2021-02-14 16:18:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// set api headers
|
|
|
|
|
apiHeaders := map[string]string{
|
|
|
|
|
"X-Api-Key": c.ApiKey,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// create client
|
|
|
|
|
cl := &Client{
|
2021-06-11 08:21:38 +01:00
|
|
|
pvrType: "sonarr",
|
|
|
|
|
name: strings.ToLower(c.Name),
|
|
|
|
|
testMode: util.StringSliceContains([]string{"test", "test-add"}, mode),
|
|
|
|
|
testModeAdd: strings.EqualFold(mode, "test-add"),
|
2021-02-14 16:18:26 +00:00
|
|
|
|
|
|
|
|
rootFolder: c.RootFolder,
|
|
|
|
|
|
2021-02-20 20:01:04 +00:00
|
|
|
searchMissing: util.BoolOrDefault(c.Options.SearchMissing, true),
|
|
|
|
|
addMonitored: util.BoolOrDefault(c.Options.AddMonitored, true),
|
|
|
|
|
skipAnime: util.BoolOrDefault(c.Options.SkipAnime, true),
|
|
|
|
|
|
2021-02-14 16:18:26 +00:00
|
|
|
cache: cc,
|
|
|
|
|
cacheTempDuration: c.CacheDuration,
|
|
|
|
|
cacheFiltersHash: util.AsSHA256(c.Filters),
|
|
|
|
|
|
|
|
|
|
queue: make(chan *media.FeedItem, 1024),
|
|
|
|
|
|
|
|
|
|
apiURL: apiURL,
|
|
|
|
|
apiHeaders: apiHeaders,
|
|
|
|
|
|
2021-02-21 14:01:21 +00:00
|
|
|
m: m,
|
|
|
|
|
http: util.NewRetryableHttpClient(60*time.Second, nil, &l),
|
|
|
|
|
log: l,
|
2021-02-14 16:18:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// compile expressions
|
|
|
|
|
if err := cl.compileExpressions(c.Filters); err != nil {
|
|
|
|
|
return nil, fmt.Errorf("compile expressions: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// validate api access
|
|
|
|
|
ss, err := cl.getSystemStatus()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("validate api: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// get quality profile
|
|
|
|
|
if qid, err := cl.getQualityProfileId(c.QualityProfile); err != nil {
|
|
|
|
|
return nil, fmt.Errorf("get quality profile: %v: %w", c.QualityProfile, err)
|
|
|
|
|
} else {
|
|
|
|
|
cl.qualityProfileId = qid
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-11 08:21:38 +01:00
|
|
|
// get language profile
|
|
|
|
|
if lid, err := cl.getLanguageProfileId(c.LanguageProfile); err != nil {
|
|
|
|
|
return nil, fmt.Errorf("get language profile: %v: %w", c.LanguageProfile, err)
|
|
|
|
|
} else {
|
|
|
|
|
cl.languageProfileId = lid
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-14 16:18:26 +00:00
|
|
|
cl.log.Info().
|
|
|
|
|
Str("pvr_version", ss.Version).
|
|
|
|
|
Msg("Initialised")
|
|
|
|
|
return cl, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Client) Type() string {
|
|
|
|
|
return c.pvrType
|
|
|
|
|
}
|
2021-02-16 19:09:01 +00:00
|
|
|
|
|
|
|
|
func (c *Client) GetFiltersHash() string {
|
|
|
|
|
return c.cacheFiltersHash
|
|
|
|
|
}
|