From e39dec97788344ad7741541707cc6d4bd91865b9 Mon Sep 17 00:00:00 2001
From: Omar Roth <omarroth@hotmail.com>
Date: Tue, 30 Oct 2018 09:41:23 -0500
Subject: [PATCH] Add option to listen by default

---
 src/invidious.cr                    | 10 ++++++----
 src/invidious/users.cr              | 12 ++++++++----
 src/invidious/videos.cr             |  9 ++++-----
 src/invidious/views/preferences.ecr |  5 +++++
 src/invidious/views/watch.ecr       |  2 +-
 5 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/src/invidious.cr b/src/invidious.cr
index 1a8153e4..802e9233 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -243,10 +243,7 @@ get "/watch" do |env|
   subscriptions ||= [] of String
 
   params = process_video_params(env.params.query, preferences)
-
-  if params[:listen]
-    env.params.query.delete_all("listen")
-  end
+  env.params.query.delete_all("listen")
 
   begin
     video = get_video(id, PG_DB, proxies)
@@ -880,6 +877,10 @@ post "/preferences" do |env|
     autoplay ||= "off"
     autoplay = autoplay == "on"
 
+    listen = env.params.body["listen"]?.try &.as(String)
+    listen ||= "off"
+    listen = listen == "on"
+
     speed = env.params.body["speed"]?.try &.as(String).to_f?
     speed ||= 1.0
 
@@ -935,6 +936,7 @@ post "/preferences" do |env|
     preferences = {
       "video_loop"         => video_loop,
       "autoplay"           => autoplay,
+      "listen"             => listen,
       "speed"              => speed,
       "quality"            => quality,
       "volume"             => volume,
diff --git a/src/invidious/users.cr b/src/invidious/users.cr
index 4116e732..b354306f 100644
--- a/src/invidious/users.cr
+++ b/src/invidious/users.cr
@@ -70,10 +70,14 @@ class Preferences
   JSON.mapping({
     video_loop: Bool,
     autoplay:   Bool,
-    speed:      Float32,
-    quality:    String,
-    volume:     Int32,
-    comments:   {
+    listen:     {
+      type:    Bool,
+      default: false,
+    },
+    speed:    Float32,
+    quality:  String,
+    volume:   Int32,
+    comments: {
       type:      Array(String),
       default:   ["youtube", ""],
       converter: StringToArray,
diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr
index 586ffe5d..26aa487e 100644
--- a/src/invidious/videos.cr
+++ b/src/invidious/videos.cr
@@ -708,6 +708,7 @@ end
 
 def process_video_params(query, preferences)
   autoplay = query["autoplay"]?.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"]?
   speed = query["speed"]?.try &.to_f?
@@ -716,6 +717,7 @@ def process_video_params(query, preferences)
 
   if preferences
     autoplay ||= preferences.autoplay.to_unsafe
+    listen ||= preferences.listen.to_unsafe
     preferred_captions ||= preferences.captions
     quality ||= preferences.quality
     speed ||= preferences.speed
@@ -724,6 +726,7 @@ def process_video_params(query, preferences)
   end
 
   autoplay ||= 0
+  listen ||= 0
   preferred_captions ||= [] of String
   quality ||= "hd720"
   speed ||= 1
@@ -731,6 +734,7 @@ def process_video_params(query, preferences)
   volume ||= 100
 
   autoplay = autoplay == 1
+  listen = listen == 1
   video_loop = video_loop == 1
 
   if query["t"]?
@@ -750,11 +754,6 @@ def process_video_params(query, preferences)
   end
   video_end ||= -1
 
-  if query["listen"]? && (query["listen"] == "true" || query["listen"] == "1")
-    listen = true
-  end
-  listen ||= false
-
   raw = query["raw"]?.try &.to_i?
   raw ||= 0
   raw = raw == 1
diff --git a/src/invidious/views/preferences.ecr b/src/invidious/views/preferences.ecr
index aa70e4dc..be15a54d 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="listen">Listen by default: </label>
+                <input name="listen" id="listen" type="checkbox" <% if user.preferences.listen %>checked<% end %>>
+            </div>
+
             <div class="pure-control-group">
                 <label for="speed">Default speed: </label>
                 <select name="speed" id="speed">
diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr
index 83120fb2..b286870d 100644
--- a/src/invidious/views/watch.ecr
+++ b/src/invidious/views/watch.ecr
@@ -35,7 +35,7 @@
 <h1>
     <%= HTML.escape(video.title) %> 
     <% if params[:listen] %>
-    <a href="/watch?<%= env.params.query %>">
+    <a href="/watch?<%= env.params.query %>&listen=0">
         <i class="icon ion-ios-videocam"></i>
     </a>
     <% else %>