summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/invidious.cr42
1 files changed, 39 insertions, 3 deletions
diff --git a/src/invidious.cr b/src/invidious.cr
index cf263635..d92cb921 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -2817,6 +2817,42 @@ end
# Channels
+{"/channel/:ucid/live", "/user/:user/live", "/c/:user/live"}.each do |route|
+ get route do |env|
+ locale = LOCALES[env.get("preferences").as(Preferences).locale]?
+ client = make_client(YT_URL)
+
+ # Appears to be a bug in routing, having several routes configured
+ # as `/a/:a`, `/b/:a`, `/c/:a` results in 404
+ value = env.request.resource.split("/")[2]
+ body = ""
+ {"channel", "user", "c"}.each do |type|
+ response = client.get("/#{type}/#{value}/live?disable_polymer=1")
+ if response.status_code == 200
+ body = response.body
+ end
+ end
+
+ video_id = body.match(/'VIDEO_ID': "(?<id>[a-zA-Z0-9_-]{11})"/).try &.["id"]?
+ if video_id
+ params = [] of String
+ env.params.query.each do |k, v|
+ params << "#{k}=#{v}"
+ end
+ params = params.join("&")
+
+ url = "/watch?v=#{video_id}"
+ if !params.empty?
+ url += "&#{params}"
+ end
+
+ env.redirect url
+ else
+ env.redirect "/channel/#{value}"
+ end
+ end
+end
+
# YouTube appears to let users set a "brand" URL that
# is different from their username, so we convert that here
get "/c/:user" do |env|
@@ -3667,7 +3703,7 @@ get "/api/v1/channels/:ucid" do |env|
channel_info
end
-["/api/v1/channels/:ucid/videos", "/api/v1/channels/videos/:ucid"].each do |route|
+{"/api/v1/channels/:ucid/videos", "/api/v1/channels/videos/:ucid"}.each do |route|
get route do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]?
@@ -3736,7 +3772,7 @@ end
end
end
-["/api/v1/channels/:ucid/latest", "/api/v1/channels/latest/:ucid"].each do |route|
+{"/api/v1/channels/:ucid/latest", "/api/v1/channels/latest/:ucid"}.each do |route|
get route do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]?
@@ -3785,7 +3821,7 @@ end
end
end
-["/api/v1/channels/:ucid/playlists", "/api/v1/channels/playlists/:ucid"].each do |route|
+{"/api/v1/channels/:ucid/playlists", "/api/v1/channels/playlists/:ucid"}.each do |route|
get route do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]?