summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/invidious.cr32
-rw-r--r--src/invidious/views/playlist.ecr5
2 files changed, 37 insertions, 0 deletions
diff --git a/src/invidious.cr b/src/invidious.cr
index 3286f3ae..d1509437 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -1618,6 +1618,38 @@ get "/feed/private" do |env|
feed
end
+get "/feed/playlist/:plid" do |env|
+ plid = env.params.url["plid"]
+
+ host_url = make_host_url(Kemal.config.ssl || CONFIG.https_only, env.request.headers["Host"]?)
+ path = env.request.path
+
+ client = make_client(YT_URL)
+ response = client.get("/feeds/videos.xml?playlist_id=#{plid}")
+ document = XML.parse(response.body)
+
+ document.xpath_nodes(%q(//*[@href]|//*[@url])).each do |node|
+ node.attributes.each do |attribute|
+ case attribute.name
+ when "url"
+ node["url"] = "#{host_url}#{URI.parse(node["url"]).full_path}"
+ when "href"
+ node["href"] = "#{host_url}#{URI.parse(node["href"]).full_path}"
+ end
+ end
+ end
+
+ document = document.to_xml(options: XML::SaveOptions::NO_DECL)
+
+ document.scan(/<uri>(?<url>[^<]+)<\/uri>/).each do |match|
+ content = "#{host_url}#{URI.parse(match["url"]).full_path}"
+ document = document.gsub(match[0], "<uri>#{content}</uri>")
+ end
+
+ env.response.content_type = "text/xml"
+ document
+end
+
# Channels
# YouTube appears to let users set a "brand" URL that
diff --git a/src/invidious/views/playlist.ecr b/src/invidious/views/playlist.ecr
index 4e93fc6f..56ad79f3 100644
--- a/src/invidious/views/playlist.ecr
+++ b/src/invidious/views/playlist.ecr
@@ -6,6 +6,11 @@
<div class="pure-u-2-3">
<h3><%= playlist.title %></h3>
</div>
+ <div class="pure-u-1-3" style="text-align:right;">
+ <h3>
+ <a href="/feed/playlist/<%= plid %>"><i class="icon ion-logo-rss"></i></a>
+ </h3>
+ </div>
</div>
<div class="pure-g h-box">
<div class="pure-u-1 pure-u-md-1-4">