From bcf53ba80353b521d78e032c1b565653f7c15876 Mon Sep 17 00:00:00 2001
From: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com>
Date: Tue, 18 Jul 2023 08:06:50 -0700
Subject: [PATCH] Search: Parse channel handle and hide video count  when
 channel handle exists

Co-Authored-By: Samantaz Fox <coding@samantaz.fr>
---
 src/invidious/helpers/serialized_yt_data.cr |  2 ++
 src/invidious/views/components/item.ecr     |  3 ++-
 src/invidious/yt_backend/extractors.cr      | 10 ++++++----
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/invidious/helpers/serialized_yt_data.cr b/src/invidious/helpers/serialized_yt_data.cr
index 7c12ad0e36..57f4b14741 100644
--- a/src/invidious/helpers/serialized_yt_data.cr
+++ b/src/invidious/helpers/serialized_yt_data.cr
@@ -186,6 +186,7 @@ struct SearchChannel
   property author_thumbnail : String
   property subscriber_count : Int32
   property video_count : Int32
+  property channel_handle : String?
   property description_html : String
   property auto_generated : Bool
   property author_verified : Bool
@@ -214,6 +215,7 @@ struct SearchChannel
       json.field "autoGenerated", self.auto_generated
       json.field "subCount", self.subscriber_count
       json.field "videoCount", self.video_count
+      json.field "channelHandle", self.channel_handle
 
       json.field "description", html_to_content(self.description_html)
       json.field "descriptionHtml", self.description_html
diff --git a/src/invidious/views/components/item.ecr b/src/invidious/views/components/item.ecr
index 7ffd2d937a..6d44a5d5ba 100644
--- a/src/invidious/views/components/item.ecr
+++ b/src/invidious/views/components/item.ecr
@@ -26,8 +26,9 @@
                 </a></div>
             </div>
 
+            <% if !item.channel_handle.nil? %><p class="channel-name" dir="auto"><%= item.channel_handle %></p><% end %>
             <p><%= translate_count(locale, "generic_subscribers_count", item.subscriber_count, NumberFormatting::Separator) %></p>
-            <% if !item.auto_generated %><p><%= translate_count(locale, "generic_videos_count", item.video_count, NumberFormatting::Separator) %></p><% end %>
+            <% if !item.auto_generated && item.channel_handle.nil? %><p><%= translate_count(locale, "generic_videos_count", item.video_count, NumberFormatting::Separator) %></p><% end %>
             <h5><%= item.description_html %></h5>
         <% when SearchPlaylist, InvidiousPlaylist %>
             <%-
diff --git a/src/invidious/yt_backend/extractors.cr b/src/invidious/yt_backend/extractors.cr
index 8cf59d50e9..d28785f1b1 100644
--- a/src/invidious/yt_backend/extractors.cr
+++ b/src/invidious/yt_backend/extractors.cr
@@ -174,17 +174,18 @@ private module Parsers
       # Always simpleText
       # TODO change default value to nil
 
-      subscriber_count = item_contents.dig?("subscriberCountText", "simpleText")
+      subscriber_count = item_contents.dig?("subscriberCountText", "simpleText").try &.as_s
+      channel_handle = subscriber_count if (subscriber_count.try &.starts_with? "@")
 
       # Since youtube added channel handles, `VideoCountText` holds the number of
       # subscribers and `subscriberCountText` holds the handle, except when the
       # channel doesn't have a handle (e.g: some topic music channels).
       # See https://github.com/iv-org/invidious/issues/3394#issuecomment-1321261688
-      if !subscriber_count || !subscriber_count.as_s.includes? " subscriber"
-        subscriber_count = item_contents.dig?("videoCountText", "simpleText")
+      if !subscriber_count || !subscriber_count.includes? " subscriber"
+        subscriber_count = item_contents.dig?("videoCountText", "simpleText").try &.as_s
       end
       subscriber_count = subscriber_count
-        .try { |s| short_text_to_number(s.as_s.split(" ")[0]).to_i32 } || 0
+        .try { |s| short_text_to_number(s.split(" ")[0]).to_i32 } || 0
 
       # Auto-generated channels doesn't have videoCountText
       # Taken from: https://github.com/iv-org/invidious/pull/2228#discussion_r717620922
@@ -199,6 +200,7 @@ private module Parsers
         author_thumbnail: author_thumbnail,
         subscriber_count: subscriber_count,
         video_count:      video_count,
+        channel_handle:   channel_handle,
         description_html: description_html,
         auto_generated:   auto_generated,
         author_verified:  author_verified,