From 63df75520a24b122af65da0b961c257e5a840a0f Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Tue, 26 Sep 2023 10:00:06 +0000 Subject: [PATCH 01/15] Translated using Weblate (Croatian) Currently translated at 99.8% (721 of 722 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/hr/ --- static/locales/hr.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/static/locales/hr.yaml b/static/locales/hr.yaml index 61aed5d7d8633..3f1b04b1a5332 100644 --- a/static/locales/hr.yaml +++ b/static/locales/hr.yaml @@ -101,6 +101,7 @@ Subscriptions: Subscriptions Tabs: Kartica pretplata All Subscription Tabs Hidden: Sve kartice pretplate su skrivene. Za prikaz sadržaja na ovom mjestu, sakrij neke kartice u odjeljku „{subsection}” u „{settingsSection}”. + Empty Posts: Kanali na koje si pretplaćen/a trenutačno nemaju objave. Trending: Trending: 'U trendu' Trending Tabs: Kartice „U trendu” From 1d0607648cf3c91a2da63ffe78126c2bc152e4c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 26 Sep 2023 08:31:18 +0000 Subject: [PATCH 02/15] Translated using Weblate (Estonian) Currently translated at 100.0% (722 of 722 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/et/ --- static/locales/et.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/static/locales/et.yaml b/static/locales/et.yaml index 89230e769bfba..43280b059a021 100644 --- a/static/locales/et.yaml +++ b/static/locales/et.yaml @@ -106,6 +106,8 @@ Subscriptions: Subscriptions Tabs: Tellimuste vahekaardid All Subscription Tabs Hidden: Kõik tellimuse vahekaardid on peidetud. Siinse sisu nägemiseks palun eemalda kaartide peitmine jaotises „{subsection}“ / „{settingsSection}“. + Load More Posts: Lisa järgmised postitused + Empty Posts: Sinu tellitud kanalites hetkel pole ühtegi postitust. Trending: Trending: 'Populaarsust koguvad videod' Trending Tabs: Populaarsust koguvad kaardid @@ -408,6 +410,7 @@ Settings: Hide Subscriptions Live: Peida tellimuste otse-eetrid Hide Profile Pictures in Comments: Peida kommentaaride profiilipildid Blur Thumbnails: Hägusta pisipildid + Hide Subscriptions Community: Peida tellijate loend Proxy Settings: Error getting network information. Is your proxy configured properly?: Võrguteavet ei õnnestu leida. Kas sa oled puhverserveri ikka korralikult seadistanud? From d0b37d9ce7fea365f8bf4d1a55cf9c7b3691dde5 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Tue, 26 Sep 2023 10:00:32 +0000 Subject: [PATCH 03/15] Translated using Weblate (Croatian) Currently translated at 100.0% (722 of 722 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/hr/ --- static/locales/hr.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/static/locales/hr.yaml b/static/locales/hr.yaml index 3f1b04b1a5332..e38947daf943a 100644 --- a/static/locales/hr.yaml +++ b/static/locales/hr.yaml @@ -102,6 +102,7 @@ Subscriptions: All Subscription Tabs Hidden: Sve kartice pretplate su skrivene. Za prikaz sadržaja na ovom mjestu, sakrij neke kartice u odjeljku „{subsection}” u „{settingsSection}”. Empty Posts: Kanali na koje si pretplaćen/a trenutačno nemaju objave. + Load More Posts: Učitaj još objava Trending: Trending: 'U trendu' Trending Tabs: Kartice „U trendu” @@ -432,11 +433,12 @@ Settings: Subscriptions Page: Stranica pretplata Hide Channel Podcasts: Sakrij kanal podcastova Hide Channel Releases: Sakrij kanal izdanja - Hide Subscriptions Shorts: Sakrij kratka videa pretplate - Hide Subscriptions Live: Sakrij videa uživo pretplate - Hide Subscriptions Videos: Sakrij videa pretplate + Hide Subscriptions Shorts: Sakrij pretplate kratkih videa + Hide Subscriptions Live: Sakrij pretplate videa uživo + Hide Subscriptions Videos: Sakrij pretplate videa Blur Thumbnails: Zamuti minijature Hide Profile Pictures in Comments: Sakrij slike profila u komentarima + Hide Subscriptions Community: Sakrij pretplate zajednice The app needs to restart for changes to take effect. Restart and apply change?: Promjene će se primijeniti nakon ponovnog pokeretanja programa. Ponovo pokrenuti program? Proxy Settings: From 1c0149f57793c3ee1bac13d944cb87aae68c54f9 Mon Sep 17 00:00:00 2001 From: Kyotaro Iijima Date: Tue, 26 Sep 2023 15:03:05 +0000 Subject: [PATCH 04/15] Translated using Weblate (Japanese) Currently translated at 100.0% (722 of 722 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/ja/ --- static/locales/ja.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/static/locales/ja.yaml b/static/locales/ja.yaml index 0ce15c2505aca..bfd3cd8de68b0 100644 --- a/static/locales/ja.yaml +++ b/static/locales/ja.yaml @@ -96,6 +96,8 @@ Subscriptions: Subscriptions Tabs: 登録チャンネル タブ All Subscription Tabs Hidden: 全ての登録チャンネル タブが非表示になっています。こちらのコンテンツをご覧いただくには、"{settingsSection}" 内の "{subsection}" 項目でいくつかのタブの非表示を解除してください。 + Load More Posts: もっと見る + Empty Posts: 現在、登録しているチャンネルには動画はありません。 Trending: Trending: '急上昇' Trending Tabs: 急上昇のタブ @@ -404,6 +406,7 @@ Settings: Hide Channel Releases: チャンネルの新着情報の非表示 Hide Profile Pictures in Comments: コメントでプロフィール写真を隠す Blur Thumbnails: サムネイルをぼかす + Hide Subscriptions Community: チャンネルの購読者リストの非公開 The app needs to restart for changes to take effect. Restart and apply change?: 変更の反映には、アプリの再起動が必要です。再起動して変更を適用しますか? Proxy Settings: Error getting network information. Is your proxy configured properly?: ネットワーク情報の取得中にエラーが発生しました。プロキシーを正しく設定してますか? From 277944964f7456ce29eb175ef2656f8472ae01e4 Mon Sep 17 00:00:00 2001 From: EditaNEmilis Date: Wed, 27 Sep 2023 12:38:14 +0000 Subject: [PATCH 05/15] Translated using Weblate (Lithuanian) Currently translated at 90.7% (655 of 722 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/lt/ --- static/locales/lt.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/static/locales/lt.yaml b/static/locales/lt.yaml index e7a5c315c57c4..ab3fab325f73b 100644 --- a/static/locales/lt.yaml +++ b/static/locales/lt.yaml @@ -37,6 +37,7 @@ Global: Live: Tiesiogiai Shorts: Šortai + Community: Bendruomenė Version {versionNumber} is now available! Click for more details: 'Versija {versionNumber} jau prieinama! Spustelėkite, jei norite gauti daugiau informacijos' Download From Site: 'Atsisiųsti iš svetainės' From 3dcf53584159c2882584ed379d69e38cf236ef50 Mon Sep 17 00:00:00 2001 From: Philip Goto Date: Thu, 28 Sep 2023 11:53:24 +0000 Subject: [PATCH 06/15] Translated using Weblate (Dutch) Currently translated at 99.5% (719 of 722 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/nl/ --- static/locales/nl.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/static/locales/nl.yaml b/static/locales/nl.yaml index 32806e874599d..4aaf1a19e607a 100644 --- a/static/locales/nl.yaml +++ b/static/locales/nl.yaml @@ -44,6 +44,7 @@ Global: View Count: 1 weergave | {count} weergaven Watching Count: 1 aan het kijken | {count} aan het kijken Channel Count: 1 kanaal | {count} kanalen + Community: Gemeenschap Search / Go to URL: 'Zoeken / Ga naar URL' # In Filter Button Search Filters: @@ -102,6 +103,8 @@ Subscriptions: All Subscription Tabs Hidden: Alle abonnementstabbladen zijn verborgen. Om de inhoud hier te zien moet u enkele tabbladen zichtbaar maken in de sectie ‘{subsection}’ onder ‘{settingsSection}’. + Load More Posts: Meer berichten laden + Empty Posts: De kanalen waarop u geabonneerd bent hebben momenteel geen berichten. Trending: Trending: 'Trending' Trending Tabs: Tending-tabbladen @@ -435,6 +438,7 @@ Settings: Hide Channel Shorts: Kanaal-Shorts verbergen Hide Subscriptions Shorts: Abonnement-Shorts verbergen Hide Profile Pictures in Comments: Profielfoto's in opmerkingen verbergen + Hide Subscriptions Community: Abonnement­gemeenschappen verbergen The app needs to restart for changes to take effect. Restart and apply change?: De app moet opnieuw worden gestart om veranderingen aan te brengen. Wilt u de app opnieuw starten en veranderingen toepassen? From c936a0ea5e7df1409e9f28c51122d349bdf87762 Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Sat, 30 Sep 2023 01:16:00 +0800 Subject: [PATCH 07/15] Update FT history import to accept key lastViewedPlaylistId (#4038) * * Update FT history import to accept key `lastViewedPlaylistId` Also update the strange required key check logic Which was last changed by 58882b3e169f5865497a8c97f42900d2c4f0477c * * Remove unused video property `paid` --- .../components/data-settings/data-settings.js | 30 ++++++++++++------- .../components/ft-list-video/ft-list-video.js | 4 +-- .../watch-video-info/watch-video-info.js | 3 +- src/renderer/views/Watch/Watch.js | 3 +- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/renderer/components/data-settings/data-settings.js b/src/renderer/components/data-settings/data-settings.js index a46d54afa87ab..51ebde0359d80 100644 --- a/src/renderer/components/data-settings/data-settings.js +++ b/src/renderer/components/data-settings/data-settings.js @@ -698,20 +698,28 @@ export default defineComponent({ textDecode.pop() const requiredKeys = [ - '_id', 'author', 'authorId', 'description', 'isLive', 'lengthSeconds', - 'paid', 'published', 'timeWatched', 'title', 'type', 'videoId', 'viewCount', - 'watchProgress' + 'watchProgress', + ] + + const optionalKeys = [ + // `_id` absent if marked as watched manually + '_id', + 'lastViewedPlaylistId', + ] + + const ignoredKeys = [ + 'paid', ] textDecode.forEach((history) => { @@ -723,15 +731,19 @@ export default defineComponent({ const historyObject = {} Object.keys(historyData).forEach((key) => { - if (!requiredKeys.includes(key)) { - showToast(`Unknown data key: ${key}`) - } else { + if (requiredKeys.includes(key) || optionalKeys.includes(key)) { historyObject[key] = historyData[key] + } else if (!ignoredKeys.includes(key)) { + showToast(`Unknown data key: ${key}`) } + // Else do not import the key }) - if (Object.keys(historyObject).length < (requiredKeys.length - 2)) { + const historyObjectKeysSet = new Set(Object.keys(historyObject)) + const missingKeys = requiredKeys.filter(x => !historyObjectKeysSet.has(x)) + if (missingKeys.length > 0) { showToast(this.$t('Settings.Data Settings.History object has insufficient data, skipping item')) + console.error('Missing Keys: ', missingKeys, historyData) } else { this.updateHistory(historyObject) } @@ -815,7 +827,6 @@ export default defineComponent({ historyObject.lengthSeconds = null historyObject.watchProgress = 1 historyObject.isLive = false - historyObject.paid = false this.updateHistory(historyObject) } @@ -889,8 +900,7 @@ export default defineComponent({ 'lengthSeconds', 'timeAdded', 'isLive', - 'paid', - 'type' + 'type', ] playlists.forEach(async (playlistData) => { diff --git a/src/renderer/components/ft-list-video/ft-list-video.js b/src/renderer/components/ft-list-video/ft-list-video.js index 96c8f247b0c34..9c5e399afe299 100644 --- a/src/renderer/components/ft-list-video/ft-list-video.js +++ b/src/renderer/components/ft-list-video/ft-list-video.js @@ -568,7 +568,6 @@ export default defineComponent({ watchProgress: 0, timeWatched: new Date().getTime(), isLive: false, - paid: false, type: 'video' } this.updateHistory(videoData) @@ -598,8 +597,7 @@ export default defineComponent({ lengthSeconds: this.data.lengthSeconds, timeAdded: new Date().getTime(), isLive: false, - paid: false, - type: 'video' + type: 'video', } const payload = { diff --git a/src/renderer/components/watch-video-info/watch-video-info.js b/src/renderer/components/watch-video-info/watch-video-info.js index 75f2e448d8d43..1798fb01c4ec4 100644 --- a/src/renderer/components/watch-video-info/watch-video-info.js +++ b/src/renderer/components/watch-video-info/watch-video-info.js @@ -318,8 +318,7 @@ export default defineComponent({ lengthSeconds: this.lengthSeconds, timeAdded: new Date().getTime(), isLive: false, - paid: false, - type: 'video' + type: 'video', } const payload = { diff --git a/src/renderer/views/Watch/Watch.js b/src/renderer/views/Watch/Watch.js index 4799f5188f97e..a07f748bf58b8 100644 --- a/src/renderer/views/Watch/Watch.js +++ b/src/renderer/views/Watch/Watch.js @@ -1027,8 +1027,7 @@ export default defineComponent({ watchProgress: watchProgress, timeWatched: new Date().getTime(), isLive: false, - paid: false, - type: 'video' + type: 'video', } this.updateHistory(videoData) From 7fdaae303baf907e2f8d1dc7ee3195113ca9ac10 Mon Sep 17 00:00:00 2001 From: Rusi Dimitrov Date: Sun, 1 Oct 2023 10:16:44 +0000 Subject: [PATCH 08/15] Translated using Weblate (Bulgarian) Currently translated at 100.0% (722 of 722 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/bg/ --- static/locales/bg.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/static/locales/bg.yaml b/static/locales/bg.yaml index 59c60d8f51058..b056eb0d2a185 100644 --- a/static/locales/bg.yaml +++ b/static/locales/bg.yaml @@ -108,6 +108,8 @@ Subscriptions: All Subscription Tabs Hidden: Всички раздели на абонамента са скрити. За да виждате съдържанието тук, моля, премахнете скриването на някои раздели в секция "{subsection}" на "{settingsSection}". + Load More Posts: Зареждане на още публикации + Empty Posts: В момента в абонираните от вас канали няма публикации. Trending: Trending: 'Набиращи популярност' Trending Tabs: Раздели за набиращи популярност @@ -441,6 +443,7 @@ Settings: Hide Channel Podcasts: Скриване на подкастите на канала Blur Thumbnails: Размазване на миниатюрите Hide Profile Pictures in Comments: Скриване на профилните снимки в коментарите + Hide Subscriptions Community: Скриване на абонаментите Общност The app needs to restart for changes to take effect. Restart and apply change?: Приложението трябва да се рестартира за да се приложат промените. Рестартиране? Proxy Settings: From 3024f95c66d61095f4783271b647e345a9406973 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 08:52:45 -0400 Subject: [PATCH 09/15] Bump electron from 22.3.24 to 22.3.25 (#4089) Bumps [electron](https://github.com/electron/electron) from 22.3.24 to 22.3.25. - [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/v22.3.24...v22.3.25) --- updated-dependencies: - dependency-name: electron dependency-type: direct:development update-type: version-update:semver-patch ... 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 48f8e92492e42..c53c9839a954f 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.8.1", "css-minimizer-webpack-plugin": "^5.0.1", - "electron": "^22.3.24", + "electron": "^22.3.25", "electron-builder": "^24.6.4", "eslint": "^8.50.0", "eslint-config-prettier": "^9.0.0", diff --git a/yarn.lock b/yarn.lock index 64d0a71109b01..02d22d9ed1113 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3448,10 +3448,10 @@ electron-to-chromium@^1.4.431: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz#774dc7cb5e58576d0125939ec34a4182f3ccc87d" integrity sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ== -electron@^22.3.24: - version "22.3.24" - resolved "https://registry.yarnpkg.com/electron/-/electron-22.3.24.tgz#14479cf11cf4709f78d324015429fa82492c2150" - integrity sha512-wnGsShoRVk1Jmgr7h/jZK9bI5UwMF88sdQ5c8z2j2N8B9elhF/jKDFjwDXUrY1Y0xzAskOP0tYIDE+UbUM4byQ== +electron@^22.3.25: + version "22.3.25" + resolved "https://registry.yarnpkg.com/electron/-/electron-22.3.25.tgz#a9a70b63a6712c658cd7fab343129b2a78450f80" + integrity sha512-AjrP7bebMs/IPsgmyowptbA7jycTkrJC7jLZTb5JoH30PkBC6pZx/7XQ0aDok82SsmSiF4UJDOg+HoLrEBiqmg== dependencies: "@electron/get" "^2.0.0" "@types/node" "^16.11.26" From bb0e26f2c34bfbcb0e30a811521201ac1d92d8da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 08:54:13 -0400 Subject: [PATCH 10/15] Bump the stylelint group with 2 updates (#4088) Bumps the stylelint group with 2 updates: [postcss](https://github.com/postcss/postcss) and [postcss-scss](https://github.com/postcss/postcss-scss). Updates `postcss` from 8.4.30 to 8.4.31 - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.30...8.4.31) Updates `postcss-scss` from 4.0.8 to 4.0.9 - [Changelog](https://github.com/postcss/postcss-scss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss-scss/compare/4.0.8...4.0.9) --- updated-dependencies: - dependency-name: postcss dependency-type: direct:development update-type: version-update:semver-patch dependency-group: stylelint - dependency-name: postcss-scss dependency-type: direct:development update-type: version-update:semver-patch dependency-group: stylelint ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index c53c9839a954f..471402d66a2f6 100644 --- a/package.json +++ b/package.json @@ -110,8 +110,8 @@ "lefthook": "^1.5.0", "mini-css-extract-plugin": "^2.7.6", "npm-run-all": "^4.1.5", - "postcss": "^8.4.30", - "postcss-scss": "^4.0.8", + "postcss": "^8.4.31", + "postcss-scss": "^4.0.9", "prettier": "^2.8.8", "rimraf": "^5.0.1", "sass": "^1.68.0", diff --git a/yarn.lock b/yarn.lock index 02d22d9ed1113..707d9e33e00a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6734,10 +6734,10 @@ postcss-safe-parser@^6.0.0: resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== -postcss-scss@^4.0.6, postcss-scss@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.8.tgz#12a4991a902a782d4e9b86b1f217d5181c6c4f32" - integrity sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA== +postcss-scss@^4.0.6, postcss-scss@^4.0.9: + version "4.0.9" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" + integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.13, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: version "6.0.13" @@ -6775,10 +6775,10 @@ postcss@^7.0.36: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.4.14, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.27, postcss@^8.4.30: - version "8.4.30" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7" - integrity sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g== +postcss@^8.4.14, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.27, postcss@^8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" From 52f87b47ee1166c512c728ac0048b9180fbcb5f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 13:16:21 -0400 Subject: [PATCH 11/15] Bump rimraf from 5.0.1 to 5.0.5 (#4091) Bumps [rimraf](https://github.com/isaacs/rimraf) from 5.0.1 to 5.0.5. - [Changelog](https://github.com/isaacs/rimraf/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/rimraf/compare/v5.0.1...v5.0.5) --- updated-dependencies: - dependency-name: rimraf dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 60 ++++++++++++++++++++++++++-------------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index 471402d66a2f6..8c58477aefd0e 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "postcss": "^8.4.31", "postcss-scss": "^4.0.9", "prettier": "^2.8.8", - "rimraf": "^5.0.1", + "rimraf": "^5.0.5", "sass": "^1.68.0", "sass-loader": "^13.3.2", "stylelint": "^15.10.3", diff --git a/yarn.lock b/yarn.lock index 707d9e33e00a4..55bc657b51f0d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4459,16 +4459,16 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^10.2.5: - version "10.2.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.2.6.tgz#1e27edbb3bbac055cb97113e27a066c100a4e5e1" - integrity sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA== +glob@^10.3.7: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: foreground-child "^3.1.0" - jackspeak "^2.0.3" + jackspeak "^2.3.5" minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2" - path-scurry "^1.7.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" glob@^7.1.3, glob@^7.1.6: version "7.2.3" @@ -5293,10 +5293,10 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -jackspeak@^2.0.3: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" - integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -5707,10 +5707,10 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.1.tgz#c58a93de58630b688de39ad04ef02ef26f1902f1" - integrity sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A== +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== m3u8-parser@4.8.0: version "4.8.0" @@ -5941,10 +5941,10 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" - integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== minizlib@^2.1.1: version "2.1.2" @@ -6407,13 +6407,13 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.7.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63" - integrity sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== dependencies: - lru-cache "^9.1.1" - minipass "^5.0.0 || ^6.0.2" + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-to-regexp@0.1.7: version "0.1.7" @@ -7243,12 +7243,12 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.1.tgz#0881323ab94ad45fec7c0221f27ea1a142f3f0d0" - integrity sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg== +rimraf@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" + integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== dependencies: - glob "^10.2.5" + glob "^10.3.7" roarr@^2.15.3: version "2.15.4" From 4398530ec93d3bb85134243fdad4f5744de88cbf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 20:50:56 +0200 Subject: [PATCH 12/15] Bump youtubei.js from 6.4.0 to 6.4.1 (#4090) Bumps [youtubei.js](https://github.com/LuanRT/YouTube.js) from 6.4.0 to 6.4.1. - [Release notes](https://github.com/LuanRT/YouTube.js/releases) - [Changelog](https://github.com/LuanRT/YouTube.js/blob/main/CHANGELOG.md) - [Commits](https://github.com/LuanRT/YouTube.js/compare/v6.4.0...v6.4.1) --- updated-dependencies: - dependency-name: youtubei.js dependency-type: direct:production update-type: version-update:semver-patch ... 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 8c58477aefd0e..c663badcc6e6a 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "vue-router": "^3.6.5", "vue-tiny-slider": "^0.1.39", "vuex": "^3.6.2", - "youtubei.js": "^6.4.0" + "youtubei.js": "^6.4.1" }, "devDependencies": { "@babel/core": "^7.23.0", diff --git a/yarn.lock b/yarn.lock index 55bc657b51f0d..f82875a64374f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8918,10 +8918,10 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -youtubei.js@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/youtubei.js/-/youtubei.js-6.4.0.tgz#8e18f8a87f5315391cf1722e15510d0a3a6b4b0b" - integrity sha512-c3Hj+9JmMchVWusVOubHDNrvKybzai1vWzZsVIZ9oxt74W0zaP78S0pPW21i/RnVBx29rAA2+ojs56b/REP/1A== +youtubei.js@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/youtubei.js/-/youtubei.js-6.4.1.tgz#d7a7c83cd7ddf8fedbaf3d2ab8a36840e233adf4" + integrity sha512-GVrDkJmF5t378SeDiZPEAoegZ1pxjbEzNyXTuiQnL5LzPSZKA3IoJwL8lBNlRMKyksI5RbieoHzULsEt4AIbFw== dependencies: jintr "^1.1.0" tslib "^2.5.0" From 560dcf6f683056f2d699066ac98e780f62f16471 Mon Sep 17 00:00:00 2001 From: NEXI Date: Tue, 3 Oct 2023 22:52:30 +0000 Subject: [PATCH 13/15] Translated using Weblate (Serbian) Currently translated at 100.0% (722 of 722 strings) Translation: FreeTube/Translations Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/sr/ --- static/locales/sr.yaml | 1024 ++++++++++++++++++++++++++++++---------- 1 file changed, 778 insertions(+), 246 deletions(-) diff --git a/static/locales/sr.yaml b/static/locales/sr.yaml index 97e6bc3be2f45..8fd14adb17afa 100644 --- a/static/locales/sr.yaml +++ b/static/locales/sr.yaml @@ -6,25 +6,25 @@ FreeTube: 'FreeTube' Овај део апликације још није спреман. Вратите се касније када буде постигнут напредак. # Webkit Menu Bar -File: 'Датотека' -Quit: 'Затвори' -Edit: 'Промени' +File: 'Фајл' +Quit: 'Напусти' +Edit: 'Измени' Undo: 'Поништи' Redo: 'Обнови' Cut: 'Исеци' Copy: 'Копирај' -Paste: 'Прилепи' +Paste: 'Налепи' Delete: 'Избриши' -Select all: 'Све одабрати' +Select all: 'Изабери све' Reload: 'Освежи' -Force Reload: 'Натерај освежавање' -Toggle Developer Tools: 'Укључите/искључите алате за програмере' -Actual size: 'Тренутна величина' -Zoom in: 'Повећај' -Zoom out: 'Смањи' -Toggle fullscreen: 'Цео екран' +Force Reload: 'Присилно освежи' +Toggle Developer Tools: 'Укључи алатке за програмере' +Actual size: 'Стварна величина' +Zoom in: 'Увећај' +Zoom out: 'Умањи' +Toggle fullscreen: 'Укључи цео екран' Window: 'Прозор' -Minimize: 'Минимизуј' +Minimize: 'Минимизирај' Close: 'Затвори' Back: 'Назад' Forward: 'Напред' @@ -32,174 +32,241 @@ Forward: 'Напред' # Global # Anything shared among components / views should be put here Global: - Videos: 'Видео' + Videos: 'Видео снимци' + Counts: + Video Count: 1 видео снимак | {count} видео снимака + Subscriber Count: 1 пратилац | {count} пратилаца + View Count: 1 преглед | {count} прегледа + Watching Count: 1 гледање | {count} гледања + Channel Count: 1 канал | {count} канала + Live: Уживо + Community: Заједница + Shorts: Shorts Version {versionNumber} is now available! Click for more details: 'Верзија {versionNumber} је сада достуна! Кликните за више детаља' Download From Site: 'Преузми са сајта' A new blog is now available, {blogTitle}. Click to view more: 'Нови блог је сада доступан, - {blogTitle}. Кликни за приказ више' + {blogTitle}. Кликните да бисте видели више' # Search Bar -Search / Go to URL: 'Претражи / иди на УРЛ' +Search / Go to URL: 'Претрага / Иди на URL' # In Filter Button Search Filters: Search Filters: 'Филтери претраге' Sort By: - Sort By: 'Среди по' + Sort By: 'Сортирање по' Most Relevant: 'Најрелевантније' Rating: 'Оцена' Upload Date: 'Датум отпремања' View Count: 'Број прегледа' Time: - Time: 'Датум' - Any Time: 'Све' + Time: 'Време' + Any Time: 'Било које време' Last Hour: 'Последњи сат' Today: 'Данас' This Week: 'Ове недеље' - This Month: 'Овај месец' - This Year: 'Ова година' + This Month: 'Овог месеца' + This Year: 'Ове године' Type: - Type: 'Тип' - All Types: 'Сва' - Videos: 'Видео' + Type: 'Врста' + All Types: 'Све врсте' + Videos: 'Видео снимци' Channels: 'Канали' #& Playlists + Movies: Филмови Duration: Duration: 'Трајање' - All Durations: 'Све' + All Durations: 'Сва трајања' Short (< 4 minutes): 'Кратко (< 4 минута)' - Long (> 20 minutes): 'Дугачко (> 20 минута)' + Long (> 20 minutes): 'Дуго (> 20 минута)' # On Search Page + Medium (4 - 20 minutes): Средње (4 - 20 минута) Search Results: 'Резултати претраге' - Fetching results. Please wait: 'Примање резултата. Сачекајте' - Fetch more results: 'Покажи још резултата' + Fetching results. Please wait: 'Прикупљање резултата. Сачекајте' + Fetch more results: 'Прикупити више резултата' There are no more results for this search: 'Нема више резултата за ову претрагу' # Sidebar Subscriptions: # On Subscriptions Page Subscriptions: 'Праћења' - Latest Subscriptions: 'Задња праћења' + Latest Subscriptions: 'Најновија праћења' This profile has a large number of subscriptions. Forcing RSS to avoid rate limiting: 'Овај - профил има велики број праћења. Присиљавање RSS-а да се избегне ограничење' + профил има велики број праћења. Присиљавање RSS-а да се избегне ограничавање + брзине' 'Your Subscription list is currently empty. Start adding subscriptions to see them here.': 'Ваша - листа прећења је тренутно празна. Почните да додајете прећење да бисте их видели + листа праћења је тренутно празна. Почните да додајете праћења да бисте их видели овде.' - 'Getting Subscriptions. Please wait.': 'Примање праћења. Сачекајте.' + 'Getting Subscriptions. Please wait.': 'Набављање праћења. Сачекајте.' Refresh Subscriptions: 'Освежи праћења' - Load More Videos: 'Учитај више видео записа' -More: 'Још' + Load More Videos: 'Учитај више видео снимака' + Load More Posts: Учитај више објава + Empty Channels: Канали које пратите тренутно немају ниједан видео снимак. + Subscriptions Tabs: Картице праћења + Empty Posts: Канали које пратите тренутно немају ниједну објаву. + All Subscription Tabs Hidden: Све картице праћења су скривене. Да бисте видели садржај + овде, откријте неке картице у одељку „{subsection}“ у „{settingsSection}“. + Disabled Automatic Fetching: Онемогућили сте аутоматско прикупљање праћења. Освежите + праћења да бисте их видели овде. + Error Channels: Канали са грешкама +More: 'Више' Trending: - Trending: 'Тренда' -Most Popular: 'Нај популарније' + Trending: 'У тренду' + Gaming: Видео игре + Default: Подразумевано + Music: Музика + Movies: Филмови + Trending Tabs: Картице у тренду +Most Popular: 'Најпопуларније' Playlists: 'Плејлисте' User Playlists: Your Playlists: 'Ваше плејлисте' - Playlist Message: 'Ова страница се не одражава у потпуности радне плејлисте. Она - само приказује видео записе које сте сачували или фаворизирали. Када је посао - завршио, сви видео записи одавде ће се преместити на плејлисту "Омиљени".' - Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: 'Нисте - сачували ни један видео. Кликни на дугме Сачувај на углу видео записа да бисте - је овде навели' + Playlist Message: 'Ова страница не одражава потпуно функционалне плејлисте. Наводи + само видео снимке које сте сачували или означили као фаворите. Када се посао заврши, + сви видео снимци који су тренутно овде биће пребачени на плејлисту „Омиљено“.' + Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: 'Немате + сачуване видео снимке. Кликните на дугме за чување у углу видео снимка да бисте + га додали на ову листу' + Empty Search Message: На овој плејлисти нема видео снимака који одговарају вашој + претрази + Search bar placeholder: Претрага у плејлисти History: # On History Page History: 'Историја' - Watch History: 'Види историју' - Your history list is currently empty.: 'Ваша историја је празна.' + Watch History: 'Историја гледања' + Your history list is currently empty.: 'Ваша историја је тренутно празна.' + Search bar placeholder: Претрага у историји + Empty Search Message: У вашој историји нема видео снимака који одговарају вашој + претрази Settings: # On Settings Page Settings: 'Подешавања' The app needs to restart for changes to take effect. Restart and apply change?: 'Апликација - треба да се поново покрене како би промене ступиле на снагу. Поново покрените - и примените промене?' + се мора рестартовати да би се примениле промене. Рестартовати и применити промене?' General Settings: General Settings: 'Општа подешавања' - Check for Updates: 'Провери ажурирања' - Check for Latest Blog Posts: 'Провери најновије поруке блога' - Fallback to Non-Preferred Backend on Failure: 'Повратак на неомиљени Backend на - неуспех' - Enable Search Suggestions: 'Покажи предлоге за претрагу' + Check for Updates: 'Провера ажурирања' + Check for Latest Blog Posts: 'Провера најновијих објава на блогу' + Fallback to Non-Preferred Backend on Failure: 'Повратак на непреферирани бек-енд + у случају неуспеха' + Enable Search Suggestions: 'Омогући предлоге за претрагу' Default Landing Page: 'Подразумевана почетна страница' Locale Preference: 'Локална преференција' Preferred API Backend: - Preferred API Backend: 'Омиљени API Backend' + Preferred API Backend: 'Преферирани API бек-енд' Local API: 'Локални API' - Invidious API: 'Инвидиус АПИ' + Invidious API: 'Invidious API' Video View Type: - Video View Type: 'Тип приказа видеа' - Grid: 'Решетка' + Video View Type: 'Врста приказа видео снимка' + Grid: 'Мрежа' List: 'Листа' Thumbnail Preference: - Thumbnail Preference: 'Преференције сличице' + Thumbnail Preference: 'Преференција сличице' Default: 'Подразумевано' Beginning: 'Почетак' Middle: 'Средина' End: 'Крај' + Hidden: Скривено 'Invidious Instance (Default is https://invidious.snopyta.org)': 'Invidious инстанца (Подразумевано је https://invidious.snopyta.org)' - View all Invidious instance information: 'Погледајте информације свих Invidious - инстанце' - Region for Trending: 'Регион за тренд' + View all Invidious instance information: 'Погледај све информације о Invidious + инстанци' + Region for Trending: 'Регион за „У тренду“' #! List countries + External Link Handling: + Open Link: Отвори линк + External Link Handling: Руковање спољним линковима + No Action: Нема радње + Ask Before Opening Link: Питај пре отварања линка + No default instance has been set: Није подешена ниједна подразумевана инстанца + System Default: Системски подразумевано + Set Current Instance as Default: Подеси тренутну инстанцу као подразумевану + Current instance will be randomized on startup: Тренутна инстанца ће бити насумично + изабрана при покретању + Clear Default Instance: Очисти подразумеване инстанце + The currently set default instance is {instance}: Тренутно подешена подразумевана + инстанца је {instance} + Current Invidious Instance: Тренутна Invidious инстанца Theme Settings: Theme Settings: 'Подешавања теме' Match Top Bar with Main Color: 'Усклади горњу траку са главном бојом' Expand Side Bar by Default: 'Подразумевано прошири бочну траку' - Disable Smooth Scrolling: 'Онемогући глатко померање' - UI Scale: 'UI скала' + Disable Smooth Scrolling: 'Онемогући глатко прелажење' + UI Scale: 'Скала корисничког интерфејса' Base Theme: Base Theme: 'Основна тема' Black: 'Црна' Dark: 'Тамна' Light: 'Светла' Dracula: 'Дракула' + Pastel Pink: Пастелно розе + Hot Pink: Врућа розе + Catppuccin Mocha: Catppuccin Mocha + System Default: Системски подразумевано Main Color Theme: - Main Color Theme: 'Главна боја теме' - Red: 'Црвено' + Main Color Theme: 'Главна тема боја' + Red: 'Црвена' Pink: 'Розе' - Purple: 'Љубичасто' - Deep Purple: 'Тамно љубичасто' + Purple: 'Љубичаста' + Deep Purple: 'Тамнољубичаста' Indigo: 'Индиго' - Blue: 'Плаво' - Light Blue: 'Светло плаво' + Blue: 'Плава' + Light Blue: 'Светлоплава' Cyan: 'Цијан' - Teal: 'Modrozelena' - Green: 'Зелено' - Light Green: 'Светло зелено' - Lime: 'Лимун зелено' - Yellow: 'Жуто' + Teal: 'Тиркизна' + Green: 'Зелена' + Light Green: 'Светлозелена' + Lime: 'Лимета' + Yellow: 'Жута' Amber: 'Амбер' - Orange: 'Наранђасто' - Deep Orange: 'Тамно нарађасто' - Dracula Cyan: 'Дракула Цијан' - Dracula Green: 'Дракула Зелено' - Dracula Orange: 'Дракула Наранђасто' - Dracula Pink: 'Дракула Розе' - Dracula Purple: 'Дракула Љубичасто' - Dracula Red: 'Дракула Црвено' - Dracula Yellow: 'Дракула Жуто' - Secondary Color Theme: 'Секундарна боја теме' + Orange: 'Наранџаста' + Deep Orange: 'Тамнонаранџаста' + Dracula Cyan: 'Дракула цијан' + Dracula Green: 'Дракула зелена' + Dracula Orange: 'Дракула наранџаста' + Dracula Pink: 'Дракула розе' + Dracula Purple: 'Дракула љубичаста' + Dracula Red: 'Дракула црвена' + Dracula Yellow: 'Дракула жута' + Catppuccin Mocha Red: Catppuccin Mocha црвена + Catppuccin Mocha Maroon: Catppuccin Mocha бордо + Catppuccin Mocha Sky: Catppuccin Mocha небо + Catppuccin Mocha Sapphire: Catppuccin Mocha сафирна + Catppuccin Mocha Teal: Catppuccin Mocha тиркизна + Catppuccin Mocha Yellow: Catppuccin Mocha жута + Catppuccin Mocha Rosewater: Catppuccin Mocha светлорозе-румена + Catppuccin Mocha Peach: Catppuccin Mocha бресква + Catppuccin Mocha Flamingo: Catppuccin Mocha фламингос + Catppuccin Mocha Mauve: Catppuccin Mocha мауве + Catppuccin Mocha Pink: Catppuccin Mocha розе + Catppuccin Mocha Lavender: Catppuccin Mocha лаванда + Catppuccin Mocha Blue: Catppuccin Mocha плава + Catppuccin Mocha Green: Catppuccin Mocha зелена + Secondary Color Theme: 'Секундарна тема боје' #* Main Color Theme + Hide FreeTube Header Logo: Сакриј FreeTube логотип у заглављу + Hide Side Bar Labels: Сакриј ознаке бочне траке Player Settings: Player Settings: 'Подешавања плејера' - Force Local Backend for Legacy Formats: 'форсирај локални Backend за Legacy формате' - Play Next Video: 'Пусти следећи видео' - Turn on Subtitles by Default: 'Подразумевано упали титлове' - Autoplay Videos: 'Ауто-пусти видео' - Proxy Videos Through Invidious: 'Прокси видео преко Invidious' - Autoplay Playlists: 'Ауто-пусти плејлисте' - Enable Theatre Mode by Default: 'Подразумевано активирај театар мод' + Force Local Backend for Legacy Formats: 'Присили локални бек-енд за застареле + формате' + Play Next Video: 'Пусти следећи видео снимак' + Turn on Subtitles by Default: 'Подразумевано укључи титлове' + Autoplay Videos: 'Аутоматски пусти видео снимак' + Proxy Videos Through Invidious: 'Прокси видео снимци преко Invidious-а' + Autoplay Playlists: 'Аутоматски пусти плејлисте' + Enable Theatre Mode by Default: 'Подразумевано омогући биоскопски режим' Playlist Next Video Interval: 'Интервал следећег видеа из плејлисте' - Default Volume: 'Подразумевана јачина' + Default Volume: 'Подразумевана јачина звука' Default Playback Rate: 'Подразумевана брзина репродукције' Default Video Format: - Default Video Format: 'Подразумеван формат видеа' + Default Video Format: 'Подразумевани формат видео снимка' Dash Formats: 'DASH формати' - Legacy Formats: 'Legacy формати' + Legacy Formats: 'Застарели формати' Audio Formats: 'Аудио формати' Default Quality: - Default Quality: 'Подразумеван квалитет' - Auto: 'Ауто' + Default Quality: 'Подразумевани квалитет' + Auto: 'Аутоматски' 144p: '144p' 240p: '240p' 360p: '360p' @@ -209,237 +276,702 @@ Settings: 1440p: '1440p' 4k: '4k' 8k: '8k' + Screenshot: + Folder Label: Фолдер за снимке екрана + Error: + Empty File Name: Празан назив фајла + Forbidden Characters: Забрањени знакови + Folder Button: Избор фолдера + Format Label: Формат снимка екрана + Enable: Омогући снимак екрана + Ask Path: Питај за фолдер за чување + Quality Label: Квалитет снимка екрана + File Name Tooltip: Можете да користите променљиве испод. %Y Година 4 цифре. + %M Месец 2 цифре. %D Дан 2 цифре. %H Сат 2 цифре. %N Минут 2 цифре. %S Секунда + 2 цифре. %T Милисекунда 3 цифре. %s Секунда видео снимка. %t Милисекунда видео + снимка 3 цифре. %i ID видео снимка. Такође, можете да користите „\“ или „/“ + да бисте направили потфолдере. + File Name Label: Образац назива фајла + Scroll Volume Over Video Player: Превуци за јачину звука преко плејера видео снимка + Skip by Scrolling Over Video Player: Прескочи превлачењем преко плејера видео + снимка + Allow DASH AV1 formats: Дозволи DASH AV1 формате + Scroll Playback Rate Over Video Player: Превуци за брзину репродукције преко плејера + видео снимка + Fast-Forward / Rewind Interval: Интервал брзог премотавања унапред/уназад + Comment Auto Load: + Comment Auto Load: Аутоматско учитавање коментара + Video Playback Rate Interval: Интервал брзине репродукције видео снимка + Max Video Playback Rate: Максимална брзина репродукције видео снимка + Enter Fullscreen on Display Rotate: Уђи у цео екран при окретању екрана + Next Video Interval: Интервал следећег видео снимка + Display Play Button In Video Player: Прикажи дугме за пуштање у плејеру видео + снимка Privacy Settings: Privacy Settings: 'Подешавања приватности' Remember History: 'Запамти историју' - Save Watched Progress: 'Сачувај напредак видеа' - Clear Search Cache: 'Испразни кеш претраге' - Are you sure you want to clear out your search cache?: 'Јесте ли сигурни да желите - да очистите кеш претраге?' - Search cache has been cleared: 'Кеш претраживања је обрисано' - Remove Watch History: 'Избриши историју гледања' - Are you sure you want to remove your entire watch history?: 'Сигурно желите да - избришете целу историју гледања?' - Watch history has been cleared: 'Историја је избрисана' - Remove All Subscriptions / Profiles: 'Обриши сва праћења/профили' - Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Да - ли сте сигурни да желите уклонити сва праћења и профиле? Ово се не може поништити.' + Save Watched Progress: 'Сачувај напредак одгледаног' + Clear Search Cache: 'Очисти кеш претраге' + Are you sure you want to clear out your search cache?: 'Желите ли заиста да очистите + кеш претраге?' + Search cache has been cleared: 'Кеш претраге је очишћен' + Remove Watch History: 'Очисти историју гледања' + Are you sure you want to remove your entire watch history?: 'Желите ли заиста + да очистите целу историју гледања?' + Watch history has been cleared: 'Историја гледања је очишћена' + Remove All Subscriptions / Profiles: 'Уклони сва праћења/профиле' + Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Желите + ли заиста да уклоните сва праћења и профиле? Ово се не може поништити.' + Automatically Remove Video Meta Files: Аутоматски уклони мета фајлове за видео + снимак + Save Watched Videos With Last Viewed Playlist: Сачувај одгледане видео снимке + са последње гледане плејлисте Subscription Settings: Subscription Settings: 'Подешавања праћења' - Hide Videos on Watch: 'Сакриј одгледани видео записи' - Fetch Feeds from RSS: 'Дохват RSS-а' - Manage Subscriptions: 'Управљај ста пратиш' + Hide Videos on Watch: 'Сакриј видео снимке на гледању' + Fetch Feeds from RSS: 'Прикупи фидове из RSS-а' + Manage Subscriptions: 'Управљање праћењима' + Fetch Automatically: Аутоматски прикупи фид Distraction Free Settings: - Distraction Free Settings: 'Подешавања дистракције' - Hide Video Views: 'Сакриј број приказа видеа' - Hide Video Likes And Dislikes: 'Сакриј видео лајкове' - Hide Channel Subscribers: 'Сакриј број праћења канала' - Hide Comment Likes: 'Сакриј лајковање из коментара' - Hide Recommended Videos: 'Сакриј препоручене видее' - Hide Trending Videos: 'Сакриј видее у тренду' - Hide Popular Videos: 'Сакриј популарне видее' + Distraction Free Settings: 'Подешавања „Без ометања“' + Hide Video Views: 'Сакриј прегледе видео снимка' + Hide Video Likes And Dislikes: 'Сакриј свиђања и несвиђања видео снимка' + Hide Channel Subscribers: 'Сакриј праћења канала' + Hide Comment Likes: 'Сакриј свиђања коментара' + Hide Recommended Videos: 'Сакриј препоручене видео снимке' + Hide Trending Videos: 'Сакриј видео снимке у тренду' + Hide Popular Videos: 'Сакриј популарне видео снимке' Hide Playlists: 'Сакриј плејлисте' - Hide Live Chat: 'Сакриј уживо ћаскање' + Hide Live Chat: 'Сакриј ћаскање уживо' Hide Active Subscriptions: 'Сакриј активна праћења' + Blur Thumbnails: Замагли сличице + Hide Channels Placeholder: Назив канала или ID канала + Hide Video Description: Сакриј опис видео снимка + Hide Chapters: Сакриј поглавља + Sections: + Watch Page: Страница гледања + Side Bar: Бочна трака + Channel Page: Страница канала + Subscriptions Page: Страница праћења + General: Опште + Hide Channel Community: Сакриј заједницу канала + Hide Subscriptions Videos: Сакриј видео снимке канала које пратите + Hide Comments: Сакриј коментаре + Hide Channel Shorts: Сакриј Shorts снимке канала + Hide Sharing Actions: Сакриј радње дељења + Hide Channel Podcasts: Сакриј подкасте канала + Hide Live Streams: Сакриј стримове уживо + Hide Channel Playlists: Сакриј плејлисте канала + Hide Subscriptions Community: Сакриј заједницу канала које пратите + Hide Channels: Сакриј видео снимке са канала + Hide Subscriptions Live: Сакриј стримове уживо канала које пратите + Hide Subscriptions Shorts: Сакриј Shorts снимке канала које пратите + Display Titles Without Excessive Capitalisation: Прикажи наслове без претераног + коришћења великих слова + Hide Featured Channels: Сакриј истакнуте канале + Hide Profile Pictures in Comments: Сакриј слике профила у коментарима + Hide Upcoming Premieres: Сакриј предстојеће премијере + Hide Channel Releases: Сакриј издања канала Data Settings: Data Settings: 'Подешавања података' - Select Import Type: 'Одабери тип увоза' - Select Export Type: 'Одабери тип извоза' + Select Import Type: 'Избор врсте увоза' + Select Export Type: 'Избор врсте извоза' Import Subscriptions: 'Увоз праћења' Import FreeTube: 'Увоз FreeTube' Import YouTube: 'Увоз YouTube' Import NewPipe: 'Увоз NewPipe' - Check for Legacy Subscriptions: 'Провери да ли постоје стара праћања' - Export Subscriptions: 'Извоз праћања' - Export FreeTube: 'Извоз FreeTube' - Export YouTube: 'Извоз YouTube' - Export NewPipe: 'Извоз NewPipe' + Check for Legacy Subscriptions: 'Провера застарелих праћења' + Export Subscriptions: 'Извоз праћења' + Export FreeTube: 'Извоз FreeTube-а' + Export YouTube: 'Извоз YouTube-а' + Export NewPipe: 'Извоз NewPipe-а' Import History: 'Увоз историје' Export History: 'Извоз историје' - Profile object has insufficient data, skipping item: 'Објект профила нема довољно - података, прескакање' - All subscriptions and profiles have been successfully imported: 'Сва праћања и + Profile object has insufficient data, skipping item: 'Објекат профила нема довољно + података, прескакање предмета' + All subscriptions and profiles have been successfully imported: 'Сва праћења и профили су успешно увезени' - All subscriptions have been successfully imported: 'Сва праћања су успешно увезене' - One or more subscriptions were unable to be imported: 'Увоз једне или више праћења - није успео' - Invalid subscriptions file: 'Датотека праћења није добра' - This might take a while, please wait: 'Ово би могло потрајати неко време, молим - вас причекајте' - Invalid history file: 'Неважећа датотека историје' - Subscriptions have been successfully exported: 'Праћења су успешно извезени' - History object has insufficient data, skipping item: 'Објект историје нема довољно - података, прескакање' + All subscriptions have been successfully imported: 'Сва праћења су успешно увезена' + One or more subscriptions were unable to be imported: 'Није могуће увести једно + или више праћења' + Invalid subscriptions file: 'Неважећи фајл праћења' + This might take a while, please wait: 'Ово може потрајати, сачекајте' + Invalid history file: 'Неважећи фајл историје' + Subscriptions have been successfully exported: 'Праћења су успешно извезена' + History object has insufficient data, skipping item: 'Објекат историје нема довољно + података, прескакање предмета' All watched history has been successfully imported: 'Цела историја гледања је успешно увезена' All watched history has been successfully exported: 'Цела историја гледања је успешно извезена' - Unable to read file: 'Није могуће читати датотеку' - Unable to write file: 'Није могуће писати датотеку' - Unknown data key: 'Непознат кључ података' - How do I import my subscriptions?: 'Како унети моја праћања?' - Manage Subscriptions: 'Управљај праћањима' + Unable to read file: 'Није могуће прочитати фајл' + Unable to write file: 'Није могуће написати фајл' + Unknown data key: 'Непознати кључ података' + How do I import my subscriptions?: 'Како да увезем своја праћења?' + Manage Subscriptions: 'Управљање праћењима' + All playlists has been successfully exported: Све плејлисте су успешно извезене + Playlist File: Фајл плејлисте + Subscription File: Фајл праћења + History File: Фајл историје + Export Playlists: Извор плејлиста + Import Playlists: Увоз плејлиста + All playlists has been successfully imported: Све плејлисте су успешно увезене + Playlist insufficient data: Нема довољно података за плејлисту „{playlist}“, прескакање + предмета Proxy Settings: Proxy Settings: 'Подешавања проксија' - Enable Tor / Proxy: 'Активирај Tor/Прокси' + Enable Tor / Proxy: 'Омогући Tor / Прокси' Proxy Protocol: 'Протокол проксија' Proxy Host: 'Хост проксија' - Proxy Port Number: 'Порт за прокси' - Clicking on Test Proxy will send a request to: 'Клик на „Пробај Прокси“ послаће + Proxy Port Number: 'Број порта проксија' + Clicking on Test Proxy will send a request to: 'Клик на „Тестирај прокси“ послаће захтев на' - Test Proxy: 'Пробај Прокси' + Test Proxy: 'Тестирај прокси' Your Info: 'Ваше информације' Ip: 'IP' - Country: 'Земља' + Country: 'Држава' Region: 'Регион' City: 'Град' Error getting network information. Is your proxy configured properly?: 'Грешка - у добијању информација о мрежи. Да ли је ваш проки правилно подешен?' + при набављању информација о мрежи. Да ли је ваш прокси исправно конфигурисан?' + Experimental Settings: + Replace HTTP Cache: Замени HTTP кеш + Experimental Settings: Експериментална подешавања + Warning: Ова подешавања су експериментална, могу да доведу до отказивања док су + омогућена. Прављење резервних копија је веома препоручљиво. Користите на властиту + одговорност! + SponsorBlock Settings: + Notify when sponsor segment is skipped: Обавештење када се спонзор сегмент прескочи + 'SponsorBlock API Url (Default is https://sponsor.ajay.app)': URL API-ја SponsorBlock-а + (Подразумевано је https://sponsor.ajay.app) + Skip Options: + Skip Option: Опција прескакања + Do Nothing: Не ради ништа + Prompt To Skip: Упит за прескакање + Auto Skip: Аутоматско прескакање + Show In Seek Bar: Приказ у траци за прескакање + UseDeArrowTitles: Користи DeArrow наслове видео снимака + Enable SponsorBlock: Омогући SponsorBlock + SponsorBlock Settings: Подешавања SponsorBlock-а + Category Color: Боја категорије + External Player Settings: + External Player: Спољни плејер + External Player Settings: Подешавања спољног плејера + Custom External Player Executable: Прилагођени извршни спољни плејер + Ignore Unsupported Action Warnings: Игнориши упозорења о неподржаним радњама + Custom External Player Arguments: Прилагођени аргументи спољног плејера + Players: + None: + Name: Ниједно + Download Settings: + Choose Path: Избор путање + Open in web browser: Отвори у прегледачу + Ask Download Path: Питај за путању за преузимање + Download Behavior: Понашање преузимања + Download in app: Преузми у апликацији + Download Settings: Подешавања преузимања + Password Settings: + Remove Password: Уклони лозинку + Set Password To Prevent Access: Подеси лозинку да спречиш приступ подешавањима + Password Settings: Подешавања лозинке + Set Password: Подеси лозинку + Parental Control Settings: + Show Family Friendly Only: Прикажи само погодно за породицу + Hide Unsubscribe Button: Сакриј дугме „Прекини праћење“ + Hide Search Bar: Сакриј траку за претрагу + Parental Control Settings: Подешавања родитељске контроле + Password Dialog: + Password Incorrect: Лозинка нетачна + Password: Лозинка + Enter Password To Unlock: Унесите лозинку да бисте откључали подешавања + Unlock: Откључај About: #On About page - About: 'О програму' + About: 'О апликацији' Beta: 'Бета' - Source code: 'Изворни код' - Licensed under the AGPLv3: 'Лиценциран под AGPLv3' - View License: 'Види лиценцу' - Downloads / Changelog: 'Преузимања/Листа промена' - GitHub releases: 'Доступна издања на GitHub' + Source code: 'Изворни кôд' + Licensed under the AGPLv3: 'Лиценцирано под AGPLv3' + View License: 'Погледај лиценцу' + Downloads / Changelog: 'Преузимања / Евиденција промена' + GitHub releases: 'GitHub издања' Help: 'Помоћ' - FreeTube Wiki: 'Wiki од FreeTube-а' - FAQ: 'FAQ' - Report a problem: 'Пријави проблем' - GitHub issues: 'Проблеми које је заједничка идентификовала на GitHub' - Please check for duplicates before posting: 'Молимо проверите дупликате пре објављивања' - Website: 'Вебсајт' + FreeTube Wiki: 'FreeTube Wiki' + FAQ: 'ЧПП' + Report a problem: 'Пријава проблема' + GitHub issues: 'Пријава проблема на GitHub-у' + Please check for duplicates before posting: 'Проверите да ли има дупликата пре објављивања' + Website: 'Веб-сајт' Blog: 'Блог' - Email: 'Е-пошта' + Email: 'Имејл' Mastodon: 'Mastodon' - Chat on Matrix: 'Ћаскање на Matrix' + Chat on Matrix: 'Ћаскање на Matrix-у' Please read the: 'Прочитајте' room rules: 'правила собе' - Translate: 'Превод' - Credits: 'Призњања' - FreeTube is made possible by: 'FreeTube је омогућено од' + Translate: 'Преведи' + Credits: 'Кредити' + FreeTube is made possible by: 'FreeTube су омогућили' these people and projects: 'ови људи и пројекти' Donate: 'Донација' + Discussions: Дискусије Profile: - Profile Select: 'Одабир профила' + Profile Select: 'Избор профила' Profile Filter: 'Филтер профила' All Channels: 'Сви канали' - Profile Manager: 'Менаџер профила' - Create New Profile: 'Креирај нови профил' - Edit Profile: 'Уреди профил' - Color Picker: 'Селектор боја' + Profile Manager: 'Управљање профилом' + Create New Profile: 'Направи нови профил' + Edit Profile: 'Измени профил' + Color Picker: 'Бирач боје' Custom Color: 'Прилагођена боја' Profile Preview: 'Преглед профила' - Create Profile: 'Креирај профил' + Create Profile: 'Направи профил' Update Profile: 'Ажурирај профил' - Make Default Profile: 'Креирај подразумевани профил' + Make Default Profile: 'Направи подразумевани профил' Delete Profile: 'Избриши профил' - Are you sure you want to delete this profile?: 'Сигурно желите да избришете овај + Are you sure you want to delete this profile?: 'Желите ли заиста да избришете овај профил?' - All subscriptions will also be deleted.: 'Сва праћања ће такође бити избрисани.' - Profile could not be found: 'Профил не може да се нађе' - Your profile name cannot be empty: 'Име профила не може да буде празно' - Profile has been created: 'Профил је креиран' + All subscriptions will also be deleted.: 'Сва праћења ће такође бити избрисана.' + Profile could not be found: 'Није могуће пронаћи профил' + Your profile name cannot be empty: 'Име профила не може бити празно' + Profile has been created: 'Профил је направљен' Profile has been updated: 'Профил је ажуриран' - Your default profile has been set to {profile}: 'Ваш подразумеван профил је постављен + Your default profile has been set to {profile}: 'Ваш подразумевани профил је постављен на {profile}' - Removed {profile} from your profiles: 'Уклоњено {profile} од ваших профила' + Removed {profile} from your profiles: 'Уклоњен {profile} из ваших профила' Your default profile has been changed to your primary profile: 'Ваш подразумевани профил је промењен на ваш примарни профил' '{profile} is now the active profile': '{profile} је сада активан профил' - Subscription List: 'Листа праћања' + Subscription List: 'Листа праћења' Other Channels: 'Остали канали' - '{number} selected': '{number} одабрано' - Select All: 'Све одабрати' - Select None: 'Скини одабирање' - Delete Selected: 'Избриши одабрано' - Add Selected To Profile: 'Додај одабрано на профил' - No channel(s) have been selected: 'Ни један канал није одабран' + '{number} selected': 'Изабрано: {number}' + Select All: 'Изабери све' + Select None: 'Ниједан' + Delete Selected: 'Избриши изабрано' + Add Selected To Profile: 'Додај изабрано на профил' + No channel(s) have been selected: 'Није изабран ниједан канал' ? This is your primary profile. Are you sure you want to delete the selected channels? The same channels will be deleted in any profile they are found in. - : 'Ово је ваш примарни профил. Јесте ли сигурни да желите да избришете одабране - канале? Исти канали биће избрисани у било којем профилу у којем се налазе.' - Are you sure you want to delete the selected channels? This will not delete the channel from any other profile.: 'Јесте - ли сигурни да желите да избришете одабране канале? Ово неће избрисати канал из - било којег другог профила.' + : 'Ово је ваш примарни профил. Желите ли заиста да избришете изабране канале? Исти + канали ће бити избрисани у било ком профилу на којем се налазе.' + Are you sure you want to delete the selected channels? This will not delete the channel from any other profile.: 'Желите + ли заиста да избришете изабране канале? Ово неће избрисати канал из било ког + другог профила.' #On Channel Page + Profile Settings: Подешавања профила + Toggle Profile List: Укључи листу профила Channel: Subscriber: 'Пратилац' Subscribers: 'Пратиоци' - Subscribe: 'Прати' - Unsubscribe: 'Не прати више' - Channel has been removed from your subscriptions: 'Канал је уклоњен из праћања' - Removed subscription from {count} other channel(s): 'Праћење уклоњен из {count} - остала канала' - Added channel to your subscriptions: 'Канал додат у прећења' - Search Channel: 'Тражи канал' - Your search results have returned 0 results: 'Резултати претраге вратили су 0 резултата' - Sort By: 'Среди по' + Subscribe: 'Запрати' + Unsubscribe: 'Прекини праћење' + Channel has been removed from your subscriptions: 'Канал је уклоњен из ваших праћења' + Removed subscription from {count} other channel(s): 'Уклоњено праћење са {count} + других канала' + Added channel to your subscriptions: 'Канал је додат у ваша праћења' + Search Channel: 'Претрага канала' + Your search results have returned 0 results: 'Резултати претраге су дали 0 резултата' + Sort By: 'Сортирање по' Videos: - Videos: 'Видео' - This channel does not currently have any videos: 'Овај канал тренутно нема видео' + Videos: 'Видео снимци' + This channel does not currently have any videos: 'Овај канал тренутно нема ниједан + видео снимак' Sort Types: Newest: 'Најновије' - Oldest: 'Нај старије' - Most Popular: 'Нај популарније' + Oldest: 'Најстарије' + Most Popular: 'Најпопуларније' Playlists: - Playlists: 'Плејлиста' + Playlists: 'Плејлисте' This channel does not currently have any playlists: 'Овај канал тренутно нема - ни једну плејлисту' + ниједну плејлисту' Sort Types: - Last Video Added: 'Задњи додат видео' - Newest: 'Нај новије' - Oldest: 'Нај старије' + Last Video Added: 'Последњи додат видео снимак' + Newest: 'Најновије' + Oldest: 'Најстарије' About: - About: 'О...' + About: 'О каналу' Channel Description: 'Опис канала' Featured Channels: 'Истакнути канали' + Joined: Придружено + Tags: + Search for: Претрага „{tag}“ + Tags: Ознаке + Details: Детаљи + Location: Локација + Community: + This channel currently does not have any posts: Овај канал тренутно нема ниједну + објаву + Reveal Answers: Откриј одговоре + Hide Answers: Сакриј одговоре + votes: 'Гласова: {votes}' + Live: + Live: Уживо + This channel does not currently have any live streams: Овај канал тренутно нема + ниједан стрим уживо + Releases: + Releases: Издања + This channel does not currently have any releases: Овај канал тренутно нема ниједно + издање + This channel does not allow searching: Овај канал не дозвољава претрагу + Shorts: + This channel does not currently have any shorts: Овај канал тренутно нема Shorts + снимке + Podcasts: + This channel does not currently have any podcasts: Овај канал тренутно нема ниједан + подкаст + Podcasts: Подкасти + Channel Tabs: Картице канала + This channel is age-restricted and currently cannot be viewed in FreeTube.: Овај + канал је старосно ограничен и тренутно се не може гледати на FreeTube-у. + This channel does not exist: Овај канал не постоји Video: - Mark As Watched: 'Означи као погледано' + Mark As Watched: 'Означи као одгледано' Remove From History: 'Уклони из историје' - Video has been marked as watched: 'Видео је постављен као гледан' - Video has been removed from your history: 'Видео је уклоњеј из историје' - Save Video: 'Сачувај видео' - Video has been saved: 'Видео је сачуван' - Video has been removed from your saved list: 'Видео је уклоњен из сачуване листе' - Open in YouTube: 'Отвори у YouTube' - Copy YouTube Link: 'Копирај YouTube везу' - Open YouTube Embedded Player: 'Отвори у Youtube-NoCookie' - Copy YouTube Embedded Player Link: 'Копирај Youtube-NoCookie везу' - Open in Invidious: 'Отвори у Invidious' - Copy Invidious Link: 'Копирај Invidious везу' - Open Channel in YouTube: 'Отвори канал у YouTube' - Copy YouTube Channel Link: 'Копирај везу YouTube канала' - Open Channel in Invidious: 'Отвори канал у Invidious' - Copy Invidious Channel Link: 'Копирај везу Invidious канала' + Video has been marked as watched: 'Видео снимак је означен као одгледан' + Video has been removed from your history: 'Видео снимак је уклоњен из ваше историје' + Save Video: 'Сачувај видео снимак' + Video has been saved: 'Видео снимак је сачуван' + Video has been removed from your saved list: 'Видео снимак је уклоњен из ваше листе + сачуваног' + Open in YouTube: 'Отвори у YouTube-у' + Copy YouTube Link: 'Копирај YouTube линк' + Open YouTube Embedded Player: 'Отвори YouTube уграђени плејер' + Copy YouTube Embedded Player Link: 'Копирај линк YouTube уграђеног плејера' + Open in Invidious: 'Отвори у Invidious-у' + Copy Invidious Link: 'Копирај Invidious линк' + Open Channel in YouTube: 'Отвори канал у YouTube-у' + Copy YouTube Channel Link: 'Копирај линк YouTube канала' + Open Channel in Invidious: 'Отвори канал у Invidious-у' + Copy Invidious Channel Link: 'Копирај линк Invidious канала' Views: 'Прегледа' - Loop Playlist: 'Безкрајна плејлиста' - Shuffle Playlist: 'Промешај плејлисту' - Reverse Playlist: 'Обрни плејлисту' - Play Next Video: 'Пусти следећи видео' - Play Previous Video: 'Пусти претходни видео' + Loop Playlist: 'Понављај плејлисту' + Shuffle Playlist: 'Мешање плејлисте' + Reverse Playlist: 'Обрнута плејлиста' + Play Next Video: 'Пусти следећи видео снимак' + Play Previous Video: 'Пусти претходни видео снимак' Watched: 'Одгледано' - Autoplay: 'Аутоматско покретање' - Starting soon, please refresh the page to check again: 'Ускоро почиње, освежите + Autoplay: 'Аутоматско пуштање' + Starting soon, please refresh the page to check again: 'Почиње ускоро, освежите страницу да бисте поново проверили' # As in a Live Video - Live: 'Директно' - Live Now: 'Директно сада' - Live Chat: 'Директно ћаскање' - Enable Live Chat: 'Упали директно ћаскање' - Live Chat is currently not supported in this build.: 'Директно ћаскање тренутно - није подржан у овој изградњи.' - 'Chat is disabled or the Live Stream has ended.': 'Ћаскање је угашено или директан - пренос је завршен.' + Live: 'Уживо' + Live Now: 'Уживо сада' + Live Chat: 'Ћаскање уживо' + Enable Live Chat: 'Омогући ћаскање уживо' + Live Chat is currently not supported in this build.: 'Ћаскање уживо тренутно није + подржано у овом издању.' + 'Chat is disabled or the Live Stream has ended.': 'Ћаскање је онемогућено или је + стрим уживо завршен.' + Published: + Month: Месец + Sep: Сеп. + Seconds: Секунди + In less than a minute: За мање од једног минута + Week: Недеља + Upcoming: Премијера за + Dec: Дец. + Jan: Јан. + Weeks: Недеља + Days: Дана + Years: Године + May: Мај + Mar: Мар. + Hours: Сати + Oct: Окт. + Months: Месеци + Apr: Апр. + Feb: Феб. + Jul: Јул + Minutes: Минути + Minute: Минут + Day: Дан + Hour: Сат + Jun: Јун + Second: Секунда + Year: Година + Nov: Нов. + Ago: Пре + Aug: Авг. + Upcoming: Предстојеће + Stats: + Video statistics are not available for legacy videos: Статистика видео снимака + није доступна за застареле видео снимке + Buffered: Баферовано + Bitrate: Брзина кадра + Volume: Волумен (партиција) + Mimetype: Mimetype + Resolution: Резолуција + Dropped / Total Frames: Испуштено / Укупно кадрова + Bandwidth: Проток + Player Dimensions: Димензије плејера + Video ID: ID видео снимка + Sponsor Block category: + interaction: Интеракција + filler: Попуњавање + music offtopic: Сегмент без музике + outro: Завршна анимација + self-promotion: Самопромоција + sponsor: Спонзор + recap: Рекапитулација + intro: Уводна анимација + translated from English: преведено са енглеског + External Player: + Unsupported Actions: + opening playlists: отварање плејлиста + shuffling playlists: мешање плејлиста + setting a playback rate: подешавање брзине репродукције + looping playlists: понављање плејлиста + reversing playlists: обртање плејлиста + opening specific video in a playlist (falling back to opening the video): отварање + одређеног видео снимка на плејлисти (повратак на отварање видео снимка) + starting video at offset: почињање видео снимка у офсету + OpeningTemplate: Отварање {videoOrPlaylist} у {externalPlayer}... + OpenInTemplate: Отвори у {externalPlayer} + video: видео снимак + UnsupportedActionTemplate: '{externalPlayer} не подржава: {action}' + playlist: плејлиста + Live chat is enabled. Chat messages will appear here once sent.: Ћаскање уживо је + омогућено. Поруке ћаскања ће се појавити овде када буду послате. + Streamed on: Стримовано + Audio: + Medium: Средње + High: Високо + Best: Најбоље + Low: Ниско + video only: само видео снимак + Skipped segment: Прескочен сегмент + Pause on Current Video: Паузирај на тренутном видео снимку + Premieres on: Премијера на + audio only: само аудио снимак (звук) + Show Super Chat Comment: Прикажи Super Chat коментар + Scroll to Bottom: Превуци до дна + Started streaming on: Започето стримовање + Publicationtemplate: пре {number} {unit} + Premieres: Премијера + Download Video: Преузми видео снимак + Published on: Објављено + 'Live Chat is currently not supported with the Invidious API. A direct connection to YouTube is required.': Ћаскање + уживо тренутно није подржано са Invidious API-јем. Потребна је директна веза са + YouTube-ом. + 'Live Chat is unavailable for this stream. It may have been disabled by the uploader.': Ћаскање + уживо није доступно за овај стрим. Можда га је онемогућио аутор. Tooltips: Subscription Settings: - Fetch Feeds from RSS: 'Када је омогућено, FreeTube ће користити РСС уместо свог - подразумеваног метода за прикупљање вашег праћења. РСС је бржи и спречава блокирање - ИП-а, али не пружа одређене информације попут трајања видеа или статуса уживо' + Fetch Feeds from RSS: 'Када је омогућено, FreeTube ће користити RSS уместо свог + подразумеваног метода за прикупљање вашег фида праћења. RSS је бржи и спречава + блокирање IP адресе, али не пружа одређене информације као што су трајање видео + снимка или статус уживо' # Toast Messages -Subscriptions have not yet been implemented: 'Праћења још увек нису примењени' -Open New Window: Отбори нов прозор + Fetch Automatically: Када је омогућено, FreeTube ће аутоматски прикупити ваш фид + праћења када се отвори нови прозор и када промените профил. + General Settings: + External Link Handling: "Изаберите подразумевано понашање када се кликне на линк + који се не може отворити у FreeTube-у.\nПодразумевано, FreeTube ће отворити + линк на који сте кликнули у вашем подразумеваном прегледачу.\n" + Fallback to Non-Preferred Backend on Failure: Када ваш преферирани API има проблем, + FreeTube ће аутоматски покушати да користи ваш непреферирани API као резервни + метод, када је омогућено. + Preferred API Backend: Изаберите бек-енд коју FreeTube користи за добијање података. + Локални API је уграђени екстрактор. Invidious API захтева Invidious сервер за + повезивање. + Thumbnail Preference: Све сличице широм FreeTube-а ће бити замењене кадром видео + снимка уместо подразумеване сличице. + Region for Trending: Регион трендова вам омогућава да изаберете државу за видео + снимке у тренду коју желите да се приказује. + Invidious Instance: Invidious инстанца на коју ће се FreeTube повезати за API + позиве. + External Player Settings: + Custom External Player Arguments: Сви прилагођени аргументи командне линије, раздвојени + тачком и зарезом („;“), желите да буду прослеђени спољном плејеру. + External Player: Избором спољног плејера ће приказати иконицу, за отварање видео + снимка (плејлисте, ако је подржана) у спољном плејеру, на сличици. Упозорење, + подешавања Invidious-а не утичу на спољне плејере. + DefaultCustomArgumentsTemplate: (Подразумевано:„{defaultCustomArguments}“) + Custom External Player Executable: Подразумевано, FreeTube ће претпоставити да + се изабрани спољни плејер може пронаћи преко PATH променљиве окружења. Ако је + потребно, овде се може подесити прилагођена путања. + Ignore Warnings: Поништи упозорења када тренутни спољни плејер не подржава тренутну + радњу (нпр. обртање плејлиста итд.). + Distraction Free Settings: + Hide Channels: Унесите назив канала или ID канала да бисте сакрили све видео снимке, + плејлисте и сам канал, да се не појављују у претрази, у тренду, најпопуларнијима + и препорученима. Назив канала који сте унели мора се потпуно подударати и разликовати + велика и мала слова. + Hide Subscriptions Live: Ово подешавање је замењено подешавањем за целу апликацију + „{appWideSetting}“ у одељку „{subsection}“ у „{settingsSection}“ + Privacy Settings: + Remove Video Meta Files: Када је омогућено, FreeTube аутоматски брише мета фајлове + направљене током репродукције видео снимка, када се страница гледања затвори. + Player Settings: + Allow DASH AV1 formats: DASH AV1 формати могу изгледати боље од DASH H.264 формата. + DASH AV1 формати захтевају више снаге за репродукцију! Они нису доступни на + свим видео снимцима, у тим случајевима плејер ће уместо њих користити DASH H.264 + формате. + Default Video Format: Подесите формате који се користе када се видео снимак пушта. + DASH формати могу да пуштају виши квалитет. Застарели формати су ограничени + на максимално 720p, али користе мање протока. Аудио формати су само звучни снимци. + Proxy Videos Through Invidious: Повезаће се сa Invidious-ом ради приказивања видео + снимака уместо директног повезивања са YouTube-ом. Замењује подешавања API-ја. + Scroll Playback Rate Over Video Player: Док је курсор изнад видео снимка, притисните + и држите тастер „Control“ (тастер „Command“ на Mac-у) и померајте точкић миша + унапред или уназад да бисте контролисали брзину репродукције. Притисните и држите + тастер „Control“ (тастер „Command„ на Mac-у) и кликните левим тастером миша + да бисте се брзо вратили на подразумевану брзину репродукције (1x, осим ако + није промењено у подешавањима). + Force Local Backend for Legacy Formats: Ради само када је Invidious API подразумевани. + Када је омогућено, локални API ће се покренути и користити застареле формате + које је вратио, уместо оних које је вратио Invidious. Помаже када се видео снимци + које је вратио Invidious не пуштају због ограничења у држави. + Skip by Scrolling Over Video Player: Користите точкић миша да бисте прескакали + кроз видео снимак, MPV стил. + Experimental Settings: + Replace HTTP Cache: Онемогућава HTTP кеш заснован на Electron-овом диску и омогућава + прилагођени кеш слике у меморији. То ће довести до повећане употребе RAM-а. + SponsorBlock Settings: + UseDeArrowTitles: Замена наслова видео снимака насловима које су послали корисници + DeArrow-a. +Subscriptions have not yet been implemented: 'Праћења још увек нису имплементирана' +Open New Window: Отвори нови прозор +Shuffle is now disabled: Мешање је сада онемогућено +Age Restricted: + Type: + Video: Видео снимак + Channel: Канал + This {videoOrPlaylist} is age restricted: '{videoOrPlaylist} је старосно ограничен(а)' +New Window: Нови прозор +Clipboard: + Copy failed: Копирање у привремену меморију није успело + Cannot access clipboard without a secure connection: Није могуће приступити привременој + меморији без безбедне везе +Playlist: + View Full Playlist: Погледај целу плејлисту + Last Updated On: Последњи пут ажурирано + Videos: Видео снимци + View: Преглед + Playlist: Плејлиста + Views: Прегледа +Falling back to Invidious API: Повратак на Invidious API +Change Format: + Dash formats are not available for this video: DASH формати нису доступни за овај + видео снимак + Audio formats are not available for this video: Аудио формати нису доступни за овај + видео снимак + Use Audio Formats: Користи аудио формате + Change Media Formats: Промени формате медија + Use Dash Formats: Користи DASH формате + Use Legacy Formats: Користи застареле формате +Comments: + Comments: Коментари + Sort by: Сортирање по + Show Comments: Прикажи коментаре + View: Погледај + Click to View Comments: Кликни да видиш коментаре + From {channelName}: од {channelName} + Top comments: Топ коментари + Subscribed: Пратите + Getting comment replies, please wait: Набављање одговора на коментаре, сачекајте + Load More Comments: Учитај више коментара + Hide Comments: Сакриј коментаре + Show More Replies: Прикажи више одговора + Pinned by: Закачио + No more comments available: Нема више доступних коментара + Hearted: Са срцем + There are no comments available for this video: Нема доступних коментара за овај + видео снимак + Replies: Одговори + Reply: Одговори + View {replyCount} replies: Погледај {replyCount} одговор(а) + Member: Члан + Hide: Сакриј + There are no more comments for this video: Нема више коментара за овај видео снимак + And others: и осталих + Newest first: Најновије прво +Hashtags have not yet been implemented, try again later: Хеш-ознаке још увек нису + имплементиране, покушајте поново касније +Share: + Invidious Embed URL copied to clipboard: Invidious уграђени URL је копиран у привремену + меморију + Share Channel: Дели канал + Open Embed: Отвори уграђено + Invidious Channel URL copied to clipboard: Invidious URL канала је копиран у привремену + меморију + YouTube URL copied to clipboard: YouTube URL је копиран у привремену меморију + Share Playlist: Дели плејлисту + Copy Embed: Копирај уграђено + Copy Link: Копирај линк + Open Link: Отвори линк + Share Video: Дели видео снимак + Include Timestamp: Укључи временску ознаку + Invidious URL copied to clipboard: Invidious URL је копиран у привремену меморију + YouTube Channel URL copied to clipboard: YouTube URL канала је копиран у привремену + меморију + YouTube Embed URL copied to clipboard: YouTube уграђени URL је копиран у привремену + меморију +Falling back to the local API: Повратак на локални API +Unknown YouTube url type, cannot be opened in app: Непозната врста YouTube URL-а, + не може се отворити у апликацији +Search Bar: + Clear Input: Очисти унос +Up Next: Следеће +Loop is now disabled: Понављање је сада онемогућено +Playing Next Video: Пуштање следећег видео снимка +The playlist has been reversed: Плејлиста је обрнута +Videos: + Sort By: + Oldest: Најстарије + Newest: Најновије +Playlist will pause when current video is finished: Плејлиста ће се паузирати када + се тренутни видео снимак заврши +Local API Error (Click to copy): Грешка локалног API-ја (Кликнути за копирање) +Channels: + Search bar placeholder: Претрага канала + Unsubscribe Prompt: Желите ли заиста да прекинете праћење „{channelName}“? + Channels: Канали + Title: Листа канала + Empty: Ваша листа канала је тренутно празна. + Unsubscribe: Прекини праћење + Count: 'Пронађено канала: {number}.' + Unsubscribed: '{channelName} је уклоњен из ваших праћења' +External link opening has been disabled in the general settings: Отварање спољног + линка је онемогућено у општим подешавањима +Screenshot Success: Снимак екрана је сачуван као „{filePath}“ +Canceled next video autoplay: Отказано аутоматско пуштање следећег видео снимка +Playing Next Video Interval: Пуштање следећег видео снимка убрзо. Кликнути за отказивање. + | Пушта се следећи видео снимак за {nextVideoInterval} секунду. Кликнути за отказивање. + | Пушта се следећи видео за {nextVideoInterval} секунди. Кликнути за отказивање. +No: Не +Playlist will not pause when current video is finished: Плејлиста се неће паузирати + када се тренутни видео снимак заврши +Yes: Да +Chapters: + 'Chapters list visible, current chapter: {chapterName}': 'Листа поглавља је видљива, + тренутно поглавље: {chapterName}' + Chapters: Поглавља + 'Chapters list hidden, current chapter: {chapterName}': 'Листа поглавља је скривена, + тренутно поглавље: {chapterName}' +Hashtag: + This hashtag does not currently have any videos: Ова хеш-ознака тренутно нема ниједан + видео снимак + Hashtag: Хеш-ознака +Playing Previous Video: Пуштање претходног видео снимка +Ok: У реду +Invidious API Error (Click to copy): Грешка Invidious API-ја (Кликнути за копирање) +Starting download: Почиње преузимање „{videoTitle}“ +Preferences: Преференце +Default Invidious instance has been cleared: Подразумевана инстанца Invidious-а је + избрисана +Mini Player: Мини плејер +Toggle Theatre Mode: Укључи биоскопски режим +'The playlist has ended. Enable loop to continue playing': Плејлиста је завршена. + Омогућите понављање да бисте наставили пуштање +Shuffle is now enabled: Мешање је сада омогућено +Default Invidious instance has been set to {instance}: Подразумевана инстанца Invidious-а + је подешена на {instance} +Are you sure you want to open this link?: Желите ли заиста да отворите овај линк? +This video is unavailable because of missing formats. This can happen due to country unavailability.: Овај + видео снимак је недоступан, јер недостају формати. То се може догодити због недоступности + државе. +Screenshot Error: Снимак екрана није успео. {error} +Downloading has completed: „{videoTitle}“ је завршио преузимање +Loop is now enabled: Понављање је сада омогућено +Downloading failed: Дошло је до проблема при преузимању „{videoTitle}“ From 0c92b63b992fead8398749f678b5dc9b62accf5a Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Sun, 8 Oct 2023 05:15:51 +0800 Subject: [PATCH 14/15] ! Fix watch page video published time parsing (#4105) --- src/renderer/views/Watch/Watch.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/views/Watch/Watch.js b/src/renderer/views/Watch/Watch.js index a07f748bf58b8..7a8412793d1a6 100644 --- a/src/renderer/views/Watch/Watch.js +++ b/src/renderer/views/Watch/Watch.js @@ -322,7 +322,8 @@ export default defineComponent({ channelId: this.channelId }) - this.videoPublished = new Date(result.page[0].microformat.publish_date.replace('-', '/')).getTime() + // `result.page[0].microformat.publish_date` example value: `2023-08-12T08:59:59-07:00` + this.videoPublished = new Date(result.page[0].microformat.publish_date).getTime() if (result.secondary_info?.description.runs) { try { From 5c8d49bf51dde8ffd8c8d291dce3e5ff27b0d9fb Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Sun, 8 Oct 2023 06:14:16 +0800 Subject: [PATCH 15/15] ! Fix playlist item fetching for local API (#4102) --- .../watch-video-playlist.js | 39 +++++++----------- src/renderer/helpers/api/local.js | 41 +++++++++++++++++++ src/renderer/views/Playlist/Playlist.js | 20 ++++++--- 3 files changed, 70 insertions(+), 30 deletions(-) diff --git a/src/renderer/components/watch-video-playlist/watch-video-playlist.js b/src/renderer/components/watch-video-playlist/watch-video-playlist.js index 6a854541b9e28..4195cd7075e5d 100644 --- a/src/renderer/components/watch-video-playlist/watch-video-playlist.js +++ b/src/renderer/components/watch-video-playlist/watch-video-playlist.js @@ -4,7 +4,11 @@ import FtLoader from '../ft-loader/ft-loader.vue' import FtCard from '../ft-card/ft-card.vue' import FtListVideoLazy from '../ft-list-video-lazy/ft-list-video-lazy.vue' import { copyToClipboard, showToast } from '../../helpers/utils' -import { getLocalPlaylist, parseLocalPlaylistVideo } from '../../helpers/api/local' +import { + getLocalPlaylist, + parseLocalPlaylistVideo, + untilEndOfLocalPlayList, +} from '../../helpers/api/local' import { invidiousGetPlaylistInfo } from '../../helpers/api/invidious' export default defineComponent({ @@ -327,21 +331,12 @@ export default defineComponent({ if (!process.env.IS_ELECTRON || this.backendPreference === 'invidious' || cachedPlaylist.continuationData === null) { this.playlistItems = cachedPlaylist.items } else { - const items = cachedPlaylist.items - let playlist = cachedPlaylist.continuationData + const videos = cachedPlaylist.items + await untilEndOfLocalPlayList(cachedPlaylist.continuationData, (p) => { + videos.push(...p.items.map(parseLocalPlaylistVideo)) + }, { runCallbackOnceFirst: false }) - do { - playlist = await playlist.getContinuation() - - const parsedVideos = playlist.items.map(parseLocalPlaylistVideo) - items.push(...parsedVideos) - - if (!playlist.has_continuation) { - playlist = null - } - } while (playlist !== null) - - this.playlistItems = items + this.playlistItems = videos } this.isLoading = false @@ -351,7 +346,7 @@ export default defineComponent({ this.isLoading = true try { - let playlist = await getLocalPlaylist(this.playlistId) + const playlist = await getLocalPlaylist(this.playlistId) let channelName @@ -368,14 +363,10 @@ export default defineComponent({ this.channelName = channelName this.channelId = playlist.info.author?.id - const videos = playlist.items.map(parseLocalPlaylistVideo) - - while (playlist.has_continuation) { - playlist = await playlist.getContinuation() - - const parsedVideos = playlist.items.map(parseLocalPlaylistVideo) - videos.push(...parsedVideos) - } + const videos = [] + await untilEndOfLocalPlayList(playlist, (p) => { + videos.push(...p.items.map(parseLocalPlaylistVideo)) + }) this.playlistItems = videos diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index 98115c2357a07..f95bca91ef4c7 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -75,6 +75,47 @@ export async function getLocalPlaylist(id) { return await innertube.getPlaylist(id) } +/** + * @param {Playlist} playlist + * @returns {Playlist|null} null when no valid playlist can be found (e.g. `empty continuation response`) + */ +export async function getLocalPlaylistContinuation(playlist) { + try { + return await playlist.getContinuation() + } catch (error) { + // Youtube can provide useless continuation data + if (!error.message.includes('Got empty continuation response.')) { + // Re-throw unhandled error + throw error + } + + return null + } +} + +/** + * Callback for adding two numbers. + * + * @callback untilEndOfLocalPlayListCallback + * @param {Playlist} playlist + */ + +/** + * @param {Playlist} playlist + * @param {untilEndOfLocalPlayListCallback} callback + * @param {object} options + * @param {boolean} options.runCallbackOnceFirst + */ +export async function untilEndOfLocalPlayList(playlist, callback, options = { runCallbackOnceFirst: true }) { + if (options.runCallbackOnceFirst) { callback(playlist) } + + while (playlist != null && playlist.has_continuation) { + playlist = await getLocalPlaylistContinuation(playlist) + + if (playlist != null) { callback(playlist) } + } +} + /** * @param {string} location * @param {'default'|'music'|'gaming'|'movies'} tab diff --git a/src/renderer/views/Playlist/Playlist.js b/src/renderer/views/Playlist/Playlist.js index 05bfb29290196..0c668d2b683c6 100644 --- a/src/renderer/views/Playlist/Playlist.js +++ b/src/renderer/views/Playlist/Playlist.js @@ -6,7 +6,11 @@ import PlaylistInfo from '../../components/playlist-info/playlist-info.vue' import FtListVideoLazy from '../../components/ft-list-video-lazy/ft-list-video-lazy.vue' import FtFlexBox from '../../components/ft-flex-box/ft-flex-box.vue' import FtButton from '../../components/ft-button/ft-button.vue' -import { getLocalPlaylist, parseLocalPlaylistVideo } from '../../helpers/api/local' +import { + getLocalPlaylist, + getLocalPlaylistContinuation, + parseLocalPlaylistVideo, +} from '../../helpers/api/local' import { extractNumberFromString } from '../../helpers/utils' import { invidiousGetPlaylistInfo, youtubeImageUrlToInvidious } from '../../helpers/api/invidious' @@ -188,12 +192,16 @@ export default defineComponent({ getNextPageLocal: function () { this.isLoadingMore = true - this.continuationData.getContinuation().then((result) => { - const parsedVideos = result.items.map(parseLocalPlaylistVideo) - this.playlistItems = this.playlistItems.concat(parsedVideos) + getLocalPlaylistContinuation(this.continuationData).then((result) => { + if (result) { + const parsedVideos = result.items.map(parseLocalPlaylistVideo) + this.playlistItems = this.playlistItems.concat(parsedVideos) - if (result.has_continuation) { - this.continuationData = result + if (result.has_continuation) { + this.continuationData = result + } else { + this.continuationData = null + } } else { this.continuationData = null }