61 lines
2.1 KiB
Go
61 lines
2.1 KiB
Go
package tasks
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/Silo-Server/silo-server/internal/audiobooks"
|
|
"github.com/Silo-Server/silo-server/internal/taskmanager"
|
|
)
|
|
|
|
// SyncAudiobookMetadataTask runs the periodic audiobook enrichment sweep.
|
|
// It calls audiobooks.Enricher.Run() which selects unenriched audiobook
|
|
// media_items, resolves the per-folder metadata-provider chain at
|
|
// content_level='audiobook', and writes results back to the database.
|
|
type SyncAudiobookMetadataTask struct {
|
|
enricher *audiobooks.Enricher
|
|
}
|
|
|
|
// NewSyncAudiobookMetadataTask constructs the task.
|
|
func NewSyncAudiobookMetadataTask(enricher *audiobooks.Enricher) *SyncAudiobookMetadataTask {
|
|
return &SyncAudiobookMetadataTask{enricher: enricher}
|
|
}
|
|
|
|
func (t *SyncAudiobookMetadataTask) Key() string { return "sync_audiobook_metadata" }
|
|
func (t *SyncAudiobookMetadataTask) Name() string { return "Sync Audiobook Metadata" }
|
|
func (t *SyncAudiobookMetadataTask) Description() string {
|
|
return "Fetches metadata (cover art, overview, narrator) for audiobooks that have not yet been enriched"
|
|
}
|
|
func (t *SyncAudiobookMetadataTask) Category() taskmanager.TaskCategory {
|
|
return taskmanager.TaskCategoryMetadata
|
|
}
|
|
func (t *SyncAudiobookMetadataTask) IsHidden() bool { return false }
|
|
|
|
func (t *SyncAudiobookMetadataTask) DefaultTriggers() []taskmanager.TriggerConfig {
|
|
return []taskmanager.TriggerConfig{
|
|
{Type: taskmanager.TriggerTypeInterval, IntervalMs: 5 * 60 * 1000}, // every 5 minutes
|
|
}
|
|
}
|
|
|
|
func (t *SyncAudiobookMetadataTask) ShouldRun(ctx context.Context) (bool, error) {
|
|
if t == nil || t.enricher == nil {
|
|
return false, nil
|
|
}
|
|
return t.enricher.HasPendingItems(ctx)
|
|
}
|
|
|
|
func (t *SyncAudiobookMetadataTask) Execute(ctx context.Context, progress taskmanager.ProgressReporter) error {
|
|
progress.Report(0, "Scanning for unenriched audiobooks")
|
|
|
|
enriched, err := t.enricher.Run(ctx)
|
|
if err != nil {
|
|
return fmt.Errorf("audiobook metadata sync: %w", err)
|
|
}
|
|
|
|
result, _ := json.Marshal(map[string]int{"items_enriched": enriched})
|
|
progress.SetResultData(result)
|
|
progress.Report(100, fmt.Sprintf("Audiobook metadata sync complete (%d items enriched)", enriched))
|
|
return nil
|
|
}
|