From ba1bf4ba205def6b3c57c243f620baecfe4b9695 Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Mon, 28 Nov 2022 02:05:32 +0100 Subject: [PATCH 001/301] Make the auto merge workflow compatible with draft PRs (#2896) --- .github/workflows/autoMerge.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/autoMerge.yml b/.github/workflows/autoMerge.yml index dc6ced128b2c..a5391e724555 100644 --- a/.github/workflows/autoMerge.yml +++ b/.github/workflows/autoMerge.yml @@ -1,7 +1,7 @@ name: Auto Merge PR on: pull_request_target: - types: [opened, synchronize, reopened, auto_merge_disabled] + types: [opened, synchronize, reopened, auto_merge_disabled, ready_for_review] jobs: build: @@ -9,7 +9,7 @@ jobs: steps: - name: Auto Merge PR - if: contains(${{ github.event.pull_request.base.ref }}, 'development') || contains(${{ github.event.pull_request.base.ref }}, 'RC') + if: github.event.pull_request.draft == false && (contains(${{ github.event.pull_request.base.ref }}, 'development') || contains(${{ github.event.pull_request.base.ref }}, 'RC')) run: | echo ${{ secrets.PUSH_TOKEN }} >> auth.txt gh auth login --with-token < auth.txt From a495ff3d641ffa41fcd61b4eafbeb4f6d6caf51a Mon Sep 17 00:00:00 2001 From: gnuhead-chieb <41156994+gnuhead-chieb@users.noreply.github.com> Date: Mon, 28 Nov 2022 10:07:04 +0900 Subject: [PATCH 002/301] Changed to a more appropriate country name (#2895) --- static/geolocations/ja/countries.json | 2 +- static/geolocations/zh/countries.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/static/geolocations/ja/countries.json b/static/geolocations/ja/countries.json index c6d1445e4849..90c9e3e80b8e 100644 --- a/static/geolocations/ja/countries.json +++ b/static/geolocations/ja/countries.json @@ -192,5 +192,5 @@ {"id":426,"name":"レソト","alpha2":"ls","alpha3":"lso"}, {"id":422,"name":"レバノン","alpha2":"lb","alpha3":"lbn"}, {"id":643,"name":"ロシア連邦","alpha2":"ru","alpha3":"rus"}, -{"id":158,"name":"中国台湾省","alpha2":"tw","alpha3":"twn"} +{"id":158,"name":"台湾","alpha2":"tw","alpha3":"twn"} ] diff --git a/static/geolocations/zh/countries.json b/static/geolocations/zh/countries.json index 98a3313ce4a1..e3be3f1a30b2 100644 --- a/static/geolocations/zh/countries.json +++ b/static/geolocations/zh/countries.json @@ -192,5 +192,5 @@ {"id":887,"name":"也门","alpha2":"ye","alpha3":"yem"}, {"id":894,"name":"赞比亚","alpha2":"zm","alpha3":"zmb"}, {"id":716,"name":"津巴布韦","alpha2":"zw","alpha3":"zwe"}, -{"id":158,"name":"中国台湾省","alpha2":"tw","alpha3":"twn"} +{"id":158,"name":"台湾","alpha2":"tw","alpha3":"twn"} ] From 673dddd3bb81f30a5f704c52d3e67c663c883e9c Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Mon, 28 Nov 2022 01:41:14 +0000 Subject: [PATCH 003/301] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/zh_Hant/ --- static/locales/zh-TW.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/static/locales/zh-TW.yaml b/static/locales/zh-TW.yaml index 81c15284a38f..bcdd37d4a074 100644 --- a/static/locales/zh-TW.yaml +++ b/static/locales/zh-TW.yaml @@ -197,6 +197,7 @@ Settings: Expand Side Bar by Default: 預設展開側邊欄 Disable Smooth Scrolling: 停用平滑捲動 Hide Side Bar Labels: 隱藏側邊欄標籤 + Hide FreeTube Header Logo: 隱藏 FreeTube 標題圖示 Player Settings: Player Settings: '播放器選項' Force Local Backend for Legacy Formats: '強制使用傳統格式的區域伺服器' From 57f35cc0ba3c9487cf2cac3b58c84ee8d73deef2 Mon Sep 17 00:00:00 2001 From: Massimo Pissarello Date: Mon, 28 Nov 2022 04:24:06 +0000 Subject: [PATCH 004/301] Translated using Weblate (Italian) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/it/ --- static/locales/it.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/static/locales/it.yaml b/static/locales/it.yaml index 05e9e2948abb..d88afa7f9ab3 100644 --- a/static/locales/it.yaml +++ b/static/locales/it.yaml @@ -215,6 +215,7 @@ Settings: Disable Smooth Scrolling: Disabilita scorrimento fluido Expand Side Bar by Default: Espandi automaticamente la barra laterale Hide Side Bar Labels: Nascondi le etichette della barra laterale + Hide FreeTube Header Logo: Nascondi il logo dell'intestazione di FreeTube Player Settings: Player Settings: 'Impostazioni del riproduttore video' Force Local Backend for Legacy Formats: 'Forza riproduttore locale per formati From 8a9a48c670243c1940d7876c765a4fad9c29f64c Mon Sep 17 00:00:00 2001 From: Logan Date: Mon, 28 Nov 2022 07:31:57 +0000 Subject: [PATCH 005/301] Translated using Weblate (German) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/de/ --- static/locales/de-DE.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/static/locales/de-DE.yaml b/static/locales/de-DE.yaml index 6e438776156d..0052f142bc6c 100644 --- a/static/locales/de-DE.yaml +++ b/static/locales/de-DE.yaml @@ -8,7 +8,7 @@ FreeTube: FreeTube File: Datei Quit: Beenden Edit: Bearbeiten -Undo: Rückgängig +Undo: Rückgängig machen Redo: Wiederherstellen Cut: Ausschneiden Copy: Kopieren @@ -214,6 +214,7 @@ Settings: Disable Smooth Scrolling: Gleichmäßiges Scrollen deaktivieren Expand Side Bar by Default: Seitenleiste standardmäßig erweitern Hide Side Bar Labels: Seitenleisten-Beschriftungen ausblenden + Hide FreeTube Header Logo: FreeTube Titel Logo ausblenden Player Settings: Player Settings: Videoabspieler-Einstellungen Force Local Backend for Legacy Formats: Lokales System für Legacy Formate erzwingen @@ -691,7 +692,7 @@ Video: Volume: Lautstärke Bandwidth: Bandbreite Buffered: Gepuffert - Dropped / Total Frames: Ausgelassene Bilder / Bilder insgesamt + Dropped / Total Frames: Entfallene Einzelbilder / Gesamtzahl der Einzelbilder Mimetype: Medientyp Video statistics are not available for legacy videos: Videostatistiken sind für ältere Videos nicht verfügbar From 096152939dc86acc84d779e59628bc3899da107f Mon Sep 17 00:00:00 2001 From: Marco Cecconi Date: Mon, 28 Nov 2022 08:35:27 +0000 Subject: [PATCH 006/301] Translated using Weblate (Italian) Currently translated at 99.5% (636 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/it/ --- static/locales/it.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/static/locales/it.yaml b/static/locales/it.yaml index d88afa7f9ab3..84bfdb05cc34 100644 --- a/static/locales/it.yaml +++ b/static/locales/it.yaml @@ -3,8 +3,8 @@ Locale Name: 'Italiano' FreeTube: 'FreeTube' # Currently on Subscriptions, Playlists, and History 'This part of the app is not ready yet. Come back later when progress has been made.': >- - Questa parte dell'app è ancora in fase di sviluppo. Ritorna quando i lavori saranno - ultimati. + Questa parte dell'app non è ancora pronta. Torna più tardi quando saranno stati + fatti ulteriori progressi. # Webkit Menu Bar File: 'File' @@ -19,7 +19,7 @@ Delete: 'Elimina' Select all: 'Seleziona tutto' Reload: 'Ricarica' Force Reload: 'Forza ricarica' -Toggle Developer Tools: 'Abilita o disabilita strumenti sviluppatore' +Toggle Developer Tools: 'Abilita o disabilita strumenti di sviluppo' Actual size: 'Dimensione reale' Zoom in: 'Ingrandisci' Zoom out: 'Rimpicciolisci' @@ -795,7 +795,7 @@ No: 'No' A new blog is now available, {blogTitle}. Click to view more: 'Un nuovo blog è ora disponibile, {blogTitle}. Clicca per saperne di più' Version {versionNumber} is now available! Click for more details: La versione {versionNumber} - è ora disponibile! Clicca per maggiori dettagli + è ora disponibile! Clicca per maggiori dettagli Download From Site: Scarica dal sito The playlist has been reversed: La playlist è stata invertita Profile: From 50e27252a4eaa5cc4920adf67d26469c86fb9992 Mon Sep 17 00:00:00 2001 From: Massimo Pissarello Date: Mon, 28 Nov 2022 08:54:41 +0000 Subject: [PATCH 007/301] Translated using Weblate (Italian) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/it/ --- static/locales/it.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/locales/it.yaml b/static/locales/it.yaml index 84bfdb05cc34..602d7a4f0da3 100644 --- a/static/locales/it.yaml +++ b/static/locales/it.yaml @@ -19,7 +19,7 @@ Delete: 'Elimina' Select all: 'Seleziona tutto' Reload: 'Ricarica' Force Reload: 'Forza ricarica' -Toggle Developer Tools: 'Abilita o disabilita strumenti di sviluppo' +Toggle Developer Tools: 'Attiva/disattiva strumenti per sviluppatori' Actual size: 'Dimensione reale' Zoom in: 'Ingrandisci' Zoom out: 'Rimpicciolisci' @@ -795,7 +795,7 @@ No: 'No' A new blog is now available, {blogTitle}. Click to view more: 'Un nuovo blog è ora disponibile, {blogTitle}. Clicca per saperne di più' Version {versionNumber} is now available! Click for more details: La versione {versionNumber} - è ora disponibile! Clicca per maggiori dettagli + è ora disponibile! Clicca per maggiori dettagli Download From Site: Scarica dal sito The playlist has been reversed: La playlist è stata invertita Profile: From 271f10d6f71a5307d9051e38c46837987c0e4c8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Nov 2022 06:09:13 -0500 Subject: [PATCH 008/301] Bump electron from 21.2.3 to 21.3.1 (#2899) Bumps [electron](https://github.com/electron/electron) from 21.2.3 to 21.3.1. - [Release notes](https://github.com/electron/electron/releases) - [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md) - [Commits](https://github.com/electron/electron/compare/v21.2.3...v21.3.1) --- updated-dependencies: - dependency-name: electron dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f3b94f96218d..344344b71c6b 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.7.2", "css-minimizer-webpack-plugin": "^4.2.2", - "electron": "^21.2.3", + "electron": "^21.3.1", "electron-builder": "^23.6.0", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", diff --git a/yarn.lock b/yarn.lock index 60d7bf96bc6b..a25147668bab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3464,10 +3464,10 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== -electron@^21.2.3: - version "21.2.3" - resolved "https://registry.yarnpkg.com/electron/-/electron-21.2.3.tgz#7bd190f57b154ab85c92a2e52e0329fd40cbc7b9" - integrity sha512-Wyj0ri3P8hnWEvX7+2Q1OtNzJI8Qn4V9J+aeypoXh+wtlX/fjfHxi4vZkos/XRncoIeYCeUZ5nhGjsOIQwSElQ== +electron@^21.3.1: + version "21.3.1" + resolved "https://registry.yarnpkg.com/electron/-/electron-21.3.1.tgz#02a61053ace79ecdc592afc641ff663dec805b42" + integrity sha512-Ik/I9oFHA1h32JRtRm6GMgYdUctFpF/tPnHyATg4r3LXBTUT6habGh3GxSdmmTa5JgtA7uJUEm8EjjZItk7T3g== dependencies: "@electron/get" "^1.14.1" "@types/node" "^16.11.26" From ba91f6c5bc59da9f6cd06d51e8d1e7fd416fa565 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Nov 2022 06:18:42 -0500 Subject: [PATCH 009/301] Bump electron-context-menu from 3.5.0 to 3.6.0 (#2897) Bumps [electron-context-menu](https://github.com/sindresorhus/electron-context-menu) from 3.5.0 to 3.6.0. - [Release notes](https://github.com/sindresorhus/electron-context-menu/releases) - [Commits](https://github.com/sindresorhus/electron-context-menu/compare/v3.5.0...v3.6.0) --- updated-dependencies: - dependency-name: electron-context-menu dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 344344b71c6b..88bc98561719 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "autolinker": "^4.0.0", "browserify": "^17.0.0", "browserify-zlib": "^0.2.0", - "electron-context-menu": "^3.5.0", + "electron-context-menu": "^3.6.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "lodash.debounce": "^4.0.8", diff --git a/yarn.lock b/yarn.lock index a25147668bab..051fa671c7dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3406,10 +3406,10 @@ electron-builder@^23.6.0: simple-update-notifier "^1.0.7" yargs "^17.5.1" -electron-context-menu@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/electron-context-menu/-/electron-context-menu-3.5.0.tgz#f5d6df982e37555a77666bcecff59b094211b54a" - integrity sha512-z4agpok6YnXlGFs66zU9EBFft4llUFJ41NYFEMMS0fnprMKBztJUCHBA6LMAqJgjabfqsYC7kxlvjvepxodOqg== +electron-context-menu@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/electron-context-menu/-/electron-context-menu-3.6.0.tgz#d60fabb99d5bb06c46b6929c342c75cc0eee348e" + integrity sha512-7uhF3WX7ZalLEurKqML2cJJrBUw1JSZNzbwIB9kVbip7sVwyl7bVjiwHzdYjuOh/+xHw21ZzxwgZcB6sTeKdEw== dependencies: cli-truncate "^2.1.0" electron-dl "^3.2.1" From 9459e07dbc9e3a2c27d6d1a3e3a18afb0840b0ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Nov 2022 06:19:11 -0500 Subject: [PATCH 010/301] Bump @fortawesome/free-brands-svg-icons from 6.2.0 to 6.2.1 (#2898) Bumps [@fortawesome/free-brands-svg-icons](https://github.com/FortAwesome/Font-Awesome) from 6.2.0 to 6.2.1. - [Release notes](https://github.com/FortAwesome/Font-Awesome/releases) - [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.2.0...6.2.1) --- updated-dependencies: - dependency-name: "@fortawesome/free-brands-svg-icons" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 88bc98561719..5aa5e2fd13cf 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.2.0", - "@fortawesome/free-brands-svg-icons": "^6.2.0", + "@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-solid-svg-icons": "^6.2.0", "@fortawesome/vue-fontawesome": "^2.0.8", "@freetube/youtube-chat": "^1.1.2", diff --git a/yarn.lock b/yarn.lock index 051fa671c7dc..42945841f880 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1051,6 +1051,11 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz#76467a94aa888aeb22aafa43eb6ff889df3a5a7f" integrity sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg== +"@fortawesome/fontawesome-common-types@6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz#411e02a820744d3f7e0d8d9df9d82b471beaa073" + integrity sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ== + "@fortawesome/fontawesome-svg-core@^6.2.0": version "6.2.0" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz#11856eaf4dd1d865c442ddea1eed8ee855186ba2" @@ -1058,12 +1063,12 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.2.0" -"@fortawesome/free-brands-svg-icons@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.0.tgz#ce072179677f9b5d6767f918cfbf296f357cc1d0" - integrity sha512-fm1y4NyZ2qKYNmYhdMz9VAWRw1Et7PMHNunSw3W0SVAwKwv6o0qiJworLH3Y9SnmhHzAymXJwCX1op22FFvGiA== +"@fortawesome/free-brands-svg-icons@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.1.tgz#04a6d6f7898f7ef392aba7a65030a584d4f4c84f" + integrity sha512-L8l4MfdHPmZlJ72PvzdfwOwbwcCAL0vx48tJRnI6u1PJXh+j2f3yDoKyQgO3qjEsgD5Fr2tQV/cPP8F/k6aUig== dependencies: - "@fortawesome/fontawesome-common-types" "6.2.0" + "@fortawesome/fontawesome-common-types" "6.2.1" "@fortawesome/free-solid-svg-icons@^6.2.0": version "6.2.0" From ecb91287315f19a85e291266510395748aacadb1 Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Mon, 28 Nov 2022 12:52:47 +0100 Subject: [PATCH 011/301] Migrate search suggestions to youtubei.js (#2855) * Migrate search suggestions to youtubei.js * Rename functions to indicate that they are for the local API * Implement and use a lightweight Innertube session * Fix typo in comment Co-authored-by: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com> * Fix another typo in a comment Co-authored-by: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com> --- _scripts/webpack.renderer.config.js | 11 +- _scripts/webpack.web.config.js | 1 + package.json | 2 +- src/main/index.js | 10 ++ src/renderer/components/top-nav/top-nav.js | 15 +- src/renderer/helpers/api/PlayerCache.js | 41 ++++++ src/renderer/helpers/api/local.js | 58 ++++++++ yarn.lock | 156 ++++++++++++++++----- 8 files changed, 250 insertions(+), 44 deletions(-) create mode 100644 src/renderer/helpers/api/PlayerCache.js create mode 100644 src/renderer/helpers/api/local.js diff --git a/_scripts/webpack.renderer.config.js b/_scripts/webpack.renderer.config.js index 15965ff234b3..2f78d7dcb460 100644 --- a/_scripts/webpack.renderer.config.js +++ b/_scripts/webpack.renderer.config.js @@ -126,10 +126,19 @@ const config = { filename: isDevMode ? '[name].css' : '[name].[contenthash].css', chunkFilename: isDevMode ? '[id].css' : '[id].[contenthash].css', }), + // ignore linkedom's unnecessary broken canvas import, as youtubei.js only uses linkedom to generate DASH manifests + new webpack.IgnorePlugin({ + resourceRegExp: /^canvas$/ + }) ], resolve: { alias: { - vue$: 'vue/dist/vue.common.js' + vue$: 'vue/dist/vue.common.js', + + // defaults to the prebundled browser version which causes webpack to error with: + // "Critical dependency: require function is used in a way in which dependencies cannot be statically extracted" + // webpack likes to bundle the dependencies itself, could really have a better error message though + 'youtubei.js$': 'youtubei.js/dist/browser.js', }, extensions: ['.js', '.vue'] }, diff --git a/_scripts/webpack.web.config.js b/_scripts/webpack.web.config.js index a49104cccdc3..169f428ba7f9 100644 --- a/_scripts/webpack.web.config.js +++ b/_scripts/webpack.web.config.js @@ -26,6 +26,7 @@ const config = { }, externals: { electron: '{}', + 'youtubei.js': '{}', ytpl: '{}', ytsr: '{}' }, diff --git a/package.json b/package.json index 5aa5e2fd13cf..b2d2853384bd 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "vue-observe-visibility": "^1.0.0", "vue-router": "^3.6.5", "vuex": "^3.6.2", - "youtube-suggest": "^1.2.0", + "youtubei.js": "^2.5.0", "yt-channel-info": "^3.2.1", "yt-dash-manifest-generator": "1.1.0", "ytdl-core": "https://github.com/absidue/node-ytdl-core#fix-likes-extraction", diff --git a/src/main/index.js b/src/main/index.js index 15a38879d6b2..c23a4f2f769e 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -162,6 +162,16 @@ function runApp() { }) }) + // make InnerTube requests work with the fetch function + // InnerTube rejects requests if the referer isn't YouTube or empty + const innertubeRequestFilter = { urls: ['https://www.youtube.com/youtubei/*'] } + + session.defaultSession.webRequest.onBeforeSendHeaders(innertubeRequestFilter, ({ requestHeaders }, callback) => { + requestHeaders.referer = 'https://www.youtube.com' + // eslint-disable-next-line node/no-callback-literal + callback({ requestHeaders }) + }) + if (replaceHttpCache) { // in-memory image cache diff --git a/src/renderer/components/top-nav/top-nav.js b/src/renderer/components/top-nav/top-nav.js index a23d984f8a38..2c7c26b27f47 100644 --- a/src/renderer/components/top-nav/top-nav.js +++ b/src/renderer/components/top-nav/top-nav.js @@ -4,10 +4,10 @@ import FtInput from '../ft-input/ft-input.vue' import FtSearchFilters from '../ft-search-filters/ft-search-filters.vue' import FtProfileSelector from '../ft-profile-selector/ft-profile-selector.vue' import debounce from 'lodash.debounce' -import ytSuggest from 'youtube-suggest' import { IpcChannels } from '../../../constants' import { openInternalPath, showToast } from '../../helpers/utils' +import { clearLocalSearchSuggestionsSession, getLocalSearchSuggestions } from '../../helpers/api/local' export default Vue.extend({ name: 'TopNav', @@ -24,7 +24,8 @@ export default Vue.extend({ searchFilterValueChanged: false, historyIndex: 1, isForwardOrBack: false, - searchSuggestionsDataList: [] + searchSuggestionsDataList: [], + lastSuggestionQuery: '' } }, computed: { @@ -115,6 +116,8 @@ export default Vue.extend({ this.searchInput.blur() } + clearLocalSearchSuggestionsSession() + this.getYoutubeUrlInfo(query).then((result) => { switch (result.urlType) { case 'video': { @@ -210,7 +213,11 @@ export default Vue.extend({ getSearchSuggestionsDebounce: function (query) { if (this.enableSearchSuggestions) { - this.debounceSearchResults(query) + const trimmedQuery = query.trim() + if (trimmedQuery !== this.lastSuggestionQuery) { + this.lastSuggestionQuery = trimmedQuery + this.debounceSearchResults(trimmedQuery) + } } }, @@ -231,7 +238,7 @@ export default Vue.extend({ return } - ytSuggest(query).then((results) => { + getLocalSearchSuggestions(query).then((results) => { this.searchSuggestionsDataList = results }) }, diff --git a/src/renderer/helpers/api/PlayerCache.js b/src/renderer/helpers/api/PlayerCache.js new file mode 100644 index 000000000000..95e2a4f1ced8 --- /dev/null +++ b/src/renderer/helpers/api/PlayerCache.js @@ -0,0 +1,41 @@ +import { access, mkdir, readFile, unlink, writeFile } from 'fs/promises' +import { resolve } from 'path' + +// based off https://github.com/LuanRT/YouTube.js/blob/6caa679df6ddc77d25be02dcb7355b722ab268aa/src/utils/Cache.ts +// avoids errors caused by the fully dynamic `fs` and `path` module imports that youtubei.js's UniversalCache does +export class PlayerCache { + constructor(cacheDirectory) { + this.cacheDirectory = cacheDirectory + } + + async get(key) { + const filePath = resolve(this.cacheDirectory, key) + + try { + const contents = await readFile(filePath) + return contents.buffer + } catch (e) { + if (e?.code === 'ENOENT') { + return undefined + } + throw e + } + } + + async set(key, value) { + await mkdir(this.cacheDirectory, { recursive: true }) + + const filePath = resolve(this.cacheDirectory, key) + await writeFile(filePath, new Uint8Array(value)) + } + + async remove(key) { + const filePath = resolve(this.cacheDirectory, key) + + // only try to delete the file if it exists, access() throws an exception if the file doesn't exist + try { + await access(filePath) + await unlink(filePath) + } catch { } + } +} diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js new file mode 100644 index 000000000000..adce44e38f93 --- /dev/null +++ b/src/renderer/helpers/api/local.js @@ -0,0 +1,58 @@ +import { Innertube, Session } from 'youtubei.js' +import { PlayerCache } from './PlayerCache' +import { join } from 'path' + +import store from '../../store/index' + +/** + * Creates a lightweight Innertube instance, which is faster to create or + * an instance that can decode the streaming URLs, which is slower to create + * the lightweight one only needs a single web request to create the new session + * the full one needs 3 (or 2 if the player is cached) web requests to create: + * 1. the request for the session + * 2. fetch a page that contains a link to the player + * 3. if the player isn't cached, it is downloaded and transformed + * @param {boolean} withPlayer set to true to get an Innertube instance that can decode the streaming URLs + * @returns the Innertube instance + */ +async function createInnertube(withPlayer = false) { + if (withPlayer) { + const userData = await store.dispatch('getUserDataPath') + + return await Innertube.create({ + // use browser fetch + fetch: (input, init) => fetch(input, init), + cache: new PlayerCache(join(userData, 'player_cache')) + }) + } else { + // from https://github.com/LuanRT/YouTube.js/pull/240 + const sessionData = await Session.getSessionData() + + const session = new Session( + sessionData.context, + sessionData.api_key, + sessionData.api_version, + sessionData.account_index, + undefined, // player + undefined, // cookies + (input, init) => fetch(input, init) // use browser fetch + ) + + return new Innertube(session) + } +} + +let searchSuggestionsSession = null + +export async function getLocalSearchSuggestions(query) { + // reuse innertube instance to keep the search suggestions snappy + if (searchSuggestionsSession === null) { + searchSuggestionsSession = await createInnertube() + } + + return await searchSuggestionsSession.getSearchSuggestions(query) +} + +export function clearLocalSearchSuggestionsSession() { + searchSuggestionsSession = null +} diff --git a/yarn.lock b/yarn.lock index 42945841f880..453311dffdfd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1233,6 +1233,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@protobuf-ts/runtime@^2.7.0": + version "2.8.1" + resolved "https://registry.yarnpkg.com/@protobuf-ts/runtime/-/runtime-2.8.1.tgz#e88f89650ab29c3eba0afebe32b9f3552f35fc85" + integrity sha512-D9M5hSumYCovIfNllt7N6ODh4q+LrjiMWtNETvooaf+a2XheZJ7kgjFlsFghti0CFWwtA//of4JXQfw9hU+cCw== + "@seald-io/binary-search-tree@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@seald-io/binary-search-tree/-/binary-search-tree-1.0.2.tgz#9f0e5cec5e0acf97f1b495f2f6d3476ddb6a94ed" @@ -2492,6 +2497,13 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -3010,6 +3022,17 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -3018,7 +3041,7 @@ css-tree@^1.1.2, css-tree@^1.1.3: mdn-data "2.0.14" source-map "^0.6.1" -css-what@^6.0.1: +css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== @@ -3084,6 +3107,11 @@ csso@^4.2.0: dependencies: css-tree "^1.1.2" +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + csstype@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" @@ -3312,6 +3340,15 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -3322,7 +3359,7 @@ domain-browser@^1.2.0: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@^2.0.1, domelementtype@^2.2.0: +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== @@ -3334,6 +3371,13 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: dependencies: domelementtype "^2.2.0" +domhandler@^5.0.1, domhandler@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -3343,6 +3387,15 @@ domutils@^2.5.2, domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -3533,6 +3586,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0, entities@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -4601,6 +4659,11 @@ html-entities@^2.3.2: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== +html-escaper@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-3.0.3.tgz#4d336674652beb1dcbc29ef6b6ba7f6be6fdfed6" + integrity sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ== + html-minifier-terser@^6.0.2: version "6.1.0" resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" @@ -4640,6 +4703,16 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" +htmlparser2@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + domutils "^3.0.1" + entities "^4.3.0" + http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -5173,6 +5246,13 @@ jest-worker@^29.1.2: merge-stream "^2.0.0" supports-color "^8.0.0" +jintr@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/jintr/-/jintr-0.3.1.tgz#0ab49390a187d77dc5f2c19580c644d70a94528a" + integrity sha512-AUcq8fKL4BE9jDx8TizZmJ9UOvk1CHKFW0nQcWaOaqk9tkLS9S10fNmusTWGEYTncn7U43nXrCbhYko/ylqrSg== + dependencies: + acorn "^8.8.0" + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -5395,6 +5475,17 @@ lilconfig@^2.0.3: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== +linkedom@^0.14.12: + version "0.14.19" + resolved "https://registry.yarnpkg.com/linkedom/-/linkedom-0.14.19.tgz#a8e9b91af26d5c631b5b3d21614cef1db8a56fb7" + integrity sha512-sFNkQZlKBWpEaAcbsDIghTLE0hHbyvS6dZuM7IH+KTM09GaQ772PtDZAuFlN0oFgyAjUj8XS9FpoWSLmBjl8MA== + dependencies: + css-select "^5.1.0" + cssom "^0.5.0" + html-escaper "^3.0.3" + htmlparser2 "^8.0.1" + uhyphen "^0.1.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -5865,13 +5956,6 @@ node-addon-api@^1.6.3: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== -node-fetch@^2.6.0: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -7293,11 +7377,6 @@ smart-buffer@^4.0.2, smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -smol-jsonp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/smol-jsonp/-/smol-jsonp-1.0.0.tgz#b662c932a193f1a5c6bb1dcdaaddcd4e2007f7df" - integrity sha512-EwM2cKsq87A9cCKiAwfp7kVSRtAT01M/3HXaO3tYxP+pnEZ5zVYsxLdTnPjJVVIeK9O2zkV0QbWuwlHEUQNdOA== - sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -7489,6 +7568,11 @@ stream-splicer@^2.0.0: inherits "^2.0.1" readable-stream "^2.0.2" +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -7760,11 +7844,6 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - tree-kill@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -7849,6 +7928,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +uhyphen@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/uhyphen/-/uhyphen-0.1.0.tgz#3cc22afa790daa802b9f6789f3583108d5b4a08c" + integrity sha512-o0QVGuFg24FK765Qdd5kk0zU/U4dEsCtN/GSiwNI9i8xsSVtjIAOdTaVhLwZ1nrbWxFVMxNDDl+9fednsOMsBw== + umd@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" @@ -7880,6 +7964,13 @@ underscore@1.13.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== +undici@^5.7.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.12.0.tgz#c758ffa704fbcd40d506e4948860ccaf4099f531" + integrity sha512-zMLamCG62PGjd9HHMpo05bSLvvwWOZgGeiWlN/vlqu3+lRo3elxktVGEyLMX+IO7c2eflLjcW74AlkhEZm15mg== + dependencies: + busboy "^1.6.0" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -8221,11 +8312,6 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - webpack-cli@^4.10.0: version "4.10.0" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" @@ -8347,14 +8433,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -8494,13 +8572,15 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" -youtube-suggest@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/youtube-suggest/-/youtube-suggest-1.2.0.tgz#5f1b445c2b71bfc8a4c89af99775b02cd827e77d" - integrity sha512-/ItW6204M+OOHaO4k5DYJGHH+UZjkaKNb7rtAWQaA6zeJvUu3tbveAsm+xTGH+8VfyT/LoAhN9/yOQajduDCJA== +youtubei.js@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/youtubei.js/-/youtubei.js-2.5.0.tgz#bd209a8b1edccc106ef0d77c6a619f3e3085913a" + integrity sha512-RnRXF4+HESqpJQ1FIWXZ/6M+0Sdt8OndTTD0yYex+zWR+7YOBRrWcXRuKSsWgw3v3ctuzW7TJ8+t/s/8/ImFHw== dependencies: - node-fetch "^2.6.0" - smol-jsonp "^1.0.0" + "@protobuf-ts/runtime" "^2.7.0" + jintr "^0.3.1" + linkedom "^0.14.12" + undici "^5.7.0" yt-channel-info@^3.2.1: version "3.2.1" From bc9cb67699c94a36a49d897a52a310c76644f3c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Nov 2022 16:42:24 +0100 Subject: [PATCH 012/301] Bump @fortawesome/fontawesome-svg-core from 6.2.0 to 6.2.1 (#2900) Bumps [@fortawesome/fontawesome-svg-core](https://github.com/FortAwesome/Font-Awesome) from 6.2.0 to 6.2.1. - [Release notes](https://github.com/FortAwesome/Font-Awesome/releases) - [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.2.0...6.2.1) --- updated-dependencies: - dependency-name: "@fortawesome/fontawesome-svg-core" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b2d2853384bd..70b7065812f6 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "ci": "yarn install --silent --frozen-lockfile" }, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.2.0", + "@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-solid-svg-icons": "^6.2.0", "@fortawesome/vue-fontawesome": "^2.0.8", diff --git a/yarn.lock b/yarn.lock index 453311dffdfd..dbea5b5bbfac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1056,12 +1056,12 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz#411e02a820744d3f7e0d8d9df9d82b471beaa073" integrity sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ== -"@fortawesome/fontawesome-svg-core@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz#11856eaf4dd1d865c442ddea1eed8ee855186ba2" - integrity sha512-Cf2mAAeMWFMzpLC7Y9H1I4o3wEU+XovVJhTiNG8ZNgSQj53yl7OCJaS80K4YjrABWZzbAHVaoHE1dVJ27AAYXw== +"@fortawesome/fontawesome-svg-core@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz#e87e905e444b5e7b715af09b64d27b53d4c8f9d9" + integrity sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA== dependencies: - "@fortawesome/fontawesome-common-types" "6.2.0" + "@fortawesome/fontawesome-common-types" "6.2.1" "@fortawesome/free-brands-svg-icons@^6.2.1": version "6.2.1" From 606b7ff79431d91846cc98723fae2723651acb1f Mon Sep 17 00:00:00 2001 From: Dragibus Noir Date: Mon, 28 Nov 2022 13:54:38 +0000 Subject: [PATCH 013/301] Translated using Weblate (French) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/fr/ --- static/locales/fr-FR.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/static/locales/fr-FR.yaml b/static/locales/fr-FR.yaml index b751e4a5a0c9..76a22b9dac80 100644 --- a/static/locales/fr-FR.yaml +++ b/static/locales/fr-FR.yaml @@ -218,6 +218,7 @@ Settings: Expand Side Bar by Default: Développer la barre latérale par défaut Disable Smooth Scrolling: Désactiver le défilement fluide Hide Side Bar Labels: Masquer les étiquettes de la barre latérale + Hide FreeTube Header Logo: Masquer le logo d'en-tête de FreeTube Player Settings: Player Settings: 'Paramètres du lecteur' Force Local Backend for Legacy Formats: 'Forcer le backend local pour le format From 66f8ef5bea26a37618300c405eadc6a2144c0aef Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Mon, 28 Nov 2022 22:06:58 +0000 Subject: [PATCH 014/301] Translated using Weblate (Arabic) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/ar/ --- static/locales/ar.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/static/locales/ar.yaml b/static/locales/ar.yaml index 349d7b168092..ffb7d0a2775c 100644 --- a/static/locales/ar.yaml +++ b/static/locales/ar.yaml @@ -206,6 +206,7 @@ Settings: Disable Smooth Scrolling: عطّل التمرير المتجانس Expand Side Bar by Default: كبّر الشريط الجانبي بشكل افتراضي Hide Side Bar Labels: إخفاء تسميات الشريط الجانبي + Hide FreeTube Header Logo: إخفاء شعار رأس FreeTube Player Settings: Player Settings: 'إعدادات المشغل' Force Local Backend for Legacy Formats: 'فرض الواجهة الخلفية المحلية للتنسيقات From b5ad68984f2c615ec154508b4b63c0912413570e Mon Sep 17 00:00:00 2001 From: zaioti Date: Tue, 29 Nov 2022 01:44:11 +0000 Subject: [PATCH 015/301] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/pt_BR/ --- static/locales/pt-BR.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/static/locales/pt-BR.yaml b/static/locales/pt-BR.yaml index f7fddb9d33f2..ba3f02d035c2 100644 --- a/static/locales/pt-BR.yaml +++ b/static/locales/pt-BR.yaml @@ -209,6 +209,7 @@ Settings: Disable Smooth Scrolling: Desativar Rolagem Suave Expand Side Bar by Default: Expandir Barra Lateral por Padrão Hide Side Bar Labels: Ocultar etiquetas da barra lateral + Hide FreeTube Header Logo: Esconder o logotipo do cabeçalho do FreeTube Player Settings: Player Settings: 'Configurações do vídeo' Force Local Backend for Legacy Formats: 'Forçar motor local para formatos legados' From 5703665676a18a5fc56e414ba21b65b9e37c67aa Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Tue, 29 Nov 2022 10:38:38 +0000 Subject: [PATCH 016/301] Translated using Weblate (Galician) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/gl/ --- static/locales/gl.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/static/locales/gl.yaml b/static/locales/gl.yaml index b1d686b32b31..8e7417e16152 100644 --- a/static/locales/gl.yaml +++ b/static/locales/gl.yaml @@ -32,7 +32,7 @@ Forward: 'Adiante' Version {versionNumber} is now available! Click for more details: 'A versión {versionNumber} está dispoñible! Fai clic para veres máis detalles' -Download From Site: 'Descargar dende a páxina web' +Download From Site: 'Descargar do sitio' A new blog is now available, {blogTitle}. Click to view more: 'Hai unha nova entrada no blog dispoñible, {blogTitle}. Fai clic para veres máis' @@ -77,7 +77,7 @@ Subscriptions: Subscriptions: 'Subscricións' Latest Subscriptions: 'Últimas subscricións' This profile has a large number of subscriptions. Forcing RSS to avoid rate limiting: 'Este - perfil ten un gran número de subscricións. Forzar ás RSS para evitar a limitación + perfil ten un gran número de subscricións. Forzar ás RSS para evitar a limitación da taxa' 'Your Subscription list is currently empty. Start adding subscriptions to see them here.': 'A túa listaxe de subscricións está baleira. Engade algunhas para as ver aquí.' @@ -688,7 +688,7 @@ Video: music offtopic: Música Offtopic interaction: Interacción self-promotion: Autopromoción - outro: Outro + outro: outro intro: Intro sponsor: Patrocinador recap: Recapitulación From fc5be5bb1ac006a97b4032705367a13da331b5bb Mon Sep 17 00:00:00 2001 From: SC Date: Tue, 29 Nov 2022 16:19:13 +0000 Subject: [PATCH 017/301] Translated using Weblate (Portuguese) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/pt/ --- static/locales/pt.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/static/locales/pt.yaml b/static/locales/pt.yaml index 5047319f48c0..0c229fe611ea 100644 --- a/static/locales/pt.yaml +++ b/static/locales/pt.yaml @@ -215,6 +215,7 @@ Settings: Disable Smooth Scrolling: Desativar deslocação suave Expand Side Bar by Default: Expandir barra lateral por definição Hide Side Bar Labels: Ocultar texto na barra lateral + Hide FreeTube Header Logo: Ocultar o logotipo do FreeTube no cabeçalho Player Settings: Player Settings: 'Definições do reprodutor' Force Local Backend for Legacy Formats: 'Forçar sistema de ligação local para @@ -415,6 +416,7 @@ Settings: Hide Live Streams: Ocultar transmissões em direto Hide Comments: Ocultar comentários Hide Chapters: Ocultar capítulos + Hide Upcoming Premieres: Ocultar próximas estreias External Player Settings: Custom External Player Arguments: Argumentos do reprodutor externo personalizado Custom External Player Executable: Executável de reprodutor externo personalizado From deb463e8fcae26f152d2ef1fd77f09cd6cd139b4 Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Wed, 30 Nov 2022 21:03:38 +0800 Subject: [PATCH 018/301] * Update custom image request to handle error event (#2902) https://www.electronjs.org/docs/latest/api/client-request#event-error --- src/main/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/index.js b/src/main/index.js index c23a4f2f769e..01f754f2b869 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -258,6 +258,10 @@ function runApp() { }) }) + newRequest.on('error', (err) => { + console.error(err) + }) + newRequest.end() }) From 2cc811f0eefc522efefedccd364f0aceacbcf12e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Storoniak?= Date: Wed, 30 Nov 2022 18:38:56 +0000 Subject: [PATCH 019/301] Translated using Weblate (Polish) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/pl/ --- static/locales/pl.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/static/locales/pl.yaml b/static/locales/pl.yaml index fba6b9355bc4..192ba8a1e65e 100644 --- a/static/locales/pl.yaml +++ b/static/locales/pl.yaml @@ -212,6 +212,7 @@ Settings: Expand Side Bar by Default: Domyślnie rozwiń pasek boczny Disable Smooth Scrolling: Wyłącz płynne przewijanie Hide Side Bar Labels: Schowaj etykiety paska bocznego + Hide FreeTube Header Logo: Ukryj Logo FreeTube Player Settings: Player Settings: 'Ustawienia odtwarzacza' Force Local Backend for Legacy Formats: 'Wymuś lokalny back-end dla starych formatów' From 1ba88f2be97234bd5fdb2da5aac30fa2869abc1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20W=C3=B3jcicki?= Date: Wed, 30 Nov 2022 19:40:27 +0000 Subject: [PATCH 020/301] Translated using Weblate (Polish) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/pl/ --- static/locales/pl.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/locales/pl.yaml b/static/locales/pl.yaml index 192ba8a1e65e..c5b1bcce5d0e 100644 --- a/static/locales/pl.yaml +++ b/static/locales/pl.yaml @@ -212,7 +212,7 @@ Settings: Expand Side Bar by Default: Domyślnie rozwiń pasek boczny Disable Smooth Scrolling: Wyłącz płynne przewijanie Hide Side Bar Labels: Schowaj etykiety paska bocznego - Hide FreeTube Header Logo: Ukryj Logo FreeTube + Hide FreeTube Header Logo: Schowaj logo FreeTube z paska górnego Player Settings: Player Settings: 'Ustawienia odtwarzacza' Force Local Backend for Legacy Formats: 'Wymuś lokalny back-end dla starych formatów' @@ -445,7 +445,7 @@ Settings: Download in app: Pobierz w aplikacji Open in web browser: Otwórz w przeglądarce Parental Control Settings: - Parental Control Settings: Opcje kontroli rodzicielskiej + Parental Control Settings: Ustawienia kontroli rodzicielskiej Hide Unsubscribe Button: Schowaj przycisk „Odsubskrybuj” Show Family Friendly Only: Pokazuj tylko filmy przyjazne rodzinie Hide Search Bar: Schowaj pole wyszukiwania From c98b6ab3f27895cd81dd302f17ef5473e9691c58 Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Thu, 1 Dec 2022 08:46:33 +0100 Subject: [PATCH 021/301] Only show Select All context menu item in text fields (#2835) --- src/main/index.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/index.js b/src/main/index.js index 01f754f2b869..798bd83f43b2 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -21,6 +21,7 @@ function runApp() { showSearchWithGoogle: false, showSaveImageAs: true, showCopyImageAddress: true, + showSelectAll: false, prepend: (defaultActions, parameters, browserWindow) => [ { label: 'Show / Hide Video Statistics', @@ -36,6 +37,15 @@ function runApp() { click: () => { createWindow({ replaceMainWindow: false, windowStartupUrl: parameters.linkURL, showWindowNow: true }) } + }, + // Only show select all in text fields + { + label: 'Select All', + enabled: parameters.editFlags.canSelectAll, + visible: parameters.isEditable, + click: () => { + browserWindow.webContents.selectAll() + } } ] }) From d793a8bcda2f0d83a60ec9583b89e83e5896a48d Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Fri, 2 Dec 2022 08:29:01 +0100 Subject: [PATCH 022/301] Make replaceFilenameForbiddenChars a helper (#2904) * Make replaceFilenameForbiddenChars a helper * Use function for screenshot file name checking --- src/renderer/helpers/utils.js | 33 ++++++++++++++++ src/renderer/store/modules/utils.js | 60 ++++------------------------- 2 files changed, 40 insertions(+), 53 deletions(-) diff --git a/src/renderer/helpers/utils.js b/src/renderer/helpers/utils.js index dd37b1c380bf..9f1991c8f8eb 100644 --- a/src/renderer/helpers/utils.js +++ b/src/renderer/helpers/utils.js @@ -422,3 +422,36 @@ export function searchFiltersMatch(filtersA, filtersB) { filtersA?.type === filtersB?.type && filtersA?.duration === filtersB?.duration } + +export function replaceFilenameForbiddenChars(filenameOriginal) { + let filenameNew = filenameOriginal + let forbiddenChars = {} + switch (process.platform) { + case 'win32': + forbiddenChars = { + '<': '<', // U+FF1C + '>': '>', // U+FF1E + ':': ':', // U+FF1A + '"': '"', // U+FF02 + '/': '/', // U+FF0F + '\\': '\', // U+FF3C + '|': '|', // U+FF5C + '?': '?', // U+FF1F + '*': '*' // U+FF0A + } + break + case 'darwin': + forbiddenChars = { '/': '/', ':': ':' } + break + case 'linux': + forbiddenChars = { '/': '/' } + break + default: + break + } + + for (const forbiddenChar in forbiddenChars) { + filenameNew = filenameNew.replaceAll(forbiddenChar, forbiddenChars[forbiddenChar]) + } + return filenameNew +} diff --git a/src/renderer/store/modules/utils.js b/src/renderer/store/modules/utils.js index 43426a53d00b..54b5e3d03c27 100644 --- a/src/renderer/store/modules/utils.js +++ b/src/renderer/store/modules/utils.js @@ -6,6 +6,7 @@ import { IpcChannels } from '../../../constants' import { createWebURL, openExternalLink, + replaceFilenameForbiddenChars, searchFiltersMatch, showSaveDialog, showToast @@ -122,46 +123,13 @@ async function invokeIRC(context, IRCtype, webCbk, payload = null) { } const actions = { - replaceFilenameForbiddenChars(_, filenameOriginal) { - let filenameNew = filenameOriginal - let forbiddenChars = {} - switch (process.platform) { - case 'win32': - forbiddenChars = { - '<': '<', // U+FF1C - '>': '>', // U+FF1E - ':': ':', // U+FF1A - '"': '"', // U+FF02 - '/': '/', // U+FF0F - '\\': '\', // U+FF3C - '|': '|', // U+FF5C - '?': '?', // U+FF1F - '*': '*' // U+FF0A - } - break - case 'darwin': - forbiddenChars = { '/': '/', ':': ':' } - break - case 'linux': - forbiddenChars = { '/': '/' } - break - default: - break - } - - for (const forbiddenChar in forbiddenChars) { - filenameNew = filenameNew.replaceAll(forbiddenChar, forbiddenChars[forbiddenChar]) - } - return filenameNew - }, - - async downloadMedia({ rootState, dispatch }, { url, title, extension, fallingBackPath }) { + async downloadMedia({ rootState }, { url, title, extension, fallingBackPath }) { if (!process.env.IS_ELECTRON) { openExternalLink(url) return } - const fileName = `${await dispatch('replaceFilenameForbiddenChars', title)}.${extension}` + const fileName = `${replaceFilenameForbiddenChars(title)}.${extension}` const errorMessage = i18n.t('Downloading failed', { videoTitle: title }) let folderPath = rootState.settings.downloadFolderPath @@ -281,27 +249,13 @@ const actions = { parsedString = parsedString.replaceAll(key, value) } - const platform = process.platform - if (platform === 'win32') { - // https://www.boost.org/doc/libs/1_78_0/libs/filesystem/doc/portability_guide.htm - // https://stackoverflow.com/questions/1976007/ - const noForbiddenChars = ['<', '>', ':', '"', '/', '|', '?', '*'].every(char => { - return parsedString.indexOf(char) === -1 - }) - if (!noForbiddenChars) { - reject(new Error('Forbidden Characters')) // use message as translation key - } - } else if (platform === 'darwin') { - // https://superuser.com/questions/204287/ - if (parsedString.indexOf(':') !== -1) { - reject(new Error('Forbidden Characters')) - } + if (parsedString !== replaceFilenameForbiddenChars(parsedString)) { + reject(new Error('Forbidden Characters')) // use message as translation key } - const dirChar = platform === 'win32' ? '\\' : '/' let filename - if (parsedString.indexOf(dirChar) !== -1) { - const lastIndex = parsedString.lastIndexOf(dirChar) + if (parsedString.indexOf(path.sep) !== -1) { + const lastIndex = parsedString.lastIndexOf(path.sep) filename = parsedString.substring(lastIndex + 1) } else { filename = parsedString From c1f257dd79c38cf1ff44f039e6d9c8e6ce81571f Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Fri, 2 Dec 2022 08:30:27 +0100 Subject: [PATCH 023/301] Clear cached subscription videos when removing all subscriptions (#2905) --- .../components/privacy-settings/privacy-settings.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/privacy-settings/privacy-settings.js b/src/renderer/components/privacy-settings/privacy-settings.js index 4974944a2576..74046499c6bc 100644 --- a/src/renderer/components/privacy-settings/privacy-settings.js +++ b/src/renderer/components/privacy-settings/privacy-settings.js @@ -106,6 +106,13 @@ export default Vue.extend({ this.removeProfile(profile._id) } }) + + this.updateAllSubscriptionsList([]) + this.updateProfileSubscriptions({ + activeProfile: MAIN_PROFILE_ID, + videoList: [], + errorChannels: [] + }) } }, @@ -117,7 +124,9 @@ export default Vue.extend({ 'clearSessionSearchHistory', 'updateProfile', 'removeProfile', - 'updateActiveProfile' + 'updateActiveProfile', + 'updateAllSubscriptionsList', + 'updateProfileSubscriptions' ]) } }) From 4af752d2dceddcc02e3e662473d25507c0e4683c Mon Sep 17 00:00:00 2001 From: Kyotaro Iijima Date: Fri, 2 Dec 2022 17:36:11 +0000 Subject: [PATCH 024/301] Translated using Weblate (Japanese) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/ja/ --- static/locales/ja.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/static/locales/ja.yaml b/static/locales/ja.yaml index f46a7d8b160a..9c8071348af0 100644 --- a/static/locales/ja.yaml +++ b/static/locales/ja.yaml @@ -197,6 +197,7 @@ Settings: Expand Side Bar by Default: 幅広のサイド バーで起動 Disable Smooth Scrolling: スムーズ スクロールの無効化 Hide Side Bar Labels: サイドバー ラベルの非表示 + Hide FreeTube Header Logo: FreeTube ヘッダー ロゴの非表示 Player Settings: Player Settings: 'プレイヤーの設定' Force Local Backend for Legacy Formats: '旧形式であれば内部 API の適用' From 7ac37dc0309abdb1294f174ba02e39977474ff4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9A=D0=BE=D1=82=D0=BB?= =?UTF-8?q?=D1=83=D0=B1=D0=B0=D0=B9?= Date: Sat, 3 Dec 2022 17:45:24 +0000 Subject: [PATCH 025/301] Translated using Weblate (Russian) Currently translated at 99.8% (638 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/ru/ --- static/locales/ru.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/locales/ru.yaml b/static/locales/ru.yaml index 8ae518d2426d..8d353acc07c0 100644 --- a/static/locales/ru.yaml +++ b/static/locales/ru.yaml @@ -316,7 +316,7 @@ Settings: Are you sure you want to clear out your search cache?: Выполнить очистку кэша поиска? Clear Search Cache: Очистить кэш поиска - Save Watched Progress: Сохранять прогресс просмотра + Save Watched Progress: Сохранять ход просмотра Remember History: Запоминать историю Privacy Settings: Конфиденциальность Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: Выполнить From 91b81850ffbcf58742c33e5ddba4a27ee04fe055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9A=D0=BE=D1=82=D0=BB?= =?UTF-8?q?=D1=83=D0=B1=D0=B0=D0=B9?= Date: Sat, 3 Dec 2022 22:19:09 +0000 Subject: [PATCH 026/301] Translated using Weblate (Russian) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/ru/ --- static/locales/ru.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/static/locales/ru.yaml b/static/locales/ru.yaml index 8d353acc07c0..4f3b741f6df0 100644 --- a/static/locales/ru.yaml +++ b/static/locales/ru.yaml @@ -209,6 +209,7 @@ Settings: Expand Side Bar by Default: Расширить боковую панель Disable Smooth Scrolling: Отключить плавную прокрутку Hide Side Bar Labels: Скрыть надписи боковой панели + Hide FreeTube Header Logo: Скрыть логотип заголовка FreeTube Player Settings: Player Settings: 'Настройки проигрывателя' Force Local Backend for Legacy Formats: 'Принудительно использовать локальный From cabe6ddf651007cb53133e21b79f24798dc5300c Mon Sep 17 00:00:00 2001 From: Rusi Dimitrov Date: Sat, 3 Dec 2022 22:06:30 +0000 Subject: [PATCH 027/301] Translated using Weblate (Bulgarian) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/bg/ --- static/locales/bg.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/static/locales/bg.yaml b/static/locales/bg.yaml index e2616f69cc17..8e59ddc43bb0 100644 --- a/static/locales/bg.yaml +++ b/static/locales/bg.yaml @@ -218,6 +218,7 @@ Settings: Disable Smooth Scrolling: Изключване на плавното превъртане Expand Side Bar by Default: Разширяване на страничната лента по подразбиране Hide Side Bar Labels: Скриване етикетите на страничната лента + Hide FreeTube Header Logo: Скриване логото на FreeTube Player Settings: Player Settings: 'Настройки на плейъра' Force Local Backend for Legacy Formats: 'Принудително връщане към локалния интерфейс @@ -273,6 +274,7 @@ Settings: също така да използвате "\" или "/", за създаване на подпапки. Format Label: Формат Folder Button: Избор на папка + Enter Fullscreen on Display Rotate: Режим на цял екран при завъртане на дисплея Privacy Settings: Privacy Settings: 'Настройки за поверителност' Remember History: 'Запазване на историята' @@ -388,6 +390,7 @@ Settings: Hide Sharing Actions: Скриване на действията за споделяне Hide Live Streams: Скриване на предавания на живо Hide Chapters: Скриване на главите + Hide Upcoming Premieres: Скриване на предстоящите премиери The app needs to restart for changes to take effect. Restart and apply change?: Приложението трябва да се рестартира за да се приложат промените. Рестартиране? Proxy Settings: @@ -768,6 +771,7 @@ Share: YouTube Embed URL copied to clipboard: 'YouTube адресът за вграждане е копиран' YouTube Channel URL copied to clipboard: YouTube адресът на канала е копиран Invidious Channel URL copied to clipboard: Invidious адресът на канала е копиран + Share Channel: Споделяне на канал Mini Player: 'Мини плейър' Comments: Comments: 'Коментари' From a433c04037af125b7c780a48c0b8f212799dfe79 Mon Sep 17 00:00:00 2001 From: Simon Epstein Date: Sun, 4 Dec 2022 11:43:04 +0000 Subject: [PATCH 028/301] Hide unsubscribe button on channel list if this is set in parental controls. (#2906) * Hide unsubscribe button on channel list if this is set in parental controls. * Fix github linting errors * Removed trailing whitespace. * Reverted yarn.lock change * Remove package-lock.json Co-authored-by: Simon Epstein --- src/renderer/views/SubscribedChannels/SubscribedChannels.js | 4 ++++ src/renderer/views/SubscribedChannels/SubscribedChannels.vue | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/renderer/views/SubscribedChannels/SubscribedChannels.js b/src/renderer/views/SubscribedChannels/SubscribedChannels.js index fff25c01f389..18ec467664b9 100644 --- a/src/renderer/views/SubscribedChannels/SubscribedChannels.js +++ b/src/renderer/views/SubscribedChannels/SubscribedChannels.js @@ -60,6 +60,10 @@ export default Vue.extend({ } }, + hideUnsubscribeButton: function() { + return this.$store.getters.getHideUnsubscribeButton + }, + locale: function () { return this.$i18n.locale.replace('_', '-') }, diff --git a/src/renderer/views/SubscribedChannels/SubscribedChannels.vue b/src/renderer/views/SubscribedChannels/SubscribedChannels.vue index 28189fbafa06..e61b70f087fa 100644 --- a/src/renderer/views/SubscribedChannels/SubscribedChannels.vue +++ b/src/renderer/views/SubscribedChannels/SubscribedChannels.vue @@ -44,7 +44,10 @@ > {{ channel.name }} -
+
Date: Sun, 4 Dec 2022 11:55:34 +0000 Subject: [PATCH 029/301] Translated using Weblate (Lithuanian) Currently translated at 100.0% (639 of 639 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/lt/ --- static/locales/lt.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/locales/lt.yaml b/static/locales/lt.yaml index f19adbec9997..02f891954b2c 100644 --- a/static/locales/lt.yaml +++ b/static/locales/lt.yaml @@ -556,7 +556,7 @@ Video: Play Previous Video: 'Groti ankstesnį vaizdo įrašą' # Context is "X People Watching" Watching: 'Žiūri' - Watched: 'Žiūrėjo' + Watched: 'Žiūrėta' Autoplay: 'Paleisti automatiškai' Starting soon, please refresh the page to check again: 'Greitai prasidės, atnaujinkite puslapį, kad galėtumėte patikrinti dar kartą' From 3d0157da75e62d03c0fd51bcb4e9bcfc1671379f Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Mon, 5 Dec 2022 08:42:40 +0100 Subject: [PATCH 030/301] Make more UI elements middle clickable (#2911) --- .../components/playlist-info/playlist-info.js | 4 -- .../playlist-info/playlist-info.sass | 5 +- .../playlist-info/playlist-info.vue | 6 +- .../side-nav-more-options.js | 2 +- src/renderer/components/side-nav/side-nav.css | 3 +- src/renderer/components/side-nav/side-nav.js | 5 -- src/renderer/components/side-nav/side-nav.vue | 67 +++++++------------ 7 files changed, 32 insertions(+), 60 deletions(-) diff --git a/src/renderer/components/playlist-info/playlist-info.js b/src/renderer/components/playlist-info/playlist-info.js index 30f3e4da8d5e..a96819326478 100644 --- a/src/renderer/components/playlist-info/playlist-info.js +++ b/src/renderer/components/playlist-info/playlist-info.js @@ -135,10 +135,6 @@ export default Vue.extend({ query: playlistInfo } ) - }, - - goToChannel: function () { - this.$router.push({ path: `/channel/${this.channelId}` }) } } }) diff --git a/src/renderer/components/playlist-info/playlist-info.sass b/src/renderer/components/playlist-info/playlist-info.sass index 5e359934e942..bb382ccc9035 100644 --- a/src/renderer/components/playlist-info/playlist-info.sass +++ b/src/renderer/components/playlist-info/playlist-info.sass @@ -31,9 +31,8 @@ align-items: center gap: 8px height: 40px - - /* Indicates the box can be clicked to navigate */ - cursor: pointer + text-decoration: none + color: inherit .channelThumbnail width: 40px diff --git a/src/renderer/components/playlist-info/playlist-info.vue b/src/renderer/components/playlist-info/playlist-info.vue index b3361cd03088..fbe4d0fda9b4 100644 --- a/src/renderer/components/playlist-info/playlist-info.vue +++ b/src/renderer/components/playlist-info/playlist-info.vue @@ -29,9 +29,9 @@
-
{{ channelName }} -
+
diff --git a/src/renderer/components/side-nav-more-options/side-nav-more-options.js b/src/renderer/components/side-nav-more-options/side-nav-more-options.js index 385a4c8f1ea6..e9f7fa02df29 100644 --- a/src/renderer/components/side-nav-more-options/side-nav-more-options.js +++ b/src/renderer/components/side-nav-more-options/side-nav-more-options.js @@ -32,7 +32,7 @@ export default Vue.extend({ methods: { navigate: function (route) { this.openMoreOptions = false - this.$emit('navigate', route) + this.$router.push('/' + route) } } }) diff --git a/src/renderer/components/side-nav/side-nav.css b/src/renderer/components/side-nav/side-nav.css index 8ff29f6c61ad..d5d32ef60c0c 100644 --- a/src/renderer/components/side-nav/side-nav.css +++ b/src/renderer/components/side-nav/side-nav.css @@ -40,7 +40,6 @@ .navOption, .navChannel { position: relative; padding: 5px; - cursor: pointer; min-height: 35px; } @@ -88,7 +87,7 @@ transform: translateY(-50%); } -.channelLink { +.navOption, .channelLink { display: block; color: inherit; text-decoration: inherit; diff --git a/src/renderer/components/side-nav/side-nav.js b/src/renderer/components/side-nav/side-nav.js index 84cd4727abdc..7c7be13ef65c 100644 --- a/src/renderer/components/side-nav/side-nav.js +++ b/src/renderer/components/side-nav/side-nav.js @@ -75,10 +75,5 @@ export default Vue.extend({ hiddenLabels: this.hideText } } - }, - methods: { - navigate: function (route) { - this.$router.push('/' + route) - } } }) diff --git a/src/renderer/components/side-nav/side-nav.vue b/src/renderer/components/side-nav/side-nav.vue index f5380154710c..f3e256c06c89 100644 --- a/src/renderer/components/side-nav/side-nav.vue +++ b/src/renderer/components/side-nav/side-nav.vue @@ -8,12 +8,11 @@ class="inner" :class="applyHiddenLabels" > -