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" %> + +