mirror of
https://github.com/Tzahi12345/YoutubeDL-Material.git
synced 2026-04-11 21:31:28 +03:00
Compare commits
160 Commits
angular-13
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a6f9d6f42 | ||
|
|
68c2bc9d3d | ||
|
|
e298f19534 | ||
|
|
6c875ba667 | ||
|
|
050c40fc19 | ||
|
|
0945a0bbd1 | ||
|
|
9f91fdf221 | ||
|
|
4b89c58c84 | ||
|
|
d0876516a6 | ||
|
|
e8390e3d9d | ||
|
|
5c4c282718 | ||
|
|
9fc659dc0a | ||
|
|
8dac9d1806 | ||
|
|
0f6742f11b | ||
|
|
d6aaca9233 | ||
|
|
7333edf6c8 | ||
|
|
5d9cb19bde | ||
|
|
a21dc85d15 | ||
|
|
a57a25133c | ||
|
|
d6f5b87d3f | ||
|
|
2678215e08 | ||
|
|
95203a47d0 | ||
|
|
7f4119febe | ||
|
|
02f758c33d | ||
|
|
554f7c9787 | ||
|
|
d37287541f | ||
|
|
da226df72a | ||
|
|
6199157687 | ||
|
|
d2e1b04326 | ||
|
|
4bff50a5f0 | ||
|
|
6ffa9d1ffd | ||
|
|
5a80b7aafa | ||
|
|
4d00960fcf | ||
|
|
6e8ca9d843 | ||
|
|
83a9d93ce5 | ||
|
|
2707b09627 | ||
|
|
8118906b0a | ||
|
|
2ad42ebf27 | ||
|
|
2b3490e52c | ||
|
|
55fd60acd3 | ||
|
|
664b635439 | ||
|
|
692d6eeaac | ||
|
|
9515d5a1b0 | ||
|
|
24df238ff9 | ||
|
|
f5e6815200 | ||
|
|
0e5efd003e | ||
|
|
3e7ef766de | ||
|
|
17fdd0d788 | ||
|
|
ce3e645129 | ||
|
|
acca2d0de2 | ||
|
|
31b4fcb9fc | ||
|
|
336d7a09bd | ||
|
|
7c31a10498 | ||
|
|
a94b8f376e | ||
|
|
84d33b0f82 | ||
|
|
3abf8ecfc3 | ||
|
|
5b919b2b18 | ||
|
|
e290dc0a25 | ||
|
|
a54f07e93a | ||
|
|
8336d886e9 | ||
|
|
6a56b5b065 | ||
|
|
7aca8ab060 | ||
|
|
8cc5c4f733 | ||
|
|
c5eacbb70c | ||
|
|
7268242691 | ||
|
|
d0f5518d31 | ||
|
|
713a97f75a | ||
|
|
0bdcfa3244 | ||
|
|
849c1927d3 | ||
|
|
06ca9cbe76 | ||
|
|
8e4a3119ab | ||
|
|
ec1ccf6888 | ||
|
|
c33e8010b3 | ||
|
|
57fd991d5c | ||
|
|
44c1a34c67 | ||
|
|
9f740020af | ||
|
|
4d4bc76549 | ||
|
|
93ce498e94 | ||
|
|
e5b256b8df | ||
|
|
05ea5a816f | ||
|
|
b3342d89c1 | ||
|
|
7bfb441a00 | ||
|
|
01fd2fb990 | ||
|
|
1bb4d9dbf6 | ||
|
|
5e23932146 | ||
|
|
d6d3495c5b | ||
|
|
a36761e96a | ||
|
|
88c16d7195 | ||
|
|
8a323f028d | ||
|
|
a68726e7cb | ||
|
|
dab0b7a8b6 | ||
|
|
9f9054ed9d | ||
|
|
77e8cbc6b5 | ||
|
|
4c06c430eb | ||
|
|
2981f843c3 | ||
|
|
3a48ff2d50 | ||
|
|
ac2c3dc8a1 | ||
|
|
0abe252d1e | ||
|
|
f5f00e1732 | ||
|
|
c309e41a91 | ||
|
|
754d837059 | ||
|
|
d5626f1dae | ||
|
|
9c0733453a | ||
|
|
2a41028253 | ||
|
|
67b2e480f8 | ||
|
|
2cdc1cee98 | ||
|
|
bd1ed2b705 | ||
|
|
33ca0f0817 | ||
|
|
d5ab0d7b96 | ||
|
|
777aebe508 | ||
|
|
efaecaa059 | ||
|
|
39ddefab5c | ||
|
|
60f2ab449f | ||
|
|
958f80e200 | ||
|
|
7aa5c1bf7f | ||
|
|
3bcbe0d3e7 | ||
|
|
80fcecdaea | ||
|
|
0329cd9718 | ||
|
|
493e876a97 | ||
|
|
574edd74ab | ||
|
|
fe91484f24 | ||
|
|
dda6e40a42 | ||
|
|
c0fb838931 | ||
|
|
28924cc7a0 | ||
|
|
2527051eab | ||
|
|
fcf7d14f46 | ||
|
|
0a8aba54d2 | ||
|
|
2c6485acb2 | ||
|
|
aea4f52267 | ||
|
|
5ac5fca482 | ||
|
|
7874f1b71a | ||
|
|
960c545f37 | ||
|
|
5e3eb68b03 | ||
|
|
4dd3b97515 | ||
|
|
701066eec1 | ||
|
|
7f61ccb5f5 | ||
|
|
4f227ca442 | ||
|
|
666bd2057d | ||
|
|
37c858f950 | ||
|
|
ebb7f6a2b0 | ||
|
|
48e46db071 | ||
|
|
768ec59f30 | ||
|
|
aa8f602856 | ||
|
|
d5c1361e64 | ||
|
|
901a96aada | ||
|
|
21507ee36d | ||
|
|
0585943d67 | ||
|
|
0bc2193f25 | ||
|
|
f3398fce1a | ||
|
|
60e8973f52 | ||
|
|
d94857b0a5 | ||
|
|
5fda56d7af | ||
|
|
abb80b33f3 | ||
|
|
9977340161 | ||
|
|
c008171850 | ||
|
|
02e683add9 | ||
|
|
d90b2d3687 | ||
|
|
32b68033e8 | ||
|
|
08027a5c0b | ||
|
|
25aac19cfb |
18
.github/dependabot.yaml
vendored
Normal file
18
.github/dependabot.yaml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "docker"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/.github/workflows"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/backend/"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
38
.github/workflows/close-issue-if-noresponse.yml
vendored
Normal file
38
.github/workflows/close-issue-if-noresponse.yml
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
name: No Response
|
||||||
|
|
||||||
|
# Both `issue_comment` and `scheduled` event types are required for this Action
|
||||||
|
# to work properly.
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
schedule:
|
||||||
|
# Schedule for five minutes after the hour, every hour
|
||||||
|
- cron: '5 * * * *'
|
||||||
|
|
||||||
|
# By specifying the access of one of the scopes, all of those that are not
|
||||||
|
# specified are set to 'none'.
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
noResponse:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.repository == 'Tzahi12345/YoutubeDL-Material' }}
|
||||||
|
steps:
|
||||||
|
- uses: lee-dohm/no-response@v0.5.0
|
||||||
|
with:
|
||||||
|
token: ${{ github.token }}
|
||||||
|
# Comment to post when closing an Issue for lack of response. Set to `false` to disable
|
||||||
|
closeComment: >
|
||||||
|
This issue has been automatically closed because there has been no response
|
||||||
|
to our request for more information from the original author. With only the
|
||||||
|
information that is currently in the issue, we don't have enough information
|
||||||
|
to take action. Please reach out if you have or find the answers we need so
|
||||||
|
that we can investigate further. We will re-open this issue if you provide us
|
||||||
|
with the requested information with a comment under this issue.
|
||||||
|
Thank you for your understanding and for trying to help make this application
|
||||||
|
a better one!
|
||||||
|
# Number of days of inactivity before an issue is closed for lack of response.
|
||||||
|
daysUntilClose: 21
|
||||||
|
# Label requiring a response.
|
||||||
|
responseRequiredLabel: "💬 response-needed"
|
||||||
27
.github/workflows/docker-pr.yml
vendored
Normal file
27
.github/workflows/docker-pr.yml
vendored
Normal file
@@ -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
|
||||||
18
.github/workflows/docker.yml
vendored
18
.github/workflows/docker.yml
vendored
@@ -3,6 +3,16 @@ name: docker
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [master]
|
branches: [master]
|
||||||
|
paths-ignore:
|
||||||
|
- '.github/**'
|
||||||
|
- '.vscode/**'
|
||||||
|
- 'chrome-extension/**'
|
||||||
|
- 'releases/**'
|
||||||
|
- '**/**.md'
|
||||||
|
- '**.crx'
|
||||||
|
- '**.pem'
|
||||||
|
- '.dockerignore'
|
||||||
|
- '.gitignore'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-push:
|
build-and-push:
|
||||||
@@ -21,7 +31,7 @@ jobs:
|
|||||||
uses: jsdaniell/create-json@1.1.2
|
uses: jsdaniell/create-json@1.1.2
|
||||||
with:
|
with:
|
||||||
name: "version.json"
|
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/'
|
dir: 'backend/'
|
||||||
- name: setup platform emulator
|
- name: setup platform emulator
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v1
|
||||||
@@ -39,4 +49,8 @@ jobs:
|
|||||||
file: ./Dockerfile
|
file: ./Dockerfile
|
||||||
platforms: linux/amd64,linux/arm,linux/arm64/v8
|
platforms: linux/amd64,linux/arm,linux/arm64/v8
|
||||||
push: true
|
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}}
|
||||||
|
|||||||
102
Dockerfile
102
Dockerfile
@@ -1,54 +1,66 @@
|
|||||||
FROM alpine:latest AS ffmpeg
|
# Fetching our ffmpeg
|
||||||
|
FROM ubuntu:22.04 AS ffmpeg
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
# Use script due local build compability
|
||||||
|
COPY ffmpeg-fetch.sh .
|
||||||
|
RUN sh ./ffmpeg-fetch.sh
|
||||||
|
|
||||||
COPY docker-build.sh .
|
|
||||||
RUN sh ./docker-build.sh
|
|
||||||
|
|
||||||
FROM alpine:latest as frontend
|
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
npm
|
|
||||||
|
|
||||||
RUN npm install -g @angular/cli
|
|
||||||
|
|
||||||
WORKDIR /build
|
|
||||||
COPY [ "package.json", "package-lock.json", "/build/" ]
|
|
||||||
RUN npm install
|
|
||||||
|
|
||||||
COPY [ "angular.json", "tsconfig.json", "/build/" ]
|
|
||||||
COPY [ "src/", "/build/src/" ]
|
|
||||||
RUN npm run build
|
|
||||||
|
|
||||||
#--------------#
|
|
||||||
|
|
||||||
FROM alpine:latest
|
|
||||||
|
|
||||||
ENV UID=1000 \
|
|
||||||
GID=1000 \
|
|
||||||
USER=youtube
|
|
||||||
|
|
||||||
|
# Create our Ubuntu 22.04 with node 16
|
||||||
|
# Go to 20.04
|
||||||
|
FROM ubuntu:20.04 AS base
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV UID=1000
|
||||||
|
ENV GID=1000
|
||||||
|
ENV USER=youtube
|
||||||
ENV NO_UPDATE_NOTIFIER=true
|
ENV NO_UPDATE_NOTIFIER=true
|
||||||
|
|
||||||
RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID
|
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
npm \
|
|
||||||
python2 \
|
|
||||||
python3 \
|
|
||||||
su-exec \
|
|
||||||
&& apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \
|
|
||||||
atomicparsley
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg
|
|
||||||
COPY --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
|
ENV PM2_HOME=/app/pm2
|
||||||
RUN npm install pm2 -g
|
RUN groupadd -g $GID $USER && useradd --system -m -g $USER --uid $UID $USER && \
|
||||||
RUN npm install && chown -R $UID:$GID ./
|
apt update && \
|
||||||
|
apt install -y --no-install-recommends curl ca-certificates && \
|
||||||
|
curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
|
||||||
|
apt install -y --no-install-recommends nodejs && \
|
||||||
|
npm -g install npm && \
|
||||||
|
apt clean && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
|
||||||
|
# Build frontend
|
||||||
|
FROM base as frontend
|
||||||
|
RUN npm install -g @angular/cli
|
||||||
|
WORKDIR /build
|
||||||
|
COPY [ "package.json", "package-lock.json", "angular.json", "tsconfig.json", "/build/" ]
|
||||||
|
COPY [ "src/", "/build/src/" ]
|
||||||
|
RUN npm install && \
|
||||||
|
npm run build && \
|
||||||
|
ls -al /build/backend/public
|
||||||
|
|
||||||
|
|
||||||
|
# Install backend deps
|
||||||
|
FROM base as backend
|
||||||
|
WORKDIR /app
|
||||||
|
COPY [ "backend/","/app/" ]
|
||||||
|
RUN npm config set strict-ssl false && \
|
||||||
|
npm install --prod && \
|
||||||
|
ls -al
|
||||||
|
|
||||||
|
|
||||||
|
# Final image
|
||||||
|
FROM base
|
||||||
|
RUN npm install -g pm2 && \
|
||||||
|
apt update && \
|
||||||
|
apt install -y --no-install-recommends gosu python3-minimal python-is-python3 atomicparsley && \
|
||||||
|
apt clean && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
WORKDIR /app
|
||||||
|
# User 1000 already exist from base image
|
||||||
|
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 --from=backend ["/app/","/app/"]
|
||||||
COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ]
|
COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ]
|
||||||
COPY --chown=$UID:$GID [ "/backend/", "/app/" ]
|
# Add some persistence data
|
||||||
|
#VOLUME ["/app/appdata"]
|
||||||
|
|
||||||
EXPOSE 17442
|
EXPOSE 17442
|
||||||
ENTRYPOINT [ "/app/entrypoint.sh" ]
|
ENTRYPOINT [ "/app/entrypoint.sh" ]
|
||||||
CMD [ "pm2-runtime", "pm2.config.js" ]
|
CMD [ "pm2-runtime","--raw","pm2.config.js" ]
|
||||||
|
|||||||
2
Dockerfile.heroku
Normal file
2
Dockerfile.heroku
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
FROM tzahi12345/youtubedl-material:nightly
|
||||||
|
CMD [ "pm2-runtime", "pm2.config.js" ]
|
||||||
@@ -16,7 +16,7 @@ paths:
|
|||||||
- downloader
|
- downloader
|
||||||
summary: Download video file
|
summary: Download video file
|
||||||
description: |-
|
description: |-
|
||||||
Downloads a video file with the given URL. Will include global args if they exist.
|
Downloads a file with the given URL. Will include global args if they exist.
|
||||||
|
|
||||||
|
|
||||||
HTTP requests will return once the video file download completes. In the future, it will (by default) return once the download starts, and a separate API call will be used for checking the download status.
|
HTTP requests will return once the video file download completes. In the future, it will (by default) return once the download starts, and a separate API call will be used for checking the download status.
|
||||||
@@ -41,7 +41,7 @@ paths:
|
|||||||
post:
|
post:
|
||||||
tags:
|
tags:
|
||||||
- downloader
|
- downloader
|
||||||
summary: Download video file
|
summary: Generates arguments used to download file
|
||||||
description: Generates args, used for checking what args would run if you ran downloadFile
|
description: Generates args, used for checking what args would run if you ran downloadFile
|
||||||
operationId: post-generateArgs
|
operationId: post-generateArgs
|
||||||
requestBody:
|
requestBody:
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
[](https://github.com/Tzahi12345/YoutubeDL-Material/issues)
|
[](https://github.com/Tzahi12345/YoutubeDL-Material/issues)
|
||||||
[](https://github.com/Tzahi12345/YoutubeDL-Material/blob/master/LICENSE.md)
|
[](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!
|
Now with [Docker](#Docker) support!
|
||||||
|
|
||||||
|
|||||||
21
SECURITY.md
Normal file
21
SECURITY.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Currently all work on this project goes into the nightly builds.
|
||||||
|
4.2's RELEASE build is now quite old and should be considered legacy.
|
||||||
|
We urge users to use the nightly releases, because the project
|
||||||
|
constantly sees fixes.
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| ------------- | ------------------ |
|
||||||
|
| 4.2 Nightlies | :white_check_mark: |
|
||||||
|
| 4.2 Release | :x: |
|
||||||
|
| < 4.2 | :x: |
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
Please file an issue in our GitHub's repo, because this app
|
||||||
|
isn't meant to be safe to run as public instance yet, but rather as a LAN facing app.
|
||||||
|
|
||||||
|
We welcome PRs and help in general in making YTDL-M more secure, but it's not a priority as of now.
|
||||||
1
app.json
1
app.json
@@ -2,6 +2,7 @@
|
|||||||
"name": "YoutubeDL-Material",
|
"name": "YoutubeDL-Material",
|
||||||
"description": "An open-source and self-hosted YouTube downloader based on Google's Material Design specifications.",
|
"description": "An open-source and self-hosted YouTube downloader based on Google's Material Design specifications.",
|
||||||
"repository": "https://github.com/Tzahi12345/YoutubeDL-Material",
|
"repository": "https://github.com/Tzahi12345/YoutubeDL-Material",
|
||||||
|
"stack": "container",
|
||||||
"logo": "https://i.imgur.com/GPzvPiU.png",
|
"logo": "https://i.imgur.com/GPzvPiU.png",
|
||||||
"keywords": ["youtube-dl", "youtubedl-material", "nodejs"]
|
"keywords": ["youtube-dl", "youtubedl-material", "nodejs"]
|
||||||
}
|
}
|
||||||
@@ -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" ]
|
|
||||||
@@ -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) {
|
async function updateServer(tag) {
|
||||||
// no tag provided means update to the latest version
|
// no tag provided means update to the latest version
|
||||||
if (!tag) {
|
if (!tag) {
|
||||||
@@ -297,7 +289,7 @@ async function updateServer(tag) {
|
|||||||
updating: true,
|
updating: true,
|
||||||
'details': 'Update complete! Restarting server...'
|
'details': 'Update complete! Restarting server...'
|
||||||
}
|
}
|
||||||
restartServer(true);
|
utils.restartServer(true);
|
||||||
}, err => {
|
}, err => {
|
||||||
logger.error(err);
|
logger.error(err);
|
||||||
updaterStatus = {
|
updaterStatus = {
|
||||||
@@ -676,6 +668,7 @@ async function getUrlInfos(url) {
|
|||||||
|
|
||||||
async function startYoutubeDL() {
|
async function startYoutubeDL() {
|
||||||
// auto update youtube-dl
|
// auto update youtube-dl
|
||||||
|
youtubedl_api.verifyBinaryExistsLinux();
|
||||||
const update_available = await youtubedl_api.checkForYoutubeDLUpdate();
|
const update_available = await youtubedl_api.checkForYoutubeDLUpdate();
|
||||||
if (update_available) await youtubedl_api.updateYoutubeDL(update_available);
|
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) => {
|
app.post('/api/restartServer', optionalJwt, (req, res) => {
|
||||||
// delayed by a little bit so that the client gets a response
|
// delayed by a little bit so that the client gets a response
|
||||||
setTimeout(() => {restartServer()}, 100);
|
setTimeout(() => {utils.restartServer()}, 100);
|
||||||
res.send({success: true});
|
res.send({success: true});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -803,7 +796,7 @@ app.post('/api/testConnectionString', optionalJwt, async (req, res) => {
|
|||||||
app.post('/api/downloadFile', optionalJwt, async function(req, res) {
|
app.post('/api/downloadFile', optionalJwt, async function(req, res) {
|
||||||
req.setTimeout(0); // remove timeout in case of long videos
|
req.setTimeout(0); // remove timeout in case of long videos
|
||||||
const url = req.body.url;
|
const url = req.body.url;
|
||||||
const type = req.body.type;
|
const type = req.body.type ? req.body.type : 'video';
|
||||||
const user_uid = req.isAuthenticated() ? req.user.uid : null;
|
const user_uid = req.isAuthenticated() ? req.user.uid : null;
|
||||||
const options = {
|
const options = {
|
||||||
customArgs: req.body.customArgs,
|
customArgs: req.body.customArgs,
|
||||||
@@ -1802,6 +1795,7 @@ app.post('/api/updateTaskData', optionalJwt, async (req, res) => {
|
|||||||
|
|
||||||
app.post('/api/getDBBackups', optionalJwt, async (req, res) => {
|
app.post('/api/getDBBackups', optionalJwt, async (req, res) => {
|
||||||
const backup_dir = path.join('appdata', 'db_backup');
|
const backup_dir = path.join('appdata', 'db_backup');
|
||||||
|
fs.ensureDirSync(backup_dir);
|
||||||
const db_backups = [];
|
const db_backups = [];
|
||||||
|
|
||||||
const candidate_backups = await utils.recFindByExt(backup_dir, 'bak', null, [], false);
|
const candidate_backups = await utils.recFindByExt(backup_dir, 'bak', null, [], false);
|
||||||
|
|||||||
@@ -18,10 +18,19 @@ let JWT_EXPIRATION = null;
|
|||||||
let opts = null;
|
let opts = null;
|
||||||
let saltRounds = null;
|
let saltRounds = null;
|
||||||
|
|
||||||
exports.initialize = function() {
|
exports.initialize = function () {
|
||||||
/*************************
|
/*************************
|
||||||
* Authentication module
|
* Authentication module
|
||||||
************************/
|
************************/
|
||||||
|
|
||||||
|
if (db_api.database_initialized) {
|
||||||
|
setupRoles();
|
||||||
|
} else {
|
||||||
|
db_api.database_initialized_bs.subscribe(init => {
|
||||||
|
if (init) setupRoles();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
saltRounds = 10;
|
saltRounds = 10;
|
||||||
|
|
||||||
JWT_EXPIRATION = config_api.getConfigItem('ytdl_jwt_expiration');
|
JWT_EXPIRATION = config_api.getConfigItem('ytdl_jwt_expiration');
|
||||||
@@ -49,6 +58,41 @@ exports.initialize = function() {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const setupRoles = async () => {
|
||||||
|
const required_roles = {
|
||||||
|
admin: {
|
||||||
|
permissions: [
|
||||||
|
'filemanager',
|
||||||
|
'settings',
|
||||||
|
'subscriptions',
|
||||||
|
'sharing',
|
||||||
|
'advanced_download',
|
||||||
|
'downloads_manager'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
user: {
|
||||||
|
permissions: [
|
||||||
|
'filemanager',
|
||||||
|
'subscriptions',
|
||||||
|
'sharing'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const role_keys = Object.keys(required_roles);
|
||||||
|
for (let i = 0; i < role_keys.length; i++) {
|
||||||
|
const role_key = role_keys[i];
|
||||||
|
const role_in_db = await db_api.getRecord('roles', {key: role_key});
|
||||||
|
if (!role_in_db) {
|
||||||
|
// insert task metadata into table if missing
|
||||||
|
await db_api.insertRecordIntoTable('roles', {
|
||||||
|
key: role_key,
|
||||||
|
permissions: required_roles[role_key]['permissions']
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
exports.passport = require('passport');
|
exports.passport = require('passport');
|
||||||
|
|
||||||
exports.passport.serializeUser(function(user, done) {
|
exports.passport.serializeUser(function(user, done) {
|
||||||
|
|||||||
@@ -222,4 +222,83 @@ exports.AVAILABLE_PERMISSIONS = [
|
|||||||
|
|
||||||
exports.DETAILS_BIN_PATH = 'node_modules/youtube-dl/bin/details'
|
exports.DETAILS_BIN_PATH = 'node_modules/youtube-dl/bin/details'
|
||||||
|
|
||||||
|
// args that have a value after it (e.g. -o <output> or -f <format>)
|
||||||
|
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';
|
exports.CURRENT_VERSION = 'v4.2';
|
||||||
|
|||||||
@@ -85,7 +85,6 @@ exports.initialize = (input_db, input_users_db) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
exports.connectToDB = async (retries = 5, no_fallback = false, custom_connection_string = null) => {
|
exports.connectToDB = async (retries = 5, no_fallback = false, custom_connection_string = null) => {
|
||||||
if (using_local_db && !custom_connection_string) return;
|
|
||||||
const success = await exports._connectToDB(custom_connection_string);
|
const success = await exports._connectToDB(custom_connection_string);
|
||||||
if (success) return true;
|
if (success) return true;
|
||||||
|
|
||||||
@@ -496,6 +495,7 @@ exports.deleteFile = async (uid, uuid = null, blacklistMode = false) => {
|
|||||||
|
|
||||||
let useYoutubeDLArchive = config_api.getConfigItem('ytdl_use_youtubedl_archive');
|
let useYoutubeDLArchive = config_api.getConfigItem('ytdl_use_youtubedl_archive');
|
||||||
if (useYoutubeDLArchive) {
|
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`);
|
const archive_path = uuid ? path.join(usersFileFolder, uuid, 'archives', `archive_${type}.txt`) : path.join('appdata', 'archives', `archive_${type}.txt`);
|
||||||
|
|
||||||
// get ID from JSON
|
// get ID from JSON
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ const { uuid } = require('uuidv4');
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const mergeFiles = require('merge-files');
|
const mergeFiles = require('merge-files');
|
||||||
const NodeID3 = require('node-id3')
|
const NodeID3 = require('node-id3')
|
||||||
const glob = require('glob')
|
|
||||||
const Mutex = require('async-mutex').Mutex;
|
const Mutex = require('async-mutex').Mutex;
|
||||||
|
|
||||||
const youtubedl = require('youtube-dl');
|
const youtubedl = require('youtube-dl');
|
||||||
@@ -486,7 +485,7 @@ exports.generateArgs = async (url, type, options, user_uid = null, simulated = f
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (options.additionalArgs && options.additionalArgs !== '') {
|
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');
|
const rate_limit = config_api.getConfigItem('ytdl_download_rate_limit');
|
||||||
@@ -583,20 +582,26 @@ async function checkDownloadPercent(download_uid) {
|
|||||||
if (!resulting_file_size) return;
|
if (!resulting_file_size) return;
|
||||||
|
|
||||||
let sum_size = 0;
|
let sum_size = 0;
|
||||||
glob(`{${files_to_check_for_progress.join(',')}, }*`, async (err, files) => {
|
for (let i = 0; i < files_to_check_for_progress.length; i++) {
|
||||||
files.forEach(async file => {
|
const file_to_check_for_progress = files_to_check_for_progress[i];
|
||||||
try {
|
const dir = path.dirname(file_to_check_for_progress);
|
||||||
const file_stats = fs.statSync(file);
|
if (!fs.existsSync(dir)) continue;
|
||||||
if (file_stats && file_stats.size) {
|
fs.readdir(dir, async (err, files) => {
|
||||||
sum_size += file_stats.size;
|
for (let j = 0; j < files.length; j++) {
|
||||||
}
|
const file = files[j];
|
||||||
} catch (e) {
|
if (!file.includes(path.basename(file_to_check_for_progress))) continue;
|
||||||
|
try {
|
||||||
|
const file_stats = fs.statSync(path.join(dir, file));
|
||||||
|
if (file_stats && file_stats.size) {
|
||||||
|
sum_size += file_stats.size;
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const percent_complete = (sum_size/resulting_file_size * 100).toFixed(2);
|
||||||
|
await db_api.updateRecord('download_queue', {uid: download_uid}, {percent_complete: percent_complete});
|
||||||
});
|
});
|
||||||
const percent_complete = (sum_size/resulting_file_size * 100).toFixed(2);
|
}
|
||||||
await db_api.updateRecord('download_queue', {uid: download_uid}, {percent_complete: percent_complete});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.generateNFOFile = (info, output_path) => {
|
exports.generateNFOFile = (info, output_path) => {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ fi
|
|||||||
# chown current working directory to current user
|
# chown current working directory to current user
|
||||||
if [ "$*" = "$CMD" ] && [ "$(id -u)" = "0" ]; then
|
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."
|
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
|
fi
|
||||||
|
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|||||||
58
backend/fix-scripts/001-fix_download_permissions.sh
Normal file
58
backend/fix-scripts/001-fix_download_permissions.sh
Normal file
@@ -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
|
||||||
6
backend/package-lock.json
generated
6
backend/package-lock.json
generated
@@ -2567,9 +2567,9 @@
|
|||||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
||||||
},
|
},
|
||||||
"passport": {
|
"passport": {
|
||||||
"version": "0.5.2",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/passport/-/passport-0.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz",
|
||||||
"integrity": "sha512-w9n/Ot5I7orGD4y+7V3EFJCQEznE5RxHamUxcqLT2QoJY0f2JdN8GyHonYFvN0Vz+L6lUJfVhrk2aZz2LbuREw==",
|
"integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"passport-strategy": "1.x.x",
|
"passport-strategy": "1.x.x",
|
||||||
"pause": "0.0.1"
|
"pause": "0.0.1"
|
||||||
|
|||||||
@@ -40,7 +40,6 @@
|
|||||||
"express": "^4.17.3",
|
"express": "^4.17.3",
|
||||||
"fluent-ffmpeg": "^2.1.2",
|
"fluent-ffmpeg": "^2.1.2",
|
||||||
"fs-extra": "^9.0.0",
|
"fs-extra": "^9.0.0",
|
||||||
"glob": "^7.1.6",
|
|
||||||
"jsonwebtoken": "^8.5.1",
|
"jsonwebtoken": "^8.5.1",
|
||||||
"lowdb": "^1.0.0",
|
"lowdb": "^1.0.0",
|
||||||
"md5": "^2.2.1",
|
"md5": "^2.2.1",
|
||||||
@@ -53,7 +52,7 @@
|
|||||||
"node-id3": "^0.1.14",
|
"node-id3": "^0.1.14",
|
||||||
"node-schedule": "^2.1.0",
|
"node-schedule": "^2.1.0",
|
||||||
"nodemon": "^2.0.7",
|
"nodemon": "^2.0.7",
|
||||||
"passport": "^0.5.2",
|
"passport": "^0.4.1",
|
||||||
"passport-http": "^0.3.0",
|
"passport-http": "^0.3.0",
|
||||||
"passport-jwt": "^4.0.0",
|
"passport-jwt": "^4.0.0",
|
||||||
"passport-ldapauth": "^3.0.1",
|
"passport-ldapauth": "^3.0.1",
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ async function unsubscribe(sub, deleteMode, user_uid = null) {
|
|||||||
if (sub.archive && (await fs.pathExists(sub.archive))) {
|
if (sub.archive && (await fs.pathExists(sub.archive))) {
|
||||||
const archive_file_path = path.join(sub.archive, 'archive.txt');
|
const archive_file_path = path.join(sub.archive, 'archive.txt');
|
||||||
// deletes archive if it exists
|
// 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)) {
|
if (await fs.pathExists(archive_file_path)) {
|
||||||
await fs.unlink(archive_file_path);
|
await fs.unlink(archive_file_path);
|
||||||
}
|
}
|
||||||
@@ -266,11 +267,17 @@ async function getVideosForSub(sub, user_uid = null) {
|
|||||||
}
|
}
|
||||||
resolve(false);
|
resolve(false);
|
||||||
} else if (output) {
|
} else if (output) {
|
||||||
|
if (config_api.getConfigItem('ytdl_subscriptions_redownload_fresh_uploads')) {
|
||||||
|
await setFreshUploads(sub, user_uid);
|
||||||
|
checkVideosForFreshUploads(sub, user_uid);
|
||||||
|
}
|
||||||
|
|
||||||
if (output.length === 0 || (output.length === 1 && output[0] === '')) {
|
if (output.length === 0 || (output.length === 1 && output[0] === '')) {
|
||||||
logger.verbose('No additional videos to download for ' + sub.name);
|
logger.verbose('No additional videos to download for ' + sub.name);
|
||||||
resolve(true);
|
resolve(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const output_jsons = [];
|
const output_jsons = [];
|
||||||
for (let i = 0; i < output.length; i++) {
|
for (let i = 0; i < output.length; i++) {
|
||||||
let output_json = null;
|
let output_json = null;
|
||||||
@@ -294,14 +301,7 @@ async function getVideosForSub(sub, user_uid = null) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resolve(files_to_download);
|
resolve(files_to_download);
|
||||||
|
}
|
||||||
if (config_api.getConfigItem('ytdl_subscriptions_redownload_fresh_uploads')) {
|
|
||||||
await setFreshUploads(sub, user_uid);
|
|
||||||
checkVideosForFreshUploads(sub, user_uid);
|
|
||||||
}
|
|
||||||
|
|
||||||
resolve(true);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}, err => {
|
}, err => {
|
||||||
logger.error(err);
|
logger.error(err);
|
||||||
@@ -380,7 +380,11 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de
|
|||||||
if (useArchive && !redownload) {
|
if (useArchive && !redownload) {
|
||||||
if (sub.archive) {
|
if (sub.archive) {
|
||||||
archive_dir = 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);
|
downloadConfig.push('--download-archive', archive_path);
|
||||||
}
|
}
|
||||||
@@ -473,22 +477,24 @@ async function updateSubscriptionProperty(sub, assignment_obj) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setFreshUploads(sub, user_uid) {
|
async function setFreshUploads(sub) {
|
||||||
|
const sub_files = await db_api.getRecords('files', {sub_id: sub.id});
|
||||||
const current_date = new Date().toISOString().split('T')[0].replace(/-/g, '');
|
const current_date = new Date().toISOString().split('T')[0].replace(/-/g, '');
|
||||||
sub.videos.forEach(async video => {
|
sub_files.forEach(async file => {
|
||||||
if (current_date === video['upload_date'].replace(/-/g, '')) {
|
if (current_date === file['upload_date'].replace(/-/g, '')) {
|
||||||
// set upload as fresh
|
// set upload as fresh
|
||||||
const video_uid = video['uid'];
|
const file_uid = file['uid'];
|
||||||
await db_api.setVideoProperty(video_uid, {'fresh_upload': true}, user_uid, sub['id']);
|
await db_api.setVideoProperty(file_uid, {'fresh_upload': true});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function checkVideosForFreshUploads(sub, user_uid) {
|
async function checkVideosForFreshUploads(sub, user_uid) {
|
||||||
|
const sub_files = await db_api.getRecords('files', {sub_id: sub.id});
|
||||||
const current_date = new Date().toISOString().split('T')[0].replace(/-/g, '');
|
const current_date = new Date().toISOString().split('T')[0].replace(/-/g, '');
|
||||||
sub.videos.forEach(async video => {
|
sub_files.forEach(async file => {
|
||||||
if (video['fresh_upload'] && current_date > video['upload_date'].replace(/-/g, '')) {
|
if (file['fresh_upload'] && current_date > file['upload_date'].replace(/-/g, '')) {
|
||||||
await checkVideoIfBetterExists(video, sub, user_uid)
|
await checkVideoIfBetterExists(file, sub, user_uid)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -510,13 +516,13 @@ async function checkVideoIfBetterExists(file_obj, sub, user_uid) {
|
|||||||
logger.verbose(`Failed to download better version of video ${file_obj['id']}`);
|
logger.verbose(`Failed to download better version of video ${file_obj['id']}`);
|
||||||
} else if (output) {
|
} else if (output) {
|
||||||
logger.verbose(`Successfully upgraded video ${file_obj['id']}'s ${metric_to_compare} from ${file_obj[metric_to_compare]} to ${output[metric_to_compare]}`);
|
logger.verbose(`Successfully upgraded video ${file_obj['id']}'s ${metric_to_compare} from ${file_obj[metric_to_compare]} to ${output[metric_to_compare]}`);
|
||||||
await db_api.setVideoProperty(file_obj['uid'], {[metric_to_compare]: output[metric_to_compare]}, user_uid, sub['id']);
|
await db_api.setVideoProperty(file_obj['uid'], {[metric_to_compare]: output[metric_to_compare]});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
await db_api.setVideoProperty(file_obj['uid'], {'fresh_upload': false}, user_uid, sub['id']);
|
await db_api.setVideoProperty(file_obj['uid'], {'fresh_upload': false});
|
||||||
}
|
}
|
||||||
|
|
||||||
// helper functions
|
// helper functions
|
||||||
|
|||||||
@@ -42,9 +42,9 @@ function scheduleJob(task_key, schedule) {
|
|||||||
if (schedule['type'] === 'timestamp') {
|
if (schedule['type'] === 'timestamp') {
|
||||||
converted_schedule = new Date(schedule['data']['timestamp']);
|
converted_schedule = new Date(schedule['data']['timestamp']);
|
||||||
} else if (schedule['type'] === 'recurring') {
|
} else if (schedule['type'] === 'recurring') {
|
||||||
const dayOfWeek = schedule['data']['dayOfWeek'] ? schedule['data']['dayOfWeek'] : null;
|
const dayOfWeek = schedule['data']['dayOfWeek'] != null ? schedule['data']['dayOfWeek'] : null;
|
||||||
const hour = schedule['data']['hour'] ? schedule['data']['hour'] : null;
|
const hour = schedule['data']['hour'] != null ? schedule['data']['hour'] : null;
|
||||||
const minute = schedule['data']['minute'] ? schedule['data']['minute'] : null;
|
const minute = schedule['data']['minute'] != null ? schedule['data']['minute'] : null;
|
||||||
converted_schedule = new scheduler.RecurrenceRule(null, null, null, dayOfWeek, hour, minute);
|
converted_schedule = new scheduler.RecurrenceRule(null, null, null, dayOfWeek, hour, minute);
|
||||||
} else {
|
} else {
|
||||||
logger.error(`Failed to schedule job '${task_key}' as the type '${schedule['type']}' is invalid.`)
|
logger.error(`Failed to schedule job '${task_key}' as the type '${schedule['type']}' is invalid.`)
|
||||||
|
|||||||
@@ -386,6 +386,21 @@ describe('Downloader', function() {
|
|||||||
assert(fs.existsSync(nfo_file_path), true);
|
assert(fs.existsSync(nfo_file_path), true);
|
||||||
fs.unlinkSync(nfo_file_path);
|
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() {
|
describe('Tasks', function() {
|
||||||
|
|||||||
@@ -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
|
// objects
|
||||||
|
|
||||||
function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) {
|
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,
|
wait: wait,
|
||||||
checkExistsWithTimeout: checkExistsWithTimeout,
|
checkExistsWithTimeout: checkExistsWithTimeout,
|
||||||
fetchFile: fetchFile,
|
fetchFile: fetchFile,
|
||||||
|
restartServer: restartServer,
|
||||||
|
injectArgs: injectArgs,
|
||||||
File: File
|
File: File
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ const utils = require('./utils');
|
|||||||
const CONSTS = require('./consts');
|
const CONSTS = require('./consts');
|
||||||
const config_api = require('./config.js');
|
const config_api = require('./config.js');
|
||||||
|
|
||||||
|
const OUTDATED_VERSION = "2020.00.00";
|
||||||
|
|
||||||
const is_windows = process.platform === 'win32';
|
const is_windows = process.platform === 'win32';
|
||||||
|
|
||||||
const download_sources = {
|
const download_sources = {
|
||||||
@@ -31,7 +33,7 @@ exports.checkForYoutubeDLUpdate = async () => {
|
|||||||
let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH);
|
let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH);
|
||||||
if (!current_app_details_exists) {
|
if (!current_app_details_exists) {
|
||||||
logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`);
|
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_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH));
|
||||||
let current_version = current_app_details['version'];
|
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);
|
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'] && 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) {
|
async function downloadLatestYoutubeDLBinary(new_version) {
|
||||||
const file_ext = is_windows ? '.exe' : '';
|
const file_ext = is_windows ? '.exe' : '';
|
||||||
|
|
||||||
|
|||||||
@@ -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-----
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# THANK YOU TALULAH (https://github.com/nottalulah) for your help in figuring this out
|
|
||||||
# and also optimizing some code with this commit.
|
|
||||||
# xoxo :D
|
|
||||||
|
|
||||||
set -xeuo pipefail
|
|
||||||
|
|
||||||
case $(uname -m) in
|
|
||||||
x86_64)
|
|
||||||
ARCH=amd64;;
|
|
||||||
aarch64)
|
|
||||||
ARCH=arm64;;
|
|
||||||
armhf)
|
|
||||||
ARCH=armhf;;
|
|
||||||
armv7)
|
|
||||||
ARCH=armel;;
|
|
||||||
armv7l)
|
|
||||||
ARCH=armel;;
|
|
||||||
*)
|
|
||||||
echo "Unsupported architecture: $(uname -m)"
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "Architecture: $ARCH"
|
|
||||||
wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -O ffmpeg.txz
|
|
||||||
mkdir /tmp/ffmpeg
|
|
||||||
tar xf ffmpeg.txz -C /tmp/ffmpeg
|
|
||||||
cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg
|
|
||||||
cp /tmp/ffmpeg/*/ffprobe /usr/local/bin/ffprobe
|
|
||||||
rm -rf /tmp/ffmpeg ffmpeg.txz
|
|
||||||
43
ffmpeg-fetch.sh
Normal file
43
ffmpeg-fetch.sh
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# THANK YOU TALULAH (https://github.com/nottalulah) for your help in figuring this out
|
||||||
|
# and also optimizing some code with this commit.
|
||||||
|
# xoxo :D
|
||||||
|
|
||||||
|
case $(uname -m) in
|
||||||
|
x86_64)
|
||||||
|
ARCH=amd64;;
|
||||||
|
aarch64)
|
||||||
|
ARCH=arm64;;
|
||||||
|
armhf)
|
||||||
|
ARCH=armhf;;
|
||||||
|
armv7)
|
||||||
|
ARCH=armel;;
|
||||||
|
armv7l)
|
||||||
|
ARCH=armel;;
|
||||||
|
*)
|
||||||
|
echo "Unsupported architecture: $(uname -m)"
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
|
||||||
|
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
|
||||||
3
heroku.yml
Normal file
3
heroku.yml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
build:
|
||||||
|
docker:
|
||||||
|
web: Dockerfile.heroku
|
||||||
65
package-lock.json
generated
65
package-lock.json
generated
@@ -3295,65 +3295,12 @@
|
|||||||
"safer-buffer": "~2.1.0"
|
"safer-buffer": "~2.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"asn1.js": {
|
|
||||||
"version": "5.4.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
|
|
||||||
"integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"bn.js": "^4.0.0",
|
|
||||||
"inherits": "^2.0.1",
|
|
||||||
"minimalistic-assert": "^1.0.0",
|
|
||||||
"safer-buffer": "^2.1.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"bn.js": {
|
|
||||||
"version": "4.11.9",
|
|
||||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
|
|
||||||
"integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"assert": {
|
|
||||||
"version": "1.5.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
|
|
||||||
"integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"object-assign": "^4.1.1",
|
|
||||||
"util": "0.10.3"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"inherits": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
|
|
||||||
"integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"util": {
|
|
||||||
"version": "0.10.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
|
|
||||||
"integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"inherits": "2.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"assert-plus": {
|
"assert-plus": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||||
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
|
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"assign-symbols": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"ast-types-flow": {
|
"ast-types-flow": {
|
||||||
"version": "0.0.7",
|
"version": "0.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
|
||||||
@@ -3367,9 +3314,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"async": {
|
"async": {
|
||||||
"version": "2.6.4",
|
"version": "2.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
|
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
|
||||||
"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
|
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"lodash": "^4.17.14"
|
"lodash": "^4.17.14"
|
||||||
@@ -10740,9 +10687,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rxjs-compat": {
|
"rxjs-compat": {
|
||||||
"version": "6.5.4",
|
"version": "6.6.7",
|
||||||
"resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.6.7.tgz",
|
||||||
"integrity": "sha512-rkn+lbOHUQOurdd74J/hjmDsG9nFx0z66fvnbs8M95nrtKvNqCKdk7iZqdY51CGmDemTQk+kUPy4s8HVOHtkfA=="
|
"integrity": "sha512-szN4fK+TqBPOFBcBcsR0g2cmTTUF/vaFEOZNuSdfU8/pGFnNmmn2u8SystYXG1QMrjOPBc6XTKHMVfENDf6hHw=="
|
||||||
},
|
},
|
||||||
"safe-buffer": {
|
"safe-buffer": {
|
||||||
"version": "5.1.2",
|
"version": "5.1.2",
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
"lint": "ng lint",
|
"lint": "ng lint",
|
||||||
"e2e": "ng e2e",
|
"e2e": "ng e2e",
|
||||||
"electron": "ng build --base-href ./ && electron .",
|
"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": {
|
"engines": {
|
||||||
"node": "12.3.1",
|
"node": "12.3.1",
|
||||||
@@ -47,7 +48,7 @@
|
|||||||
"ngx-avatars": "^1.3.1",
|
"ngx-avatars": "^1.3.1",
|
||||||
"ngx-file-drop": "^13.0.0",
|
"ngx-file-drop": "^13.0.0",
|
||||||
"rxjs": "^6.6.3",
|
"rxjs": "^6.6.3",
|
||||||
"rxjs-compat": "^6.0.0-rc.0",
|
"rxjs-compat": "^6.6.7",
|
||||||
"tslib": "^2.0.0",
|
"tslib": "^2.0.0",
|
||||||
"typescript": "~4.6.3",
|
"typescript": "~4.6.3",
|
||||||
"xliff-to-json": "^1.0.4",
|
"xliff-to-json": "^1.0.4",
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container *ngIf="postsService.config && allowSubscriptions && postsService.subscriptions && postsService.hasPermission('subscriptions')">
|
<ng-container *ngIf="postsService.config && allowSubscriptions && postsService.subscriptions && postsService.hasPermission('subscriptions')">
|
||||||
<mat-divider *ngIf="postsService.subscriptions.length > 0"></mat-divider>
|
<mat-divider *ngIf="postsService.subscriptions.length > 0"></mat-divider>
|
||||||
<a *ngFor="let subscription of postsService.subscriptions" mat-list-item (click)="postsService.sidepanel_mode === 'over' ? sidenav.close() : null" [routerLink]="['/subscription', { id: subscription.id }]"><ngx-avatar [style.margin-right]="'10px'" size="32" [name]="subscription.name"></ngx-avatar>{{subscription.name}}</a>
|
<a *ngFor="let subscription of postsService.subscriptions" mat-list-item (click)="postsService.sidepanel_mode === 'over' ? sidenav.close() : null" [routerLink]="['/subscription', { id: subscription.id }]"><ngx-avatars [style.margin-right]="'10px'" size="32" [name]="subscription.name"></ngx-avatars>{{subscription.name}}</a>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</mat-nav-list>
|
</mat-nav-list>
|
||||||
</mat-sidenav>
|
</mat-sidenav>
|
||||||
|
|||||||
@@ -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() {
|
startServer() {
|
||||||
this.started = true;
|
this.started = true;
|
||||||
this.server_started = true;
|
this.server_started = true;
|
||||||
|
|||||||
@@ -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';
|
import { PostsService } from 'app/posts.services';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@@ -6,7 +6,7 @@ import { PostsService } from 'app/posts.services';
|
|||||||
templateUrl: './twitch-chat.component.html',
|
templateUrl: './twitch-chat.component.html',
|
||||||
styleUrls: ['./twitch-chat.component.scss']
|
styleUrls: ['./twitch-chat.component.scss']
|
||||||
})
|
})
|
||||||
export class TwitchChatComponent implements OnInit, AfterViewInit {
|
export class TwitchChatComponent implements OnInit, OnDestroy {
|
||||||
|
|
||||||
full_chat = null;
|
full_chat = null;
|
||||||
visible_chat = null;
|
visible_chat = null;
|
||||||
@@ -33,7 +33,8 @@ export class TwitchChatComponent implements OnInit, AfterViewInit {
|
|||||||
this.getFullChat();
|
this.getFullChat();
|
||||||
}
|
}
|
||||||
|
|
||||||
ngAfterViewInit() {
|
ngOnDestroy(): void {
|
||||||
|
if (this.chat_check_interval_obj) { clearInterval(this.chat_check_interval_obj); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private isUserNearBottom(): boolean {
|
private isUserNearBottom(): boolean {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Component, Inject, OnInit } from '@angular/core';
|
import { Component, Inject, OnInit } from '@angular/core';
|
||||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||||
import { Schedule } from 'api-types';
|
import { Schedule, Task } from 'api-types';
|
||||||
import { PostsService } from 'app/posts.services';
|
import { PostsService } from 'app/posts.services';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@@ -18,7 +18,7 @@ export class UpdateTaskScheduleDialogComponent implements OnInit {
|
|||||||
date = null;
|
date = null;
|
||||||
today = new Date();
|
today = new Date();
|
||||||
|
|
||||||
constructor(@Inject(MAT_DIALOG_DATA) public data: any, private dialogRef: MatDialogRef<UpdateTaskScheduleDialogComponent>, private postsService: PostsService) {
|
constructor(@Inject(MAT_DIALOG_DATA) public data: {task: Task}, private dialogRef: MatDialogRef<UpdateTaskScheduleDialogComponent>, private postsService: PostsService) {
|
||||||
this.processTask(this.data.task);
|
this.processTask(this.data.task);
|
||||||
this.postsService.getTask(this.data.task.key).subscribe(res => {
|
this.postsService.getTask(this.data.task.key).subscribe(res => {
|
||||||
this.processTask(res['task']);
|
this.processTask(res['task']);
|
||||||
@@ -28,7 +28,7 @@ export class UpdateTaskScheduleDialogComponent implements OnInit {
|
|||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
}
|
}
|
||||||
|
|
||||||
processTask(task) {
|
processTask(task: Task): void {
|
||||||
if (!task['schedule']) {
|
if (!task['schedule']) {
|
||||||
this.enabled = false;
|
this.enabled = false;
|
||||||
return;
|
return;
|
||||||
@@ -39,7 +39,11 @@ export class UpdateTaskScheduleDialogComponent implements OnInit {
|
|||||||
this.recurring = schedule['type'] === Schedule.type.RECURRING;
|
this.recurring = schedule['type'] === Schedule.type.RECURRING;
|
||||||
|
|
||||||
if (this.recurring) {
|
if (this.recurring) {
|
||||||
this.time = `${schedule['data']['hour']}:${schedule['data']['minute']}`;
|
const hour = schedule['data']['hour'];
|
||||||
|
const minute = schedule['data']['minute'];
|
||||||
|
|
||||||
|
// add padding 0s if necessary to hours and minutes
|
||||||
|
this.time = (hour < 10 ? '0' : '') + hour + ':' + (minute < 10 ? '0' : '') + minute;
|
||||||
|
|
||||||
if (schedule['data']['dayOfWeek']) {
|
if (schedule['data']['dayOfWeek']) {
|
||||||
this.days_of_week = schedule['data']['dayOfWeek'];
|
this.days_of_week = schedule['data']['dayOfWeek'];
|
||||||
@@ -75,7 +79,6 @@ export class UpdateTaskScheduleDialogComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.date.setHours(hours, minutes);
|
this.date.setHours(hours, minutes);
|
||||||
console.log(this.date);
|
|
||||||
schedule['data'] = {timestamp: this.date.getTime()};
|
schedule['data'] = {timestamp: this.date.getTime()};
|
||||||
}
|
}
|
||||||
this.dialogRef.close(schedule);
|
this.dialogRef.close(schedule);
|
||||||
|
|||||||
@@ -445,7 +445,7 @@ export const isoLangs = {
|
|||||||
'name': 'Navajo, Navaho',
|
'name': 'Navajo, Navaho',
|
||||||
'nativeName': 'Diné bizaad, Dinékʼehǰí'
|
'nativeName': 'Diné bizaad, Dinékʼehǰí'
|
||||||
},
|
},
|
||||||
'nb': {
|
'nb-NO': {
|
||||||
'name': 'Norwegian Bokmål',
|
'name': 'Norwegian Bokmål',
|
||||||
'nativeName': 'Norsk bokmål',
|
'nativeName': 'Norsk bokmål',
|
||||||
'ngID': 'nb'
|
'ngID': 'nb'
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ export class SubscriptionComponent implements OnInit, OnDestroy {
|
|||||||
this.route.params.subscribe(params => {
|
this.route.params.subscribe(params => {
|
||||||
this.id = params['id'];
|
this.id = params['id'];
|
||||||
|
|
||||||
|
if (this.sub_interval) { clearInterval(this.sub_interval); }
|
||||||
|
|
||||||
this.postsService.service_initialized.subscribe(init => {
|
this.postsService.service_initialized.subscribe(init => {
|
||||||
if (init) {
|
if (init) {
|
||||||
this.getConfig();
|
this.getConfig();
|
||||||
|
|||||||
@@ -36,6 +36,9 @@
|
|||||||
<ng-container i18n="Subscription playlist not available text">Name not available. Playlist retrieval in progress.</ng-container>
|
<ng-container i18n="Subscription playlist not available text">Name not available. Playlist retrieval in progress.</ng-container>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
<button mat-icon-button (click)="editSubscription(sub)">
|
||||||
|
<mat-icon>edit</mat-icon>
|
||||||
|
</button>
|
||||||
<button mat-icon-button (click)="showSubInfo(sub)">
|
<button mat-icon-button (click)="showSubInfo(sub)">
|
||||||
<mat-icon>info</mat-icon>
|
<mat-icon>info</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1392,7 +1392,7 @@
|
|||||||
<note priority="1" from="description">Allow subscriptions setting</note>
|
<note priority="1" from="description">Allow subscriptions setting</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
||||||
<source>Base bath for subscriptions</source>
|
<source>Subscriptions base path</source>
|
||||||
<target>Camí base de subscripcions</target>
|
<target>Camí base de subscripcions</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
||||||
@@ -3009,8 +3009,8 @@
|
|||||||
<note priority="1" from="description">Skip ad button</note>
|
<note priority="1" from="description">Skip ad button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7220285196408439810" datatype="html">
|
<trans-unit id="7220285196408439810" datatype="html">
|
||||||
<source>Download for <x id="url" equiv-text="d, cropF"/> has been queued!</source>
|
<source>Download for <x id="url" equiv-text="url"/> has been queued!</source>
|
||||||
<target>La descàrrega de <x id="url" equiv-text="d, cropF"/> s'ha posat a la cua!</target>
|
<target>La descàrrega de <x id="url" equiv-text="url"/> s'ha posat a la cua!</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
||||||
<context context-type="linenumber">469</context>
|
<context context-type="linenumber">469</context>
|
||||||
@@ -3071,8 +3071,8 @@
|
|||||||
<note priority="1" from="description">Installation type</note>
|
<note priority="1" from="description">Installation type</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2560364143605631750" datatype="html">
|
<trans-unit id="2560364143605631750" datatype="html">
|
||||||
<source>Error for <x id="url" equiv-text="}); retu"/></source>
|
<source>Error for <x id="url" equiv-text="download['url']"/></source>
|
||||||
<target>Error a <x id="url" equiv-text="}); retu"/></target>
|
<target>Error a <x id="url" equiv-text="download['url']"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
<context context-type="linenumber">238</context>
|
<context context-type="linenumber">238</context>
|
||||||
@@ -3104,6 +3104,296 @@
|
|||||||
<context context-type="linenumber">130</context>
|
<context context-type="linenumber">130</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="586a5fd72602b5b14ec0c55f84814de47bb21e3a" datatype="html">
|
||||||
|
<source>Tasks</source>
|
||||||
|
<target>Tasques</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/app.component.html</context>
|
||||||
|
<context context-type="linenumber">47</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Navigation menu Tasks Page title</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="e4c3cd97461b220b9cea67cfe08c5399799cfeed" datatype="html">
|
||||||
|
<source>Last ran</source>
|
||||||
|
<target>Última vegada que es va executar</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">16</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Last ran</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="84a36cb75660b736773fe36ffa3d54f0f0fe363e" datatype="html">
|
||||||
|
<source>N/A</source>
|
||||||
|
<target>N/A</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">19</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">28</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">N/A</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="698f716f927f633b16cbe2308d90b2dba51f7556" datatype="html">
|
||||||
|
<source>Last confirmed</source>
|
||||||
|
<target>Últim confirmat</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">25</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Last confirmed</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4391397241847e675f6c38bbdec6b2883157fb1a" datatype="html">
|
||||||
|
<source>Clear duplicate files from DB:</source>
|
||||||
|
<target>Esborrar els fitxers duplicats a la BD:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">60</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Clear duplicate files from DB</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5ff9ae1f4c26bf2ddf6e9d5e4136916c5ce6a941" datatype="html">
|
||||||
|
<source>Clear missing files from DB:</source>
|
||||||
|
<target>Esborrar els fitxers que falten a la BD:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">57</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Clear missing files from DB</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9562dd1e902acc4cc6a6e09cba66a2775daf7794" datatype="html">
|
||||||
|
<source>Update binary to:</source>
|
||||||
|
<target>Actualitzar el binari a:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">63</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update binary to</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9b3d305551358858e1892169a94527e0cc4dbf5b" datatype="html">
|
||||||
|
<source>Run</source>
|
||||||
|
<target>Executar</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">69</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Run</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4a4f46a2dcec36bd5c8c371ceee55c2226dec27f" datatype="html">
|
||||||
|
<source>Schedule</source>
|
||||||
|
<target>Planificació</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">72</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Schedule</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="40bd7093f5fbd3fbeff9a50baaf5d4c8416add1e" datatype="html">
|
||||||
|
<source>Restore DB from backup</source>
|
||||||
|
<target>Restaurar la BD des de la còpia de seguretat</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">89</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">1</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Restore DB from backup button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="f8a2361f3bd8fb05bf92080e2755bddd56ab64d7" datatype="html">
|
||||||
|
<source>Reset tasks</source>
|
||||||
|
<target>Restablir tasques</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">90</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Reset tasks button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5615896113581458384" datatype="html">
|
||||||
|
<source>Successfully ran task!</source>
|
||||||
|
<target>S'ha realitzat correctament la tasca!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">78</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="2106110452479146311" datatype="html">
|
||||||
|
<source>Failed to run task!</source>
|
||||||
|
<target>No s'ha pogut executar la tasca!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">79</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">81</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9121124215111024650" datatype="html">
|
||||||
|
<source>Failed to confirm task!</source>
|
||||||
|
<target>No s'ha pogut confirmar la tasca!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">90</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">92</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5588424857086384816" datatype="html">
|
||||||
|
<source>Reset tasks</source>
|
||||||
|
<target>Restablir tasques</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">132</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4334913030311371594" datatype="html">
|
||||||
|
<source>Would you like to reset your tasks? All your schedules will be removed as well.</source>
|
||||||
|
<target>Vols restablir les teves tasques? També s'eliminaran totes els teves planificacions.</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">133</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7808756054397155068" datatype="html">
|
||||||
|
<source>Reset</source>
|
||||||
|
<target>Restablir</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">134</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7e121a443a8e9d92218f987001b650c59504d815" datatype="html">
|
||||||
|
<source>Scheduled for</source>
|
||||||
|
<target>Planificat per a</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">38</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Scheduled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="3b7d6ff5d14ab177ce3e2d217b1927fb2e4aefd1" datatype="html">
|
||||||
|
<source>Not scheduled</source>
|
||||||
|
<target>No planificat</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">42</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Not scheduled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="d5cec7468241d72cafd86ad1af6d55b09a6e3ae5" datatype="html">
|
||||||
|
<source>Restore</source>
|
||||||
|
<target>Restaurar</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">25</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Restore button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="f50a33d3c339f8f4a465141f8caa5d2d8c005251" datatype="html">
|
||||||
|
<source>Enabled</source>
|
||||||
|
<target>Habilitat</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">7</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Enabled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="67aed6c588eb854f2f30ef642e85147da0027a61" datatype="html">
|
||||||
|
<source>Recurring</source>
|
||||||
|
<target>Recurrent</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">10</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Recurring</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb" datatype="html">
|
||||||
|
<source>Update</source>
|
||||||
|
<target>Actualitzar</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">52</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="fd374bee82dab66055b933496860f82b7b780159" datatype="html">
|
||||||
|
<source>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: ,,</source>
|
||||||
|
<target>Arguments personalitzats globals per a les baixades a la pàgina d'inici. (Definiu els arguments per a les subscripcions per a cadascuna de les subscripcions per separat!) Els arguments es delimiten mitjançant dues comes, així: ,,</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
||||||
|
<context context-type="linenumber">128</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Custom args setting input hint</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="d97425ce76bf3df50bcb643b5f409844770458f6" datatype="html">
|
||||||
|
<source>Busy</source>
|
||||||
|
<target>Ocupat</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">36</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Busy</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
|
||||||
|
<source>Status</source>
|
||||||
|
<target>Estat</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">34</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Status</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="1709994363138824316" datatype="html">
|
||||||
|
<source>Failed to reset tasks!</source>
|
||||||
|
<target>No s'han pogut restablir les tasques!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">144</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">147</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5e96c9d4528bf259da3944daac3171d7462b065a" datatype="html">
|
||||||
|
<source>No tasks available!</source>
|
||||||
|
<target>No hi ha tasques disponibles!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">94</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">No tasks label</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="8612475568724527886" datatype="html">
|
||||||
|
<source>Tasks successfully reset!</source>
|
||||||
|
<target>Les tasques s'han restablert correctament!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">142</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4707127982271899773" datatype="html">
|
||||||
|
<source>Successfully confirmed task!</source>
|
||||||
|
<target>S'ha confirmat correctament la tasca!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">89</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="998793c78895d53576f462054f13d6e515e923d9" datatype="html">
|
||||||
|
<source>Update task schedule</source>
|
||||||
|
<target>Actualitzar la planificació de tasques</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">1</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update task schedule</note>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||||
<file source-language="en-US" datatype="plaintext" original="ng2.template" target-language="es">
|
<file source-language="en-US" datatype="plaintext" original="ng2.template" target-language="es">
|
||||||
<body>
|
<body>
|
||||||
@@ -1630,6 +1630,198 @@
|
|||||||
<context context-type="linenumber">469</context>
|
<context context-type="linenumber">469</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="2f933b826a570836cab04f683970a2d22068458c" datatype="html">
|
||||||
|
<source>Date</source>
|
||||||
|
<target>Fecha</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">7</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Date</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e" datatype="html">
|
||||||
|
<source>Title</source>
|
||||||
|
<target>Título</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">13</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">6</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Title</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="47bbc861efa59ba4135e6aa8f63213420e3f3b91" datatype="html">
|
||||||
|
<source>Subscription</source>
|
||||||
|
<target>Suscripción</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">23</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Subscription</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="15793f4cbc261bedbc60f7105533dde536a3f42b" datatype="html">
|
||||||
|
<source>Progress</source>
|
||||||
|
<target>Progreso</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">42</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Progress</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="586a5fd72602b5b14ec0c55f84814de47bb21e3a" datatype="html">
|
||||||
|
<source>Tasks</source>
|
||||||
|
<target>Tareas</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/app.component.html</context>
|
||||||
|
<context context-type="linenumber">47</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Navigation menu Tasks Page title</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="73a7ade062c611e4bc92f3a4c672bee29b8aae9d" datatype="html">
|
||||||
|
<source>Watch content</source>
|
||||||
|
<target>Ver archivo</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">64</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Watch content</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="2827589726081052618" datatype="html">
|
||||||
|
<source>Creating download</source>
|
||||||
|
<target>Creando descarga</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
|
<context context-type="linenumber">58</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9b2084f9aea764292cf0978cb083907d8be51bf7" datatype="html">
|
||||||
|
<source>Resume all downloads</source>
|
||||||
|
<target>Reanudar todas las descargas</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">84</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Resume all downloads</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="72c341bca7ebacc66e8a13f1a527d500619e89ff" datatype="html">
|
||||||
|
<source>Stage</source>
|
||||||
|
<target>Etapa</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">36</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Stage</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c" datatype="html">
|
||||||
|
<source>Actions</source>
|
||||||
|
<target>Acciones</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">55</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">49</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Actions</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="b2838c6165a9672a17db188f4dd9676574353dd8" datatype="html">
|
||||||
|
<source>Pause</source>
|
||||||
|
<target>Pausa</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">59</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Pause</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46" datatype="html">
|
||||||
|
<source>Clear</source>
|
||||||
|
<target>Quitar</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">68</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Clear</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4cd979821c89535df23df1c8ac8f260673610d90" datatype="html">
|
||||||
|
<source>Resume</source>
|
||||||
|
<target>Resumir</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">60</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Resume</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="b6d79c6ff771d7b86ce572306867a1705200f957" datatype="html">
|
||||||
|
<source>Restart</source>
|
||||||
|
<target>Reanudar</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">66</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Restart</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="b36b7458192b833592e13029fa8a0b3555e0d9bd" datatype="html">
|
||||||
|
<source>Pause all downloads</source>
|
||||||
|
<target>Pausar todas las descargas</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">83</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Pause all downloads</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7724483709075923163" datatype="html">
|
||||||
|
<source>Downloading file</source>
|
||||||
|
<target>Descargando archivo</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
|
<context context-type="linenumber">60</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="54cb4c7c3a0da911ebda5a07666b448868020308" datatype="html">
|
||||||
|
<source>Show error</source>
|
||||||
|
<target>Mostrar error</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">65</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Show error</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="601a28988581b5398ca6471027487e098d236e0e" datatype="html">
|
||||||
|
<source>Clear finished downloads</source>
|
||||||
|
<target>Quitar descargas finalizadas</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
|
<context context-type="linenumber">85</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Clear finished downloads</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4027175717527633324" datatype="html">
|
||||||
|
<source>Getting info</source>
|
||||||
|
<target>Cogiendo info</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
|
<context context-type="linenumber">59</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="8384225360105280028" datatype="html">
|
||||||
|
<source>Complete</source>
|
||||||
|
<target>Completo</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
|
<context context-type="linenumber">61</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7180002287537831534" datatype="html">
|
||||||
|
<source>Clear finished downloads</source>
|
||||||
|
<target>Borrar descargas terminadas</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
|
<context context-type="linenumber">129</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||||
<file source-language="en-US" datatype="plaintext" original="ng2.template" target-language="mk">
|
<file source-language="en-US" datatype="plaintext" original="ng2.template" target-language="mk">
|
||||||
<body>
|
<body>
|
||||||
@@ -91,8 +91,8 @@
|
|||||||
<note priority="1" from="description">Settings menu label</note>
|
<note priority="1" from="description">Settings menu label</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7220285196408439810" datatype="html">
|
<trans-unit id="7220285196408439810" datatype="html">
|
||||||
<source>Download for <x id="url" equiv-text="d, cropF"/> has been queued!</source>
|
<source>Download for <x id="url" equiv-text="url"/> has been queued!</source>
|
||||||
<target>Превземањето за <x id="url" equiv-text="d, cropF"/> е ставено во редицата за чекање!</target>
|
<target>Превземањето за <x id="url" equiv-text="url"/> е ставено во редицата за чекање!</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
||||||
<context context-type="linenumber">469</context>
|
<context context-type="linenumber">469</context>
|
||||||
@@ -2496,8 +2496,8 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2560364143605631750" datatype="html">
|
<trans-unit id="2560364143605631750" datatype="html">
|
||||||
<source>Error for <x id="url" equiv-text="}); retu"/></source>
|
<source>Error for <x id="url" equiv-text="download['url']"/></source>
|
||||||
<target>Грешка за <x id="url" equiv-text="}); retu"/></target>
|
<target>Грешка за <x id="url" equiv-text="download['url']"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
<context context-type="linenumber">238</context>
|
<context context-type="linenumber">238</context>
|
||||||
@@ -3035,6 +3035,296 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<note priority="1" from="description">Video duration label</note>
|
<note priority="1" from="description">Video duration label</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="e4c3cd97461b220b9cea67cfe08c5399799cfeed" datatype="html">
|
||||||
|
<source>Last ran</source>
|
||||||
|
<target>Последно извршување</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">16</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Last ran</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="84a36cb75660b736773fe36ffa3d54f0f0fe363e" datatype="html">
|
||||||
|
<source>N/A</source>
|
||||||
|
<target>N/A</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">19</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">28</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">N/A</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="698f716f927f633b16cbe2308d90b2dba51f7556" datatype="html">
|
||||||
|
<source>Last confirmed</source>
|
||||||
|
<target>Последно потврдено</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">25</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Last confirmed</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
|
||||||
|
<source>Status</source>
|
||||||
|
<target>Статус</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">34</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Status</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="d97425ce76bf3df50bcb643b5f409844770458f6" datatype="html">
|
||||||
|
<source>Busy</source>
|
||||||
|
<target>Зафанато</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">36</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Busy</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7e121a443a8e9d92218f987001b650c59504d815" datatype="html">
|
||||||
|
<source>Scheduled for</source>
|
||||||
|
<target>Закажано за</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">38</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Scheduled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="3b7d6ff5d14ab177ce3e2d217b1927fb2e4aefd1" datatype="html">
|
||||||
|
<source>Not scheduled</source>
|
||||||
|
<target>Не закажано</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">42</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Not scheduled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5ff9ae1f4c26bf2ddf6e9d5e4136916c5ce6a941" datatype="html">
|
||||||
|
<source>Clear missing files from DB:</source>
|
||||||
|
<target>Исчисти ги непостоечките фајлови од базата со податоци:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">57</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Clear missing files from DB</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9562dd1e902acc4cc6a6e09cba66a2775daf7794" datatype="html">
|
||||||
|
<source>Update binary to:</source>
|
||||||
|
<target>Ажурирај ја програмата:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">63</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update binary to</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4a4f46a2dcec36bd5c8c371ceee55c2226dec27f" datatype="html">
|
||||||
|
<source>Schedule</source>
|
||||||
|
<target>Закажи</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">72</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Schedule</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9b3d305551358858e1892169a94527e0cc4dbf5b" datatype="html">
|
||||||
|
<source>Run</source>
|
||||||
|
<target>Стартувај</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">69</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Run</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="40bd7093f5fbd3fbeff9a50baaf5d4c8416add1e" datatype="html">
|
||||||
|
<source>Restore DB from backup</source>
|
||||||
|
<target>Враќање на базата со податоци од резервна копија</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">89</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">1</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Restore DB from backup button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="f8a2361f3bd8fb05bf92080e2755bddd56ab64d7" datatype="html">
|
||||||
|
<source>Reset tasks</source>
|
||||||
|
<target>Ресетирајте ги задачите</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">90</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Reset tasks button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5e96c9d4528bf259da3944daac3171d7462b065a" datatype="html">
|
||||||
|
<source>No tasks available!</source>
|
||||||
|
<target>Нема достапни задачи!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">94</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">No tasks label</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5615896113581458384" datatype="html">
|
||||||
|
<source>Successfully ran task!</source>
|
||||||
|
<target>Задачата е успешно извршена!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">78</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4707127982271899773" datatype="html">
|
||||||
|
<source>Successfully confirmed task!</source>
|
||||||
|
<target>Задачата е успешно потврдена!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">89</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4334913030311371594" datatype="html">
|
||||||
|
<source>Would you like to reset your tasks? All your schedules will be removed as well.</source>
|
||||||
|
<target>Дали сакате да ги ресетирате вашите задачи? Сите ваши распореди исто така ќе бидат отстранети.</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">133</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7808756054397155068" datatype="html">
|
||||||
|
<source>Reset</source>
|
||||||
|
<target>Ресетирај</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">134</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="8612475568724527886" datatype="html">
|
||||||
|
<source>Tasks successfully reset!</source>
|
||||||
|
<target>Задачите успешно се ресетираа!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">142</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="1709994363138824316" datatype="html">
|
||||||
|
<source>Failed to reset tasks!</source>
|
||||||
|
<target>Не успеа да се ресетираат задачите!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">144</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">147</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="d5cec7468241d72cafd86ad1af6d55b09a6e3ae5" datatype="html">
|
||||||
|
<source>Restore</source>
|
||||||
|
<target>Врати</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">25</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Restore button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="998793c78895d53576f462054f13d6e515e923d9" datatype="html">
|
||||||
|
<source>Update task schedule</source>
|
||||||
|
<target>Ажурирајте го распоредот на задачи</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">1</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update task schedule</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="f50a33d3c339f8f4a465141f8caa5d2d8c005251" datatype="html">
|
||||||
|
<source>Enabled</source>
|
||||||
|
<target>Овозможено</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">7</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Enabled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="67aed6c588eb854f2f30ef642e85147da0027a61" datatype="html">
|
||||||
|
<source>Recurring</source>
|
||||||
|
<target>Повторливи</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">10</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Recurring</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="fd374bee82dab66055b933496860f82b7b780159" datatype="html">
|
||||||
|
<source>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: ,,</source>
|
||||||
|
<target>Глобални сопствени аргументи за преземања на почетната страница. (Поставете аргументи за претплати за секоја претплата посебно!) Аргументите се разграничуваат со користење на две запирки, на пример: ,,</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
||||||
|
<context context-type="linenumber">128</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Custom args setting input hint</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4391397241847e675f6c38bbdec6b2883157fb1a" datatype="html">
|
||||||
|
<source>Clear duplicate files from DB:</source>
|
||||||
|
<target>Исчисти ги дупликат фајловите од базата со податоци:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">60</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Clear duplicate files from DB</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="586a5fd72602b5b14ec0c55f84814de47bb21e3a" datatype="html">
|
||||||
|
<source>Tasks</source>
|
||||||
|
<target>Задачи</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/app.component.html</context>
|
||||||
|
<context context-type="linenumber">47</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Navigation menu Tasks Page title</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5588424857086384816" datatype="html">
|
||||||
|
<source>Reset tasks</source>
|
||||||
|
<target>Ресетирајте ги задачите</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">132</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="2106110452479146311" datatype="html">
|
||||||
|
<source>Failed to run task!</source>
|
||||||
|
<target>Не успеа да се изврши задачата!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">79</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">81</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9121124215111024650" datatype="html">
|
||||||
|
<source>Failed to confirm task!</source>
|
||||||
|
<target>Задачата не успеа да се потврди!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">90</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">92</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb" datatype="html">
|
||||||
|
<source>Update</source>
|
||||||
|
<target>Ажурирање</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">52</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update button</note>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|||||||
@@ -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"
|
|
||||||
}
|
|
||||||
@@ -1392,7 +1392,7 @@
|
|||||||
<note priority="1" from="description">Allow subscriptions setting</note>
|
<note priority="1" from="description">Allow subscriptions setting</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
||||||
<source>Base bath for subscriptions</source>
|
<source>Subscriptions base path</source>
|
||||||
<target>Abonnementenbasispad</target>
|
<target>Abonnementenbasispad</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
||||||
@@ -1545,8 +1545,8 @@
|
|||||||
<note priority="1" from="description">Custom args input placeholder</note>
|
<note priority="1" from="description">Custom args input placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6b995e7130b4d667eaab6c5f61b362ace486d26d" datatype="html">
|
<trans-unit id="6b995e7130b4d667eaab6c5f61b362ace486d26d" datatype="html">
|
||||||
<source>Global custom args for downloads on the home page. Args are delimited using two commas like so: ,,</source>
|
<source>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: ,,</source>
|
||||||
<target>Algemene aanvullende opties voor downloads op de overzichtspagina. Scheidt deze met komma's: ,,</target>
|
<target>Algemene aanvullende opties voor downloads op de overzichtspagina. (Stel de opties per abonnement in!) Scheidt deze met komma's: ,,</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
||||||
<context context-type="linenumber">134</context>
|
<context context-type="linenumber">134</context>
|
||||||
@@ -2854,8 +2854,8 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2560364143605631750" datatype="html">
|
<trans-unit id="2560364143605631750" datatype="html">
|
||||||
<source>Error for <x id="url" equiv-text="}); retu"/></source>
|
<source>Error for <x id="url" equiv-text="download['url']"/></source>
|
||||||
<target>Foutmelding bij <x id="url" equiv-text="}); retu"/></target>
|
<target>Foutmelding bij <x id="url" equiv-text="download['url']"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
<context context-type="linenumber">238</context>
|
<context context-type="linenumber">238</context>
|
||||||
@@ -3097,13 +3097,303 @@
|
|||||||
<note priority="1" from="description">Autoplay checkbox</note>
|
<note priority="1" from="description">Autoplay checkbox</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7220285196408439810" datatype="html">
|
<trans-unit id="7220285196408439810" datatype="html">
|
||||||
<source>Download for <x id="url" equiv-text="d, cropF"/> has been queued!</source>
|
<source>Download for <x id="url" equiv-text="url"/> has been queued!</source>
|
||||||
<target><x id="url" equiv-text="d, cropF"/> staat in de wachtrij!</target>
|
<target><x id="url" equiv-text="url"/> staat in de wachtrij!</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
||||||
<context context-type="linenumber">469</context>
|
<context context-type="linenumber">469</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="586a5fd72602b5b14ec0c55f84814de47bb21e3a" datatype="html">
|
||||||
|
<source>Tasks</source>
|
||||||
|
<target>Taken</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/app.component.html</context>
|
||||||
|
<context context-type="linenumber">47</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Navigation menu Tasks Page title</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="84a36cb75660b736773fe36ffa3d54f0f0fe363e" datatype="html">
|
||||||
|
<source>N/A</source>
|
||||||
|
<target>n/b</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">19</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">28</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">N/A</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="698f716f927f633b16cbe2308d90b2dba51f7556" datatype="html">
|
||||||
|
<source>Last confirmed</source>
|
||||||
|
<target>Laatst bevestigd:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">25</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Last confirmed</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
|
||||||
|
<source>Status</source>
|
||||||
|
<target>Status</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">34</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Status</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="d97425ce76bf3df50bcb643b5f409844770458f6" datatype="html">
|
||||||
|
<source>Busy</source>
|
||||||
|
<target>Bezig</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">36</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Busy</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="3b7d6ff5d14ab177ce3e2d217b1927fb2e4aefd1" datatype="html">
|
||||||
|
<source>Not scheduled</source>
|
||||||
|
<target>Niet ingepland</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">42</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Not scheduled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5ff9ae1f4c26bf2ddf6e9d5e4136916c5ce6a941" datatype="html">
|
||||||
|
<source>Clear missing files from DB:</source>
|
||||||
|
<target>Ontbrekende bestanden wissen uit DB:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">57</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Clear missing files from DB</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4391397241847e675f6c38bbdec6b2883157fb1a" datatype="html">
|
||||||
|
<source>Clear duplicate files from DB:</source>
|
||||||
|
<target>Gedupliceerde bestanden wissen uit DB:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">60</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Clear duplicate files from DB</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9562dd1e902acc4cc6a6e09cba66a2775daf7794" datatype="html">
|
||||||
|
<source>Update binary to:</source>
|
||||||
|
<target>Uitvoerbaar bestand bijwerken naar</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">63</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update binary to</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9b3d305551358858e1892169a94527e0cc4dbf5b" datatype="html">
|
||||||
|
<source>Run</source>
|
||||||
|
<target>Uitvoeren</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">69</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Run</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4a4f46a2dcec36bd5c8c371ceee55c2226dec27f" datatype="html">
|
||||||
|
<source>Schedule</source>
|
||||||
|
<target>Inplannen</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">72</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Schedule</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="2106110452479146311" datatype="html">
|
||||||
|
<source>Failed to run task!</source>
|
||||||
|
<target>De taak kan niet worden uitgevoerd!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">79</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">81</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4707127982271899773" datatype="html">
|
||||||
|
<source>Successfully confirmed task!</source>
|
||||||
|
<target>De taak is bevestigd!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">89</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9121124215111024650" datatype="html">
|
||||||
|
<source>Failed to confirm task!</source>
|
||||||
|
<target>De taak kan niet worden bevestigd!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">90</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">92</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4334913030311371594" datatype="html">
|
||||||
|
<source>Would you like to reset your tasks? All your schedules will be removed as well.</source>
|
||||||
|
<target>Weet je zeker dat je alle taken wilt herstellen? Alle schema's worden hierdoor gewist.</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">133</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7808756054397155068" datatype="html">
|
||||||
|
<source>Reset</source>
|
||||||
|
<target>Herstellen</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">134</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="1709994363138824316" datatype="html">
|
||||||
|
<source>Failed to reset tasks!</source>
|
||||||
|
<target>De taken kunnen niet worden hersteld!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">144</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">147</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="d5cec7468241d72cafd86ad1af6d55b09a6e3ae5" datatype="html">
|
||||||
|
<source>Restore</source>
|
||||||
|
<target>Herstellen</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">25</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Restore button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="998793c78895d53576f462054f13d6e515e923d9" datatype="html">
|
||||||
|
<source>Update task schedule</source>
|
||||||
|
<target>Taakschema bijwerken</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">1</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update task schedule</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="f50a33d3c339f8f4a465141f8caa5d2d8c005251" datatype="html">
|
||||||
|
<source>Enabled</source>
|
||||||
|
<target>Ingeschakeld</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">7</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Enabled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="67aed6c588eb854f2f30ef642e85147da0027a61" datatype="html">
|
||||||
|
<source>Recurring</source>
|
||||||
|
<target>Herhalen</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">10</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Recurring</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb" datatype="html">
|
||||||
|
<source>Update</source>
|
||||||
|
<target>Bijwerken</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">52</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="e4c3cd97461b220b9cea67cfe08c5399799cfeed" datatype="html">
|
||||||
|
<source>Last ran</source>
|
||||||
|
<target>Laatst uitgevoerd:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">16</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Last ran</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7e121a443a8e9d92218f987001b650c59504d815" datatype="html">
|
||||||
|
<source>Scheduled for</source>
|
||||||
|
<target>Ingepland om</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">38</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Scheduled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="40bd7093f5fbd3fbeff9a50baaf5d4c8416add1e" datatype="html">
|
||||||
|
<source>Restore DB from backup</source>
|
||||||
|
<target>DB herstellen uit back-up</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">89</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">1</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Restore DB from backup button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5588424857086384816" datatype="html">
|
||||||
|
<source>Reset tasks</source>
|
||||||
|
<target>Taken herstellen</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">132</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5615896113581458384" datatype="html">
|
||||||
|
<source>Successfully ran task!</source>
|
||||||
|
<target>De taak is uitgevoerd!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">78</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="f8a2361f3bd8fb05bf92080e2755bddd56ab64d7" datatype="html">
|
||||||
|
<source>Reset tasks</source>
|
||||||
|
<target>Taken herstellen</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">90</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Reset tasks button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5e96c9d4528bf259da3944daac3171d7462b065a" datatype="html">
|
||||||
|
<source>No tasks available!</source>
|
||||||
|
<target>Er zijn geen taken beschikbaar!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">94</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">No tasks label</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="8612475568724527886" datatype="html">
|
||||||
|
<source>Tasks successfully reset!</source>
|
||||||
|
<target>De taken zijn hersteld!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">142</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="fd374bee82dab66055b933496860f82b7b780159" datatype="html">
|
||||||
|
<source>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: ,,</source>
|
||||||
|
<target>Globale aanvullende opties voor downloades. (Stel ze per abonnement in!) Scheid de opties met twee komma's, dus ,,</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
||||||
|
<context context-type="linenumber">128</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Custom args setting input hint</note>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="cff1428d10d59d14e45edec3c735a27b5482db59" datatype="html">
|
<trans-unit id="cff1428d10d59d14e45edec3c735a27b5482db59" datatype="html">
|
||||||
<source>Name</source>
|
<source>Name</source>
|
||||||
<target>Имя</target>
|
<target>Название</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/create-playlist/create-playlist.component.html</context>
|
<context context-type="sourcefile">app/create-playlist/create-playlist.component.html</context>
|
||||||
<context context-type="linenumber">5</context>
|
<context context-type="linenumber">5</context>
|
||||||
@@ -124,7 +124,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="b2623aee44b70c9a4ba1fce16c8a593b0a4c7974" datatype="html">
|
<trans-unit id="b2623aee44b70c9a4ba1fce16c8a593b0a4c7974" datatype="html">
|
||||||
<source>Modify</source>
|
<source>Modify</source>
|
||||||
<target>Модифицировать</target>
|
<target>Изменить</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html</context>
|
||||||
<context context-type="linenumber">85</context>
|
<context context-type="linenumber">85</context>
|
||||||
@@ -289,7 +289,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="19d1ae64d94d28a29b2c57ae8671aace906b5401" datatype="html">
|
<trans-unit id="19d1ae64d94d28a29b2c57ae8671aace906b5401" datatype="html">
|
||||||
<source>Path is relative to the config download path. Don't include extension.</source>
|
<source>Path is relative to the config download path. Don't include extension.</source>
|
||||||
<target>Путь является относительным к пути загрузки конфигурации. Не включайте расширение.</target>
|
<target state="needs-translation">Путь является относительным к пути загрузки конфигурации. Не включайте расширение.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||||
<context context-type="linenumber">131</context>
|
<context context-type="linenumber">131</context>
|
||||||
@@ -336,9 +336,7 @@
|
|||||||
<note priority="1" from="description">YT Password placeholder</note>
|
<note priority="1" from="description">YT Password placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4a0dada6e841a425de3e5006e6a04df26c644fa5" datatype="html">
|
<trans-unit id="4a0dada6e841a425de3e5006e6a04df26c644fa5" datatype="html">
|
||||||
<source>
|
<source>Audio</source>
|
||||||
Audio
|
|
||||||
</source>
|
|
||||||
<target/>
|
<target/>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||||
@@ -347,9 +345,7 @@
|
|||||||
<note priority="1" from="description">Audio files title</note>
|
<note priority="1" from="description">Audio files title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="9779715ac05308973d8f1c8658b29b986e92450f" datatype="html">
|
<trans-unit id="9779715ac05308973d8f1c8658b29b986e92450f" datatype="html">
|
||||||
<source>
|
<source>Your audio files are here</source>
|
||||||
Your audio files are here
|
|
||||||
</source>
|
|
||||||
<target/>
|
<target/>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||||
@@ -375,9 +371,7 @@
|
|||||||
<note priority="1" from="description">Playlists title</note>
|
<note priority="1" from="description">Playlists title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="78bd81adb4609b68cfa4c589222bdc233ba1faaa" datatype="html">
|
<trans-unit id="78bd81adb4609b68cfa4c589222bdc233ba1faaa" datatype="html">
|
||||||
<source>
|
<source>No playlists available. Create one from your downloading audio files by clicking the blue plus button.</source>
|
||||||
No playlists available. Create one from your downloading audio files by clicking the blue plus button.
|
|
||||||
</source>
|
|
||||||
<target/>
|
<target/>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||||
@@ -386,9 +380,7 @@
|
|||||||
<note priority="1" from="description">No video playlists available text</note>
|
<note priority="1" from="description">No video playlists available text</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33" datatype="html">
|
<trans-unit id="9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33" datatype="html">
|
||||||
<source>
|
<source>Video</source>
|
||||||
Video
|
|
||||||
</source>
|
|
||||||
<target/>
|
<target/>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||||
@@ -397,9 +389,7 @@
|
|||||||
<note priority="1" from="description">Video files title</note>
|
<note priority="1" from="description">Video files title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="960582a8b9d7942716866ecfb7718309728f2916" datatype="html">
|
<trans-unit id="960582a8b9d7942716866ecfb7718309728f2916" datatype="html">
|
||||||
<source>
|
<source>Your video files are here</source>
|
||||||
Your video files are here
|
|
||||||
</source>
|
|
||||||
<target/>
|
<target/>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||||
@@ -408,9 +398,7 @@
|
|||||||
<note priority="1" from="description">Video files description</note>
|
<note priority="1" from="description">Video files description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="0f59c46ca29e9725898093c9ea6b586730d0624e" datatype="html">
|
<trans-unit id="0f59c46ca29e9725898093c9ea6b586730d0624e" datatype="html">
|
||||||
<source>
|
<source>No playlists available. Create one from your downloading video files by clicking the blue plus button.</source>
|
||||||
No playlists available. Create one from your downloading video files by clicking the blue plus button.
|
|
||||||
</source>
|
|
||||||
<target/>
|
<target/>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||||
@@ -433,7 +421,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="c52db455cca9109ee47e1a612c3f4117c09eb71b" datatype="html">
|
<trans-unit id="c52db455cca9109ee47e1a612c3f4117c09eb71b" datatype="html">
|
||||||
<source>URL:</source>
|
<source>URL:</source>
|
||||||
<target>URL-адрес:</target>
|
<target>Ссылка:</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/video-info-dialog/video-info-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/video-info-dialog/video-info-dialog.component.html</context>
|
||||||
<context context-type="linenumber">9</context>
|
<context context-type="linenumber">9</context>
|
||||||
@@ -523,7 +511,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1" datatype="html">
|
<trans-unit id="4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1" datatype="html">
|
||||||
<source>Modify playlist</source>
|
<source>Modify playlist</source>
|
||||||
<target>Изменить список воспроизведения</target>
|
<target>Изменить плейлист</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/modify-playlist/modify-playlist.component.html</context>
|
<context context-type="sourcefile">app/dialogs/modify-playlist/modify-playlist.component.html</context>
|
||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
@@ -602,7 +590,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="ebadf946ae90f13ecd0c70f09edbc0f983af8a0f" datatype="html">
|
<trans-unit id="ebadf946ae90f13ecd0c70f09edbc0f983af8a0f" datatype="html">
|
||||||
<source>Upload new cookies</source>
|
<source>Upload new cookies</source>
|
||||||
<target>Загрузка новых файлов cookie</target>
|
<target>Загрузка новых cookie</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html</context>
|
||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
@@ -642,7 +630,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="801b98c6f02fe3b32f6afa3ee854c99ed83474e6" datatype="html">
|
<trans-unit id="801b98c6f02fe3b32f6afa3ee854c99ed83474e6" datatype="html">
|
||||||
<source>URL</source>
|
<source>URL</source>
|
||||||
<target>URL-адрес</target>
|
<target>Ссылка</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
||||||
<context context-type="linenumber">18</context>
|
<context context-type="linenumber">18</context>
|
||||||
@@ -744,7 +732,7 @@
|
|||||||
<note priority="1" from="description">Allow subscriptions setting</note>
|
<note priority="1" from="description">Allow subscriptions setting</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
||||||
<source>Base bath for subscriptions</source>
|
<source>Subscriptions base path</source>
|
||||||
<target>Базовый путь для подписок</target>
|
<target>Базовый путь для подписок</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
||||||
@@ -1283,7 +1271,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="199c17e5d6a419313af3c325f06dcbb9645ca618" datatype="html">
|
<trans-unit id="199c17e5d6a419313af3c325f06dcbb9645ca618" datatype="html">
|
||||||
<source>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.</source>
|
<source>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.</source>
|
||||||
<target>это загрузчик YouTube с открытым исходным кодом, созданный в соответствии со спецификациями Material Design от Google. Вы можете легко загружать любимые видеоролики в виде видео- или аудиофайлов и даже подписываться на любимые каналы и плейлисты, чтобы быть в курсе их новых видео.</target>
|
<target>это загрузчик YouTube с открытым исходным кодом, созданный в соответствии со спецификациями Material Design от Google. Вы можете легко загружать любимые видеоролики в виде видео- или аудиофайлов и даже подписываться на любимые каналы и плейлисты, чтобы быть в курсе новых видео.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/about-dialog/about-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/about-dialog/about-dialog.component.html</context>
|
||||||
<context context-type="linenumber">12</context>
|
<context context-type="linenumber">12</context>
|
||||||
@@ -1346,7 +1334,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="e1f398f38ff1534303d4bb80bd6cece245f24016" datatype="html">
|
<trans-unit id="e1f398f38ff1534303d4bb80bd6cece245f24016" datatype="html">
|
||||||
<source>to create an issue!</source>
|
<source>to create an issue!</source>
|
||||||
<target>чтобы создать проблему!</target>
|
<target>чтобы описать проблему!</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/about-dialog/about-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/about-dialog/about-dialog.component.html</context>
|
||||||
<context context-type="linenumber">25</context>
|
<context context-type="linenumber">25</context>
|
||||||
@@ -1417,7 +1405,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a" datatype="html">
|
<trans-unit id="a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a" datatype="html">
|
||||||
<source>Create admin account</source>
|
<source>Create admin account</source>
|
||||||
<target>Создайте учетную запись администратора</target>
|
<target>Создание учетной записи администратора</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html</context>
|
||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
@@ -1426,7 +1414,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2d2adf3ca26a676bca2269295b7455a26fd26980" datatype="html">
|
<trans-unit id="2d2adf3ca26a676bca2269295b7455a26fd26980" datatype="html">
|
||||||
<source>No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'.</source>
|
<source>No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'.</source>
|
||||||
<target>Учетная запись администратора по умолчанию не обнаружена. Это создаст и установит пароль для учетной записи администратора с именем пользователя 'admin'.</target>
|
<target state="needs-translation">Учетная запись администратора по умолчанию не обнаружена. Это создаст и установит пароль для учетной записи администратора с именем пользователя 'admin'.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html</context>
|
||||||
<context context-type="linenumber">5</context>
|
<context context-type="linenumber">5</context>
|
||||||
@@ -1453,7 +1441,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a" datatype="html">
|
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a" datatype="html">
|
||||||
<source>About</source>
|
<source>About</source>
|
||||||
<target>О</target>
|
<target>О программе</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/app.component.html</context>
|
<context context-type="sourcefile">app/app.component.html</context>
|
||||||
<context context-type="linenumber">32</context>
|
<context context-type="linenumber">32</context>
|
||||||
@@ -1462,7 +1450,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="92eee6be6de0b11c924e3ab27db30257159c0a7c" datatype="html">
|
<trans-unit id="92eee6be6de0b11c924e3ab27db30257159c0a7c" datatype="html">
|
||||||
<source>Home</source>
|
<source>Home</source>
|
||||||
<target>Дом</target>
|
<target>Домашняя страница</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/app.component.html</context>
|
<context context-type="sourcefile">app/app.component.html</context>
|
||||||
<context context-type="linenumber">43</context>
|
<context context-type="linenumber">43</context>
|
||||||
@@ -1525,7 +1513,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6580b6a950d952df847cb3d8e7176720a740adc8" datatype="html">
|
<trans-unit id="6580b6a950d952df847cb3d8e7176720a740adc8" datatype="html">
|
||||||
<source>Use timestamp</source>
|
<source>Use timestamp</source>
|
||||||
<target>Используйте метку времени</target>
|
<target>Использовать метку времени</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/share-media-dialog/share-media-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/share-media-dialog/share-media-dialog.component.html</context>
|
||||||
<context context-type="linenumber">13</context>
|
<context context-type="linenumber">13</context>
|
||||||
@@ -1619,7 +1607,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="93efc99ae087fc116de708ecd3ace86ca237cf30" datatype="html">
|
<trans-unit id="93efc99ae087fc116de708ecd3ace86ca237cf30" datatype="html">
|
||||||
<source>The playlist or channel URL</source>
|
<source>The playlist or channel URL</source>
|
||||||
<target>URL-адрес списка воспроизведения или канала</target>
|
<target>Ссылка на плейлист или канал</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||||
<context context-type="linenumber">9</context>
|
<context context-type="linenumber">9</context>
|
||||||
@@ -1637,7 +1625,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="ea30873bd3f0d5e4fb2378eec3f0a1db77634a28" datatype="html">
|
<trans-unit id="ea30873bd3f0d5e4fb2378eec3f0a1db77634a28" datatype="html">
|
||||||
<source>Download all uploads</source>
|
<source>Download all uploads</source>
|
||||||
<target>Загрузить все загруженные файлы</target>
|
<target state="needs-translation">Загрузить все загруженные файлы</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||||
<context context-type="linenumber">23</context>
|
<context context-type="linenumber">23</context>
|
||||||
@@ -1646,7 +1634,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="28a678e9cabf86e44c32594c43fa0e890135c20f" datatype="html">
|
<trans-unit id="28a678e9cabf86e44c32594c43fa0e890135c20f" datatype="html">
|
||||||
<source>Download videos uploaded in the last</source>
|
<source>Download videos uploaded in the last</source>
|
||||||
<target>Скачать видео, загруженное за последние время</target>
|
<target>Скачать видео, загруженные за последнее время</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||||
<context context-type="linenumber">26</context>
|
<context context-type="linenumber">26</context>
|
||||||
@@ -1655,7 +1643,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="c76a955642714b8949ff3e4b4990864a2e2cac95" datatype="html">
|
<trans-unit id="c76a955642714b8949ff3e4b4990864a2e2cac95" datatype="html">
|
||||||
<source>Audio-only mode</source>
|
<source>Audio-only mode</source>
|
||||||
<target>Только аудио режим</target>
|
<target>Только звук</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||||
<context context-type="linenumber">38</context>
|
<context context-type="linenumber">38</context>
|
||||||
@@ -1664,7 +1652,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="408ca4911457e84a348cecf214f02c69289aa8f1" datatype="html">
|
<trans-unit id="408ca4911457e84a348cecf214f02c69289aa8f1" datatype="html">
|
||||||
<source>Streaming-only mode</source>
|
<source>Streaming-only mode</source>
|
||||||
<target>Режим только для потокового вещания</target>
|
<target>Только потоковое вещание</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||||
<context context-type="linenumber">43</context>
|
<context context-type="linenumber">43</context>
|
||||||
@@ -1682,7 +1670,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="98b6ec9ec138186d663e64770267b67334353d63" datatype="html">
|
<trans-unit id="98b6ec9ec138186d663e64770267b67334353d63" datatype="html">
|
||||||
<source>Custom file output</source>
|
<source>Custom file output</source>
|
||||||
<target>Пользовательский вывод файлов</target>
|
<target state="needs-translation">Пользовательский файл для вывода</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||||
<context context-type="linenumber">57</context>
|
<context context-type="linenumber">57</context>
|
||||||
@@ -1727,7 +1715,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3042bd3ad8dffcfeca5fd1ae6159fd1047434e95" datatype="html">
|
<trans-unit id="3042bd3ad8dffcfeca5fd1ae6159fd1047434e95" datatype="html">
|
||||||
<source>Unsubscribe</source>
|
<source>Unsubscribe</source>
|
||||||
<target>Отписаться от рассылки</target>
|
<target>Отписаться</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html</context>
|
<context context-type="sourcefile">app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html</context>
|
||||||
<context context-type="linenumber">26</context>
|
<context context-type="linenumber">26</context>
|
||||||
@@ -1929,7 +1917,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6498fa1b8f563988f769654a75411bb8060134b9" datatype="html">
|
<trans-unit id="6498fa1b8f563988f769654a75411bb8060134b9" datatype="html">
|
||||||
<source>Set new password</source>
|
<source>Set new password</source>
|
||||||
<target>Установите новый пароль</target>
|
<target>Задать новый пароль</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/components/manage-user/manage-user.component.html</context>
|
<context context-type="sourcefile">app/components/manage-user/manage-user.component.html</context>
|
||||||
<context context-type="linenumber">10</context>
|
<context context-type="linenumber">10</context>
|
||||||
@@ -2045,7 +2033,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227" datatype="html">
|
<trans-unit id="56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227" datatype="html">
|
||||||
<source>See less.</source>
|
<source>See less.</source>
|
||||||
<target>Смотреть меньше.</target>
|
<target>Закрыть.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/see-more/see-more.component.html</context>
|
<context context-type="sourcefile">src/app/components/see-more/see-more.component.html</context>
|
||||||
<context context-type="linenumber">8,9</context>
|
<context context-type="linenumber">8,9</context>
|
||||||
@@ -2054,7 +2042,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="ddc31f2885b1b33a7651963254b0c197f2a64086" datatype="html">
|
<trans-unit id="ddc31f2885b1b33a7651963254b0c197f2a64086" datatype="html">
|
||||||
<source>See more.</source>
|
<source>See more.</source>
|
||||||
<target>См. подробнее.</target>
|
<target>Раскрыть.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/see-more/see-more.component.html</context>
|
<context context-type="sourcefile">src/app/components/see-more/see-more.component.html</context>
|
||||||
<context context-type="linenumber">5,6</context>
|
<context context-type="linenumber">5,6</context>
|
||||||
@@ -2099,7 +2087,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8a0bda4c47f10b2423ff183acefbf70d4ab52ea2" datatype="html">
|
<trans-unit id="8a0bda4c47f10b2423ff183acefbf70d4ab52ea2" datatype="html">
|
||||||
<source>Clear logs</source>
|
<source>Clear logs</source>
|
||||||
<target>Очистить журналы</target>
|
<target>Очистить журнал</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/logs-viewer/logs-viewer.component.html</context>
|
<context context-type="sourcefile">src/app/components/logs-viewer/logs-viewer.component.html</context>
|
||||||
<context context-type="linenumber">34</context>
|
<context context-type="linenumber">34</context>
|
||||||
@@ -2404,7 +2392,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="792dc6a57f28a1066db283f2e736484f066005fd" datatype="html">
|
<trans-unit id="792dc6a57f28a1066db283f2e736484f066005fd" datatype="html">
|
||||||
<source>Download Twitch Chat</source>
|
<source>Download Twitch Chat</source>
|
||||||
<target>Скачать Чат Twitch</target>
|
<target>Скачать чат Twitch</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/twitch-chat/twitch-chat.component.html</context>
|
<context context-type="sourcefile">src/app/components/twitch-chat/twitch-chat.component.html</context>
|
||||||
<context context-type="linenumber">10</context>
|
<context context-type="linenumber">10</context>
|
||||||
@@ -2431,7 +2419,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="c3b0b86523f1d10e84a71f9b188d54913a11af3b" datatype="html">
|
<trans-unit id="c3b0b86523f1d10e84a71f9b188d54913a11af3b" datatype="html">
|
||||||
<source>Editing category</source>
|
<source>Editing category</source>
|
||||||
<target>Категория редактирования</target>
|
<target>Редактирование категории</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html</context>
|
||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
@@ -2449,7 +2437,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3697f8583ea42868aa269489ad366103d94aece7" datatype="html">
|
<trans-unit id="3697f8583ea42868aa269489ad366103d94aece7" datatype="html">
|
||||||
<source>Editing</source>
|
<source>Editing</source>
|
||||||
<target>Редактирование</target>
|
<target>Правка</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html</context>
|
||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
@@ -2494,7 +2482,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="5caadefa4143cf6766a621b0f54f91f373a1f164" datatype="html">
|
<trans-unit id="5caadefa4143cf6766a621b0f54f91f373a1f164" datatype="html">
|
||||||
<source>Add content</source>
|
<source>Add content</source>
|
||||||
<target>Добавить содержание</target>
|
<target state="needs-translation">Добавить содержание</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/dialogs/modify-playlist/modify-playlist.component.html</context>
|
<context context-type="sourcefile">src/app/dialogs/modify-playlist/modify-playlist.component.html</context>
|
||||||
<context context-type="linenumber">19</context>
|
<context context-type="linenumber">19</context>
|
||||||
@@ -2503,7 +2491,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="a8b7b9c168fd936a75e500806a8c0d7755ef1198" datatype="html">
|
<trans-unit id="a8b7b9c168fd936a75e500806a8c0d7755ef1198" datatype="html">
|
||||||
<source>NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user.</source>
|
<source>NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user.</source>
|
||||||
<target>ПРИМЕЧАНИЕ: Загрузка новых файлов cookie отменяет предыдущие файлы cookie. Также обратите внимание, что файлы cookie используются в масштабах всего экземпляра, а не каждого пользователя.</target>
|
<target state="needs-translation">ПРИМЕЧАНИЕ: Загрузка новых cookie отменяет предыдущие cookie. Также обратите внимание, что cookie используются в масштабах всего экземпляра, а не каждого пользователя.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html</context>
|
||||||
<context context-type="linenumber">20</context>
|
<context context-type="linenumber">20</context>
|
||||||
@@ -2546,7 +2534,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="d641b8fa5ac5e85114c733b1f7de6976bd091f70" datatype="html">
|
<trans-unit id="d641b8fa5ac5e85114c733b1f7de6976bd091f70" datatype="html">
|
||||||
<source>Max quality</source>
|
<source>Max quality</source>
|
||||||
<target>Максимальное качество</target>
|
<target>Лучшее качество</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||||
<context context-type="linenumber">40</context>
|
<context context-type="linenumber">40</context>
|
||||||
@@ -2760,8 +2748,8 @@
|
|||||||
<note priority="1" from="description">Download rate limit input hint</note>
|
<note priority="1" from="description">Download rate limit input hint</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7220285196408439810" datatype="html">
|
<trans-unit id="7220285196408439810" datatype="html">
|
||||||
<source>Download for <x id="url" equiv-text="d, cropF"/> has been queued!</source>
|
<source>Download for <x id="url" equiv-text="url"/> has been queued!</source>
|
||||||
<target>Загрузка для <x id="url" equiv-text="d, cropF"/> выла добавлена в очередь!</target>
|
<target>Загрузка для <x id="url" equiv-text="url"/> была добавлена в очередь!</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
||||||
<context context-type="linenumber">469</context>
|
<context context-type="linenumber">469</context>
|
||||||
@@ -2885,7 +2873,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4ae1f7f102b455472992ae58bc18426316366760" datatype="html">
|
<trans-unit id="4ae1f7f102b455472992ae58bc18426316366760" datatype="html">
|
||||||
<source>Build date:</source>
|
<source>Build date:</source>
|
||||||
<target>Дата постройки:</target>
|
<target>Дата сборки:</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/dialogs/about-dialog/about-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/dialogs/about-dialog/about-dialog.component.html</context>
|
||||||
<context context-type="linenumber">33</context>
|
<context context-type="linenumber">33</context>
|
||||||
@@ -2894,7 +2882,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8700121026680200191" datatype="html">
|
<trans-unit id="8700121026680200191" datatype="html">
|
||||||
<source>Clear</source>
|
<source>Clear</source>
|
||||||
<target>Стереть</target>
|
<target>Очистить</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
<context context-type="linenumber">131</context>
|
<context context-type="linenumber">131</context>
|
||||||
@@ -2902,7 +2890,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8384225360105280028" datatype="html">
|
<trans-unit id="8384225360105280028" datatype="html">
|
||||||
<source>Complete</source>
|
<source>Complete</source>
|
||||||
<target>Закончено</target>
|
<target>Завершено</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
<context context-type="linenumber">61</context>
|
<context context-type="linenumber">61</context>
|
||||||
@@ -2910,7 +2898,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7180002287537831534" datatype="html">
|
<trans-unit id="7180002287537831534" datatype="html">
|
||||||
<source>Clear finished downloads</source>
|
<source>Clear finished downloads</source>
|
||||||
<target>Очистить законченны загрузки</target>
|
<target>Очистить завершённые загрузки</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
<context context-type="linenumber">129</context>
|
<context context-type="linenumber">129</context>
|
||||||
@@ -2960,7 +2948,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46" datatype="html">
|
<trans-unit id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46" datatype="html">
|
||||||
<source>Clear</source>
|
<source>Clear</source>
|
||||||
<target>Стереть</target>
|
<target>Очистить</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||||
<context context-type="linenumber">68</context>
|
<context context-type="linenumber">68</context>
|
||||||
@@ -3033,8 +3021,8 @@
|
|||||||
<note priority="1" from="description">Progress</note>
|
<note priority="1" from="description">Progress</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2560364143605631750" datatype="html">
|
<trans-unit id="2560364143605631750" datatype="html">
|
||||||
<source>Error for <x id="url" equiv-text="}); retu"/></source>
|
<source>Error for <x id="url" equiv-text="download['url']"/></source>
|
||||||
<target>Ошибка для <x id="url" equiv-text="}); retu"/></target>
|
<target>Ошибка с <x id="url" equiv-text="download['url']"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||||
<context context-type="linenumber">238</context>
|
<context context-type="linenumber">238</context>
|
||||||
@@ -3118,7 +3106,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="17afa163f202c8ee76e5b731f4bbdd9920fc4a18" datatype="html">
|
<trans-unit id="17afa163f202c8ee76e5b731f4bbdd9920fc4a18" datatype="html">
|
||||||
<source>Docker tag:</source>
|
<source>Docker tag:</source>
|
||||||
<target>Тег Docker:</target>
|
<target>Метка Docker:</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/dialogs/about-dialog/about-dialog.component.html</context>
|
<context context-type="sourcefile">src/app/dialogs/about-dialog/about-dialog.component.html</context>
|
||||||
<context context-type="linenumber">28</context>
|
<context context-type="linenumber">28</context>
|
||||||
@@ -3176,6 +3164,296 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<note priority="1" from="description">Commit hash</note>
|
<note priority="1" from="description">Commit hash</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="586a5fd72602b5b14ec0c55f84814de47bb21e3a" datatype="html">
|
||||||
|
<source>Tasks</source>
|
||||||
|
<target>Задачи</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/app.component.html</context>
|
||||||
|
<context context-type="linenumber">47</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Navigation menu Tasks Page title</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="84a36cb75660b736773fe36ffa3d54f0f0fe363e" datatype="html">
|
||||||
|
<source>N/A</source>
|
||||||
|
<target>Неизвестно</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">19</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">28</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">N/A</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="e4c3cd97461b220b9cea67cfe08c5399799cfeed" datatype="html">
|
||||||
|
<source>Last ran</source>
|
||||||
|
<target>Последний запуск</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">16</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Last ran</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="698f716f927f633b16cbe2308d90b2dba51f7556" datatype="html">
|
||||||
|
<source>Last confirmed</source>
|
||||||
|
<target>Последние подтверждённые</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">25</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Last confirmed</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
|
||||||
|
<source>Status</source>
|
||||||
|
<target>Статус</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">34</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Status</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="d97425ce76bf3df50bcb643b5f409844770458f6" datatype="html">
|
||||||
|
<source>Busy</source>
|
||||||
|
<target state="needs-translation">Занято</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">36</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Busy</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7e121a443a8e9d92218f987001b650c59504d815" datatype="html">
|
||||||
|
<source>Scheduled for</source>
|
||||||
|
<target>Отложено для</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">38</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Scheduled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="3b7d6ff5d14ab177ce3e2d217b1927fb2e4aefd1" datatype="html">
|
||||||
|
<source>Not scheduled</source>
|
||||||
|
<target>Не отложено</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">42</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Not scheduled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5ff9ae1f4c26bf2ddf6e9d5e4136916c5ce6a941" datatype="html">
|
||||||
|
<source>Clear missing files from DB:</source>
|
||||||
|
<target>Очистка потерянных файлов из базы данных:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">57</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Clear missing files from DB</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4391397241847e675f6c38bbdec6b2883157fb1a" datatype="html">
|
||||||
|
<source>Clear duplicate files from DB:</source>
|
||||||
|
<target>Очистка дубликатов файлов из базы данных:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">60</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Clear duplicate files from DB</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9562dd1e902acc4cc6a6e09cba66a2775daf7794" datatype="html">
|
||||||
|
<source>Update binary to:</source>
|
||||||
|
<target>Обновить бинарный файл на:</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">63</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update binary to</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9b3d305551358858e1892169a94527e0cc4dbf5b" datatype="html">
|
||||||
|
<source>Run</source>
|
||||||
|
<target>Запустить</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">69</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Run</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4a4f46a2dcec36bd5c8c371ceee55c2226dec27f" datatype="html">
|
||||||
|
<source>Schedule</source>
|
||||||
|
<target>Отложить</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">72</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Schedule</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="40bd7093f5fbd3fbeff9a50baaf5d4c8416add1e" datatype="html">
|
||||||
|
<source>Restore DB from backup</source>
|
||||||
|
<target>Восстановить базу данных из резервной копии</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">89</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">1</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Restore DB from backup button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="f8a2361f3bd8fb05bf92080e2755bddd56ab64d7" datatype="html">
|
||||||
|
<source>Reset tasks</source>
|
||||||
|
<target>Сбросить задачи</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">90</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Reset tasks button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5e96c9d4528bf259da3944daac3171d7462b065a" datatype="html">
|
||||||
|
<source>No tasks available!</source>
|
||||||
|
<target>Нет доступных задач!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.html</context>
|
||||||
|
<context context-type="linenumber">94</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">No tasks label</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5615896113581458384" datatype="html">
|
||||||
|
<source>Successfully ran task!</source>
|
||||||
|
<target>Задача успешно запущена!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">78</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="2106110452479146311" datatype="html">
|
||||||
|
<source>Failed to run task!</source>
|
||||||
|
<target>Не удалось запустить задачу!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">79</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">81</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4707127982271899773" datatype="html">
|
||||||
|
<source>Successfully confirmed task!</source>
|
||||||
|
<target>Задача успешно подтверждена!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">89</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="4334913030311371594" datatype="html">
|
||||||
|
<source>Would you like to reset your tasks? All your schedules will be removed as well.</source>
|
||||||
|
<target>Хотите ли вы сбросить ваши задачи? Все отложенные задачи также будут удалены.</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">133</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="d5cec7468241d72cafd86ad1af6d55b09a6e3ae5" datatype="html">
|
||||||
|
<source>Restore</source>
|
||||||
|
<target>Восстановить</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">25</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Restore button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="998793c78895d53576f462054f13d6e515e923d9" datatype="html">
|
||||||
|
<source>Update task schedule</source>
|
||||||
|
<target>Обновить расписание задачи</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">1</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update task schedule</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="f50a33d3c339f8f4a465141f8caa5d2d8c005251" datatype="html">
|
||||||
|
<source>Enabled</source>
|
||||||
|
<target>Включено</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">7</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Enabled</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="67aed6c588eb854f2f30ef642e85147da0027a61" datatype="html">
|
||||||
|
<source>Recurring</source>
|
||||||
|
<target>Повторяющиеся</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">10</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Recurring</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb" datatype="html">
|
||||||
|
<source>Update</source>
|
||||||
|
<target>Обновить</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html</context>
|
||||||
|
<context context-type="linenumber">52</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Update button</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="fd374bee82dab66055b933496860f82b7b780159" datatype="html">
|
||||||
|
<source>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: ,,</source>
|
||||||
|
<target>Глобальные пользовательские аргументы для загрузок на домашней странице. (Установите аргументы подписок для каждой подписки отдельно!) Аргументы разделяются, используя две запятые, как здесь: ,,</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
||||||
|
<context context-type="linenumber">128</context>
|
||||||
|
</context-group>
|
||||||
|
<note priority="1" from="description">Custom args setting input hint</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="5588424857086384816" datatype="html">
|
||||||
|
<source>Reset tasks</source>
|
||||||
|
<target>Сбросить задачи</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">132</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="9121124215111024650" datatype="html">
|
||||||
|
<source>Failed to confirm task!</source>
|
||||||
|
<target>Не удалось подтвердить задачу!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">90</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">92</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7808756054397155068" datatype="html">
|
||||||
|
<source>Reset</source>
|
||||||
|
<target>Сбросить</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">134</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="1709994363138824316" datatype="html">
|
||||||
|
<source>Failed to reset tasks!</source>
|
||||||
|
<target>Не удалось сбросить задачи!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">144</context>
|
||||||
|
</context-group>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">147</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="8612475568724527886" datatype="html">
|
||||||
|
<source>Tasks successfully reset!</source>
|
||||||
|
<target>Задачи успешно сброшены!</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/tasks/tasks.component.ts</context>
|
||||||
|
<context context-type="linenumber">142</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||||
<file source-language="en-US" datatype="plaintext" original="ng2.template" target-language="zh-Hans">
|
<file source-language="en-US" datatype="plaintext" original="ng2.template" target-language="zh-Hans">
|
||||||
<body>
|
<body>
|
||||||
@@ -733,7 +733,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
||||||
<source>Subscriptions base path</source>
|
<source>Subscriptions base path</source>
|
||||||
<target>订阅文件路径</target>
|
<target>订阅基路径</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
||||||
<context context-type="linenumber">72</context>
|
<context context-type="linenumber">72</context>
|
||||||
@@ -902,8 +902,8 @@
|
|||||||
<note priority="1" from="description">Video path setting input hint</note>
|
<note priority="1" from="description">Video path setting input hint</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6b995e7130b4d667eaab6c5f61b362ace486d26d" datatype="html">
|
<trans-unit id="6b995e7130b4d667eaab6c5f61b362ace486d26d" datatype="html">
|
||||||
<source>Global custom args for downloads on the home page. Args are delimited using two commas like so: ,,</source>
|
<source>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: ,,</source>
|
||||||
<target>开始页面上用于下载的全局自定义参数。参数由两个逗号分隔:,,</target>
|
<target>开始页面上用于下载的全局自定义参数。(单独为每个订阅设置订阅参数!) 参数由两个逗号分隔:,,</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
||||||
<context context-type="linenumber">146</context>
|
<context context-type="linenumber">146</context>
|
||||||
|
|||||||
@@ -33,7 +33,18 @@ async function createLocalizationJSON() {
|
|||||||
for (let i = 0; i < files.length; i++) {
|
for (let i = 0; i < files.length; i++) {
|
||||||
const file = path.basename(files[i]);
|
const file = path.basename(files[i]);
|
||||||
const file_parts = file.split('.');
|
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');
|
fs.unlinkSync('src/assets/i18n/messages.en.json');
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user