88 "github.com/nullable-eth/syncarr/internal/plex"
99)
1010
11- // LibraryManager handles Phase 4 : Library refresh and monitoring
11+ // LibraryManager handles Phase 5 : Library refresh and monitoring
1212type LibraryManager struct {
1313 destClient * plex.Client
1414 logger * logger.Logger
@@ -24,7 +24,7 @@ func NewLibraryManager(destClient *plex.Client, log *logger.Logger) *LibraryMana
2424
2525// TriggerRefreshAndWait triggers library scans and waits for completion
2626func (lm * LibraryManager ) TriggerRefreshAndWait () error {
27- lm .logger .Info ("Phase 4: Triggering library refresh on destination server " )
27+ lm .logger .Info ("Phase 5: START - Library Refresh " )
2828
2929 // First, wait for any existing scans to complete before starting new ones
3030 lm .logger .Debug ("Checking for existing library scans before starting new ones" )
@@ -81,7 +81,51 @@ func (lm *LibraryManager) TriggerRefreshAndWait() error {
8181 }
8282
8383 // Monitor scan completion for successfully triggered scans
84- return lm .waitForAllScansComplete (successfulScans )
84+ if err := lm .waitForAllScansComplete (successfulScans ); err != nil {
85+ return fmt .Errorf ("library scan failed: %w" , err )
86+ }
87+
88+ lm .logger .Info ("Library scans completed, now triggering metadata refresh for all libraries" )
89+
90+ // Trigger metadata refresh for all libraries to populate initial metadata
91+ var successfulMetadataRefresh []plex.Library
92+ var failedMetadataRefresh []string
93+
94+ for _ , library := range libraries {
95+ lm .logger .WithFields (map [string ]interface {}{
96+ "library_id" : library .Key ,
97+ "library_name" : library .Title ,
98+ }).Debug ("Triggering metadata refresh" )
99+
100+ if err := lm .destClient .TriggerMetadataRefresh (library .Key ); err != nil {
101+ lm .logger .WithError (err ).WithFields (map [string ]interface {}{
102+ "library_id" : library .Key ,
103+ "library_name" : library .Title ,
104+ }).Error ("Failed to trigger metadata refresh" )
105+ failedMetadataRefresh = append (failedMetadataRefresh , fmt .Sprintf ("%s (%s)" , library .Title , library .Key ))
106+ } else {
107+ successfulMetadataRefresh = append (successfulMetadataRefresh , library )
108+ lm .logger .WithFields (map [string ]interface {}{
109+ "library_id" : library .Key ,
110+ "library_name" : library .Title ,
111+ }).Debug ("Successfully triggered metadata refresh" )
112+ }
113+ }
114+
115+ // Log metadata refresh trigger results
116+ if len (failedMetadataRefresh ) > 0 {
117+ lm .logger .WithField ("failed_libraries" , failedMetadataRefresh ).Warn ("Some metadata refreshes failed to trigger" )
118+ }
119+
120+ // If no metadata refreshes were successfully triggered, don't wait
121+ if len (successfulMetadataRefresh ) == 0 {
122+ return fmt .Errorf ("failed to trigger any metadata refreshes" )
123+ }
124+
125+ lm .logger .WithField ("library_count" , len (successfulMetadataRefresh )).Info ("Waiting for metadata refresh to complete" )
126+
127+ // Monitor metadata refresh completion
128+ return lm .waitForAllMetadataRefreshComplete (successfulMetadataRefresh )
85129}
86130
87131// waitForExistingScansComplete waits for any existing library scans to complete
@@ -211,3 +255,48 @@ func (lm *LibraryManager) logScanProgress(activities []plex.Activity) {
211255 lm .logger .WithFields (fields ).Debug ("Scan progress" )
212256 }
213257}
258+
259+ // waitForAllMetadataRefreshComplete waits for all metadata refreshes to complete
260+ func (lm * LibraryManager ) waitForAllMetadataRefreshComplete (libraries []plex.Library ) error {
261+ lm .logger .WithField ("library_count" , len (libraries )).Info ("Monitoring metadata refresh completion" )
262+
263+ const maxWaitTime = 30 * time .Minute // Metadata refresh can take longer than scans
264+ const checkInterval = 15 * time .Second
265+ startTime := time .Now ()
266+
267+ for {
268+ if time .Since (startTime ) > maxWaitTime {
269+ lm .logger .Warn ("Metadata refresh wait timeout reached, proceeding anyway" )
270+ return nil
271+ }
272+
273+ // Check if any metadata refresh activities are still running
274+ metadataInProgress , activities , err := lm .destClient .IsLibraryScanInProgress ()
275+ if err != nil {
276+ lm .logger .WithError (err ).Warn ("Error checking metadata refresh status" )
277+ return nil
278+ }
279+
280+ if ! metadataInProgress {
281+ lm .logger .Info ("All metadata refreshes completed successfully" )
282+ return nil
283+ }
284+
285+ // Log progress for metadata refresh activities
286+ var refreshActivities []string
287+ for _ , activity := range activities {
288+ if activity .Type == "library.refresh" {
289+ refreshActivities = append (refreshActivities , activity .Title )
290+ }
291+ }
292+
293+ if len (refreshActivities ) > 0 {
294+ lm .logger .WithFields (map [string ]interface {}{
295+ "active_refreshes" : refreshActivities ,
296+ "elapsed_time" : time .Since (startTime ).Round (time .Second ),
297+ }).Debug ("Metadata refresh still in progress" )
298+ }
299+
300+ time .Sleep (checkInterval )
301+ }
302+ }
0 commit comments