Compare commits
317 Commits
snyk-fix-b
...
f460d2f731
| Author | SHA1 | Date | |
|---|---|---|---|
| f460d2f731 | |||
| 41bc03a737 | |||
| 2ab6eff761 | |||
| 6c881a265a | |||
| 2b15f0a87c | |||
| 1d6ab2a82b | |||
| 24e82e69d1 | |||
| b079d411de | |||
| e04c8eb99f | |||
| 3a6b793948 | |||
| f5361de78d | |||
| e0759afc70 | |||
| 700e4ba38e | |||
| cc82b232ce | |||
| c1f422e325 | |||
| ffaaba29d7 | |||
| 9cad841efb | |||
| 324ab09b5d | |||
| 0b5e9e923b | |||
| f2308e567d | |||
| 1466c6451b | |||
| 598c708e92 | |||
| 1f903b4f75 | |||
| 7951b17877 | |||
| 2a39b7315b | |||
| 8b35a60997 | |||
| 696ff0fc7a | |||
| 29736f480d | |||
| f4251f3e1d | |||
| ae981396e5 | |||
| ca0b86bee7 | |||
| 26ca1ec456 | |||
| 017e4c2e4d | |||
| a89658e8c3 | |||
| 99be7c2629 | |||
| 200da8dfaa | |||
| 9a218a6516 | |||
| 933ee0ef75 | |||
| 8dd7bcdf97 | |||
| d5c7e0475b | |||
| a5af233683 | |||
| 27e3796622 | |||
| 5843e85c4d | |||
| 92a943c755 | |||
| 58a19cdaa2 | |||
| b1d2112bfc | |||
| d229bc7f00 | |||
| 033a4d3122 | |||
| 8d252b6375 | |||
| 9453c0ca8f | |||
| ce073b30d9 | |||
| 8f63e5e3a3 | |||
| 23853b66c6 | |||
| 62a322f10d | |||
| 9627dd2202 | |||
| 3383926faa | |||
| 8179664064 | |||
| 1a5e417f4f | |||
| ceb6da9bc9 | |||
| fdafb2dd07 | |||
| c3700e0e59 | |||
| 3f1c26f82d | |||
| bb7816815c | |||
| a1773fd992 | |||
| 1671bea942 | |||
| 141ae03208 | |||
| 55c1012cda | |||
| 612c5c89c9 | |||
| 01bbf7e3f7 | |||
| 6a7b7d88de | |||
| d06896450c | |||
| 4a59afc505 | |||
| 7b0d63b6cf | |||
| c734ffe70f | |||
| 3d0ad69ddb | |||
| 6c4ae0dbfa | |||
| f7aaa3377a | |||
| ab1a0478cf | |||
| 127f56905c | |||
| 8d448c667f | |||
| e00f33eb2d | |||
| 8100804ced | |||
| 4fba3ffd92 | |||
| bef8252314 | |||
| a96cc5aa8a | |||
| b7e43e3125 | |||
| 2d059eb353 | |||
| bce0f8ad17 | |||
| e04a084be9 | |||
| e94aa5c513 | |||
| fa2862ca9a | |||
| e764c69f2b | |||
| b5052d85ad | |||
| e4fa850871 | |||
| db4be4ae25 | |||
| 55680531c5 | |||
| ae4557d32c | |||
| f5f65e73ca | |||
| e9f4958252 | |||
| 00626bc37d | |||
| 8e36d77245 | |||
| 8f6d16ae89 | |||
| 2d1d0257ef | |||
| 7b2543847a | |||
| 00af45ddee | |||
| 786961c33b | |||
| 8dc69cd9ac | |||
| d8e0bd903e | |||
| 4f31d47097 | |||
| cdb1ccec76 | |||
| 4998fa1e28 | |||
| f912598416 | |||
| 1f063c41d4 | |||
| 7b4a4b81ae | |||
| b7750ad50e | |||
| 886f2ae3b2 | |||
| 4c2d3253e7 | |||
| c03d3af289 | |||
| b006466eab | |||
| 39a859703d | |||
| d1e9f5272f | |||
| 2c16e68799 | |||
| d7381f1847 | |||
| 97cee6ca54 | |||
| b2c339a879 | |||
| 7192ad74bc | |||
| 022125755b | |||
| b40851e92a | |||
| 1590f2e309 | |||
| b8e0d53ef3 | |||
| ffa61687bf | |||
| 4f716d8e0b | |||
| 9932316be1 | |||
| 86a4a1b41e | |||
| c6c71bea9f | |||
| cbc6449621 | |||
| 9b8daac28c | |||
| cbc0077690 | |||
| c43d636549 | |||
| af1513a0b5 | |||
| 3a7d3ff73d | |||
| f22b887a3f | |||
| 5d0116ff2e | |||
| 98a8244f5f | |||
| 798bfc0708 | |||
| 91b2c5a41a | |||
| c28d2a950f | |||
| 50aae3e3d4 | |||
| ce410aaa51 | |||
| 82f7e02d5b | |||
| 33017eda63 | |||
| 779006d0cd | |||
| a0c0e3a21f | |||
| b6a622a151 | |||
| ac59883b5c | |||
| c5b6d24f10 | |||
| 6fd97d8b88 | |||
| 18692b0283 | |||
| f81dd1f910 | |||
| 1452c4ae8a | |||
| 504c73df73 | |||
| 0c16467a8b | |||
| 26539544ab | |||
| 9f84e2771c | |||
| a2be98588b | |||
| b445ef8aeb | |||
| a49ee4fd11 | |||
| c8c380841f | |||
| 6fa89db2f3 | |||
| c4ef6efddd | |||
| 55a6e815af | |||
| 8238262afe | |||
| a81aa4b7c9 | |||
| 56c903d5df | |||
| b0931c8924 | |||
| 5142b673c1 | |||
| 36eaeef45f | |||
| da2f3e5102 | |||
| 7ceb160e96 | |||
| a563084055 | |||
| ced531133a | |||
| 345c2e59fd | |||
| b3e0fd5588 | |||
| 7f35738667 | |||
| 1fa827df89 | |||
| 78ba710b3f | |||
| bcb61a922e | |||
| c046a76972 | |||
| ed25d11b23 | |||
| 8de5599240 | |||
| ce7fcc5d01 | |||
| 30ed2b5c75 | |||
| 12d4241668 | |||
| 0eb65f082c | |||
| 25fccc9a62 | |||
| 414a560205 | |||
| 7c1b8ed0a4 | |||
| 8084a175cf | |||
| f5175a6be7 | |||
| c9ae7cb277 | |||
| e455932754 | |||
| a1e3bf23be | |||
| 8ccd510700 | |||
| 127760d509 | |||
| c0a495640f | |||
| 6060e138ee | |||
| 98b2e182fb | |||
| 715ddb8923 | |||
| 3104111f6b | |||
| e064c37859 | |||
| 1de223b4ca | |||
| 50a1365a6f | |||
| cc83804491 | |||
| 92cf306439 | |||
| a8be510a07 | |||
| 58524fb3c1 | |||
| aeb6997117 | |||
| 0116188623 | |||
| af63edb058 | |||
| bd0ac52832 | |||
| 5b537d2a9e | |||
| d9a7c352d3 | |||
| 84add37441 | |||
| 9a88f11f16 | |||
| 51b4441e5c | |||
| 29784e6a39 | |||
| e2981c22fa | |||
| d7513dcc20 | |||
| 5c0face2c9 | |||
| a1805f7662 | |||
| 46889098e8 | |||
| 607938c170 | |||
| 58a03db898 | |||
| 67ef3408dc | |||
| 27f16e26b3 | |||
| e38200bc1f | |||
| 736e63d259 | |||
| 721271d902 | |||
| a2151930ec | |||
| bdc9f42681 | |||
| 0b3c6f9e1f | |||
| ebe373bdc6 | |||
| ab91e6d735 | |||
| be3ae4d789 | |||
| 336b7fe5e9 | |||
| 5ecd39f324 | |||
| eb50596961 | |||
| aede0cd643 | |||
| 25f51784c3 | |||
| 7acac6d11c | |||
| 1972ef70b5 | |||
| c4455ed3d2 | |||
| c1a06ab955 | |||
| 26fa1f85b2 | |||
| 555817e2f5 | |||
| f8654dfdb9 | |||
| 96c0fc412c | |||
| a70a4106df | |||
| 895210cbb6 | |||
| 789a30312b | |||
| 623d97b1e2 | |||
| 4ed97f0145 | |||
| 77a2bbf02a | |||
| 7a9a1531d4 | |||
| 16b59698d6 | |||
| a85a2e0c58 | |||
| 97f1a20a4f | |||
| 8dbe151ddd | |||
| 87144e03c2 | |||
| 2046b253e3 | |||
| c068e11fc5 | |||
| 10384b6c4c | |||
| 4d83bd587d | |||
| aae523989b | |||
| afacec973b | |||
| 75fb51e290 | |||
| cb85048af4 | |||
| 8b10872e83 | |||
| 96ea114335 | |||
| 7c1c3ef28d | |||
| 7a7ad4261c | |||
| c0dbc204a0 | |||
| 68e63f809c | |||
| 4b188ec205 | |||
| 23013cddb9 | |||
| 588b84ecd0 | |||
| fd68c204f6 | |||
| 313bb6e43f | |||
| 0a6f244035 | |||
| 8e4e2c42f6 | |||
| f31053cf3c | |||
| d5758790c0 | |||
| bbd243a534 | |||
| 2fc0d6f3b0 | |||
| 6b15018a9b | |||
| acc977db7c | |||
| 270100a14c | |||
| 094e6fa2d6 | |||
| 9f81f7001c | |||
| e6c78dd5e0 | |||
| b64e1394ae | |||
| dcc611c7d0 | |||
| d329076b52 | |||
| 1435559a56 | |||
| 1feeeedf10 | |||
| 443d716e45 | |||
| 3d65a96e38 | |||
| e20f3fe24c | |||
| 5d3afb52d8 | |||
| 5e0341c8d5 | |||
| b84a8c512a | |||
| cd0f4bbc1d | |||
| e37367c5e5 | |||
| 8a765be912 | |||
| a213dae14d | |||
| 40c429f3c1 | |||
| 3125520e68 |
20
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -1,5 +1,5 @@
|
||||
name: Bug Report
|
||||
description: Report a YouTube Music bug
|
||||
description: Report a Pear Desktop bug
|
||||
title: "[Bug]: "
|
||||
labels: "bug :beetle:"
|
||||
body:
|
||||
@ -8,17 +8,17 @@ body:
|
||||
label: Preflight Checklist
|
||||
description: Please ensure you've completed all of the following.
|
||||
options:
|
||||
- label: I use the latest version of YouTube Music (Application).
|
||||
- label: I use the latest version of Pear Desktop (Application).
|
||||
required: true
|
||||
- label: I have searched the [issue tracker](https://github.com/th-ch/youtube-music/issues) for a bug report that matches the one I want to file, without success.
|
||||
- label: I have searched the [issue tracker](https://github.com/pear-devs/pear-desktop/issues) for a bug report that matches the one I want to file, without success.
|
||||
required: true
|
||||
- label: I understand that **th-ch/youtube-music has NO affiliation with Google or YouTube**
|
||||
- label: I understand that **pear-devs/pear-desktop has NO affiliation with Google or YouTube**
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: YouTube Music (Application) Version
|
||||
label: Pear Desktop (Application) Version
|
||||
description: |
|
||||
What version of the YouTube Music Application are you using?
|
||||
What version of the Pear Desktop Application are you using?
|
||||
|
||||
Note: Please check if this issue is reproducible with the latest stable release.
|
||||
placeholder: 2.0.0
|
||||
@ -28,7 +28,7 @@ body:
|
||||
attributes:
|
||||
label: Checklists
|
||||
options:
|
||||
- label: I use the portable version of the YouTube Music Application.
|
||||
- label: I use the portable version of the Pear Desktop Application.
|
||||
- label: I can reproduce this issue in the [official version of (WEB) YTM](https://music.youtube.com).
|
||||
- type: dropdown
|
||||
attributes:
|
||||
@ -60,8 +60,8 @@ body:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Last Known Working YouTube Music (Application) version
|
||||
description: (If applicable) What is the last version of YouTube Music this worked in?
|
||||
label: Last Known Working Pear Desktop (Application) version
|
||||
description: (If applicable) What is the last version of Pear Desktop this worked in?
|
||||
placeholder: 1.20.0
|
||||
- type: textarea
|
||||
attributes:
|
||||
@ -92,4 +92,4 @@ body:
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional Information
|
||||
description: If your problem needs further explanation, or if the issue you're seeing cannot be reproduced in a gist, please add more information here.
|
||||
description: If your problem needs further explanation, or if the issue you're seeing cannot be reproduced in a gist, please add more information here.
|
||||
|
||||
6
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@ -1,5 +1,5 @@
|
||||
name: Feature Request
|
||||
description: Suggest an idea for YouTube Music
|
||||
description: Suggest an idea for Pear Desktop
|
||||
title: "[Feature Request]: "
|
||||
labels: "enhancement :sparkles:"
|
||||
body:
|
||||
@ -8,9 +8,9 @@ body:
|
||||
label: Preflight Checklist
|
||||
description: Please ensure you've completed all of the following.
|
||||
options:
|
||||
- label: I use the latest version of YouTube Music (Application).
|
||||
- label: I use the latest version of Pear Desktop (Application).
|
||||
required: true
|
||||
- label: I have searched the [issue tracker](https://github.com/th-ch/youtube-music/issues) for a feature request that matches the one I want to file, without success.
|
||||
- label: I have searched the [issue tracker](https://github.com/pear-devs/pear-desktop/issues) for a feature request that matches the one I want to file, without success.
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
|
||||
33
.github/workflows/build.yml
vendored
@ -1,4 +1,4 @@
|
||||
name: Build YouTube Music
|
||||
name: Build Pear Desktop
|
||||
|
||||
on:
|
||||
push:
|
||||
@ -10,7 +10,8 @@ env:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build YouTube Music
|
||||
if: github.event.pull_request.draft == false
|
||||
name: Build Pear Desktop
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: true
|
||||
@ -18,7 +19,7 @@ jobs:
|
||||
os: [ macos-latest, ubuntu-latest, windows-latest ]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
@ -28,14 +29,14 @@ jobs:
|
||||
|
||||
- name: Setup NodeJS
|
||||
if: startsWith(matrix.os, 'macOS') != true
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Setup NodeJS for macOS
|
||||
if: startsWith(matrix.os, 'macOS')
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
|
||||
@ -44,20 +45,20 @@ jobs:
|
||||
|
||||
# Only vite build without release if it is a fork, or it is a pull-request
|
||||
- name: Vite Build
|
||||
if: github.repository == 'th-ch/youtube-music' && github.event_name == 'pull_request'
|
||||
if: github.repository == 'pear-devs/pear-desktop' && github.event_name == 'pull_request'
|
||||
run: |
|
||||
pnpm build
|
||||
|
||||
# Build and release if it's the main repository and is not pull-request
|
||||
- name: Build and release on Mac
|
||||
if: startsWith(matrix.os, 'macOS') && (github.repository == 'th-ch/youtube-music' && github.event_name != 'pull_request')
|
||||
if: startsWith(matrix.os, 'macOS') && (github.repository == 'pear-devs/pear-desktop' && github.event_name != 'pull_request')
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
pnpm release:mac
|
||||
|
||||
- name: Build and release on Linux
|
||||
if: startsWith(matrix.os, 'ubuntu') && (github.repository == 'th-ch/youtube-music' && github.event_name != 'pull_request')
|
||||
if: startsWith(matrix.os, 'ubuntu') && (github.repository == 'pear-devs/pear-desktop' && github.event_name != 'pull_request')
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
@ -71,7 +72,7 @@ jobs:
|
||||
pnpm release:linux
|
||||
|
||||
- name: Build and release on Windows
|
||||
if: startsWith(matrix.os, 'windows') && (github.repository == 'th-ch/youtube-music' && github.event_name != 'pull_request')
|
||||
if: startsWith(matrix.os, 'windows') && (github.repository == 'pear-devs/pear-desktop' && github.event_name != 'pull_request')
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
@ -87,11 +88,11 @@ jobs:
|
||||
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
name: Release YouTube Music
|
||||
if: github.repository == 'th-ch/youtube-music' && github.ref == 'refs/heads/master'
|
||||
name: Release Pear Desktop
|
||||
if: github.repository == 'pear-devs/pear-desktop' && github.ref == 'refs/heads/master'
|
||||
needs: build
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@ -103,14 +104,14 @@ jobs:
|
||||
|
||||
- name: Setup NodeJS
|
||||
if: startsWith(matrix.os, 'macOS') != true
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Setup NodeJS for macOS
|
||||
if: startsWith(matrix.os, 'macOS')
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
|
||||
@ -149,11 +150,11 @@ jobs:
|
||||
name: ${{ env.VERSION_TAG }}
|
||||
replacebody: true
|
||||
body: |
|
||||
See [changelog](https://github.com/th-ch/youtube-music/blob/master/changelog.md#${{ env.CHANGELOG_ANCHOR }}) for the list of updates and the full diff.
|
||||
See [changelog](https://github.com/pear-devs/pear-desktop/blob/master/changelog.md#${{ env.CHANGELOG_ANCHOR }}) for the list of updates and the full diff.
|
||||
|
||||
Thanks to all contributors! 🏅
|
||||
|
||||
(Note for Windows: `YouTube-Music-Web-Setup-${{ env.VERSION_TAG }}.exe` is an installer, and `YouTube-Music-${{ env.VERSION_TAG }}.exe` is a portable version)
|
||||
(Note for Windows: `Pear-Desktop-Web-Setup-${{ env.VERSION_TAG }}.exe` is an installer, and `Pear-Desktop-${{ env.VERSION_TAG }}.exe` is a portable version)
|
||||
|
||||
- name: Update changelog
|
||||
if: ${{ env.VERSION_HASH == '' }}
|
||||
|
||||
4
.github/workflows/dependency-review.yml
vendored
@ -12,9 +12,11 @@ permissions:
|
||||
|
||||
jobs:
|
||||
dependency-review:
|
||||
if: github.event.pull_request.draft == false
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: "Checkout Repository"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: "Dependency Review"
|
||||
uses: actions/dependency-review-action@v4
|
||||
|
||||
147
.github/workflows/pr-build-artifacts.yml
vendored
Normal file
@ -0,0 +1,147 @@
|
||||
name: Build PR Artifacts
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
env:
|
||||
NODE_VERSION: "22.x"
|
||||
|
||||
jobs:
|
||||
check-permissions:
|
||||
if: github.event.pull_request.draft == false
|
||||
name: Check if user has write access
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
has-write-access: ${{ steps.check.outputs.require-result }}
|
||||
steps:
|
||||
- name: Check user permission
|
||||
id: check
|
||||
uses: actions-cool/check-user-permission@v2
|
||||
with:
|
||||
require: write
|
||||
username: ${{ github.event.pull_request.user.login }}
|
||||
|
||||
build:
|
||||
name: Build ${{ matrix.os }}
|
||||
needs: check-permissions
|
||||
if: needs.check-permissions.outputs.has-write-access == 'true'
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-latest, ubuntu-latest, windows-latest]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
run_install: false
|
||||
|
||||
- name: Setup NodeJS
|
||||
if: startsWith(matrix.os, 'macOS') != true
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Setup NodeJS for macOS
|
||||
if: startsWith(matrix.os, 'macOS')
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Build on macOS
|
||||
if: startsWith(matrix.os, 'macOS')
|
||||
run: |
|
||||
pnpm dist:mac
|
||||
pnpm dist:mac:arm64
|
||||
|
||||
- name: Install Linux dependencies
|
||||
if: startsWith(matrix.os, 'ubuntu')
|
||||
run: |
|
||||
sudo snap install snapcraft --classic
|
||||
sudo apt update
|
||||
sudo apt install -y flatpak flatpak-builder
|
||||
sudo flatpak remote-add --if-not-exists --system flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
sudo flatpak install -y flathub org.freedesktop.Platform/x86_64/24.08
|
||||
sudo flatpak install -y flathub org.freedesktop.Sdk/x86_64/24.08
|
||||
sudo flatpak install -y flathub org.electronjs.Electron2.BaseApp/x86_64/24.08
|
||||
|
||||
- name: Build on Linux
|
||||
if: startsWith(matrix.os, 'ubuntu')
|
||||
run: |
|
||||
pnpm dist:linux
|
||||
pnpm dist:linux:deb-arm64
|
||||
pnpm dist:linux:rpm-arm64
|
||||
|
||||
- name: Build on Windows
|
||||
if: startsWith(matrix.os, 'windows')
|
||||
run: |
|
||||
pnpm dist:win
|
||||
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: build-artifacts-${{ matrix.os }}
|
||||
path: pack/
|
||||
retention-days: 7
|
||||
if-no-files-found: error
|
||||
|
||||
comment:
|
||||
name: Comment on PR
|
||||
needs: [check-permissions, build]
|
||||
if: always() && needs.check-permissions.outputs.has-write-access == 'true'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Create comment
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const runId = context.runId;
|
||||
const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
|
||||
|
||||
const buildResult = '${{ needs.build.result }}';
|
||||
|
||||
let comment;
|
||||
if (buildResult === 'success') {
|
||||
comment = `## 🚀 Build Artifacts Ready!
|
||||
|
||||
The builds have completed successfully. You can download the artifacts from the workflow run:
|
||||
|
||||
**[📦 Download Artifacts](${runUrl})**
|
||||
|
||||
### Available builds:
|
||||
- **Windows**: \`build-artifacts-windows-latest\`
|
||||
- **macOS**: \`build-artifacts-macos-latest\`
|
||||
- **Linux**: \`build-artifacts-ubuntu-latest\`
|
||||
|
||||
*Note: Artifacts are available for 7 days.*`;
|
||||
} else if (buildResult === 'failure') {
|
||||
comment = `## ❌ Build Failed
|
||||
|
||||
Unfortunately, one or more builds failed. Please check the workflow run for details:
|
||||
|
||||
**[View Workflow Run](${runUrl})**`;
|
||||
} else {
|
||||
comment = `## ⚠️ Build Status: ${buildResult}
|
||||
|
||||
The build process completed with status: **${buildResult}**
|
||||
|
||||
**[View Workflow Run](${runUrl})**`;
|
||||
}
|
||||
|
||||
github.rest.issues.createComment({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: comment
|
||||
});
|
||||
42
.github/workflows/reviewdog.yml
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
name: reviewdog
|
||||
|
||||
on: [pull_request_target]
|
||||
|
||||
env:
|
||||
NODE_VERSION: "22.x"
|
||||
|
||||
jobs:
|
||||
eslint:
|
||||
if: github.event.pull_request.draft == false
|
||||
name: runner / eslint
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
checks: write
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
run_install: false
|
||||
|
||||
- name: Setup NodeJS
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- uses: reviewdog/action-eslint@v1.34.0
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
reporter: github-pr-review # Change reporter.
|
||||
eslint_flags: './src'
|
||||
fail_level: error
|
||||
6
.github/workflows/winget-submission.yml
vendored
@ -22,9 +22,9 @@ jobs:
|
||||
- name: Submit package to Windows Package Manager Community Repository
|
||||
uses: vedantmgoyal2009/winget-releaser@main
|
||||
with:
|
||||
identifier: th-ch.YouTubeMusic
|
||||
installers-regex: '^YouTube-Music-Web-Setup-[\d\.]+\.exe$'
|
||||
identifier: pear-devs.PearDesktop
|
||||
installers-regex: '^Pear-Desktop-Web-Setup-[\d\.]+\.exe$'
|
||||
version: ${{ env.WINGET_TAG_NAME }}
|
||||
release-tag: ${{ inputs.tag_name || github.event.release.tag_name }}
|
||||
token: ${{ secrets.WINGET_ACC_TOKEN }}
|
||||
fork-user: youtube-music-winget
|
||||
fork-user: pear-desktop-winget
|
||||
|
||||
204
README.md
@ -1,44 +1,39 @@
|
||||
<div align="center">
|
||||
|
||||
# YouTube Music
|
||||
# :pear: Pear Desktop
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/eslint.config.mjs)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
[](https://github.com/pear-devs/pear-desktop/releases/)
|
||||
[](https://github.com/pear-devs/pear-desktop/blob/master/license)
|
||||
[](https://github.com/pear-devs/pear-desktop/blob/master/eslint.config.mjs)
|
||||
[](https://GitHub.com/pear-devs/pear-desktop/releases/)
|
||||
[](https://GitHub.com/pear-devs/pear-desktop/releases/)
|
||||
<!--[](https://aur.archlinux.org/packages/pear-desktop-bin)-->
|
||||
[](https://snyk.io/test/github/pear-devs/pear-desktop)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
<!---->
|
||||
|
||||
- Native look & feel extension
|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Read this in other languages: [한국어](./docs/readme/README-ko.md), [Française](./docs/readme/README-fr.md), [Íslenska](./docs/readme/README-is.md), [Español](./docs/readme/README-es.md), [Pусский](./docs/readme/README-ru.md), [Українська](./docs/readme/README-uk.md), [Magyar](./docs/readme/README-hu.md), [Português](./docs/readme/README-pt.md), [日本語](./docs/readme/README-ja.md)
|
||||
|
||||
**Electron wrapper around YouTube Music featuring:**
|
||||
|
||||
- Native look & feel, aims at keeping the original interface
|
||||
- Framework for custom plugins: change YouTube Music to your needs (style, content, features), enable/disable plugins in
|
||||
one click
|
||||
|
||||
## Demo Image
|
||||
|
||||
| Player Screen (album color theme & ambient light) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
> [!IMPORTANT]
|
||||
> ⚠️ Disclaimer
|
||||
>
|
||||
> **No Affiliation**
|
||||
>
|
||||
> This project, and its contributors, are not affiliated with, authorized by, endorsed by, or in any way officially connected with Google LLC, YouTube, or any of their subsidiaries or affiliates. **This is an independent, non-profit, and unofficial extension developed by a team of volunteers with the goal of providing a desktop experience.**
|
||||
>
|
||||
> **Trademarks**
|
||||
>
|
||||
> The names "Google" and "YouTube Music", as well as related names, marks, emblems, and images, are registered trademarks of their respective owners. Any use of these trademarks is for identification and reference purposes only and does not imply any association with the trademark holder. We have no intention of infringing upon these trademarks or causing harm to the trademark holders.
|
||||
>
|
||||
> **Limitation of Liability**
|
||||
>
|
||||
> This application (extension) is provided "AS IS", and you use it at your own risk. In no event shall the developers or contributors be liable for any claim, damages, or other liability, including any legal consequences, arising from, out of, or in connection with the software or the use or other dealings in the software. The responsibility for any and all outcomes of using this software rests entirely with the user.
|
||||
|
||||
## Content
|
||||
|
||||
- [Features](#features)
|
||||
- [Available plugins](#available-plugins)
|
||||
- [Translation](#translation)
|
||||
- [Download](#download)
|
||||
- [Arch Linux](#arch-linux)
|
||||
@ -56,173 +51,63 @@ Read this in other languages: [한국어](./docs/readme/README-ko.md), [Françai
|
||||
- [License](#license)
|
||||
- [FAQ](#faq)
|
||||
|
||||
## Features:
|
||||
|
||||
- **Auto confirm when paused** (Always Enabled): disable
|
||||
the ["Continue Watching?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png)
|
||||
popup that pause music after a certain time
|
||||
|
||||
- And more ...
|
||||
|
||||
## Available plugins:
|
||||
|
||||
- **Ad Blocker**: Block all ads and tracking out of the box
|
||||
|
||||
- **Album Actions**: Adds Undislike, Dislike, Like, and Unlike buttons to apply this to all songs in a playlist or album
|
||||
|
||||
- **Album Color Theme**: Applies a dynamic theme and visual effects based on the album color palette
|
||||
|
||||
- **Ambient Mode**: Applies a lighting effect by casting gentle colors from the video, into your screen’s background
|
||||
|
||||
- **Audio Compressor**: Apply compression to audio (lowers the volume of the loudest parts of the signal and raises the
|
||||
volume of the softest parts)
|
||||
|
||||
- **Blur Navigation Bar**: makes navigation bar transparent and blurry
|
||||
|
||||
- **Bypass Age Restrictions**: bypass YouTube's age verification
|
||||
|
||||
- **Captions Selector**: Enable captions
|
||||
|
||||
- **Compact Sidebar**: Always set the sidebar in compact mode
|
||||
|
||||
- **Crossfade**: Crossfade between songs
|
||||
|
||||
- **Disable Autoplay**: Makes every song start in "paused" mode
|
||||
|
||||
- **[Discord](https://discord.com/) Rich Presence**: Show your friends what you listen to
|
||||
with [Rich Presence](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)
|
||||
|
||||
- **Downloader**: downloads
|
||||
MP3 [directly from the interface](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Equalizer**: add filters to boost or cut specific range of frequencies (e.g. bass booster)
|
||||
|
||||
- **Exponential Volume**: Makes the volume
|
||||
slider [exponential](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) so it's easier to
|
||||
select lower volumes
|
||||
|
||||
- **In-App Menu**: [gives bars a fancy, dark look](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||
|
||||
> (see [this post](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709) if you have problem
|
||||
accessing the menu after enabling this plugin and hide-menu option)
|
||||
|
||||
- **Scrobbler**: Adds scrobbling support for [Last.fm](https://www.last.fm/) and [ListenBrainz](https://listenbrainz.org/)
|
||||
|
||||
- **Lumia Stream**: Adds [Lumia Stream](https://lumiastream.com/) support
|
||||
|
||||
- **Lyrics Genius**: Adds lyrics support for most songs
|
||||
|
||||
- **Music Together**: Share a playlist with others. When the host plays a song, everyone else will hear the same song
|
||||
|
||||
- **Navigation**: Next/Back navigation arrows directly integrated in the interface, like in your favorite browser
|
||||
|
||||
- **No Google Login**: Remove Google login buttons and links from the interface
|
||||
|
||||
- **Notifications**: Display a notification when a song starts
|
||||
playing ([interactive notifications](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png)
|
||||
are available on windows)
|
||||
|
||||
- **Picture-in-picture**: allows to switch the app to picture-in-picture mode
|
||||
|
||||
- **Playback Speed**: Listen fast, listen
|
||||
slow! [Adds a slider that controls song speed](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
|
||||
|
||||
- **Precise Volume**: Control the volume precisely using mousewheel/hotkeys, with a custom hud and customizable volume
|
||||
steps
|
||||
|
||||
- **Shortcuts (& MPRIS)**: Allows setting global hotkeys for playback (play/pause/next/previous) +
|
||||
disable [media osd](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png)
|
||||
by overriding media keys + enable Ctrl/CMD + F to search + enable linux mpris support for
|
||||
mediakeys + [custom hotkeys](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50)
|
||||
for [advanced users](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)
|
||||
|
||||
- **Skip Disliked Song**: Skips disliked songs
|
||||
|
||||
- **Skip Silences**: Automatically skip silenced sections
|
||||
|
||||
- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): Automatically Skips non-music parts like intro/outro or
|
||||
parts of music videos where the song isn't playing
|
||||
|
||||
- **Synced Lyrics**: Provides synced lyrics to songs, using providers like [LRClib](https://lrclib.net).
|
||||
|
||||
- **Taskbar Media Control**: Control playback from
|
||||
your [Windows taskbar](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)
|
||||
|
||||
- **TouchBar**: Custom TouchBar layout for macOS
|
||||
|
||||
- **Tuna OBS**: Integration with [OBS](https://obsproject.com/)'s
|
||||
plugin [Tuna](https://obsproject.com/forum/resources/tuna.843/)
|
||||
|
||||
- **Unobtrusive Player**: Prevents the player from popping up when playing a song
|
||||
|
||||
- **Video Quality Changer**: Allows changing the video quality with
|
||||
a [button](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) on
|
||||
the video overlay
|
||||
|
||||
- **Video Toggle**: Adds
|
||||
a [button](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) to
|
||||
switch between Video/Song mode. can also optionally remove the whole video tab
|
||||
|
||||
- **Visualizer**: Different music visualizers
|
||||
|
||||
|
||||
## Translation
|
||||
|
||||
You can help with translation on [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||
You can help with translation on [Hosted Weblate](https://bit.ly/48n5YF7).
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="translation status" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="translation status 2" />
|
||||
<a href="https://bit.ly/48n5YF7/">
|
||||
<img src="https://bit.ly/4q83L6S" alt="translation status" />
|
||||
<img src="https://bit.ly/4h3zBxo" alt="translation status 2" />
|
||||
</a>
|
||||
|
||||
## Download
|
||||
|
||||
You can check out the [latest release](https://github.com/th-ch/youtube-music/releases/latest) to quickly find the
|
||||
You can check out the [latest release](https://github.com/pear-devs/pear-desktop/releases/latest) to quickly find the
|
||||
latest version.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Install the [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) package from the AUR. For AUR installation instructions, take a look at
|
||||
Install the [`pear-desktop`](https://aur.archlinux.org/packages/pear-desktop) package from the AUR. For AUR installation instructions, take a look at
|
||||
this [wiki page](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||
|
||||
### macOS
|
||||
|
||||
You can install the app using Homebrew (see the [cask definition](https://github.com/th-ch/homebrew-youtube-music)):
|
||||
You can install the app using Homebrew (see the [cask definition](https://github.com/pear-devs/pear-desktop-homebrew)):
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
brew install pear-devs/pear-desktop
|
||||
```
|
||||
|
||||
If you install the app manually and get an error "is damaged and can’t be opened." when launching the app, run the following in the Terminal:
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
/usr/bin/xattr -cr /Applications/Pear\ Desktop.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
You can use the [Scoop package manager](https://scoop.sh) to install the `youtube-music` package from
|
||||
You can use the [Scoop package manager](https://scoop.sh) to install the `pear-desktop` package from
|
||||
the [`extras` bucket](https://github.com/ScoopInstaller/Extras).
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
scoop install extras/pear-desktop
|
||||
```
|
||||
|
||||
Alternately you can use [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), Windows 11s
|
||||
official CLI package manager to install the `th-ch.YouTubeMusic` package.
|
||||
official CLI package manager to install the `pear-devs.pear-desktop` package.
|
||||
|
||||
*Note: Microsoft Defender SmartScreen might block the installation since it is from an "unknown publisher". This is also
|
||||
true for the manual installation when trying to run the executable(.exe) after a manual download here on github (same
|
||||
file).*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
winget install pear-devs.pear-desktop
|
||||
```
|
||||
|
||||
#### How to install without a network connection? (in Windows)
|
||||
|
||||
- Download the `*.nsis.7z` file for _your device architecture_ in [release page](https://github.com/th-ch/youtube-music/releases/latest).
|
||||
- Download the `*.nsis.7z` file for _your device architecture_ in [release page](https://github.com/pear-devs/pear-desktop/releases/latest).
|
||||
- `x64` for 64-bit Windows
|
||||
- `ia32` for 32-bit Windows
|
||||
- `arm64` for ARM64 Windows
|
||||
@ -239,8 +124,8 @@ Some predefined themes are available in https://github.com/kerichdev/themes-for-
|
||||
## Dev
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
git clone https://github.com/pear-devs/pear-desktop
|
||||
cd pear-desktop
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
@ -305,7 +190,7 @@ export default createPlugin({
|
||||
console.log(await context.ipc.invoke('some-event'));
|
||||
},
|
||||
// Only renderer available hook
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
onPlayerApiReady(api, context) {
|
||||
// set plugin config easily
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
@ -334,7 +219,7 @@ import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic will show a restart dialog
|
||||
restartNeeded: true, // if value is true, pear-desktop will show a restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
@ -355,8 +240,7 @@ export default createPlugin({
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
renderer() {
|
||||
// Remove the login button
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
console.log('hello from renderer');
|
||||
} // define renderer hook
|
||||
});
|
||||
```
|
||||
@ -397,7 +281,7 @@ Uses [Playwright](https://playwright.dev/) to test the app.
|
||||
|
||||
## License
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
MIT © [pear-devs](https://github.com/pear-devs/pear-desktop)
|
||||
|
||||
## FAQ
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Cannot load YouTube Music</title>
|
||||
<title>Cannot load Pear Desktop</title>
|
||||
<style>
|
||||
body {
|
||||
background: #000;
|
||||
@ -43,7 +43,7 @@
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<p>Cannot load YouTube Music… Internet disconnected?</p>
|
||||
<p>Cannot load Pear Desktop… Internet disconnected?</p>
|
||||
<a class="button" href="#" onclick="reload()">Retry</a>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
35
assets/generated/icons/mac/icon.icon/Assets/SVG Image.svg
Normal file
@ -0,0 +1,35 @@
|
||||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_d_18_2)">
|
||||
<circle cx="512" cy="512" r="410" fill="url(#paint0_linear_18_2)"/>
|
||||
<circle cx="512" cy="512" r="402" stroke="url(#paint1_radial_18_2)" stroke-opacity="0.5" stroke-width="16"/>
|
||||
</g>
|
||||
<path d="M675 505.072C680.333 508.152 680.333 515.849 675 518.928L436.5 656.626C431.167 659.705 424.5 655.857 424.5 649.698V374.302C424.5 368.24 430.96 364.415 436.249 367.234L436.5 367.374L675 505.072Z" fill="url(#paint2_linear_18_2)" stroke="url(#paint3_linear_18_2)" stroke-width="8" stroke-linejoin="round"/>
|
||||
<defs>
|
||||
<filter id="filter0_d_18_2" x="78" y="90" width="868" height="868" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="12"/>
|
||||
<feGaussianBlur stdDeviation="12"/>
|
||||
<feComposite in2="hardAlpha" operator="out"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.866667 0 0 0 0 0.141176 0 0 0 0 0.462745 0 0 0 0.4 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_18_2"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_18_2" result="shape"/>
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear_18_2" x1="102" y1="102" x2="922" y2="922" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FF632F"/>
|
||||
<stop offset="1" stop-color="#DC148C"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="paint1_radial_18_2" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(512 512) rotate(45) scale(579.828)">
|
||||
<stop offset="0.68" stop-color="white" stop-opacity="0"/>
|
||||
<stop offset="0.72" stop-color="white"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="paint2_linear_18_2" x1="512" y1="329" x2="512" y2="695" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0.4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_18_2" x1="512" y1="329" x2="512" y2="695" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white" stop-opacity="0"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0.5"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
67
assets/generated/icons/mac/icon.icon/icon.json
Normal file
@ -0,0 +1,67 @@
|
||||
{
|
||||
"fill" : {
|
||||
"linear-gradient" : [
|
||||
"display-p3:1.00000,1.00000,1.00000,1.00000",
|
||||
"srgb:0.84314,0.84314,0.84314,1.00000"
|
||||
],
|
||||
"orientation" : {
|
||||
"start" : {
|
||||
"x" : 0.5,
|
||||
"y" : 0
|
||||
},
|
||||
"stop" : {
|
||||
"x" : 0.5,
|
||||
"y" : 0.7
|
||||
}
|
||||
}
|
||||
},
|
||||
"groups" : [
|
||||
{
|
||||
"blur-material" : null,
|
||||
"hidden" : false,
|
||||
"layers" : [
|
||||
{
|
||||
"blend-mode-specializations" : [
|
||||
{
|
||||
"appearance" : "dark",
|
||||
"value" : "normal"
|
||||
}
|
||||
],
|
||||
"image-name" : "SVG Image.svg",
|
||||
"name" : "transparent-icon",
|
||||
"opacity-specializations" : [
|
||||
{
|
||||
"value" : 1
|
||||
},
|
||||
{
|
||||
"appearance" : "dark",
|
||||
"value" : 1
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"name" : "group",
|
||||
"opacity-specializations" : [
|
||||
{
|
||||
"appearance" : "dark",
|
||||
"value" : 0.8
|
||||
}
|
||||
],
|
||||
"shadow" : {
|
||||
"kind" : "layer-color",
|
||||
"opacity" : 0.5
|
||||
},
|
||||
"specular" : true,
|
||||
"translucency" : {
|
||||
"enabled" : false,
|
||||
"value" : 0.5
|
||||
}
|
||||
}
|
||||
],
|
||||
"supported-platforms" : {
|
||||
"circles" : [
|
||||
"watchOS"
|
||||
],
|
||||
"squares" : "shared"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 600 B |
|
Before Width: | Height: | Size: 931 B |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 353 KiB After Width: | Height: | Size: 36 KiB |
BIN
assets/icon.png
Normal file
|
After Width: | Height: | Size: 790 KiB |
40
assets/icon.svg
Normal file
@ -0,0 +1,40 @@
|
||||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_d_18_2)">
|
||||
<circle cx="512" cy="512" r="410" fill="url(#paint0_linear_18_2)" />
|
||||
<circle cx="512" cy="512" r="402" stroke="url(#paint1_radial_18_2)" stroke-opacity="0.5" stroke-width="16" />
|
||||
</g>
|
||||
<path
|
||||
d="M675 505.072C680.333 508.152 680.333 515.849 675 518.928L436.5 656.626C431.167 659.705 424.5 655.857 424.5 649.698V374.302C424.5 368.24 430.96 364.415 436.249 367.234L436.5 367.374L675 505.072Z"
|
||||
fill="url(#paint2_linear_18_2)" stroke="url(#paint3_linear_18_2)" stroke-width="8" stroke-linejoin="round" />
|
||||
<defs>
|
||||
<filter id="filter0_d_18_2" x="78" y="90" width="868" height="868" filterUnits="userSpaceOnUse"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
||||
result="hardAlpha" />
|
||||
<feOffset dy="12" />
|
||||
<feGaussianBlur stdDeviation="12" />
|
||||
<feComposite in2="hardAlpha" operator="out" />
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.866667 0 0 0 0 0.141176 0 0 0 0 0.462745 0 0 0 0.4 0" />
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_18_2" />
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_18_2" result="shape" />
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear_18_2" x1="102" y1="102" x2="922" y2="922" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FF632F" />
|
||||
<stop offset="1" stop-color="#DC148C" />
|
||||
</linearGradient>
|
||||
<radialGradient id="paint1_radial_18_2" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(512 512) rotate(45) scale(579.828)">
|
||||
<stop offset="0.68" stop-color="white" stop-opacity="0" />
|
||||
<stop offset="0.72" stop-color="white" />
|
||||
</radialGradient>
|
||||
<linearGradient id="paint2_linear_18_2" x1="512" y1="329" x2="512" y2="695" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white" />
|
||||
<stop offset="1" stop-color="white" stop-opacity="0.4" />
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_18_2" x1="512" y1="329" x2="512" y2="695" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white" stop-opacity="0" />
|
||||
<stop offset="1" stop-color="white" stop-opacity="0.5" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
607
assets/mdui.css
Normal file
@ -0,0 +1,607 @@
|
||||
:root {
|
||||
--mdui-breakpoint-xs: 0px;
|
||||
--mdui-breakpoint-sm: 600px;
|
||||
--mdui-breakpoint-md: 840px;
|
||||
--mdui-breakpoint-lg: 1080px;
|
||||
--mdui-breakpoint-xl: 1440px;
|
||||
--mdui-breakpoint-xxl: 1920px;
|
||||
}
|
||||
|
||||
:root {
|
||||
--mdui-color-primary-light: 103, 80, 164;
|
||||
--mdui-color-primary-container-light: 234, 221, 255;
|
||||
--mdui-color-on-primary-light: 255, 255, 255;
|
||||
--mdui-color-on-primary-container-light: 33, 0, 94;
|
||||
--mdui-color-inverse-primary-light: 208, 188, 255;
|
||||
--mdui-color-secondary-light: 98, 91, 113;
|
||||
--mdui-color-secondary-container-light: 232, 222, 248;
|
||||
--mdui-color-on-secondary-light: 255, 255, 255;
|
||||
--mdui-color-on-secondary-container-light: 30, 25, 43;
|
||||
--mdui-color-tertiary-light: 125, 82, 96;
|
||||
--mdui-color-tertiary-container-light: 255, 216, 228;
|
||||
--mdui-color-on-tertiary-light: 255, 255, 255;
|
||||
--mdui-color-on-tertiary-container-light: 55, 11, 30;
|
||||
--mdui-color-surface-light: 254, 247, 255;
|
||||
--mdui-color-surface-dim-light: 222, 216, 225;
|
||||
--mdui-color-surface-bright-light: 254, 247, 255;
|
||||
--mdui-color-surface-container-lowest-light: 255, 255, 255;
|
||||
--mdui-color-surface-container-low-light: 247, 242, 250;
|
||||
--mdui-color-surface-container-light: 243, 237, 247;
|
||||
--mdui-color-surface-container-high-light: 236, 230, 240;
|
||||
--mdui-color-surface-container-highest-light: 230, 224, 233;
|
||||
--mdui-color-surface-variant-light: 231, 224, 236;
|
||||
--mdui-color-on-surface-light: 28, 27, 31;
|
||||
--mdui-color-on-surface-variant-light: 73, 69, 78;
|
||||
--mdui-color-inverse-surface-light: 49, 48, 51;
|
||||
--mdui-color-inverse-on-surface-light: 244, 239, 244;
|
||||
--mdui-color-background-light: 254, 247, 255;
|
||||
--mdui-color-on-background-light: 28, 27, 31;
|
||||
--mdui-color-error-light: 179, 38, 30;
|
||||
--mdui-color-error-container-light: 249, 222, 220;
|
||||
--mdui-color-on-error-light: 255, 255, 255;
|
||||
--mdui-color-on-error-container-light: 65, 14, 11;
|
||||
--mdui-color-outline-light: 121, 116, 126;
|
||||
--mdui-color-outline-variant-light: 196, 199, 197;
|
||||
--mdui-color-shadow-light: 0, 0, 0;
|
||||
--mdui-color-surface-tint-color-light: 103, 80, 164;
|
||||
--mdui-color-scrim-light: 0, 0, 0;
|
||||
--mdui-color-primary-dark: 208, 188, 255;
|
||||
--mdui-color-primary-container-dark: 79, 55, 139;
|
||||
--mdui-color-on-primary-dark: 55, 30, 115;
|
||||
--mdui-color-on-primary-container-dark: 234, 221, 255;
|
||||
--mdui-color-inverse-primary-dark: 103, 80, 164;
|
||||
--mdui-color-secondary-dark: 204, 194, 220;
|
||||
--mdui-color-secondary-container-dark: 74, 68, 88;
|
||||
--mdui-color-on-secondary-dark: 51, 45, 65;
|
||||
--mdui-color-on-secondary-container-dark: 232, 222, 248;
|
||||
--mdui-color-tertiary-dark: 239, 184, 200;
|
||||
--mdui-color-tertiary-container-dark: 99, 59, 72;
|
||||
--mdui-color-on-tertiary-dark: 73, 37, 50;
|
||||
--mdui-color-on-tertiary-container-dark: 255, 216, 228;
|
||||
--mdui-color-surface-dark: 20, 18, 24;
|
||||
--mdui-color-surface-dim-dark: 20, 18, 24;
|
||||
--mdui-color-surface-bright-dark: 59, 56, 62;
|
||||
--mdui-color-surface-container-lowest-dark: 15, 13, 19;
|
||||
--mdui-color-surface-container-low-dark: 29, 27, 32;
|
||||
--mdui-color-surface-container-dark: 33, 31, 38;
|
||||
--mdui-color-surface-container-high-dark: 43, 41, 48;
|
||||
--mdui-color-surface-container-highest-dark: 54, 52, 59;
|
||||
--mdui-color-surface-variant-dark: 73, 69, 79;
|
||||
--mdui-color-on-surface-dark: 230, 225, 229;
|
||||
--mdui-color-on-surface-variant-dark: 202, 196, 208;
|
||||
--mdui-color-inverse-surface-dark: 230, 225, 229;
|
||||
--mdui-color-inverse-on-surface-dark: 49, 48, 51;
|
||||
--mdui-color-background-dark: 20, 18, 24;
|
||||
--mdui-color-on-background-dark: 230, 225, 229;
|
||||
--mdui-color-error-dark: 242, 184, 181;
|
||||
--mdui-color-error-container-dark: 140, 29, 24;
|
||||
--mdui-color-on-error-dark: 96, 20, 16;
|
||||
--mdui-color-on-error-container-dark: 249, 222, 220;
|
||||
--mdui-color-outline-dark: 147, 143, 153;
|
||||
--mdui-color-outline-variant-dark: 68, 71, 70;
|
||||
--mdui-color-shadow-dark: 0, 0, 0;
|
||||
--mdui-color-surface-tint-color-dark: 208, 188, 255;
|
||||
--mdui-color-scrim-dark: 0, 0, 0;
|
||||
}
|
||||
|
||||
.mdui-theme-dark,
|
||||
:root {
|
||||
color-scheme: dark;
|
||||
--mdui-color-primary: var(--mdui-color-primary-dark);
|
||||
--mdui-color-primary-container: var(--mdui-color-primary-container-dark);
|
||||
--mdui-color-on-primary: var(--mdui-color-on-primary-dark);
|
||||
--mdui-color-on-primary-container: var(
|
||||
--mdui-color-on-primary-container-dark
|
||||
);
|
||||
--mdui-color-inverse-primary: var(--mdui-color-inverse-primary-dark);
|
||||
--mdui-color-secondary: var(--mdui-color-secondary-dark);
|
||||
--mdui-color-secondary-container: var(--mdui-color-secondary-container-dark);
|
||||
--mdui-color-on-secondary: var(--mdui-color-on-secondary-dark);
|
||||
--mdui-color-on-secondary-container: var(
|
||||
--mdui-color-on-secondary-container-dark
|
||||
);
|
||||
--mdui-color-tertiary: var(--mdui-color-tertiary-dark);
|
||||
--mdui-color-tertiary-container: var(--mdui-color-tertiary-container-dark);
|
||||
--mdui-color-on-tertiary: var(--mdui-color-on-tertiary-dark);
|
||||
--mdui-color-on-tertiary-container: var(
|
||||
--mdui-color-on-tertiary-container-dark
|
||||
);
|
||||
--mdui-color-surface: var(--mdui-color-surface-dark);
|
||||
--mdui-color-surface-dim: var(--mdui-color-surface-dim-dark);
|
||||
--mdui-color-surface-bright: var(--mdui-color-surface-bright-dark);
|
||||
--mdui-color-surface-container-lowest: var(
|
||||
--mdui-color-surface-container-lowest-dark
|
||||
);
|
||||
--mdui-color-surface-container-low: var(
|
||||
--mdui-color-surface-container-low-dark
|
||||
);
|
||||
--mdui-color-surface-container: var(--mdui-color-surface-container-dark);
|
||||
--mdui-color-surface-container-high: var(
|
||||
--mdui-color-surface-container-high-dark
|
||||
);
|
||||
--mdui-color-surface-container-highest: var(
|
||||
--mdui-color-surface-container-highest-dark
|
||||
);
|
||||
--mdui-color-surface-variant: var(--mdui-color-surface-variant-dark);
|
||||
--mdui-color-on-surface: var(--mdui-color-on-surface-dark);
|
||||
--mdui-color-on-surface-variant: var(--mdui-color-on-surface-variant-dark);
|
||||
--mdui-color-inverse-surface: var(--mdui-color-inverse-surface-dark);
|
||||
--mdui-color-inverse-on-surface: var(--mdui-color-inverse-on-surface-dark);
|
||||
--mdui-color-background: var(--mdui-color-background-dark);
|
||||
--mdui-color-on-background: var(--mdui-color-on-background-dark);
|
||||
--mdui-color-error: var(--mdui-color-error-dark);
|
||||
--mdui-color-error-container: var(--mdui-color-error-container-dark);
|
||||
--mdui-color-on-error: var(--mdui-color-on-error-dark);
|
||||
--mdui-color-on-error-container: var(--mdui-color-on-error-container-dark);
|
||||
--mdui-color-outline: var(--mdui-color-outline-dark);
|
||||
--mdui-color-outline-variant: var(--mdui-color-outline-variant-dark);
|
||||
--mdui-color-shadow: var(--mdui-color-shadow-dark);
|
||||
--mdui-color-surface-tint-color: var(--mdui-color-surface-tint-color-dark);
|
||||
--mdui-color-scrim: var(--mdui-color-scrim-dark);
|
||||
color: rgb(var(--mdui-color-on-background));
|
||||
background-color: rgb(var(--mdui-color-background));
|
||||
}
|
||||
|
||||
:root {
|
||||
--mdui-elevation-level0: none;
|
||||
--mdui-elevation-level1: 0 0.5px 1.5px 0 rgba(var(--mdui-color-shadow), 19%),
|
||||
0 0 1px 0 rgba(var(--mdui-color-shadow), 3.9%);
|
||||
--mdui-elevation-level2: 0 0.85px 3px 0 rgba(var(--mdui-color-shadow), 19%),
|
||||
0 0.25px 1px 0 rgba(var(--mdui-color-shadow), 3.9%);
|
||||
--mdui-elevation-level3: 0 1.25px 5px 0 rgba(var(--mdui-color-shadow), 19%),
|
||||
0 0.3333px 1.5px 0 rgba(var(--mdui-color-shadow), 3.9%);
|
||||
--mdui-elevation-level4: 0 1.85px 6.25px 0 rgba(var(--mdui-color-shadow), 19%),
|
||||
0 0.5px 1.75px 0 rgba(var(--mdui-color-shadow), 3.9%);
|
||||
--mdui-elevation-level5: 0 2.75px 9px 0 rgba(var(--mdui-color-shadow), 19%),
|
||||
0 0.25px 3px 0 rgba(var(--mdui-color-shadow), 3.9%);
|
||||
}
|
||||
|
||||
:root {
|
||||
--mdui-motion-easing-linear: cubic-bezier(0, 0, 1, 1);
|
||||
--mdui-motion-easing-standard: cubic-bezier(0.2, 0, 0, 1);
|
||||
--mdui-motion-easing-standard-accelerate: cubic-bezier(0.3, 0, 1, 1);
|
||||
--mdui-motion-easing-standard-decelerate: cubic-bezier(0, 0, 0, 1);
|
||||
--mdui-motion-easing-emphasized: var(--mdui-motion-easing-standard);
|
||||
--mdui-motion-easing-emphasized-accelerate: cubic-bezier(0.3, 0, 0.8, 0.15);
|
||||
--mdui-motion-easing-emphasized-decelerate: cubic-bezier(0.05, 0.7, 0.1, 1);
|
||||
--mdui-motion-duration-short1: 50ms;
|
||||
--mdui-motion-duration-short2: 100ms;
|
||||
--mdui-motion-duration-short3: 150ms;
|
||||
--mdui-motion-duration-short4: 200ms;
|
||||
--mdui-motion-duration-medium1: 250ms;
|
||||
--mdui-motion-duration-medium2: 300ms;
|
||||
--mdui-motion-duration-medium3: 350ms;
|
||||
--mdui-motion-duration-medium4: 400ms;
|
||||
--mdui-motion-duration-long1: 450ms;
|
||||
--mdui-motion-duration-long2: 500ms;
|
||||
--mdui-motion-duration-long3: 550ms;
|
||||
--mdui-motion-duration-long4: 600ms;
|
||||
--mdui-motion-duration-extra-long1: 700ms;
|
||||
--mdui-motion-duration-extra-long2: 800ms;
|
||||
--mdui-motion-duration-extra-long3: 900ms;
|
||||
--mdui-motion-duration-extra-long4: 1000ms;
|
||||
}
|
||||
|
||||
.mdui-prose {
|
||||
line-height: 1.75;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.mdui-prose :first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.mdui-prose :last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.mdui-prose code,
|
||||
.mdui-prose kbd,
|
||||
.mdui-prose pre,
|
||||
.mdui-prose pre tt,
|
||||
.mdui-prose samp {
|
||||
font-family: Consolas, Courier, 'Courier New', monospace;
|
||||
}
|
||||
|
||||
.mdui-prose caption {
|
||||
text-align: left;
|
||||
}
|
||||
.mdui-prose [draggable='true'],
|
||||
.mdui-prose [draggable] {
|
||||
cursor: move;
|
||||
}
|
||||
.mdui-prose [draggable='false'] {
|
||||
cursor: inherit;
|
||||
}
|
||||
.mdui-prose dl,
|
||||
.mdui-prose form,
|
||||
.mdui-prose ol,
|
||||
.mdui-prose p,
|
||||
.mdui-prose ul {
|
||||
margin-top: 1.25em;
|
||||
margin-bottom: 1.25em;
|
||||
}
|
||||
.mdui-prose a {
|
||||
text-decoration: none;
|
||||
outline: 0;
|
||||
color: rgb(var(--mdui-color-primary));
|
||||
}
|
||||
.mdui-prose a:focus,
|
||||
.mdui-prose a:hover {
|
||||
border-bottom: 0.0625rem solid rgb(var(--mdui-color-primary));
|
||||
}
|
||||
.mdui-prose small {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
.mdui-prose strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
.mdui-prose blockquote {
|
||||
margin: 1.6em 2em;
|
||||
padding-left: 1em;
|
||||
border-left: 0.25rem solid rgb(var(--mdui-color-surface-variant));
|
||||
}
|
||||
@media only screen and (max-width: 599.98px) {
|
||||
.mdui-prose blockquote {
|
||||
margin: 1.6em 0;
|
||||
}
|
||||
}
|
||||
.mdui-prose blockquote footer {
|
||||
font-size: 86%;
|
||||
color: rgb(var(--mdui-color-on-surface-variant));
|
||||
}
|
||||
.mdui-prose mark {
|
||||
color: inherit;
|
||||
background-color: rgb(var(--mdui-color-secondary-container));
|
||||
border-bottom: 0.0625rem solid rgb(var(--mdui-color-secondary));
|
||||
margin: 0 0.375rem;
|
||||
padding: 0.125rem;
|
||||
}
|
||||
.mdui-prose h1,
|
||||
.mdui-prose h2,
|
||||
.mdui-prose h3,
|
||||
.mdui-prose h4,
|
||||
.mdui-prose h5,
|
||||
.mdui-prose h6 {
|
||||
font-weight: 400;
|
||||
}
|
||||
.mdui-prose h1 small,
|
||||
.mdui-prose h2 small,
|
||||
.mdui-prose h3 small,
|
||||
.mdui-prose h4 small,
|
||||
.mdui-prose h5 small,
|
||||
.mdui-prose h6 small {
|
||||
font-weight: inherit;
|
||||
font-size: 65%;
|
||||
color: rgb(var(--mdui-color-on-surface-variant));
|
||||
}
|
||||
.mdui-prose h1 strong,
|
||||
.mdui-prose h2 strong,
|
||||
.mdui-prose h3 strong,
|
||||
.mdui-prose h4 strong,
|
||||
.mdui-prose h5 strong,
|
||||
.mdui-prose h6 strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
.mdui-prose h1 {
|
||||
font-size: 2.5em;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1.25em;
|
||||
line-height: 1.1111;
|
||||
}
|
||||
.mdui-prose h2 {
|
||||
font-size: 1.875em;
|
||||
margin-top: 2.25em;
|
||||
margin-bottom: 1.125em;
|
||||
line-height: 1.3333;
|
||||
}
|
||||
.mdui-prose h3 {
|
||||
font-size: 1.5em;
|
||||
margin-top: 2em;
|
||||
margin-bottom: 1em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.mdui-prose h4 {
|
||||
font-size: 1.25em;
|
||||
margin-top: 1.875em;
|
||||
margin-bottom: 0.875em;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.mdui-prose h2 + *,
|
||||
.mdui-prose h3 + *,
|
||||
.mdui-prose h4 + *,
|
||||
.mdui-prose hr + * {
|
||||
margin-top: 0;
|
||||
}
|
||||
.mdui-prose code,
|
||||
.mdui-prose kbd {
|
||||
font-size: 0.875em;
|
||||
color: rgb(var(--mdui-color-on-surface-container));
|
||||
background-color: rgba(var(--mdui-color-surface-variant), 0.28);
|
||||
padding: 0.125rem 0.375rem;
|
||||
border-radius: var(--mdui-shape-corner-extra-small);
|
||||
}
|
||||
.mdui-prose kbd {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
.mdui-prose abbr[title] {
|
||||
text-decoration: none;
|
||||
cursor: help;
|
||||
border-bottom: 0.0625rem dotted rgb(var(--mdui-color-on-surface-variant));
|
||||
}
|
||||
.mdui-prose ins,
|
||||
.mdui-prose u {
|
||||
text-decoration: none;
|
||||
border-bottom: 0.0625rem solid rgb(var(--mdui-color-on-surface-variant));
|
||||
}
|
||||
.mdui-prose del {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
.mdui-prose hr {
|
||||
margin-top: 3em;
|
||||
margin-bottom: 3em;
|
||||
border: none;
|
||||
border-bottom: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
|
||||
}
|
||||
.mdui-prose pre {
|
||||
margin-top: 1.7143em;
|
||||
margin-bottom: 1.7143em;
|
||||
}
|
||||
.mdui-prose pre code {
|
||||
padding: 0.8571em 1.1429em;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
background-color: rgb(var(--mdui-color-surface-container));
|
||||
color: rgb(var(--mdui-color-on-surface-container));
|
||||
border-radius: var(--mdui-shape-corner-extra-small);
|
||||
}
|
||||
.mdui-prose ol,
|
||||
.mdui-prose ul {
|
||||
padding-left: 1.625em;
|
||||
}
|
||||
.mdui-prose ul {
|
||||
list-style-type: disc;
|
||||
}
|
||||
.mdui-prose ol {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
.mdui-prose ol[type='A'] {
|
||||
list-style-type: upper-alpha;
|
||||
}
|
||||
.mdui-prose ol[type='a'] {
|
||||
list-style-type: lower-alpha;
|
||||
}
|
||||
.mdui-prose ol[type='I'] {
|
||||
list-style-type: upper-roman;
|
||||
}
|
||||
.mdui-prose ol[type='i'] {
|
||||
list-style-type: lower-roman;
|
||||
}
|
||||
.mdui-prose ol[type='1'] {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
.mdui-prose li {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
.mdui-prose ol > li,
|
||||
.mdui-prose ul > li {
|
||||
padding-left: 0.375em;
|
||||
}
|
||||
.mdui-prose ol > li > p,
|
||||
.mdui-prose ul > li > p {
|
||||
margin-top: 0.75em;
|
||||
margin-bottom: 0.75em;
|
||||
}
|
||||
.mdui-prose ol > li > :first-child,
|
||||
.mdui-prose ul > li > :first-child {
|
||||
margin-top: 1.25em;
|
||||
}
|
||||
.mdui-prose ol > li > :last-child,
|
||||
.mdui-prose ul > li > :last-child {
|
||||
margin-bottom: 1.25em;
|
||||
}
|
||||
.mdui-prose ol > li::marker {
|
||||
font-weight: 400;
|
||||
color: rgb(var(--mdui-color-on-surface-variant));
|
||||
}
|
||||
.mdui-prose ul > li::marker {
|
||||
color: rgb(var(--mdui-color-on-surface-variant));
|
||||
}
|
||||
.mdui-prose ol ol,
|
||||
.mdui-prose ol ul,
|
||||
.mdui-prose ul ol,
|
||||
.mdui-prose ul ul {
|
||||
margin-top: 0.75em;
|
||||
margin-bottom: 0.75em;
|
||||
}
|
||||
.mdui-prose fieldset,
|
||||
.mdui-prose img {
|
||||
border: none;
|
||||
}
|
||||
.mdui-prose figure,
|
||||
.mdui-prose img,
|
||||
.mdui-prose video {
|
||||
margin-top: 2em;
|
||||
margin-bottom: 2em;
|
||||
max-width: 100%;
|
||||
}
|
||||
.mdui-prose figure > * {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.mdui-prose figcaption {
|
||||
font-size: 0.875em;
|
||||
line-height: 1.4286;
|
||||
margin-top: 0.8571em;
|
||||
color: rgb(var(--mdui-color-on-surface-variant));
|
||||
}
|
||||
.mdui-prose figcaption:empty::before {
|
||||
z-index: -1;
|
||||
cursor: text;
|
||||
content: attr(placeholder);
|
||||
color: rgb(var(--mdui-color-on-surface-variant));
|
||||
}
|
||||
.mdui-prose table {
|
||||
margin-top: 2em;
|
||||
margin-bottom: 2em;
|
||||
border: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
|
||||
border-radius: var(--mdui-shape-corner-large);
|
||||
}
|
||||
.mdui-table {
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
margin-top: 2em;
|
||||
margin-bottom: 2em;
|
||||
border: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
|
||||
border-radius: var(--mdui-shape-corner-large);
|
||||
}
|
||||
.mdui-table table {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
}
|
||||
.mdui-prose table,
|
||||
.mdui-table table {
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
.mdui-prose td,
|
||||
.mdui-prose th,
|
||||
.mdui-table td,
|
||||
.mdui-table th {
|
||||
border-top: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
|
||||
}
|
||||
.mdui-prose td:not(:first-child),
|
||||
.mdui-prose th:not(:first-child),
|
||||
.mdui-table td:not(:first-child),
|
||||
.mdui-table th:not(:first-child) {
|
||||
border-left: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
|
||||
}
|
||||
.mdui-prose td:not(:last-child),
|
||||
.mdui-prose th:not(:last-child),
|
||||
.mdui-table td:not(:last-child),
|
||||
.mdui-table th:not(:last-child) {
|
||||
border-right: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
|
||||
}
|
||||
.mdui-prose tfoot td,
|
||||
.mdui-prose tfoot th,
|
||||
.mdui-prose thead td,
|
||||
.mdui-prose thead th,
|
||||
.mdui-table tfoot td,
|
||||
.mdui-table tfoot th,
|
||||
.mdui-table thead td,
|
||||
.mdui-table thead th {
|
||||
position: relative;
|
||||
vertical-align: middle;
|
||||
padding: 1.125rem 1rem;
|
||||
font-weight: var(--mdui-typescale-title-medium-weight);
|
||||
letter-spacing: var(--mdui-typescale-title-medium-tracking);
|
||||
line-height: var(--mdui-typescale-title-medium-line-height);
|
||||
color: rgb(var(--mdui-color-on-surface-variant));
|
||||
box-shadow: var(--mdui-elevation-level1);
|
||||
}
|
||||
.mdui-prose tbody td,
|
||||
.mdui-prose tbody th,
|
||||
.mdui-table tbody td,
|
||||
.mdui-table tbody th {
|
||||
padding: 0.875rem 1rem;
|
||||
}
|
||||
.mdui-prose tbody th,
|
||||
.mdui-table tbody th {
|
||||
vertical-align: middle;
|
||||
font-weight: inherit;
|
||||
}
|
||||
.mdui-prose tbody td,
|
||||
.mdui-table tbody td {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
.mdui-prose tbody:first-child tr:first-child td,
|
||||
.mdui-prose thead:first-child tr:first-child th,
|
||||
.mdui-table tbody:first-child tr:first-child td,
|
||||
.mdui-table thead:first-child tr:first-child th {
|
||||
border-top: 0;
|
||||
}
|
||||
:root {
|
||||
--mdui-shape-corner-none: 0;
|
||||
--mdui-shape-corner-extra-small: 0.25rem;
|
||||
--mdui-shape-corner-small: 0.5rem;
|
||||
--mdui-shape-corner-medium: 0.75rem;
|
||||
--mdui-shape-corner-large: 1rem;
|
||||
--mdui-shape-corner-extra-large: 1.75rem;
|
||||
--mdui-shape-corner-full: 1000rem;
|
||||
}
|
||||
:root {
|
||||
--mdui-state-layer-hover: 0.08;
|
||||
--mdui-state-layer-focus: 0.12;
|
||||
--mdui-state-layer-pressed: 0.12;
|
||||
--mdui-state-layer-dragged: 0.16;
|
||||
}
|
||||
:root {
|
||||
--mdui-typescale-display-large-weight: 400;
|
||||
--mdui-typescale-display-medium-weight: 400;
|
||||
--mdui-typescale-display-small-weight: 400;
|
||||
--mdui-typescale-display-large-line-height: 4rem;
|
||||
--mdui-typescale-display-medium-line-height: 3.25rem;
|
||||
--mdui-typescale-display-small-line-height: 2.75rem;
|
||||
--mdui-typescale-display-large-size: 3.5625rem;
|
||||
--mdui-typescale-display-medium-size: 2.8125rem;
|
||||
--mdui-typescale-display-small-size: 2.25rem;
|
||||
--mdui-typescale-display-large-tracking: 0rem;
|
||||
--mdui-typescale-display-medium-tracking: 0rem;
|
||||
--mdui-typescale-display-small-tracking: 0rem;
|
||||
--mdui-typescale-headline-large-weight: 400;
|
||||
--mdui-typescale-headline-medium-weight: 400;
|
||||
--mdui-typescale-headline-small-weight: 400;
|
||||
--mdui-typescale-headline-large-line-height: 2.5rem;
|
||||
--mdui-typescale-headline-medium-line-height: 2.25rem;
|
||||
--mdui-typescale-headline-small-line-height: 2rem;
|
||||
--mdui-typescale-headline-large-size: 2rem;
|
||||
--mdui-typescale-headline-medium-size: 1.75rem;
|
||||
--mdui-typescale-headline-small-size: 1.5rem;
|
||||
--mdui-typescale-headline-large-tracking: 0rem;
|
||||
--mdui-typescale-headline-medium-tracking: 0rem;
|
||||
--mdui-typescale-headline-small-tracking: 0rem;
|
||||
--mdui-typescale-title-large-weight: 400;
|
||||
--mdui-typescale-title-medium-weight: 500;
|
||||
--mdui-typescale-title-small-weight: 500;
|
||||
--mdui-typescale-title-large-line-height: 1.75rem;
|
||||
--mdui-typescale-title-medium-line-height: 1.5rem;
|
||||
--mdui-typescale-title-small-line-height: 1.25rem;
|
||||
--mdui-typescale-title-large-size: 1.375rem;
|
||||
--mdui-typescale-title-medium-size: 1rem;
|
||||
--mdui-typescale-title-small-size: 0.875rem;
|
||||
--mdui-typescale-title-large-tracking: 0rem;
|
||||
--mdui-typescale-title-medium-tracking: 0.009375rem;
|
||||
--mdui-typescale-title-small-tracking: 0.00625rem;
|
||||
--mdui-typescale-label-large-weight: 500;
|
||||
--mdui-typescale-label-medium-weight: 500;
|
||||
--mdui-typescale-label-small-weight: 500;
|
||||
--mdui-typescale-label-large-line-height: 1.25rem;
|
||||
--mdui-typescale-label-medium-line-height: 1rem;
|
||||
--mdui-typescale-label-small-line-height: 0.375rem;
|
||||
--mdui-typescale-label-large-size: 0.875rem;
|
||||
--mdui-typescale-label-medium-size: 0.75rem;
|
||||
--mdui-typescale-label-small-size: 0.6875rem;
|
||||
--mdui-typescale-label-large-tracking: 0.00625rem;
|
||||
--mdui-typescale-label-medium-tracking: 0.03125rem;
|
||||
--mdui-typescale-label-small-tracking: 0.03125rem;
|
||||
--mdui-typescale-body-large-weight: 400;
|
||||
--mdui-typescale-body-medium-weight: 400;
|
||||
--mdui-typescale-body-small-weight: 400;
|
||||
--mdui-typescale-body-large-line-height: 1.5rem;
|
||||
--mdui-typescale-body-medium-line-height: 1.25rem;
|
||||
--mdui-typescale-body-small-line-height: 1rem;
|
||||
--mdui-typescale-body-large-size: 1rem;
|
||||
--mdui-typescale-body-medium-size: 0.875rem;
|
||||
--mdui-typescale-body-small-size: 0.75rem;
|
||||
--mdui-typescale-body-large-tracking: 0.009375rem;
|
||||
--mdui-typescale-body-medium-tracking: 0.015625rem;
|
||||
--mdui-typescale-body-small-tracking: 0.025rem;
|
||||
}
|
||||
.mdui-lock-screen {
|
||||
overflow: hidden !important;
|
||||
}
|
||||
BIN
assets/tray-paused-white.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
assets/tray-paused.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
assets/tray-white.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
assets/tray.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 40 KiB |
@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 176 176" width="32" height="32">
|
||||
<circle fill="red" cx="88" cy="88" r="88"/>
|
||||
<path fill="#FFF"
|
||||
d="M88 46c23.1 0 42 18.8 42 42s-18.8 42-42 42-42-18.8-42-42 18.9-42 42-42m0-4c-25.4 0-46 20.6-46 46s20.6 46 46 46 46-20.6 46-46-20.6-46-46-46z"/>
|
||||
<path fill="#FFF" d="M72 111l39-24-39-22z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 353 B |
3710
changelog.md
|
Before Width: | Height: | Size: 247 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 365 B |
|
Before Width: | Height: | Size: 493 B |
|
Before Width: | Height: | Size: 860 B |
@ -1,9 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400">
|
||||
<g transform="translate(183.604 196.396)" stroke="#fff" stroke-width="2.23">
|
||||
<path
|
||||
style="line-height:normal;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration-line:none;text-transform:none;block-progression:tb;marker:none"
|
||||
d="M-116.99 106.245l31.82 31.82 236.31-236.31-31.82-31.82z" color="#000" font-weight="400"
|
||||
font-family="Sans" overflow="visible" fill="#fff" stroke="none"/>
|
||||
<circle r="171.304" cy="4" cx="16" fill="none" stroke-width="44.6"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 588 B |
@ -1,23 +0,0 @@
|
||||
<svg width="1440" height="347" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="a">
|
||||
<stop stop-color="#606483" stop-opacity="0" offset="0%"/>
|
||||
<stop stop-color="#0B0D19" stop-opacity=".72" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="50%" y1="0%" x2="39.334%" y2="79.282%" id="b">
|
||||
<stop stop-color="#0B0D19" offset="0%"/>
|
||||
<stop stop-color="#0B0D19" stop-opacity="0" offset="100%"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path
|
||||
d="M177.486 208.219c78.18 89.285 218.65-81.067 218.65-119.337 0-38.27-86.408-69.295-193-69.295-106.59 0-193 31.024-193 69.295 0 38.27 89.17 30.051 167.35 119.337z"
|
||||
transform="rotate(6 -140.175 3980.948)" fill="url(#a)"/>
|
||||
<path
|
||||
d="M252.464 335.471c101.27 115.965 283.227-105.29 283.227-154.996 0-49.705-111.929-90-250-90s-250 40.295-250 90c0 49.706 115.503 39.032 216.773 154.996z"
|
||||
fill="url(#a)" transform="rotate(24 321.92 -247.724)"/>
|
||||
<path
|
||||
d="M302.512 242.909c88.025 32.428 156-25.04 156-55.93 0-30.888-69.844-55.928-156-55.928-86.157 0-156 25.04-156 55.929 0 30.888 67.974 23.5 156 55.929z"
|
||||
fill="url(#b)" transform="rotate(24 338.741 -285.505)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
@ -1,32 +0,0 @@
|
||||
<svg width="1440" height="318" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<linearGradient x1="38.706%" y1="-187.115%" x2="18.675%" y2="110.984%" id="a">
|
||||
<stop stop-color="#FFF" stop-opacity="0" offset="0%"/>
|
||||
<stop stop-color="#c3352e" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="c">
|
||||
<stop stop-color="#606483" stop-opacity="0" offset="0%"/>
|
||||
<stop stop-color="#0B0D19" stop-opacity=".72" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="50%" y1="0%" x2="39.334%" y2="79.282%" id="d">
|
||||
<stop stop-color="#0B0D19" stop-opacity=".32" offset="0%"/>
|
||||
<stop stop-color="#0B0D19" stop-opacity="0" offset="100%"/>
|
||||
</linearGradient>
|
||||
<filter id="b">
|
||||
<feTurbulence type="fractalNoise" numOctaves="2" baseFrequency=".3" result="turb"/>
|
||||
<feComposite in="turb" operator="arithmetic" k1=".1" k2=".1" k3=".1" k4=".1" result="result1"/>
|
||||
<feComposite operator="in" in="result1" in2="SourceGraphic" result="finalFilter"/>
|
||||
<feBlend mode="multiply" in="finalFilter" in2="SourceGraphic"/>
|
||||
</filter>
|
||||
</defs>
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path d="M88.494 90c67.04 7.177 161.094-24.753 224.996-90H.2c25.3 48.079 42.361 85.083 88.294 90z"
|
||||
transform="translate(1051)" fill="url(#a)" filter="url(#b)"/>
|
||||
<path
|
||||
d="M250.464 367.471c101.27 115.965 283.227-105.29 283.227-154.996 0-49.705-111.929-90-250-90s-250 40.295-250 90c0 49.706 115.503 39.032 216.773 154.996z"
|
||||
fill="url(#c)" transform="rotate(143 810.285 354.367)"/>
|
||||
<path
|
||||
d="M373.408 256.178c88.026 32.429 156-25.04 156-55.929 0-30.888-69.843-55.929-156-55.929-86.156 0-156 25.04-156 55.93 0 30.888 67.975 23.5 156 55.928z"
|
||||
fill="url(#d)" transform="rotate(136 905.21 332.676)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
@ -1,5 +0,0 @@
|
||||
<svg width="96" height="48" xmlns="http://www.w3.org/2000/svg">
|
||||
<text y="35" x="48" fill="#fff" stroke-width="0" font-size="36" font-family="Monospace" text-anchor="middle"
|
||||
stroke="#fff"></>
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 224 B |
@ -1,8 +0,0 @@
|
||||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="style-scope yt-icon" style="width:100%;height:100%"
|
||||
pointer-events="none" display="block" fill="#fff">
|
||||
<g class="style-scope yt-icon">
|
||||
<path
|
||||
d="M25.462 19.105v6.848H4.515v-6.848H.489v8.861c0 1.111.9 2.012 2.016 2.012h24.967c1.115 0 2.016-.9 2.016-2.012v-8.861h-4.026zM14.62 18.426l-5.764-6.965s-.877-.828.074-.828h3.248V9.217.494S12.049 0 12.793 0h4.572c.536 0 .524.416.524.416V10.424h2.998c1.154 0 .285.867.285.867s-4.904 6.51-5.588 7.193c-.492.495-.964-.058-.964-.058z"
|
||||
class="style-scope yt-icon"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 634 B |
@ -1,35 +0,0 @@
|
||||
<svg width="1440" height="582" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="a">
|
||||
<stop stop-color="#606483" stop-opacity="0" offset="0%"/>
|
||||
<stop stop-color="#363636" stop-opacity=".72" offset="100%"/>
|
||||
</linearGradient>
|
||||
<linearGradient x1="50%" y1="0%" x2="39.334%" y2="79.282%" id="b">
|
||||
<stop stop-color="#363636" offset="0%"/>
|
||||
<stop stop-color="#363636" stop-opacity="0" offset="100%"/>
|
||||
</linearGradient>
|
||||
<radialGradient cx="33.3%" cy="43.394%" fx="33.3%" fy="43.394%" r="57.93%"
|
||||
gradientTransform="matrix(.24796 -.96592 .92535 .25883 -.151 .643)" id="c">
|
||||
<stop stop-color="#c3352e" stop-opacity="0" offset="0%"/>
|
||||
<stop stop-color="#c3352e" stop-opacity=".64" offset="51.712%"/>
|
||||
<stop stop-color="#c3352e" stop-opacity=".24" offset="100%"/>
|
||||
</radialGradient>
|
||||
<filter id="d">
|
||||
<feTurbulence type="fractalNoise" numOctaves="2" baseFrequency=".3" result="turb"/>
|
||||
<feComposite in="turb" operator="arithmetic" k1=".1" k2=".1" k3=".1" k4=".1" result="result1"/>
|
||||
<feComposite operator="in" in="result1" in2="SourceGraphic" result="finalFilter"/>
|
||||
<feBlend mode="multiply" in="finalFilter" in2="SourceGraphic"/>
|
||||
</filter>
|
||||
</defs>
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path
|
||||
d="M252.464 335.471c101.27 115.965 283.227-105.29 283.227-154.996 0-49.705-111.929-90-250-90s-250 40.295-250 90c0 49.706 115.503 39.032 216.773 154.996z"
|
||||
fill="url(#a)" transform="rotate(24 -272.272 -82.087)"/>
|
||||
<path
|
||||
d="M302.512 242.909c88.025 32.428 156-25.04 156-55.93 0-30.888-69.844-55.928-156-55.928-86.157 0-156 25.04-156 55.929 0 30.888 67.974 23.5 156 55.929z"
|
||||
fill="url(#b)" transform="rotate(24 -255.451 -119.868)"/>
|
||||
<path
|
||||
d="M103.064 315.218c128.156 12.998 192.38 157.059 218.627 106.632 26.247-50.427-44.059-106.456 60.397-202.707 104.457-96.252-143.2-285.785-172.392-122.551C180.503 259.825-25.091 302.22 103.064 315.218z"
|
||||
transform="translate(1176 -33)" fill="url(#c)" filter="url(#d)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" fill="#fff">
|
||||
<path
|
||||
d="M45.563 29.174l-22-15A1 1 0 0022 15v30a.999.999 0 001.563.826l22-15a1 1 0 000-1.652zM24 43.107V16.893L43.225 30 24 43.107z"/>
|
||||
<path
|
||||
d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 391 B |
|
Before Width: | Height: | Size: 721 KiB |
@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 176 176" width="32" height="32">
|
||||
<circle fill="red" cx="88" cy="88" r="88"/>
|
||||
<path fill="#FFF"
|
||||
d="M88 46c23.1 0 42 18.8 42 42s-18.8 42-42 42-42-18.8-42-42 18.9-42 42-42m0-4c-25.4 0-46 20.6-46 46s20.6 46 46 46 46-20.6 46-46-20.6-46-46-46z"/>
|
||||
<path fill="#FFF" d="M72 111l39-24-39-22z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 360 B |
490
docs/index.html
@ -1,490 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
|
||||
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
|
||||
<meta content="width=device-width, initial-scale=1" name="viewport"/>
|
||||
<title>YouTube Music Desktop App (Unofficial)</title>
|
||||
<link
|
||||
href="./favicon/favicon.ico"
|
||||
rel="icon"
|
||||
sizes="16x16"
|
||||
type="image/x-icon"
|
||||
/>
|
||||
<link
|
||||
href="./favicon/favicon_32.png"
|
||||
rel="icon"
|
||||
sizes="32x32"
|
||||
type="image/png"
|
||||
/>
|
||||
<link
|
||||
href="./favicon/favicon_48.png"
|
||||
rel="icon"
|
||||
sizes="48x48"
|
||||
type="image/png"
|
||||
/>
|
||||
<link
|
||||
href="./favicon/favicon_96.png"
|
||||
rel="icon"
|
||||
sizes="96x96"
|
||||
type="image/png"
|
||||
/>
|
||||
<link
|
||||
href="./favicon/favicon_144.png"
|
||||
rel="icon"
|
||||
sizes="144x144"
|
||||
type="image/png"
|
||||
/>
|
||||
|
||||
<meta content="#131313" name="theme-color"/>
|
||||
<meta
|
||||
content="YouTube Music Unofficial Desktop App with built-in ad blocker and downloader"
|
||||
name="description"
|
||||
/>
|
||||
<meta
|
||||
content="YouTube Music Desktop App"
|
||||
property="og:site_name"
|
||||
/>
|
||||
<meta
|
||||
class="meta-url"
|
||||
content="https://th-ch.github.io/youtube-music"
|
||||
property="og:url"
|
||||
/>
|
||||
<meta content="website" property="og:type"/>
|
||||
<meta
|
||||
class="meta-url"
|
||||
content="https://th-ch.github.io/youtube-music"
|
||||
name="twitter:url"
|
||||
/>
|
||||
|
||||
<link href="./style/fonts.css" rel="stylesheet"/>
|
||||
<link href="./style/style.css" rel="stylesheet"/>
|
||||
<script src="https://unpkg.com/scrollreveal"></script>
|
||||
</head>
|
||||
<body class="has-animations vsc-initialized" style="height: 100%;">
|
||||
<div class="body-wrap boxed-container">
|
||||
<header class="site-header text-light">
|
||||
<div class="container">
|
||||
<div class="site-header-inner">
|
||||
<div class="brand header-brand">
|
||||
<h1 class="m-0">
|
||||
<a href="https://github.com/th-ch/youtube-music">
|
||||
<img
|
||||
alt="YouTube Music"
|
||||
class="header-logo-image"
|
||||
src="./img/youtube-music.svg"
|
||||
/>
|
||||
</a>
|
||||
</h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="hero text-center text-light">
|
||||
<div class="hero-bg"></div>
|
||||
<div class="hero-particles-container">
|
||||
<canvas id="hero-particles"></canvas>
|
||||
</div>
|
||||
<div class="container-sm">
|
||||
<div class="hero-inner">
|
||||
<div class="hero-copy">
|
||||
<h1 class="hero-title mt-0">
|
||||
Custom YouTube Music Desktop App
|
||||
</h1>
|
||||
<p class="hero-paragraph">
|
||||
Open source, cross-platform, unofficial YouTube Music Desktop
|
||||
App with built-in <strong>ad blocker</strong> and
|
||||
<strong>downloader</strong>
|
||||
</p>
|
||||
<div class="hero-cta">
|
||||
<a
|
||||
class="button button-primary button-wide-mobile"
|
||||
href="https://github.com/th-ch/youtube-music/releases/latest"
|
||||
>Download</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mockup-container">
|
||||
<div class="mockup-bg">
|
||||
<img
|
||||
alt="YouTube Music"
|
||||
id="mockup-header-img"
|
||||
src="./img/youtube-music.png"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="features-extended section">
|
||||
<div class="features-extended-inner section-inner">
|
||||
<div class="features-extended-wrap">
|
||||
<div class="container">
|
||||
<div class="feature-extended">
|
||||
<div class="feature-extended-image">
|
||||
<img
|
||||
alt="Adblocker"
|
||||
class="device-mockup"
|
||||
data-sr-id="0"
|
||||
src="./img/adblock.svg"
|
||||
style="
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transform: matrix3d(
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
);
|
||||
transition: opacity 0.6s
|
||||
cubic-bezier(0.215, 0.61, 0.355, 1) 0s,
|
||||
transform 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;
|
||||
"
|
||||
width="100px"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="feature-extended-body"
|
||||
data-sr-id="5"
|
||||
style="
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transform: matrix3d(
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
);
|
||||
transition: opacity 0.6s
|
||||
cubic-bezier(0.215, 0.61, 0.355, 1) 0s,
|
||||
transform 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;
|
||||
"
|
||||
>
|
||||
<h3 class="mt-0 mb-16">Built-in adblocker</h3>
|
||||
<p class="m-0">Block all ads and tracking out of the box</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="feature-extended">
|
||||
<div class="feature-extended-image">
|
||||
<img
|
||||
alt="Downloader"
|
||||
class="device-mockup"
|
||||
data-sr-id="2"
|
||||
src="./img/download.svg"
|
||||
style="
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transform: matrix3d(
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
);
|
||||
transition: opacity 0.6s
|
||||
cubic-bezier(0.215, 0.61, 0.355, 1) 0s,
|
||||
transform 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="feature-extended-body"
|
||||
data-sr-id="6"
|
||||
style="
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transform: matrix3d(
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
);
|
||||
transition: opacity 0.6s
|
||||
cubic-bezier(0.215, 0.61, 0.355, 1) 0s,
|
||||
transform 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;
|
||||
"
|
||||
>
|
||||
<h3 class="mt-0 mb-16">Built-in downloader</h3>
|
||||
<p class="m-0">
|
||||
Download (like youtube-dl) to custom formats (mp3, opus,
|
||||
etc) directly from the interface
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="feature-extended">
|
||||
<div class="feature-extended-image">
|
||||
<img
|
||||
alt="Plugins"
|
||||
class="device-mockup"
|
||||
data-sr-id="3"
|
||||
src="./img/plugins.svg"
|
||||
style="
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transform: matrix3d(
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
);
|
||||
transition: opacity 0.6s
|
||||
cubic-bezier(0.215, 0.61, 0.355, 1) 0s,
|
||||
transform 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="feature-extended-body"
|
||||
data-sr-id="7"
|
||||
style="
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transform: matrix3d(
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
);
|
||||
transition: opacity 0.6s
|
||||
cubic-bezier(0.215, 0.61, 0.355, 1) 0s,
|
||||
transform 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;
|
||||
"
|
||||
>
|
||||
<h3 class="mt-0 mb-16">Many other plugins in one click</h3>
|
||||
<p class="m-0">
|
||||
Enhance your user experience with media keys, integrations
|
||||
(Discord), cosmetic filters, notifications, TouchBar,
|
||||
auto-unpause and many more! Every plugin can be enabled or
|
||||
disabled in one click.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="feature-extended">
|
||||
<div class="feature-extended-image">
|
||||
<img
|
||||
alt="Code"
|
||||
class="device-mockup"
|
||||
data-sr-id="4"
|
||||
src="./img/code.svg"
|
||||
style="
|
||||
visibility: visible;
|
||||
width: 200%;
|
||||
opacity: 1;
|
||||
transform: matrix3d(
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
);
|
||||
transition: opacity 0.6s
|
||||
cubic-bezier(0.215, 0.61, 0.355, 1) 0s,
|
||||
transform 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="feature-extended-body"
|
||||
data-sr-id="8"
|
||||
style="
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transform: matrix3d(
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
);
|
||||
transition: opacity 0.6s
|
||||
cubic-bezier(0.215, 0.61, 0.355, 1) 0s,
|
||||
transform 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) 0s;
|
||||
"
|
||||
>
|
||||
<h3 class="mt-0 mb-16">Open source & Cross platform</h3>
|
||||
<p class="m-0">
|
||||
Available for Windows (installer and portable), Mac and
|
||||
Linux (AppImage, deb, etc)
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="main-particles-container">
|
||||
<canvas id="main-particles"></canvas>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="footer-particles-container">
|
||||
<canvas id="footer-particles"></canvas>
|
||||
</div>
|
||||
<div class="site-footer-top">
|
||||
<section class="cta section text-light">
|
||||
<div class="container-sm">
|
||||
<div class="cta-inner section-inner">
|
||||
<div class="cta-header text-center">
|
||||
<h2 class="section-title mt-0">Download and/or contribute</h2>
|
||||
<p class="section-paragraph">Pull requests welcome!</p>
|
||||
<div class="cta-cta">
|
||||
<a
|
||||
class="button button-primary button-wide-mobile"
|
||||
href="https://github.com/th-ch/youtube-music"
|
||||
>Go to code</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<div class="site-footer-bottom">
|
||||
<div class="container">
|
||||
<div class="site-footer-inner">
|
||||
<div class="brand footer-brand">
|
||||
<a href="https://github.com/th-ch/youtube-music">
|
||||
<img alt="YouTube Music logo" src="./img/youtube-music.svg"/>
|
||||
</a>
|
||||
</div>
|
||||
<ul class="footer-links list-reset">
|
||||
<li>
|
||||
<a href="https://github.com/th-ch/youtube-music">Main page</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://github.com/th-ch/youtube-music/issues"
|
||||
>Issues</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://github.com/th-ch/youtube-music/pulls"
|
||||
>Pull requests</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="footer-social-links list-reset">
|
||||
<li>
|
||||
<a href="https://github.com/th-ch/youtube-music">
|
||||
<span class="screen-reader-text">GitHub</span>
|
||||
<svg
|
||||
height="16"
|
||||
viewBox="0 0 1792 1792"
|
||||
width="16"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M896 128q209 0 385.5 103t279.5 279.5 103 385.5q0 251-146.5 451.5t-378.5 277.5q-27 5-40-7t-13-30q0-3 .5-76.5t.5-134.5q0-97-52-142 57-6 102.5-18t94-39 81-66.5 53-105 20.5-150.5q0-119-79-206 37-91-8-204-28-9-81 11t-92 44l-38 24q-93-26-192-26t-192 26q-16-11-42.5-27t-83.5-38.5-85-13.5q-45 113-8 204-79 87-79 206 0 85 20.5 150t52.5 105 80.5 67 94 39 102.5 18q-39 36-49 103-21 10-45 15t-57 5-65.5-21.5-55.5-62.5q-19-32-48.5-52t-49.5-24l-20-3q-21 0-29 4.5t-5 11.5 9 14 13 12l7 5q22 10 43.5 38t31.5 51l10 23q13 38 44 61.5t67 30 69.5 7 55.5-3.5l23-4q0 38 .5 88.5t.5 54.5q0 18-13 30t-40 7q-232-77-378.5-277.5t-146.5-451.5q0-209 103-385.5t279.5-279.5 385.5-103zm-477 1103q3-7-7-12-10-3-13 2-3 7 7 12 9 6 13-2zm31 34q7-5-2-16-10-9-16-3-7 5 2 16 10 10 16 3zm30 45q9-7 0-19-8-13-17-6-9 5 0 18t17 7zm42 42q8-8-4-19-12-12-20-3-9 8 4 19 12 12 20 3zm57 25q3-11-13-16-15-4-19 7t13 15q15 6 19-6zm63 5q0-13-17-11-16 0-16 11 0 13 17 11 16 0 16-11zm58-10q-2-11-18-9-16 3-14 15t18 8 14-14z"
|
||||
fill="#fff"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="footer-copyright">© 2024 th-ch</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script src="./js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
268
docs/js/main.js
@ -1,268 +0,0 @@
|
||||
/* eslint-disable */
|
||||
|
||||
// Constants
|
||||
const element = document.documentElement;
|
||||
const { body } = document;
|
||||
const revealOnScroll = (window.sr = ScrollReveal({ mobile: false }));
|
||||
|
||||
// Load animations
|
||||
element.classList.remove('no-js');
|
||||
element.classList.add('js');
|
||||
window.addEventListener('load', () => {
|
||||
body.classList.add('is-loaded');
|
||||
});
|
||||
|
||||
if (body.classList.contains('has-animations')) {
|
||||
window.addEventListener('load', () => {
|
||||
revealOnScroll.reveal('.feature-extended .device-mockup', {
|
||||
duration: 600,
|
||||
distance: '100px',
|
||||
easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)',
|
||||
origin: 'bottom',
|
||||
viewFactor: 0.6,
|
||||
});
|
||||
revealOnScroll.reveal('.feature-extended .feature-extended-body', {
|
||||
duration: 600,
|
||||
distance: '40px',
|
||||
easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)',
|
||||
origin: 'top',
|
||||
viewFactor: 0.6,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Bubble canvas
|
||||
const bubbleCanvas = function (t) {
|
||||
const e = this;
|
||||
e.parentNode = t;
|
||||
e.setCanvasSize();
|
||||
window.addEventListener('resize', () => {
|
||||
e.setCanvasSize();
|
||||
});
|
||||
e.mouseX = 0;
|
||||
e.mouseY = 0;
|
||||
window.addEventListener('mousemove', (t) => {
|
||||
e.mouseX = t.clientX;
|
||||
e.mouseY = t.clientY;
|
||||
});
|
||||
e.randomise();
|
||||
};
|
||||
|
||||
bubbleCanvas.prototype.setCanvasSize = function () {
|
||||
this.canvasWidth = this.parentNode.clientWidth;
|
||||
this.canvasHeight = this.parentNode.clientHeight;
|
||||
};
|
||||
|
||||
bubbleCanvas.prototype.generateDecimalBetween = function (start, end) {
|
||||
return (Math.random() * (start - end) + end).toFixed(2);
|
||||
};
|
||||
|
||||
bubbleCanvas.prototype.update = function () {
|
||||
const t = this;
|
||||
t.translateX -= t.movementX;
|
||||
t.translateY -= t.movementY;
|
||||
t.posX += (t.mouseX / (t.staticity / t.magnetism) - t.posX) / t.smoothFactor;
|
||||
t.posY += (t.mouseY / (t.staticity / t.magnetism) - t.posY) / t.smoothFactor;
|
||||
if (
|
||||
t.translateY + t.posY < 0
|
||||
|| t.translateX + t.posX < 0
|
||||
|| t.translateX + t.posX > t.canvasWidth
|
||||
) {
|
||||
t.randomise();
|
||||
t.translateY = t.canvasHeight;
|
||||
}
|
||||
};
|
||||
|
||||
bubbleCanvas.prototype.randomise = function () {
|
||||
this.colors = ['195,53,46', '172,54,46'];
|
||||
|
||||
this.velocity = 20;
|
||||
this.smoothFactor = 50;
|
||||
this.staticity = 30;
|
||||
this.magnetism = 0.1 + 4 * Math.random();
|
||||
this.color = this.colors[Math.floor(Math.random() * this.colors.length)];
|
||||
this.alpha = this.generateDecimalBetween(5, 10) / 10;
|
||||
this.size = this.generateDecimalBetween(1, 4);
|
||||
this.posX = 0;
|
||||
this.posY = 0;
|
||||
this.movementX = this.generateDecimalBetween(-2, 2) / this.velocity;
|
||||
this.movementY = this.generateDecimalBetween(1, 20) / this.velocity;
|
||||
this.translateX = this.generateDecimalBetween(0, this.canvasWidth);
|
||||
this.translateY = this.generateDecimalBetween(0, this.canvasHeight);
|
||||
};
|
||||
|
||||
const drawBubbleCanvas = function (t) {
|
||||
this.canvas = document.getElementById(t);
|
||||
this.ctx = this.canvas.getContext('2d');
|
||||
this.dpr = window.devicePixelRatio;
|
||||
};
|
||||
|
||||
drawBubbleCanvas.prototype.start = function (bubbleDensity) {
|
||||
const t = this;
|
||||
t.bubbleDensity = bubbleDensity;
|
||||
t.setCanvasSize();
|
||||
window.addEventListener('resize', () => {
|
||||
t.setCanvasSize();
|
||||
});
|
||||
t.bubblesList = [];
|
||||
t.generateBubbles();
|
||||
t.animate();
|
||||
};
|
||||
|
||||
drawBubbleCanvas.prototype.setCanvasSize = function () {
|
||||
this.container = this.canvas.parentNode;
|
||||
this.w = this.container.offsetWidth;
|
||||
this.h = this.container.offsetHeight;
|
||||
this.wdpi = this.w * this.dpr;
|
||||
this.hdpi = this.h * this.dpr;
|
||||
this.canvas.width = this.wdpi;
|
||||
this.canvas.height = this.hdpi;
|
||||
this.canvas.style.width = this.w + 'px';
|
||||
this.canvas.style.height = this.h + 'px';
|
||||
this.ctx.scale(this.dpr, this.dpr);
|
||||
};
|
||||
|
||||
drawBubbleCanvas.prototype.animate = function () {
|
||||
const t = this;
|
||||
t.ctx.clearRect(0, 0, t.canvas.clientWidth, t.canvas.clientHeight);
|
||||
for (const e of t.bubblesList) {
|
||||
e.update();
|
||||
t.ctx.translate(e.translateX, e.translateY);
|
||||
t.ctx.beginPath();
|
||||
t.ctx.arc(e.posX, e.posY, e.size, 0, 2 * Math.PI);
|
||||
t.ctx.fillStyle = 'rgba(' + e.color + ',' + e.alpha + ')';
|
||||
t.ctx.fill();
|
||||
t.ctx.setTransform(t.dpr, 0, 0, t.dpr, 0, 0);
|
||||
}
|
||||
|
||||
requestAnimationFrame(this.animate.bind(this));
|
||||
};
|
||||
|
||||
drawBubbleCanvas.prototype.addBubble = function (t) {
|
||||
return this.bubblesList.push(t);
|
||||
};
|
||||
|
||||
drawBubbleCanvas.prototype.generateBubbles = function () {
|
||||
const t = this;
|
||||
for (let e = 0; e < t.bubbleDensity; e++) {
|
||||
t.addBubble(new bubbleCanvas(t.canvas.parentNode));
|
||||
}
|
||||
};
|
||||
|
||||
// Night sky with stars canvas
|
||||
const starCanvas = function (t) {
|
||||
this.canvas = document.getElementById(t);
|
||||
this.ctx = this.canvas.getContext('2d');
|
||||
this.dpr = window.devicePixelRatio;
|
||||
};
|
||||
|
||||
starCanvas.prototype.start = function () {
|
||||
let w;
|
||||
let h;
|
||||
|
||||
const setCanvasExtents = () => {
|
||||
w = this.canvas.parentNode.clientWidth;
|
||||
h = this.canvas.parentNode.clientHeight;
|
||||
this.canvas.width = w;
|
||||
this.canvas.height = h;
|
||||
};
|
||||
|
||||
setCanvasExtents();
|
||||
|
||||
window.addEventListener('resize', () => {
|
||||
setCanvasExtents();
|
||||
});
|
||||
|
||||
const makeStars = (count) => {
|
||||
const out = [];
|
||||
for (let i = 0; i < count; i++) {
|
||||
const s = {
|
||||
x: Math.random() * w - w / 2,
|
||||
y: Math.random() * h - h / 2,
|
||||
z: Math.random() * 1000,
|
||||
};
|
||||
out.push(s);
|
||||
}
|
||||
|
||||
return out;
|
||||
};
|
||||
|
||||
const stars = makeStars(10_000);
|
||||
|
||||
const clear = () => {
|
||||
this.ctx.fillStyle = '#212121';
|
||||
this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
|
||||
};
|
||||
|
||||
const putPixel = (x, y, brightness) => {
|
||||
const intensity = brightness * 255;
|
||||
const rgb = 'rgb(' + intensity + ',' + intensity + ',' + intensity + ')';
|
||||
this.ctx.beginPath();
|
||||
this.ctx.arc(x, y, 0.9, 0, 2 * Math.PI);
|
||||
this.ctx.fillStyle = rgb;
|
||||
this.ctx.fill();
|
||||
};
|
||||
|
||||
const moveStars = (distance) => {
|
||||
const count = stars.length;
|
||||
for (let i = 0; i < count; i++) {
|
||||
const s = stars[i];
|
||||
s.z -= distance;
|
||||
while (s.z <= 1) {
|
||||
s.z += 1000;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let previousTime;
|
||||
const init = (time) => {
|
||||
previousTime = time;
|
||||
requestAnimationFrame(tick);
|
||||
};
|
||||
|
||||
const tick = (time) => {
|
||||
const elapsed = time - previousTime;
|
||||
previousTime = time;
|
||||
|
||||
moveStars(elapsed * 0.1);
|
||||
|
||||
clear();
|
||||
|
||||
const cx = w / 2;
|
||||
const cy = h / 2;
|
||||
|
||||
const count = stars.length;
|
||||
for (let i = 0; i < count; i++) {
|
||||
const star = stars[i];
|
||||
|
||||
const x = cx + star.x / (star.z * 0.001);
|
||||
const y = cy + star.y / (star.z * 0.001);
|
||||
|
||||
if (x < 0 || x >= w || y < 0 || y >= h) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const d = star.z / 1000;
|
||||
const b = 1 - d * d;
|
||||
|
||||
putPixel(x, y, b);
|
||||
}
|
||||
|
||||
requestAnimationFrame(tick);
|
||||
};
|
||||
|
||||
requestAnimationFrame(init);
|
||||
};
|
||||
|
||||
// Start canvas animations
|
||||
window.addEventListener('load', () => {
|
||||
// Stars
|
||||
const headCanvas = new starCanvas('hero-particles');
|
||||
// Bubbles
|
||||
const footerCanvas = new drawBubbleCanvas('footer-particles');
|
||||
const mainCanvas = new drawBubbleCanvas('main-particles');
|
||||
|
||||
headCanvas.start();
|
||||
footerCanvas.start(30);
|
||||
mainCanvas.start(200);
|
||||
});
|
||||
@ -1,392 +0,0 @@
|
||||
<div align="center">
|
||||
|
||||
# YouTube Music
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="/web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Lee esto en otros idiomas: [🏴 Inglés](../../README.md), [🇰🇷 Coreano](./README-ko.md), [🇫🇷 Francés](./README-fr.md), [🇮🇸 Islandés](./README-is.md), [🇪🇸 Español](./README-es.md), [🇷🇺 Ruso](./README-ru.md), [🇺🇦 Ucraniano](./README-uk.md), [🇧🇷 Portugués](./README-pt.md), [🇯🇵 Japonés](./README-ja.md)
|
||||
|
||||
**Electron wrapper de YouTube Music con las siguientes características:**
|
||||
|
||||
- Apariencia y sensación nativa, tiene como objetivo mantener la interfaz original
|
||||
- Framework para plugins personalizados: cambia YouTube Music según tus necesidades (estilo, contenido, funciones), habilita/deshabilita plugins con un solo clic
|
||||
|
||||
## Imagen de demostración
|
||||
|
||||
| Pantalla del reproductor (color del álbum como tema y luz ambiental) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## Contenido
|
||||
|
||||
- [Características](#características)
|
||||
- [Plugins disponibles](#plugins-disponibles)
|
||||
- [Traducción](#traducción)
|
||||
- [Descarga](#descarga)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [macOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [Cómo instalar sin conexión a internet? (en Windows)](#cómo-instalar-sin-conexión-a-internet-en-windows)
|
||||
- [Temas](#temas)
|
||||
- [Dev](#dev)
|
||||
- [Crea tus propios plugins](#crea-tus-propios-plugins)
|
||||
- [Creación de un plugin](#creación-de-un-plugin)
|
||||
- [Casos de uso comunes](#casos-de-uso-comunes)
|
||||
- [Compilar](#compilar)
|
||||
- [Vista previa de producción](#vista-previa-de-producción)
|
||||
- [Tests](#tests)
|
||||
- [Licencia](#licencia)
|
||||
- [Preguntas frecuentes](#preguntas-frecuentes)
|
||||
|
||||
## Características:
|
||||
|
||||
- **Confirmación automática al pausar** (Siempre habilitado): desactiva
|
||||
el mensaje emergente ["¿Continuar reproduciendo?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png)
|
||||
que pausa la música después de cierto tiempo
|
||||
|
||||
- Y más ...
|
||||
|
||||
## Plugins disponibles:
|
||||
|
||||
- **Bloqueador de Anuncios**: Bloquea todos los anuncios y rastreadores de forma predeterminada
|
||||
|
||||
- **Acciones de Álbum**: Agrega botones de deshacer No me gusta, No me gusta, Me gusta, y Deshacer me gusta a todas las canciones de una lista de reproducción o álbum
|
||||
|
||||
- **Tema de Color del Álbum**: Aplica un tema dinámico y efectos visuales basados en la paleta de colores del álbum
|
||||
|
||||
- **Modo Ambiente**: Aplica un efecto de iluminación proyectando colores suaves del video en el fondo de tu pantalla
|
||||
|
||||
- **Compresor de Audio**: Aplica compresión al audio (reduce el volumen de las partes más fuertes de la señal y aumenta el
|
||||
volumen de las partes más suaves)
|
||||
|
||||
- **Barra de Navegación Difuminada**: hace que la barra de navegación sea transparente y borrosa
|
||||
|
||||
- **Omitir Restricciones de Edades**: omite la verificación de edad de YouTube
|
||||
|
||||
- **Selector de Subtítulos**: Habilita los subtítulos
|
||||
|
||||
- **Barra Lateral Compacta**: Siempre muestra la barra lateral en modo compacto
|
||||
|
||||
- **Crossfade**: Transición suave entre canciones
|
||||
|
||||
- **Desactivar Reproducción Automática**: Hace que cada canción comience en modo "pausado"
|
||||
|
||||
- **[Discord](https://discord.com/) Rich Presence**: Muestra a tus amigos lo que estás escuchando
|
||||
con [Rich Presence](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)
|
||||
|
||||
- **Descargador**: Descarga
|
||||
MP3 [directamente desde la interfaz](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Volumen Exponencial**: Hace que el control de volumen
|
||||
sea [exponencial](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) para facilitar la
|
||||
selección de volúmenes más bajos
|
||||
|
||||
- **Menú en la Aplicación**: [da a las barras un aspecto elegante y oscuro](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||
|
||||
> (consulta [esta publicación](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709) si tienes problemas
|
||||
para acceder al menú después de habilitar este plugin y la opción hide-menu)
|
||||
|
||||
- **Scrobbler**: Agrega soporte para scrobbling en [Last.fm](https://www.last.fm/) y [ListenBrainz](https://listenbrainz.org/)
|
||||
|
||||
- **Lumia Stream**: Agrega soporte para [Lumia Stream](https://lumiastream.com/)
|
||||
|
||||
- **Letras Genius**: Agrega soporte de letras para la mayoría de las canciones
|
||||
|
||||
- **Music Together**: Comparte una lista de reproducción con otros. Cuando el anfitrión reproduce una canción, todos los demás escucharán la misma canción
|
||||
|
||||
- **Navegación**: Flechas de siguiente/anterior integradas directamente en la interfaz, como en tu navegador favorito
|
||||
|
||||
- **Sin Inicio de Sesión de Google**: Elimina los botones y enlaces de inicio de sesión de Google de la interfaz
|
||||
|
||||
- **Notificaciones**: Muestra una notificación cuando comienza una canción
|
||||
a reproducirse ([notificaciones interactivas](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png)
|
||||
están disponibles en Windows)
|
||||
|
||||
- **Picture-in-picture**: permite cambiar la aplicación al modo picture-in-picture
|
||||
|
||||
- **Velocidad de Reproducción**: Escucha rápido, escucha
|
||||
lento! [Agrega un deslizador que controla la velocidad de reproducción de las canciones](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
|
||||
|
||||
- **Volumen Preciso**: Controla el volumen de forma precisa utilizando la rueda del mouse/atajos de teclado, con un HUD personalizado y pasos de volumen personalizables
|
||||
|
||||
- **Atajos (& MPRIS)**: Permite configurar atajos globales para la reproducción (reproducir/pausar/siguiente/anterior) +
|
||||
desactivar [osd multimedia](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png)
|
||||
al anular las teclas multimedia + habilitar Ctrl/CMD + F para buscar + habilitar el soporte mpris de Linux para
|
||||
teclas multimedia + [atajos personalizados](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50)
|
||||
para [usuarios avanzados](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)
|
||||
|
||||
- **Omitir Canciones No Deseadas**: Salta las canciones que no te gustan
|
||||
|
||||
- **Saltar Silencios**: Salta automáticamente las secciones de silencio
|
||||
|
||||
- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): Salta automáticamente las partes que no son de música, como la introducción/final o
|
||||
partes de videos musicales donde no se reproduce la canción
|
||||
|
||||
- **Control Multimedia en la Barra de Tareas**: Controla la reproducción desde
|
||||
la [barra de tareas de Windows](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)
|
||||
|
||||
- **TouchBar**: Diseño personalizado de TouchBar para macOS
|
||||
|
||||
- **Tuna OBS**: Integración con el complemento [Tuna](https://obsproject.com/forum/resources/tuna.843/) de [OBS](https://obsproject.com/)
|
||||
|
||||
- **Cambiador de Calidad de Video**: Permite cambiar la calidad del video con
|
||||
un [botón](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) en
|
||||
la superposición de video
|
||||
|
||||
- **Alternar Video**: Agrega
|
||||
un [botón](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) para
|
||||
alternar entre el modo de video/canción. también puede eliminar opcionalmente toda la pestaña de video
|
||||
|
||||
- **Visualizador**: Diferentes visualizadores de música
|
||||
|
||||
## Traducción
|
||||
|
||||
Puedes ayudar con la traducción en [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="estado de traducción" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="estado de traducción 2" />
|
||||
</a>
|
||||
|
||||
## Descarga
|
||||
|
||||
Puedes consultar la [última versión](https://github.com/th-ch/youtube-music/releases/latest) para encontrar rápidamente la versión más reciente.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Instala el paquete [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) desde AUR. Para obtener instrucciones de instalación de AUR, consulta esta [página del wiki](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||
|
||||
### macOS
|
||||
|
||||
Puedes instalar la aplicación usando Homebrew (consulta la [definición de cask](https://github.com/th-ch/homebrew-youtube-music)):
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
```
|
||||
|
||||
Si instalas la aplicación manualmente y obtienes un error "está dañado y no se puede abrir" al iniciar la aplicación, ejecuta lo siguiente en la Terminal:
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
Puedes usar el [administrador de paquetes Scoop](https://scoop.sh) para instalar el paquete `youtube-music` desde
|
||||
el [`extras` bucket](https://github.com/ScoopInstaller/Extras).
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
Alternativamente, puedes usar [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), el administrador de paquetes CLI oficial de Windows 11 para instalar el paquete `th-ch.YouTubeMusic`.
|
||||
|
||||
*Nota: Microsoft Defender SmartScreen podría bloquear la instalación ya que proviene de un "editor desconocido". Esto también esválido para la instalación manual al intentar ejecutar el ejecutable (.exe) después de una descarga manual aquí en GitHub (mismo archivo).*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### Cómo instalar sin conexión a Internet? (en Windows)
|
||||
|
||||
- Descarga el archivo `*.nsis.7z` para _la arquitectura de tu dispositivo_ en la [página de lanzamientos](https://github.com/th-ch/youtube-music/releases/latest).
|
||||
- `x64` para Windows de 64 bits
|
||||
- `ia32` para Windows de 32 bits
|
||||
- `arm64` para Windows ARM64
|
||||
- Descarga el instalador en la página de lanzamientos. (`*-Setup.exe`)
|
||||
- Colócalos en el **mismo directorio**.
|
||||
- Ejecuta el instalador.
|
||||
|
||||
## Temas
|
||||
|
||||
Puedes cargar archivos CSS para cambiar la apariencia de la aplicación (Opciones > Ajustes visuales > Tema).
|
||||
|
||||
Algunos temas predefinidos están disponibles en https://github.com/kerichdev/themes-for-ytmdesktop-player.
|
||||
|
||||
## Dev
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Crea tus propios plugins
|
||||
|
||||
Usando plugins, puedes:
|
||||
|
||||
- manipular la aplicación - se pasa el `BrowserWindow` de electron al controlador del plugin
|
||||
- cambiar la interfaz manipulando el HTML/CSS
|
||||
|
||||
### Creación de un plugin
|
||||
|
||||
Crea una carpeta en `src/plugins/NOMBRE-DEL-PLUGIN`:
|
||||
|
||||
- `index.ts`: el archivo principal del plugin
|
||||
```typescript
|
||||
import style from './style.css?inline'; // importar estilo como inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: "Plugin Label",
|
||||
restartNeeded: true, // si el valor es true, ytmusic muestra el diálogo de reinicio
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // tu configuración personalizada
|
||||
stylesheets: [style], // tu estilo personalizado,
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// Todos los métodos *Config están envueltos en Promise<T>
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: "menu",
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `value ${value}`,
|
||||
type: "radio",
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// puedes comunicarte con el plugin de renderizado
|
||||
ipc.handle("some-event", () => {
|
||||
return "hello";
|
||||
});
|
||||
},
|
||||
// se activa cuando cambia la configuración
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// se activa cuando se desactiva el plugin
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke("some-event"));
|
||||
},
|
||||
// Solo disponible en el plugin de renderizado
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// establecer la configuración del plugin fácilmente
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
|
||||
```
|
||||
|
||||
### Casos de uso comunes
|
||||
|
||||
- inyectar CSS personalizado: crea un archivo `style.css` en la misma carpeta y luego:
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // importar estilo como inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // si el valor es true, ytmusic mostrará el diálogo de reinicio
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // tu configuración personalizada
|
||||
stylesheets: [style], // tu estilo personalizado
|
||||
renderer() {} // define el hook del renderizador
|
||||
});
|
||||
```
|
||||
|
||||
- Si quieres cambiar el HTML:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // si el valor es true, ytmusic mostrará el diálogo de reinicio
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // tu configuración personalizada
|
||||
renderer() {
|
||||
// Elimina el botón de inicio de sesión
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // define el hook del renderizador
|
||||
});
|
||||
```
|
||||
|
||||
- comunicación entre el front y el back: se puede hacer utilizando el módulo ipcMain de electron. Ver archivo `index.ts` y
|
||||
ejemplo en el plugin `sponsorblock`.
|
||||
|
||||
## Compilar
|
||||
|
||||
1. Clonar el repositorio
|
||||
2. Seguir [esta guía](https://pnpm.io/es/installation) para instalar `pnpm`
|
||||
3. Ejecutar `pnpm install --frozen-lockfile` para instalar las dependencias
|
||||
4. Ejecutar `pnpm build:OS`
|
||||
|
||||
- `pnpm dist:win` - Windows
|
||||
- `pnpm dist:linux` - Linux (amd64)
|
||||
- `pnpm dist:linux:deb-arm64` - Linux (arm64 para Debian)
|
||||
- `pnpm dist:linux:rpm-arm64` - Linux (arm64 para Fedora)
|
||||
- `pnpm dist:mac` - macOS (amd64)
|
||||
- `pnpm dist:mac:arm64` - macOS (arm64)
|
||||
|
||||
Construye la aplicación para macOS, Linux y Windows,
|
||||
utilizando [electron-builder](https://github.com/electron-userland/electron-builder).
|
||||
|
||||
## Vista previa de producción
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Tests
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
Utiliza [Playwright](https://playwright.dev/) para probar la aplicación.
|
||||
|
||||
## Licencia
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## Preguntas frecuentes
|
||||
|
||||
### ¿Por qué no se muestra el menú de aplicaciones?
|
||||
|
||||
Si la opción `Ocultar menú` está activada - puedes mostrar el menú con la tecla <kbd>alt</kbd> (o <kbd>\`</kbd> [acento grave] si estás utilizando el plugin in-app-menu)
|
||||
@ -1,389 +0,0 @@
|
||||
<div align="center">
|
||||
|
||||
# YouTube Music
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="https://github.com/th-ch/youtube-music/raw/master/web/youtube-music.svg" width="400" height="100" alt="SVG YouTube Music">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Lisez ceci dans d'autres langues: [🏴 Anglais](../../README.md), [🇰🇷 Coréen](./README-ko.md), [🇫🇷 Français](./README-fr.md), [🇮🇸 Islandais](./README-is.md), [🇪🇸 Espagnol](./README-es.md), [🇷🇺 Russe](./README-ru.md), [🇺🇦 Ukrainien](./README-uk.md), [🇧🇷 Portugais](./README-pt.md), [🇯🇵 Japonais](./README-ja.md)
|
||||
|
||||
**Enveloppe Electron autour de YouTube Music offrant :**
|
||||
|
||||
- Aspect & sensation naturels, vise à conserver l'interface originale
|
||||
- Cadre pour les plugins personnalisés : modifiez YouTube Music selon vos besoins (style, contenu, fonctionnalités), activez/désactivez les plugins en
|
||||
un clic
|
||||
|
||||
## Image de démonstration
|
||||
|
||||
| Écran du lecteur (thème de couleur de l'album & lumière ambiante) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## Contenu
|
||||
|
||||
- [Fonctionnalités](#fonctionnalités)
|
||||
- [Plugins disponibles](#plugins-disponibles)
|
||||
- [Traduction](#traduction)
|
||||
- [Téléchargement](#téléchargement)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [Comment installer sans connexion réseau ? (sous Windows)](#comment-installer-sans-connexion-réseau-sous-windows)
|
||||
- [Thèmes](#thèmes)
|
||||
- [Dev](#dev)
|
||||
- [Créez vos propres plugins](#créez-vos-propres-plugins)
|
||||
- [Créer un plugin](#créer-un-plugin)
|
||||
- [Cas d'utilisation courants](#cas-dutilisation-courants)
|
||||
- [Construction](#construction)
|
||||
- [Aperçu de la production](#aperçu-de-la-production)
|
||||
- [Tests](#tests)
|
||||
- [Licence](#licence)
|
||||
- [FAQ](#faq)
|
||||
|
||||
## Fonctionnalités :
|
||||
|
||||
- **Confirmation automatique lors de la pause** (Toujours activé) : désactiver
|
||||
la pop-up ["Continuer à regarder ?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png)
|
||||
qui pause la musique après un certain temps
|
||||
|
||||
- Et plus encore ...
|
||||
|
||||
## Plugins disponibles :
|
||||
|
||||
- **Bloqueur de publicités** : Bloquez toutes les publicités et le suivi dès le départ
|
||||
|
||||
- **Actions d'album** : Ajoute des boutons Je n'aime pas, Dislike, J'aime, et Unlike pour appliquer cela à toutes les chansons dans une playlist ou un album
|
||||
|
||||
- **Thème de couleur d'album** : Applique un thème dynamique et des effets visuels basés sur la palette de couleurs de l'album
|
||||
|
||||
- **Mode Ambiant** : Applique un effet d'éclairage en projetant des couleurs douces de la vidéo, sur l'arrière-plan de votre écran
|
||||
|
||||
- **Compresseur Audio** : Appliquer une compression audio (diminue le volume des parties les plus fortes du signal et augmente le
|
||||
volume des parties les plus douces)
|
||||
|
||||
- **Barre de navigation floue** : rend la barre de navigation transparente et floue
|
||||
|
||||
- **Contournement des restrictions d'âge** : contourner la vérification d'âge de YouTube
|
||||
|
||||
- **Sélecteur de sous-titres** : Activer les sous-titres
|
||||
|
||||
- **Barre latérale compacte** : Toujours définir la barre latérale en mode compact
|
||||
|
||||
- **Fondu enchaîné** : Fondu enchaîné entre les chansons
|
||||
|
||||
- **Désactiver la lecture automatique** : Fait démarrer chaque chanson en mode "pause"
|
||||
|
||||
- **[Discord](https://discord.com/) Présence riche** : Montrez à vos amis ce que vous écoutez
|
||||
avec [Présence riche](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)
|
||||
|
||||
- **Téléchargeur** : télécharge des
|
||||
MP3 [directement depuis l'interface](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Volume exponentiel** : Rend le curseur de volume
|
||||
[exponentiel](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) afin qu'il soit plus facile de
|
||||
sélectionner des volumes plus bas
|
||||
|
||||
- **Menu In-App** : [donne aux barres un aspect chic et sombre](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||
|
||||
> (voir [ce poste](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709) si vous avez des problèmes
|
||||
pour accéder au menu après avoir activé ce plugin et l'option masquer-menu)
|
||||
|
||||
- **Scrobbler** : Ajoute le support de scrobbling pour [Last.fm](https://www.last.fm/) et [ListenBrainz](https://listenbrainz.org/)
|
||||
|
||||
- **Lumia Stream** : Ajoute le support de [Lumia Stream](https://lumiastream.com/)
|
||||
|
||||
- **Lyrics Genius** : Ajoute le support des paroles pour la plupart des chansons
|
||||
|
||||
- **Musique Ensemble** : Partagez une playlist avec d'autres. Lorsque l'hôte joue une chanson, tout le monde entendra la même chanson
|
||||
|
||||
- **Navigation** : Flèches de navigation Suivant/Retour directement intégrées dans l'interface, comme dans votre navigateur préféré
|
||||
|
||||
- **Pas de connexion Google** : Supprime les boutons et les liens de connexion Google de l'interface
|
||||
|
||||
- **Notifications** : Affiche une notification lorsqu'une chanson commence à jouer ([notifications interactives](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png)
|
||||
sont disponibles sur Windows)
|
||||
|
||||
- **Image dans l'image** : permet de passer l'application en mode image dans l'image
|
||||
|
||||
- **Vitesse de lecture** : Écoutez rapidement, écoutez lentement ! [Ajoute un curseur qui contrôle la vitesse des chansons](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
|
||||
|
||||
- **Volume précis** : Contrôlez le volume précisément en utilisant la molette de la souris/raccourcis clavier, avec un hud personnalisé et des étapes de volume personnalisables
|
||||
|
||||
- **Raccourcis (& MPRIS)** : Permet de définir des raccourcis globaux pour la lecture (lecture/pause/suivant/précédent) +
|
||||
désactive [osd média](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png)
|
||||
en remplaçant les touches multimédias + activer Ctrl/CMD + F pour rechercher + activer le support mpris linux pour
|
||||
les touches multimédias + [raccourcis personnalisés](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50)
|
||||
pour [utilisateurs avancés](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)
|
||||
|
||||
- **Passer la chanson non aimée** : passe les chansons non aimées
|
||||
|
||||
- **Passer les silences** : passe automatiquement les sections silencieuses
|
||||
|
||||
- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock) : Saute automatiquement les parties non musicales comme les intros/outros ou
|
||||
les parties des clips vidéo où la chanson n'est pas jouée
|
||||
|
||||
- **Contrôle multimédia de la barre des tâches** : Contrôlez la lecture depuis
|
||||
votre [barre des tâches Windows](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)
|
||||
|
||||
- **TouchBar** : Disposition personnalisée de la TouchBar pour macOS
|
||||
|
||||
- **Tuna OBS** : Intégration avec le
|
||||
plugin [Tuna](https://obsproject.com/forum/resources/tuna.843/) d'[OBS](https://obsproject.com/)
|
||||
|
||||
- **Changeur de qualité vidéo** : Permet de changer la qualité vidéo avec
|
||||
un [bouton](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) sur
|
||||
l'overlay vidéo
|
||||
|
||||
- **Bascule vidéo** : Ajoute
|
||||
un [bouton](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) pour
|
||||
basculer entre le mode Vidéo/Chanson. peut également supprimer l'onglet vidéo entier
|
||||
|
||||
- **Visualiseur** : Différents visualiseurs musicaux
|
||||
|
||||
## Traduction
|
||||
|
||||
Vous pouvez aider à la traduction sur [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="statut de la traduction" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="statut de la traduction 2" />
|
||||
</a>
|
||||
|
||||
## Téléchargement
|
||||
|
||||
Vous pouvez consulter la [dernière sortie](https://github.com/th-ch/youtube-music/releases/latest) pour trouver rapidement la
|
||||
dernière version.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Installez le paquet [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) depuis l'AUR. Pour les instructions d'installation de l'AUR, consultez
|
||||
cette [page wiki](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||
|
||||
### MacOS
|
||||
|
||||
Vous pouvez installer l'application en utilisant Homebrew (voir la [définition du fût](https://github.com/th-ch/homebrew-youtube-music)) :
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
```
|
||||
|
||||
Si vous installez l'application manuellement et obtenez une erreur "est endommagé et ne peut pas être ouvert." lors du lancement de l'application, exécutez ce qui suit dans le Terminal :
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
Vous pouvez utiliser le [gestionnaire de paquets Scoop](https://scoop.sh) pour installer le paquet `youtube-music` depuis le [seau `extras`](https://github.com/ScoopInstaller/Extras).
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
Alternativement, vous pouvez utiliser [Winget](https://learn.microsoft.com/fr-fr/windows/package-manager/winget/), le gestionnaire de paquets CLI officiel de Windows 11, pour installer le paquet `th-ch.YouTubeMusic`.
|
||||
|
||||
*Note : Microsoft Defender SmartScreen pourrait bloquer l'installation car elle provient d'un "éditeur inconnu". Ceci est également vrai pour l'installation manuelle lors de l'essai d'exécution de l'exécutable (.exe) après un téléchargement manuel ici sur GitHub (même fichier).*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### Comment installer sans connexion réseau ? (sous Windows)
|
||||
|
||||
- Téléchargez le fichier `*.nsis.7z` pour _l'architecture de votre appareil_ sur la [page des versions](https://github.com/th-ch/youtube-music/releases/latest).
|
||||
- `x64` pour Windows 64 bits
|
||||
- `ia32` pour Windows 32 bits
|
||||
- `arm64` pour Windows ARM64
|
||||
- Téléchargez l'installeur sur la page des versions. (`*-Setup.exe`)
|
||||
- Placez-les dans le **même dossier**.
|
||||
- Exécutez l'installeur.
|
||||
|
||||
## Thèmes
|
||||
|
||||
Vous pouvez charger des fichiers CSS pour changer l'apparence de l'application (Options > Ajustements visuels > Thèmes).
|
||||
|
||||
Certains thèmes prédéfinis sont disponibles sur [https://github.com/kerichdev/themes-for-ytmdesktop-player](https://github.com/kerichdev/themes-for-ytmdesktop-player).
|
||||
|
||||
## Dev
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
## Créez vos propres plugins
|
||||
|
||||
En utilisant des plugins, vous pouvez :
|
||||
|
||||
- manipuler l'application - la `BrowserWindow` d'Electron est passée au gestionnaire de plugin
|
||||
- changer le front en manipulant le HTML/CSS
|
||||
|
||||
### Créer un plugin
|
||||
|
||||
Créez un dossier dans `src/plugins/NOM-DE-VOTRE-PLUGIN` :
|
||||
|
||||
- `index.ts` : le fichier principal du plugin
|
||||
```typescript
|
||||
import style from './style.css?inline'; // importez le style comme inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Étiquette du plugin',
|
||||
restartNeeded: true, // si la valeur est vraie, ytmusic affichera la boîte de dialogue de redémarrage
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // votre configuration personnalisée
|
||||
stylesheets: [style], // votre style personnalisé,
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// Toutes les méthodes *Config sont des promesses encapsulées <T>
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: 'menu',
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `valeur ${value}`,
|
||||
type: 'radio',
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// vous pouvez communiquer avec le plugin du rendu
|
||||
ipc.handle('un événement', () => {
|
||||
return 'bonjour';
|
||||
});
|
||||
},
|
||||
// il est déclenché lorsque la configuration change
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// il est déclenché lorsque le plugin est désactivé
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke('un événement'));
|
||||
},
|
||||
// Seul le crochet disponible pour le rendu
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// définir facilement la configuration du plugin
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config is obtained by `getConfig` method.
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
|
||||
```
|
||||
|
||||
### Cas d'utilisation courants
|
||||
|
||||
- **Injection de CSS personnalisé** : créez un fichier `style.css` dans le même dossier puis :
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // importez le style comme en ligne
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Étiquette du plugin',
|
||||
restartNeeded: true, // si la valeur est vraie, ytmusic affichera la boîte de dialogue de redémarrage
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // votre configuration personnalisée
|
||||
stylesheets: [style], // votre style personnalisé
|
||||
renderer() {} // définissez le crochet de rendu
|
||||
});
|
||||
```
|
||||
|
||||
- **Si vous voulez modifier le HTML** :
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Étiquette du plugin',
|
||||
restartNeeded: true, // si la valeur est vraie, ytmusic affichera la boîte de dialogue de redémarrage
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // votre configuration personnalisée
|
||||
renderer() {
|
||||
// Supprimez le bouton de connexion
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // définissez le crochet de rendu
|
||||
});
|
||||
|
||||
```
|
||||
|
||||
- **Communication entre le front et le back** : cela peut se faire en utilisant le module ipcMain d'Electron. Voir le fichier `index.ts` et l'exemple dans le plugin `sponsorblock`.
|
||||
|
||||
## Construction
|
||||
|
||||
1. Clonez le dépôt
|
||||
2. Suivez [ce guide](https://pnpm.io/installation) pour installer `pnpm`
|
||||
3. Exécutez `pnpm install --frozen-lockfile` pour installer les dépendances
|
||||
4. Exécutez `pnpm build:OS`
|
||||
|
||||
- `pnpm dist:win` - pour Windows
|
||||
- `pnpm dist:linux` - pour Linux
|
||||
- `pnpm dist:mac` - pour MacOS
|
||||
|
||||
Construit l'application pour macOS, Linux et Windows,
|
||||
en utilisant [electron-builder](https://github.com/electron-userland/electron-builder).
|
||||
|
||||
## Aperçu de la production
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Tests
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
Utilise [Playwright](https://playwright.dev/) pour tester l'application.
|
||||
|
||||
## Licence
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## FAQ
|
||||
|
||||
### Pourquoi le menu de l'application ne s'affiche-t-il pas ?
|
||||
|
||||
Si l'option `Masquer le menu` est activée - vous pouvez afficher le menu avec la touche <kbd>alt</kbd> (ou <kbd>\`</kbd> [backtick] si vous utilisez le plugin du menu intégré)
|
||||
@ -1,374 +0,0 @@
|
||||
<div align="center">
|
||||
|
||||
# YouTube Music
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/eslint.config.mjs)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="../../web/youtube-music-hu.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Olvasd el más nyelveken: [🏴 Angol](../../README.md), [🇰🇷 Korea](./README-ko.md), [🇫🇷 Francia](./README-fr.md), [🇮🇸 Izland](./README-is.md), [🇪🇸 Spanyol](./README-es.md), [🇷🇺 Orosz](./README-ru.md), [🇺🇦 Ukrán](./README-uk.md), [🇧🇷 Portugál](./README-pt.md), [🇯🇵 Japán](./README-ja.md)
|
||||
|
||||
**Electron keretrendszerre épülő alkalmazás a YouTube Music számára, amely a következőket kínálja:**
|
||||
|
||||
- Natív megjelenés és élmény, amely az eredeti felület megtartására törekszik
|
||||
- Egyedi bővítmények keretrendszere: alakítsd át a YouTube Music-ot igényeid szerint (stílus, tartalom, funkciók), engedélyezd/tiltsd le a bővítményeket egy kattintással
|
||||
|
||||
## Bemutató kép
|
||||
|
||||
| Lejátszó ablak (album színtéma és környezeti fény) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## Tartalom
|
||||
|
||||
- [Funkciók](#Funkciók)
|
||||
- [Elérhető bővítmények](#Elérhető-bővítmények)
|
||||
- [Fordítás](#Fordítás)
|
||||
- [Letöltés](#Letöltés)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [Hogyan telepítsük hálózati kapcsolat nélkül? (Windows alatt)](#Hogyan-telepítsd-hálózati-kapcsolat-nélkül-Windows)
|
||||
- [Témák](#Témák)
|
||||
- [Fejlesztés](#Fejlesztés)
|
||||
- [Saját bővítmények készítése](#Saját-bővítmények-készítése)
|
||||
- [Bővítmény létrehozása](#Bővítmény-létrehozása)
|
||||
- [Gyakori használati esetek](#Gyakori-használati-esetek)
|
||||
- [Build](#build)
|
||||
- [Gyártás előnézete](#Gyártás-előnézete)
|
||||
- [Tesztelés](#Tesztelés)
|
||||
- [Licenc](#Licenc)
|
||||
- [GYIK](#GYIK)
|
||||
|
||||
## Funkciók:
|
||||
|
||||
- **Automatikus megerősítés a lejátszás szüneteltetésekor** (Alapból engedélyezve): Kikapcsolja a ["Folytatja a nézést?"](https://i.imgur.com/z2mG0QN.png)
|
||||
felugró ablakot, amely bizonyos idő után leállítja a zenét.
|
||||
|
||||
- És még sok más ...
|
||||
|
||||
## Elérhető bővítmények:
|
||||
|
||||
- **Reklámblokkoló**: Blokkolja az összes hirdetést és nyomkövetőt.
|
||||
|
||||
- **Album műveletek**: Dislike, Undislike, Like, Unlike gombok hozzáadása, amivel ezt a lejátszási listán vagy albumban lévő összes dalra alkalmazza.
|
||||
|
||||
- **Album színtéma**: Dinamikus téma és vizuális effektek alkalmazása az album színpalettája alapján.
|
||||
|
||||
- **Ambient mód**: Fényhatás alkalmazása a videóból származó lágy színek vetítésével a képernyő hátterére.
|
||||
|
||||
- **Hangtömörítő**: Hang tömörítés alkalmazása. (csökkenti a jel legzajosabb részeinek hangerősségét, és emeli a legcsendesebb részek hangerősségét)
|
||||
|
||||
- **Navigációs sáv elmosása**: Átlátszóvá és elmosódottá teszi a navigációs sávot.
|
||||
|
||||
- **Korellenőrzés kihagyása**: A YouTube korellenőrzését kihagyja, ezáltal nem kel meg erősíteni a zene meghallgatása elött. (automatikusan megerősítve lesz)
|
||||
|
||||
- **Feliratválasztó**: Felirat választó a YouTube Music zenékhez.
|
||||
|
||||
- **Kompakt oldalsáv**: Mindig becsukva tartja a bal oldali sávot, ahol a Kezdőlap, Felfedezés, Könyvtár és egyebek láthatók. (amit bármikor ki lehet nyitni)
|
||||
|
||||
- **Áttünés**: Áttünést biztosít a dalok között, ami folytonossá teszi a zenehallgatást anélkül, hogy érezhető lenne a váltás.
|
||||
|
||||
- **Automatikus lejátszás letiltása**: Ez a funkció kikapcsolja az automatikus lejátszást, így a zenék nem indulnak el maguktól. Amikor egy album vagy egy dal lejátszása véget ér, a következő szám nem kezdődik el automatikusan. (a bővítmény használata során minden zenét manuálisan kell elindítani)
|
||||
|
||||
- **[Discord](https://discord.com/) Rich Presence**: Mutassa meg barátainak, hogy mit hallgat a [Rich Presence](https://i.imgur.com/nCeVQB2.png) segítségével. (Ehez a Discord-on is engedélyezve kel lennie a Tevékenységállapot megosztásának [DC Beállítások -> Tevékenyég-adatvédelem -> Megoszthatod az észlelt tevékenységeidet másokkal])
|
||||
|
||||
- **Letöltő**: MP3/forrás hanganyag letöltése [közvetlenül az interfészről](https://i.imgur.com/ghqBNVe.png). [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Hangszínszabályzó**: Szűrőket ad hozzá, hogy erősítsd vagy csökkentsd bizonyos frekvenciatartományokat. (pl. basszuskiemelés)
|
||||
|
||||
- **Exponenciális hangerő**: A hangerő csúszka [exponenciálissá](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) tételével könnyebbé válik az alacsony hangerő kiválasztása.
|
||||
|
||||
- **Alkalmazáson belüli menü**: [A Menüsáv stílusos, sötét vagy album-színű megjelenítése](https://i.imgur.com/vWvO7Xt.png).
|
||||
|
||||
> (Lásd ezt a [bejegyzést](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709), ha problémád van a menü elérésével, miután engedélyezted ezt a bővítményt és a "menü elrejtése" opciót.
|
||||
|
||||
- **Scrobbler**: Scrobbling támogatást biztosít [Last.fm](https://www.last.fm/) és [ListenBrainz](https://listenbrainz.org/) számára.
|
||||
|
||||
- **Lumia Stream**: [Lumia Stream](https://lumiastream.com/) támogatás hozzáadása.
|
||||
|
||||
- **Lyrics Genius**: Dalszöveg támogatást nyújt a legtöbb dalhoz.
|
||||
|
||||
- **Zene együtt**: Lehetővé teszi a lejátszási listák, dalok megosztását másokkal. Amikor a házigazda lejátszik egy dalt, mindenki ugyanazt a dalt fogja hallani.
|
||||
|
||||
- **Navigáció**: Következő/Vissza navigációs nyilak közvetlenül az interfészbe integrálva, mint a kedvenc böngésződben.
|
||||
|
||||
- **Nincs Google bejelentkezés**: A Bejelentkezés gomb eltávolítása az interfészről (Jobb fentről eltünik a bejelentkezés gomb.)
|
||||
|
||||
- **Értesítések**: Értesítés megjelenítése, amikor egy dal elindul. ([interaktív értesítések](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) elérhetők Windows-on)
|
||||
|
||||
- **Kép a képben**: Lehetővé teszi az alkalmazás kép a képben módra váltását.
|
||||
|
||||
- **Lejátszás sebessége**: Hallgassd gyorsan, hallgassd lassan! [Hozzáad egy csúszkát, amely szabályozza a dal sebességét](https://i.imgur.com/uaNOWOt.png)
|
||||
|
||||
- **Precíz hangerő**: A hangerő precíz szabályozása egérgörgővel/gyorsbillentyűkkel, egy egyedi HUD és testreszabható hangerő csuszka segítségével.
|
||||
|
||||
- **Gyorsbillentyűk (& MPRIS)**: Lehetővé teszi globális gyorsbillentyűk beállítását a lejátszáshoz (lejátszás/szünet/következő/előző), valamint a [média OSD](https://i.imgur.com/o13SpAE.png) kikapcsolását a médiagombok felülírásával. Bekapcsolja a Ctrl/CMD + F billentyűkombinációt a kereséshez, a Linux MPRIS támogatását a médiagombokhoz, és [egyedi gyorsbillentyűket](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) a [haladó felhasználók](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902) számára.
|
||||
|
||||
- **Nem kedvelt dal kihagyása**: Kihagyja a nem kedvelt dalokat.
|
||||
|
||||
- **Csend kihagyása**: Automatikusan átugorja a csendes szakaszokat.
|
||||
|
||||
- [**SzponzorBlokk**](https://github.com/ajayyy/SponsorBlock): Automatikusan átugorja a nem zenei részeket, például az intrókat/outrokat vagy a zenei videók azon részeit, ahol a dal nem szól.
|
||||
|
||||
- **Szinkronizált dalszövegek**: Szinkronizált dalszövegeket biztosít dalokhoz, [LRClib](https://lrclib.net)-hez hasonló szolgáltatókat használva.
|
||||
|
||||
- **Médiavezérlés a tálcán**: Lejátszás vezérlése a [Windows tálcáról](https://i.imgur.com/eolQfnA.png).
|
||||
|
||||
- **TouchBar**: Egyedi TouchBar elrendezés macOS-hoz.
|
||||
|
||||
- **Tuna OBS**: Integráció az [OBS](https://obsproject.com/) [Tuna](https://obsproject.com/forum/resources/tuna.843/) pluginjával.
|
||||
|
||||
- **Videóminőség modosító**: Lehetővé teszi a videó minőségének megváltoztatását egy [gombbal](https://i.imgur.com/UgpgtHL.png) a videó fedvényen.
|
||||
|
||||
- **Videó váltó**: Hozzáad egy [gombot](https://i.imgur.com/288QE1k.png) a Videó/Dal mód közötti váltáshoz. (opcionálisan teljesen eltávolíthatja a videó fület is)
|
||||
|
||||
- **Vizualizáció**: Különböző zenei vizualizációk.
|
||||
|
||||
|
||||
## Fordítás
|
||||
|
||||
Segíthetsz a fordításban a [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/) oldalán.
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="Fordítás állapota" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="Fordítás állapota" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/hu/287x66-white.png" alt="Fordítás állapota" />
|
||||
</a>
|
||||
|
||||
## Letöltés
|
||||
|
||||
A [legfrissebb kiadás](https://github.com/th-ch/youtube-music/releases/latest) megtekintésével gyorsan megtalálhatod a legújabb verziót.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Telepítsd a [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) csomagot az AUR-ból. Az AUR telepítési útmutatóját megtalálod ezen a [wiki oldalon](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||
|
||||
### macOS
|
||||
|
||||
Telepítheted az alkalmazást Homebrew segítségével (lásd a [cask definíciót](https://github.com/th-ch/homebrew-youtube-music)):
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
```
|
||||
|
||||
Ha manuálisan telepítetted az alkalmazást, és a következő hibát kapod indításkor: "sérült, és nem nyitható meg./is damaged and can’t be opened.", futtasd az alábbi parancsot a Terminálban:
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
A [Scoop csomagkezelő](https://scoop.sh) segítségével telepítheted a `youtube-music` csomagot az [`extras` tárolóból](https://github.com/ScoopInstaller/Extras).
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
Alternatívaként használhatod a [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/) eszközt, a Windows 11 hivatalos CLI csomagkezelőjét, hogy telepítsd a `th-ch.YouTubeMusic` csomagot.
|
||||
|
||||
*Megjegyzés: A Microsoft Defender SmartScreen figyelmeztethet vagy blokkolhatja a telepítést, mivel az alkalmazás "ismeretlen kiadótól" származik. Ez a figyelmeztetés akkor is megjelenhet, ha manuálisan töltöd le és próbálod futtatni a GitHubról letöltött (.exe) fájlt. Ebben az esetben kattints a "További információ" gombra, majd válaszd a "Futtatás mindenképp" opciót a telepítés folytatásához.*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### Hogyan telepítsd hálózati kapcsolat nélkül? (Windows)
|
||||
|
||||
- Töltsd le a `*.nsis.7z` fájlt a [kiadás oldal](https://github.com/th-ch/youtube-music/releases/latest)ról, amely megfelel az eszközöd architektúrájának:
|
||||
- `x64` 64 bites Windows-hoz
|
||||
- `ia32` 32 bites Windows-hoz
|
||||
- `arm64` ARM64 Windows-hoz
|
||||
- Töltsd le a telepítőt a [kiadás oldal](https://github.com/th-ch/youtube-music/releases/latest)ról. (`*-Setup.exe`)
|
||||
- Helyezd mindkét fájlt **ugyanabba a könyvtárba**.
|
||||
- Futtasd a telepítőt.
|
||||
|
||||
## Témák
|
||||
|
||||
CSS fájlokat tölthetsz be az alkalmazás megjelenésének megváltoztatásához. (Beállítások > Kinézeti beállítások > Téma)
|
||||
|
||||
Néhány előre definiált téma elérhető itt: https://github.com/kerichdev/themes-for-ytmdesktop-player.
|
||||
|
||||
## Fejlesztés
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Saját bővítmények készítése
|
||||
|
||||
A bővítmények segítségével a következőket teheted:
|
||||
|
||||
- Az alkalmazás manipulálása: Az Electron `BrowserWindow` objektuma átadásra kerül a bővítménykezelőnek.
|
||||
- Az interfész módosítása: HTML és CSS manipulációval megváltoztathatod az alkalmazás kinézetét.
|
||||
|
||||
### Bővítmény létrehozása
|
||||
|
||||
Hozz létre egy mappát a `src/plugins/YOUR-PLUGIN-NAME` útvonalon:
|
||||
|
||||
- `index.ts`: a bővítmény fő fájlja
|
||||
```typescript
|
||||
import style from './style.css?inline'; // import style as inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic show restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
stylesheets: [style], // your custom style,
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// All *Config methods are wrapped Promise<T>
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: 'menu',
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `value ${value}`,
|
||||
type: 'radio',
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// you can communicate with renderer plugin
|
||||
ipc.handle('some-event', () => {
|
||||
return 'hello';
|
||||
});
|
||||
},
|
||||
// it fired when config changed
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// it fired when plugin disabled
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke('some-event'));
|
||||
},
|
||||
// Only renderer available hook
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// set plugin config easily
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Gyakori használati esetek
|
||||
|
||||
- Egyedi CSS injektálása: hozz létre egy `style.css` fájlt ugyanabban a mappában, majd:
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // import style as inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic will show a restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
stylesheets: [style], // your custom style
|
||||
renderer() {} // define renderer hook
|
||||
});
|
||||
```
|
||||
|
||||
- Ha módosítani szeretnéd a HTML-t:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic will show the restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
renderer() {
|
||||
// Remove the login button
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // define renderer hook
|
||||
});
|
||||
```
|
||||
|
||||
- Az elülső és hátsó rész közötti kommunikáció: Az Electron ipcMain moduljának használatával valósítható meg. Lásd az `index.ts` fájlt és a `sponsorblock` bővítmény példáját.
|
||||
|
||||
## Build
|
||||
|
||||
1. Klónozd a repót
|
||||
2. Kövesd ezt az [útmutatót](https://pnpm.io/installation), hogy telepítsd a `pnpm` csomagkezelőt.
|
||||
3. Futtasd a következő parancsot `pnpm install --frozen-lockfile` a kellékek telepítéséhez.
|
||||
4. Építsd meg az alkalmazást az operációs rendszerednek megfelelő paranccsal: `pnpm build:OS`
|
||||
|
||||
- `pnpm dist:win` - Windows
|
||||
- `pnpm dist:linux` - Linux (amd64)
|
||||
- `pnpm dist:linux:deb-arm64` - Linux (arm64 Debiánhoz)
|
||||
- `pnpm dist:linux:rpm-arm64` - Linux (arm64 Fedorához)
|
||||
- `pnpm dist:mac` - macOS (amd64)
|
||||
- `pnpm dist:mac:arm64` - macOS (arm64)
|
||||
|
||||
Az alkalmazás építéséhez a [electron-builder](https://github.com/electron-userland/electron-builder) eszközt használáld, amely támogatja a macOS, Linux és Windows platformokat.
|
||||
|
||||
## Gyártás előnézete
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Tesztelés
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
A [Playwright](https://playwright.dev/) tesztelési keretrendszert használd az alkalmazás teszteléséhez.
|
||||
|
||||
## Licenc
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## GYIK
|
||||
|
||||
### Miért nem jelenik meg az alkalmazás menüje?
|
||||
|
||||
Ha a `menü elrejtése` opció be van kapcsolva, a menüt az <kbd>alt</kbd> billentyűvel jelenítheted meg (vagy az <kbd>`</kbd> [fordított idézőjel] billentyűvel, ha az alkalmazáson belüli menü bővítményt használod).
|
||||
@ -1,390 +0,0 @@
|
||||
<div align="center">
|
||||
|
||||
# YouTube Tónlist
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="../../web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Lestu þetta á öðrum tungumálum: [🏴 Enska](../../README.md), [🇰🇷 Kóreska](./README-ko.md), [🇫🇷 Franska](./README-fr.md), [🇮🇸 Íslenska](./README-is.md), [🇪🇸 Spænska](./README-es.md), [🇷🇺 Rússneska](./README-ru.md), [🇺🇦 Úkraínska](./README-uk.md), [🇧🇷 Portúgalska](./README-pt.md), [🇭🇺 Ungverska](./README-hu.md) [🇯🇵 Japanska](./README-ja.md)
|
||||
|
||||
**Electron umbúðir utan um YouTube Tónlist sem inniheldur:**
|
||||
|
||||
- Innfæddur útlit og tilfinning, miðar að því að halda upprunalegu viðmótinu
|
||||
- Rammi fyrir sérsniðnar tengiforrit: breyttu YouTube Tónlist að þínum þörfum (stíl, efni, eiginleikar), virkjaðu/slökktu á viðbætur í
|
||||
einn smellur
|
||||
|
||||
## Sýnishornsmynd
|
||||
|
||||
| Spilaraskjár (albúmslitaþema & umhverfisljós) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## Efni
|
||||
|
||||
- [Eiginleikar](#eiginleikar)
|
||||
- [Tiltæk tengiforrit](#tiltæk-tengiforrit)
|
||||
- [Þýðing](#þýðing)
|
||||
- [Sækja](#sækja)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [Hvernig á að setja upp án nettengingar? (í Windows)](#hvernig-á-að-setja-upp-án-nettengingar-í-windows)
|
||||
- [Þemu](#þemu)
|
||||
- [Þróun](#þróun)
|
||||
- [Búðu til þín eigin viðbætur](#búðu-til-þín-eigin-viðbætur)
|
||||
- [Er að búa til viðbót](#er-að-búa-til-viðbót)
|
||||
- [Algeng notkunartilvik](#algeng-notkunartilvik)
|
||||
- [Byggja](#byggja)
|
||||
- [Framleiðsluforskoðun](#framleiðsluforskoðun)
|
||||
- [Prófanir](#prófanir)
|
||||
- [Leyfi](#leyfi)
|
||||
- [Algengustu spurningar](#algengustu-spurningar)
|
||||
|
||||
## Eiginleikar:
|
||||
|
||||
- **Sjálfvirk staðfesting þegar gert er hlé** (Alltaf virkt): slökkva á
|
||||
["Halda áfram að horfa?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png)
|
||||
popup sem gerir hlé á tónlist eftir ákveðinn tíma
|
||||
|
||||
- Og meira...
|
||||
|
||||
## Tiltæk tengiforrit:
|
||||
|
||||
- **Auglýsingablokkari**: Lokaðu fyrir allar auglýsingar og rakningar úr kassanum
|
||||
|
||||
- **Albúmsaðgerðir**: Bætir Ódíslika, Mislíkt, Líkt, og Ólíkt til að nota þetta á öll lög á spilunarlista eða albúm
|
||||
|
||||
- **Albúmslitaþema**: Beitir kraftmikið þema og sjónrænum áhrifum sem byggjast á litavali albúmsins
|
||||
|
||||
- **Umhverfishamur**: Beitir lýsingaráhrifum með því að varpa mildum litum úr myndbandinu í bakgrunn skjásins
|
||||
|
||||
- **Hljóðþjöppur**: Notaðu þjöppun á hljóð (lækkar hljóðstyrk háværustu hluta merkis og hækkar hljóðstyrk í mýkstu hlutunum)
|
||||
|
||||
- **Þoka Leiðsagnarstika**: Gerir leiðsögustikuna gagnsæja og óskýrt
|
||||
|
||||
- **Farið Framhjá Aldurstakmörkunum**: Framhjá aldursstaðfestingu YouTube
|
||||
|
||||
- **Yfirskriftarval**: Virkja skjátexta
|
||||
|
||||
- **Fyrirferðarlítillhliðarstika**: Stilltu hliðarstikuna alltaf í þétta stillingu
|
||||
|
||||
- **Krossfæra**: Krossfæra á milli lög
|
||||
|
||||
- **Slökkva á Sjálfvirkri Spilun**: Gerir lag að byrja í "hlé" ham
|
||||
|
||||
- **[Discord](https://discord.com/) Rík Nærveru**: Sýndu vinum þínum hvað þú hlustar á
|
||||
með [Rík Nærveru](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)
|
||||
|
||||
- **Niðurhalari**: Niðurhalum
|
||||
MP3 [beint úr viðmótinu](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Veldibundiðrúmmál**: Gerir hljóðstyrkssleðann [veldisvísis](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/)
|
||||
svo það er auðveldara að velja lægra hljóðstyrk.
|
||||
|
||||
- **Valmynd í Forriti**: [Gefur börum flott, dökkt útlit](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||
|
||||
> (sjá [þessa færslu](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709) ef þú átt í vandræðum
|
||||
með að fá aðgang að valmyndinni eftir að hafa virkjað þessa viðbót og fela valmyndarvalkostinn)
|
||||
|
||||
- **Scrobbler**: Bætir við scrobbling stuðningi fyrir [Last.fm](https://www.last.fm/) og [ListenBrainz](https://listenbrainz.org/)
|
||||
|
||||
- **Lumia Stream**: Bætir við [Lumia Stream](https://lumiastream.com/) stuðningi
|
||||
|
||||
- **Söngtexti Snilld**: Bætir stuðningi við texta fyrir flest lög
|
||||
|
||||
- **Tónlist Saman**: Deila spilunarlista með öðrum. Þegar gestgjafinn spilar lag munu allir aðrir heyra sama lagið
|
||||
|
||||
- **Leiðsögn**: Næsta/Til baka leiðsagnarörvar beint samþættar í viðmótinu, eins og í uppáhalds vafranum þínum
|
||||
|
||||
- **Engin Google Innskráning**: Fjarlægðu Google innskráningarhnappa og tengla úr viðmótinu
|
||||
|
||||
- **Tilkynningar**: Birta tilkynningu þegar lag byrjar að spila
|
||||
([gagnvirkartilkynningar](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) eru fáanlegar á Windows)
|
||||
|
||||
- **Mynd-í-Mynd**: Gerir kleift að skipta forritinu yfir í mynd-í-mynd stillingu
|
||||
|
||||
- **Spilunarhraði**: Hlustaðu hratt, hlustaðu hægt!
|
||||
[Bætir við sleða sem stjórnar lagahraðanum](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
|
||||
|
||||
- **Nákvæmshljóðstyrkur**: Stjórnaðu hljóðstyrknum nákvæmlega með músarhjóli/hraðtökkum, með sérsniðnum HUD og sérsniðnum hljóðstyrksþrepum
|
||||
|
||||
- **Flýtileiðir (og MPRIS)**: Leyfir að stilla alþjóðlegarflýtilyklar fyrir spilun (spila/gera hlé/næsta/fyrri) +
|
||||
óvirkja [media osd](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png)
|
||||
með því að hnekkja miðlunarlyklum + virkja Ctrl/CMD + F til að leita + virkja linux mpris stuðning fyrir
|
||||
miðlunarlyklar + [sérsniðnir flýtilyklar](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50)
|
||||
fyrir [háþróaða notendur](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)
|
||||
- **Slepptu Lögum sem Mislíkuðust**: Sleppir mislíkaði lög
|
||||
|
||||
- **Slepptu Þögnum**: Slepptu sjálfkrafa þagnarköflum í lögum
|
||||
|
||||
- [**Styrktarblokk**](https://github.com/ajayyy/SponsorBlock): Sleppur sjálfkrafa hlutum sem ekki eru tónlist, eins og inngangur/lok
|
||||
eða hlutar af tónlistarmyndböndum þar sem lag er ekki að spila
|
||||
|
||||
- **Miðlunarstýringarverkefnastikunnar**: Stjórnaðu spilun frá [Windows verkefnastikunni þinni](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)
|
||||
|
||||
- **Snertistiku**: Sérsniðið Snertistikuútlit fyrir macOS
|
||||
|
||||
- **Tuna OBS**: Samþætting við [OBS](https://obsproject.com/)
|
||||
viðbótina [Tuna](https://obsproject.com/forum/resources/tuna.843/)
|
||||
|
||||
- **Myndbandgæðisbreyting**: Leyfir að breyta myndbandgæðum með
|
||||
[hnappi](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) á
|
||||
myndbandsyfirlaginu
|
||||
|
||||
- **Myndbandsrofi**: Bætir við [hnappi](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) til
|
||||
að skipta á milli myndbands/lagshams. Getur einnig valfrjálst fjarlægt allan myndbandsflipann
|
||||
|
||||
- **Sjónrænir**: Mismunandi tónlist sjónrænir
|
||||
|
||||
## Þýðing
|
||||
|
||||
Þú getur aðstoðað við þýðingar á [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="translation status" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="translation status 2" />
|
||||
</a>
|
||||
|
||||
## Sækja
|
||||
|
||||
Þú getur skoðað [nýjustu útgáfuna](https://github.com/th-ch/youtube-music/releases/latest) til að finna fljótt
|
||||
nýjustu útgáfuna.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Settu upp [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) pakkann frá AUR. Fyrir AUR uppsetningarleiðbeiningar skaltu skoða
|
||||
þessa [wiki síðu](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||
|
||||
### MacOS
|
||||
|
||||
Þú getur sett upp appið með því að nota Homebrew (sjá [cask skilgreiningu](https://github.com/th-ch/homebrew-youtube-music))
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
```
|
||||
|
||||
Ef þú setur upp forritið handvirkt og færð villu "er skemmd og ekki er hægt að opna það," þegar þú ræsir forritið skaltu keyra eftirfarandi í flugstöðinni:
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
Þú getur notað [Scoop pakkastjórnun](https://scoop.sh) til að setja upp `youtube-music` pakkann frá
|
||||
[`extras` fötunni](https://github.com/ScoopInstaller/Extras).
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
Að öðrum kosti geturðu notað [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), Windows 11s
|
||||
opinber CLI pakkastjóri til að setja upp `th-ch.YouTubeMusic` pakkann.
|
||||
|
||||
*Athugið: Microsoft Defender SmartScreen gæti lokað uppsetningunni þar sem hún er frá „óþekktum útgefanda“. Þetta er einnig
|
||||
satt fyrir handvirka uppsetningu þegar reynt er að keyra executable(.exe) eftir handvirkt niðurhal hér á github (sama
|
||||
skrá).*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### Hvernig á að setja upp án nettengingar? (í Windows)
|
||||
|
||||
- Sæktu `*.nsis.7z` skrána fyrir _arkitektúr tækisins þíns_ á [útgáfusíðu](https://github.com/th-ch/youtube-music/releases/latest).
|
||||
- `x64` fyrir 64-bita Windows
|
||||
- `ia32` fyrir 32-bita Windows
|
||||
- `arm64` fyrir ARM64 Windows
|
||||
- Sæktu uppsetningarforrit á útgáfusíðu. (`*-Setup.exe`)
|
||||
- Settu þær í **sömu möppuna**.
|
||||
- Keyrðu uppsetningarforritið.
|
||||
|
||||
## Þemu
|
||||
|
||||
Þú getur hlaðið CSS skrám til að breyta útliti forritsins (Valkostir > Sjónræn klip > Þemu).
|
||||
|
||||
Sum fyrirframskilgreind þemu eru fáanleg á https://github.com/kerichdev/themes-for-ytmdesktop-player.
|
||||
|
||||
## Þróun
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Búðu til þín eigin tengiforrit
|
||||
|
||||
Með því að nota tengiforrit geturðu:
|
||||
|
||||
- vinna með appið - `BrowserWindow` frá electron er sent til tengiforritsstjórans
|
||||
- breyttu framhliðinni með því að vinna með HTML/CSS
|
||||
|
||||
### Er að búa til tengiforrit
|
||||
|
||||
Búðu til möppu í `src/plugins/YOUR-PLUGIN-NAME`:
|
||||
|
||||
- `index.ts`: aðal skránni af tengiforritið
|
||||
```typescript
|
||||
import style from './style.css?inline'; // flytja inn stíl sem inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // ef gildi er satt, ytmusic sjá endurræsa gluggann
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // sérsniðnastillingar þinn
|
||||
stylesheets: [style], // sérsniðnastílinn þinn
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// Allar *stillingaraðferðir eru umvafnar Lofor<T>
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: 'menu',
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `value ${value}`,
|
||||
type: 'radio',
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// þú getur tengst við renderer tengiforritið
|
||||
ipc.handle('some-event', () => {
|
||||
return 'hello';
|
||||
});
|
||||
},
|
||||
// það kviknaði þegar stillingum var breytt
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// it fired when plugin disabled
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke('some-event'));
|
||||
},
|
||||
// Aðeins krókur sem er í boði fyrir renderer
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// stilltu stillingar viðbótarinnar auðveldlega
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Algeng notkunartilvik
|
||||
|
||||
- er að sprauta sérsniðnum CSS: búðu til `style.css` skrá í sömu möppu þá:
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // flytja inn stíl sem inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // ef gildi er satt, ytmusic sjá endurræsa gluggann
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // sérsniðnastillingar þinn
|
||||
stylesheets: [style], // sérsniðnastílinn þinn
|
||||
renderer() {} // skilgreina renderer krók
|
||||
});
|
||||
```
|
||||
|
||||
- Ef þú vilt breyta HTML:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // ef gildi er satt, ytmusic sjá endurræsa gluggann
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // sérsniðnastillingar þinn
|
||||
renderer() {
|
||||
// Fjarlægðu innskráningarhnappinn
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // skilgreina renderer krók
|
||||
});
|
||||
```
|
||||
|
||||
- samskipti á milli að framan og aftan: hægt að gera með því að nota ipcMain eininguna frá electron. Sjá `index.ts` skrá og
|
||||
dæmi í 'styrktarblokk' tengiforritinu.
|
||||
|
||||
## Byggja
|
||||
|
||||
1. Klóna geymsluna
|
||||
2. Fylgdu [þessa handbók](https://pnpm.io/installation) til að setja upp 'pnpm'
|
||||
3. Keyrðu `pnpm install --frozen-lockfile` til að setja upp ósjálfstæði
|
||||
4. Keyrðu `pnpm build:OS`
|
||||
|
||||
- `pnpm dist:win` - Windows
|
||||
- `pnpm dist:linux` - Linux
|
||||
- `pnpm dist:mac` - MacOS
|
||||
|
||||
Byggir appið fyrir macOS, Linux og Windows,
|
||||
með því að nota [electron-builder](https://github.com/electron-userland/electron-builder).
|
||||
|
||||
## Framleiðsluforskoðun
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Prófanir
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
Notar [Playwright](https://playwright.dev/) til að prófa forritið.
|
||||
|
||||
## Leyfi
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## Algengustu Spurningar
|
||||
|
||||
### Hvers vegna forritavalmynd birtist ekki?
|
||||
|
||||
Ef valmöguleikinn „Fela valmynd“ er á - þú getur sýnt valmyndina með <kbd>alt</kbd> lyklinum (eða <kbd>\`</kbd> [bakka]
|
||||
ef þú notar viðbótina fyrir valmynd í forriti)
|
||||
@ -1,371 +0,0 @@
|
||||
<div align="center">
|
||||
|
||||
# YouTube Music
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="../../web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
他の言語で読む: [🏴 英語](../../README.md), [🇰🇷 韓国語](./README-ko.md), [🇫🇷 フランス語](./README-fr.md), [🇮🇸 アイスランド語](./README-is.md), [🇪🇸 スペイン語](./README-es.md), [🇷🇺 ロシア語](./README-ru.md), [🇺🇦 ウクライナ語](./README-uk.md)
|
||||
|
||||
**YouTube MusicのElectronラッパーには以下の機能があります:**
|
||||
|
||||
- ネイティブの外観と操作感、元のインターフェースを維持することを目指しています
|
||||
- カスタムプラグインのフレームワーク: スタイル、コンテンツ、機能など、YouTube Musicをニーズに合わせて変更し、ワンクリックでプラグインを有効/無効にできます
|
||||
|
||||
## デモ画像
|
||||
|
||||
| プレーヤースクリーン (アルバムカラーテーマ & アンビエントライト) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## コンテンツ
|
||||
|
||||
- [機能](#機能)
|
||||
- [利用可能なプラグイン](#利用可能なプラグイン)
|
||||
- [翻訳](#翻訳)
|
||||
- [ダウンロード](#ダウンロード)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [ネットワーク接続なしでインストールする方法 (Windows)](#ネットワーク接続なしでインストールする方法-windows)
|
||||
- [テーマ](#テーマ)
|
||||
- [開発](#開発)
|
||||
- [独自のプラグインを作成する](#独自のプラグインを作成する)
|
||||
- [プラグインの作成](#プラグインの作成)
|
||||
- [一般的な使用例](#一般的な使用例)
|
||||
- [ビルド](#ビルド)
|
||||
- [プロダクションプレビュー](#プロダクションプレビュー)
|
||||
- [テスト](#テスト)
|
||||
- [ライセンス](#ライセンス)
|
||||
- [FAQ](#faq)
|
||||
|
||||
## 機能:
|
||||
|
||||
- **一時停止時の自動確認** (常に有効): 一定時間後に音楽を一時停止する["視聴を続けますか?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png)ポップアップを無効にします
|
||||
|
||||
- その他の機能...
|
||||
|
||||
## 利用可能なプラグイン:
|
||||
|
||||
- **広告ブロッカー**: すべての広告とトラッキングをブロックします
|
||||
|
||||
- **アルバムアクション**: プレイリストやアルバム内のすべての曲に「嫌いではない」「嫌い」「好き」「好きではない」ボタンを追加します
|
||||
|
||||
- **アルバムカラーテーマ**: アルバムのカラーパレットに基づいて動的なテーマと視覚効果を適用します
|
||||
|
||||
- **アンビエントモード**: 動画から柔らかい色を画面の背景に投影するライティング効果を適用します
|
||||
|
||||
- **<2A><><EFBFBD>ーディオコンプレッサー**: オーディオにコンプレッションを適用します(信号の最も大きな部分の音量を下げ、最も小さな部分の音量を上げます)
|
||||
|
||||
- **ナビゲーションバーのぼかし**: ナビゲーションバーを透明でぼやけたものにします
|
||||
|
||||
- **年齢制限の回避**: YouTubeの年齢確認を回避します
|
||||
|
||||
- **字幕選択**: 字幕を有効にします
|
||||
|
||||
- **コンパクトサイドバー**: サイドバーを常にコンパクトモードに設定します
|
||||
|
||||
- **クロスフェード**: 曲間にクロスフェードを適用します
|
||||
|
||||
- **自動再生の無効化**: すべての曲を「一時停止」モードで開始します
|
||||
|
||||
- **[Discord](https://discord.com/) リッチプレゼンス**: [リッチプレゼンス](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)を使用して、友達にあなたが聴いている曲を表示します
|
||||
|
||||
- **ダウンローダー**: UIから直接MP3/ソースオーディオをダウンロードします
|
||||
|
||||
- **イコライザー**: 特定の周波数範囲をブーストまたはカットするフィルターを追加します(例: ベースブースター)
|
||||
|
||||
- **指数音量**: 音量スライダーを[指数関数的](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/)にして、低い音量を選択しやすくします
|
||||
|
||||
- **アプリ内メニュー**: [メニューバーをおしゃれで暗い外観にします](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||
|
||||
> (このプラグインとメニュー非表示オプションを有効にした後、メニューにアクセスする際に問題がある場合は、[この投稿](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709)を参照してください)
|
||||
|
||||
- **スクロブラー**: [Last.fm](https://www.last.fm/)や[ListenBrainz](https://listenbrainz.org/)のスクロブリングサポートを追加します
|
||||
|
||||
- **Lumia Stream**: [Lumia Stream](https://lumiastream.com/)のサポートを追加します
|
||||
|
||||
- **Genius 歌詞**: ほとんどの曲に歌詞サポートを追加します
|
||||
|
||||
- **Music Together**: プレイリストを他の人と共有します。ホストが曲を再生すると、他の全員が同じ曲を聴くことができます
|
||||
|
||||
- **ナビゲーション**: お気に入りのブラウザのように、UIに直接統合された次/前のナビゲーション矢印を追加します
|
||||
|
||||
- **Googleログインなし**: インターフェースからGoogleログインボタンとリンクを削除します
|
||||
|
||||
- **通知**: 曲の再生が開始されると通知を表示します(Windowsでは[インタラクティブ通知](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png)が利用可能です)
|
||||
|
||||
- **ピクチャーインピクチャー**: アプリをピクチャーインピクチャーモードに切り替えることができます
|
||||
|
||||
- **再生速度**: 速く聴いたり、遅く聴いたりできます!曲の速度を制御するスライダーを追加します
|
||||
|
||||
- **正確な音量**: カスタムHUDとカスタマイズ可能な音量ステップを使用して、マウスホイール/ホットキーで音量を正確に制御します
|
||||
|
||||
- **ショートカット (& MPRIS)**: 再生用のグローバルホットキー(再生/一時停止/次/前)を設定し、メディアキーをオーバーライドしてメディアOSDを無効にし、Ctrl/CMD + Fで検索を有効にし、LinuxのMPRISサポートを有効にし、[上級ユーザー](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)向けの[カスタムホットキー](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50)を追加します
|
||||
|
||||
- **嫌いな曲をスキップ**: 嫌いな曲をスキップします
|
||||
|
||||
- **無音部分をスキップ**: 無音部分を自動的にスキップします
|
||||
|
||||
- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): イントロ/アウトロなどの音楽以外の部分や、曲が再生されていないミュージックビデオの部分を自動的にスキップします
|
||||
|
||||
- **同期歌詞**: [LRClib](https://lrclib.net)のようなプロバイダーを使用して、曲に同期した歌詞を提供します
|
||||
|
||||
- **タスクバーメディアコントロール**: [Windowsタスクバー](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)から再生を制御します
|
||||
|
||||
- **TouchBar**: macOS用のカスタムTouchBarレイアウト
|
||||
|
||||
- **Tuna OBS**: [OBS](https://obsproject.com/)のプラグイン[Tuna](https://obsproject.com/forum/resources/tuna.843/)との統合
|
||||
|
||||
- **ビデオ品質チェンジャー**: ビデオオーバーレイの[ボタン](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png)を使用してビデオ品質を変更できます
|
||||
|
||||
- **ビデオ切り替え**: ビデオ/ソングモードを切り替える[ボタン](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png)を追加します。オプションでビデオタブ全体を削除することもできます
|
||||
|
||||
- **ビジュアライザー**: プレイヤーにさまざまな音楽ビジュアライザーを追加します
|
||||
|
||||
## 翻訳
|
||||
|
||||
[Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/)で翻訳を手伝うことができます。
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="翻訳状況" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="翻訳状況 2" />
|
||||
</a>
|
||||
|
||||
## ダウンロード
|
||||
|
||||
[最新リリース](https://github.com/th-ch/youtube-music/releases/latest)を確認して、最新バージョンをすばやく見つけることができます。
|
||||
|
||||
### Arch Linux
|
||||
|
||||
AURから[`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin)パッケージをインストールします。AURのインストール手順については、この[wikiページ](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages)を参照してください。
|
||||
|
||||
### macOS
|
||||
|
||||
Homebrewを使用してアプリをインストールできます([cask定義](https://github.com/th-ch/homebrew-youtube-music)を参照)。
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
```
|
||||
|
||||
アプリを手動でインストールし、アプリの起動時に「破損しているため開けません」というエラーが表示される場合は、ターミナルで次のコマンドを実行します。
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
[Scoopパッケージマネージャー](https://scoop.sh)を使用して、[`extras`バケット](https://github.com/ScoopInstaller/Extras)から`youtube-music`パッケージをインストールできます。
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
または、Windows 11の公式CLIパッケージマネージャーである[Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/)を使用して、`th-ch.YouTubeMusic`パッケージをインストールできます。
|
||||
|
||||
*注: 「不明な発行元」からのものであるため、Microsoft Defender SmartScreenがインストールをブロックする場合があります。これは、GitHubで手動でダウンロードした後に実行ファイル(.exe)を実行しようとする場合にも当てはまります。*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### ネットワーク接続なしでインストールする方法 (Windows)
|
||||
|
||||
- [リリースページ](https://github.com/th-ch/youtube-music/releases/latest)で_デバイスのアーキテクチャ_に対応する`*.nsis.7z`ファイルをダウンロードします。
|
||||
- `x64`は64ビットWindows用
|
||||
- `ia32`は32ビットWindows用
|
||||
- `arm64`はARM64 Windows用
|
||||
- リリースページでインストーラーをダウンロードします。(`*-Setup.exe`)
|
||||
- それらを**同じディレクトリ**に配置します。
|
||||
- インストーラーを実行します。
|
||||
|
||||
## テーマ
|
||||
|
||||
CSSファイルを読み込んでアプリケーションの外観を変更できます(オプション > 視覚的調整 > テーマ)。
|
||||
|
||||
いくつかの事前定義されたテーマは、https://github.com/kerichdev/themes-for-ytmdesktop-player で利用できます。
|
||||
|
||||
## 開発
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## 独自のプラグインを作成する
|
||||
|
||||
プラグインを使用すると、次のことができます。
|
||||
|
||||
- アプリを操作する - Electronの`BrowserWindow`がプラグインハンドラーに渡されます
|
||||
- HTML/CSSを操作してフロントエンドを変更する
|
||||
|
||||
### プラグインの作成
|
||||
|
||||
`src/plugins/YOUR-PLUGIN-NAME`にフォルダーを作成します。
|
||||
|
||||
- `index.ts`: プラグインのメインファイル
|
||||
```typescript
|
||||
import style from './style.css?inline'; // スタイルをインラインとしてインポート
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'プラグインラベル',
|
||||
restartNeeded: true, // 値がtrueの場合、ytmusicは再起動ダイアログを表示します
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // カスタム設定
|
||||
stylesheets: [style], // カスタムスタイル
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// すべての*ConfigメソッドはPromise<T>でラップされています
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: 'メニュー',
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `値 ${value}`,
|
||||
type: 'radio',
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// レンダラープラグインと通信できます
|
||||
ipc.handle('some-event', () => {
|
||||
return 'hello';
|
||||
});
|
||||
},
|
||||
// 設定が変更されたときに発生します
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// プラグインが無効になったときに発生します
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke('some-event'));
|
||||
},
|
||||
// レンダラーでのみ使用可能なフック
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// プラグイン設定を簡単に設定
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### 一般的な使用例
|
||||
|
||||
- カスタムCSSの挿入: 同じフォルダーに`style.css`ファイルを作成し、次のようにします。
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // スタイルをインラインとしてインポート
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'プラグインラベル',
|
||||
restartNeeded: true, // 値がtrueの場合、ytmusicは再起動ダイアログを表示します
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // カスタム設定
|
||||
stylesheets: [style], // カスタムスタイル
|
||||
renderer() {} // レンダラーフックを定義
|
||||
});
|
||||
```
|
||||
|
||||
- HTMLを変更したい場合:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'プラグインラベル',
|
||||
restartNeeded: true, // 値がtrueの場合、ytmusicは再起動ダイアログを表示します
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // カスタム設定
|
||||
renderer() {
|
||||
// ログインボタンを削除
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // レンダラーフックを定義
|
||||
});
|
||||
```
|
||||
|
||||
- フロントエンドとバックエンドの通信: ElectronのipcMainモジュールを使用して行うことができます。`index.ts`ファイルと`sponsorblock`プラグインの例を参照してください。
|
||||
|
||||
## ビルド
|
||||
|
||||
1. リポジトリをクローン
|
||||
2. [このガイド](https://pnpm.io/installation)に従って`pnpm`をインストール
|
||||
3. `pnpm install --frozen-lockfile`を実行して依存関係をインストール
|
||||
4. `pnpm build:OS`を実行
|
||||
|
||||
- `pnpm dist:win` - Windows
|
||||
- `pnpm dist:linux` - Linux (amd64)
|
||||
- `pnpm dist:linux:deb-arm64` - Linux (Debian用arm64)
|
||||
- `pnpm dist:linux:rpm-arm64` - Linux (Fedora用arm64)
|
||||
- `pnpm dist:mac` - macOS (amd64)
|
||||
- `pnpm dist:mac:arm64` - macOS (arm64)
|
||||
|
||||
[electron-builder](https://github.com/electron-userland/electron-builder)を使用して、macOS、Linux、およびWindows用のアプリをビルドします。
|
||||
|
||||
## プロダクションプレビュー
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## テスト
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
[Playwright](https://playwright.dev/)を使用してアプリをテストします。
|
||||
|
||||
## ライセンス
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## FAQ
|
||||
|
||||
### アプリのメニューが表示されないのはなぜですか?
|
||||
|
||||
`メニューを非表示`オプションがオンの場合 - <kbd>alt</kbd>キー(またはアプリ内メニュープラグインを使用している場合は<kbd>\`</kbd> [バックティック]キー)でメニューを表示できます
|
||||
@ -1,350 +0,0 @@
|
||||
<div align="center">
|
||||
|
||||
# 유튜브 뮤직 (YouTube Music)
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="../../web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
다른 언어로 읽어보세요: [🏴 영어](../../README.md), [🇰🇷 한국인](./README-ko.md), [🇫🇷 프랑스 국민](./README-fr.md), [🇮🇸 아이슬란드어](./README-is.md), [🇪🇸 스페인 사람](./README-es.md), [🇷🇺 러시아인](./README-ru.md), [🇺🇦 우크라이나어](./README-uk.md), [🇧🇷 포르투갈어](./README-pt.md), [🇯🇵 일본어](./README-ja.md)
|
||||
|
||||
**유튜브 뮤직의 Electron 래퍼; 기능:**
|
||||
|
||||
- 원래의 인터페이스를 유지하는 것을 목표로 하는 네이티브 디자인 및 느낌
|
||||
- 맞춤 플러그인을 위한 프레임워크: 스타일, 콘텐츠, 기능 등 필요에 따라 유튜브 뮤직을 변경하고, 클릭 한 번으로 플러그인을 활성화/비활성화할 수 있습니다.
|
||||
|
||||
## Content
|
||||
|
||||
- [기능](#기능)
|
||||
- [사용 가능한 플러그인](#사용-가능한-플러그인)
|
||||
- [번역](#번역)
|
||||
- [다운로드](#다운로드)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [(Windows에서) 네트워크에 연결하지 않고 설치하는 방법은 무엇인가요?](#windows에서-네트워크에-연결하지-않고-설치하는-방법은-무엇인가요)
|
||||
- [테마](#테마)
|
||||
- [개발](#개발)
|
||||
- [나만의 플러그인 만들기](#나만의-플러그인-만들기)
|
||||
- [플러그인 만들기](#플러그인-만들기)
|
||||
- [일반적인 사용 예](#일반적인-사용-예)
|
||||
- [빌드](#빌드)
|
||||
- [프로덕션 빌드 미리보기](#프로덕션-빌드-미리보기)
|
||||
- [테스트](#테스트)
|
||||
- [라이선스](#라이선스)
|
||||
- [자주 묻는 질문](#자주-묻는-질문)
|
||||
|
||||
## 기능:
|
||||
|
||||
- **일시 정지 시 자동 확인** (항상 활성화 됨): 일정 시간이 지나면 음악을 일시 정지하는 ["계속 시청하시겠습니까?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png) 팝업을 비활성화합니다.
|
||||
|
||||
- 이외에 더 많은 기능 ...
|
||||
|
||||
## 사용 가능한 플러그인:
|
||||
|
||||
- **애드블록**: 모든 광고와 트래커를 즉시 차단합니다
|
||||
|
||||
- **앨범 컬러 기반 테마**: 앨범 색상 팔레트를 기반으로 동적 테마 및 시각 효과를 적용합니다
|
||||
|
||||
- **앰비언트 모드**: 영상의 간접 조명을 화면 배경에 투사합니다.
|
||||
|
||||
- **오디오 컴프레서**: 오디오에 컴프레서를 적용합니다 (신호에서 가장 시끄러운 부분의 음량을 낮추고 가장 조용한 부분의 음량을 높임)
|
||||
|
||||
- **네비게이션 바 흐림 효과**: 내비게이션 바를 투명하고 흐릿하게 만듭니다
|
||||
|
||||
- **나이 제한 우회**: 유튜브의 나이 제한을 우회합니다
|
||||
|
||||
- **자막 선택기**: 자막을 활성화합니다
|
||||
|
||||
- **컴팩트 사이드바**: 사이드바를 항상 컴팩트 모드로 설정합니다
|
||||
|
||||
- **크로스페이드**: 노래 사이에 크로스페이드 효과를 적용합니다
|
||||
|
||||
- **자동 재생 해제**: 노래를 '일시 정지' 모드로 시작하게 합니다
|
||||
|
||||
- [**디스코드 활동 상태**](https://discord.com/): [활동 상태 (Rich Presence)](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)를 사용하여 친구들에게 내가 듣는 음악을 보여주세요
|
||||
|
||||
- **다운로더**: UI에서 [직접](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) MP3/소스 오디오를 다운로드하세요
|
||||
|
||||
- **지수 볼륨**: 음량 슬라이더를 [지수적](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/)으로 만들어 더 낮은 음량을 쉽게 선택할 수 있도록 합니다.
|
||||
|
||||
- **인앱 메뉴**: [메뉴 표시줄을 더 멋지게, 그리고 다크 또는 앨범의 색상으로 만듭니다](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||
|
||||
> (이 플러그인 및 메뉴 숨기기 옵션을 활성화한 후 메뉴에 액세스하는 데 문제가 있는 경우 [이 글](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709)을 참조하세요)
|
||||
|
||||
- [**Last.fm**](https://www.last.fm/): Last.fm에 대한 스크러블 지원을 추가합니다
|
||||
|
||||
- **Lumia Stream**: [Lumia Stream](https://lumiastream.com/) 지원을 추가합니다
|
||||
|
||||
- **Genius 가사**: 더 많은 곡에 대해 가사 지원을 추가합니다
|
||||
|
||||
- **네비게이션**: 브라우저에서처럼, UI에 직접 통합된 앞으로/뒤로 탐색하는 화살표를 추가합니다
|
||||
|
||||
- **Google 로그인 제거**: UI에서 Google 로그인 버튼 및 링크 제거하기
|
||||
|
||||
- **알림**: 노래 재생이 시작되면 알림을 표시 (Windows에서는 [대화형 알림](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) 사용 가능)
|
||||
|
||||
- **PiP**: 앱을 PiP 모드로 전환할 수 있게 허용합니다
|
||||
|
||||
- **재생 속도**: 빨리 듣거나, 천천히 들어보세요! [노래 속도를 제어하는 슬라이더를 추가합니다](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
|
||||
|
||||
- **정확한 음량**: 사용자 지정 HUD와 사용자 지정 음량 단계 및 마우스 휠/단축키를 사용하여 음량을 정확하게 제어하세요
|
||||
|
||||
- **영상 품질 체인저**: 영상 오버레이의 [버튼](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png)으로 영상 품질을 변경할 수 있게 합니다
|
||||
|
||||
- **단축키 (& MPRIS)**: 재생을 위한 전역 단축키 설정 허용 (재생/일시 정지/다음/이전) + 미디어 키를 재정의하여 [미디어 osd](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png) 비활성화 + Ctrl/CMD + F 검색 활성화 + 미디어 키에 대한 리눅스 MPRIS 지원 활성화 + [고급 사용자](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)를 위한 [사용자 지정 단축키](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) 지원
|
||||
|
||||
- **무음 건너뛰기** - 노래의 무음 부분을 자동으로 건너뜁니다
|
||||
|
||||
- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): 인트로/아웃트로와 같은 음악이 아닌 부분이나, 노래가 재생되지 않는 뮤직 비디오의 일부를 자동으로 건너뜁니다
|
||||
|
||||
- **작업표시줄 미디어 컨트롤**: [Windows 작업표시줄](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)에서 재생을 제어하세요
|
||||
|
||||
- **TouchBar**: macOS 사용자를 위한 TouchBar 위젯을 추가합니다
|
||||
|
||||
- **Tuna-OBS**: [OBS](https://obsproject.com/)의 플러그인, [Tuna](https://obsproject.com/forum/resources/tuna.843/)와 통합을 활성화합니다
|
||||
|
||||
- **영상 전환**: 영상/노래 모드를 전환하는 [버튼](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png)을 추가합니다. 선택적으로 전체 영상 탭을 제거할 수도 있습니다
|
||||
|
||||
- **비주얼라이저**: 플레이어에 시각화 도구 추가
|
||||
|
||||
## 번역
|
||||
|
||||
[Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/)에서 번역을 도울 수 있습니다.
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="번역 상태" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="번역 상태 2" />
|
||||
</a>
|
||||
|
||||
## 다운로드
|
||||
|
||||
[최신 릴리즈](https://github.com/th-ch/youtube-music/releases/latest)를 확인하여 최신 버전을 빠르게 찾을 수 있습니다.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
AUR에서 [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) 패키지를 설치합니다. AUR 설치 지침은 [이 위키 페이지](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages)를 참조하세요.
|
||||
|
||||
### MacOS
|
||||
|
||||
Homebrew를 사용하여 앱을 설치할 수 있습니다:
|
||||
```bash
|
||||
brew install --cask https://raw.githubusercontent.com/th-ch/youtube-music/master/youtube-music.rb
|
||||
```
|
||||
|
||||
(앱을 수동으로 설치하고) 앱을 실행할 때 `손상되었기 때문에 열 수 없습니다.`라는 오류가 발생하면 터미널에서 다음을 실행하세요:
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
[Scoop 패키지 매니저](https://scoop.sh)를 사용하여 [`extras` 버킷](https://github.com/ScoopInstaller/Extras)에서 `youtube-music` 패키지를 설치할 수 있습니다.
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
또는 Windows 11의 공식 CLI 패키지 관리자인 [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/)을 사용하여 `th-ch.YouTubeMusic` 패키지를 설치할 수 있습니다.
|
||||
|
||||
*참고: "알 수 없는 게시자"의 파일이기 때문에 Microsoft Defender의 SmartScreen에서 설치를 차단할 수 있습니다. 이는 GitHub에서 동일 파일을 수동으로 다운로드한 후 실행 파일(.exe)을 실행하려고 할 때도 마찬가지로 발생합니다.*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### (Windows에서) 네트워크에 연결하지 않고 설치하는 방법은 무엇인가요?
|
||||
|
||||
- [릴리즈 페이지](https://github.com/th-ch/youtube-music/releases/latest)에서 _본인 기기 아키텍처_에 맞는 `*.nsis.7z` 파일을 다운로드하세요.
|
||||
- `x64`는 64비트 Windows 용입니다.
|
||||
- `ia32`는 32비트 Windows 용입니다.
|
||||
- `arm64`는 ARM64 Windows 용입니다.
|
||||
- 릴리즈 페이지에서 설치기를 다운로드하세요. (`*-Setup.exe`)
|
||||
- 두 파일을 **동일한 위치**에 놓아주세요.
|
||||
- 설치기를 실행하세요.
|
||||
|
||||
## 테마
|
||||
|
||||
CSS 파일을 로드하여 애플리케이션의 모양을 변경할 수 있습니다(설정 > 시각적 변경 > 테마).
|
||||
|
||||
일부 사전 정의 테마는 https://github.com/kerichdev/themes-for-ytmdesktop-player 에서 사용할 수 있습니다.
|
||||
|
||||
## 개발
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## 나만의 플러그인 만들기
|
||||
|
||||
플러그인을 사용하면 할 수 있는 것들:
|
||||
|
||||
- 앱 조작 - Electron에서 `BrowserWindow`가 플러그인 핸들러로 전달
|
||||
- HTML/CSS를 조작하여 프론트엔드를 변경
|
||||
|
||||
### 플러그인 만들기
|
||||
|
||||
`plugins/나만의-플러그인-이름`에 폴더를 만듭니다:
|
||||
|
||||
- `index.ts`: 플러그인의 메인 파일입니다.
|
||||
```typescript
|
||||
import style from './style.css?inline'; // 스타일을 인라인으로 가져옵니다
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // 값이 true면, YTM은 재시작 다이얼로그를 표시합니다
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // 나의 커스텀 config
|
||||
stylesheets: [style], // 나의 스타일
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// 모든 *Config 메서드는 Promise<T>로 래핑됩니다
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: 'menu',
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `value ${value}`,
|
||||
type: 'radio',
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// 이를 사용하여 렌더러 플러그인과 통신할 수 있습니다
|
||||
ipc.handle('some-event', () => {
|
||||
return 'hello';
|
||||
});
|
||||
},
|
||||
// config가 변경되면 실행됩니다
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// 플러그인이 비활성화되면 실행됩니다
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke('some-event'));
|
||||
},
|
||||
// 렌더러에서만 사용 가능한 훅입니다
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext<T>) {
|
||||
// 플러그인의 config를 간단하게 설정할 수 있습니다
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### 일반적인 사용 예
|
||||
|
||||
- 사용자 정의 CSS 삽입: 같은 폴더에 `style.css` 파일을 생성합니다:
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // 스타일을 인라인으로 가져옵니다
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // 값이 true면, YTM은 재시작 다이얼로그를 표시합니다
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // 나의 커스텀 config
|
||||
stylesheets: [style], // 나의 커스텀 스타일
|
||||
renderer() {} // 렌더러 훅 정의
|
||||
});
|
||||
```
|
||||
|
||||
- HTML을 변경하려는 경우:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // 값이 true면, YTM은 재시작 다이얼로그를 표시합니다
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // 나의 커스텀 config
|
||||
renderer() {
|
||||
// 로그인 버튼을 제거합니다
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // 렌더러 훅 정의
|
||||
});
|
||||
```
|
||||
|
||||
- 프론트엔드와 백엔드 간의 통신: Electron의 `ipcMain` 모듈을 사용하여 수행할 수 있습니다. `SponsorBlock` 플러그인의 `index.ts` 파일과 예제를 참조하세요.
|
||||
|
||||
## 빌드
|
||||
|
||||
1. 레포지토리를 복제 (clone) 합니다
|
||||
2. [이 가이드](https://pnpm.io/installation)에 따라 `pnpm`을 설치합니다.
|
||||
3. `pnpm install --frozen-lockfile`을 실행하여 종속성을 설치합니다.
|
||||
4. `pnpm build:OS`을 실행합니다.
|
||||
|
||||
- `pnpm dist:win` - Windows
|
||||
- `pnpm dist:linux` - Linux
|
||||
- `pnpm dist:mac` - MacOS
|
||||
|
||||
[electron-builder](https://github.com/electron-userland/electron-builder)를 사용하여 macOS, Linux 및 Windows용 앱을 빌드합니다.
|
||||
|
||||
## 프로덕션 빌드 미리보기
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## 테스트
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
[Playwright](https://playwright.dev/)를 사용하여 앱을 테스트합니다.
|
||||
|
||||
## 라이선스
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## 자주 묻는 질문
|
||||
|
||||
### 앱 메뉴가 표시되지 않는 이유는 무엇인가요?
|
||||
|
||||
`메뉴 숨기기` 옵션이 켜져 있는 경우 - <kbd>alt</kbd> 키(또는 인앱 메뉴 플러그인을 사용하는 경우 <kbd>\`</kbd> [백틱] 키)로 메뉴를 표시할 수 있습니다.
|
||||
@ -1,375 +0,0 @@
|
||||
<div align="center">
|
||||
|
||||
# YouTube Music
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="/web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Leia em outros idiomas: [🏴 Inglês](../../README.md), [🇰🇷 Coreano](./README-ko.md), [🇫🇷 Francês](./README-fr.md), [🇮🇸 Islandês](./README-is.md), [🇪🇸 Espanhol](./README-es.md), [🇷🇺 Russo](./README-ru.md), [🇺🇦 Ucraniano](./README-uk.md), [🇧🇷 Português](./README-pt.md)
|
||||
|
||||
**Wrapper do Electron para o YouTube Music com os seguintes recursos:**
|
||||
|
||||
- Visual e comportamento nativos: Mantém a interface original do YouTube Music.
|
||||
- Estrutura para plugins personalizados: Adapte o YouTube Music às suas necessidades (estilo, conteúdo, funcionalidades). Ative/desative plugins com um clique.
|
||||
|
||||
## Imagem de demonstração
|
||||
|
||||
| Tela do Player (tema de cores do álbum e luz ambiente) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## Conteúdo
|
||||
|
||||
- [Recursos](#recursos)
|
||||
- [Plugins disponíveis](#plugins-disponíveis)
|
||||
- [Tradução](#tradução)
|
||||
- [Download](#download)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [Como instalar sem conexão à internet? (no Windows)](#como-instalar-sem-conexão-à-internet-no-windows)
|
||||
- [Temas](#temas)
|
||||
- [Dev](#dev)
|
||||
- [Crie seus próprios plugins](#crie-seus-próprios-plugins)
|
||||
- [Criando um plugin](#criando-um-plugin)
|
||||
- [Casos de uso comuns](#casos-de-uso-comuns)
|
||||
- [Compilar](#compilar)
|
||||
- [Prévia de produção](#prévia-de-produção)
|
||||
- [Testes](#testes)
|
||||
- [Licença](#licença)
|
||||
- [Perguntas Frequentes](#perguntas-frequentes)
|
||||
|
||||
## Recursos:
|
||||
|
||||
- **Confirmação automática quando pausado** (Sempre ativado): desativa
|
||||
o popup ["Continuar assistindo?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png)
|
||||
que pausa a música após um certo tempo
|
||||
|
||||
- E mais...
|
||||
|
||||
## Plugins disponíveis:
|
||||
|
||||
- **Bloqueador de anúncios**: Bloqueia todos os anúncios e rastreamentos automaticamente
|
||||
|
||||
- **Ações de Álbum**: Adiciona botões para Remover dislike, Dar dislike, Curtir e Remover curtida em todas as músicas de uma playlist ou álbum
|
||||
|
||||
- **Tema de cores do álbum**: Aplica um tema dinâmico e efeitos visuais baseados na paleta de cores do álbum
|
||||
|
||||
- **Modo ambiente**: Cria um efeito de iluminação projetando cores suaves do vídeo no fundo da tela
|
||||
|
||||
- **Compressor de áudio**: Aplica compressão ao áudio (reduz o volume das partes mais altas e aumenta o das mais baixas)
|
||||
|
||||
- **Barra de navegação desfocada**: Torna a barra de navegação transparente e desfocada
|
||||
|
||||
- **Contornar restrições de idade**: Ignora a verificação de idade do YouTube
|
||||
|
||||
- **Seletor de legendas**: Ativa legendas
|
||||
|
||||
- **Barra lateral compacta**: Mantém a barra lateral sempre no modo compacto
|
||||
|
||||
- **Crossfade**: Transição suave entre músicas
|
||||
|
||||
- **Desativar reprodução automática**: Faz com que todas as músicas iniciem no modo "pausado"
|
||||
|
||||
- **[Discord](https://discord.com/) Rich Presence**: Mostra para seus amigos o que você está ouvindo com [Rich Presence](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)
|
||||
|
||||
- **Downloader**: Baixa MP3 [diretamente da interface](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Equalizador**: Adiciona filtros para aumentar ou reduzir faixas específicas de frequência (ex: reforço de graves)
|
||||
|
||||
- **Volume exponencial**: Torna o controle de volume [exponencial](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) para facilitar a seleção de volumes mais baixos
|
||||
|
||||
- **Menu integrado**: [Dá às barras um visual elegante e escuro](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||
|
||||
> (veja [este post](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709) se tiver problemas para acessar o menu após ativar este plugin e a opção de ocultar menu)
|
||||
|
||||
- **Scrobbler**: Adiciona suporte para scrobbling no [Last.fm](https://www.last.fm/) e [ListenBrainz](https://listenbrainz.org/)
|
||||
|
||||
- **Lumia Stream**: Adiciona suporte para [Lumia Stream](https://lumiastream.com/)
|
||||
|
||||
- **Letras Genius**: Adiciona suporte a letras para a maioria das músicas
|
||||
|
||||
- **Música Juntos**: Compartilhe uma playlist com outros. Quando o host toca uma música, todos ouvem a mesma música
|
||||
|
||||
- **Navegação**: Botões de avançar/voltar integrados diretamente na interface, como no seu navegador favorito
|
||||
|
||||
- **Sem login do Google**: Remove botões e links de login do Google da interface
|
||||
|
||||
- **Notificações**: Exibe uma notificação quando uma música começa a tocar ([notificações interativas](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) disponíveis no Windows)
|
||||
|
||||
- **Picture-in-picture**: Permite alternar o aplicativo para o modo picture-in-picture
|
||||
|
||||
- **Velocidade de reprodução**: Ouça rápido, ouça devagar! [Adiciona um controle deslizante para ajustar a velocidade](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
|
||||
|
||||
- **Volume preciso**: Controle o volume com precisão usando roda do mouse/atalhos, com HUD personalizado e níveis de volume customizáveis
|
||||
|
||||
- **Atalhos (& MPRIS)**: Permite configurar teclas de atalho globais para controle (play/pause/próxima/anterior) + desativa [OSD de mídia](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png) sobrescrevendo teclas de mídia + ativa Ctrl/CMD + F para busca + suporte a MPRIS no Linux para teclas de mídia + [atalhos personalizados](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) para [usuários avançados](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)
|
||||
|
||||
- **Pular músicas marcadas com "não gostei"**: Ignora automaticamente músicas que você deu dislike
|
||||
|
||||
- **Pular silêncios**: Ignora automaticamente seções silenciosas
|
||||
|
||||
- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): Ignora automaticamente partes não musicais como introduções/outros ou partes de clipes onde a música não está tocando
|
||||
|
||||
- **Letras sincronizadas**: Fornece letras sincronizadas para músicas, usando serviços como [LRClib](https://lrclib.net)
|
||||
|
||||
- **Controle de mídia na barra de tarefas**: Controle a reprodução pela [barra de tarefas do Windows](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)
|
||||
|
||||
- **TouchBar**: Layout personalizado para a TouchBar do macOS
|
||||
|
||||
- **Tuna OBS**: Integração com o plugin [Tuna](https://obsproject.com/forum/resources/tuna.843/) do [OBS](https://obsproject.com/)
|
||||
|
||||
- **Seletor de qualidade de vídeo**: Permite alterar a qualidade do vídeo com um [botão](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) na sobreposição do vídeo
|
||||
|
||||
- **Alternar vídeo**: Adiciona um [botão](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) para alternar entre modos Vídeo/Música. Pode também remover completamente a aba de vídeo
|
||||
|
||||
- **Visualizador**: Diferentes visualizadores de música
|
||||
|
||||
## Tradução
|
||||
|
||||
Você pode ajudar com as traduções no [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="status da tradução" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="status da tradução 2" />
|
||||
</a>
|
||||
|
||||
## Download
|
||||
|
||||
Você pode verificar o [último lançamento](https://github.com/th-ch/youtube-music/releases/latest) para encontrar rapidamente a versão mais recente.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Instale o pacote [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) do AUR. Para instruções de instalação do AUR, consulte esta [página da wiki](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||
|
||||
### macOS
|
||||
|
||||
Você pode instalar o aplicativo usando Homebrew (veja a [definição do cask](https://github.com/th-ch/homebrew-youtube-music)):
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
```
|
||||
|
||||
Se você instalar o aplicativo manualmente e receber o erro "is damaged and can’t be opened." ao abrir o app, execute o seguinte no Terminal:
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
Você pode usar o [gerenciador de pacotes Scoop](https://scoop.sh) para instalar o pacote `youtube-music` do [`extras bucket`](https://github.com/ScoopInstaller/Extras).
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
Alternativamente, você pode usar o [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), o gerenciador de pacotes CLI oficial do Windows 11, para instalar o pacote `th-ch.YouTubeMusic`.
|
||||
|
||||
*Nota: O Microsoft Defender SmartScreen pode bloquear a instalação por ser de um "publicador desconhecido". Isso também acontece na instalação manual ao tentar executar o arquivo .exe após download manual aqui no GitHub (mesmo arquivo).*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### Como instalar sem conexão à internet? (no Windows)
|
||||
|
||||
- Baixe o arquivo `*.nsis.7z` para _sua arquitetura de dispositivo_ na [página de lançamentos](https://github.com/th-ch/youtube-music/releases/latest).
|
||||
- `x64` para Windows 64-bit
|
||||
- `ia32` para Windows 32-bit
|
||||
- `arm64` para Windows ARM64
|
||||
- Baixe o instalador na página de lançamentos (`*-Setup.exe`)
|
||||
- Coloque os arquivos no **mesmo diretório**
|
||||
- Execute o instalador
|
||||
|
||||
## Temas
|
||||
|
||||
Você pode carregar arquivos CSS para alterar a aparência do aplicativo (Opções > Ajustes Visuais > Temas).
|
||||
|
||||
Alguns temas pré-definidos estão disponíveis em https://github.com/kerichdev/themes-for-ytmdesktop-player.
|
||||
|
||||
## Dev
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Crie seus próprios plugins
|
||||
|
||||
Usando plugins, você pode:
|
||||
|
||||
- Manipular o aplicativo - o `BrowserWindow` do electron é passado para o manipulador de plugins
|
||||
- Alterar a interface manipulando o HTML/CSS
|
||||
|
||||
### Criando um plugin
|
||||
|
||||
Crie uma pasta em `src/plugins/NOMBRE-DEL-PLUGIN`:
|
||||
|
||||
- `index.ts`: o arquivo principal do plugin
|
||||
```typescript
|
||||
import style from './style.css?inline'; // importar estilo como inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: "Plugin Label",
|
||||
restartNeeded: true, // se true, o ytmusic mostra diálogo de reinício
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // sua configuração personalizada
|
||||
stylesheets: [style], // seu estilo personalizado
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// Todos os métodos *Config são wrappers Promise<T>
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: "menu",
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `value ${value}`,
|
||||
type: "radio",
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// você pode se comunicar com o plugin renderer
|
||||
ipc.handle("some-event", () => {
|
||||
return "hello";
|
||||
});
|
||||
},
|
||||
// disparado quando a configuração muda
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// disparado quando o plugin é desativado
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke("some-event"));
|
||||
},
|
||||
// Hook disponível apenas no renderer
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// establecer la configuración del plugin fácilmente
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
|
||||
```
|
||||
|
||||
### Casos de uso comuns
|
||||
|
||||
- **Injetar CSS personalizado**: crie um arquivo `style.css` na mesma pasta e então:
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // importa estilo como inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // se true, o ytmusic mostrará um diálogo de reinício
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // sua configuração personalizada
|
||||
stylesheets: [style], // seu estilo personalizado
|
||||
renderer() {} // define o hook renderer
|
||||
});
|
||||
```
|
||||
|
||||
- Se quiser alterar o HTML:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // se true, o ytmusic mostrará o diálogo de reinício
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // sua configuração personalizada
|
||||
renderer() {
|
||||
// Remove o botão de login
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // define o hook renderer
|
||||
});
|
||||
```
|
||||
|
||||
- Comunicação entre front-end e back-end: pode ser feita usando o módulo ipcMain do Electron. Consulte o arquivo `index.ts` e o exemplo no plugin `sponsorblock`.
|
||||
|
||||
## Compilar
|
||||
|
||||
1. Clone o repositório
|
||||
2. Siga [este guia](https://pnpm.io/installation) para instalar o `pnpm`
|
||||
3. Execute `pnpm install --frozen-lockfile` para instalar as dependências
|
||||
4. Execute `pnpm build:OS`
|
||||
|
||||
- `pnpm dist:win` - Windows
|
||||
- `pnpm dist:linux` - Linux (amd64)
|
||||
- `pnpm dist:linux:deb-arm64` - Linux (arm64 para Debian)
|
||||
- `pnpm dist:linux:rpm-arm64` - Linux (arm64 para Fedora)
|
||||
- `pnpm dist:mac` - macOS (amd64)
|
||||
- `pnpm dist:mac:arm64` - macOS (arm64)
|
||||
|
||||
Compila o aplicativo para macOS, Linux e Windows,
|
||||
usando [electron-builder](https://github.com/electron-userland/electron-builder).
|
||||
|
||||
## Prévia de Produção
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Testes
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
Utiliza [Playwright](https://playwright.dev/) para testar o aplicativo.
|
||||
|
||||
## Licença
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## Perguntas Frequentes
|
||||
|
||||
### Por que o menu do aplicativo não aparece?
|
||||
|
||||
Se a opção `Ocultar menu` estiver ativada - você pode exibir o menu com a tecla <kbd>alt</kbd> (ou <kbd>\`</kbd> [acento grave] se estiver usando o plugin in-app-menu)
|
||||
@ -1,374 +0,0 @@
|
||||
<div align="center">
|
||||
|
||||
# YouTube Music
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="../../web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Прочтите это на других языках: [🏴 Английский](../../README.md), [🇰🇷 корейский](./README-ko.md), [🇫🇷 Французский](./README-fr.md), [🇮🇸 исландский](./README-is.md), [🇪🇸 испанский](./README-es.md), [🇷🇺 Русский](./README-ru.md), [🇺🇦 Украинский](./README-uk.md), [🇧🇷 Португальский](./README-pt.md)
|
||||
|
||||
**Клиент для YouTube Music основанный на Electron с поддержкой:**
|
||||
|
||||
- Нативный вид приложения, нацелен на сохранение оригинального интерфейса
|
||||
- Фреймворк для пользовательских плагинов: изменяйте YouTube Music под ваши нужды (внешний вид, контент, возможности), включайте/выключайте плагины в один клик
|
||||
|
||||
## Демо-изображение
|
||||
|
||||
| Экран плеера (цветовая тема альбома & режим Ambient) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Возможности](#Возможности)
|
||||
- [Доступные плагины](#Доступные-плагины)
|
||||
- [Перевод](#Перевод)
|
||||
- [Скачать](#Скачать)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [Как установить без подключения к интернету? (в Windows)](#Установка-без-подключения-к-Интернету-в-Windows)
|
||||
- [Темы](#Темы)
|
||||
- [Для разработчиков](#Для-разработчиков)
|
||||
- [Создайте свои собственные плагины](#Создайте-свои-собственные-плагины)
|
||||
- [Создание плагина](#Создание-плагина)
|
||||
- [Примеры использования](#Примеры-использования)
|
||||
- [Сборка](#Сборка)
|
||||
- [Предварительный просмотр](#Предварительный-просмотр)
|
||||
- [Тестирование](#Тестирование)
|
||||
- [Лицензия](#Лицензия)
|
||||
- [Часто задаваемые вопросы](#Часто-задаваемые-вопросы)
|
||||
|
||||
## Возможности:
|
||||
|
||||
- **Авто-подтверждение при паузе** (Всегда включено): отключает всплывающие уведомление ["Продолжить просмотр?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png),
|
||||
которое приостанавливает воспроизведение через определённое время
|
||||
|
||||
- И больше ...
|
||||
|
||||
## Доступные плагины:
|
||||
|
||||
- **Блокировщик рекламы**: Блокирует всю рекламу и трекеры
|
||||
|
||||
- **Действия с альбомом**: Добавляет кнопки "Убрать дизлайк", "Дизлайк", "Лайк", "Убрать лайк" и применяет их действия ко всем трекам в плейлисте или альбоме
|
||||
|
||||
- **Цветовая тема альбома**: Применяет динамическую тему и эффекты, основываясь на цветовой палитре альбома
|
||||
|
||||
- **Режим Ambient**: Применяет световой эффект, проецируя нежные цвета из видео на задний фон вашего экрана
|
||||
|
||||
- **Нормализация аудио**: Применяет нормализацию к аудио (уменьшает громкость громких частей трека и повышает громкость тихих частей трека)
|
||||
|
||||
- **Размытие панели навигации**: Делает панель навигации прозрачной и размытой
|
||||
|
||||
- **Обход возрастных ограничений**: Обходит проверку возраста YouTube
|
||||
|
||||
- **Выбор субтитров**: Включить субтитры
|
||||
|
||||
- **Компактная боковая панель**: Всегда показывать боковую панель компактно
|
||||
|
||||
- **Плавный переход**: Плавный переход между треками
|
||||
|
||||
- **Отключить автопроигрыш**: Каждый трек начинается в режиме паузы
|
||||
|
||||
- **[Discord](https://discord.com/) Rich Presence**: Показывает вашим друзьям, что вы слушаете с помощью [Rich Presence](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)
|
||||
|
||||
- **Загрузчик**: Загрузка MP3 [напрямую из интерфейса](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Расширенная громкость**: Делает слайдер громкости [расширенным](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) облегчая выбор громкости
|
||||
|
||||
- **Меню в приложении**: [Придаёт панели меню красивый тёмный вид](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||
|
||||
> (посмотрите [этот пост,](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709) если у вас есть проблемы с доступом к меню после включения этого плагина и опции "Скрыть меню")
|
||||
|
||||
- **Скробблер**: Добавляет поддержку скробблинга [Last.fm](https://www.last.fm/) и [ListenBrainz](https://listenbrainz.org/)
|
||||
|
||||
- **Lumia Stream**: Добавляет поддержку [Lumia Stream](https://lumiastream.com/)
|
||||
|
||||
- **Тесты песен Genius**: Добавляет поддержку текстов для большинства песен
|
||||
|
||||
- **Music Together**: Делитесь плейлистом с другими. Когда ведущий воспроизводит трек, все остальные будут слушать этот же трек.
|
||||
|
||||
- **Навигация**: Кнопки Назад/Вперед интегрированы в интерфейс, как в вашем любимом браузере
|
||||
|
||||
- **Без входа в систему Google**: Убирает из интерфейса кнопки и ссылки для входа через Google
|
||||
|
||||
- **Уведомления**: Показывает уведомление, когда трек начинает играть ([интерактивные уведомления](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) доступны только для Windows)
|
||||
|
||||
- **Картинка в картинке**: Позволяет переключить приложение в режим "картинка в картинке"
|
||||
|
||||
- **Скорость воспроизведения**: Слушайте быстрее, слушайте медленнее! [Добавляет слайдер для контроля скорости трека](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
|
||||
|
||||
- **Точная громкость**: Точечно управляйте громкостью с помощью колеса мыши/горячих клавиш, с кастомным интерфейсом и настраиваемыми шагами громкости
|
||||
|
||||
- **Ярлыки (и MPRIS)**: Позволяет настроить глобальные горячие клавиши управления воспроизведением (плей/пауза/следующий/предыдущий) + отключает [отображение медиа на экране,](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png) переопределяя клавиши управления + включает Ctrl/CMD + F для поиска + включает поддержку linux mpris для клавиш управления медиа + [настраиваемые сочетания клавиш](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) для [продвинутых пользователей](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)
|
||||
|
||||
- **Пропускать непонравившиеся треки**: Пропускает непонравившиеся треки
|
||||
|
||||
- **Пропуск тишины**: Автоматически пропускает тихие моменты в песнях
|
||||
|
||||
- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): Автоматически пропускает немузыкальные части, такие как интро/аутро музыкальных видео, где трек не играет
|
||||
|
||||
- **Управление воспроизведением из панели задач**: Управляйте воспроизведением из [панели задач Windows](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)
|
||||
|
||||
- **TouchBar**: Кастомная раскладка TouchBar для MacOS
|
||||
|
||||
- **Tuna OBS**: Интеграция с [OBS](https://obsproject.com/) плагином [Tuna](https://obsproject.com/forum/resources/tuna.843/)
|
||||
|
||||
- **Изменение качества видео**: Позволяет менять качество видео [кнопкой](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) на медиаплеере видео
|
||||
|
||||
- **Переключатель видео**: Добавляет
|
||||
[кнопку](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) переключения режимов Трек/Видео. Также может удалять вкладку "Видео" полностью
|
||||
|
||||
- **Визуализатор**: Различные визуализаторы музыки
|
||||
|
||||
- **Synced Lyrics**:
|
||||
Предоставляет синхронизированные слова для песен из таких источников, как [LRClib](https://lrclib.net).
|
||||
|
||||
## Перевод
|
||||
|
||||
Вы можете помочь с переводом на ваш язык на [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="translation status" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="translation status 2" />
|
||||
</a>
|
||||
|
||||
## Скачать
|
||||
|
||||
Вы можете посмотреть [latest release,](https://github.com/th-ch/youtube-music/releases/latest) чтобы быстро найти новую версию.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Установите пакет [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) из AUR. Инструкции по установке из AUR можете найти на этой [вики-странице](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||
|
||||
### macOS
|
||||
|
||||
Вы можете установить приложение с помощью Homebrew (сморите [cask definition](https://github.com/th-ch/homebrew-youtube-music)):
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
```
|
||||
|
||||
Если вы устанавливаете приложение вручную и получаете ошибку "is damaged and can’t be opened.", запустите в терминале следующую команду:
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
Вы можете использовать [пакетный менеджер Scoop](https://scoop.sh) для установки пакета `youtube-music` из [`extras` bucket](https://github.com/ScoopInstaller/Extras).
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
Также для установки вы можете использовать [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), официальный пакетный менеджер командной строки Windows 11, для установки пакета `th-ch.YouTubeMusic`.
|
||||
|
||||
*К сведению: SmartScreen защитника Windows может блокировать установку, так как она от "неизвестного издателя". Это также применимо к методу ручной установки, когда вы пытаетесь запустить исполняемый файл(.exe) после загрузки здесь, на GitHub (тот же файл).*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### Установка без подключения к Интернету? (в Windows)
|
||||
|
||||
- Скачайте файл `*.nsis.7z` из _архетиктура вашего устройства_ на [release page](https://github.com/th-ch/youtube-music/releases/latest).
|
||||
- `x64` для 64-bit Windows
|
||||
- `ia32` для 32-bit Windows
|
||||
- `arm64` для ARM64 Windows
|
||||
- Скачайте установщик в release page. (`*-Setup.exe`)
|
||||
- Поместите их в **одной директории**.
|
||||
- Запустите установщик.
|
||||
|
||||
## Темы
|
||||
|
||||
Вы можете загрузить файл CSS для смены внешнего вида приложения (Настройки > Визуальные настройки > Тема).
|
||||
|
||||
Некоторые предустановленные темы доступны здесь: https://github.com/kerichdev/themes-for-ytmdesktop-player.
|
||||
|
||||
## Для разработчиков
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Создайте свои собственные плагины
|
||||
|
||||
Используя плагины вы можете:
|
||||
|
||||
- Манипулировать приложением - `BrowserWindow` из electron проброшен обработчику плагинов
|
||||
- Изменять внешний вид, манипулируя HTML/CSS
|
||||
|
||||
### Создание плагина
|
||||
|
||||
Создайте директорию в `src/plugins/YOUR-PLUGIN-NAME`:
|
||||
|
||||
- `index.ts`: основной файл плагина
|
||||
```typescript
|
||||
import style from './style.css?inline'; // import style as inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic show restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
stylesheets: [style], // your custom style,
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// All *Config methods are wrapped Promise<T>
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: 'menu',
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `value ${value}`,
|
||||
type: 'radio',
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// you can communicate with renderer plugin
|
||||
ipc.handle('some-event', () => {
|
||||
return 'hello';
|
||||
});
|
||||
},
|
||||
// it fired when config changed
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// it fired when plugin disabled
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke('some-event'));
|
||||
},
|
||||
// Only renderer available hook
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// set plugin config easily
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Примеры использования
|
||||
|
||||
- Кастомный CSS: создайте файл `style.css` в той же директории, затем:
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // import style as inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic will show a restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
stylesheets: [style], // your custom style
|
||||
renderer() {} // define renderer hook
|
||||
});
|
||||
```
|
||||
|
||||
- Если вы хотите изменить HTML:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic will show the restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
renderer() {
|
||||
// Remove the login button
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // define renderer hook
|
||||
});
|
||||
```
|
||||
|
||||
- обмен между фронтом и бэком может быть выполнен с помощью модуля ipcMain из electron. Смотрите файл `index.ts` и
|
||||
пример в плагине `sponsorblock`.
|
||||
|
||||
## Сборка
|
||||
|
||||
1. Склонируйте репозиторий
|
||||
2. Следуйте [этой инструкции,](https://pnpm.io/installation) чтобы установить `pnpm`
|
||||
3. Запустите `pnpm install --frozen-lockfile` для установки зависимостей
|
||||
4. Запустите `pnpm build:OS`
|
||||
|
||||
- `pnpm dist:win` - Windows
|
||||
- `pnpm dist:linux` - Linux (amd64)
|
||||
- `pnpm dist:linux:deb-arm64` - Linux (arm64 for Debian)
|
||||
- `pnpm dist:linux:rpm-arm64` - Linux (arm64 for Fedora)
|
||||
- `pnpm dist:mac` - macOS (amd64)
|
||||
- `pnpm dist:mac:arm64` - macOS (arm64)
|
||||
|
||||
Сборка приложения для macOS, Linux, и Windows,
|
||||
используя [electron-builder](https://github.com/electron-userland/electron-builder).
|
||||
|
||||
## Предварительный просмотр
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Тестирование
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
Использует [Playwright](https://playwright.dev/) для тестирования приложения.
|
||||
|
||||
## Лицензия
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## Часто задаваемые вопросы
|
||||
|
||||
### Почему меня приложения не отображается?
|
||||
|
||||
Если опция `Скрыть меню` включена - вы можете отобразить меню с помощью клавиши <kbd>alt</kbd> (или <kbd>\`</kbd> [обратный апостроф], если используете плагин "Меню в приложении")
|
||||
@ -1,372 +0,0 @@
|
||||
<div align="center">
|
||||
|
||||
# YouTube Music
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/eslint.config.mjs)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="../../web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Прочитайте це іншими мовами: [🏴 Англійська](../../README.md), [🇰🇷 Корейська](./README-ko.md), [🇫🇷 Французька](./README-fr.md), [🇮🇸 Ісландська](./README-is.md), [🇪🇸 Іспанська](./README-es.md), [🇷🇺 Російська](./README-ru.md), [🇺🇦 Українська](./README-uk.md), [🇭🇺 Угорська](./README-hu.md), [🇧🇷 Португальська](./README-pt.md), [🇯🇵 Японська](./README-ja.md)
|
||||
|
||||
**Клієнт YouTube Music на основі Electron, що має:**
|
||||
|
||||
- Нативний вигляд і функціонал, що має на меті зберегти оригінальний інтерфейс
|
||||
- Фреймворк для користувацьких плагінів: змінюйте YouTube Music відповідно до ваших потреб (стиль, вміст, функції), вмикайте/вимикайте плагіни одним клацанням миші
|
||||
|
||||
## Демонстраційне зображення
|
||||
|
||||
| Екран плеєра (колірна тема альбому та режим Ambient) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## Зміст
|
||||
|
||||
- [Можливості](#Можливості)
|
||||
- [Доступні плагіни](#Доступні-плагіни)
|
||||
- [Переклад](#Переклад)
|
||||
- [Завантажити](#Завантажити)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [Як встановити без підключення до Інтернету? (у Windows)](#Встановлення-без-підключення-до-Інтернету-у-Windows)
|
||||
- [Теми](#Теми)
|
||||
- [Розробка](#Розробка)
|
||||
- [Створіть власні плагіни](#Створіть-власні-плагіни)
|
||||
- [Створення плагіна](#Створення-плагіна)
|
||||
- [Поширені випадки використання](#Поширені-випадки-використання)
|
||||
- [Збірка](#Збірка)
|
||||
- [Попередній перегляд для producción](#Попередній-перегляд-для-production)
|
||||
- [Тести](#Тести)
|
||||
- [Ліцензія](#Ліцензія)
|
||||
- [Поширені запитання](#Поширені-запитання)
|
||||
|
||||
## Можливості:
|
||||
|
||||
- **Автоматичне підтвердження під час паузи** (Завжди ввімкнено): вимикає спливаюче вікно ["Продовжити перегляд?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png),
|
||||
яке призупиняє музику через певний час
|
||||
|
||||
- Та багато іншого...
|
||||
|
||||
## Доступні плагіни:
|
||||
|
||||
- **Блокувальник реклами**: Блокує всю рекламу та відстеження «з коробки»
|
||||
|
||||
- **Дії з альбомом**: Додає кнопки «Скасувати "Не подобається"», «Не подобається», «Подобається» та «Скасувати "Подобається"», щоб застосувати це до всіх пісень у списку відтворення або альбомі
|
||||
|
||||
- **Колірна тема альбому**: Застосовує динамічну тему та візуальні ефекти на основі колірної палітри альбому
|
||||
|
||||
- **Режим Ambient**: Застосовує ефект освітлення, проектуючи м'які кольори з відео на фон екрана
|
||||
|
||||
- **Аудіокомпресор**: Застосовує компресію до аудіо (знижує гучність найгучніших частин сигналу та підвищує гучність найтихіших частин)
|
||||
|
||||
- **Розмиття панелі навігації**: робить панель навігації прозорою та розмитою
|
||||
|
||||
- **Обхід вікових обмежень**: обходить перевірку віку YouTube
|
||||
|
||||
- **Вибір субтитрів**: Увімкнути субтитри
|
||||
|
||||
- **Компактна бічна панель**: Завжди встановлювати бічну панель у компактному режимі
|
||||
|
||||
- **Плавний перехід**: Плавний перехід між піснями
|
||||
|
||||
- **Вимкнути автопрогравання**: Кожна пісня починається в режимі "пауза"
|
||||
|
||||
- **[Discord](https://discord.com/) Rich Presence**: Покажіть друзям, що ви слухаєте, за допомогою [Rich Presence](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)
|
||||
|
||||
- **Завантажувач**: завантажує MP3 [безпосередньо з інтерфейсу](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Експоненціальна гучність**: Робить повзунок гучності [експоненціальним](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/), щоб було легше вибирати нижчу гучність
|
||||
|
||||
- **Меню в програмі**: [надає панелям модного, темного вигляду](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||
|
||||
> (дивіться [цей пост](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709), якщо у вас виникли проблеми з доступом до меню після ввімкнення цього плагіна та опції приховування меню)
|
||||
|
||||
- **Скробблер**: Додає підтримку скробблінгу для [Last.fm](https://www.last.fm/) та [ListenBrainz](https://listenbrainz.org/)
|
||||
|
||||
- **Lumia Stream**: Додає підтримку [Lumia Stream](https://lumiastream.com/)
|
||||
|
||||
- **Тексти пісень Genius**: Додає підтримку текстів для більшості пісень
|
||||
|
||||
- **Музика разом**: Поділіться списком відтворення з іншими. Коли хост відтворює пісню, всі інші чутимуть ту саму пісню
|
||||
|
||||
- **Навігація**: Стрілки навігації «Вперед»/«Назад» безпосередньо інтегровані в інтерфейс, як у вашому улюбленому браузері
|
||||
|
||||
- **Без входу в Google**: Видаляє кнопки та посилання для входу в Google з інтерфейсу
|
||||
|
||||
- **Сповіщення**: Відображає сповіщення, коли починає грати пісня ([інтерактивні сповіщення](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) доступні у Windows)
|
||||
|
||||
- **Картинка в картинці**: дозволяє перемикати програму в режим «картинка в картинці»
|
||||
|
||||
- **Швидкість відтворення**: Слухайте швидко, слухайте повільно! [Додає повзунок, який контролює швидкість пісні](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
|
||||
|
||||
- **Точна гучність**: Точно керуйте гучністю за допомогою коліщатка миші/гарячих клавіш, з власним HUD та настроюваними кроками гучності
|
||||
|
||||
- **Гарячі клавіші (та MPRIS)**: Дозволяє встановлювати глобальні гарячі клавіші для відтворення (відтворення/пауза/наступна/попередня) + вимкнути [екранне меню медіа](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png) шляхом перевизначення медіаклавіш + увімкнути Ctrl/CMD + F для пошуку + увімкнути підтримку mpris у Linux для медіаклавіш + [власні гарячі клавіші](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) для [досвідчених користувачів](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)
|
||||
|
||||
- **Пропускати пісні, що не сподобалися**: Пропускає пісні, які вам не сподобалися
|
||||
|
||||
- **Пропускати тишу**: Автоматично пропускати тихі фрагменти
|
||||
|
||||
- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): Автоматично пропускає немузичні частини, такі як інтро/аутро, або частини музичних відео, де пісня не грає
|
||||
|
||||
- **Керування медіа на панелі завдань**: Керуйте відтворенням з [панелі завдань Windows](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)
|
||||
|
||||
- **TouchBar**: Власний макет TouchBar для macOS
|
||||
|
||||
- **Tuna OBS**: Інтеграція з плагіном [Tuna](https://obsproject.com/forum/resources/tuna.843/) для [OBS](https://obsproject.com/)
|
||||
|
||||
- **Зміна якості відео**: Дозволяє змінювати якість відео за допомогою [кнопки](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) на відеопрогравачі
|
||||
|
||||
- **Перемикач відео**: Додає [кнопку](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) для перемикання між режимом відео/пісні. Також може опціонально видалити всю вкладку відео
|
||||
|
||||
- **Візуалізатор**: Різні музичні візуалізатори
|
||||
|
||||
- **Синхронізовані тексти**: Надає синхронізовані тексти пісень, використовуючи такі джерела, як [LRClib](https://lrclib.net).
|
||||
|
||||
## Переклад
|
||||
|
||||
Ви можете допомогти з перекладом на [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="статус перекладу" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="статус перекладу 2" />
|
||||
</a>
|
||||
|
||||
## Завантажити
|
||||
|
||||
Ви можете переглянути [останній реліз](https://github.com/th-ch/youtube-music/releases/latest), щоб швидко знайти найновішу версію.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Встановіть пакет [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) з AUR. Інструкції щодо встановлення з AUR можна знайти на цій [сторінці вікі](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||
|
||||
### macOS
|
||||
|
||||
Ви можете встановити програму за допомогою Homebrew (дивіться [визначення cask](https://github.com/th-ch/homebrew-youtube-music)):
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
```
|
||||
|
||||
Якщо ви встановлюєте програму вручну та отримуєте помилку "is damaged and can’t be opened.", запустіть у Терміналі таку команду:
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
Ви можете використовувати [менеджер пакунків Scoop](https://scoop.sh) для встановлення пакунка `youtube-music` з [`extras` bucket](https://github.com/ScoopInstaller/Extras).
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
Крім того, ви можете використовувати [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), офіційний менеджер пакунків командного рядка Windows 11, для встановлення пакунка `th-ch.YouTubeMusic`.
|
||||
|
||||
*Примітка: Microsoft Defender SmartScreen може блокувати встановлення, оскільки воно від "невідомого видавця". Це також стосується ручного встановлення під час спроби запустити виконуваний файл (.exe) після ручного завантаження тут, на GitHub (той самий файл).*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### Як встановити без підключення до Інтернету? (у Windows)
|
||||
|
||||
- Завантажте файл `*.nsis.7z` для _архітектури вашого пристрою_ зі [сторінки релізів](https://github.com/th-ch/youtube-music/releases/latest).
|
||||
- `x64` для 64-розрядної Windows
|
||||
- `ia32` для 32-розрядної Windows
|
||||
- `arm64` для ARM64 Windows
|
||||
- Завантажте інсталятор зі сторінки релізів. (`*-Setup.exe`)
|
||||
- Розмістіть їх в **одному каталозі**.
|
||||
- Запустіть інсталятор.
|
||||
|
||||
## Теми
|
||||
|
||||
Ви можете завантажити файли CSS, щоб змінити вигляд програми (Опції > Візуальні налаштування > Теми).
|
||||
|
||||
Деякі попередньо визначені теми доступні за адресою https://github.com/kerichdev/themes-for-ytmdesktop-player.
|
||||
|
||||
## Розробка
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Створіть власні плагіни
|
||||
|
||||
Використовуючи плагіни, ви можете:
|
||||
|
||||
- маніпулювати програмою - `BrowserWindow` з Electron передається обробнику плагінів
|
||||
- змінювати фронтенд, маніпулюючи HTML/CSS
|
||||
|
||||
### Створення плагіна
|
||||
|
||||
Створіть теку в `src/plugins/НАЗВА_ВАШОГО_ПЛАГІНА`:
|
||||
|
||||
- `index.ts`: основний файл плагіна
|
||||
```typescript
|
||||
import style from './style.css?inline'; // імпортувати стиль як вбудований
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Назва плагіна',
|
||||
restartNeeded: true, // якщо значення true, ytmusic покаже діалогове вікно перезапуску
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // ваша власна конфігурація
|
||||
stylesheets: [style], // ваш власний стиль,
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// Усі методи *Config є обгорнутими Promise<T>
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: 'меню',
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `значення ${value}`,
|
||||
type: 'radio',
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// ви можете спілкуватися з плагіном рендерера
|
||||
ipc.handle('some-event', () => {
|
||||
return 'hello';
|
||||
});
|
||||
},
|
||||
// викликається при зміні конфігурації
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// викликається при вимкненні плагіна
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke('some-event'));
|
||||
},
|
||||
// Хук, доступний лише для рендерера
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// легко встановити конфігурацію плагіна
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Поширені випадки використання
|
||||
|
||||
- ін'єкція власного CSS: створіть файл `style.css` у тій самій теці, а потім:
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // імпортувати стиль як вбудований
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Назва плагіна',
|
||||
restartNeeded: true, // якщо значення true, ytmusic покаже діалогове вікно перезапуску
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // ваша власна конфігурація
|
||||
stylesheets: [style], // ваш власний стиль
|
||||
renderer() {} // визначити хук рендерера
|
||||
});
|
||||
```
|
||||
|
||||
- Якщо ви хочете змінити HTML:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Назва плагіна',
|
||||
restartNeeded: true, // якщо значення true, ytmusic покаже діалогове вікно перезапуску
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // ваша власна конфігурація
|
||||
renderer() {
|
||||
// Видалити кнопку входу
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // визначити хук рендерера
|
||||
});
|
||||
```
|
||||
|
||||
- зв'язок між фронтендом та бекендом: можна здійснити за допомогою модуля ipcMain з Electron. Дивіться файл `index.ts` та
|
||||
приклад у плагіні `sponsorblock`.
|
||||
|
||||
## Збірка
|
||||
|
||||
1. Клонуйте репозиторій
|
||||
2. Дотримуйтесь [цієї інструкції](https://pnpm.io/installation), щоб встановити `pnpm`
|
||||
3. Запустіть `pnpm install --frozen-lockfile` для встановлення залежностей
|
||||
4. Запустіть `pnpm build:OS`
|
||||
|
||||
- `pnpm dist:win` - Windows
|
||||
- `pnpm dist:linux` - Linux (amd64)
|
||||
- `pnpm dist:linux:deb-arm64` - Linux (arm64 для Debian)
|
||||
- `pnpm dist:linux:rpm-arm64` - Linux (arm64 для Fedora)
|
||||
- `pnpm dist:mac` - macOS (amd64)
|
||||
- `pnpm dist:mac:arm64` - macOS (arm64)
|
||||
|
||||
Збирає програму для macOS, Linux та Windows,
|
||||
використовуючи [electron-builder](https://github.com/electron-userland/electron-builder).
|
||||
|
||||
## Попередній перегляд для production
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Тести
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
Використовує [Playwright](https://playwright.dev/) для тестування програми.
|
||||
|
||||
## Ліцензія
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## Поширені запитання
|
||||
|
||||
### Чому меню програми не відображається?
|
||||
|
||||
Якщо опція `Приховати меню` увімкнена - ви можете показати меню клавішею <kbd>Alt</kbd> (або <kbd>\`</kbd> [зворотний апостроф], якщо використовуєте плагін "Меню в програмі")
|
||||
@ -1,53 +0,0 @@
|
||||
/* hebrew */
|
||||
@font-face {
|
||||
font-family: 'Heebo';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H0TbFhsqMA6aw.woff2) format('woff2');
|
||||
unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'Heebo';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H2TbFhsqMA.woff2) format('woff2');
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
|
||||
/* hebrew */
|
||||
@font-face {
|
||||
font-family: 'Heebo';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H0TbFhsqMA6aw.woff2) format('woff2');
|
||||
unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'Heebo';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H2TbFhsqMA.woff2) format('woff2');
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
|
||||
/* latin-ext */
|
||||
@font-face {
|
||||
font-family: 'Oxygen';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url(https://fonts.gstatic.com/s/oxygen/v10/2sDcZG1Wl4LcnbuCNWgzZmW5Kb8VZBHR.woff2) format('woff2');
|
||||
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'Oxygen';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url(https://fonts.gstatic.com/s/oxygen/v10/2sDcZG1Wl4LcnbuCNWgzaGW5Kb8VZA.woff2) format('woff2');
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
1890
docs/style/style.css
@ -1,5 +1,5 @@
|
||||
appId: com.github.th-ch.youtube-music
|
||||
productName: YouTube Music
|
||||
appId: "com.github.th-ch.\u0079\u006f\u0075\u0074\u0075\u0062\u0065\u002d\u006d\u0075\u0073\u0069\u0063"
|
||||
productName: "\u0059\u006f\u0075\u0054\u0075\u0062\u0065\u0020\u004d\u0075\u0073\u0069\u0063"
|
||||
files:
|
||||
- '!*'
|
||||
- dist
|
||||
@ -20,7 +20,7 @@ mac:
|
||||
arch:
|
||||
- x64
|
||||
- arm64
|
||||
icon: assets/generated/icons/mac/icon.icns
|
||||
icon: assets/generated/icons/mac/icon.icon
|
||||
compression: maximum
|
||||
win:
|
||||
icon: assets/generated/icons/win/icon.ico
|
||||
@ -43,7 +43,7 @@ linux:
|
||||
category: AudioVideo
|
||||
desktop:
|
||||
entry:
|
||||
StartupWMClass: com.github.th_ch.youtube_music
|
||||
StartupWMClass: "com.github.th_ch.\u0079\u006f\u0075\u0074\u0075\u0062\u0065\u005f\u006d\u0075\u0073\u0069\u0063"
|
||||
target:
|
||||
- target: AppImage
|
||||
arch:
|
||||
@ -76,14 +76,10 @@ linux:
|
||||
- arm64
|
||||
- armv7l
|
||||
appImage:
|
||||
description: >-
|
||||
YouTube Music Desktop App bundled with custom plugins (and built-in ad
|
||||
blocker / downloader)
|
||||
description: "\u0059\u006f\u0075\u0054\u0075\u0062\u0065\u0020\u004d\u0075\u0073\u0069\u0063 Desktop App bundled with custom plugins"
|
||||
category: AudioVideo
|
||||
flatpak:
|
||||
description: >-
|
||||
YouTube Music Desktop App bundled with custom plugins (and built-in ad
|
||||
blocker / downloader)
|
||||
description: "\u0059\u006f\u0075\u0054\u0075\u0062\u0065\u0020\u004d\u0075\u0073\u0069\u0063 Desktop App bundled with custom plugins"
|
||||
category: AudioVideo
|
||||
runtimeVersion: '24.08'
|
||||
baseVersion: '24.08'
|
||||
@ -98,7 +94,7 @@ flatpak:
|
||||
- '--talk-name=org.freedesktop.Notifications'
|
||||
- '--talk-name=org.gnome.SessionManager'
|
||||
- '--talk-name=org.kde.StatusNotifierWatcher'
|
||||
- '--own-name=org.mpris.MediaPlayer2.YoutubeMusic.*'
|
||||
- "--own-name=org.mpris.MediaPlayer2.\u0059\u006f\u0075\u0074\u0075\u0062\u0065\u004d\u0075\u0073\u0069\u0063.*"
|
||||
deb:
|
||||
depends:
|
||||
- libgtk-3-0
|
||||
|
||||
@ -45,7 +45,7 @@ export default defineConfig({
|
||||
formats: ['es'],
|
||||
},
|
||||
outDir: 'dist/main',
|
||||
rollupOptions: {
|
||||
rolldownOptions: {
|
||||
external: ['electron', 'custom-electron-prompt', ...builtinModules],
|
||||
input: './src/index.ts',
|
||||
},
|
||||
@ -96,7 +96,7 @@ export default defineConfig({
|
||||
commonjsOptions: {
|
||||
ignoreDynamicRequires: true,
|
||||
},
|
||||
rollupOptions: {
|
||||
rolldownOptions: {
|
||||
external: ['electron', 'custom-electron-prompt', ...builtinModules],
|
||||
input: './src/preload.ts',
|
||||
},
|
||||
@ -149,7 +149,7 @@ export default defineConfig({
|
||||
name: 'renderer',
|
||||
},
|
||||
outDir: 'dist/renderer',
|
||||
rollupOptions: {
|
||||
rolldownOptions: {
|
||||
external: ['electron', ...builtinModules],
|
||||
input: './src/index.html',
|
||||
},
|
||||
@ -159,7 +159,8 @@ export default defineConfig({
|
||||
},
|
||||
server: {
|
||||
cors: {
|
||||
origin: 'https://music.youtube.com',
|
||||
origin:
|
||||
'https://music.\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@ -18,43 +18,89 @@ export default tsEslint.config(
|
||||
{
|
||||
plugins: {
|
||||
stylistic,
|
||||
importPlugin
|
||||
importPlugin,
|
||||
},
|
||||
languageOptions: {
|
||||
parser: tsEslint.parser,
|
||||
parserOptions: {
|
||||
project: true,
|
||||
project: ['tsconfig.json', 'tsconfig.test.json'],
|
||||
sourceType: 'module',
|
||||
ecmaVersion: 'latest'
|
||||
}
|
||||
ecmaVersion: 'latest',
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
'stylistic/arrow-parens': ['error', 'always'],
|
||||
'stylistic/object-curly-spacing': ['error', 'always'],
|
||||
'prettier/prettier': ['error', { singleQuote: true, semi: true, tabWidth: 2, trailingComma: 'all', quoteProps: 'preserve' }],
|
||||
'stylistic/jsx-pascal-case': 'error',
|
||||
'stylistic/jsx-curly-spacing': [
|
||||
'error',
|
||||
{ when: 'never', children: true },
|
||||
],
|
||||
'stylistic/jsx-sort-props': 'error',
|
||||
'prettier/prettier': [
|
||||
'error',
|
||||
{
|
||||
singleQuote: true,
|
||||
semi: true,
|
||||
tabWidth: 2,
|
||||
trailingComma: 'all',
|
||||
quoteProps: 'preserve',
|
||||
},
|
||||
],
|
||||
'@typescript-eslint/no-floating-promises': 'off',
|
||||
'@typescript-eslint/no-misused-promises': ['off', { checksVoidReturn: false }],
|
||||
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
|
||||
'@typescript-eslint/no-misused-promises': [
|
||||
'off',
|
||||
{ checksVoidReturn: false },
|
||||
],
|
||||
'@typescript-eslint/no-unused-vars': [
|
||||
'warn',
|
||||
{ argsIgnorePattern: '^_' },
|
||||
],
|
||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||
'@typescript-eslint/consistent-type-imports': [
|
||||
'error',
|
||||
{
|
||||
fixStyle: 'inline-type-imports',
|
||||
prefer: 'type-imports',
|
||||
disallowTypeAnnotations: false,
|
||||
},
|
||||
],
|
||||
'importPlugin/first': 'error',
|
||||
'importPlugin/newline-after-import': 'off',
|
||||
'importPlugin/no-default-export': 'off',
|
||||
'importPlugin/no-duplicates': 'error',
|
||||
'importPlugin/no-unresolved': ['error', { ignore: ['^virtual:', '\\?inline$', '\\?raw$', '\\?asset&asarUnpack'] }],
|
||||
'importPlugin/order': ['error', {
|
||||
'groups': ['builtin', 'external', ['internal', 'index', 'sibling'], 'parent', 'type'],
|
||||
'newlines-between': 'always-and-inside-groups',
|
||||
'alphabetize': { order: 'ignore', caseInsensitive: false }
|
||||
}],
|
||||
'importPlugin/no-unresolved': [
|
||||
'error',
|
||||
{
|
||||
ignore: ['^virtual:', '\\?inline$', '\\?raw$', '\\?asset&asarUnpack'],
|
||||
},
|
||||
],
|
||||
'importPlugin/order': [
|
||||
'error',
|
||||
{
|
||||
'groups': [
|
||||
'builtin',
|
||||
'external',
|
||||
['internal', 'index', 'sibling'],
|
||||
'parent',
|
||||
'type',
|
||||
],
|
||||
'newlines-between': 'always-and-inside-groups',
|
||||
'alphabetize': { order: 'ignore', caseInsensitive: false },
|
||||
},
|
||||
],
|
||||
'importPlugin/prefer-default-export': 'off',
|
||||
'camelcase': ['error', { properties: 'never' }],
|
||||
'class-methods-use-this': 'off',
|
||||
'stylistic/lines-around-comment': ['error', {
|
||||
beforeBlockComment: false,
|
||||
afterBlockComment: false,
|
||||
beforeLineComment: false,
|
||||
afterLineComment: false,
|
||||
}],
|
||||
'stylistic/lines-around-comment': [
|
||||
'error',
|
||||
{
|
||||
beforeBlockComment: false,
|
||||
afterBlockComment: false,
|
||||
beforeLineComment: false,
|
||||
afterLineComment: false,
|
||||
},
|
||||
],
|
||||
'stylistic/max-len': 'off',
|
||||
'stylistic/no-mixed-operators': 'warn', // prettier does not support no-mixed-operators
|
||||
'stylistic/no-multi-spaces': ['error', { ignoreEOLComments: true }],
|
||||
@ -62,16 +108,20 @@ export default tsEslint.config(
|
||||
'no-void': 'error',
|
||||
'no-empty': 'off',
|
||||
'prefer-promise-reject-errors': 'off',
|
||||
'stylistic/quotes': ['error', 'single', {
|
||||
avoidEscape: true,
|
||||
allowTemplateLiterals: false,
|
||||
}],
|
||||
'stylistic/quotes': [
|
||||
'error',
|
||||
'single',
|
||||
{
|
||||
avoidEscape: true,
|
||||
allowTemplateLiterals: 'never',
|
||||
},
|
||||
],
|
||||
'stylistic/quote-props': ['error', 'consistent'],
|
||||
'stylistic/semi': ['error', 'always'],
|
||||
},
|
||||
settings: {
|
||||
'import/parsers': {
|
||||
'@typescript-eslint/parser': ['.ts']
|
||||
'@typescript-eslint/parser': ['.ts'],
|
||||
},
|
||||
'import/resolver': {
|
||||
typescript: {},
|
||||
|
||||
2
license
@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) th-ch <th-ch@users.noreply.github.com> (https://github.com/th-ch/youtube-music)
|
||||
Copyright (c) th-ch <th-ch@users.noreply.github.com> (https://github.com/pear-devs/pear-desktop)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
127
package.json
@ -1,29 +1,29 @@
|
||||
{
|
||||
"name": "youtube-music",
|
||||
"desktopName": "com.github.th_ch.youtube_music",
|
||||
"productName": "YouTube Music",
|
||||
"version": "3.10.0",
|
||||
"description": "YouTube Music Desktop App - including custom plugins",
|
||||
"name": "\u0079\u006f\u0075\u0074\u0075\u0062\u0065\u002d\u006d\u0075\u0073\u0069\u0063",
|
||||
"desktopName": "com.github.th_ch.\u0079\u006f\u0075\u0074\u0075\u0062\u0065\u005f\u006d\u0075\u0073\u0069\u0063",
|
||||
"productName": "\u0059\u006f\u0075\u0054\u0075\u0062\u0065\u0020\u004d\u0075\u0073\u0069\u0063",
|
||||
"version": "3.11.0",
|
||||
"description": "\u0059\u006f\u0075\u0054\u0075\u0062\u0065\u0020\u004d\u0075\u0073\u0069\u0063 Desktop App - including custom plugins",
|
||||
"main": "./dist/main/index.js",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"repository": "th-ch/youtube-music",
|
||||
"repository": "pear-devs/pear-desktop",
|
||||
"author": {
|
||||
"name": "th-ch",
|
||||
"email": "th-ch@users.noreply.github.com",
|
||||
"url": "https://github.com/th-ch/youtube-music"
|
||||
"url": "https://github.com/pear-devs/pear-desktop"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "playwright test",
|
||||
"test:debug": "cross-env DEBUG=pw:*,-pw:test:protocol playwright test",
|
||||
"build": "electron-vite build",
|
||||
"test": "pnpm playwright test",
|
||||
"test:debug": "pnpm cross-env DEBUG=pw:*,-pw:test:protocol playwright test",
|
||||
"build": "pnpm electron-vite build",
|
||||
"vite:inspect": "pnpm clean && electron-vite build --mode development && pnpm exec serve .vite-inspect",
|
||||
"start": "electron-vite preview",
|
||||
"start:debug": "cross-env ELECTRON_ENABLE_LOGGING=1 pnpm start",
|
||||
"dev": "cross-env NODE_OPTIONS=--enable-source-maps electron-vite dev --watch",
|
||||
"dev:renderer": "cross-env NODE_OPTIONS=--enable-source-maps electron-vite dev",
|
||||
"dev:debug": "cross-env ELECTRON_ENABLE_LOGGING=1 pnpm dev",
|
||||
"clean": "del-cli dist && del-cli pack && del-cli .vite-inspect",
|
||||
"start": "pnpm electron-vite preview",
|
||||
"start:debug": "pnpm cross-env ELECTRON_ENABLE_LOGGING=1 pnpm start",
|
||||
"dev": "pnpm cross-env NODE_ENV=development NODE_OPTIONS=--enable-source-maps electron-vite dev --watch",
|
||||
"dev:renderer": "pnpm cross-env NODE_ENV=development NODE_OPTIONS=--enable-source-maps electron-vite dev",
|
||||
"dev:debug": "pnpm cross-env ELECTRON_ENABLE_LOGGING=1 pnpm dev",
|
||||
"clean": "pnpm del-cli dist && pnpm del-cli pack && pnpm del-cli .vite-inspect",
|
||||
"dist": "pnpm clean && pnpm build && pnpm electron-builder --win --mac --linux -p never",
|
||||
"dist:linux": "pnpm clean && pnpm build && pnpm electron-builder --linux -p never",
|
||||
"dist:linux:deb-arm64": "pnpm clean && pnpm build && pnpm electron-builder --linux deb:arm64 -p never",
|
||||
@ -32,12 +32,12 @@
|
||||
"dist:mac:arm64": "pnpm clean && pnpm build && pnpm electron-builder --mac dmg:arm64 -p never",
|
||||
"dist:win": "pnpm clean && pnpm build && pnpm electron-builder --win -p never",
|
||||
"dist:win:x64": "pnpm clean && pnpm build && pnpm electron-builder --win nsis-web:x64 -p never",
|
||||
"lint": "eslint .",
|
||||
"changelog": "npx --yes auto-changelog",
|
||||
"lint": "pnpm eslint ./src",
|
||||
"changelog": "pnpm dlx auto-changelog",
|
||||
"release:linux": "pnpm clean && pnpm build && pnpm electron-builder --linux -p always -c.snap.publish=github",
|
||||
"release:mac": "pnpm clean && pnpm build && pnpm electron-builder --mac -p always",
|
||||
"release:win": "pnpm clean && pnpm build && pnpm electron-builder --win -p always",
|
||||
"typecheck": "tsc -p tsconfig.json --noEmit"
|
||||
"typecheck": "pnpm tsc -p tsconfig.json --noEmit"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=22",
|
||||
@ -45,44 +45,50 @@
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"vite": "npm:rolldown-vite@7.1.2",
|
||||
"node-gyp": "11.3.0",
|
||||
"vite": "npm:rolldown-vite@7.3.0",
|
||||
"node-gyp": "11.4.2",
|
||||
"xml2js": "0.6.2",
|
||||
"node-fetch": "3.3.2",
|
||||
"@electron/universal": "3.0.1",
|
||||
"@babel/runtime": "7.28.3"
|
||||
"@electron/universal": "3.0.2",
|
||||
"@babel/runtime": "7.28.4"
|
||||
},
|
||||
"patchedDependencies": {
|
||||
"vudio@2.1.1": "patches/vudio@2.1.1.patch",
|
||||
"@malept/flatpak-bundler@0.4.0": "patches/@malept__flatpak-bundler@0.4.0.patch",
|
||||
"kuromoji@0.1.2": "patches/kuromoji@0.1.2.patch",
|
||||
"file-type@16.5.4": "patches/file-type@16.5.4.patch"
|
||||
"file-type@16.5.4": "patches/file-type@16.5.4.patch",
|
||||
"electron-is@3.0.0": "patches/electron-is@3.0.0.patch",
|
||||
"mdui@2.1.4": "patches/mdui@2.1.4.patch"
|
||||
},
|
||||
"neverBuiltDependencies": []
|
||||
},
|
||||
"dependencies": {
|
||||
"@dehoist/romanize-thai": "1.0.0",
|
||||
"@electron-toolkit/tsconfig": "1.0.1",
|
||||
"@electron/remote": "2.1.3",
|
||||
"@ffmpeg.wasm/core-mt": "0.12.0",
|
||||
"@ffmpeg.wasm/main": "0.12.0",
|
||||
"@floating-ui/dom": "1.7.3",
|
||||
"@floating-ui/dom": "1.7.4",
|
||||
"@foobar404/wave": "2.0.5",
|
||||
"@ghostery/adblocker-electron": "2.11.3",
|
||||
"@ghostery/adblocker-electron-preload": "2.11.3",
|
||||
"@hono/node-server": "1.18.2",
|
||||
"@ghostery/adblocker-electron": "2.11.6",
|
||||
"@ghostery/adblocker-electron-preload": "2.11.6",
|
||||
"@hono/node-server": "1.19.7",
|
||||
"@hono/node-ws": "1.2.0",
|
||||
"@hono/swagger-ui": "0.5.2",
|
||||
"@hono/zod-openapi": "1.1.0",
|
||||
"@hono/zod-validator": "0.7.2",
|
||||
"@hono/zod-openapi": "1.2.0",
|
||||
"@hono/zod-validator": "0.7.6",
|
||||
"@jellybrick/dbus-next": "0.10.3",
|
||||
"@jellybrick/electron-better-web-request": "1.0.4",
|
||||
"@jellybrick/electron-better-web-request": "2.0.0",
|
||||
"@jellybrick/mpris-service": "2.1.5",
|
||||
"@jimp/plugin-color": "1.6.0",
|
||||
"@mdui/icons": "^1.0.3",
|
||||
"@skyra/jaro-winkler": "1.1.1",
|
||||
"@xhayper/discord-rpc": "1.3.0",
|
||||
"async-mutex": "0.5.0",
|
||||
"bgutils-js": "3.2.0",
|
||||
"butterchurn": "3.0.0-beta.5",
|
||||
"butterchurn-presets": "3.0.0-beta.4",
|
||||
"color": "5.0.0",
|
||||
"color": "5.0.3",
|
||||
"conf": "14.0.0",
|
||||
"custom-electron-prompt": "1.5.8",
|
||||
"deepmerge-ts": "7.1.5",
|
||||
@ -93,17 +99,17 @@
|
||||
"electron-store": "10.1.0",
|
||||
"electron-unhandled": "5.0.0",
|
||||
"electron-updater": "6.6.2",
|
||||
"es-hangul": "2.3.5",
|
||||
"es-hangul": "2.3.8",
|
||||
"fast-average-color": "9.5.0",
|
||||
"fast-equals": "5.2.2",
|
||||
"fflate": "0.8.2",
|
||||
"filenamify": "6.0.0",
|
||||
"hanja": "1.1.5",
|
||||
"happy-dom": "18.0.1",
|
||||
"hono": "4.9.2",
|
||||
"happy-dom": "20.0.11",
|
||||
"hono": "4.10.3",
|
||||
"howler": "2.2.4",
|
||||
"html-to-text": "9.0.5",
|
||||
"i18next": "25.3.6",
|
||||
"i18next": "25.5.2",
|
||||
"jimp": "1.6.0",
|
||||
"keyboardevent-from-electron-accelerator": "2.0.0",
|
||||
"keyboardevents-areequal": "0.2.2",
|
||||
@ -111,12 +117,12 @@
|
||||
"kuroshiro": "1.2.0",
|
||||
"kuroshiro-analyzer-kuromoji": "1.1.0",
|
||||
"lazy-var": "2.2.2",
|
||||
"mdui": "2.1.4",
|
||||
"node-html-parser": "7.0.1",
|
||||
"node-id3": "0.2.9",
|
||||
"peerjs": "1.5.5",
|
||||
"semver": "7.7.2",
|
||||
"serve": "14.2.4",
|
||||
"simple-youtube-age-restriction-bypass": "github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9",
|
||||
"semver": "7.7.3",
|
||||
"serve": "14.2.5",
|
||||
"socks": "2.8.7",
|
||||
"solid-element": "1.9.1",
|
||||
"solid-floating-ui": "0.3.1",
|
||||
@ -125,52 +131,51 @@
|
||||
"solid-transition-group": "0.3.0",
|
||||
"tiny-pinyin": "1.3.2",
|
||||
"tinyld": "1.3.4",
|
||||
"virtua": "0.41.5",
|
||||
"virtua": "0.48.2",
|
||||
"vudio": "2.1.1",
|
||||
"x11": "2.3.0",
|
||||
"youtubei.js": "15.0.1",
|
||||
"zod": "4.0.17"
|
||||
"youtubei.js": "^16.0.1",
|
||||
"zod": "4.2.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@electron-toolkit/tsconfig": "1.0.1",
|
||||
"@eslint/js": "9.33.0",
|
||||
"@eslint/js": "9.39.2",
|
||||
"@malept/flatpak-bundler": "0.4.0",
|
||||
"@playwright/test": "1.54.2",
|
||||
"@stylistic/eslint-plugin": "5.2.3",
|
||||
"@playwright/test": "1.55.0",
|
||||
"@stylistic/eslint-plugin": "5.3.1",
|
||||
"@total-typescript/ts-reset": "0.6.1",
|
||||
"@types/electron-localshortcut": "3.1.3",
|
||||
"@types/howler": "2.2.12",
|
||||
"@types/html-to-text": "9.0.4",
|
||||
"@types/semver": "7.7.0",
|
||||
"@types/semver": "7.7.1",
|
||||
"@types/trusted-types": "2.0.7",
|
||||
"bufferutil": "4.0.9",
|
||||
"builtin-modules": "5.0.0",
|
||||
"cross-env": "10.0.0",
|
||||
"del-cli": "6.0.0",
|
||||
"discord-api-types": "0.38.20",
|
||||
"electron": "37.3.0",
|
||||
"electron-builder": "26.0.12",
|
||||
"discord-api-types": "0.38.37",
|
||||
"electron": "38.7.2",
|
||||
"electron-builder": "26.4.0",
|
||||
"electron-builder-squirrel-windows": "26.0.12",
|
||||
"electron-devtools-installer": "4.0.0",
|
||||
"electron-vite": "4.0.0",
|
||||
"eslint": "9.33.0",
|
||||
"electron-vite": "4.0.1",
|
||||
"eslint": "9.39.2",
|
||||
"eslint-config-prettier": "10.1.8",
|
||||
"eslint-import-resolver-exports": "1.0.0-beta.5",
|
||||
"eslint-import-resolver-typescript": "4.4.4",
|
||||
"eslint-plugin-import": "2.32.0",
|
||||
"eslint-plugin-prettier": "5.5.4",
|
||||
"eslint-plugin-solid": "0.14.5",
|
||||
"glob": "11.0.3",
|
||||
"node-gyp": "11.3.0",
|
||||
"playwright": "1.54.2",
|
||||
"ts-morph": "26.0.0",
|
||||
"typescript": "5.9.2",
|
||||
"typescript-eslint": "8.39.1",
|
||||
"utf-8-validate": "6.0.5",
|
||||
"vite": "npm:rolldown-vite@7.1.2",
|
||||
"vite-plugin-inspect": "11.3.2",
|
||||
"glob": "11.1.0",
|
||||
"node-gyp": "11.4.2",
|
||||
"ts-morph": "27.0.2",
|
||||
"typescript": "5.9.3",
|
||||
"typescript-eslint": "8.43.0",
|
||||
"utf-8-validate": "6.0.6",
|
||||
"vite": "npm:rolldown-vite@7.3.0",
|
||||
"vite-plugin-inspect": "11.3.3",
|
||||
"vite-plugin-resolve": "2.5.2",
|
||||
"vite-plugin-solid": "2.11.8",
|
||||
"vite-plugin-solid": "2.11.10",
|
||||
"ws": "8.18.3"
|
||||
},
|
||||
"auto-changelog": {
|
||||
|
||||
27
patches/electron-is@3.0.0.patch
Normal file
@ -0,0 +1,27 @@
|
||||
diff --git a/is.d.ts b/is.d.ts
|
||||
index fb861f7b401914f0f89cb4edf25c51df5cb05812..82144733cd34d88e2deb2e4713b104418e673f2e 100644
|
||||
--- a/is.d.ts
|
||||
+++ b/is.d.ts
|
||||
@@ -5,6 +5,7 @@ declare namespace is {
|
||||
export function macOS(): boolean;
|
||||
export function windows(): boolean;
|
||||
export function linux(): boolean;
|
||||
+ export function freebsd(): boolean;
|
||||
export function x86(): boolean;
|
||||
export function x64(): boolean;
|
||||
export function production(): boolean;
|
||||
diff --git a/is.js b/is.js
|
||||
index a76bb1755a2728bde185b35d847031d3b8ea4ab0..f6b03406c17342f5af078de069e5bbbd2246e152 100644
|
||||
--- a/is.js
|
||||
+++ b/is.js
|
||||
@@ -39,6 +39,10 @@ module.exports = {
|
||||
linux: function () {
|
||||
return process.platform === 'linux'
|
||||
},
|
||||
+ // Checks if we are under FreeBSD OS
|
||||
+ freebsd: function () {
|
||||
+ return process.platform === "freebsd"
|
||||
+ },
|
||||
// Checks if we are the processor's arch is x86
|
||||
x86: function () {
|
||||
return process.arch === 'ia32'
|
||||
40
patches/mdui@2.1.4.patch
Normal file
@ -0,0 +1,40 @@
|
||||
diff --git a/jsx.en.d.ts b/jsx.en.d.ts
|
||||
index 514d455dcdb436aaf7b2ee88deaefe01943c8b4b..48dff045dead4315936afd931336198996c88217 100644
|
||||
--- a/jsx.en.d.ts
|
||||
+++ b/jsx.en.d.ts
|
||||
@@ -1,12 +1,8 @@
|
||||
-import React from 'react';
|
||||
import { JQ } from '@mdui/jq';
|
||||
|
||||
-type HTMLElementProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
|
||||
+type HTMLElementProps = import("solid-js").JSX.HTMLAttributes<HTMLElement>;
|
||||
|
||||
-declare global {
|
||||
- namespace React {
|
||||
- namespace JSX {
|
||||
- interface IntrinsicElements {
|
||||
+export interface IntrinsicElements {
|
||||
/**
|
||||
* Avatar Component
|
||||
*
|
||||
@@ -3296,7 +3292,4 @@ declare global {
|
||||
*/
|
||||
'order'?: number;
|
||||
} & HTMLElementProps;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
}
|
||||
diff --git a/package.json b/package.json
|
||||
index 3fa3eeb471ce4c31d7ac1c9bcb2d6823947e91ca..c4b062020bf20b8db34ccfea500fa682a4af19a6 100644
|
||||
--- a/package.json
|
||||
+++ b/package.json
|
||||
@@ -60,5 +60,8 @@
|
||||
"tslib": "^2.8.1",
|
||||
"@mdui/shared": "^1.0.8",
|
||||
"@mdui/jq": "^3.0.3"
|
||||
+ },
|
||||
+ "peerDependencies": {
|
||||
+ "solid-js": "^1.9.7"
|
||||
}
|
||||
}
|
||||
1724
pnpm-lock.yaml
generated
@ -31,6 +31,7 @@ export interface DefaultConfig {
|
||||
likeButtons: string;
|
||||
proxy: string;
|
||||
startingPage: string;
|
||||
backgroundMaterial?: 'none' | 'mica' | 'acrylic' | 'tabbed';
|
||||
overrideUserAgent: boolean;
|
||||
usePodcastParticipantAsArtist: boolean;
|
||||
themes: string[];
|
||||
@ -39,7 +40,7 @@ export interface DefaultConfig {
|
||||
'plugins': Record<string, unknown>;
|
||||
}
|
||||
|
||||
const defaultConfig: DefaultConfig = {
|
||||
export const defaultConfig: DefaultConfig = {
|
||||
'window-size': {
|
||||
width: 1100,
|
||||
height: 550,
|
||||
@ -49,7 +50,7 @@ const defaultConfig: DefaultConfig = {
|
||||
x: -1,
|
||||
y: -1,
|
||||
},
|
||||
'url': 'https://music.youtube.com',
|
||||
'url': 'https://music.\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com',
|
||||
'options': {
|
||||
tray: false,
|
||||
appVisible: true,
|
||||
@ -73,5 +74,3 @@ const defaultConfig: DefaultConfig = {
|
||||
},
|
||||
'plugins': {},
|
||||
};
|
||||
|
||||
export default defaultConfig;
|
||||
|
||||
@ -1,30 +1,36 @@
|
||||
import { deepmergeCustom } from 'deepmerge-ts';
|
||||
|
||||
import defaultConfig from './defaults';
|
||||
|
||||
import store, { IStore } from './store';
|
||||
import plugins from './plugins';
|
||||
|
||||
import { store, type IStore } from './store';
|
||||
import { restart } from '@/providers/app-controls';
|
||||
|
||||
import type { defaultConfig } from './defaults';
|
||||
|
||||
const deepmerge = deepmergeCustom({
|
||||
mergeArrays: false,
|
||||
});
|
||||
|
||||
const set = (key: string, value: unknown) => {
|
||||
export { defaultConfig } from './defaults';
|
||||
export * as plugins from './plugins';
|
||||
|
||||
export const set = (key: string, value: unknown) => {
|
||||
store.set(key, value);
|
||||
};
|
||||
const setPartial = (key: string, value: object, defaultValue?: object) => {
|
||||
|
||||
export const setPartial = (
|
||||
key: string,
|
||||
value: object,
|
||||
defaultValue?: object,
|
||||
) => {
|
||||
const newValue = deepmerge(defaultValue ?? {}, store.get(key) ?? {}, value);
|
||||
store.set(key, newValue);
|
||||
};
|
||||
|
||||
function setMenuOption(key: string, value: unknown) {
|
||||
export const setMenuOption = (key: string, value: unknown) => {
|
||||
set(key, value);
|
||||
if (store.get('options.restartOnConfigChanges')) {
|
||||
restart();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// MAGIC OF TYPESCRIPT
|
||||
|
||||
@ -74,18 +80,11 @@ type PathValue<T, K extends string> =
|
||||
? PathValue<T[A], B>
|
||||
: T;
|
||||
|
||||
const get = <Key extends Paths<typeof defaultConfig>>(key: Key) =>
|
||||
export const get = <Key extends Paths<typeof defaultConfig>>(key: Key) =>
|
||||
store.get(key) as PathValue<typeof defaultConfig, typeof key>;
|
||||
|
||||
export default {
|
||||
defaultConfig,
|
||||
get,
|
||||
set,
|
||||
setPartial,
|
||||
setMenuOption,
|
||||
edit: () => store.openInEditor(),
|
||||
watch(cb: Parameters<IStore['onDidAnyChange']>[0]) {
|
||||
store.onDidAnyChange(cb);
|
||||
},
|
||||
plugins,
|
||||
export const edit = () => store.openInEditor();
|
||||
|
||||
export const watch = (cb: Parameters<IStore['onDidAnyChange']>[0]) => {
|
||||
store.onDidAnyChange(cb);
|
||||
};
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import { deepmerge } from 'deepmerge-ts';
|
||||
import { allPlugins } from 'virtual:plugins';
|
||||
|
||||
import store from './store';
|
||||
import { store } from './store';
|
||||
|
||||
import { restart } from '@/providers/app-controls';
|
||||
|
||||
@ -13,7 +13,7 @@ export function getPlugins() {
|
||||
|
||||
export async function isEnabled(plugin: string) {
|
||||
const pluginConfig = deepmerge(
|
||||
(await allPlugins())[plugin].config ?? { enabled: false },
|
||||
(await allPlugins())[plugin]?.config ?? { enabled: false },
|
||||
(store.get('plugins') as Record<string, PluginConfig>)[plugin] ?? {},
|
||||
);
|
||||
return pluginConfig !== undefined && pluginConfig.enabled;
|
||||
@ -68,13 +68,3 @@ export function enable(plugin: string) {
|
||||
export function disable(plugin: string) {
|
||||
setMenuOptions(plugin, { enabled: false }, []);
|
||||
}
|
||||
|
||||
export default {
|
||||
isEnabled,
|
||||
getPlugins,
|
||||
enable,
|
||||
disable,
|
||||
setOptions,
|
||||
setMenuOptions,
|
||||
getOptions,
|
||||
};
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import Store from 'electron-store';
|
||||
|
||||
import defaults from './defaults';
|
||||
import { defaultConfig as defaults } from './defaults';
|
||||
|
||||
import { DefaultPresetList, type Preset } from '@/plugins/downloader/types';
|
||||
|
||||
@ -112,7 +112,10 @@ const migrations = {
|
||||
'>=2.1.3'(store: IStore) {
|
||||
const listenAlong = store.get('plugins.discord.listenAlong');
|
||||
if (listenAlong !== undefined) {
|
||||
store.set('plugins.discord.playOnYouTubeMusic', listenAlong);
|
||||
store.set(
|
||||
'plugins.discord.playOn\u0059\u006f\u0075\u0054\u0075\u0062\u0065\u004d\u0075\u0073\u0069\u0063',
|
||||
listenAlong,
|
||||
);
|
||||
store.delete('plugins.discord.listenAlong');
|
||||
}
|
||||
},
|
||||
@ -257,7 +260,7 @@ const migrations = {
|
||||
},
|
||||
};
|
||||
|
||||
export default new Store({
|
||||
export const store = new Store({
|
||||
defaults: {
|
||||
...defaults,
|
||||
// README: 'plugin' uses deepmerge to populate the default values, so it is not necessary to include it here
|
||||
|
||||
2
src/custom-electron-prompt.d.ts
vendored
@ -1,5 +1,5 @@
|
||||
declare module 'custom-electron-prompt' {
|
||||
import { BrowserWindow } from 'electron';
|
||||
import { type BrowserWindow } from 'electron';
|
||||
|
||||
export type SelectOptions = Record<string, string>;
|
||||
|
||||
|
||||
@ -2,6 +2,9 @@ import i18next, { init, t as i18t, changeLanguage } from 'i18next';
|
||||
|
||||
import { languageResources } from 'virtual:i18n';
|
||||
|
||||
export const APPLICATION_NAME =
|
||||
'\u0059\u006f\u0075\u0054\u0075\u0062\u0065\u0020\u004d\u0075\u0073\u0069\u0063';
|
||||
|
||||
export const loadI18n = async () =>
|
||||
await init({
|
||||
resources: await languageResources(),
|
||||
|
||||
@ -2,10 +2,10 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "فشل تشغيل الاضافة {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "تم تشغيل الاضافة {{pluginName}}::{{contextName}} خلال {{ms}} جزء من الثانية",
|
||||
"initialize-failed": "فشل تنفيذ الاضافة \"{{pluginName}}\"",
|
||||
"load-all": "جاري تحميل جميع الاضافات",
|
||||
"execute-failed": "فشل بدأ الاضافة {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "تم بدأ الاضافة {{pluginName}}::{{contextName}} خلال {{ms}} جزء من الثانية",
|
||||
"initialize-failed": "فشل تشغيل الاضافة \"{{pluginName}}\"",
|
||||
"load-all": "جار تحميل جميع الاضافات",
|
||||
"load-failed": "فشل في تحميل الاضافة \"{{pluginName}}\"",
|
||||
"loaded": "تم تحميل الاضافة \"{{pluginName}}\"",
|
||||
"unload-failed": "فشل ازالة الاضافة \"{{pluginName}}\"",
|
||||
@ -30,21 +30,21 @@
|
||||
"receive-command": "تم الحصول على أمر عن طريق: \"{{command}}\""
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "ملف \"{{cssFile}}\" غير متواجد,سيتم التجاهل"
|
||||
"css-file-not-found": "ملف \"{{cssFile}}\" غير متواجد، سيتم التجاهل"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "خطء عدم استجابة!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "ازالة بيانات التطبيق المخزنة"
|
||||
"clearing-cache-after-20s": "ازالة ذاكرة التخزين المؤقت للتطبيق"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "تم محاولة فتح الصفحة خارج الشاشة, حجم الصفحة={{windowSize}}, حجم الشاشة={{displaySize}}, مكان={{position}}"
|
||||
"tried-to-render-offscreen": "تم محاولة فتح الصفحة خارج الشاشة, حجم الصفحة={{windowSize}}, حجم النافذة={{displaySize}}, المكان={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "تم اخفاء القائمة, استخدم 'Alt' لاظهار القائمة (أو 'Escape' اذا كنت تستخدم القائمة داخل التطبيق)",
|
||||
"detail": "تم اخفاء القائمة, استخدم 'Alt' لاظهار القائمة (أو 'Escape' اذا كنت تستخدم القائمة التي داخل التطبيق)",
|
||||
"message": "اخفاء القائمة مفعل",
|
||||
"title": "تم تفعيل اخفاء القائمة"
|
||||
},
|
||||
@ -65,27 +65,27 @@
|
||||
},
|
||||
"detail": "نأسف على الإزعاج! يرجى اختيار ما يجب القيام به:",
|
||||
"message": "التطبيق لا يستجيب",
|
||||
"title": "الصفحة لا تستجيب"
|
||||
"title": "النافذة لا تستجيب"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "ايقاف التحديثات",
|
||||
"download": "تحميل",
|
||||
"ok": "موافق"
|
||||
"download": "تنزيل",
|
||||
"ok": "حسنا"
|
||||
},
|
||||
"detail": "يوجد نسخة جديدة يمكن تحميلها من خلال {{downloadLink}}",
|
||||
"message": "يوجد نسخة حديثة",
|
||||
"detail": "يوجد نسخة جديدة يمكن تنزيلها من {{downloadLink}}",
|
||||
"message": "يوجد نسخة جديدة",
|
||||
"title": "يوجد تحديث"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "عنا",
|
||||
"navigation": {
|
||||
"label": "التنقل",
|
||||
"label": "شريط التنقل",
|
||||
"submenu": {
|
||||
"copy-current-url": "نسخ الرابط الحالي",
|
||||
"go-back": "العودة للخلف",
|
||||
"go-forward": "التقدم",
|
||||
"go-back": "عودة",
|
||||
"go-forward": "تقدم",
|
||||
"quit": "الخروج",
|
||||
"restart": "اعادة تشغيل التطبيق"
|
||||
}
|
||||
@ -96,28 +96,28 @@
|
||||
"advanced-options": {
|
||||
"label": "الاعدادات المتقدمة",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "إعادة تعيين ذاكرة التخزين المؤقت للتطبيق عند بدء التشغيل",
|
||||
"disable-hardware-acceleration": "تعطيل تسريع الأجهزة",
|
||||
"auto-reset-app-cache": "إعادة ضبط ذاكرة التخزين المؤقت للتطبيق عند بدء التشغيل",
|
||||
"disable-hardware-acceleration": "اطفاء تسريع الأجهزة",
|
||||
"edit-config-json": "تعديل ملف الاعدادات",
|
||||
"override-user-agent": "تجاوز وكيل المستخدم",
|
||||
"restart-on-config-changes": "اعادة التشغيل بعد تعديل الاعدادات",
|
||||
"set-proxy": {
|
||||
"label": "تعيين الوكيل",
|
||||
"prompt": {
|
||||
"label": "أدخل عنوان الوكيل: (اتركه فارغًا للتعطيل)",
|
||||
"label": "أدخل عنوان الوكيل: (اتركه فارغًا لإطفائه)",
|
||||
"placeholder": "مثال: SOCKS5://127.0.0.1:9999",
|
||||
"title": "اضافة الوكيل"
|
||||
"title": "ضع proxy"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "تثبيت أدوات التطوير"
|
||||
}
|
||||
},
|
||||
"always-on-top": "دائما في القمة",
|
||||
"always-on-top": "دائما في المقدمة",
|
||||
"auto-update": "تحديث تلقائي",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "سيتم إخفاء القائمة عند التشغيل التالي، استخدم [Alt] لإظهارها (أو ضع علامة اختيار على [`] في حالة استخدام القائمة داخل التطبيق)",
|
||||
"title": "إخفاء القائمة ممكن"
|
||||
"message": "سيتم إخفاء القائمة عند التشغيل التالي، استخدم [Alt] لإظهارها (أو اضغط [`] في حالة استخدام القائمة التي داخل التطبيق)",
|
||||
"title": "إخفاء القائمة مفعل"
|
||||
},
|
||||
"label": "إخفاء القائمة"
|
||||
},
|
||||
@ -131,32 +131,39 @@
|
||||
"to-help-translate": "تريد المساعدة في الترجمة؟ اضغط هنا"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "تكملة الأغنية الأخيرة عند بدأ التشغيل",
|
||||
"resume-on-start": "استأنف الأغنية الأخيرة عند بدأ التشغيل",
|
||||
"single-instance-lock": "قفل مثيل واحد",
|
||||
"start-at-login": "ابدأ عند تسجيل الدخول",
|
||||
"starting-page": {
|
||||
"label": "صفحة البداية",
|
||||
"unset": "الغاء"
|
||||
"unset": "عدم تعيين"
|
||||
},
|
||||
"tray": {
|
||||
"label": "قائمة",
|
||||
"submenu": {
|
||||
"disabled": "غير مفعل",
|
||||
"enabled-and-hide-app": "تمكين وإخفاء التطبيق",
|
||||
"enabled-and-show-app": "ممكين وأظهر التطبيق",
|
||||
"play-pause-on-click": "تشغيل/إيقاف مؤقت عند النقر"
|
||||
"enabled-and-hide-app": "مفعل وإخفاء التطبيق",
|
||||
"enabled-and-show-app": "مفعل وأظهر التطبيق",
|
||||
"play-pause-on-click": "تشغيل/إيقاف عند النقر"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "تعديلات المظهر",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "عنوان نافذة مخصص",
|
||||
"prompt": {
|
||||
"label": "ادخل عنوان مخصص للنافذة: (اتركه فارغًا إلغاء التفعيل)",
|
||||
"placeholder": "مثال: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "الافتراضي",
|
||||
"force-show": "اجبار الظهور",
|
||||
"hide": "اخفاء",
|
||||
"label": "أزرار الاعجاب"
|
||||
},
|
||||
"remove-upgrade-button": "ازالة زرار التطوير",
|
||||
"remove-upgrade-button": "ازالة زر التطوير",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
@ -201,8 +208,8 @@
|
||||
"restart": "إعادة تشغيل التطبيق",
|
||||
"show": "عرض النافدة",
|
||||
"tooltip": {
|
||||
"default": "يوتيوب اغاني",
|
||||
"with-song-info": "أغاني يوتيوب: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -226,25 +233,25 @@
|
||||
"description": "يطبق ثيمًا ديناميكيًا وتأثيرات بصرية بناء على ألوان الألبوم",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "نسبة قوة اللون",
|
||||
"label": "نسبة قوة مزيج الألوان",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
"percent": "{{ratio}}٪"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "ثيم ألوان الألبوم"
|
||||
"name": "سمة ألوان الألبوم"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "يطبق تأثير إضاءة عن طريق إسقاط ألوان ناعمة من الفيديو على خلفية شاشتك",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "مقدار التمويه",
|
||||
"label": "مقدار الطمس",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} بكسل"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "تخزين الصوت الؤقت",
|
||||
"label": "تخزين الصوت المؤقت",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
@ -252,7 +259,7 @@
|
||||
"opacity": {
|
||||
"label": "الشفافية",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
"percent": "{{opacity}}٪"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
@ -264,7 +271,7 @@
|
||||
"size": {
|
||||
"label": "الحجم",
|
||||
"submenu": {
|
||||
"percent": "{{size}}%"
|
||||
"percent": "{{size}}٪"
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
@ -280,30 +287,30 @@
|
||||
"name": "الوضع المحيطي"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "تكامل دعم YouTube Music مع ويدجت Amuse لعرض الأغنية قيد التشغيل، من إنتاج 6K Labs",
|
||||
"description": "تكامل دعم {{applicationName}} مع ويدجت Amuse لعرض الأغنية التي قيد التشغيل، من إنتاج 6K Labs",
|
||||
"name": "تلسيه",
|
||||
"response": {
|
||||
"query": "خادم Amuse API قيد التشغيل. استخدم GET /query للحصول على معلومات الأغنية."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "يضيف خادم للتحكم في المشغل",
|
||||
"description": "يضيف API للتحكم في المشغل",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "سماح",
|
||||
"deny": "رفض"
|
||||
},
|
||||
"message": "السماح لـ {{ID}} ({{origin}}) بالوصول إلى واجهة برمجة التطبيقات (API)؟",
|
||||
"title": "طلب السماح بالوصول إلى واجهة برمجة التطبيقات(API)"
|
||||
"message": "السماح لـ {{ID}} ({{origin}}) بالوصول إلى الAPI؟",
|
||||
"title": "طلب السماح بالوصول إلى الAPI"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "نهج التفويض",
|
||||
"label": "استراتيجية التفويض",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "التفويض المبدئي عند الطلب الأول"
|
||||
"label": "التفويض عند الطلب الأول"
|
||||
},
|
||||
"none": {
|
||||
"label": "بدون تفويض"
|
||||
@ -334,10 +341,10 @@
|
||||
"name": "ضاغط الصوت"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "دعم استخدام خدمات وكيل المصادقة",
|
||||
"description": "دعم استخدام خدمات proxy للإثبات",
|
||||
"menu": {
|
||||
"disable": "تعطيل مكيف الوكيل",
|
||||
"enable": "تفعيل مكيف الوكيل",
|
||||
"enable": "تفعيل مكيف proxy للصداقة",
|
||||
"hostname": {
|
||||
"label": "إسم المستضيف"
|
||||
},
|
||||
@ -345,28 +352,28 @@
|
||||
"label": "المدخل"
|
||||
}
|
||||
},
|
||||
"name": "مكيّف وسيط المصادقة",
|
||||
"name": "مكيّف proxy للمصادقة",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "أدخل اسم المستضيف لخادم الوسيط المحلي (يتطلب إعادة التشغيل):",
|
||||
"title": "إسم مستضيف الوسيط"
|
||||
"label": "أدخل اسم المستضيف لخادم proxy المحلي (يتطلب إعادة التشغيل):",
|
||||
"title": "إسم مستضيف proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "أدخل مدخلًا لخادم الوسيط المحلي (يتطلب إعادة التشغيل):",
|
||||
"title": "مدخل الوسيط"
|
||||
"label": "أدخل مدخلًا لخادم proxy المحلي (يتطلب إعادة التشغيل):",
|
||||
"title": "مدخل proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "يجعل شريط التنقل شفاف و ضبابي",
|
||||
"name": "تغبيش شريط التنقل"
|
||||
"description": "يجعل شريط التنقل شفاف و مطموس",
|
||||
"name": "طمس شريط التنقل"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "تجاوز تَحَقّق اليوتيوب من السن",
|
||||
"description": "تجاوز تَحَقّق مشغل الموسيقى من السن",
|
||||
"name": "تجاوز التحقق من السن"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "محدد ترجمات المقاطع الصوتية لYoutube Music",
|
||||
"description": "محدد ترجمات المقاطع الصوتية ل{{applicationName}}",
|
||||
"menu": {
|
||||
"autoload": "اختار اخر ترجمة مستخدمة تلقائيا",
|
||||
"disable-captions": "لا توجد ترجمات بشكل افتراضي"
|
||||
@ -384,7 +391,7 @@
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "تم تغيير الترجمة الى {{language}}",
|
||||
"caption-disabled": "الترجمة معطلة",
|
||||
"caption-disabled": "الترجمة غير مفعلة",
|
||||
"no-captions": "الترجمة لهاته الأغنية غير متاحة"
|
||||
}
|
||||
},
|
||||
@ -402,20 +409,33 @@
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "مدة التداخل (بأجزاء الثانية)",
|
||||
"fade-out-duration": "مدة التلاشي (جزء ثانية)",
|
||||
"fade-out-duration": "مدة التلاشي (بأجزاء الثانية)",
|
||||
"fade-scaling": {
|
||||
"label": "توسيع التداخل",
|
||||
"linear": "خطي",
|
||||
"logarithmic": "لوغاريتمي"
|
||||
},
|
||||
"seconds-before-end": "التلاشي قبل النهاية بـ N ثوانٍ"
|
||||
"seconds-before-end": "التداخل قبل النهاية بـ N ثوانٍ"
|
||||
},
|
||||
"title": "خيارات التداخل"
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "ضبط مخرج جهاز وسائط مخصص للأغاني",
|
||||
"menu": {
|
||||
"device-selector": "اختر جهاز"
|
||||
},
|
||||
"name": "جهاز اخراج مخصص",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "اختر جهاز الوسائط الذي سيتم استخدامه للاخراج",
|
||||
"title": "اختر الجهاز الإخراج"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "يجعل الأغنية تبدأ في وضع \"الإيقاف المؤقت\"",
|
||||
"description": "يجعل الأغنية تبدأ في وضع \"الإيقاف\"",
|
||||
"menu": {
|
||||
"apply-once": "ينطبق فقط عند بدء التشغيل"
|
||||
},
|
||||
@ -433,13 +453,21 @@
|
||||
"clear-activity": "مسح النشاط",
|
||||
"clear-activity-after-timeout": "مسح النشاط بعد انتهاء المهلة",
|
||||
"connected": "متصل",
|
||||
"disconnected": "قطع الاتصال",
|
||||
"disconnected": "غير متصل",
|
||||
"hide-duration-left": "إخفاء المدة المتبقية",
|
||||
"hide-github-button": "إخفاء زر رابط GitHub",
|
||||
"play-on-youtube-music": "شغل في YouTube Music",
|
||||
"set-inactivity-timeout": "ضبط مهلة عدم النشاط"
|
||||
"play-on-application": "شغل في {{applicationName}}",
|
||||
"set-inactivity-timeout": "ضبط مهلة عدم النشاط",
|
||||
"set-status-display-type": {
|
||||
"label": "نص الحالة",
|
||||
"submenu": {
|
||||
"artist": "جار السمع ل{artist}",
|
||||
"application": "جار السمع ل{{applicationName}}",
|
||||
"title": "جار السمع ل{song title}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "حالة ديسكورد",
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "أدخل مهلة عدم النشاط بالثواني:",
|
||||
@ -454,70 +482,70 @@
|
||||
"buttons": {
|
||||
"ok": "حسنا"
|
||||
},
|
||||
"message": "نعتذر، فشل التحميل…",
|
||||
"title": "خطأ في التحميل!"
|
||||
"message": "اه! نعتذر، فشل التنزيل…",
|
||||
"title": "خطأ في التنزيل!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "حسنا"
|
||||
},
|
||||
"detail": "({{playlistSize}} أغنية)",
|
||||
"message": "تحميل القائمة {{playlistTitle}}",
|
||||
"title": "بدأ التحميل"
|
||||
"message": "تنزيل القائمة {{playlistTitle}}",
|
||||
"title": "تم بدأ التنزيل"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "التحويل: {{percent}}%",
|
||||
"conversion-progress": "التحويل: {{percent}}٪",
|
||||
"converting": "جارٍ التحويل…",
|
||||
"done": "تم: {{filePath}}",
|
||||
"download-info": "تحميل {{artist}} - {{title}} {{videoId}}",
|
||||
"download-progress": "تحميل: {{percent}}%",
|
||||
"downloading": "تحميل…",
|
||||
"downloading-counter": "تنزيل {{current}}/{{total}}…",
|
||||
"downloading-playlist": "يتم تحميل القائمة \"{{playlistTitle}}\" - {{playlistSize}} أغاني ({{playlistId}})",
|
||||
"error-while-downloading": "خطأ في تحميل \"{{author}} - {{title}}\": {{error}}",
|
||||
"download-info": "تنزيل {{artist}} - {{title}} {{videoId}}",
|
||||
"download-progress": "تنزيل: {{percent}}٪",
|
||||
"downloading": "جار التنزيل…",
|
||||
"downloading-counter": "جار التنزيل {{current}}/{{total}}…",
|
||||
"downloading-playlist": "جار تنزيل القائمة \"{{playlistTitle}}\" - {{playlistSize}} أغاني ({{playlistId}})",
|
||||
"error-while-downloading": "خطأ في تنزيل \"{{author}} - {{title}}\": {{error}}",
|
||||
"folder-already-exists": "الملف {{playlistFolder}} موجود بالفعل",
|
||||
"getting-playlist-info": "الحصول على معلومات القائمة…",
|
||||
"loading": "جار التحميل…",
|
||||
"playlist-has-only-one-song": "تحتوي قائمة التشغيل على عنصر واحد فقط، يتم تحميله الأن",
|
||||
"getting-playlist-info": "جار الحصول على معلومات القائمة…",
|
||||
"loading": "جارِ التنزيل…",
|
||||
"playlist-has-only-one-song": "تحتوي قائمة التشغيل على عنصر واحد فقط، جار تنزيله الأن",
|
||||
"playlist-id-not-found": "لم يتم العثور على معرف قائمة التشغيل",
|
||||
"playlist-is-empty": "قائمة التشغيل فارغة",
|
||||
"playlist-is-mix-or-private": "حدث خطأ أثناء الحصول على معلومات قائمة التشغيل: تأكد من أنها ليست قائمة تشغيل خاصة أو قائمة تشغيل \"مختلطة لك\"\n\n{{error}}",
|
||||
"preparing-file": "يتم تجهيز الملف…",
|
||||
"saving": "يتم الحفظ…",
|
||||
"trying-to-get-playlist-id": "محاولة الحصول على معرف قائمة التشغيل: {{playlistId}}",
|
||||
"preparing-file": "جار تجهيز الملف…",
|
||||
"saving": "جار الحفظ…",
|
||||
"trying-to-get-playlist-id": "جار محاولة الحصول على معرف قائمة التشغيل: {{playlistId}}",
|
||||
"video-id-not-found": "لم يتم ايجاد الفيديو",
|
||||
"writing-id3": "كتابة علامات ID3…"
|
||||
"writing-id3": "جار كتابة علامات ID3…"
|
||||
}
|
||||
},
|
||||
"description": "يقوم بتنزيل ملفات MP3/مصدر الصوت مباشرة من الواجهة",
|
||||
"menu": {
|
||||
"choose-download-folder": "اختر مكان التحميل",
|
||||
"choose-download-folder": "اختر مكان التنزيل",
|
||||
"download-finish-settings": {
|
||||
"label": "تحميل عند الانتهاء",
|
||||
"label": "تنزيل عند الانتهاء",
|
||||
"prompt": {
|
||||
"last-percent": "بعد ( عدد مجهول ) بالمئة",
|
||||
"last-seconds": "آخر (x) ثانية",
|
||||
"title": "تكوين وقت التحميل"
|
||||
"last-percent": "بعد x بالمئة",
|
||||
"last-seconds": "آخر x ثانية",
|
||||
"title": "تكوين وقت التنزيل"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "متقدم",
|
||||
"enabled": "مفعل",
|
||||
"mode": "وضع الوقت",
|
||||
"percent": "النسبة",
|
||||
"percent": "نسبة",
|
||||
"seconds": "ثواني"
|
||||
}
|
||||
},
|
||||
"download-playlist": "تحميل قائمة التشغيل",
|
||||
"download-playlist": "تنزيل قائمة التشغيل",
|
||||
"presets": "الإعدادات المسبقة",
|
||||
"skip-existing": "تخطي الملفات الموجودة"
|
||||
"skip-existing": "تخطي الملفات الموجودة بالفعل"
|
||||
},
|
||||
"name": "أداة التنزيل",
|
||||
"renderer": {
|
||||
"can-not-update-progress": "لا يمكن تحديث التقدم"
|
||||
},
|
||||
"templates": {
|
||||
"button": "تحميل"
|
||||
"button": "تنزيل"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
@ -541,11 +569,11 @@
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "إخفاء عناصر التحكم في نافذة DOM"
|
||||
},
|
||||
"name": "قائمة داخل التطبيق"
|
||||
"name": "قائمة التي داخل التطبيق"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "يضيف دعم Lumia Stream",
|
||||
"name": "Lumia Stream [بيتا]"
|
||||
"name": "Lumia Stream [تجريبي]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "يضيف دعم الكلمات لمعظم الأغاني",
|
||||
@ -564,17 +592,17 @@
|
||||
},
|
||||
"internal": {
|
||||
"save": "حفظ",
|
||||
"track-source": "مصدر الاغنية",
|
||||
"track-source": "تتبع مصدر الاغنية",
|
||||
"unknown-user": "مستخدم مجهول"
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "نسخ معرف المستضيف",
|
||||
"close": "إغلاق \"الموسيقى معًا\"",
|
||||
"close": "إغلاق الموسيقى معًا",
|
||||
"connected-users": "المستخدمون المتصلون",
|
||||
"disconnect": "قطع اتصال من \"الموسيقى معًا\"",
|
||||
"disconnect": "قطع اتصال من الموسيقى معًا",
|
||||
"empty-user": "لا يوجد مستعملون متصلون",
|
||||
"host": "مضيف \"الموسيقى معًا\"",
|
||||
"join": "الانضمام إلى \"الموسيقى معا\"",
|
||||
"host": "مضيف الموسيقى معًا",
|
||||
"join": "الانضمام إلى الموسيقى معا",
|
||||
"permission": {
|
||||
"all": "السماح للضيوف بالتحكم في قائمة التشغيل والمشغل",
|
||||
"host-only": "فقط المضيف يستطيع التحكم بالقائمة و المشغل",
|
||||
@ -582,29 +610,29 @@
|
||||
},
|
||||
"set-permission": "تغيير إذن التحكم",
|
||||
"status": {
|
||||
"disconnected": "قطع الاتصال",
|
||||
"disconnected": "غير متصل",
|
||||
"guest": "متصل كضيف",
|
||||
"host": "متصل كمضيف"
|
||||
}
|
||||
},
|
||||
"name": "الموسيقى معا [بيتا]",
|
||||
"name": "الموسيقى معا [تجريبي]",
|
||||
"toast": {
|
||||
"add-song-failed": "فشل في إضافة أغنية",
|
||||
"closed": "تم إغلاق \"الموسيقى معا\"",
|
||||
"disconnected": "تم قطع اتصال \"الموسيقى معًا\"",
|
||||
"host-failed": "فشل في استضافة \"الموسيقى معا\"",
|
||||
"closed": "تم إغلاق الموسيقى معا",
|
||||
"disconnected": "تم قطع اتصال الموسيقى معًا",
|
||||
"host-failed": "فشل في استضافة الموسيقى معا",
|
||||
"id-copied": "تم نسخ معرف المضيف",
|
||||
"id-copy-failed": "لم يتم نسخ معرف المضيف",
|
||||
"join-failed": "فشل الانضمام إلى \"الموسيقى معا\"",
|
||||
"joined": "تم الانضمام إلى \"الموسيقى معا\"",
|
||||
"permission-changed": "تم تغيير إذن \"الموسيقى معًا\" إلى \"{{permission}}\"",
|
||||
"id-copy-failed": "فشل نسخ معرف المضيف",
|
||||
"join-failed": "فشل الانضمام إلى الموسيقى معا",
|
||||
"joined": "تم الانضمام إلى الموسيقى معا",
|
||||
"permission-changed": "تم تغيير إذن الموسيقى معًا إلى \"{{permission}}\"",
|
||||
"remove-song-failed": "فشل في إزالة الأغنية",
|
||||
"user-connected": "{{name}} انضم إلى \"الموسيقى معًا\"",
|
||||
"user-disconnected": "{{name}} غادر \"الموسيقى معًا\""
|
||||
"user-connected": "{{name}} انضم إلى الموسيقى معًا",
|
||||
"user-disconnected": "{{name}} غادر الموسيقى معًا"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"description": "أسهم التنقل \"التالي/السابق\" مدمجة مباشرة في الواجهة، كما في متصفحك",
|
||||
"description": "أسهم التنقل \"التالي/السابق\" مدمجة مباشرة في الواجهة، كما في متصفحك المفضل",
|
||||
"name": "التنقل",
|
||||
"templates": {
|
||||
"back": {
|
||||
@ -620,31 +648,31 @@
|
||||
"name": "لا يوجد تسجيل دخول بجوجل"
|
||||
},
|
||||
"notifications": {
|
||||
"description": "عرض إشعار عندما تبدأ الأغنية بالتشغيل (الإشعارات التفاعلية متوفرة على ويندوز)",
|
||||
"description": "عرض إشعار عندما تبدأ الأغنية (الإشعارات التفاعلية متوفرة على ويندوز)",
|
||||
"menu": {
|
||||
"interactive": "إشعارات تفاعلية",
|
||||
"interactive-settings": {
|
||||
"label": "إعدادات تفاعلية",
|
||||
"submenu": {
|
||||
"hide-button-text": "إخفاء زر النص",
|
||||
"refresh-on-play-pause": "تحديث عند التشغيل/الإيقاف المؤقت",
|
||||
"hide-button-text": "إخفاء نص الزر",
|
||||
"refresh-on-play-pause": "اعادة تحميل عند التشغيل/الإيقاف",
|
||||
"tray-controls": "فتح/إغلاق عند النقر على علامة الشريط"
|
||||
}
|
||||
},
|
||||
"priority": "أولوية الإشعار",
|
||||
"toast-style": "تنسيق التوست",
|
||||
"toast-style": "تنسيق النخب",
|
||||
"unpause-notification": "إظهار إشعار عند استئناف التشغيل"
|
||||
},
|
||||
"name": "الإشعارات"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "تحسين الأداء عبر تفعيل السكربتات التجريبية",
|
||||
"name": "تحسين الأداء [بيتا]"
|
||||
"name": "تحسين الأداء [تجريبي]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "يسمح بتحويل التطبيق إلى وضع الصورة داخل الصورة",
|
||||
"menu": {
|
||||
"always-on-top": "دائمًا في الأعلى",
|
||||
"always-on-top": "دائمًا في المقدمة",
|
||||
"hotkey": {
|
||||
"label": "مفتاح اختصار",
|
||||
"prompt": {
|
||||
@ -659,7 +687,7 @@
|
||||
"save-window-size": "حفظ حجم النافذة",
|
||||
"use-native-pip": "استخدام وضع الصورة داخل الصورة الأصلي للمتصفح"
|
||||
},
|
||||
"name": "الصورة داخل الصورة",
|
||||
"name": "وضع الصورة داخل الصورة",
|
||||
"templates": {
|
||||
"button": "وضع الصورة داخل الصورة"
|
||||
}
|
||||
@ -672,7 +700,7 @@
|
||||
}
|
||||
},
|
||||
"precise-volume": {
|
||||
"description": "التحكم في مستوى الصوت بدقة باستخدام عجلة الفأرة/مفاتيح الاختصار، مع واجهة مستخدم مخصصة وقابلة للتخصيص وخطوات صوتية قابلة للتعديل",
|
||||
"description": "التحكم في مستوى الصوت بدقة باستخدام عجلة الفأرة/مفاتيح الاختصار، مع واجهة مستخدم مخصصة وخطوات صوتية قابلة للتخصيص",
|
||||
"menu": {
|
||||
"arrows-shortcuts": "عناصر التحكم بأسهم المفاتيح",
|
||||
"custom-volume-steps": "تعيين خطوات صوتية خاصة",
|
||||
@ -717,8 +745,8 @@
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "فشل المصادقة مع Last.fm\nإخفاء النافذة المنبثقة حتى إعادة التشغيل التالية.",
|
||||
"title": "فشلت المصادقة"
|
||||
"message": "فشل التفويض مع Last.fm\nإخفاء النافذة المصغرة حتى إعادة التشغيل التالية.",
|
||||
"title": "فشل التفويض"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -729,6 +757,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "أدخل رمز مستخدم ListenBrainz"
|
||||
},
|
||||
"scrobble-alternative-artist": "استخدم فنانين بديلين",
|
||||
"scrobble-alternative-title": "استخدم عناوين بديلة",
|
||||
"scrobble-other-media": "Scrobble الوسائط الأخرى"
|
||||
},
|
||||
@ -747,12 +776,12 @@
|
||||
}
|
||||
},
|
||||
"shortcuts": {
|
||||
"description": "يسمح بضبط اختصارات لوحة المفاتيح العالمية للتحكم في التشغيل (تشغيل/إيقاف مؤقت/التالي/السابق) وإيقاف تشغيل OSD الوسائط عن طريق تجاوز مفاتيح الوسائط، وتشغيل Ctrl/CMD + F للبحث، وتفعيل دعم Linux MPRIS لمفاتيح الوسائط، واختصارات مخصصة للمستخدمين المتقدمين",
|
||||
"description": "يسمح بضبط اختصارات لوحة المفاتيح للتحكم في التشغيل (تشغيل/إيقاف/التالي/السابق) وإيقاف تشغيل OSD الوسائط عن طريق تجاوز مفاتيح الوسائط، وتشغيل Ctrl/CMD + F للبحث، وتفعيل دعم Linux MPRIS لمفاتيح الوسائط، واختصارات مخصصة للمستخدمين المتقدمين",
|
||||
"menu": {
|
||||
"override-media-keys": "تجاوز مفاتيح الوسائط",
|
||||
"set-keybinds": "تعيين عناصر التحكم بالأغاني"
|
||||
},
|
||||
"name": "الاختصارات (& MPRIS)",
|
||||
"name": "الاختصارات (و MPRIS)",
|
||||
"prompt": {
|
||||
"keybind": {
|
||||
"keybind-options": {
|
||||
@ -761,17 +790,17 @@
|
||||
"previous": "السابق"
|
||||
},
|
||||
"label": "اختر اختصارات لوحة المفاتيح للتحكم في الأغاني:",
|
||||
"title": "اختصارات لوحة المفاتيح العالمية"
|
||||
"title": "اختصارات لوحة المفاتيح"
|
||||
}
|
||||
}
|
||||
},
|
||||
"skip-disliked-songs": {
|
||||
"description": "تخطي الأغاني غير المرغوب فيها",
|
||||
"name": "تخطي الأغاني الغير مرغوب فيها"
|
||||
"description": "يتخطى الأغاني الغير معجب فيها",
|
||||
"name": "تخطي الأغاني الغير معجب فيها"
|
||||
},
|
||||
"skip-silences": {
|
||||
"description": "تخطي أقسام الصمت تلقائيًا في الأغاني",
|
||||
"name": "تخطي فترات الصمت"
|
||||
"description": "تخطي أقسام التي ليس لها صوت تلقائيًا في الأغاني",
|
||||
"name": "تخطي الفترات التي ليس لها صوت"
|
||||
},
|
||||
"sponsorblock": {
|
||||
"description": "تخطي تلقائيًا الأجزاء غير الموسيقية مثل المقدمة/الختام أو أجزاء مقاطع الفيديو الموسيقية حيث لا يتم تشغيل الأغنية",
|
||||
@ -785,7 +814,7 @@
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "المسافة الافتراضي بين كلمات الأغاني",
|
||||
"label": "المسافة الافتراضية بين كلمات الأغاني",
|
||||
"tooltip": "اختر الحرف الافتراضي لاستخدامه في الفجوة بين كلمات الأغنية"
|
||||
},
|
||||
"line-effect": {
|
||||
@ -805,14 +834,22 @@
|
||||
},
|
||||
"scale": {
|
||||
"label": "تحجيم",
|
||||
"tooltip": "تكبير السطر الحالي"
|
||||
"tooltip": "حجم السطر الحالي"
|
||||
}
|
||||
},
|
||||
"tooltip": "اختر التأثير لتطبيقه على السطر الحالي"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "اجعل كلمات الأغنية متزامنة بشكل مثالي",
|
||||
"tooltip": "احسب بدقة الملي ثانية عرض السطر التالي (قد يكون له تأثير طفيف على الأداء)"
|
||||
"tooltip": "احسب بدقة الملي ثانية عرض السطر التالي (قد يكون له تأثير صغير على الأداء)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "المزود المفضل",
|
||||
"none": {
|
||||
"label": "لا شيء",
|
||||
"tooltip": "لا يوجد مزود مفضل"
|
||||
},
|
||||
"tooltip": "اختر المزود المفضل للإستخدام"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "اجعل الكلمات رومانية",
|
||||
@ -839,13 +876,34 @@
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "التحكم في المشغل من شريط المهام ويندوز",
|
||||
"description": "التحكم في المشغل من شريط مهام ويندوز",
|
||||
"name": "التحكم بالوسائط من شريط المهام"
|
||||
},
|
||||
"touchbar": {
|
||||
"description": "يضيف أداة TouchBar لمستخدمي macOS",
|
||||
"name": "شريط اللمس (TouchBar)"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "يجعل نافذة التطبيق شفافة",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "الشفافية",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}٪"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "النوع",
|
||||
"submenu": {
|
||||
"acrylic": "أكريليك",
|
||||
"mica": "ميكا",
|
||||
"none": "لاشيء",
|
||||
"tabbed": "بديل ميكا"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "مشغل شفاف"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "التكامل مع الإضافة\" Tuna\" الخاصة بـ OBS",
|
||||
"name": "إضافة Tuna OBS"
|
||||
@ -869,13 +927,13 @@
|
||||
"mode": {
|
||||
"label": "وضع",
|
||||
"submenu": {
|
||||
"custom": "تبديل مخصص",
|
||||
"custom": "زر مخصص",
|
||||
"disabled": "غير مفعل",
|
||||
"native": "تبديل طبيعي"
|
||||
"native": "زر طبيعي"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "تفعيل الفيديو",
|
||||
"name": "زر الفيديو",
|
||||
"templates": {
|
||||
"button-song": "أغنية",
|
||||
"button-video": "فيديو"
|
||||
@ -884,7 +942,7 @@
|
||||
"visualizer": {
|
||||
"description": "يضيف معاينًا بصريًا للمشغل",
|
||||
"menu": {
|
||||
"visualizer-type": "نوع المعاينة المصرية"
|
||||
"visualizer-type": "نوع المعاين البصري"
|
||||
},
|
||||
"name": "معاين بصري"
|
||||
}
|
||||
|
||||
@ -116,7 +116,54 @@
|
||||
"auto-update": "Avtomatik Yeniləmə",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "Menu will be hidden on next launch, use [Alt] to show it (or backtick [`] if using in-app-menu)"
|
||||
"message": "Menyu növbəti açılışda gizlədiləcək, göstərmək üçün [Alt] düyməsini basın (proqramdaxili menyudan istifadə edildikdə isə, [`] düyməsi).",
|
||||
"title": "Menyu gizlətmə aktivdir"
|
||||
},
|
||||
"label": "Menyunu gizlət"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "Dil yenidən başlatmadan sonra dəyişiləcək",
|
||||
"title": "Dil dəyişdirildi"
|
||||
},
|
||||
"label": "Dil",
|
||||
"submenu": {
|
||||
"to-help-translate": "Tərcüməyə kömək etmək istəyirsiniz? Buraya basın"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Tətbiq başladıqda son mahnıdan davam et",
|
||||
"single-instance-lock": "Tək proqram kilidi",
|
||||
"start-at-login": "Giriş səhifəsində başlat",
|
||||
"starting-page": {
|
||||
"label": "Giriş səhifəsi",
|
||||
"unset": "Təyin edilməyib"
|
||||
},
|
||||
"tray": {
|
||||
"submenu": {
|
||||
"disabled": "Deaktiv edilib"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Vizual düzəlişlər",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"prompt": {
|
||||
"placeholder": "Nümunə: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "Standart",
|
||||
"hide": "Gizlət"
|
||||
},
|
||||
"remove-upgrade-button": "Yeniləmə düyməsini sil",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Ləğv et",
|
||||
"remove": "Sil"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1
src/i18n/resources/be.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
||||
@ -150,6 +150,13 @@
|
||||
"visual-tweaks": {
|
||||
"label": "Визуални настройки",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "Персонализирано заглавие на прозорец",
|
||||
"prompt": {
|
||||
"label": "Въведи персонализирано заглавие: (остави празно за да изключиш)",
|
||||
"placeholder": "Пример: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "По подразбиране",
|
||||
"force-show": "Принудително показване",
|
||||
@ -201,8 +208,8 @@
|
||||
"restart": "Рестартирай приложението",
|
||||
"show": "Покажи прозорец",
|
||||
"tooltip": {
|
||||
"default": "YouTube Музика",
|
||||
"with-song-info": "YouTube Музика: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -280,7 +287,7 @@
|
||||
"name": "Атмосферен режим"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Добавя поддръжка на YouTube Music за джаджата Amuse Now Play от 6K Labs",
|
||||
"description": "Добавя поддръжка на {{applicationName}} за джаджата Amuse Now Play от 6K Labs",
|
||||
"name": "Забавление",
|
||||
"response": {
|
||||
"query": "Сървърът на Amuse API работи. Изпратете GET /query за информация за песента."
|
||||
@ -362,11 +369,11 @@
|
||||
"name": "Размазанa навигационна лента"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Избягване на възрастова верификация на YouTube",
|
||||
"description": "Избягване на възрастова верификация на Music Player",
|
||||
"name": "Избягване на възрастови ограничения"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Избор на надписи за аудио тракове в YouTube Music",
|
||||
"description": "Избор на надписи за аудио тракове в {{applicationName}}",
|
||||
"menu": {
|
||||
"autoload": "Автоматично избиране на последно използвания надпис",
|
||||
"disable-captions": "Без надписи по подразбиране"
|
||||
@ -414,6 +421,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "Конфигуриране на изходно медийно устройство за песни",
|
||||
"menu": {
|
||||
"device-selector": "Избери устройство"
|
||||
},
|
||||
"name": "Персонализирано изходно устройство",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Избери изходното медийно устройство",
|
||||
"title": "Избери изходно устройство"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Започва песента в паузиран режим",
|
||||
"menu": {
|
||||
@ -436,8 +456,16 @@
|
||||
"disconnected": "Прекъснато",
|
||||
"hide-duration-left": "Скрий оставащото време",
|
||||
"hide-github-button": "Скрий бутона за линк към GitHub",
|
||||
"play-on-youtube-music": "Възпроизведи в YouTube Music",
|
||||
"set-inactivity-timeout": "Задай таймаут за неактивност"
|
||||
"play-on-application": "Възпроизведи в {{applicationName}}",
|
||||
"set-inactivity-timeout": "Задай таймаут за неактивност",
|
||||
"set-status-display-type": {
|
||||
"label": "Статус текст",
|
||||
"submenu": {
|
||||
"artist": "Слушам {artist}",
|
||||
"title": "Слушам {song title}",
|
||||
"application": "Слушам {{applicationName}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Дискорд Разширен статус",
|
||||
"prompt": {
|
||||
@ -729,6 +757,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "Въведете ListenBrainz потребителски токен"
|
||||
},
|
||||
"scrobble-alternative-artist": "Използвай алтернативни изпълнители",
|
||||
"scrobble-alternative-title": "Използвай алтернативни заглавия",
|
||||
"scrobble-other-media": "Скробъл на други медии"
|
||||
},
|
||||
@ -814,6 +843,14 @@
|
||||
"label": "Направете текстовете перфектно синхронизирани",
|
||||
"tooltip": "Изчислете до милисекунда показването на следващия ред (може да има малък ефект върху производителността)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "Предпочитан доставчик",
|
||||
"none": {
|
||||
"label": "Празно",
|
||||
"tooltip": "Без предпочитан доставчик"
|
||||
},
|
||||
"tooltip": "Изберете доставчик по подразбиране"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Романизиране на текстовете",
|
||||
"tooltip": "Ако текстовете са на друг език, опитайте да покажете латинска версия."
|
||||
@ -846,6 +883,27 @@
|
||||
"description": "Добавя уиджет за TouchBar за потребители на macOS",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "Прави прозореца на приложението прозрачен",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "Прозрачност",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "Тип",
|
||||
"submenu": {
|
||||
"acrylic": "Акрил",
|
||||
"mica": "Слюда",
|
||||
"none": "Празно",
|
||||
"tabbed": "С раздели"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Прозрачен плейър"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Интеграция с плъгина Tuna за OBS",
|
||||
"name": "Tuna OBS"
|
||||
|
||||
@ -154,7 +154,7 @@
|
||||
"label": "কাস্টম উইন্ডো টাইটেল",
|
||||
"prompt": {
|
||||
"label": "নিজস্ব উইন্ডোর টাইটেল দিন (বন্ধ করতে ফাঁকা রাখুন)",
|
||||
"placeholder": "উদাহরণস্বরূপ: YouTube Music"
|
||||
"placeholder": "উদাহরণস্বরূপ: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
@ -208,8 +208,8 @@
|
||||
"restart": "অ্যাপ পুনরায় চালু করুন",
|
||||
"show": "উইন্ডো দেখান",
|
||||
"tooltip": {
|
||||
"default": "ইউটিউব মিউজিক",
|
||||
"with-song-info": "ইউটিউব মিউজিক: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -443,7 +443,7 @@
|
||||
"disconnected": "সংযোগ বিচ্ছিন্ন",
|
||||
"hide-duration-left": "অবশিষ্ট সময় লুকান",
|
||||
"hide-github-button": "গিটহাব লিঙ্ক বাটন লুকান",
|
||||
"play-on-youtube-music": "ইউটিউব মিউজিকে চালান",
|
||||
"play-on-application": "ইউটিউব মিউজিকে চালান",
|
||||
"set-inactivity-timeout": "নিষ্ক্রিয়তার সময়সীমা সেট করুন"
|
||||
},
|
||||
"name": "ডিসকর্ড রিচ প্রেজেন্স",
|
||||
|
||||
@ -154,7 +154,7 @@
|
||||
"label": "Prilagođeni naslov prozora",
|
||||
"prompt": {
|
||||
"label": "Unesite vlastiti naslov prozora: (ostavite prazno za isključenje)",
|
||||
"placeholder": "Primjer: YouTube Music"
|
||||
"placeholder": "Primjer: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
@ -184,9 +184,31 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "Omogući",
|
||||
"enabled": "Omogućeno",
|
||||
"label": "Dodaci",
|
||||
"new": "Novo"
|
||||
},
|
||||
"view": {
|
||||
"label": "Pogled",
|
||||
"submenu": {
|
||||
"force-reload": "Silom Ponovo Učitaj",
|
||||
"reload": "Ponovo Učitaj",
|
||||
"reset-zoom": "Stvarna Veličina",
|
||||
"toggle-fullscreen": "Uključi/Isključi Prikaz Cijelog Ekrana",
|
||||
"zoom-in": "Uvećaj",
|
||||
"zoom-out": "Umanji"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "Slijedeće",
|
||||
"play-pause": "Plej/Pauza",
|
||||
"previous": "Prethodno",
|
||||
"quit": "Izlaz",
|
||||
"restart": "Ponovo Pokreni Aplikaciju",
|
||||
"show": "Pokaži prozor",
|
||||
"tooltip": {
|
||||
"default": "{{applicationName}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -197,6 +219,53 @@
|
||||
"label": "Kvalitet"
|
||||
}
|
||||
}
|
||||
},
|
||||
"discord": {
|
||||
"menu": {
|
||||
"set-status-display-type": {
|
||||
"submenu": {
|
||||
"application": "Slušate {{applicationName}}",
|
||||
"artist": "Slušate {muzičar}",
|
||||
"title": "Slušate {naziv pesme}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Diskord Rich Presence",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Unesi ograničenje neaktivnosti u sekundama:",
|
||||
"title": "Postavi ograničenje neaktivnosti"
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"message": "Ufff! Izvinite, preuzimanje nije uspelo…",
|
||||
"title": "Greška u preuzimanju!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "({{Playlist Size}} pjesme)",
|
||||
"message": "Preuzimanje Plejliste {{playlist Title}}",
|
||||
"title": "Preuzimanje počelo"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "Pretvaranje: {{percent}}%",
|
||||
"converting": "Pretvaranje…",
|
||||
"done": "Gotovo: {{file Path}}",
|
||||
"download-info": "Preuzimanje {{artist}} - {{title}} [{{videoId}}",
|
||||
"download-progress": "Preuzimanje: {{percent}}%",
|
||||
"downloading": "Preuzimanje…"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Ha fallat l'execució de l'extensió {{pluginName}}::{{contextName}}",
|
||||
"execute-failed": "Error en l'execució de l'extensió {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "L'extensió {{pluginName}}::{{contextName}} s'ha executat als {{ms}}ms",
|
||||
"initialize-failed": "Ha fallat la inicialització de l'extensió \"{{pluginName}}\"",
|
||||
"load-all": "Carregant totes les extensions",
|
||||
@ -154,7 +154,7 @@
|
||||
"label": "Títol personalitzat de la finestra",
|
||||
"prompt": {
|
||||
"label": "Introdueix un títol personalitzat per a la finestra (deixa-ho buit per deshabilitar-ho)",
|
||||
"placeholder": "Exemple: YouTube Music"
|
||||
"placeholder": "Exemple: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
@ -208,8 +208,8 @@
|
||||
"restart": "Reinicia l'aplicació",
|
||||
"show": "Mostra la finestra",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -237,7 +237,8 @@
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"enable-seekbar": "Activar el tema en la barra de progrés"
|
||||
},
|
||||
"name": "Tema de color de l'àlbum"
|
||||
},
|
||||
@ -287,7 +288,7 @@
|
||||
"name": "Mode ambient"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Afegeix suport a Youtube Music per el widget \"now playing\" d'Amuse per 6K Labs",
|
||||
"description": "Afegeix suport a {{applicationName}} per el widget \"now playing\" d'Amuse per 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "L'API del servidor de Amuse està funcionant. GET /query per tenir informació de la cançó."
|
||||
@ -369,11 +370,11 @@
|
||||
"name": "Desenfoca la barra de navegació"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Esquiva la verificació d'edat de YouTube",
|
||||
"description": "Esquiva la verificació d'edat de Music Player",
|
||||
"name": "Esquiva les restriccions d'edat"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Selector de subtítols per les pistes d'àudio de YouTube Music",
|
||||
"description": "Selector de subtítols per les pistes d'àudio de {{applicationName}}",
|
||||
"menu": {
|
||||
"autoload": "Selecciona automàticament l'últim subtítol emprat",
|
||||
"disable-captions": "Sense subtítols per defecte"
|
||||
@ -421,6 +422,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "Configura un dispositiu multimèdia de sortida personalitzat per a cançons",
|
||||
"menu": {
|
||||
"device-selector": "Selecciona un dispositiu"
|
||||
},
|
||||
"name": "Dispositiu de sortida personalitzat",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Trieu el dispositiu de sortida que s'utilitzarà",
|
||||
"title": "Escull el dispositiu de sortida"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Fa que la cançó comenci en mode «pausat»",
|
||||
"menu": {
|
||||
@ -443,8 +457,16 @@
|
||||
"disconnected": "Desconnectat",
|
||||
"hide-duration-left": "Amaga la durada restant",
|
||||
"hide-github-button": "Amaga el botó de l'enllaç a GitHub",
|
||||
"play-on-youtube-music": "Reprodueix a YouTube Music",
|
||||
"set-inactivity-timeout": "Estableix temps d'espera d'inactivitat"
|
||||
"play-on-application": "Reprodueix a {{applicationName}}",
|
||||
"set-inactivity-timeout": "Estableix temps d'espera d'inactivitat",
|
||||
"set-status-display-type": {
|
||||
"label": "Text d'estat",
|
||||
"submenu": {
|
||||
"artist": "Escoltant {artist}",
|
||||
"application": "Escoltant {{applicationName}}",
|
||||
"title": "Escoltant {song title}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Estat d'activitat de Discord",
|
||||
"prompt": {
|
||||
@ -615,10 +637,10 @@
|
||||
"name": "Navegació",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Tornar a la pàgina anterior"
|
||||
"title": "Pàgina anterior"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Anar a la pàgina següent"
|
||||
"title": "Pàgina següent"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -736,6 +758,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "Introduir token d'usuari de ListenBrainz"
|
||||
},
|
||||
"scrobble-alternative-artist": "Utilitza artistes alternatius",
|
||||
"scrobble-alternative-title": "Useu títols alternatius",
|
||||
"scrobble-other-media": "Scrobble amb altres mitjans"
|
||||
},
|
||||
@ -821,6 +844,14 @@
|
||||
"label": "Fes que les lletres es sincronitzin a la perfecció",
|
||||
"tooltip": "Calcula al mil·lisegon l'aparició de la següent línia (pot tenir un petit impacte en el rendiment)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "Proveïdor preferit",
|
||||
"none": {
|
||||
"label": "Cap",
|
||||
"tooltip": "Cap proveïdor preferit"
|
||||
},
|
||||
"tooltip": "Trieu el proveïdor predeterminat que voleu utilitzar"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Romanitza les lletres",
|
||||
"tooltip": "Si les lletres són en un idioma diferent, intenta mostrar la versió amb alfabet llatí."
|
||||
@ -853,6 +884,27 @@
|
||||
"description": "Afegeix un giny a la Touch Bar per usuaris de macOS",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "Fa la finestra de l'aplicació transparent",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "Opacitat",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "Tipus",
|
||||
"submenu": {
|
||||
"acrylic": "Acrílic",
|
||||
"mica": "Mica",
|
||||
"none": "Cap",
|
||||
"tabbed": "En pestanyes"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Reproductor Transparent"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integració amb l'extensió «Tuna» del OBS",
|
||||
"name": "Tuna OBS"
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
"load-all": "Načítání všech pluginů",
|
||||
"load-failed": "Selhalo načtení \"{{pluginName}}\" pluginu",
|
||||
"loaded": "Plugin \"{{pluginName}}\" načten",
|
||||
"unload-failed": "Selhalo unload \"{{pluginName}}\" pluginu",
|
||||
"unload-failed": "Selhalo vypnutí \"{{pluginName}}\" pluginu",
|
||||
"unloaded": "Plugin {{pluginName}} byl odnačten"
|
||||
}
|
||||
}
|
||||
@ -154,7 +154,7 @@
|
||||
"label": "Vlastní název okna",
|
||||
"prompt": {
|
||||
"label": "Zadejte vlastní název okna: (zanechejte prázdné pro zakázání)",
|
||||
"placeholder": "Příklad: Hudba YouTube"
|
||||
"placeholder": "Příklad: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
@ -208,8 +208,8 @@
|
||||
"restart": "Restartovat aplikaci",
|
||||
"show": "Zobrazit okno",
|
||||
"tooltip": {
|
||||
"default": "Youtube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -287,7 +287,8 @@
|
||||
"name": "Ambientní režim"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Přídá YouTube Music podporu pro Amuse ‚právě hraje‘ widget od 6K Labs",
|
||||
"description": "Přídá {{applicationName}} podporu pro Amuse ‚právě hraje‘ widget od 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Server Amuse API běží. Pošli požadavek typu GET na /query, aby ses dozvěděl info o písničce."
|
||||
}
|
||||
@ -336,7 +337,7 @@
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Apply compression k audiu (snižuje hlasitost nejhlasitěších částí signálu and zvyšuje hlasitost nejjemnějších částí)",
|
||||
"description": "Aplikuje kompresi k audiu (snižuje hlasitost nejhlasitěších částí signálu a zvyšuje hlasitost nejjemnějších částí)",
|
||||
"name": "Audio kompresor"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
@ -351,6 +352,7 @@
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Autorizační Proxy adaptér",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Zadejte hostname lokálního proxy serveru (vyžaduje restart):",
|
||||
@ -367,11 +369,11 @@
|
||||
"name": "Rozmazaný navigační panel"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Obejít ověření věku na YouTube",
|
||||
"description": "Obejít ověření věku na Music Player",
|
||||
"name": "Obejít věková omezení"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Titulkový selector pro zvukové stopy v YouTube Music",
|
||||
"description": "Titulkový selector pro zvukové stopy v {{applicationName}}",
|
||||
"menu": {
|
||||
"autoload": "Automaticky vybrat naposledy použité titulky",
|
||||
"disable-captions": "Žádné titulky ve vychozím nastavení"
|
||||
@ -419,6 +421,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "Nastavte vlastní výstupní zařízení pro skladby",
|
||||
"menu": {
|
||||
"device-selector": "Vyberte zařízení"
|
||||
},
|
||||
"name": "Vlastní výstupní zařízení",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Vyberte zařízení pro výstup zvuku",
|
||||
"title": "Vyberte výstupní zařízení"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Spustí písničku v režimu \"pozastaveno\"",
|
||||
"menu": {
|
||||
@ -441,8 +456,16 @@
|
||||
"disconnected": "Odpojeno",
|
||||
"hide-duration-left": "Skrýt zbývající duration",
|
||||
"hide-github-button": "Skrýt tlačítko s odkazem na GitHub",
|
||||
"play-on-youtube-music": "Hrát na YouTube Music",
|
||||
"set-inactivity-timeout": "Nastavit timeout pro neaktivitu"
|
||||
"play-on-application": "Hrát na {{applicationName}}",
|
||||
"set-inactivity-timeout": "Nastavit timeout pro neaktivitu",
|
||||
"set-status-display-type": {
|
||||
"label": "Text statusu",
|
||||
"submenu": {
|
||||
"artist": "Poslouchám: {artist}",
|
||||
"application": "Poslouchám {{applicationName}}",
|
||||
"title": "Poslouchám {song title}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Discord Rich Persence",
|
||||
"prompt": {
|
||||
@ -643,7 +666,8 @@
|
||||
"name": "Oznámení"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Zlepšit výkon povolením experimentálních skriptů"
|
||||
"description": "Zlepšit výkon povolením experimentálních skriptů",
|
||||
"name": "Zlepšení výkonu [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Povoluje switch aplikaci do režimu obrázek v obrázku",
|
||||
@ -733,6 +757,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "Vložte Listenbrainz user token"
|
||||
},
|
||||
"scrobble-alternative-artist": "Použij alternativní umělce",
|
||||
"scrobble-alternative-title": "Používat alternativní názvy",
|
||||
"scrobble-other-media": "Scrobble jiné média"
|
||||
},
|
||||
@ -795,20 +820,44 @@
|
||||
"line-effect": {
|
||||
"label": "Efekt řádku",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Luxusní",
|
||||
"tooltip": "Použijte velké, aplikací inspirované efekty na aktuální řádek"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Soustředění",
|
||||
"tooltip": "Nechat pouze aktuální řádek bílý"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Posun"
|
||||
"label": "Posun",
|
||||
"tooltip": "Posunout aktuální řádek doprava"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Zvětšení",
|
||||
"tooltip": "Změnit velikost aktuálního řádku"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tooltip": "Vyberte efekt pro aktuální řádek"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Dokonale synchronizovat texty",
|
||||
"tooltip": "Vypočítat zobrazení dalšího řádku na milisekundu (může mít menší dopad na výkon)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "Preferovaný poskytovatel",
|
||||
"none": {
|
||||
"label": "Žádný",
|
||||
"tooltip": "Žádný preferovaný poskytovatel"
|
||||
},
|
||||
"tooltip": "Zvolte výchozího poskytovatele"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Romanizovat texty",
|
||||
"tooltip": "Pokud je text v jiném jazyce, zkusit zobrazit verzi v latince."
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Zobrazit i nepřesné texty"
|
||||
"label": "Zobrazit i nepřesné texty",
|
||||
"tooltip": "Pokud se píseň nenajde, plugin to zkusí znovu s jiným vyhledávacím výrazem.\nVýsledek druhého pokusu nemusí být přesný."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Zobrazit časové kódy",
|
||||
@ -817,7 +866,8 @@
|
||||
},
|
||||
"name": "Synchronizované texty",
|
||||
"refetch-btn": {
|
||||
"fetching": "Získávání..."
|
||||
"fetching": "Získávání...",
|
||||
"normal": "Znovu načíst texty"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Text nemusí být synchronizován kvůli neshodě v délce trvání.",
|
||||
@ -833,10 +883,35 @@
|
||||
"description": "Přidává Touch Bar widget pro macOS uživatele",
|
||||
"name": "Touch Bar"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "Zprůhlední okno aplikace",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "Průhlednost",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "Typ",
|
||||
"submenu": {
|
||||
"acrylic": "Akryl",
|
||||
"mica": "Mica",
|
||||
"none": "Žádné",
|
||||
"tabbed": "Záložkovaný"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Průhledný přehrávač"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integrace s OBS's plugin Tuna",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
"description": "Zabrání tomu, aby se přehrávač objevil při hraní písně",
|
||||
"name": "Nepřekážející přehrávač"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "Přidává tlačítko k switch mezi video/písničko režimem. Může také odstranit celou video kartu",
|
||||
"menu": {
|
||||
|
||||
@ -8,7 +8,8 @@
|
||||
"load-all": "Indlæser alle plugins",
|
||||
"load-failed": "Fejl ved indlæsning af plugin \"{{pluginName}}\"",
|
||||
"loaded": "Plugin \"{{pluginName}}\" indlæst",
|
||||
"unload-failed": "Fejl ved unload af plugin \"{{pluginName}}\""
|
||||
"unload-failed": "Fejl ved aflæsning af plugin \"{{pluginNavn}}\"",
|
||||
"unloaded": "Plugin \"{{pluginNavn}}\" aflæssede"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -98,6 +99,7 @@
|
||||
"auto-reset-app-cache": "Nulstil app cache når appen starter",
|
||||
"disable-hardware-acceleration": "Deaktiver hardware acceleration",
|
||||
"edit-config-json": "Rediger config.json",
|
||||
"override-user-agent": "Erstat Bruger-Agent",
|
||||
"restart-on-config-changes": "Genstart ved config ændringer",
|
||||
"set-proxy": {
|
||||
"label": "Indstil proxy",
|
||||
@ -130,22 +132,34 @@
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Genoptag sidste sang når appen starter",
|
||||
"single-instance-lock": "Enkeltinstans lås",
|
||||
"start-at-login": "Start ved login",
|
||||
"starting-page": {
|
||||
"label": "Startside",
|
||||
"unset": "Ikke valgt"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Bakke",
|
||||
"submenu": {
|
||||
"disabled": "Deaktiveret",
|
||||
"enabled-and-hide-app": "Bakke aktiveret, og skjul programvindue",
|
||||
"enabled-and-show-app": "Aktiver og vis app",
|
||||
"play-pause-on-click": "Start/Stop ved klik"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Visuelle Justeringer",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "Tilpasset vindues titel",
|
||||
"prompt": {
|
||||
"label": "Indtast tilpasset vindues titel: (lad være top for deaktiveret)",
|
||||
"placeholder": "Eksempel: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "Standard",
|
||||
"force-show": "Tving visning",
|
||||
"hide": "Skjul",
|
||||
"label": "Like knapper"
|
||||
},
|
||||
@ -153,11 +167,15 @@
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Annuller",
|
||||
"remove": "Fjern"
|
||||
}
|
||||
},
|
||||
"remove-theme": "Er du sikker på at du til fjerne det brugerdefinerede tema?",
|
||||
"remove-theme-message": "Dette vil fjerne det brugerdefinerede tema"
|
||||
},
|
||||
"label": "Tema",
|
||||
"submenu": {
|
||||
"import-css-file": "Importer brugerdefinerede CSS fil",
|
||||
"no-theme": "Intet tema"
|
||||
}
|
||||
}
|
||||
@ -173,6 +191,7 @@
|
||||
"view": {
|
||||
"label": "Vis",
|
||||
"submenu": {
|
||||
"force-reload": "Tving Genindlæs",
|
||||
"reload": "Genindlæs",
|
||||
"zoom-in": "Zoom ind",
|
||||
"zoom-out": "Zoom ud"
|
||||
@ -187,8 +206,8 @@
|
||||
"restart": "Genstart app",
|
||||
"show": "Vis vindue",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Erweiterung {{pluginName}}::{{contextName}} konnte nicht ausgeführt werden",
|
||||
"executed-at-ms": "Erweiterung {{pluginName}}::{{contextName}} ausgeführt in {{ms}}ms",
|
||||
"executed-at-ms": "Erweiterung {{pluginName}}::{{contextName}} in {{ms}}ms ausgeführt",
|
||||
"initialize-failed": "Initialisierung der Erweiterung \"{{pluginName}}\" fehlgeschlagen",
|
||||
"load-all": "Lade alle Erweiterungen",
|
||||
"load-failed": "Laden der Erweiterung \"{{pluginName}}\" fehlgeschlagen",
|
||||
@ -154,7 +154,7 @@
|
||||
"label": "Benutzerdefinierter Fenstertitel",
|
||||
"prompt": {
|
||||
"label": "Benutzerdefinierten Fenstertitel eingeben: (zum Deaktivieren leer lassen)",
|
||||
"placeholder": "Beispiel: YouTube Music"
|
||||
"placeholder": "Beispiel: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
@ -208,8 +208,8 @@
|
||||
"restart": "Anwendung neu starten",
|
||||
"show": "Fenster anzeigen",
|
||||
"tooltip": {
|
||||
"default": "YouTube Musik",
|
||||
"with-song-info": "YouTube Musik: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -237,7 +237,8 @@
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"enable-seekbar": "Suchleisten-Design aktivieren"
|
||||
},
|
||||
"name": "Thema aus Albumfarbe"
|
||||
},
|
||||
@ -287,7 +288,7 @@
|
||||
"name": "Ambiente-Modus"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Fügt Unterstützung für das Amuse \"Spielt gerade\"-Widget von 6K Labs hinzu",
|
||||
"description": "Fügt {{applicationName}} Unterstützung für das Amuse \"Spielt gerade\"-Widget von 6K Labs hinzu",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API-Server läuft. /query für Liedinformationen."
|
||||
@ -320,6 +321,22 @@
|
||||
"hostname": {
|
||||
"label": "Hostname"
|
||||
},
|
||||
"https": {
|
||||
"label": "HTTPS & Zertifikate",
|
||||
"submenu": {
|
||||
"cert": {
|
||||
"dialogTitle": "HTTPS Zertifikat Datei auswählen",
|
||||
"label": "Zertifikate Datei (.crt/.pem)"
|
||||
},
|
||||
"enable-https": {
|
||||
"label": "HTTPS aktivieren"
|
||||
},
|
||||
"key": {
|
||||
"dialogTitle": "HTTPS privaten Schlüssel Datei auswählen",
|
||||
"label": "Privater Schlüssel Datei (.key/.pem)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
@ -369,11 +386,11 @@
|
||||
"name": "Verschwommene Navigationsleiste"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Youtubes Altersbestätigung umgehen",
|
||||
"description": "Music Player Altersbestätigung umgehen",
|
||||
"name": "Altersbeschränkungen umgehen"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Untertitelwähler für YouTube Music-Audio-Lieder",
|
||||
"description": "Untertitelwähler für {{applicationName}}-Audio-Lieder",
|
||||
"menu": {
|
||||
"autoload": "Wähle automatisch den zuletzt verwendeten Untertitel",
|
||||
"disable-captions": "Standardmäßig keine Untertitel"
|
||||
@ -421,6 +438,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "Einen maßgeschneiderten Ausgabemedienträger für Lieder einrichten",
|
||||
"menu": {
|
||||
"device-selector": "Gerät auswählen"
|
||||
},
|
||||
"name": "Benutzerdefiniertes Ausgabegerät",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Wähle das Ausgabegerät, welches benutzt werden soll",
|
||||
"title": "Wähle ein Ausgabegerät"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Startet Lied im pausierten Modus",
|
||||
"menu": {
|
||||
@ -443,8 +473,16 @@
|
||||
"disconnected": "Getrennt",
|
||||
"hide-duration-left": "Verbleibende Zeit verstecken",
|
||||
"hide-github-button": "Knopf mit Link zu GitHub ausblenden",
|
||||
"play-on-youtube-music": "Auf YouTube Music abspielen",
|
||||
"set-inactivity-timeout": "Inaktivitätstimeout setzen"
|
||||
"play-on-application": "Auf {{applicationName}} abspielen",
|
||||
"set-inactivity-timeout": "Inaktivitätstimeout setzen",
|
||||
"set-status-display-type": {
|
||||
"label": "Status Text",
|
||||
"submenu": {
|
||||
"application": "Hört {{applicationName}}",
|
||||
"artist": "Hört {artist} zu",
|
||||
"title": "Du hörst {song title}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Discords Aktivitätsstatus",
|
||||
"prompt": {
|
||||
@ -585,7 +623,7 @@
|
||||
"permission": {
|
||||
"all": "Gästen erlauben, Wiederhabeliste und Player zu bedienen",
|
||||
"host-only": "Nur der Host kann die Playlist und den Player kontrollieren",
|
||||
"playlist": "Gäste das Kontrollieren der Playlist erlauben"
|
||||
"playlist": "Gästen das Kontrollieren der Playlist erlauben"
|
||||
},
|
||||
"set-permission": "Kontrollberechtigung ändern",
|
||||
"status": {
|
||||
@ -736,6 +774,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "ListenBrainz-Benutzer-Token eintragen"
|
||||
},
|
||||
"scrobble-alternative-artist": "Benutze Alternative Künstler",
|
||||
"scrobble-alternative-title": "Nutze alternative Titel",
|
||||
"scrobble-other-media": "Andere Medien scrobbeln"
|
||||
},
|
||||
@ -821,6 +860,14 @@
|
||||
"label": "Den Songtext perfekt synchronisieren",
|
||||
"tooltip": "Auf die Millisekunde genau berechnen, wann die nächste Zeile angezeigt werden soll (Kann Einfluss auf die Leistung haben)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "bevorzugter Anbieter",
|
||||
"none": {
|
||||
"label": "Nichts",
|
||||
"tooltip": "Kein bevorzugter Anbieter"
|
||||
},
|
||||
"tooltip": "Standardanbieter auswählen"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Lateinische Umschrift anzeigen",
|
||||
"tooltip": "Wenn der Liedtext in einer anderen Schrift ist, zeige nach Möglichkeit eine Version in lateinischer Schrift an."
|
||||
@ -853,6 +900,27 @@
|
||||
"description": "Fügt ein TouchBar-Widget für macOS-Benutzer hinzu",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "Macht das Player-Fenster transparent",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "Hintergrund-Sichtbarkeit",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "Typ",
|
||||
"submenu": {
|
||||
"acrylic": "Acryl",
|
||||
"mica": "Mica",
|
||||
"none": "Nichts",
|
||||
"tabbed": "Mit Registerkarten"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Transparenter Player"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integration mit dem OBS-Plugin Tuna",
|
||||
"name": "Tuna OBS"
|
||||
|
||||
@ -154,7 +154,7 @@
|
||||
"label": "Προσαρμοσμένος τίτλος παραθύρου",
|
||||
"prompt": {
|
||||
"label": "Εισαγωγή προσαρμοσμένου τίτλου παραθύρου: (κενό για απενεργοποίηση)",
|
||||
"placeholder": "Παράδειγμα: YouTube Music"
|
||||
"placeholder": "Παράδειγμα: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
@ -208,8 +208,8 @@
|
||||
"restart": "Επανεκκίνηση εφαρμογής",
|
||||
"show": "Εμφάνιση παραθύρου",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -287,7 +287,7 @@
|
||||
"name": "Λειτουργία περιβάλλοντος"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Προσθέτει υποστήριξη YouTube Music στο widget Amuse now playing από την 6K Labs",
|
||||
"description": "Προσθέτει υποστήριξη {{applicationName}} στο widget Amuse now playing από την 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Ο διακομιστής Amuse API εκτελείται. GET /query για να λάβετε πληροφορίες για το τραγούδι."
|
||||
@ -369,11 +369,11 @@
|
||||
"name": "Θόλωμα γραμμής πλοήγησης"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Παράκαμψη επαλήθευσης ηλικίας στο YouTube",
|
||||
"description": "Παράκαμψη επαλήθευσης ηλικίας στο Music Player",
|
||||
"name": "Παράκαμψη ηλικιακών περιορισμών"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Επιλογέας λεζάντας για μουσικά κομμάτια ήχου του YouTube",
|
||||
"description": "Επιλογέας λεζάντας για μουσικά κομμάτια ήχου του {{applicationName}}",
|
||||
"menu": {
|
||||
"autoload": "Αυτόματη επιλογή της τελευταίας χρησιμοποιούμενης λεζάντας",
|
||||
"disable-captions": "Χωρίς λεζάντες από προεπιλογή"
|
||||
@ -443,7 +443,7 @@
|
||||
"disconnected": "Αποσυνδεδεμένο",
|
||||
"hide-duration-left": "Απόκρυψη της διάρκειας που απομένει",
|
||||
"hide-github-button": "Απόκρυψη κουμπιού συνδέσμου GitHub",
|
||||
"play-on-youtube-music": "Αναπαραγωγή στο YouTube Music",
|
||||
"play-on-application": "Αναπαραγωγή στο {{applicationName}}",
|
||||
"set-inactivity-timeout": "Ορισμός χρονικού ορίου αδράνειας"
|
||||
},
|
||||
"name": "Discord Πλούσια παρουσία",
|
||||
|
||||
@ -160,7 +160,7 @@
|
||||
"label": "Custom window title",
|
||||
"prompt": {
|
||||
"label": "Enter custom window title: (leave empty to disable)",
|
||||
"placeholder": "Example: YouTube Music"
|
||||
"placeholder": "Example: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"remove-upgrade-button": "Remove upgrade button",
|
||||
@ -208,8 +208,8 @@
|
||||
"restart": "Restart App",
|
||||
"show": "Show window",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -237,7 +237,8 @@
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"enable-seekbar": "Enable seekbar theming"
|
||||
},
|
||||
"name": "Album Color Theme"
|
||||
},
|
||||
@ -287,7 +288,7 @@
|
||||
"name": "Ambient Mode"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Adds YouTube Music support for the Amuse now playing widget by 6K Labs",
|
||||
"description": "Adds {{applicationName}} support for the Amuse now playing widget by 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API server is running. GET /query to get song info."
|
||||
@ -322,6 +323,22 @@
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
},
|
||||
"https": {
|
||||
"label": "HTTPS & Certificates",
|
||||
"submenu": {
|
||||
"enable-https": {
|
||||
"label": "Enable HTTPS"
|
||||
},
|
||||
"cert": {
|
||||
"label": "Certificate file (.crt/.pem)",
|
||||
"dialogTitle": "Select HTTPS certificate file"
|
||||
},
|
||||
"key": {
|
||||
"label": "Private key file (.key/.pem)",
|
||||
"dialogTitle": "Select HTTPS private key file"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "API Server [Beta]",
|
||||
@ -369,11 +386,11 @@
|
||||
"name": "Blur Navigation Bar"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Bypass YouTube's age verification",
|
||||
"description": "Bypass Music Player's age verification",
|
||||
"name": "Bypass Age Restrictions"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Caption selector for YouTube Music audio tracks",
|
||||
"description": "Caption selector for {{applicationName}} audio tracks",
|
||||
"menu": {
|
||||
"autoload": "Automatically select last used caption",
|
||||
"disable-captions": "No captions by default"
|
||||
@ -421,6 +438,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "Configure a custom output media device for songs",
|
||||
"menu": {
|
||||
"device-selector": "Select Device"
|
||||
},
|
||||
"name": "Custom Output Device",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Choose the output media device to be used",
|
||||
"title": "Select Output Device"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Makes song start in \"paused\" mode",
|
||||
"menu": {
|
||||
@ -443,8 +473,16 @@
|
||||
"disconnected": "Disconnected",
|
||||
"hide-duration-left": "Hide duration left",
|
||||
"hide-github-button": "Hide GitHub link Button",
|
||||
"play-on-youtube-music": "Play on YouTube Music",
|
||||
"set-inactivity-timeout": "Set inactivity timeout"
|
||||
"play-on-application": "Play on {{applicationName}}",
|
||||
"set-inactivity-timeout": "Set inactivity timeout",
|
||||
"set-status-display-type": {
|
||||
"label": "Status text",
|
||||
"submenu": {
|
||||
"application": "Listening to {{applicationName}}",
|
||||
"artist": "Listening to {artist}",
|
||||
"title": "Listening to {song title}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
@ -737,6 +775,7 @@
|
||||
"token": "Enter ListenBrainz user token"
|
||||
},
|
||||
"scrobble-alternative-title": "Use alternative titles",
|
||||
"scrobble-alternative-artist": "Use alternative artists",
|
||||
"scrobble-other-media": "Scrobble other media"
|
||||
},
|
||||
"name": "Scrobbler",
|
||||
@ -791,6 +830,14 @@
|
||||
"not-found": "⚠️ No lyrics found for this song."
|
||||
},
|
||||
"menu": {
|
||||
"preferred-provider": {
|
||||
"label": "Preferred Provider",
|
||||
"tooltip": "Choose the default provider to use",
|
||||
"none": {
|
||||
"label": "None",
|
||||
"tooltip": "No preferred provider"
|
||||
}
|
||||
},
|
||||
"default-text-string": {
|
||||
"label": "Default character between lyrics",
|
||||
"tooltip": "Choose the default character to use for the gap between lyrics"
|
||||
@ -853,6 +900,27 @@
|
||||
"description": "Adds a TouchBar widget for macOS users",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "Makes the app window transparent",
|
||||
"name": "Transparent Player",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "Opacity",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "Type",
|
||||
"submenu": {
|
||||
"acrylic": "Acrylic",
|
||||
"mica": "Mica",
|
||||
"tabbed": "Tabbed",
|
||||
"none": "None"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integration with OBS's plugin Tuna",
|
||||
"name": "Tuna OBS"
|
||||
|
||||
@ -2,14 +2,14 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Error al ejecutar el plugin {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} Ejecutó en {{ms}}ms",
|
||||
"initialize-failed": "Error al inicializar el plugin \"{{pluginName}}\"",
|
||||
"load-all": "Cargando todos los plugins",
|
||||
"load-failed": "Error al cargar el plugin \"{{pluginName}}\"",
|
||||
"loaded": "Plugin \"{{pluginName}}\" cargado",
|
||||
"unload-failed": "No se ha podido descargar el plugin \"{{pluginName}}\"",
|
||||
"unloaded": "Plugin \"{{pluginName}}\" descargado"
|
||||
"execute-failed": "Error al ejecutar el complemento {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Complemento {{pluginName}}::{{contextName}} se ejecutó en {{ms}}ms",
|
||||
"initialize-failed": "Error al inicializar el complemento \"{{pluginName}}\"",
|
||||
"load-all": "Cargando todos los complementos",
|
||||
"load-failed": "Error al cargar el complemento \"{{pluginName}}\"",
|
||||
"loaded": "Complementos \"{{pluginName}}\" cargados",
|
||||
"unload-failed": "No se ha podido descargar el complemento \"{{pluginName}}\"",
|
||||
"unloaded": "Complemento \"{{pluginName}}\" descargado"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -53,7 +53,7 @@
|
||||
"later": "Más tarde",
|
||||
"restart-now": "Reiniciar ahora"
|
||||
},
|
||||
"detail": "El plugin \"{{pluginName}}\" requiere reiniciar para tomar efecto",
|
||||
"detail": "El complemento \"{{pluginName}}\" requiere reiniciar para tomar efecto",
|
||||
"message": "\"{{pluginName}}\" necesita reiniciar",
|
||||
"title": "Se requiere reinicio"
|
||||
},
|
||||
@ -154,7 +154,7 @@
|
||||
"label": "Título de ventana personalizado",
|
||||
"prompt": {
|
||||
"label": "Ingresa un título de ventana personalizado: (déjalo vacío para desactivar)",
|
||||
"placeholder": "Ejemplo: YouTube Music"
|
||||
"placeholder": "Ejemplo: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
@ -185,7 +185,7 @@
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "Habilitado",
|
||||
"label": "Plugins",
|
||||
"label": "Complementos",
|
||||
"new": "NUEVO"
|
||||
},
|
||||
"view": {
|
||||
@ -208,8 +208,8 @@
|
||||
"restart": "Reiniciar la aplicación",
|
||||
"show": "Mostrar ventana",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -237,7 +237,8 @@
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"enable-seekbar": "Habilitar temas a la barra de búsqueda"
|
||||
},
|
||||
"name": "Tema de color del álbum"
|
||||
},
|
||||
@ -287,7 +288,7 @@
|
||||
"name": "Modo ambiente"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Agrega soporte a YouTube Music para el widget \"reproduciendo\" de Amuse por 6K Labs",
|
||||
"description": "Agrega soporte a {{applicationName}} para el widget \"reproduciendo\" de Amuse por 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "El servidor API de Amuse se está ejecutando. Usa GET /query para obtener información de la canción."
|
||||
@ -320,6 +321,22 @@
|
||||
"hostname": {
|
||||
"label": "Nombre del host"
|
||||
},
|
||||
"https": {
|
||||
"label": "HTTPS & Certificados",
|
||||
"submenu": {
|
||||
"cert": {
|
||||
"dialogTitle": "Selecciona el archivo de certificado HTTPS",
|
||||
"label": "Archivo de certificado (.crt/.pem)"
|
||||
},
|
||||
"enable-https": {
|
||||
"label": "Habilitar HTTPS"
|
||||
},
|
||||
"key": {
|
||||
"dialogTitle": "Selecciona el archivo de clave privada HTTPS",
|
||||
"label": "Archivo de clave privada (.key/.pem)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"port": {
|
||||
"label": "Puerto"
|
||||
}
|
||||
@ -369,11 +386,11 @@
|
||||
"name": "Desenfocar barra de navegación"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Saltarse la verificación de edad de YouTube",
|
||||
"description": "Saltarse la verificación de edad de Music Player",
|
||||
"name": "Saltarse las restricciones de edad"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Selector de subtítulos para pistas de audio de YouTube Music",
|
||||
"description": "Selector de subtítulos para pistas de audio de {{applicationName}}",
|
||||
"menu": {
|
||||
"autoload": "Seleccionar automáticamente el último subtítulo utilizado",
|
||||
"disable-captions": "Sin subtítulos por defecto"
|
||||
@ -421,6 +438,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "Configura un dispositivo de salida de audio personalizado para las canciones",
|
||||
"menu": {
|
||||
"device-selector": "Seleccionar un dispositivo"
|
||||
},
|
||||
"name": "Dispositivo de audio personalizado",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Escoge el dispositivo de salida de audio que se va a usar",
|
||||
"title": "Seleccionar un dispositivo de audio"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Hace que la canción comience en modo \"pausado\"",
|
||||
"menu": {
|
||||
@ -443,8 +473,16 @@
|
||||
"disconnected": "Desconectado",
|
||||
"hide-duration-left": "Ocultar la duración restante",
|
||||
"hide-github-button": "Ocultar el botón de enlace a GitHub",
|
||||
"play-on-youtube-music": "Reproducir en YouTube Music",
|
||||
"set-inactivity-timeout": "Establecer tiempo de inactividad"
|
||||
"play-on-application": "Reproducir en {{applicationName}}",
|
||||
"set-inactivity-timeout": "Establecer tiempo de inactividad",
|
||||
"set-status-display-type": {
|
||||
"label": "Texto de estado",
|
||||
"submenu": {
|
||||
"application": "Escuchando {{applicationName}}",
|
||||
"artist": "Escuchando a {artist}",
|
||||
"title": "Escuchando {song title}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
@ -469,7 +507,7 @@
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "({{playlistSize}} canciones)",
|
||||
"message": "Descargando Playlist {{playlistTitle}}",
|
||||
"message": "Descargando lista de reproducción {{playlistTitle}}",
|
||||
"title": "Descarga iniciada"
|
||||
}
|
||||
},
|
||||
@ -736,6 +774,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "Introduzca el token de usuario de ListenBrainz"
|
||||
},
|
||||
"scrobble-alternative-artist": "Usar artistas alternativos",
|
||||
"scrobble-alternative-title": "Usar títulos alternativos",
|
||||
"scrobble-other-media": "Hacer Scrobble sobre otros medios"
|
||||
},
|
||||
@ -821,6 +860,14 @@
|
||||
"label": "Haz que la letra esté perfectamente sincronizada",
|
||||
"tooltip": "Calcular al milisegundo la visualización de la siguiente línea (puede tener un pequeño impacto en el rendimiento)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "Proveedor preferido",
|
||||
"none": {
|
||||
"label": "Ninguno",
|
||||
"tooltip": "Ningún proveedor preferido"
|
||||
},
|
||||
"tooltip": "Elige el proveedor predeterminado que deseas usar"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Romanizar letras",
|
||||
"tooltip": "Si la letra está en un idioma diferente, intenta mostrar una versión en latín."
|
||||
@ -853,8 +900,29 @@
|
||||
"description": "Añade un widget TouchBar para los usuarios de macOS",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "Hace que la ventana de la aplicación sea transparente",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "Opacidad",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "Tipo",
|
||||
"submenu": {
|
||||
"acrylic": "Acrílico",
|
||||
"mica": "Mica",
|
||||
"none": "Ninguno",
|
||||
"tabbed": "Con pestañas"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Reproductor transparente"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integración con el plugin Tuna de OBS",
|
||||
"description": "Integración con el complemento Tuna de OBS",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
|
||||
@ -31,6 +31,15 @@
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "CSS faili „{{cssFile}}“ pole olemas, seega eirame eelistust"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "Tõrge ei vasta!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Programmi vahemälu kustutamine"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "Akent prooviti renderdada väljaspool ekraani, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
@ -89,9 +98,29 @@
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Rakenduse käivitamisel lähtesta puhverdatud andmed",
|
||||
"disable-hardware-acceleration": "Lülita raudvaraline kiirendamine välja",
|
||||
"edit-config-json": "Muuda config.json faili"
|
||||
"edit-config-json": "Muuda config.json faili",
|
||||
"override-user-agent": "Jõudlusta User-Agent",
|
||||
"restart-on-config-changes": "Taaskäivita pärast konfiguratsiooni muutmist",
|
||||
"set-proxy": {
|
||||
"label": "Määra proxy",
|
||||
"prompt": {
|
||||
"label": "Sisesta proxy aadress: (jäta täitmata, et välja lülitada)",
|
||||
"placeholder": "Näide: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Määra proxy"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "Lülita sisse arendaja tööriistad"
|
||||
}
|
||||
},
|
||||
"always-on-top": "Alati esiplaanil",
|
||||
"auto-update": "Automaatsed uuendused",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "Järgmisel käivitamisel jääb menüü peidetuks, kasutage [Alt] klahvi, et näidata (või [`], kui kasutate rakendusesisest menüüd)",
|
||||
"title": "Menüü peitmine on sisse lülitatud"
|
||||
},
|
||||
"label": "Peida menüü"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "Keele muutmine jõustub peale uuesti käivitamist",
|
||||
@ -102,15 +131,69 @@
|
||||
"to-help-translate": "Soovid aidata tõlkimisel? Klõpsi siin"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Rakenduse käivitamisel jätka viimatiesitatud loo esitamist"
|
||||
"resume-on-start": "Rakenduse käivitamisel jätka viimatiesitatud loo esitamist",
|
||||
"single-instance-lock": "Ühe instantsi lukk",
|
||||
"start-at-login": "Käivita sisselogimisel",
|
||||
"starting-page": {
|
||||
"label": "Avaleht",
|
||||
"unset": "Määramata"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Trey",
|
||||
"submenu": {
|
||||
"disabled": "Välja lülitatud",
|
||||
"enabled-and-hide-app": "Sisse lülitatud ja rakendus peidetud",
|
||||
"enabled-and-show-app": "Sisse lülitatud ja rakendus nähtav",
|
||||
"play-pause-on-click": "Mängi/Peata klõpsates"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Visuaalsed muudatused",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "Kohandatud akna tiitel",
|
||||
"prompt": {
|
||||
"label": "Sisesta kohandatud akna tiitel: (jäta täitmata, et välja lülitada)",
|
||||
"placeholder": "Näide: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "Vaikimisi",
|
||||
"force-show": "Sunni näitama",
|
||||
"hide": "Peida",
|
||||
"label": "Meeldib nupud"
|
||||
},
|
||||
"remove-upgrade-button": "Eemalda upgrade nupp",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Katkesta",
|
||||
"remove": "Eemalda"
|
||||
},
|
||||
"remove-theme": "Kas oled kindel, et soovid enda loodud kujunduse eemaldada?",
|
||||
"remove-theme-message": "Sellega saab sinu loodud kujundus eemdladatud"
|
||||
},
|
||||
"label": "Kujundus",
|
||||
"submenu": {
|
||||
"import-css-file": "Impordi kohandatud CSS fail",
|
||||
"no-theme": "Ilma kujunduseta"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "Kasutusel",
|
||||
"label": "Lisamoodulid",
|
||||
"new": "UUS"
|
||||
},
|
||||
"view": {
|
||||
"label": "Vaata",
|
||||
"submenu": {
|
||||
"force-reload": "Laadi sundkorras uuesti",
|
||||
"reload": "Laadi uuesti",
|
||||
"reset-zoom": "Tegelik suurus",
|
||||
"toggle-fullscreen": "Lülita täisekraanivaade sisse/välja",
|
||||
"zoom-in": "Suumi sisse",
|
||||
"zoom-out": "Suumi välja"
|
||||
@ -125,8 +208,8 @@
|
||||
"restart": "Käivita rakendus uuesti",
|
||||
"show": "Näita akent",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -142,8 +225,28 @@
|
||||
},
|
||||
"name": "Reklaamiblokeerija"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"album-actions": {
|
||||
"description": "Lisab Undislike, Ebameeldiv, Meeldiv ja Unlike nupud selle rakendamiseks kõikidele loendisse või albumisse kuuluvatele lauludele.",
|
||||
"name": "Albumi aktsioonid"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Rakendab dünaamilist teemat ja visuaalseid efekte, mis põhinevad albumi värvipalettil",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Värvide segamissuhe",
|
||||
"submenu": {
|
||||
"percent": "{{suhe}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Albumi värviteema"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Rakendab valgusefekti, projitseerides videost õrnad värvid ekraani taustale",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "Hägusus"
|
||||
},
|
||||
"opacity": {
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "اجرای افزونه {{pluginName}}::{{contextName}} با خطا مواجه شد",
|
||||
"execute-failed": "اجراى {{اسمزمىنه}}::{{اسمپلاگىن}} با خطا مواجه شد",
|
||||
"executed-at-ms": "افزونه {{pluginName}}::{{contextName}} در {{ms}} میلیثانیه اجرا شد",
|
||||
"initialize-failed": "افزونه \"{{pluginName}}\" با خطا در حین مقداردهی اولیه مواجه شد",
|
||||
"load-all": "در حال بارگذاری تمامی افزونهها",
|
||||
@ -150,6 +150,13 @@
|
||||
"visual-tweaks": {
|
||||
"label": "تغییرات ظاهری",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "عنوان پنجره سفارشى",
|
||||
"prompt": {
|
||||
"label": "عنوان پنجره سفارشى را وارد کنىد: (خالى بزارىد تا غىرفعال شود)",
|
||||
"placeholder": "مثال :{{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "پیشفرض",
|
||||
"force-show": "اجبار به نمایش",
|
||||
@ -201,8 +208,8 @@
|
||||
"restart": "راهاندازی مجدد برنامه",
|
||||
"show": "نمایش پنجره",
|
||||
"tooltip": {
|
||||
"default": "یوتیوب موسیقی",
|
||||
"with-song-info": "یوتیوب موسیقی: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -280,7 +287,7 @@
|
||||
"name": "حالت محیطی"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "حالا ویجت Amuse از YouTube Music هم پشتیبانی میکنه! (توسط 6K Labs)",
|
||||
"description": "حالا ویجت Amuse از {{applicationName}} هم پشتیبانی میکنه! (توسط 6K Labs)",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "سرور Amuse فعال است. برای دریافت اطلاعات آهنگ، از آدرس /query استفاده کنید."
|
||||
@ -313,6 +320,22 @@
|
||||
"hostname": {
|
||||
"label": "نام میزبان"
|
||||
},
|
||||
"https": {
|
||||
"label": "HTTPS و گواهینامهها",
|
||||
"submenu": {
|
||||
"cert": {
|
||||
"dialogTitle": "پرونده گواهینامه HTTPS را انتخاب کنید",
|
||||
"label": "پرونده گواهینامه (crt/.pem.)"
|
||||
},
|
||||
"enable-https": {
|
||||
"label": "فعال کردن HTTPS"
|
||||
},
|
||||
"key": {
|
||||
"dialogTitle": "پرونده کلید خصوصی HTTPS را انتخاب کنید",
|
||||
"label": "پرونده کلید خصوصی (key/.pem)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"port": {
|
||||
"label": "پورت"
|
||||
}
|
||||
@ -362,11 +385,11 @@
|
||||
"name": "محو کردن نوار کنترل"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "دور زدن تأیید سن یوتیوب",
|
||||
"description": "دور زدن تأیید سن مىوزىک پلىر",
|
||||
"name": "دور زدن محدودیتهای سنی"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "انتخاب زیرنویس برای آهنگهای یوتیوب موسیقی",
|
||||
"description": "انتخاب زیرنویس برای آهنگهای پىر دسکتاپ",
|
||||
"menu": {
|
||||
"autoload": "به طور خودکار انتخاب آخرین زیرنویس استفاده شده",
|
||||
"disable-captions": "بدون زیرنویس به صورت پیشفرض"
|
||||
@ -414,6 +437,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "ىک اسپىکر براى پخش آهنگها انتخاب کنىد",
|
||||
"menu": {
|
||||
"device-selector": "دستگاه را انتخاب کنىد"
|
||||
},
|
||||
"name": "اسپىکر دلخواه",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "اسپىکر دلخواه را انتخاب کنىد",
|
||||
"title": "اسپىکر دلخواهتان را انتخاب کنىد"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "شروع آهنگ در حالت \"توقف\"",
|
||||
"menu": {
|
||||
@ -436,8 +472,16 @@
|
||||
"disconnected": "اتصال قطع شد",
|
||||
"hide-duration-left": "مخفی کردن مدت زمان باقیمانده",
|
||||
"hide-github-button": "مخفی کردن دکمه لینک گیت هاب",
|
||||
"play-on-youtube-music": "پخش در یوتیوب موزیک",
|
||||
"set-inactivity-timeout": "تنظیم زمان عدم فعالیت"
|
||||
"play-on-application": "پخش در یوتیوب موزیک",
|
||||
"set-inactivity-timeout": "تنظیم زمان عدم فعالیت",
|
||||
"set-status-display-type": {
|
||||
"label": "متن وضعىت",
|
||||
"submenu": {
|
||||
"application": "به پىر دسکتاپ گوش مىکند",
|
||||
"artist": "به {artist} گوش مىکند",
|
||||
"title": "به {song title} گوش مىکند"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
@ -729,6 +773,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "توکن کاربری ListenBrainz را وارد کنید"
|
||||
},
|
||||
"scrobble-alternative-artist": "از هنرمند دىگرى استفاده کنىد",
|
||||
"scrobble-alternative-title": "از عناوین جایگزین استفاده کنید",
|
||||
"scrobble-other-media": "ردیابی رسانههای دیگر"
|
||||
},
|
||||
@ -814,6 +859,14 @@
|
||||
"label": "هماهنگسازی کامل متن ترانه",
|
||||
"tooltip": "محاسبه دقیق نمایش خط بعدی تا میلیثانیه (ممکن است تاثیر کمی بر عملکرد داشته باشد)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "منبع دلخواه",
|
||||
"none": {
|
||||
"label": "هىچکدام",
|
||||
"tooltip": "منبح دلخواهى انتخاب نشده"
|
||||
},
|
||||
"tooltip": "منبع دلخواهتان را انتخاب کنىد"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "اشعار رومی شده",
|
||||
"tooltip": "اگر اشعار به زبانی متفاوت هستند، سعی کنید نسخه لاتین را نمایش دهید."
|
||||
@ -846,6 +899,27 @@
|
||||
"description": "افزودن ویجت TouchBar برای کاربران macOS",
|
||||
"name": "نوار لمسی"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "پنجره برنامه را شفاف مىکند",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "تارى",
|
||||
"submenu": {
|
||||
"percent": "%{{تارى}}"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "نوع",
|
||||
"submenu": {
|
||||
"acrylic": "اکرىلىک",
|
||||
"mica": "مىکا",
|
||||
"none": "هىچکدام",
|
||||
"tabbed": "نوار دار"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "پلىر شفاف"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "ادغام با پلاگین Tuna در OBS",
|
||||
"name": "Tuna OBS"
|
||||
|
||||
@ -154,7 +154,7 @@
|
||||
"label": "Mukautettu ikkunan otsikko",
|
||||
"prompt": {
|
||||
"label": "Syötä mukautettu ikkunan otsikko: (jätä tyhjäksi poistaaksesi päältä)",
|
||||
"placeholder": "Esimerkki: YouTube Music"
|
||||
"placeholder": "Esimerkki: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
@ -208,8 +208,8 @@
|
||||
"restart": "Uudelleen käynnistä appi",
|
||||
"show": "Näytä ikkuna",
|
||||
"tooltip": {
|
||||
"default": "Youtube Music",
|
||||
"with-song-info": "Youtube Music {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -287,7 +287,7 @@
|
||||
"name": "Tunnelmallinen Tila"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Lisää YouTube Music tuen Amusen nyt soitetaan -widgetille, kehittäjänä 6K Labs",
|
||||
"description": "Lisää {{applicationName}} tuen Amusen nyt soitetaan -widgetille, kehittäjänä 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API-palvelin on päällä. Käytä GET /query-rajapintaa saadaksesi kappaleen tiedot."
|
||||
@ -369,11 +369,11 @@
|
||||
"name": "Sumenna Siirtymäpalkki"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Ohita YouTuben iän vahvistus",
|
||||
"description": "Ohita Music Player iän vahvistus",
|
||||
"name": "Ohita Ikään Perustuvat Rajoitukset"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "YouTube Music ääniraitojen tekstitysten valitsin",
|
||||
"description": "{{applicationName}} ääniraitojen tekstitysten valitsin",
|
||||
"menu": {
|
||||
"autoload": "Valitse automaattisesti viimeksi käytetty tekstitys",
|
||||
"disable-captions": "Tekstitys ei oletusarvoisesti käytössä"
|
||||
@ -443,7 +443,7 @@
|
||||
"disconnected": "Yhteys katkaistu",
|
||||
"hide-duration-left": "Piilota kappaleen jäljellä oleva kesto",
|
||||
"hide-github-button": "Piilota \"linkki GitHubiin\" -nappi",
|
||||
"play-on-youtube-music": "Kuuntele palvelussa YouTube Music",
|
||||
"play-on-application": "Kuuntele palvelussa {{applicationName}}",
|
||||
"set-inactivity-timeout": "Aseta toimettomuuden aikakatkaisu"
|
||||
},
|
||||
"name": "Discord Aktiviteetti (Rich Presence)",
|
||||
|
||||
@ -97,7 +97,7 @@
|
||||
"label": "Mga advance na opsyon",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "I-reset ang app cache kapag nagsisimula ang app",
|
||||
"disable-hardware-acceleration": "Di paganahin ang pagpapabilis ng hardware",
|
||||
"disable-hardware-acceleration": "Di-paganahin ang pagpapabilis ng hardware",
|
||||
"edit-config-json": "I-edit ang config.json",
|
||||
"override-user-agent": "I-override ang User-Agent",
|
||||
"restart-on-config-changes": "I-restart kada may pagbabago sa config",
|
||||
@ -150,6 +150,13 @@
|
||||
"visual-tweaks": {
|
||||
"label": "Mga Biswal na Tweak",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "Custom na window title",
|
||||
"prompt": {
|
||||
"label": "I-enter ang custom na window tile: (iwanang blanko para di-mapagana)",
|
||||
"placeholder": "Halimbawa: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "Default",
|
||||
"force-show": "Pilitang ipakita",
|
||||
@ -201,8 +208,8 @@
|
||||
"restart": "I-restart ang App",
|
||||
"show": "Ipakita ang window",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -280,7 +287,7 @@
|
||||
"name": "Ambient Mode"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Nagdaragdag ng suporta sa YouTube Music para sa Amuse now playing widget ng 6K Labs",
|
||||
"description": "Nagdaragdag ng suporta sa {{applicationName}} para sa Amuse now playing widget ng 6K Labs",
|
||||
"response": {
|
||||
"query": "Tumatakbo ang Amuse API server. Gamitin ang GET /query para makuha ang impo ng kanta."
|
||||
}
|
||||
@ -332,16 +339,37 @@
|
||||
"description": "Ilapat ang compression sa audio (pinababa ang volume ng pinakamalakas na bahagi ng signal at pinapataas ang volume ng pinakamalambot na bahagi)",
|
||||
"name": "Compressor ng Audio"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Suporta para sa paggamit ng authentication proxy services",
|
||||
"menu": {
|
||||
"disable": "Huwag paganahin ang Proxy Adapter",
|
||||
"enable": "Paganahin ang Proxy Adapter",
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Auth Proxy Adapter",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Ilagay ang pangalan ng host para sa local proxy server (kinailangang mag-restart):",
|
||||
"title": "Hostname ng Proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Ilagay ang port para sa local proxy server (kinailangang mag-restart):",
|
||||
"title": "Port ng Proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Gawing transparent at malabo ang bar ng nabigasyon",
|
||||
"name": "Palabuin ang Bar ng Nabigasyon"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "I-bypass ang pag-verify ng edad ng YouTube",
|
||||
"description": "I-bypass ang pag-verify ng edad ng Music Player",
|
||||
"name": "I-bypass ang Restriksyon sa Edad"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Tagapili ng caption para sa mga audio track ng YouTube Music",
|
||||
"description": "Tagapili ng caption para sa mga audio track ng {{applicationName}}",
|
||||
"menu": {
|
||||
"autoload": "Awtomatikong piliin ang huling ginamit na caption",
|
||||
"disable-captions": "Walang mga caption bilang default"
|
||||
@ -356,6 +384,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "Bumukas ng pagpilian ng caption"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Binago ang caption sa {{language}}",
|
||||
"caption-disabled": "Di-napagana ang mga caption",
|
||||
"no-captions": "Walang captions ay available para sa kantang ito"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -378,12 +411,25 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "I-configure ang custom na output media device para sa mga kanta",
|
||||
"menu": {
|
||||
"device-selector": "Pumili ng Device"
|
||||
},
|
||||
"name": "Custom na Output Device",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Pumili ng output media device na gagamitin",
|
||||
"title": "Pumili ng Output Device"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Gawing simulan ang kanta sa \"naka-pause\" na mode",
|
||||
"menu": {
|
||||
"apply-once": "Nalalapat lamang sa startup"
|
||||
},
|
||||
"name": "Patayin ang Pag-Autoplay"
|
||||
"name": "Di-paganahin ang Autoplay"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
@ -400,9 +446,17 @@
|
||||
"disconnected": "Nadiskonekta",
|
||||
"hide-duration-left": "Itago ang natitirang oras",
|
||||
"hide-github-button": "Itago ang button na GitHub link",
|
||||
"play-on-youtube-music": "Patugtugin sa YouTube Music",
|
||||
"set-inactivity-timeout": "I-set ang inactivity timeout"
|
||||
"play-on-application": "Patugtugin sa {{applicationName}}",
|
||||
"set-inactivity-timeout": "I-set ang inactivity timeout",
|
||||
"set-status-display-type": {
|
||||
"submenu": {
|
||||
"artist": "Nakikinig sa {artist}",
|
||||
"title": "Nakikinig sa {song title}",
|
||||
"application": "Kumikinig sa {{applicationName}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Ilagay ang inactivity timeout sa ilang segundo:",
|
||||
@ -414,10 +468,16 @@
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"message": "Kainis! Paumanhin, nabigo ang pag-download…",
|
||||
"title": "Nagkaroon ng error sa pag-download!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "({{playlistSize}} na mga kanta)",
|
||||
"message": "Dina-download ang Playlist na {{playlistTitle}}",
|
||||
"title": "Nasimulan na ang pag-download"
|
||||
@ -459,6 +519,7 @@
|
||||
},
|
||||
"submenu": {
|
||||
"enabled": "Napagana na",
|
||||
"mode": "Sukatan ng oras",
|
||||
"percent": "Porsyento",
|
||||
"seconds": "Segundo"
|
||||
}
|
||||
@ -467,29 +528,36 @@
|
||||
"presets": "Mga preset",
|
||||
"skip-existing": "Laktawan ang mga kasalukuyang file"
|
||||
},
|
||||
"name": "Taga-download",
|
||||
"renderer": {
|
||||
"can-not-update-progress": "Hindi ma-update ang progress"
|
||||
},
|
||||
"templates": {
|
||||
"button": "Mag-download"
|
||||
"button": "I-download"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Nagdaragdag ng equalizer sa player",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Mga Preset"
|
||||
"label": "Mga Preset",
|
||||
"list": {
|
||||
"bass-booster": "Taga-boost ng Bass"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Equalizer"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Ginagawang exponential ang volume slider para mas madaling pumili ng mas mababang volume."
|
||||
"description": "Ginagawang exponential ang volume slider para mas madaling pumili ng mas mababang volume.",
|
||||
"name": "Exponential na Volume"
|
||||
},
|
||||
"in-app-menu": {
|
||||
"description": "Nagbibigay sa mga menu-bar ng magarbo, madilim o kulay ng album",
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "Itago ang mga DOM window control"
|
||||
}
|
||||
},
|
||||
"name": "In-App na Menu"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "Nabibigay suporta sa Lumia Stream",
|
||||
@ -497,6 +565,7 @@
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Nagdaragdag ng suporta sa lyrics para sa karamihan ng kanta",
|
||||
"name": "Lyrics Genius",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "Kinuha ang lyrics para sa Genius"
|
||||
}
|
||||
@ -508,6 +577,7 @@
|
||||
},
|
||||
"internal": {
|
||||
"save": "I-save",
|
||||
"track-source": "Source ng Track",
|
||||
"unknown-user": "Di-kilalang User"
|
||||
},
|
||||
"menu": {
|
||||
@ -530,6 +600,7 @@
|
||||
"host": "Nakakonekta bilang Host"
|
||||
}
|
||||
},
|
||||
"name": "Music Together [Beta]",
|
||||
"toast": {
|
||||
"add-song-failed": "Nabigong magdagdag ng kanta",
|
||||
"closed": "Nakasara ang Music Together",
|
||||
@ -547,7 +618,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Ang Next/Back navigation na arrow ay direktang magamit sa interface, katulad sa iyong paboritong browser",
|
||||
"name": "Nabigasyon"
|
||||
"name": "Nabigasyon",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Pumunta sa nakaraang page"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Pumunta sa susunod na page"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Tanggalin ang mga Google login na button at mga link mula sa interface",
|
||||
@ -605,8 +684,10 @@
|
||||
"description": "Kontrolin nang wasto ang volume gamit ang mousewheel/mga hotkey, na may custom HUD at customizable na volume step",
|
||||
"menu": {
|
||||
"arrows-shortcuts": "Lokal na Arrow-key na Kontrol",
|
||||
"custom-volume-steps": "I-set ang custom na Volume Step"
|
||||
"custom-volume-steps": "I-set ang custom na Volume Step",
|
||||
"global-shortcuts": "Global na mga Hotkey"
|
||||
},
|
||||
"name": "Eksaktong Volume",
|
||||
"prompt": {
|
||||
"global-shortcuts": {
|
||||
"keybind-options": {
|
||||
@ -630,7 +711,13 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Payagang mapapalitan ang kalidad ng video na may button sa video overlay"
|
||||
"description": "Payagang mapapalitan ang kalidad ng video na may button sa video overlay",
|
||||
"name": "Taga-palit sa quality ng video",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "Buksan ang taga-palit ng quality"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Idagdag ang scrobbling support (last.fm, Listenbrains, atbp.)",
|
||||
@ -649,6 +736,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "Ilagay ang user token ng ListenBrainz"
|
||||
},
|
||||
"scrobble-alternative-artist": "Gumamit ng mga alternatibong artist",
|
||||
"scrobble-alternative-title": "Gumamit ng alternatibong mga title",
|
||||
"scrobble-other-media": "Mag-Scrobble ng ibang media"
|
||||
},
|
||||
@ -679,7 +767,8 @@
|
||||
"play-pause": "Mag-play / Mag-pause",
|
||||
"previous": "Nakaraan"
|
||||
},
|
||||
"label": "Pumili ng Global na Keybind para sa Songs Control:"
|
||||
"label": "Pumili ng Global na Keybind para sa Songs Control:",
|
||||
"title": "Global na mga Keybind"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -713,12 +802,15 @@
|
||||
"tooltip": "Gumamit ng malaki, mala-app na effect sa kasalukuyang linya"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Focus",
|
||||
"tooltip": "Gawing puti lamang ang kasalukuyang linya"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Offset",
|
||||
"tooltip": "I-offset sa kanan ang kasalukuyang linya"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Scale",
|
||||
"tooltip": "I-scale ang kasalukuyang linya"
|
||||
}
|
||||
},
|
||||
@ -728,6 +820,14 @@
|
||||
"label": "Gawing perpektong naka-sync ang lyrics",
|
||||
"tooltip": "Kalkulahin sa millisecond ang pagpapakita ng susunod na linya (maaaring magkaroon ng maliit na epekto sa performance)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "Napiling Provider",
|
||||
"none": {
|
||||
"label": "Wala",
|
||||
"tooltip": "Walang napiling provider"
|
||||
},
|
||||
"tooltip": "Pumili ng default na provider para gagamitin"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "I-romanize ang lyrics",
|
||||
"tooltip": "Kung ang lyrics ay nasa ibang wika, subukang magpakita ng latin na bersyon."
|
||||
@ -758,6 +858,19 @@
|
||||
"touchbar": {
|
||||
"description": "Idaragdag ang TouchBar na widget para sa mga user ng macOS"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "Gawing transparent ang app window",
|
||||
"menu": {
|
||||
"type": {
|
||||
"label": "Uri",
|
||||
"submenu": {
|
||||
"none": "Wala",
|
||||
"tabbed": "Naka-tab"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Transparent na Player"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integrasyon kasama ang Tuna na OBS plugin"
|
||||
},
|
||||
@ -779,10 +892,11 @@
|
||||
"force-hide": "Piliting tanggalin ang video tab",
|
||||
"mode": {
|
||||
"submenu": {
|
||||
"disabled": "Naka-disable"
|
||||
"disabled": "Di-napagana"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Pag-toggle ng Video",
|
||||
"templates": {
|
||||
"button-song": "Kanta"
|
||||
}
|
||||
@ -791,7 +905,8 @@
|
||||
"description": "Idaragdag ng visualizer sa player",
|
||||
"menu": {
|
||||
"visualizer-type": "Uri ng Visualizer"
|
||||
}
|
||||
},
|
||||
"name": "Taga-visualize"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -79,7 +79,7 @@
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "À-propos",
|
||||
"about": "À propos",
|
||||
"navigation": {
|
||||
"label": "Navigation",
|
||||
"submenu": {
|
||||
@ -94,7 +94,7 @@
|
||||
"label": "Paramètres",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "Options avancée",
|
||||
"label": "Options avancées",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Réinitialiser le cache de l'application au démarrage",
|
||||
"disable-hardware-acceleration": "Désactiver les accélérations matérielles",
|
||||
@ -153,8 +153,8 @@
|
||||
"custom-window-title": {
|
||||
"label": "Titre de fenêtre personnalisé",
|
||||
"prompt": {
|
||||
"label": "Entrés un titre de fenêtre : (Laissé vide pour déactiver)",
|
||||
"placeholder": "Exemple : YouTube Musique"
|
||||
"label": "Entrer un titre de fenêtre : (Laissé vide pour désactiver)",
|
||||
"placeholder": "Exemple : {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
@ -189,7 +189,7 @@
|
||||
"new": "NOUVEAU"
|
||||
},
|
||||
"view": {
|
||||
"label": "Vue",
|
||||
"label": "Fenêtre",
|
||||
"submenu": {
|
||||
"force-reload": "Forcer l'actualisation",
|
||||
"reload": "Actualiser",
|
||||
@ -208,8 +208,8 @@
|
||||
"restart": "Redémarrer l'application",
|
||||
"show": "Afficher la fenêtre",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music : {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}} : {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -237,7 +237,8 @@
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"enable-seekbar": "Activer le thème sur la barre de progression"
|
||||
},
|
||||
"name": "Thème de couleur d'album"
|
||||
},
|
||||
@ -287,10 +288,10 @@
|
||||
"name": "Mode ambiant"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Ajout de la prise en charge de YouTube Music pour le widget Amuse now playing de 6K Labs",
|
||||
"description": "Ajout de la prise en charge de {{applicationName}} pour le widget Amuse now playing de 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Le serveur API Amuse est en cours d'exécution. Envoyez une requête GET /query pour obtenir des informations sur la chanson."
|
||||
"query": "Le serveur API d'Amuse est en cours d'exécution. GET /query pour obtenir des informations sur les chansons."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
@ -302,7 +303,7 @@
|
||||
"deny": "Interdire"
|
||||
},
|
||||
"message": "Autoriser {{ID}} ({{origin}}) à accéder à l'API ?",
|
||||
"title": "Requête d'autorisation d'API"
|
||||
"title": "Demande d'autorisation à l'API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
@ -310,7 +311,7 @@
|
||||
"label": "Plan d'autorisation",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autoriser à la première requête"
|
||||
"label": "Autoriser lors de la première requête"
|
||||
},
|
||||
"none": {
|
||||
"label": "Pas d'autorisation"
|
||||
@ -320,6 +321,22 @@
|
||||
"hostname": {
|
||||
"label": "Nom de l'hôte"
|
||||
},
|
||||
"https": {
|
||||
"label": "HTTPS & Certificats",
|
||||
"submenu": {
|
||||
"cert": {
|
||||
"dialogTitle": "Sélectionner le fichier de certificat HTTPS",
|
||||
"label": "Fichier de certificat (.crt/.pem)"
|
||||
},
|
||||
"enable-https": {
|
||||
"label": "Activer HTTPS"
|
||||
},
|
||||
"key": {
|
||||
"dialogTitle": "Sélectionner le fichier de clé privée HTTPS",
|
||||
"label": "Fichier de clé privée (.key/.pem)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
@ -331,7 +348,7 @@
|
||||
"title": "Nom d'hôte"
|
||||
},
|
||||
"port": {
|
||||
"label": "Entrez le port du serveur de l'API :",
|
||||
"label": "Entrez le port du serveur API :",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
@ -369,11 +386,11 @@
|
||||
"name": "Barre de navigation floue"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Contourner la vérification de l'âge de YouTube",
|
||||
"description": "Contourner la vérification de l'âge de Music Player",
|
||||
"name": "Contourner les restrictions d’âge"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Sélecteur de sous-titres pour les pistes audio YouTube Music",
|
||||
"description": "Sélecteur de sous-titres pour les pistes audio {{applicationName}}",
|
||||
"menu": {
|
||||
"autoload": "Sélectionner automatiquement la dernière légende utilisée",
|
||||
"disable-captions": "Pas de sous-titres par défaut"
|
||||
@ -392,7 +409,7 @@
|
||||
"toast": {
|
||||
"caption-changed": "Sous-titres changés en {{language}}",
|
||||
"caption-disabled": "Sous-titres désactivés",
|
||||
"no-captions": "Aucun sous-titre disponible pour cette chanson"
|
||||
"no-captions": "Aucun sous-titres disponibles pour cette chanson"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -421,6 +438,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "Configurer un périphérique de sortie personnalisé pour les morceaux",
|
||||
"menu": {
|
||||
"device-selector": "Sélectionner un appareil"
|
||||
},
|
||||
"name": "Périphérique de sortie personnalisé",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Choisissez le périphérique de sortie à utiliser",
|
||||
"title": "Sélectionner le périphérique de sortie"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Fait démarrer la chanson en mode \"pause\"",
|
||||
"menu": {
|
||||
@ -443,8 +473,16 @@
|
||||
"disconnected": "Déconnecté",
|
||||
"hide-duration-left": "Masquer la durée restante",
|
||||
"hide-github-button": "Masquer le bouton du lien GitHub",
|
||||
"play-on-youtube-music": "Jouer sur YouTube Music",
|
||||
"set-inactivity-timeout": "Définir le délai d'inactivité"
|
||||
"play-on-application": "Jouer sur {{applicationName}}",
|
||||
"set-inactivity-timeout": "Définir le délai d'inactivité",
|
||||
"set-status-display-type": {
|
||||
"label": "Texte d'état",
|
||||
"submenu": {
|
||||
"application": "Écoute {{applicationName}}",
|
||||
"artist": "Écoute {artiste}",
|
||||
"title": "Écoute {titre de la chanson}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
@ -461,8 +499,8 @@
|
||||
"buttons": {
|
||||
"ok": "Ok"
|
||||
},
|
||||
"message": "Argh ! Désolé, le téléchargement a échoué…",
|
||||
"title": "Erreur de téléchargement !"
|
||||
"message": "Argh ! Désolé, le téléchargement a échoué…",
|
||||
"title": "Erreur de téléchargement !"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
@ -470,30 +508,30 @@
|
||||
},
|
||||
"detail": "({{playlistSize}} chansons)",
|
||||
"message": "Téléchargement de la playlist {{playlistTitle}}",
|
||||
"title": "Téléchargement a commencé"
|
||||
"title": "Téléchargement commencé"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "Conversion : {{percent}} %",
|
||||
"conversion-progress": "Conversion : {{percent}}%",
|
||||
"converting": "Conversion…",
|
||||
"done": "Terminé : {{filePath}}",
|
||||
"download-info": "Téléchargement {{artist}} - {{title}} [{{videoId}}",
|
||||
"download-progress": "Téléchargé : {{percent}}%",
|
||||
"download-progress": "Téléchargé : {{percent}}%",
|
||||
"downloading": "Télécharge…",
|
||||
"downloading-counter": "Télécharge {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Téléchargement de la playlist \"{{playlistTitle}}\" – {{playlistSize}} chansons ({{playlistId}})",
|
||||
"downloading-playlist": "Téléchargement de la playlist \"{{playlistTitle}}\" - {{playlistSize}} chansons ({{playlistId}})",
|
||||
"error-while-downloading": "Erreur lors du téléchargement de \"{{author}} - {{title}}\" : {{error}}",
|
||||
"folder-already-exists": "Le dossier {{playlistFolder}} existe déjà",
|
||||
"getting-playlist-info": "Obtention d'informations sur la liste de lecture…",
|
||||
"getting-playlist-info": "Obtention des données de la playlist…",
|
||||
"loading": "Chargement…",
|
||||
"playlist-has-only-one-song": "La liste de lecture ne contient qu'un seul élément, téléchargement du morceau seul",
|
||||
"playlist-id-not-found": "Aucun ID de liste de lecture trouvé",
|
||||
"playlist-is-empty": "La liste de lecture est vide",
|
||||
"playlist-is-mix-or-private": "Erreur lors de l'obtention des informations sur la liste de lecture : assurez-vous qu'il ne s'agit pas d'une liste privée ou \"Mixée pour vous\"\n\n{{error}}",
|
||||
"preparing-file": "Péparer des fichier…",
|
||||
"playlist-has-only-one-song": "La playlist ne contient qu'un seul élément, téléchargement du morceau seul",
|
||||
"playlist-id-not-found": "Aucun ID de playlist trouvé",
|
||||
"playlist-is-empty": "La playlist est vide",
|
||||
"playlist-is-mix-or-private": "Erreur lors de l'obtention des informations sur la playlist : assurez-vous qu'il ne s'agit pas d'une playlist privée ou \"Mixée pour vous\"\n\n{{error}}",
|
||||
"preparing-file": "Préparation des fichier…",
|
||||
"saving": "Sauvegarde…",
|
||||
"trying-to-get-playlist-id": "Obtention de l'ID de la liste de lecture : {{playlistId}}",
|
||||
"video-id-not-found": "Vidéo non trouvée",
|
||||
"trying-to-get-playlist-id": "Obtention de l'ID de la playlist : {{playlistId}}",
|
||||
"video-id-not-found": "Vidéo introuvable",
|
||||
"writing-id3": "Écriture des balises ID3…"
|
||||
}
|
||||
},
|
||||
@ -503,19 +541,19 @@
|
||||
"download-finish-settings": {
|
||||
"label": "Télécharger une fois terminé",
|
||||
"prompt": {
|
||||
"last-percent": "Après x pour cent",
|
||||
"last-percent": "Après x pourcents",
|
||||
"last-seconds": "Dernières x secondes",
|
||||
"title": "Configurer quand télécharger"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Avancé",
|
||||
"enabled": "Activé",
|
||||
"mode": "Mode de temps",
|
||||
"mode": "Unité de temps",
|
||||
"percent": "Pourcent",
|
||||
"seconds": "Secondes"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Télécharger la liste de lecture",
|
||||
"download-playlist": "Télécharger la playlist",
|
||||
"presets": "Préconfigurations",
|
||||
"skip-existing": "Passer les fichiers existants"
|
||||
},
|
||||
@ -552,7 +590,7 @@
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "Ajoute la prise en charge de Lumia Stream",
|
||||
"name": "Lumia Stream [Bêta]"
|
||||
"name": "Lumia Stream [Beta]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Ajoute la prise en charge des paroles pour la plupart des chansons",
|
||||
@ -583,9 +621,9 @@
|
||||
"host": "Hôte du Music Together",
|
||||
"join": "Rejoindre le Music Together",
|
||||
"permission": {
|
||||
"all": "Autorisez les invités à contrôler la musique et le player",
|
||||
"host-only": "Seulement l'hôte peut contrôler les playlists et le lecteur",
|
||||
"playlist": "Autoriser les invités à contrôler les playlists"
|
||||
"all": "Autorisez les invités à contrôler la playlist et le lecteur",
|
||||
"host-only": "Seulement l'hôte peut contrôler la playlist et le lecteur",
|
||||
"playlist": "Autoriser les invités à contrôler la playlist"
|
||||
},
|
||||
"set-permission": "Changer les permissions de contrôle",
|
||||
"status": {
|
||||
@ -603,7 +641,7 @@
|
||||
"id-copied": "Identifiant de l'hôte copié dans le presse papier",
|
||||
"id-copy-failed": "Echec de la copie de l'identifiant de l'hôte dans le presse papier",
|
||||
"join-failed": "Echec en rejoignant le Music Together",
|
||||
"joined": "Rejoint le Music Together",
|
||||
"joined": "Music Together rejoint",
|
||||
"permission-changed": "Permission du Music Together changé à \"{{permission}}\"",
|
||||
"remove-song-failed": "Echec du retrait de la piste",
|
||||
"user-connected": "{{name}} à rejoint le Music Together",
|
||||
@ -615,7 +653,7 @@
|
||||
"name": "Navigation",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Revenir à la page précédente"
|
||||
"title": "Aller à la page précédente"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Aller à la page suivante"
|
||||
@ -635,7 +673,7 @@
|
||||
"submenu": {
|
||||
"hide-button-text": "Masquer le texte du bouton",
|
||||
"refresh-on-play-pause": "Actualiser lors de la lecture/pause",
|
||||
"tray-controls": "Ouvrir/Fermer sur le plateau, cliquez"
|
||||
"tray-controls": "Ouvrir/Fermer au clic sur l’icône de la barre des tâches"
|
||||
}
|
||||
},
|
||||
"priority": "Priorité des notifications",
|
||||
@ -649,30 +687,30 @@
|
||||
"name": "Amélioration des performances [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Permet de basculer l’application en mode image dans image",
|
||||
"description": "Permet de basculer l’application en mode picture-in-picture",
|
||||
"menu": {
|
||||
"always-on-top": "Toujours en haut",
|
||||
"always-on-top": "Toujours au dessus",
|
||||
"hotkey": {
|
||||
"label": "Raccourci clavier",
|
||||
"prompt": {
|
||||
"keybind-options": {
|
||||
"hotkey": "Raccourci clavier"
|
||||
},
|
||||
"label": "Choisissez un raccourci clavier pour activer le mode Image dans l'image",
|
||||
"title": "Touche de raccourci Image dans l'image"
|
||||
"label": "Choisissez un raccourci clavier pour activer le mode picture-in-picture",
|
||||
"title": "Touche de raccourci picture-in-picture"
|
||||
}
|
||||
},
|
||||
"save-window-position": "Enregistrer la position de la fenêtre",
|
||||
"save-window-size": "Enregistrer la taille de la fenêtre",
|
||||
"use-native-pip": "Utiliser le mode image dans image natif du navigateur"
|
||||
"use-native-pip": "Utiliser le mode PiP natif du navigateur"
|
||||
},
|
||||
"name": "Image dans l'image",
|
||||
"name": "Picture-in-picture",
|
||||
"templates": {
|
||||
"button": "Image dans l'image"
|
||||
"button": "Picture-in-picture"
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"description": "Écoutez vite, écoutez lentement ! Ajoute un curseur qui contrôle la vitesse de la chanson",
|
||||
"description": "Écoutez vite, écoutez lentement ! Ajoute un curseur qui contrôle la vitesse de la chanson",
|
||||
"name": "Vitesse de lecture",
|
||||
"templates": {
|
||||
"button": "Vitesse"
|
||||
@ -705,14 +743,14 @@
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"quality-changer": {
|
||||
"detail": "Qualité actuelle : {{quality}}",
|
||||
"detail": "Qualité actuelle : {{quality}}",
|
||||
"message": "Choisissez la qualité vidéo :",
|
||||
"title": "Choisissez la qualité vidéo"
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Permet de changer la qualité vidéo avec un bouton sur la vidéo",
|
||||
"name": "Changeur de qualité vidéo",
|
||||
"description": "Permet de changer la qualité vidéo avec un bouton sur l'overlay vidéo",
|
||||
"name": "Sélecteur de qualité vidéo",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "Ouvrir le sélecteur de qualité du lecteur"
|
||||
@ -724,7 +762,7 @@
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "Erreur lors de l'authetification avec Last.fm\nCachez la popup jusqu'au prochain redémarrage.",
|
||||
"message": "Erreur lors de l'authetification avec Last.fm\nCacher la popup jusqu'au prochain redémarrage.",
|
||||
"title": "Authentification échouée"
|
||||
}
|
||||
}
|
||||
@ -736,18 +774,19 @@
|
||||
"listenbrainz": {
|
||||
"token": "Entrer le token utilisateur de ListenBrainz"
|
||||
},
|
||||
"scrobble-alternative-artist": "Utilisez d'autres artistes",
|
||||
"scrobble-alternative-title": "Utiliser des titres alternatifs",
|
||||
"scrobble-other-media": "Scrobbler d'autres médias"
|
||||
},
|
||||
"name": "Scrobble",
|
||||
"name": "Scrobbler",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "Clé API de Last.fm",
|
||||
"api-secret": "API secret de Last.fm"
|
||||
"api-secret": "Secret de l'API de Last.fm"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "Entrez votre token utilisateur ListenBrainz :",
|
||||
"label": "Entrez votre token utilisateur ListenBrainz :",
|
||||
"title": "Token ListenBrainz"
|
||||
}
|
||||
}
|
||||
@ -773,8 +812,8 @@
|
||||
}
|
||||
},
|
||||
"skip-disliked-songs": {
|
||||
"description": "Passer les musiques que je n'aime pas",
|
||||
"name": "Passer Chansons Déplaisantes"
|
||||
"description": "Passe les titres \"Je n'aime pas\"",
|
||||
"name": "Passer les titres \"Je n'aime pas\""
|
||||
},
|
||||
"skip-silences": {
|
||||
"description": "Ignorer automatiquement les sections de silence dans les chansons",
|
||||
@ -788,12 +827,12 @@
|
||||
"description": "Ajoute des paroles synchronisées aux chansons, grâce à LRClib par exemple.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tUne erreur s'est produite en allant chercher les paroles.\n\tMerci de réessayer plus tard.",
|
||||
"not-found": "⚠️ Aucune paroles trouvées pour cette musique."
|
||||
"not-found": "⚠️ Aucune paroles trouvées pour ce titre."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Caractère par défaut entre les paroles",
|
||||
"tooltip": "Choisi le caractère par défaut à utiliser pour l'espace entre les paroles"
|
||||
"tooltip": "Choisi le caractère par défaut à utiliser pour les blancs entre les paroles"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Effet de ligne",
|
||||
@ -804,7 +843,7 @@
|
||||
},
|
||||
"focus": {
|
||||
"label": "Focus",
|
||||
"tooltip": "Rend seulement la ligne actuelle blanche"
|
||||
"tooltip": "Rend blanche seulement la ligne actuelle"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Décalage",
|
||||
@ -821,6 +860,14 @@
|
||||
"label": "Rend les paroles parfaitement synchronisées",
|
||||
"tooltip": "Calcul à la milliseconde près l'affichage de la ligne suivante (peut avoir un faible impact sur les performances)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "Fournisseur privilégié",
|
||||
"none": {
|
||||
"label": "Aucun",
|
||||
"tooltip": "Aucun fournisseur privilégié"
|
||||
},
|
||||
"tooltip": "Choisissez le fournisseur à utiliser par défaut"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Romaniser les paroles",
|
||||
"tooltip": "Si les paroles sont dans une autre langue, essayez de les afficher dans une version latine."
|
||||
@ -831,7 +878,7 @@
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Afficher les timecodes",
|
||||
"tooltip": "Affiche à côté de chaque paroles son timecode"
|
||||
"tooltip": "Affiche le timecode à côté de chaque paroles"
|
||||
}
|
||||
},
|
||||
"name": "Paroles Synchronisées",
|
||||
@ -842,7 +889,7 @@
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Les paroles peuvent ne pas être synchronisées à cause d'une différence de durée.",
|
||||
"inexact": "⚠️ - Les paroles de cette chanson peuvent ne pas être exactes",
|
||||
"instrumental": "⚠️ - Cette musique n'a pas de paroles"
|
||||
"instrumental": "⚠️ - C'est un titre instrumental"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
@ -853,12 +900,33 @@
|
||||
"description": "Ajoute un widget TouchBar pour les utilisateurs de macOS",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "Rend la fenêtre de l'application transparente",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "Opacité",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "Type",
|
||||
"submenu": {
|
||||
"acrylic": "Acrylique",
|
||||
"mica": "Mica",
|
||||
"none": "Aucun",
|
||||
"tabbed": "À onglets"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Lecteur transparent"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Intégration avec le plugin OBS Tuna",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
"description": "Empêche le lecteur de s'afficher quand un chanson est en lecture",
|
||||
"description": "Empêche le lecteur de s'afficher quand un titre est en cours de lecture",
|
||||
"name": "Lecteur Non-Intrusif"
|
||||
},
|
||||
"video-toggle": {
|
||||
@ -882,7 +950,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Basculer la vidéo",
|
||||
"name": "Bouton de bascule vidéo",
|
||||
"templates": {
|
||||
"button-song": "Musique",
|
||||
"button-video": "Vidéo"
|
||||
|
||||
@ -53,8 +53,158 @@
|
||||
"later": "Despois",
|
||||
"restart-now": "Reiniciar Agora"
|
||||
},
|
||||
"detail": "O plugin \"{{pluginName}}\" precisa dun reinicio para tomar efecto"
|
||||
"detail": "O plugin \"{{pluginName}}\" precisa dun reinicio para tomar efecto",
|
||||
"message": "\"{{pluginName}}\" precisa reiniciar",
|
||||
"title": "Requírese reinicio"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Saír",
|
||||
"relaunch": "Lanzar de novo",
|
||||
"wait": "Agardar"
|
||||
},
|
||||
"detail": "Desculpa o inconveniente! Por favor escolle que facer:",
|
||||
"message": "A aplicación non responde",
|
||||
"title": "A xanela non responde"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "Desactivar actualizacións",
|
||||
"download": "Descarregar",
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "Está dispoñíbel unha nova versión que se pode descarregar de {{downloadLink}}",
|
||||
"message": "Hai una nova versión dispoñíbel",
|
||||
"title": "Actualización dispoñíbel"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "Sobre",
|
||||
"navigation": {
|
||||
"label": "Navegación",
|
||||
"submenu": {
|
||||
"copy-current-url": "Copiar o URL actual",
|
||||
"go-back": "Atrás",
|
||||
"go-forward": "Adiante",
|
||||
"quit": "Saír",
|
||||
"restart": "Reiniciar a aplicación"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "Opcións",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "Opcións avanzadas",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Reiniciar a caché cando a aplicación arrinque",
|
||||
"disable-hardware-acceleration": "Desactivar a aceleración hardware",
|
||||
"edit-config-json": "Editar config.json",
|
||||
"override-user-agent": "Substituír o User-Agent",
|
||||
"restart-on-config-changes": "Reiniciar ao alterar a configuración",
|
||||
"set-proxy": {
|
||||
"label": "Configurar o proxy",
|
||||
"prompt": {
|
||||
"label": "Introducir o enderezo do proxy (deixar baleiro para desactivalo)",
|
||||
"placeholder": "Exemplo: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Configurar o proxy"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "Activar ou desactivar as DevTools"
|
||||
}
|
||||
},
|
||||
"always-on-top": "Sempre en primeiro plano",
|
||||
"auto-update": "Actualización automática",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "O menú ocultarase no próximo inicio; use [Alt] para mostralo (ou a tecla [`] se emprega o menú integrado)",
|
||||
"title": "Ocultar Menú activado"
|
||||
},
|
||||
"label": "Ocultar Menú"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "A lingua hase mudar despois do reinicio",
|
||||
"title": "Mudouse a lingua"
|
||||
},
|
||||
"label": "Lingua",
|
||||
"submenu": {
|
||||
"to-help-translate": "Quere axudar a traducir? Prema aquí"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Retomar a última canción ao iniciar a aplicación",
|
||||
"single-instance-lock": "Bloqueo de instancia única",
|
||||
"start-at-login": "Iniciar co inicio de sesión",
|
||||
"starting-page": {
|
||||
"label": "Páxina de inicio",
|
||||
"unset": "Sen definir"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Bandexa",
|
||||
"submenu": {
|
||||
"disabled": "Desactivado",
|
||||
"enabled-and-hide-app": "Activado e ocultar a aplicación",
|
||||
"enabled-and-show-app": "Activado e mostrar a aplicación",
|
||||
"play-pause-on-click": "Reproducir/Pausar ao premer"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Axustes visuais",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "Título de xanela personalizado",
|
||||
"prompt": {
|
||||
"label": "Introduza o título personalizado da xanela (deixe baleiro para desactivala)",
|
||||
"placeholder": "Exemplo: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "Predeterminado",
|
||||
"force-show": "Forzar a visualización",
|
||||
"hide": "Agochar",
|
||||
"label": "Botóns de Gústame"
|
||||
},
|
||||
"remove-upgrade-button": "Retirar o botón de anovación",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Cancelar",
|
||||
"remove": "Retirar"
|
||||
},
|
||||
"remove-theme": "Estás certo que queres retirar o tema personalizado?",
|
||||
"remove-theme-message": "Isto ha retirar o tema personalizado"
|
||||
},
|
||||
"label": "Tema",
|
||||
"submenu": {
|
||||
"import-css-file": "Importar arquivo CSS personalizado",
|
||||
"no-theme": "Sen tema"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "Activado",
|
||||
"label": "Complementos",
|
||||
"new": "NOVO"
|
||||
},
|
||||
"view": {
|
||||
"label": "Vista",
|
||||
"submenu": {
|
||||
"force-reload": "Forzar recarga",
|
||||
"reload": "Recargar",
|
||||
"reset-zoom": "Tamaño real",
|
||||
"toggle-fullscreen": "Alternar Pantalla Completa",
|
||||
"zoom-in": "Achegarse",
|
||||
"zoom-out": "Afastarse"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "Seguinte",
|
||||
"play-pause": "Reproducir/Pausar",
|
||||
"previous": "Anterior",
|
||||
"quit": "Saír"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -150,6 +150,11 @@
|
||||
"visual-tweaks": {
|
||||
"label": "תיקונים חזותיים",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"prompt": {
|
||||
"placeholder": "לדוגמה: שולחן כתיבה אגסי"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "ברירת מחדל",
|
||||
"force-show": "הפעל בכוח",
|
||||
@ -201,8 +206,8 @@
|
||||
"restart": "הפעל מחדש",
|
||||
"show": "הראה חלון",
|
||||
"tooltip": {
|
||||
"default": "יוטיוב מיוזיק",
|
||||
"with-song-info": "יוטיוב מיוזיק: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -212,7 +217,7 @@
|
||||
"name": "הגבר מהירות פרסומת"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "חסום את כל המודעות והמעקב מחוץ לקופסה",
|
||||
"description": "חסום את כל המודעות והמעקבים",
|
||||
"menu": {
|
||||
"blocker": "חוסם"
|
||||
},
|
||||
@ -244,6 +249,7 @@
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "חוצץ",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
@ -279,7 +285,7 @@
|
||||
"name": "מצב אווירה"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "מוסיף תמיכה ב-YouTube Music עבור הווידג'ט של Amuse המתנגן כעת על ידי 6K Labs",
|
||||
"description": "מוסיף תמיכה ב-{{applicationName}} עבור הווידג'ט של Amuse המתנגן כעת על ידי 6K Labs",
|
||||
"name": "משעשע",
|
||||
"response": {
|
||||
"query": "שרת ה-API של Amuse פועל. קבל מידע על השיר באמצעות GET /query."
|
||||
@ -365,7 +371,7 @@
|
||||
"name": "עקוף את ההחמרות של הגיל"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "בורר כתוביות עבור רצועות אודיו של YouTube Music",
|
||||
"description": "בורר כתוביות עבור רצועות אודיו של {{applicationName}}",
|
||||
"menu": {
|
||||
"autoload": "בחר אוטומטי את הכתובית האחרונה שנבחרה",
|
||||
"disable-captions": "ברירת מחד ללא כתוביות"
|
||||
@ -380,6 +386,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "פתח בחירת כתוביות"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "תרגום שונה ל {{שפה}}",
|
||||
"caption-disabled": "תרגום בוטל",
|
||||
"no-captions": "אין תרגום זמין לשיר הזה"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -391,9 +402,11 @@
|
||||
"menu": {
|
||||
"advanced": "מתקדם"
|
||||
},
|
||||
"name": "התפיידות צלב[בית]",
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "תתפייד בזמן[מילישניות]",
|
||||
"fade-scaling": {
|
||||
"linear": "לינארי",
|
||||
"logarithmic": "לוגריתמי"
|
||||
@ -419,7 +432,7 @@
|
||||
"connected": "מחובר",
|
||||
"disconnected": "מנותק",
|
||||
"hide-github-button": "הסתר את לחצן הקישור של GitHub",
|
||||
"play-on-youtube-music": "הפעל ביוטיוב מיוזיק",
|
||||
"play-on-application": "הפעל ביוטיוב מיוזיק",
|
||||
"set-inactivity-timeout": "הגדר פסק זמן לחוסר פעילות"
|
||||
}
|
||||
},
|
||||
|
||||
@ -154,7 +154,7 @@
|
||||
"label": "कस्टम विंडो टाइटल",
|
||||
"prompt": {
|
||||
"label": "कस्टम विंडो टाइटल डालें: (डिसएबल करने के लिए खाली छोड़ें)",
|
||||
"placeholder": "उदाहरण: यूट्यूब संगीत"
|
||||
"placeholder": "उदाहरण: पियर डेस्कटॉप"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
@ -208,8 +208,8 @@
|
||||
"restart": "ऐप पुनः प्रारंभ करें",
|
||||
"show": "ऐप दिखाए",
|
||||
"tooltip": {
|
||||
"default": "यूट्यूब म्यूजिक",
|
||||
"with-song-info": "यूट्यूब म्यूजिक: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -287,7 +287,7 @@
|
||||
"name": "अम्बिएन्ट मोड्"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "6K लैब्स द्वारा Amuse now playing विजेट के लिए YouTube म्यूजिक समर्थन जोड़ा गया",
|
||||
"description": "6K लैब्स द्वारा Amuse now playing विजेट के लिए Music Player म्यूजिक समर्थन जोड़ा गया",
|
||||
"name": "मन बहलाना",
|
||||
"response": {
|
||||
"query": "अमयूस ए.पि.ऐ. चल रहा है। गाने की जान्कारि होने के लिये GET /query कीजिये।"
|
||||
@ -369,11 +369,11 @@
|
||||
"name": "नेविगेशन बार को ब्लर करें"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "YouTube आयु की जांच को बायपास करें",
|
||||
"description": "Music Player आयु की जांच को बायपास करें",
|
||||
"name": "आयु प्रतिबंध को बायपास करें"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "YouTube म्यूज़िक ऑडियो ट्रैक के लिए कैप्शन चयनकर्ता",
|
||||
"description": "{{applicationName}} म्यूज़िक ऑडियो ट्रैक के लिए कैप्शन चयनकर्ता",
|
||||
"menu": {
|
||||
"autoload": "अंतिम बार उपयोग किए गए कैप्शन का ऑटोमैटिक रूप से चयन करें",
|
||||
"disable-captions": "डिफ़ॉल्ट रूप में कोई कैप्शन नहीं"
|
||||
@ -421,6 +421,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "गानों के लिए एक कस्टम आउटपुट मीडिया डिवाइस कॉन्फ़िगर करें",
|
||||
"menu": {
|
||||
"device-selector": "डिवाइस चुनें"
|
||||
},
|
||||
"name": "अपनी पसंद का आउटपुट डिवाइस",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "उपयोग किए जाने वाला आउटपुट मीडिया चुने",
|
||||
"title": "आउटपुट डिवाइस चुनें"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "गीत को \"रुके हुए \" मोड में शुरू करता है",
|
||||
"menu": {
|
||||
@ -443,8 +456,16 @@
|
||||
"disconnected": "डिस्कनेक्ट किया गया",
|
||||
"hide-duration-left": "शेष अवधि छिपाएँ",
|
||||
"hide-github-button": "GitHub लिंक के बटन को छिपाएँ",
|
||||
"play-on-youtube-music": "YouTube म्यूज़िक पर चलाएँ",
|
||||
"set-inactivity-timeout": "निष्क्रियता समय समाप्ति सेट करें"
|
||||
"play-on-application": "{{applicationName}} म्यूज़िक पर चलाएँ",
|
||||
"set-inactivity-timeout": "निष्क्रियता समय समाप्ति सेट करें",
|
||||
"set-status-display-type": {
|
||||
"label": "स्टेटस टेक्स्ट",
|
||||
"submenu": {
|
||||
"application": "{{applicationName}} सुन रहे है",
|
||||
"artist": "{artist} को सुन रहे है",
|
||||
"title": "{song title} सुन रहे है"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "डिस्कॉर्ड रिच प्रेजेंस",
|
||||
"prompt": {
|
||||
@ -736,6 +757,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "listenbrainz उपयोगकर्ता टोकन दर्ज करें"
|
||||
},
|
||||
"scrobble-alternative-artist": "वैकल्पिक आर्टिस्ट का उपयोग करें",
|
||||
"scrobble-alternative-title": "वैकल्पिक शीर्षक का उपयोग करें",
|
||||
"scrobble-other-media": "अन्य मीडिया स्क्रोबल करें"
|
||||
},
|
||||
@ -781,9 +803,12 @@
|
||||
"name": "साइलेंस स्किप करें"
|
||||
},
|
||||
"sponsorblock": {
|
||||
"description": "Intro/Outro जैसे गैर-संगीत भागों को स्किप करता है",
|
||||
"description": "गाने के वीडियो में जहाँ म्यूजिक नहीं चलता, जैसे शुरुआत या अंत के हिस्से, उन्हें अपने आप स्किप कर देता है",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "LRClib जैसे सोर्सेज के उपयोग से, गानों के लिए सिंक किए गए लिरिक्स देता है।"
|
||||
},
|
||||
"video-toggle": {
|
||||
"menu": {
|
||||
"align": {
|
||||
|
||||
@ -55,7 +55,7 @@
|
||||
},
|
||||
"detail": "\"{{pluginName}}\" plugin zahtjeva ponovno pokretanje da bi postao aktivan",
|
||||
"message": "\"{{pluginName}}\" se treba ponovo pokreniti",
|
||||
"title": "Ponovno Pokrećanje je Potrebno"
|
||||
"title": "Potrebno Ponovno Pokretanje"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
@ -128,7 +128,7 @@
|
||||
},
|
||||
"label": "Jezik",
|
||||
"submenu": {
|
||||
"to-help-translate": "Želite pomoć za prijevodom? Kliknite ovdje"
|
||||
"to-help-translate": "Želite pomoći sa prijevodom? Kliknite ovdje"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Nastavi zadnju pjesmu kad se aplikacija pokrene",
|
||||
@ -150,6 +150,13 @@
|
||||
"visual-tweaks": {
|
||||
"label": "Vizualna podešavanja",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "Prilagođeni naslov prozora",
|
||||
"prompt": {
|
||||
"label": "Unesi prilagođeni naslov prozora: (ostavi prazno za onemogućiti)",
|
||||
"placeholder": "Primjer: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "Zadano",
|
||||
"force-show": "Prisilno prikaži",
|
||||
@ -201,8 +208,8 @@
|
||||
"restart": "Ponovo Pokreni Aplikaciju",
|
||||
"show": "Prikaži prozor",
|
||||
"tooltip": {
|
||||
"default": "YouTube Glazba",
|
||||
"with-song-info": "YouTube Glazba: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -230,7 +237,8 @@
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"enable-seekbar": "Omogući postavljanje teme \"seekbar\"-a"
|
||||
},
|
||||
"name": "Boja teme albuma"
|
||||
},
|
||||
@ -280,8 +288,8 @@
|
||||
"name": "Ambijentalni Način"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Dodaje podršku za YouTube Glazbu za widget \"sada reproducira\" od Amuse od strane 6K Labs",
|
||||
"name": "Amuse",
|
||||
"description": "Dodaje podršku za {{applicationName}} za widget \"sada reproducira\" od Amuse od strane 6K Labs",
|
||||
"name": "Zabavljati",
|
||||
"response": {
|
||||
"query": "Amuse API poslužitelj je pokrenut. Koristi GET /query za dohvat informacija o pjesmi."
|
||||
}
|
||||
@ -313,6 +321,22 @@
|
||||
"hostname": {
|
||||
"label": "Naziv hosta"
|
||||
},
|
||||
"https": {
|
||||
"label": "HTTPS i Sertifikati",
|
||||
"submenu": {
|
||||
"cert": {
|
||||
"dialogTitle": "Biraj HTTPS sertifikat datoteku",
|
||||
"label": "Sertifikat datoteka (.crt/.pem)"
|
||||
},
|
||||
"enable-https": {
|
||||
"label": "Omogući HTTPS"
|
||||
},
|
||||
"key": {
|
||||
"dialogTitle": "Biraj privatni ključ datoteku za HTTPS",
|
||||
"label": "Privatni ključ datoteka (.key/.pem)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
@ -362,11 +386,11 @@
|
||||
"name": "Zamagli Navigacijsku Traku"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Zaobiđi YouTubeovu provjeru dobi",
|
||||
"description": "Zaobiđi Music Player provjeru dobi",
|
||||
"name": "Zaobiđi dobna ograničenja"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Izbornik titlova za audiozapise od YouTube Musica",
|
||||
"description": "Izbornik titlova za audiozapise od {{applicationName}}a",
|
||||
"menu": {
|
||||
"autoload": "Automatski izaberi posljednje korištene titlove",
|
||||
"disable-captions": "Bez titlova"
|
||||
@ -383,7 +407,7 @@
|
||||
"title": "Otvori izbornik za titlove"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Titlovi su promenjeni u {{language}}",
|
||||
"caption-changed": "Titlovi su promijenjeni u {{language}}",
|
||||
"caption-disabled": "Titlovi su isključeni",
|
||||
"no-captions": "Za ovu pjesmu nisu dostupni titlovi"
|
||||
}
|
||||
@ -414,8 +438,21 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "Konfiguriraj prilagođeni izlazni medijski uređaj za pjesme",
|
||||
"menu": {
|
||||
"device-selector": "Odaberi Uređaj"
|
||||
},
|
||||
"name": "Prilagođeni uređaj za izlaz",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Odaberi izlazni medijski uređaj za korištenje",
|
||||
"title": "Odaberi izlazni uređaj"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Postavlja da pjesma počne pauzirana",
|
||||
"description": "Pokreće pjesmu u pauziranom načinu rada",
|
||||
"menu": {
|
||||
"apply-once": "Primjenjuje se samo pri pokretanju aplikacije"
|
||||
},
|
||||
@ -436,10 +473,18 @@
|
||||
"disconnected": "Odspojen",
|
||||
"hide-duration-left": "Sakrij preostalo vrijeme",
|
||||
"hide-github-button": "Sakrij gumb sa GitHub poveznicom",
|
||||
"play-on-youtube-music": "Reproduciraj na YouTube Musicu",
|
||||
"set-inactivity-timeout": "Postavi vremensko ograničenje neaktivnosti (inactivity timeout)"
|
||||
"play-on-application": "Reproduciraj na {{applicationName}}u",
|
||||
"set-inactivity-timeout": "Postavi vremensko ograničenje neaktivnosti (inactivity timeout)",
|
||||
"set-status-display-type": {
|
||||
"label": "Tekst statusa",
|
||||
"submenu": {
|
||||
"application": "Slušate {{applicationName}}",
|
||||
"artist": "Slušate {glazbenika}",
|
||||
"title": "Slušate {naslov pjesme}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"name": "Bogata prisutnost Discorda",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Postavi vremensko ograničenje neaktivnosti u sekundama:",
|
||||
@ -479,10 +524,10 @@
|
||||
"folder-already-exists": "Mapa {{playlistFolder}} već postoji",
|
||||
"getting-playlist-info": "Dobavljaju se informacije o playlisti…",
|
||||
"loading": "Učitavanje…",
|
||||
"playlist-has-only-one-song": "Playlista ima samo jedan stavku, preuzeti će se direktno",
|
||||
"playlist-has-only-one-song": "Playlista ima samo jednu stavku, preuzeti će se direktno",
|
||||
"playlist-id-not-found": "Nije pronađen ID playliste",
|
||||
"playlist-is-empty": "Playlista je prazna",
|
||||
"playlist-is-mix-or-private": "Pogreška pri dobivanju informacija o playlisti: provjerite da nije ili privatna ili \"Za vas\" playlista\n\n{{error}}",
|
||||
"playlist-is-mix-or-private": "Pogreška pri dobavljanju informacija o playlisti: provjerite da nije privatna ili \"Za vas\" playlista\n\n{{error}}",
|
||||
"preparing-file": "Priprema se datoteka…",
|
||||
"saving": "Spremanje…",
|
||||
"trying-to-get-playlist-id": "Pokušavam dobaviti playlist ID: {{playlistId}}",
|
||||
@ -533,7 +578,7 @@
|
||||
"name": "Ekvalizator"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Čini klizač glasnoće (volume slider) eksponencijalnim za lakše odabranje niže glasnoće.",
|
||||
"description": "Čini klizač glasnoće (volume slider) eksponencijalnim za lakši odabir niže glasnoće.",
|
||||
"name": "Eksponencijalna Glasnoća"
|
||||
},
|
||||
"in-app-menu": {
|
||||
@ -552,7 +597,7 @@
|
||||
"menu": {
|
||||
"romanized-lyrics": "Romanizirani tekstovi pjesme"
|
||||
},
|
||||
"name": "Genius teksovi pjesme",
|
||||
"name": "Genius tekstovi",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "Dobavljen tekst pjesme s Genius-a"
|
||||
}
|
||||
@ -729,6 +774,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "Unesi korisnički žeton za ListenBrainz"
|
||||
},
|
||||
"scrobble-alternative-artist": "Izaberite druge glazbenike",
|
||||
"scrobble-alternative-title": "Koristi alternativne naslove",
|
||||
"scrobble-other-media": "Učetkaj druge medije"
|
||||
},
|
||||
@ -781,7 +827,7 @@
|
||||
"description": "Obezbjeđava sinkronizirane lirike pjesama, korištenjem dobavljača poput LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tDošlo je do greške prilikom dobavljanja stihova pjesme.\n\tMolimo vas da probate ponovno kasnije.",
|
||||
"not-found": "⚠️ Tekst za ovu pjesmu nije pronađen."
|
||||
"not-found": "⚠️ Tekst ove pjesme nije pronađen."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
@ -789,7 +835,7 @@
|
||||
"tooltip": "Odaberi zadane karaktere koji će biti korišteni za razmake između stihova pjesama"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Efekat crte",
|
||||
"label": "Efekt crte",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Kitnjast",
|
||||
@ -808,15 +854,23 @@
|
||||
"tooltip": "Promjeni razmjeru trenutne crte"
|
||||
}
|
||||
},
|
||||
"tooltip": "Odaberi efekat koji će biti primjenjen na trenutnoj crti"
|
||||
"tooltip": "Odaberi efekt koji će biti primijenjen na trenutnoj crti"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Napravi da tekst pjesme bude izvrsno usklađen",
|
||||
"tooltip": "Izračunaj do milisekunde prikaz sljedeće crteteksta (može malo utjecati na učinak)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "Željeni davatelj usluga",
|
||||
"none": {
|
||||
"label": "Nema / prazno",
|
||||
"tooltip": "Nema željenog pružatelja usluga"
|
||||
},
|
||||
"tooltip": "Odaberite zadanog pružatelja usluga kojeg ćete koristiti"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Romanizuj stihove pjesama",
|
||||
"tooltip": "Ako je tekst pjesme na drugom jeziku, probajte da ga prikažete na latinici."
|
||||
"tooltip": "Ako je tekst pjesme na drugom jeziku, probajte ga prikazati na latinici."
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Prikaži tekst pjesme čak i ako je netačan",
|
||||
@ -827,14 +881,14 @@
|
||||
"tooltip": "Prikaži vremenske oznake pored teksta pjesme"
|
||||
}
|
||||
},
|
||||
"name": "Sinkronizovani stihovi pjesama",
|
||||
"name": "Sinkronizirani stihovi pjesama",
|
||||
"refetch-btn": {
|
||||
"fetching": "Dobavljanje...",
|
||||
"normal": "Ponovo dobavite tekst pjesme"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Tekst pjesme možda nije usklađen zbog neuklapanja u daljini trajanja.",
|
||||
"inexact": "⚠️ - Tekst za ovu pjesmu možda nije tačan",
|
||||
"inexact": "⚠️ - Tekst ove pjesme možda nije točan",
|
||||
"instrumental": "⚠️ - Ovo je instrumentalna glazba"
|
||||
}
|
||||
},
|
||||
@ -846,6 +900,27 @@
|
||||
"description": "Dodaje dodatak dodirne trake za macOS korisnike",
|
||||
"name": "Dodirna Traka"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "Učinit će prozor aplikacije prozirnim",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "Neprozirnost",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "Vrsta",
|
||||
"submenu": {
|
||||
"acrylic": "Akrilni",
|
||||
"mica": "Tinjac",
|
||||
"none": "Nema / prazno",
|
||||
"tabbed": "U karticama"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Prozirni Svirač"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integracija sa OBS-ovim Tuna dodatkom",
|
||||
"name": "Tuna OBS"
|
||||
|
||||
@ -150,6 +150,13 @@
|
||||
"visual-tweaks": {
|
||||
"label": "Megjelenési beállítások",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "Saját ablak cím",
|
||||
"prompt": {
|
||||
"label": "Kérem az egyéni ablak címét: (hagyd üresen a kikapcsoláshoz)",
|
||||
"placeholder": "Példa: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "Alapértelmezett",
|
||||
"force-show": "Megjelenítés kényszerítése",
|
||||
@ -201,8 +208,8 @@
|
||||
"restart": "YT Music újraindítása",
|
||||
"show": "Ablak megjelenítése",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -280,7 +287,7 @@
|
||||
"name": "Ambient mód"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Hozzáadja a YouTube Music támogatását az Amuse \"now playing\" widgethez a 6K Labs által",
|
||||
"description": "Hozzáadja a {{applicationName}} támogatását az Amuse \"now playing\" widgethez a 6K Labs által",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Az Amuse API szerver fut. Használja a GET /query kérést a dalinformációk lekéréséhez."
|
||||
@ -333,16 +340,38 @@
|
||||
"description": "Hang tömörítés alkalmazása (csökkenti a jel legzajosabb részeinek hangerősségét, és emeli a legcsendesebb részek hangerősségét)",
|
||||
"name": "Hangtömörítő"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"menu": {
|
||||
"disable": "Proxy adapder kikapcsolása",
|
||||
"enable": "Proxy adapter bekapcsolása",
|
||||
"hostname": {
|
||||
"label": "Gazdanév"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Adjon meg egy hosztnevet a lokális proxy szerverhez (újraindítást igényel):",
|
||||
"title": "Proxy hosztnév"
|
||||
},
|
||||
"port": {
|
||||
"label": "Adjon meg egy portot a lokális proxy szerverhez (újraindátást igényel):",
|
||||
"title": "Proxy Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Átlátszóvá és elmosódottá teszi a navigációs sávot",
|
||||
"name": "Navigációs sáv elmosása"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "A YouTube korellenőrzését kihagyja, ezáltal nem kel meg erősíteni a zene meghallgatása elött. (Automatikusan megerősítve lesz.)",
|
||||
"description": "A Music Player korellenőrzését kihagyja, ezáltal nem kel meg erősíteni a zene meghallgatása elött. (Automatikusan megerősítve lesz.)",
|
||||
"name": "Korellenőrzés kihagyása"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Felirat választó a YouTube Music zenékhez",
|
||||
"description": "Felirat választó a {{applicationName}} zenékhez",
|
||||
"menu": {
|
||||
"autoload": "Automatikusan kiválasztja az utoljára használt feliratot",
|
||||
"disable-captions": "Alapértelmezetten nincsenek feliratok"
|
||||
@ -357,6 +386,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "Feliratválasztó megnyitása"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Felirat {{language}} nyelvűre állítva",
|
||||
"caption-disabled": "Feliratok kikapcsolva",
|
||||
"no-captions": "Nincsenek elérhető feliratok ehhez a dalhoz"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -385,6 +419,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"menu": {
|
||||
"device-selector": "Eszköz kiválasztása"
|
||||
},
|
||||
"name": "Saját kimeneti eszköz",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Válaszd ki a kimeneti eszközt",
|
||||
"title": "Kimeneti eszköz választása"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Ez a funkció kikapcsolja az automatikus lejátszást, így a zenék nem indulnak el maguktól. Amikor egy album vagy egy dal lejátszása véget ér, a következő szám nem kezdődik el automatikusan. A bővítmény használata során minden zenét manuálisan kell elindítani",
|
||||
"menu": {
|
||||
@ -407,8 +453,16 @@
|
||||
"disconnected": "Nincs Kapcsolódva",
|
||||
"hide-duration-left": "Hátralévő idő elrejtése",
|
||||
"hide-github-button": "GitHub url gombjának elrejtése",
|
||||
"play-on-youtube-music": "Lejátszás a YouTube Music-on",
|
||||
"set-inactivity-timeout": "Inaktivitási időkorlát beállítása"
|
||||
"play-on-application": "Lejátszás a {{applicationName}}-on",
|
||||
"set-inactivity-timeout": "Inaktivitási időkorlát beállítása",
|
||||
"set-status-display-type": {
|
||||
"label": "Tevékenység szöveg",
|
||||
"submenu": {
|
||||
"artist": "Hallgatja: {artist}",
|
||||
"application": "Hallgatja: {{applicationName}}",
|
||||
"title": "Hallgatja: {song title}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
@ -576,7 +630,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Következő/Vissza navigációs nyilak közvetlenül az interfészbe integrálva, mint a kedvenc böngésződben",
|
||||
"name": "Navigáció"
|
||||
"name": "Navigáció",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Előző oldal"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Következő oldal"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "A Bejelentkezés gomb eltávolítása az interfészről (Jobb fentről eltünik a bejelentkezés gomb.)",
|
||||
@ -600,6 +662,10 @@
|
||||
},
|
||||
"name": "Értesítések"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Teljesítmény fejlesztése kísérleti kódok engedélyezésével",
|
||||
"name": "Teljesítmény fejlesztése [Béta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Lehetővé teszi az alkalmazás kép a képben módra váltását",
|
||||
"menu": {
|
||||
@ -664,7 +730,7 @@
|
||||
}
|
||||
},
|
||||
"description": "Lehetővé teszi a videó minőségének megváltoztatását egy gombbal a videó fedvényen",
|
||||
"name": "Videóminőség modosító"
|
||||
"name": "Videóminőség módosító"
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Scrobbling támogatás hozzáadása (pl. last.fm, ListenBrainz)",
|
||||
|
||||
@ -150,6 +150,13 @@
|
||||
"visual-tweaks": {
|
||||
"label": "Penyesuaian Visual",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "Judul jendela kustom",
|
||||
"prompt": {
|
||||
"label": "Masukkan judul jendela kustom (kosongkan untuk menonaktifkan)",
|
||||
"placeholder": "Contoh: {{applicationName}}"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "Standar",
|
||||
"force-show": "Pertunjukan paksa",
|
||||
@ -201,8 +208,8 @@
|
||||
"restart": "Restart aplikasi",
|
||||
"show": "Tampilkan jendela",
|
||||
"tooltip": {
|
||||
"default": "YouTube Musik",
|
||||
"with-song-info": "YouTube Musik: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -280,7 +287,7 @@
|
||||
"name": "Mode ambient"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Menambahkan dukungan YouTube Music untuk widget Amuse yang sedang diputar oleh 6K Labs",
|
||||
"description": "Menambahkan dukungan {{applicationName}} untuk widget Amuse yang sedang diputar oleh 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Server API Amuse sedang berjalan. GET /query untuk mendapatkan info lagu."
|
||||
@ -362,11 +369,11 @@
|
||||
"name": "Buramkan Bar Navigasi"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Lewati verifikasi umur dari YouTube",
|
||||
"description": "Lewati verifikasi umur dari Music Player",
|
||||
"name": "Lewati batasan umur"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Pemilih caption untuk trek audio YouTube Music",
|
||||
"description": "Pemilih caption untuk trek audio {{applicationName}}",
|
||||
"menu": {
|
||||
"autoload": "Pilih caption terakhir secara otomatis",
|
||||
"disable-captions": "Tidak ada caption secara default"
|
||||
@ -414,6 +421,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"custom-output-device": {
|
||||
"description": "Atur perangkat media keluaran khusus untuk lagu-lagu",
|
||||
"menu": {
|
||||
"device-selector": "Pilih Perangkat"
|
||||
},
|
||||
"name": "Perangkat Keluaran Kustom",
|
||||
"prompt": {
|
||||
"device-selector": {
|
||||
"label": "Pilih perangkat media keluaran yang akan digunakan",
|
||||
"title": "Pilih Perangkat Keluaran"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Buat lagu mulai dalam mode \"jeda\"",
|
||||
"menu": {
|
||||
@ -436,8 +456,16 @@
|
||||
"disconnected": "Terputus",
|
||||
"hide-duration-left": "Sembunyikan sisa durasi",
|
||||
"hide-github-button": "Sembunyikan tombol link GitHub",
|
||||
"play-on-youtube-music": "Mainkan di YouTube Music",
|
||||
"set-inactivity-timeout": "Tetapkan batas waktu tidak aktif"
|
||||
"play-on-application": "Mainkan di {{applicationName}}",
|
||||
"set-inactivity-timeout": "Tetapkan batas waktu tidak aktif",
|
||||
"set-status-display-type": {
|
||||
"label": "Teks status",
|
||||
"submenu": {
|
||||
"artist": "Sedang mendengarkan {artist}",
|
||||
"title": "Sedang mendengarkan {song title}",
|
||||
"application": "Sedang mendengarkan {{applicationName}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Rich Presence Discord",
|
||||
"prompt": {
|
||||
@ -454,16 +482,16 @@
|
||||
"buttons": {
|
||||
"ok": "Oke"
|
||||
},
|
||||
"message": "Argh! Maaf, dowloadnya gagal…",
|
||||
"title": "Downloadnya error!"
|
||||
"message": "Argh! Maaf, dowload gagal…",
|
||||
"title": "Terjadi kesalahan dalam unduhan!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "Oke"
|
||||
},
|
||||
"detail": "({{playlistSize}} lagu-lagu)",
|
||||
"message": "Mengunduh Playlist {{playlistTitle}}",
|
||||
"title": "Download dimulai"
|
||||
"message": "Mengunduh Daftar Putar {{playlistTitle}}",
|
||||
"title": "Pengunduhan dimulai"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
@ -474,8 +502,8 @@
|
||||
"download-progress": "Mengunduh: {{percent}}%",
|
||||
"downloading": "Mengunduh…",
|
||||
"downloading-counter": "Mengunduh {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Mengunduh playlist \"{{playlistTitle}}\" - {{playlistSize}} lagu ({{playlistId}})",
|
||||
"error-while-downloading": "Gagal mengunduh \"{{author}} - {{title}}\": {{error}}",
|
||||
"downloading-playlist": "Mengunduh Daftar Putar \"{{playlistTitle}}\" - {{playlistSize}} lagu-lagu ({{playlistId}})",
|
||||
"error-while-downloading": "Gagal dalam mengunduh \"{{author}} - {{title}}\": {{error}}",
|
||||
"folder-already-exists": "Folder {{playlistFolder}} sudah ada",
|
||||
"getting-playlist-info": "Mendapatkan informasi playlist…",
|
||||
"loading": "Memuat…",
|
||||
@ -530,7 +558,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Equalizer"
|
||||
"name": "Ekualiser"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Buat penggeser volume menjadi eksponen sehingga memudahkan memilih volume yang lebih rendah.",
|
||||
@ -729,6 +757,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "Masukkan token pengguna ListenBrainz"
|
||||
},
|
||||
"scrobble-alternative-artist": "Pindah ke artis lain",
|
||||
"scrobble-alternative-title": "Gunakan judul alternatif",
|
||||
"scrobble-other-media": "Scrobble media lain"
|
||||
},
|
||||
@ -814,6 +843,14 @@
|
||||
"label": "Buat liriknya tersinkronisasi dengan sempurna",
|
||||
"tooltip": "Hitung hingga milidetik tampilan baris berikutnya (dapat berdampak kecil pada kinerja)"
|
||||
},
|
||||
"preferred-provider": {
|
||||
"label": "Penyedia Pilihan",
|
||||
"none": {
|
||||
"label": "Tidak ada",
|
||||
"tooltip": "Tidak ada penyedia pilihan"
|
||||
},
|
||||
"tooltip": "Pilih penyedia bawaan untuk dipakai"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Romanize Liriknya",
|
||||
"tooltip": "Apabila lirik berada dalam bahasa berbeda, cobalah untuk menampilkan versi latinnya."
|
||||
@ -846,6 +883,27 @@
|
||||
"description": "Tambahkan widget TouchBar untuk pengguna macOS",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"transparent-player": {
|
||||
"description": "Buat jendela aplikasi transparan",
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"label": "Opasitas",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"label": "Tipe",
|
||||
"submenu": {
|
||||
"acrylic": "Akrilik",
|
||||
"mica": "Mika",
|
||||
"none": "TIdak ada",
|
||||
"tabbed": "Tabulasi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Pemutar Transparan"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integrasi dengan plugin Tuna OBS",
|
||||
"name": "Tuna OBS"
|
||||
|
||||
@ -201,8 +201,8 @@
|
||||
"restart": "Endurræstu Forritið",
|
||||
"show": "Sýna glugga",
|
||||
"tooltip": {
|
||||
"default": "YouTube Tónlist",
|
||||
"with-song-info": "YouTube Tónlist: {{artist}} - {{title}}"
|
||||
"default": "{{applicationName}}",
|
||||
"with-song-info": "{{applicationName}}: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -331,11 +331,11 @@
|
||||
"name": "Þoka Leiðsagnarstika"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Framhjá aldursstaðfestingu YouTube",
|
||||
"description": "Framhjá aldursstaðfestingu Music Player",
|
||||
"name": "Farið Framhjá Aldurstakmörkunum"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Skjátextavali fyrir YouTube Tónlist hljóðrásir",
|
||||
"description": "Skjátextavali fyrir {{applicationName}} hljóðrásir",
|
||||
"menu": {
|
||||
"autoload": "Veldu sjálfkrafa síðast notaða myndatexta",
|
||||
"disable-captions": "Engir skjátextar sjálfgefið"
|
||||
@ -400,7 +400,7 @@
|
||||
"disconnected": "Aftengt",
|
||||
"hide-duration-left": "Fela tímalengd til vinstri",
|
||||
"hide-github-button": "Fela GitHub tengilhnapp",
|
||||
"play-on-youtube-music": "Spilaðu á YouTube Tónlist",
|
||||
"play-on-application": "Spilaðu á {{applicationName}}",
|
||||
"set-inactivity-timeout": "Stilltu tímamörk fyrir óvirkni"
|
||||
},
|
||||
"name": "Discord Rík Nærvera",
|
||||
|
||||