mirror of
https://github.com/Tzahi12345/YoutubeDL-Material.git
synced 2026-03-17 02:00:56 +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:
|
||||
push:
|
||||
branches: [master]
|
||||
paths-ignore:
|
||||
- '.github/**'
|
||||
- '.vscode/**'
|
||||
- 'chrome-extension/**'
|
||||
- 'releases/**'
|
||||
- '**/**.md'
|
||||
- '**.crx'
|
||||
- '**.pem'
|
||||
- '.dockerignore'
|
||||
- '.gitignore'
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
@@ -21,7 +31,7 @@ jobs:
|
||||
uses: jsdaniell/create-json@1.1.2
|
||||
with:
|
||||
name: "version.json"
|
||||
json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}'
|
||||
json: '{"type": "docker", "tag": "${{secrets.DOCKERHUB_MASTER_TAG}}", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}'
|
||||
dir: 'backend/'
|
||||
- name: setup platform emulator
|
||||
uses: docker/setup-qemu-action@v1
|
||||
@@ -39,4 +49,8 @@ jobs:
|
||||
file: ./Dockerfile
|
||||
platforms: linux/amd64,linux/arm,linux/arm64/v8
|
||||
push: true
|
||||
tags: tzahi12345/youtubedl-material:nightly
|
||||
# Defaults:
|
||||
# DOCKERHUB_USERNAME : tzahi12345
|
||||
# DOCKERHUB_REPO : youtubedl-material
|
||||
# DOCKERHUB_MASTER_TAG: nightly
|
||||
tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO }}:${{secrets.DOCKERHUB_MASTER_TAG}}
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
RUN npm install pm2 -g
|
||||
RUN npm install && chown -R $UID:$GID ./
|
||||
RUN groupadd -g $GID $USER && useradd --system -m -g $USER --uid $UID $USER && \
|
||||
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 [ "/backend/", "/app/" ]
|
||||
# Add some persistence data
|
||||
#VOLUME ["/app/appdata"]
|
||||
|
||||
EXPOSE 17442
|
||||
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
|
||||
summary: Download video file
|
||||
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.
|
||||
@@ -41,7 +41,7 @@ paths:
|
||||
post:
|
||||
tags:
|
||||
- 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
|
||||
operationId: post-generateArgs
|
||||
requestBody:
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
[](https://github.com/Tzahi12345/YoutubeDL-Material/issues)
|
||||
[](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!
|
||||
|
||||
|
||||
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",
|
||||
"description": "An open-source and self-hosted YouTube downloader based on Google's Material Design specifications.",
|
||||
"repository": "https://github.com/Tzahi12345/YoutubeDL-Material",
|
||||
"stack": "container",
|
||||
"logo": "https://i.imgur.com/GPzvPiU.png",
|
||||
"keywords": ["youtube-dl", "youtubedl-material", "nodejs"]
|
||||
}
|
||||
@@ -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) {
|
||||
// no tag provided means update to the latest version
|
||||
if (!tag) {
|
||||
@@ -297,7 +289,7 @@ async function updateServer(tag) {
|
||||
updating: true,
|
||||
'details': 'Update complete! Restarting server...'
|
||||
}
|
||||
restartServer(true);
|
||||
utils.restartServer(true);
|
||||
}, err => {
|
||||
logger.error(err);
|
||||
updaterStatus = {
|
||||
@@ -676,6 +668,7 @@ async function getUrlInfos(url) {
|
||||
|
||||
async function startYoutubeDL() {
|
||||
// auto update youtube-dl
|
||||
youtubedl_api.verifyBinaryExistsLinux();
|
||||
const update_available = await youtubedl_api.checkForYoutubeDLUpdate();
|
||||
if (update_available) await youtubedl_api.updateYoutubeDL(update_available);
|
||||
}
|
||||
@@ -764,7 +757,7 @@ app.get('/api/versionInfo', (req, res) => {
|
||||
|
||||
app.post('/api/restartServer', optionalJwt, (req, res) => {
|
||||
// delayed by a little bit so that the client gets a response
|
||||
setTimeout(() => {restartServer()}, 100);
|
||||
setTimeout(() => {utils.restartServer()}, 100);
|
||||
res.send({success: true});
|
||||
});
|
||||
|
||||
@@ -803,7 +796,7 @@ app.post('/api/testConnectionString', optionalJwt, async (req, res) => {
|
||||
app.post('/api/downloadFile', optionalJwt, async function(req, res) {
|
||||
req.setTimeout(0); // remove timeout in case of long videos
|
||||
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 options = {
|
||||
customArgs: req.body.customArgs,
|
||||
@@ -1802,6 +1795,7 @@ app.post('/api/updateTaskData', optionalJwt, async (req, res) => {
|
||||
|
||||
app.post('/api/getDBBackups', optionalJwt, async (req, res) => {
|
||||
const backup_dir = path.join('appdata', 'db_backup');
|
||||
fs.ensureDirSync(backup_dir);
|
||||
const db_backups = [];
|
||||
|
||||
const candidate_backups = await utils.recFindByExt(backup_dir, 'bak', null, [], false);
|
||||
|
||||
@@ -18,10 +18,19 @@ let JWT_EXPIRATION = null;
|
||||
let opts = null;
|
||||
let saltRounds = null;
|
||||
|
||||
exports.initialize = function() {
|
||||
exports.initialize = function () {
|
||||
/*************************
|
||||
* Authentication module
|
||||
************************/
|
||||
|
||||
if (db_api.database_initialized) {
|
||||
setupRoles();
|
||||
} else {
|
||||
db_api.database_initialized_bs.subscribe(init => {
|
||||
if (init) setupRoles();
|
||||
});
|
||||
}
|
||||
|
||||
saltRounds = 10;
|
||||
|
||||
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.serializeUser(function(user, done) {
|
||||
|
||||
@@ -222,4 +222,83 @@ exports.AVAILABLE_PERMISSIONS = [
|
||||
|
||||
exports.DETAILS_BIN_PATH = 'node_modules/youtube-dl/bin/details'
|
||||
|
||||
// args that have a value after it (e.g. -o <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';
|
||||
|
||||
@@ -85,7 +85,6 @@ exports.initialize = (input_db, input_users_db) => {
|
||||
}
|
||||
|
||||
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);
|
||||
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');
|
||||
if (useYoutubeDLArchive) {
|
||||
const usersFileFolder = config_api.getConfigItem('ytdl_users_base_path');
|
||||
const archive_path = uuid ? path.join(usersFileFolder, uuid, 'archives', `archive_${type}.txt`) : path.join('appdata', 'archives', `archive_${type}.txt`);
|
||||
|
||||
// get ID from JSON
|
||||
|
||||
@@ -3,7 +3,6 @@ const { uuid } = require('uuidv4');
|
||||
const path = require('path');
|
||||
const mergeFiles = require('merge-files');
|
||||
const NodeID3 = require('node-id3')
|
||||
const glob = require('glob')
|
||||
const Mutex = require('async-mutex').Mutex;
|
||||
|
||||
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 !== '') {
|
||||
downloadConfig = downloadConfig.concat(options.additionalArgs.split(',,'));
|
||||
downloadConfig = utils.injectArgs(downloadConfig, options.additionalArgs.split(',,'));
|
||||
}
|
||||
|
||||
const rate_limit = config_api.getConfigItem('ytdl_download_rate_limit');
|
||||
@@ -583,20 +582,26 @@ async function checkDownloadPercent(download_uid) {
|
||||
if (!resulting_file_size) return;
|
||||
|
||||
let sum_size = 0;
|
||||
glob(`{${files_to_check_for_progress.join(',')}, }*`, async (err, files) => {
|
||||
files.forEach(async file => {
|
||||
try {
|
||||
const file_stats = fs.statSync(file);
|
||||
if (file_stats && file_stats.size) {
|
||||
sum_size += file_stats.size;
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
for (let i = 0; i < files_to_check_for_progress.length; i++) {
|
||||
const file_to_check_for_progress = files_to_check_for_progress[i];
|
||||
const dir = path.dirname(file_to_check_for_progress);
|
||||
if (!fs.existsSync(dir)) continue;
|
||||
fs.readdir(dir, async (err, files) => {
|
||||
for (let j = 0; j < files.length; j++) {
|
||||
const file = files[j];
|
||||
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) => {
|
||||
|
||||
@@ -11,7 +11,7 @@ fi
|
||||
# chown current working directory to current user
|
||||
if [ "$*" = "$CMD" ] && [ "$(id -u)" = "0" ]; then
|
||||
find . \! -user "$UID" -exec chown "$UID:$GID" -R '{}' + || echo "WARNING! Could not change directory ownership. If you manage permissions externally this is fine, otherwise you may experience issues when downloading or deleting videos."
|
||||
exec su-exec "$UID:$GID" "$0" "$@"
|
||||
exec gosu "$UID:$GID" "$0" "$@"
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
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=="
|
||||
},
|
||||
"passport": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/passport/-/passport-0.5.2.tgz",
|
||||
"integrity": "sha512-w9n/Ot5I7orGD4y+7V3EFJCQEznE5RxHamUxcqLT2QoJY0f2JdN8GyHonYFvN0Vz+L6lUJfVhrk2aZz2LbuREw==",
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz",
|
||||
"integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==",
|
||||
"requires": {
|
||||
"passport-strategy": "1.x.x",
|
||||
"pause": "0.0.1"
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
"express": "^4.17.3",
|
||||
"fluent-ffmpeg": "^2.1.2",
|
||||
"fs-extra": "^9.0.0",
|
||||
"glob": "^7.1.6",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"lowdb": "^1.0.0",
|
||||
"md5": "^2.2.1",
|
||||
@@ -53,7 +52,7 @@
|
||||
"node-id3": "^0.1.14",
|
||||
"node-schedule": "^2.1.0",
|
||||
"nodemon": "^2.0.7",
|
||||
"passport": "^0.5.2",
|
||||
"passport": "^0.4.1",
|
||||
"passport-http": "^0.3.0",
|
||||
"passport-jwt": "^4.0.0",
|
||||
"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))) {
|
||||
const archive_file_path = path.join(sub.archive, 'archive.txt');
|
||||
// deletes archive if it exists
|
||||
// TODO: Keep entries in blacklist_video.txt by moving them to a global blacklist
|
||||
if (await fs.pathExists(archive_file_path)) {
|
||||
await fs.unlink(archive_file_path);
|
||||
}
|
||||
@@ -266,11 +267,17 @@ async function getVideosForSub(sub, user_uid = null) {
|
||||
}
|
||||
resolve(false);
|
||||
} 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] === '')) {
|
||||
logger.verbose('No additional videos to download for ' + sub.name);
|
||||
resolve(true);
|
||||
return;
|
||||
}
|
||||
|
||||
const output_jsons = [];
|
||||
for (let i = 0; i < output.length; i++) {
|
||||
let output_json = null;
|
||||
@@ -294,14 +301,7 @@ async function getVideosForSub(sub, user_uid = null) {
|
||||
}
|
||||
|
||||
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 => {
|
||||
logger.error(err);
|
||||
@@ -380,7 +380,11 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de
|
||||
if (useArchive && !redownload) {
|
||||
if (sub.archive) {
|
||||
archive_dir = sub.archive;
|
||||
archive_path = path.join(archive_dir, 'archive.txt')
|
||||
if (sub.type && sub.type === 'audio') {
|
||||
archive_path = path.join(archive_dir, 'merged_audio.txt');
|
||||
} else {
|
||||
archive_path = path.join(archive_dir, 'merged_video.txt');
|
||||
}
|
||||
}
|
||||
downloadConfig.push('--download-archive', archive_path);
|
||||
}
|
||||
@@ -473,22 +477,24 @@ async function updateSubscriptionProperty(sub, assignment_obj) {
|
||||
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, '');
|
||||
sub.videos.forEach(async video => {
|
||||
if (current_date === video['upload_date'].replace(/-/g, '')) {
|
||||
sub_files.forEach(async file => {
|
||||
if (current_date === file['upload_date'].replace(/-/g, '')) {
|
||||
// set upload as fresh
|
||||
const video_uid = video['uid'];
|
||||
await db_api.setVideoProperty(video_uid, {'fresh_upload': true}, user_uid, sub['id']);
|
||||
const file_uid = file['uid'];
|
||||
await db_api.setVideoProperty(file_uid, {'fresh_upload': true});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
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, '');
|
||||
sub.videos.forEach(async video => {
|
||||
if (video['fresh_upload'] && current_date > video['upload_date'].replace(/-/g, '')) {
|
||||
await checkVideoIfBetterExists(video, sub, user_uid)
|
||||
sub_files.forEach(async file => {
|
||||
if (file['fresh_upload'] && current_date > file['upload_date'].replace(/-/g, '')) {
|
||||
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']}`);
|
||||
} 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]}`);
|
||||
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
|
||||
|
||||
@@ -42,9 +42,9 @@ function scheduleJob(task_key, schedule) {
|
||||
if (schedule['type'] === 'timestamp') {
|
||||
converted_schedule = new Date(schedule['data']['timestamp']);
|
||||
} else if (schedule['type'] === 'recurring') {
|
||||
const dayOfWeek = schedule['data']['dayOfWeek'] ? schedule['data']['dayOfWeek'] : null;
|
||||
const hour = schedule['data']['hour'] ? schedule['data']['hour'] : null;
|
||||
const minute = schedule['data']['minute'] ? schedule['data']['minute'] : null;
|
||||
const dayOfWeek = schedule['data']['dayOfWeek'] != null ? schedule['data']['dayOfWeek'] : null;
|
||||
const hour = schedule['data']['hour'] != null ? schedule['data']['hour'] : null;
|
||||
const minute = schedule['data']['minute'] != null ? schedule['data']['minute'] : null;
|
||||
converted_schedule = new scheduler.RecurrenceRule(null, null, null, dayOfWeek, hour, minute);
|
||||
} else {
|
||||
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);
|
||||
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() {
|
||||
|
||||
@@ -415,6 +415,47 @@ async function fetchFile(url, path, file_label) {
|
||||
});
|
||||
}
|
||||
|
||||
async function restartServer(is_update = false) {
|
||||
logger.info(`${is_update ? 'Update complete! ' : ''}Restarting server...`);
|
||||
|
||||
// the following line restarts the server through nodemon
|
||||
fs.writeFileSync(`restart${is_update ? '_update' : '_general'}.json`, 'internal use only');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// adds or replaces args according to the following rules:
|
||||
// - if it already exists and has value, then replace both arg and value
|
||||
// - if already exists and doesn't have value, ignore
|
||||
// - if it doesn't exist and has value, add both arg and value
|
||||
// - if it doesn't exist and doesn't have value, add arg
|
||||
function injectArgs(original_args, new_args) {
|
||||
const updated_args = original_args.slice();
|
||||
try {
|
||||
for (let i = 0; i < new_args.length; i++) {
|
||||
const new_arg = new_args[i];
|
||||
if (!new_arg.startsWith('-') && !new_arg.startsWith('--') && i > 0 && original_args.includes(new_args[i - 1])) continue;
|
||||
|
||||
if (CONSTS.YTDL_ARGS_WITH_VALUES.has(new_arg)) {
|
||||
if (original_args.includes(new_arg)) {
|
||||
const original_index = original_args.indexOf(new_arg);
|
||||
original_args.splice(original_index, 2);
|
||||
}
|
||||
|
||||
updated_args.push(new_arg, new_args[i + 1]);
|
||||
} else {
|
||||
if (!original_args.includes(new_arg)) {
|
||||
updated_args.push(new_arg);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
logger.warn(err);
|
||||
logger.warn(`Failed to inject args (${new_args}) into (${original_args})`);
|
||||
}
|
||||
|
||||
return updated_args;
|
||||
}
|
||||
|
||||
// objects
|
||||
|
||||
function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) {
|
||||
@@ -458,5 +499,7 @@ module.exports = {
|
||||
wait: wait,
|
||||
checkExistsWithTimeout: checkExistsWithTimeout,
|
||||
fetchFile: fetchFile,
|
||||
restartServer: restartServer,
|
||||
injectArgs: injectArgs,
|
||||
File: File
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@ const utils = require('./utils');
|
||||
const CONSTS = require('./consts');
|
||||
const config_api = require('./config.js');
|
||||
|
||||
const OUTDATED_VERSION = "2020.00.00";
|
||||
|
||||
const is_windows = process.platform === 'win32';
|
||||
|
||||
const download_sources = {
|
||||
@@ -31,7 +33,7 @@ exports.checkForYoutubeDLUpdate = async () => {
|
||||
let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH);
|
||||
if (!current_app_details_exists) {
|
||||
logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`);
|
||||
fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version":"2020.00.00", "downloader": default_downloader});
|
||||
fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version": OUTDATED_VERSION, "downloader": default_downloader});
|
||||
}
|
||||
let current_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH));
|
||||
let current_version = current_app_details['version'];
|
||||
@@ -86,6 +88,18 @@ exports.updateYoutubeDL = async (latest_update_version) => {
|
||||
await download_sources[default_downloader]['func'](latest_update_version);
|
||||
}
|
||||
|
||||
exports.verifyBinaryExistsLinux = () => {
|
||||
const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH);
|
||||
if (!is_windows && details_json && details_json['path'] && details_json['path'].includes('.exe')) {
|
||||
details_json['path'] = 'node_modules/youtube-dl/bin/youtube-dl';
|
||||
details_json['exec'] = 'youtube-dl';
|
||||
details_json['version'] = OUTDATED_VERSION;
|
||||
fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, details_json);
|
||||
|
||||
utils.restartServer();
|
||||
}
|
||||
}
|
||||
|
||||
async function downloadLatestYoutubeDLBinary(new_version) {
|
||||
const file_ext = is_windows ? '.exe' : '';
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
|
||||
"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": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
|
||||
@@ -3367,9 +3314,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"async": {
|
||||
"version": "2.6.4",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
|
||||
"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
|
||||
"version": "2.6.3",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
|
||||
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"lodash": "^4.17.14"
|
||||
@@ -10740,9 +10687,9 @@
|
||||
}
|
||||
},
|
||||
"rxjs-compat": {
|
||||
"version": "6.5.4",
|
||||
"resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.5.4.tgz",
|
||||
"integrity": "sha512-rkn+lbOHUQOurdd74J/hjmDsG9nFx0z66fvnbs8M95nrtKvNqCKdk7iZqdY51CGmDemTQk+kUPy4s8HVOHtkfA=="
|
||||
"version": "6.6.7",
|
||||
"resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.6.7.tgz",
|
||||
"integrity": "sha512-szN4fK+TqBPOFBcBcsR0g2cmTTUF/vaFEOZNuSdfU8/pGFnNmmn2u8SystYXG1QMrjOPBc6XTKHMVfENDf6hHw=="
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
"lint": "ng lint",
|
||||
"e2e": "ng e2e",
|
||||
"electron": "ng build --base-href ./ && electron .",
|
||||
"generate": "openapi --input ./\"Public API v1.yaml\" --output ./src/api-types --exportCore false --exportServices false --exportModels true"
|
||||
"generate": "openapi --input ./\"Public API v1.yaml\" --output ./src/api-types --exportCore false --exportServices false --exportModels true",
|
||||
"i18n-source": "ng extract-i18n --output-path=src/assets/i18n"
|
||||
},
|
||||
"engines": {
|
||||
"node": "12.3.1",
|
||||
@@ -47,7 +48,7 @@
|
||||
"ngx-avatars": "^1.3.1",
|
||||
"ngx-file-drop": "^13.0.0",
|
||||
"rxjs": "^6.6.3",
|
||||
"rxjs-compat": "^6.0.0-rc.0",
|
||||
"rxjs-compat": "^6.6.7",
|
||||
"tslib": "^2.0.0",
|
||||
"typescript": "~4.6.3",
|
||||
"xliff-to-json": "^1.0.4",
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
</ng-container>
|
||||
<ng-container *ngIf="postsService.config && allowSubscriptions && postsService.subscriptions && postsService.hasPermission('subscriptions')">
|
||||
<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>
|
||||
</mat-nav-list>
|
||||
</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() {
|
||||
this.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';
|
||||
|
||||
@Component({
|
||||
@@ -6,7 +6,7 @@ import { PostsService } from 'app/posts.services';
|
||||
templateUrl: './twitch-chat.component.html',
|
||||
styleUrls: ['./twitch-chat.component.scss']
|
||||
})
|
||||
export class TwitchChatComponent implements OnInit, AfterViewInit {
|
||||
export class TwitchChatComponent implements OnInit, OnDestroy {
|
||||
|
||||
full_chat = null;
|
||||
visible_chat = null;
|
||||
@@ -33,7 +33,8 @@ export class TwitchChatComponent implements OnInit, AfterViewInit {
|
||||
this.getFullChat();
|
||||
}
|
||||
|
||||
ngAfterViewInit() {
|
||||
ngOnDestroy(): void {
|
||||
if (this.chat_check_interval_obj) { clearInterval(this.chat_check_interval_obj); }
|
||||
}
|
||||
|
||||
private isUserNearBottom(): boolean {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
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';
|
||||
|
||||
@Component({
|
||||
@@ -18,7 +18,7 @@ export class UpdateTaskScheduleDialogComponent implements OnInit {
|
||||
date = null;
|
||||
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.postsService.getTask(this.data.task.key).subscribe(res => {
|
||||
this.processTask(res['task']);
|
||||
@@ -28,7 +28,7 @@ export class UpdateTaskScheduleDialogComponent implements OnInit {
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
processTask(task) {
|
||||
processTask(task: Task): void {
|
||||
if (!task['schedule']) {
|
||||
this.enabled = false;
|
||||
return;
|
||||
@@ -39,7 +39,11 @@ export class UpdateTaskScheduleDialogComponent implements OnInit {
|
||||
this.recurring = schedule['type'] === Schedule.type.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']) {
|
||||
this.days_of_week = schedule['data']['dayOfWeek'];
|
||||
@@ -75,7 +79,6 @@ export class UpdateTaskScheduleDialogComponent implements OnInit {
|
||||
}
|
||||
} else {
|
||||
this.date.setHours(hours, minutes);
|
||||
console.log(this.date);
|
||||
schedule['data'] = {timestamp: this.date.getTime()};
|
||||
}
|
||||
this.dialogRef.close(schedule);
|
||||
|
||||
@@ -445,7 +445,7 @@ export const isoLangs = {
|
||||
'name': 'Navajo, Navaho',
|
||||
'nativeName': 'Diné bizaad, Dinékʼehǰí'
|
||||
},
|
||||
'nb': {
|
||||
'nb-NO': {
|
||||
'name': 'Norwegian Bokmål',
|
||||
'nativeName': 'Norsk bokmål',
|
||||
'ngID': 'nb'
|
||||
|
||||
@@ -52,6 +52,8 @@ export class SubscriptionComponent implements OnInit, OnDestroy {
|
||||
this.route.params.subscribe(params => {
|
||||
this.id = params['id'];
|
||||
|
||||
if (this.sub_interval) { clearInterval(this.sub_interval); }
|
||||
|
||||
this.postsService.service_initialized.subscribe(init => {
|
||||
if (init) {
|
||||
this.getConfig();
|
||||
|
||||
@@ -36,6 +36,9 @@
|
||||
<ng-container i18n="Subscription playlist not available text">Name not available. Playlist retrieval in progress.</ng-container>
|
||||
</div>
|
||||
</a>
|
||||
<button mat-icon-button (click)="editSubscription(sub)">
|
||||
<mat-icon>edit</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button (click)="showSubInfo(sub)">
|
||||
<mat-icon>info</mat-icon>
|
||||
</button>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1392,7 +1392,7 @@
|
||||
<note priority="1" from="description">Allow subscriptions setting</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
||||
<source>Base bath for subscriptions</source>
|
||||
<source>Subscriptions base path</source>
|
||||
<target>Camí base de subscripcions</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
||||
@@ -3009,8 +3009,8 @@
|
||||
<note priority="1" from="description">Skip ad button</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="7220285196408439810" datatype="html">
|
||||
<source>Download for <x id="url" equiv-text="d, cropF"/> has been queued!</source>
|
||||
<target>La descàrrega de <x id="url" equiv-text="d, cropF"/> s'ha posat a la cua!</target>
|
||||
<source>Download for <x id="url" equiv-text="url"/> has been queued!</source>
|
||||
<target>La descàrrega de <x id="url" equiv-text="url"/> s'ha posat a la cua!</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
||||
<context context-type="linenumber">469</context>
|
||||
@@ -3071,8 +3071,8 @@
|
||||
<note priority="1" from="description">Installation type</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="2560364143605631750" datatype="html">
|
||||
<source>Error for <x id="url" equiv-text="}); retu"/></source>
|
||||
<target>Error a <x id="url" equiv-text="}); retu"/></target>
|
||||
<source>Error for <x id="url" equiv-text="download['url']"/></source>
|
||||
<target>Error a <x id="url" equiv-text="download['url']"/></target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||
<context context-type="linenumber">238</context>
|
||||
@@ -3104,6 +3104,296 @@
|
||||
<context context-type="linenumber">130</context>
|
||||
</context-group>
|
||||
</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>
|
||||
</file>
|
||||
</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">
|
||||
<file source-language="en-US" datatype="plaintext" original="ng2.template" target-language="es">
|
||||
<body>
|
||||
@@ -1630,6 +1630,198 @@
|
||||
<context context-type="linenumber">469</context>
|
||||
</context-group>
|
||||
</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>
|
||||
</file>
|
||||
</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">
|
||||
<file source-language="en-US" datatype="plaintext" original="ng2.template" target-language="mk">
|
||||
<body>
|
||||
@@ -91,8 +91,8 @@
|
||||
<note priority="1" from="description">Settings menu label</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="7220285196408439810" datatype="html">
|
||||
<source>Download for <x id="url" equiv-text="d, cropF"/> has been queued!</source>
|
||||
<target>Превземањето за <x id="url" equiv-text="d, cropF"/> е ставено во редицата за чекање!</target>
|
||||
<source>Download for <x id="url" equiv-text="url"/> has been queued!</source>
|
||||
<target>Превземањето за <x id="url" equiv-text="url"/> е ставено во редицата за чекање!</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
||||
<context context-type="linenumber">469</context>
|
||||
@@ -2496,8 +2496,8 @@
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="2560364143605631750" datatype="html">
|
||||
<source>Error for <x id="url" equiv-text="}); retu"/></source>
|
||||
<target>Грешка за <x id="url" equiv-text="}); retu"/></target>
|
||||
<source>Error for <x id="url" equiv-text="download['url']"/></source>
|
||||
<target>Грешка за <x id="url" equiv-text="download['url']"/></target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||
<context context-type="linenumber">238</context>
|
||||
@@ -3035,6 +3035,296 @@
|
||||
</context-group>
|
||||
<note priority="1" from="description">Video duration label</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="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>
|
||||
</file>
|
||||
</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>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
||||
<source>Base bath for subscriptions</source>
|
||||
<source>Subscriptions base path</source>
|
||||
<target>Abonnementenbasispad</target>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>Algemene aanvullende opties voor downloads op de overzichtspagina. Scheidt deze met komma's: ,,</target>
|
||||
<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. (Stel de opties per abonnement in!) Scheidt deze met komma's: ,,</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/settings/settings.component.html</context>
|
||||
<context context-type="linenumber">134</context>
|
||||
@@ -2854,8 +2854,8 @@
|
||||
</context-group>
|
||||
</trans-unit>
|
||||
<trans-unit id="2560364143605631750" datatype="html">
|
||||
<source>Error for <x id="url" equiv-text="}); retu"/></source>
|
||||
<target>Foutmelding bij <x id="url" equiv-text="}); retu"/></target>
|
||||
<source>Error for <x id="url" equiv-text="download['url']"/></source>
|
||||
<target>Foutmelding bij <x id="url" equiv-text="download['url']"/></target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||
<context context-type="linenumber">238</context>
|
||||
@@ -3097,13 +3097,303 @@
|
||||
<note priority="1" from="description">Autoplay checkbox</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="7220285196408439810" datatype="html">
|
||||
<source>Download for <x id="url" equiv-text="d, cropF"/> has been queued!</source>
|
||||
<target><x id="url" equiv-text="d, cropF"/> staat in de wachtrij!</target>
|
||||
<source>Download for <x id="url" equiv-text="url"/> has been queued!</source>
|
||||
<target><x id="url" equiv-text="url"/> staat in de wachtrij!</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
||||
<context context-type="linenumber">469</context>
|
||||
</context-group>
|
||||
</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>
|
||||
</file>
|
||||
</xliff>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="cff1428d10d59d14e45edec3c735a27b5482db59" datatype="html">
|
||||
<source>Name</source>
|
||||
<target>Имя</target>
|
||||
<target>Название</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/create-playlist/create-playlist.component.html</context>
|
||||
<context context-type="linenumber">5</context>
|
||||
@@ -124,7 +124,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="b2623aee44b70c9a4ba1fce16c8a593b0a4c7974" datatype="html">
|
||||
<source>Modify</source>
|
||||
<target>Модифицировать</target>
|
||||
<target>Изменить</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html</context>
|
||||
<context context-type="linenumber">85</context>
|
||||
@@ -289,7 +289,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="19d1ae64d94d28a29b2c57ae8671aace906b5401" datatype="html">
|
||||
<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 context-type="sourcefile">app/main/main.component.html</context>
|
||||
<context context-type="linenumber">131</context>
|
||||
@@ -336,9 +336,7 @@
|
||||
<note priority="1" from="description">YT Password placeholder</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="4a0dada6e841a425de3e5006e6a04df26c644fa5" datatype="html">
|
||||
<source>
|
||||
Audio
|
||||
</source>
|
||||
<source>Audio</source>
|
||||
<target/>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||
@@ -347,9 +345,7 @@
|
||||
<note priority="1" from="description">Audio files title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="9779715ac05308973d8f1c8658b29b986e92450f" datatype="html">
|
||||
<source>
|
||||
Your audio files are here
|
||||
</source>
|
||||
<source>Your audio files are here</source>
|
||||
<target/>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||
@@ -375,9 +371,7 @@
|
||||
<note priority="1" from="description">Playlists title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="78bd81adb4609b68cfa4c589222bdc233ba1faaa" datatype="html">
|
||||
<source>
|
||||
No playlists available. Create one from your downloading audio files by clicking the blue plus button.
|
||||
</source>
|
||||
<source>No playlists available. Create one from your downloading audio files by clicking the blue plus button.</source>
|
||||
<target/>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33" datatype="html">
|
||||
<source>
|
||||
Video
|
||||
</source>
|
||||
<source>Video</source>
|
||||
<target/>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||
@@ -397,9 +389,7 @@
|
||||
<note priority="1" from="description">Video files title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="960582a8b9d7942716866ecfb7718309728f2916" datatype="html">
|
||||
<source>
|
||||
Your video files are here
|
||||
</source>
|
||||
<source>Your video files are here</source>
|
||||
<target/>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||
@@ -408,9 +398,7 @@
|
||||
<note priority="1" from="description">Video files description</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="0f59c46ca29e9725898093c9ea6b586730d0624e" datatype="html">
|
||||
<source>
|
||||
No playlists available. Create one from your downloading video files by clicking the blue plus button.
|
||||
</source>
|
||||
<source>No playlists available. Create one from your downloading video files by clicking the blue plus button.</source>
|
||||
<target/>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/main/main.component.html</context>
|
||||
@@ -433,7 +421,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="c52db455cca9109ee47e1a612c3f4117c09eb71b" datatype="html">
|
||||
<source>URL:</source>
|
||||
<target>URL-адрес:</target>
|
||||
<target>Ссылка:</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/video-info-dialog/video-info-dialog.component.html</context>
|
||||
<context context-type="linenumber">9</context>
|
||||
@@ -523,7 +511,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1" datatype="html">
|
||||
<source>Modify playlist</source>
|
||||
<target>Изменить список воспроизведения</target>
|
||||
<target>Изменить плейлист</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/modify-playlist/modify-playlist.component.html</context>
|
||||
<context context-type="linenumber">1</context>
|
||||
@@ -602,7 +590,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="ebadf946ae90f13ecd0c70f09edbc0f983af8a0f" datatype="html">
|
||||
<source>Upload new cookies</source>
|
||||
<target>Загрузка новых файлов cookie</target>
|
||||
<target>Загрузка новых cookie</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html</context>
|
||||
<context context-type="linenumber">1</context>
|
||||
@@ -642,7 +630,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="801b98c6f02fe3b32f6afa3ee854c99ed83474e6" datatype="html">
|
||||
<source>URL</source>
|
||||
<target>URL-адрес</target>
|
||||
<target>Ссылка</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
||||
<context context-type="linenumber">18</context>
|
||||
@@ -744,7 +732,7 @@
|
||||
<note priority="1" from="description">Allow subscriptions setting</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
||||
<source>Base bath for subscriptions</source>
|
||||
<source>Subscriptions base path</source>
|
||||
<target>Базовый путь для подписок</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
||||
@@ -1283,7 +1271,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>это загрузчик YouTube с открытым исходным кодом, созданный в соответствии со спецификациями Material Design от Google. Вы можете легко загружать любимые видеоролики в виде видео- или аудиофайлов и даже подписываться на любимые каналы и плейлисты, чтобы быть в курсе их новых видео.</target>
|
||||
<target>это загрузчик YouTube с открытым исходным кодом, созданный в соответствии со спецификациями Material Design от Google. Вы можете легко загружать любимые видеоролики в виде видео- или аудиофайлов и даже подписываться на любимые каналы и плейлисты, чтобы быть в курсе новых видео.</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/about-dialog/about-dialog.component.html</context>
|
||||
<context context-type="linenumber">12</context>
|
||||
@@ -1346,7 +1334,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="e1f398f38ff1534303d4bb80bd6cece245f24016" datatype="html">
|
||||
<source>to create an issue!</source>
|
||||
<target>чтобы создать проблему!</target>
|
||||
<target>чтобы описать проблему!</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/about-dialog/about-dialog.component.html</context>
|
||||
<context context-type="linenumber">25</context>
|
||||
@@ -1417,7 +1405,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a" datatype="html">
|
||||
<source>Create admin account</source>
|
||||
<target>Создайте учетную запись администратора</target>
|
||||
<target>Создание учетной записи администратора</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html</context>
|
||||
<context context-type="linenumber">1</context>
|
||||
@@ -1426,7 +1414,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>Учетная запись администратора по умолчанию не обнаружена. Это создаст и установит пароль для учетной записи администратора с именем пользователя 'admin'.</target>
|
||||
<target state="needs-translation">Учетная запись администратора по умолчанию не обнаружена. Это создаст и установит пароль для учетной записи администратора с именем пользователя 'admin'.</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html</context>
|
||||
<context context-type="linenumber">5</context>
|
||||
@@ -1453,7 +1441,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a" datatype="html">
|
||||
<source>About</source>
|
||||
<target>О</target>
|
||||
<target>О программе</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/app.component.html</context>
|
||||
<context context-type="linenumber">32</context>
|
||||
@@ -1462,7 +1450,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="92eee6be6de0b11c924e3ab27db30257159c0a7c" datatype="html">
|
||||
<source>Home</source>
|
||||
<target>Дом</target>
|
||||
<target>Домашняя страница</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/app.component.html</context>
|
||||
<context context-type="linenumber">43</context>
|
||||
@@ -1525,7 +1513,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="6580b6a950d952df847cb3d8e7176720a740adc8" datatype="html">
|
||||
<source>Use timestamp</source>
|
||||
<target>Используйте метку времени</target>
|
||||
<target>Использовать метку времени</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/share-media-dialog/share-media-dialog.component.html</context>
|
||||
<context context-type="linenumber">13</context>
|
||||
@@ -1619,7 +1607,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="93efc99ae087fc116de708ecd3ace86ca237cf30" datatype="html">
|
||||
<source>The playlist or channel URL</source>
|
||||
<target>URL-адрес списка воспроизведения или канала</target>
|
||||
<target>Ссылка на плейлист или канал</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||
<context context-type="linenumber">9</context>
|
||||
@@ -1637,7 +1625,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="ea30873bd3f0d5e4fb2378eec3f0a1db77634a28" datatype="html">
|
||||
<source>Download all uploads</source>
|
||||
<target>Загрузить все загруженные файлы</target>
|
||||
<target state="needs-translation">Загрузить все загруженные файлы</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||
<context context-type="linenumber">23</context>
|
||||
@@ -1646,7 +1634,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="28a678e9cabf86e44c32594c43fa0e890135c20f" datatype="html">
|
||||
<source>Download videos uploaded in the last</source>
|
||||
<target>Скачать видео, загруженное за последние время</target>
|
||||
<target>Скачать видео, загруженные за последнее время</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||
<context context-type="linenumber">26</context>
|
||||
@@ -1655,7 +1643,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="c76a955642714b8949ff3e4b4990864a2e2cac95" datatype="html">
|
||||
<source>Audio-only mode</source>
|
||||
<target>Только аудио режим</target>
|
||||
<target>Только звук</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||
<context context-type="linenumber">38</context>
|
||||
@@ -1664,7 +1652,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="408ca4911457e84a348cecf214f02c69289aa8f1" datatype="html">
|
||||
<source>Streaming-only mode</source>
|
||||
<target>Режим только для потокового вещания</target>
|
||||
<target>Только потоковое вещание</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||
<context context-type="linenumber">43</context>
|
||||
@@ -1682,7 +1670,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="98b6ec9ec138186d663e64770267b67334353d63" datatype="html">
|
||||
<source>Custom file output</source>
|
||||
<target>Пользовательский вывод файлов</target>
|
||||
<target state="needs-translation">Пользовательский файл для вывода</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||
<context context-type="linenumber">57</context>
|
||||
@@ -1727,7 +1715,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="3042bd3ad8dffcfeca5fd1ae6159fd1047434e95" datatype="html">
|
||||
<source>Unsubscribe</source>
|
||||
<target>Отписаться от рассылки</target>
|
||||
<target>Отписаться</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html</context>
|
||||
<context context-type="linenumber">26</context>
|
||||
@@ -1929,7 +1917,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="6498fa1b8f563988f769654a75411bb8060134b9" datatype="html">
|
||||
<source>Set new password</source>
|
||||
<target>Установите новый пароль</target>
|
||||
<target>Задать новый пароль</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/components/manage-user/manage-user.component.html</context>
|
||||
<context context-type="linenumber">10</context>
|
||||
@@ -2045,7 +2033,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227" datatype="html">
|
||||
<source>See less.</source>
|
||||
<target>Смотреть меньше.</target>
|
||||
<target>Закрыть.</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/see-more/see-more.component.html</context>
|
||||
<context context-type="linenumber">8,9</context>
|
||||
@@ -2054,7 +2042,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="ddc31f2885b1b33a7651963254b0c197f2a64086" datatype="html">
|
||||
<source>See more.</source>
|
||||
<target>См. подробнее.</target>
|
||||
<target>Раскрыть.</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/see-more/see-more.component.html</context>
|
||||
<context context-type="linenumber">5,6</context>
|
||||
@@ -2099,7 +2087,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="8a0bda4c47f10b2423ff183acefbf70d4ab52ea2" datatype="html">
|
||||
<source>Clear logs</source>
|
||||
<target>Очистить журналы</target>
|
||||
<target>Очистить журнал</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/logs-viewer/logs-viewer.component.html</context>
|
||||
<context context-type="linenumber">34</context>
|
||||
@@ -2404,7 +2392,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="792dc6a57f28a1066db283f2e736484f066005fd" datatype="html">
|
||||
<source>Download Twitch Chat</source>
|
||||
<target>Скачать Чат Twitch</target>
|
||||
<target>Скачать чат Twitch</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/twitch-chat/twitch-chat.component.html</context>
|
||||
<context context-type="linenumber">10</context>
|
||||
@@ -2431,7 +2419,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="c3b0b86523f1d10e84a71f9b188d54913a11af3b" datatype="html">
|
||||
<source>Editing category</source>
|
||||
<target>Категория редактирования</target>
|
||||
<target>Редактирование категории</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html</context>
|
||||
<context context-type="linenumber">1</context>
|
||||
@@ -2449,7 +2437,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="3697f8583ea42868aa269489ad366103d94aece7" datatype="html">
|
||||
<source>Editing</source>
|
||||
<target>Редактирование</target>
|
||||
<target>Правка</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html</context>
|
||||
<context context-type="linenumber">1</context>
|
||||
@@ -2494,7 +2482,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="5caadefa4143cf6766a621b0f54f91f373a1f164" datatype="html">
|
||||
<source>Add content</source>
|
||||
<target>Добавить содержание</target>
|
||||
<target state="needs-translation">Добавить содержание</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dialogs/modify-playlist/modify-playlist.component.html</context>
|
||||
<context context-type="linenumber">19</context>
|
||||
@@ -2503,7 +2491,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>ПРИМЕЧАНИЕ: Загрузка новых файлов cookie отменяет предыдущие файлы cookie. Также обратите внимание, что файлы cookie используются в масштабах всего экземпляра, а не каждого пользователя.</target>
|
||||
<target state="needs-translation">ПРИМЕЧАНИЕ: Загрузка новых cookie отменяет предыдущие cookie. Также обратите внимание, что cookie используются в масштабах всего экземпляра, а не каждого пользователя.</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html</context>
|
||||
<context context-type="linenumber">20</context>
|
||||
@@ -2546,7 +2534,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="d641b8fa5ac5e85114c733b1f7de6976bd091f70" datatype="html">
|
||||
<source>Max quality</source>
|
||||
<target>Максимальное качество</target>
|
||||
<target>Лучшее качество</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html</context>
|
||||
<context context-type="linenumber">40</context>
|
||||
@@ -2760,8 +2748,8 @@
|
||||
<note priority="1" from="description">Download rate limit input hint</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="7220285196408439810" datatype="html">
|
||||
<source>Download for <x id="url" equiv-text="d, cropF"/> has been queued!</source>
|
||||
<target>Загрузка для <x id="url" equiv-text="d, cropF"/> выла добавлена в очередь!</target>
|
||||
<source>Download for <x id="url" equiv-text="url"/> has been queued!</source>
|
||||
<target>Загрузка для <x id="url" equiv-text="url"/> была добавлена в очередь!</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/main/main.component.ts</context>
|
||||
<context context-type="linenumber">469</context>
|
||||
@@ -2885,7 +2873,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="4ae1f7f102b455472992ae58bc18426316366760" datatype="html">
|
||||
<source>Build date:</source>
|
||||
<target>Дата постройки:</target>
|
||||
<target>Дата сборки:</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dialogs/about-dialog/about-dialog.component.html</context>
|
||||
<context context-type="linenumber">33</context>
|
||||
@@ -2894,7 +2882,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="8700121026680200191" datatype="html">
|
||||
<source>Clear</source>
|
||||
<target>Стереть</target>
|
||||
<target>Очистить</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||
<context context-type="linenumber">131</context>
|
||||
@@ -2902,7 +2890,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="8384225360105280028" datatype="html">
|
||||
<source>Complete</source>
|
||||
<target>Закончено</target>
|
||||
<target>Завершено</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||
<context context-type="linenumber">61</context>
|
||||
@@ -2910,7 +2898,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="7180002287537831534" datatype="html">
|
||||
<source>Clear finished downloads</source>
|
||||
<target>Очистить законченны загрузки</target>
|
||||
<target>Очистить завершённые загрузки</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||
<context context-type="linenumber">129</context>
|
||||
@@ -2960,7 +2948,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46" datatype="html">
|
||||
<source>Clear</source>
|
||||
<target>Стереть</target>
|
||||
<target>Очистить</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.html</context>
|
||||
<context context-type="linenumber">68</context>
|
||||
@@ -3033,8 +3021,8 @@
|
||||
<note priority="1" from="description">Progress</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="2560364143605631750" datatype="html">
|
||||
<source>Error for <x id="url" equiv-text="}); retu"/></source>
|
||||
<target>Ошибка для <x id="url" equiv-text="}); retu"/></target>
|
||||
<source>Error for <x id="url" equiv-text="download['url']"/></source>
|
||||
<target>Ошибка с <x id="url" equiv-text="download['url']"/></target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/downloads/downloads.component.ts</context>
|
||||
<context context-type="linenumber">238</context>
|
||||
@@ -3118,7 +3106,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="17afa163f202c8ee76e5b731f4bbdd9920fc4a18" datatype="html">
|
||||
<source>Docker tag:</source>
|
||||
<target>Тег Docker:</target>
|
||||
<target>Метка Docker:</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dialogs/about-dialog/about-dialog.component.html</context>
|
||||
<context context-type="linenumber">28</context>
|
||||
@@ -3176,6 +3164,296 @@
|
||||
</context-group>
|
||||
<note priority="1" from="description">Commit hash</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="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>
|
||||
</file>
|
||||
</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">
|
||||
<file source-language="en-US" datatype="plaintext" original="ng2.template" target-language="zh-Hans">
|
||||
<body>
|
||||
@@ -733,7 +733,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="4bee2a4bef2d26d37c9b353c278e24e5cd309ce3" datatype="html">
|
||||
<source>Subscriptions base path</source>
|
||||
<target>订阅文件路径</target>
|
||||
<target>订阅基路径</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">app/settings/settings.component.html</context>
|
||||
<context context-type="linenumber">72</context>
|
||||
@@ -902,8 +902,8 @@
|
||||
<note priority="1" from="description">Video path setting input hint</note>
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>开始页面上用于下载的全局自定义参数。参数由两个逗号分隔:,,</target>
|
||||
<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">app/settings/settings.component.html</context>
|
||||
<context context-type="linenumber">146</context>
|
||||
|
||||
@@ -33,7 +33,18 @@ async function createLocalizationJSON() {
|
||||
for (let i = 0; i < files.length; i++) {
|
||||
const file = path.basename(files[i]);
|
||||
const file_parts = file.split('.');
|
||||
locales.push(file_parts[1]);
|
||||
if (file_parts.length !== 3 || file_parts[1] === 'en') continue;
|
||||
try {
|
||||
const locale_json = fs.readJSONSync(files[i]);
|
||||
const locale_json_keys = Object.keys(locale_json);
|
||||
let has_defined_keys = false;
|
||||
for (let i = 0; i < locale_json_keys.length; i++) {
|
||||
if (locale_json[locale_json_keys[i]] !== '') has_defined_keys = true;
|
||||
}
|
||||
if (has_defined_keys) locales.push(file_parts[1]);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
|
||||
fs.unlinkSync('src/assets/i18n/messages.en.json');
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user