From c33e8010b38fb62bec41217c8d695dda8c677ca2 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 3 May 2022 00:34:36 -0400 Subject: [PATCH 1/5] Additional args now replace existing ones intelligently --- backend/consts.js | 79 +++++++++++++++++++++++++++++++++++++++++++ backend/downloader.js | 2 +- backend/test/tests.js | 7 ++++ backend/utils.js | 33 ++++++++++++++++++ 4 files changed, 120 insertions(+), 1 deletion(-) diff --git a/backend/consts.js b/backend/consts.js index 849fa4c..9bd2905 100644 --- a/backend/consts.js +++ b/backend/consts.js @@ -222,4 +222,83 @@ exports.AVAILABLE_PERMISSIONS = [ exports.DETAILS_BIN_PATH = 'node_modules/youtube-dl/bin/details' +// args that have a value after it (e.g. -o or -f ) +const YTDL_ARGS_WITH_VALUES = [ + '--default-search', + '--config-location', + '--proxy', + '--socket-timeout', + '--source-address', + '--geo-verification-proxy', + '--geo-bypass-country', + '--geo-bypass-ip-block', + '--playlist-start', + '--playlist-end', + '--playlist-items', + '--match-title', + '--reject-title', + '--max-downloads', + '--min-filesize', + '--max-filesize', + '--date', + '--datebefore', + '--dateafter', + '--min-views', + '--max-views', + '--match-filter', + '--age-limit', + '--download-archive', + '-r', + '--limit-rate', + '-R', + '--retries', + '--fragment-retries', + '--buffer-size', + '--http-chunk-size', + '--external-downloader', + '--external-downloader-args', + '-a', + '--batch-file', + '-o', + '--output', + '--output-na-placeholder', + '--autonumber-start', + '--load-info-json', + '--cookies', + '--cache-dir', + '--encoding', + '--user-agent', + '--referer', + '--add-header', + '--sleep-interval', + '--max-sleep-interval', + '-f', + '--format', + '--merge-output-format', + '--sub-format', + '--sub-lang', + '-u', + '--username', + '-p', + '--password', + '-2', + '--twofactor', + '--video-password', + '--ap-mso', + '--ap-username', + '--ap-password', + '--audio-format', + '--audio-quality', + '--recode-video', + '--postprocessor-args', + '--metadata-from-title', + '--fixup', + '--ffmpeg-location', + '--exec', + '--convert-subs' +]; + +// we're using a Set here for performance +exports.YTDL_ARGS_WITH_VALUES = new Set(YTDL_ARGS_WITH_VALUES); + exports.CURRENT_VERSION = 'v4.2'; diff --git a/backend/downloader.js b/backend/downloader.js index 108501b..99ed686 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -485,7 +485,7 @@ exports.generateArgs = async (url, type, options, user_uid = null, simulated = f } if (options.additionalArgs && options.additionalArgs !== '') { - downloadConfig = downloadConfig.concat(options.additionalArgs.split(',,')); + downloadConfig = utils.injectArgs(downloadConfig, options.additionalArgs.split(',,')); } const rate_limit = config_api.getConfigItem('ytdl_download_rate_limit'); diff --git a/backend/test/tests.js b/backend/test/tests.js index 9ae95a8..ec18dd5 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -386,6 +386,13 @@ describe('Downloader', function() { assert(fs.existsSync(nfo_file_path), true); fs.unlinkSync(nfo_file_path); }); + + it('Inject args', async function() { + const original_args = ['--no-resize-buffer', '-o', '%(title)s', '--no-mtime']; + const new_args = ['--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']; + const updated_args = utils.injectArgs(original_args, new_args); + assert(updated_args, ['--no-resize-buffer', '--no-mtime', '--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']); + }); }); describe('Tasks', function() { diff --git a/backend/utils.js b/backend/utils.js index a6eaf7e..b456659 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -415,6 +415,38 @@ async function fetchFile(url, path, file_label) { }); } +// adds or replaces args according to the following rules: +// - if it already exists and has value, then replace both arg and value +// - if already exists and doesn't have value, ignore +// - if it doesn't exist and has value, add both arg and value +// - if it doesn't exist and doesn't have value, add arg +function injectArgs(original_args, new_args) { + try { + for (let i = 0; i < new_args.length; i++) { + const new_arg = new_args[i]; + if (!new_arg.startsWith('-') && !new_arg.startsWith('--')) continue; + + if (CONSTS.YTDL_ARGS_WITH_VALUES.has(new_arg)) { + if (original_args.includes(new_arg)) { + const original_index = original_args.indexOf(new_arg); + original_args.splice(original_index, 2); + } + + original_args.push(new_arg, new_args[i + 1]); + } else { + if (!original_args.includes(new_arg)) { + original_args.push(new_arg); + } + } + } + } catch (err) { + logger.warn(err); + logger.warn(`Failed to inject args (${new_args}) into (${original_args})`); + } + + return original_args; +} + // objects function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) { @@ -458,5 +490,6 @@ module.exports = { wait: wait, checkExistsWithTimeout: checkExistsWithTimeout, fetchFile: fetchFile, + injectArgs: injectArgs, File: File } From ec1ccf6888fd8ffec51ac2ae6614a8441e366392 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 3 May 2022 00:35:02 -0400 Subject: [PATCH 2/5] Fixed bug that incorrectly told the UI that DB transfer failed --- backend/db.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/db.js b/backend/db.js index 64d2a64..17c2e5a 100644 --- a/backend/db.js +++ b/backend/db.js @@ -85,8 +85,6 @@ exports.initialize = (input_db, input_users_db) => { } exports.connectToDB = async (retries = 5, no_fallback = false, custom_connection_string = null) => { - using_local_db = config_api.getConfigItem('ytdl_use_local_db'); // verify - if (using_local_db && !custom_connection_string) return; const success = await exports._connectToDB(custom_connection_string); if (success) return true; From 9515d5a1b00f544a5339b8d19883dcd46eba360e Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Wed, 4 May 2022 22:01:51 -0400 Subject: [PATCH 3/5] Fixed issue where additional args wouldn't properly inject --- backend/test/tests.js | 16 ++++++++++++---- backend/utils.js | 9 +++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/backend/test/tests.js b/backend/test/tests.js index ec18dd5..0a05f6b 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -388,10 +388,18 @@ describe('Downloader', function() { }); it('Inject args', async function() { - const original_args = ['--no-resize-buffer', '-o', '%(title)s', '--no-mtime']; - const new_args = ['--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']; - const updated_args = utils.injectArgs(original_args, new_args); - assert(updated_args, ['--no-resize-buffer', '--no-mtime', '--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']); + const original_args1 = ['--no-resize-buffer', '-o', '%(title)s', '--no-mtime']; + const new_args1 = ['--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']; + const updated_args1 = utils.injectArgs(original_args1, new_args1); + const expected_args1 = ['--no-resize-buffer', '--no-mtime', '--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']; + assert(JSON.stringify(updated_args1), JSON.stringify(expected_args1)); + + const original_args2 = ['-o', '%(title)s.%(ext)s', '--write-info-json', '--print-json', '--audio-quality', '0', '-x', '--audio-format', 'mp3']; + const new_args2 = ['--add-metadata', '--embed-thumbnail', '--convert-thumbnails', 'jpg']; + const updated_args2 = utils.injectArgs(original_args2, new_args2); + const expected_args2 = ['-o', '%(title)s.%(ext)s', '--write-info-json', '--print-json', '--audio-quality', '0', '-x', '--audio-format', 'mp3', '--add-metadata', '--embed-thumbnail', '--convert_thumbnails', 'jpg']; + console.log(updated_args2); + assert(JSON.stringify(updated_args2), JSON.stringify(expected_args2)); }); }); diff --git a/backend/utils.js b/backend/utils.js index b456659..e12fc03 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -421,10 +421,11 @@ async function fetchFile(url, path, file_label) { // - if it doesn't exist and has value, add both arg and value // - if it doesn't exist and doesn't have value, add arg function injectArgs(original_args, new_args) { + const updated_args = original_args.slice(); try { for (let i = 0; i < new_args.length; i++) { const new_arg = new_args[i]; - if (!new_arg.startsWith('-') && !new_arg.startsWith('--')) continue; + if (!new_arg.startsWith('-') && !new_arg.startsWith('--') && i > 0 && original_args.includes(new_args[i - 1])) continue; if (CONSTS.YTDL_ARGS_WITH_VALUES.has(new_arg)) { if (original_args.includes(new_arg)) { @@ -432,10 +433,10 @@ function injectArgs(original_args, new_args) { original_args.splice(original_index, 2); } - original_args.push(new_arg, new_args[i + 1]); + updated_args.push(new_arg, new_args[i + 1]); } else { if (!original_args.includes(new_arg)) { - original_args.push(new_arg); + updated_args.push(new_arg); } } } @@ -444,7 +445,7 @@ function injectArgs(original_args, new_args) { logger.warn(`Failed to inject args (${new_args}) into (${original_args})`); } - return original_args; + return updated_args; } // objects From 692d6eeaac1989362572982f7debd48e59c0d46e Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Wed, 4 May 2022 22:02:43 -0400 Subject: [PATCH 4/5] Added edit button for playlist subscriptions --- src/app/subscriptions/subscriptions.component.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/app/subscriptions/subscriptions.component.html b/src/app/subscriptions/subscriptions.component.html index be283cf..be9f71c 100644 --- a/src/app/subscriptions/subscriptions.component.html +++ b/src/app/subscriptions/subscriptions.component.html @@ -36,6 +36,9 @@ Name not available. Playlist retrieval in progress. + From 664b63543952e943d0885369d4c2dde698b702ed Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 5 May 2022 00:56:46 -0400 Subject: [PATCH 5/5] Updated English source translation file --- package.json | 3 +- src/assets/i18n/messages.en.xlf | 3464 ++++++++++++++++--------------- 2 files changed, 1803 insertions(+), 1664 deletions(-) diff --git a/package.json b/package.json index 43dd6cb..8571420 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "lint": "ng lint", "e2e": "ng e2e", "electron": "ng build --base-href ./ && electron .", - "generate": "openapi --input ./\"Public API v1.yaml\" --output ./src/api-types --exportCore false --exportServices false --exportModels true" + "generate": "openapi --input ./\"Public API v1.yaml\" --output ./src/api-types --exportCore false --exportServices false --exportModels true", + "i18n-source": "ng extract-i18n --output-path=src/assets/i18n" }, "engines": { "node": "12.3.1", diff --git a/src/assets/i18n/messages.en.xlf b/src/assets/i18n/messages.en.xlf index bab8d85..95f5ddc 100644 --- a/src/assets/i18n/messages.en.xlf +++ b/src/assets/i18n/messages.en.xlf @@ -1,15 +1,7 @@ - - - + + + - - About - - src/app/app.component.html - 32 - - About menu label - Profile @@ -30,6 +22,14 @@ Dark mode toggle label + + About + + src/app/app.component.html + 32 + + About menu label + Home @@ -70,11 +70,19 @@ Navigation menu Downloads Page title + + Tasks + + src/app/app.component.html + 47 + + Navigation menu Tasks Page title + Settings src/app/app.component.html - 49 + 50 src/app/settings/settings.component.html @@ -82,240 +90,893 @@ Settings menu label - - Download for has been queued! + + Date - src/app/main/main.component.ts - 469 + src/app/components/downloads/downloads.component.html + 7 + Date - - Only Audio + + Title - src/app/main/main.component.html - 65,66 + src/app/components/downloads/downloads.component.html + 13 - Only Audio checkbox - - - Download - src/app/main/main.component.html - 79,80 + src/app/components/tasks/tasks.component.html + 6 - Main download button + Title - - Quality + + Subscription - src/app/main/main.component.html - 19,20 + src/app/components/downloads/downloads.component.html + 23 - Quality select label + Subscription - - Use URL + + Stage - src/app/main/main.component.html - 51 + src/app/components/downloads/downloads.component.html + 36 - YT search Use URL button for searched video + Stage - - View + + Progress - src/app/main/main.component.html - 55,56 + src/app/components/downloads/downloads.component.html + 42 - YT search View button for searched video + Progress - - Autoplay + + Actions - src/app/main/main.component.html - 70,71 + src/app/components/downloads/downloads.component.html + 55 - Autoplay checkbox - - - Cancel - src/app/main/main.component.html + src/app/components/tasks/tasks.component.html + 49 + + Actions + + + Pause + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Cancel + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/modify-users/modify-users.component.html + 61 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 84,85 - Cancel download button - - - Advanced - src/app/main/main.component.html - 96,97 - - Advanced download mode panel - - - Use custom args - - src/app/main/main.component.html - 110,111 - - Use custom args checkbox - - - Replace args - - src/app/main/main.component.html - 116,117 - - Replace args - - - Custom args - - src/app/main/main.component.html - 120 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 57 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 44 - - Custom args placeholder - - - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - - src/app/main/main.component.html - 123,124 - - Custom Args input hint - - - Use custom output - - src/app/main/main.component.html - 131,132 - - Use custom output checkbox - - - Custom output - - src/app/main/main.component.html - 135 - - Custom output placeholder - - - Documentation - - src/app/main/main.component.html - 137 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 69 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 56 + src/app/dialogs/confirm-dialog/confirm-dialog.component.html + 16 src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 47 + 54 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html + 24 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 51 src/app/settings/settings.component.html - 117 + 492 - Youtube-dl output template documentation link + Cancel - - Path is relative to the config download path. Don't include extension. + + Watch content - src/app/main/main.component.html - 138 + src/app/components/downloads/downloads.component.html + 64 - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 70 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 57 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 48 - - Custom Output input hint + Watch content - - Crop file + + Show error - src/app/main/main.component.html - 160,161 + src/app/components/downloads/downloads.component.html + 65 - Crop video checkbox + Show error - - Simulated command: + + Restart - src/app/main/main.component.html - 102,103 + src/app/components/downloads/downloads.component.html + 66 - Simulated command label + Restart - - Use authentication + + Clear - src/app/main/main.component.html - 145,146 + src/app/components/downloads/downloads.component.html + 68 - Use authentication checkbox + Clear - - Username + + Pause all downloads - src/app/main/main.component.html - 149 + src/app/components/downloads/downloads.component.html + 83 - YT Username placeholder + Pause all downloads - - Password + + Resume all downloads - src/app/main/main.component.html - 154 + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + No downloads available! + + src/app/components/downloads/downloads.component.html + 90 + + No downloads label + + + Creating download + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Register + + src/app/components/login/login.component.html + 38 src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 11 + 17 + + Register + + + Lines: + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Manage role + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Yes + + src/app/components/manage-role/manage-role.component.html + 9 - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + src/app/components/manage-user/manage-user.component.html + 20 + + Yes + + + No + + src/app/components/manage-role/manage-role.component.html 10 - YT Password placeholder - - - Crop from (seconds) - src/app/main/main.component.html - 164 + src/app/components/manage-user/manage-user.component.html + 21 - Crop from placeholder + No - - Crop to (seconds) + + Close - src/app/main/main.component.html - 169 + src/app/components/manage-role/manage-role.component.html + 18 - Crop to placeholder + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 70 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + Close + + + Manage user + + src/app/components/manage-user/manage-user.component.html + 1 + + + src/app/components/modify-users/modify-users.component.html + 70 + + Manage user dialog title + + + User UID: + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Search + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/subscription/subscription/subscription.component.html + 33 + + search field description + + + User name + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Save + + src/app/components/modify-users/modify-users.component.html + 58 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/settings/settings.component.html + 489 + + save user edit action button tooltip + + + Edit user + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + Delete user + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Add Users + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + My videos + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + No videos found. + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + File type + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + See more. + + src/app/components/see-more/see-more.component.html + 4,6 + + See more + + + See less. + + src/app/components/see-more/see-more.component.html + 7,9 + + See less + + + Skip ad + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Last ran + + src/app/components/tasks/tasks.component.html + 16 + + Last ran + + + N/A + + src/app/components/tasks/tasks.component.html + 19 + + + src/app/components/tasks/tasks.component.html + 28 + + N/A + + + Last confirmed + + src/app/components/tasks/tasks.component.html + 25 + + Last confirmed + + + Status + + src/app/components/tasks/tasks.component.html + 34 + + Status + + + Busy + + src/app/components/tasks/tasks.component.html + 36 + + Busy + + + Scheduled for + + src/app/components/tasks/tasks.component.html + 38 + + Scheduled + + + Not scheduled + + src/app/components/tasks/tasks.component.html + 42 + + Not scheduled + + + Clear missing files from DB: + + src/app/components/tasks/tasks.component.html + 57 + + Clear missing files from DB + + + Clear duplicate files from DB: + + src/app/components/tasks/tasks.component.html + 60 + + Clear duplicate files from DB + + + Update binary to: + + src/app/components/tasks/tasks.component.html + 63 + + Update binary to + + + Run + + src/app/components/tasks/tasks.component.html + 69 + + Run + + + Schedule + + src/app/components/tasks/tasks.component.html + 72 + + Schedule + + + Restore DB from backup + + src/app/components/tasks/tasks.component.html + 89 + + + src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html + 1 + + Restore DB from backup button + + + Reset tasks + + src/app/components/tasks/tasks.component.html + 90 + + Reset tasks button + + + No tasks available! + + src/app/components/tasks/tasks.component.html + 94 + + No tasks label + + + Successfully ran task! + + src/app/components/tasks/tasks.component.ts + 78 + + + + Failed to run task! + + src/app/components/tasks/tasks.component.ts + 79 + + + src/app/components/tasks/tasks.component.ts + 81 + + + + Successfully confirmed task! + + src/app/components/tasks/tasks.component.ts + 89 + + + + Failed to confirm task! + + src/app/components/tasks/tasks.component.ts + 90 + + + src/app/components/tasks/tasks.component.ts + 92 + + + + Reset tasks + + src/app/components/tasks/tasks.component.ts + 132 + + + + Would you like to reset your tasks? All your schedules will be removed as well. + + src/app/components/tasks/tasks.component.ts + 133 + + + + Reset + + src/app/components/tasks/tasks.component.ts + 134 + + + + Tasks successfully reset! + + src/app/components/tasks/tasks.component.ts + 142 + + + + Failed to reset tasks! + + src/app/components/tasks/tasks.component.ts + 144 + + + src/app/components/tasks/tasks.component.ts + 147 + + + + Download Twitch Chat + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Auto-generated + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Info + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Go to subscription + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Add to playlist + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Delete and redownload + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + Delete + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + + src/app/components/unified-file-card/unified-file-card.component.html + 45 + + Delete video button + + + Delete and blacklist + + src/app/components/unified-file-card/unified-file-card.component.html + 40 + + Delete and blacklist video button + + + Edit + + src/app/components/unified-file-card/unified-file-card.component.html + 43 + + Playlist edit button Create a playlist @@ -331,14 +992,14 @@ src/app/create-playlist/create-playlist.component.html 6 - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 8 - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 5 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + Playlist name placeholder @@ -385,6 +1046,578 @@ Videos title + + About YoutubeDL-Material + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Checking for updates... + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Installation type: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Docker tag: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Commit hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Build date: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Found a bug or have a suggestion? + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug prefix + + + Click here + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + + src/app/settings/settings.component.html + 283 + + + src/app/settings/settings.component.html + 289 + + About bug click here + + + to create an issue! + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug suffix + + + Register a user + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Password + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + + src/app/main/main.component.html + 154,156 + + Password placeholder + + + Modify youtube-dl args + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1,6 + + Modify args title + + + Simulated new args + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8,9 + + Simulated args title + + + Add an arg + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34,37 + + Add arg card title + + + Search by category + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60,63 + + Search args by category button + + + Use arg value + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64,66 + + Use arg value checkbox + + + Arg value + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68,69 + + Arg value placeholder + + + Add arg + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73,77 + + Search args by category button + + + Modify + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85,86 + + Arg modifier modify button + + + Upload new cookies + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + Drag and Drop + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Editing category + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Custom file output + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + Category custom file output placeholder + + + Documentation + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/main/main.component.html + 137,138 + + + src/app/settings/settings.component.html + 119 + + Custom output template documentation link + + + Path is relative to the config download path. Don't include extension. + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/main/main.component.html + 138,140 + + Custom Output input hint + + + Editing + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + (Paused) + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/subscription/subscription/subscription.component.html + 5 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 34 + + Paused suffix + + + Paused + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Download all uploads + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + Download all uploads subscription setting + + + Download videos uploaded in the last + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + Download time range prefix + + + Audio-only mode + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + Streaming-only mode + + + Max quality + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + Max quality placeholder + + + Streaming-only mode + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + Streaming-only mode + + + Custom args + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/main/main.component.html + 120,122 + + Subscription custom args placeholder + + + These are added after the standard args. + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + Custom args hint + + + Modify playlist + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Randomize order when playing + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Normal order  + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order  + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + Add content + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Restore + + src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html + 25 + + Restore button + + + Create admin account + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Share playlist + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Enable sharing + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + Subscribe to playlist or channel @@ -421,122 +1654,6 @@ Subscription custom name placeholder - - Download all uploads - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 23 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 10 - - Download all uploads subscription setting - - - Max quality - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 40 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 32 - - Max quality placeholder - - - Audio-only mode - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 47 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 27 - - Streaming-only mode - - - Streaming-only mode - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 52 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 39 - - Streaming-only mode - - - These are added after the standard args. - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 60 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 47 - - Custom args hint - - - Custom file output - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 66 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 53 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 44 - - Subscription custom file output placeholder - - - Cancel - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 79 - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 84 - - - src/app/dialogs/confirm-dialog/confirm-dialog.component.html - 16 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 66 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 54 - - - src/app/settings/settings.component.html - 490 - - - src/app/components/downloads/downloads.component.html - 61 - - - src/app/components/downloads/downloads.component.html - 61 - - - src/app/components/modify-users/modify-users.component.html - 61 - - Subscribe cancel button - Subscribe @@ -545,18 +1662,6 @@ Subscribe button - - Download videos uploaded in the last - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 26 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 13 - - Download time range prefix - Type: @@ -583,59 +1688,15 @@ src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 13 - - src/app/file-card/file-card.component.html - 7 - - - src/app/download-item/download-item.component.html - 4 - Subscription ID property - - Close + + Archive: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 23 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 35 - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html 17 - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 18 - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 40 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 70 - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 29 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 27 - - - src/app/components/manage-user/manage-user.component.html - 30 - - - src/app/components/manage-role/manage-role.component.html - 18 - - Close subscription info button + Subscription ID property Export Archive @@ -653,49 +1714,97 @@ Unsubscribe button - - (Paused) + + Updater - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html 1 - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - - src/app/subscriptions/subscriptions.component.html - 12 - - - src/app/subscriptions/subscriptions.component.html - 34 - - - src/app/subscription/subscription/subscription.component.html - 5 - - Paused suffix + Update progress dialog title - - Archive: + + Update task schedule - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 17 + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 1 - Subscription ID property + Update task schedule + + + Enabled + + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 7 + + Enabled + + + Recurring + + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 10 + + Recurring + + + Update + + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 52 + + Update button + + + Your Profile + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title Name: - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 5 - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 6 - Video name property + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + Name + + + UID: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Logout + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout Uploader: @@ -737,373 +1846,164 @@ Category property - - Modify youtube-dl args + + Quality - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 1 + src/app/main/main.component.html + 19,20 - Modify args title + Quality select label - - Simulated new args + + Use URL - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 8 + src/app/main/main.component.html + 51,53 - Simulated args title + YT search Use URL button for searched video - - Add an arg + + View - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 34 + src/app/main/main.component.html + 55,57 - Add arg card title + YT search View button for searched video - - Search by category + + Only Audio - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 60 + src/app/main/main.component.html + 65,67 - Search args by category button + Only Audio checkbox - - Use arg value + + Autoplay - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 64 + src/app/main/main.component.html + 70,72 - Use arg value checkbox + Autoplay checkbox - - Add arg + + Download - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 73 + src/app/main/main.component.html + 79,82 - Search args by category button + Main download button - - Modify + + Cancel - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 85 + src/app/main/main.component.html + 84,87 - Arg modifier modify button + Cancel download button - - Arg value + + Advanced - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 68 + src/app/main/main.component.html + 96,99 - Arg value placeholder + Advanced download mode panel - - Updater + + Simulated command: - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 1 + src/app/main/main.component.html + 102,104 - Update progress dialog title + Simulated command label - - Register a user + + Use custom args - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 1 + src/app/main/main.component.html + 110,112 - Register user dialog title + Use custom args checkbox - - User name + + Replace args - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 6 + src/app/main/main.component.html + 116,118 - User name placeholder + Replace args - - Register + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 17 + src/app/main/main.component.html + 123,125 - - src/app/components/login/login.component.html - 38 - - Register user button + Custom Args input hint - - Upload new cookies + + Use custom output - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 1 + src/app/main/main.component.html + 131,133 - Cookies uploader dialog title + Use custom output checkbox - - NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + Custom output - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 20 + src/app/main/main.component.html + 135,136 - Cookies upload warning + Custom output placeholder - - Drag and Drop + + Use authentication - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 11 + src/app/main/main.component.html + 145,147 - Drag and Drop + Use authentication checkbox - - Modify playlist + + Username - src/app/dialogs/modify-playlist/modify-playlist.component.html - 1 + src/app/main/main.component.html + 149,151 - Modify playlist dialog title + YT Username placeholder - - Save + + Crop file - src/app/dialogs/modify-playlist/modify-playlist.component.html - 43 + src/app/main/main.component.html + 160,162 - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 68 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 56 - - - src/app/settings/settings.component.html - 487 - - - src/app/components/modify-users/modify-users.component.html - 58 - - Save + Crop video checkbox - - Randomize order when playing + + Crop from (seconds) - src/app/dialogs/modify-playlist/modify-playlist.component.html - 13 + src/app/main/main.component.html + 164,166 - Randomize order when playing checkbox label + Crop from placeholder - - Add content + + Crop to (seconds) - src/app/dialogs/modify-playlist/modify-playlist.component.html - 24 + src/app/main/main.component.html + 169,171 - Add content + Crop to placeholder - - Normal order  + + Download for has been queued! - src/app/dialogs/modify-playlist/modify-playlist.component.html - 18 + src/app/main/main.component.ts + 403 - Normal order - - - Reverse order  - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 19 - - Reverse order - - - My videos - - src/app/components/recent-videos/recent-videos.component.html - 20 - - My videos title - - - Search - - src/app/components/recent-videos/recent-videos.component.html - 24 - - - src/app/components/modify-users/modify-users.component.html - 7 - - - src/app/subscription/subscription/subscription.component.html - 33 - - Files search placeholder - - - File type - - src/app/components/recent-videos/recent-videos.component.html - 52 - - File type - - - Both - - src/app/components/recent-videos/recent-videos.component.html - 54 - - Both - - - Video only - - src/app/components/recent-videos/recent-videos.component.html - 55 - - Video only - - - Audio only - - src/app/components/recent-videos/recent-videos.component.html - 56 - - Audio only - - - No videos found. - - src/app/components/recent-videos/recent-videos.component.html - 38 - - No videos found - - - Editing - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - Edit subscription dialog title prefix - - - Paused - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 7 - - Paused subscription setting - - - Editing category - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 1 - - Editing category dialog title - - - Rules - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 10 - - Rules - - - Add new rule - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 39 - - Add new rule tooltip - - - Download Twitch Chat - - src/app/components/twitch-chat/twitch-chat.component.html - 10 - - Download Twitch Chat button - - - Edit - - src/app/file-card/file-card.component.html - 19 - - - src/app/components/unified-file-card/unified-file-card.component.html - 43 - - Playlist edit button - - - Delete - - src/app/file-card/file-card.component.html - 20 - - - src/app/file-card/file-card.component.html - 25 - - - src/app/components/unified-file-card/unified-file-card.component.html - 39 - - - src/app/components/unified-file-card/unified-file-card.component.html - 45 - - Delete playlist - - - Info - - src/app/file-card/file-card.component.html - 24 - - - src/app/components/unified-file-card/unified-file-card.component.html - 24 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 7 - - Video info button - - - Count: - - src/app/file-card/file-card.component.html - 8 - - Playlist video count - - - Delete and blacklist - - src/app/file-card/file-card.component.html - 26 - - - src/app/components/unified-file-card/unified-file-card.component.html - 40 - - Delete and blacklist video button views @@ -1113,133 +2013,6 @@ View count label - - The download was successful - - src/app/download-item/download-item.component.html - 8 - - - src/app/download-item/download-item.component.html - 8 - - download successful tooltip - - - An error has occurred - - src/app/download-item/download-item.component.html - 9 - - - src/app/download-item/download-item.component.html - 9 - - download error tooltip - - - Details - - src/app/download-item/download-item.component.html - 18 - - Details - - - An error has occurred: - - src/app/download-item/download-item.component.html - 27 - - Error label - - - Download start: - - src/app/download-item/download-item.component.html - 32 - - Download start label - - - Download end: - - src/app/download-item/download-item.component.html - 35 - - Download end label - - - File path(s): - - src/app/download-item/download-item.component.html - 38 - - File path(s) label - - - Your subscriptions - - src/app/subscriptions/subscriptions.component.html - 3 - - Subscriptions title - - - Channels - - src/app/subscriptions/subscriptions.component.html - 8 - - Subscriptions channels title - - - Playlists - - src/app/subscriptions/subscriptions.component.html - 30 - - Subscriptions playlists title - - - Name not available. Channel retrieval in progress. - - src/app/subscriptions/subscriptions.component.html - 14 - - Subscription playlist not available text - - - You have no channel subscriptions. - - src/app/subscriptions/subscriptions.component.html - 27 - - No channel subscriptions text - - - Name not available. Playlist retrieval in progress. - - src/app/subscriptions/subscriptions.component.html - 36 - - Subscription playlist not available text - - - You have no playlist subscriptions. - - src/app/subscriptions/subscriptions.component.html - 46 - - No playlist subscriptions text - - - You must enable multi-user mode to access this tab. - - src/app/settings/settings.component.ts - 48 - - Main @@ -1248,50 +2021,6 @@ Main settings label - - Downloader - - src/app/settings/settings.component.html - 94 - - Downloader settings label - - - Extra - - src/app/settings/settings.component.html - 198 - - Extra settings label - - - Database - - src/app/settings/settings.component.html - 303 - - Database settings label - - - Advanced - - src/app/settings/settings.component.html - 339 - - Host settings label - - - Logs - - src/app/settings/settings.component.html - 476 - - - src/app/settings/settings.component.html - 476 - - Logs settings label - URL this app will be accessed from, without the port. @@ -1349,8 +2078,7 @@ Allow subscriptions setting - Base bath for subscriptions - Base bath for subscriptions + Subscriptions base path src/app/settings/settings.component.html 44 @@ -1358,7 +2086,7 @@ Subscriptions base path input setting placeholder - Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html 45 @@ -1429,19 +2157,27 @@ Language select label + + Downloader + + src/app/settings/settings.component.html + 96 + + Downloader settings label + Audio folder path src/app/settings/settings.component.html - 101 + 103 Audio folder path input placeholder - Path for audio only downloads. It is relative to YTDL-Material's root folder. + Path for audio only downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 102 + 104 Aduio path setting input hint @@ -1449,15 +2185,15 @@ Video folder path src/app/settings/settings.component.html - 108 + 110 Video folder path input placeholder - Path for video downloads. It is relative to YTDL-Material's root folder. + Path for video downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 109 + 111 Video path setting input hint @@ -1465,15 +2201,15 @@ Default file output src/app/settings/settings.component.html - 115 + 117 Default file output placeholder - Path is relative to the above download paths. Don't include extension. + Path is relative to the above download paths. Don't include extension. src/app/settings/settings.component.html - 118 + 120 Custom Output input hint @@ -1481,15 +2217,15 @@ Global custom args src/app/settings/settings.component.html - 125 + 127 Custom args input placeholder - + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, src/app/settings/settings.component.html - 126 + 128 Custom args setting input hint @@ -1497,7 +2233,7 @@ Categories src/app/settings/settings.component.html - 136 + 138 Categories @@ -1505,7 +2241,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. src/app/settings/settings.component.html - 150 + 152 Allow playlist categorization setting tooltip @@ -1513,7 +2249,7 @@ Allow playlist categorization src/app/settings/settings.component.html - 150 + 152 Allow playlist categorization setting label @@ -1521,7 +2257,7 @@ Use youtube-dl archive src/app/settings/settings.component.html - 158 + 160 Use youtubedl archive setting @@ -1529,7 +2265,7 @@ Include thumbnail src/app/settings/settings.component.html - 162 + 164 Include thumbnail setting @@ -1537,7 +2273,7 @@ Include metadata src/app/settings/settings.component.html - 166 + 168 Include metadata setting @@ -1545,7 +2281,7 @@ Max concurrent downloads src/app/settings/settings.component.html - 175 + 177 Max concurrent downloads @@ -1553,7 +2289,7 @@ Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. src/app/settings/settings.component.html - 176 + 178 Max concurrent downloads input hint @@ -1561,7 +2297,7 @@ Download rate limit src/app/settings/settings.component.html - 181 + 183 Download rate limit input placeholder @@ -1569,7 +2305,7 @@ Rate limits your downloads to the specified amount. Ex: 200K src/app/settings/settings.component.html - 182 + 184 Download rate limit input hint @@ -1577,15 +2313,23 @@ Kill all downloads src/app/settings/settings.component.html - 191 + 193 Kill all downloads button + + Extra + + src/app/settings/settings.component.html + 200 + + Extra settings label + Top title src/app/settings/settings.component.html - 204 + 206 Top title input placeholder @@ -1593,7 +2337,7 @@ File manager enabled src/app/settings/settings.component.html - 209 + 211 File manager enabled setting @@ -1601,7 +2345,7 @@ Downloads manager enabled src/app/settings/settings.component.html - 212 + 214 Downloads manager enabled setting @@ -1609,7 +2353,7 @@ Allow quality select src/app/settings/settings.component.html - 215 + 217 Allow quality seelct setting @@ -1617,7 +2361,7 @@ Download only mode src/app/settings/settings.component.html - 218 + 220 Download only mode setting @@ -1625,7 +2369,7 @@ Allow autoplay src/app/settings/settings.component.html - 221 + 223 Allow autoplay setting @@ -1633,7 +2377,7 @@ Enable Public API src/app/settings/settings.component.html - 229 + 231 Enable Public API key setting @@ -1641,7 +2385,7 @@ Public API Key src/app/settings/settings.component.html - 234 + 236 Public API Key setting placeholder @@ -1649,7 +2393,7 @@ View documentation src/app/settings/settings.component.html - 235 + 237 View API docs setting hint @@ -1657,7 +2401,7 @@ This will delete your old API key! src/app/settings/settings.component.html - 239 + 241 delete api key tooltip @@ -1665,7 +2409,7 @@ Generate src/app/settings/settings.component.html - 239 + 241 Generate key button @@ -1673,7 +2417,7 @@ Use YouTube API src/app/settings/settings.component.html - 248 + 250 Use YouTube API setting @@ -1681,7 +2425,7 @@ Youtube API Key src/app/settings/settings.component.html - 252 + 254 Youtube API Key setting placeholder @@ -1689,11 +2433,11 @@ Generating a key is easy! src/app/settings/settings.component.html - 253 + 255 src/app/settings/settings.component.html - 265 + 267 Youtube API Key setting hint @@ -1701,15 +2445,23 @@ Use Twitch API src/app/settings/settings.component.html - 257 + 259 Use Twitch API setting + + Auto-download Twitch Chat + + src/app/settings/settings.component.html + 262 + + Auto download Twitch Chat setting + Twitch API Key src/app/settings/settings.component.html - 264 + 266 Twitch API Key setting placeholder @@ -1717,7 +2469,7 @@ Also known as a Client ID. src/app/settings/settings.component.html - 265 + 267 Twitch API Key setting hint AKA preamble @@ -1725,7 +2477,7 @@ Enables a button to skip ads when viewing supported videos. src/app/settings/settings.component.html - 269 + 271 SponsorBlock API tooltip @@ -1733,7 +2485,7 @@ Use SponsorBlock API src/app/settings/settings.component.html - 269 + 271 Use SponsorBlock API setting @@ -1741,7 +2493,7 @@ Generates NFO files with every download, primarily used by Kodi. src/app/settings/settings.component.html - 272 + 274 Generate NFO files tooltip @@ -1749,47 +2501,23 @@ Generate NFO files src/app/settings/settings.component.html - 272 + 274 Generate NFO files setting - - Auto-download Twitch Chat - - src/app/settings/settings.component.html - 260 - - Auto download Twitch Chat setting - - - Click here - - src/app/settings/settings.component.html - 281 - - - src/app/settings/settings.component.html - 287 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - Chrome ext click here - to download the official YoutubeDL-Material Chrome extension manually. src/app/settings/settings.component.html - 281 + 283 Chrome click here suffix - You must manually load the extension and modify the extension's settings to set the frontend URL. + You must manually load the extension and modify the extension's settings to set the frontend URL. src/app/settings/settings.component.html - 282 + 284 Chrome setup suffix @@ -1797,7 +2525,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. src/app/settings/settings.component.html - 287 + 289 Firefox click here suffix @@ -1805,39 +2533,47 @@ Detailed setup instructions. src/app/settings/settings.component.html - 288 + 290 Firefox setup prefix link - Not much is required other than changing the extension's settings to set the frontend URL. + Not much is required other than changing the extension's settings to set the frontend URL. src/app/settings/settings.component.html - 288 + 290 Firefox setup suffix - Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. src/app/settings/settings.component.html - 293 + 295 Bookmarklet instructions - Generate 'audio only' bookmarklet + Generate 'audio only' bookmarklet src/app/settings/settings.component.html - 294 + 296 Generate audio only bookmarklet checkbox + + Database + + src/app/settings/settings.component.html + 305 + + Database settings label + Database location: src/app/settings/settings.component.html - 309 + 311 Database location label @@ -1845,7 +2581,7 @@ Records per table src/app/settings/settings.component.html - 310 + 312 Records per table label @@ -1853,7 +2589,7 @@ MongoDB Connection String src/app/settings/settings.component.html - 318 + 320 MongoDB Connection String @@ -1861,7 +2597,7 @@ Example: src/app/settings/settings.component.html - 319 + 321 MongoDB Connection String setting hint AKA preamble @@ -1869,7 +2605,7 @@ Test connection string src/app/settings/settings.component.html - 323 + 325 Test connection string button @@ -1877,7 +2613,7 @@ Transfer DB to src/app/settings/settings.component.html - 327 + 329 Transfer DB button @@ -1885,15 +2621,23 @@ Database information could not be retrieved. Check the server logs for more information. src/app/settings/settings.component.html - 331 + 333 Database info not retrieved error message + + Advanced + + src/app/settings/settings.component.html + 341 + + Host settings label + Select a downloader src/app/settings/settings.component.html - 345 + 347 Default downloader select label @@ -1901,7 +2645,7 @@ Use default downloading agent src/app/settings/settings.component.html - 354 + 356 Use default downloading agent setting @@ -1909,7 +2653,7 @@ Select a download agent src/app/settings/settings.component.html - 358 + 360 Custom downloader select label @@ -1917,7 +2661,7 @@ Log Level src/app/settings/settings.component.html - 372 + 374 Log Level label @@ -1925,7 +2669,7 @@ Login expiration src/app/settings/settings.component.html - 384 + 386 Login expiration select label @@ -1933,7 +2677,7 @@ Allow advanced download src/app/settings/settings.component.html - 395 + 397 Allow advanced downloading setting @@ -1941,7 +2685,7 @@ Use Cookies src/app/settings/settings.component.html - 403 + 405 Use cookies setting @@ -1949,7 +2693,7 @@ Set Cookies src/app/settings/settings.component.html - 404 + 406 Set cookies button @@ -1957,7 +2701,7 @@ Restart server src/app/settings/settings.component.html - 416 + 418 Restart server button @@ -1965,7 +2709,7 @@ Users src/app/settings/settings.component.html - 425 + 427 Users settings label @@ -1973,7 +2717,7 @@ Allow user registration src/app/settings/settings.component.html - 431 + 433 Allow registration setting @@ -1981,7 +2725,7 @@ Auth method src/app/settings/settings.component.html - 435 + 437 Auth method select @@ -1989,7 +2733,7 @@ Internal src/app/settings/settings.component.html - 437 + 439 Internal auth method @@ -1997,7 +2741,7 @@ LDAP src/app/settings/settings.component.html - 440 + 442 LDAP auth method @@ -2005,7 +2749,7 @@ LDAP URL src/app/settings/settings.component.html - 447 + 449 LDAP URL @@ -2013,7 +2757,7 @@ Bind DN src/app/settings/settings.component.html - 452 + 454 Bind DN @@ -2021,7 +2765,7 @@ Bind Credentials src/app/settings/settings.component.html - 457 + 459 Bind Credentials @@ -2029,7 +2773,7 @@ Search Base src/app/settings/settings.component.html - 462 + 464 Search Base @@ -2037,694 +2781,24 @@ Search Filter src/app/settings/settings.component.html - 467 + 469 Search Filter - - About YoutubeDL-Material + + Logs - src/app/dialogs/about-dialog/about-dialog.component.html - 1 + src/app/settings/settings.component.html + 478 - About dialog title + Logs settings label - - is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + You must enable multi-user mode to access this tab. - src/app/dialogs/about-dialog/about-dialog.component.html - 12 + src/app/settings/settings.component.ts + 48 - About first paragraph - - - has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - - src/app/dialogs/about-dialog/about-dialog.component.html - 15 - - About second paragraph - - - Installed version: - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Version label - - - Installation type: - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - Installation type - - - Commit hash: - - src/app/dialogs/about-dialog/about-dialog.component.html - 31 - - Commit hash - - - Build date: - - src/app/dialogs/about-dialog/about-dialog.component.html - 33 - - Build date - - - Found a bug or have a suggestion? - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - About bug prefix - - - to create an issue! - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - About bug suffix - - - Checking for updates... - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Checking for updates text - - - Update available - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - View latest update - - - You can update from the settings menu. - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - Update through settings menu hint - - - Docker tag: - - src/app/dialogs/about-dialog/about-dialog.component.html - 28 - - Docker tag - - - Select a version: - - src/app/updater/updater.component.html - 3 - - Select a version - - - Enable sharing - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 9 - - Enable sharing checkbox - - - Use timestamp - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 12 - - Use timestamp - - - Seconds - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 14 - - Seconds - - - Copy to clipboard - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 23 - - Copy to clipboard button - - - Share playlist - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 2 - - Share playlist dialog title - - - Share file - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 3 - - Share video dialog title - - - Creating download - - src/app/components/downloads/downloads.component.ts - 58 - - - - Getting info - - src/app/components/downloads/downloads.component.ts - 59 - - - - Downloading file - - src/app/components/downloads/downloads.component.ts - 60 - - - - Complete - - src/app/components/downloads/downloads.component.ts - 61 - - - - Clear finished downloads - - src/app/components/downloads/downloads.component.ts - 129 - - - - Would you like to clear your finished downloads? - - src/app/components/downloads/downloads.component.ts - 130 - - - - Clear - - src/app/components/downloads/downloads.component.ts - 131 - - - - Error for - - src/app/components/downloads/downloads.component.ts - 238 - - - - Copy to clipboard - - src/app/components/downloads/downloads.component.ts - 240 - - - - Close - - src/app/components/downloads/downloads.component.ts - 241 - - - - Copied to clipboard! - - src/app/components/downloads/downloads.component.ts - 249 - - - - Date - - src/app/components/downloads/downloads.component.html - 7 - - Date - - - Title - - src/app/components/downloads/downloads.component.html - 13 - - Title - - - Subscription - - src/app/components/downloads/downloads.component.html - 23 - - Subscription - - - Stage - - src/app/components/downloads/downloads.component.html - 36 - - Stage - - - Progress - - src/app/components/downloads/downloads.component.html - 42 - - Progress - - - Actions - - src/app/components/downloads/downloads.component.html - 55 - - Actions - - - Clear - - src/app/components/downloads/downloads.component.html - 68 - - - src/app/components/downloads/downloads.component.html - 68 - - Clear - - - Pause - - src/app/components/downloads/downloads.component.html - 59 - - - src/app/components/downloads/downloads.component.html - 59 - - Pause - - - Resume - - src/app/components/downloads/downloads.component.html - 60 - - - src/app/components/downloads/downloads.component.html - 60 - - Resume - - - Watch content - - src/app/components/downloads/downloads.component.html - 64 - - - src/app/components/downloads/downloads.component.html - 64 - - Watch content - - - Show error - - src/app/components/downloads/downloads.component.html - 65 - - - src/app/components/downloads/downloads.component.html - 65 - - Show error - - - Restart - - src/app/components/downloads/downloads.component.html - 66 - - Restart - - - Pause all downloads - - src/app/components/downloads/downloads.component.html - 83 - - Pause all downloads - - - Resume all downloads - - src/app/components/downloads/downloads.component.html - 84 - - Resume all downloads - - - Clear finished downloads - - src/app/components/downloads/downloads.component.html - 85 - - Clear finished downloads - - - No downloads available! - - src/app/components/downloads/downloads.component.html - 90 - - No downloads label - - - Your Profile - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 1 - - User profile dialog title - - - Logout - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 28 - - Logout - - - UID: - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 9 - - UID - - - Created: - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 12 - - Created - - - You are not logged in. - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 19 - - Not logged in notification - - - Create admin account - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 1 - - Create admin account dialog title - - - No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 5 - - No default admin detected explanation - - - Create - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 17 - - Create - - - Add Users - - src/app/components/modify-users/modify-users.component.html - 90 - - Add users button - - - Edit Role - - src/app/components/modify-users/modify-users.component.html - 95 - - Edit role - - - User name - - src/app/components/modify-users/modify-users.component.html - 17 - - Username users table header - - - Role - - src/app/components/modify-users/modify-users.component.html - 35 - - Role users table header - - - Actions - - src/app/components/modify-users/modify-users.component.html - 55 - - Actions users table header - - - Manage user - - src/app/components/modify-users/modify-users.component.html - 70 - - - src/app/components/manage-user/manage-user.component.html - 1 - - manage user action button tooltip - - - Delete user - - src/app/components/modify-users/modify-users.component.html - 73 - - delete user action button tooltip - - - Edit user - - src/app/components/modify-users/modify-users.component.html - 66 - - edit user action button tooltip - - - User UID: - - src/app/components/manage-user/manage-user.component.html - 4 - - User UID - - - New password - - src/app/components/manage-user/manage-user.component.html - 8 - - New password placeholder - - - Set new password - - src/app/components/manage-user/manage-user.component.html - 10 - - Set new password - - - Use role default - - src/app/components/manage-user/manage-user.component.html - 19 - - Use role default - - - Yes - - src/app/components/manage-user/manage-user.component.html - 20 - - - src/app/components/manage-role/manage-role.component.html - 9 - - Yes - - - No - - src/app/components/manage-user/manage-user.component.html - 21 - - - src/app/components/manage-role/manage-role.component.html - 10 - - No - - - Manage role - - src/app/components/manage-role/manage-role.component.html - 1 - - Manage role dialog title - - - Lines: - - src/app/components/logs-viewer/logs-viewer.component.html - 22 - - Label for lines select in logger view - - - Clear logs - - src/app/components/logs-viewer/logs-viewer.component.html - 34 - - Clear logs button - - - Auto-generated - - src/app/components/unified-file-card/unified-file-card.component.html - 5 - - Auto-generated label - - - Open file - - src/app/components/unified-file-card/unified-file-card.component.html - 18 - - Open file button - - - Open file in new tab - - src/app/components/unified-file-card/unified-file-card.component.html - 19 - - Open file in new tab - - - Go to subscription - - src/app/components/unified-file-card/unified-file-card.component.html - 25 - - Go to subscription menu item - - - Add to playlist - - src/app/components/unified-file-card/unified-file-card.component.html - 26 - - Add to playlist menu item - - - Delete and redownload - - src/app/components/unified-file-card/unified-file-card.component.html - 34 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 8 - - Delete and redownload subscription video button - - - Delete forever - - src/app/components/unified-file-card/unified-file-card.component.html - 37 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 9 - - Delete forever subscription video button - - - See more. - - src/app/components/see-more/see-more.component.html - 5,6 - - See more - - - See less. - - src/app/components/see-more/see-more.component.html - 8,9 - - See less - - - Skip ad - - src/app/components/skip-ad-button/skip-ad-button.component.html - 1 - - Skip ad button Length: @@ -2734,6 +2808,70 @@ Video duration label + + Your subscriptions + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Name not available. Channel retrieval in progress. + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + + src/app/subscriptions/subscriptions.component.html + 27 + + No channel subscriptions text + + + Playlists + + src/app/subscriptions/subscriptions.component.html + 30 + + Subscriptions playlists title + + + Name not available. Playlist retrieval in progress. + + src/app/subscriptions/subscriptions.component.html + 36 + + Subscription playlist not available text + + + You have no playlist subscriptions. + + src/app/subscriptions/subscriptions.component.html + 49 + + No playlist subscriptions text + + + Select a version: + + src/app/updater/updater.component.html + 3 + + Select a version +