From b1bc006a0ce581b7d6460b5639c7240ccb9d7c28 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Fri, 13 Apr 2018 13:09:46 +0200 Subject: [PATCH] New filters for soundtrack editors --- pages/editor/editor.pixy | 7 +++ .../editor/filteranime/filteranime.pixy | 0 pages/editor/filtersoundtracks/file.go | 18 +++++++ .../filtersoundtracks/filtersoundtracks.go | 33 ------------ .../filtersoundtracks/filtersoundtracks.pixy | 17 +++--- pages/editor/filtersoundtracks/links.go | 28 ++++++++++ pages/editor/filtersoundtracks/lyrics.go | 20 +++++++ pages/editor/filtersoundtracks/tags.go | 18 +++++++ pages/editor/filtersoundtracks/utils.go | 54 +++++++++++++++++++ pages/index.go | 5 +- 10 files changed, 159 insertions(+), 41 deletions(-) rename mixins/AnimeEditorList.pixy => pages/editor/filteranime/filteranime.pixy (100%) create mode 100644 pages/editor/filtersoundtracks/file.go delete mode 100644 pages/editor/filtersoundtracks/filtersoundtracks.go create mode 100644 pages/editor/filtersoundtracks/links.go create mode 100644 pages/editor/filtersoundtracks/lyrics.go create mode 100644 pages/editor/filtersoundtracks/tags.go create mode 100644 pages/editor/filtersoundtracks/utils.go diff --git a/pages/editor/editor.pixy b/pages/editor/editor.pixy index 4a44095d..80a9f3a6 100644 --- a/pages/editor/editor.pixy +++ b/pages/editor/editor.pixy @@ -78,4 +78,11 @@ component EditorTabs(url string, user *arn.User) .corner-buttons.fixed #filter-root(data-url=url) ExploreFilters(user.Settings().Editor.Filter.Year, user.Settings().Editor.Filter.Status, user.Settings().Editor.Filter.Type, true) + + if strings.Contains(url, "/editor/soundtracks/") + .tabs + Tab("Links", "external-link", "/editor/soundtracks/links") + Tab("Lyrics", "font", "/editor/soundtracks/lyrics") + Tab("Tags", "tag", "/editor/soundtracks/tags") + Tab("File", "volume-off", "/editor/soundtracks/file") \ No newline at end of file diff --git a/mixins/AnimeEditorList.pixy b/pages/editor/filteranime/filteranime.pixy similarity index 100% rename from mixins/AnimeEditorList.pixy rename to pages/editor/filteranime/filteranime.pixy diff --git a/pages/editor/filtersoundtracks/file.go b/pages/editor/filtersoundtracks/file.go new file mode 100644 index 00000000..078726de --- /dev/null +++ b/pages/editor/filtersoundtracks/file.go @@ -0,0 +1,18 @@ +package filtersoundtracks + +import ( + "github.com/aerogo/aero" + "github.com/animenotifier/arn" +) + +// File shows soundtracks without an audio file. +func File(ctx *aero.Context) string { + return editorList( + ctx, + "Soundtracks without an audio file", + func(track *arn.SoundTrack) bool { + return track.File == "" + }, + nil, + ) +} diff --git a/pages/editor/filtersoundtracks/filtersoundtracks.go b/pages/editor/filtersoundtracks/filtersoundtracks.go deleted file mode 100644 index 307cfc4b..00000000 --- a/pages/editor/filtersoundtracks/filtersoundtracks.go +++ /dev/null @@ -1,33 +0,0 @@ -package filtersoundtracks - -import ( - "github.com/aerogo/aero" - "github.com/animenotifier/arn" - "github.com/animenotifier/notify.moe/components" - "github.com/animenotifier/notify.moe/utils" -) - -const maxEntries = 70 - -// NoLinks ... -func NoLinks(ctx *aero.Context) string { - user := utils.GetUser(ctx) - - if user == nil || (user.Role != "admin" && user.Role != "editor") { - return ctx.Redirect("/") - } - - soundTracks := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool { - return !track.IsDraft && len(track.Links) == 0 - }) - - arn.SortSoundTracksPopularFirst(soundTracks) - - count := len(soundTracks) - - if count > maxEntries { - soundTracks = soundTracks[:maxEntries] - } - - return ctx.HTML(components.SoundTracksEditorList(soundTracks, count, ctx.URI(), user)) -} diff --git a/pages/editor/filtersoundtracks/filtersoundtracks.pixy b/pages/editor/filtersoundtracks/filtersoundtracks.pixy index e91df0fa..a484fa30 100644 --- a/pages/editor/filtersoundtracks/filtersoundtracks.pixy +++ b/pages/editor/filtersoundtracks/filtersoundtracks.pixy @@ -1,8 +1,10 @@ -component SoundTracksEditorList(tracks []*arn.SoundTrack, count int, url string, user *arn.User) - EditorTabs(url, user) - h1.editor-list-page-title.mountable Soundtracks without links +component SoundTracksEditorListFull(title string, missing []*arn.SoundTrack, count int, pageURI string, generateSearchLink func(*arn.SoundTrack) string, user *arn.User) + EditorTabs(pageURI, user) + h1.editor-list-page-title.mountable= title .footer.editor-list-entry-count.mountable= strconv.Itoa(count) + " soundtracks" + SoundTracksEditorList(missing, generateSearchLink, user) +component SoundTracksEditorList(tracks []*arn.SoundTrack, generateSearchLink func(*arn.SoundTrack) string, user *arn.User) table.editor-list thead tr.mountable @@ -14,7 +16,8 @@ component SoundTracksEditorList(tracks []*arn.SoundTrack, count int, url string, td= len(track.Likes) td a(href=track.Link(), target="_blank", rel="noopener")= track.Title.ByUser(user) - td - each media in track.Media - if media.Service == "Youtube" - a(href="https://song.link/https://youtu.be/" + media.ServiceID, target="_blank", rel="noopener") 🔍 \ No newline at end of file + + if generateSearchLink != nil + td + if generateSearchLink(track) != "" + a(href=generateSearchLink(track), target="_blank", rel="noopener") 🔍 diff --git a/pages/editor/filtersoundtracks/links.go b/pages/editor/filtersoundtracks/links.go new file mode 100644 index 00000000..2ef307fb --- /dev/null +++ b/pages/editor/filtersoundtracks/links.go @@ -0,0 +1,28 @@ +package filtersoundtracks + +import ( + "github.com/aerogo/aero" + "github.com/animenotifier/arn" +) + +const maxEntries = 70 + +// Links shows soundtracks without links. +func Links(ctx *aero.Context) string { + return editorList( + ctx, + "Soundtracks without links", + func(track *arn.SoundTrack) bool { + return len(track.Links) == 0 + }, + func(track *arn.SoundTrack) string { + youtubeMedia := track.MediaByService("Youtube") + + if len(youtubeMedia) > 0 { + return "https://song.link/https://youtu.be/" + youtubeMedia[0].ServiceID + } + + return "" + }, + ) +} diff --git a/pages/editor/filtersoundtracks/lyrics.go b/pages/editor/filtersoundtracks/lyrics.go new file mode 100644 index 00000000..89a8e0c9 --- /dev/null +++ b/pages/editor/filtersoundtracks/lyrics.go @@ -0,0 +1,20 @@ +package filtersoundtracks + +import ( + "github.com/aerogo/aero" + "github.com/animenotifier/arn" +) + +// Lyrics shows soundtracks without lyrics. +func Lyrics(ctx *aero.Context) string { + return editorList( + ctx, + "Soundtracks without lyrics", + func(track *arn.SoundTrack) bool { + return !track.HasLyrics() + }, + func(track *arn.SoundTrack) string { + return "https://www.google.com/search?q=" + track.Title.String() + " lyrics site:animelyrics.com" + }, + ) +} diff --git a/pages/editor/filtersoundtracks/tags.go b/pages/editor/filtersoundtracks/tags.go new file mode 100644 index 00000000..b00d6f90 --- /dev/null +++ b/pages/editor/filtersoundtracks/tags.go @@ -0,0 +1,18 @@ +package filtersoundtracks + +import ( + "github.com/aerogo/aero" + "github.com/animenotifier/arn" +) + +// Tags shows soundtracks with less than 3 tags. +func Tags(ctx *aero.Context) string { + return editorList( + ctx, + "Soundtracks with less than 3 tags", + func(track *arn.SoundTrack) bool { + return len(track.Tags) < 3 + }, + nil, + ) +} diff --git a/pages/editor/filtersoundtracks/utils.go b/pages/editor/filtersoundtracks/utils.go new file mode 100644 index 00000000..ab34ac07 --- /dev/null +++ b/pages/editor/filtersoundtracks/utils.go @@ -0,0 +1,54 @@ +package filtersoundtracks + +import ( + "net/http" + "strings" + + "github.com/aerogo/aero" + "github.com/animenotifier/arn" + "github.com/animenotifier/notify.moe/components" + "github.com/animenotifier/notify.moe/utils" +) + +const maxSoundTrackEntries = 70 + +// editorList renders the soundtrack list with the given title and filter. +func editorList(ctx *aero.Context, title string, filter func(*arn.SoundTrack) bool, searchLink func(*arn.SoundTrack) string) string { + user := utils.GetUser(ctx) + + if user == nil || (user.Role != "admin" && user.Role != "editor") { + return ctx.Error(http.StatusUnauthorized, "Not authorized", nil) + } + + tracks, count := filterSoundTracks(ctx, user, filter) + url := strings.TrimPrefix(ctx.URI(), "/_") + + return ctx.HTML(components.SoundTracksEditorListFull( + title, + tracks, + count, + url, + searchLink, + user, + )) +} + +// filterSoundTracks filters soundtracks by the given filter function. +func filterSoundTracks(ctx *aero.Context, user *arn.User, filter func(*arn.SoundTrack) bool) ([]*arn.SoundTrack, int) { + // Filter + tracks := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool { + return !track.IsDraft && filter(track) + }) + + // Sort + arn.SortSoundTracksPopularFirst(tracks) + + // Limit + count := len(tracks) + + if count > maxSoundTrackEntries { + tracks = tracks[:maxSoundTrackEntries] + } + + return tracks, count +} diff --git a/pages/index.go b/pages/index.go index 2f2b0617..f491f260 100644 --- a/pages/index.go +++ b/pages/index.go @@ -305,7 +305,10 @@ func Configure(app *aero.Application) { l.Page("/editor/companies/description", filtercompanies.NoDescription) // Editor - Soundtracks - l.Page("/editor/soundtracks/links", filtersoundtracks.NoLinks) + l.Page("/editor/soundtracks/links", filtersoundtracks.Links) + l.Page("/editor/soundtracks/lyrics", filtersoundtracks.Lyrics) + l.Page("/editor/soundtracks/tags", filtersoundtracks.Tags) + l.Page("/editor/soundtracks/file", filtersoundtracks.File) // Log l.Page("/log", editlog.Get)