diff options
| author | Samantaz Fox <coding@samantaz.fr> | 2023-02-02 21:49:09 +0100 |
|---|---|---|
| committer | Samantaz Fox <coding@samantaz.fr> | 2023-02-02 21:49:09 +0100 |
| commit | c7f34042a2a5574bb6a21b318295466a8078029f (patch) | |
| tree | 065f304902a25c68c8211f4aa3269df7e94d2081 /src | |
| parent | 6c687a3cac231473abe050b51dc076f783e2d685 (diff) | |
| parent | caf9520c865133eb669025f9cd64607546e09a89 (diff) | |
| download | invidious-c7f34042a2a5574bb6a21b318295466a8078029f.tar.gz invidious-c7f34042a2a5574bb6a21b318295466a8078029f.tar.bz2 invidious-c7f34042a2a5574bb6a21b318295466a8078029f.zip | |
Video: Add support for the music description section (#3559)
Diffstat (limited to 'src')
| -rw-r--r-- | src/invidious/videos.cr | 6 | ||||
| -rw-r--r-- | src/invidious/videos/music.cr | 12 | ||||
| -rw-r--r-- | src/invidious/videos/parser.cr | 29 | ||||
| -rw-r--r-- | src/invidious/views/watch.ecr | 22 |
4 files changed, 69 insertions, 0 deletions
diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index d626c7d1..436ac82d 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -247,6 +247,12 @@ struct Video info["reason"]?.try &.as_s end + def music : Array(VideoMusic) + info["music"].as_a.map { |music_json| + VideoMusic.new(music_json["album"].as_s, music_json["artist"].as_s, music_json["license"].as_s) + } + end + # Macros defining getters/setters for various types of data private macro getset_string(name) diff --git a/src/invidious/videos/music.cr b/src/invidious/videos/music.cr new file mode 100644 index 00000000..402ae46f --- /dev/null +++ b/src/invidious/videos/music.cr @@ -0,0 +1,12 @@ +require "json" + +struct VideoMusic + include JSON::Serializable + + property album : String + property artist : String + property license : String + + def initialize(@album : String, @artist : String, @license : String) + end +end diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 5c323975..cf43f1be 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -311,6 +311,33 @@ def parse_video_info(video_id : String, player_response : Hash(String, JSON::Any end end + # Music section + + music_list = [] of VideoMusic + music_desclist = player_response.dig?( + "engagementPanels", 1, "engagementPanelSectionListRenderer", + "content", "structuredDescriptionContentRenderer", "items", 2, + "videoDescriptionMusicSectionRenderer", "carouselLockups" + ) + + music_desclist.try &.as_a.each do |music_desc| + artist = nil + album = nil + music_license = nil + + music_desc.dig?("carouselLockupRenderer", "infoRows").try &.as_a.each do |desc| + desc_title = extract_text(desc.dig?("infoRowRenderer", "title")) + if desc_title == "ARTIST" + artist = extract_text(desc.dig?("infoRowRenderer", "defaultMetadata")) + elsif desc_title == "ALBUM" + album = extract_text(desc.dig?("infoRowRenderer", "defaultMetadata")) + elsif desc_title == "LICENSES" + music_license = extract_text(desc.dig?("infoRowRenderer", "expandedMetadata")) + end + end + music_list << VideoMusic.new(album.to_s, artist.to_s, music_license.to_s) + end + # Author infos author = video_details["author"]?.try &.as_s @@ -361,6 +388,8 @@ def parse_video_info(video_id : String, player_response : Hash(String, JSON::Any "genre" => JSON::Any.new(genre.try &.as_s || ""), "genreUcid" => JSON::Any.new(genre_ucid.try &.as_s || ""), "license" => JSON::Any.new(license.try &.as_s || ""), + # Music section + "music" => JSON.parse(music_list.to_json), # Author infos "author" => JSON::Any.new(author || ""), "ucid" => JSON::Any.new(ucid || ""), diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index a6f2e524..666eb3b0 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -235,6 +235,28 @@ we're going to need to do it here in order to allow for translations. <hr> + <% if !video.music.empty? %> + <input id="music-desc-expansion" type="checkbox"/> + <label for="music-desc-expansion"> + <h3 id="music-description-title"> + <%= translate(locale, "Music in this video") %> + <span class="icon ion-ios-arrow-up"></span> + <span class="icon ion-ios-arrow-down"></span> + </h3> + </label> + + <div id="music-description-box"> + <% video.music.each do |music| %> + <div class="music-item"> + <p id="music-artist"><%= translate(locale, "Artist: ") %><%= music.artist %></p> + <p id="music-album"><%= translate(locale, "Album: ") %><%= music.album %></p> + <p id="music-license"><%= translate(locale, "License: ") %><%= music.license %></p> + </div> + <% end %> + </div> + <hr> + + <% end %> <div id="comments"> <% if nojs %> <%= comment_html %> |
