diff --git a/src/invidious/channels/about.cr b/src/invidious/channels/about.cr
index d48fd1fb9..da71e9a8c 100644
--- a/src/invidious/channels/about.cr
+++ b/src/invidious/channels/about.cr
@@ -6,6 +6,7 @@ record AboutChannel,
author_url : String,
author_thumbnail : String,
banner : String?,
+ description : String,
description_html : String,
total_views : Int64,
sub_count : Int32,
@@ -52,8 +53,7 @@ def get_about_info(ucid, locale) : AboutChannel
banners = initdata["header"]["interactiveTabbedHeaderRenderer"]?.try &.["banner"]?.try &.["thumbnails"]?
banner = banners.try &.[-1]?.try &.["url"].as_s?
- description = initdata["header"]["interactiveTabbedHeaderRenderer"]["description"]["simpleText"].as_s
- description_html = HTML.escape(description)
+ description_node = initdata["header"]["interactiveTabbedHeaderRenderer"]["description"]
is_family_friendly = initdata["microformat"]["microformatDataRenderer"]["familySafe"].as_bool
allowed_regions = initdata["microformat"]["microformatDataRenderer"]["availableCountries"].as_a.map(&.as_s)
@@ -75,13 +75,24 @@ def get_about_info(ucid, locale) : AboutChannel
author_verified_badge = initdata["header"].dig?("c4TabbedHeaderRenderer", "badges", 0, "metadataBadgeRenderer", "tooltip")
author_verified = (author_verified_badge && author_verified_badge == "Verified")
- description = initdata["metadata"]["channelMetadataRenderer"]?.try &.["description"]?.try &.as_s? || ""
- description_html = HTML.escape(description)
+ description_node = initdata["metadata"]["channelMetadataRenderer"]?.try &.["description"]?
is_family_friendly = initdata["microformat"]["microformatDataRenderer"]["familySafe"].as_bool
allowed_regions = initdata["microformat"]["microformatDataRenderer"]["availableCountries"].as_a.map(&.as_s)
end
+ description = !description_node.nil? ? description_node.as_s : ""
+ description_html = HTML.escape(description)
+ if !description_node.nil?
+ if description_node.as_h?.nil?
+ description_node = text_to_parsed_content(description_node.as_s)
+ end
+ description_html = parse_content(description_node)
+ if description_html == "" && description != ""
+ description_html = HTML.escape(description)
+ end
+ end
+
total_views = 0_i64
joined = Time.unix(0)
@@ -125,6 +136,7 @@ def get_about_info(ucid, locale) : AboutChannel
author_url: author_url,
author_thumbnail: author_thumbnail,
banner: banner,
+ description: description,
description_html: description_html,
total_views: total_views,
sub_count: sub_count,
diff --git a/src/invidious/comments.cr b/src/invidious/comments.cr
index 1f8de657f..c1bcc0a62 100644
--- a/src/invidious/comments.cr
+++ b/src/invidious/comments.cr
@@ -560,6 +560,32 @@ def fill_links(html, scheme, host)
return html.to_xml(options: XML::SaveOptions::NO_DECL)
end
+def text_to_parsed_content(text : String) : JSON::Any
+ nodes = [] of JSON::Any
+ text.split('\n').each do |line|
+ currentNodes = [] of JSON::Any
+ initialNode = {"text" => line}
+ currentNodes << (JSON.parse(initialNode.to_json))
+ line.scan(/https?:\/\/[^ ]*/).each do |uriMatch|
+ lastNode = currentNodes[currentNodes.size - 1].as_h
+ splittedLastNode = lastNode["text"].as_s.split(uriMatch[0])
+ lastNode["text"] = JSON.parse(splittedLastNode[0].to_json)
+ currentNodes[currentNodes.size - 1] = JSON.parse(lastNode.to_json)
+ currentNode = {"text" => uriMatch[0], "navigationEndpoint" => {"urlEndpoint" => {"url" => uriMatch[0]}}}
+ currentNodes << (JSON.parse(currentNode.to_json))
+ afterNode = {"text" => splittedLastNode.size > 0 ? splittedLastNode[1] : ""}
+ currentNodes << (JSON.parse(afterNode.to_json))
+ end
+ lastNode = currentNodes[currentNodes.size - 1].as_h
+ lastNode["text"] = JSON.parse("#{currentNodes[currentNodes.size - 1]["text"]}\n".to_json)
+ currentNodes[currentNodes.size - 1] = JSON.parse(lastNode.to_json)
+ currentNodes.each do |node|
+ nodes << (node)
+ end
+ end
+ return JSON.parse({"runs" => nodes}.to_json)
+end
+
def parse_content(content : JSON::Any, video_id : String? = "") : String
content["simpleText"]?.try &.as_s.rchop('\ufeff').try { |b| HTML.escape(b) }.to_s ||
content["runs"]?.try &.as_a.try { |r| content_to_comment_html(r, video_id).try &.to_s.gsub("\n", "
") } || ""
diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr
index 4f2df699a..8ae5034a3 100644
--- a/src/invidious/helpers/utils.cr
+++ b/src/invidious/helpers/utils.cr
@@ -391,11 +391,3 @@ def reduce_uri(uri : URI | String, max_length : Int32 = 50, suffix : String = "
end
return str
end
-
-def make_html_with_links(baseText : String) : String
- returnValue = baseText.dup
- returnValue.scan(/https?:\/\/[^ \n]*/).each do |match|
- returnValue = returnValue.sub(match[0], "#{match[0]}")
- end
- return returnValue
-end
diff --git a/src/invidious/routes/channels.cr b/src/invidious/routes/channels.cr
index 88c394c24..cd2e33239 100644
--- a/src/invidious/routes/channels.cr
+++ b/src/invidious/routes/channels.cr
@@ -10,7 +10,7 @@ module Invidious::Routes::Channels
if !data.is_a?(Tuple)
return data
end
- locale, user, subscriptions, continuation, ucid, channel, description = data
+ locale, user, subscriptions, continuation, ucid, channel = data
page = env.params.query["page"]?.try &.to_i?
page ||= 1
@@ -201,8 +201,6 @@ module Invidious::Routes::Channels
return error_template(500, ex)
end
- description = make_html_with_links(channel.description_html)
-
- return {locale, user, subscriptions, continuation, ucid, channel, description}
+ return {locale, user, subscriptions, continuation, ucid, channel}
end
end
diff --git a/src/invidious/views/channel.ecr b/src/invidious/views/channel.ecr
index b8a14afa3..92f81ee49 100644
--- a/src/invidious/views/channel.ecr
+++ b/src/invidious/views/channel.ecr
@@ -32,7 +32,7 @@
<%= description %>
+<%= channel.description_html %>