diff --git a/src/invidious.cr b/src/invidious.cr index 04a7d264..82cf5f69 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -965,6 +965,10 @@ post "/preferences" do |env| autoplay ||= "off" autoplay = autoplay == "on" + continue = env.params.body["continue"]?.try &.as(String) + continue ||= "off" + continue = continue == "on" + listen = env.params.body["listen"]?.try &.as(String) listen ||= "off" listen = listen == "on" @@ -1024,6 +1028,7 @@ post "/preferences" do |env| preferences = { "video_loop" => video_loop, "autoplay" => autoplay, + "continue" => continue, "listen" => listen, "speed" => speed, "quality" => quality, diff --git a/src/invidious/users.cr b/src/invidious/users.cr index f8c1c09a..113fa1c2 100644 --- a/src/invidious/users.cr +++ b/src/invidious/users.cr @@ -70,7 +70,11 @@ class Preferences JSON.mapping({ video_loop: Bool, autoplay: Bool, - listen: { + continue: { + type: Bool, + default: false, + }, + listen: { type: Bool, default: false, }, diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index a0fb7f22..1f81b3d5 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -730,6 +730,7 @@ end def process_video_params(query, preferences) autoplay = query["autoplay"]?.try &.to_i? + continue = query["continue"]?.try &.to_i? listen = query["listen"]? && (query["listen"] == "true" || query["listen"] == "1").to_unsafe preferred_captions = query["subtitles"]?.try &.split(",").map { |a| a.downcase } quality = query["quality"]? @@ -739,6 +740,7 @@ def process_video_params(query, preferences) if preferences autoplay ||= preferences.autoplay.to_unsafe + continue ||= preferences.continue.to_unsafe listen ||= preferences.listen.to_unsafe preferred_captions ||= preferences.captions quality ||= preferences.quality @@ -748,6 +750,7 @@ def process_video_params(query, preferences) end autoplay ||= 0 + continue ||= 0 listen ||= 0 preferred_captions ||= [] of String quality ||= "hd720" @@ -756,6 +759,7 @@ def process_video_params(query, preferences) volume ||= 100 autoplay = autoplay == 1 + continue = continue == 1 listen = listen == 1 video_loop = video_loop == 1 @@ -786,6 +790,7 @@ def process_video_params(query, preferences) params = { autoplay: autoplay, + continue: continue, controls: controls, listen: listen, preferred_captions: preferred_captions, diff --git a/src/invidious/views/preferences.ecr b/src/invidious/views/preferences.ecr index 72b1d609..f7da7540 100644 --- a/src/invidious/views/preferences.ecr +++ b/src/invidious/views/preferences.ecr @@ -23,6 +23,11 @@ function update_value(element) { <input name="autoplay" id="autoplay" type="checkbox" <% if user.preferences.autoplay %>checked<% end %>> </div> + <div class="pure-control-group"> + <label for="continue">Automatically play next video: </label> + <input name="continue" id="continue" type="checkbox" <% if user.preferences.continue %>checked<% end %>> + </div> + <div class="pure-control-group"> <label for="listen">Listen by default: </label> <input name="listen" id="listen" type="checkbox" <% if user.preferences.listen %>checked<% end %>> diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index f9d98681..ba3692e2 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -140,6 +140,15 @@ <% if !preferences || preferences && preferences.related_videos %> <div class="h-box"> + + <% if !plid && !rvs.empty? %> + <div class="pure-control-group"> + <label for="continue">Autoplay next video: </label> + <input name="continue" onclick="continue_autoplay(this)" id="continue" type="checkbox" <% if params[:continue] %>checked<% end %>> + </div> + <hr> + <% end %> + <% rvs.each do |rv| %> <% if rv.has_key?("id") %> <a href="/watch?v=<%= rv["id"] %>"> @@ -163,6 +172,46 @@ </div> <script> +<% if !rvs.empty? && !plid && params[:continue] %> +player.on('ended', function() { + window.location.replace("/watch?v=" + + "<%= rvs[0]?.try &.["id"] %>" + + "&continue=1" + <% if params[:listen] %> + + "&listen=1" + <% end %> + <% if params[:autoplay] %> + + "&autoplay=1" + <% end %> + <% if params[:speed] %> + + "&speed=<%= params[:speed] %>" + <% end %> + ); +}); +<% end %> + +function continue_autoplay(target) { + if (target.checked) { + player.on('ended', function() { + window.location.replace("/watch?v=" + + "<%= rvs[0]?.try &.["id"] %>" + + "&continue=1" + <% if params[:listen] %> + + "&listen=1" + <% end %> + <% if params[:autoplay] %> + + "&autoplay=1" + <% end %> + <% if params[:speed] %> + + "&speed=<%= params[:speed] %>" + <% end %> + ); + }); + } else { + player.off('ended'); + } +} + function number_with_separator(val) { while (/(\d+)(\d{3})/.test(val.toString())) { val = val.toString().replace(/(\d+)(\d{3})/, "$1" + "," + "$2");