1
Fork 0

only process incremental media and skip non media files

This commit is contained in:
amit handa 2023-01-18 19:10:55 -08:00
parent ff13415426
commit db5a514ae6
4 changed files with 54 additions and 12 deletions

View File

@ -149,8 +149,20 @@ func findMediaForAlbum(ctx scanner_task.TaskContext) ([]*models.Media, error) {
return nil, err return nil, err
} }
var mediaNames = ctx.GetMediaNames()
if len(mediaNames) == 0 {
for _, item := range dirContent { for _, item := range dirContent {
mediaPath := path.Join(ctx.GetAlbum().Path, item.Name()) mediaNames = append(mediaNames, item.Name())
}
}
for _, mediaName := range mediaNames {
mediaPath := path.Join(ctx.GetAlbum().Path, mediaName)
item, err := os.Stat(mediaPath)
if err != nil {
log.Printf("cannot find file")
continue
}
isDirSymlink, err := utils.IsDirSymlink(mediaPath) isDirSymlink, err := utils.IsDirSymlink(mediaPath)
if err != nil { if err != nil {

View File

@ -81,7 +81,7 @@ func ProcessSingleMedia(db *gorm.DB, media *models.Media) error {
media_data := media_encoding.NewEncodeMediaData(media) media_data := media_encoding.NewEncodeMediaData(media)
task_context := scanner_task.NewTaskContext(context.Background(), db, &album, album_cache) task_context := scanner_task.NewTaskContext(context.Background(), db, &album, []string{}, album_cache)
new_ctx, err := scanner_tasks.Tasks.BeforeProcessMedia(task_context, &media_data) new_ctx, err := scanner_tasks.Tasks.BeforeProcessMedia(task_context, &media_data)
if err != nil { if err != nil {
return err return err

View File

@ -4,9 +4,9 @@ import (
"container/list" "container/list"
"context" "context"
"fmt" "fmt"
"github.com/photoview/photoview/api/scanner/media_type"
"log" "log"
"path" "path"
"reflect"
"sync" "sync"
"time" "time"
@ -24,7 +24,6 @@ import (
// ScannerJob describes a job on the queue to be run by the scanner over a single album // ScannerJob describes a job on the queue to be run by the scanner over a single album
type ScannerJob struct { type ScannerJob struct {
ctx scanner_task.TaskContext ctx scanner_task.TaskContext
media_paths []string
// album *models.Album // album *models.Album
// cache *scanner_cache.AlbumScannerCache // cache *scanner_cache.AlbumScannerCache
} }
@ -32,7 +31,6 @@ type ScannerJob struct {
func NewScannerJob(ctx scanner_task.TaskContext) ScannerJob { func NewScannerJob(ctx scanner_task.TaskContext) ScannerJob {
return ScannerJob{ return ScannerJob{
ctx, ctx,
make([]string, 0),
} }
} }
@ -155,7 +153,7 @@ func (queue *ScannerQueue) processQueue(notifyThrottle *utils.Throttle) {
// Delete finished job from queue // Delete finished job from queue
queue.mutex.Lock() queue.mutex.Lock()
for i, x := range queue.in_progress { for i, x := range queue.in_progress {
if x.ctx == nextJob.ctx && reflect.DeepEqual(x.media_paths, nextJob.media_paths) { if x.ctx == nextJob.ctx {
queue.in_progress[i] = queue.in_progress[len(queue.in_progress)-1] queue.in_progress[i] = queue.in_progress[len(queue.in_progress)-1]
queue.in_progress = queue.in_progress[0 : len(queue.in_progress)-1] queue.in_progress = queue.in_progress[0 : len(queue.in_progress)-1]
break break
@ -243,7 +241,7 @@ func AddUserToQueue(user *models.User) error {
global_scanner_queue.mutex.Lock() global_scanner_queue.mutex.Lock()
for _, album := range albums { for _, album := range albums {
global_scanner_queue.addJob(&ScannerJob{ global_scanner_queue.addJob(&ScannerJob{
ctx: scanner_task.NewTaskContext(context.Background(), global_scanner_queue.db, album, album_cache), ctx: scanner_task.NewTaskContext(context.Background(), global_scanner_queue.db, album, make([]string, 0), album_cache),
}) })
} }
global_scanner_queue.mutex.Unlock() global_scanner_queue.mutex.Unlock()
@ -254,6 +252,14 @@ func AddUserToQueue(user *models.User) error {
func AddMediaToQueue(mediaPath string) error { func AddMediaToQueue(mediaPath string) error {
var media *models.Media var media *models.Media
mediatype, err := media_type.GetMediaType(mediaPath)
if err != nil {
return errors.Wrap(err, "not media")
}
if mediatype == nil || !mediatype.IsSupported() {
return errors.New("unsupported media")
}
if err := global_scanner_queue.db.Preload("Album").Where("path = ?", mediaPath).Find(&media).Error; err != nil { if err := global_scanner_queue.db.Preload("Album").Where("path = ?", mediaPath).Find(&media).Error; err != nil {
return errors.Wrap(err, "media by path database query") return errors.Wrap(err, "media by path database query")
} }
@ -262,6 +268,7 @@ func AddMediaToQueue(mediaPath string) error {
var album *models.Album var album *models.Album
var subalbumPath string var subalbumPath string
if media == nil || media.ID == 0 { if media == nil || media.ID == 0 {
albumPath := path.Dir(mediaPath) albumPath := path.Dir(mediaPath)
for album == nil { for album == nil {
if err := global_scanner_queue.db.Where("path = ?", albumPath).Find(&album).Error; err != nil { if err := global_scanner_queue.db.Where("path = ?", albumPath).Find(&album).Error; err != nil {
@ -280,14 +287,31 @@ func AddMediaToQueue(mediaPath string) error {
return errors.Wrap(err, "find owners for album") return errors.Wrap(err, "find owners for album")
} }
album_cache := scanner_cache.MakeAlbumCache()
scanQueue := list.New() scanQueue := list.New()
scanQueue.PushBack(scanner.ScanInfo{ scanQueue.PushBack(scanner.ScanInfo{
Path: subalbumPath, Path: subalbumPath,
Parent: album, Parent: album,
Ignore: nil, Ignore: nil,
}) })
album_cache := scanner_cache.MakeAlbumCache() all_albums, album_errors := scanner.ProcessUserAlbums(scanQueue, global_scanner_queue.db, userAlbumOwner, album_cache)
scanner.ProcessUserAlbums(scanQueue, global_scanner_queue.db, userAlbumOwner, album_cache) for _, err := range album_errors {
return errors.Wrapf(err, "find albums")
}
var mediapaths []string
if len(all_albums) > 1 {
mediapaths = []string{path.Base(mediaPath)}
} else {
mediapaths = []string{}
}
global_scanner_queue.mutex.Lock()
for _, album := range all_albums {
global_scanner_queue.addJob(&ScannerJob{
ctx: scanner_task.NewTaskContext(context.Background(), global_scanner_queue.db, album, mediapaths, album_cache),
})
}
global_scanner_queue.mutex.Unlock()
return nil return nil
} }

View File

@ -39,9 +39,10 @@ type TaskContext struct {
ctx context.Context ctx context.Context
} }
func NewTaskContext(parent context.Context, db *gorm.DB, album *models.Album, cache *scanner_cache.AlbumScannerCache) TaskContext { func NewTaskContext(parent context.Context, db *gorm.DB, album *models.Album, mediapaths []string, cache *scanner_cache.AlbumScannerCache) TaskContext {
ctx := TaskContext{ctx: parent} ctx := TaskContext{ctx: parent}
ctx = ctx.WithValue(taskCtxKeyAlbum, album) ctx = ctx.WithValue(taskCtxKeyAlbum, album)
ctx = ctx.WithValue(taskCtxKeyMediaNames, mediapaths)
ctx = ctx.WithValue(taskCtxKeyAlbumCache, cache) ctx = ctx.WithValue(taskCtxKeyAlbumCache, cache)
ctx = ctx.WithDB(db) ctx = ctx.WithDB(db)
@ -52,6 +53,7 @@ type taskCtxKeyType string
const ( const (
taskCtxKeyAlbum taskCtxKeyType = "task_album" taskCtxKeyAlbum taskCtxKeyType = "task_album"
taskCtxKeyMediaNames taskCtxKeyType = "task_media_names"
taskCtxKeyAlbumCache taskCtxKeyType = "task_album_cache" taskCtxKeyAlbumCache taskCtxKeyType = "task_album_cache"
taskCtxKeyDatabase taskCtxKeyType = "task_database" taskCtxKeyDatabase taskCtxKeyType = "task_database"
) )
@ -60,6 +62,10 @@ func (c TaskContext) GetAlbum() *models.Album {
return c.ctx.Value(taskCtxKeyAlbum).(*models.Album) return c.ctx.Value(taskCtxKeyAlbum).(*models.Album)
} }
func (c TaskContext) GetMediaNames() []string {
return c.ctx.Value(taskCtxKeyMediaNames).([]string)
}
func (c TaskContext) GetCache() *scanner_cache.AlbumScannerCache { func (c TaskContext) GetCache() *scanner_cache.AlbumScannerCache {
return c.ctx.Value(taskCtxKeyAlbumCache).(*scanner_cache.AlbumScannerCache) return c.ctx.Value(taskCtxKeyAlbumCache).(*scanner_cache.AlbumScannerCache)
} }