55 "encoding/json"
66 "fmt"
77 "net/url"
8- "strings"
98
109 "explo/src/config"
1110 "explo/src/debug"
@@ -14,24 +13,24 @@ import (
1413)
1514
1615type Paths []struct {
17- Name string `json:"Name"`
18- Locations []string `json:"Locations"`
19- CollectionType string `json:"CollectionType"`
20- ItemID string `json:"ItemId"`
21- RefreshStatus string `json:"RefreshStatus"`
16+ Name string `json:"Name"`
17+ Locations []string `json:"Locations"`
18+ CollectionType string `json:"CollectionType"`
19+ ItemID string `json:"ItemId"`
20+ RefreshStatus string `json:"RefreshStatus"`
2221}
2322
2423type Search struct {
2524 SearchHints []SearchHints `json:"SearchHints"`
2625 TotalRecordCount int `json:"TotalRecordCount"`
2726}
2827type SearchHints struct {
29- ItemID string `json:"ItemId"`
30- ID string `json:"Id"`
31- Name string `json:"Name"`
32- Album string `json:"Album"`
33- AlbumID string `json:"AlbumId"`
34- AlbumArtist string `json:"AlbumArtist"`
28+ ItemID string `json:"ItemId"`
29+ ID string `json:"Id"`
30+ Name string `json:"Name"`
31+ Album string `json:"Album"`
32+ AlbumID string `json:"AlbumId"`
33+ AlbumArtist string `json:"AlbumArtist"`
3534}
3635
3736type Audios struct {
@@ -41,27 +40,27 @@ type Audios struct {
4140}
4241
4342type Items struct {
44- Name string `json:"Name"`
45- ServerID string `json:"ServerId"`
46- ID string `json:"Id"`
47- Path string `json:"Path"`
48- Album string `json:"Album,omitempty"`
49- AlbumArtist string `json:"AlbumArtist,omitempty"`
43+ Name string `json:"Name"`
44+ ServerID string `json:"ServerId"`
45+ ID string `json:"Id"`
46+ Path string `json:"Path"`
47+ Album string `json:"Album,omitempty"`
48+ AlbumArtist string `json:"AlbumArtist,omitempty"`
5049}
5150
5251type JFPlaylist struct {
5352 ID string `json:"Id"`
5453}
5554
5655type Jellyfin struct {
57- LibraryID string
56+ LibraryID string
5857 HttpClient * util.HttpClient
59- Cfg config.ClientConfig
58+ Cfg config.ClientConfig
6059}
6160
6261func NewJellyfin (cfg config.ClientConfig , httpClient * util.HttpClient ) * Jellyfin {
6362 return & Jellyfin {Cfg : cfg ,
64- HttpClient : httpClient }
63+ HttpClient : httpClient }
6564}
6665
6766func (c * Jellyfin ) AddHeader () error {
@@ -70,8 +69,8 @@ func (c *Jellyfin) AddHeader() error {
7069 }
7170
7271 if c .Cfg .Creds .APIKey != "" {
73- c .Cfg .Creds .Headers ["Authorization" ] = fmt .Sprintf ("MediaBrowser Token=%s, Client=%s" , c .Cfg .Creds .APIKey , c .Cfg .ClientID )
74- return nil
72+ c .Cfg .Creds .Headers ["Authorization" ] = fmt .Sprintf ("MediaBrowser Token=%s, Client=%s" , c .Cfg .Creds .APIKey , c .Cfg .ClientID )
73+ return nil
7574 }
7675 return fmt .Errorf ("API_KEY not set" )
7776}
@@ -82,7 +81,7 @@ func (c *Jellyfin) GetAuth() error {
8281
8382func (c * Jellyfin ) GetLibrary () error {
8483 reqParam := "/Library/VirtualFolders"
85-
84+
8685 body , err := c .HttpClient .MakeRequest ("GET" , c .Cfg .URL + reqParam , nil , c .Cfg .Creds .Headers )
8786 if err != nil {
8887 return err
@@ -92,7 +91,7 @@ func (c *Jellyfin) GetLibrary() error {
9291 if err = util .ParseResp (body , & paths ); err != nil {
9392 return err
9493 }
95-
94+
9695 for _ , path := range paths {
9796 if path .Name == c .Cfg .LibraryName {
9897 c .LibraryID = path .ItemID
@@ -120,7 +119,7 @@ func (c *Jellyfin) AddLibrary() error {
120119}
121120
122121func (c * Jellyfin ) RefreshLibrary () error {
123- reqParam := fmt .Sprintf ("/Items/%s/Refresh" , c .LibraryID )
122+ reqParam := fmt .Sprintf ("/Items/%s/Refresh?metadataRefreshMode=FullRefresh " , c .LibraryID )
124123
125124 if _ , err := c .HttpClient .MakeRequest ("POST" , c .Cfg .URL + reqParam , nil , c .Cfg .Creds .Headers ); err != nil {
126125 return err
@@ -129,37 +128,35 @@ func (c *Jellyfin) RefreshLibrary() error {
129128}
130129
131130func (c * Jellyfin ) SearchSongs (tracks []* models.Track ) error {
132- queryParams := fmt .Sprintf ("/Items?parentId=%s&fields=Path&mediaTypes=Audio&sortBy=DateCreated&sortOrder=Descending&limit=200" , c .LibraryID ) // limit 200 recently added audio tracks to search from
133-
134- body , err := c .HttpClient .MakeRequest ("GET" , c .Cfg .URL + queryParams , nil , c .Cfg .Creds .Headers )
135- if err != nil {
136- return fmt .Errorf ("request failed to get songs from %s library: %s" , c .Cfg .LibraryName , err .Error ())
137- }
131+ for _ , track := range tracks {
132+ queryParams := fmt .Sprintf ("/Items?parentId=%s&mediaTypes=Audio&searchTerm=%s&recursive=true" , c .LibraryID , url .QueryEscape (track .CleanTitle ))
138133
139- var results Audios
140- if err = util . ParseResp ( body , & results ); err != nil {
141- return err
142- }
134+ body , err := c . HttpClient . MakeRequest ( "GET" , c . Cfg . URL + queryParams , nil , c . Cfg . Creds . Headers )
135+ if err != nil {
136+ return fmt . Errorf ( "request failed to get songs from %s library: %s" , c . Cfg . LibraryName , err . Error ())
137+ }
143138
144- for _ , track := range tracks {
139+ var results Audios
140+ if err = util .ParseResp (body , & results ); err != nil {
141+ return err
142+ }
145143
146144 for _ , item := range results .Items {
147- if strings . Contains ( item .Path , track .File ) {
145+ if track . MainArtist == item .AlbumArtist && item . Name == track .CleanTitle {
148146 track .ID = item .ID
149147 track .Present = true
150148 break
151149 }
152150 }
153151 if ! track .Present {
154- debug .Debug (fmt .Sprintf ("failed to find '%s' by '%s' in %s album" , track .Title , track .Artist , track .Album ))
152+ debug .Debug (fmt .Sprintf ("failed to find '%s' by '%s' in %s album" , track .Title , track .Artist , track .Album ))
155153 }
156154 }
157155 return nil
158156}
159157
160158func (c * Jellyfin ) SearchPlaylist () error {
161- queryParams := fmt .Sprintf ("/Search/Hints?searchTerm=%s&mediaTypes=Playlist" , c .Cfg .PlaylistName )
162-
159+ queryParams := fmt .Sprintf ("/Items?mediaTypes=Playlist&searchTerm=%s&recursive=true" , c .Cfg .PlaylistName )
163160 body , err := c .HttpClient .MakeRequest ("GET" , c .Cfg .URL + queryParams , nil , c .Cfg .Creds .Headers )
164161 if err != nil {
165162 return err
@@ -169,7 +166,7 @@ func (c *Jellyfin) SearchPlaylist() error {
169166 if err = util .ParseResp (body , & results ); err != nil {
170167 return err
171168 }
172-
169+
173170 if len (results .SearchHints ) != 0 {
174171 c .Cfg .PlaylistID = results .SearchHints [0 ].ID
175172 return nil
@@ -237,12 +234,12 @@ func formatJFSongs(tracks []*models.Track) ([]byte, error) { // marshal track ID
237234 songIDs := make ([]string , 0 , len (tracks ))
238235 for _ , track := range tracks {
239236 if track .Present {
240- songIDs = append (songIDs ,track .ID )
237+ songIDs = append (songIDs , track .ID )
241238 }
242239 }
243240 songs , err := json .Marshal (songIDs )
244241 if err != nil {
245242 return nil , err
246243 }
247244 return songs , nil
248- }
245+ }
0 commit comments