Compare commits

...

1740 Commits

Author SHA1 Message Date
9eeb1c986a release 3.3.2 2024-02-20 20:59:48 +09:00
d37cd2418c fix: fix bugs in MPRIS, and improve MPRIS (#1760)
Co-authored-by: JellyBrick <shlee1503@naver.com>
Co-authored-by: Totto <32566573+Totto16@users.noreply.github.com>
2024-02-20 20:50:55 +09:00
8bd05f525d chore(deps): rollback dependency electron-builder to v24.9.1 2024-02-20 15:24:27 +09:00
47b23b414c chore(deps): update dependency electron-builder to v24.13.1 2024-02-20 14:43:04 +09:00
6f70d179c7 fix: fixed an issue that caused infinite loops when using Music Together
fix #1752
2024-02-20 12:57:49 +09:00
62a86e9267 fix(deps): update dependency electron-updater to v6.1.8 (#1770)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-20 12:55:26 +09:00
6358a2d0b1 chore(deps): update dependency electron-builder to v24.12.0 (#1771)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-20 12:55:17 +09:00
273633c2ce chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (342 of 342 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2024-02-20 04:15:04 +01:00
8b1209ef73 chore(i18n): Translated using Weblate (Italian)
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2024-02-20 03:55:03 +01:00
47505e9748 chore(i18n): Translated using Weblate (German)
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2024-02-20 03:55:03 +01:00
5178cc6bd8 feat(scrobblers): use BrowserWindow instead of shell.openExternal (#1758) 2024-02-20 11:54:57 +09:00
d9a27fff42 chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.0.2 (#1763)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-20 11:54:37 +09:00
9e6560b814 chore(i18n): Translated using Weblate (Italian)
Currently translated at 99.7% (339 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2024-02-19 19:01:59 +01:00
afdb19a742 chore(deps): update dependency esbuild to v0.20.1 (#1759)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-19 18:23:04 +09:00
0ae5b668f5 fix(in-app-menu): default config 2024-02-19 17:06:01 +09:00
10533e28fa fix: error.html path 2024-02-19 16:53:32 +09:00
6189e67819 fix(deps): update dependency i18next to v23.9.0 (#1754)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-19 14:29:22 +09:00
f9ad505e40 fix: scrobbler migration 2024-02-19 14:27:24 +09:00
9b011101ed Update changelog for v3.3.1 2024-02-18 12:43:37 +00:00
a6ed8bf3aa release 3.3.1 (HOTFIX) 2024-02-18 21:36:04 +09:00
87acf4cf04 hotfix: in-app-menu position issue 2024-02-18 21:35:41 +09:00
b6fe2afd75 chore: Update README.md 2024-02-18 20:57:38 +09:00
6d9bb8eb1c Update changelog for v3.3.0 2024-02-18 11:40:17 +00:00
192fd0620f release 3.3.0 2024-02-18 20:32:45 +09:00
00d0b31980 fix(scrobbler): remove snake_case 2024-02-18 20:21:19 +09:00
5edb2131d2 fix(in-app-menu): implement auto close 2024-02-18 20:00:52 +09:00
4657aeca45 fix: apply fix from eslint 2024-02-18 11:58:26 +09:00
9f5651a8ba fix: fix upgrade button
fix #1199
2024-02-18 10:50:36 +09:00
570dcfee29 fix: revert fbc02a494a 2024-02-18 10:50:15 +09:00
2c130ce80d chore(mpris): use override keyword 2024-02-18 10:34:29 +09:00
8457115105 fix(mpris): fix mpris invalid position
- fix #1726
2024-02-18 10:26:45 +09:00
fbc02a494a fix(in-app-menu): simplified if-statement 2024-02-18 09:50:20 +09:00
7e2c254ecf fix(in-app-menu): should be disabled by default in linux env 2024-02-18 09:47:05 +09:00
11936a889e fix(deps): update dependency i18next to v23.8.3 (#1751)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-18 07:33:35 +09:00
f33970addd import fixed ./constants (#1748) 2024-02-18 07:33:11 +09:00
2c02b7193d chore(deps): update dependency rollup to v4.12.0 (#1743)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-17 10:08:33 +09:00
3f80b598ae chore(deps): bump undici from 5.28.2 to 5.28.3 (#1747)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 10:07:19 +09:00
477068ed49 chore(deps): update dependency vite to v5.1.3 (#1742)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-16 08:44:31 +09:00
b4083874ac fix: invalid podcast artist name
🤦
2024-02-16 08:41:00 +09:00
c5d0673b2f chore(deps): update dependency vite-plugin-solid to v2.10.1 (#1734)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-15 22:32:18 +09:00
9ccc44474b chore(deps): update dependency discord-api-types to v0.37.70 (#1740)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-15 22:31:50 +09:00
98e341f122 chore(deps): update dependency electron to v28.2.3 (#1736)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-15 22:29:11 +09:00
b23eba51dd chore(deps): update pnpm to v8.15.3 (#1739)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-15 22:28:47 +09:00
980005a58c chore(deps): update dependency rollup to v4.11.0 (#1738)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-15 22:28:41 +09:00
aba58b1d34 fix(deps): update dependency solid-js to v1.8.15 (#1735)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-15 22:28:17 +09:00
bb6a127d22 chore(deps): update dependency vite to v5.1.2 (#1733)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-15 20:32:18 +09:00
ac6e30a6b6 chore(i18n): Translated using Weblate (Polish)
Currently translated at 98.2% (334 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2024-02-14 19:01:58 +01:00
3f23282eed chore(deps): update dependency vite-plugin-solid to v2.10.0 (#1732)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-14 20:36:09 +09:00
199a77819c chore(deps): update pnpm to v8.15.2 (#1729)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-14 01:16:33 +09:00
89a53b2854 Update Copyright - 2024 (#1730) 2024-02-14 01:06:26 +09:00
c57bf79b08 chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2024-02-12 23:42:44 +01:00
eabb3392b4 fix: discord RPC (fix #1664) 2024-02-13 07:41:32 +09:00
c78cc3a38d chore(deps): update dependency @typescript-eslint/eslint-plugin to v7 (#1728)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-13 07:10:13 +09:00
011ffd538b fix(deps): update dependency @floating-ui/dom to v1.6.3 (#1727)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-13 06:41:43 +09:00
f386576196 chore(deps): update dependency electron to v28.2.2 (#1717)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-12 05:07:22 +09:00
bab3526f0f chore(deps): update dependency vite to v5.1.1 (#1718)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-12 05:07:14 +09:00
115923b422 chore(deps): update dependency @types/semver to v7.5.7 (#1724)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-12 05:07:07 +09:00
fefa8c8750 fix(deps): update dependency @floating-ui/dom to v1.6.2 (#1725)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-12 05:07:01 +09:00
3aa80c0f01 chore(i18n): Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2024-02-11 04:02:12 +01:00
aea219994a chore(deps): update dependency rollup to v4.10.0 (#1719)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-11 00:36:55 +09:00
74e22ccecd chore(i18n): Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2024-02-09 17:44:03 +01:00
db09cf5ffb chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 58.8% (200 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2024-02-07 14:01:55 +01:00
cc1d13f203 chore(i18n): Translated using Weblate (Spanish)
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2024-02-07 14:01:54 +01:00
0cd1ce6a79 fix(deps): update dependency solid-js to v1.8.14 (#1713)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-06 18:00:05 +09:00
95254fc2ff chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.21.0 (#1711) 2024-02-06 05:20:13 +09:00
205376aadf fix(deps): update dependency semver to v7.6.0 (#1712) 2024-02-06 05:20:04 +09:00
6f057bfbfc fix(in-app-menu): remove unused style 2024-02-06 03:09:16 +09:00
bb39481666 fix(plugins): fix many bugs (in-app-menu, album-color-theme, blur-nav-bar) 2024-02-06 02:02:08 +09:00
ddb9968195 fix: workarounds for region restrict 2024-02-06 01:30:36 +09:00
a309729fa4 fix: revert electron version to v28 2024-02-06 01:30:09 +09:00
ba7e065ba6 fix: remove sign-in button (fix #1199) 2024-02-06 00:34:43 +09:00
ee05893d4c feat(album-color-theme): change nav-bar style 2024-02-06 00:00:32 +09:00
febc63edef fix(in-app-menu): fix app crash in production 2024-02-05 23:14:00 +09:00
b3c05c8647 refactor(in-app-menu): refactor in-app-menu plugin (#1710)
Co-authored-by: JellyBrick <shlee1503@naver.com>
2024-02-05 22:26:25 +09:00
cd8701d0e5 chore(i18n): Translated using Weblate (Ukrainian)
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2024-02-05 02:02:48 +01:00
3b41edb62d chore(i18n): Translated using Weblate (Japanese)
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2024-02-05 02:02:38 +01:00
ab3b8495df chore(i18n): Translated using Weblate (Czech)
Currently translated at 89.7% (305 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2024-02-05 02:02:37 +01:00
b04cd79bcf chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 52.0% (177 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2024-02-02 15:01:47 +01:00
c864e5764a chore(i18n): Translated using Weblate (Turkish)
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2024-02-02 15:01:47 +01:00
1f71df6c41 chore(i18n): Translated using Weblate (Russian)
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2024-02-02 15:01:47 +01:00
0decda57ab chore(deps): update playwright monorepo to v1.41.2 (#1706)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-02 17:47:46 +09:00
5bfd3a4562 chore(deps): update dependency electron to v29.0.0-beta.5 (#1707)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-02 17:47:36 +09:00
d4af820ae8 chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (340 of 340 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2024-02-01 14:50:56 +01:00
3ec25b7779 chore(i18n): Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (338 of 338 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2024-02-01 14:12:03 +01:00
a9ee12b05e chore(i18n): Translated using Weblate (Turkish)
Currently translated at 100.0% (338 of 338 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2024-02-01 14:12:03 +01:00
a612d1c1fd feat(album-color-theme): support album color theme in all pages (#1685) 2024-02-01 22:11:57 +09:00
fb48d24e0d fix(deps): update dependency youtubei.js to v9.0.2 (#1704)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 15:55:16 +09:00
38d19d9ea7 fix(deps): update dependency i18next to v23.8.2 (#1702)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-01 01:55:17 +09:00
4950abc399 fix(PiP): fix multiple handler 2024-01-31 18:40:36 +09:00
e3ad804dc4 feat: Support disabling scrobbling for non-music content (#1665)
Co-authored-by: JellyBrick <shlee1503@naver.com>
2024-01-31 17:41:55 +09:00
A L
f2f15bc3cc chore(i18n): Translated using Weblate (Bulgarian)
Currently translated at 5.0% (17 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/bg/
2024-01-30 23:01:21 +01:00
4624a1022a fix(deps): update dependency youtubei.js to v9 (#1682)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-30 19:04:03 +09:00
A L
cc169da6d4 chore(i18n): Added translation using Weblate (Bulgarian) 2024-01-30 10:10:26 +01:00
c58ed21661 chore(deps): update dependency electron to v29.0.0-beta.4 (#1698)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-30 09:16:36 +09:00
c483733bc3 fix(deps): update dependency i18next to v23.8.1 (#1694)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-30 09:13:41 +09:00
9738f2f6ae chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.20.0 (#1700)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-30 09:10:18 +09:00
ecdd8eb9f6 chore(deps): update pnpm to v8.15.1 (#1699)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-30 09:10:06 +09:00
47e2052ce0 chore(i18n): Translated using Weblate (Russian)
Currently translated at 100.0% (337 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2024-01-29 19:07:33 +01:00
a34eb31d9c chore(i18n): Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (337 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2024-01-29 18:47:29 +01:00
c03cab179e chore(i18n): Translated using Weblate (Russian)
Currently translated at 88.7% (299 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2024-01-29 18:47:29 +01:00
0d61cf906d Fix #1617
Remove duplicated call of `titleBar.appendChild(logo);`.
2024-01-29 14:50:41 +02:00
b3c1aa6b4b chore(deps): update dependency esbuild to v0.20.0 (#1691)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-28 07:07:22 +09:00
4904620ce6 chore(deps): update pnpm to v8.15.0 (#1692)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-28 07:07:09 +09:00
feaccb593d fix(deps): update dependency i18next to v23.7.20 (#1684)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-27 18:29:12 +09:00
9ad2baea59 chore(deps): update dependency electron to v29.0.0-beta.3 (#1683)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-27 18:29:01 +09:00
df77086039 chore(deps): update dependency electron to v29.0.0-beta.2 (#1681)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-26 09:45:16 +09:00
ceb844473a chore(deps): update dependency rollup to v4.9.6 (#1663)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-26 09:44:12 +09:00
a0932b0dc4 chore(i18n): Translated using Weblate (Italian)
Currently translated at 100.0% (337 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2024-01-25 23:01:50 +01:00
0be37716ef chore(deps): update dependency electron to v29.0.0-beta.1 (#1670) 2024-01-26 00:17:06 +09:00
c07b05a7be fix(deps): update dependency i18next to v23.7.19 (#1680) 2024-01-26 00:16:55 +09:00
94b1da9db0 chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.19.1 (#1669) 2024-01-26 00:16:28 +09:00
5fa7a1273f chore(deps): update pnpm to v8.14.3 (#1668) 2024-01-26 00:16:18 +09:00
cf9088785b chore(deps): update dependency vite-plugin-inspect to v0.8.3 (#1672) 2024-01-26 00:15:44 +09:00
adf3e3150e chore(deps): update dependency esbuild to v0.19.12 (#1673) 2024-01-26 00:13:11 +09:00
dbeb63018e fix(deps): update dependency @electron/remote to v2.1.2 (#1676) 2024-01-26 00:12:55 +09:00
51a39d240c chore: Update issue templates (#1661)
* Update bug_report.yml

* Update feature_request.yml

* Update bug_report.yml
2024-01-26 00:08:39 +09:00
4061f8e0e6 chore(i18n): Translated using Weblate (Japanese)
Currently translated at 100.0% (337 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2024-01-24 14:01:53 +01:00
d32e60249a chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 52.5% (177 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2024-01-23 08:01:49 +01:00
b84a1e43af chore(i18n): Translated using Weblate (Thai)
Currently translated at 18.3% (62 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/th/
2024-01-23 08:01:48 +01:00
f5c22b63aa chore(i18n): Translated using Weblate (French)
Currently translated at 83.6% (282 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2024-01-23 08:01:47 +01:00
41700799c7 chore(i18n): Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (337 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2024-01-22 07:01:47 +01:00
b15b421975 chore(i18n): Translated using Weblate (Japanese)
Currently translated at 92.5% (312 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2024-01-22 07:01:47 +01:00
cca4de8684 chore(deps): update playwright monorepo to v1.41.1 (#1660)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-21 12:46:32 +09:00
946c2790c4 fix(deps): update dependency i18next to v23.7.18 (#1662)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-21 12:46:15 +09:00
3a033f1bab chore(deps): update actions/dependency-review-action action to v4 (#1654)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-21 12:44:10 +09:00
67a04a2840 chore(deps): update dependency electron to v29.0.0-alpha.11 (#1656)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-21 12:43:57 +09:00
dd48e46854 chore(deps): update dependency vite to v5.0.12 [security] (#1659)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-21 12:43:17 +09:00
99edb15c77 chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 32.6% (110 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2024-01-21 04:29:51 +01:00
8503afeac7 chore(i18n): Translated using Weblate (Japanese)
Currently translated at 85.7% (289 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2024-01-21 04:29:50 +01:00
0528637135 chore(i18n): Translated using Weblate (Vietnamese)
Currently translated at 99.4% (335 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/vi/
2024-01-19 09:00:21 +01:00
bf20a2b3be chore(i18n): Translated using Weblate (German)
Currently translated at 99.4% (335 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2024-01-19 09:00:19 +01:00
0db55ce4f3 fix(deps): update dependency async-mutex to v0.4.1 (#1653)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-18 17:40:11 +09:00
21347e9d0a chore(i18n): Translated using Weblate (Vietnamese)
Currently translated at 43.3% (146 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/vi/
2024-01-17 16:06:28 +01:00
4333a25c31 chore(i18n): Translated using Weblate (Ukrainian)
Currently translated at 100.0% (337 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2024-01-17 16:06:26 +01:00
5b20e491bd chore(i18n): Translated using Weblate (Turkish)
Currently translated at 100.0% (337 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2024-01-17 16:06:25 +01:00
bc05f5849d chore(i18n): Translated using Weblate (Spanish)
Currently translated at 100.0% (337 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2024-01-17 16:06:25 +01:00
b1046bc28d chore(deps): update playwright monorepo to v1.41.0 (#1651)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-17 11:31:10 +09:00
d5ab36f42e fix(crossfade): fix #1633 2024-01-16 22:38:05 +09:00
922d78dcee fix: notification close 2024-01-16 21:14:37 +09:00
de6506e6b4 fix: notification closing 2024-01-16 21:13:07 +09:00
9d136c8dd5 fix: apply fix from eslint 2024-01-16 21:02:55 +09:00
26de7f940e fix: fix #1621 2024-01-16 20:34:00 +09:00
7c404ba2ea chore(song-info): fix typo 2024-01-16 19:14:16 +09:00
96d2a72bfa chore(song-info): change from array to Set
change from `array` to `Set` to prevent the duplicate callback from being stored
2024-01-16 19:13:35 +09:00
10f41bddad fix(i18n): use dash (-) instead of under-bar (_) 2024-01-16 17:36:48 +09:00
39d2f3ec80 chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (337 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2024-01-16 09:33:15 +01:00
512b446a3d chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (337 of 337 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2024-01-16 09:33:15 +01:00
c9b96f0488 fix(tuna-obs): partially fix #1596 2024-01-16 17:27:27 +09:00
c84ea257d5 fix: os-specific plugin 2024-01-16 17:14:02 +09:00
6512f5ad2a fix(discord): fix hide duration button
fix #1644

Thanks to @DronovasP
2024-01-16 16:41:23 +09:00
e5d0eced5d fix(store): remove duplicated if-statement 2024-01-16 16:40:06 +09:00
f424ee5170 feat: Better Scrobbler Plugin (#1640)
Co-authored-by: JellyBrick <shlee1503@naver.com>
2024-01-16 16:36:27 +09:00
ea0f6c401d chore(deps): update dependency electron to v29.0.0-alpha.10 (#1645)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-16 14:34:05 +09:00
5c5f51b3de chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.19.0 (#1643)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-16 12:52:28 +09:00
7caf02ebba chore(i18n): Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2024-01-16 04:06:12 +01:00
f6a444b970 chore(i18n): Translated using Weblate (Russian)
Currently translated at 73.1% (242 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2024-01-15 02:26:24 +01:00
d19a36b44f chore(i18n): Translated using Weblate (Polish)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2024-01-15 02:26:23 +01:00
aacb126fb5 chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2024-01-15 02:26:23 +01:00
5adf45cde2 chore(i18n): Translated using Weblate (Italian)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2024-01-15 02:26:23 +01:00
0980aad060 chore(i18n): Translated using Weblate (Spanish)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2024-01-15 02:26:23 +01:00
069e5ac8b8 chore(README): Fix plugins names and add plugins in/to Readme (in menu too) (#1624) 2024-01-14 14:50:40 +09:00
b5f6762997 chore(i18n): Translated using Weblate (Polish)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2024-01-14 06:50:01 +01:00
c2abfe4b41 chore(i18n): Translated using Weblate (Polish)
Currently translated at 91.2% (302 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2024-01-13 13:43:07 +01:00
3964d03a3b fix: apply fix for album-actions 2024-01-13 17:28:12 +09:00
a82c4ce499 fix(album-actions): Fixed album actions (#1639) 2024-01-13 17:08:51 +09:00
2f54fa19e6 fix(yt-music bugs): fix margin in video mode 2024-01-13 12:35:54 +09:00
aacb4b3147 fix(deps): update dependency @xhayper/discord-rpc to v1.1.2 2024-01-13 10:10:32 +09:00
60980251f2 chore: update pnpm-lock 2024-01-13 10:07:55 +09:00
f8e55f95df fix(yt-music bugs): fixed a weird margin-bottom issue when using YouTube Premium 2024-01-13 10:02:18 +09:00
bebd232af0 chore(deps): update playwright monorepo to v1.41.0-beta-1705101589000 (#1638)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-13 09:08:02 +09:00
1a89fbe612 fix(#1543): fix song control doesn't work (#1637)
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2024-01-13 09:06:41 +09:00
e73584c2aa feat(issue-template): add checklist 2024-01-13 07:34:00 +09:00
96a713074f chore(deps): update playwright monorepo to v1.41.0-beta-1705092460000 (#1635)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-13 07:20:59 +09:00
aedfa4ca06 chore(deps): update dependency rollup to v4.9.5 (#1629)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-13 07:17:58 +09:00
ac187f722b chore(i18n): Translated using Weblate (Vietnamese)
Currently translated at 29.6% (98 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/vi/
2024-01-12 23:16:48 +01:00
cd87642384 chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 4.5% (15 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2024-01-12 23:16:48 +01:00
4a736d3211 chore(i18n): Translated using Weblate (Thai)
Currently translated at 1.2% (4 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/th/
2024-01-12 23:16:48 +01:00
e586940c57 chore(i18n): Translated using Weblate (Portuguese)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt/
2024-01-12 23:16:47 +01:00
ab36a21583 chore(i18n): Translated using Weblate (French)
Currently translated at 86.4% (286 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2024-01-12 23:16:47 +01:00
c0c1c3b626 chore(i18n): Translated using Weblate (German)
Currently translated at 91.5% (303 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2024-01-12 23:16:47 +01:00
918bd7fdb1 chore(deps): update dependency electron to v29.0.0-alpha.9 (#1627)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-12 11:57:43 +09:00
971d1a5776 chore(i18n): Translated using Weblate (Vietnamese)
Currently translated at 16.9% (56 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/vi/
2024-01-11 18:06:13 +01:00
1235d46e73 chore(i18n): Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2024-01-11 18:06:13 +01:00
451b98833b chore(i18n): Translated using Weblate (Portuguese)
Currently translated at 99.3% (329 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt/
2024-01-11 18:06:12 +01:00
48f9be9712 chore(i18n): Translated using Weblate (Italian)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2024-01-11 18:06:12 +01:00
fd8d59bada chore: update pnpm-lock 2024-01-11 08:47:46 +09:00
99ce0b7f9c chore(deps): update dependency electron to v29.0.0-alpha.8 (#1608)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-11 08:08:37 +09:00
88ace9ab35 fix(deps): update dependency @cliqz/adblocker-electron to v1.26.15 (#1615)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-11 08:06:41 +09:00
63b0ea60e4 chore(deps): update dependency rollup to v4.9.4 (#1591)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-11 08:02:31 +09:00
b4ecf0f935 fix(deps): update dependency @cliqz/adblocker-electron-preload to v1.26.15 (#1616)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-11 08:02:10 +09:00
c846f18086 chore(deps): update pnpm to v8.14.1 (#1619)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-11 08:02:03 +09:00
8a851b06f9 chore(deps): update dependency eslint-plugin-prettier to v5.1.3 (#1618)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-10 14:36:19 +09:00
5484dc8bd1 chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.18.1 (#1612)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-09 19:36:07 +09:00
6c47ac36e3 fix(deps): update dependency youtubei.js to v8.2.0 (#1614)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-09 19:31:02 +09:00
3554496803 chore(deps): update dependency electron-vite to v2.0.0 (#1609)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-09 19:30:50 +09:00
b8a197615e chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.18.0 (#1603)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-08 23:22:16 +09:00
2ed949920f chore(i18n): Translated using Weblate (Ukrainian)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2024-01-08 14:06:18 +00:00
d76f4dade3 chore(i18n): Translated using Weblate (Ukrainian)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2024-01-08 14:06:17 +00:00
aacd01ce7c chore(i18n): Translated using Weblate (Ukrainian)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2024-01-08 14:06:16 +00:00
d501b016fc chore(i18n): Translated using Weblate (Turkish)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2024-01-08 14:06:14 +00:00
b1503cfb87 chore(deps): update dependency electron-vite to v2.0.0-beta.4 (#1602)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-07 04:19:01 +09:00
8a004ae9dd chore(i18n): Translated using Weblate (Spanish)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2024-01-06 18:06:15 +01:00
de709cc7c9 fix: download/pip button for podcast video 2024-01-06 11:05:15 +09:00
6b7c43925a feat: rename IPC 2024-01-06 10:17:40 +09:00
5d5cc58f59 chore(tuna-obs): set keepAlive to true for reuse TCP socket 2024-01-06 09:37:47 +09:00
3e6bab7f15 fix(in-app-menu): fix invalid margin-top
fix #1597
2024-01-06 09:15:57 +09:00
7e17a8b73b fix(README): fix plugins path
fix #1598
2024-01-06 09:03:42 +09:00
129b798d8f chore(README): add demo image 2024-01-06 06:00:07 +09:00
a3a411e197 fix(config): fix duplicated array value 2024-01-06 01:07:57 +09:00
6e6acd6f19 Update changelog for v3.2.2 2024-01-05 14:44:33 +00:00
34cb79eeaf Bump version to 3.2.2 2024-01-05 23:33:42 +09:00
1c30a07031 chore(deps): update dependency playwright to v1.41.0-alpha-jan-5-2024 2024-01-05 23:30:16 +09:00
5dd5f41ef5 chore(deps): update dependency electron to v29.0.0-alpha.7
Change to electron v29 to use node.js v20.
2024-01-05 23:28:24 +09:00
45a3c11d51 chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (331 of 331 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2024-01-05 14:24:44 +00:00
8bd3b4d3f0 fix(visualizer): fixed an issue with audio getting unusually loud 2024-01-05 23:23:39 +09:00
4e3cb5806d fix(music-together): modernize code 2024-01-05 23:11:26 +09:00
6563eb4ddd chore(i18n): Translated using Weblate (Spanish)
Currently translated at 100.0% (330 of 330 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2024-01-05 14:02:12 +00:00
895386f6f8 fix(music-together): typing 2024-01-05 23:01:55 +09:00
3810955e56 fix(skip-silences): fix audio distorted
fix #1141
2024-01-05 21:58:36 +09:00
59c521e53f fix: download button not working 2024-01-05 21:04:52 +09:00
25d266f8f9 feat(tray): Add song info and paused icon (#1592) 2024-01-05 20:56:47 +09:00
0c3c380591 chore(deps): update dependency rollup to v4.9.3 2024-01-05 20:56:17 +09:00
a20cfa30a1 chore(deps): update dependency vite to v5.0.11 2024-01-05 20:43:13 +09:00
fefe899393 chore(i18n): Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2024-01-05 11:12:50 +01:00
55759e8d7a chore(i18n): Translated using Weblate (Italian)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2024-01-05 11:12:50 +01:00
ddb561937f fix(deps): update dependency i18next to v23.7.16 2024-01-04 22:41:16 +09:00
198cb71a4c chore(deps): update dependency electron to v28.1.1 2024-01-04 22:38:45 +09:00
c34b880752 chore(deps): update dependency electron-vite to v2.0.0-beta.3 2024-01-04 22:38:30 +09:00
76944e3e41 fix(deps): update dependency i18next to v23.7.14 2024-01-03 17:35:30 +09:00
68cd76f2af chore(deps): update pnpm to v8.14.0 2024-01-03 17:35:23 +09:00
81145b52b7 fix(#1580): fix NEW badge doesn't show 2024-01-03 15:02:29 +09:00
2a19dab061 chore(i18n): Translated using Weblate (Vietnamese)
Currently translated at 3.3% (11 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/vi/
2024-01-02 10:52:22 +01:00
6958d59d4f chore(i18n): Translated using Weblate (Lithuanian)
Currently translated at 89.6% (294 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/lt/
2024-01-02 09:49:04 +01:00
8a51dfad87 chore(i18n): Translated using Weblate (Chinese (Simplified))
Currently translated at 89.6% (294 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2024-01-02 09:49:04 +01:00
5bb4d9efbe chore(i18n): Translated using Weblate (Turkish)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2024-01-02 09:49:04 +01:00
927aa5f24b chore(i18n): Translated using Weblate (Portuguese)
Currently translated at 89.6% (294 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt/
2024-01-02 09:49:03 +01:00
d695bc93a1 chore(i18n): Translated using Weblate (Polish)
Currently translated at 89.3% (293 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2024-01-02 09:49:03 +01:00
b05fb4ccbe chore(i18n): Translated using Weblate (Norwegian Bokmål)
Currently translated at 67.9% (223 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nb_NO/
2024-01-02 09:49:03 +01:00
299eb7e7d6 chore(i18n): Translated using Weblate (Italian)
Currently translated at 89.3% (293 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2024-01-02 09:49:03 +01:00
ae26333224 chore(i18n): Translated using Weblate (French)
Currently translated at 85.9% (282 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2024-01-02 09:49:03 +01:00
35176469b0 chore(i18n): Translated using Weblate (Spanish)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2024-01-02 09:49:03 +01:00
4e74f9cbc5 chore(i18n): Translated using Weblate (Czech)
Currently translated at 94.8% (311 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2024-01-02 09:49:02 +01:00
4091b36f36 chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2024-01-02 09:49:02 +01:00
b3f805fce6 chore(i18n): Translated using Weblate (Vietnamese)
Currently translated at 2.4% (8 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/vi/
2024-01-02 09:43:14 +01:00
b129a3e8d8 chore(i18n): Translated using Weblate (Chinese (Simplified))
Currently translated at 89.9% (295 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2024-01-02 09:43:13 +01:00
64ea1fdb58 chore(i18n): Translated using Weblate (Turkish)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2024-01-02 09:43:13 +01:00
8fcf59ed0a chore(i18n): Translated using Weblate (Spanish)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2024-01-02 09:43:12 +01:00
9811ca63de chore(i18n): Translated using Weblate (Czech)
Currently translated at 94.8% (311 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2024-01-02 09:43:12 +01:00
9028f88299 chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2024-01-02 09:43:12 +01:00
fd47766d93 chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.17.0 2024-01-02 17:34:04 +09:00
26b12c7208 chore(i18n): Added translation using Weblate (Vietnamese) 2024-01-02 07:19:07 +01:00
8da9b3454d chore(deps): update dependency esbuild to v0.19.11 2024-01-01 20:32:13 +09:00
205cbefc83 Update changelog for v3.2.1 2024-01-01 00:32:24 +00:00
0e94c72eef Bump version to 3.2.1 2024-01-01 09:22:46 +09:00
c055641351 chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2024-01-01 01:19:52 +01:00
c0a3aa99de chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2024-01-01 01:19:52 +01:00
8a8976acef chore(i18n): Translated using Weblate (Czech)
Currently translated at 94.8% (311 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2024-01-01 01:06:02 +01:00
e409165e1b chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2024-01-01 01:06:02 +01:00
b278140796 chore(i18n): Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/
2024-01-01 01:01:00 +01:00
397056a54d chore(i18n): Translated using Weblate (Turkish)
Currently translated at 26.5% (87 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2024-01-01 01:01:00 +01:00
edecd65419 chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (328 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2024-01-01 01:01:00 +01:00
4d2d0b7bd6 chore(i18n): Translated using Weblate (Czech)
Currently translated at 85.6% (281 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2024-01-01 01:01:00 +01:00
0ca4e34efd chore(i18n): Translated using Weblate (Czech)
Currently translated at 85.6% (281 of 328 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2024-01-01 01:00:59 +01:00
43f3226c3a fix: fix #1574 2024-01-01 08:36:48 +09:00
0a6dbecc05 fix: fix #1575 2024-01-01 08:36:22 +09:00
f5aa179cd6 chore(i18n): Translated using Weblate
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: inson1 <vaclav.svarc01@seznam.cz>
Co-authored-by: Anonymous <noreply@weblate.org>
2024-01-01 04:53:59 +09:00
3140e91dda Update changelog for v3.2.0 2023-12-31 16:31:59 +00:00
022f8ff65c Merge branch 'master' of https://github.com/th-ch/youtube-music 2024-01-01 01:23:01 +09:00
5e63cc2e89 Bump version to 3.2.0 2024-01-01 01:22:48 +09:00
880ed99846 Revert "fix(deps): update dependency @xhayper/discord-rpc to v1.1.2"
This reverts commit 050d55c736.
2024-01-01 00:34:49 +09:00
222e78c85b fix(in-app-menu): fix in-app-menu tooltip position 2023-12-31 23:48:01 +09:00
050d55c736 fix(deps): update dependency @xhayper/discord-rpc to v1.1.2 2023-12-31 23:40:26 +09:00
13ef8560ff fix: pnpm build error 2023-12-31 23:40:09 +09:00
78d990c079 feat(album-color-theme): improve Album Color Theme style (#1571) 2023-12-31 23:04:44 +09:00
4d3e2c09da feat(menu): add more detail in Menu (#1570) 2023-12-31 20:56:24 +09:00
aa899d247a chore(plugins): change default config album-actions, music-together 2023-12-31 13:56:42 +09:00
ee0c512529 feat(music-together): Add new plugin Music Together (#1562)
* feat(music-together): test `peerjs`

* feat(music-together): replace `prompt` to `custom-electron-prompt`

* fix(music-together): fix

* test fix

* wow

* test

* feat(music-together): improve `onStart`

* fix: adblocker

* fix(adblock): fix crash with `peerjs`

* feat(music-together): add host UI

* feat(music-together): implement addSong, removeSong, syncQueue

* feat(music-together): inject panel

* feat(music-together): redesign music together panel

* feat(music-together): sync queue, profile

* feat(music-together): sync progress, song, state

* fix(music-together): fix some bug

* fix(music-together): fix sync queue

* feat(music-together): support i18n

* feat(music-together): improve sync queue

* feat(music-together): add profile in music item

* refactor(music-together): refactor structure

* feat(music-together): add permission

* fix(music-together): fix queue sync bug

* fix(music-together): fix some bugs

* fix(music-together): fix permission not working on guest mode

* fix(music-together): fix queue sync relate bugs

* fix(music-together): fix automix items not append using music together

* fix(music-together): fix

* feat(music-together): improve video injection

* fix(music-together): fix injection code

* fix(music-together): fix broadcast guest

* feat(music-together): add more permission

* fix(music-together): fix injector

* fix(music-together): fix guest add song logic

* feat(music-together): add popup close listener

* fix(music-together): fix connection issue

* fix(music-together): fix connection issue 2

* feat(music-together): reserve playlist

* fix(music-together): exclude automix songs

* fix(music-together): fix playlist index sync bug

* fix(music-together): fix connection failed error and sync index

* fix(music-together): fix host set index bug

* fix: apply fix from eslint

* feat(util): add `ImageElementFromSrc`

* chore(util): update jsdoc

* feat(music-together): add owner name

* chore(music-together): add translation

* feat(music-together): add progress sync

* chore(music-together): remove `console.log`

---------

Co-authored-by: JellyBrick <shlee1503@naver.com>
2023-12-31 13:52:15 +09:00
5f9b522307 chore(deps): update dependency rollup to v4.9.2 (#1567)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-31 04:05:49 +09:00
c207e29980 fix(deps): update dependency i18next to v23.7.13 (#1569)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-31 04:05:44 +09:00
df4d2d6b72 chore(ambient-mode): remove console.log 2023-12-31 02:28:31 +09:00
c3dd20cabd chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (296 of 296 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-30 17:09:06 +00:00
7a6db95d1a chore(i18n): Translated using Weblate (Czech)
Currently translated at 80.4% (238 of 296 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-30 17:09:05 +00:00
bc6825d63b chore(i18n): Translated using Weblate (Czech)
Currently translated at 76.8% (226 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-29 16:14:02 +01:00
5e79e9e0f2 feat: Add new plugin Album actions (#1515)
Co-authored-by: JellyBrick <shlee1503@naver.com>
2023-12-30 00:13:56 +09:00
5e303c2ba8 fix(deps): update dependency i18next to v23.7.12 (#1564)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-29 22:26:41 +09:00
0bd9c16356 fix: Only apply scale factor on Windows (#1565) 2023-12-29 22:26:24 +09:00
f0f5d9da2f feat(ambient-mode): support ambient mode on Song section
resolve #1555
2023-12-29 21:46:27 +09:00
TC
f46c431f4c Move cask definition to separate repo 2023-12-29 11:26:55 +01:00
62410e9ee2 feat(in-app-menu): add show on hover 2023-12-29 17:52:31 +09:00
46f76f1408 chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 3.7% (11 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2023-12-27 18:20:59 +01:00
5e071e16d8 chore(i18n): Translated using Weblate (Turkish)
Currently translated at 29.2% (86 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2023-12-27 18:20:58 +01:00
c0238588bd chore(i18n): Translated using Weblate (Russian)
Currently translated at 78.5% (231 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-27 18:20:58 +01:00
Nik
30002d660a chore(i18n): Translated using Weblate (Russian)
Currently translated at 78.5% (231 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-27 18:20:58 +01:00
48eeb6bca3 fix: picture-in-picture icon 2023-12-28 02:17:42 +09:00
e67699fed5 fix: fixed an issue with the download button disappearing
- resolve #1551
2023-12-28 02:08:03 +09:00
8aeae45965 chore(i18n): Translated using Weblate (Ukrainian)
Currently translated at 77.2% (227 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2023-12-27 13:09:36 +01:00
ce7491941b chore(i18n): Translated using Weblate (Russian)
Currently translated at 74.8% (220 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-27 13:09:36 +01:00
1dce03c4f2 chore(i18n): Translated using Weblate (Polish)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2023-12-27 13:09:36 +01:00
62eae6d5d0 chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.16.0 (#1556)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-27 18:37:06 +09:00
15b2b26b84 chore(deps): update pnpm to v8.13.1 (#1557)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-27 18:36:57 +09:00
9664c17c47 chore(deps): update dependency ws to v8.16.0 (#1559)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-27 18:36:51 +09:00
8067dad2fa fix(deps): update dependency youtubei.js to v8.1.0 (#1560)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-27 18:36:42 +09:00
4dcaa510d9 chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 3.7% (11 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2023-12-25 12:42:54 +01:00
b6e918089d chore(i18n): Translated using Weblate (Turkish)
Currently translated at 29.2% (86 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2023-12-25 12:42:54 +01:00
1c9e6b1bb8 chore(i18n): Translated using Weblate (Polish)
Currently translated at 97.9% (288 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2023-12-25 12:42:54 +01:00
ebd304c252 fix(deps): update dependency node-html-parser to v6.1.12 (#1554)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-25 20:37:05 +09:00
36083c4173 Revert "fix(deps): update dependency @xhayper/discord-rpc to v1.1.2" (#1552) 2023-12-25 03:48:15 +09:00
a084b060d8 chore(deps): update dependency electron to v28.1.0 2023-12-25 03:32:28 +09:00
432c79b606 fix(deps): update dependency @xhayper/discord-rpc to v1.1.2 2023-12-25 03:32:07 +09:00
0f1f0ee933 chore(deps): update dependency eslint-plugin-prettier to v5.1.2 2023-12-25 03:31:59 +09:00
9b1a4b8d88 chore(i18n): Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-23 21:07:03 +01:00
1a7a665915 chore(i18n): Translated using Weblate (Czech)
Currently translated at 76.5% (225 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-22 03:06:46 +01:00
623ecf7fb8 chore(i18n): Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/
2023-12-20 17:44:47 +01:00
0dc9c6a1a9 chore(i18n): Translated using Weblate (Czech)
Currently translated at 72.7% (214 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-20 17:44:47 +01:00
72c5eaa5ff chore(i18n): Translated using Weblate (Czech)
Currently translated at 82.3% (242 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-20 13:54:56 +01:00
0f47b94b7d chore(i18n): Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/
2023-12-20 13:53:36 +01:00
9abe15f1ad chore(i18n): Translated using Weblate (Czech)
Currently translated at 82.3% (242 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-20 13:53:35 +01:00
96afda92c8 chore(i18n): Translated using Weblate (Czech)
Currently translated at 80.9% (238 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-20 13:33:50 +01:00
5c6fd4a739 Update README-ko.md 2023-12-20 14:11:53 +02:00
23b87a876d chore(deps): update dependency eslint-plugin-prettier to v5.1.0 2023-12-20 13:59:40 +09:00
737fd05369 chore(deps): update dependency electron-vite to v2.0.0-beta.2 2023-12-20 13:59:28 +09:00
c5bcd89f16 chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.15.0 2023-12-19 16:32:46 +09:00
377e1be0b2 fix(deps): update dependency @foobar404/wave to v2.0.5 2023-12-19 16:32:31 +09:00
a92049c0c9 chore(i18n): Translated using Weblate (Lithuanian)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/lt/
2023-12-19 07:21:28 +01:00
27a2955bba fix: fix homebrew cask
- resolve #1514
2023-12-18 22:02:38 +09:00
cc940e2020 Update changelog for v3.1.1 2023-12-18 12:57:28 +00:00
203c80767d Bump version to 3.1.1 2023-12-18 21:49:31 +09:00
f564039438 chore: fix the example plugins in the README 2023-12-18 14:47:18 +02:00
d6566fb870 chore(i18n): Translated using Weblate (Lithuanian)
Currently translated at 84.3% (248 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/lt/
2023-12-18 13:46:47 +01:00
55ab17e789 chore(i18n): Translated using Weblate (Portuguese)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt/
2023-12-18 13:43:08 +01:00
e0eeb720cd feat: upgrade to Vite v5 2023-12-18 21:10:47 +09:00
53ac7ff257 fix: electron-vite dev --watch 2023-12-18 20:00:00 +09:00
a4e2f10afa chore(deps): update dependency playwright to v1.41.0-alpha-dec-18-2023 2023-12-18 19:58:33 +09:00
c9c9d766e6 chore(deps): update dependency rollup to v4.9.1 2023-12-18 19:56:14 +09:00
b82d161180 chore: Update bug_report.yml 2023-12-18 19:47:51 +09:00
7cadacd8cf fix: vite dev mode
fix an issue caused by da3bc5aeb7
2023-12-18 19:07:43 +09:00
fc1a7cda62 chore(i18n): Translated using Weblate (Lithuanian)
Currently translated at 84.3% (248 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/lt/
2023-12-18 10:56:31 +01:00
da3bc5aeb7 fix: renderer plugin load timing
MAGIC OF JAVASCRIPT
2023-12-18 18:42:01 +09:00
ee98344064 chore(i18n): Added translation using Weblate (Lithuanian) 2023-12-17 21:43:08 +01:00
da10eabf99 chore(i18n): Translated using Weblate (Ukrainian)
Currently translated at 69.3% (204 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2023-12-17 14:55:42 +01:00
ce3c63c386 chore(i18n): Translated using Weblate (Portuguese)
Currently translated at 73.8% (217 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt/
2023-12-17 14:55:42 +01:00
f8c3cff5a9 chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-17 14:55:41 +01:00
08f369f8bc chore(i18n): Translated using Weblate (Portuguese)
Currently translated at 43.5% (128 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt/
2023-12-17 08:28:44 +01:00
1517230ede chore(i18n): Translated using Weblate (German)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-17 08:28:44 +01:00
45aeadef86 fix(song-info-front): fix type 2023-12-17 16:05:26 +09:00
5ec7c346ca fix(song-info-front): fix parser to parse album name 2023-12-17 15:51:35 +09:00
4b68de1606 fix: update types 2023-12-16 22:39:57 +09:00
7710bcdacc chore(i18n): Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-16 11:58:32 +01:00
4c19bcc983 chore(i18n): Translated using Weblate (Turkish)
Currently translated at 26.1% (77 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2023-12-16 03:33:06 +01:00
2f50b1423a chore(i18n): Translated using Weblate (French)
Currently translated at 95.9% (282 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2023-12-16 03:33:06 +01:00
15768c9691 chore(deps): update dependency eslint to v8.56.0 2023-12-16 11:28:58 +09:00
442eb75b8d chore(i18n): Translated using Weblate (Portuguese)
Currently translated at 43.1% (127 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt/
2023-12-16 03:09:12 +01:00
8facd27125 chore(i18n): Translated using Weblate (Italian)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-16 03:09:11 +01:00
a302cb6ebf chore(i18n): Translated using Weblate (Spanish)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-16 03:09:11 +01:00
32422c7ba9 fix(deps): update dependency i18next to v23.7.11 2023-12-15 13:42:50 +09:00
ca131cb156 chore(deps): update dependency eslint-plugin-import to v2.29.1 2023-12-15 13:42:44 +09:00
5f8262ede1 chore(i18n): Translated using Weblate (Ukrainian)
Currently translated at 65.3% (192 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2023-12-14 02:11:40 +01:00
88db9d3693 chore(i18n): Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-13 21:33:32 +01:00
0fa6f344f9 chore(i18n): Translated using Weblate (Polish)
Currently translated at 97.6% (287 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2023-12-13 21:33:31 +01:00
d1642b3dfb chore(i18n): Translated using Weblate (Polish)
Currently translated at 97.6% (287 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2023-12-13 21:33:31 +01:00
7599fce5f5 chore(i18n): Translated using Weblate (Spanish)
Currently translated at 97.6% (287 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-13 21:33:31 +01:00
9bd0dc9a7b chore(i18n): Translated using Weblate (Greek)
Currently translated at 23.8% (70 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/el/
2023-12-13 21:33:31 +01:00
dad7cafebc chore(i18n): Translated using Weblate (Russian)
Currently translated at 72.7% (214 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-13 16:20:54 +01:00
4febb28201 chore(deps): update dependency rollup to v4.9.0 2023-12-13 21:13:41 +09:00
ced943bad3 chore(deps): update pnpm to v8.12.1 2023-12-13 21:12:07 +09:00
202b8717a2 chore(i18n): Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-13 13:10:46 +01:00
eba7026b89 chore(i18n): Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2023-12-13 13:10:46 +01:00
6b2adca1f4 fix(downloader): fix download button i18n 2023-12-13 18:02:18 +09:00
0c9d3cc057 chore(i18n): Translated using Weblate (Ukrainian)
Currently translated at 42.8% (126 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2023-12-13 05:07:02 +01:00
45ec11aaed chore(deps): update pnpm-lock.yaml 2023-12-13 13:06:10 +09:00
4d47fa3fac fix(deps): update dependency @electron/remote to v2.1.1 2023-12-13 12:24:55 +09:00
6322d5bb09 chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 3.0% (9 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2023-12-12 21:56:36 +01:00
2e8a579049 chore(i18n): Translated using Weblate (Thai)
Currently translated at 1.0% (3 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/th/
2023-12-12 21:56:36 +01:00
9db7e99d7f chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-12 21:56:36 +01:00
ef73989995 chore(i18n): Translated using Weblate (Czech)
Currently translated at 79.9% (235 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-12 21:56:36 +01:00
61024084e9 chore(deps): update dependency ws to v8.15.1 2023-12-13 05:46:56 +09:00
1c71b2020f fix(deps): update dependency i18next to v23.7.9 2023-12-13 05:45:52 +09:00
3b2b545388 chore(i18n): Translated using Weblate (Russian)
Currently translated at 67.6% (199 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-12 21:44:51 +01:00
fafc7f94fd chore(i18n): Translated using Weblate (Italian)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-12 21:44:50 +01:00
5fa88b5ce9 fix: fix renderer plugin load timing
- fix #1522
2023-12-12 12:53:41 +09:00
a8fe4167db fix(pip): fix invalid position config 2023-12-12 11:11:41 +09:00
0e6b0ddc26 chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-12 02:24:41 +01:00
af88db3865 chore(i18n): Translated using Weblate (Japanese)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-12 02:24:41 +01:00
0a1bef556c chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2023-12-12 02:24:41 +01:00
7030181dc1 chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2023-12-12 02:24:41 +01:00
98cb2f61ab chore(deps): update dependency playwright to v1.41.0-alpha-dec-12-2023 2023-12-12 10:23:59 +09:00
a601d0b3d2 chore(deps): update dependency rollup to v4.8.0 2023-12-12 10:22:23 +09:00
8d18923065 chore(i18n): Translated using Weblate (Norwegian Bokmål)
Currently translated at 75.1% (221 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nb_NO/
2023-12-12 01:08:34 +01:00
4b6a7e0bd7 chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2023-12-12 01:08:34 +01:00
44f87853d6 chore(i18n): Translated using Weblate (Norwegian Bokmål)
Currently translated at 74.8% (220 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nb_NO/
2023-12-12 01:02:37 +01:00
4ff47bee03 chore(i18n): Translated using Weblate (Norwegian Bokmål)
Currently translated at 74.1% (218 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nb_NO/
2023-12-12 00:54:03 +01:00
7a2c28df21 chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2023-12-12 00:54:02 +01:00
f7241d1e4a chore(i18n): Added translation using Weblate (Indonesian) 2023-12-12 00:33:55 +01:00
2b5daf3a75 chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.14.0 2023-12-12 06:43:20 +09:00
d7184cf75d chore(i18n): Translated using Weblate (Russian)
Currently translated at 54.0% (159 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-11 19:59:59 +01:00
1313d18d44 chore(i18n): Translated using Weblate (Czech)
Currently translated at 80.9% (238 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-11 19:59:58 +01:00
605e9481d9 chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2023-12-11 19:59:58 +01:00
cf4c89f825 chore(i18n): Added translation using Weblate (Thai) 2023-12-11 10:17:18 +01:00
f4f1d4d373 chore(i18n): Translated using Weblate (Norwegian Bokmål)
Currently translated at 46.2% (136 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nb_NO/
2023-12-11 09:00:43 +01:00
6557b40924 Translated using Weblate (Spanish)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-11 00:20:44 +01:00
e01a29c5d1 Translated using Weblate (Spanish)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-11 00:20:44 +01:00
d9a7e16d63 Translated using Weblate (Italian)
Currently translated at 99.3% (292 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-11 00:20:44 +01:00
d170199d85 Update changelog for v3.1.0 2023-12-10 23:10:52 +00:00
e650aae491 Bump version to 3.1.0 2023-12-11 08:00:42 +09:00
49058dbeab chore: update pnpm-lock.yaml 2023-12-11 07:59:42 +09:00
31d2d91566 Translated using Weblate (Japanese)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-10 23:57:22 +01:00
abf2a52b46 fix: in-player adblocker inject timing issue
- fix #1478
2023-12-11 07:46:01 +09:00
d0ca10e1a1 Translated using Weblate (Chinese (Simplified))
Currently translated at 1.0% (3 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2023-12-10 22:57:39 +01:00
fe99a04174 Translated using Weblate (Portuguese)
Currently translated at 31.6% (93 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt/
2023-12-10 22:57:39 +01:00
916900ae6a Translated using Weblate (Spanish)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-10 22:57:39 +01:00
826c9ba48e fix(package.json): fix RPM version libuuid issue
- fix #1508
2023-12-11 06:57:32 +09:00
7783cc5f30 Translated using Weblate (Chinese (Simplified))
Currently translated at 0.3% (1 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/
2023-12-10 22:49:58 +01:00
035d7f19ea Translated using Weblate (Spanish)
Currently translated at 99.3% (292 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-10 22:49:58 +01:00
294cf15d58 Translated using Weblate (Spanish)
Currently translated at 99.3% (292 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-10 22:49:58 +01:00
11fa0dcbc6 Translated using Weblate (Spanish)
Currently translated at 99.3% (292 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-10 22:49:58 +01:00
85b53db439 Translated using Weblate (Korean)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-10 22:49:57 +01:00
200df100f4 Translated using Weblate (English)
Currently translated at 100.0% (294 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2023-12-10 22:49:57 +01:00
ba202a8572 chore(deps): update dependency electron to v28 (#1498)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: JellyBrick <shlee1503@naver.com>
2023-12-11 06:44:59 +09:00
daf05239a1 Enable/Disable Navigation without restart (#1507) 2023-12-11 04:21:17 +09:00
b73b5735ec Translated using Weblate (Spanish)
Currently translated at 90.8% (267 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-10 04:08:22 +01:00
292248dd35 Translated using Weblate (Spanish)
Currently translated at 90.8% (267 of 294 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-10 04:08:22 +01:00
2e240541c8 Turkish(tr)_lang_file (#1513) 2023-12-10 08:41:46 +09:00
ab62ae3682 chore(deps): update dependency ws to v8.15.0 2023-12-10 04:28:02 +09:00
5c3f5d05d3 chore(deps): update pnpm to v8.12.0 2023-12-09 12:38:32 +09:00
c81af537b6 Translated using Weblate (Spanish)
Currently translated at 83.5% (244 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-09 01:37:30 +00:00
7295c73371 Translated using Weblate (Spanish)
Currently translated at 83.5% (244 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-09 01:37:29 +00:00
5a65e08a94 Translated using Weblate (Spanish)
Currently translated at 83.5% (244 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-09 01:37:28 +00:00
45e5bc7df5 Skip Disliked Songs (#1505)
* Added skip-disliked-songs

* Changed it to activate and deactivate without restart

* Added waiter for Element

* MutationObserver can be null

Co-authored-by: JellyBrick <shlee1503@naver.com>

* MutationObserver could not exist

Co-authored-by: JellyBrick <shlee1503@naver.com>

* Update src/plugins/skip-disliked-songs/index.ts

Co-authored-by: JellyBrick <shlee1503@naver.com>

* Replaced double quotes with single quotes

---------

Co-authored-by: JellyBrick <shlee1503@naver.com>
2023-12-09 10:37:17 +09:00
a81cb9515c Translated using Weblate (Spanish)
Currently translated at 39.7% (116 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-08 21:55:06 +01:00
88e5cc2728 Translated using Weblate (Spanish)
Currently translated at 39.7% (116 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-08 21:55:06 +01:00
1685648328 Translated using Weblate (Spanish)
Currently translated at 39.0% (114 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-08 21:54:40 +01:00
9334adacf6 Translated using Weblate (Spanish)
Currently translated at 39.0% (114 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-08 21:54:39 +01:00
efbe557dce Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/
2023-12-08 20:37:43 +01:00
52b2625486 Translated using Weblate (Spanish)
Currently translated at 10.6% (31 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-08 20:37:43 +01:00
aa0424db08 Translated using Weblate (Spanish)
Currently translated at 10.6% (31 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-08 20:37:43 +01:00
157619aa4f chore(deps): update dependency rollup to v4.7.0 2023-12-09 03:23:17 +09:00
ce637968b2 Translated using Weblate (Italian)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-08 11:32:34 +01:00
b2a3ed7428 Translated using Weblate (Spanish)
Currently translated at 4.1% (12 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-08 11:08:18 +01:00
ca856e4d88 Translated using Weblate (Spanish)
Currently translated at 4.1% (12 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-08 11:08:17 +01:00
2ef2536766 Translated using Weblate (Italian)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-08 11:08:17 +01:00
1b22633388 Translated using Weblate (Italian)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-08 11:08:17 +01:00
db306ad4e0 Translated using Weblate (Italian)
Currently translated at 65.4% (191 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-07 19:20:03 +01:00
34a44cb9c6 Translated using Weblate (Italian)
Currently translated at 65.4% (191 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-07 19:20:03 +01:00
8c499a6e20 Translated using Weblate (Italian)
Currently translated at 51.3% (150 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-07 18:58:33 +01:00
3b816a6fd9 Translated using Weblate (Italian)
Currently translated at 51.3% (150 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-07 18:58:33 +01:00
35aba8e25a Translated using Weblate (Italian)
Currently translated at 46.9% (137 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-07 18:52:44 +01:00
0eb6723f27 Translated using Weblate (Italian)
Currently translated at 46.9% (137 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-07 18:52:44 +01:00
2250ec9372 Translated using Weblate (Spanish)
Currently translated at 1.0% (3 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2023-12-07 13:48:08 +00:00
ef02b53284 Translated using Weblate (Italian)
Currently translated at 42.1% (123 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-07 13:48:08 +00:00
57df7cf3f9 Translated using Weblate (Italian)
Currently translated at 42.1% (123 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-07 13:48:07 +00:00
f0cd540726 Translated using Weblate (Ukrainian)
Currently translated at 1.0% (3 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2023-12-07 13:48:06 +00:00
7e919395eb chore(deps): update dependency typescript to v5.3.3 2023-12-07 10:03:26 +09:00
facc7252c2 fix(deps): update dependency i18next to v23.7.8 2023-12-07 10:03:06 +09:00
09b8943f69 Translated using Weblate (Italian)
Currently translated at 32.1% (94 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-07 01:45:31 +01:00
aa84ffc7e1 Translated using Weblate (French)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2023-12-07 01:45:31 +01:00
10162c948b chore: Create zh-CN.json 2023-12-07 09:45:08 +09:00
e8c1cbdd94 BC-BREAK: bump node engines version 2023-12-07 02:52:14 +09:00
5459f623ec Translated using Weblate (Italian)
Currently translated at 32.1% (94 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-05 18:59:01 +01:00
2a2cba3539 Translated using Weblate (Italian)
Currently translated at 32.1% (94 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-05 18:59:01 +01:00
1ce84607e6 Translated using Weblate (Portuguese)
Currently translated at 30.8% (90 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt/
2023-12-05 17:59:26 +01:00
075c54d39f Translated using Weblate (Portuguese)
Currently translated at 30.8% (90 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt/
2023-12-05 17:59:26 +01:00
aabb826cb8 Translated using Weblate (Italian)
Currently translated at 13.0% (38 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-05 17:59:26 +01:00
3791b1ae1c Translated using Weblate (Italian)
Currently translated at 13.0% (38 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-05 17:59:26 +01:00
d4b87d098b Added translation using Weblate (Portuguese) 2023-12-05 17:39:07 +01:00
57e9c13d13 Translated using Weblate (Italian)
Currently translated at 6.8% (20 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-05 05:59:05 +01:00
e48e570e69 Translated using Weblate (Italian)
Currently translated at 6.8% (20 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-05 05:59:05 +01:00
b7d4d5b022 Translated using Weblate (Czech)
Currently translated at 61.3% (179 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-05 05:59:05 +01:00
dc8b0173e9 Added translation using Weblate (Spanish) 2023-12-05 05:59:05 +01:00
840729126e fix(macos): fix app crash in macOS 2023-12-05 13:36:23 +09:00
ed90b97a92 chore(deps): update dependency vite to v4.5.1 2023-12-05 13:29:45 +09:00
bbe4f07651 chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.13.2 (#1452)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-05 13:29:23 +09:00
66df83a86d fix: Homebrew latest release url parsing (#1496)
Co-authored-by: Gian Marco Cinalli <gianmarco.cinalli@immobiliare.it>
2023-12-05 10:56:59 +09:00
dfedd8f091 Translated using Weblate (Italian)
Currently translated at 4.1% (12 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2023-12-04 19:15:58 +01:00
58ec6eebfb Translated using Weblate (Czech)
Currently translated at 58.5% (171 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-04 19:15:58 +01:00
3ba4130bc6 Translated using Weblate (Czech)
Currently translated at 58.5% (171 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-04 19:15:58 +01:00
7dbbf38e78 Added translation using Weblate (Italian) 2023-12-04 17:31:24 +01:00
51e04162a7 Translated using Weblate (Czech)
Currently translated at 57.1% (167 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-04 09:58:03 +01:00
d3325e2490 Translated using Weblate (Czech)
Currently translated at 56.1% (164 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-04 05:05:31 +01:00
d2708ee32f Translated using Weblate (Czech)
Currently translated at 56.1% (164 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-04 05:05:31 +01:00
781a09c717 Translated using Weblate (Czech)
Currently translated at 55.4% (162 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-04 04:55:52 +01:00
11605293dd Translated using Weblate (Czech)
Currently translated at 55.4% (162 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-04 04:55:52 +01:00
3f0b946190 Translated using Weblate (Czech)
Currently translated at 52.7% (154 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-03 23:49:11 +01:00
74972f053a Translated using Weblate (Czech)
Currently translated at 52.7% (154 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-03 23:49:11 +01:00
d85190ace1 Translated using Weblate (Czech)
Currently translated at 51.7% (151 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-03 23:39:39 +01:00
5755b4ac7f Translated using Weblate (Czech)
Currently translated at 51.7% (151 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-03 23:39:38 +01:00
3c24f2edcd Translated using Weblate (Czech)
Currently translated at 51.3% (150 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-03 23:26:36 +01:00
6828520853 Translated using Weblate (Czech)
Currently translated at 51.3% (150 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-03 23:26:36 +01:00
2ba7dddb95 Translated using Weblate (Czech)
Currently translated at 50.6% (148 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-03 22:17:53 +00:00
57a8922d04 Translated using Weblate (Czech)
Currently translated at 51.0% (149 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-03 22:17:53 +00:00
640098860a Translated using Weblate (Czech)
Currently translated at 51.0% (149 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-03 22:17:52 +00:00
53384d9f3b Translated using Weblate (Russian)
Currently translated at 13.6% (40 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-03 22:17:51 +00:00
89d8d98a35 fix: remove import 'process' 2023-12-04 03:53:24 +09:00
7b78ba6761 Translated using Weblate (Polish)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pl/
2023-12-03 17:43:49 +01:00
3926a9a0c0 Translated using Weblate (French)
Currently translated at 99.6% (291 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2023-12-03 17:43:48 +01:00
0708cd5a38 Added translation using Weblate (Polish) 2023-12-03 11:35:51 +01:00
e20e9ca771 Added translation using Weblate (Ukrainian) 2023-12-03 10:26:51 +01:00
be1038bafd Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-03 01:50:48 +01:00
ebc087963b Translated using Weblate (French)
Currently translated at 85.2% (249 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2023-12-03 01:50:48 +01:00
020bdc0811 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-02 23:23:55 +00:00
a0d1ad6a47 Translated using Weblate (French)
Currently translated at 19.1% (56 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2023-12-02 23:23:54 +00:00
62e5679791 fix(deps): update dependency ts-morph to v21 2023-12-03 07:50:56 +09:00
35568bd299 Translated using Weblate (Chinese (Traditional))
Currently translated at 46.5% (136 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-02 21:13:54 +01:00
1e40b377af Translated using Weblate (Chinese (Traditional))
Currently translated at 46.5% (136 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-02 21:13:54 +01:00
1073de1b45 Translated using Weblate (Czech)
Currently translated at 46.5% (136 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-02 21:13:45 +01:00
1d5788acaf Translated using Weblate (Chinese (Traditional))
Currently translated at 35.6% (104 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-02 20:27:58 +01:00
8fb446588d Translated using Weblate (Chinese (Traditional))
Currently translated at 35.6% (104 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-02 20:27:58 +01:00
6cec34b2ac Translated using Weblate (Chinese (Traditional))
Currently translated at 35.6% (104 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-02 20:27:58 +01:00
763d3e8f74 Translated using Weblate (German)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-02 20:27:58 +01:00
7da0a913f1 Update changelog for v3.0.2 2023-12-02 18:39:16 +00:00
ca04c4561b Bump version to 3.0.2 2023-12-03 03:30:08 +09:00
7d8fbf49a8 Translated using Weblate (Chinese (Traditional))
Currently translated at 23.6% (69 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-02 19:29:34 +01:00
75e15b948d Translated using Weblate (Chinese (Traditional))
Currently translated at 23.6% (69 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-02 19:29:28 +01:00
125b69fd75 Translated using Weblate (Chinese (Traditional))
Currently translated at 23.6% (69 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-02 19:29:28 +01:00
a68d6b64dd Translated using Weblate (French)
Currently translated at 8.9% (26 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2023-12-02 19:29:28 +01:00
a60d4264dc fix: pnpm install doesn't refresh lock file 2023-12-03 03:16:07 +09:00
9e2c6b1afa fix: update pnpm-lock.yaml 2023-12-03 03:07:11 +09:00
14965a93e9 fix: simple-youtube-age-restriction-bypass 2023-12-03 02:49:17 +09:00
f62664b6a5 fix(adblocker): fix In-Player adblocker
- resolves #1478
2023-12-03 02:06:49 +09:00
60cb7f32f1 fix(in-app-menu/i18n): fix hide-dom-window-controls 2023-12-03 01:00:33 +09:00
008b3ad710 Translated using Weblate (Chinese (Traditional))
Currently translated at 1.0% (3 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2023-12-02 16:59:02 +01:00
8cae64f496 fix(menu): crash on linux
- resolves #1477
2023-12-03 00:54:36 +09:00
5cdc1bc762 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/
2023-12-02 16:29:40 +01:00
15c455105b Translated using Weblate (French)
Currently translated at 8.5% (25 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2023-12-02 16:29:40 +01:00
14407a98c9 Translated using Weblate (English)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2023-12-02 16:29:40 +01:00
0d004d5caf Added translation using Weblate (Chinese (Traditional)) 2023-12-02 16:29:40 +01:00
4b75a2405c Update changelog for v3.0.1 2023-12-02 14:32:40 +00:00
1f7e28b6fb Bump version to 3.0.1 (hotfix) 2023-12-02 23:23:26 +09:00
c41b2ce861 fix: if locale is not present, set to unspecified 2023-12-02 23:23:13 +09:00
7f02afc5a6 Translated using Weblate (French)
Currently translated at 3.4% (10 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2023-12-02 14:14:53 +00:00
496b3ffc1b fix(adblocker): remove unused statement 2023-12-02 23:14:04 +09:00
e9a395f67a hotfix(adblocker): fix #1475 2023-12-02 23:13:21 +09:00
0660f0b7ce Translated using Weblate (German)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-02 14:41:50 +01:00
3ac09b9dc1 Added translation using Weblate (French) 2023-12-02 14:41:50 +01:00
fe4904a4af fix(index): i18n translate 2023-12-02 22:35:49 +09:00
d8c8bd17ec Update changelog for v3.0.0 2023-12-02 13:21:02 +00:00
e9d4d5ba14 Bump version to 3.0.0 2023-12-02 22:12:51 +09:00
5b2e69588f Translated using Weblate (Korean)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-02 14:11:43 +01:00
c1591402a0 Translated using Weblate (Korean)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-02 13:11:07 +00:00
e2e9c03895 chore(deps): update dependency vite-plugin-inspect to v0.8.1 2023-12-02 22:06:08 +09:00
deac4ef56b Translated using Weblate (German)
Currently translated at 99.6% (291 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-02 14:03:09 +01:00
7c39e658ce Translated using Weblate (German)
Currently translated at 99.6% (291 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-02 13:49:31 +01:00
6b026f57bc Translated using Weblate (Japanese)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-02 13:27:29 +01:00
dc07cbda6f Translated using Weblate (German)
Currently translated at 99.6% (291 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-02 13:27:29 +01:00
1cf43fcd42 Translated using Weblate (German)
Currently translated at 99.6% (291 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-02 13:27:29 +01:00
e2cf550bed Translated using Weblate (Japanese)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-02 13:18:24 +01:00
2917da1138 Translated using Weblate (Korean)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-02 13:18:24 +01:00
b74eeb5688 Translated using Weblate (Japanese)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-02 13:16:20 +01:00
0b084a6441 Translated using Weblate (German)
Currently translated at 99.3% (290 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-02 13:16:20 +01:00
865efa1b12 Translated using Weblate (Japanese)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-02 13:13:10 +01:00
6a248e5336 Translated using Weblate (Czech)
Currently translated at 46.2% (135 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-02 13:13:10 +01:00
eb9c256a5d Translated using Weblate (German)
Currently translated at 99.3% (290 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-02 13:13:10 +01:00
4bd54dcb2d Translated using Weblate (Japanese)
Currently translated at 40.0% (117 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-02 10:58:23 +01:00
17b035d317 Translated using Weblate (Japanese)
Currently translated at 38.6% (113 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-02 10:49:31 +01:00
28bcd1fefc Translated using Weblate (Korean)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-02 02:16:18 +00:00
59bb1d9124 feat(README): add i18n README
- resolves https://github.com/th-ch/youtube-music/discussions/719
2023-12-02 10:06:55 +09:00
d9255c1cec Translated using Weblate (Korean)
Currently translated at 100.0% (292 of 292 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-02 00:27:27 +01:00
4ab4bb4cb3 feat(menu): add 'to-help-translate' button 2023-12-02 08:25:07 +09:00
a6c8b887e3 fix(in-app-menu): hide 'invisible' item from menu 2023-12-02 08:06:15 +09:00
1db0abf32d Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/
2023-12-02 00:02:39 +01:00
ff899b8720 Translated using Weblate (German)
Currently translated at 99.6% (290 of 291 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-02 00:02:39 +01:00
18004c4441 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/
2023-12-01 23:56:30 +01:00
ce1cde72bd Translated using Weblate (Norwegian Bokmål)
Currently translated at 20.2% (59 of 291 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nb_NO/
2023-12-01 23:56:30 +01:00
453f4d92c9 Translated using Weblate (Czech)
Currently translated at 37.8% (110 of 291 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-01 23:56:30 +01:00
37740e78b4 Translated using Weblate (Russian)
Currently translated at 11.6% (34 of 291 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-01 23:56:30 +01:00
8ace123179 Translated using Weblate (Greek)
Currently translated at 9.6% (28 of 291 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/el/
2023-12-01 23:56:30 +01:00
bcdb9de41a chore(deps): update dependency eslint to v8.55.0 2023-12-02 07:12:19 +09:00
9fdb6eb7e5 fix(security): fix vulnerability detected by snyk 2023-12-02 07:06:39 +09:00
88cd1d2390 chore(README): replace snyk badge 2023-12-02 07:00:19 +09:00
943bcd322d Translated using Weblate (German)
Currently translated at 99.6% (290 of 291 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 22:42:08 +01:00
7774128d7e Translated using Weblate (Korean)
Currently translated at 100.0% (291 of 291 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 22:42:08 +01:00
b9b9e2ba00 Translated using Weblate (English)
Currently translated at 100.0% (291 of 291 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2023-12-01 22:42:08 +01:00
0ce4f20ec5 fix(downloader): call submenu 2023-12-02 06:39:33 +09:00
51b87312c4 feat: changed Zoom shortcuts to standard
- resolves #1458
2023-12-02 06:16:38 +09:00
9ffd7af8a7 Translated using Weblate (Japanese)
Currently translated at 36.5% (106 of 290 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-01 21:48:39 +01:00
4a453a4f3d Translated using Weblate (German)
Currently translated at 99.6% (289 of 290 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 21:48:39 +01:00
dc8a472cdb Translated using Weblate (Korean)
Currently translated at 100.0% (290 of 290 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 21:48:39 +01:00
d2eabaa4bb Translated using Weblate (English)
Currently translated at 100.0% (290 of 290 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2023-12-01 21:48:39 +01:00
39c8ca66d1 fix: add (Language) to Language setting 2023-12-02 05:14:22 +09:00
806098a5ef feat(tray): add separator 2023-12-02 05:11:27 +09:00
5f6cfd9558 Translated using Weblate (Japanese)
Currently translated at 34.1% (99 of 290 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-01 21:03:01 +01:00
b4b7ad824b Translated using Weblate (Korean)
Currently translated at 100.0% (290 of 290 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 21:03:01 +01:00
7b5d602f63 Translated using Weblate (Japanese)
Currently translated at 31.3% (91 of 290 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-01 21:03:01 +01:00
7eeeb89457 Translated using Weblate (Japanese)
Currently translated at 31.3% (91 of 290 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-01 21:03:01 +01:00
6e8447b5d1 feat: run prettier 2023-12-02 05:01:29 +09:00
a6445bacf0 Translated using Weblate (Japanese)
Currently translated at 27.9% (81 of 290 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-01 20:36:58 +01:00
bd9b4f1b1a Translated using Weblate (Korean)
Currently translated at 100.0% (290 of 290 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 20:36:58 +01:00
9a816b3f07 fix(song-info-front): fix eslint warning 2023-12-02 04:29:05 +09:00
4dcac23688 feat: async video event dispatch 2023-12-02 04:28:38 +09:00
97ef6ff997 fix(quality-changer): i18n 2023-12-02 04:24:02 +09:00
244a656671 Translated using Weblate (Japanese)
Currently translated at 19.4% (54 of 277 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-01 19:50:33 +01:00
f8a2829adb Translated using Weblate (Japanese)
Currently translated at 19.4% (54 of 277 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-01 19:50:33 +01:00
24daadbef8 Translated using Weblate (Czech)
Currently translated at 39.7% (110 of 277 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-01 19:50:33 +01:00
bf2ac88847 Translated using Weblate (German)
Currently translated at 87.7% (243 of 277 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 19:50:33 +01:00
e42423b100 Translated using Weblate (Korean)
Currently translated at 100.0% (277 of 277 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 19:50:33 +01:00
de0c02efaf Translated using Weblate (Korean)
Currently translated at 100.0% (277 of 277 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 19:50:33 +01:00
b8290417f8 fix(en): fix 'quit' string 2023-12-02 03:50:23 +09:00
b92205a228 fix: i18n for default menu 2023-12-02 03:49:25 +09:00
5f642007ba feat(executed-at-ms): displaying a float to 2 decimal places
e.g. 58.399999998509884ms -> 58.39ms
2023-12-02 03:18:30 +09:00
ee40d278d4 Translated using Weblate (Korean)
Currently translated at 100.0% (277 of 277 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 18:35:12 +01:00
02d2e8ea92 Translated using Weblate (English)
Currently translated at 100.0% (277 of 277 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2023-12-01 18:35:12 +01:00
70715e5e8a fix(discord): connected, disconnected i18n 2023-12-02 02:33:54 +09:00
5ae4f564b7 fix(i18n): plugin name, description i18n 2023-12-02 02:33:40 +09:00
123eabd77a Translated using Weblate (Czech)
Currently translated at 39.6% (109 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-01 17:14:58 +00:00
fd3438a20d feat(i18n): i18n auto-importer 2023-12-02 02:13:49 +09:00
c8554a12f6 fix(i18n): fix locale name (Norwegian (Bokmal)) 2023-12-02 01:54:32 +09:00
4a687ade9c Translated using Weblate (German)
Currently translated at 86.1% (237 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 17:43:01 +01:00
f77aa372cc Translated using Weblate (Japanese)
Currently translated at 5.0% (14 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-01 17:37:32 +01:00
0b9eef94c4 Translated using Weblate (German)
Currently translated at 85.8% (236 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 17:37:32 +01:00
71b2f69f98 Translated using Weblate (German)
Currently translated at 85.8% (236 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 17:37:31 +01:00
4b61c5307e Translated using Weblate (German)
Currently translated at 75.6% (208 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 17:06:02 +01:00
a617b91263 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/
2023-12-01 17:06:02 +01:00
fc79bdd0f3 Translated using Weblate (Norwegian Bokmål)
Currently translated at 21.0% (58 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nb_NO/
2023-12-01 17:06:02 +01:00
e5e1e547d5 Translated using Weblate (Japanese)
Currently translated at 4.0% (11 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-01 17:06:02 +01:00
edac9b0c20 Translated using Weblate (German)
Currently translated at 75.2% (207 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 17:06:02 +01:00
dfaf3cf95a Translated using Weblate (Russian)
Currently translated at 11.2% (31 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-01 17:06:02 +01:00
bae90ce8f3 Translated using Weblate (Russian)
Currently translated at 11.2% (31 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-01 17:06:02 +01:00
188e56ce30 Translated using Weblate (Czech)
Currently translated at 39.6% (109 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-01 17:06:02 +01:00
19b48b123f Translated using Weblate (German)
Currently translated at 51.6% (142 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 17:06:02 +01:00
549961f297 Translated using Weblate (Korean)
Currently translated at 100.0% (275 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 17:06:02 +01:00
ba7bc68ac3 Translated using Weblate (Norwegian Bokmål)
Currently translated at 10.5% (29 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/nb_NO/
2023-12-01 17:06:02 +01:00
bbfe272d41 Translated using Weblate (Japanese)
Currently translated at 2.5% (7 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ja/
2023-12-01 17:06:02 +01:00
8a3e0a31ca Translated using Weblate (Czech)
Currently translated at 39.6% (109 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-01 17:06:02 +01:00
8fbda97885 Translated using Weblate (Czech)
Currently translated at 39.6% (109 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-01 17:06:02 +01:00
1856deb0f5 Translated using Weblate (German)
Currently translated at 30.5% (84 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 17:06:02 +01:00
fec7c5c130 Translated using Weblate (Korean)
Currently translated at 60.0% (165 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 17:06:02 +01:00
936b4b28bb Added translation using Weblate (Norwegian Bokmål) 2023-12-01 17:06:02 +01:00
f3092d0778 Added translation using Weblate (Japanese) 2023-12-01 17:06:02 +01:00
fc1adfae6c Translated using Weblate (Czech)
Currently translated at 32.7% (90 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-01 17:06:02 +01:00
e279aaed64 Translated using Weblate (Czech)
Currently translated at 100.0% (0 of 0 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/cs/
2023-12-01 17:06:02 +01:00
4d346a9471 Translated using Weblate (German)
Currently translated at 29.8% (82 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 17:06:02 +01:00
cfc504da34 Added translation using Weblate (Czech) 2023-12-01 17:06:02 +01:00
0919a4b9b7 Translated using Weblate (German)
Currently translated at 100.0% (0 of 0 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/de/
2023-12-01 17:06:02 +01:00
f46ad2ea0e Added translation using Weblate (German) 2023-12-01 17:06:02 +01:00
252719bc71 Translated using Weblate (Russian)
Currently translated at 100.0% (0 of 0 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2023-12-01 17:06:02 +01:00
45f49361ea Translated using Weblate (Greek)
Currently translated at 6.9% (19 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/el/
2023-12-01 17:06:02 +01:00
c4a74c6c7e Translated using Weblate (Korean)
Currently translated at 44.0% (121 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 17:06:02 +01:00
05f197948d Added translation using Weblate (Russian) 2023-12-01 17:06:02 +01:00
5a1d230538 Translated using Weblate (Greek)
Currently translated at 100.0% (0 of 0 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/el/
2023-12-01 17:06:02 +01:00
a7ad260a00 Translated using Weblate (Korean)
Currently translated at 18.1% (50 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 17:06:02 +01:00
ef068cccd9 Added translation using Weblate (Greek) 2023-12-01 17:06:02 +01:00
166067920d Translated using Weblate (Korean)
Currently translated at 1.0% (3 of 275 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2023-12-01 17:06:02 +01:00
8227853cf9 fix: load i18n 2023-12-01 23:50:15 +09:00
324a539b89 fix(in-app-menu): resize
- Window controls: 36px -> 32px
- Font size: 14px -> 12px
2023-12-01 23:04:49 +09:00
ce7557353c Add text to Translation section (#1470) 2023-12-01 21:41:13 +09:00
7b7923fe9b fix(downloader): fix i18n 2023-12-01 21:40:03 +09:00
105d5c78e7 chore(deps): update dependency rollup to v4.6.1 2023-12-01 21:31:13 +09:00
b25183a8f5 fix(deps): update dependency youtubei.js to v8 (#1473)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-01 21:20:15 +09:00
adde33d1f5 chore(deps): update dependency electron to v27.1.3 (#1471)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-01 21:18:54 +09:00
ad325ccb10 fix(deps): update dependency @xhayper/discord-rpc to v1.1.1 (#1472)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-01 21:17:28 +09:00
2e7ea6969c chore(README): add translation info 2023-12-01 02:24:23 +09:00
7401cf69ad feat: add support i18n (#1468) 2023-12-01 01:30:46 +09:00
7f71c36dc0 doc: Add warning in index.html 2023-11-30 11:07:32 +02:00
a3104fda4b feat: run prettier 2023-11-30 11:59:27 +09:00
44c42310f1 feat(.eslintrc.js): add prettier 2023-11-30 11:48:03 +09:00
a22a8ac5c9 feat: add description for plugins 2023-11-30 11:42:34 +09:00
aa5c3bac4e chore(deps): bump deps 2023-11-30 10:27:11 +09:00
30b3beee18 Merge pull request #1401 from organization/feat/refactor-plugin-system 2023-11-30 10:07:43 +09:00
b059e43fb1 fix(discord): rename from 'timout' to 'timeout' 2023-11-30 10:00:39 +09:00
3b04d0ba19 feat(discord): apply config as dynamic 2023-11-30 09:54:10 +09:00
959f99beae fix(blur-nav-bar): set restartNeeded to true 2023-11-30 09:41:05 +09:00
ed402933d3 fix(in-app-menu): fix #1436 2023-11-30 09:38:51 +09:00
ef8bb95884 chore(deps): update playwright monorepo to v1.40.1 2023-11-30 03:13:09 +09:00
1b79d2e429 fix(song-info-front): add type 2023-11-30 03:03:04 +09:00
ec786748be fix: dispatch event 2023-11-30 03:02:20 +09:00
06f1c7effe fix(ambient-mode): fix unload 2023-11-30 02:45:44 +09:00
d78da237fc fix: fix an issue with videodatachangefired timing 2023-11-30 00:45:15 +09:00
4c0cce89ee fix(video-toggle): remove unnecessary querySelector call 2023-11-29 19:23:58 +09:00
888ced8fd1 fix(loadAllPreloadPlugins): remove await 2023-11-29 18:27:45 +09:00
e1690720b3 fix: disable auto-play 2023-11-29 18:05:32 +09:00
bbff0a6bc2 feat: plugin load await 2023-11-29 18:04:37 +09:00
5db759150c feat: use '.call' instead of '.bind' 2023-11-29 01:27:51 +09:00
ae239f6700 fix(precise-volume): fix precise-volume plugin 2023-11-28 12:37:31 +09:00
1d26d10e57 fix: menu await 2023-11-28 12:32:07 +09:00
da70a4ce7e fix: fix audioCanPlay event
- e.g. Visualizer Plugin
2023-11-28 12:11:48 +09:00
75ae9f4fad fix: fix unloader 2023-11-28 11:48:09 +09:00
8f7933c111 fix: fix restartNeeded 2023-11-28 11:29:43 +09:00
29a0dedcce chore(action/build): fix version tag 2023-11-28 11:10:41 +09:00
4d62993177 chore(action/build): add notes for Windows
resolve https://github.com/th-ch/youtube-music/discussions/1343
2023-11-28 11:07:44 +09:00
8714f33fa2 feat: use app.whenReady() instead of app.on('ready', ...) 2023-11-28 10:55:33 +09:00
5dacd50ff6 feat: use LoggerPrefix const instead of hardcoded string 2023-11-28 10:51:19 +09:00
8d06dcc7b6 fix(utils/index): little fix (lint) 2023-11-28 10:44:48 +09:00
b8f6dd2584 chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.13.0 2023-11-28 10:41:39 +09:00
0650205b86 chore: update README 2023-11-28 10:28:39 +09:00
3e8a0ec49a fix: plugin config default value 2023-11-28 10:21:08 +09:00
04d7b32d3f feat: createBackend, createPreload, createRenderer
Introduced the mentioned helper methods in order to help split big plugins into manageable chunks.
2023-11-28 00:06:59 +02:00
eaaf170cc8 make log prefix consistent 2023-11-27 23:31:05 +02:00
09450fb8c7 fix(store): fix TypeError: Cannot convert undefined or null to object 2023-11-28 05:51:47 +09:00
ac0b78eefb fix(store): fix Cannot read properties of undefined 'global' 2023-11-28 05:46:49 +09:00
90103d9853 fix: lifecycle check
edge case:
 - There may be plugins that don't have a start or stop function
2023-11-28 05:23:35 +09:00
bf27c73f1d fix(album-color-theme): more simple assign 2023-11-28 04:50:24 +09:00
845c9365be fix(album-color-theme): sidebar color 2023-11-28 04:44:17 +09:00
91cf5f5c25 fix: fix Cannot access 'Ba' before initialization on first run 2023-11-28 04:21:58 +09:00
783a892e26 bump rollup version 2023-11-28 01:59:15 +09:00
41d8f86962 Merge branch 'master' into feat/refactor-plugin-system 2023-11-28 01:51:31 +09:00
252349579e chore(deps): update dependency rollup to v4.6.0 2023-11-28 01:51:10 +09:00
99b1cfbde4 fix: fix pnpm-lock 2023-11-28 01:50:46 +09:00
3f70d912d7 Merge branch 'master' into feat/refactor-plugin-system 2023-11-28 01:48:38 +09:00
bf33c4e7b4 Merge branch 'feat/new-plugin-system' into feat/refactor-plugin-system 2023-11-28 01:43:51 +09:00
3152842a30 fix: this binding
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-11-28 01:39:11 +09:00
d84416b27c fix: crash 2023-11-28 01:02:05 +09:00
cc38978bd3 feat: label sort 2023-11-28 00:51:16 +09:00
7a76079ff4 fix: load plugins
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-11-28 00:34:36 +09:00
2fe28cf126 clean code 2023-11-27 19:26:45 +09:00
3ffbfbe0e3 convert plugins 2023-11-27 18:41:50 +09:00
4fad456619 fix eslint warning 2023-11-27 05:10:35 +09:00
7591f13505 in-app-menu 2023-11-27 05:09:33 +09:00
11d06c50a5 WIP 2 2023-11-27 04:59:20 +09:00
e0a3489640 fix: remove PluginBaseConfig 2023-11-27 00:57:05 +09:00
e55a1d3076 fix: fix onConfigChange 2023-11-27 00:44:46 +09:00
563d431c00 WIP
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-11-27 00:18:34 +09:00
3a1b77ebd8 fix: electron-vite setting
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-11-26 23:25:57 +09:00
3f8030a9c5 fix: inject multiple stylesheet 2023-11-26 23:25:38 +09:00
e12e67af0e feat: reimplement inject css, fix types 2023-11-26 23:12:19 +09:00
3ab4cd5d05 change plugin system 2023-11-26 01:17:24 +02:00
738adbed98 chore(deps): update dependency electron-builder to v24.9.1 2023-11-25 20:44:32 +09:00
365a078600 fix(deps): update dependency electron-updater to v6.1.7 2023-11-25 20:41:44 +09:00
04fc43e18b chore(deps): update pnpm to v8.11.0 2023-11-25 20:41:33 +09:00
54273baec7 chore(deps): update dependency rollup to v4.5.2 2023-11-24 20:56:29 +09:00
51e62ef47b fix(discord): update application client-id
fix #1431
2023-11-23 12:12:08 +09:00
a330ebcda7 chore(deps): update dependency electron to v27.1.2 (#1441)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-23 09:21:08 +09:00
a023fff2d0 Nicer Readme (#1439) 2023-11-22 15:33:49 +09:00
abb25ea6fb chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.12.0 2023-11-22 15:29:51 +09:00
ef49bcdb5f chore(deps): update dependency typescript to v5.3.2 2023-11-22 15:25:37 +09:00
b4f1b112d6 chore(deps): update dependency rollup to v4.5.1 2023-11-22 15:23:11 +09:00
f24ec0ae9d chore(deps): update dependency rollup to v4.5.0 2023-11-20 15:44:36 +09:00
ebb51fe37b chore(deps): update dependency eslint to v8.54.0 2023-11-20 15:44:28 +09:00
e8ee18f903 chore(deps): update dependency electron-vite to v1.0.29 2023-11-20 15:42:36 +09:00
a593de705c chore(deps): update playwright monorepo to v1.40.0 2023-11-20 15:42:25 +09:00
03dd024704 Windows Zoom, ScaleFactor (#1402) 2023-11-20 15:42:04 +09:00
528c3535dd fix(deps): update dependency @xhayper/discord-rpc to v1.1.0 2023-11-19 21:01:47 +09:00
0e0f80a2d0 chore(deps): update dependency electron to v27.1.0 2023-11-16 09:26:50 +09:00
6b67fb136a fix(deps): update dependency conf to v12 2023-11-15 21:52:58 +09:00
9fe1c14869 chore(deps): update dependency @electron/universal to v2 2023-11-15 18:09:00 +09:00
8a96dddf54 pnpm dedupe 2023-11-15 18:08:25 +09:00
230422c98b pnpm dedupe 2023-11-15 18:02:51 +09:00
d16ffc531f fix: renovate.json 2023-11-15 18:02:05 +09:00
f614199ea5 feat: remove support for npm
- remove yarpm
2023-11-15 17:56:52 +09:00
55a1c2e9e3 fix(package.json): fix spaces in overrides 2023-11-15 17:53:32 +09:00
bee1f77812 chore(deps): bump rollup & pnpm 2023-11-15 17:51:53 +09:00
fdf982ada5 chore(deps): bump deps 2023-11-15 17:50:07 +09:00
ff02fc7855 chore(deps): bump axios from 1.5.1 to 1.6.1 (#1400)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-15 17:43:16 +09:00
01ed289400 feat(renovate): add labels for dependency update 2023-11-13 01:40:33 +09:00
TC
aedb2db655 Add renovate config file 2023-11-12 17:35:02 +01:00
10a54b9de0 feat: update README 2023-11-12 02:56:02 +09:00
ccd029c040 fix: update types 2023-11-12 02:55:44 +09:00
3a431841b7 fix(plugin): fix always show restart dialog 2023-11-12 02:10:50 +09:00
deceae8354 chore(plugin): clean import 2023-11-12 02:10:11 +09:00
c8628670cf fix(ambient-plugin): fix plugin definition 2023-11-12 02:05:12 +09:00
ffe53d5596 feat(plugin): show dialog need to restart 2023-11-12 02:02:54 +09:00
a4f4ecb569 feat(plugin): add onPlayerApiReady hook
Co-authored-by: JellyBrick <shlee1503@naver.com>
2023-11-12 01:51:26 +09:00
2097f42efb feat(plugin): support dynamic plugin load / unload 2023-11-12 01:16:34 +09:00
9c59f56aac refactor(plugin): apply new plugin loader at all type of plugin 2023-11-12 00:50:09 +09:00
dfcc4107b7 feat(menu): sort plugin name 2023-11-12 00:31:48 +09:00
ef71abfff1 refactor(plugin): add renderer-plugin-loader 2023-11-12 00:21:34 +09:00
bc916f3a6e refactor(plugin): refactor plugin loader and add dynamic loading 2023-11-12 00:09:56 +09:00
c7ff0dcbf6 fix: remove defaults
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-11-11 22:43:51 +09:00
7242f9bfd0 fix(plugin): fix onChangeConfig hook 2023-11-11 22:08:44 +09:00
bb2e865880 wip: trying to fix electron-store issue
Co-authored-by: JellyBrick <shlee1503@naver.com>
2023-11-11 21:48:51 +09:00
6ab3cf9ac9 fix(frontend): fix cannot apply style 2023-11-11 20:58:16 +09:00
b77f5c9ecc fix: fix insert 2023-11-11 20:05:38 +09:00
b470dbd6b9 fix: add default config 2023-11-11 19:32:05 +09:00
1f96b6b44d fix: plugin load 2023-11-11 19:23:17 +09:00
de0b228ae8 feat: electron-vite hot-reload 2023-11-11 18:12:20 +09:00
f35d192650 fix(downloader): fix downloader plugin 2023-11-11 18:11:24 +09:00
794d00ce9e feat: migrate to new plugin api
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-11-11 18:02:22 +09:00
739e7a448b remove unused Promise.resolve 2023-11-11 11:51:06 +09:00
7fa8a454b6 fix: fix setPartial 2023-11-11 11:50:02 +09:00
5cd1d9abe8 feat(plugin): migrate some plugin (WIP)
Co-authored-by: JellyBrick <shlee1503@naver.com>
2023-11-11 00:03:26 +09:00
e0e17cac99 feat(plugin): migrating plugins to new plugin system (WIP)
Co-authored-by: JellyBrick <shlee1503@naver.com>
2023-11-10 21:32:05 +09:00
840039330f fix: Update bug_report.yml 2023-11-10 20:09:23 +09:00
734409dc3f chore: Update bug_report.yml 2023-11-10 20:09:04 +09:00
34564c8c55 Updated mac icon to better reflect the Mac styling (#1395) 2023-11-10 12:33:17 +09:00
afe6accab8 refactor(plugin): new plugin system poc 2023-11-09 22:54:58 +09:00
b6e7e75ae8 plugin system poc 2023-11-09 12:43:41 +09:00
06dc0e80f0 feat: rename plugins to clarify context (#1392) 2023-11-09 11:35:43 +09:00
47cccbce7c feat: refactor plugin utils (#1391) 2023-11-09 11:06:06 +09:00
269352af97 chore(deps): update dependency electron to v27.0.4
- fix #1324
2023-11-09 10:39:43 +09:00
fa62f79dce chore(deps): bump deps 2023-11-09 10:31:30 +09:00
9f88b37f41 fix(in-app-menu): panel should close with the window when it is closed
- fix #1389
2023-11-09 10:27:07 +09:00
55ae9eac1e fix: fixed issues identified in eslint 2023-11-09 10:06:03 +09:00
05564d4a58 feat: add auto-importer for menu 2023-11-09 09:57:32 +09:00
59426c56db feat: plugin auto-importer with vite-plugin-resolve (#1385) 2023-11-09 09:22:23 +09:00
18cd4c0c9a chore(navigation): remove unused css attribute 2023-11-08 18:15:24 +09:00
a0e2a33e28 fix: change titleBarOverlay height based on zoomFactor
- fix #1375
2023-11-08 17:48:32 +09:00
7bdb46e161 fix: fixed an issue if "Always on top" is enabled, the dialog is displayed below the window
- fix #1379
2023-11-08 16:35:19 +09:00
f560b62de0 fix(precise-volume): fix precise-volume plugin 2023-11-08 02:59:20 +09:00
adc1f6822b fix: image path 2023-11-07 23:43:16 +09:00
2da29fcfa7 feat: migrate from rollup to electron-vite (#1364)
* feat: electron-vite PoC

* fix: fix preload path

* remove rollup deps and config

* fix: debug mode

* fix: build mode, asset path

* fix: remove unused dependencies

* feat: use `executeJavaScriptInIsolatedWorld` instead of `executeJavaScript`

* feat: enable `minify`

* fix(actions): update task name

* fix: fix dev mode check

* fix: remove unused variable
2023-11-07 19:49:28 +09:00
c5d0314db6 fix(winget): fix env name 2023-11-07 08:27:20 +09:00
8c052faedd fix: fix winget version (fix #1363) 2023-11-06 17:38:57 +09:00
37067ff950 fix: update jsdoc 2023-11-06 17:22:46 +09:00
6366dc026e feat: enable context-isolation (#1361) 2023-11-06 17:21:29 +09:00
6e52178074 fix: fix README 2023-11-06 17:13:47 +09:00
47f38cc690 fix: add workaround for podcast type video (#1362) 2023-11-04 16:56:41 +09:00
fdd6d9929f fix: temporary workaround for #1356 2023-11-04 10:58:32 +09:00
1707261f49 chore(deps): bump deps 2023-11-04 10:58:14 +09:00
6712fced6d fix: fix broken menu-layout (#1360) 2023-11-04 10:46:49 +09:00
6dabfaa9ba fix: use window instead of (global as any) 2023-11-04 10:30:39 +09:00
a41db79c35 fix(deps): fix pnpm.overrides 2023-11-03 10:09:04 +09:00
87786d9aef chore(deps): update dependency node-gyp to v10.0.1 2023-11-03 09:57:24 +09:00
22f5866050 chore(deps): update dependency @electron/universal to v1.4.4 2023-11-03 09:57:12 +09:00
04894fbcf5 chore(deps): update dependency node-gyp to v10 2023-11-02 12:51:52 +09:00
c17c624ba4 chore(deps): bump deps 2023-11-02 12:48:44 +09:00
bfe7249df8 Add Homebrew cask install option for MacOS. (#1357) 2023-11-02 09:42:13 +09:00
13c570efe9 fix: use node-fetch v3 instead of v2
- auto-change: moved from devDependencies to npx
2023-10-29 06:17:33 +09:00
b299846f0f fix: fix node-gyp version 2023-10-29 06:09:47 +09:00
59e9289d27 remove: remove patch-package
- see https://github.com/LuanRT/YouTube.js/pull/509
2023-10-29 06:05:15 +09:00
8dc29caa1b chore(actions): update setup-node v3 to v4 2023-10-29 06:02:03 +09:00
7fedf88654 chore(deps): bump deps version
- rollup: 4.1.4 to 4.1.5
- node-gyp: 9.4.0 to 9.4.1
- @cliqz/adblocker: 1.26.8 to 1.26.9
- youtubei.js: 6.4.1 to 7.0.0
- pnpm: 8.9.2 to 8.10.0
2023-10-29 05:54:43 +09:00
5da0202425 Update changelog for v2.2.0 2023-10-26 17:16:26 +00:00
6288d0b171 Bump version to 2.2.0 2023-10-27 02:01:44 +09:00
4248d20e8e bump deps 2023-10-25 16:46:59 +09:00
0b413492ad feat(ambient-mode): add config for ambient-mode plugin (#1349) 2023-10-25 15:37:51 +09:00
dc73561c8a Update changelog for v2.1.3 2023-10-22 15:50:12 +00:00
949a2f6428 Bump version to 2.1.3 2023-10-23 00:35:10 +09:00
bceaa05197 fix(store): fix listenAlong statement 2023-10-23 00:29:59 +09:00
776cdac30d feat(discord): rename Listen Along to Play on YTM
resolve #1341
2023-10-23 00:27:43 +09:00
4333891cca chore(deps): bump deps 2023-10-23 00:19:42 +09:00
8a89bbccf7 fix: fixed bugs in downloader (#1342) 2023-10-23 00:19:01 +09:00
fa4c69d228 Update changelog for v2.1.2 2023-10-19 13:55:04 +00:00
c25def8901 Bump version to 2.1.2 2023-10-19 22:39:14 +09:00
284a59b721 fix: fix unresponsive (fix #1325) 2023-10-19 22:35:32 +09:00
5fcba8619a feat(in-app-menu): add an option to hide the window controls (#1335) 2023-10-19 22:34:18 +09:00
f3cd759276 fix: fixed an issue where the album name was missing (#1334) 2023-10-19 21:45:46 +09:00
9d3981e361 chore: Update build.yml 2023-10-19 21:33:54 +09:00
787326948b chore: making actions more efficient 2023-10-19 09:51:31 +09:00
779251933c chore(deps): update dependency electron to v27.0.1 (#1331) 2023-10-19 09:42:41 +09:00
1efe835c69 fix: fixed an issue where only the first 100 songs in a playlist were downloaded (#1329) 2023-10-19 05:40:05 +09:00
5702978227 chore(deps): update dependencies 2023-10-18 18:18:28 +09:00
fa3d742838 chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.8.0 2023-10-18 02:21:25 +09:00
c460cc2296 Updated readme plugins list (#1326) 2023-10-17 20:04:23 +09:00
4e4af5e830 fix(actions): fix if statement 2023-10-16 22:55:04 +09:00
9a4e98063b chore(actions): disable pnpm cache for macOS 2023-10-16 22:54:11 +09:00
8bfe04bb50 chore: update issue template
Thanks to Alipoodle for writing this question.
2023-10-16 22:42:02 +09:00
6774d54f5e chore(deps): update dependency rollup to v4.1.4 2023-10-16 16:41:36 +09:00
9705f8489d chore(deps): Bump @rollup/plugin-commonjs, pnpm version, Remove ytpl 2023-10-16 16:24:16 +09:00
a7229cbe14 Bump @rollup/plugin-commonjs, pnpm version 2023-10-16 03:08:04 +09:00
7577aba45e feat: use test:debug for CI 2023-10-16 02:08:25 +09:00
d78fbe476e hotfix: fix Cannot read properties of undefined (reading 'removeChild') 2023-10-16 01:09:24 +09:00
bfe4b2bba7 fix(actions): use GabrielBB/xvfb-action instead of coactions/setup-xvfb 2023-10-16 00:58:02 +09:00
7625a3aa52 QOL: Move source code under the src directory. (#1318) 2023-10-15 21:52:48 +09:00
30c8dcf730 fix: release action 2023-10-15 18:54:25 +09:00
00a3e8d35e chore(deps): Bump rollup, @xhayper/discord-rpc version 2023-10-15 18:35:57 +09:00
4d01cdfa6c fix(blocker): remove the app.isPackaged check (fix #1315) 2023-10-15 18:33:14 +09:00
f924b6c8e3 fix(actions): install pnpm before call setup-node 2023-10-15 18:28:09 +09:00
926d98174c fix: fix build actions 2023-10-15 18:22:19 +09:00
41b3972f54 chore(README): add pnpm install guide 2023-10-15 18:20:49 +09:00
467f29e363 feat: migrate from npm to pnpm (#1316) 2023-10-15 18:18:20 +09:00
9cc13c3757 Merge pull request #1317 from foonathan/fix-loop-status 2023-10-15 04:23:33 +09:00
f8ccb86156 Fix mpris player.loopStatus 2023-10-14 21:03:06 +02:00
b316aa2301 chore(deps): update dependency rollup to v4.1.0 2023-10-14 22:33:09 +09:00
5c49b28664 fix(discord): Discord RPC fails if a song's title is only one character (fix #1314) 2023-10-14 20:27:58 +09:00
dedf96afd3 Update changelog for v2.1.1 2023-10-14 05:49:56 +00:00
3bb5bc2ca1 Bump version to 2.1.1 2023-10-14 14:34:39 +09:00
c79fdd9887 fix: empty title playlist directory path 2023-10-14 14:03:47 +09:00
d7b821727d hotfix(downloader): can't get an album title (fix #1313) 2023-10-14 13:55:57 +09:00
TC
21c45faf20 Add "about" menu to show app version 2023-10-13 22:04:50 +02:00
92cab89d17 Update changelog for v2.1.0 2023-10-13 19:27:20 +00:00
fa160b2e90 Bump version to 2.1.0 2023-10-14 04:09:52 +09:00
308ac38e6b feat(downloader): Added support for audio format auto-detection (#1310) 2023-10-14 03:42:10 +09:00
a62cafb601 feat(in-app-menu): enable in-app-menu by default (in Windows) (#1311) 2023-10-14 03:07:06 +09:00
bf9e3b5f48 hotfix(downloader): fix invalid query selector (fix #1308) 2023-10-13 22:06:27 +09:00
3c6b3aeff0 chore(deps): bump dependencies 2023-10-12 13:39:14 +09:00
37181a7b5e chore(actions): create winget-cla.yml 2023-10-12 12:51:17 +09:00
0b363d6487 fix: winget publish (#1307)
* chore(actions): Update build.yml

* fix: installer regex
2023-10-12 08:01:10 +09:00
e9398adac3 Update changelog for v2.0.4 2023-10-11 16:02:44 +00:00
6901713036 Bump version to 2.0.4 2023-10-12 00:46:04 +09:00
1d5b2997bd fix(downloader): private playlist download 2023-10-12 00:41:58 +09:00
572a023aaa fix: fixed an issue with the initial launch in certain regions, such as South Korea 2023-10-11 23:09:05 +09:00
9187f1e240 Revert "fix: set default adblocker as InPlayer"
This reverts commit 85228fd7d2.
2023-10-11 22:47:56 +09:00
df13d7d0f3 Merge pull request #1304 from th-ch/fix/deps 2023-10-11 22:37:16 +09:00
85228fd7d2 fix: set default adblocker as InPlayer
Fixed an issue with the initial launch in certain regions, such as South Korea.
2023-10-11 22:12:54 +09:00
17ba071057 fix: crash before window loaded 2023-10-11 21:59:03 +09:00
d7df4d7d10 fix: fix It Just Works
Fixed an issue that caused inconsistent execution results.
2023-10-11 19:28:01 +09:00
7aa970cebc fix: bump dependencies 2023-10-11 18:24:11 +09:00
f08f003cf4 Merge pull request #1301 from th-ch/fix/1300
hotfix(adblocker): fix `ipcRenderer.sendSync() with ...`
2023-10-11 08:53:22 +09:00
9f99eded9e chore(readme): update build instruction 2023-10-11 08:48:36 +09:00
c512f13009 hotfix(adblocker): fix ipcRenderer.sendSync() with ...
This issue is caused by the renderer's adblocker being loaded before the main process's adblocker.
2023-10-11 02:01:44 +09:00
b475f780ff Merge pull request #1296 from Lucasamiel0406/master 2023-10-11 00:23:11 +09:00
2294102006 Merge pull request #1297 from nnnlog/master
fix(downloader): Korean filename is broken on non-macOS devices
2023-10-10 16:48:43 +09:00
d69a07d025 fix(downloader): normalize filename depending on OS 2023-10-10 16:05:09 +09:00
4f4995c20c fix: typo in readme.md 2023-10-10 15:54:55 +09:00
b6894dca29 chore(deps): bump deps 2023-10-10 14:10:33 +09:00
73f14e581d Fix Library removed for Premium users
As by now, the code removes the last child of the YT's buttons sidebar. It's good for non-premium users but affects premium users, as it removes the "Library" button.

This small fix targets the 4th child (usually the Upgrade button location) instead of last child.

A bad move/practice, but does its job and remove the Upgrade button while not removing the Library one.
2023-10-09 20:56:08 -03:00
2f2e64af4a Update changelog for v2.0.3 2023-10-09 16:06:41 +00:00
5710307ddc Bump version to 2.0.3 2023-10-10 00:51:44 +09:00
52ba2dc9ff remove: migration scripts 2023-10-10 00:51:16 +09:00
926b9fb5e6 feat: add migration script 2023-10-10 00:42:26 +09:00
a6c9b3381a fix(discord): apply hideGitHubButton 2023-10-10 00:42:10 +09:00
5dc13a4698 feat(discord): add Hide GitHub link Button (#1293) 2023-10-10 00:15:15 +09:00
a69085c591 fix: chore(deps): update dependency @jellybrick/mpris-service to 2.1.4 (fix #971) 2023-10-09 21:55:23 +09:00
a22f7fed21 feat(deps): bundle youtubei.js (temporary solution) (#1292) 2023-10-09 21:30:53 +09:00
8b7045fb1b chore(deps): update dependency @rollup/plugin-node-resolve to v15.2.3 2023-10-09 20:16:40 +09:00
efd1b92514 feat(defaults): change the default value of blocker back to WithBlocklists 2023-10-09 19:52:02 +09:00
969f6d7bba chore(deps): Bump @cliqz/adblocker-electron to 1.26.8 (fix #1269) 2023-10-09 19:50:27 +09:00
4f7c92d6a0 feat(plugins/utils): mediaIcons as const 2023-10-09 19:49:40 +09:00
24d4a50574 fix(mpris): fixed an issue where MPRIS information was incorrect (#1291) 2023-10-09 19:36:17 +09:00
7693a3ba4a fix(discord): fixed an issue where timeChanged was not being applied to Discord activities (#1290) 2023-10-09 19:36:06 +09:00
7ca4dc5c85 Fix: typo in README (#1286) 2023-10-08 23:54:58 +09:00
21ff09b605 Merge pull request #1283 from th-ch/fix/missing-taskbar-mediacontrol-icons 2023-10-08 19:57:50 +09:00
fbf4b3b8b5 fix: missing icons taskbar-mediacontrol 2023-10-08 19:41:39 +09:00
5812eb0147 Update changelog for v2.0.2 2023-10-08 08:51:28 +00:00
b5dbfaf686 Bump version to 2.0.2 2023-10-08 17:35:40 +09:00
6b7fd5ba63 Merge pull request #1272 from th-ch/feat/resolves-1265 2023-10-08 17:19:19 +09:00
73a049a7bc Merge pull request #1279 from th-ch/fix/1274 2023-10-08 17:18:54 +09:00
ef0c30e23a Merge pull request #1280 from th-ch/revert-scale-factor-patch 2023-10-08 17:18:33 +09:00
59ed2326d9 Revert "Fix for windows zoom (ScaleFactor) #1159"
This reverts commit d36fb592d0.
2023-10-08 17:06:30 +09:00
07a02c8c82 Revert "hotfix: fixed app launching offscreen"
This reverts commit ca92031e89.
2023-10-08 17:05:54 +09:00
f1050cb676 remove: remove useless CSS property 2023-10-08 15:35:08 +09:00
7131893f1c chore: update README
Added a guide to install YTM without a network connection.
2023-10-08 15:21:04 +09:00
e4dfb2ff33 feat(discord): remove hacky solution for calling callbacks 2023-10-08 15:01:26 +09:00
187fad6834 Merge branch 'master' into fix/1274 2023-10-08 15:00:30 +09:00
26df435db0 fix: fallback to DOM window controls on platforms without native support 2023-10-08 14:57:58 +09:00
0bee281d1d fix: discord-rpc (#1278) 2023-10-08 14:44:48 +09:00
26de5802a0 fix: prevent multiple RPCs from being registered 2023-10-08 13:55:40 +09:00
c258a4855e Merge pull request #1277 from th-ch/hotfix/1273 2023-10-08 12:56:16 +09:00
b7b6d50ba2 Merge pull request #1276 from jkrei0/master 2023-10-08 12:56:03 +09:00
0376a30fbb fix: prevent name shadowing 2023-10-08 12:39:24 +09:00
ca92031e89 hotfix: fixed app launching offscreen 2023-10-08 12:29:09 +09:00
986d2ad5b1 chore: add window control icons 2023-10-08 12:12:44 +09:00
d9b8d8c48d Fix in-app-menu squishing sub-menu items 2023-10-07 22:50:32 -04:00
0ef34d7c71 feat: use nsis-web instead of nsis 2023-10-08 03:04:53 +09:00
f87607d25d Merge pull request #1271 from th-ch/fix/lastfm 2023-10-08 02:54:13 +09:00
cc0bfae067 fix(last-fm): fix last-fm plugin 2023-10-08 02:41:06 +09:00
e7d2d04f5a fix(test): Add a test to check the title
It failed because of @cliqz/adblocker-electron.
Check see this issue: https://github.com/ghostery/adblocker/issues/3462
2023-10-08 01:16:11 +09:00
f4319ebc6b Update changelog for v2.0.1 2023-10-07 15:57:46 +00:00
a1f025e23c Bump version to 2.0.1
Hotfix for #1269, #1267
2023-10-08 00:44:38 +09:00
c002263c3b hotfix: hotfix for #1267 2023-10-08 00:39:36 +09:00
2d69dfd333 Update changelog for v2.0.0 2023-10-07 14:33:28 +00:00
9d99ffdc72 Bump version to 2.0.0 (#1257)
Co-authored-by: JellyBrick <shlee1503@naver.com>
2023-10-07 23:20:33 +09:00
a859b27eba Merge branch 'master' of https://github.com/th-ch/youtube-music 2023-10-07 22:53:32 +09:00
be26827609 feat(build-windows): Add support for IA32 (resolves #1110) 2023-10-07 22:51:50 +09:00
457a8b5018 Merge pull request #1259 from organization/feat/fork-to-main 2023-10-07 22:46:43 +09:00
0442e427a6 feat: rename Proxy label to Set Proxy 2023-10-07 22:27:08 +09:00
d45ca960b4 feat(in-app-menu): add toggle-menu 2023-10-07 22:16:54 +09:00
0bcfdbf39c chore: update README 2023-10-07 19:12:13 +09:00
e3b5afda3e feat(GitHub): add issue template (#1264) 2023-10-07 18:40:43 +09:00
97297a2c49 Merge remote-tracking branch 'origin/custom-version' into feat/fork-to-main 2023-10-07 12:51:40 +09:00
11ac756da5 chore(deps): update stefanzweifel/git-auto-commit-action action to v5 2023-10-07 12:51:16 +09:00
a273d13086 chore(deps): update dependency eslint to v8.51.0 2023-10-07 12:51:08 +09:00
ca11120036 fix: remove title check
YTM doesn't set the title after 2023-10-06
2023-10-07 12:48:53 +09:00
7dac9a2454 fix: need copying error.html to dist directory 2023-10-07 12:29:46 +09:00
30e0e99467 remove: versioning.md 2023-10-07 12:27:39 +09:00
275d8cb2b9 fix: build.yml 2023-10-07 12:27:05 +09:00
1cc46daead fix: .eslintignore 2023-10-07 12:24:53 +09:00
9048da22f9 fix: rollback changelog 2023-10-07 12:24:13 +09:00
70fa5aa217 fix(captions): fix configuration 2023-10-07 12:17:42 +09:00
6bf7f3b9eb chore: update package-lock.json 2023-10-07 12:12:40 +09:00
67579877bc fix: call pluginEnabledMenu(pluginName, pluginLabel) 2023-10-07 12:10:41 +09:00
534f96921e fix: beta label for lumiastream 2023-10-07 12:06:57 +09:00
22491ae0a0 feat: register the lumiaStream plugin 2023-10-07 12:05:16 +09:00
dd39bdd84c fix(menu): type error 2023-10-07 12:04:42 +09:00
935a307235 fix(index): electron.screen -> screen 2023-10-07 12:02:03 +09:00
517e9c0472 Merge branch 'origin-master' into feat/fork-to-main 2023-10-07 12:01:06 +09:00
b2c27b9fdb feat: prepare the fork for merging 2023-10-07 11:56:04 +09:00
8acfabf9f8 chore(deps): update dependency rollup to v4.0.2 2023-10-06 19:20:37 +00:00
375fb082f0 fix(lyrics-genius): fix th-ch/youtube-music#1253 2023-10-06 21:15:01 +02:00
TC
8b65f1d6e4 add player method "open" for mpris #1155 2023-10-06 21:10:58 +02:00
TC
d36fb592d0 Fix for windows zoom (ScaleFactor) #1159 2023-10-06 21:06:36 +02:00
TC
575a643e55 Enhance Discord RPC Presence with direct link to Git Repository 2023-10-06 21:04:11 +02:00
TC
07853d8b39 Changed ZoomIn ZoomOut Shortcuts to Ctrl+I/Ctrl+O 2023-10-06 21:00:50 +02:00
TC
da9cb8e2f5 Add lumiastream beta plugin 2023-10-06 20:58:18 +02:00
TC
22acaf688f Backport ambient mode plugin 2023-10-06 20:33:49 +02:00
TC
063ba1b6c7 Backport album color theme plugin 2023-10-06 20:20:03 +02:00
TC
0229ccaa1e Fixed canvas injected at the wrong position #1234 2023-10-06 20:08:08 +02:00
df1e28546b Merge pull request #1235 from organization/feat/typescript
feat: I guess it's TypeScript
2023-10-06 20:05:57 +02:00
1806d5a0a2 fix: fix the downloader to work in a proxy environment (resolve #46) 2023-10-06 23:22:15 +09:00
59efba4dec chore(deps): update dependency rollup to v4.0.1 2023-10-06 14:19:42 +00:00
670ed62360 chore(deps): update dependency rollup to v4 (#44)
* chore(deps): update dependency rollup to v4

* chore(deps): bump rollup to v4

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: JellyBrick <shlee1503@naver.com>
2023-10-06 09:21:29 +09:00
6a2b393b45 chore(deps): update dependency @rollup/plugin-wasm to v6.2.2 2023-10-06 08:52:08 +09:00
4488a3adba chore(deps): update dependency @rollup/plugin-terser to v0.4.4 2023-10-06 08:51:55 +09:00
eb7ef7ab36 chore(deps): update dependency @rollup/plugin-typescript to v11.1.5 2023-10-06 08:50:10 +09:00
dcadf0a31a chore(deps): update dependency @rollup/plugin-node-resolve to v15.2.2 2023-10-06 08:49:28 +09:00
3dda8b7c2e chore(deps): update dependency @rollup/plugin-json to v6.0.1 2023-10-05 22:27:03 +00:00
947007cc59 chore(deps): update dependency @rollup/plugin-image to v3.0.3 2023-10-05 18:51:19 +00:00
bf5ac285d3 chore(deps): update dependency @rollup/plugin-commonjs to v25.0.5 2023-10-05 17:12:29 +00:00
5dfbdd4882 Update changelog for v2.1.0 2023-10-05 10:23:43 +00:00
3cd1f79886 release 2.1.0 2023-10-05 19:10:47 +09:00
04234f0b3f Merge pull request #36 from organization/docs/versioning 2023-10-05 19:09:07 +09:00
7b30896091 chore(docs): versioning 2023-10-05 19:07:56 +09:00
2cf29fe88d Merge pull request #35 from organization/fix/sharp 2023-10-05 19:04:41 +09:00
09ce665df1 feat: remove sharp, fast-average-color-node deps 2023-10-05 19:01:54 +09:00
299f34d98e chore: Update readme.md 2023-10-05 11:50:17 +09:00
1af73a7cf8 Update changelog for v2.0.3 2023-10-04 15:26:38 +00:00
bcc7397f26 release 2.0.3 2023-10-05 00:11:38 +09:00
95ac01c9ba Merge pull request #33 from organization/feature/ambient-mode 2023-10-04 23:57:57 +09:00
edd7b80fcd fix: fix #34 2023-10-04 23:57:19 +09:00
231514ae0d fix: fix #32 2023-10-04 23:51:21 +09:00
0c948d5ea1 feat(ambient-mode): improve performance 2023-10-04 23:43:45 +09:00
50117ea51b fix: fix #29 2023-10-04 22:53:25 +09:00
78d8160823 fix: fix #30 2023-10-04 22:30:11 +09:00
81b2303a6f feat(ambient-mode): add ambient effect interpolation 2023-10-04 22:22:41 +09:00
f7a09082a5 Update changelog for v2.0.2 2023-10-04 12:18:27 +00:00
ca318450b8 release 2.0.2 2023-10-04 21:02:59 +09:00
e86739c99c fix: fix #29 2023-10-04 20:59:32 +09:00
92a3a55803 fix: fix #30 2023-10-04 20:30:04 +09:00
7479f2f697 feat(ambient-mode): add ambient-mode plugin 2023-10-04 20:28:14 +09:00
371a7eb475 hotfix: fix #28 2023-10-04 20:22:50 +09:00
84f6e46efc revert "chore(deps): update dependency node-fetch to v3"
auto-changelog needs node-fetch v2 (cjs)
2023-10-04 20:11:20 +09:00
110dbd3e18 release 2.0.1 2023-10-04 19:35:52 +09:00
4b7d94b1d5 chore: bump dependencies 2023-10-04 19:26:46 +09:00
9c4aa4bcb2 chore(deps): update actions/checkout action to v4 2023-10-04 18:41:34 +09:00
a7fd8bc21b feat: configure renovate 2023-10-04 18:34:06 +09:00
548f82ba0a fix rollup hanging 2023-10-04 18:32:08 +09:00
127e325b2b release 2.0.0 2023-10-04 18:04:52 +09:00
40745d3946 feat: apply rollup 🚀 (#20)
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-10-04 17:51:39 +09:00
2c337953eb fix(album-color-theme): fix album-color-theme not working in macos 2023-10-04 00:15:54 +09:00
61cb3135f3 fix(macos): fix some plugins not working in macos 2023-10-04 00:12:49 +09:00
1a2f20042b Merge branch 'custom-version' of https://github.com/organization/youtube-music-next into custom-version 2023-10-03 23:42:35 +09:00
6e315b9af2 refactor: remove dynamic require (partial of #2)
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-10-03 23:42:12 +09:00
9438cd8b26 fix: resolve #12 2023-10-03 19:06:13 +09:00
6eadc7f7e5 fix(precise-volume): fix slider ui does not sync
resolve #15
2023-10-03 18:21:43 +09:00
399c6e37ce fix(video-toggle): fix video config not load config
resolve #16
2023-10-03 18:03:13 +09:00
16a32d1946 Update changelog for v1.20.4 2023-10-03 05:31:53 +00:00
45b7422ea8 release 1.20.4 2023-10-03 14:18:06 +09:00
76c570413a fix: Mitigation for issue #2 2023-10-03 14:16:31 +09:00
b9ea98c115 fix(in-app-menu): remove unused observer 2023-10-03 12:56:49 +09:00
2c38b8a764 fix(tuna-obs): change to not print messages when not in development mode 2023-10-03 12:44:00 +09:00
7af418a040 fix(in-app-menu): fix titlebar margin 2023-10-03 12:39:36 +09:00
bc40fc3d49 fix: remove FluentScrollbar 2023-10-03 11:11:39 +09:00
831aa3d391 feat: add startingPage unset option 2023-10-03 11:09:45 +09:00
2fe391beba Merge branch 'feat/typescript' into custom-version 2023-10-03 10:51:52 +09:00
47bd015549 chore(deps): bump deps 2023-10-03 10:51:25 +09:00
2cb05c9d86 fix(in-app-menu): overlay-scrollbar 2023-10-03 10:45:01 +09:00
5a7774e7b1 refactor(in-app-menu): refactor in-app-menu plugin
resolve #13
2023-10-03 03:31:25 +09:00
a5fe8bc589 feat(precise-volume): add shadow on volume text 2023-10-02 21:50:52 +09:00
aed1bbc6d7 fix(lyrics-genius): fix th-ch/youtube-music#1253 2023-10-02 21:00:53 +09:00
042083b112 feat(disable-autoplay): add apply once, resolve #9 2023-10-02 19:08:17 +09:00
61b04e9b42 fix: fix #4 2023-10-02 18:04:51 +09:00
f655cdf953 fix: fix #7 2023-10-02 17:24:17 +09:00
4118b4b6c4 Update changelog for v1.20.3 2023-10-01 04:00:55 +00:00
5cd2e78e88 release 1.20.3: fix updater download link 2023-10-01 12:49:25 +09:00
70b5e579b1 chore: Update index.html 2023-10-01 12:42:02 +09:00
71f2123f27 release 1.20.2 2023-10-01 12:33:38 +09:00
40fa1bac92 fix: CVE-2023-4863, CVE-2023-5129 2023-10-01 12:32:43 +09:00
10049d1ee9 chore: update README 2023-10-01 12:25:53 +09:00
faaf54d0b0 Update changelog for v1.20.1 2023-09-30 11:22:12 +00:00
7224620350 fix(actions): fix release upload 2023-09-30 20:10:23 +09:00
549f0f7c7a Merge branch 'feat/typescript' into custom-version 2023-09-30 20:01:50 +09:00
529d5e165c fix: fix 'Application entry file Not found' 2023-09-30 20:01:31 +09:00
35f6064b7a fix(actions-linux): release 2023-09-30 19:47:52 +09:00
c11ec3341a release 1.20.1 2023-09-30 19:39:37 +09:00
b7142000ab fix: release 2023-09-30 19:28:38 +09:00
e3d41ccb95 chore(Actions): update workflows 2023-09-30 19:27:12 +09:00
1067417dbd Merge branch 'feat/typescript' into custom-version 2023-09-30 18:46:43 +09:00
c554ed79b1 fix(prompt-custom-titlebar): fix customScript is not function 2023-09-30 18:46:16 +09:00
8fd6bdbdf3 fix(album-color-theme): use 30 instead of 25 2023-09-30 15:16:46 +09:00
92ecf6a0b0 fix(album-color-theme): dynamic lightness 2023-09-30 15:16:04 +09:00
8d475eda0a Merge branch 'feat/typescript' into custom-version 2023-09-30 08:45:07 +09:00
46d3a85cc0 fix: remove unnecessary JSON.stringify & JSON.parse 2023-09-30 08:43:10 +09:00
72660f5aa1 fix: reduce unchecked type-cast 2023-09-30 08:35:16 +09:00
8fa1c7e5a8 Merge branch 'feat/typescript' into custom-version 2023-09-30 06:04:47 +09:00
f532398a9c chore(deps): bump electron version 2023-09-29 10:17:35 +09:00
6bb33453c7 feat: Album Color Theme plugin
Co-authored-by: EdiBOI25 <86252338+EdiBOI25@users.noreply.github.com>
2023-09-27 18:19:23 +09:00
170e2a696e cherry-picked: Fixed canvas injected at the wrong position
Co-authored-by: MiepHD <63968466+MiepHD@users.noreply.github.com>
2023-09-27 17:13:51 +09:00
1ff69c933c chore(deps): bump electron version 2023-09-27 17:08:42 +09:00
0935edd516 chore(deps): bump electron version 2023-09-26 12:09:46 +09:00
e7e3e8abe0 chore(deps): bump deps, remove unused dependency (@types/youtube-player) 2023-09-26 02:47:50 +09:00
3e77064cd3 chore(deps): bump deps 2023-09-23 21:49:34 +09:00
4651d6d241 feat(adblocker): change default blocker to the blocklist (ghostery/adblocker#3420) 2023-09-21 03:52:33 +09:00
7418a1f4b2 feat: use TS private keyword instead of JS private identifier 2023-09-21 03:38:53 +09:00
c6bba51166 chore(deps): bump deps 2023-09-20 13:32:06 +09:00
c8b149281b fix: update GitHub Actions script 2023-09-19 22:32:37 +09:00
3276e318d8 chore(deps): bump deps 2023-09-19 13:15:57 +09:00
d0d739e61f fix: add back butterchurn 2023-09-18 06:44:48 +09:00
3f3a5483ed fix: Issues with TrustedTypes being reflected incorrectly 2023-09-18 06:42:27 +09:00
c90ab00c09 fix: vudio 2023-09-18 04:19:37 +09:00
5e29235c03 feat: use policy cache instead of creating a new policy for each request 2023-09-18 03:24:49 +09:00
e81671f4da fix: fix npm run lint command 2023-09-18 03:08:45 +09:00
fbf92971a5 fix: TrustedHTML warning 2023-09-18 03:08:15 +09:00
0c06d59a47 fix: fix #1187 2023-09-18 01:49:57 +09:00
5237311f1f chore(deps): bump deps 2023-09-17 21:53:13 +09:00
7d355ea1f2 fix: resolves #978 2023-09-13 22:52:06 +09:00
ad8b9c9bf7 fix: resolves #958 2023-09-13 21:54:45 +09:00
f2b532d8fa chore(deps): bump electron version 2023-09-13 17:45:42 +09:00
c6ee222e43 chore(deps): bump deps 2023-09-12 10:52:01 +09:00
9739dbe27f fix(download): Crashes due to genius-lyrics feature 2023-09-11 15:58:44 +09:00
1d6f1d2216 chore(deps): bump deps 2023-09-10 18:39:41 +09:00
563daae11a chore(README): update README 2023-09-04 18:58:03 +09:00
451d33707a fix: downloader
For example, in South Korea, YouTube Music is only available to YT premium users.
Therefore, calling getInfo without passing a cookie will always return `UNPLAYABLE`.
2023-09-04 18:01:54 +09:00
ce264c5d65 fix: minor fix 2023-09-04 17:45:25 +09:00
9b6e3c850a fix(config): fix missing semi-colon 2023-09-04 17:38:44 +09:00
ae1e106ccd feat(config): more 'optimized' generic 2023-09-04 17:38:03 +09:00
b362118207 fix: discord plugin 2023-09-04 17:20:33 +09:00
73287cf8b2 fix: assets path 2023-09-04 17:20:07 +09:00
42ad78c6cc fix(package.json): macOS exclude path 2023-09-04 16:29:28 +09:00
031875ad86 fix: show interactive icon when using non-packaged mode 2023-09-04 15:50:35 +09:00
27086e759f fix: fix youtube-age-restriction-bypass
Co-authored-by: MiepHD <63968466+MiepHD@users.noreply.github.com>
2023-09-04 13:44:53 +09:00
913c69a33d feat(youtube-player-api): fix type definitions 2023-09-04 12:35:46 +09:00
2eaa660a6d feat: add more type-definitions for youtube-player
Co-authored-by: ArjixWasTaken <53124886+ArjixWasTaken@users.noreply.github.com>
2023-09-04 12:25:43 +09:00
d811ebadb4 remove unused dependencies 2023-09-04 04:04:55 +09:00
774815c4e5 remove: butterchurn (it does not work on node v18) 2023-09-04 03:55:14 +09:00
a5bdb257d4 fix: remove (abstract) visualizer from menu
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-09-04 03:53:48 +09:00
72c8c49edf fix: apply fix from eslint 2023-09-04 03:50:44 +09:00
68d985acba fix: Fixes the video-toggle being displayed at the wrong position on fullscreen (#1218)
Co-authored-by: MiepHD <63968466+MiepHD@users.noreply.github.com>
2023-09-04 03:28:50 +09:00
76a7b303fa Merge remote-tracking branch 'th-ch/master' into feat/typescript 2023-09-04 03:25:47 +09:00
b5472c11df fix: fix plugins cannot load config 2023-09-04 03:04:44 +09:00
0c45f9850b Merge pull request #1225 from sitiom/master-1
Change Winget Releaser job to `ubuntu-latest`
2023-09-03 19:58:24 +02:00
999d4ab4ab Merge pull request #1218 from MiepHD/fix-wrong-position-of-video-toggle-on-fullscreen
Fixes the video-toggle being displayed at the wrong position on fullscreen
2023-09-03 19:51:20 +02:00
5069913c56 update build script 2023-09-04 02:42:25 +09:00
88dea85f03 Merge pull request #1206 from GoudronViande24/master
Fix Remove upgrade button
2023-09-03 19:40:49 +02:00
85793d70f7 Merge pull request #1221 from MiepHD/fix-blackscreen-of-bypass
Fixed Age Restriction Bypass
2023-09-03 19:38:57 +02:00
12825d8bf2 fix: require 2023-09-04 02:30:16 +09:00
53f5bda382 feat: migration to TypeScript FINAL
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-09-04 02:27:53 +09:00
c0d7972da3 fix: Remove upgrade button
https://github.com/th-ch/youtube-music/pull/1206
2023-09-03 21:05:22 +09:00
278618bc83 feat: migration to TypeScript part 3
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-09-03 21:02:57 +09:00
03c1ab0e98 feat(exponential-volume): fix type of function
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-09-03 17:29:47 +09:00
8b5a094eb5 feat(exponential-volume): fix type of WeakMap
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-09-03 16:57:36 +09:00
1f52995dc4 feat(exponential-volume): migration to TypeScript 2023-09-03 16:55:21 +09:00
d30755e5fa feat: migration to TypeScript part 2
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-09-03 06:37:47 +09:00
82bcadcd64 feat: typescript part 1
Co-authored-by: Su-Yong <simssy2205@gmail.com>
2023-09-03 00:25:48 +09:00
3e3fdb3c3f fix: use net.fetch instead of node native fetch 2023-09-01 21:22:21 +09:00
b67a4ed9bb chore(deps): electron 27.0.0-alpha.5 2023-09-01 21:21:34 +09:00
06b9cf9255 chore(deps): electron 27.0.0-alpha.4 2023-08-30 22:05:36 +09:00
4284bcc329 fix: video event listener 2023-08-30 21:46:23 +09:00
aacc2d261b chore(deps): remove node-fetch, migration to node v18 fetch API 2023-08-29 21:15:22 +09:00
92da06eb96 fix(in-app-menu): custom-electron-titlebar 2023-08-29 19:37:31 +09:00
897cfd3c7d apply fix from eslint 2023-08-29 19:14:51 +09:00
c722896a73 fix: remove xo, migration to eslint 2023-08-29 17:22:38 +09:00
31a7588cee chore(adblocker): update filters 2023-08-29 17:00:33 +09:00
da69d4c5a6 chore(deps): pinned deps version 2023-08-29 17:00:06 +09:00
ce0ee82648 fix simple-youtube-age-restriction-bypass version 2023-08-29 16:59:06 +09:00
c837f104f7 bump deps version, remove yarn 2023-08-29 16:54:26 +09:00
2f73548701 fix(tuna): handle playPaused (#1) 2023-08-29 15:43:58 +09:00
efb92a3513 Change Winget Releaser job to ubuntu-latest 2023-08-18 10:40:47 +08:00
98fc8e3b9d Changed to a dependency 2023-08-13 18:01:19 +02:00
6f0d4fbbe4 Fixed Age Restriction Bypass
Used https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass/issues/209#issuecomment-1676146296 to generate a new file on https://github.com/MiepHD/Simple-YouTube-Age-Restriction-Bypass-electron and added this here
2023-08-13 10:36:52 +02:00
dab97293be Fixes the video-toggle being displayed at the wrong position on fullscreen 2023-08-11 20:00:40 +02:00
TC
f2149e3b72 Fix draggable elements 2023-08-05 12:00:55 +02:00
48b0469a4e Fix Remove upgrade button
For some reason now it loads later, so I just added some CSS to hide it in the DOM instead of the element
2023-07-17 00:42:33 -04:00
1add1a2233 change css query to target upgrade button 2023-07-16 23:55:35 -04:00
9f4187e64a Merge pull request #1190 from th-ch/compact-sidebar-plugin
Add plugin to always use the compact sidebar
2023-07-09 19:47:39 +02:00
f1bbae69ac Merge pull request #1189 from th-ch/no-google-login-fixes
Hide login elements
2023-07-09 19:45:57 +02:00
98a2c0d82b Merge pull request #1191 from th-ch/fix-navigation
Fix navigation arrows
2023-07-09 19:45:05 +02:00
TC
d0733e25dc Fix navigation arrows 2023-07-04 22:05:58 +02:00
TC
34aded725d Add plugin to always use the compact sidebar 2023-07-04 21:51:50 +02:00
TC
bb385d440e Hide login elements 2023-07-04 21:48:41 +02:00
1ed43e11ad Merge pull request #1156 from Suplanus/patch-1
MacOS better copy paste in readme.md
2023-05-22 21:58:21 +02:00
bf8b88cb60 MacOS better copy paste in readme.md 2023-05-22 06:38:39 +02:00
f0f85955dc Update changelog for v1.20.0 2023-05-18 11:21:16 +00:00
d7950fbf70 Merge pull request #1117 from th-ch/release-1-20
Bump version to 1.20.0
2023-05-18 13:11:16 +02:00
TC
c8f12990eb Merge branch 'master' of github.com:th-ch/youtube-music into release-1-20
* 'master' of github.com:th-ch/youtube-music:
  Use 'with blocklists' as default in menu
  add xesam:url mpris from songInfo.url
  Bump cliqz/adblocker-electron
  Implement both blocklists and in-player blocking
  revert adblocker bump
2023-05-12 22:34:08 +02:00
eb14286315 Merge pull request #1134 from th-ch/adblocker-multi-implem
Multiple implementations for the Adblocker plugin
2023-05-12 22:32:14 +02:00
217c3f41ee Merge pull request #1138 from QuditWolf/master
add xesam:url mpris from songInfo.url
2023-05-12 22:28:36 +02:00
TC
a9227b529c Use 'with blocklists' as default in menu 2023-05-12 19:07:51 +02:00
9f77dcc348 add xesam:url mpris from songInfo.url 2023-05-11 14:23:54 +05:30
TC
3b6a7c82ef Bump cliqz/adblocker-electron 2023-05-08 22:23:21 +02:00
TC
69f560cdd1 Implement both blocklists and in-player blocking 2023-05-08 22:23:11 +02:00
c488c30015 Merge pull request #1124 from Araxeus/revert-adblocker-bump
revert adblocker bump
2023-04-26 12:53:48 +02:00
135e1002e6 revert adblocker bump
This is supposed to fix the performance regression introduced in #1100

fix #1105
2023-04-25 13:43:03 +03:00
TC
f51e625c29 Merge branch 'master' of github.com:th-ch/youtube-music into release-1-20
* 'master' of github.com:th-ch/youtube-music:
  fix security issues in deps
  commit assets/generated
  .gitattributes set `eol=lf` on **all** files
  remove `electron.remote` dependency
2023-04-16 22:08:11 +02:00
040946ca9e Merge pull request #1116 from Araxeus/fix-security-issues-in-deps
fix security issues in dependencies
2023-04-16 22:07:22 +02:00
5098ddb98c Merge branch 'local-upstream/master' into fix-security-issues-in-deps 2023-04-15 23:58:17 +03:00
80c152f795 Merge branch 'local-upstream/master' into fix-security-issues-in-deps 2023-04-15 23:57:09 +03:00
9cde19d906 fix security issues in deps 2023-04-15 23:56:27 +03:00
3f33eb8c07 Merge pull request #1118 from Araxeus/commit-assets/generated
commit assets/generated
2023-04-15 22:55:19 +02:00
0bba2980c7 commit assets/generated 2023-04-15 23:53:36 +03:00
7e60049143 Merge pull request #1113 from Araxeus/remove-last-remnant-of-electron.remote
remove `electron.remote` dependency
2023-04-15 22:47:01 +02:00
e74098e9a5 Merge pull request #1115 from Araxeus/fix-eol-diff
.gitattributes set `eol=lf` on *all* files
2023-04-15 22:39:35 +02:00
TC
4fe02baace Bump version to 1.20.0 2023-04-15 22:13:23 +02:00
eecc13852f Merge pull request #1114 from Araxeus/fix-single-instance-lock 2023-04-15 20:39:00 +03:00
2135e01ee1 .gitattributes set eol=lf on **all** files 2023-04-15 20:17:46 +03:00
346d301fe4 fix single instance lock menu checkbox 2023-04-15 20:16:47 +03:00
263a335c96 remove electron.remote dependency
now in renderer check if we are in dev mode using `'npm_package_name' in process.env`

The logic is that we always run the dev mode via npm/yarn and thus that env var will be available
2023-04-15 20:14:12 +03:00
20db77f965 Merge pull request #1102 from Araxeus/caption-selector-use-new-dynamic-configProvider 2023-04-14 23:22:54 +03:00
d0ab23fa88 Merge pull request #1104 from Araxeus/update-dependencies 2023-04-14 23:21:45 +03:00
a669b1ed3a Update yarn.lock 2023-04-14 22:59:54 +03:00
660fce8c99 Merge branch 'local-upstream/master' into update-dependencies 2023-04-14 22:59:36 +03:00
4bfca93713 bump dependencies 2023-04-14 22:49:17 +03:00
bb1295c5f7 Update yarn.lock 2023-04-14 22:46:03 +03:00
5f97255908 Merge pull request #1112 from th-ch/snyk-upgrade-51ddcc2948aa66e1f48f220d96e9a7a3 2023-04-14 22:32:40 +03:00
7a50bbd0c6 Merge pull request #1101 from Araxeus/fix-crossfade-beta-tag 2023-04-14 22:25:25 +03:00
7f7267d806 fix: upgrade html-to-text from 9.0.4 to 9.0.5
Snyk has created this PR to upgrade html-to-text from 9.0.4 to 9.0.5.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-04-14 14:21:39 +00:00
12d9b07c8d [caption-selector] use new dynamic configProvider 2023-04-05 13:43:40 +03:00
0b6b707ccd fix crossfade beta tag 2023-04-05 13:41:08 +03:00
TC
5a775b238c Fix name attribute in dynamic config 2023-04-04 22:13:04 +02:00
cad8e4fe83 Merge pull request #1096 from Araxeus/crossfade-beta-psa
[crossfade] add `[beta]` tag to warn of possible bugs
2023-04-04 22:05:40 +02:00
4b9af14c40 Merge pull request #1065 from Araxeus/add-crossfade-menu-options
[crossfade] add menu options
2023-04-04 22:03:49 +02:00
f8db04e3fc Merge pull request #1079 from Araxeus/option-to-load-captions-selector-on-every-song
[captions-selector] add `autoload` option
2023-04-04 21:56:35 +02:00
e8b712b3fa Merge pull request #1091 from Araxeus/fix-new-downloader-metadata
[downloader] Cleanup metadata
2023-04-02 21:31:17 +02:00
556b1a213e Merge pull request #1099 from Araxeus/fix-protocol-handler-on-unix
fix protocol handler on unix
2023-04-02 21:25:07 +02:00
8daf2462ec Merge pull request #1090 from Araxeus/fix-merge-conflict-mistake-in-#1032
fix merge conflict mistake in #1032
2023-04-02 21:24:17 +02:00
99e0eec9fe Merge pull request #1068 from Araxeus/add-pseudo-decorators
Create providers/decorators.js
2023-04-02 21:23:37 +02:00
f36283d63f Merge pull request #1100 from Araxeus/fix-ads-on-start
[adblocker] fix ads showing on program start
2023-04-02 21:21:08 +02:00
1a73e74039 fix ads on start 2023-04-02 19:40:03 +03:00
454061ece9 fix protocol handler on unix
on Windows the arg gets appended with `/` but not on Unix
2023-04-02 18:14:48 +03:00
e6746722c5 add a [beta] tag to crossfade plugin 2023-04-01 16:35:31 +03:00
4c07817b72 fix merge conflict mistake in #1032 2023-03-29 18:02:05 +03:00
ac9b59dc84 [downloader] Cleanup metadata
* Title and artist gets cleaned as before
* We now ignore thumbnail that ends with `.webp` since they cause problems
2023-03-27 23:49:30 +03:00
4e10dab5a8 cache downloader getCoverBuffer() 2023-03-27 22:25:57 +03:00
8124c2b218 lint 2023-03-27 22:25:38 +03:00
fe813df0b5 Merge branch 'local-upstream/master' into add-pseudo-decorators 2023-03-27 21:08:02 +03:00
05278ab643 Merge pull request #1086 from Araxeus/fix-new-downloader-issues
Allow downloading age restricted videos
2023-03-26 22:00:33 +02:00
f722cf86dd Allow downloading age restricted videos
* Bypass age restriction using `androidTvInfo`
* Bump youtubei.js fix #1084
* Add more detailed error messages, including song name or url
2023-03-24 14:59:16 +03:00
b909df9e66 Merge pull request #1073 from Araxeus/add-starting-page-option
add starting page option
2023-03-22 22:04:36 +01:00
55a442e90e lint 2023-03-22 17:39:47 +02:00
af569c3eee Merge branch 'local-upstream/master' into add-starting-page-option 2023-03-21 17:47:40 +02:00
45fa963818 allow default startingPage 2023-03-21 17:46:52 +02:00
764f08ebfb Merge branch 'local-upstream/master' into add-crossfade-menu-options 2023-03-20 00:06:06 +02:00
94f2cbaf06 Merge branch 'local-upstream/master' into option-to-load-captions-selector-on-every-song 2023-03-19 23:52:43 +02:00
2ad097c743 use new dynamic config 2023-03-19 23:48:05 +02:00
648d102101 add subscribe and subscribeAll to config
this primarily allows front.js to have an up to date config without requesting it over ipc every second

for example the crossfade plugin uses its `options.secondsBeforeEnd` every second - so `subscribeAll` would be much more efficient in this case
2023-03-19 23:47:29 +02:00
212009a69b create sendToFront()
TODO: replace all `webcontents.send ` with `sendToFront  = require('../providers/app-controls')`
2023-03-19 23:42:27 +02:00
TC
4364d3be71 Update yarn.lock 2023-03-19 21:33:47 +01:00
62e2e8a471 Merge pull request #1054 from Araxeus/new-downloader
[downloader] plugin overhaul
2023-03-19 21:31:57 +01:00
5d8b04b8d6 Merge branch 'master' into new-downloader 2023-03-19 21:29:37 +01:00
3526197d93 Merge pull request #1070 from th-ch/snyk-upgrade-671b977ed73c84d1af527353a8713dbf
[Snyk] Upgrade @cliqz/adblocker-electron from 1.25.2 to 1.26.0
2023-03-19 20:06:41 +01:00
494b1d9515 Merge branch 'local-upstream/master' into add-crossfade-menu-options 2023-03-19 21:05:23 +02:00
5f71be280b Merge pull request #1072 from Araxeus/fix-uploaded-library-css
[in-app-menu] fix css style of the library of uploaded songs
2023-03-19 20:05:15 +01:00
e8c3716106 use new dynamic config 2023-03-19 21:02:23 +02:00
9840956ef7 Merge pull request #1077 from Araxeus/Add-option-to-remove-like-buttons
add option to hide the like buttons
2023-03-19 20:00:48 +01:00
605401166d Merge branch 'local-upstream/master' into new-downloader 2023-03-19 20:57:55 +02:00
03f4654518 Merge pull request #1081 from danielchalmers/patch-1
Nitpick: Fix name casing in tray icon tooltip
2023-03-19 19:28:59 +01:00
e87099c816 Merge pull request #1082 from DereC4/romanization-patch
[lyrics-genius] Improved reliability of east asian language detection #1080
2023-03-19 19:27:44 +01:00
83eb187d91 Merge pull request #1064 from Araxeus/add-centralized-synced-config-for-plugins
Add dynamic synced plugin config provider
2023-03-19 19:26:47 +01:00
20cdaf2317 Merge pull request #1063 from Araxeus/fix-caption-selector-showing-when-unavailable
[captions-selector] fix button showing when there aren't any captions available
2023-03-19 19:26:06 +01:00
4f4372b65a fix PR review comments 2023-03-19 20:23:09 +02:00
325026e3ea rome lint 2023-03-19 20:15:15 +02:00
a6242d13ae add getActivePlugins and isActive 2023-03-19 03:00:17 +02:00
bc2a1f7f71 Updated Regex to be cleaner 2023-03-18 13:15:25 -05:00
d5c2ad2115 Romanization update 2023-03-17 18:02:48 -05:00
3abef7cb8a Nitpick: Fix name casing in tray icon tooltip 2023-03-17 11:49:22 -05:00
b45c628142 [captions-selector] add autoload option 2023-03-17 00:09:32 +02:00
9d6a78bc57 bump custom-electron-prompt
* enable onwheel in number inputs
* enable wheel event on keybind prompt
2023-03-16 23:50:35 +02:00
7018481b1d Merge branch 'add-centralized-synced-config-for-plugins' into option-to-load-captions-selector-on-every-song 2023-03-16 20:14:12 +02:00
9f9e991aec [crossfade] fix options not saving as numbers 2023-03-16 19:55:30 +02:00
640ba26d55 add option to hide the like buttons
fix #1075
2023-03-16 19:02:09 +02:00
f5758bfe93 add defaults and migrations 2023-03-15 23:27:36 +02:00
a3ea37d412 add starting page option
fix #1071
2023-03-15 23:06:34 +02:00
89c664b4d2 fix uploaded library style
follows up on  [in-app-menu] fix items hidden by navbar in library #1067
2023-03-15 21:52:25 +02:00
51871a3fec catch errors in downloadSong() 2023-03-15 20:29:12 +02:00
04ca4e8537 fix: upgrade @cliqz/adblocker-electron from 1.25.2 to 1.26.0
Snyk has created this PR to upgrade @cliqz/adblocker-electron from 1.25.2 to 1.26.0.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-15 15:15:48 +00:00
023258f1d7 fix crossfade option prompt height 2023-03-15 08:24:50 +02:00
848bb36c64 rename defaultOptions to config 2023-03-14 23:40:46 +02:00
a6e9c140fe Merge branch 'local-upstream/master' into add-crossfade-menu-options 2023-03-14 23:39:19 +02:00
e972fd15c2 Merge pull request #1067 from Araxeus/fix-in-app-menu-navbar-hiding-library-items
[in-app-menu] fix items hidden by navbar in library
2023-03-14 22:34:57 +01:00
ed5fb06504 Merge pull request #1061 from Araxeus/fix-app-logo-is-draggable
Fix Youtube Music logo is draggable
2023-03-14 22:30:46 +01:00
51c2b76c8b Merge pull request #1069 from Araxeus/fix-check-action-failing-on-forks
fix build action failing on forks, and run it on pull requests
2023-03-14 22:25:47 +01:00
f193c0b547 Merge pull request #1059 from Araxeus/rename-single-instance-lock-menu-name 2023-03-14 17:20:22 +02:00
7ac3cf69b6 try to fix songInfo time&album (#1032) 2023-03-14 17:18:40 +02:00
69cd5ed613 [lyrics] Romanization toggle for Genius plugin (#1039) 2023-03-14 17:16:41 +02:00
1649bd9c2d run build.yml on pull request and pushes to master 2023-03-12 22:14:44 +02:00
a97888a207 fix check action failing on forks 2023-03-12 22:03:34 +02:00
f1073e37b5 use pseudo decorators 2023-03-12 21:41:15 +02:00
7abc67b456 Create providers/decorators.js 2023-03-12 21:35:03 +02:00
b652a011a5 lint 2023-03-12 20:00:10 +02:00
83abbdb25a add caching to getCoverBuffer
when downloading an album, will no longer re-download an encode identical cover images
2023-03-12 19:53:25 +02:00
837e888462 [in-app-menu] fix items hidden by navbar in library 2023-03-12 19:40:51 +02:00
66ccd71b7c [crossfade] add menu options 2023-03-12 02:14:23 +02:00
108c778f6d fix caption selector showing when unavailable 2023-03-12 02:07:04 +02:00
af2b6782e8 bump custom-electron-prompt 2023-03-12 02:07:03 +02:00
7d93e9f031 fix config.setAll() 2023-03-12 02:04:29 +02:00
8c311bf630 bump custom-electron-prompt 2023-03-12 01:59:21 +02:00
bdfdf83c24 [notifications] use dynamic config 2023-03-12 00:28:15 +02:00
96e6b5d018 Add dynamic synced plugin config provider 2023-03-12 00:28:15 +02:00
c5ef9a9ebb fix app logo is draggable 2023-03-10 15:14:07 +02:00
4ace5e3647 Rename Release single instance lock to Single instance lock 2023-03-09 19:40:50 +02:00
TC
476e13de9f Update yarn.lock for latest package.json 2023-03-08 21:29:04 +01:00
659cb35525 Merge pull request #1056 from th-ch/snyk-upgrade-10b2d3763ea9ee07c6cd4884a5661cfa
[Snyk] Upgrade html-to-text from 9.0.3 to 9.0.4
2023-03-08 21:26:49 +01:00
a507a8cd71 Merge pull request #988 from Araxeus/in-app-menu-icon
[in-app-menu] add toggle menu icon
2023-03-08 21:21:59 +01:00
8cca8c89b3 Merge pull request #1048 from Araxeus/fix-playback-speed-selector
Fix playback speed slider not showing and PiP button showing when it shouldn't
2023-03-08 21:15:36 +01:00
476b45096c Merge pull request #1052 from Araxeus/fix-lyrics-bugs
[lyrics-genius] Fix lyrics not showing up or showing up when they shouldn't
2023-03-08 21:12:25 +01:00
43be177b66 Merge pull request #1055 from Araxeus/fix-in-app-menu-drag-area
[in-app-menu] disable nav-bar drag when menu is open
2023-03-08 21:10:07 +01:00
2edeab567f Merge pull request #946 from Araxeus/use-ToastXML
[Notifications] [Windows] Native interactive notifications
2023-03-08 20:59:34 +01:00
26fb48fd37 Merge pull request #1049 from Araxeus/automate-winget-releases
automate winget releases
2023-03-08 20:52:10 +01:00
c5781962f4 lint 2023-03-05 18:56:04 +02:00
61dd477c27 fix: upgrade html-to-text from 9.0.3 to 9.0.4
Snyk has created this PR to upgrade html-to-text from 9.0.3 to 9.0.4.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-04 14:21:37 +00:00
6ca64d68ca show ffmpeg progress 2023-03-04 16:17:39 +02:00
ad484ab745 use centralized config 2023-03-04 15:48:15 +02:00
7b3280c12b add skip existing files option 2023-03-04 15:17:54 +02:00
cd41f093be fix download button not showing first time menu is opened 2023-03-04 15:15:01 +02:00
a2eb3a3319 helpful error when trying to download a private or "mixed for you" playlist 2023-03-04 14:16:22 +02:00
e4b1d38f85 dont add album to metadata if it's ===N/A 2023-03-04 13:51:18 +02:00
560e323893 lint 2023-03-04 13:40:03 +02:00
a31e59fbc7 fix download button showing when it shouldn't 2023-03-04 13:39:49 +02:00
2cbc73d2ed remove unused imports 2023-03-04 12:31:03 +02:00
099e5d8491 add download feedback and progress 2023-03-04 12:12:23 +02:00
54d3f925e6 add trackId to album downloads 2023-03-04 01:53:19 +02:00
ec6107138d remove node-id3 2023-03-04 01:09:07 +02:00
83d7befc45 disable nav-bar drag when menu is open 2023-03-03 23:37:24 +02:00
b6f9404ff5 download using youtubei,js instead of ytdl-core 2023-03-03 23:19:23 +02:00
16a0b6a893 add slight delay to lyrics genius
this allows youtube to finish doing it's stuff

fix #1041 and other lyrics issues
2023-03-02 19:55:17 +02:00
9ff40611ce fix unescaped url params
fix #1050
2023-03-02 18:18:13 +02:00
f2d20d05c4 [winget] add installer regex 2023-02-28 23:34:40 +02:00
f650ee1e70 automate winget releases 2023-02-28 22:42:02 +02:00
ab7ba1c280 fix PiP button showing in non player-bar menu's 2023-02-28 21:10:28 +02:00
c4ced889b5 resolve merge error 2023-02-28 20:35:10 +02:00
79e71dae26 fix playback speed selector
replace querying for the text `Stats` (which is language specific)
with querying that the event origin is the button on the player-bar

fix #1045
2023-02-28 19:56:16 +02:00
87cbdc3dc3 fix potential empty notification showing 2023-02-17 18:05:16 +02:00
a3c5be0cc2 Merge branch 'local-upstream/master' into use-ToastXML 2023-02-17 18:02:30 +02:00
0e3982d199 Merge branch 'local-upstream/master' into in-app-menu-icon 2023-02-17 17:44:48 +02:00
8bfbbca044 Merge pull request #1029 from th-ch/windows-arm-build
build win target on ARM
2023-02-15 21:09:04 +01:00
TC
35fa794395 build win target on ARM 2023-02-15 20:52:36 +01:00
TC
bfb392a326 Use a promise to wait for transitions in crossfade plugin 2023-02-12 20:00:48 +01:00
TC
8adfcdc002 Replace all | in title (codeQL fix) 2023-02-12 19:21:04 +01:00
TC
4ec0b7ff30 Bump yarn.lock 2023-02-12 19:13:20 +01:00
0e683444d3 Merge pull request #961 from xhayper/patch-1
feat: auto reconnect rpc and CSP fix
2023-02-12 19:12:44 +01:00
7282a227fd Merge branch 'master' into patch-1 2023-02-12 19:08:54 +01:00
c0d0c267a7 Merge branch 'local-upstream/master' into in-app-menu-icon 2023-02-12 19:58:10 +02:00
6577bcdad8 Merge pull request #989 from Araxeus/in-app-menu-draggable-navbar
[in-app-menu] make navbar draggable
2023-02-12 18:50:56 +01:00
34f56df2ec Merge pull request #1013 from th-ch/native-pip
Add option `useNativePiP` in PiP plugin to use native PiP
2023-02-12 18:50:26 +01:00
TC
7f66ff2c0c Merge branch 'master' of github.com:th-ch/youtube-music into native-pip
* 'master' of github.com:th-ch/youtube-music:
  fix PiP hotkey active in searchbox
  remove titlebar from in-app-menu+PiP
  Bump "@cliqz/adblocker-electron" version
  Only run the release stage if it is the main repo
  Only build without release if it is a fork
  Use del-cli instead of del (for windows)
  Replace electron-icon-maker by a more up-to-date fork
  Adapt CI to yarn v3
  Migrate to yarn v3
  Track transitioning status
  Fixed recursive volume changes that caused cpu spike, Switched Repeat Modes to NONE|ONE|ALL
  Remove references to rimraf
  Add first version for crossfade plugin
  removed unnecessary if and used better Repeat change detection
  connected mpris shuffle, fixed volume, mpris volumes allowed 0.0-1.0
  fixed 'repeatChanged' modes being different depending on selected youtube music language
  fix precise-volume+searchbox interaction
  fix navbar position
2023-02-12 18:41:52 +01:00
735fd39c3c Merge pull request #1025 from Araxeus/fix-PiP-hotkey-active-in-search
[PiP] fix hotkey activating when typing in the search box
2023-02-12 18:34:29 +01:00
7df7b32eea Merge pull request #1024 from Araxeus/in-app-menu-pip-no-titlebar
[PiP] Remove titlebar when in-app-menu is enabled
2023-02-12 18:33:04 +01:00
d9f1c589e9 fix PiP hotkey active in searchbox 2023-02-10 20:14:07 +02:00
5dd8d1a274 remove titlebar from in-app-menu+PiP
Results in an experience similar to the native PiP, except plugins can work (for example precise-volume)
2023-02-10 18:52:51 +02:00
2f117117d8 lint 2023-02-10 01:37:42 +02:00
d8a6453a8d Merge branch 'local-upstream/master' into in-app-menu-icon 2023-02-10 00:14:39 +02:00
27d8bbdf85 Merge branch 'local-upstream/master' into use-ToastXML 2023-02-09 23:55:13 +02:00
7bdbab5a2d Merge pull request #1005 from Skydeke/master
[Shortcuts] MPRIS fixes, Repeat Language bug fix
2023-02-09 22:47:03 +01:00
96f23ea8d5 Merge branch 'local-upstream/master' into use-ToastXML 2023-02-09 23:43:26 +02:00
0a8ac31c1e Merge branch 'master' into master 2023-02-09 22:42:39 +01:00
e0d7117970 Merge pull request #1023 from th-ch/build-without-release-in-forks
Build without release in forks
2023-02-09 22:39:34 +01:00
TC
e70f843ac3 Bump "@cliqz/adblocker-electron" version 2023-02-09 22:38:07 +01:00
7932408b47 Merge pull request #997 from Araxeus/fix-navbar-position
[in-app-menu] fix navbar position
2023-02-09 22:33:45 +01:00
97c6cad503 Avoid video pause
Co-authored-by: Araxeus <oaeben@gmail.com>
2023-02-09 22:33:07 +01:00
455a89ad28 Merge pull request #1022 from th-ch/yarn-new-version
Migrate to yarn v3
2023-02-09 22:11:49 +01:00
TC
9ec07b5fb7 Only run the release stage if it is the main repo 2023-02-09 22:11:26 +01:00
TC
b9aa6ffdd4 Only build without release if it is a fork 2023-02-09 22:08:40 +01:00
ff1847d1e2 Merge branch 'local-upstream/master' into use-ToastXML 2023-02-09 18:51:24 +02:00
fa4a55f97e Merge branch 'master' into patch-1 2023-02-09 10:06:35 +07:00
TC
781a726f4b Add menu option for native PiP 2023-02-08 23:46:43 +01:00
TC
0b49d57969 Always listen for toggle 2023-02-08 23:46:24 +01:00
70c55ca587 Merge pull request #1002 from Araxeus/fix-searchbox+precise-volume-interaction
[precise-volume] fix arrows shortcuts active in search box
2023-02-08 23:30:40 +01:00
TC
3277a8e6c9 Use del-cli instead of del (for windows) 2023-02-08 22:20:44 +01:00
TC
9c54fccf93 Replace electron-icon-maker by a more up-to-date fork 2023-02-08 22:20:44 +01:00
TC
f3a6d4dd18 Adapt CI to yarn v3 2023-02-08 22:20:42 +01:00
TC
721b048151 Migrate to yarn v3 2023-02-08 22:13:32 +01:00
35859a6c3a Merge pull request #1012 from th-ch/crossfade-plugin
[new plugin] Add first version for crossfade plugin
2023-02-07 21:35:28 +01:00
TC
7f099eef4e Track transitioning status 2023-02-06 23:21:12 +01:00
9da0e4305f Fixed recursive volume changes that caused cpu spike, Switched Repeat Modes to NONE|ONE|ALL 2023-02-03 12:03:17 +01:00
a81476100b Merge branch 'th-ch:master' into master 2023-02-03 12:02:53 +01:00
TC
7cbc99fc19 Remove references to rimraf 2023-02-01 23:23:34 +01:00
TC
8a9a3fc69d Add option useNativePiP in PiP plugin to use native PiP 2023-02-01 22:25:33 +01:00
TC
f422b25cb6 Add first version for crossfade plugin 2023-02-01 22:19:39 +01:00
TC
d44fb5c840 Fix audio source not connected to the context 2023-01-31 13:49:50 +01:00
TC
b4713196fe Fix audio-compressor plugin by only applying it once 2023-01-31 13:49:26 +01:00
8bf2c8397e removed unnecessary if and used better Repeat change detection 2023-01-28 20:36:31 +01:00
317e3af412 connected mpris shuffle, fixed volume, mpris volumes allowed 0.0-1.0 2023-01-28 15:43:16 +01:00
a4a3564136 fixed 'repeatChanged' modes being different depending on selected youtube music language 2023-01-28 15:42:32 +01:00
bc49e09810 fix precise-volume+searchbox interaction 2023-01-24 00:45:34 +02:00
79890e019a fix navbar position 2023-01-22 20:22:14 +02:00
70361afbaf use css instead of js 2023-01-22 19:25:29 +02:00
333b695b16 lint 2023-01-22 19:18:10 +02:00
c6bb0cfe88 remove draggable attribute if search box is open 2023-01-19 19:16:01 +02:00
b665343fd9 make navbar draggable [in-app-menu] 2023-01-19 18:52:40 +02:00
236034a1f9 bump custom-electron-titlebar 2023-01-19 17:33:35 +02:00
c61a719f59 Merge branch 'master' into patch-1 2023-01-19 13:14:32 +07:00
96b1b69629 hide menu in PiP+in-app-menu if hideMenu is enabled 2023-01-19 02:33:43 +02:00
1eb0269434 Differentiate between refresh/toggle menu
+ visible now checks the actual state to fix PiP bugs
2023-01-19 02:32:57 +02:00
5909af42d2 Update readme.md 2023-01-19 02:05:16 +02:00
4eaeaafa7c add menu icon to in-app-menu 2023-01-19 01:43:28 +02:00
fe42f8d953 fix upstream merge bug 2023-01-18 19:19:40 +02:00
0f09f8a8ed Merge pull request #984 from th-ch/th-ch/fix-bypass-age-import
Fix bypass-age-restriction lib import
2023-01-17 21:58:42 +01:00
cb2c9fe1cd re-create yarn.lock 2023-01-16 22:28:34 +02:00
b5cddd2d49 Merge branch 'local-upstream/master' into use-ToastXML 2023-01-16 21:36:47 +02:00
4957bccaad prepare for merge 2023-01-16 21:32:18 +02:00
TC
b518866d24 Fix bypass-age-restriction lib import 2023-01-15 21:12:12 +01:00
a51ed89281 Merge pull request #977 from th-ch/th-ch/option-to-copy-url
Add menu entry to copy current URL
2023-01-15 20:45:27 +01:00
3482ec4ec7 Merge pull request #979 from th-ch/th-ch/remove-deprecated-code
Remove deprecated code
2023-01-15 20:41:40 +01:00
TC
3c3530367a nit: trim trailing whitespace 2023-01-15 14:43:22 +01:00
TC
fae1f67a64 Remove deprecated code with electron v22 2023-01-15 14:43:06 +01:00
TC
eb9b0b4cd1 Use electron clipboard 2023-01-15 14:39:36 +01:00
91e111d483 feat: apply suggestion 2023-01-15 10:59:56 +07:00
dbfddebbc2 feat: auto reconnect rpc and CSP fix 2023-01-15 09:57:35 +07:00
TC
b541dd0312 Add menu entry to copy current URL 2023-01-14 23:10:45 +01:00
3a822f611a Merge pull request #976 from th-ch/th-ch/update-dev-deps
Update dev dependencies
2023-01-14 22:58:58 +01:00
TC
0c53f7ffeb Update dev dependencies 2023-01-14 17:15:17 +01:00
acdff69919 Merge pull request #974 from th-ch/th-ch/update-electron-and-other-dependencies
Update electron and various dependencies
2023-01-14 17:02:06 +01:00
TC
a80219ae40 Update electron and various dependencies 2023-01-14 16:40:07 +01:00
fecafe5a19 Merge pull request #973 from th-ch/th-ch/dependency-review
Add CI job for dependency review
2023-01-14 16:26:33 +01:00
TC
a8769faea8 Add captions plugin readme 2023-01-14 16:21:23 +01:00
3ed4a30915 Merge pull request #972 from th-ch/th-ch/captions-plugin
Improve captions plugin
2023-01-14 16:16:42 +01:00
TC
832195f29c Add CI job for dependency review 2023-01-14 16:15:19 +01:00
9869063a5d Merge pull request #817 from anytarseir67/master
fix malformed json in tuna-obs
2023-01-14 16:11:48 +01:00
TC
b63e7ed402 Use custom-electron-prompt in caption selector 2023-01-14 16:08:33 +01:00
TC
1b7bb4703a Snakecase template name 2023-01-14 16:07:24 +01:00
2cc347ff94 Merge branch 'master' into use-ToastXML 2023-01-14 16:08:34 +02:00
4674a25746 Merge pull request #866 from LetrixZ/master
Add Captions selector
2023-01-14 15:06:09 +01:00
237423da1d Merge branch 'master' into master 2023-01-14 15:02:01 +01:00
6edc94ae98 Merge pull request #941 from Araxeus/fix-snoretoast
fix SnoreToast implementation
2023-01-14 15:00:32 +01:00
98e677a76f Merge pull request #942 from th-ch/dependabot/npm_and_yarn/json5-1.0.2
Bump json5 from 1.0.1 to 1.0.2
2023-01-14 14:57:46 +01:00
d289b30782 Merge pull request #969 from th-ch/snyk-upgrade-a42642fbff21eea4c8d029ab972233d2
[Snyk] Upgrade custom-electron-titlebar from 4.1.3 to 4.1.5
2023-01-14 14:56:35 +01:00
9b14a274ce Merge pull request #956 from MiepHD/master
Fixed video-toggle aligning running before #main-panel exists
2023-01-14 14:55:51 +01:00
7701c03e2b Merge pull request #953 from th-ch/visualizer-plugin
[New plugin] Music visualizers
2023-01-14 14:53:29 +01:00
0cf72074f3 Merge pull request #964 from Araxeus/fix-PiP-button
fix PiP buttons not showing up
2023-01-14 14:47:31 +01:00
TC
6e96b355bd Add migration for visualizer plugin 2023-01-14 14:44:02 +01:00
210a16a32b Update back.js 2023-01-14 14:36:40 +01:00
3389679287 fix: upgrade custom-electron-titlebar from 4.1.3 to 4.1.5
Snyk has created this PR to upgrade custom-electron-titlebar from 4.1.3 to 4.1.5.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-01-14 02:08:25 +00:00
06eacea9a5 fix misnamed options in menu 2023-01-13 00:28:30 +02:00
759b3844db lint 2023-01-12 20:51:33 +02:00
2b4e996743 add migrations 2023-01-12 20:35:42 +02:00
0e99f96f01 fix PiP unminimize button hidden 2023-01-12 19:58:44 +02:00
b3f561cf2f disable maximize button on PiP
(doesn't work if `in-app-menu` is enabled)
2023-01-12 19:58:36 +02:00
f9820df6c6 fix PiP button
fix #959
2023-01-12 19:18:58 +02:00
bc5023c360 Add 2 more config options
refreshOnPlayPause: false
trayControls: true,
2023-01-09 23:46:44 +02:00
1c5d61854e fixes from pr review 2023-01-09 19:20:11 +02:00
a8f3451e04 Merge branch 'th-ch:master' into master 2023-01-09 18:18:44 +01:00
8728784c02 Fixed running before #main-panel exists 2023-01-09 18:16:33 +01:00
TC
b77c62128e Implement visualizer plugin 2023-01-09 09:23:40 +01:00
70522173b7 Interactive Notifications v2 2023-01-09 00:07:07 +02:00
35bd62cc0d Merge pull request #951 from th-ch/audio-context-source
Use same audio context/source everywhere
2023-01-08 19:38:09 +01:00
TC
52b67af59c Use same audio context/source everywhere 2023-01-08 19:17:40 +01:00
027d4ce3f0 Added variations for testing
`xml_logo_ascii`
`xml_logo_icons`
`xml_logo_icons_notext`
`xml_hero`
`xml_banner_bottom`
`xml_banner_top_custom`
`xml_banner_centered_bottom`
`xml_banner_centered_top`
2023-01-08 13:12:01 +02:00
05d0ac963a re-add cover_url 2023-01-07 20:47:13 -05:00
97c5dc25be save temp icons for file:/// protocol 2023-01-08 01:29:44 +02:00
14b0315ed9 add back to front logger 2023-01-08 01:29:20 +02:00
2c49f6c740 use Electron with ToastXML instead of SnoreToast
* Add support for protocol commands
* Remove node-notifier dependency
2023-01-07 22:06:46 +02:00
bc23131e48 Bump json5 from 1.0.1 to 1.0.2
Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: json5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-07 04:35:10 +00:00
e6146940b1 revert #600 2023-01-07 05:34:24 +02:00
3412b3504f use snoretoast CLSID 2023-01-07 05:23:42 +02:00
fcb92fda84 Update changelog for v1.19.0 2022-12-31 12:48:44 +00:00
TC
51fdbe2086 Bump version to 1.19.0 2022-12-31 13:32:27 +01:00
74535b696c Merge pull request #936 from th-ch/github-action-publish-release
Automatic release by CI when version is updated
2022-12-30 19:18:43 +01:00
TC
31ab27c39f Bump version and change release type when publishing a new version 2022-12-30 19:09:32 +01:00
a13606b361 Merge pull request #894 from MiepHD/master
Center toggle of video-toggle
2022-12-29 22:37:55 +01:00
TC
d0ed64928d Update readme to get have precise build instructions 2022-12-28 17:54:27 +01:00
2b8b825f4c Merge branch 'th-ch:master' into master 2022-12-28 14:50:15 +01:00
74c9fe13e2 Added option to change alignment of video-toggle 2022-12-28 10:23:11 +01:00
a2a2f18058 Merge pull request #890 from th-ch/load-plugins-on-window-creation
Load plugins as soon as the window is created
2022-12-27 18:41:50 +01:00
e587f02bd9 Merge pull request #913 from th-ch/dependabot/npm_and_yarn/qs-6.5.3
Bump qs from 6.5.2 to 6.5.3
2022-12-27 18:40:06 +01:00
c38c416813 Bump qs from 6.5.2 to 6.5.3
Bumps [qs](https://github.com/ljharb/qs) from 6.5.2 to 6.5.3.
- [Release notes](https://github.com/ljharb/qs/releases)
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.5.2...v6.5.3)

---
updated-dependencies:
- dependency-name: qs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-27 17:27:53 +00:00
138b6df5a4 Merge pull request #900 from th-ch/snyk-upgrade-cf02914a196acf6d7c9613f310f238f5
[Snyk] Upgrade custom-electron-titlebar from 4.1.1 to 4.1.2
2022-12-27 18:27:24 +01:00
cf2add8d91 Merge pull request #931 from th-ch/th-ch/skip-silences-beginning
Add option in skip-silences plugin to only skip at the beginning
2022-12-27 17:29:50 +01:00
453fe3f87a Merge pull request #932 from th-ch/rimraf-del
Replace rimraf by del-cli
2022-12-27 17:28:52 +01:00
TC
ccedb17545 Replace rimraf by del-cli 2022-12-26 23:33:30 +01:00
TC
43c501b6d8 Add option in skip-silences plugin to only skip at the beginning 2022-12-26 18:46:52 +01:00
TC
a1bed628f4 Update build badge 2022-12-25 23:16:18 +01:00
7052a74a77 Merge pull request #873 from Nixxen/master
docs: Added winget install instructions
2022-12-25 23:12:44 +01:00
254758a4f2 fix: upgrade custom-electron-titlebar from 4.1.1 to 4.1.2
Snyk has created this PR to upgrade custom-electron-titlebar from 4.1.1 to 4.1.2.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-11-28 08:48:16 +00:00
5d85108c8a doc: Updated readme to include note about MSDSS 2022-11-23 00:40:04 +01:00
46bfec299c Centered toggle 2022-11-22 17:56:23 +01:00
de7bc828b1 Appended directly to the main-panel 2022-11-22 17:55:50 +01:00
TC
335d515e22 Do not skip silences if volume is 0 or video is muted 2022-11-20 21:54:23 +01:00
TC
3fb219fcd1 Bump age restriction plugin 2022-11-20 21:15:05 +01:00
64114e8e9d Merge pull request #855 from th-ch/snyk-upgrade-0a2e4b6ab9f1a14b5e27d5de213bed41
[Snyk] Upgrade async-mutex from 0.3.2 to 0.4.0
2022-11-20 21:03:00 +01:00
ca6225d47b Merge pull request #856 from th-ch/snyk-upgrade-745c57baec21283a223fa43b3f450118
[Snyk] Upgrade @cliqz/adblocker-electron from 1.25.0 to 1.25.1
2022-11-20 21:01:23 +01:00
bf580645ae Merge pull request #865 from th-ch/snyk-upgrade-307bfc7d5d38af8f17908cd31fafc230
[Snyk] Upgrade custom-electron-titlebar from 4.1.0 to 4.1.1
2022-11-20 20:59:57 +01:00
4361cf2b2b Merge pull request #876 from th-ch/snyk-upgrade-fc79a6530d88cc21f2f068311b2363b9
[Snyk] Upgrade @ffmpeg/ffmpeg from 0.11.5 to 0.11.6
2022-11-20 20:59:22 +01:00
TC
c2fbc89b91 Load plugins as soon as the window is created 2022-11-20 20:30:35 +01:00
3605e32b25 Merge pull request #888 from Zo-Bro-23/master
Discord Plugin RPC Fix
2022-11-20 20:25:57 +01:00
49eae89886 Update back.js 2022-11-20 17:34:20 +05:30
ee01ae1c00 Update back.js 2022-11-20 17:33:06 +05:30
d199a5fce9 Update back.js 2022-11-20 16:21:32 +05:30
350e8fb706 fix: upgrade @ffmpeg/ffmpeg from 0.11.5 to 0.11.6
Snyk has created this PR to upgrade @ffmpeg/ffmpeg from 0.11.5 to 0.11.6.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-11-11 23:13:48 +00:00
3fdc6e2f09 docs: Added winget install instructions 2022-11-06 18:34:54 +01:00
938210e8f9 Plugin Captions Selector - Add disable captions by default 2022-10-22 01:49:16 -03:00
c8a852bf2e Plugin Captions Selector - Check if there is caption tracks available, add "disable captions" 2022-10-22 01:13:04 -03:00
f58c10b02d Plugin Captions Selector - Add new line 2022-10-22 01:01:25 -03:00
c281b8ba98 Plugin: Captions Selector 2022-10-22 01:00:15 -03:00
1fef3c4aab fix: upgrade custom-electron-titlebar from 4.1.0 to 4.1.1
Snyk has created this PR to upgrade custom-electron-titlebar from 4.1.0 to 4.1.1.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-10-19 17:03:11 +00:00
762ef4eede fix: upgrade @cliqz/adblocker-electron from 1.25.0 to 1.25.1
Snyk has created this PR to upgrade @cliqz/adblocker-electron from 1.25.0 to 1.25.1.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-10-10 00:44:14 +00:00
fe9b26ebdd fix: upgrade async-mutex from 0.3.2 to 0.4.0
Snyk has created this PR to upgrade async-mutex from 0.3.2 to 0.4.0.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-10-10 00:44:11 +00:00
77173c1347 Merge pull request #854 from th-ch/bump-ffmpeg
Bump FFMpeg
2022-10-09 13:15:59 +02:00
TC
be3a2880eb Bump FFMpeg 2022-10-09 12:32:26 +02:00
d761d92861 Merge pull request #823 from th-ch/snyk-upgrade-da17b83c582728aa38ca18a57844b1ef
[Snyk] Upgrade @cliqz/adblocker-electron from 1.23.8 to 1.23.9
2022-10-09 12:16:55 +02:00
0e7fd4d36d Merge pull request #801 from th-ch/snyk-upgrade-1bb0065cafdd8e20657abaf4608e914b
[Snyk] Upgrade electron-store from 8.0.2 to 8.1.0
2022-10-09 12:15:11 +02:00
073ea27bba Merge pull request #802 from amsyarasyiq/master
proposal: Adding an option to hide duration before the song ends
2022-10-09 12:12:10 +02:00
9441a6a694 Merge pull request #790 from th-ch/snyk-fix-7c02df943121127bc4ba140fcd2b10b7
[Snyk] Security upgrade node-fetch from 2.6.7 to 3.2.10
2022-10-09 12:06:19 +02:00
TC
c9f610f7fc Lock node-fetch to v2 for commonJS 2022-10-09 12:04:47 +02:00
22b75bbfeb Merge pull request #807 from kerichdev/patch-1
Update README.md with a new theme repo
2022-10-09 11:59:45 +02:00
0063be02fb Merge pull request #822 from andrew-mathieu/andrew-mathieu-patch-1
Fix likes on touchbar (they were inverted)
2022-10-09 11:55:45 +02:00
cc1c13cece Merge pull request #839 from pcgeek86/patch-1
Add Scoop install directions for Windows 🪟
2022-10-09 11:55:13 +02:00
TC
7f96c89f41 Remove jest config (not used anymore) 2022-10-09 11:53:57 +02:00
cdb8bdcfb4 Add Scoop install directions for Windows 🪟 2022-09-20 14:11:39 -06:00
8c817e0862 fix: upgrade @cliqz/adblocker-electron from 1.23.8 to 1.23.9
Snyk has created this PR to upgrade @cliqz/adblocker-electron from 1.23.8 to 1.23.9.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-09-09 23:20:14 +00:00
b4ec6a791d Fix likes on touchbar (they were inverted)
When we tap on "👍", it doesn't leave a like but does the opposite
2022-09-09 03:10:22 +02:00
82ced02a5e fix malformed json in tuna-obs 2022-09-05 04:07:46 -04:00
TC
b843825f72 Bump version to 1.18.0 2022-09-05 08:48:06 +02:00
b66d3bc3d4 Merge pull request #816 from th-ch/fix-downloader
Bump ytdl-core (bug fix)
2022-09-05 08:45:22 +02:00
TC
9adabd41d9 Bump ytdl-core (bug fix) 2022-09-05 00:43:58 +02:00
TC
3f3df09819 Set NODE_ENV programmatically 2022-09-05 00:38:24 +02:00
TC
1f5f597561 Prepare migration for sandboxing (path.join in preload) 2022-09-05 00:31:29 +02:00
TC
91e4433aba Hide login button in plugin 2022-09-04 23:56:41 +02:00
2d3ce4a8b3 Merge pull request #813 from th-ch/fix-tests
Bump electron and fix tests in CI
2022-09-04 23:36:19 +02:00
TC
971b7f05c5 Bump electron to latest version 2022-09-04 22:32:16 +02:00
TC
bb6115fec1 Remove jest 2022-09-04 22:24:09 +02:00
TC
2a6dc30366 Remove test environment 2022-09-04 22:24:09 +02:00
TC
5e2d843742 Migrate to playwright/test 2022-09-04 22:24:09 +02:00
TC
7aaef26cc8 Add electron flags in tests 2022-09-04 22:21:51 +02:00
TC
0a08eaaa3c Skip downloading browsers in playwright 2022-09-04 22:21:43 +02:00
8bbf18cd6b Update README.md with a new theme repo
The repo referenced is currently unmaintained, so I made a fork with some fixes and improvements, with more to come. Maybe a good idea to reference it as well / replace it?
2022-08-31 10:55:43 +03:00
TC
0d22446f20 Bump playwright and electron 2022-08-25 23:03:38 +02:00
a0543d15a6 Merge pull request #800 from th-ch/custom-css-file
Allow user to pass custom CSS file
2022-08-25 22:52:42 +02:00
TC
e62ee35b42 Rename cssFiles option to themes and add menu entry 2022-08-25 22:50:33 +02:00
927596d0c1 fix: set default option for hideDurationLeft 2022-08-23 22:56:14 +08:00
0c0cb0501c Add an option to hide duration before the song ends 2022-08-23 21:00:52 +08:00
a2847c5007 fix: upgrade electron-store from 8.0.2 to 8.1.0
Snyk has created this PR to upgrade electron-store from 8.0.2 to 8.1.0.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-08-22 23:39:40 +00:00
TC
ef6fb402bf Allow user to pass custom CSS file 2022-08-21 23:36:02 +02:00
a8301f44be Merge pull request #799 from th-ch/snyk-upgrade-260cfeaaaf6aa5359f78e9f589e807a0
[Snyk] Upgrade html-to-text from 8.2.0 to 8.2.1
2022-08-21 22:54:52 +02:00
1ead86a220 Merge pull request #772 from th-ch/snyk-upgrade-3ee19fd614169422c21264d4fe016fa1
[Snyk] Upgrade electron-store from 8.0.1 to 8.0.2
2022-08-21 22:54:14 +02:00
03e716fe17 Merge pull request #756 from th-ch/dependabot/npm_and_yarn/jpeg-js-0.4.4
Bump jpeg-js from 0.4.3 to 0.4.4
2022-08-21 22:53:54 +02:00
f0bb328981 Merge pull request #749 from foonathan/master
Support MPRIS loop and volume change
2022-08-21 22:53:29 +02:00
f40183f0ca fix: upgrade html-to-text from 8.2.0 to 8.2.1
Snyk has created this PR to upgrade html-to-text from 8.2.0 to 8.2.1.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-08-20 22:45:27 +00:00
5b004acdc1 Update readme.md 2022-08-12 20:19:49 +02:00
f6b3347d0a fix: package.json & yarn.lock to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-NODEFETCH-2964180
2022-07-31 23:37:38 +00:00
0f96da9928 Change volume observer 2022-07-14 20:59:35 +02:00
dfba3d9c2d Support precise volume changes in MPRIS when possible 2022-07-11 20:20:13 +02:00
d9c51063f4 Add MPRIS volume control
Fixes #776.
2022-07-11 19:55:16 +02:00
cd9012691a fix: upgrade electron-store from 8.0.1 to 8.0.2
Snyk has created this PR to upgrade electron-store from 8.0.1 to 8.0.2.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-07-01 19:06:53 +00:00
2499f574ef Use triple equals in more places 2022-06-26 19:43:03 +02:00
e7e873866d Use triple equals 2022-06-26 17:37:25 +02:00
4ccbc741b8 Merge pull request #742 from th-ch/snyk-upgrade-45c0c305b24fe7d1bf9286a6c90b0320
[Snyk] Upgrade @cliqz/adblocker-electron from 1.23.7 to 1.23.8
2022-06-25 21:23:52 +02:00
8ec965a1a4 Merge pull request #745 from lukaszg84/master
Use ; instead of space for play/pause.
2022-06-25 21:22:50 +02:00
0936e9a258 Merge pull request #750 from EsmailELBoBDev2/patch-1
Update readme.md
2022-06-25 21:20:10 +02:00
32a5597573 Merge pull request #753 from Araxeus/fix-lyrics-font-size
fix lyrics font size
2022-06-25 21:18:44 +02:00
9932fd7647 Fix mpris playback status on play/pause 2022-06-22 18:30:49 +02:00
68429be1ce Bump jpeg-js from 0.4.3 to 0.4.4
Bumps [jpeg-js](https://github.com/eugeneware/jpeg-js) from 0.4.3 to 0.4.4.
- [Release notes](https://github.com/eugeneware/jpeg-js/releases)
- [Commits](https://github.com/eugeneware/jpeg-js/compare/v0.4.3...v0.4.4)

---
updated-dependencies:
- dependency-name: jpeg-js
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-17 01:59:01 +00:00
d7ac493337 fix lyrics font size 2022-06-16 17:21:13 +03:00
686a0a340e Update readme.md 2022-06-14 20:37:32 +02:00
bba499044b Style changes for review 2022-06-14 19:43:36 +02:00
6e1c50ede1 Support MPRIS loop 2022-06-14 15:45:58 +02:00
6e739e2723 Use ; instead of space for play/pause. 2022-06-10 11:08:36 +02:00
86029a0a73 fix: upgrade @cliqz/adblocker-electron from 1.23.7 to 1.23.8
Snyk has created this PR to upgrade @cliqz/adblocker-electron from 1.23.7 to 1.23.8.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-06-07 19:11:28 +00:00
b458925aa6 Merge pull request #734 from Araxeus/fix-in-app-menu-top-gap
fix top gap between nav-bar and browse-page
2022-06-06 20:51:11 +02:00
86a1c3c850 Merge pull request #605 from Araxeus/migrate-from-remote-to-ipc
migrate from remote to ipc + fix restart in portable app
2022-06-06 20:48:59 +02:00
8666f934cd Merge pull request #717 from th-ch/snyk-upgrade-7b576b920d24e12003dead59064f8564
[Snyk] Upgrade custom-electron-prompt from 1.4.2 to 1.5.0
2022-06-06 20:40:40 +02:00
59a93916a8 Merge pull request #685 from Araxeus/pip-part-2
Picture in Picture v2
2022-06-06 20:36:18 +02:00
f06a3c8c70 fix top gap between nav-bar and browse-page 2022-05-28 19:22:14 +03:00
7fe937b21e lint 2022-05-20 19:26:55 +03:00
a4aa22aae9 update Electron 2022-05-18 20:21:37 +03:00
TC
96b2aab683 Bump version and changelog to 1.17.0 2022-05-16 18:47:00 +02:00
54d25a26c7 fix: upgrade custom-electron-prompt from 1.4.2 to 1.5.0
Snyk has created this PR to upgrade custom-electron-prompt from 1.4.2 to 1.5.0.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-05-12 19:29:13 +00:00
f5622970c6 Merge branch 'master' into migrate-from-remote-to-ipc 2022-05-01 23:09:13 +03:00
ea09825ece Merge branch 'master' into pip-part-2 2022-05-01 23:06:30 +03:00
247764b64b Merge pull request #712 from th-ch/dependabot/npm_and_yarn/ejs-3.1.7
Bump ejs from 3.1.6 to 3.1.7
2022-05-01 22:04:08 +02:00
5e187b47d8 Merge pull request #693 from Araxeus/fix-event-listener-overload
fix injectCSS `did-finish-load` listener overload
2022-05-01 22:03:01 +02:00
1194befa48 Merge pull request #689 from th-ch/snyk-upgrade-809de6dcc81fbd20573d9ed4667b0c70
[Snyk] Upgrade @cliqz/adblocker-electron from 1.23.6 to 1.23.7
2022-05-01 22:01:17 +02:00
74d3358487 Merge branch 'master' into snyk-upgrade-809de6dcc81fbd20573d9ed4667b0c70 2022-05-01 21:59:41 +02:00
769a613ea5 Merge pull request #686 from th-ch/snyk-upgrade-ded3705d02b70c981cf38d50be5ccece
[Snyk] Upgrade custom-electron-prompt from 1.4.1 to 1.4.2
2022-05-01 21:59:00 +02:00
7280e02709 Bump ejs from 3.1.6 to 3.1.7
Bumps [ejs](https://github.com/mde/ejs) from 3.1.6 to 3.1.7.
- [Release notes](https://github.com/mde/ejs/releases)
- [Changelog](https://github.com/mde/ejs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mde/ejs/compare/v3.1.6...v3.1.7)

---
updated-dependencies:
- dependency-name: ejs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-01 19:54:27 +00:00
7b3a767003 Merge pull request #684 from th-ch/snyk-upgrade-82480fa720c2520dafdd84fa5f54d19b
[Snyk] Upgrade @electron/remote from 2.0.7 to 2.0.8
2022-05-01 21:54:09 +02:00
96b0d4e367 Merge pull request #699 from Araxeus/improve-plugin-submenu-ux
Improve plugin submenu ux
2022-05-01 21:53:38 +02:00
TC
ae8365f721 Bump electron-builder to fix Mac build script 2022-05-01 21:52:42 +02:00
8d85bbf5ec Merge pull request #702 from Araxeus/update-build-action
update build action
2022-05-01 21:51:11 +02:00
61cd2ef9dc Merge pull request #700 from Araxeus/rip-video-toggle-plugin
add different modes to video-toggle plugin
2022-05-01 21:43:06 +02:00
3394d647a1 Merge pull request #701 from Araxeus/lint
lint
2022-05-01 21:35:36 +02:00
882ad63fa8 Merge pull request #703 from Araxeus/imgbot
[ImgBot] Optimize images
2022-05-01 21:34:31 +02:00
5fd88ce522 Merge pull request #695 from Araxeus/add-album-to-lastfm
add album to lastfm if available
2022-05-01 21:33:16 +02:00
de280195c5 Merge pull request #680 from Araxeus/in-app-menu-hide-icon-option
[in-app-menu] add hide icon option
2022-05-01 21:32:10 +02:00
7bd69e447a update Electron 2022-04-30 15:24:37 +03:00
357f12c4d1 [ImgBot] Optimize images
*Total -- 828.18kb -> 733.19kb (11.47%)

/assets/youtube-music-tray.png -- 3.29kb -> 1.44kb (56.14%)
/web/youtube-music.svg -- 9.23kb -> 5.75kb (37.67%)
/web/screenshot.jpg -- 815.67kb -> 726.00kb (10.99%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2022-04-23 02:52:10 +03:00
d164cd6fb9 update build action 2022-04-22 23:48:32 +03:00
5d3dc6442f stylelint: declaration-block-no-duplicate-properties 2022-04-22 16:58:49 +03:00
cb7c9bda16 eslint: no-unused-vars 2022-04-22 16:58:41 +03:00
6f2552814f stylelint: declaration-block-no-shorthand-property-overrides 2022-04-22 16:58:41 +03:00
9beebd3772 add different modes to video-toggle plugin
* Custom: like before but slightly position

* Native: use the native video-toggle

* Disabled: force disable the native video-toggle
2022-04-20 18:46:59 +03:00
7cd9506122 add separator after plugin enabled button 2022-04-20 18:27:34 +03:00
f6de5c7c22 PiP options defaults + migrations 2022-04-20 15:21:10 +03:00
2ac3df0455 add album to lastfm if available 2022-04-18 18:45:53 +03:00
2dfe098521 fix injectCSS did-finish-load listener overload 2022-04-17 18:20:08 +03:00
77d4e9cb84 add optional PiP hotkey 2022-04-15 15:57:48 +03:00
b420998458 disable the video-toggle button when in PiP mode 2022-04-15 15:27:31 +03:00
feb06b015e dont save maximized state in PiP mode 2022-04-15 15:27:16 +03:00
09ba760aff fix: upgrade @cliqz/adblocker-electron from 1.23.6 to 1.23.7
Snyk has created this PR to upgrade @cliqz/adblocker-electron from 1.23.6 to 1.23.7.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-04-13 17:15:33 +00:00
0f192aab2b fix precise-volume position in PiP 2022-04-13 17:17:25 +03:00
c992ec4607 fix: upgrade custom-electron-prompt from 1.4.1 to 1.4.2
Snyk has created this PR to upgrade custom-electron-prompt from 1.4.1 to 1.4.2.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-04-11 17:03:23 +00:00
30840804fa fix: sync pip and index.js options 2022-04-11 00:15:19 +03:00
8000a8326f fix: in-app-menu bg color edge case
when item weren't initially rendered because the window was too small, but were then accessed via the arrow keys - backgrounds was missing
2022-04-10 21:39:06 +03:00
d23bfe9368 v3 2022-04-10 21:16:43 +03:00
047085e72b fix: upgrade @electron/remote from 2.0.7 to 2.0.8
Snyk has created this PR to upgrade @electron/remote from 2.0.7 to 2.0.8.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-04-10 16:51:23 +00:00
768ec7bda7 v2 2022-04-10 19:19:20 +03:00
c25a6f9d2a launch pip from video overlay v1 2022-04-10 01:12:06 +03:00
23058729f3 Merge pull request #682 from th-ch/bypass-age-restrictions-plugin
Add plugin to bypass age restrictions
2022-04-09 23:21:46 +02:00
TC
a1c6dfb199 Add plugin for age restrictions 2022-04-09 23:00:02 +02:00
TC
89ebc230e0 Add plugin to bypass age restrictions (with userscript) 2022-04-09 22:57:57 +02:00
b4b785d773 feat: in-app-menu hideIcon option 2022-04-09 22:56:01 +03:00
57ec0a463d Merge pull request #674 from th-ch/picture-in-picture-plugin
Add "Picture in picture" plugin
2022-04-09 21:53:34 +02:00
TC
6be9b76550 Improve style and remove draggable CSS that blocks login 2022-04-09 16:59:44 +02:00
TC
ebe3baf4bc Make PiP window bigger (follow up: make it configurable) 2022-04-09 16:59:24 +02:00
648d540ca9 Merge pull request #679 from th-ch/thibaut.c/lyrics-metadata-genius
Set lyrics metadata from Genius
2022-04-09 16:54:49 +02:00
cb910a6fd7 Merge branch 'master' into migrate-from-remote-to-ipc 2022-04-09 17:04:06 +03:00
TC
e071f768b4 Force minimist 1.2.6 to fix vuln 2022-04-09 15:21:59 +02:00
TC
05b6435a5c nit: lint package.json 2022-04-09 15:03:06 +02:00
TC
71e9f280a1 Set lyrics metadata if Genius plugin is enabled 2022-04-09 15:02:54 +02:00
TC
dbc34e6d0d Export fetchFromGenius util 2022-04-09 15:02:11 +02:00
TC
d0532d691e Process lyrics HTML in Genius util 2022-04-09 15:02:06 +02:00
2f218ef108 Merge pull request #677 from th-ch/tray-app-hidden
MacOS: bring back the app in dock when using tray + app hidden
2022-04-09 12:17:06 +02:00
TC
14326d2440 Only save size/position if not in PiP 2022-04-09 12:16:30 +02:00
TC
d37e557f79 Block some shortcuts (esc, f) in PiP 2022-04-09 12:15:38 +02:00
TC
5ca0c6b8a9 Ensure player is open when going PiP + add class 2022-04-09 12:14:42 +02:00
TC
e58a580b2b Restore fullscreenable after switching to PiP mode 2022-04-09 12:13:33 +02:00
TC
f3641f5072 Set in config when PiP mode is enabled 2022-04-09 12:11:05 +02:00
TC
296ecb6740 Always inject style 2022-04-09 12:10:22 +02:00
28b5645a56 Merge branch 'master' into migrate-from-remote-to-ipc 2022-04-08 17:00:49 +03:00
742a949680 Update plugins/picture-in-picture/back.js
Co-authored-by: Araxeus <oaeben@gmail.com>
2022-04-08 15:45:33 +02:00
57290c4164 Update plugins/picture-in-picture/back.js
Co-authored-by: Araxeus <oaeben@gmail.com>
2022-04-08 15:44:03 +02:00
6d5fe9561e Update plugins/picture-in-picture/back.js
Co-authored-by: Araxeus <oaeben@gmail.com>
2022-04-08 15:43:57 +02:00
735901095f Merge pull request #644 from th-ch/snyk-upgrade-1b73c27fe4a98c0629769eba2ee53e6a
[Snyk] Upgrade @electron/remote from 2.0.4 to 2.0.5
2022-04-08 15:42:35 +02:00
27454ab527 Merge pull request #660 from th-ch/snyk-upgrade-25706373301b148d087cae43d9039d28
[Snyk] Upgrade ytpl from 2.2.3 to 2.3.0
2022-04-08 15:41:46 +02:00
TC
c345d2cb34 Merge branch 'master' of github.com:th-ch/youtube-music into snyk-upgrade
* 'master' of github.com:th-ch/youtube-music:
  Bump plist from 3.0.2 to 3.0.5
  use spread syntax instead of Array.from
  Fix lyrics genius missing parts
  feat: option to force show like buttons
  Fix lyrics genius missing parts
  [precise-volume] fix expand-volume-slider not updating its value
  fix: upgrade ytdl-core from 4.10.1 to 4.11.0
  add always-on-top option
  fix volumeHud position in miniplayer
  fix: upgrade @cliqz/adblocker-electron from 1.23.4 to 1.23.5
2022-04-08 15:41:14 +02:00
1da297a356 Merge pull request #659 from th-ch/snyk-upgrade-943da220bfc070d47a809365f06e4136
[Snyk] Upgrade ytdl-core from 4.10.1 to 4.11.0
2022-04-08 15:33:12 +02:00
8ebdaf6fa0 Merge branch 'master' into snyk-upgrade-1b73c27fe4a98c0629769eba2ee53e6a 2022-04-08 15:31:29 +02:00
d4d82867f5 Merge pull request #678 from th-ch/dependabot/npm_and_yarn/plist-3.0.5
Bump plist from 3.0.2 to 3.0.5
2022-04-08 15:30:44 +02:00
2e99d6b9bb Bump plist from 3.0.2 to 3.0.5
Bumps [plist](https://github.com/TooTallNate/node-plist) from 3.0.2 to 3.0.5.
- [Release notes](https://github.com/TooTallNate/node-plist/releases)
- [Changelog](https://github.com/TooTallNate/plist.js/blob/master/History.md)
- [Commits](https://github.com/TooTallNate/node-plist/commits)

---
updated-dependencies:
- dependency-name: plist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-08 13:25:18 +00:00
a1e740b881 Merge pull request #624 from th-ch/snyk-upgrade-8a29fb2f6f9f73947c0629bb91d5a7f1
[Snyk] Upgrade @cliqz/adblocker-electron from 1.23.4 to 1.23.5
2022-04-08 15:24:47 +02:00
TC
de14d64927 nit: re-align quit menu 2022-04-08 15:17:36 +02:00
TC
6c93d635d0 Bring back the app in the dock (MacOS) when it was hidden 2022-04-08 15:17:26 +02:00
f4df6fceee Merge branch 'migrate-from-remote-to-ipc' of https://github.com/Araxeus/youtube-music into migrate-from-remote-to-ipc 2022-04-07 22:12:54 +03:00
d69c8a754e Merge branch 'local-upstream/master' into migrate-from-remote-to-ipc 2022-04-07 22:12:25 +03:00
c3d90d8b27 update Electron
+ update electron-unhandled
2022-04-07 22:09:54 +03:00
10681e4e99 Merge pull request #645 from Araxeus/fix-volumeHud-position-on-miniplayer
[Precise-Volume] fix volumeHud position in miniplayer
2022-04-07 21:02:22 +02:00
48aa3ba0d8 Merge pull request #655 from Araxeus/add-always-on-top-option
add always-on-top option
2022-04-07 21:01:15 +02:00
f98e4ea749 Merge pull request #670 from Araxeus/fix-precise-volume-not-updating-expand-slider
[precise-volume] fix expand-volume-slider not updating its value
2022-04-07 21:00:19 +02:00
dc500efb79 Merge pull request #671 from Araxeus/lyrics]-fix-part-of-lyrics-is-missing
Fix lyrics genius missing parts
2022-04-07 20:59:30 +02:00
8d9dafb149 Merge pull request #673 from Araxeus/force-show-like-buttons
feat: option to force show like buttons
2022-04-07 20:56:34 +02:00
TC
4ddd2f339b add PiP plugin to readme list 2022-04-07 20:05:13 +02:00
TC
d2265b59d7 Create first version of picture in picture plugin 2022-04-07 20:01:29 +02:00
d47b03c23d use spread syntax instead of Array.from 2022-04-06 20:15:24 +03:00
4c857cb9e9 Merge branch 'lyrics]-fix-part-of-lyrics-is-missing' of https://github.com/Araxeus/youtube-music into lyrics]-fix-part-of-lyrics-is-missing 2022-04-06 20:05:22 +03:00
c31f6cc797 Fix lyrics genius missing parts 2022-04-06 20:04:26 +03:00
0d3fa261a7 feat: option to force show like buttons 2022-04-06 19:48:58 +03:00
b6ee861166 Fix lyrics genius missing parts 2022-04-06 18:57:39 +03:00
f9cf12b7d3 [precise-volume] fix expand-volume-slider not updating its value 2022-04-06 18:26:05 +03:00
bed8d0a7f2 update Electron
+ update electron-unhandled
2022-03-30 18:47:51 +03:00
afac520ff8 fix: upgrade ytpl from 2.2.3 to 2.3.0
Snyk has created this PR to upgrade ytpl from 2.2.3 to 2.3.0.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-03-26 17:12:51 +00:00
1332c66050 fix: upgrade ytdl-core from 4.10.1 to 4.11.0
Snyk has created this PR to upgrade ytdl-core from 4.10.1 to 4.11.0.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-03-26 17:12:48 +00:00
7f08579671 add always-on-top option 2022-03-21 18:17:22 +02:00
d5e4f3af46 fix volumeHud position in miniplayer 2022-03-14 22:00:57 +02:00
bdceb4d462 fix: upgrade @electron/remote from 2.0.4 to 2.0.5
Snyk has created this PR to upgrade @electron/remote from 2.0.4 to 2.0.5.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-03-14 18:16:47 +00:00
2758a44965 fix: upgrade @cliqz/adblocker-electron from 1.23.4 to 1.23.5
Snyk has created this PR to upgrade @cliqz/adblocker-electron from 1.23.4 to 1.23.5.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-02-28 18:26:03 +00:00
704fba9aba fix portable app restart 2022-02-24 20:52:16 +02:00
5cffb6f062 Merge pull request #619 from Araxeus/fix-prompt-options
fix custom titlebar in prompt options
2022-02-24 19:27:56 +01:00
407887254f Merge branch 'master' into migrate-from-remote-to-ipc 2022-02-23 17:34:24 +02:00
47729130c9 fix custom titlebar in prompt options 2022-02-23 17:15:10 +02:00
7088941179 update electron 2022-02-22 18:27:45 +02:00
TC
ff39ddb277 Update changelog 2022-02-20 19:15:07 +01:00
TC
1d9bfe8ac8 Add automatic changelog 2022-02-20 18:50:12 +01:00
TC
edfa9d2ff5 Re-format package.json 2022-02-20 18:46:50 +01:00
1eeaf1dd0a remove @electron/remote 2022-02-20 19:38:42 +02:00
TC
efd2c912a8 Bump version to 1.16.0 2022-02-20 18:37:48 +01:00
9abf7a77d8 Merge branch 'local-upstream/master' into migrate-from-remote-to-ipc 2022-02-20 19:34:18 +02:00
2dd208c21b Merge pull request #596 from Araxeus/update-custom-electron-titlebar
update in-app-menu
2022-02-20 18:31:59 +01:00
c7fe81475f Merge pull request #602 from xn-oah/master
Fix clientID
2022-02-20 18:25:25 +01:00
0acd16fd5d Update yarn.lock 2022-02-15 19:01:23 +02:00
107c79f6a8 Merge branch 'master' of https://github.com/xn-oah/youtube-music 2022-02-13 16:02:53 -06:00
6aa789fb6a fixed clientID 2022-02-13 16:02:50 -06:00
94c86491d0 Merge branch 'th-ch:master' into master 2022-02-13 16:00:29 -06:00
a9f5f376d0 fixed clientID 2022-02-13 15:59:53 -06:00
5bd97685b9 migrate from remote to ipc 2022-02-13 23:45:53 +02:00
TC
ea35da52c3 Refactor Genius logic into separate util 2022-02-13 22:19:16 +01:00
6cad6871bf fix directory path 2022-02-13 22:02:12 +01:00
TC
f865dfd1b6 Fix https://github.com/th-ch/youtube-music/pull/578#issuecomment-1035517531 2022-02-13 19:56:46 +01:00
37e84d3287 Merge pull request #600 from th-ch/snoretoast-custom-compile
Add snoretoast custom compile script
2022-02-13 19:44:27 +01:00
7192b253eb Merge pull request #591 from Araxeus/update-snoretoast
fix interactive notifications icon + exclude platform specific plugins from build
2022-02-13 19:43:46 +01:00
1b99cc6930 use custom snoretoast on release #600 2022-02-13 20:40:09 +02:00
7f0d62383d Merge pull request #587 from xn-oah/master
Add album title to largeImage and change paused icon
2022-02-13 19:07:43 +01:00
TC
44300e757f Add snoretoast custom compile script 2022-02-13 18:14:57 +01:00
dc928542f8 lighten up menuItem background color 2022-02-11 16:29:11 +02:00
1834e1e938 Merge branch 'th-ch:master' into update-snoretoast 2022-02-11 15:54:13 +02:00
8263918033 add toggle fullscreen to view menu
enables f11 shortcut
2022-02-11 15:49:33 +02:00
247777bcc4 remove remote module from prompt-options 2022-02-11 15:24:42 +02:00
023db03278 Merge branch 'master' into update-custom-electron-titlebar 2022-02-10 23:13:55 +02:00
TC
a3f7eebd14 Bump version 2022-02-10 00:37:35 +01:00
5c7d612e97 Merge pull request #595 from Araxeus/useragent-option
make useragent override optional
2022-02-10 00:33:59 +01:00
465e8e1717 Merge branch 'master' into useragent-option 2022-02-10 00:32:52 +01:00
621c5de357 Merge pull request #588 from Araxeus/fix-album-name
get album name from DOM
2022-02-10 00:15:02 +01:00
TC
4d890c4941 Fix warnings in genius plugin 2022-02-10 00:08:40 +01:00
9b7c1a8d37 Merge pull request #584 from Araxeus/fix-lyrics
fix various lyrics issues
2022-02-10 00:07:33 +01:00
05b877b702 Merge pull request #580 from Araxeus/discord-timeout-time-prompt
discord set inactivity timeout prompt
2022-02-09 23:49:31 +01:00
8268b18eee Merge branch 'master' into discord-timeout-time-prompt 2022-02-09 23:47:01 +01:00
ed15ee92df Merge pull request #578 from Araxeus/single-instance-lock-option
add single instance lock option
2022-02-09 23:44:54 +01:00
c2fdfcca58 Merge pull request #561 from Araxeus/fix-restart-on-config-change
fix "restart app on config change" option
2022-02-09 23:40:57 +01:00
ac54d33fa7 Merge pull request #562 from Araxeus/fix-window-position-save-spam
fix window position save spam
2022-02-09 23:37:56 +01:00
38ffc093c3 Merge branch 'master' into update-custom-electron-titlebar 2022-02-07 20:57:15 +02:00
37c0ceaafe Merge branch 'master' into fix-restart-on-config-change 2022-02-07 17:27:27 +02:00
47f71a6022 Merge branch 'master' into discord-timeout-time-prompt 2022-02-07 17:24:44 +02:00
08a39a59d3 Merge branch 'master' into fix-lyrics 2022-02-07 17:14:20 +02:00
e6e83de89d Merge pull request #583 from Araxeus/fix-adblocker-loading-late
load adblocker sooner
2022-02-07 00:49:21 +01:00
1d1a9f5094 Merge pull request #585 from Araxeus/update-readme
add description of new plugins to readme
2022-02-07 00:45:28 +01:00
a5ba0b1a1a Merge pull request #573 from lazerl0rd/patch-1
Use `center` alignment for lyrics text
2022-02-07 00:43:54 +01:00
d785b9b95b Merge pull request #567 from Araxeus/fix-precise-volume-hud-position
fix precise-volume hud positioning
2022-02-07 00:42:33 +01:00
2f5e0c0038 Merge pull request #565 from Araxeus/update-electron
update electron and dependencies
2022-02-07 00:34:43 +01:00
09bd271df2 update in-app-menu 2022-02-06 03:32:15 +02:00
766dd21cb7 make useragent override optional 2022-02-05 18:24:37 +02:00
fef711549f update electron to v17.0.0 2022-02-05 15:20:14 +02:00
ca624f4df8 Merge branch 'master' into update-electron 2022-02-01 22:56:08 +02:00
8be07bcb7a update dependencies 2022-02-01 22:53:10 +02:00
271d5258ca fix interactive notifications icon 2022-02-01 19:47:01 +02:00
721f733dc4 update electron to 16.0.8 2022-01-31 23:50:38 +02:00
9b8d9c4905 get album name from DOM 2022-01-31 01:02:28 +02:00
543db59a55 fix formatting 2022-01-30 13:15:29 -06:00
e9a670831c Add album title to largeImage and change paused icon 2022-01-30 12:48:15 -06:00
24f694737a add new plugins to readme 2022-01-30 19:12:42 +02:00
fc111e2513 keep footer out of contents div 2022-01-29 18:05:55 +02:00
187f6833f4 Merge branch 'fix-lyrics' of https://github.com/Araxeus/youtube-music into fix-lyrics 2022-01-29 17:58:47 +02:00
b042d0a8ca use regex on cleanupName() 2022-01-29 17:57:39 +02:00
eff0995d78 fix showing old lyrics if new lyrics couldn't be resolved 2022-01-29 17:57:14 +02:00
366c90f71d fix showing old lyrics if new lyrics couldn't be resolved 2022-01-29 17:10:47 +02:00
909036108f reenable lyrics footer 2022-01-29 16:56:55 +02:00
41b9ab4815 lint 2022-01-29 16:35:52 +02:00
60bb5b861d change to new lyrics even if lyrics tab was already selected 2022-01-29 11:35:18 +02:00
900c44d9c0 fix disabled lyrics tab 2022-01-29 11:14:03 +02:00
babc50099c fix lyrics css styling 2022-01-29 11:13:53 +02:00
ea191a3005 load adblocker sooner 2022-01-29 09:37:02 +02:00
02081d8272 fix precise-volume hud positioning 2022-01-27 22:41:55 +02:00
03e27519db discord set inactivity timeout prompt 2022-01-27 22:32:45 +02:00
1248f1c8ec add single instance lock option 2022-01-27 10:00:35 +02:00
766bd378fd Use center alignment for lyrics text
This seems to be the case for most music applications [that I've used] and also provides the benefit of "fixing" how lyrics appear in RTL languages (such as Arabic).
2022-01-26 15:58:50 +00:00
61eb23614a Merge pull request #557 from Araxeus/fix-filepath-error
filenamify playlist folder name
2022-01-23 14:48:10 +01:00
3f606695bf Merge pull request #554 from th-ch/snyk-fix-6b7a813ed44a44be91e81ec320a8fde1
[Snyk] Security upgrade node-fetch from 2.6.6 to 2.6.7 (3.1.1 incompatible)
2022-01-23 14:40:53 +01:00
74b67c3d33 fix restart app on config change option 2022-01-23 00:12:20 +02:00
TC
8dd41cca09 Use v2.6.7 of node-fetch 2022-01-22 20:02:06 +01:00
TC
89ea66ba2b Simplify off-screen check 2022-01-22 19:57:23 +01:00
199d8ba4d7 Merge pull request #548 from Araxeus/offscreen-app-fix
fix app starting offscreen
2022-01-22 19:56:12 +01:00
b0f29dde94 Merge pull request #566 from th-ch/release-mac-arm64
Release Mac arm64
2022-01-22 19:54:40 +01:00
TC
90f4c9383f Release Mac arm64 2022-01-22 19:47:10 +01:00
4c8996096a Merge pull request #553 from arunim2405/master
Build command for Apple (m1) silicon macs
2022-01-22 19:45:57 +01:00
315048722f update electron to 16.0.7 2022-01-22 18:07:47 +02:00
9403804128 fix multiple monitor calculations 2022-01-21 21:58:44 +02:00
28b6d99599 lint 2022-01-21 00:05:05 +02:00
92fc8f325a Merge branch 'fix-window-position-save-spam' of https://github.com/Araxeus/youtube-music into fix-window-position-save-spam 2022-01-21 00:02:14 +02:00
a744a2ebde fix window position save spam 2022-01-21 00:01:14 +02:00
c8f62f6d19 fix window position save spam
(and also window position being forgotten on maximizing)
2022-01-20 23:45:57 +02:00
7fd9d5a971 use -8 insteaf of 0
(often maximized app will have -8,-8 coordinates)
2022-01-19 19:40:58 +02:00
cb920194ce filenamify playlist folder name 2022-01-18 18:32:25 +02:00
dc728786ee fix: package.json & yarn.lock to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-NODEFETCH-2342118
2022-01-17 18:10:50 +00:00
8cfc8d1ba1 support build for arm64 macs 2022-01-17 11:58:52 +05:30
68bd691702 check if window.y is offscreen 2022-01-16 20:02:35 +02:00
44aa62c9c8 Merge pull request #545 from th-ch/snyk-upgrade-d09c6b75ea60c0149b8328cb6bad2f0d
[Snyk] Upgrade custom-electron-titlebar from 3.2.9 to 3.2.10
2022-01-16 17:31:38 +01:00
2ad6c0fcdc Merge pull request #551 from Araxeus/fix-linux-duplicate-mediasession
Fix duplicate media session on linux
2022-01-16 17:29:58 +01:00
TC
40fbf3441a Backport missing changes for playlist badge 2022-01-16 17:29:21 +01:00
96f0d30818 Merge pull request #550 from Araxeus/download-playlist-badge-count
show a badge remaining items when downloading a playlist
2022-01-16 17:26:14 +01:00
90d6f13b56 Merge branch 'master' into download-playlist-badge-count 2022-01-16 17:23:43 +01:00
a0f2233db4 Merge pull request #549 from Araxeus/fix-download-button-on-playlist-menu
allow downloading playlists from popup menu
2022-01-16 17:19:51 +01:00
57ace9d504 lint 2022-01-14 00:08:43 +02:00
c2cc3cf7a0 fix duplicate mpris session 2022-01-13 14:46:41 +02:00
17a24cbb04 set badge on downloader playlist 2022-01-12 14:29:56 +02:00
74f61a532d downloader lint&refactor 2022-01-12 09:49:27 +02:00
c7e793b66e fix playback speed slider showing up where it shouldn't 2022-01-11 23:41:17 +02:00
21c149efc7 update ytdl-core 2022-01-11 22:54:53 +02:00
5e68d2487f allow downloading playlists from popup menu 2022-01-11 22:54:53 +02:00
e8bbc5ec1c fix app starting offscreen 2022-01-11 20:14:33 +02:00
97013d8373 fix: upgrade custom-electron-titlebar from 3.2.9 to 3.2.10
Snyk has created this PR to upgrade custom-electron-titlebar from 3.2.9 to 3.2.10.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-01-08 19:06:52 +00:00
ec4c2e92af Merge pull request #539 from markbaas/mpris-artist-fix
xesam:artist should be a list
2022-01-07 22:11:54 +01:00
TC
81dadeddb9 Disable NODE_OPTIONS in entry file 2022-01-07 22:09:26 +01:00
7f3a554bc3 Merge pull request #537 from Araxeus/fix-song-info-bugs
fix notifications showing thumbnail of last song
2022-01-07 22:04:47 +01:00
98f990fcdd dont send callback on playPause() if still handling data from new song
fix notifications showing thumbnail of last song
2022-01-04 19:40:06 +02:00
75999e9dcf xesam:artist should be a list 2022-01-04 15:18:19 +01:00
4d595f56d5 Update readme (Spectron -> Playwright) 2022-01-02 22:31:19 +01:00
368 changed files with 46616 additions and 14362 deletions

View File

@ -1,7 +1,8 @@
root = true
[*]
indent_style = tab
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true

1
.eslintignore Normal file
View File

@ -0,0 +1 @@
.eslintrc.js

80
.eslintrc.js Normal file
View File

@ -0,0 +1,80 @@
module.exports = {
extends: [
'eslint:recommended',
'plugin:import/recommended',
'plugin:import/typescript',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking',
],
plugins: ['prettier', '@typescript-eslint', 'import'],
parser: '@typescript-eslint/parser',
parserOptions: {
project: './tsconfig.json',
tsconfigRootDir: __dirname,
sourceType: 'module',
ecmaVersion: 'latest'
},
rules: {
'arrow-parens': ['error', 'always'],
'object-curly-spacing': ['error', 'always'],
'@typescript-eslint/no-floating-promises': 'off',
'@typescript-eslint/no-misused-promises': ['off', { checksVoidReturn: false }],
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
"@typescript-eslint/no-non-null-assertion": "off",
'import/first': 'error',
'import/newline-after-import': 'error',
'import/no-default-export': 'off',
'import/no-duplicates': 'error',
'import/no-unresolved': ['error', { ignore: ['^virtual:', '\\?inline$', '\\?raw$', '\\?asset&asarUnpack'] }],
'import/order': [
'error',
{
'groups': ['builtin', 'external', ['internal', 'index', 'sibling'], 'parent', 'type'],
'newlines-between': 'always-and-inside-groups',
'alphabetize': {order: 'ignore', caseInsensitive: false}
}
],
'import/prefer-default-export': 'off',
'camelcase': ['error', {properties: 'never'}],
'class-methods-use-this': 'off',
'lines-around-comment': [
'error',
{
beforeBlockComment: false,
afterBlockComment: false,
beforeLineComment: false,
afterLineComment: false,
},
],
'max-len': 'off',
'no-mixed-operators': 'error',
'no-multi-spaces': ['error', {ignoreEOLComments: true}],
'no-tabs': 'error',
'no-void': 'error',
'no-empty': 'off',
'prefer-promise-reject-errors': 'off',
'quotes': ['error', 'single', {
avoidEscape: true,
allowTemplateLiterals: false,
}],
'quote-props': ['error', 'consistent'],
'semi': ['error', 'always'],
},
env: {
browser: true,
node: true,
es6: true,
},
ignorePatterns: ['dist', 'node_modules'],
root: true,
settings: {
'import/parsers': {
'@typescript-eslint/parser': ['.ts']
},
'import/resolver': {
typescript: {},
exports: {},
},
},
};

4
.gitattributes vendored
View File

@ -1,2 +1,2 @@
* text=auto
*.js text eol=lf
* text=auto eol=lf
*.js text

95
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@ -0,0 +1,95 @@
name: Bug Report
description: Report a YouTube Music bug
title: "[Bug]: "
labels: "bug :beetle:"
body:
- type: checkboxes
attributes:
label: Preflight Checklist
description: Please ensure you've completed all of the following.
options:
- label: I use the latest version of YouTube Music (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.
required: true
- label: I understand that **th-ch/youtube-music has NO affiliation with Google or YouTube**
required: true
- type: input
attributes:
label: YouTube Music (Application) Version
description: |
What version of the YouTube Music Application are you using?
Note: Please check if this issue is reproducible with the latest stable release.
placeholder: 2.0.0
validations:
required: true
- type: checkboxes
attributes:
label: Checklists
options:
- label: I use the portable version of the YouTube Music Application.
- label: I can reproduce this issue in the [official YTM web version](https://music.youtube.com).
- type: dropdown
attributes:
label: What operating system are you using?
options:
- Windows
- macOS
- Ubuntu
- Other Linux
- Other (specify below)
validations:
required: true
- type: input
attributes:
label: Operating System Version
description: What operating system version are you using? On Windows, click the Start button > Settings > System > About. On macOS, click the Apple Menu > About This Mac. On Linux, use lsb_release or uname -a.
placeholder: "e.g. Windows 10 version 1909, macOS Catalina 10.15.7, or Ubuntu 20.04"
validations:
required: true
- type: dropdown
attributes:
label: What CPU architecture are you using?
options:
- x64
- ia32
- arm64 (including Apple Silicon)
- Other (specify below)
validations:
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?
placeholder: 1.20.0
- type: textarea
attributes:
label: Reproduction steps
description: Provide steps to reproduce the issue.
placeholder: 1. Enable the X plugin.
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: A clear and concise description of what you expected to happen.
validations:
required: true
- type: textarea
attributes:
label: Actual Behavior
description: A clear description of what actually happens.
validations:
required: true
- type: textarea
attributes:
label: Enabled plugins
description: Provide the list of plugins you enabled.
placeholder: 1. Album Color Theme
validations:
required: true
- 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.

View File

@ -0,0 +1,38 @@
name: Feature Request
description: Suggest an idea for YouTube Music
title: "[Feature Request]: "
labels: "enhancement :sparkles:"
body:
- type: checkboxes
attributes:
label: Preflight Checklist
description: Please ensure you've completed all of the following.
options:
- label: I use the latest version of YouTube Music (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.
required: true
- type: textarea
attributes:
label: Problem Description
description: A clear and concise description of the problem you are seeking to solve with this feature request.
validations:
required: true
- type: textarea
attributes:
label: Proposed Solution
description: Describe the solution you'd like in a clear and concise manner.
validations:
required: true
- type: textarea
attributes:
label: Alternatives Considered
description: A clear and concise description of any alternative solutions or features you've considered.
validations:
required: true
- type: textarea
attributes:
label: Additional Information
description: Any other context about the problem.
validations:
required: false

View File

@ -1,7 +1,12 @@
name: Build YouTube Music
on:
- push
push:
branches: [ master ]
pull_request:
env:
NODE_VERSION: "20.x"
jobs:
build:
@ -10,53 +15,149 @@ jobs:
strategy:
fail-fast: true
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
os: [ macos-latest, ubuntu-latest, windows-latest ]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v2
with:
version: 8
run_install: false
- name: Setup NodeJS
uses: actions/setup-node@v1
if: startsWith(matrix.os, 'macOS') != true
uses: actions/setup-node@v4
with:
node-version: "14.x"
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v2
id: yarn-cache
- name: Setup NodeJS for macOS
if: startsWith(matrix.os, 'macOS')
uses: actions/setup-node@v4
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
node-version: ${{ env.NODE_VERSION }}
- name: Install dependencies
run: yarn --frozen-lockfile
run: pnpm install --frozen-lockfile
# 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'
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')
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')
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
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')
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
pnpm release:win
- name: Test
uses: GabrielBB/xvfb-action@v1
uses: coactions/setup-xvfb@v1
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
with:
run: yarn test
run: pnpm test:debug
- name: Build on Mac
release:
runs-on: ubuntu-latest
name: Release YouTube Music
if: github.repository == 'th-ch/youtube-music' && github.ref == 'refs/heads/master'
needs: build
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install pnpm
uses: pnpm/action-setup@v2
with:
version: 8
run_install: false
- name: Setup NodeJS
if: startsWith(matrix.os, 'macOS') != true
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- name: Setup NodeJS for macOS
if: startsWith(matrix.os, 'macOS')
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
run: |
yarn run release:mac
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Build on Linux
if: startsWith(matrix.os, 'ubuntu')
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
run: |
yarn run release:linux
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build on Windows
if: startsWith(matrix.os, 'windows')
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Get version
run: |
yarn run release:win
echo "VERSION_TAG=v$(node -pe "require('./package.json').version")" >> $GITHUB_ENV
- name: Check if version already exists in tags
run: |
echo "VERSION_HASH=$(git rev-parse -q --verify 'refs/tags/${{ env.VERSION_TAG }}')" >> $GITHUB_ENV
echo "CHANGELOG_ANCHOR=$(echo $VERSION_TAG | sed -e 's/\.//g')" >> $GITHUB_ENV
- name: Fetch draft release
if: ${{ env.VERSION_HASH == '' }}
uses: cardinalby/git-get-release-action@v1
id: get_draft_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
latest: true
draft: true
searchLimit: 1
- name: Publish Release (if it does not exist)
if: ${{ env.VERSION_HASH == '' }}
uses: irongut/EditRelease@v1.2.0
with:
token: ${{ secrets.GH_TOKEN }}
id: ${{ steps.get_draft_release.outputs.id }}
draft: false
prerelease: false
replacename: true
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.
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)
- name: Update changelog
if: ${{ env.VERSION_HASH == '' }}
run: |
pnpm changelog
- name: Commit changelog
if: ${{ env.VERSION_HASH == '' }}
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: Update changelog for ${{ env.VERSION_TAG }}
file_pattern: "changelog.md"
commit_user_name: CI
commit_user_email: th-ch@users.noreply.github.com

20
.github/workflows/dependency-review.yml vendored Normal file
View File

@ -0,0 +1,20 @@
# Dependency Review Action
#
# This Action will scan dependency manifest files that change as part of a Pull Reqest, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
#
# Source repository: https://github.com/actions/dependency-review-action
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
name: "Dependency Review"
on: [ pull_request ]
permissions:
contents: read
jobs:
dependency-review:
runs-on: ubuntu-latest
steps:
- name: "Checkout Repository"
uses: actions/checkout@v4
- name: "Dependency Review"
uses: actions/dependency-review-action@v4

20
.github/workflows/winget-cla.yml vendored Normal file
View File

@ -0,0 +1,20 @@
name: Submit CLA to Winget PR
on:
workflow_dispatch:
inputs:
pr_url:
description: "Specific PR URL"
required: true
type: string
jobs:
comment:
name: Comment to PR
runs-on: ubuntu-latest
steps:
- name: Submit CLA to Windows Package Manager Community Repository Pull Request
run: gh pr comment $PR_URL --body "@microsoft-github-policy-service agree"
env:
GITHUB_TOKEN: ${{ secrets.WINGET_ACC_TOKEN }}
PR_URL: ${{ inputs.pr_url }}

30
.github/workflows/winget-submission.yml vendored Normal file
View File

@ -0,0 +1,30 @@
name: Submit to Windows Package Manager Community Repository
on:
release:
types: [ released ]
workflow_dispatch:
inputs:
tag_name:
description: "Specific tag name"
required: true
type: string
jobs:
winget:
name: Publish winget package
runs-on: ubuntu-latest
steps:
- name: Set winget version env
env:
TAG_NAME: ${{ inputs.tag_name || github.event.release.tag_name }}
run: echo "WINGET_TAG_NAME=$(echo ${TAG_NAME#v})" >> $GITHUB_ENV
- name: Submit package to Windows Package Manager Community Repository
uses: vedantmgoyal2009/winget-releaser@v2
with:
identifier: th-ch.YouTubeMusic
installers-regex: '^YouTube-Music-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

13
.gitignore vendored
View File

@ -1,4 +1,15 @@
node_modules
/dist
/assets/generated
/pack
electron-builder.yml
.vscode/settings.json
.idea
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
.vite-inspect

5
.prettierrc Normal file
View File

@ -0,0 +1,5 @@
{
"tabWidth": 2,
"useTabs": false,
"singleQuote": true
}

376
README.md Normal file
View File

@ -0,0 +1,376 @@
# YouTube Music
<div align="center">
[![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)
[![eslint code style](https://img.shields.io/badge/code_style-eslint-5ed9c7.svg?style=for-the-badge)](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
[![Build status](https://img.shields.io/github/actions/workflow/status/th-ch/youtube-music/build.yml?branch=master&style=for-the-badge&logo=youtube-music)](https://GitHub.com/th-ch/youtube-music/releases/)
[![GitHub All Releases](https://img.shields.io/github/downloads/th-ch/youtube-music/total?style=for-the-badge&logo=youtube-music)](https://GitHub.com/th-ch/youtube-music/releases/)
[![AUR](https://img.shields.io/aur/version/youtube-music-bin?color=blueviolet&style=for-the-badge&logo=youtube-music)](https://aur.archlinux.org/packages/youtube-music-bin)
[![Known Vulnerabilities](https://snyk.io/test/github/th-ch/youtube-music/badge.svg)](https://snyk.io/test/github/th-ch/youtube-music)
</div>
![Screenshot](web/screenshot.jpg "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)
**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) |
|:---------------------------------------------------------------------------------------------------------:|
|![Screenshot1](https://github.com/th-ch/youtube-music/assets/16558115/53efdf73-b8fa-4d7b-a235-b96b91ea77fc)|
## Translation
You can help with translation on [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>
## Download
You can check out the [latest release](https://github.com/th-ch/youtube-music/releases/latest) to quickly find the
latest version.
### Arch Linux
Install the `youtube-music-bin` 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)):
```bash
brew install th-ch/youtube-music/youtube-music
```
If you install the app manually and get an error "is damaged and cant be opened." when launching the app, run the following in the Terminal:
```bash
xattr -cr /Applications/YouTube\ Music.app
```
### Windows
You can use the [Scoop package manager](https://scoop.sh) to install the `youtube-music` package from
the [`extras` bucket](https://github.com/ScoopInstaller/Extras).
```bash
scoop bucket add extras
scoop install extras/youtube-music
```
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.
*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
```
#### 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).
- `x64` for 64-bit Windows
- `ia32` for 32-bit Windows
- `arm64` for ARM64 Windows
- Download installer in release page. (`*-Setup.exe`)
- Place them in the **same directory**.
- Run the installer.
## 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)
- **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
- **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/)
- **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
## Themes
You can load CSS files to change the look of the application (Options > Visual Tweaks > Themes).
Some predefined themes are available in 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
```
## Build your own plugins
Using plugins, you can:
- manipulate the app - the `BrowserWindow` from electron is passed to the plugin handler
- change the front by manipulating the HTML/CSS
### Creating a plugin
Create a folder in `src/plugins/YOUR-PLUGIN-NAME`:
- `index.ts`: the main file of the plugin
```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) {},
},
});
```
### Common use cases
- injecting custom CSS: create a `style.css` file in the same folder then:
```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
});
```
- If you want to change the 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
});
```
- communicating between the front and back: can be done using the ipcMain module from electron. See `index.ts` file and
example in `sponsorblock` plugin.
## Build
1. Clone the repo
2. Follow [this guide](https://pnpm.io/installation) to install `pnpm`
3. Run `pnpm install --frozen-lockfile` to install dependencies
4. Run `pnpm build:OS`
- `pnpm dist:win` - Windows
- `pnpm dist:linux` - Linux
- `pnpm dist:mac` - MacOS
Builds the app for macOS, Linux, and Windows,
using [electron-builder](https://github.com/electron-userland/electron-builder).
## Production Preview
```bash
pnpm start
```
## Tests
```bash
pnpm test
```
Uses [Playwright](https://playwright.dev/) to test the app.
## License
MIT © [th-ch](https://github.com/th-ch/youtube-music)
## Most asked questions
### Why apps menu isn't showing up?
If `Hide Menu` option is on - you can show the menu with the <kbd>alt</kbd> key (or <kbd>\`</kbd> [backtick] if using
the in-app-menu plugin)

50
assets/error.html Normal file
View File

@ -0,0 +1,50 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Cannot load YouTube Music</title>
<style>
body {
background: #000;
}
.container {
margin: 0;
font-family: Roboto, Arial, sans-serif;
font-size: 20px;
font-weight: 500;
color: rgba(255, 255, 255, 0.5);
position: absolute;
top: 50%;
left: 50%;
margin-right: -50%;
transform: translate(-50%, -50%);
text-align: center;
}
.button {
background: #065fd4;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: white;
font: inherit;
text-transform: uppercase;
text-decoration: none;
border-radius: 2px;
font-size: 16px;
font-weight: normal;
text-align: center;
padding: 8px 22px;
display: inline-block;
}
</style>
</head>
<body>
<div class="container">
<p>Cannot load YouTube Music… Internet disconnected?</p>
<a class="button" href="#" onclick="reload()">Retry</a>
</div>
</body>
</html>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 931 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

View File

Before

Width:  |  Height:  |  Size: 250 B

After

Width:  |  Height:  |  Size: 250 B

View File

Before

Width:  |  Height:  |  Size: 192 B

After

Width:  |  Height:  |  Size: 192 B

View File

Before

Width:  |  Height:  |  Size: 265 B

After

Width:  |  Height:  |  Size: 265 B

View File

Before

Width:  |  Height:  |  Size: 269 B

After

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

6
assets/youtube-music.svg Normal file
View File

@ -0,0 +1,6 @@
<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>

After

Width:  |  Height:  |  Size: 353 B

1052
changelog.md Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,88 +0,0 @@
const defaultConfig = {
"window-size": {
width: 1100,
height: 550,
},
url: "https://music.youtube.com",
options: {
tray: false,
appVisible: true,
autoUpdates: true,
hideMenu: false,
startAtLogin: false,
disableHardwareAcceleration: false,
restartOnConfigChanges: false,
trayClickPlayPause: false,
autoResetAppCache: false,
resumeOnStart: true,
proxy: "",
},
plugins: {
// Enabled plugins
navigation: {
enabled: true,
},
adblocker: {
enabled: true,
cache: true,
additionalBlockLists: [], // Additional list of filters, e.g "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt"
},
// Disabled plugins
shortcuts: {
enabled: false,
overrideMediaKeys: false,
},
downloader: {
enabled: false,
ffmpegArgs: [], // e.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s
downloadFolder: undefined, // Custom download folder (absolute path)
preset: "mp3",
},
"last-fm": {
enabled: false,
api_root: "http://ws.audioscrobbler.com/2.0/",
api_key: "04d76faaac8726e60988e14c105d421a", // api key registered by @semvis123
secret: "a5d2a36fdf64819290f6982481eaffa2",
},
discord: {
enabled: false,
activityTimoutEnabled: true, // if enabled, the discord rich presence gets cleared when music paused after the time specified below
activityTimoutTime: 10 * 60 * 1000, // 10 minutes
listenAlong: true, // add a "listen along" button to rich presence
},
notifications: {
enabled: false,
unpauseNotification: false,
urgency: "normal", //has effect only on Linux
interactive: false //has effect only on Windows
},
"precise-volume": {
enabled: false,
steps: 1, //percentage of volume to change
arrowsShortcut: true, //enable ArrowUp + ArrowDown local shortcuts
globalShortcuts: {
volumeUp: "",
volumeDown: ""
},
savedVolume: undefined //plugin save volume between session here
},
sponsorblock: {
enabled: false,
apiURL: "https://sponsor.ajay.app",
categories: [
"sponsor",
"intro",
"outro",
"interaction",
"selfpromo",
"music_offtopic",
],
},
"video-toggle": {
enabled: false,
forceHide: false,
},
},
};
module.exports = defaultConfig;

View File

@ -1,23 +0,0 @@
const defaultConfig = require("./defaults");
const plugins = require("./plugins");
const store = require("./store");
const set = (key, value) => {
store.set(key, value);
};
const get = (key) => {
return store.get(key);
};
module.exports = {
defaultConfig,
get,
set,
edit: () => store.openInEditor(),
watch: (cb) => {
store.onDidChange("options", cb);
store.onDidChange("plugins", cb);
},
plugins,
};

View File

@ -1,46 +0,0 @@
const store = require("./store");
function getEnabled() {
const plugins = store.get("plugins");
const enabledPlugins = Object.entries(plugins).filter(([plugin, options]) =>
isEnabled(plugin)
);
return enabledPlugins;
}
function isEnabled(plugin) {
const pluginConfig = store.get("plugins")[plugin];
return pluginConfig !== undefined && pluginConfig.enabled;
}
function setOptions(plugin, options) {
const plugins = store.get("plugins");
store.set("plugins", {
...plugins,
[plugin]: {
...plugins[plugin],
...options,
},
});
}
function getOptions(plugin) {
return store.get("plugins")[plugin];
}
function enable(plugin) {
setOptions(plugin, { enabled: true });
}
function disable(plugin) {
setOptions(plugin, { enabled: false });
}
module.exports = {
isEnabled,
getEnabled,
enable,
disable,
setOptions,
getOptions,
};

View File

@ -1,83 +0,0 @@
const Store = require("electron-store");
const defaults = require("./defaults");
const migrations = {
">=1.14.0": (store) => {
if (
typeof store.get("plugins.precise-volume.globalShortcuts") !== "object"
) {
store.set("plugins.precise-volume.globalShortcuts", {});
}
if (store.get("plugins.hide-video-player.enabled")) {
store.delete("plugins.hide-video-player");
store.set("plugins.video-toggle.enabled", true);
}
},
">=1.13.0": (store) => {
if (store.get("plugins.discord.listenAlong") === undefined) {
store.set("plugins.discord.listenAlong", true);
}
},
">=1.12.0": (store) => {
const options = store.get("plugins.shortcuts");
let updated = false;
for (const optionType of ["global", "local"]) {
if (Array.isArray(options[optionType])) {
const updatedOptions = {};
for (const optionObject of options[optionType]) {
if (optionObject.action && optionObject.shortcut) {
updatedOptions[optionObject.action] = optionObject.shortcut;
}
}
options[optionType] = updatedOptions;
updated = true;
}
}
if (updated) {
store.set("plugins.shortcuts", options);
}
},
">=1.11.0": (store) => {
if (store.get("options.resumeOnStart") === undefined) {
store.set("options.resumeOnStart", true);
}
},
">=1.7.0": (store) => {
const enabledPlugins = store.get("plugins");
if (!Array.isArray(enabledPlugins)) {
console.warn("Plugins are not in array format, cannot migrate");
return;
}
// Include custom options
const plugins = {
adblocker: {
enabled: true,
cache: true,
additionalBlockLists: [],
},
downloader: {
enabled: false,
ffmpegArgs: [], // e.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s
downloadFolder: undefined, // Custom download folder (absolute path)
},
};
enabledPlugins.forEach((enabledPlugin) => {
plugins[enabledPlugin] = {
...plugins[enabledPlugin],
enabled: true,
};
});
store.set("plugins", plugins);
},
};
module.exports = new Store({
defaults,
clearInvalidConfig: false,
migrations,
});

View File

@ -1 +1,9 @@
<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>
<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: 552 B

After

Width:  |  Height:  |  Size: 588 B

View File

@ -1 +1,23 @@
<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>
<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.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1 +1,32 @@
<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>
<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.6 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1 +1,5 @@
<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">&lt;/&gt;</text></svg>
<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">&lt;/&gt;
</text>
</svg>

Before

Width:  |  Height:  |  Size: 208 B

After

Width:  |  Height:  |  Size: 224 B

View File

@ -1 +1,8 @@
<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>
<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: 576 B

After

Width:  |  Height:  |  Size: 634 B

View File

@ -1 +1,35 @@
<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>
<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: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1 +1,6 @@
<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>
<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: 375 B

After

Width:  |  Height:  |  Size: 391 B

View File

@ -1 +1,6 @@
<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>
<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: 341 B

After

Width:  |  Height:  |  Size: 360 B

View File

@ -1,138 +1,137 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>YouTube Music Desktop App (Unofficial)</title>
<link
rel="icon"
href="./favicon/favicon.ico"
sizes="16x16"
type="image/x-icon"
/>
<link
rel="icon"
href="./favicon/favicon_32.png"
sizes="32x32"
type="image/png"
/>
<link
rel="icon"
href="./favicon/favicon_48.png"
sizes="48x48"
type="image/png"
/>
<link
rel="icon"
href="./favicon/favicon_96.png"
sizes="96x96"
type="image/png"
/>
<link
rel="icon"
href="./favicon/favicon_144.png"
sizes="144x144"
type="image/png"
/>
<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 name="theme-color" content="#131313" />
<meta
name="description"
content="YouTube Music Unofficial Desktop App with built-in ad blocker and downloader"
/>
<meta
property="og:site_name"
content="YouTube&nbsp;Music&nbsp;Desktop&nbsp;App"
/>
<meta
property="og:url"
class="meta-url"
content="https://th-ch.github.io/youtube-music"
/>
<meta property="og:type" content="website" />
<meta
name="twitter:url"
class="meta-url"
content="https://th-ch.github.io/youtube-music"
/>
<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&nbsp;Music&nbsp;Desktop&nbsp;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 rel="stylesheet" href="./style/style.css" />
<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
class="header-logo-image"
src="./img/youtube-music.svg"
alt="YouTube Music"
/>
</a>
</h1>
</div>
</div>
</div>
</header>
<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
src="./img/youtube-music.png"
id="mockup-header-img"
alt="YouTube Music"
/>
</div>
</div>
</div>
</div>
</section>
<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
class="device-mockup"
src="./img/adblock.svg"
width="100px"
alt="Adblocker"
data-sr-id="0"
style="
<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(
@ -157,12 +156,13 @@
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="5"
style="
width="100px"
/>
</div>
<div
class="feature-extended-body"
data-sr-id="5"
style="
visibility: visible;
opacity: 1;
transform: matrix3d(
@ -187,19 +187,19 @@
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
class="device-mockup"
src="./img/download.svg"
alt="Downloader"
data-sr-id="2"
style="
>
<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(
@ -224,12 +224,12 @@
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="
/>
</div>
<div
class="feature-extended-body"
data-sr-id="6"
style="
visibility: visible;
opacity: 1;
transform: matrix3d(
@ -254,22 +254,22 @@
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
class="device-mockup"
src="./img/plugins.svg"
alt="Plugins"
data-sr-id="3"
style="
>
<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(
@ -294,12 +294,12 @@
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="
/>
</div>
<div
class="feature-extended-body"
data-sr-id="7"
style="
visibility: visible;
opacity: 1;
transform: matrix3d(
@ -324,24 +324,24 @@
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
class="device-mockup"
src="./img/code.svg"
alt="Code"
data-sr-id="4"
style="
>
<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;
@ -367,12 +367,12 @@
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="
/>
</div>
<div
class="feature-extended-body"
data-sr-id="8"
style="
visibility: visible;
opacity: 1;
transform: matrix3d(
@ -397,94 +397,94 @@
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>
>
<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 src="./img/youtube-music.svg" alt="YouTube Music logo" />
</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
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
viewBox="0 0 1792 1792"
>
<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">© 2021 th-ch</div>
</div>
</div>
</div>
</footer>
</div>
<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>
<script src="./js/main.js"></script>
</body>
</html>

View File

@ -1,46 +1,49 @@
/* eslint-disable */
// Constants
const element = document.documentElement,
body = document.body,
revealOnScroll = (window.sr = ScrollReveal({ mobile: false }));
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", function () {
body.classList.add("is-loaded");
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", function () {
revealOnScroll.reveal(".feature-extended .device-mockup", {
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",
distance: '100px',
easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)',
origin: 'bottom',
viewFactor: 0.6,
});
revealOnScroll.reveal(".feature-extended .feature-extended-body", {
revealOnScroll.reveal('.feature-extended .feature-extended-body', {
duration: 600,
distance: "40px",
easing: "cubic-bezier(0.215, 0.61, 0.355, 1)",
origin: "top",
distance: '40px',
easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)',
origin: 'top',
viewFactor: 0.6,
});
});
}
// Bubble canvas
let bubbleCanvas = function (t) {
let e = this;
const bubbleCanvas = function (t) {
const e = this;
e.parentNode = t;
e.setCanvasSize();
window.addEventListener("resize", function () {
window.addEventListener('resize', () => {
e.setCanvasSize();
});
e.mouseX = 0;
e.mouseY = 0;
window.addEventListener("mousemove", function (t) {
(e.mouseX = t.clientX), (e.mouseY = t.clientY);
window.addEventListener('mousemove', (t) => {
e.mouseX = t.clientX;
e.mouseY = t.clientY;
});
e.randomise();
};
@ -55,15 +58,15 @@ bubbleCanvas.prototype.generateDecimalBetween = function (start, end) {
};
bubbleCanvas.prototype.update = function () {
let t = this;
t.translateX = t.translateX - t.movementX;
t.translateY = t.translateY - t.movementY;
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.translateY + t.posY < 0
|| t.translateX + t.posX < 0
|| t.translateX + t.posX > t.canvasWidth
) {
t.randomise();
t.translateY = t.canvasHeight;
@ -71,7 +74,7 @@ bubbleCanvas.prototype.update = function () {
};
bubbleCanvas.prototype.randomise = function () {
this.colors = ["195,53,46", "172,54,46"];
this.colors = ['195,53,46', '172,54,46'];
this.velocity = 20;
this.smoothFactor = 50;
@ -88,17 +91,17 @@ bubbleCanvas.prototype.randomise = function () {
this.translateY = this.generateDecimalBetween(0, this.canvasHeight);
};
let drawBubbleCanvas = function (t) {
const drawBubbleCanvas = function (t) {
this.canvas = document.getElementById(t);
this.ctx = this.canvas.getContext("2d");
this.ctx = this.canvas.getContext('2d');
this.dpr = window.devicePixelRatio;
};
drawBubbleCanvas.prototype.start = function (bubbleDensity) {
let t = this;
const t = this;
t.bubbleDensity = bubbleDensity;
t.setCanvasSize();
window.addEventListener("resize", function () {
window.addEventListener('resize', () => {
t.setCanvasSize();
});
t.bubblesList = [];
@ -114,23 +117,24 @@ drawBubbleCanvas.prototype.setCanvasSize = function () {
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.canvas.style.width = this.w + 'px';
this.canvas.style.height = this.h + 'px';
this.ctx.scale(this.dpr, this.dpr);
};
drawBubbleCanvas.prototype.animate = function () {
let t = this;
const t = this;
t.ctx.clearRect(0, 0, t.canvas.clientWidth, t.canvas.clientHeight);
t.bubblesList.forEach(function (e) {
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.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));
};
@ -139,15 +143,16 @@ drawBubbleCanvas.prototype.addBubble = function (t) {
};
drawBubbleCanvas.prototype.generateBubbles = function () {
let t = this;
for (let e = 0; e < t.bubbleDensity; e++)
const t = this;
for (let e = 0; e < t.bubbleDensity; e++) {
t.addBubble(new bubbleCanvas(t.canvas.parentNode));
}
};
// Night sky with stars canvas
let starCanvas = function (t) {
const starCanvas = function (t) {
this.canvas = document.getElementById(t);
this.ctx = this.canvas.getContext("2d");
this.ctx = this.canvas.getContext('2d');
this.dpr = window.devicePixelRatio;
};
@ -156,17 +161,17 @@ starCanvas.prototype.start = function () {
let h;
const setCanvasExtents = () => {
w = this.canvas.parentNode.clientWidth;
h = this.canvas.parentNode.clientHeight;
w = this.canvas.parentNode.clientWidth;
h = this.canvas.parentNode.clientHeight;
this.canvas.width = w;
this.canvas.height = h;
};
setCanvasExtents();
window.onresize = () => {
window.addEventListener('resize', () => {
setCanvasExtents();
};
});
const makeStars = (count) => {
const out = [];
@ -178,19 +183,20 @@ starCanvas.prototype.start = function () {
};
out.push(s);
}
return out;
};
let stars = makeStars(10000);
const stars = makeStars(10_000);
const clear = () => {
this.ctx.fillStyle = "#212121";
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 + ")";
const rgb = 'rgb(' + intensity + ',' + intensity + ',' + intensity + ')';
this.ctx.beginPath();
this.ctx.arc(x, y, 0.9, 0, 2 * Math.PI);
this.ctx.fillStyle = rgb;
@ -199,7 +205,7 @@ starCanvas.prototype.start = function () {
const moveStars = (distance) => {
const count = stars.length;
for (var i = 0; i < count; i++) {
for (let i = 0; i < count; i++) {
const s = stars[i];
s.z -= distance;
while (s.z <= 1) {
@ -208,15 +214,15 @@ starCanvas.prototype.start = function () {
}
};
let prevTime;
let previousTime;
const init = (time) => {
prevTime = time;
previousTime = time;
requestAnimationFrame(tick);
};
const tick = (time) => {
let elapsed = time - prevTime;
prevTime = time;
const elapsed = time - previousTime;
previousTime = time;
moveStars(elapsed * 0.1);
@ -226,7 +232,7 @@ starCanvas.prototype.start = function () {
const cy = h / 2;
const count = stars.length;
for (var i = 0; i < count; i++) {
for (let i = 0; i < count; i++) {
const star = stars[i];
const x = cx + star.x / (star.z * 0.001);
@ -236,7 +242,7 @@ starCanvas.prototype.start = function () {
continue;
}
const d = star.z / 1000.0;
const d = star.z / 1000;
const b = 1 - d * d;
putPixel(x, y, b);
@ -249,12 +255,12 @@ starCanvas.prototype.start = function () {
};
// Start canvas animations
window.addEventListener("load", function () {
window.addEventListener('load', () => {
// Stars
const headCanvas = new starCanvas("hero-particles");
const headCanvas = new starCanvas('hero-particles');
// Bubbles
const footerCanvas = new drawBubbleCanvas("footer-particles");
const mainCanvas = new drawBubbleCanvas("main-particles");
const footerCanvas = new drawBubbleCanvas('footer-particles');
const mainCanvas = new drawBubbleCanvas('main-particles');
headCanvas.start();
footerCanvas.start(30);

327
docs/readme/README-ko.md Normal file
View File

@ -0,0 +1,327 @@
# 유튜브 뮤직 (YouTube Music)
<div align="center">
[![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)
[![eslint code style](https://img.shields.io/badge/code_style-eslint-5ed9c7.svg?style=for-the-badge)](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js)
[![Build status](https://img.shields.io/github/actions/workflow/status/th-ch/youtube-music/build.yml?branch=master&style=for-the-badge&logo=youtube-music)](https://GitHub.com/th-ch/youtube-music/releases/)
[![GitHub All Releases](https://img.shields.io/github/downloads/th-ch/youtube-music/total?style=for-the-badge&logo=youtube-music)](https://GitHub.com/th-ch/youtube-music/releases/)
[![AUR](https://img.shields.io/aur/version/youtube-music-bin?color=blueviolet&style=for-the-badge&logo=youtube-music)](https://aur.archlinux.org/packages/youtube-music-bin)
[![Known Vulnerabilities](https://snyk.io/test/github/th-ch/youtube-music/badge.svg)](https://snyk.io/test/github/th-ch/youtube-music)
</div>
![Screenshot](../../web/screenshot.jpg "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>
**유튜브 뮤직의 Electron 래퍼; 기능:**
- 원래의 인터페이스를 유지하는 것을 목표로 하는 네이티브 디자인 및 느낌
- 맞춤 플러그인을 위한 프레임워크: 스타일, 콘텐츠, 기능 등 필요에 따라 유튜브 뮤직을 변경하고, 클릭 한 번으로 플러그인을 활성화/비활성화할 수 있습니다.
## 번역
[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` 패키지를 설치합니다. 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
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`)
- 두 파일을 **동일한 위치**에 놓아주세요.
- 설치기를 실행하세요.
## 기능:
- **일시 정지 시 자동 확인** (항상 활성화 됨): 일정 시간이 지나면 음악을 일시 정지하는 ["계속 시청하시겠습니까?"](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)을 추가합니다. 선택적으로 전체 영상 탭을 제거할 수도 있습니다
- **비주얼라이저**: 플레이어에 시각화 도구 추가
## 테마
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> [백틱] 키)로 메뉴를 표시할 수 있습니다.

View File

@ -6,6 +6,7 @@
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';
@ -14,6 +15,7 @@
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';
@ -22,6 +24,7 @@
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';
@ -30,6 +33,7 @@
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';
@ -38,6 +42,7 @@
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';

File diff suppressed because it is too large Load Diff

160
electron.vite.config.mts Normal file
View File

@ -0,0 +1,160 @@
import { resolve, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import { defineConfig, defineViteConfig } from 'electron-vite';
import builtinModules from 'builtin-modules';
import viteResolve from 'vite-plugin-resolve';
import Inspect from 'vite-plugin-inspect';
import { pluginVirtualModuleGenerator } from './vite-plugins/plugin-importer.mjs';
import pluginLoader from './vite-plugins/plugin-loader.mjs';
import type { UserConfig } from 'vite';
import { i18nImporter } from './vite-plugins/i18n-importer.mjs';
import solidPlugin from 'vite-plugin-solid';
const __dirname = dirname(fileURLToPath(import.meta.url));
const resolveAlias = {
'@': resolve(__dirname, './src'),
'@assets': resolve(__dirname, './assets'),
};
export default defineConfig({
main: defineViteConfig(({ mode }) => {
const commonConfig: UserConfig = {
plugins: [
pluginLoader('backend'),
viteResolve({
'virtual:i18n': i18nImporter(),
'virtual:plugins': pluginVirtualModuleGenerator('main'),
}),
],
publicDir: 'assets',
build: {
lib: {
entry: 'src/index.ts',
formats: ['cjs'],
},
outDir: 'dist/main',
commonjsOptions: {
ignoreDynamicRequires: true,
},
rollupOptions: {
external: ['electron', 'custom-electron-prompt', ...builtinModules],
input: './src/index.ts',
},
},
resolve: {
alias: resolveAlias,
},
};
if (mode === 'development') {
commonConfig.plugins?.push(
Inspect({ build: true, outputDir: '.vite-inspect/backend' }),
);
return commonConfig;
}
return {
...commonConfig,
build: {
...commonConfig.build,
minify: true,
cssMinify: true,
},
};
}),
preload: defineViteConfig(({ mode }) => {
const commonConfig: UserConfig = {
plugins: [
pluginLoader('preload'),
viteResolve({
'virtual:i18n': i18nImporter(),
'virtual:plugins': pluginVirtualModuleGenerator('preload'),
}),
],
build: {
lib: {
entry: 'src/preload.ts',
formats: ['cjs'],
},
outDir: 'dist/preload',
commonjsOptions: {
ignoreDynamicRequires: true,
},
rollupOptions: {
external: ['electron', 'custom-electron-prompt', ...builtinModules],
input: './src/preload.ts',
},
},
resolve: {
alias: resolveAlias,
},
};
if (mode === 'development') {
commonConfig.plugins?.push(
Inspect({ build: true, outputDir: '.vite-inspect/preload' }),
);
return commonConfig;
}
return {
...commonConfig,
build: {
...commonConfig.build,
minify: true,
cssMinify: true,
},
};
}),
renderer: defineViteConfig(({ mode }) => {
const commonConfig: UserConfig = {
plugins: [
pluginLoader('renderer'),
viteResolve({
'virtual:i18n': i18nImporter(),
'virtual:plugins': pluginVirtualModuleGenerator('renderer'),
}),
solidPlugin(),
],
root: './src/',
build: {
lib: {
entry: 'src/index.html',
formats: ['iife'],
name: 'renderer',
},
outDir: 'dist/renderer',
commonjsOptions: {
ignoreDynamicRequires: true,
},
rollupOptions: {
external: ['electron', ...builtinModules],
input: './src/index.html',
},
},
resolve: {
alias: resolveAlias,
},
};
if (mode === 'development') {
commonConfig.plugins?.push(
Inspect({ build: true, outputDir: '.vite-inspect/renderer' }),
);
return commonConfig;
}
return {
...commonConfig,
build: {
...commonConfig.build,
minify: true,
cssMinify: true,
},
};
}),
});

View File

@ -1,50 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Cannot load YouTube Music</title>
<style>
body {
background: #000;
}
.container {
margin: 0;
font-family: Roboto, Arial, sans-serif;
font-size: 20px;
font-weight: 500;
color: rgba(255, 255, 255, 0.5);
position: absolute;
top: 50%;
left: 50%;
margin-right: -50%;
transform: translate(-50%, -50%);
text-align: center;
}
.button {
background: #065fd4;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: white;
font: inherit;
text-transform: uppercase;
text-decoration: none;
border-radius: 2px;
font-size: 16px;
font-weight: normal;
text-align: center;
padding: 8px 22px;
display: inline-block;
}
</style>
</head>
<body>
<div class="container">
<p>Cannot load YouTube Music… Internet disconnected?</p>
<a href="#" class="button" onclick="reload()">Retry</a>
</div>
</body>
</html>

436
index.js
View File

@ -1,436 +0,0 @@
"use strict";
const path = require("path");
const electron = require("electron");
const remote = require('@electron/remote/main');
remote.initialize();
const enhanceWebRequest = require("electron-better-web-request").default;
const is = require("electron-is");
const unhandled = require("electron-unhandled");
const { autoUpdater } = require("electron-updater");
const config = require("./config");
const { setApplicationMenu } = require("./menu");
const { fileExists, injectCSS } = require("./plugins/utils");
const { isTesting } = require("./utils/testing");
const { setUpTray } = require("./tray");
const { setupSongInfo } = require("./providers/song-info");
// Catch errors and log them
unhandled({
logger: console.error,
showDialog: false,
});
const app = electron.app;
app.commandLine.appendSwitch(
"js-flags",
// WebAssembly flags
"--experimental-wasm-threads"
);
app.commandLine.appendSwitch("enable-features", "SharedArrayBuffer"); // Required for downloader
app.allowRendererProcessReuse = true; // https://github.com/electron/electron/issues/18397
if (config.get("options.disableHardwareAcceleration")) {
if (is.dev()) {
console.log("Disabling hardware acceleration");
}
app.disableHardwareAcceleration();
}
if (config.get("options.proxy")) {
app.commandLine.appendSwitch("proxy-server", config.get("options.proxy"));
}
// Adds debug features like hotkeys for triggering dev tools and reload
require("electron-debug")({
showDevTools: false //disable automatic devTools on new window
});
// Prevent window being garbage collected
let mainWindow;
autoUpdater.autoDownload = false;
let icon = "assets/youtube-music.png";
if (process.platform == "win32") {
icon = "assets/generated/icon.ico";
} else if (process.platform == "darwin") {
icon = "assets/generated/icon.icns";
}
function onClosed() {
// Dereference the window
// For multiple windows store them in an array
mainWindow = null;
}
function loadPlugins(win) {
injectCSS(win.webContents, path.join(__dirname, "youtube-music.css"));
win.webContents.once("did-finish-load", () => {
if (is.dev()) {
console.log("did finish load");
win.webContents.openDevTools();
}
});
config.plugins.getEnabled().forEach(([plugin, options]) => {
console.log("Loaded plugin - " + plugin);
const pluginPath = path.join(__dirname, "plugins", plugin, "back.js");
fileExists(pluginPath, () => {
const handle = require(pluginPath);
handle(win, options);
});
});
}
function createMainWindow() {
const windowSize = config.get("window-size");
const windowMaximized = config.get("window-maximized");
const windowPosition = config.get("window-position");
const useInlineMenu = config.plugins.isEnabled("in-app-menu");
const win = new electron.BrowserWindow({
icon: icon,
width: windowSize.width,
height: windowSize.height,
backgroundColor: "#000",
show: false,
webPreferences: {
// TODO: re-enable contextIsolation once it can work with ffmepg.wasm
// Possible bundling? https://github.com/ffmpegwasm/ffmpeg.wasm/issues/126
contextIsolation: false,
preload: path.join(__dirname, "preload.js"),
nodeIntegrationInSubFrames: true,
nativeWindowOpen: true, // window.open return Window object(like in regular browsers), not BrowserWindowProxy
affinity: "main-window", // main window, and addition windows should work in one process
...(isTesting()
? {
// Only necessary when testing with Spectron
contextIsolation: false,
nodeIntegration: true,
}
: undefined),
},
frame: !is.macOS() && !useInlineMenu,
titleBarStyle: useInlineMenu
? "hidden"
: is.macOS()
? "hiddenInset"
: "default",
autoHideMenuBar: config.get("options.hideMenu"),
});
remote.enable(win.webContents);
if (windowPosition) {
const { x, y } = windowPosition;
win.setPosition(x, y);
}
if (windowMaximized) {
win.maximize();
}
const urlToLoad = config.get("options.resumeOnStart")
? config.get("url")
: config.defaultConfig.url;
win.webContents.loadURL(urlToLoad);
win.on("closed", onClosed);
win.on("move", () => {
let position = win.getPosition();
config.set("window-position", { x: position[0], y: position[1] });
});
win.on("resize", () => {
const windowSize = win.getSize();
config.set("window-maximized", win.isMaximized());
if (!win.isMaximized()) {
config.set("window-size", {
width: windowSize[0],
height: windowSize[1],
});
}
});
win.webContents.on("render-process-gone", (event, webContents, details) => {
showUnresponsiveDialog(win, details);
});
win.once("ready-to-show", () => {
if (config.get("options.appVisible")) {
win.show();
}
});
removeContentSecurityPolicy();
return win;
}
app.once("browser-window-created", (event, win) => {
// User agents are from https://developers.whatismybrowser.com/useragents/explore/
const originalUserAgent = win.webContents.userAgent;
const userAgents = {
mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 12.1; rv:95.0) Gecko/20100101 Firefox/95.0",
windows: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0",
linux: "Mozilla/5.0 (Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0",
}
const updatedUserAgent =
is.macOS() ? userAgents.mac :
is.windows() ? userAgents.windows :
userAgents.linux;
win.webContents.userAgent = updatedUserAgent;
app.userAgentFallback = updatedUserAgent;
win.webContents.session.webRequest.onBeforeSendHeaders((details, cb) => {
// this will only happen if login failed, and "retry" was pressed
if (win.webContents.getURL().startsWith("https://accounts.google.com") && details.url.startsWith("https://accounts.google.com")){
details.requestHeaders["User-Agent"] = originalUserAgent;
}
cb({ requestHeaders: details.requestHeaders });
});
setupSongInfo(win);
loadPlugins(win);
win.webContents.on("did-fail-load", (
_event,
errorCode,
errorDescription,
validatedURL,
isMainFrame,
frameProcessId,
frameRoutingId,
) => {
const log = JSON.stringify({
error: "did-fail-load",
errorCode,
errorDescription,
validatedURL,
isMainFrame,
frameProcessId,
frameRoutingId,
}, null, "\t");
if (is.dev()) {
console.log(log);
}
if( !(config.plugins.isEnabled("in-app-menu") && errorCode === -3)) { // -3 is a false positive with in-app-menu
win.webContents.send("log", log);
win.webContents.loadFile(path.join(__dirname, "error.html"));
}
});
win.webContents.on("will-prevent-unload", (event) => {
event.preventDefault();
});
win.webContents.on(
"new-window",
(e, url, frameName, disposition, options) => {
// hook on new opened window
// at now new window in mainWindow renderer process.
// Also, this will automatically get an option `nodeIntegration=false`(not override to true, like in iframe's) - like in regular browsers
options.webPreferences.affinity = "main-window";
}
);
});
app.on("window-all-closed", () => {
if (process.platform !== "darwin") {
app.quit();
}
// Unregister all shortcuts.
electron.globalShortcut.unregisterAll();
});
app.on("activate", () => {
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (mainWindow === null) {
mainWindow = createMainWindow();
} else if (!mainWindow.isVisible()) {
mainWindow.show();
}
});
app.on("ready", () => {
if (config.get("options.autoResetAppCache")) {
// Clear cache after 20s
const clearCacheTimeout = setTimeout(() => {
if (is.dev()) {
console.log("Clearing app cache.");
}
electron.session.defaultSession.clearCache();
clearTimeout(clearCacheTimeout);
}, 20000);
}
// Register appID on windows
if (is.windows()) {
const appID = "com.github.th-ch.youtube-music";
app.setAppUserModelId(appID);
const appLocation = process.execPath;
const appData = app.getPath("appData");
// check shortcut validity if not in dev mode / running portable app
if (!is.dev() && !appLocation.startsWith(path.join(appData, "..", "Local", "Temp"))) {
const shortcutPath = path.join(appData, "Microsoft", "Windows", "Start Menu", "Programs", "YouTube Music.lnk");
try { // check if shortcut is registered and valid
const shortcutDetails = electron.shell.readShortcutLink(shortcutPath); // throw error if doesn't exist yet
if (shortcutDetails.target !== appLocation || shortcutDetails.appUserModelId !== appID) {
throw "needUpdate";
}
} catch (error) { // if not valid -> Register shortcut
electron.shell.writeShortcutLink(
shortcutPath,
error === "needUpdate" ? "update" : "create",
{
target: appLocation,
cwd: appLocation.slice(0, appLocation.lastIndexOf(path.sep)),
description: "YouTube Music Desktop App - including custom plugins",
appUserModelId: appID
}
);
}
}
}
mainWindow = createMainWindow();
setApplicationMenu(mainWindow);
if (config.get("options.restartOnConfigChanges")) {
config.watch(() => {
app.relaunch();
app.exit();
});
}
setUpTray(app, mainWindow);
// Autostart at login
app.setLoginItemSettings({
openAtLogin: config.get("options.startAtLogin"),
});
if (!is.dev() && config.get("options.autoUpdates")) {
const updateTimeout = setTimeout(() => {
autoUpdater.checkForUpdatesAndNotify();
clearTimeout(updateTimeout);
}, 2000);
autoUpdater.on("update-available", () => {
const downloadLink =
"https://github.com/th-ch/youtube-music/releases/latest";
const dialogOpts = {
type: "info",
buttons: ["OK", "Download", "Disable updates"],
title: "Application Update",
message: "A new version is available",
detail: `A new version is available and can be downloaded at ${downloadLink}`,
};
electron.dialog.showMessageBox(dialogOpts).then((dialogOutput) => {
switch (dialogOutput.response) {
// Download
case 1:
electron.shell.openExternal(downloadLink);
break;
// Disable updates
case 2:
config.set("options.autoUpdates", false);
break;
default:
break;
}
});
});
}
if (config.get("options.hideMenu") && !config.get("options.hideMenuWarned")) {
electron.dialog.showMessageBox(mainWindow, {
type: 'info', title: 'Hide Menu Enabled',
message: "Menu is hidden, use 'Alt' to show it (or 'Escape' if using in-app-menu)"
});
config.set("options.hideMenuWarned", true);
}
// Optimized for Mac OS X
if (is.macOS() && !config.get("options.appVisible")) {
app.dock.hide();
}
let forceQuit = false;
app.on("before-quit", () => {
forceQuit = true;
});
if (is.macOS() || config.get("options.tray")) {
mainWindow.on("close", (event) => {
// Hide the window instead of quitting (quit is available in tray options)
if (!forceQuit) {
event.preventDefault();
mainWindow.hide();
}
});
}
});
function showUnresponsiveDialog(win, details) {
if (!!details) {
console.log("Unresponsive Error!\n"+JSON.stringify(details, null, "\t"))
}
electron.dialog.showMessageBox(win, {
type: "error",
title: "Window Unresponsive",
message: "The Application is Unresponsive",
details: "We are sorry for the inconvenience! please choose what to do:",
buttons: ["Wait", "Relaunch", "Quit"],
cancelId: 0
}).then( result => {
switch (result.response) {
case 1: //if relaunch - relaunch+exit
app.relaunch();
case 2:
app.quit();
break;
default:
break;
}
});
}
function removeContentSecurityPolicy(
session = electron.session.defaultSession
) {
// Allows defining multiple "onHeadersReceived" listeners
// by enhancing the session.
// Some plugins (e.g. adblocker) also define a "onHeadersReceived" listener
enhanceWebRequest(session);
// Custom listener to tweak the content security policy
session.webRequest.onHeadersReceived(function (details, callback) {
if (
!details.responseHeaders["content-security-policy-report-only"] &&
!details.responseHeaders["content-security-policy"]
)
return callback({ cancel: false });
delete details.responseHeaders["content-security-policy-report-only"];
delete details.responseHeaders["content-security-policy"];
callback({ cancel: false, responseHeaders: details.responseHeaders });
});
// When multiple listeners are defined, apply them all
session.webRequest.setResolver("onHeadersReceived", (listeners) => {
const response = listeners.reduce(
async (accumulator, listener) => {
if (accumulator.cancel) {
return accumulator;
}
const result = await listener.apply();
return { ...accumulator, ...result };
},
{ cancel: false }
);
return response;
});
}

View File

@ -1,6 +0,0 @@
module.exports = {
globals: {
__APP__: undefined, // A different app will be launched in each test environment
},
testTimeout: 30000, // 30s
};

324
menu.js
View File

@ -1,324 +0,0 @@
const { existsSync } = require("fs");
const path = require("path");
const { app, Menu, dialog } = require("electron");
const is = require("electron-is");
const { getAllPlugins } = require("./plugins/utils");
const config = require("./config");
const prompt = require("custom-electron-prompt");
const promptOptions = require("./providers/prompt-options");
// true only if in-app-menu was loaded on launch
const inAppMenuActive = config.plugins.isEnabled("in-app-menu");
const pluginEnabledMenu = (plugin, label = "", hasSubmenu = false, refreshMenu = undefined) => ({
label: label || plugin,
type: "checkbox",
checked: config.plugins.isEnabled(plugin),
click: (item) => {
if (item.checked) {
config.plugins.enable(plugin);
} else {
config.plugins.disable(plugin);
}
if (hasSubmenu) {
refreshMenu();
}
},
});
const mainMenuTemplate = (win) => {
const refreshMenu = () => {
this.setApplicationMenu(win);
if (inAppMenuActive) {
win.webContents.send("updateMenu", true);
}
}
return [
{
label: "Plugins",
submenu: [
...getAllPlugins().map((plugin) => {
const pluginPath = path.join(__dirname, "plugins", plugin, "menu.js")
if (existsSync(pluginPath)) {
if (!config.plugins.isEnabled(plugin)) {
return pluginEnabledMenu(plugin, "", true, refreshMenu);
}
const getPluginMenu = require(pluginPath);
return {
label: plugin,
submenu: [
pluginEnabledMenu(plugin, "Enabled", true, refreshMenu),
...getPluginMenu(win, config.plugins.getOptions(plugin), refreshMenu),
],
};
}
return pluginEnabledMenu(plugin);
}),
],
},
{
label: "Options",
submenu: [
{
label: "Auto-update",
type: "checkbox",
checked: config.get("options.autoUpdates"),
click: (item) => {
config.set("options.autoUpdates", item.checked);
},
},
{
label: "Resume last song when app starts",
type: "checkbox",
checked: config.get("options.resumeOnStart"),
click: (item) => {
config.set("options.resumeOnStart", item.checked);
},
},
{
label: "Remove upgrade button",
type: "checkbox",
checked: config.get("options.removeUpgradeButton"),
click: (item) => {
config.set("options.removeUpgradeButton", item.checked);
},
},
...(is.windows() || is.linux()
? [
{
label: "Hide menu",
type: "checkbox",
checked: config.get("options.hideMenu"),
click: (item) => {
config.set("options.hideMenu", item.checked);
if (item.checked && !config.get("options.hideMenuWarned")) {
dialog.showMessageBox(win, {
type: 'info', title: 'Hide Menu Enabled',
message: "Menu will be hidden on next launch, use 'Alt' to show it (or 'Escape' if using in-app-menu)"
});
}
},
},
]
: []),
...(is.windows() || is.macOS()
? // Only works on Win/Mac
// https://www.electronjs.org/docs/api/app#appsetloginitemsettingssettings-macos-windows
[
{
label: "Start at login",
type: "checkbox",
checked: config.get("options.startAtLogin"),
click: (item) => {
config.set("options.startAtLogin", item.checked);
},
},
]
: []),
{
label: "Tray",
submenu: [
{
label: "Disabled",
type: "radio",
checked: !config.get("options.tray"),
click: () => {
config.set("options.tray", false);
config.set("options.appVisible", true);
},
},
{
label: "Enabled + app visible",
type: "radio",
checked:
config.get("options.tray") && config.get("options.appVisible"),
click: () => {
config.set("options.tray", true);
config.set("options.appVisible", true);
},
},
{
label: "Enabled + app hidden",
type: "radio",
checked:
config.get("options.tray") && !config.get("options.appVisible"),
click: () => {
config.set("options.tray", true);
config.set("options.appVisible", false);
},
},
{ type: "separator" },
{
label: "Play/Pause on click",
type: "checkbox",
checked: config.get("options.trayClickPlayPause"),
click: (item) => {
config.set("options.trayClickPlayPause", item.checked);
},
},
],
},
{ type: "separator" },
{
label: "Advanced options",
submenu: [
{
label: "Proxy",
type: "checkbox",
checked: !!config.get("options.proxy"),
click: (item) => {
setProxy(item, win);
},
},
{
label: "Disable hardware acceleration",
type: "checkbox",
checked: config.get("options.disableHardwareAcceleration"),
click: (item) => {
config.set("options.disableHardwareAcceleration", item.checked);
},
},
{
label: "Restart on config changes",
type: "checkbox",
checked: config.get("options.restartOnConfigChanges"),
click: (item) => {
config.set("options.restartOnConfigChanges", item.checked);
},
},
{
label: "Reset App cache when app starts",
type: "checkbox",
checked: config.get("options.autoResetAppCache"),
click: (item) => {
config.set("options.autoResetAppCache", item.checked);
},
},
{ type: "separator" },
is.macOS() ?
{
label: "Toggle DevTools",
// Cannot use "toggleDevTools" role in MacOS
click: () => {
const { webContents } = win;
if (webContents.isDevToolsOpened()) {
webContents.closeDevTools();
} else {
const devToolsOptions = {};
webContents.openDevTools(devToolsOptions);
}
},
} :
{ role: "toggleDevTools" },
{
label: "Edit config.json",
click: () => {
config.edit();
},
},
]
},
],
},
{
label: "View",
submenu: [
{ role: "reload" },
{ role: "forceReload" },
{ type: "separator" },
{ role: "zoomIn" },
{ role: "zoomOut" },
{ role: "resetZoom" },
],
},
{
label: "Navigation",
submenu: [
{
label: "Go back",
click: () => {
if (win.webContents.canGoBack()) {
win.webContents.goBack();
}
},
},
{
label: "Go forward",
click: () => {
if (win.webContents.canGoForward()) {
win.webContents.goForward();
}
},
},
{
label: "Restart App",
click: () => {
app.relaunch();
app.quit();
},
},
{ role: "quit" },
],
},
];
}
module.exports.mainMenuTemplate = mainMenuTemplate;
module.exports.setApplicationMenu = (win) => {
const menuTemplate = [...mainMenuTemplate(win)];
if (process.platform === "darwin") {
const name = app.name;
menuTemplate.unshift({
label: name,
submenu: [
{ role: "about" },
{ type: "separator" },
{ role: "hide" },
{ role: "hideothers" },
{ role: "unhide" },
{ type: "separator" },
{
label: "Select All",
accelerator: "CmdOrCtrl+A",
selector: "selectAll:",
},
{ label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" },
{ label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" },
{ label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" },
{ type: "separator" },
{ role: "minimize" },
{ role: "close" },
{ role: "quit" },
],
});
}
const menu = Menu.buildFromTemplate(menuTemplate);
Menu.setApplicationMenu(menu);
};
async function setProxy(item, win) {
const output = await prompt({
title: 'Set Proxy',
label: 'Enter Proxy Address: (leave empty to disable)',
value: config.get("options.proxy"),
type: 'input',
inputAttrs: {
type: 'url',
placeholder: "Example: 'socks5://127.0.0.1:9999"
},
width: 450,
...promptOptions()
}, win);
if (typeof output === "string") {
config.set("options.proxy", output);
item.checked = output !== "";
} else { //user pressed cancel
item.checked = !item.checked; //reset checkbox
}
}

View File

@ -1,132 +1,230 @@
{
"name": "youtube-music",
"productName": "YouTube Music",
"version": "1.15.0",
"description": "YouTube Music Desktop App - including custom plugins",
"license": "MIT",
"repository": "th-ch/youtube-music",
"author": {
"name": "th-ch",
"email": "th-ch@users.noreply.github.com",
"url": "https://github.com/th-ch/youtube-music"
},
"build": {
"appId": "com.github.th-ch.youtube-music",
"productName": "YouTube Music",
"mac": {
"identity": null,
"icon": "assets/generated/icons/mac/icon.icns"
},
"win": {
"icon": "assets/generated/icons/win/icon.ico",
"target": [
"nsis",
"portable"
]
},
"nsis": {
"runAfterFinish": false
},
"linux": {
"icon": "assets/generated/icons/png",
"category": "AudioVideo",
"target": [
"AppImage",
"snap",
"freebsd",
"deb",
"rpm"
]
},
"snap": {
"slots": [
{
"mpris": {
"interface": "mpris"
}
}
]
}
},
"scripts": {
"test": "jest",
"start": "NODE_OPTIONS= electron .",
"start:debug": "ELECTRON_ENABLE_LOGGING=1 electron .",
"icon": "rimraf assets/generated && electron-icon-maker --input=assets/youtube-music.png --output=assets/generated",
"generate:package": "node utils/generate-package-json.js",
"postinstall": "yarn run icon && yarn run plugins",
"clean": "rimraf dist",
"build": "yarn run clean && electron-builder --win --mac --linux",
"build:linux": "yarn run clean && electron-builder --linux",
"build:mac": "yarn run clean && electron-builder --mac",
"build:win": "yarn run clean && electron-builder --win",
"lint": "xo",
"plugins": "yarn run plugin:adblocker",
"plugin:adblocker": "rimraf plugins/adblocker/ad-blocker-engine.bin && node plugins/adblocker/blocker.js",
"release:linux": "yarn run clean && electron-builder --linux -p always -c.snap.publish=github",
"release:mac": "yarn run clean && electron-builder --mac -p always",
"release:win": "yarn run clean && electron-builder --win -p always"
},
"engines": {
"node": ">=14.0.0",
"npm": "Please use yarn and not npm"
},
"dependencies": {
"@cliqz/adblocker-electron": "^1.23.1",
"@electron/remote": "^2.0.1",
"@ffmpeg/core": "^0.10.0",
"@ffmpeg/ffmpeg": "^0.10.0",
"async-mutex": "^0.3.2",
"browser-id3-writer": "^4.4.0",
"chokidar": "^3.5.2",
"custom-electron-prompt": "^1.4.0",
"custom-electron-titlebar": "^3.2.9",
"discord-rpc": "^3.2.0",
"electron-better-web-request": "^1.0.1",
"electron-debug": "^3.2.0",
"electron-is": "^3.0.0",
"electron-localshortcut": "^3.2.1",
"electron-store": "^7.0.3",
"electron-unhandled": "^3.0.2",
"electron-updater": "^4.6.3",
"filenamify": "^4.3.0",
"hark": "^1.2.3",
"md5": "^2.3.0",
"mpris-service": "^2.1.2",
"node-fetch": "^2.6.6",
"node-notifier": "^9.0.1",
"ytdl-core": "^4.9.2",
"ytpl": "^2.2.3"
},
"devDependencies": {
"electron": "^16.0.5",
"electron-builder": "^22.10.5",
"electron-devtools-installer": "^3.1.1",
"electron-icon-maker": "0.0.5",
"jest": "^27.3.1",
"playwright": "^1.17.1",
"rimraf": "^3.0.2",
"xo": "^0.45.0"
},
"resolutions": {
"glob-parent": "5.1.2",
"minimist": "1.2.5",
"yargs-parser": "18.1.3"
},
"xo": {
"envs": [
"node",
"browser"
],
"rules": {
"quotes": [
"error",
"double",
{
"avoidEscape": true,
"allowTemplateLiterals": true
}
]
}
}
"name": "youtube-music",
"productName": "YouTube Music",
"version": "3.3.2",
"description": "YouTube Music Desktop App - including custom plugins",
"main": "./dist/main/index.js",
"license": "MIT",
"repository": "th-ch/youtube-music",
"author": {
"name": "th-ch",
"email": "th-ch@users.noreply.github.com",
"url": "https://github.com/th-ch/youtube-music"
},
"build": {
"appId": "com.github.th-ch.youtube-music",
"productName": "YouTube Music",
"files": [
"!*",
"dist",
"assets",
"license",
"!node_modules",
"node_modules/custom-electron-prompt/**",
"node_modules/@cliqz/adblocker-electron-preload/**",
"node_modules/@ffmpeg.wasm/core-mt/**",
"!node_modules/**/*.map",
"!node_modules/**/*.ts"
],
"asarUnpack": [
"assets"
],
"mac": {
"identity": null,
"target": [
{
"target": "dmg",
"arch": [
"x64",
"arm64"
]
}
],
"icon": "assets/generated/icons/mac/icon.icns"
},
"win": {
"icon": "assets/generated/icons/win/icon.ico",
"target": [
{
"target": "nsis-web",
"arch": [
"x64",
"ia32",
"arm64"
]
},
{
"target": "portable",
"arch": [
"x64",
"ia32",
"arm64"
]
}
]
},
"nsisWeb": {
"runAfterFinish": false
},
"linux": {
"icon": "assets/generated/icons/png",
"category": "AudioVideo",
"target": [
"AppImage",
"snap",
"freebsd",
"deb",
"rpm"
]
},
"rpm": {
"depends": [
"/usr/lib64/libuuid.so.1"
]
},
"snap": {
"slots": [
{
"mpris": {
"interface": "mpris"
}
}
]
},
"directories": {
"output": "./pack/"
}
},
"scripts": {
"test": "playwright test",
"test:debug": "cross-env DEBUG=pw:*,-pw:test:protocol playwright test",
"build": "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": "electron-vite dev --watch",
"dev:debug": "cross-env ELECTRON_ENABLE_LOGGING=1 pnpm dev",
"clean": "del-cli dist && del-cli pack && 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:mac": "pnpm clean && pnpm build && pnpm electron-builder --mac dmg:x64 -p never",
"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",
"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"
},
"engines": {
"node": ">=18.0.0"
},
"pnpm": {
"overrides": {
"usocket": "1.0.1",
"node-gyp": "10.0.1",
"xml2js": "0.6.2",
"node-fetch": "3.3.2",
"@electron/universal": "2.0.1",
"@babel/runtime": "7.23.8"
},
"patchedDependencies": {
"vudio@2.1.1": "patches/vudio@2.1.1.patch",
"@xhayper/discord-rpc@1.1.2": "patches/@xhayper__discord-rpc@1.1.2.patch"
}
},
"dependencies": {
"@cliqz/adblocker-electron": "1.26.15",
"@cliqz/adblocker-electron-preload": "1.26.15",
"@electron-toolkit/tsconfig": "1.0.1",
"@electron/remote": "2.1.2",
"@ffmpeg.wasm/core-mt": "0.12.0",
"@ffmpeg.wasm/main": "0.12.0",
"@floating-ui/dom": "1.6.3",
"@foobar404/wave": "2.0.5",
"@jellybrick/electron-better-web-request": "1.0.4",
"@jellybrick/mpris-service": "2.1.4",
"@xhayper/discord-rpc": "1.1.2",
"async-mutex": "0.4.1",
"butterchurn": "3.0.0-beta.4",
"butterchurn-presets": "3.0.0-beta.4",
"color": "4.2.3",
"conf": "10.2.0",
"custom-electron-prompt": "1.5.7",
"dbus-next": "0.10.2",
"deepmerge-ts": "5.1.0",
"electron-debug": "3.2.0",
"electron-is": "3.0.0",
"electron-localshortcut": "3.2.1",
"electron-store": "8.1.0",
"electron-unhandled": "4.0.1",
"electron-updater": "6.1.8",
"fast-average-color": "9.4.0",
"fast-equals": "5.0.1",
"filenamify": "6.0.0",
"howler": "2.2.4",
"html-to-text": "9.0.5",
"i18next": "23.9.0",
"keyboardevent-from-electron-accelerator": "2.0.0",
"keyboardevents-areequal": "0.2.2",
"node-html-parser": "6.1.12",
"node-id3": "0.2.6",
"peerjs": "1.5.2",
"semver": "7.6.0",
"serve": "14.2.1",
"simple-youtube-age-restriction-bypass": "github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9",
"solid-floating-ui": "0.3.1",
"solid-js": "1.8.15",
"solid-styled-components": "0.28.5",
"solid-transition-group": "0.2.3",
"ts-morph": "21.0.1",
"vudio": "2.1.1",
"x11": "2.3.0",
"youtubei.js": "9.0.2"
},
"devDependencies": {
"@playwright/test": "1.41.2",
"@total-typescript/ts-reset": "0.5.1",
"@types/color": "3.0.6",
"@types/electron-localshortcut": "3.1.3",
"@types/howler": "2.2.11",
"@types/html-to-text": "9.0.4",
"@types/semver": "7.5.7",
"@typescript-eslint/eslint-plugin": "7.0.2",
"bufferutil": "4.0.8",
"builtin-modules": "3.3.0",
"cross-env": "7.0.3",
"del-cli": "5.1.0",
"discord-api-types": "0.37.70",
"electron": "28.2.3",
"electron-builder": "24.9.1",
"electron-devtools-installer": "3.2.0",
"electron-vite": "2.0.0",
"esbuild": "0.20.1",
"eslint": "8.56.0",
"eslint-import-resolver-exports": "1.0.0-beta.5",
"eslint-import-resolver-typescript": "3.6.1",
"eslint-plugin-import": "2.29.1",
"eslint-plugin-prettier": "5.1.3",
"glob": "10.3.10",
"node-gyp": "10.0.1",
"playwright": "1.41.2",
"rollup": "4.12.0",
"typescript": "5.3.3",
"utf-8-validate": "6.0.3",
"vite": "5.1.3",
"vite-plugin-inspect": "0.8.3",
"vite-plugin-resolve": "2.5.1",
"vite-plugin-solid": "2.10.1",
"ws": "8.16.0"
},
"auto-changelog": {
"hideCredit": true,
"package": true,
"unreleased": true,
"output": "changelog.md"
},
"packageManager": "pnpm@8.15.3"
}

View File

@ -0,0 +1,17 @@
diff --git a/package.json b/package.json
index 40db5dfbd8a4455ce2987d8115eca9882e1f9f14..414fc6986b9c0cc288908eb0107b90c4bfd916b2 100644
--- a/package.json
+++ b/package.json
@@ -25,11 +25,7 @@
},
"dependencies": {
"axios": "^1.6.2",
- "ws": "^8.15.1"
- },
- "optionalDependencies": {
- "bufferutil": "^4.0.8",
- "utf-8-validate": "^6.0.3"
+ "ws": "^8.16.0"
},
"devDependencies": {
"@types/node": "^14.*",

20
patches/vudio@2.1.1.patch Normal file
View File

@ -0,0 +1,20 @@
diff --git a/umd/vudio.js b/umd/vudio.js
index d0d1127e57125ad4e77442af2db4a26998c7b385..c0b66bd4327c65c31dc6e588bfa4ae6ec70bd3b8 100644
--- a/umd/vudio.js
+++ b/umd/vudio.js
@@ -147,7 +147,6 @@
source.connect(this.analyser);
this.analyser.fftSize = this.option.accuracy * 2;
- this.analyser.connect(audioContext.destination);
this.freqByteData = new Uint8Array(this.analyser.frequencyBinCount);
@@ -207,7 +206,6 @@
source.connect(this.analyser);
this.analyser.fftSize = this.option.accuracy * 2;
- this.analyser.connect(audioContext.destination);
},
__rebuildData : function (freqByteData, horizontalAlign) {

View File

@ -1,8 +0,0 @@
const { loadAdBlockerEngine } = require("./blocker");
module.exports = (win, options) =>
loadAdBlockerEngine(
win.webContents.session,
options.cache,
options.additionalBlockLists,
options.disableDefaultLists
);

View File

@ -1,60 +0,0 @@
const { promises } = require("fs"); // used for caching
const path = require("path");
const { ElectronBlocker } = require("@cliqz/adblocker-electron");
const fetch = require("node-fetch");
const SOURCES = [
"https://raw.githubusercontent.com/kbinani/adblock-youtube-ads/master/signed.txt",
// uBlock Origin
"https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt",
"https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2021.txt",
// Fanboy Annoyances
"https://secure.fanboy.co.nz/fanboy-annoyance_ubo.txt",
];
const loadAdBlockerEngine = (
session = undefined,
cache = true,
additionalBlockLists = [],
disableDefaultLists = false
) => {
// Only use cache if no additional blocklists are passed
const cachingOptions =
cache && additionalBlockLists.length === 0
? {
path: path.resolve(__dirname, "ad-blocker-engine.bin"),
read: promises.readFile,
write: promises.writeFile,
}
: undefined;
const lists = [
...(disableDefaultLists ? [] : SOURCES),
...additionalBlockLists,
];
ElectronBlocker.fromLists(
fetch,
lists,
{
// 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
)
.then((blocker) => {
if (session) {
blocker.enableBlockingInSession(session);
} else {
console.log("Successfully generated adBlocker engine.");
}
})
.catch((err) => console.log("Error loading adBlocker engine", err));
};
module.exports = { loadAdBlockerEngine };
if (require.main === module) {
loadAdBlockerEngine(); // Generate the engine without enabling it
}

View File

@ -1,4 +0,0 @@
module.exports = () => {
// Preload adblocker to inject scripts/styles
require("@cliqz/adblocker-electron-preload/dist/preload.cjs");
};

View File

@ -1,17 +0,0 @@
const applyCompressor = () => {
const audioContext = new AudioContext();
const compressor = audioContext.createDynamicsCompressor();
compressor.threshold.value = -50;
compressor.ratio.value = 12;
compressor.knee.value = 40;
compressor.attack.value = 0;
compressor.release.value = 0.25;
const source = audioContext.createMediaElementSource(document.querySelector("video"));
source.connect(compressor);
compressor.connect(audioContext.destination);
};
module.exports = () => document.addEventListener('apiLoaded', applyCompressor, { once: true, passive: true });

View File

@ -1,6 +0,0 @@
const path = require("path");
const { injectCSS } = require("../utils");
module.exports = win => {
injectCSS(win.webContents, path.join(__dirname, "style.css"));
};

View File

@ -1,10 +0,0 @@
#nav-bar-background,
#header.ytmusic-item-section-renderer,
ytmusic-tabs {
background: rgba(0, 0, 0, 0.3) !important;
backdrop-filter: blur(8px) !important;
}
#nav-bar-divider {
display: none !important;
}

View File

@ -1,14 +0,0 @@
module.exports = () => {
document.addEventListener('apiLoaded', apiEvent => {
apiEvent.detail.addEventListener('videodatachange', name => {
if (name === 'dataloaded') {
apiEvent.detail.pauseVideo();
document.querySelector('video').ontimeupdate = e => {
e.target.pause();
}
} else {
document.querySelector('video').ontimeupdate = null;
}
})
}, { once: true, passive: true })
};

View File

@ -1,148 +0,0 @@
const Discord = require("discord-rpc");
const { dev } = require("electron-is");
const { dialog, app } = require("electron");
const registerCallback = require("../../providers/song-info");
// Application ID registered by @semvis123
const clientId = "790655993809338398";
/**
* @typedef {Object} Info
* @property {import('discord-rpc').Client} rpc
* @property {boolean} ready
* @property {import('../../providers/song-info').SongInfo} lastSongInfo
*/
/**
* @type {Info}
*/
const info = {
rpc: null,
ready: false,
lastSongInfo: null,
};
/**
* @type {(() => void)[]}
*/
const refreshCallbacks = [];
const resetInfo = () => {
info.rpc = null;
info.ready = false;
clearTimeout(clearActivity);
if (dev()) console.log("discord disconnected");
refreshCallbacks.forEach(cb => cb());
};
let window;
const connect = (showErr = false) => {
if (info.rpc) {
if (dev())
console.log('Attempted to connect with active RPC object');
return;
}
info.rpc = new Discord.Client({
transport: "ipc",
});
info.ready = false;
info.rpc.once("connected", () => {
if (dev()) console.log("discord connected");
refreshCallbacks.forEach(cb => cb());
});
info.rpc.once("ready", () => {
info.ready = true;
if (info.lastSongInfo) updateActivity(info.lastSongInfo)
});
info.rpc.once("disconnected", resetInfo);
// Startup the rpc client
info.rpc.login({ clientId }).catch(err => {
resetInfo();
if (dev()) console.error(err);
if (showErr) dialog.showMessageBox(window, { title: 'Connection failed', message: err.message || String(err), type: 'error' });
});
};
let clearActivity;
/**
* @type {import('../../providers/song-info').songInfoCallback}
*/
let updateActivity;
module.exports = (win, { activityTimoutEnabled, activityTimoutTime, listenAlong }) => {
window = win;
// We get multiple events
// Next song: PAUSE(n), PAUSE(n+1), PLAY(n+1)
// Skip time: PAUSE(N), PLAY(N)
updateActivity = songInfo => {
if (songInfo.title.length === 0 && songInfo.artist.length === 0) {
return;
}
info.lastSongInfo = songInfo;
// stop the clear activity timout
clearTimeout(clearActivity);
// stop early if discord connection is not ready
// do this after clearTimeout to avoid unexpected clears
if (!info.rpc || !info.ready) {
return;
}
// clear directly if timeout is 0
if (songInfo.isPaused && activityTimoutEnabled && activityTimoutTime === 0) {
info.rpc.clearActivity().catch(console.error);
return;
}
// Song information changed, so lets update the rich presence
// @see https://discord.com/developers/docs/topics/gateway#activity-object
// not all options are transfered through https://github.com/discordjs/RPC/blob/6f83d8d812c87cb7ae22064acd132600407d7d05/src/client.js#L518-530
const activityInfo = {
type: 2, // Listening, addressed in https://github.com/discordjs/RPC/pull/149
details: songInfo.title,
state: songInfo.artist,
largeImageKey: songInfo.imageSrc,
largeImageText: [
songInfo.uploadDate,
songInfo.views.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " views",
].join(' || '),
buttons: listenAlong ? [
{ label: "Listen Along", url: songInfo.url },
] : undefined,
};
if (songInfo.isPaused) {
// Add an idle icon to show that the song is paused
activityInfo.smallImageKey = "idle";
activityInfo.smallImageText = "idle/paused";
// Set start the timer so the activity gets cleared after a while if enabled
if (activityTimoutEnabled)
clearActivity = setTimeout(() => info.rpc.clearActivity().catch(console.error), activityTimoutTime ?? 10000);
} else {
// Add the start and end time of the song
const songStartTime = Date.now() - songInfo.elapsedSeconds * 1000;
activityInfo.startTimestamp = songStartTime;
activityInfo.endTimestamp =
songStartTime + songInfo.songDuration * 1000;
}
info.rpc.setActivity(activityInfo).catch(console.error);
};
// If the page is ready, register the callback
win.once("ready-to-show", () => {
registerCallback(updateActivity);
connect();
});
app.on('window-all-closed', module.exports.clear)
};
module.exports.clear = () => {
if (info.rpc) info.rpc.clearActivity();
clearTimeout(clearActivity);
};
module.exports.connect = connect;
module.exports.registerRefresh = (cb) => refreshCallbacks.push(cb);
module.exports.isConnected = () => info.rpc !== null;

View File

@ -1,47 +0,0 @@
const { setOptions } = require("../../config/plugins");
const { edit } = require("../../config");
const { clear, connect, registerRefresh, isConnected } = require("./back");
let hasRegisterred = false;
module.exports = (win, options, refreshMenu) => {
if (!hasRegisterred) {
registerRefresh(refreshMenu);
hasRegisterred = true;
}
return [
{
label: isConnected() ? "Connected" : "Reconnect",
enabled: !isConnected(),
click: connect,
},
{
label: "Clear activity",
click: clear,
},
{
label: "Clear activity after timeout",
type: "checkbox",
checked: options.activityTimoutEnabled,
click: (item) => {
options.activityTimoutEnabled = item.checked;
setOptions('discord', options);
},
},
{
label: "Listen Along",
type: "checkbox",
checked: options.listenAlong,
click: (item) => {
options.listenAlong = item.checked;
setOptions('discord', options);
},
},
{
label: "Set timeout time in config",
// open config.json
click: edit,
},
];
};

View File

@ -1,11 +0,0 @@
const CHANNEL = "downloader";
const ACTIONS = {
ERROR: "error",
METADATA: "metadata",
PROGRESS: "progress",
};
module.exports = {
CHANNEL: CHANNEL,
ACTIONS: ACTIONS,
};

View File

@ -1,87 +0,0 @@
const { writeFileSync } = require("fs");
const { join } = require("path");
const ID3Writer = require("browser-id3-writer");
const { dialog, ipcMain } = require("electron");
const registerCallback = require("../../providers/song-info");
const { injectCSS, listenAction } = require("../utils");
const { cropMaxWidth } = require("./utils");
const { ACTIONS, CHANNEL } = require("./actions.js");
const { getImage } = require("../../providers/song-info");
const sendError = (win, error) => {
win.setProgressBar(-1); // close progress bar
dialog.showMessageBox({
type: "info",
buttons: ["OK"],
title: "Error in download!",
message: "Argh! Apologies, download failed…",
detail: error.toString(),
});
};
let nowPlayingMetadata = {};
function handle(win) {
injectCSS(win.webContents, join(__dirname, "style.css"));
registerCallback((info) => {
nowPlayingMetadata = info;
});
listenAction(CHANNEL, (event, action, arg) => {
switch (action) {
case ACTIONS.ERROR: // arg = error
sendError(win, arg);
break;
case ACTIONS.METADATA:
event.returnValue = JSON.stringify(nowPlayingMetadata);
break;
case ACTIONS.PROGRESS: // arg = progress
win.setProgressBar(arg);
break;
default:
console.log("Unknown action: " + action);
}
});
ipcMain.on("add-metadata", async (event, filePath, songBuffer, currentMetadata) => {
let fileBuffer = songBuffer;
const songMetadata = currentMetadata.imageSrcYTPL ? // This means metadata come from ytpl.getInfo();
{
...currentMetadata,
image: cropMaxWidth(await getImage(currentMetadata.imageSrcYTPL))
} :
{ ...nowPlayingMetadata, ...currentMetadata };
try {
const coverBuffer = songMetadata.image && !songMetadata.image.isEmpty() ?
songMetadata.image.toPNG() : null;
const writer = new ID3Writer(songBuffer);
// Create the metadata tags
writer
.setFrame("TIT2", songMetadata.title)
.setFrame("TPE1", [songMetadata.artist]);
if (coverBuffer) {
writer.setFrame("APIC", {
type: 3,
data: coverBuffer,
description: ""
});
}
writer.addTag();
fileBuffer = Buffer.from(writer.arrayBuffer);
} catch (error) {
sendError(win, error);
}
writeFileSync(filePath, fileBuffer);
// Notify the youtube-dl file
event.reply("add-metadata-done");
});
}
module.exports = handle;
module.exports.sendError = sendError;

View File

@ -1,87 +0,0 @@
const { contextBridge } = require("electron");
const { defaultConfig } = require("../../config");
const { getSongMenu } = require("../../providers/dom-elements");
const { ElementFromFile, templatePath, triggerAction } = require("../utils");
const { ACTIONS, CHANNEL } = require("./actions.js");
const { downloadVideoToMP3 } = require("./youtube-dl");
let menu = null;
let progress = null;
const downloadButton = ElementFromFile(
templatePath(__dirname, "download.html")
);
let pluginOptions = {};
const observer = new MutationObserver((mutations, observer) => {
if (!menu) {
menu = getSongMenu();
}
if (menu && !menu.contains(downloadButton)) {
menu.prepend(downloadButton);
progress = document.querySelector("#ytmcustom-download");
}
});
const reinit = () => {
triggerAction(CHANNEL, ACTIONS.PROGRESS, -1); // closes progress bar
if (!progress) {
console.warn("Cannot update progress");
} else {
progress.innerHTML = "Download";
}
};
const baseUrl = defaultConfig.url;
// TODO: re-enable once contextIsolation is set to true
// contextBridge.exposeInMainWorld("downloader", {
// download: () => {
global.download = () => {
triggerAction(CHANNEL, ACTIONS.PROGRESS, 2); // starts with indefinite progress bar
let metadata;
let videoUrl = getSongMenu()
// selector of first button which is always "Start Radio"
?.querySelector('ytmusic-menu-navigation-item-renderer.iron-selected[tabindex="0"] #navigation-endpoint')
?.getAttribute("href");
if (videoUrl) {
videoUrl = baseUrl + "/" + videoUrl;
metadata = null;
} else {
metadata = global.songInfo;
videoUrl = metadata.url || window.location.href;
}
downloadVideoToMP3(
videoUrl,
(feedback, ratio = undefined) => {
if (!progress) {
console.warn("Cannot update progress");
} else {
progress.innerHTML = feedback;
}
if (ratio) {
triggerAction(CHANNEL, ACTIONS.PROGRESS, ratio);
}
},
(error) => {
triggerAction(CHANNEL, ACTIONS.ERROR, error);
reinit();
},
reinit,
pluginOptions,
metadata
);
};
// });
function observeMenu(options) {
pluginOptions = { ...pluginOptions, ...options };
observer.observe(document, {
childList: true,
subtree: true,
});
}
module.exports = observeMenu;

View File

@ -1,125 +0,0 @@
const { existsSync, mkdirSync } = require("fs");
const { join } = require("path");
const { dialog, ipcMain } = require("electron");
const is = require("electron-is");
const ytpl = require("ytpl");
const chokidar = require('chokidar');
const { setOptions } = require("../../config/plugins");
const { sendError } = require("./back");
const { defaultMenuDownloadLabel, getFolder, presets } = require("./utils");
let downloadLabel = defaultMenuDownloadLabel;
let playingPlaylistId = undefined;
let callbackIsRegistered = false;
module.exports = (win, options) => {
if (!callbackIsRegistered) {
ipcMain.on("video-src-changed", async (_, data) => {
playingPlaylistId = JSON.parse(data)?.videoDetails?.playlistId;
});
callbackIsRegistered = true;
}
return [
{
label: downloadLabel,
click: async () => {
const currentPagePlaylistId = new URL(win.webContents.getURL()).searchParams.get("list");
const playlistId = currentPagePlaylistId || playingPlaylistId;
if (!playlistId) {
sendError(win, new Error("No playlist ID found"));
return;
}
console.log(`trying to get playlist ID: '${playlistId}'`);
let playlist;
try {
playlist = await ytpl(playlistId, {
limit: options.playlistMaxItems || Infinity,
});
} catch (e) {
sendError(win, e);
return;
}
const playlistTitle = playlist.title;
const folder = getFolder(options.downloadFolder);
const playlistFolder = join(folder, playlistTitle);
if (existsSync(playlistFolder)) {
sendError(
win,
new Error(`The folder ${playlistFolder} already exists`)
);
return;
}
mkdirSync(playlistFolder, { recursive: true });
dialog.showMessageBox({
type: "info",
buttons: ["OK"],
title: "Started Download",
message: `Downloading Playlist "${playlistTitle}"`,
detail: `(${playlist.items.length} songs)`,
});
if (is.dev()) {
console.log(
`Downloading playlist "${playlistTitle}" (${playlist.items.length} songs)`
);
}
const steps = 1 / playlist.items.length;
let progress = 0;
win.setProgressBar(2); // starts with indefinite bar
let dirWatcher = chokidar.watch(playlistFolder);
dirWatcher.on('add', () => {
progress += steps;
if (progress >= 0.9999) {
win.setProgressBar(-1); // close progress bar
dirWatcher.close().then(() => dirWatcher = null);
} else {
win.setProgressBar(progress);
}
});
playlist.items.forEach((song) => {
win.webContents.send(
"downloader-download-playlist",
song.url,
playlistTitle,
options
);
});
},
},
{
label: "Choose download folder",
click: () => {
let result = dialog.showOpenDialogSync({
properties: ["openDirectory", "createDirectory"],
defaultPath: getFolder(options.downloadFolder),
});
if (result) {
options.downloadFolder = result[0];
setOptions("downloader", options);
} // else = user pressed cancel
},
},
{
label: "Presets",
submenu: Object.keys(presets).map((preset) => ({
label: preset,
type: "radio",
click: () => {
options.preset = preset;
setOptions("downloader", options);
},
checked: options.preset === preset || presets[preset] === undefined,
})),
},
];
};

View File

@ -1,21 +0,0 @@
.menu-item {
display: var(--ytmusic-menu-item_-_display);
height: var(--ytmusic-menu-item_-_height);
align-items: var(--ytmusic-menu-item_-_align-items);
padding: var(--ytmusic-menu-item_-_padding);
cursor: pointer;
}
.menu-item > .yt-simple-endpoint:hover {
background-color: var(--ytmusic-menu-item-hover-background-color);
}
.menu-icon {
flex: var(--ytmusic-menu-item-icon_-_flex);
margin: var(--ytmusic-menu-item-icon_-_margin);
fill: var(--ytmusic-menu-item-icon_-_fill);
stroke: var(--iron-icon-stroke-color, none);
width: var(--iron-icon-width, 24px);
height: var(--iron-icon-height, 24px);
animation: var(--iron-icon_-_animation);
}

View File

@ -1,45 +0,0 @@
<div
class="style-scope menu-item ytmusic-menu-popup-renderer"
role="option"
tabindex="-1"
aria-disabled="false"
aria-selected="false"
onclick="download()"
>
<div
id="navigation-endpoint"
class="yt-simple-endpoint style-scope ytmusic-menu-navigation-item-renderer"
tabindex="-1"
>
<div
class="icon menu-icon style-scope ytmusic-menu-navigation-item-renderer"
>
<svg
viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
class="style-scope yt-icon"
style="pointer-events: none; display: block; width: 100%; height: 100%"
>
<g class="style-scope yt-icon">
<path
d="M25.462,19.105v6.848H4.515v-6.848H0.489v8.861c0,1.111,0.9,2.012,2.016,2.012h24.967c1.115,0,2.016-0.9,2.016-2.012v-8.861H25.462z"
class="style-scope yt-icon"
fill="#aaaaaa"
/>
<path
d="M14.62,18.426l-5.764-6.965c0,0-0.877-0.828,0.074-0.828s3.248,0,3.248,0s0-0.557,0-1.416c0-2.449,0-6.906,0-8.723c0,0-0.129-0.494,0.615-0.494c0.75,0,4.035,0,4.572,0c0.536,0,0.524,0.416,0.524,0.416c0,1.762,0,6.373,0,8.742c0,0.768,0,1.266,0,1.266s1.842,0,2.998,0c1.154,0,0.285,0.867,0.285,0.867s-4.904,6.51-5.588,7.193C15.092,18.979,14.62,18.426,14.62,18.426z"
class="style-scope yt-icon"
fill="#aaaaaa"
/>
</g>
</svg>
</div>
<div
class="text style-scope ytmusic-menu-navigation-item-renderer"
id="ytmcustom-download"
>
Download
</div>
</div>
</div>

View File

@ -1,39 +0,0 @@
const electron = require("electron");
module.exports.getFolder = customFolder => customFolder || electron.app.getPath("downloads");
module.exports.defaultMenuDownloadLabel = "Download playlist";
const orderedQualityList = ["maxresdefault", "hqdefault", "mqdefault", "sdddefault"];
module.exports.urlToJPG = (imgUrl, videoId) => {
if (!imgUrl || imgUrl.includes(".jpg")) return imgUrl;
//it will almost never get further than hqdefault
for (const quality of orderedQualityList) {
if (imgUrl.includes(quality)) {
return `https://img.youtube.com/vi/${videoId}/${quality}.jpg`;
}
}
return `https://img.youtube.com/vi/${videoId}/default.jpg`;
}
module.exports.cropMaxWidth = (image) => {
const imageSize = image.getSize();
// standart youtube artwork width with margins from both sides is 280 + 720 + 280
if (imageSize.width === 1280 && imageSize.height === 720) {
return image.crop({
x: 280,
y: 0,
width: 720,
height: 720
});
}
return image;
}
// Presets for FFmpeg
module.exports.presets = {
"None (defaults to mp3)": undefined,
opus: {
extension: "opus",
ffmpegArgs: ["-acodec", "libopus"],
},
};

View File

@ -1,201 +0,0 @@
const { randomBytes } = require("crypto");
const { join } = require("path");
const Mutex = require("async-mutex").Mutex;
const { ipcRenderer } = require("electron");
const remote = require('@electron/remote');
const is = require("electron-is");
const filenamify = require("filenamify");
// Browser version of FFmpeg (in renderer process) instead of loading @ffmpeg/ffmpeg
// because --js-flags cannot be passed in the main process when the app is packaged
// See https://github.com/electron/electron/issues/22705
const FFmpeg = require("@ffmpeg/ffmpeg/dist/ffmpeg.min");
const ytdl = require("ytdl-core");
const { triggerAction, triggerActionSync } = require("../utils");
const { ACTIONS, CHANNEL } = require("./actions.js");
const { presets, urlToJPG } = require("./utils");
const { cleanupName } = require("../../providers/song-info");
const { createFFmpeg } = FFmpeg;
const ffmpeg = createFFmpeg({
log: false,
logger: () => {}, // console.log,
progress: () => {}, // console.log,
});
const ffmpegMutex = new Mutex();
const downloadVideoToMP3 = async (
videoUrl,
sendFeedback,
sendError,
reinit,
options,
metadata = undefined,
subfolder = ""
) => {
sendFeedback("Downloading…");
if (metadata === null) {
const { videoDetails } = await ytdl.getInfo(videoUrl);
const thumbnails = videoDetails?.thumbnails;
metadata = {
artist:
videoDetails?.media?.artist ||
cleanupName(videoDetails?.author?.name) ||
"",
title: videoDetails?.media?.song || videoDetails?.title || "",
imageSrcYTPL: thumbnails ?
urlToJPG(thumbnails[thumbnails.length - 1].url, videoDetails?.videoId)
: ""
}
}
let videoName = "YouTube Music - Unknown title";
let videoReadableStream;
try {
videoReadableStream = ytdl(videoUrl, {
filter: "audioonly",
quality: "highestaudio",
highWaterMark: 32 * 1024 * 1024, // 32 MB
requestOptions: { maxRetries: 3 },
});
} catch (err) {
sendError(err);
return;
}
const chunks = [];
videoReadableStream
.on("data", (chunk) => {
chunks.push(chunk);
})
.on("progress", (_chunkLength, downloaded, total) => {
const ratio = downloaded / total;
const progress = Math.floor(ratio * 100);
sendFeedback("Download: " + progress + "%", ratio);
})
.on("info", (info, format) => {
videoName = info.videoDetails.title.replace("|", "").toString("ascii");
if (is.dev()) {
console.log(
"Downloading video - name:",
videoName,
"- quality:",
format.audioBitrate + "kbits/s"
);
}
})
.on("error", sendError)
.on("end", async () => {
const buffer = Buffer.concat(chunks);
await toMP3(
videoName,
buffer,
sendFeedback,
sendError,
reinit,
options,
metadata,
subfolder
);
});
};
const toMP3 = async (
videoName,
buffer,
sendFeedback,
sendError,
reinit,
options,
existingMetadata = undefined,
subfolder = ""
) => {
const convertOptions = { ...presets[options.preset], ...options };
const safeVideoName = randomBytes(32).toString("hex");
const extension = convertOptions.extension || "mp3";
const releaseFFmpegMutex = await ffmpegMutex.acquire();
try {
if (!ffmpeg.isLoaded()) {
sendFeedback("Loading…", 2); // indefinite progress bar after download
await ffmpeg.load();
}
sendFeedback("Preparing file…");
ffmpeg.FS("writeFile", safeVideoName, buffer);
sendFeedback("Converting…");
const metadata = existingMetadata || getMetadata();
await ffmpeg.run(
"-i",
safeVideoName,
...getFFmpegMetadataArgs(metadata),
...(convertOptions.ffmpegArgs || []),
safeVideoName + "." + extension
);
const folder = options.downloadFolder || remote.app.getPath("downloads");
const name = metadata.title
? `${metadata.artist ? `${metadata.artist} - ` : ""}${metadata.title}`
: videoName;
const filename = filenamify(name + "." + extension, {
replacement: "_",
maxLength: 255,
});
const filePath = join(folder, subfolder, filename);
const fileBuffer = ffmpeg.FS("readFile", safeVideoName + "." + extension);
// Add the metadata
sendFeedback("Adding metadata…");
ipcRenderer.send("add-metadata", filePath, fileBuffer, {
artist: metadata.artist,
title: metadata.title,
imageSrcYTPL: metadata.imageSrcYTPL
});
ipcRenderer.once("add-metadata-done", reinit);
} catch (e) {
sendError(e);
} finally {
releaseFFmpegMutex();
}
};
const getMetadata = () => {
return JSON.parse(triggerActionSync(CHANNEL, ACTIONS.METADATA));
};
const getFFmpegMetadataArgs = (metadata) => {
if (!metadata) {
return;
}
return [
...(metadata.title ? ["-metadata", `title=${metadata.title}`] : []),
...(metadata.artist ? ["-metadata", `artist=${metadata.artist}`] : []),
];
};
module.exports = {
downloadVideoToMP3,
};
ipcRenderer.on(
"downloader-download-playlist",
(_, url, playlistFolder, options) => {
downloadVideoToMP3(
url,
() => {},
(error) => {
triggerAction(CHANNEL, ACTIONS.ERROR, error);
},
() => {},
options,
null,
playlistFolder
);
}
);

View File

@ -1,47 +0,0 @@
// "Youtube Music fix volume ratio 0.4" by Marco Pfeiffer
// https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/
const exponentialVolume = () => {
// manipulation exponent, higher value = lower volume
// 3 is the value used by pulseaudio, which Barteks2x figured out this gist here: https://gist.github.com/Barteks2x/a4e189a36a10c159bb1644ffca21c02a
// 0.05 (or 5%) is the lowest you can select in the UI which with an exponent of 3 becomes 0.000125 or 0.0125%
const EXPONENT = 3;
const storedOriginalVolumes = new WeakMap();
const { get, set } = Object.getOwnPropertyDescriptor(
HTMLMediaElement.prototype,
"volume"
);
Object.defineProperty(HTMLMediaElement.prototype, "volume", {
get() {
const lowVolume = get.call(this);
const calculatedOriginalVolume = lowVolume ** (1 / EXPONENT);
// The calculated value has some accuracy issues which can lead to problems for implementations that expect exact values.
// To avoid this, I'll store the unmodified volume to return it when read here.
// This mostly solves the issue, but the initial read has no stored value and the volume can also change though external influences.
// To avoid ill effects, I check if the stored volume is somewhere in the same range as the calculated volume.
const storedOriginalVolume = storedOriginalVolumes.get(this);
const storedDeviation = Math.abs(
storedOriginalVolume - calculatedOriginalVolume
);
const originalVolume =
storedDeviation < 0.01
? storedOriginalVolume
: calculatedOriginalVolume;
return originalVolume;
},
set(originalVolume) {
const lowVolume = originalVolume ** EXPONENT;
storedOriginalVolumes.set(this, originalVolume);
set.call(this, lowVolume);
},
});
};
module.exports = () =>
document.addEventListener("apiLoaded", exponentialVolume, {
once: true,
passive: true,
});

View File

@ -1,33 +0,0 @@
const path = require("path");
const electronLocalshortcut = require("electron-localshortcut");
const config = require("../../config");
const { injectCSS } = require("../utils");
//tracks menu visibility
let visible = true;
module.exports = (win) => {
// css for custom scrollbar + disable drag area(was causing bugs)
injectCSS(win.webContents, path.join(__dirname, "style.css"));
win.once("ready-to-show", () => {
//register keyboard shortcut && hide menu if hideMenu is enabled
if (config.get("options.hideMenu")) {
electronLocalshortcut.register(win, "Esc", () => {
setMenuVisibility(!visible);
});
}
});
win.webContents.once("did-finish-load", () => {
// fix bug with menu not applying on start when no internet connection available
setMenuVisibility(!config.get("options.hideMenu"));
});
function setMenuVisibility(value) {
visible = value;
win.webContents.send("updateMenu", visible);
}
};

View File

@ -1,33 +0,0 @@
const { ipcRenderer } = require("electron");
const { Menu } = require("@electron/remote");
const customTitlebar = require("custom-electron-titlebar");
function $(selector) { return document.querySelector(selector); }
module.exports = () => {
const bar = new customTitlebar.Titlebar({
backgroundColor: customTitlebar.Color.fromHex("#050505"),
itemBackgroundColor: customTitlebar.Color.fromHex("#121212"),
});
bar.updateTitle(" ");
document.title = "Youtube Music";
ipcRenderer.on("updateMenu", function (_event, showMenu) {
bar.updateMenu(showMenu ? Menu.getApplicationMenu() : null);
});
// Increases the right margin of Navbar background when the scrollbar is visible to avoid blocking it (z-index doesn't affect it)
document.addEventListener('apiLoaded', () => {
setNavbarMargin();
const playPageObserver = new MutationObserver(setNavbarMargin);
playPageObserver.observe($('ytmusic-app-layout'), { attributeFilter: ['player-page-open_', 'playerPageOpen_'] })
}, { once: true, passive: true })
};
function setNavbarMargin() {
$('#nav-bar-background').style.right =
$('ytmusic-app-layout').playerPageOpen_ ?
'0px' :
'12px';
}

View File

@ -1,73 +0,0 @@
/* increase font size for menu and menuItems */
.titlebar,
.menubar-menu-container .action-label {
font-size: 14px !important;
}
/* fixes nav-bar-background opacity bug, reposition it, and allows clicking scrollbar through it */
#nav-bar-background {
opacity: 1 !important;
pointer-events: none !important;
position: sticky !important;
top: 0 !important;
height: 75px !important;
}
/* remove window dragging for nav bar (conflict with titlebar drag) */
ytmusic-nav-bar,
.tab-titleiron-icon,
ytmusic-pivot-bar-item-renderer {
-webkit-app-region: unset !important;
}
/* move up item selection renderers */
ytmusic-item-section-renderer.stuck #header.ytmusic-item-section-renderer,
ytmusic-tabs.stuck {
top: calc(var(--ytmusic-nav-bar-height) - 15px) !important;
}
/* fix weird positioning in search screen*/
ytmusic-header-renderer.ytmusic-search-page {
position: unset !important;
}
/* Move navBar downwards */
ytmusic-nav-bar[slot="nav-bar"] {
top: 17px !important;
}
/* fix page progress bar position*/
yt-page-navigation-progress,
#progress.yt-page-navigation-progress {
top: 30px !important;
}
/* Custom scrollbar */
::-webkit-scrollbar {
width: 12px;
background-color: #030303;
border-radius: 100px;
-moz-border-radius: 100px;
-webkit-border-radius: 100px;
}
/* hover effect for both scrollbar area, and scrollbar 'thumb' */
::-webkit-scrollbar:hover {
background-color: rgba(15, 15, 15, 0.699);
}
/* The scrollbar 'thumb' ...that marque oval shape in a scrollbar */
::-webkit-scrollbar-thumb:vertical {
background-clip: padding-box;
border: 2px solid rgba(0, 0, 0, 0);
background: #3a3a3a;
border-radius: 100px;
-moz-border-radius: 100px;
-webkit-border-radius: 100px;
}
::-webkit-scrollbar-thumb:vertical:active {
background: #4d4c4c; /* Some darker color when you click it */
border-radius: 100px;
-moz-border-radius: 100px;
-webkit-border-radius: 100px;
}

View File

@ -1,160 +0,0 @@
const fetch = require('node-fetch');
const md5 = require('md5');
const { shell } = require('electron');
const { setOptions } = require('../../config/plugins');
const registerCallback = require('../../providers/song-info');
const defaultConfig = require('../../config/defaults');
const createFormData = params => {
// creates the body for in the post request
const formData = new URLSearchParams();
for (const key in params) {
formData.append(key, params[key]);
}
return formData;
}
const createQueryString = (params, api_sig) => {
// creates a querystring
const queryData = [];
params.api_sig = api_sig;
for (const key in params) {
queryData.push(`${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`);
}
return '?'+queryData.join('&');
}
const createApiSig = (params, secret) => {
// this function creates the api signature, see: https://www.last.fm/api/authspec
const keys = [];
for (const key in params) {
keys.push(key);
}
keys.sort();
let sig = '';
for (const key of keys) {
if (String(key) === 'format')
continue
sig += `${key}${params[key]}`;
}
sig += secret;
sig = md5(sig);
return sig;
}
const createToken = async ({ api_key, api_root, secret }) => {
// creates and stores the auth token
const data = {
method: 'auth.gettoken',
api_key: api_key,
format: 'json'
};
const api_sig = createApiSig(data, secret);
let response = await fetch(`${api_root}${createQueryString(data, api_sig)}`);
response = await response.json();
return response?.token;
}
const authenticate = async config => {
// asks the user for authentication
config.token = await createToken(config);
setOptions('last-fm', config);
shell.openExternal(`https://www.last.fm/api/auth/?api_key=${config.api_key}&token=${config.token}`);
return config;
}
const getAndSetSessionKey = async config => {
// get and store the session key
const data = {
api_key: config.api_key,
format: 'json',
method: 'auth.getsession',
token: config.token,
};
const api_sig = createApiSig(data, config.secret);
let res = await fetch(`${config.api_root}${createQueryString(data, api_sig)}`);
res = await res.json();
if (res.error)
await authenticate(config);
config.session_key = res?.session?.key;
setOptions('last-fm', config);
return config;
}
const postSongDataToAPI = async (songInfo, config, data) => {
// this sends a post request to the api, and adds the common data
if (!config.session_key)
await getAndSetSessionKey(config);
const postData = {
track: songInfo.title,
duration: songInfo.songDuration,
artist: songInfo.artist,
api_key: config.api_key,
sk: config.session_key,
format: 'json',
...data,
};
postData.api_sig = createApiSig(postData, config.secret);
fetch('https://ws.audioscrobbler.com/2.0/', {method: 'POST', body: createFormData(postData)})
.catch(res => {
if (res.response.data.error == 9) {
// session key is invalid, so remove it from the config and reauthenticate
config.session_key = undefined;
setOptions('last-fm', config);
authenticate(config);
}
});
}
const addScrobble = (songInfo, config) => {
// this adds one scrobbled song to last.fm
const data = {
method: 'track.scrobble',
timestamp: ~~((Date.now() - songInfo.elapsedSeconds) / 1000),
};
postSongDataToAPI(songInfo, config, data);
}
const setNowPlaying = (songInfo, config) => {
// this sets the now playing status in last.fm
const data = {
method: 'track.updateNowPlaying',
};
postSongDataToAPI(songInfo, config, data);
}
// this will store the timeout that will trigger addScrobble
let scrobbleTimer = undefined;
const lastfm = async (_win, config) => {
if (!config.api_root) {
// settings are not present, creating them with the default values
config = defaultConfig.plugins['last-fm'];
config.enabled = true;
setOptions('last-fm', config);
}
if (!config.session_key) {
// not authenticated
config = await getAndSetSessionKey(config);
}
registerCallback( songInfo => {
// set remove the old scrobble timer
clearTimeout(scrobbleTimer);
if (!songInfo.isPaused) {
setNowPlaying(songInfo, config);
// scrobble when the song is half way through, or has passed the 4 minute mark
const scrobbleTime = Math.min(Math.ceil(songInfo.songDuration / 2), 4 * 60);
if (scrobbleTime > songInfo.elapsedSeconds) {
// scrobble still needs to happen
const timeToWait = (scrobbleTime - songInfo.elapsedSeconds) * 1000;
scrobbleTimer = setTimeout(addScrobble, timeToWait, songInfo, config);
}
}
});
}
module.exports = lastfm;

View File

@ -1,52 +0,0 @@
const { join } = require("path");
const { ipcMain } = require("electron");
const is = require("electron-is");
const fetch = require("node-fetch");
const { cleanupName } = require("../../providers/song-info");
const { injectCSS } = require("../utils");
module.exports = async (win) => {
injectCSS(win.webContents, join(__dirname, "style.css"));
ipcMain.on("search-genius-lyrics", async (event, extractedSongInfo) => {
const metadata = JSON.parse(extractedSongInfo);
const queryString = `${cleanupName(metadata.artist)} ${cleanupName(
metadata.title
)}`;
let response = await fetch(
`https://genius.com/api/search/multi?per_page=5&q=${encodeURI(
queryString
)}`
);
if (!response.ok) {
event.returnValue = null;
return;
}
const info = await response.json();
let url = "";
try {
url = info.response.sections.filter(
(section) => section.type === "song"
)[0].hits[0].result.url;
} catch {
event.returnValue = null;
return;
}
if (is.dev()) {
console.log("Fetching lyrics from Genius:", url);
}
response = await fetch(url);
if (!response.ok) {
event.returnValue = null;
return;
}
event.returnValue = await response.text();
});
};

View File

@ -1,67 +0,0 @@
const { ipcRenderer } = require("electron");
const is = require("electron-is");
module.exports = () => {
ipcRenderer.on("update-song-info", (_, extractedSongInfo) => {
const lyricsTab = document.querySelector('tp-yt-paper-tab[tabindex="-1"]');
// Check if disabled
if (!lyricsTab || !lyricsTab.hasAttribute("disabled")) {
return;
}
const html = ipcRenderer.sendSync(
"search-genius-lyrics",
extractedSongInfo
);
if (!html) {
return;
} else if (is.dev()) {
console.log("Fetched lyrics from Genius");
}
const wrapper = document.createElement("div");
wrapper.innerHTML = html;
const lyricsSelector1 = wrapper.querySelector(".lyrics");
const lyricsSelector2 = wrapper.querySelector(
'[class^="Lyrics__Container"]'
);
const lyrics = lyricsSelector1
? lyricsSelector1.innerHTML
: lyricsSelector2
? lyricsSelector2.innerHTML
: null;
if (!lyrics) {
return;
}
lyricsTab.removeAttribute("disabled");
lyricsTab.removeAttribute("aria-disabled");
document.querySelector("tp-yt-paper-tab").onclick = () => {
lyricsTab.removeAttribute("disabled");
lyricsTab.removeAttribute("aria-disabled");
};
lyricsTab.onclick = () => {
const tabContainer = document.querySelector("ytmusic-tab-renderer");
const observer = new MutationObserver((_, observer) => {
const lyricsContainer = document.querySelector(
'[page-type="MUSIC_PAGE_TYPE_TRACK_LYRICS"] > ytmusic-message-renderer'
);
if (lyricsContainer) {
lyricsContainer.innerHTML = `<div id="contents" class="style-scope ytmusic-section-list-renderer genius-lyrics">
${lyrics}
<yt-formatted-string class="footer style-scope ytmusic-description-shelf-renderer">Source&nbsp;: Genius</yt-formatted-string>
</div>`;
observer.disconnect();
}
});
observer.observe(tabContainer, {
attributes: true,
childList: true,
subtree: true,
});
};
});
};

View File

@ -1,12 +0,0 @@
/* Disable links in Genius lyrics */
.genius-lyrics a {
color: var(--ytmusic-text-primary);
display: inline-block;
pointer-events: none;
text-decoration: none;
}
#contents.genius-lyrics {
font-size: 1vw;
opacity: 0.9;
}

View File

@ -1,24 +0,0 @@
const { triggerAction } = require("../utils");
const CHANNEL = "navigation";
const ACTIONS = {
NEXT: "next",
BACK: "back",
};
function goToNextPage() {
triggerAction(CHANNEL, ACTIONS.NEXT);
}
function goToPreviousPage() {
triggerAction(CHANNEL, ACTIONS.BACK);
}
module.exports = {
CHANNEL: CHANNEL,
ACTIONS: ACTIONS,
actions: {
goToNextPage: goToNextPage,
goToPreviousPage: goToPreviousPage,
},
};

View File

@ -1,29 +0,0 @@
const path = require("path");
const { injectCSS, listenAction } = require("../utils");
const { ACTIONS, CHANNEL } = require("./actions.js");
function handle(win) {
injectCSS(win.webContents, path.join(__dirname, "style.css"), () => {
win.webContents.send("navigation-css-ready");
});
listenAction(CHANNEL, (event, action) => {
switch (action) {
case ACTIONS.NEXT:
if (win.webContents.canGoForward()) {
win.webContents.goForward();
}
break;
case ACTIONS.BACK:
if (win.webContents.canGoBack()) {
win.webContents.goBack();
}
break;
default:
console.log("Unknown action: " + action);
}
});
}
module.exports = handle;

View File

@ -1,19 +0,0 @@
const { ipcRenderer } = require("electron");
const { ElementFromFile, templatePath } = require("../utils");
function run() {
ipcRenderer.on("navigation-css-ready", () => {
const forwardButton = ElementFromFile(
templatePath(__dirname, "forward.html")
);
const backButton = ElementFromFile(templatePath(__dirname, "back.html"));
const menu = document.querySelector("ytmusic-pivot-bar-renderer");
if (menu) {
menu.prepend(backButton, forwardButton);
}
});
}
module.exports = run;

View File

@ -1,36 +0,0 @@
.navigation-item {
font-family: Roboto, Noto Naskh Arabic UI, Arial, sans-serif;
font-size: 20px;
line-height: var(--ytmusic-title-1_-_line-height);
font-weight: 500;
color: #fff;
--yt-endpoint-color: #fff;
--yt-endpoint-hover-color: #fff;
--yt-endpoint-visited-color: #fff;
display: inline-flex;
align-items: center;
color: rgba(255, 255, 255, 0.5);
cursor: pointer;
margin: 0 var(--ytmusic-pivot-bar-tab-margin);
}
.navigation-item:hover {
color: #fff;
}
.navigation-icon {
display: inline-flex;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;
position: relative;
vertical-align: middle;
fill: var(--iron-icon-fill-color, currentcolor);
stroke: none;
width: var(--iron-icon-width, 24px);
height: var(--iron-icon-height, 24px);
animation: var(--iron-icon_-_animation);
}

View File

@ -1,33 +0,0 @@
<div
class="style-scope ytmusic-pivot-bar-renderer navigation-item"
tab-id="FEmusic_back"
role="tab"
onclick="goToPreviousPage()"
>
<div
class="search-icon style-scope ytmusic-search-box"
role="button"
tabindex="0"
aria-disabled="false"
title="Go to previous page"
>
<div
id="icon"
class="tab-icon style-scope paper-icon-button navigation-icon"
>
<svg
viewBox="0 0 492 492"
preserveAspectRatio="xMidYMid meet"
focusable="false"
class="style-scope iron-icon"
style="pointer-events: none; display: block; width: 100%; height: 100%"
>
<g class="style-scope iron-icon">
<path
d="M109.3 265.2l218.9 218.9c5.1 5.1 11.8 7.9 19 7.9s14-2.8 19-7.9l16.1-16.1c10.5-10.5 10.5-27.6 0-38.1L198.6 246.1 382.7 62c5.1-5.1 7.9-11.8 7.9-19 0-7.2-2.8-14-7.9-19L366.5 7.9c-5.1-5.1-11.8-7.9-19-7.9-7.2 0-14 2.8-19 7.9L109.3 227c-5.1 5.1-7.9 11.9-7.8 19.1 0 7.2 2.8 14 7.8 19.1z"
></path>
</g>
</svg>
</div>
</div>
</div>

View File

@ -1,35 +0,0 @@
<div
class="style-scope ytmusic-pivot-bar-renderer navigation-item"
tab-id="FEmusic_next"
role="tab"
onclick="goToNextPage()"
>
<div
class="search-icon style-scope ytmusic-search-box"
role="button"
tabindex="0"
aria-disabled="false"
title="Go to next page"
>
<div
id="icon"
class="tab-icon style-scope paper-icon-button navigation-icon"
>
<svg
viewBox="0 0 492 492"
preserveAspectRatio="xMidYMid meet"
focusable="false"
class="style-scope iron-icon"
style="pointer-events: none; display: block; width: 100%; height: 100%;"
>
<g class="style-scope iron-icon">
<path
d="M382.7,226.8L163.7,7.9c-5.1-5.1-11.8-7.9-19-7.9s-14,2.8-19,7.9L109.5,24c-10.5,10.5-10.5,27.6,0,38.1
l183.9,183.9L109.3,430c-5.1,5.1-7.9,11.8-7.9,19c0,7.2,2.8,14,7.9,19l16.1,16.1c5.1,5.1,11.8,7.9,19,7.9s14-2.8,19-7.9L382.7,265
c5.1-5.1,7.9-11.9,7.8-19.1C390.5,238.7,387.8,231.9,382.7,226.8z"
></path>
</g>
</svg>
</div>
</div>
</div>

View File

@ -1,6 +0,0 @@
const { injectCSS } = require("../utils");
const path = require("path");
module.exports = win => {
injectCSS(win.webContents, path.join(__dirname, "style.css"));
};

View File

@ -1,15 +0,0 @@
function removeLoginElements() {
const elementsToRemove = [
".sign-in-link.ytmusic-nav-bar",
'.ytmusic-pivot-bar-renderer[tab-id="FEmusic_liked"]'
];
elementsToRemove.forEach(selector => {
const node = document.querySelector(selector);
if (node) {
node.remove();
}
});
}
module.exports = removeLoginElements;

View File

@ -1,3 +0,0 @@
.ytmusic-pivot-bar-renderer[tab-id="FEmusic_liked"] {
display: none !important;
}

View File

@ -1,46 +0,0 @@
const { Notification } = require("electron");
const is = require("electron-is");
const registerCallback = require("../../providers/song-info");
const { notificationImage } = require("./utils");
const setupInteractive = require("./interactive")
const notify = (info, options) => {
// Fill the notification with content
const notification = {
title: info.title || "Playing",
body: info.artist,
icon: notificationImage(info),
silent: true,
urgency: options.urgency,
};
// Send the notification
const currentNotification = new Notification(notification);
currentNotification.show()
return currentNotification;
};
const setup = (options) => {
let oldNotification;
let currentUrl;
registerCallback(songInfo => {
if (!songInfo.isPaused && (songInfo.url !== currentUrl || options.unpauseNotification)) {
// Close the old notification
oldNotification?.close();
currentUrl = songInfo.url;
// This fixes a weird bug that would cause the notification to be updated instead of showing
setTimeout(() => { oldNotification = notify(songInfo, options) }, 10);
}
});
}
module.exports = (win, options) => {
// Register the callback for new song information
is.windows() && options.interactive ?
setupInteractive(win, options.unpauseNotification) :
setup(options);
};

View File

@ -1,103 +0,0 @@
const { notificationImage, icons } = require("./utils");
const getSongControls = require('../../providers/song-controls');
const registerCallback = require("../../providers/song-info");
const notifier = require("node-notifier");
//store song controls reference on launch
let controls;
let notificationOnUnpause;
module.exports = (win, unpauseNotification) => {
//Save controls and onPause option
const { playPause, next, previous } = getSongControls(win);
controls = { playPause, next, previous };
notificationOnUnpause = unpauseNotification;
let currentUrl;
// Register songInfoCallback
registerCallback(songInfo => {
if (!songInfo.isPaused && (songInfo.url !== currentUrl || notificationOnUnpause)) {
currentUrl = songInfo.url;
sendToaster(songInfo);
}
});
win.webContents.once("closed", () => {
deleteNotification()
});
}
//delete old notification
let toDelete;
function deleteNotification() {
if (toDelete !== undefined) {
// To remove the notification it has to be done this way
const removeNotif = Object.assign(toDelete, {
remove: toDelete.id
})
notifier.notify(removeNotif)
toDelete = undefined;
}
}
//New notification
function sendToaster(songInfo) {
deleteNotification();
//download image and get path
let imgSrc = notificationImage(songInfo, true);
toDelete = {
//app id undefined - will break buttons
title: songInfo.title || "Playing",
message: songInfo.artist,
id: parseInt(Math.random() * 1000000, 10),
icon: imgSrc,
actions: [
icons.previous,
songInfo.isPaused ? icons.play : icons.pause,
icons.next
],
sound: false,
};
//send notification
notifier.notify(
toDelete,
(err, data) => {
// Will also wait until notification is closed.
if (err) {
console.log(`ERROR = ${err.toString()}\n DATA = ${data}`);
}
switch (data) {
//buttons
case icons.previous.normalize():
controls.previous();
return;
case icons.next.normalize():
controls.next();
return;
case icons.play.normalize():
controls.playPause();
// dont delete notification on play/pause
toDelete = undefined;
//manually send notification if not sending automatically
if (!notificationOnUnpause) {
songInfo.isPaused = false;
sendToaster(songInfo);
}
return;
case icons.pause.normalize():
controls.playPause();
songInfo.isPaused = true;
toDelete = undefined;
sendToaster(songInfo);
return;
//Native datatype
case "dismissed":
case "timeout":
deleteNotification();
}
}
);
}

View File

@ -1,30 +0,0 @@
const { urgencyLevels, setOption } = require("./utils");
const is = require("electron-is");
module.exports = (win, options) => [
...(is.linux() ?
[{
label: "Notification Priority",
submenu: urgencyLevels.map(level => ({
label: level.name,
type: "radio",
checked: options.urgency === level.value,
click: () => setOption(options, "urgency", level.value)
})),
}] :
[]),
...(is.windows() ?
[{
label: "Interactive Notifications",
type: "checkbox",
checked: options.interactive,
click: (item) => setOption(options, "interactive", item.checked)
}] :
[]),
{
label: "Show notification on unpause",
type: "checkbox",
checked: options.unpauseNotification,
click: (item) => setOption(options, "unpauseNotification", item.checked)
},
];

View File

@ -1,56 +0,0 @@
const { setOptions } = require("../../config/plugins");
const path = require("path");
const { app } = require("electron");
const fs = require("fs");
const icon = "assets/youtube-music.png";
const tempIcon = path.join(app.getPath("userData"), "tempIcon.png");
module.exports.icons = {
play: "\u{1405}", // ᐅ
pause: "\u{2016}", // ‖
next: "\u{1433}", //
previous: "\u{1438}" //
}
module.exports.setOption = (options, option, value) => {
options[option] = value;
setOptions("notifications", options)
}
module.exports.urgencyLevels = [
{ name: "Low", value: "low" },
{ name: "Normal", value: "normal" },
{ name: "High", value: "critical" },
];
module.exports.notificationImage = function (songInfo, saveIcon = false) {
//return local path to temp icon
if (saveIcon && !!songInfo.image) {
try {
fs.writeFileSync(tempIcon,
centerNativeImage(songInfo.image)
.toPNG()
);
} catch (err) {
console.log(`Error writing song icon to disk:\n${err.toString()}`)
return icon;
}
return tempIcon;
}
//else: return image
return songInfo.image
? centerNativeImage(songInfo.image)
: icon
};
function centerNativeImage(nativeImage) {
const tempImage = nativeImage.resize({ height: 256 });
const margin = Math.max((tempImage.getSize().width - 256), 0);
return tempImage.crop({
x: Math.round(margin / 2),
y: 0,
width: 256, height: 256
})
}

View File

@ -1,93 +0,0 @@
const { getSongMenu } = require("../../providers/dom-elements");
const { ElementFromFile, templatePath } = require("../utils");
function $(selector) { return document.querySelector(selector); }
const slider = ElementFromFile(templatePath(__dirname, "slider.html"));
const roundToTwo = n => Math.round(n * 1e2) / 1e2;
const MIN_PLAYBACK_SPEED = 0.07;
const MAX_PLAYBACK_SPEED = 16;
let playbackSpeed = 1;
const updatePlayBackSpeed = () => {
$('video').playbackRate = playbackSpeed;
const playbackSpeedElement = $("#playback-speed-value");
if (playbackSpeedElement) {
playbackSpeedElement.innerHTML = playbackSpeed;
}
};
let menu;
let observingSlider = false;
const observePopupContainer = () => {
const observer = new MutationObserver(() => {
if (!menu) {
menu = getSongMenu();
}
if (menu && !menu.contains(slider)) {
menu.prepend(slider);
if (!observingSlider) {
setupSliderListener();
observingSlider = true;
}
}
});
observer.observe($('ytmusic-popup-container'), {
childList: true,
subtree: true,
});
};
const observeVideo = () => {
$('video').addEventListener('ratechange', forcePlaybackRate)
$('video').addEventListener('srcChanged', forcePlaybackRate)
}
const setupWheelListener = () => {
slider.addEventListener('wheel', e => {
e.preventDefault();
if (isNaN(playbackSpeed)) {
playbackSpeed = 1;
}
// e.deltaY < 0 means wheel-up
playbackSpeed = roundToTwo(e.deltaY < 0 ?
Math.min(playbackSpeed + 0.01, MAX_PLAYBACK_SPEED) :
Math.max(playbackSpeed - 0.01, MIN_PLAYBACK_SPEED)
);
updatePlayBackSpeed();
// update slider position
$('#playback-speed-slider').value = playbackSpeed;
})
}
function setupSliderListener() {
$('#playback-speed-slider').addEventListener('immediate-value-changed', e => {
playbackSpeed = e.detail.value || MIN_PLAYBACK_SPEED;
if (isNaN(playbackSpeed)) {
playbackSpeed = 1;
}
updatePlayBackSpeed();
})
}
function forcePlaybackRate(e) {
if (e.target.playbackRate !== playbackSpeed) {
e.target.playbackRate = playbackSpeed
}
}
module.exports = () => {
document.addEventListener('apiLoaded', e => {
observePopupContainer();
observeVideo();
setupWheelListener();
}, { once: true, passive: true })
};

View File

@ -1,88 +0,0 @@
<div
class="style-scope menu-item ytmusic-menu-popup-renderer"
role="option"
tabindex="-1"
aria-disabled="false"
aria-selected="false"
>
<div
id="navigation-endpoint"
class="yt-simple-endpoint style-scope ytmusic-menu-navigation-item-renderer"
tabindex="-1"
>
<tp-yt-paper-slider
id="playback-speed-slider"
class="volume-slider style-scope ytmusic-player-bar on-hover"
style="display: inherit !important"
max="2"
min="0"
step="0.125"
dir="ltr"
title="Playback speed"
aria-label="Playback speed"
role="slider"
tabindex="0"
aria-valuemin="0"
aria-valuemax="2"
aria-valuenow="1"
aria-disabled="false"
value="1"
><!--css-build:shady-->
<div id="sliderContainer" class="style-scope tp-yt-paper-slider">
<div class="bar-container style-scope tp-yt-paper-slider">
<tp-yt-paper-progress
id="sliderBar"
aria-hidden="true"
class="style-scope tp-yt-paper-slider"
role="progressbar"
value="1"
aria-valuenow="1"
aria-valuemin="0"
aria-valuemax="2"
aria-disabled="false"
style="touch-action: none"
><!--css-build:shady-->
<div
id="progressContainer"
class="style-scope tp-yt-paper-progress"
>
<div
id="secondaryProgress"
class="style-scope tp-yt-paper-progress"
hidden="true"
style="transform: scaleX(0)"
></div>
<div
id="primaryProgress"
class="style-scope tp-yt-paper-progress"
style="transform: scaleX(0.5)"
></div>
</div>
</tp-yt-paper-progress>
</div>
<dom-if class="style-scope tp-yt-paper-slider"
><template is="dom-if"></template
></dom-if>
<div
id="sliderKnob"
class="slider-knob style-scope tp-yt-paper-slider"
style="left: 50%; touch-action: none"
>
<div
class="slider-knob-inner style-scope tp-yt-paper-slider"
value="1"
></div>
</div>
</div>
<dom-if class="style-scope tp-yt-paper-slider"
><template is="dom-if"></template></dom-if
></tp-yt-paper-slider>
<div
class="text style-scope ytmusic-menu-navigation-item-renderer"
id="ytmcustom-playback-speed"
>
Speed (<span id="playback-speed-value">1</span>)
</div>
</div>
</div>

View File

@ -1,9 +0,0 @@
/*
This is used to determine if plugin is actually active
(not if its only enabled in options)
*/
let enabled = false;
module.exports = () => enabled = true;
module.exports.enabled = () => enabled;

View File

@ -1,236 +0,0 @@
const { ipcRenderer } = require("electron");
const { globalShortcut } = require('@electron/remote');
const { setOptions } = require("../../config/plugins");
function $(selector) { return document.querySelector(selector); }
let api;
module.exports = (options) => {
document.addEventListener('apiLoaded', e => {
api = e.detail;
firstRun(options);
}, { once: true, passive: true })
};
/** Restore saved volume and setup tooltip */
function firstRun(options) {
if (typeof options.savedVolume === "number") {
// Set saved volume as tooltip
setTooltip(options.savedVolume);
if (api.getVolume() !== options.savedVolume) {
api.setVolume(options.savedVolume);
}
}
setupPlaybar(options);
setupLocalArrowShortcuts(options);
setupGlobalShortcuts(options);
const noVid = $("#main-panel")?.computedStyleMap().get("display").value === "none";
injectVolumeHud(noVid);
if (!noVid) {
setupVideoPlayerOnwheel(options);
}
// Change options from renderer to keep sync
ipcRenderer.on("setOptions", (_event, newOptions = {}) => {
for (option in newOptions) {
options[option] = newOptions[option];
}
setOptions("precise-volume", options);
});
}
function injectVolumeHud(noVid) {
if (noVid) {
const position = "top: 18px; right: 60px; z-index: 999; position: absolute;";
const mainStyle = "font-size: xx-large; padding: 10px; transition: opacity 1s; pointer-events: none;";
$(".center-content.ytmusic-nav-bar").insertAdjacentHTML("beforeend",
`<span id="volumeHud" style="${position + mainStyle}"></span>`)
} else {
const position = `top: 10px; left: 10px; z-index: 999; position: absolute;`;
const mainStyle = "font-size: xxx-large; padding: 10px; transition: opacity 0.6s; webkit-text-stroke: 1px black; font-weight: 600; pointer-events: none;";
$("#song-video").insertAdjacentHTML('afterend',
`<span id="volumeHud" style="${position + mainStyle}"></span>`)
}
}
let hudFadeTimeout;
function showVolumeHud(volume) {
let volumeHud = $("#volumeHud");
if (!volumeHud) return;
volumeHud.textContent = volume + '%';
volumeHud.style.opacity = 1;
if (hudFadeTimeout) {
clearTimeout(hudFadeTimeout);
}
hudFadeTimeout = setTimeout(() => {
volumeHud.style.opacity = 0;
hudFadeTimeout = null;
}, 2000);
}
/** Add onwheel event to video player */
function setupVideoPlayerOnwheel(options) {
$("#main-panel").addEventListener("wheel", event => {
event.preventDefault();
// Event.deltaY < 0 means wheel-up
changeVolume(event.deltaY < 0, options);
});
}
function saveVolume(volume, options) {
options.savedVolume = volume;
writeOptions(options);
}
//without this function it would rewrite config 20 time when volume change by 20
let writeTimeout;
function writeOptions(options) {
if (writeTimeout) clearTimeout(writeTimeout);
writeTimeout = setTimeout(() => {
setOptions("precise-volume", options);
writeTimeout = null;
}, 1000)
}
/** Add onwheel event to play bar and also track if play bar is hovered*/
function setupPlaybar(options) {
const playerbar = $("ytmusic-player-bar");
playerbar.addEventListener("wheel", event => {
event.preventDefault();
// Event.deltaY < 0 means wheel-up
changeVolume(event.deltaY < 0, options);
});
// Keep track of mouse position for showVolumeSlider()
playerbar.addEventListener("mouseenter", () => {
playerbar.classList.add("on-hover");
});
playerbar.addEventListener("mouseleave", () => {
playerbar.classList.remove("on-hover");
});
setupSliderObserver(options);
}
/** Save volume + Update the volume tooltip when volume-slider is manually changed */
function setupSliderObserver(options) {
const sliderObserver = new MutationObserver(mutations => {
for (const mutation of mutations) {
// This checks that volume-slider was manually set
if (mutation.oldValue !== mutation.target.value &&
(typeof options.savedVolume !== "number" || Math.abs(options.savedVolume - mutation.target.value) > 4)) {
// Diff>4 means it was manually set
setTooltip(mutation.target.value);
saveVolume(mutation.target.value, options);
}
}
});
// Observing only changes in 'value' of volume-slider
sliderObserver.observe($("#volume-slider"), {
attributeFilter: ["value"],
attributeOldValue: true
});
}
/** if (toIncrease = false) then volume decrease */
function changeVolume(toIncrease, options) {
// Apply volume change if valid
const steps = Number(options.steps || 1);
api.setVolume(toIncrease ?
Math.min(api.getVolume() + steps, 100) :
Math.max(api.getVolume() - steps, 0));
// Save the new volume
saveVolume(api.getVolume(), options);
// change slider position (important)
updateVolumeSlider(options);
// Change tooltips to new value
setTooltip(options.savedVolume);
// Show volume slider
showVolumeSlider();
// Show volume HUD
showVolumeHud(options.savedVolume);
}
function updateVolumeSlider(options) {
// Slider value automatically rounds to multiples of 5
$("#volume-slider").value = options.savedVolume > 0 && options.savedVolume < 5 ?
5 : options.savedVolume;
}
let volumeHoverTimeoutID;
function showVolumeSlider() {
const slider = $("#volume-slider");
// This class display the volume slider if not in minimized mode
slider.classList.add("on-hover");
// Reset timeout if previous one hasn't completed
if (volumeHoverTimeoutID) {
clearTimeout(volumeHoverTimeoutID);
}
// Timeout to remove volume preview after 3 seconds if playbar isn't hovered
volumeHoverTimeoutID = setTimeout(() => {
volumeHoverTimeoutID = null;
if (!$("ytmusic-player-bar").classList.contains("on-hover")) {
slider.classList.remove("on-hover");
}
}, 3000);
}
// Set new volume as tooltip for volume slider and icon + expanding slider (appears when window size is small)
const tooltipTargets = [
"#volume-slider",
"tp-yt-paper-icon-button.volume",
"#expand-volume-slider",
"#expand-volume"
];
function setTooltip(volume) {
for (target of tooltipTargets) {
$(target).title = `${volume}%`;
}
}
function setupGlobalShortcuts(options) {
if (options.globalShortcuts.volumeUp) {
globalShortcut.register((options.globalShortcuts.volumeUp), () => changeVolume(true, options));
}
if (options.globalShortcuts.volumeDown) {
globalShortcut.register((options.globalShortcuts.volumeDown), () => changeVolume(false, options));
}
}
function setupLocalArrowShortcuts(options) {
if (options.arrowsShortcut) {
window.addEventListener('keydown', (event) => {
switch (event.code) {
case "ArrowUp":
event.preventDefault();
changeVolume(true, options);
break;
case "ArrowDown":
event.preventDefault();
changeVolume(false, options);
break;
}
});
}
}

Some files were not shown because too many files have changed in this diff Show More