diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml new file mode 100644 index 0000000..2fcf807 --- /dev/null +++ b/.github/workflows/docker-pr.yml @@ -0,0 +1,27 @@ +name: docker-pr + +on: + pull_request: + branches: [master] + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: checkout code + uses: actions/checkout@v2 + - name: Set hash + id: vars + run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + - name: create-json + id: create-json + uses: jsdaniell/create-json@1.1.2 + with: + name: "version.json" + json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' + dir: 'backend/' + - name: Build docker images + run: docker build . -t tzahi12345/youtubedl-material:nightly-pr \ No newline at end of file diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 3fd4ab2..6cd9cc6 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -3,6 +3,16 @@ name: docker on: push: branches: [master] + paths-ignore: + - '.github/**' + - '.vscode/**' + - 'chrome-extension/**' + - 'releases/**' + - '**/**.md' + - '**.crx' + - '**.pem' + - '.dockerignore' + - '.gitignore' jobs: build-and-push: @@ -21,7 +31,7 @@ jobs: uses: jsdaniell/create-json@1.1.2 with: name: "version.json" - json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' + json: '{"type": "docker", "tag": "${{secrets.DOCKERHUB_MASTER_TAG}}", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' dir: 'backend/' - name: setup platform emulator uses: docker/setup-qemu-action@v1 @@ -39,4 +49,8 @@ jobs: file: ./Dockerfile platforms: linux/amd64,linux/arm,linux/arm64/v8 push: true - tags: tzahi12345/youtubedl-material:nightly + # Defaults: + # DOCKERHUB_USERNAME : tzahi12345 + # DOCKERHUB_REPO : youtubedl-material + # DOCKERHUB_MASTER_TAG: nightly + tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO }}:${{secrets.DOCKERHUB_MASTER_TAG}} diff --git a/Dockerfile b/Dockerfile index b892e81..87f09f0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,27 @@ -FROM ubuntu:focal AS ffmpeg +FROM ubuntu:22.04 AS ffmpeg + +ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y software-properties-common RUN add-apt-repository ppa:savoury1/ffmpeg4 RUN add-apt-repository ppa:savoury1/ffmpeg5 && apt-get update && apt-get install -y ffmpeg -FROM ubuntu:focal as frontend +#--------------# Stage 2 + +FROM ubuntu:22.04 as frontend ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update -RUN apt-get -y install curl gnupg -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - -RUN apt-get -y install nodejs - -RUN npm install -g @angular/cli +RUN apt-get update && apt-get -y install \ + curl \ + gnupg \ + # Ubuntu 22.04 ships Node.JS 12 by default :) + nodejs \ + # needed on 21.10 and before, maybe not on 22.04 YARN: brings along npm, solves dependency conflicts, + # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 + npm && \ + apt-get install -f && \ + npm config set strict-ssl false && \ + npm install -g @angular/cli WORKDIR /build COPY [ "package.json", "package-lock.json", "/build/" ] @@ -22,34 +31,42 @@ COPY [ "angular.json", "tsconfig.json", "/build/" ] COPY [ "src/", "/build/src/" ] RUN npm run build -#--------------# +#--------------# Final Stage -FROM ubuntu:focal +FROM ubuntu:22.04 ENV UID=1000 \ GID=1000 \ - USER=youtube - -ENV NO_UPDATE_NOTIFIER=true - -RUN groupadd -g $GID $USER -RUN useradd --system -g $USER --uid $UID $USER + USER=youtube \ + NO_UPDATE_NOTIFIER=true ENV DEBIAN_FRONTEND=noninteractive -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - + +RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER + RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ - atomicparsley + gosu \ + atomicparsley && \ + apt-get install -f && \ + apt-get autoremove --purge && \ + apt-get autoremove && \ + apt-get clean && \ + rm -rf /var/lib/apt WORKDIR /app -COPY --from=ffmpeg /usr/bin/ffmpeg /usr/bin/ffmpeg -COPY --from=ffmpeg /usr/bin/ffprobe /usr/bin/ffprobe +COPY --chown=$UID:$GID --from=ffmpeg [ "/usr/local/bin/ffmpeg", "/usr/local/bin/ffmpeg" ] +COPY --chown=$UID:$GID --from=ffmpeg [ "/usr/local/bin/ffprobe", "/usr/local/bin/ffprobe" ] COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] ENV PM2_HOME=/app/pm2 -RUN npm install pm2 -g -RUN npm install && chown -R $UID:$GID ./ +RUN npm config set strict-ssl false && \ + npm install pm2 -g && \ + npm install && chown -R $UID:$GID ./ + +# needed for ubuntu, see #596 +RUN ln -s /usr/bin/python3 /usr/bin/python COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] diff --git a/Dockerfile.heroku b/Dockerfile.heroku new file mode 100644 index 0000000..b2ff8b3 --- /dev/null +++ b/Dockerfile.heroku @@ -0,0 +1,2 @@ +FROM tzahi12345/youtubedl-material:nightly +CMD [ "pm2-runtime", "pm2.config.js" ] \ No newline at end of file diff --git a/Procfile b/Procfile deleted file mode 100644 index dc14c0b..0000000 --- a/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: npm start --prefix backend \ No newline at end of file diff --git a/README.md b/README.md index 15b12b8..bf4c4f2 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![GitHub issues badge](https://img.shields.io/github/issues/Tzahi12345/YoutubeDL-Material)](https://github.com/Tzahi12345/YoutubeDL-Material/issues) [![License badge](https://img.shields.io/github/license/Tzahi12345/YoutubeDL-Material)](https://github.com/Tzahi12345/YoutubeDL-Material/blob/master/LICENSE.md) -YoutubeDL-Material is a Material Design frontend for [youtube-dl](https://rg3.github.io/youtube-dl/). It's coded using [Angular 11](https://angular.io/) for the frontend, and [Node.js](https://nodejs.org/) on the backend. +YoutubeDL-Material is a Material Design frontend for [youtube-dl](https://rg3.github.io/youtube-dl/). It's coded using [Angular 13](https://angular.io/) for the frontend, and [Node.js](https://nodejs.org/) on the backend. Now with [Docker](#Docker) support! diff --git a/app.json b/app.json index 74ee445..30a7d86 100644 --- a/app.json +++ b/app.json @@ -2,6 +2,7 @@ "name": "YoutubeDL-Material", "description": "An open-source and self-hosted YouTube downloader based on Google's Material Design specifications.", "repository": "https://github.com/Tzahi12345/YoutubeDL-Material", + "stack": "container", "logo": "https://i.imgur.com/GPzvPiU.png", "keywords": ["youtube-dl", "youtubedl-material", "nodejs"] } \ No newline at end of file diff --git a/armhf.Dockerfile b/armhf.Dockerfile deleted file mode 100644 index 7f192be..0000000 --- a/armhf.Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -FROM alpine:3.12 as frontend - -RUN apk add --no-cache \ - npm \ - curl - -RUN npm install -g @angular/cli - -WORKDIR /build - -RUN curl -L https://github.com/balena-io/qemu/releases/download/v3.0.0%2Bresin/qemu-3.0.0+resin-arm.tar.gz | tar zxvf - -C . && mv qemu-3.0.0+resin-arm/qemu-arm-static . - -COPY [ "package.json", "package-lock.json", "/build/" ] -RUN npm install - -COPY [ "angular.json", "tsconfig.json", "/build/" ] -COPY [ "src/", "/build/src/" ] -RUN ng build --prod - -#--------------# - -FROM arm32v7/alpine:3.12 - -COPY --from=frontend /build/qemu-arm-static /usr/bin - -ENV UID=1000 \ - GID=1000 \ - USER=youtube - -RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID - -RUN apk add --no-cache \ - ffmpeg \ - npm \ - python2 \ - su-exec \ - && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ - atomicparsley - -WORKDIR /app -COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] -RUN npm install && chown -R $UID:$GID ./ - -COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] -COPY --chown=$UID:$GID [ "/backend/", "/app/" ] - -EXPOSE 17442 -ENTRYPOINT [ "/app/entrypoint.sh" ] -CMD [ "node", "app.js" ] diff --git a/backend/app.js b/backend/app.js index 2ec7f98..af6089a 100644 --- a/backend/app.js +++ b/backend/app.js @@ -249,14 +249,6 @@ async function startServer() { }); } -async function restartServer(is_update = false) { - logger.info(`${is_update ? 'Update complete! ' : ''}Restarting server...`); - - // the following line restarts the server through nodemon - fs.writeFileSync(`restart${is_update ? '_update' : '_general'}.json`, 'internal use only'); - process.exit(1); -} - async function updateServer(tag) { // no tag provided means update to the latest version if (!tag) { @@ -297,7 +289,7 @@ async function updateServer(tag) { updating: true, 'details': 'Update complete! Restarting server...' } - restartServer(true); + utils.restartServer(true); }, err => { logger.error(err); updaterStatus = { @@ -676,6 +668,7 @@ async function getUrlInfos(url) { async function startYoutubeDL() { // auto update youtube-dl + youtubedl_api.verifyBinaryExistsLinux(); const update_available = await youtubedl_api.checkForYoutubeDLUpdate(); if (update_available) await youtubedl_api.updateYoutubeDL(update_available); } @@ -764,7 +757,7 @@ app.get('/api/versionInfo', (req, res) => { app.post('/api/restartServer', optionalJwt, (req, res) => { // delayed by a little bit so that the client gets a response - setTimeout(() => {restartServer()}, 100); + setTimeout(() => {utils.restartServer()}, 100); res.send({success: true}); }); @@ -1802,6 +1795,7 @@ app.post('/api/updateTaskData', optionalJwt, async (req, res) => { app.post('/api/getDBBackups', optionalJwt, async (req, res) => { const backup_dir = path.join('appdata', 'db_backup'); + fs.ensureDirSync(backup_dir); const db_backups = []; const candidate_backups = await utils.recFindByExt(backup_dir, 'bak', null, [], false); 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/db.js b/backend/db.js index 7cab07d..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; @@ -497,6 +495,7 @@ exports.deleteFile = async (uid, uuid = null, blacklistMode = false) => { let useYoutubeDLArchive = config_api.getConfigItem('ytdl_use_youtubedl_archive'); if (useYoutubeDLArchive) { + const usersFileFolder = config_api.getConfigItem('ytdl_users_base_path'); const archive_path = uuid ? path.join(usersFileFolder, uuid, 'archives', `archive_${type}.txt`) : path.join('appdata', 'archives', `archive_${type}.txt`); // get ID from JSON 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/entrypoint.sh b/backend/entrypoint.sh index 5074353..59ffdb6 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -11,7 +11,7 @@ fi # chown current working directory to current user if [ "$*" = "$CMD" ] && [ "$(id -u)" = "0" ]; then find . \! -user "$UID" -exec chown "$UID:$GID" -R '{}' + || echo "WARNING! Could not change directory ownership. If you manage permissions externally this is fine, otherwise you may experience issues when downloading or deleting videos." - exec su-exec "$UID:$GID" "$0" "$@" + exec gosu "$UID:$GID" "$0" "$@" fi exec "$@" diff --git a/backend/fix-scripts/001-fix_download_permissions.sh b/backend/fix-scripts/001-fix_download_permissions.sh new file mode 100644 index 0000000..cd6cc42 --- /dev/null +++ b/backend/fix-scripts/001-fix_download_permissions.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +# INTERACTIVE PERMISSIONS FIX SCRIPT FOR YTDL-M +# Date: 2022-05-03 + +# If you want to run this script on a bare-metal installation instead of within Docker +# make sure that the paths configured below match your paths! (it's wise to use the full paths) +# USAGE: within your container's bash shell: +# chmod -R +x ./fix-scripts/ +# ./fix-scripts/001-fix_download_permissions.sh + +# User defines / Docker env defaults +PATH_SUBS=/app/subscriptions +PATH_AUDIO=/app/audio +PATH_VIDS=/app/video + +clear -x +echo "\n" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - # horizontal line +echo "Welcome to the INTERACTIVE PERMISSIONS FIX SCRIPT FOR YTDL-M." +echo "This script will set YTDL-M's download paths' owner to ${USER} (${UID}:${GID})" +echo "and permissions to the default of 644." +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - # horizontal line +echo "\n" + +# check whether dirs exist +i=0 +[ -d $PATH_SUBS ] && i=$((i+1)) && echo "✔ (${i}/3) Found Subscriptions directory at ${PATH_SUBS}" +[ -d $PATH_AUDIO ] && i=$((i+1)) && echo "✔ (${i}/3) Found Audio directory at ${PATH_AUDIO}" +[ -d $PATH_VIDS ] && i=$((i+1)) && echo "✔ (${i}/3) Found Video directory at ${PATH_VIDS}" + +# Ask to proceed or cancel, exit on missing paths +case $i in + 0) + echo "\nCouldn't find any download path to fix permissions for! \nPlease edit this script to configure!" + exit 2;; + 3) + echo "\nFound all download paths to fix permissions for. \nProceed? (Y/N)";; + *) + echo "\nOnly found ${i} out of 3 download paths! Something about this script's config must be wrong. \nProceed anyways? (Y/N)";; +esac +old_stty_cfg=$(stty -g) +stty raw -echo ; answer=$(head -c 1) ; stty $old_stty_cfg # Careful playing with stty +if echo "$answer" | grep -iq "^y" ;then + echo "\n Running jobs now... (this may take a while)\n" + [ -d $PATH_SUBS ] && chown "$UID:$GID" -R $PATH_SUBS && echo "✔ Set owner of ${PATH_SUBS} to ${USER}." + [ -d $PATH_SUBS ] && chmod 644 -R $PATH_SUBS && echo "✔ Set permissions of ${PATH_SUBS} to 644." + [ -d $PATH_AUDIO ] && chown "$UID:$GID" -R $PATH_AUDIO && echo "✔ Set owner of ${PATH_AUDIO} to ${USER}." + [ -d $PATH_AUDIO ] && chmod 644 -R $PATH_AUDIO && echo "✔ Set permissions of ${PATH_AUDIO} to 644." + [ -d $PATH_VIDS ] && chown "$UID:$GID" -R $PATH_VIDS && echo "✔ Set owner of ${PATH_VIDS} to ${USER}." + [ -d $PATH_VIDS ] && chmod 644 -R $PATH_VIDS && echo "✔ Set permissions of ${PATH_VIDS} to 644." + echo "\n✔ Done." + echo "\n If you noticed file access errors those MAY be due to currently running downloads." + echo " Feel free to re-run this script, however download parts should have correct file permissions anyhow. :)" + exit +else + echo "\nOkay, bye." +fi diff --git a/backend/subscriptions.js b/backend/subscriptions.js index dcad973..e14f121 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -141,6 +141,7 @@ async function unsubscribe(sub, deleteMode, user_uid = null) { if (sub.archive && (await fs.pathExists(sub.archive))) { const archive_file_path = path.join(sub.archive, 'archive.txt'); // deletes archive if it exists + // TODO: Keep entries in blacklist_video.txt by moving them to a global blacklist if (await fs.pathExists(archive_file_path)) { await fs.unlink(archive_file_path); } @@ -379,7 +380,11 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de if (useArchive && !redownload) { if (sub.archive) { archive_dir = sub.archive; - archive_path = path.join(archive_dir, 'archive.txt') + if (sub.type && sub.type === 'audio') { + archive_path = path.join(archive_dir, 'merged_audio.txt'); + } else { + archive_path = path.join(archive_dir, 'merged_video.txt'); + } } downloadConfig.push('--download-archive', archive_path); } diff --git a/backend/test/tests.js b/backend/test/tests.js index 9ae95a8..0a05f6b 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -386,6 +386,21 @@ describe('Downloader', function() { assert(fs.existsSync(nfo_file_path), true); fs.unlinkSync(nfo_file_path); }); + + it('Inject args', async function() { + 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)); + }); }); describe('Tasks', function() { diff --git a/backend/utils.js b/backend/utils.js index a6eaf7e..56f12bb 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -415,6 +415,47 @@ async function fetchFile(url, path, file_label) { }); } +async function restartServer(is_update = false) { + logger.info(`${is_update ? 'Update complete! ' : ''}Restarting server...`); + + // the following line restarts the server through nodemon + fs.writeFileSync(`restart${is_update ? '_update' : '_general'}.json`, 'internal use only'); + process.exit(1); +} + +// 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) { + 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('--') && 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)) { + const original_index = original_args.indexOf(new_arg); + original_args.splice(original_index, 2); + } + + updated_args.push(new_arg, new_args[i + 1]); + } else { + if (!original_args.includes(new_arg)) { + updated_args.push(new_arg); + } + } + } + } catch (err) { + logger.warn(err); + logger.warn(`Failed to inject args (${new_args}) into (${original_args})`); + } + + return updated_args; +} + // objects function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) { @@ -458,5 +499,7 @@ module.exports = { wait: wait, checkExistsWithTimeout: checkExistsWithTimeout, fetchFile: fetchFile, + restartServer: restartServer, + injectArgs: injectArgs, File: File } diff --git a/backend/youtube-dl.js b/backend/youtube-dl.js index 80432fb..a94e566 100644 --- a/backend/youtube-dl.js +++ b/backend/youtube-dl.js @@ -6,6 +6,8 @@ const utils = require('./utils'); const CONSTS = require('./consts'); const config_api = require('./config.js'); +const OUTDATED_VERSION = "2020.00.00"; + const is_windows = process.platform === 'win32'; const download_sources = { @@ -31,7 +33,7 @@ exports.checkForYoutubeDLUpdate = async () => { let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH); if (!current_app_details_exists) { logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`); - fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version":"2020.00.00", "downloader": default_downloader}); + fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version": OUTDATED_VERSION, "downloader": default_downloader}); } let current_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH)); let current_version = current_app_details['version']; @@ -86,6 +88,18 @@ exports.updateYoutubeDL = async (latest_update_version) => { await download_sources[default_downloader]['func'](latest_update_version); } +exports.verifyBinaryExistsLinux = () => { + const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH); + if (!is_windows && details_json && details_json['path'].includes('.exe')) { + details_json['path'] = 'node_modules/youtube-dl/bin/youtube-dl'; + details_json['exec'] = 'youtube-dl'; + details_json['version'] = OUTDATED_VERSION; + fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, details_json); + + utils.restartServer(); + } +} + async function downloadLatestYoutubeDLBinary(new_version) { const file_ext = is_windows ? '.exe' : ''; diff --git a/chrome-extension.pem b/chrome-extension.pem deleted file mode 100644 index 19f4917..0000000 --- a/chrome-extension.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDMX9Wk5SM5cIfY -6ReKX3ybY1rsbNbOzG8ceN7yyeXB0mor8pVsX1MOna2HewOyBuaaYNJRO4tJBxic -7a8zQErfgHL/i/QrVvVCpfJ7xKvq6zij5NYoqd/FBUwawqjeH5/voIcAp9z5Vmsr -kL0sxJUKy6b4IWNp3noU7Nvq2RwxnXQbKDhz8FrX6oQAnDC6gsG5a2OSPsaE4oqw -6nmonORJypmpP5hqyHY8ffXBT2lAxjHT7OnYbaCBe2TQP8+rH6rDBOhjVNtUJ089 -ocTQL6LtQEPkcF4yKJmtcOwHl8OPGZs5l9i8xb4j9RuSPkm2lbzZX8sOsdGGoqJZ -q68nYhsHAgMBAAECggEAXmtKEzfPObq88B/kAcgSk+FngMHZzcmR7bgD3GwdSxnQ -dkRI9zvk7eQ35tcUwntAr4Lat6/ILjFqlBmVLxrdXHuF5Xz9jcZLYgKzz61xdYM9 -dC6FKF0u5eGIIvbauGAo7jaeGFX1F3Zu5b4lP9kEOGwU1B7sxF0FzsQM5+dtCJgv -We/hWQeF+9gtoVnkCSS/Mq2p0UomXXHW0Bz4+HuHlTR9aiYbviYnotABiLUhZyzt -v5yUaktb9qniBfdLpRlq8cp06xYlTEA9gJpa4Pnok8OWUsbAiW6EiXUSaZ/cchVa -AnO8WWYvVOnnt6WHI3+QdFTnqVjE5TBX4N/7bVhHGQKBgQD0dtbFqp7vZK/jVYvE -z0WPdySOg2ZDmoSfk5ZlR1+Y9zWToHv0qu8zqoOjL8Ubxrh9fGlOow+cCVdkEuaa -jWC2AWetuRvW0Z5A3XMXr0/N/1fgOkTqtp3WNrUPjVJahEg3lN+90opgFoT8swSi -s1oxW0oLcVIlrjhGBXAPCfsAuQKBgQDWBLRhHsRAvGcK5wGuVnxVApTIyBOermsW -3bJt+7+UI+4sYrBAwkWdQG93IG0cQtn48TEPBgmR2fjRF5IFT9M4/u+QOeeByT7I -we7nVtHgSY5ByC9N0mjWbcmSg8fktz/LonjldNC4kWdOFb75fxGf8kOGS5rUaMA4 -zHucfB6ZvwKBgQCPHJrysMXGY21MaqIeHzEboaX3ABl37hdBzAa5V6UxSVdGCydF -vmO2HVZey/JaJmWOoKyNaowSzq0oWqBBTg6VvhDR9JHFmoVId9uOvAS+FYN+Mt5x -gWK5KuGoLxVNBC+6yh6JY526TrSfsrU+Aj0Es+qO9FIg2PL8muZVB4S3kQKBgH/5 -CDMaxpc/EQ5/2413wZjDllwI51J3USm3Hz6Mzp2ybnSz/lh60k2Zfg1polTH1Lb6 -4i7tmUNRZ2sAARyUAuWN64n+VeRRhe1dqZFDZPQMh7fmEAMk0fOGaoXlrt2ghdEq -Mchi9Xun1nHmpu9hgBR4NNBU3RwuFuLfwvprbZDZAoGAWa62QJChE86xQGP1MrL2 -SbIzw3cfeP5xdQ3MKldJiy5IkbMR7Z13WZ7FwvPTy0g/onLHD1rqlm1kUMsGRHpD -5vH06PNpKXQ6x8BYaRGtE6P39jLycO/X+WK/lYTrWo1bR+mGCebDh4B5XrwT3gI6 -x4Gvz134pZCTyQCf5JCwbQs= ------END PRIVATE KEY----- diff --git a/docker-build.sh b/docker-build.sh index 5876372..2a81d43 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -4,8 +4,6 @@ # and also optimizing some code with this commit. # xoxo :D -set -xeuo pipefail - case $(uname -m) in x86_64) ARCH=amd64;; @@ -22,10 +20,24 @@ case $(uname -m) in exit 1 esac -echo "Architecture: $ARCH" -wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -O ffmpeg.txz +echo "(INFO) Architecture detected: $ARCH" +echo "(1/5) READY - Acquire temp dependencies in ffmpeg obtain layer" +apt-get update && apt-get -y install curl xz-utils +echo "(2/5) DOWNLOAD - Acquire latest ffmpeg and ffprobe from John van Sickle's master-sourced builds in ffmpeg obtain layer" +curl -o ffmpeg.txz \ + --connect-timeout 5 \ + --max-time 10 \ + --retry 5 \ + --retry-delay 0 \ + --retry-max-time 40 \ + "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg +echo "(3/5) CLEANUP - Remove temp dependencies from ffmpeg obtain layer" +apt-get -y remove curl xz-utils +apt-get -y autoremove +echo "(4/5) PROVISION - Provide ffmpeg and ffprobe from ffmpeg obtain layer" cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg cp /tmp/ffmpeg/*/ffprobe /usr/local/bin/ffprobe +echo "(5/5) CLEANUP - Remove temporary downloads from ffmpeg obtain layer" rm -rf /tmp/ffmpeg ffmpeg.txz \ No newline at end of file diff --git a/heroku.yml b/heroku.yml new file mode 100644 index 0000000..3fa3eec --- /dev/null +++ b/heroku.yml @@ -0,0 +1,3 @@ +build: + docker: + web: Dockerfile.heroku diff --git a/package.json b/package.json index 990a4d0..ac60cc5 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/app/app.component.html b/src/app/app.component.html index f1270c7..278b8fe 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -51,7 +51,7 @@ - {{subscription.name}} + {{subscription.name}} diff --git a/src/app/components/concurrent-stream/concurrent-stream.component.ts b/src/app/components/concurrent-stream/concurrent-stream.component.ts index 6c2cc67..e99108b 100644 --- a/src/app/components/concurrent-stream/concurrent-stream.component.ts +++ b/src/app/components/concurrent-stream/concurrent-stream.component.ts @@ -42,6 +42,11 @@ export class ConcurrentStreamComponent implements OnInit { } + ngOnDestroy(): void { + if (this.check_timeout) { clearInterval(this.check_timeout); } + if (this.update_timeout) { clearInterval(this.update_timeout); } + } + startServer() { this.started = true; this.server_started = true; diff --git a/src/app/components/twitch-chat/twitch-chat.component.ts b/src/app/components/twitch-chat/twitch-chat.component.ts index d2e0aa0..bbeb7de 100644 --- a/src/app/components/twitch-chat/twitch-chat.component.ts +++ b/src/app/components/twitch-chat/twitch-chat.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, Input, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; +import { Component, ElementRef, Input, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; import { PostsService } from 'app/posts.services'; @Component({ @@ -6,7 +6,7 @@ import { PostsService } from 'app/posts.services'; templateUrl: './twitch-chat.component.html', styleUrls: ['./twitch-chat.component.scss'] }) -export class TwitchChatComponent implements OnInit, AfterViewInit { +export class TwitchChatComponent implements OnInit, OnDestroy { full_chat = null; visible_chat = null; @@ -33,7 +33,8 @@ export class TwitchChatComponent implements OnInit, AfterViewInit { this.getFullChat(); } - ngAfterViewInit() { + ngOnDestroy(): void { + if (this.chat_check_interval_obj) { clearInterval(this.chat_check_interval_obj); } } private isUserNearBottom(): boolean { diff --git a/src/app/settings/locales_list.ts b/src/app/settings/locales_list.ts index 9235937..7d5687a 100644 --- a/src/app/settings/locales_list.ts +++ b/src/app/settings/locales_list.ts @@ -445,7 +445,7 @@ export const isoLangs = { 'name': 'Navajo, Navaho', 'nativeName': 'Diné bizaad, Dinékʼehǰí' }, - 'nb': { + 'nb-NO': { 'name': 'Norwegian Bokmål', 'nativeName': 'Norsk bokmål', 'ngID': 'nb' diff --git a/src/app/subscription/subscription/subscription.component.ts b/src/app/subscription/subscription/subscription.component.ts index dcb6c5c..967b5bd 100644 --- a/src/app/subscription/subscription/subscription.component.ts +++ b/src/app/subscription/subscription/subscription.component.ts @@ -52,6 +52,8 @@ export class SubscriptionComponent implements OnInit, OnDestroy { this.route.params.subscribe(params => { this.id = params['id']; + if (this.sub_interval) { clearInterval(this.sub_interval); } + this.postsService.service_initialized.subscribe(init => { if (init) { this.getConfig(); 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. + diff --git a/src/assets/i18n/messages.bas.xlf b/src/assets/i18n/messages.bas.xlf deleted file mode 100644 index 1e080e4..0000000 --- a/src/assets/i18n/messages.bas.xlf +++ /dev/null @@ -1,2634 +0,0 @@ - - - - - - About - - - src/app/app.component.html - 32 - - About menu label - - - Profile - - - src/app/app.component.html - 19 - - Profile menu label - - - Dark - - - src/app/app.component.html - 23 - - - src/app/settings/settings.component.html - 75 - - Dark mode toggle label - - - Settings - - - src/app/app.component.html - 28 - - - src/app/settings/settings.component.html - 1 - - Settings menu label - - - Home - - - src/app/app.component.html - 43 - - Navigation menu Home Page title - - - Login - - - src/app/app.component.html - 44 - - - src/app/components/login/login.component.html - 15 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 20 - - Navigation menu Login Page title - - - Subscriptions - - - src/app/app.component.html - 45 - - Navigation menu Subscriptions Page title - - - Downloads - - - src/app/app.component.html - 46 - - Navigation menu Downloads Page title - - - Only Audio - - - src/app/main/main.component.html - 65,66 - - Only Audio checkbox - - - Download - - - src/app/main/main.component.html - 79,80 - - Main download button - - - Quality - - - src/app/main/main.component.html - 19,20 - - Quality select label - - - Use URL - - - src/app/main/main.component.html - 51 - - YT search Use URL button for searched video - - - View - - - src/app/main/main.component.html - 55,56 - - YT search View button for searched video - - - Multi-download Mode - - - src/app/main/main.component.html - 70,71 - - Multi-download Mode checkbox - - - Cancel - - - src/app/main/main.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 - - - Custom args - - - src/app/main/main.component.html - 115 - - - 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 - 118,119 - - Custom Args input hint - - - Use custom output - - - src/app/main/main.component.html - 126,127 - - Use custom output checkbox - - - Custom output - - - src/app/main/main.component.html - 130 - - Custom output placeholder - - - Documentation - - - src/app/main/main.component.html - 132 - - - 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/edit-category-dialog/edit-category-dialog.component.html - 47 - - - src/app/settings/settings.component.html - 125 - - Youtube-dl output template documentation link - - - Path is relative to the config download path. Don't include extension. - - - src/app/main/main.component.html - 133 - - - 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 - - - Crop file - - - src/app/main/main.component.html - 155,156 - - Crop video checkbox - - - Crop from (seconds) - - - src/app/main/main.component.html - 159 - - Crop from placeholder - - - Crop to (seconds) - - - src/app/main/main.component.html - 164 - - Crop to placeholder - - - Simulated command: - - - src/app/main/main.component.html - 102,103 - - Simulated command label - - - Use authentication - - - src/app/main/main.component.html - 140,141 - - Use authentication checkbox - - - Username - - - src/app/main/main.component.html - 144 - - YT Username placeholder - - - Password - - - src/app/main/main.component.html - 149 - - - 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 - - YT Password placeholder - - - Create a playlist - - - src/app/create-playlist/create-playlist.component.html - 1 - - Create a playlist dialog title - - - Name - - - 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 - - Playlist name placeholder - - - Type - - - src/app/create-playlist/create-playlist.component.html - 11 - - Type select - - - Audio - - - src/app/create-playlist/create-playlist.component.html - 12 - - Audio - - - Video - - - src/app/create-playlist/create-playlist.component.html - 13 - - Video - - - Audio files - - - src/app/create-playlist/create-playlist.component.html - 19 - - Audio files title - - - Videos - - - src/app/create-playlist/create-playlist.component.html - 20 - - - src/app/subscription/subscription/subscription.component.html - 29 - - Videos title - - - Subscribe to playlist or channel - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 1 - - Subscribe dialog title - - - URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 8 - - - src/app/settings/settings.component.html - 18 - - Subscription URL input placeholder - - - The playlist or channel URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 9 - - Subscription URL input hint - - - Custom name - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 19 - - 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/edit-subscription-dialog/edit-subscription-dialog.component.html - 66 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 54 - - - src/app/components/modify-users/modify-users.component.html - 61 - - Subscribe cancel button - - - Subscribe - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 81 - - 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: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 5 - - Subscription type property - - - URL: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 9 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 9 - - Subscription URL property - - - ID: - - - 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 - - - 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 - 59 - - - 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 - - - Export Archive - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 24 - - Export Archive button - - - Unsubscribe - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 26 - - Unsubscribe button - - - (Paused) - - - src/app/dialogs/subscription-info-dialog/subscription-info-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 - 31 - - - src/app/subscription/subscription/subscription.component.html - 5 - - Paused suffix - - - Archive: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 17 - - Subscription ID property - - - 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 - - - Uploader: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 13 - - Video ID property - - - File size: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 17 - - Video file size property - - - Path: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 21 - - Video path property - - - Upload Date: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 25 - - Video upload date property - - - Category: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 29 - - Category property - - - Modify youtube-dl args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 1 - - Modify args title - - - Simulated new args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 8 - - Simulated args title - - - Add an arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 34 - - Add arg card title - - - Search by category - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 60 - - Search args by category button - - - Use arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 64 - - Use arg value checkbox - - - Add arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 73 - - Search args by category button - - - Modify - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 85 - - Arg modifier modify button - - - Arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 68 - - Arg value placeholder - - - Updater - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 1 - - Update progress dialog title - - - 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 - - - Register - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 17 - - - src/app/components/login/login.component.html - 35 - - Register user button - - - Upload new cookies - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 1 - - Cookies uploader dialog title - - - 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 - - - Drag and Drop - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 11 - - Drag and Drop - - - Modify playlist - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 1 - - Modify playlist dialog title - - - Save - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 43 - - - 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 - 464 - - - src/app/components/modify-users/modify-users.component.html - 58 - - Save - - - Randomize order when playing - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 13 - - Randomize order when playing checkbox label - - - Add content - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 24 - - Add content - - - 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 - - - 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 - - - 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 - 37 - - 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 - 33 - - - src/app/components/unified-file-card/unified-file-card.component.html - 39 - - 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 - 34 - - Delete and blacklist video button - - - views - - - src/app/player/player.component.html - 15 - - 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 - 27 - - 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 - 24 - - No channel subscriptions text - - - Name not available. Playlist retrieval in progress. - - - src/app/subscriptions/subscriptions.component.html - 33 - - Subscription playlist not available text - - - You have no playlist subscriptions. - - - src/app/subscriptions/subscriptions.component.html - 43 - - No playlist subscriptions text - - - Main - - - src/app/settings/settings.component.html - 12 - - Main settings label - - - Downloader - - - src/app/settings/settings.component.html - 102 - - Downloader settings label - - - Extra - - - src/app/settings/settings.component.html - 185 - - Extra settings label - - - Database - - - src/app/settings/settings.component.html - 284 - - Database settings label - - - Advanced - - - src/app/settings/settings.component.html - 320 - - Host settings label - - - Users - - - src/app/settings/settings.component.html - 403 - - - src/app/settings/settings.component.html - 403 - - Users settings label - - - Logs - - - src/app/settings/settings.component.html - 451 - - - src/app/settings/settings.component.html - 451 - - Logs settings label - - - {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} - - - src/app/settings/settings.component.html - 467 - - Settings cancel and close button - - - URL this app will be accessed from, without the port. - - - src/app/settings/settings.component.html - 19 - - URL setting input hint - - - Port - - - src/app/settings/settings.component.html - 24 - - Port input placeholder - - - The desired port. Default is 17442. - - - src/app/settings/settings.component.html - 25 - - Port setting input hint - - - Multi-user mode - - - src/app/settings/settings.component.html - 34 - - Multi user mode setting - - - Users base path - - - src/app/settings/settings.component.html - 38 - - Users base path placeholder - - - Base path for users and their downloaded videos. - - - src/app/settings/settings.component.html - 39 - - Users base path hint - - - Allow subscriptions - - - src/app/settings/settings.component.html - 48 - - Allow subscriptions setting - - - Subscriptions base path - - - src/app/settings/settings.component.html - 52 - - 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. - - - src/app/settings/settings.component.html - 53 - - Subscriptions base path setting input hint - - - Check interval - - - src/app/settings/settings.component.html - 58 - - Check interval input setting placeholder - - - Unit is seconds, only include numbers. - - - src/app/settings/settings.component.html - 59 - - Check interval setting input hint - - - Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - - - src/app/settings/settings.component.html - 63 - - Redownload fresh uploads tooltip - - - Redownload fresh uploads - - - src/app/settings/settings.component.html - 63 - - Redownload fresh uploads - - - Theme - - - src/app/settings/settings.component.html - 72 - - Theme select label - - - Default - - - src/app/settings/settings.component.html - 74 - - Default theme label - - - Allow theme change - - - src/app/settings/settings.component.html - 80 - - Allow theme change setting - - - Language - - - src/app/settings/settings.component.html - 89 - - Language select label - - - Audio folder path - - - src/app/settings/settings.component.html - 109 - - Audio folder path input placeholder - - - Path for audio only downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 110 - - Aduio path setting input hint - - - Video folder path - - - src/app/settings/settings.component.html - 116 - - Video folder path input placeholder - - - Path for video downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 117 - - Video path setting input hint - - - Default file output - - - src/app/settings/settings.component.html - 123 - - Default file output placeholder - - - Path is relative to the above download paths. Don't include extension. - - - src/app/settings/settings.component.html - 126 - - Custom Output input hint - - - Global custom args - - - src/app/settings/settings.component.html - 133 - - Custom args input placeholder - - - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - - - src/app/settings/settings.component.html - 134 - - Custom args setting input hint - - - Categories - - - src/app/settings/settings.component.html - 144 - - Categories - - - With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - - - src/app/settings/settings.component.html - 158 - - Allow playlist categorization setting tooltip - - - Allow playlist categorization - - - src/app/settings/settings.component.html - 158 - - Allow playlist categorization setting label - - - Use youtube-dl archive - - - src/app/settings/settings.component.html - 166 - - Use youtubedl archive setting - - - Include thumbnail - - - src/app/settings/settings.component.html - 170 - - Include thumbnail setting - - - Include metadata - - - src/app/settings/settings.component.html - 174 - - Include metadata setting - - - Kill all downloads - - - src/app/settings/settings.component.html - 178 - - Kill all downloads button - - - Top title - - - src/app/settings/settings.component.html - 191 - - Top title input placeholder - - - File manager enabled - - - src/app/settings/settings.component.html - 196 - - File manager enabled setting - - - Downloads manager enabled - - - src/app/settings/settings.component.html - 199 - - Downloads manager enabled setting - - - Allow quality select - - - src/app/settings/settings.component.html - 202 - - Allow quality seelct setting - - - Download only mode - - - src/app/settings/settings.component.html - 205 - - Download only mode setting - - - Allow multi-download mode - - - src/app/settings/settings.component.html - 208 - - Allow multi-download mode setting - - - Enable Public API - - - src/app/settings/settings.component.html - 216 - - Enable Public API key setting - - - Public API Key - - - src/app/settings/settings.component.html - 221 - - Public API Key setting placeholder - - - View documentation - - - src/app/settings/settings.component.html - 222 - - View API docs setting hint - - - This will delete your old API key! - - - src/app/settings/settings.component.html - 226 - - delete api key tooltip - - - Generate - - - src/app/settings/settings.component.html - 226 - - Generate key button - - - Use YouTube API - - - src/app/settings/settings.component.html - 235 - - Use YouTube API setting - - - Youtube API Key - - - src/app/settings/settings.component.html - 239 - - Youtube API Key setting placeholder - - - Generating a key is easy! - - - src/app/settings/settings.component.html - 240 - - - src/app/settings/settings.component.html - 252 - - Youtube API Key setting hint - - - Use Twitch API - - - src/app/settings/settings.component.html - 244 - - Use Twitch API setting - - - Twitch API Key - - - src/app/settings/settings.component.html - 251 - - Twitch API Key setting placeholder - - - Also known as a Client ID. - - - src/app/settings/settings.component.html - 252 - - Twitch API Key setting hint AKA preamble - - - Auto-download Twitch Chat - - - src/app/settings/settings.component.html - 247 - - Auto download Twitch Chat setting - - - Click here - - - src/app/settings/settings.component.html - 262 - - - src/app/settings/settings.component.html - 268 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - Chrome ext click here - - - to download the official YoutubeDL-Material Chrome extension manually. - - - src/app/settings/settings.component.html - 262 - - Chrome click here suffix - - - You must manually load the extension and modify the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 263 - - Chrome setup suffix - - - to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - - - src/app/settings/settings.component.html - 268 - - Firefox click here suffix - - - Detailed setup instructions. - - - src/app/settings/settings.component.html - 269 - - Firefox setup prefix link - - - Not much is required other than changing the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 269 - - 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. - - - src/app/settings/settings.component.html - 274 - - Bookmarklet instructions - - - Generate 'audio only' bookmarklet - - - src/app/settings/settings.component.html - 275 - - Generate audio only bookmarklet checkbox - - - Database location: - - - src/app/settings/settings.component.html - 290 - - Database location label - - - Records per table - - - src/app/settings/settings.component.html - 291 - - Records per table label - - - MongoDB Connection String - - - src/app/settings/settings.component.html - 299 - - MongoDB Connection String - - - Example: - - - src/app/settings/settings.component.html - 300 - - MongoDB Connection String setting hint AKA preamble - - - Test connection string - - - src/app/settings/settings.component.html - 304 - - Test connection string button - - - Transfer DB to - - - src/app/settings/settings.component.html - 308 - - Transfer DB button - - - Database information could not be retrieved. Check the server logs for more information. - - - src/app/settings/settings.component.html - 312 - - Database info not retrieved error message - - - Select a downloader - - - src/app/settings/settings.component.html - 326 - - Default downloader select label - - - Use default downloading agent - - - src/app/settings/settings.component.html - 335 - - Use default downloading agent setting - - - Select a download agent - - - src/app/settings/settings.component.html - 339 - - Custom downloader select label - - - Log Level - - - src/app/settings/settings.component.html - 353 - - Log Level label - - - Login expiration - - - src/app/settings/settings.component.html - 365 - - Login expiration select label - - - Allow advanced download - - - src/app/settings/settings.component.html - 376 - - Allow advanced downloading setting - - - Use Cookies - - - src/app/settings/settings.component.html - 384 - - Use cookies setting - - - Set Cookies - - - src/app/settings/settings.component.html - 385 - - Set cookies button - - - Restart server - - - src/app/settings/settings.component.html - 397 - - Restart server button - - - Allow user registration - - - src/app/settings/settings.component.html - 407 - - Allow registration setting - - - Auth method - - - src/app/settings/settings.component.html - 411 - - Auth method select - - - Internal - - - src/app/settings/settings.component.html - 413 - - Internal auth method - - - LDAP - - - src/app/settings/settings.component.html - 416 - - LDAP auth method - - - LDAP URL - - - src/app/settings/settings.component.html - 423 - - LDAP URL - - - Bind DN - - - src/app/settings/settings.component.html - 428 - - Bind DN - - - Bind Credentials - - - src/app/settings/settings.component.html - 433 - - Bind Credentials - - - Search Base - - - src/app/settings/settings.component.html - 438 - - Search Base - - - Search Filter - - - src/app/settings/settings.component.html - 443 - - Search Filter - - - 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 - - - Found a bug or have a suggestion? - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - About bug prefix - - - to create an issue! - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - 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 - - - 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 - - - Session ID: - - - src/app/components/downloads/downloads.component.html - 5 - - Session ID - - - Clear all downloads - - - src/app/components/downloads/downloads.component.html - 18 - - clear all downloads action button - - - (current) - - - src/app/components/downloads/downloads.component.html - 6 - - Current session - - - No downloads available! - - - src/app/components/downloads/downloads.component.html - 25 - - 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 - - - Delete and redownload - - - src/app/components/unified-file-card/unified-file-card.component.html - 28 - - - 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 - 31 - - - 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 - - - Length: - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 3 - - Video duration label - - - - 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 + diff --git a/src/assets/i18n/messages.hi.xlf b/src/assets/i18n/messages.hi.xlf deleted file mode 100644 index 29f68db..0000000 --- a/src/assets/i18n/messages.hi.xlf +++ /dev/null @@ -1,3040 +0,0 @@ - - - - - - About - - - src/app/app.component.html - 32 - - About menu label - - - Profile - - - src/app/app.component.html - 19 - - Profile menu label - - - Dark - - - src/app/app.component.html - 23 - - - src/app/settings/settings.component.html - 67 - - Dark mode toggle label - - - Home - - - src/app/app.component.html - 43 - - Navigation menu Home Page title - - - Login - - - src/app/app.component.html - 44 - - - src/app/components/login/login.component.html - 34 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 20 - - Navigation menu Login Page title - - - Subscriptions - - - src/app/app.component.html - 45 - - Navigation menu Subscriptions Page title - - - Downloads - - - src/app/app.component.html - 46 - - Navigation menu Downloads Page title - - - Settings - - - src/app/app.component.html - 49 - - - src/app/settings/settings.component.html - 1 - - Settings menu label - - - Download for has been queued! - - - src/app/main/main.component.ts - 469 - - - - Only Audio - - - src/app/main/main.component.html - 65,66 - - Only Audio checkbox - - - Download - - - src/app/main/main.component.html - 79,80 - - Main download button - - - Quality - - - src/app/main/main.component.html - 19,20 - - Quality select label - - - Use URL - - - src/app/main/main.component.html - 51 - - YT search Use URL button for searched video - - - View - - - src/app/main/main.component.html - 55,56 - - YT search View button for searched video - - - Autoplay - - - src/app/main/main.component.html - 70,71 - - Autoplay checkbox - - - Cancel - - - src/app/main/main.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/edit-category-dialog/edit-category-dialog.component.html - 47 - - - src/app/settings/settings.component.html - 117 - - Youtube-dl output template documentation link - - - Path is relative to the config download path. Don't include extension. - - - src/app/main/main.component.html - 138 - - - 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 - - - Crop file - - - src/app/main/main.component.html - 160,161 - - Crop video checkbox - - - Simulated command: - - - src/app/main/main.component.html - 102,103 - - Simulated command label - - - Use authentication - - - src/app/main/main.component.html - 145,146 - - Use authentication checkbox - - - Username - - - src/app/main/main.component.html - 149 - - YT Username placeholder - - - Password - - - src/app/main/main.component.html - 154 - - - 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 - - YT Password placeholder - - - Crop from (seconds) - - - src/app/main/main.component.html - 164 - - Crop from placeholder - - - Crop to (seconds) - - - src/app/main/main.component.html - 169 - - Crop to placeholder - - - Create a playlist - - - src/app/create-playlist/create-playlist.component.html - 1 - - Create a playlist dialog title - - - Name - - - 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 - - Playlist name placeholder - - - Type - - - src/app/create-playlist/create-playlist.component.html - 11 - - Type select - - - Audio - - - src/app/create-playlist/create-playlist.component.html - 12 - - Audio - - - Video - - - src/app/create-playlist/create-playlist.component.html - 13 - - Video - - - Audio files - - - src/app/create-playlist/create-playlist.component.html - 19 - - Audio files title - - - Videos - - - src/app/create-playlist/create-playlist.component.html - 20 - - - src/app/subscription/subscription/subscription.component.html - 29 - - Videos title - - - Subscribe to playlist or channel - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 1 - - Subscribe dialog title - - - URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 8 - - - src/app/settings/settings.component.html - 10 - - Subscription URL input placeholder - - - The playlist or channel URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 9 - - Subscription URL input hint - - - Custom name - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 19 - - 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 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 81 - - 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: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 5 - - Subscription type property - - - URL: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 9 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 9 - - Subscription URL property - - - ID: - - - 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 - - - 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 - - - Export Archive - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 24 - - Export Archive button - - - Unsubscribe - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 26 - - Unsubscribe button - - - (Paused) - - - src/app/dialogs/subscription-info-dialog/subscription-info-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 - - - Archive: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 17 - - Subscription ID property - - - 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 - - - Uploader: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 13 - - Video ID property - - - File size: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 17 - - Video file size property - - - Path: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 21 - - Video path property - - - Upload Date: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 25 - - Video upload date property - - - Category: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 29 - - Category property - - - Modify youtube-dl args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 1 - - Modify args title - - - Simulated new args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 8 - - Simulated args title - - - Add an arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 34 - - Add arg card title - - - Search by category - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 60 - - Search args by category button - - - Use arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 64 - - Use arg value checkbox - - - Add arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 73 - - Search args by category button - - - Modify - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 85 - - Arg modifier modify button - - - Arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 68 - - Arg value placeholder - - - Updater - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 1 - - Update progress dialog title - - - 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 - - - Register - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 17 - - - src/app/components/login/login.component.html - 38 - - Register user button - - - Upload new cookies - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 1 - - Cookies uploader dialog title - - - 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 - - - Drag and Drop - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 11 - - Drag and Drop - - - Modify playlist - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 1 - - Modify playlist dialog title - - - Save - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 43 - - - 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 - - - Randomize order when playing - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 13 - - Randomize order when playing checkbox label - - - Add content - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 24 - - Add content - - - 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 - - - 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 - - - src/app/player/player.component.html - 16 - - 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 - - - src/app/settings/settings.component.html - 4 - - 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. - - - src/app/settings/settings.component.html - 11 - - URL setting input hint - - - Port - - - src/app/settings/settings.component.html - 16 - - Port input placeholder - - - The desired port. Default is 17442. - - - src/app/settings/settings.component.html - 17 - - Port setting input hint - - - Multi-user mode - - - src/app/settings/settings.component.html - 26 - - Multi user mode setting - - - Users base path - - - src/app/settings/settings.component.html - 30 - - Users base path placeholder - - - Base path for users and their downloaded videos. - - - src/app/settings/settings.component.html - 31 - - Users base path hint - - - Allow subscriptions - - - src/app/settings/settings.component.html - 40 - - Allow subscriptions setting - - - Subscriptions base path - - - src/app/settings/settings.component.html - 44 - - 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. - - - src/app/settings/settings.component.html - 45 - - Subscriptions base path setting input hint - - - Check interval - - - src/app/settings/settings.component.html - 50 - - Check interval input setting placeholder - - - Unit is seconds, only include numbers. - - - src/app/settings/settings.component.html - 51 - - Check interval setting input hint - - - Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - - - src/app/settings/settings.component.html - 55 - - Redownload fresh uploads tooltip - - - Redownload fresh uploads - - - src/app/settings/settings.component.html - 55 - - Redownload fresh uploads - - - Theme - - - src/app/settings/settings.component.html - 64 - - Theme select label - - - Default - - - src/app/settings/settings.component.html - 66 - - Default theme label - - - Allow theme change - - - src/app/settings/settings.component.html - 72 - - Allow theme change setting - - - Language - - - src/app/settings/settings.component.html - 81 - - Language select label - - - Audio folder path - - - src/app/settings/settings.component.html - 101 - - Audio folder path input placeholder - - - Path for audio only downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 102 - - Aduio path setting input hint - - - Video folder path - - - src/app/settings/settings.component.html - 108 - - Video folder path input placeholder - - - Path for video downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 109 - - Video path setting input hint - - - Default file output - - - src/app/settings/settings.component.html - 115 - - Default file output placeholder - - - Path is relative to the above download paths. Don't include extension. - - - src/app/settings/settings.component.html - 118 - - Custom Output input hint - - - Global custom args - - - src/app/settings/settings.component.html - 125 - - Custom args input placeholder - - - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - - - src/app/settings/settings.component.html - 126 - - Custom args setting input hint - - - Categories - - - src/app/settings/settings.component.html - 136 - - Categories - - - 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 - - Allow playlist categorization setting tooltip - - - Allow playlist categorization - - - src/app/settings/settings.component.html - 150 - - Allow playlist categorization setting label - - - Use youtube-dl archive - - - src/app/settings/settings.component.html - 158 - - Use youtubedl archive setting - - - Include thumbnail - - - src/app/settings/settings.component.html - 162 - - Include thumbnail setting - - - Include metadata - - - src/app/settings/settings.component.html - 166 - - Include metadata setting - - - Max concurrent downloads - - - src/app/settings/settings.component.html - 175 - - Max concurrent downloads - - - Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. - - - src/app/settings/settings.component.html - 176 - - Max concurrent downloads input hint - - - Download rate limit - - - src/app/settings/settings.component.html - 181 - - Download rate limit input placeholder - - - Rate limits your downloads to the specified amount. Ex: 200K - - - src/app/settings/settings.component.html - 182 - - Download rate limit input hint - - - Kill all downloads - - - src/app/settings/settings.component.html - 191 - - Kill all downloads button - - - Top title - - - src/app/settings/settings.component.html - 204 - - Top title input placeholder - - - File manager enabled - - - src/app/settings/settings.component.html - 209 - - File manager enabled setting - - - Downloads manager enabled - - - src/app/settings/settings.component.html - 212 - - Downloads manager enabled setting - - - Allow quality select - - - src/app/settings/settings.component.html - 215 - - Allow quality seelct setting - - - Download only mode - - - src/app/settings/settings.component.html - 218 - - Download only mode setting - - - Allow autoplay - - - src/app/settings/settings.component.html - 221 - - Allow autoplay setting - - - Enable Public API - - - src/app/settings/settings.component.html - 229 - - Enable Public API key setting - - - Public API Key - - - src/app/settings/settings.component.html - 234 - - Public API Key setting placeholder - - - View documentation - - - src/app/settings/settings.component.html - 235 - - View API docs setting hint - - - This will delete your old API key! - - - src/app/settings/settings.component.html - 239 - - delete api key tooltip - - - Generate - - - src/app/settings/settings.component.html - 239 - - Generate key button - - - Use YouTube API - - - src/app/settings/settings.component.html - 248 - - Use YouTube API setting - - - Youtube API Key - - - src/app/settings/settings.component.html - 252 - - Youtube API Key setting placeholder - - - Generating a key is easy! - - - src/app/settings/settings.component.html - 253 - - - src/app/settings/settings.component.html - 265 - - Youtube API Key setting hint - - - Use Twitch API - - - src/app/settings/settings.component.html - 257 - - Use Twitch API setting - - - Twitch API Key - - - src/app/settings/settings.component.html - 264 - - Twitch API Key setting placeholder - - - Also known as a Client ID. - - - src/app/settings/settings.component.html - 265 - - Twitch API Key setting hint AKA preamble - - - Enables a button to skip ads when viewing supported videos. - - - src/app/settings/settings.component.html - 269 - - SponsorBlock API tooltip - - - Use SponsorBlock API - - - src/app/settings/settings.component.html - 269 - - Use SponsorBlock API setting - - - Generates NFO files with every download, primarily used by Kodi. - - - src/app/settings/settings.component.html - 272 - - Generate NFO files tooltip - - - Generate NFO files - - - src/app/settings/settings.component.html - 272 - - 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 - - Chrome click here suffix - - - You must manually load the extension and modify the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 282 - - Chrome setup suffix - - - to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - - - src/app/settings/settings.component.html - 287 - - Firefox click here suffix - - - Detailed setup instructions. - - - src/app/settings/settings.component.html - 288 - - Firefox setup prefix link - - - Not much is required other than changing the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 288 - - 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. - - - src/app/settings/settings.component.html - 293 - - Bookmarklet instructions - - - Generate 'audio only' bookmarklet - - - src/app/settings/settings.component.html - 294 - - Generate audio only bookmarklet checkbox - - - Database location: - - - src/app/settings/settings.component.html - 309 - - Database location label - - - Records per table - - - src/app/settings/settings.component.html - 310 - - Records per table label - - - MongoDB Connection String - - - src/app/settings/settings.component.html - 318 - - MongoDB Connection String - - - Example: - - - src/app/settings/settings.component.html - 319 - - MongoDB Connection String setting hint AKA preamble - - - Test connection string - - - src/app/settings/settings.component.html - 323 - - Test connection string button - - - Transfer DB to - - - src/app/settings/settings.component.html - 327 - - Transfer DB button - - - Database information could not be retrieved. Check the server logs for more information. - - - src/app/settings/settings.component.html - 331 - - Database info not retrieved error message - - - Select a downloader - - - src/app/settings/settings.component.html - 345 - - Default downloader select label - - - Use default downloading agent - - - src/app/settings/settings.component.html - 354 - - Use default downloading agent setting - - - Select a download agent - - - src/app/settings/settings.component.html - 358 - - Custom downloader select label - - - Log Level - - - src/app/settings/settings.component.html - 372 - - Log Level label - - - Login expiration - - - src/app/settings/settings.component.html - 384 - - Login expiration select label - - - Allow advanced download - - - src/app/settings/settings.component.html - 395 - - Allow advanced downloading setting - - - Use Cookies - - - src/app/settings/settings.component.html - 403 - - Use cookies setting - - - Set Cookies - - - src/app/settings/settings.component.html - 404 - - Set cookies button - - - Restart server - - - src/app/settings/settings.component.html - 416 - - Restart server button - - - Users - - - src/app/settings/settings.component.html - 425 - - Users settings label - - - Allow user registration - - - src/app/settings/settings.component.html - 431 - - Allow registration setting - - - Auth method - - - src/app/settings/settings.component.html - 435 - - Auth method select - - - Internal - - - src/app/settings/settings.component.html - 437 - - Internal auth method - - - LDAP - - - src/app/settings/settings.component.html - 440 - - LDAP auth method - - - LDAP URL - - - src/app/settings/settings.component.html - 447 - - LDAP URL - - - Bind DN - - - src/app/settings/settings.component.html - 452 - - Bind DN - - - Bind Credentials - - - src/app/settings/settings.component.html - 457 - - Bind Credentials - - - Search Base - - - src/app/settings/settings.component.html - 462 - - Search Base - - - Search Filter - - - src/app/settings/settings.component.html - 467 - - Search Filter - - - 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 - - - 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: - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 3 - - Video duration label - - - - diff --git a/src/assets/i18n/messages.nb.json b/src/assets/i18n/messages.nb.json deleted file mode 100644 index 120f171..0000000 --- a/src/assets/i18n/messages.nb.json +++ /dev/null @@ -1,222 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Opprett en spilleliste", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Navn", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Lyd", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Type", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Lydfiler", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Videoer", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Endre youtube-dl-argumenter", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Simulerte nye argumenter", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Legg til argument", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Søk etter kategori", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Bruk argument-verdi", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Argument-verdi", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Legg til argument", - "d7b35c384aecd25a516200d6921836374613dfe7": "Avbryt", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Endre", - "a38ae1082fec79ba1f379978337385a539a28e73": "Kvalitet", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Bruk nettadresse", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Vis", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Kun lyd", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Multi-nedlastingsmodus", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Last ned", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Avbryt", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avansert", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Simulert kommando:", - "4e4c721129466be9c3862294dc40241b64045998": "Bruk egendefinerte argumenter:", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Egendefinerte argumenter", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Du trenger ikke å inkludere nettadressen, kun alt etter. Argumenter skilles ved bruk av to komma, slik: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Bruk defendefinert utdata", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Egendefinert utdata", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Dokumentasjon", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Sti er relativ til oppsettsnedlastingsstien. Ikke inkluder utvidelse.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Bruk identitetsbekreftelse", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Brukernavn", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Passord", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Navn:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "Nettadresse:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Opplaster:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Filstørrelse:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Sti:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Opplastingsdato:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Lukk", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Endre spilleliste", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Legg til mer innhold", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Lagre", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Antall:", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Rediger", - "826b25211922a1b46436589233cb6f1a163d89b7": "Slett", - "321e4419a943044e674beb55b8039f42a9761ca5": "Info", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Slett og svartelist", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Last opp nye kaker", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Dra og slipp", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "Merk: Oppasting av nye kaker overskriver tidligere. Merk deg også at kaker gjelder for hele instansen, ikke per bruker.", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Innstillinger", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "Nettadresse", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "Nettadressen dette programmet nås fra, uten porten.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Ønsket port. Forvalet er 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Multi-brukermodus", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Bruker-basissti", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Basissti for brukere og deres nedlastede videoer.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Tillat abonnementer", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Abonnements-basissti", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Basissti for videoer fra dine abonnementskanaler og spillelister. Den er relativ til YTDL-Material sin rotmappe.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Sjekkintervall", - "0f56a7449b77630c114615395bbda4cab398efd8": "I sekunder, kun tall.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Drakt", - "ff7cee38a2259526c519f878e71b964f41db4348": "Forvalg", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Mørk", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Tillat draktendring", - "fe46ccaae902ce974e2441abe752399288298619": "Språk", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Generelt", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Lydmappe", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Sti for lydbaserte nedlastinger. Den er relativ til YTDL-Material sin rotmappe.", - "46826331da1949bd6fb74624447057099c9d20cd": "Videomappe", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Sti for videonedlastinger. Den er relativ til YTDL-Material sin rotmappe.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Egendefinerte argumenter for nedlastninger på hjemmesiden for hele programmet. Argumenter skilles med to komma, slik: ,,", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Bruk youtube-dl-arktivet", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Inkluder miniatyrbilde", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Inkluder metadata", - "fb35145bfb84521e21b6385363d59221f436a573": "Drep alle nedlastinger", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Nedlaster", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Topptittel", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Filbehandler påskrudd", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Nedlastingsbehandler påskrudd", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Tillat kvalitetsvalg", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Modus kun for nedlasting", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Tillat multi-nedlastingsmodus", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Skru på offentlig API", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Offentlig API-nøkkel", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Vis dokumentasjon", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Generer", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Dette vil slette din gamle API-nøkkel!", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Bruk YouTube-API", - "ce10d31febb3d9d60c160750570310f303a22c22": "YouTube-API-nøkkel", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Å generere en nøkkel er lett!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Klikk her", - "7f09776373995003161235c0c8d02b7f91dbc4df": "for å laste ned den offisielle Chrome-utvidelsen for YouTubeDL-Material selv.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Du må manuelt laste ned utvidelsen og endre dens innstillinger for å sette skjermflate-nettadresse.", - "9a2ec6da48771128384887525bdcac992632c863": "for å installere den offisielle Firefox-utvidelsen for YouTubeDL-Material rett fra Firefox sin utvidelsesside.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Detaljert oppsettsinstruks", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Ikke mye kreves annet enn å endre utvidelses innstillinger for å sette skjermflate-nettadresse.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Dra lenken nedenfor til bokmerker. Naviger til YouTube-videoen du ønsker å laste ned og klikk på bokmerket.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Genrer \"kun lyd\"-bookmerke", - "d5f69691f9f05711633128b5a3db696783266b58": "Ekstra", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Bruk forvalgt nedlastingsagent", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Velg en nedlaster", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Loggingsnivå", - "db6c192032f4cab809aad35215f0aa4765761897": "Innloggingsutløp", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Tillat avansert nedlasting", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Bruk kaker", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Sett kaker", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avansert", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Tillat brukerregistrering", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Autentiseringsmetode", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP-nettadresse", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "BIND-DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "BIND-identitetsdetaljer", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Søkebase", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Søkefilter", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Brukere", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Logger", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Close} false {Cancel} other {otha} }", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Om YouTubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "er en fri YouTube-nedlaster bygd i henhold til Google sine Materielle spesifikasjoner. Du kan sømløst laste ned dine favorittvideoer som video- eller lydfiler, og tilogmed abonnere på dine favorittkanaler og spillelister for å holde deg oppdatert med nye videoer.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "har noen flotte funksjoner inkludert. Et vidtfavnende API, Docker-støtte, og lokalisering (oversettelser)-støtte. Les om alle støttede funksjoner ved å klikke på GitHub-ikonet ovenfor.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Installert versjon:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Ser etter oppdateringer …", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Oppdatering tilgjengelig", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Du kan oppdatere fra innstillingsmenyen.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Funnet en feil eller har et forslag å komme med?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "for å opprette en feilrapport.", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Din profil", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Opprettet:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Du er ikke innlogget.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Logg inn", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Logg ut", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Opprett administratorkonto", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Fant ingen administratorkonto. Dette vil opprette og sette passord for en slik konto med brukernavn som «admin».", - "70a67e04629f6d412db0a12d51820b480788d795": "Opprett", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profil", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Om", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Hjem", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Abonnementer", - "822fab38216f64e8166d368b59fe756ca39d301b": "Nedlastinger", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Del spilleliste", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Del video", - "1d540dcd271b316545d070f9d182c372d923aadd": "Del lyd", - "1f6d14a780a37a97899dc611881e6bc971268285": "Skru på deling", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Bruk tidsstempel", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Sekunder", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Kopier til utklippstavle", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Lagre endringer", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Nedlastet", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "En feil inntraff", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Detaljer", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "En feil har inntruffet:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Nedlastingsstart:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Nedlastingsslutt:", - "ad127117f9471612f47d01eae09709da444a36a4": "Filsti(er):", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Abonner på en spilleliste eller kanal", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "Spilleliste- eller kanal-nettadressen", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Egendefinert navn", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Last ned alle opplastinger", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Last ned videoer oppdatert siste", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Kun lyd-modus", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Kun strømming-modus", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Disse legges til etter standard-argumentene.", - "98b6ec9ec138186d663e64770267b67334353d63": "Egendefinert filutdata", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Abonner", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Type:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Arkiv:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Eksporter arkiv", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Opphev abonnement", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Dine abonnementer", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Kanaler", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Navn ikke tilgjengelig. Henter kanal …", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Du har ingen kanalabonnementer.", - "47546e45bbb476baaaad38244db444c427ddc502": "Spillelister", - "2e0a410652cb07d069f576b61eab32586a18320d": "Navn ikke tilgjengelig. Henter spilleliste …", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Du har ingen spillelisteabonnement.", - "3697f8583ea42868aa269489ad366103d94aece7": "Redigering", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Søk", - "2054791b822475aeaea95c0119113de3200f5e1c": "Lengde:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Slett og last ned igjen", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Slett for alltid", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Oppdaterer", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Velg en versjon:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Regustrer", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Økt-ID:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(nåværende)", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Tøm alle nedlastinger", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Ingen nedlastninger tilgjengelige!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registrer en bruker", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Brukernavn", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Håndter bruker", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Bruker-UID:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nytt passord", - "6498fa1b8f563988f769654a75411bb8060134b9": "Sett nytt passord", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Bruk rolle-forvalg", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ja", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Nei", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Håndter rolle", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Brukernavn", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Rolle", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Handlinger", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Rediger bruker", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Slett bruker", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Legg til brukere", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Rediger rolle", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Linjer:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Tøm logger", - "ccf5ea825526ac490974336cb5c24352886abc07": "Åpne fil", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Åpne fil i ny fane", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Gå til abonnement", - "d02888c485d3aeab6de628508f4a00312a722894": "Mine videoer" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.nl.xlf b/src/assets/i18n/messages.nl.xlf index 3d6b59f..03cb155 100644 --- a/src/assets/i18n/messages.nl.xlf +++ b/src/assets/i18n/messages.nl.xlf @@ -1545,8 +1545,8 @@ Custom args input placeholder - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - Algemene aanvullende opties voor downloads op de overzichtspagina. Scheidt deze met komma's: ,, + 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: ,, + Algemene aanvullende opties voor downloads op de overzichtspagina. (Stel de opties per abonnement in!) Scheidt deze met komma's: ,, src/app/settings/settings.component.html 134 diff --git a/src/assets/i18n/messages.zh.xlf b/src/assets/i18n/messages.zh.xlf index 7de9a79..be003db 100644 --- a/src/assets/i18n/messages.zh.xlf +++ b/src/assets/i18n/messages.zh.xlf @@ -1,4 +1,4 @@ - + @@ -902,8 +902,8 @@ Video path setting input hint - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - 开始页面上用于下载的全局自定义参数。参数由两个逗号分隔:,, + 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: ,, + 开始页面上用于下载的全局自定义参数。(单独为每个订阅设置订阅参数!) 参数由两个逗号分隔:,, app/settings/settings.component.html 146 diff --git a/src/postbuild.mjs b/src/postbuild.mjs index ff20b87..8bc6d71 100644 --- a/src/postbuild.mjs +++ b/src/postbuild.mjs @@ -33,7 +33,18 @@ async function createLocalizationJSON() { for (let i = 0; i < files.length; i++) { const file = path.basename(files[i]); const file_parts = file.split('.'); - locales.push(file_parts[1]); + if (file_parts.length !== 3 || file_parts[1] === 'en') continue; + try { + const locale_json = fs.readJSONSync(files[i]); + const locale_json_keys = Object.keys(locale_json); + let has_defined_keys = false; + for (let i = 0; i < locale_json_keys.length; i++) { + if (locale_json[locale_json_keys[i]] !== '') has_defined_keys = true; + } + if (has_defined_keys) locales.push(file_parts[1]); + } catch (err) { + console.error(err); + } } fs.unlinkSync('src/assets/i18n/messages.en.json'); diff --git a/youtubedl-material-chrome-extension.crx b/youtubedl-material-chrome-extension.crx deleted file mode 100644 index d2a9e1d..0000000 Binary files a/youtubedl-material-chrome-extension.crx and /dev/null differ