-
Notifications
You must be signed in to change notification settings - Fork 11
/
lidarr.go
128 lines (102 loc) · 3.47 KB
/
lidarr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package processor
import (
"context"
"strings"
"time"
"github.com/autobrr/omegabrr/internal/domain"
"github.com/autobrr/omegabrr/pkg/autobrr"
"github.com/pkg/errors"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"golift.io/starr"
"golift.io/starr/lidarr"
)
func (s Service) lidarr(ctx context.Context, cfg *domain.ArrConfig, dryRun bool, brr *autobrr.Client) error {
l := log.With().Str("type", "lidarr").Str("client", cfg.Name).Logger()
l.Debug().Msgf("gathering titles...")
titles, artists, err := s.processLidarr(ctx, cfg, &l)
if err != nil {
return err
}
l.Debug().Msgf("got %v filter titles", len(titles))
// Process titles
var processedTitles []string
for _, title := range titles {
processedTitles = append(processedTitles, processTitle(title, cfg.MatchRelease)...)
}
// Update filter based on MatchRelease
var f autobrr.UpdateFilter
if cfg.MatchRelease {
joinedTitles := strings.Join(processedTitles, ",")
if len(joinedTitles) == 0 {
return nil
}
f = autobrr.UpdateFilter{MatchReleases: joinedTitles}
} else {
// Process artists only if MatchRelease is false
var processedArtists []string
for _, artist := range artists {
processedArtists = append(processedArtists, processTitle(artist, cfg.MatchRelease)...)
}
joinedTitles := strings.Join(processedTitles, ",")
joinedArtists := strings.Join(processedArtists, ",")
if len(joinedTitles) == 0 && len(joinedArtists) == 0 {
return nil
}
f = autobrr.UpdateFilter{Albums: joinedTitles, Artists: joinedArtists}
}
for _, filterID := range cfg.Filters {
l.Debug().Msgf("updating filter: %v", filterID)
if !dryRun {
if err := brr.UpdateFilterByID(ctx, filterID, f); err != nil {
l.Error().Err(err).Msgf("error updating filter: %v", filterID)
return errors.Wrapf(err, "error updating filter: %v", filterID)
}
}
l.Debug().Msgf("successfully updated filter: %v", filterID)
}
return nil
}
func (s Service) processLidarr(ctx context.Context, cfg *domain.ArrConfig, logger *zerolog.Logger) ([]string, []string, error) {
c := starr.New(cfg.Apikey, cfg.Host, 60*time.Second)
if cfg.BasicAuth != nil {
if cfg.BasicAuth.User != "" {
c.HTTPUser = cfg.BasicAuth.User
}
if cfg.BasicAuth.Pass != "" {
c.HTTPPass = cfg.BasicAuth.Pass
}
}
r := lidarr.New(c)
albums, err := r.GetAlbumContext(ctx, "")
if err != nil {
return nil, nil, err
}
var titles []string
var artists []string
seenArtists := make(map[string]struct{})
for _, album := range albums {
if !album.Monitored {
continue // Skip unmonitored albums
}
// Fetch the artist details
artist, err := r.GetArtistByIDContext(ctx, album.ArtistID)
if err != nil {
logger.Error().Err(err).Msgf("Error fetching artist details for album: %v", album.Title)
continue // Skip this album if there's an error fetching the artist
}
if artist.Monitored {
processedTitles := processTitle(album.Title, cfg.MatchRelease)
titles = append(titles, processedTitles...)
// Debug logging
logger.Debug().Msgf("Processing artist: %s", artist.ArtistName)
if _, exists := seenArtists[artist.ArtistName]; !exists {
artists = append(artists, artist.ArtistName)
seenArtists[artist.ArtistName] = struct{}{}
logger.Debug().Msgf("Added artist: %s", artist.ArtistName) // Log when an artist is added
}
}
}
logger.Debug().Msgf("Processed %d monitored albums with monitored artists, created %d titles, found %d unique artists", len(titles), len(titles), len(artists))
return titles, artists, nil
}