From 83e441650bc6cb8c3cdcd9d75e0d2bb33de6d5b7 Mon Sep 17 00:00:00 2001 From: Kostiantyn <32730812+kkovaletp@users.noreply.github.com> Date: Tue, 8 Oct 2024 21:58:17 +0300 Subject: [PATCH] Split long functions and optimize code (#1082) Co-authored-by: Konstantin Koval --- .../cleanup_tasks/media_cleanup_task.go | 3 +- .../scanner_tasks/face_detection_task.go | 4 ++- .../scanner_tasks/notification_task.go | 8 +++-- api/scanner/scanner_tasks/scanner_tasks.go | 20 +++++++++---- .../scanner_tasks/video_metadata_task.go | 30 +++++++++++-------- 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/api/scanner/scanner_tasks/cleanup_tasks/media_cleanup_task.go b/api/scanner/scanner_tasks/cleanup_tasks/media_cleanup_task.go index f7d6d3ec..84177adf 100644 --- a/api/scanner/scanner_tasks/cleanup_tasks/media_cleanup_task.go +++ b/api/scanner/scanner_tasks/cleanup_tasks/media_cleanup_task.go @@ -10,7 +10,8 @@ type MediaCleanupTask struct { scanner_task.ScannerTaskBase } -func (t MediaCleanupTask) AfterScanAlbum(ctx scanner_task.TaskContext, changedMedia []*models.Media, albumMedia []*models.Media) error { +func (t MediaCleanupTask) AfterScanAlbum(ctx scanner_task.TaskContext, changedMedia []*models.Media, + albumMedia []*models.Media) error { cleanupErrors := CleanupMedia(ctx.GetDB(), ctx.GetAlbum().ID, albumMedia) for _, err := range cleanupErrors { diff --git a/api/scanner/scanner_tasks/face_detection_task.go b/api/scanner/scanner_tasks/face_detection_task.go index 34200898..b24c8625 100644 --- a/api/scanner/scanner_tasks/face_detection_task.go +++ b/api/scanner/scanner_tasks/face_detection_task.go @@ -12,7 +12,9 @@ type FaceDetectionTask struct { scanner_task.ScannerTaskBase } -func (t FaceDetectionTask) AfterProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData, updatedURLs []*models.MediaURL, mediaIndex int, mediaTotal int) error { +func (t FaceDetectionTask) AfterProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData, + updatedURLs []*models.MediaURL, mediaIndex int, mediaTotal int) error { + didProcess := len(updatedURLs) > 0 if didProcess && mediaData.Media.Type == models.MediaTypePhoto { diff --git a/api/scanner/scanner_tasks/notification_task.go b/api/scanner/scanner_tasks/notification_task.go index 7260667a..da0fb6a3 100644 --- a/api/scanner/scanner_tasks/notification_task.go +++ b/api/scanner/scanner_tasks/notification_task.go @@ -42,7 +42,9 @@ func (t NotificationTask) AfterMediaFound(ctx scanner_task.TaskContext, media *m return nil } -func (t NotificationTask) AfterProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData, updatedURLs []*models.MediaURL, mediaIndex int, mediaTotal int) error { +func (t NotificationTask) AfterProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData, + updatedURLs []*models.MediaURL, mediaIndex int, mediaTotal int) error { + if len(updatedURLs) > 0 { progress := float64(mediaIndex) / float64(mediaTotal) * 100.0 notification.BroadcastNotification(&models.Notification{ @@ -57,7 +59,9 @@ func (t NotificationTask) AfterProcessMedia(ctx scanner_task.TaskContext, mediaD return nil } -func (t NotificationTask) AfterScanAlbum(ctx scanner_task.TaskContext, changedMedia []*models.Media, albumMedia []*models.Media) error { +func (t NotificationTask) AfterScanAlbum(ctx scanner_task.TaskContext, changedMedia []*models.Media, + albumMedia []*models.Media) error { + if len(changedMedia) > 0 { timeoutDelay := 2000 notification.BroadcastNotification(&models.Notification{ diff --git a/api/scanner/scanner_tasks/scanner_tasks.go b/api/scanner/scanner_tasks/scanner_tasks.go index 4e671984..a90c93fa 100644 --- a/api/scanner/scanner_tasks/scanner_tasks.go +++ b/api/scanner/scanner_tasks/scanner_tasks.go @@ -29,7 +29,9 @@ type scannerTasks struct { var Tasks scannerTasks = scannerTasks{} -func simpleCombinedTasks(ctx scanner_task.TaskContext, doTask func(ctx scanner_task.TaskContext, task scanner_task.ScannerTask) error) error { +func simpleCombinedTasks(ctx scanner_task.TaskContext, doTask func(ctx scanner_task.TaskContext, + task scanner_task.ScannerTask) error) error { + for _, task := range allTasks { select { case <-ctx.Done(): @@ -85,7 +87,9 @@ func (t scannerTasks) MediaFound(ctx scanner_task.TaskContext, fileInfo fs.FileI return false, nil } -func (t scannerTasks) AfterScanAlbum(ctx scanner_task.TaskContext, changedMedia []*models.Media, albumMedia []*models.Media) error { +func (t scannerTasks) AfterScanAlbum(ctx scanner_task.TaskContext, changedMedia []*models.Media, + albumMedia []*models.Media) error { + return simpleCombinedTasks(ctx, func(ctx scanner_task.TaskContext, task scanner_task.ScannerTask) error { return task.AfterScanAlbum(ctx, changedMedia, albumMedia) }) @@ -97,7 +101,9 @@ func (t scannerTasks) AfterMediaFound(ctx scanner_task.TaskContext, media *model }) } -func (t scannerTasks) BeforeProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData) (scanner_task.TaskContext, error) { +func (t scannerTasks) BeforeProcessMedia(ctx scanner_task.TaskContext, + mediaData *media_encoding.EncodeMediaData) (scanner_task.TaskContext, error) { + for _, task := range allTasks { select { case <-ctx.Done(): @@ -115,7 +121,9 @@ func (t scannerTasks) BeforeProcessMedia(ctx scanner_task.TaskContext, mediaData return ctx, nil } -func (t scannerTasks) ProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData, mediaCachePath string) ([]*models.MediaURL, error) { +func (t scannerTasks) ProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData, + mediaCachePath string) ([]*models.MediaURL, error) { + allNewMedia := make([]*models.MediaURL, 0) for _, task := range allTasks { @@ -136,7 +144,9 @@ func (t scannerTasks) ProcessMedia(ctx scanner_task.TaskContext, mediaData *medi return allNewMedia, nil } -func (t scannerTasks) AfterProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData, updatedURLs []*models.MediaURL, mediaIndex int, mediaTotal int) error { +func (t scannerTasks) AfterProcessMedia(ctx scanner_task.TaskContext, mediaData *media_encoding.EncodeMediaData, + updatedURLs []*models.MediaURL, mediaIndex int, mediaTotal int) error { + return simpleCombinedTasks(ctx, func(ctx scanner_task.TaskContext, task scanner_task.ScannerTask) error { return task.AfterProcessMedia(ctx, mediaData, updatedURLs, mediaIndex, mediaTotal) }) diff --git a/api/scanner/scanner_tasks/video_metadata_task.go b/api/scanner/scanner_tasks/video_metadata_task.go index e67d6eb9..9665328d 100644 --- a/api/scanner/scanner_tasks/video_metadata_task.go +++ b/api/scanner/scanner_tasks/video_metadata_task.go @@ -10,6 +10,7 @@ import ( "github.com/photoview/photoview/api/scanner/scanner_task" "github.com/photoview/photoview/api/scanner/scanner_tasks/processing_tasks" "github.com/pkg/errors" + "gopkg.in/vansante/go-ffprobe.v2" "gorm.io/gorm" ) @@ -60,18 +61,7 @@ func ScanVideoMetadata(tx *gorm.DB, video *models.Media) error { } } - var framerate *float64 = nil - if stream.AvgFrameRate != "" { - parts := strings.Split(stream.AvgFrameRate, "/") - if len(parts) == 2 { - if numerator, err := strconv.ParseInt(parts[0], 10, 64); err == nil { - if denominator, err := strconv.ParseInt(parts[1], 10, 64); err == nil { - result := float64(numerator) / float64(denominator) - framerate = &result - } - } - } - } + framerate := getFrameRate(stream) videoMetadata := models.VideoMetadata{ Width: stream.Width, @@ -92,3 +82,19 @@ func ScanVideoMetadata(tx *gorm.DB, video *models.Media) error { return nil } + +func getFrameRate(stream *ffprobe.Stream) *float64 { + var framerate *float64 = nil + if stream.AvgFrameRate != "" { + parts := strings.Split(stream.AvgFrameRate, "/") + if len(parts) == 2 { + if numerator, err := strconv.ParseInt(parts[0], 10, 64); err == nil { + if denominator, err := strconv.ParseInt(parts[1], 10, 64); err == nil { + result := float64(numerator) / float64(denominator) + framerate = &result + } + } + } + } + return framerate +}