72 lines
2.3 KiB
Go
72 lines
2.3 KiB
Go
package scanner_task
|
|
|
|
import (
|
|
"context"
|
|
"io/fs"
|
|
|
|
"github.com/photoview/photoview/api/graphql/models"
|
|
"github.com/photoview/photoview/api/scanner/media_encoding"
|
|
"github.com/photoview/photoview/api/scanner/scanner_cache"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// ScannerTask is an interface for a task to be performed as a part of the scanner pipeline
|
|
type ScannerTask interface {
|
|
// BeforeScanAlbum will run at the beginning of the scan task.
|
|
// New values can be stored in the returned TaskContext that will live throughout the lifetime of the task.
|
|
BeforeScanAlbum(ctx TaskContext) (TaskContext, error)
|
|
AfterScanAlbum(ctx TaskContext, albumHadChanges bool) error
|
|
|
|
MediaFound(ctx TaskContext, fileInfo fs.FileInfo, mediaPath string) (skip bool, err error)
|
|
AfterMediaFound(ctx TaskContext, media *models.Media, newMedia bool) error
|
|
|
|
BeforeProcessMedia(ctx TaskContext, media *models.Media) (TaskContext, error)
|
|
ProcessMedia(ctx TaskContext, mediaData *media_encoding.EncodeMediaData, mediaCachePath string) (didProcess bool, err error)
|
|
AfterProcessMedia(ctx TaskContext, media *models.Media, didProcess bool, mediaIndex int, mediaTotal int) error
|
|
}
|
|
|
|
type TaskContext struct {
|
|
ctx context.Context
|
|
}
|
|
|
|
func NewTaskContext(parent context.Context, db *gorm.DB, album *models.Album, cache *scanner_cache.AlbumScannerCache) TaskContext {
|
|
ctx := parent
|
|
ctx = context.WithValue(ctx, taskCtxKeyAlbum, album)
|
|
ctx = context.WithValue(ctx, taskCtxKeyAlbumCache, cache)
|
|
ctx = context.WithValue(ctx, taskCtxKeyDatabase, db.WithContext(ctx))
|
|
|
|
return TaskContext{
|
|
ctx: ctx,
|
|
}
|
|
}
|
|
|
|
type taskCtxKeyType string
|
|
|
|
const (
|
|
taskCtxKeyAlbum taskCtxKeyType = "task_album"
|
|
taskCtxKeyAlbumCache taskCtxKeyType = "task_album_cache"
|
|
taskCtxKeyDatabase taskCtxKeyType = "task_database"
|
|
)
|
|
|
|
func (c TaskContext) GetAlbum() *models.Album {
|
|
return c.ctx.Value(taskCtxKeyAlbum).(*models.Album)
|
|
}
|
|
|
|
func (c TaskContext) GetCache() *scanner_cache.AlbumScannerCache {
|
|
return c.ctx.Value(taskCtxKeyAlbumCache).(*scanner_cache.AlbumScannerCache)
|
|
}
|
|
|
|
func (c TaskContext) GetDB() *gorm.DB {
|
|
return c.ctx.Value(taskCtxKeyDatabase).(*gorm.DB)
|
|
}
|
|
|
|
func (c TaskContext) WithValue(key, val interface{}) TaskContext {
|
|
return TaskContext{
|
|
ctx: context.WithValue(c.ctx, key, val),
|
|
}
|
|
}
|
|
|
|
func (c TaskContext) Value(key interface{}) interface{} {
|
|
return c.ctx.Value(key)
|
|
}
|