From 00df3e2c4034d99701091c0beefa6133f57b275c Mon Sep 17 00:00:00 2001 From: jonas-w Date: Fri, 4 Feb 2022 19:59:07 +0100 Subject: [PATCH] Refactored code and added badges to Search but many dummies because of the way components/item works --- src/invidious/channels/about.cr | 11 +++-- src/invidious/channels/channels.cr | 3 ++ src/invidious/comments.cr | 6 +-- src/invidious/helpers/serialized_yt_data.cr | 7 ++- src/invidious/mixes.cr | 4 ++ src/invidious/playlists.cr | 6 +++ src/invidious/routes/feeds.cr | 2 + src/invidious/videos.cr | 4 +- src/invidious/views/components/item.ecr | 8 ++-- src/invidious/yt_backend/extractors.cr | 48 +++++++++++++++------ 10 files changed, 69 insertions(+), 30 deletions(-) diff --git a/src/invidious/channels/about.cr b/src/invidious/channels/about.cr index 6114e8af..97b45df5 100644 --- a/src/invidious/channels/about.cr +++ b/src/invidious/channels/about.cr @@ -42,7 +42,7 @@ def get_about_info(ucid, locale) : AboutChannel if !initdata.has_key?("metadata") auto_generated = true end - verified = false + if auto_generated author = initdata["header"]["interactiveTabbedHeaderRenderer"]["title"]["simpleText"].as_s author_url = initdata["microformat"]["microformatDataRenderer"]["urlCanonical"].as_s @@ -71,10 +71,9 @@ def get_about_info(ucid, locale) : AboutChannel # if banner.includes? "channels/c4/default_banner" # banner = nil # end - badges = initdata["header"]["c4TabbedHeaderRenderer"]?.try &.["badges"]? - if !badges.nil? - verified = true - end + author_verified_badges = initdata["header"]?.try &.["c4TabbedHeaderRenderer"]?.try &.["badges"]? + + author_verified = (author_verified_badges && author_verified_badges.size > 0) description = initdata["metadata"]["channelMetadataRenderer"]?.try &.["description"]?.try &.as_s? || "" description_html = HTML.escape(description) @@ -132,7 +131,7 @@ def get_about_info(ucid, locale) : AboutChannel is_family_friendly: is_family_friendly, allowed_regions: allowed_regions, tabs: tabs, - verified: verified, + verified: author_verified || false, ) end diff --git a/src/invidious/channels/channels.cr b/src/invidious/channels/channels.cr index e0459cc3..9e701043 100644 --- a/src/invidious/channels/channels.cr +++ b/src/invidious/channels/channels.cr @@ -21,6 +21,7 @@ struct ChannelVideo property live_now : Bool = false property premiere_timestamp : Time? = nil property views : Int64? = nil + property author_verified : Bool #TODO currently a dummy def to_json(locale, json : JSON::Builder) json.object do @@ -218,6 +219,7 @@ def fetch_channel(ucid, pull_all_videos : Bool) live_now: live_now, premiere_timestamp: premiere_timestamp, views: views, + author_verified: false, #TODO dummy for components/item.ecr }) LOGGER.trace("fetch_channel: #{ucid} : video #{video_id} : Updating or inserting video") @@ -255,6 +257,7 @@ def fetch_channel(ucid, pull_all_videos : Bool) live_now: video.live_now, premiere_timestamp: video.premiere_timestamp, views: video.views, + author_verified: false, #TODO dummy for components/item.ecr }) } videos.each do |video| diff --git a/src/invidious/comments.cr b/src/invidious/comments.cr index 6febbe45..7d52b918 100644 --- a/src/invidious/comments.cr +++ b/src/invidious/comments.cr @@ -144,8 +144,8 @@ def fetch_youtube_comments(id, cursor, format, locale, thin_mode, region, sort_b content_html = node_comment["contentText"]?.try { |t| parse_content(t) } || "" author = node_comment["authorText"]?.try &.["simpleText"]? || "" - verified = node_comment["authorCommentBadge"]? != nil - json.field "verified", verified + verified = (node_comment["authorCommentBadge"]? != nil) + json.field "verified", (verified || false) json.field "author", author json.field "authorThumbnails" do json.array do @@ -329,7 +329,7 @@ def template_youtube_comments(comments, locale, thin_mode, is_replies = false) end author_name = HTML.escape(child["author"].as_s) - if child["verified"].as_bool + if child["verified"]?.try &.as_bool author_name += "" end html << <<-END_HTML diff --git a/src/invidious/helpers/serialized_yt_data.cr b/src/invidious/helpers/serialized_yt_data.cr index bfbc237c..186bca25 100644 --- a/src/invidious/helpers/serialized_yt_data.cr +++ b/src/invidious/helpers/serialized_yt_data.cr @@ -12,6 +12,7 @@ struct SearchVideo property live_now : Bool property premium : Bool property premiere_timestamp : Time? + property author_verified : Bool def to_xml(auto_generated, query_params, xml : XML::Builder) query_params["v"] = self.id @@ -129,6 +130,7 @@ struct SearchPlaylist property video_count : Int32 property videos : Array(SearchPlaylistVideo) property thumbnail : String? + property author_verified : Bool def to_json(locale : String?, json : JSON::Builder) json.object do @@ -140,7 +142,7 @@ struct SearchPlaylist json.field "author", self.author json.field "authorId", self.ucid json.field "authorUrl", "/channel/#{self.ucid}" - + json.field "authorVerified", self.author_verified json.field "videoCount", self.video_count json.field "videos" do json.array do @@ -182,6 +184,7 @@ struct SearchChannel property video_count : Int32 property description_html : String property auto_generated : Bool + property author_verified : Bool def to_json(locale : String?, json : JSON::Builder) json.object do @@ -189,7 +192,7 @@ struct SearchChannel json.field "author", self.author json.field "authorId", self.ucid json.field "authorUrl", "/channel/#{self.ucid}" - + json.field "authorVerified", self.author_verified json.field "authorThumbnails" do json.array do qualities = {32, 48, 76, 100, 176, 512} diff --git a/src/invidious/mixes.cr b/src/invidious/mixes.cr index 3f342b92..b578e3d9 100644 --- a/src/invidious/mixes.cr +++ b/src/invidious/mixes.cr @@ -8,6 +8,10 @@ struct MixVideo property length_seconds : Int32 property index : Int32 property rdid : String + + def author_verified + false #TODO dummy + end end struct Mix diff --git a/src/invidious/playlists.cr b/src/invidious/playlists.cr index 88888a65..a17766e3 100644 --- a/src/invidious/playlists.cr +++ b/src/invidious/playlists.cr @@ -234,6 +234,10 @@ struct InvidiousPlaylist 0_i64 end + def author_verified + false # TODO dummy for components/item.ecr + end + def description_html HTML.escape(self.description) end @@ -252,6 +256,7 @@ def create_playlist(title, privacy, user) updated: Time.utc, privacy: privacy, index: [] of Int64, + author_verified: false, # TODO dummy for components/item.ecr }) Invidious::Database::Playlists.insert(playlist) @@ -270,6 +275,7 @@ def subscribe_playlist(user, playlist) updated: playlist.updated, privacy: PlaylistPrivacy::Private, index: [] of Int64, + author_verified: false, # TODO dummy for components/item.ecr }) Invidious::Database::Playlists.insert(playlist) diff --git a/src/invidious/routes/feeds.cr b/src/invidious/routes/feeds.cr index f7f7b426..6d1f098f 100644 --- a/src/invidious/routes/feeds.cr +++ b/src/invidious/routes/feeds.cr @@ -182,6 +182,7 @@ module Invidious::Routes::Feeds paid: false, premium: false, premiere_timestamp: nil, + author_verified: false, #TODO real value }) end @@ -414,6 +415,7 @@ module Invidious::Routes::Feeds live_now: video.live_now, premiere_timestamp: video.premiere_timestamp, views: video.views, + author_verified: false, #TODO dummy for components/item.ecr }) was_insert = Invidious::Database::ChannelVideos.insert(video, with_premiere_timestamp: true) diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index 69468b5e..c52cbe58 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -1047,7 +1047,9 @@ def extract_video_info(video_id : String, proxy_region : String? = nil, context_ author_info = video_secondary_renderer.try &.dig?("owner", "videoOwnerRenderer") author_thumbnail = author_info.try &.dig?("thumbnail", "thumbnails", 0, "url") - params["authorVerified"] = JSON::Any.new(author_info.try &.["badges"]? != nil) + author_verified_badge = author_info.try &.["badges"]? + + params["authorVerified"] = JSON::Any.new((author_verified_badge && author_verified_badge.size > 0) || false) params["authorThumbnail"] = JSON::Any.new(author_thumbnail.try &.as_s || "") params["subCountText"] = JSON::Any.new(author_info.try &.["subscriberCountText"]? diff --git a/src/invidious/views/components/item.ecr b/src/invidious/views/components/item.ecr index 5a93d802..db003146 100644 --- a/src/invidious/views/components/item.ecr +++ b/src/invidious/views/components/item.ecr @@ -8,7 +8,7 @@ "/> <% end %> -

<%= HTML.escape(item.author) %>

+

<%= HTML.escape(item.author) %><% if !item.author_verified.nil? && item.author_verified %><% end %>

<%= translate_count(locale, "generic_subscribers_count", item.subscriber_count, NumberFormatting::Separator) %>

<% if !item.auto_generated %>

<%= translate_count(locale, "generic_videos_count", item.video_count, NumberFormatting::Separator) %>

<% end %> @@ -30,7 +30,7 @@

<%= HTML.escape(item.title) %>

-

<%= HTML.escape(item.author) %>

+

<%= HTML.escape(item.author) %><% if !item.author_verified.nil? && item.author_verified %><% end %>

<% when MixVideo %> @@ -45,7 +45,7 @@

<%= HTML.escape(item.title) %>

-

<%= HTML.escape(item.author) %>

+

<%= HTML.escape(item.author) %><% if !item.author_verified.nil? && item.author_verified %><% end %>

<% when PlaylistVideo %> @@ -142,7 +142,7 @@
<% endpoint_params = "?v=#{item.id}" %> diff --git a/src/invidious/yt_backend/extractors.cr b/src/invidious/yt_backend/extractors.cr index 41d95962..28e920fa 100644 --- a/src/invidious/yt_backend/extractors.cr +++ b/src/invidious/yt_backend/extractors.cr @@ -102,7 +102,11 @@ private module Parsers premium = false premiere_timestamp = item_contents.dig?("upcomingEventData", "startTime").try { |t| Time.unix(t.as_s.to_i64) } + author_verified_badge = item_contents["ownerBadges"]?.try do |badges_array| + badges_array.as_a.find(&.dig("metadataBadgeRenderer", "tooltip").as_s.== "Verified") + end + author_verified = (author_verified_badge && author_verified_badge.size > 0) item_contents["badges"]?.try &.as_a.each do |badge| b = badge["metadataBadgeRenderer"] case b["label"].as_s @@ -129,6 +133,7 @@ private module Parsers live_now: live_now, premium: premium, premiere_timestamp: premiere_timestamp, + author_verified: author_verified || false, }) end @@ -156,7 +161,11 @@ private module Parsers private def self.parse(item_contents, author_fallback) author = extract_text(item_contents["title"]) || author_fallback.name author_id = item_contents["channelId"]?.try &.as_s || author_fallback.id + author_verified_badge = item_contents["ownerBadges"]?.try do |badges_array| + badges_array.as_a.find(&.dig("metadataBadgeRenderer", "tooltip").as_s.== "Verified") + end + author_verified = (author_verified_badge && author_verified_badge.size > 0) author_thumbnail = HelperExtractors.get_thumbnails(item_contents) # When public subscriber count is disabled, the subscriberCountText isn't sent by InnerTube. # Always simpleText @@ -179,6 +188,7 @@ private module Parsers video_count: video_count, description_html: description_html, auto_generated: auto_generated, + author_verified: author_verified || false, }) end @@ -206,18 +216,23 @@ private module Parsers private def self.parse(item_contents, author_fallback) title = extract_text(item_contents["title"]) || "" plid = item_contents["playlistId"]?.try &.as_s || "" + author_verified_badge = item_contents["ownerBadges"]?.try do |badges_array| + badges_array.as_a.find(&.dig("metadataBadgeRenderer", "tooltip").as_s.== "Verified") + end + author_verified = (author_verified_badge && author_verified_badge.size > 0) video_count = HelperExtractors.get_video_count(item_contents) playlist_thumbnail = HelperExtractors.get_thumbnails(item_contents) SearchPlaylist.new({ - title: title, - id: plid, - author: author_fallback.name, - ucid: author_fallback.id, - video_count: video_count, - videos: [] of SearchPlaylistVideo, - thumbnail: playlist_thumbnail, + title: title, + id: plid, + author: author_fallback.name, + ucid: author_fallback.id, + video_count: video_count, + videos: [] of SearchPlaylistVideo, + thumbnail: playlist_thumbnail, + author_verified: author_verified || false, }) end @@ -251,7 +266,11 @@ private module Parsers author_info = item_contents.dig?("shortBylineText", "runs", 0) author = author_info.try &.["text"].as_s || author_fallback.name author_id = author_info.try { |x| HelperExtractors.get_browse_id(x) } || author_fallback.id + author_verified_badge = item_contents["ownerBadges"]?.try do |badges_array| + badges_array.as_a.find(&.dig("metadataBadgeRenderer", "tooltip").as_s.== "Verified") + end + author_verified = (author_verified_badge && author_verified_badge.size > 0) videos = item_contents["videos"]?.try &.as_a.map do |v| v = v["childVideoRenderer"] v_title = v.dig?("title", "simpleText").try &.as_s || "" @@ -267,13 +286,14 @@ private module Parsers # TODO: item_contents["publishedTimeText"]? SearchPlaylist.new({ - title: title, - id: plid, - author: author, - ucid: author_id, - video_count: video_count, - videos: videos, - thumbnail: playlist_thumbnail, + title: title, + id: plid, + author: author, + ucid: author_id, + video_count: video_count, + videos: videos, + thumbnail: playlist_thumbnail, + author_verified: author_verified || false, }) end