1
Fork 0
photoview/api/scanner/scanner_tasks/scanner_tasks.go

144 lines
3.7 KiB
Go
Raw Normal View History

2022-02-14 23:57:45 +01:00
package scanner_tasks
import (
"io/fs"
"github.com/photoview/photoview/api/graphql/models"
"github.com/photoview/photoview/api/scanner/media_encoding"
"github.com/photoview/photoview/api/scanner/scanner_task"
"github.com/photoview/photoview/api/scanner/scanner_tasks/cleanup_tasks"
"github.com/photoview/photoview/api/scanner/scanner_tasks/processing_tasks"
2022-02-14 23:57:45 +01:00
)
var allTasks []scanner_task.ScannerTask = []scanner_task.ScannerTask{
NotificationTask{},
IgnorefileTask{},
processing_tasks.CounterpartFilesTask{},
processing_tasks.SidecarTask{},
processing_tasks.ProcessPhotoTask{},
processing_tasks.ProcessVideoTask{},
FaceDetectionTask{},
ExifTask{},
2022-03-02 17:26:06 +01:00
VideoMetadataTask{},
cleanup_tasks.MediaCleanupTask{},
2022-02-14 23:57:45 +01:00
}
type scannerTasks struct {
scanner_task.ScannerTaskBase
}
var Tasks scannerTasks = scannerTasks{}
2022-07-07 22:00:05 +02:00
func simpleCombinedTasks(ctx scanner_task.TaskContext, doTask func(ctx scanner_task.TaskContext, task scanner_task.ScannerTask) error) error {
for _, task := range allTasks {
select {
2022-07-07 22:00:05 +02:00
case <-ctx.Done():
return ctx.Err()
default:
}
2022-07-07 22:00:05 +02:00
err := doTask(ctx, task)
if err != nil {
return err
}
}
return nil
}
2022-02-14 23:57:45 +01:00
func (t scannerTasks) BeforeScanAlbum(ctx scanner_task.TaskContext) (scanner_task.TaskContext, error) {
2022-07-07 22:00:05 +02:00
for _, task := range allTasks {
2022-02-14 23:57:45 +01:00
var err error
2022-07-07 22:00:05 +02:00
ctx, err = task.BeforeScanAlbum(ctx)
2022-02-14 23:57:45 +01:00
if err != nil {
return ctx, err
}
select {
case <-ctx.Done():
return ctx, ctx.Err()
default:
}
2022-02-14 23:57:45 +01:00
}
2022-07-07 22:00:05 +02:00
return ctx, nil
2022-02-14 23:57:45 +01:00
}
func (t scannerTasks) MediaFound(ctx scanner_task.TaskContext, fileInfo fs.FileInfo, mediaPath string) (bool, error) {
2022-07-07 22:00:05 +02:00
for _, task := range allTasks {
select {
2022-07-07 22:00:05 +02:00
case <-ctx.Done():
return false, ctx.Err()
default:
}
2022-07-07 22:00:05 +02:00
skip, err := task.MediaFound(ctx, fileInfo, mediaPath)
2022-02-14 23:57:45 +01:00
if err != nil {
return false, err
}
if skip {
return true, nil
}
}
return false, nil
}
func (t scannerTasks) AfterScanAlbum(ctx scanner_task.TaskContext, changedMedia []*models.Media, albumMedia []*models.Media) error {
2022-07-07 22:00:05 +02:00
return simpleCombinedTasks(ctx, func(ctx scanner_task.TaskContext, task scanner_task.ScannerTask) error {
return task.AfterScanAlbum(ctx, changedMedia, albumMedia)
})
2022-02-14 23:57:45 +01:00
}
func (t scannerTasks) AfterMediaFound(ctx scanner_task.TaskContext, media *models.Media, newMedia bool) error {
2022-07-07 22:00:05 +02:00
return simpleCombinedTasks(ctx, func(ctx scanner_task.TaskContext, task scanner_task.ScannerTask) error {
return task.AfterMediaFound(ctx, media, newMedia)
})
2022-02-14 23:57:45 +01:00
}
func (t scannerTasks) BeforeProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData) (scanner_task.TaskContext, error) {
2022-07-07 22:00:05 +02:00
for _, task := range allTasks {
select {
2022-07-07 22:00:05 +02:00
case <-ctx.Done():
return ctx, ctx.Err()
default:
}
2022-02-14 23:57:45 +01:00
var err error
2022-07-07 22:00:05 +02:00
ctx, err = task.BeforeProcessMedia(ctx, mediaData)
2022-02-14 23:57:45 +01:00
if err != nil {
return ctx, err
}
}
2022-07-07 22:00:05 +02:00
return ctx, nil
2022-02-14 23:57:45 +01:00
}
func (t scannerTasks) ProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData, mediaCachePath string) ([]*models.MediaURL, error) {
allNewMedia := make([]*models.MediaURL, 0)
2022-07-07 22:00:05 +02:00
for _, task := range allTasks {
select {
2022-07-07 22:00:05 +02:00
case <-ctx.Done():
return nil, ctx.Err()
default:
2022-02-14 23:57:45 +01:00
}
2022-07-07 22:00:05 +02:00
newMedia, err := task.ProcessMedia(ctx, mediaData, mediaCachePath)
if err != nil {
return []*models.MediaURL{}, err
2022-02-14 23:57:45 +01:00
}
allNewMedia = append(allNewMedia, newMedia...)
2022-02-14 23:57:45 +01:00
}
return allNewMedia, nil
2022-02-14 23:57:45 +01:00
}
func (t scannerTasks) AfterProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData, updatedURLs []*models.MediaURL, mediaIndex int, mediaTotal int) error {
2022-07-07 22:00:05 +02:00
return simpleCombinedTasks(ctx, func(ctx scanner_task.TaskContext, task scanner_task.ScannerTask) error {
return task.AfterProcessMedia(ctx, mediaData, updatedURLs, mediaIndex, mediaTotal)
})
2022-02-14 23:57:45 +01:00
}