From f0fdd84bae86398427261c335f28914bc78991f3 Mon Sep 17 00:00:00 2001
From: thecashewtrader <thecashewtrader@protonmail.com>
Date: Wed, 2 Nov 2022 21:40:27 +0530
Subject: [PATCH] Add Watch on YouTube button

---
 src/components/ChannelPage.vue     | 19 +++++++++++++++++++
 src/components/PlaylistPage.vue    | 21 ++++++++++++++++++++-
 src/components/PreferencesPage.vue | 13 +++++++++++++
 src/components/WatchVideo.vue      | 20 +++++++++++++++++++-
 src/locales/en.json                |  1 +
 src/main.js                        |  3 ++-
 6 files changed, 74 insertions(+), 3 deletions(-)

diff --git a/src/components/ChannelPage.vue b/src/components/ChannelPage.vue
index c0c1d89d..297619f3 100644
--- a/src/components/ChannelPage.vue
+++ b/src/components/ChannelPage.vue
@@ -35,6 +35,25 @@
             <font-awesome-icon icon="rss" />
         </a>
 
+        <!-- Watch on YouTube button: For large screens -->
+        <a
+            v-if="this.getPreferenceBoolean('showWatchOnYouTube', false)"
+            :href="`https://youtube.com/channel/${this.channel.id}`"
+            class="btn lt-lg:hidden ml-3"
+        >
+            <i18n-t keypath="player.watch_on" tag="strong">
+                <font-awesome-icon class="mx-1.5" :icon="['fab', 'youtube']" />
+            </i18n-t>
+        </a>
+        <!-- Watch on YouTube button: For small screens -->
+        <a
+            v-if="this.getPreferenceBoolean('showWatchOnYouTube', false)"
+            :href="`https://youtube.com/channel/${this.channel.id}`"
+            class="btn lg:hidden ml-3"
+        >
+            <font-awesome-icon class="mx-1.5" :icon="['fab', 'youtube']" />
+        </a>
+
         <div class="flex mt-4 mb-2">
             <button
                 v-for="(tab, index) in tabs"
diff --git a/src/components/PlaylistPage.vue b/src/components/PlaylistPage.vue
index bb42503a..ce2310ad 100644
--- a/src/components/PlaylistPage.vue
+++ b/src/components/PlaylistPage.vue
@@ -20,9 +20,28 @@
                 <button class="btn mr-1" @click="downloadPlaylistAsTxt">
                     {{ $t("actions.download_as_txt") }}
                 </button>
-                <a class="btn" :href="getRssUrl">
+                <a class="btn mr-1" :href="getRssUrl">
                     <font-awesome-icon icon="rss" />
                 </a>
+
+                <!-- Watch on YouTube button: For large screens -->
+                <a
+                    v-if="this.getPreferenceBoolean('showWatchOnYouTube', false)"
+                    :href="`https://www.youtube.com/playlist?list=${this.$route.query.list}`"
+                    class="btn lt-lg:hidden"
+                >
+                    <i18n-t keypath="player.watch_on" tag="strong">
+                        <font-awesome-icon class="mx-1.5" :icon="['fab', 'youtube']" />
+                    </i18n-t>
+                </a>
+                <!-- Watch on YouTube button: For small screens -->
+                <a
+                    v-if="this.getPreferenceBoolean('showWatchOnYouTube', false)"
+                    :href="`https://www.youtube.com/playlist?list=${this.$route.query.list}`"
+                    class="btn lg:hidden"
+                >
+                    <font-awesome-icon class="mx-1.5" :icon="['fab', 'youtube']" />
+                </a>
             </div>
         </div>
 
diff --git a/src/components/PreferencesPage.vue b/src/components/PreferencesPage.vue
index 80c1fcfb..6df4d72a 100644
--- a/src/components/PreferencesPage.vue
+++ b/src/components/PreferencesPage.vue
@@ -96,6 +96,16 @@
             @change="onChange($event)"
         />
     </label>
+    <label class="pref" for="chkShowWatchOnYouTube">
+        <strong v-t="'actions.show_watch_on_youtube'" />
+        <input
+            id="chkShowWatchOnYouTube"
+            v-model="showWatchOnYouTube"
+            class="checkbox"
+            type="checkbox"
+            @change="onChange($event)"
+        />
+    </label>
     <label class="pref" for="chkStoreSearchHistory">
         <strong v-t="'actions.store_search_history'" />
         <input
@@ -368,6 +378,7 @@ export default {
             minimizeComments: false,
             minimizeDescription: false,
             minimizeRecommendations: false,
+            showWatchOnYouTube: false,
             watchHistory: false,
             searchHistory: false,
             hideWatched: false,
@@ -504,6 +515,7 @@ export default {
             this.minimizeComments = this.getPreferenceBoolean("minimizeComments", false);
             this.minimizeDescription = this.getPreferenceBoolean("minimizeDescription", false);
             this.minimizeRecommendations = this.getPreferenceBoolean("minimizeRecommendations", false);
+            this.showWatchOnYouTube = this.getPreferenceBoolean("showWatchOnYouTube", false);
             this.watchHistory = this.getPreferenceBoolean("watchHistory", false);
             this.searchHistory = this.getPreferenceBoolean("searchHistory", false);
             this.selectedLanguage = this.getPreferenceString("hl", await this.defaultLanguage);
@@ -563,6 +575,7 @@ export default {
                 localStorage.setItem("minimizeComments", this.minimizeComments);
                 localStorage.setItem("minimizeDescription", this.minimizeDescription);
                 localStorage.setItem("minimizeRecommendations", this.minimizeRecommendations);
+                localStorage.setItem("showWatchOnYouTube", this.showWatchOnYouTube);
                 localStorage.setItem("watchHistory", this.watchHistory);
                 localStorage.setItem("searchHistory", this.searchHistory);
                 if (!this.searchHistory) localStorage.removeItem("search_history");
diff --git a/src/components/WatchVideo.vue b/src/components/WatchVideo.vue
index bf024eaa..a4191d4f 100644
--- a/src/components/WatchVideo.vue
+++ b/src/components/WatchVideo.vue
@@ -108,7 +108,25 @@
                         >
                             <font-awesome-icon icon="rss" />
                         </a>
-                        <!-- watch on youtube button -->
+                        <!-- Watch on YouTube button: For large screens -->
+                        <a
+                            v-if="this.getPreferenceBoolean('showWatchOnYouTube', false)"
+                            :href="`https://youtu.be/${getVideoId()}`"
+                            class="btn lt-lg:hidden"
+                        >
+                            <i18n-t keypath="player.watch_on" tag="strong">
+                                <font-awesome-icon class="mx-1.5" :icon="['fab', 'youtube']" />
+                            </i18n-t>
+                        </a>
+                        <!-- Watch on YouTube button: For small screens -->
+                        <a
+                            v-if="this.getPreferenceBoolean('showWatchOnYouTube', false)"
+                            :href="`https://youtu.be/${getVideoId()}`"
+                            class="btn lg:hidden"
+                        >
+                            <font-awesome-icon class="mx-1.5" :icon="['fab', 'youtube']" />
+                        </a>
+                        <!-- Share Dialog -->
                         <button class="btn" @click="showShareModal = !showShareModal">
                             <i18n-t class="lt-lg:hidden" keypath="actions.share" tag="strong"></i18n-t>
                             <font-awesome-icon class="mx-1.5" icon="fa-share" />
diff --git a/src/locales/en.json b/src/locales/en.json
index 9cef968d..71e1120a 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -90,6 +90,7 @@
         "delete_account": "Delete Account",
         "logout": "Logout from this device",
         "minimize_recommendations_default": "Minimize Recommendations by default",
+        "show_watch_on_youtube": "Show Watch on YouTube button",
         "invalidate_session": "Logout all devices",
         "different_auth_instance": "Use a different instance for authentication",
         "instance_auth_selection": "Autentication Instance Selection",
diff --git a/src/main.js b/src/main.js
index efe2bae9..e5126cc3 100644
--- a/src/main.js
+++ b/src/main.js
@@ -21,7 +21,7 @@ import {
     faServer,
     faDonate,
 } from "@fortawesome/free-solid-svg-icons";
-import { faGithub, faBitcoin } from "@fortawesome/free-brands-svg-icons";
+import { faGithub, faBitcoin, faYoutube } from "@fortawesome/free-brands-svg-icons";
 import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
 library.add(
     faEye,
@@ -31,6 +31,7 @@ library.add(
     faCheck,
     faHeart,
     faHeadphones,
+    faYoutube,
     faRss,
     faChevronLeft,
     faLevelDownAlt,