diff --git a/internal/manager/task_scan.go b/internal/manager/task_scan.go index 5273b5636..5a2a07653 100644 --- a/internal/manager/task_scan.go +++ b/internal/manager/task_scan.go @@ -103,14 +103,21 @@ type galleryFinder interface { FindByFolderID(ctx context.Context, folderID file.FolderID) ([]*models.Gallery, error) } +type sceneFinder interface { + fileCounter + FindByPrimaryFileID(ctx context.Context, fileID file.ID) ([]*models.Scene, error) +} + // handlerRequiredFilter returns true if a File's handler needs to be executed despite the file not being updated. type handlerRequiredFilter struct { extensionConfig - SceneFinder fileCounter + SceneFinder sceneFinder ImageFinder fileCounter GalleryFinder galleryFinder FolderCache *lru.LRU + + videoFileNamingAlgorithm models.HashAlgorithm } func newHandlerRequiredFilter(c *config.Instance) *handlerRequiredFilter { @@ -118,11 +125,12 @@ func newHandlerRequiredFilter(c *config.Instance) *handlerRequiredFilter { processes := c.GetParallelTasksWithAutoDetection() return &handlerRequiredFilter{ - extensionConfig: newExtensionConfig(c), - SceneFinder: db.Scene, - ImageFinder: db.Image, - GalleryFinder: db.Gallery, - FolderCache: lru.New(processes * 2), + extensionConfig: newExtensionConfig(c), + SceneFinder: db.Scene, + ImageFinder: db.Image, + GalleryFinder: db.Gallery, + FolderCache: lru.New(processes * 2), + videoFileNamingAlgorithm: c.GetVideoFileNamingAlgorithm(), } } @@ -180,6 +188,25 @@ func (f *handlerRequiredFilter) Accept(ctx context.Context, ff file.File) bool { } } + if isVideoFile { + // check if the screenshot file exists + hash := scene.GetHash(ff, f.videoFileNamingAlgorithm) + ssPath := instance.Paths.Scene.GetScreenshotPath(hash) + if exists, _ := fsutil.FileExists(ssPath); !exists { + // if not, check if the file is a primary file for a scene + scenes, err := f.SceneFinder.FindByPrimaryFileID(ctx, ff.Base().ID) + if err != nil { + // just ignore + return false + } + + if len(scenes) > 0 { + // if it is, then it needs to be re-generated + return true + } + } + } + return false } diff --git a/pkg/sqlite/scene.go b/pkg/sqlite/scene.go index 898be20b4..a61f0cbb4 100644 --- a/pkg/sqlite/scene.go +++ b/pkg/sqlite/scene.go @@ -489,6 +489,20 @@ func (qb *SceneStore) FindByFileID(ctx context.Context, fileID file.ID) ([]*mode return ret, nil } +func (qb *SceneStore) FindByPrimaryFileID(ctx context.Context, fileID file.ID) ([]*models.Scene, error) { + sq := dialect.From(scenesFilesJoinTable).Select(scenesFilesJoinTable.Col(sceneIDColumn)).Where( + scenesFilesJoinTable.Col(fileIDColumn).Eq(fileID), + scenesFilesJoinTable.Col("primary").Eq(1), + ) + + ret, err := qb.findBySubquery(ctx, sq) + if err != nil { + return nil, fmt.Errorf("getting scenes by primary file id %d: %w", fileID, err) + } + + return ret, nil +} + func (qb *SceneStore) CountByFileID(ctx context.Context, fileID file.ID) (int, error) { joinTable := scenesFilesJoinTable diff --git a/ui/v2.5/src/docs/en/Changelog/v0170.md b/ui/v2.5/src/docs/en/Changelog/v0170.md index 48f6cf876..57bed7487 100644 --- a/ui/v2.5/src/docs/en/Changelog/v0170.md +++ b/ui/v2.5/src/docs/en/Changelog/v0170.md @@ -1,7 +1,6 @@ After migrating, please run a scan on your entire library to populate missing data, and to ingest identical files which were previously ignored. ### 💥 Known issues and other changes -* Missing covers are not currently regenerated. * Import/export schema has changed and is incompatible with the previous version. ### ✨ New Features diff --git a/ui/v2.5/src/docs/en/ReleaseNotes/v0170.md b/ui/v2.5/src/docs/en/ReleaseNotes/v0170.md index 773f94da4..68dd42573 100644 --- a/ui/v2.5/src/docs/en/ReleaseNotes/v0170.md +++ b/ui/v2.5/src/docs/en/ReleaseNotes/v0170.md @@ -1,8 +1,5 @@ After migrating, please run a scan on your entire library to populate missing data, and to ingest identical files which were previously ignored. -### 💥 Known issues -* Missing covers are not currently regenerated. Need to consider further, especially around scene cover redesign. - ### Other changes: * Import/export schema has changed and is incompatible with the previous version. * Changelog has been moved from the stats page to a section in the Settings page.