diff --git a/src/invidious.cr b/src/invidious.cr index ab3f1019..2d566ac0 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -468,6 +468,13 @@ end get "/embed/:id" do |env| locale = LOCALES[env.get("preferences").as(Preferences).locale]? id = env.params.url["id"] + plid = env.params.query["list"]? + + if md = env.params.query["playlist"]? + .try &.match(/[a-zA-Z0-9_-]{11}(,[a-zA-Z0-9_-]{11})*/) + video_series = md[0].split(",") + env.params.query.delete("playlist") + end preferences = env.get("preferences").as(Preferences) @@ -483,7 +490,33 @@ get "/embed/:id" do |env| next env.redirect url end - if id.size > 11 + # YouTube embed supports `videoseries` with either `list=PLID` + # or `playlist=VIDEO_ID,VIDEO_ID` + if id == "videoseries" + url = "" + + if plid + begin + videos = fetch_playlist_videos(plid, 1, 1, locale: locale) + rescue ex + error_message = ex.message + next templated "error" + end + + url = "/embed/#{videos[0].id}" + elsif video_series + url = "/embed/#{video_series.shift}" + env.params.query["playlist"] = video_series.join(",") + else + next env.redirect "/" + end + + if env.params.query.size > 0 + url += "?#{env.params.query}" + end + + next env.redirect url + elsif id.size > 11 url = "/embed/#{id[0, 11]}" if env.params.query.size > 0 diff --git a/src/invidious/views/embed.ecr b/src/invidious/views/embed.ecr index 5fab259c..ac69512f 100644 --- a/src/invidious/views/embed.ecr +++ b/src/invidious/views/embed.ecr @@ -23,6 +23,80 @@ - <%= rendered "components/player" %> +<%= rendered "components/player" %> + + diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index bd49709e..954b724f 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -249,7 +249,6 @@ function number_with_separator(val) { <% sub_count_text = video.sub_count_text %> <%= rendered "components/subscribe_widget_script" %> - <% if plid %> function get_playlist(timeouts = 0) { playlist = document.getElementById("playlist"); @@ -310,8 +309,8 @@ function get_playlist(timeouts = 0) { xhr.ontimeout = function() { console.log("Pulling playlist timed out."); - comments = document.getElementById("playlist"); - comments.innerHTML = + playlist = document.getElementById("playlist"); + playlist.innerHTML = '


'; get_playlist(timeouts + 1); };