From 4ad2a485413b421b73db9456f1ef3078342efb4b Mon Sep 17 00:00:00 2001 From: Bogdan Brinza Date: Tue, 17 Dec 2024 13:34:43 -0800 Subject: [PATCH] Adding dehydrate-posters cmd --- cli-commands.txt | 3 ++ cli/dehydrate_posters.go | 90 ++++++++++++++++++++++++++++++++++++++++ cli/sync.go | 4 ++ data/properties.go | 5 +++ go.mod | 6 ++- main.go | 1 + yeti/get_thumbnail.go | 1 - 7 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 cli/dehydrate_posters.go delete mode 100644 yeti/get_thumbnail.go diff --git a/cli-commands.txt b/cli-commands.txt index 4f195c3..626826f 100644 --- a/cli-commands.txt +++ b/cli-commands.txt @@ -35,6 +35,9 @@ backup cleanup-ended-videos now +dehydrate-posters + force + download-video video-id^*& mark-watched diff --git a/cli/dehydrate_posters.go b/cli/dehydrate_posters.go new file mode 100644 index 0000000..d2c2770 --- /dev/null +++ b/cli/dehydrate_posters.go @@ -0,0 +1,90 @@ +package cli + +import ( + "errors" + "github.com/boggydigital/issa" + "github.com/boggydigital/kevlar" + "github.com/boggydigital/nod" + "github.com/boggydigital/pathways" + "github.com/boggydigital/yet/data" + "github.com/boggydigital/yet_urls/youtube_urls" + "net/url" + "os" +) + +func DehydratePostersHandler(u *url.URL) error { + force := u.Query().Has("force") + return DehydratePosters(force) +} + +func DehydratePosters(force bool) error { + + dpa := nod.NewProgress("dehydrating posters...") + defer dpa.EndWithResult("done") + + metadataDir, err := pathways.GetAbsDir(data.Metadata) + if err != nil { + return dpa.EndWithError(err) + } + + rdx, err := kevlar.NewReduxWriter(metadataDir, data.VideoProperties()...) + if err != nil { + return dpa.EndWithError(err) + } + + videoIds := rdx.Keys(data.VideoTitleProperty) + dpa.TotalInt(len(videoIds)) + + dehydratedPosters := make(map[string][]string) + dehydratedRepColors := make(map[string][]string) + + for _, videoId := range videoIds { + + if rdx.HasKey(data.VideoDehydratedThumbnailProperty, videoId) && !force { + dpa.Increment() + continue + } + + if dp, rc, err := dehydratePosterImageRepColor(videoId); err == nil { + dehydratedPosters[videoId] = append(dehydratedPosters[videoId], dp) + dehydratedRepColors[videoId] = append(dehydratedRepColors[videoId], rc) + } else { + dpa.Error(err) + } + + dpa.Increment() + } + + if err := rdx.BatchReplaceValues(data.VideoDehydratedThumbnailProperty, dehydratedPosters); err != nil { + return dpa.EndWithError(err) + } + + if err := rdx.BatchReplaceValues(data.VideoDehydratedRepColorProperty, dehydratedRepColors); err != nil { + return dpa.EndWithError(err) + } + + return nil +} + +func dehydratePosterImageRepColor(videoId string) (string, string, error) { + + var absPosterPath string + var err error + + // find the first existing poster (if any if available at all) + for _, q := range youtube_urls.AllThumbnailQualities() { + absPosterPath, err = data.AbsPosterPath(videoId, q) + if err != nil { + return "", "", err + } + if _, err := os.Stat(absPosterPath); err == nil { + break + } + } + + if absPosterPath == "" { + return "", "", errors.New("video has no poster thumbnails: " + videoId) + } + + return issa.DehydrateImageRepColor(absPosterPath) +} diff --git a/cli/sync.go b/cli/sync.go index eb33245..a75bd4d 100644 --- a/cli/sync.go +++ b/cli/sync.go @@ -53,6 +53,10 @@ func Sync(rdx kevlar.WriteableRedux, opt *VideoOptions) error { return sa.EndWithError(err) } + if err := DehydratePosters(false); err != nil { + return sa.EndWithError(err) + } + if err := ScrubEndedProperties(rdx); err != nil { return sa.EndWithError(err) } diff --git a/data/properties.go b/data/properties.go index 4f072f9..0f96221 100644 --- a/data/properties.go +++ b/data/properties.go @@ -20,6 +20,9 @@ const ( VideoErrorsProperty = "video-errors" VideoFavoriteProperty = "video-favorite" + VideoDehydratedThumbnailProperty = "video-dehydrated-thumbnail" + VideoDehydratedRepColorProperty = "video-dehydrate-rep-color" + VideoForcedDownloadProperty = "video-forced-download" VideoDownloadQueuedProperty = "video-download-queued" @@ -57,6 +60,8 @@ func VideoProperties() []string { return []string{ VideoTitleProperty, VideoThumbnailUrlsProperty, + VideoDehydratedThumbnailProperty, + VideoDehydratedRepColorProperty, VideoExternalChannelIdProperty, VideoShortDescriptionProperty, VideoViewCountProperty, diff --git a/go.mod b/go.mod index 13785fd..bc57be4 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/boggydigital/yet go 1.23.4 require ( + github.com/arelate/southern_light v0.1.52 github.com/boggydigital/backups v0.1.5 github.com/boggydigital/busan v0.1.0 github.com/boggydigital/clo v1.0.5 @@ -12,12 +13,13 @@ require ( github.com/boggydigital/nod v0.1.21 github.com/boggydigital/pathways v0.1.14 github.com/boggydigital/yet_urls v0.1.54 - golang.org/x/exp v0.0.0-20241204233417-43b7b7cde48d + golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 ) require ( - github.com/arelate/southern_light v0.1.52 // indirect + github.com/boggydigital/issa v0.1.20 // indirect github.com/boggydigital/match_node v0.1.17 // indirect github.com/boggydigital/wits v0.2.3 // indirect + golang.org/x/image v0.23.0 // indirect golang.org/x/net v0.32.0 // indirect ) diff --git a/main.go b/main.go index 7356293..99320ac 100644 --- a/main.go +++ b/main.go @@ -52,6 +52,7 @@ func main() { "add-video": cli.AddVideoHandler, "backup": cli.BackupHandler, "cleanup-ended-videos": cli.CleanupEndedVideosHandler, + "dehydrate-posters": cli.DehydratePostersHandler, "download-video": cli.DownloadVideoHandler, "get-captions": cli.GetCaptionsHandler, "get-channels-metadata": cli.GetChannelsMetadataHandler, diff --git a/yeti/get_thumbnail.go b/yeti/get_thumbnail.go deleted file mode 100644 index d91e293..0000000 --- a/yeti/get_thumbnail.go +++ /dev/null @@ -1 +0,0 @@ -package yeti