diff --git a/assets/js/embed.js b/assets/js/embed.js
new file mode 100644
index 00000000..04b08ca5
--- /dev/null
+++ b/assets/js/embed.js
@@ -0,0 +1,80 @@
+function get_playlist(plid, timeouts = 0) {
+ if (timeouts > 10) {
+ console.log('Failed to pull playlist');
+ return;
+ }
+
+ if (plid.startsWith('RD')) {
+ var plid_url = '/api/v1/mixes/' + plid +
+ '?continuation=' + embed_data.id +
+ '&format=html&hl=' + embed_data.preferences.locale;
+ } else {
+ var plid_url = '/api/v1/playlists/' + plid +
+ '?continuation=' + embed_data.id +
+ '&format=html&hl=' + embed_data.preferences.locale;
+ }
+
+ var xhr = new XMLHttpRequest();
+ xhr.responseType = 'json';
+ xhr.timeout = 20000;
+ xhr.open('GET', plid_url, true);
+ xhr.send();
+
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200) {
+ if (xhr.response.nextVideo) {
+ player.on('ended', function () {
+ var url = new URL('https://example.com/embed/' + xhr.response.nextVideo);
+
+ if (embed_data.params.autoplay || embed_data.params.continue_autoplay) {
+ url.searchParams.set('autoplay', '1');
+ }
+
+ if (embed_data.params.listen !== embed_data.preferences.listen) {
+ url.searchParams.set('listen', embed_data.params.listen);
+ }
+
+ if (embed_data.params.speed !== embed_data.preferences.speed) {
+ url.searchParams.set('speed', embed_data.params.speed);
+ }
+
+ url.searchParams.set('list', plid);
+ location.assign(url.pathname + url.search);
+ });
+ }
+ }
+ }
+ }
+
+ xhr.ontimeout = function () {
+ console.log('Pulling playlist timed out.');
+ get_playlist(plid, timeouts + 1);
+ }
+}
+
+if (embed_data.plid) {
+ get_playlist(embed_data.plid);
+} else if (embed_data.video_series) {
+ player.on('ended', function () {
+ var url = new URL('https://example.com/embed/' + embed_data.video_series.shift());
+
+ if (embed_data.params.autoplay || embed_data.params.continue_autoplay) {
+ url.searchParams.set('autoplay', '1');
+ }
+
+ if (embed_data.params.listen !== embed_data.preferences.listen) {
+ url.searchParams.set('listen', embed_data.params.listen);
+ }
+
+ if (embed_data.params.speed !== embed_data.preferences.speed) {
+ url.searchParams.set('speed', embed_data.params.speed);
+ }
+
+ if (embed_data.video_series.length !== 0) {
+ url.searchParams.set('playlist', embed_data.video_series.join(','))
+ }
+
+ location.assign(url.pathname + url.search);
+ });
+}
diff --git a/src/invidious/views/embed.ecr b/src/invidious/views/embed.ecr
index eb2b55eb..380a3806 100644
--- a/src/invidious/views/embed.ecr
+++ b/src/invidious/views/embed.ecr
@@ -26,79 +26,14 @@
<%= rendered "components/player" %>
+