From 0d8f036bf18b878376a618458ccfc1fb2c8a2e16 Mon Sep 17 00:00:00 2001 From: Omar Roth Date: Mon, 3 Sep 2018 22:15:47 -0500 Subject: [PATCH] Replace YouTube links --- src/invidious.cr | 6 ++--- src/invidious/comments.cr | 47 ++++++++------------------------------ src/invidious/playlists.cr | 2 +- 3 files changed, 14 insertions(+), 41 deletions(-) diff --git a/src/invidious.cr b/src/invidious.cr index f3e2ad8e..7340f4dc 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -249,7 +249,7 @@ get "/watch" do |env| aspect_ratio = "16:9" video.description = fill_links(video.description, "https", "www.youtube.com") - video.description = add_alt_links(video.description) + video.description = replace_links(video.description) description = video.short_description host_url = make_host_url(Kemal.config.ssl || CONFIG.https_only, env.request.headers["Host"]?) @@ -349,7 +349,7 @@ get "/embed/:id" do |env| aspect_ratio = nil video.description = fill_links(video.description, "https", "www.youtube.com") - video.description = add_alt_links(video.description) + video.description = replace_links(video.description) description = video.short_description host_url = make_host_url(Kemal.config.ssl || CONFIG.https_only, env.request.headers["Host"]?) @@ -1936,7 +1936,7 @@ get "/api/v1/comments/:id" do |env| content_html = template_reddit_comments(comments) content_html = fill_links(content_html, "https", "www.reddit.com") - content_html = add_alt_links(content_html) + content_html = replace_links(content_html) rescue ex reddit_thread = nil content_html = "" diff --git a/src/invidious/comments.cr b/src/invidious/comments.cr index 213ea889..c135497e 100644 --- a/src/invidious/comments.cr +++ b/src/invidious/comments.cr @@ -190,37 +190,21 @@ def template_reddit_comments(root) return html end -def add_alt_links(html) - alt_links = [] of {String, String} +def replace_links(html) + html = XML.parse_html(html) - # This is painful but likely the only way to accomplish this in Crystal, - # as Crystigiri and others are not able to insert XML Nodes into a document. - # The goal here is to use as little regex as possible - html.scan(/]*>([^<]+)<\/a>/) do |match| - anchor = XML.parse_html(match[0]) - anchor = anchor.xpath_node("//a").not_nil! + html.xpath_nodes(%q(//a)).each do |anchor| url = URI.parse(anchor["href"]) if ["www.youtube.com", "m.youtube.com"].includes?(url.host) if url.path == "/redirect" params = HTTP::Params.parse(url.query.not_nil!) - alt_url = params["q"]? - alt_url ||= "/" + anchor["href"] = params["q"]? else - alt_url = url.full_path + anchor["href"] = url.full_path end - - alt_link = <<-END_HTML - - - - END_HTML elsif url.host == "youtu.be" - alt_link = <<-END_HTML - - - - END_HTML + anchor["href"] = "/watch?v=#{url.path.try &.lchop("/")}&#{url.query}" elsif url.to_s == "#" begin length_seconds = decode_length_seconds(anchor.content) @@ -228,23 +212,12 @@ def add_alt_links(html) length_seconds = decode_time(anchor.content) end - alt_anchor = <<-END_HTML - #{anchor.content} - END_HTML - - html = html.sub(anchor.to_s, alt_anchor) - next - else - alt_link = "" + anchor["href"] = "javascript:void(0)" + anchor["onclick"] = "player.currentTime(#{length_seconds})" end - - alt_links << {anchor.to_s, alt_link} - end - - alt_links.each do |original, alternate| - html = html.sub(original, original + alternate) end + html = html.to_xml(options: XML::SaveOptions::NO_DECL) return html end @@ -267,5 +240,5 @@ def fill_links(html, scheme, host) html = html.to_xml(options: XML::SaveOptions::NO_DECL) end - html + return html end diff --git a/src/invidious/playlists.cr b/src/invidious/playlists.cr index a6a03e84..52a1abfb 100644 --- a/src/invidious/playlists.cr +++ b/src/invidious/playlists.cr @@ -130,7 +130,7 @@ def fetch_playlist(plid) description = description.to_xml.strip(" \n") description = description.split("