Compare commits

...

43 Commits

Author SHA1 Message Date
c644d418dd fix(downloader): set player id to 0004e42
see https://github.com/LuanRT/YouTube.js/issues/1044#issuecomment-3332095783

Co-Authored-By: Shikki <56765352+theone2277@users.noreply.github.com>
2025-10-04 18:52:10 +03:00
18692b0283 chore(i18n): Translated using Weblate (Hungarian)
Currently translated at 95.8% (437 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/hu/
2025-10-04 14:02:01 +00:00
f81dd1f910 chore(i18n): Translated using Weblate (Romanian)
Currently translated at 100.0% (456 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ro/
2025-10-03 09:02:01 +02:00
1452c4ae8a chore(i18n): Translated using Weblate (Tamil)
Currently translated at 100.0% (456 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ta/
2025-10-02 04:02:08 +00:00
504c73df73 chore(i18n): Translated using Weblate (Dutch)
Currently translated at 99.3% (453 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nl/
2025-10-02 04:02:06 +00:00
0c16467a8b chore(i18n): Translated using Weblate (Dutch)
Currently translated at 99.3% (453 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nl/
2025-10-02 04:02:05 +00:00
26539544ab chore(i18n): Translated using Weblate (Dutch)
Currently translated at 99.3% (453 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nl/
2025-10-02 04:02:03 +00:00
9f84e2771c chore(i18n): Translated using Weblate (Russian)
Currently translated at 100.0% (456 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2025-10-02 04:02:01 +00:00
a2be98588b chore(i18n): Translated using Weblate (Slovak)
Currently translated at 23.4% (107 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/sk/
2025-09-28 20:02:22 +00:00
b445ef8aeb chore(i18n): Translated using Weblate (Tamil)
Currently translated at 100.0% (456 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ta/
2025-09-28 20:02:21 +00:00
a49ee4fd11 chore(i18n): Translated using Weblate (Malay)
Currently translated at 59.6% (272 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ms/
2025-09-28 20:02:20 +00:00
c8c380841f chore(i18n): Translated using Weblate (Hungarian)
Currently translated at 94.5% (431 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/hu/
2025-09-28 20:02:19 +00:00
6fa89db2f3 chore(i18n): Translated using Weblate (Hungarian)
Currently translated at 94.5% (431 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/hu/
2025-09-28 20:02:18 +00:00
c4ef6efddd chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 100.0% (456 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2025-09-28 20:02:17 +00:00
55a6e815af chore(i18n): Translated using Weblate (Japanese)
Currently translated at 100.0% (456 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2025-09-28 20:02:16 +00:00
8238262afe Clarify application description in README 2025-09-28 22:07:05 +09:00
a81aa4b7c9 Update README with disclaimer and liability section
Added disclaimers regarding affiliation and liability.
2025-09-28 22:06:23 +09:00
56c903d5df add disclaimer 2025-09-28 22:04:28 +09:00
b0931c8924 chore(i18n): Translated using Weblate (Hindi)
Currently translated at 85.0% (388 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/hi/
2025-09-27 18:02:02 +00:00
5142b673c1 chore(i18n): Translated using Weblate (Slovak)
Currently translated at 18.8% (86 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/sk/
2025-09-25 20:02:06 +00:00
36eaeef45f chore(i18n): Translated using Weblate (Malay)
Currently translated at 48.9% (223 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ms/
2025-09-25 20:02:04 +00:00
da2f3e5102 chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 99.7% (455 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2025-09-25 20:02:03 +00:00
7ceb160e96 chore(i18n): Translated using Weblate (Czech)
Currently translated at 99.7% (455 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2025-09-25 20:02:00 +00:00
a563084055 chore(i18n): Added translation using Weblate (Slovak) 2025-09-24 19:56:33 +00:00
ced531133a chore(i18n): Translated using Weblate (Czech)
Currently translated at 99.3% (453 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2025-09-24 19:56:32 +00:00
345c2e59fd remove assets from docs 2025-09-24 22:01:07 +09:00
b3e0fd5588 chore(i18n): Translated using Weblate (Malay)
Currently translated at 39.4% (180 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ms/
2025-09-24 11:02:02 +00:00
7f35738667 chore(i18n): Translated using Weblate (Polish)
Currently translated at 100.0% (456 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2025-09-24 11:02:01 +00:00
1fa827df89 chore(i18n): Translated using Weblate (Catalan)
Currently translated at 100.0% (456 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ca/
2025-09-23 00:02:02 +02:00
78ba710b3f chore(i18n): Translated using Weblate (Hungarian)
Currently translated at 91.0% (415 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/hu/
2025-09-23 00:02:00 +02:00
bcb61a922e chore(i18n): Translated using Weblate (Arabic)
Currently translated at 95.8% (437 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ar/
2025-09-21 10:02:03 +02:00
c046a76972 chore(i18n): Translated using Weblate (Arabic)
Currently translated at 95.8% (437 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ar/
2025-09-21 10:02:02 +02:00
ed25d11b23 chore(i18n): Translated using Weblate (French)
Currently translated at 99.7% (455 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2025-09-20 04:02:00 +02:00
8de5599240 chore(i18n): Translated using Weblate (Danish)
Currently translated at 32.0% (146 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/da/
2025-09-19 00:02:01 +02:00
ce7fcc5d01 chore(i18n): Translated using Weblate (Bulgarian)
Currently translated at 100.0% (456 of 456 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/bg/
2025-09-19 00:02:00 +02:00
30ed2b5c75 remove bypass-age-restrictions 2025-09-18 07:33:54 +09:00
12d4241668 chore(docs): update README 2025-09-18 07:31:26 +09:00
0eb65f082c chore(docs): update README 2025-09-18 07:29:59 +09:00
25fccc9a62 remove assets 2025-09-18 07:25:23 +09:00
414a560205 Delete assets/youtube-music.svg 2025-09-18 07:23:24 +09:00
7c1b8ed0a4 Delete assets/youtube-music.png 2025-09-18 07:23:12 +09:00
8084a175cf REMOVE image 2025-09-17 17:56:36 +09:00
f5175a6be7 REMOVE adblocker AND no-google-login, and renaming 2025-09-17 17:48:12 +09:00
51 changed files with 1047 additions and 864 deletions

149
README.md
View File

@ -1,6 +1,6 @@
<div align="center">
# YouTube Music
# YTMD
[![GitHub release](https://img.shields.io/github/release/th-ch/youtube-music.svg?style=for-the-badge&logo=youtube-music)](https://github.com/th-ch/youtube-music/releases/)
[![GitHub license](https://img.shields.io/github/license/th-ch/youtube-music.svg?style=for-the-badge)](https://github.com/th-ch/youtube-music/blob/master/license)
@ -14,31 +14,27 @@
![Screenshot](web/screenshot.png "Screenshot")
<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
- Native look & feel extension, aims at keeping the original interface
one click
## Demo Image
| Player Screen (album color theme & ambient light) |
|:---------------------------------------------------------------------------------------------------------:|
|![Screenshot1](https://github.com/th-ch/youtube-music/assets/16558115/53efdf73-b8fa-4d7b-a235-b96b91ea77fc)|
> [!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,116 +52,6 @@ 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 screens 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/).
@ -355,8 +241,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
});
```

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 600 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 931 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 KiB

View File

@ -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

View File

@ -5,7 +5,7 @@
<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>
<title>YTMD App (Unofficial)</title>
<link
href="./favicon/favicon.ico"
rel="icon"
@ -39,22 +39,22 @@
<meta content="#131313" name="theme-color"/>
<meta
content="YouTube Music Unofficial Desktop App with built-in ad blocker and downloader"
content="YTMD App"
name="description"
/>
<meta
content="YouTube&nbsp;Music&nbsp;Desktop&nbsp;App"
content="YTMD&nbsp;App"
property="og:site_name"
/>
<meta
class="meta-url"
content="https://th-ch.github.io/youtube-music"
content="https://ytmd-devs.github.io/ytmd"
property="og:url"
/>
<meta content="website" property="og:type"/>
<meta
class="meta-url"
content="https://th-ch.github.io/youtube-music"
content="https://ytmd-devs.github.io/ytmd"
name="twitter:url"
/>
@ -69,11 +69,11 @@
<div class="site-header-inner">
<div class="brand header-brand">
<h1 class="m-0">
<a href="https://github.com/th-ch/youtube-music">
<a href="https://github.com/ytmd-devs/ytmd">
<img
alt="YouTube Music"
alt="YTM"
class="header-logo-image"
src="./img/youtube-music.svg"
src="./img/ytmd.svg"
/>
</a>
</h1>
@ -92,17 +92,16 @@
<div class="hero-inner">
<div class="hero-copy">
<h1 class="hero-title mt-0">
Custom YouTube Music Desktop App
Custom YTMD 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>
Open source, cross-platform, unofficial YTMD
App
</p>
<div class="hero-cta">
<a
class="button button-primary button-wide-mobile"
href="https://github.com/th-ch/youtube-music/releases/latest"
href="https://github.com/ytmd-devs/ytmd/releases/latest"
>Download</a
>
</div>
@ -110,9 +109,9 @@
<div class="mockup-container">
<div class="mockup-bg">
<img
alt="YouTube Music"
alt="YTM"
id="mockup-header-img"
src="./img/youtube-music.png"
src="./img/ytmd.png"
/>
</div>
</div>
@ -255,11 +254,6 @@
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">
@ -428,7 +422,7 @@
<div class="cta-cta">
<a
class="button button-primary button-wide-mobile"
href="https://github.com/th-ch/youtube-music"
href="https://github.com/ytmd-devs/ytmd"
>Go to code</a
>
</div>
@ -441,28 +435,28 @@
<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 href="https://github.com/ytmd-devs/ytmd">
<img alt="YTM logo" src="./img/ytmd.svg"/>
</a>
</div>
<ul class="footer-links list-reset">
<li>
<a href="https://github.com/th-ch/youtube-music">Main page</a>
<a href="https://github.com/ytmd-devs/ytmd">Main page</a>
</li>
<li>
<a href="https://github.com/th-ch/youtube-music/issues"
<a href="https://github.com/ytmd-devs/ytmd/issues"
>Issues</a
>
</li>
<li>
<a href="https://github.com/th-ch/youtube-music/pulls"
<a href="https://github.com/ytmd-devs/ytmd/pulls"
>Pull requests</a
>
</li>
</ul>
<ul class="footer-social-links list-reset">
<li>
<a href="https://github.com/th-ch/youtube-music">
<a href="https://github.com/ytmd-devs/ytmd">
<span class="screen-reader-text">GitHub</span>
<svg
height="16"

View File

@ -150,6 +150,12 @@
"visual-tweaks": {
"label": "تعديلات المظهر",
"submenu": {
"custom-window-title": {
"label": "عنوان نافذة مخصص",
"prompt": {
"placeholder": "مثال: YouTube Music"
}
},
"like-buttons": {
"default": "الافتراضي",
"force-show": "اجبار الظهور",
@ -414,6 +420,11 @@
}
}
},
"custom-output-device": {
"menu": {
"device-selector": "اختر جهاز"
}
},
"disable-autoplay": {
"description": "يجعل الأغنية تبدأ في وضع \"الإيقاف المؤقت\"",
"menu": {
@ -846,6 +857,18 @@
"description": "يضيف أداة TouchBar لمستخدمي macOS",
"name": "شريط اللمس (TouchBar)"
},
"transparent-player": {
"menu": {
"type": {
"submenu": {
"acrylic": "زجاجي",
"mica": "حجري",
"none": "لاشيء"
}
}
},
"name": "مشغل شفاف"
},
"tuna-obs": {
"description": "التكامل مع الإضافة\" Tuna\" الخاصة بـ OBS",
"name": "إضافة Tuna OBS"

View File

@ -150,6 +150,13 @@
"visual-tweaks": {
"label": "Визуални настройки",
"submenu": {
"custom-window-title": {
"label": "Персонализирано заглавие на прозорец",
"prompt": {
"label": "Въведи персонализирано заглавие: (остави празно за да изключиш)",
"placeholder": "Пример: Youtube Music"
}
},
"like-buttons": {
"default": "По подразбиране",
"force-show": "Принудително показване",
@ -414,6 +421,19 @@
}
}
},
"custom-output-device": {
"description": "Конфигуриране на изходно медийно устройство за песни",
"menu": {
"device-selector": "Избери устройство"
},
"name": "Персонализирано изходно устройство",
"prompt": {
"device-selector": {
"label": "Избери изходното медийно устройство",
"title": "Избери изходно устройство"
}
}
},
"disable-autoplay": {
"description": "Започва песента в паузиран режим",
"menu": {
@ -437,7 +457,15 @@
"hide-duration-left": "Скрий оставащото време",
"hide-github-button": "Скрий бутона за линк към GitHub",
"play-on-youtube-music": "Възпроизведи в YouTube Music",
"set-inactivity-timeout": "Задай таймаут за неактивност"
"set-inactivity-timeout": "Задай таймаут за неактивност",
"set-status-display-type": {
"label": "Статус текст",
"submenu": {
"artist": "Слушам {artist}",
"title": "Слушам {song title}",
"youtube-music": "Слушам YouTube Music"
}
}
},
"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"

View File

@ -884,7 +884,25 @@
"name": "TouchBar"
},
"transparent-player": {
"description": "Fa la finestra de l'aplicació transparent"
"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",

View File

@ -288,6 +288,7 @@
},
"amuse": {
"description": "Přídá YouTube Music 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."
}
@ -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):",
@ -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": {
@ -442,7 +457,15 @@
"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"
"set-inactivity-timeout": "Nastavit timeout pro neaktivitu",
"set-status-display-type": {
"label": "Text statusu",
"submenu": {
"artist": "Poslouchám: {artist}",
"title": "Poslouchám {song title}",
"youtube-music": "Poslouchám YouTube Music"
}
}
},
"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": {

View File

@ -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: YouTube Music"
}
},
"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"

View File

@ -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",
@ -189,7 +189,7 @@
"new": "NOUVEAU"
},
"view": {
"label": "Vue",
"label": "Fenêtre",
"submenu": {
"force-reload": "Forcer l'actualisation",
"reload": "Actualiser",
@ -765,7 +765,7 @@
"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": {
@ -796,7 +796,7 @@
},
"skip-disliked-songs": {
"description": "Passer les musiques que je n'aime pas",
"name": "Passer Chansons Déplaisantes"
"name": "Passer les chansons « Je n'aime pas »"
},
"skip-silences": {
"description": "Ignorer automatiquement les sections de silence dans les chansons",

View File

@ -421,6 +421,13 @@
}
}
},
"custom-output-device": {
"description": "गानों के लिए एक कस्टम आउटपुट मीडिया डिवाइस कॉन्फ़िगर करें",
"menu": {
"device-selector": "डिवाइस चुनें"
},
"name": "अपनी पसंद का आउटपुट डिवाइस"
},
"disable-autoplay": {
"description": "गीत को \"रुके हुए \" मोड में शुरू करता है",
"menu": {

View File

@ -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: Youtube Music"
}
},
"like-buttons": {
"default": "Alapértelmezett",
"force-show": "Megjelenítés kényszerítése",
@ -333,6 +340,28 @@
"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"
@ -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": {
@ -408,7 +454,15 @@
"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"
"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}",
"title": "Hallgatja: {song title}",
"youtube-music": "Hallgatja: YouTube Music"
}
}
},
"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": {

View File

@ -422,6 +422,7 @@
}
},
"custom-output-device": {
"description": "Atur perangkat media keluaran khusus untuk lagu-lagu",
"menu": {
"device-selector": "Pilih Perangkat"
},
@ -756,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"
},
@ -841,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."
@ -873,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"

View File

@ -421,6 +421,19 @@
}
}
},
"custom-output-device": {
"description": "曲用のカスタム出力メディアデバイスを構成する",
"menu": {
"device-selector": "デバイスの選択"
},
"name": "カスタム出力デバイス",
"prompt": {
"device-selector": {
"label": "使用する出力メディアデバイスを選択します",
"title": "出力デバイスの選択"
}
}
},
"disable-autoplay": {
"description": "曲を「一時停止」モードで始めさせます",
"menu": {
@ -444,7 +457,15 @@
"hide-duration-left": "残りの再生時間を隠す",
"hide-github-button": "GitHubリンクボタンを隠す",
"play-on-youtube-music": "YouTube Musicで再生",
"set-inactivity-timeout": "タイムアウト時間を設定"
"set-inactivity-timeout": "タイムアウト時間を設定",
"set-status-display-type": {
"label": "ステータステキスト",
"submenu": {
"artist": "{artist}を聴いている",
"title": "{曲名}を聴いている",
"youtube-music": "YouTube Musicを聴く"
}
}
},
"name": "Discordアクティビティステータス",
"prompt": {
@ -736,6 +757,7 @@
"listenbrainz": {
"token": "ListenBrainzユーザートークンを入力してください"
},
"scrobble-alternative-artist": "代替アーティストを使用する",
"scrobble-alternative-title": "代替タイトルを使用する",
"scrobble-other-media": "他のメディアをScrobbleする"
},
@ -821,6 +843,14 @@
"label": "歌詞を完璧に同期させる",
"tooltip": "次の行の表示をミリ秒単位で計算する(パフォーマンスに若干の影響を与える可能性があります)"
},
"preferred-provider": {
"label": "優先プロバイダー",
"none": {
"label": "なし",
"tooltip": "指定医療機関なし"
},
"tooltip": "使用するデフォルトプロバイダを選択してください"
},
"romanization": {
"label": "ローマ字歌詞",
"tooltip": "歌詞が異なる言語で書かれている場合は、ラテン語バージョンを表示するようにしてください。"
@ -853,6 +883,27 @@
"description": "masOSユーザー向けにTouchBarウィジェットを追加",
"name": "TouchBar"
},
"transparent-player": {
"description": "アプリウィンドウを透明にする",
"menu": {
"opacity": {
"label": "不透明度",
"submenu": {
"percent": "{{opacity}}%"
}
},
"type": {
"label": "タイプ",
"submenu": {
"acrylic": "アクリル",
"mica": "マイカ(Mica)",
"none": "なし",
"tabbed": "タブ付き"
}
}
},
"name": "透明プレイヤー"
},
"tuna-obs": {
"description": "OBSのプラグインTunaの統合",
"name": "Tuna OBS"

View File

@ -124,7 +124,7 @@
"language": {
"dialog": {
"message": "Bahasa akan ditukar selepas dimulakan semula",
"title": "Bahasa Berubah"
"title": "Bahasa diubah"
},
"label": "Bahasa",
"submenu": {
@ -150,11 +150,18 @@
"visual-tweaks": {
"label": "Pembaikan Visual",
"submenu": {
"custom-window-title": {
"label": "Tajuk tetingkap tersuai",
"prompt": {
"label": "Masukkan tajuk tetingkap tersuai: (biarkan kosong untuk matikan)",
"placeholder": "Contoh: YouTube Music"
}
},
"like-buttons": {
"default": "Lalai",
"force-show": "Paksa pamer",
"hide": "Sembunyi",
"label": "Suka butang"
"label": "Butang suka"
},
"remove-upgrade-button": "Buang butang naik taraf",
"theme": {
@ -243,8 +250,17 @@
"pixels": "{{blurAmount}}piksel"
}
},
"buffer": {
"label": "Buffer",
"submenu": {
"buffer": "{{buffer}}"
}
},
"opacity": {
"label": "Kelegapan"
"label": "Kelegapan",
"submenu": {
"percent": "{{opacity}}%"
}
},
"quality": {
"label": "Kualiti",
@ -271,7 +287,11 @@
"name": "Mod Sekitaran"
},
"amuse": {
"description": "Menambahkan sokongan YouTube Music untuk widget sedang dimain Amuse oleh 6K Labs"
"description": "Menambahkan sokongan YouTube Music untuk widget sedang dimain Amuse oleh 6K Labs",
"name": "Terhibur",
"response": {
"query": "API server Amuse telah berjalan. GET /query untuk mendapatkan maklumat lagu."
}
},
"api-server": {
"description": "Perlukan server API untuk mengawal pemain",
@ -321,13 +341,31 @@
"name": "Pemampat Audio"
},
"auth-proxy-adapter": {
"description": "Sokongan untuk penggunaan perkhidmatan proksi pengesahan",
"menu": {
"disable": "Matikan adapter proksi",
"enable": "Nyalakan adapter proksi",
"hostname": {
"label": "Nama perumah"
},
"port": {
"label": "Port"
}
},
"name": "Adapter Auth Proksi",
"prompt": {
"hostname": {
"label": "Nyatakan nama hos untuk server proksi tempatan (memerlukan mulakan semula):",
"title": "Nama hos proksi"
},
"port": {
"label": "Masukkan port untuk server proksi tempatan (memerlukan restart):",
"title": "Port Proksi"
}
}
},
"blur-nav-bar": {
"description": "Menjadikan bar navigasi telus dan kabur",
"name": "Kaburkan Bar navigasi"
},
"bypass-age-restrictions": {
@ -347,6 +385,172 @@
"none": "Tiada",
"title": "Pilih bahasa kapsyen"
}
},
"templates": {
"title": "Buka pemilih kapsyen"
},
"toast": {
"caption-changed": "Sarikata berubah kepada {{language}}",
"caption-disabled": "Sarikata dimatikan",
"no-captions": "Tiada sarikata untuk lagu ini"
}
},
"compact-sidebar": {
"description": "Sentiasa tetapkan bar sisi dalam mod padat",
"name": "Bar Sisi Padat"
},
"crossfade": {
"description": "Pudar silang antara lagu",
"menu": {
"advanced": "Maju"
},
"name": "Pudar Selang [Beta]",
"prompt": {
"options": {
"multi-input": {
"fade-in-duration": "Pudar dalam tempoh (ms)",
"fade-out-duration": "Tempoh pudar (ms)",
"fade-scaling": {
"label": "Penskalaan pudar",
"linear": "Linear",
"logarithmic": "Logaritma"
},
"seconds-before-end": "Pudar silang N saat sebelum tamat"
},
"title": "Opsi pudar silang"
}
}
},
"custom-output-device": {
"description": "Konfigurasikan peranti media output tersuai untuk lagu",
"menu": {
"device-selector": "Pilih peranti"
},
"name": "Peranti Output Tersuai",
"prompt": {
"device-selector": {
"label": "Pilih peranti media output yang akan digunakan",
"title": "Pilih Peranti Output"
}
}
},
"disable-autoplay": {
"description": "Membuat lagu bermula dalam mod \"jeda\"",
"menu": {
"apply-once": "Terpakai hanya pada permulaan"
},
"name": "Matikan automain"
},
"discord": {
"backend": {
"already-connected": "Cuba untuk menyambung dengan sambungan aktif",
"connected": "Disambungkan ke Discord",
"disconnected": "Diputuskan sambungan daripada Discord"
},
"description": "Tunjukkan kepada rakan anda perkara yang anda dengar dengan Rich Presence",
"menu": {
"auto-reconnect": "Auto sambung semula",
"clear-activity": "Padamkan aktiviti",
"clear-activity-after-timeout": "Kosongkan aktiviti selepas tamat masa",
"connected": "Tersambung",
"disconnected": "Tidak disambungkan",
"hide-duration-left": "Sembunyikan tempoh yang tinggal",
"hide-github-button": "Sembunyikan Butang pautan GitHub",
"play-on-youtube-music": "Main di YouTube Music",
"set-inactivity-timeout": "Tetapkan tamat masa tidak aktif",
"set-status-display-type": {
"label": "Teks status",
"submenu": {
"artist": "Sedang mendengar {artist}",
"youtube-music": "Mendengar YouTube Music"
}
}
},
"name": "Discord Rich Presence",
"prompt": {
"set-inactivity-timeout": {
"label": "Masukkan tamat masa tidak aktif dalam beberapa saat:",
"title": "Tetapkan tamat masa tidak aktif"
}
}
},
"downloader": {
"backend": {
"dialog": {
"error": {
"buttons": {
"ok": "OK"
},
"message": "Argh! Maaf, muat turun gagal…",
"title": "Ralat dalam muat turun!"
},
"start-download-playlist": {
"buttons": {
"ok": "OK"
},
"detail": "({{playlistSize}} lagu)",
"message": "Memuat turun senarai main {{playlistTitle}}",
"title": "Memuat turn bermula"
}
},
"feedback": {
"conversion-progress": "Penukaran: {{percent}}%",
"converting": "Menukarkan…",
"done": "Selesai: {{filePath}}",
"download-info": "Memuat turun {{artist}} - {{title}} [{{videoId}}",
"downloading": "Memuat turun…",
"downloading-counter": "Memuat turun {{current}}/{{total}}…",
"downloading-playlist": "Memuat turun senarai main \"{{playlistTitle}}\" - {{playlistSize}} lagu ({{playlistId}})",
"error-while-downloading": "Gagal memuat turun \"{{author}} - {{title}}\": {{error}}",
"folder-already-exists": "Folder {{playlistFolder}} sudah ada",
"getting-playlist-info": "Mendapatkan maklumat senarai main…",
"loading": "Memuat…",
"playlist-has-only-one-song": "Senarai main hanya mempunyai satu item, memuat turunnya terus",
"playlist-id-not-found": "ID senarai main tidak dijumpai",
"playlist-is-empty": "Senarai main kosong",
"saving": "Menyimpan…",
"trying-to-get-playlist-id": "Mencuba untuk mendapatkan ID senarai main: {{playlistId}}",
"video-id-not-found": "Video tidak dijumpai"
}
},
"description": "Memuat turun audio MP3 / sumber terus dari antara muka",
"menu": {
"choose-download-folder": "Pilih folder muat turun",
"download-finish-settings": {
"prompt": {
"title": "Konfigurasikan masa untuk memuat turun"
},
"submenu": {
"enabled": "Dinyalakan",
"mode": "Mod masa",
"percent": "Peratus",
"seconds": "Saat"
}
},
"download-playlist": "Muat turun senarai main"
}
},
"lumiastream": {
"name": "Lumia Stream [Beta]"
},
"lyrics-genius": {
"description": "Menambahkan sokongan lirik untuk kebanyakan lagu",
"menu": {
"romanized-lyrics": "Lirik Romanized"
},
"name": "Lirik Genius",
"renderer": {
"fetched-lyrics": "Lirik yang diambil untuk Genius"
}
},
"music-together": {
"description": "Kongsi senarai main dengan orang lain. Apabila hos memainkan lagu, semua orang akan mendengar lagu yang sama",
"internal": {
"save": "Simpan",
"unknown-user": "Pengguna tidak diketahui"
},
"menu": {
"close": "Tutup Music Together"
}
},
"synced-lyrics": {

View File

@ -189,12 +189,12 @@
"new": "NIEUW"
},
"view": {
"label": "Weergeven",
"label": "Bekijken",
"submenu": {
"force-reload": "Forceer Herladen",
"reload": "Herladen",
"reset-zoom": "Ware Grootte",
"toggle-fullscreen": "Volledig Scherm Wisselen",
"toggle-fullscreen": "Volledig Scherm Ja/Nee",
"zoom-in": "Inzoomen",
"zoom-out": "Uitzoomen"
}
@ -204,12 +204,12 @@
"next": "Volgende",
"play-pause": "Afspelen/Pauze",
"previous": "Vorige",
"quit": "Afsluiten",
"quit": "Verlaat",
"restart": "Herstarten App",
"show": "Weergeven Venster",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artiest}} - {{titel}}"
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
}
}
},
@ -421,6 +421,19 @@
}
}
},
"custom-output-device": {
"description": "Configureer een aangepast media uitvoerapparaat voor liedjes",
"menu": {
"device-selector": "Selecteer je apparaat"
},
"name": "Aangepast uitvoerapparaat",
"prompt": {
"device-selector": {
"label": "Kies het uitvoermedia-apparaat dat gebruikt zal worden",
"title": "Selecteer het uitvoermedia"
}
}
},
"disable-autoplay": {
"description": "Zorgt ervoor dat nummers starten in 'gepauzeerde' modus",
"menu": {
@ -444,7 +457,15 @@
"hide-duration-left": "Verberg resterende tijd",
"hide-github-button": "GitHub-knop verbergen",
"play-on-youtube-music": "Afspelen op YouTube Music",
"set-inactivity-timeout": "Inactiviteitstime-out instellen"
"set-inactivity-timeout": "Inactiviteitstime-out instellen",
"set-status-display-type": {
"label": "Status tekst",
"submenu": {
"artist": "Naar {artist} aan het luisteren",
"title": "Naar {song title} aan het luisteren",
"youtube-music": "Naar Youtube Music aan het luisteren"
}
}
},
"name": "Discord Rich Presence",
"prompt": {
@ -736,6 +757,7 @@
"listenbrainz": {
"token": "Voer het ListenBrainz-gebruikerstoken in"
},
"scrobble-alternative-artist": "Gebruik alternatieve artiesten",
"scrobble-alternative-title": "Gebruik alternatieve titels",
"scrobble-other-media": "Scrobble andere media"
},
@ -822,9 +844,12 @@
"tooltip": "Bereken tot op de milliseconde de weergave van de volgende regel (kan een kleine impact hebben op de prestaties)"
},
"preferred-provider": {
"label": "Voorkeur van Provider",
"none": {
"label": "Geen",
"tooltip": "Geen provider beschikbaar"
}
},
"tooltip": "Kies de standaardprovider om te gebruiken"
},
"romanization": {
"label": "Romaniseer songtekst",
@ -858,6 +883,24 @@
"description": "Voegt een TouchBar-widget toe voor macOS-gebruikers",
"name": "TouchBar"
},
"transparent-player": {
"menu": {
"opacity": {
"submenu": {
"percent": "{{opacity}}%"
}
},
"type": {
"label": "Soort",
"submenu": {
"acrylic": "Acrylic",
"mica": "Mica",
"none": "Geen",
"tabbed": "Tabbed"
}
}
}
},
"tuna-obs": {
"description": "Integratie met OBS's plug-in Tuna",
"name": "Tuna OBS"

View File

@ -421,6 +421,19 @@
}
}
},
"custom-output-device": {
"description": "Skonfiguruj niestandardowe wyjście audio dla odtwarzanych utworów",
"menu": {
"device-selector": "Wybierz urządzenie"
},
"name": "Niestandardowe wyjście audio",
"prompt": {
"device-selector": {
"label": "Wybierz wyjście audio które ma być użyte",
"title": "Wybierz wyjście audio"
}
}
},
"disable-autoplay": {
"description": "Wyłącza automatyczne odtwarzanie utworów",
"menu": {
@ -444,7 +457,15 @@
"hide-duration-left": "Ukryj pozostały czas trwania",
"hide-github-button": "Ukryj przycisk do GitHub",
"play-on-youtube-music": "Odtwórz w YouTube Music",
"set-inactivity-timeout": "Ustaw limit czasu bezczynności"
"set-inactivity-timeout": "Ustaw limit czasu bezczynności",
"set-status-display-type": {
"label": "Opis statusu",
"submenu": {
"artist": "Słucha {artist}",
"title": "Słucha {song title}",
"youtube-music": "Słucha YouTube Music"
}
}
},
"name": "Discord Rich Presence",
"prompt": {
@ -736,6 +757,7 @@
"listenbrainz": {
"token": "Podaj token użytkownika ListenBrainz"
},
"scrobble-alternative-artist": "Urzyj alternatywnych artytów",
"scrobble-alternative-title": "Użyj alternatywnych tytułów",
"scrobble-other-media": "Scrobbluj pozostałe multimedia"
},
@ -821,6 +843,14 @@
"label": "Zsynchronizuj tekst utworu do perfekcji",
"tooltip": "Wylicz czas wyświetlania następnej linijki co do milisekundy (może mieć mały wpływ na wydajność systemu)"
},
"preferred-provider": {
"label": "Preferowane Źródło",
"none": {
"label": "Żaden",
"tooltip": "Brak preferowanego źródła"
},
"tooltip": "Wybierz domyślne źródło"
},
"romanization": {
"label": "Romanizacja utworów",
"tooltip": "Jeżeli tekst piosenki nie jest w alfabecie łacińskim, poddaje ją romanizacji, czyli przedstawia mowy za pomocą owych liter."
@ -853,6 +883,27 @@
"description": "Dodaje widżet do paska dotykowego dla użytkowników systemu macOS",
"name": "Pasek dotykowy"
},
"transparent-player": {
"description": "Sprawia, że okno aplikacji jest przeźroczyste",
"menu": {
"opacity": {
"label": "Nieprzezroczystość",
"submenu": {
"percent": "{{opacity}}%"
}
},
"type": {
"label": "Typ",
"submenu": {
"acrylic": "Akryl",
"mica": "Mika",
"none": "Brak",
"tabbed": "Zakładkowy"
}
}
},
"name": "Przeźroczysty odtwarzacz"
},
"tuna-obs": {
"description": "Integracja z wtyczką OBS Tuna",
"name": "Tuna OBS"

View File

@ -421,6 +421,19 @@
}
}
},
"custom-output-device": {
"description": "Configurați un dispozitiv de ieșire personalizat pentru melodii",
"menu": {
"device-selector": "Selectați dispozitivul"
},
"name": "Dispozitiv de ieșire personalizat",
"prompt": {
"device-selector": {
"label": "Alegeți dispozitivul media de ieșire care va fi utilizat",
"title": "Selectați dispozitivul de ieșire"
}
}
},
"disable-autoplay": {
"description": "Face cântecul să înceapă în modul \"pauză\"",
"menu": {
@ -444,7 +457,15 @@
"hide-duration-left": "Ascunde timpul rămas",
"hide-github-button": "Ascunde butonul cu link-ul GitHub",
"play-on-youtube-music": "Redă pe YouTube Music",
"set-inactivity-timeout": "Setează intervalul de inactivitate"
"set-inactivity-timeout": "Setează intervalul de inactivitate",
"set-status-display-type": {
"label": "Text stare",
"submenu": {
"artist": "Ascultând {artist}",
"title": "Ascultând {song title}",
"youtube-music": "Ascultând YouTube Music"
}
}
},
"name": "Discord Rich Presence",
"prompt": {
@ -712,7 +733,12 @@
}
},
"description": "Permite schimbarea calității video cu un buton prezent peste video",
"name": "Schimbător de calitate video"
"name": "Schimbător de calitate video",
"renderer": {
"quality-settings-button": {
"label": "Deschide setările de calitate"
}
}
},
"scrobbler": {
"description": "Adaugă asistenta pentru scrobbling (etc. last.fm, Listenbrainz)",
@ -731,6 +757,7 @@
"listenbrainz": {
"token": "Introdu token-ul de utilizator ListenBrainz"
},
"scrobble-alternative-artist": "Utilizați artiști alternativi",
"scrobble-alternative-title": "Folosește titluri alternative",
"scrobble-other-media": "Scrobble alte surse media"
},
@ -816,6 +843,14 @@
"label": "Sincronizează versurile perfect",
"tooltip": "Calculează afisarea următoarei linii până la milisecundă (poate afecta performanța)"
},
"preferred-provider": {
"label": "Furnizor preferat",
"none": {
"label": "Niciunul",
"tooltip": "Niciun furnizor preferat"
},
"tooltip": "Alegeți furnizorul preferat"
},
"romanization": {
"label": "Transcrie versurile în alfabet latin",
"tooltip": "Dacă versurile sunt într-o altă limbă, încearcă să afișezi o versiune în alfabet latin."
@ -848,6 +883,27 @@
"description": "Adaugă un widget TouchBar pentru utilizatorii macOS",
"name": "TouchBar"
},
"transparent-player": {
"description": "Face fereastra aplicației transparentă",
"menu": {
"opacity": {
"label": "Opacitate",
"submenu": {
"percent": "{{opacity}}%"
}
},
"type": {
"label": "Tip",
"submenu": {
"acrylic": "Acrilic",
"mica": "Efect mica",
"none": "Niciunul",
"tabbed": "Cu file"
}
}
},
"name": "Player transparent"
},
"tuna-obs": {
"description": "Integrare cu plugin-ul OBS Tuna",
"name": "Tuna OBS"

View File

@ -53,9 +53,9 @@
"later": "Позже",
"restart-now": "Перезапустить сейчас"
},
"detail": "Перезагрузите приложение для включения плагина {{pluginName}}",
"message": "{{pluginName}} нуждается в перезагрузке",
"title": "Нужна перезагрузка"
"detail": "Перезапустите приложение для включения плагина {{pluginName}}",
"message": "Перезапуск для применения плагина {{pluginName}}",
"title": "Нужен перезапуск"
},
"unresponsive": {
"buttons": {
@ -191,8 +191,8 @@
"view": {
"label": "Вид",
"submenu": {
"force-reload": "Принудительная перезагрузка",
"reload": "Перезагрузить",
"force-reload": "Принудительный перезапуск",
"reload": "Перезапустить",
"reset-zoom": "Текущий размер",
"toggle-fullscreen": "Включить полноэкранный режим",
"zoom-in": "Приблизить",
@ -205,7 +205,7 @@
"play-pause": "Пауза/Продолжить",
"previous": "Предыдущий",
"quit": "Выйти",
"restart": "Перезагрузить приложение",
"restart": "Перезапустить приложение",
"show": "Показать окно",
"tooltip": {
"default": "YouTube Music",
@ -895,10 +895,10 @@
"type": {
"label": "Тип",
"submenu": {
"acrylic": "Acrylic",
"mica": "Mica",
"acrylic": "Акриловый",
"mica": "Слюдяной",
"none": "Отключено",
"tabbed": "Tabbed"
"tabbed": "Страничный"
}
}
},

214
src/i18n/resources/sk.json Normal file
View File

@ -0,0 +1,214 @@
{
"common": {
"console": {
"plugins": {
"execute-failed": "Nepodarilo sa spustiť plugin {{pluginName}}:{{contextName}}",
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} spustený za {{ms}}ms",
"initialize-failed": "Zlyhalo spustenie \"{{pluginName}}\" pluginu",
"load-all": "Načítavanie všetkých pluginov",
"load-failed": "Načítanie \"{{pluginName}}\" pluginu zlyhalo",
"loaded": "Plugin \"{{pluginName}}\" sa načítal",
"unload-failed": "Zlyhalo vypnutie \"{{pluginName}}\" pluginu",
"unloaded": "Plugin \"{{pluginName}}\" bol vypnutý"
}
}
},
"language": {
"code": "sk",
"local-name": "Slovenčina",
"name": "Slovak"
},
"main": {
"console": {
"did-finish-load": {
"dev-tools": "Načítanie dokončené. DevTools otvorené"
},
"i18n": {
"loaded": "i18n načítaný"
},
"second-instance": {
"receive-command": "Prijatý príkaz skrze protokol \"{{command}}\""
},
"theme": {
"css-file-not-found": "CSS súbor \"{{cssFile}}\" neexistuje, ignorované"
},
"unresponsive": {
"details": "Aplikácia nereaguje\n{{error}}"
},
"when-ready": {
"clearing-cache-after-20s": "Čistenie medzipamäte aplikácie"
},
"window": {
"tried-to-render-offscreen": "Okno sa pokúšalo vykresliť na pozadí, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
}
},
"dialog": {
"hide-menu-enabled": {
"detail": "Menu je skryté, stlačte \"Alt\" na zobrazenie (alebo \"Escape\" keď používate Aplikačné menu)",
"message": "Skryté menu je zapnuté",
"title": "Skryté menu zapnuté"
},
"need-to-restart": {
"buttons": {
"later": "Neskôr",
"restart-now": "Reštartovať teraz"
},
"detail": "\"{{pluginName}}\" plugin potrebuje reštart aby sa spustil",
"message": "\"{{pluginName}}\" sa potrebuje reštartovať",
"title": "Reštart potrebný"
},
"unresponsive": {
"buttons": {
"quit": "Skončiť",
"relaunch": "Spustiť znova",
"wait": "Počkajte"
},
"detail": "Ospravedlňujeme sa za nepríjemnosti! prosím vyberte, čo robiť:",
"message": "Aplikácia nereaguje",
"title": "Okno nereaguje"
},
"update-available": {
"buttons": {
"disable": "Vypnúť aktualizácie",
"download": "Sťiahnuť",
"ok": "OK"
},
"detail": "Nová verzia je k dispozícii a je možné ju stiahnuť na {{downloadLink}}",
"message": "Nová verzia je k dispozícii",
"title": "Aktualizácia je k dispozícii"
}
},
"menu": {
"about": "O nás",
"navigation": {
"label": "Navigovať",
"submenu": {
"copy-current-url": "Skopírovať aktuálnu URL",
"go-back": "Späť",
"go-forward": "Dopredu",
"quit": "Skončiť",
"restart": "Reštartovať Aplikáciu"
}
},
"options": {
"label": "Možnosti",
"submenu": {
"advanced-options": {
"label": "Rozšírené možnosti",
"submenu": {
"auto-reset-app-cache": "Vymazať vyrovnávaciu pamäť, pri štarte",
"disable-hardware-acceleration": "Vypnúť hardvérovú akceleráciu",
"edit-config-json": "Upraviť config.json",
"override-user-agent": "Prepísať User-Agent",
"restart-on-config-changes": "Reštartovať pri zmene configu",
"set-proxy": {
"label": "Nastavtiť proxy",
"prompt": {
"label": "Zadajte Proxy adresu: (nechajte prázdne pre vypnutie)",
"placeholder": "Príklad: SOCKS5://127.0.0.1:9999",
"title": "Nastavtiť proxy"
}
},
"toggle-dev-tools": "Prepnúť DevTools"
}
},
"always-on-top": "Vždy na vrchu",
"auto-update": "Automatická aktualizácia",
"hide-menu": {
"dialog": {
"message": "Menu bude skryté pri ďalšom štarte, použite [Alt] na ukázanie (alebo [`] ak používate aplikačné menu)",
"title": "Skryté menu Zapnuté"
},
"label": "Skryť menu"
},
"language": {
"dialog": {
"message": "Jazyk sa zmení po reštarte",
"title": "Jazyk sa zmenil"
},
"label": "Jazyk",
"submenu": {
"to-help-translate": "Chcete pomôcť preložiť? Kliknite sem"
}
},
"resume-on-start": "Pokračovať od poslednej piesne, pri spustení aplikácie",
"single-instance-lock": "Zámok jedného spustenia",
"start-at-login": "Spustiť pri štarte",
"starting-page": {
"label": "Spúšťacia stránka",
"unset": "Nevybrať"
},
"tray": {
"label": "Panel oznámení",
"submenu": {
"disabled": "Vypnuý",
"enabled-and-hide-app": "Zapnutý , a skryť okno aplikácie",
"enabled-and-show-app": "Spustené a ukáž aplikáciu",
"play-pause-on-click": "Prehrať/Pozastaviť na stlačenie"
}
},
"visual-tweaks": {
"label": "Vizuálne úpravy",
"submenu": {
"custom-window-title": {
"label": "Vlastný názov okna",
"prompt": {
"label": "Napíšte vlastný názov okna: (nechajte prázdne pre vypnutie)",
"placeholder": "Napríklad: YouTube Music"
}
},
"like-buttons": {
"default": "Základný",
"force-show": "Vynútiť zobrazenie",
"hide": "Skryť",
"label": "Like tlačítko"
},
"remove-upgrade-button": "Odstrániť tlačidlo povýšiť",
"theme": {
"dialog": {
"button": {
"cancel": "Zrušiť",
"remove": "Odstrániť"
},
"remove-theme": "Ste si istý že chcete odstrániť tento vlastný štýl?",
"remove-theme-message": "Toto odstráni vlastný štýl"
},
"label": "Štýl",
"submenu": {
"import-css-file": "Nahrať vlasný CSS súbor",
"no-theme": "Žiadny štýl"
}
}
}
}
}
},
"plugins": {
"enabled": "Zapnuté",
"new": "NOVÝ"
},
"view": {
"submenu": {
"force-reload": "Natvrdo obnoviť",
"reload": "Obnoviť",
"reset-zoom": "Ozajstná veľkosť",
"toggle-fullscreen": "Prepnúť režim Celej Obrazovky",
"zoom-in": "Priblížiť",
"zoom-out": "Oddialiť"
}
}
},
"tray": {
"next": "Ďalšie",
"play-pause": "Prehrať/Pozastaviť",
"previous": "Predcházdajúce",
"quit": "Skončiť",
"restart": "Reštartovať aplikáciu",
"show": "Zobraziť okno",
"tooltip": {
"default": "YouTube Hudba",
"with-song-info": "Youtube Hudba: {{artist}} - {{title}}"
}
}
}
}

View File

@ -421,6 +421,19 @@
}
}
},
"custom-output-device": {
"description": "பாடல்களுக்கான தனிப்பயன் வெளியீட்டு ஊடக சாதனத்தை கட்டமைக்கவும்",
"menu": {
"device-selector": "சாதனத்தை தேர்ந்தெடுக்கவும்"
},
"name": "விருப்பமான வெளியிட்டு சாதனம்",
"prompt": {
"device-selector": {
"label": "பயன்படுத்தப்பட வேண்டிய வெளிப்பாட்டு ஊடக சாதனத்தை தேர்ந்தெடுக்கவும்",
"title": "வெளியிட்டு சாதனத்தை தேர்ந்தெடுக்கவும்"
}
}
},
"disable-autoplay": {
"description": "\"இடைநிறுத்தப்பட்ட\" பயன்முறையில் பாடல் தொடங்குகிறது",
"menu": {
@ -444,7 +457,15 @@
"hide-duration-left": "காலம் மீதமுள்ளதை மறைக்கவும்",
"hide-github-button": "அறிவிலிமையம் இணைப்பு பொத்தானை மறைக்கவும்",
"play-on-youtube-music": "யூடியூப் இசையில் விளையாடுங்கள்",
"set-inactivity-timeout": "செயலற்ற நேரம் முடிந்தது"
"set-inactivity-timeout": "செயலற்ற நேரம் முடிந்தது",
"set-status-display-type": {
"label": "நிலை உரை",
"submenu": {
"artist": "{கலைஞர்} பாடலைக் கேட்கிறேன்",
"title": "பாடலைக் கேட்கிறேன்{பாடல் தலைப்பு}",
"youtube-music": "வலையொளி இசையில் கேட்கிறது"
}
}
},
"name": "முரண்பாடு பணக்கார இருப்பு",
"prompt": {
@ -736,6 +757,7 @@
"listenbrainz": {
"token": "WeskBrainz பயனர் கிள்ளாக்கை உள்ளிடவும்"
},
"scrobble-alternative-artist": "மாற்று கலைஞர்களை பயன்படுத்துங்கள்",
"scrobble-alternative-title": "மாற்று தலைப்புகளைப் பயன்படுத்தவும்",
"scrobble-other-media": "மற்ற ஊடகங்களை வெல்லுங்கள்"
},
@ -821,6 +843,14 @@
"label": "பாடல் வரிகளை சரியாக ஒத்திசைக்கவும்",
"tooltip": "அடுத்த வரியின் காட்சியைக் கணக்கிடுங்கள் (செயல்திறனில் ஒரு சிறிய தாக்கத்தை ஏற்படுத்தும்)"
},
"preferred-provider": {
"label": "விருப்பமான வழங்குநர்",
"none": {
"label": "இல்லை",
"tooltip": "விருப்பமான வழங்குநர் இல்லை"
},
"tooltip": "வழமையான வழங்குநரை தேர்ந்தெடுக்கவும்"
},
"romanization": {
"label": "பாடல் வரிகள் ரோமானியமாக்குங்கள்",
"tooltip": "பாடல் வரிகள் வேறு மொழியில் இருந்தால், லத்தீன் பதிப்பைக் காட்ட முயற்சிக்கவும்."
@ -853,6 +883,27 @@
"description": "MACOS பயனர்களுக்கான டச்ச்பார் விட்செட்டை சேர்க்கிறது",
"name": "டக்பார்"
},
"transparent-player": {
"description": "பயன்பாட்டு சாளரத்தை வெளிப்படையானதாக மாற்றுக",
"menu": {
"opacity": {
"label": "ஒளிபுகாநிலை",
"submenu": {
"percent": "{{opacity}}%"
}
},
"type": {
"label": "வகை",
"submenu": {
"acrylic": "மங்கலான திரை தோற்றம்",
"mica": "மெல்லிய ஒளிவிடும் பின்புல தோற்றம் / மின்மினி கண்ணாடி",
"none": "மாற்றமில்லை அல்லது ஒன்றுமில்லை",
"tabbed": "ஒருங்கிணைக்கப்பற்ற பிரிவுகள்"
}
}
},
"name": "வெளிப்படையான சாதனம்"
},
"tuna-obs": {
"description": "OBS இன் சொருகி டுனாவுடன் ஒருங்கிணைப்பு",
"name": "டுனா குறிப்பு"

View File

@ -1 +0,0 @@
/ad-blocker-engine.bin

View File

@ -1,58 +0,0 @@
function skipAd(target: Element) {
const skipButton = target.querySelector<HTMLButtonElement>(
'button.ytp-ad-skip-button-modern',
);
if (skipButton) {
skipButton.click();
}
}
function speedUpAndMute(player: Element, isAdShowing: boolean) {
const video = player.querySelector<HTMLVideoElement>('video');
if (!video) return;
if (isAdShowing) {
video.playbackRate = 16;
video.muted = true;
} else if (!isAdShowing) {
video.playbackRate = 1;
video.muted = false;
}
}
export const loadAdSpeedup = () => {
const player = document.querySelector<HTMLVideoElement>('#movie_player');
if (!player) return;
new MutationObserver((mutations) => {
for (const mutation of mutations) {
if (
mutation.type === 'attributes' &&
mutation.attributeName === 'class'
) {
const target = mutation.target as HTMLElement;
const isAdShowing =
target.classList.contains('ad-showing') ||
target.classList.contains('ad-interrupting');
speedUpAndMute(target, isAdShowing);
}
if (
mutation.type === 'childList' &&
mutation.addedNodes.length &&
mutation.target instanceof HTMLElement
) {
skipAd(mutation.target);
}
}
}).observe(player, {
attributes: true,
childList: true,
subtree: true,
});
const isAdShowing =
player.classList.contains('ad-showing') ||
player.classList.contains('ad-interrupting');
speedUpAndMute(player, isAdShowing);
skipAd(player);
};

View File

@ -1,81 +0,0 @@
// Used for caching
import path from 'node:path';
import fs, { promises } from 'node:fs';
import { ElectronBlocker } from '@ghostery/adblocker-electron';
import { app, net } from 'electron';
const SOURCES = [
'https://raw.githubusercontent.com/kbinani/adblock-youtube-ads/master/signed.txt',
// UBlock Origin
'https://raw.githubusercontent.com/ghostery/adblocker/master/packages/adblocker/assets/ublock-origin/filters.txt',
'https://raw.githubusercontent.com/ghostery/adblocker/master/packages/adblocker/assets/ublock-origin/quick-fixes.txt',
'https://raw.githubusercontent.com/ghostery/adblocker/master/packages/adblocker/assets/ublock-origin/unbreak.txt',
'https://raw.githubusercontent.com/ghostery/adblocker/master/packages/adblocker/assets/ublock-origin/filters-2020.txt',
'https://raw.githubusercontent.com/ghostery/adblocker/master/packages/adblocker/assets/ublock-origin/filters-2021.txt',
'https://raw.githubusercontent.com/ghostery/adblocker/master/packages/adblocker/assets/ublock-origin/filters-2022.txt',
'https://raw.githubusercontent.com/ghostery/adblocker/master/packages/adblocker/assets/ublock-origin/filters-2023.txt',
// Fanboy Annoyances
'https://secure.fanboy.co.nz/fanboy-annoyance_ubo.txt',
// AdGuard
'https://filters.adtidy.org/extension/ublock/filters/122_optimized.txt',
];
let blocker: ElectronBlocker | undefined;
export const loadAdBlockerEngine = async (
session: Electron.Session | undefined = undefined,
cache: boolean = true,
additionalBlockLists: string[] = [],
disableDefaultLists: boolean | unknown[] = false,
) => {
// Only use cache if no additional blocklists are passed
const cacheDirectory = path.join(app.getPath('userData'), 'adblock_cache');
if (!fs.existsSync(cacheDirectory)) {
fs.mkdirSync(cacheDirectory);
}
const cachingOptions =
cache && additionalBlockLists.length === 0
? {
path: path.join(cacheDirectory, 'adblocker-engine.bin'),
read: promises.readFile,
write: promises.writeFile,
}
: undefined;
const lists = [
...((disableDefaultLists && !Array.isArray(disableDefaultLists)) ||
(Array.isArray(disableDefaultLists) && disableDefaultLists.length > 0)
? []
: SOURCES),
...additionalBlockLists,
];
try {
blocker = await ElectronBlocker.fromLists(
(url: string) => net.fetch(url),
lists,
{
enableCompression: true,
// When generating the engine for caching, do not load network filters
// So that enhancing the session works as expected
// Allowing to define multiple webRequest listeners
loadNetworkFilters: session !== undefined,
},
cachingOptions,
);
if (session) {
blocker.enableBlockingInSession(session);
}
} catch (error) {
console.error('Error loading adBlocker engine', error);
}
};
export const unloadAdBlockerEngine = (session: Electron.Session) => {
if (blocker) {
blocker.disableBlockingInSession(session);
}
};
export const isBlockerEnabled = (session: Electron.Session) =>
blocker !== undefined && blocker.isBlockingEnabled(session);

View File

@ -1,148 +0,0 @@
import { contextBridge, webFrame } from 'electron';
import { blockers } from './types';
import { createPlugin } from '@/utils';
import {
isBlockerEnabled,
loadAdBlockerEngine,
unloadAdBlockerEngine,
} from './blocker';
import { inject, isInjected } from './injectors/inject';
import { loadAdSpeedup } from './adSpeedup';
import { t } from '@/i18n';
import type { BrowserWindow } from 'electron';
interface AdblockerConfig {
/**
* Whether to enable the adblocker.
* @default true
*/
enabled: boolean;
/**
* When enabled, the adblocker will cache the blocklists.
* @default true
*/
cache: boolean;
/**
* Which adblocker to use.
* @default blockers.InPlayer
*/
blocker: (typeof blockers)[keyof typeof blockers];
/**
* Additional list of filters to use.
* @example ["https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt"]
* @default []
*/
additionalBlockLists: string[];
/**
* Disable the default blocklists.
* @default false
*/
disableDefaultLists: boolean;
}
export default createPlugin({
name: () => t('plugins.adblocker.name'),
description: () => t('plugins.adblocker.description'),
restartNeeded: false,
config: {
enabled: true,
cache: true,
blocker: blockers.InPlayer,
additionalBlockLists: [],
disableDefaultLists: false,
} as AdblockerConfig,
menu: async ({ getConfig, setConfig }) => {
const config = await getConfig();
return [
{
label: t('plugins.adblocker.menu.blocker'),
submenu: Object.values(blockers).map((blocker) => ({
label: blocker,
type: 'radio',
checked: (config.blocker || blockers.WithBlocklists) === blocker,
click() {
setConfig({ blocker });
},
})),
},
];
},
renderer: {
async onPlayerApiReady(_, { getConfig }) {
const config = await getConfig();
if (config.blocker === blockers.AdSpeedup) {
loadAdSpeedup();
}
},
},
backend: {
mainWindow: null as BrowserWindow | null,
async start({ getConfig, window }) {
const config = await getConfig();
this.mainWindow = window;
if (config.blocker === blockers.WithBlocklists) {
await loadAdBlockerEngine(
window.webContents.session,
config.cache,
config.additionalBlockLists,
config.disableDefaultLists,
);
}
},
stop({ window }) {
if (isBlockerEnabled(window.webContents.session)) {
unloadAdBlockerEngine(window.webContents.session);
}
},
async onConfigChange(newConfig) {
if (this.mainWindow) {
if (
newConfig.blocker === blockers.WithBlocklists &&
!isBlockerEnabled(this.mainWindow.webContents.session)
) {
await loadAdBlockerEngine(
this.mainWindow.webContents.session,
newConfig.cache,
newConfig.additionalBlockLists,
newConfig.disableDefaultLists,
);
}
}
},
},
preload: {
// see #1478
script: `const _prunerFn = window._pruner;
window._pruner = undefined;
JSON.parse = new Proxy(JSON.parse, {
apply() {
return _prunerFn(Reflect.apply(...arguments));
},
});
Response.prototype.json = new Proxy(Response.prototype.json, {
apply() {
return Reflect.apply(...arguments).then((o) => _prunerFn(o));
},
}); 0`,
async start({ getConfig }) {
const config = await getConfig();
if (config.blocker === blockers.InPlayer && !isInjected()) {
inject(contextBridge);
await webFrame.executeJavaScript(this.script);
}
},
async onConfigChange(newConfig) {
if (newConfig.blocker === blockers.InPlayer && !isInjected()) {
inject(contextBridge);
await webFrame.executeJavaScript(this.script);
}
},
},
});

View File

@ -1,3 +0,0 @@
export default async () => {
await import('@ghostery/adblocker-electron-preload');
};

View File

@ -1,5 +0,0 @@
import type { ContextBridge } from 'electron';
export const inject: (contextBridge: ContextBridge) => void;
export const isInjected: () => boolean;

View File

@ -1,259 +0,0 @@
/* eslint-disable */
// Source: https://addons.mozilla.org/en-US/firefox/addon/adblock-for-youtube/
// https://robwu.nl/crxviewer/?crx=https%3A%2F%2Faddons.mozilla.org%2Fen-US%2Ffirefox%2Faddon%2Fadblock-for-youtube%2F
/*
Parts of this code is derived from set-constant.js:
https://github.com/gorhill/uBlock/blob/5de0ce975753b7565759ac40983d31978d1f84ca/assets/resources/scriptlets.js#L704
*/
let injected = false;
export const isInjected = () => injected;
/**
* @param {Electron.ContextBridge} contextBridge
* @returns {*}
*/
export const inject = (contextBridge) => {
injected = true;
{
const pruner = function (o) {
delete o.playerAds;
delete o.adPlacements;
delete o.adSlots;
//
if (o.playerResponse) {
delete o.playerResponse.playerAds;
delete o.playerResponse.adPlacements;
delete o.playerResponse.adSlots;
}
if (o.ytInitialPlayerResponse) {
delete o.ytInitialPlayerResponse.playerAds;
delete o.ytInitialPlayerResponse.adPlacements;
delete o.ytInitialPlayerResponse.adSlots;
}
//
return o;
}
contextBridge.exposeInMainWorld('_pruner', pruner);
}
const chains = [
{
chain: 'playerResponse.adPlacements',
cValue: 'undefined',
},
{
chain: 'ytInitialPlayerResponse.playerAds',
cValue: 'undefined',
},
{
chain: 'ytInitialPlayerResponse.adPlacements',
cValue: 'undefined',
},
{
chain: 'ytInitialPlayerResponse.adSlots',
cValue: 'undefined',
}
];
chains.forEach(function ({ chain, cValue }) {
const thisScript = document.currentScript;
//
switch (cValue) {
case 'null': {
cValue = null;
break;
}
case "''": {
cValue = '';
break;
}
case 'true': {
cValue = true;
break;
}
case 'false': {
cValue = false;
break;
}
case 'undefined': {
cValue = undefined;
break;
}
case 'noopFunc': {
cValue = function () {};
break;
}
case 'trueFunc': {
cValue = function () {
return true;
};
break;
}
case 'falseFunc': {
cValue = function () {
return false;
};
break;
}
default: {
if (/^\d+$/.test(cValue)) {
cValue = Number.parseFloat(cValue);
//
if (isNaN(cValue)) {
return;
}
if (Math.abs(cValue) > 0x7f_ff) {
return;
}
} else {
return;
}
}
}
//
let aborted = false;
const mustAbort = function (v) {
if (aborted) {
return true;
}
aborted =
v !== undefined &&
v !== null &&
cValue !== undefined &&
cValue !== null &&
typeof v !== typeof cValue;
return aborted;
};
/*
Support multiple trappers for the same property:
https://github.com/uBlockOrigin/uBlock-issues/issues/156
*/
const trapProp = function (owner, prop, configurable, handler) {
if (handler.init(owner[prop]) === false) {
return;
}
//
const odesc = Object.getOwnPropertyDescriptor(owner, prop);
let previousGetter;
let previousSetter;
if (odesc instanceof Object) {
if (odesc.configurable === false) {
return;
}
if (odesc.get instanceof Function) {
previousGetter = odesc.get;
}
if (odesc.set instanceof Function) {
previousSetter = odesc.set;
}
}
//
Object.defineProperty(owner, prop, {
configurable,
get() {
if (previousGetter !== undefined) {
previousGetter();
}
//
return handler.getter();
},
set(a) {
if (previousSetter !== undefined) {
previousSetter(a);
}
//
handler.setter(a);
},
});
};
const trapChain = function (owner, chain) {
const pos = chain.indexOf('.');
if (pos === -1) {
trapProp(owner, chain, false, {
v: undefined,
getter() {
return document.currentScript === thisScript ? this.v : cValue;
},
setter(a) {
if (mustAbort(a) === false) {
return;
}
cValue = a;
},
init(v) {
if (mustAbort(v)) {
return false;
}
//
this.v = v;
return true;
},
});
//
return;
}
//
const prop = chain.slice(0, pos);
const v = owner[prop];
//
chain = chain.slice(pos + 1);
if (v instanceof Object || (typeof v === 'object' && v !== null)) {
trapChain(v, chain);
return;
}
//
trapProp(owner, prop, true, {
v: undefined,
getter() {
return this.v;
},
setter(a) {
this.v = a;
if (a instanceof Object) {
trapChain(a, chain);
}
},
init(v) {
this.v = v;
return true;
},
});
};
//
trapChain(window, chain);
});
};

View File

@ -1,5 +0,0 @@
export const blockers = {
WithBlocklists: 'With blocklists',
InPlayer: 'In player',
AdSpeedup: 'Ad speedup',
} as const;

View File

@ -1,13 +0,0 @@
import { inject } from 'simple-youtube-age-restriction-bypass';
import { createPlugin } from '@/utils';
import { t } from '@/i18n';
export default createPlugin({
name: () => t('plugins.bypass-age-restrictions.name'),
description: () => t('plugins.bypass-age-restrictions.description'),
restartNeeded: true,
// See https://github.com/organization/Simple-YouTube-Age-Restriction-Bypass#userscript
renderer: () => inject(),
});

View File

@ -1,3 +0,0 @@
declare module 'simple-youtube-age-restriction-bypass' {
export const inject: () => void;
}

View File

@ -126,6 +126,7 @@ export const onMainLoad = async ({
yt = await Innertube.create({
cache: new UniversalCache(false),
player_id: '0004de42',
cookie: await getCookieFromWindow(win),
generate_session_locally: true,
fetch: getNetFetchAsFetch(),

View File

@ -1,26 +0,0 @@
import style from './style.css?inline';
import { createPlugin } from '@/utils';
import { t } from '@/i18n';
export default createPlugin({
name: () => t('plugins.no-google-login.name'),
description: () => t('plugins.no-google-login.description'),
restartNeeded: true,
config: {
enabled: false,
},
stylesheets: [style],
renderer() {
const elementsToRemove = [
'.sign-in-link.ytmusic-nav-bar',
'.ytmusic-pivot-bar-renderer[tab-id="FEmusic_liked"]',
];
for (const selector of elementsToRemove) {
const node = document.querySelector(selector);
if (node) {
node.remove();
}
}
},
});

View File

@ -1,6 +0,0 @@
.ytmusic-pivot-bar-renderer[tab-id='FEmusic_liked'],
ytmusic-guide-signin-promo-renderer,
a[href='/music_premium'],
.sign-in-link {
display: none !important;
}