Files
silo-server/internal/taskmanager/tasks/sync_audiobook_metadata.go
T
RXWatcherandClaude Opus 4.7 ac31c9d17e chore(audiobooks): snapshot in-progress work as pre-redesign baseline
Bundles 21 in-progress files spanning scanner, image cache, ABS API
handlers, podcast/audiobook scan, cover enrichment, metadata sync
task, and an interim pass at the audiobook detail page (DetailHero
adoption + fixed-bottom player). Committed as a single baseline so
the upcoming UI redesign (per the 2026-05-24 plan) starts from a
clean working tree. Not split into logical commits because this
captures pre-existing local work, not a curated change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 23:24:11 +02:00

54 lines
1.9 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) 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
}