package worker import ( "context" "git.sr.ht/~gabrielgio/img/pkg/components/media" "git.sr.ht/~gabrielgio/img/pkg/fileop" ) type ( EXIFScanner struct { repository media.Repository } ) var _ BatchProcessor[*media.Media] = &EXIFScanner{} func NewEXIFScanner(repository media.Repository) *EXIFScanner { return &EXIFScanner{ repository: repository, } } func (e *EXIFScanner) Query(ctx context.Context) ([]*media.Media, error) { medias, err := e.repository.GetEmptyEXIF(ctx, &media.Pagination{ Page: 0, Size: 100, }) if err != nil { return nil, err } return medias, nil } func wrapReadExif(ctx context.Context, path string) (*media.MediaEXIF, error) { c := make(chan *media.MediaEXIF) e := make(chan error) go func() { defer close(c) defer close(e) newExif, err := fileop.ReadExif(path) if err != nil { e <- err } else { c <- newExif } }() select { case <-ctx.Done(): return nil, ctx.Err() case m := <-c: return m, nil case err := <-e: return nil, err } } func (e *EXIFScanner) Process(ctx context.Context, m *media.Media) error { newExif, err := wrapReadExif(ctx, m.Path) if err != nil { return err } return e.repository.CreateEXIF(ctx, m.ID, newExif) }