Compare commits

...

995 Commits

Author SHA1 Message Date
jeffvli 9ae4be9336 add missing publish to win beta 2025-10-12 01:05:54 -07:00
jeffvli 1686e7ad0b add separate beta publish scripts 2025-10-12 00:54:07 -07:00
jeffvli bf6047da17 add separate electron builder config for beta channel 2025-10-12 00:53:05 -07:00
jeffvli c3b4a9edf8 attempt fix on beta channel release files 2025-10-11 20:25:33 -07:00
jeffvli 0340cc8a85 update to v0.21.0 2025-10-11 20:12:17 -07:00
jeffvli 3f7a402ce8 add commit notes to beta deploy 2025-10-11 20:05:26 -07:00
jeffvli 20c585aa1c remove unneeded tag deletion 2025-10-11 19:43:08 -07:00
jeffvli 0248997a75 delete old tags in addition to release 2025-10-11 19:41:19 -07:00
jeffvli aaaeea1fa5 split workflow into separate jobs, fix release rename step 2025-10-11 19:39:52 -07:00
jeffvli 22504e9e84 simplify prerelease deletion 2025-10-11 19:28:16 -07:00
jeffvli 5fb2ae839f fix previous release parser 2025-10-11 19:23:05 -07:00
jeffvli 15b00910f3 rework nightly deploy again
- rename to beta
- autodelete previous beta releases
- rename release title to Beta
2025-10-11 19:09:56 -07:00
jeffvli 6cce72a22a rework nightly deploy
- rename to development
- only manual push
- allow input for semantic version number
- set release to github prerelease instead of draft
2025-10-11 19:02:45 -07:00
jeffvli d48fe81d7f re-add build in nightly 2025-10-11 17:14:04 -07:00
jeffvli f0d0f826fb remove duplicate build in nightly 2025-10-11 15:06:52 -07:00
jeffvli 4d12a4d6cb add release channel setting and implementation 2025-10-11 15:05:29 -07:00
jeffvli f14d1f3c5c convert version bump to use pwsh 2025-10-11 14:15:03 -07:00
jeffvli cc466cb0f4 remove exemption for enhancements for stale issues 2025-10-11 13:26:43 -07:00
jeffvli 20941c0405 add initial nightly release workflow 2025-10-11 13:06:51 -07:00
Kendall Garner d52c067dc7 allow customizing windows install 2025-10-11 12:40:27 -07:00
Kendall Garner fccbf83c12 bugfix: handle playlist with no tracks 2025-10-11 12:39:59 -07:00
Kendall Garner 7817059a9e update serve image docs 2025-10-11 08:07:40 -07:00
Luis Canada d3a986e93c Add PWA to web app (#1175)
* add PWA to web app

* Fix sw.js not registering and lint

* Change sw and manifest to live at root

* Revert "Change sw and manifest to live at root"

This reverts commit 4c27d92467.
2025-10-11 14:12:25 +00:00
Kendall Garner 6733047942 improve jellyfin participants 2025-10-10 19:32:11 -07:00
Kendall Garner 452803fc72 support artist art as artist background 2025-10-10 18:26:28 -07:00
jeffvli 4e4a0464d6 pin pnpm/action-setup to v4.1.0 2025-10-10 12:36:08 -07:00
Kendall Garner 4ff317eac9 fix nonexistent filter 2025-10-05 21:25:19 -07:00
Kendall Garner 306167fee3 playlist sort and refactoring 2025-10-05 19:13:35 -07:00
Kendall Garner 1cbb3e56bc add recently released to home page, refactor home route 2025-10-05 07:51:36 -07:00
Kendall Garner 7c24f7cba4 use margin bottom for notifications component to not disable center controls 2025-10-04 07:34:48 -07:00
Evelyn Gravett 1b278cb33a Feature: Add song and artist links to discord RPC (#1160)
* Add song and artist links to discord RPC

* use first artist name for artist link, full artist name for song link

* use first album artist for song link

* add discord rpc links setting

* simplify discord link settings

* fix setting description

* add musicbrainz links

* fix callback missing dependency

* use encodeURIComponent for lastfm links

Co-authored-by: Kendall Garner <17521368+kgarner7@users.noreply.github.com>

* split musicbrainz ids

* combine link settings

---------

Co-authored-by: Kendall Garner <17521368+kgarner7@users.noreply.github.com>
2025-10-04 03:27:59 +00:00
Kendall Garner f1a75d8e81 allow zero warnings on lint 2025-09-30 07:58:57 -07:00
Kendall Garner 4a48598260 add multiple genre support for nd albums/tracks 2025-09-28 19:59:20 -07:00
Kendall Garner 6df270ba34 server add/edit refactor, allow jellyfin prefer instant mix 2025-09-28 19:19:24 -07:00
Kendall Garner eb0ccec0bc Remove cached queries on editing server 2025-09-28 19:10:47 -07:00
Kendall Garner 8caf898172 have default background for artist top songs 2025-09-28 17:12:34 -07:00
Kendall Garner 508013958f ND >= 0.56.0: search songs by artist | album artist id 2025-09-27 20:00:34 -07:00
Kendall Garner c448352ec8 fix linter error 2025-09-26 17:30:20 -07:00
Henry e344adfeed Add autodiscovery for Jellyfin servers (#1146)
* Add autodiscovery for Jellyfin servers

* Remove debugging aids

you didn't see anything

* Fix linter errors

* Send a discovery packet to localhost too
2025-09-26 22:53:19 +00:00
Jeff bca4a14f2e adjust web playback error handler (#1150) 2025-09-24 18:09:30 -07:00
Kendall Garner f4be797f16 Add comment describing jellyfin image tag invalidation 2025-09-24 08:12:00 -07:00
Kendall Garner 2feef206fb add Navidrome/Jellyfin image cache invalidation 2025-09-24 08:05:22 -07:00
dependabot[bot] eea36f720a Bump axios in the npm_and_yarn group across 1 directory (#1145)
Bumps the npm_and_yarn group with 1 update in the / directory: [axios](https://github.com/axios/axios).


Updates `axios` from 1.9.0 to 1.12.0
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.9.0...v1.12.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.12.0
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-23 13:25:52 -07:00
dependabot[bot] 76350ed5af Bump vite in the npm_and_yarn group across 1 directory (#1115)
Bumps the npm_and_yarn group with 1 update in the / directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 6.3.5 to 6.3.6
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.3.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.3.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.3.6
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-23 12:51:06 -07:00
Gabriele Mancini 4f38e16857 Feature: added playlist duration badge (#1130) 2025-09-23 12:45:08 -07:00
Malachi Soord 8a3edb71df feat: add semantic selectors for now-playing media (#1138)
* feat: add semantic selectors for now-playing media

This change adds unique class names to the elements that display the currently playing media information. This makes it easier for extension developers to parse the DOM and understand what media is playing.

The following classes have been added:
- `media-player`: The main player container.
- `player-cover-art`: The cover art of the playing track.
- `song-title`: The title of the playing track.
- `song-artist`: The artist of the playing track.
- `song-album`: The album of the playing track.
- `player-state-playing`/`player-state-paused`: The state of the player.
- `elapsed-time`: The elapsed time of the playing track.
- `total-duration`: The total duration of the playing track.

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2025-09-23 12:44:22 -07:00
jeffvli 55e35e9b24 set default body background to #000 2025-09-22 18:24:04 -07:00
Gabriele Mancini 6abdbd2f3e Feature: added silent song notification setting (#1129)
* feat: added silent song notification
2025-09-17 21:06:59 -07:00
Kendall Garner 1d46cd5ff9 client-side only sort for all playlists (#1125)
* initial client-side only sort for all playlists

* allow reordering jellyfin (assume it works properly) and navidrome

* on playlist page, add to queue by sort order
2025-09-17 21:06:30 -07:00
Kendall Garner d68165dab5 move title to default layout 2025-09-15 20:10:56 -07:00
Kendall Garner dad80adb8b raise window on mpris raise 2025-09-15 19:31:10 -07:00
jeffvli 4134af0340 update to v0.20.1 2025-09-10 21:28:13 -07:00
Hosted Weblate 29a43ca185 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-09-11 05:49:32 +02:00
Hosted Weblate e452f86170 Translated using Weblate (Slovak)
Currently translated at 100.0% (699 of 699 strings)

Translated using Weblate (Slovak)

Currently translated at 81.2% (568 of 699 strings)

Translated using Weblate (Slovak)

Currently translated at 78.3% (548 of 699 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: peter cerny <posli.to.semka@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sk/
Translation: feishin/Translation
2025-09-11 05:49:32 +02:00
Hosted Weblate ec765dca6a Translated using Weblate (French)
Currently translated at 100.0% (699 of 699 strings)

Translated using Weblate (French)

Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Dylan MONTIGAUD <dylanmontigaud17@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-09-11 05:49:31 +02:00
Hosted Weblate 64a3752b54 Translated using Weblate (Italian)
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Marco Ciotola <github@ciotola.dev>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translation: feishin/Translation
2025-09-11 05:49:30 +02:00
Hosted Weblate 24069d285f Translated using Weblate (Czech)
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-09-11 05:49:30 +02:00
Hosted Weblate 77fe886da4 Translated using Weblate (Catalan)
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ondo <SparkyOndo@proton.me>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ca/
Translation: feishin/Translation
2025-09-11 05:49:29 +02:00
Hosted Weblate ef16e1403d Translated using Weblate (Turkish)
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Mücahit Kaya <kaya-mucahit@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/tr/
Translation: feishin/Translation
2025-09-11 05:49:28 +02:00
jeffvli ff6dda7b06 prevent width overflow on lyrics container (#1106) 2025-09-10 20:49:15 -07:00
Jeff 479aa2e22d Merge pull request #1122 from jeffvli/properly-handle-context-menu-close
fix(context menu): Properly handle click outside, and show initial rating
2025-09-10 20:39:31 -07:00
jeffvli ab8c3ad0ec handle initial rating for multiple items in context menu 2025-09-10 20:32:34 -07:00
Kendall Garner dc03a432fe add initial rating when a single item is provided in context menu 2025-09-10 20:20:56 -07:00
Kendall Garner 751ad55d02 remove all node selectors in useClickOutside 2025-09-10 17:49:13 -07:00
Kendall Garner 78dc89303d show right control rating for subsonic servers 2025-09-10 17:27:07 -07:00
Jeff 4328d8860e Merge pull request #1113 from maximelafarie/fix/darwin-top-bar
fix: electron menu bar for darwin devices
2025-09-10 00:43:59 -07:00
Maxime LAFARIE 58a36b3bba fix: electron menu bar for darwin 2025-09-10 09:36:19 +02:00
Jeff 618e5d8da8 Merge pull request #1114 from maximelafarie/feature/one-click-context-menu
feat: add context menu on left controls and sidebar image
2025-09-09 19:19:09 -07:00
Jeff be6ec49cfa Merge pull request #1107 from mihawk90/now-playing-reformat
cleanup notification text
2025-09-09 19:00:19 -07:00
Maxime LAFARIE 65ecdc7666 feat: add context menu on left controls and sidebar image 2025-09-09 23:38:39 +02:00
Tarulia da42fd78d2 cleanup notification text 2025-09-08 17:20:03 +02:00
Kendall Garner c36735575f actually allow url('data:) in custom css 2025-09-06 19:28:15 -07:00
jeffvli 854222d2fa use consistent height calculation for sidebar scrollarea 2025-09-06 18:34:13 -07:00
jeffvli cd0a8d0fec revert min-height of library header
- causes issues with the positioning of the image at minimum size
2025-09-06 18:25:34 -07:00
jeffvli ed6376d99b update to 0.20.0 2025-09-06 17:24:12 -07:00
Hosted Weblate a6a51946f1 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-09-07 02:14:39 +02:00
Hosted Weblate 6e5acfa9da Translated using Weblate (Slovak)
Currently translated at 58.9% (412 of 699 strings)

Translated using Weblate (Slovak)

Currently translated at 57.0% (396 of 694 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: peter cerny <posli.to.semka@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sk/
Translation: feishin/Translation
2025-09-07 02:14:39 +02:00
Hosted Weblate 2c7fda63d3 Translated using Weblate (French)
Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: Dylan MONTIGAUD <dylanmontigaud17@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-09-07 02:14:39 +02:00
Hosted Weblate cf72016575 Translated using Weblate (Spanish)
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-09-07 02:14:39 +02:00
jeffvli 6368137815 move inView ref to ImageContainer component
- the separate outer component is unneeded and affects the positioning of some components which rely on the ImageContainer's styling
2025-09-06 17:14:30 -07:00
jeffvli ea122f5a4f add theme stylesheet loader 2025-09-06 03:02:58 -07:00
jeffvli bb7d561d0f adjust min-height on library header to better match minimum size 2025-09-06 01:21:06 -07:00
jeffvli 6dea9196a4 fix various light theme issues 2025-09-06 01:19:16 -07:00
jeffvli 4a28e7230a add hotkey to navigate to home route (#1074) 2025-09-06 01:01:48 -07:00
jeffvli b00305cc86 add setting to prevent sleep on playback (#1072) 2025-09-06 00:56:06 -07:00
jeffvli 40fb5ba916 add show album / album artist context menu items (#1105) 2025-09-06 00:45:59 -07:00
Kendall Garner 2cf0027419 only show translation when api key and provider are picked, and fix eslint vscode 2025-09-05 19:55:58 -07:00
Kendall Garner c81bd93d04 remove unnecessary console log 2025-09-05 05:51:28 -07:00
jeffvli 229f9e984e fix position of sidebar image when using custom windowbar 2025-09-05 01:17:00 -07:00
jeffvli e1e0670350 remove unused file
- broke on electron v37 due to File.path deprecated
2025-09-05 01:00:51 -07:00
jeffvli 20debb099d remove electron file menu (#1041) 2025-09-05 00:16:49 -07:00
jeffvli 99f9cc5968 bump to electron v37 2025-09-04 21:52:17 -07:00
jeffvli 53b4a2ee8a bump to mantine v8.2.8 2025-09-04 21:42:13 -07:00
jeffvli 0b59a54f04 remove debug tools 2025-09-04 21:18:23 -07:00
jeffvli f85ce9703f add catalan language to config 2025-09-04 21:17:13 -07:00
jeffvli cf3fd53bc1 add portugese language to config 2025-09-04 21:17:13 -07:00
Kendall Garner 871923a977 Merge branch 'development' of github.com:jeffvli/feishin into development 2025-09-04 21:16:08 -07:00
Kendall Garner c21f7df7b2 fix share date setting, notification, lint fix 2025-09-04 21:15:42 -07:00
jeffvli c83f27ce14 add turkish language to config (#1087) 2025-09-04 21:14:54 -07:00
jeffvli 53499e2579 fix clickoutside on main context menu 2025-09-04 20:48:15 -07:00
jeffvli cbbf2db087 remove nested rating menu 2025-09-04 20:37:59 -07:00
Kendall Garner dd60634a40 exclude missing for more fields 2025-09-04 19:53:41 -07:00
jeffvli 54932fee86 fix context menu stuck on rating hover (#1079) 2025-09-04 19:49:25 -07:00
jeffvli 878e0007d9 fix typo 2025-09-04 19:38:17 -07:00
Jeff 2260c0c02b Merge pull request #1002 from jeffvli/react-image-lazy-loaded
Use lazy loading (react-intersection-observer) for image loading
2025-09-03 21:43:55 -07:00
Hosted Weblate dd3285544e Translated using Weblate (Norwegian Bokmål)
Currently translated at 54.8% (376 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: klodrik <klodrik@zoominn.no>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/nb_NO/
Translation: feishin/Translation
2025-09-04 03:29:47 +00:00
Hosted Weblate f3c674fb20 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-09-04 03:29:46 +00:00
Hosted Weblate 6e0ae3ba92 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (685 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: York <goog10216922@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hant/
Translation: feishin/Translation
2025-09-04 03:29:46 +00:00
Hosted Weblate c76cad9727 Translated using Weblate (Slovak)
Currently translated at 53.8% (374 of 694 strings)

Added translation using Weblate (Slovak)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: peter cerny <posli.to.semka@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sk/
Translation: feishin/Translation
2025-09-04 03:29:45 +00:00
Hosted Weblate 3c29004e28 Translated using Weblate (Finnish)
Currently translated at 100.0% (685 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-09-04 03:29:44 +00:00
Hosted Weblate b08050d9ff Translated using Weblate (French)
Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (French)

Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (French)

Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (French)

Currently translated at 100.0% (685 of 685 strings)

Co-authored-by: Dylan MONTIGAUD <dylanmontigaud17@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Co-authored-by: mrchonks <chonkstv@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-09-04 03:29:44 +00:00
Hosted Weblate 908d5dde0f Translated using Weblate (Spanish)
Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-09-04 03:29:43 +00:00
Hosted Weblate 0540b224ec Translated using Weblate (Dutch)
Currently translated at 36.3% (252 of 694 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Joren-vanGoethem <jorenvangoethem@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/nl/
Translation: feishin/Translation
2025-09-04 03:29:42 +00:00
Hosted Weblate d0a2583edb Translated using Weblate (Polish)
Currently translated at 98.3% (674 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Piotr Łoboda <loboda4450@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2025-09-04 03:29:42 +00:00
Hosted Weblate 97ca234015 Translated using Weblate (Portuguese)
Currently translated at 61.1% (419 of 685 strings)

Added translation using Weblate (Portuguese)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt/
Translation: feishin/Translation
2025-09-04 03:29:41 +00:00
Hosted Weblate b07395c12b Translated using Weblate (Czech)
Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (685 of 685 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-09-04 03:29:40 +00:00
Hosted Weblate d8a10c8841 Translated using Weblate (Catalan)
Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Catalan)

Currently translated at 95.0% (651 of 685 strings)

Translated using Weblate (Catalan)

Currently translated at 88.7% (608 of 685 strings)

Translated using Weblate (Catalan)

Currently translated at 88.7% (608 of 685 strings)

Translated using Weblate (Catalan)

Currently translated at 49.0% (336 of 685 strings)

Translated using Weblate (Catalan)

Currently translated at 49.0% (336 of 685 strings)

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Catalan)

Currently translated at 47.4% (325 of 685 strings)

Added translation using Weblate (Catalan)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Isaac Miró <isaac.miro.garcia@gmail.com>
Co-authored-by: Ondo <SparkyOndo@proton.me>
Co-authored-by: Àlex Bravo <alexbravobosch@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ca/
Translation: feishin/Translation
2025-09-04 03:29:40 +00:00
Hosted Weblate e112d0acbf Translated using Weblate (German)
Currently translated at 87.7% (601 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Trrevvoorr <trevinofficial@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2025-09-04 03:29:39 +00:00
Hosted Weblate 8ca0a207d4 Translated using Weblate (Tamil)
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Tamil)

Currently translated at 99.8% (684 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ta/
Translation: feishin/Translation
2025-09-04 03:29:38 +00:00
Hosted Weblate 4950ce1aed Translated using Weblate (Turkish)
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Turkish)

Currently translated at 54.8% (376 of 685 strings)

Translated using Weblate (Turkish)

Currently translated at 51.5% (353 of 685 strings)

Translated using Weblate (Turkish)

Currently translated at 31.5% (216 of 685 strings)

Added translation using Weblate (Turkish)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mücahit Kaya <kaya-mucahit@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/tr/
Translation: feishin/Translation
2025-09-04 03:29:38 +00:00
Jeff 471d35dd70 Merge pull request #1055 from jeffvli/dependabot/npm_and_yarn/npm_and_yarn-5a0513363d
Bump tmp from 0.2.3 to 0.2.4 in the npm_and_yarn group across 1 directory
2025-09-03 20:29:31 -07:00
Kendall Garner f5af1c314c add image loader/unloader and only toggle source 2025-09-03 19:56:51 -07:00
Kendall Garner 1aac1a6361 Merge branch 'development' into react-image-lazy-loaded 2025-09-03 19:47:53 -07:00
Jeff 003e71d974 Merge pull request #1101 from ch-rit/fix-hiding-toast
fixed hiding the toast after content is loaded
2025-09-03 18:49:48 -07:00
Jeff 94b2668384 Merge pull request #1095 from johnson-dave/bad_encoding_autoplay
fix: ensure autoplay on metadata duration mismatch causing decoding error
2025-09-03 18:43:54 -07:00
ch-rit 039e553aa0 fixed hiding the toast after content is loaded 2025-09-03 19:04:36 +02:00
Jeff 755a09ceec Merge pull request #1092 from ch-rit/fix-genre-list
fixed the api call to get musicgenres
2025-09-03 01:30:53 -07:00
Jeff 60c94c2299 Merge pull request #1086 from hansyulian/feature/improve-add-to-playlist-ux
Feature: improve add to playlist UX
2025-09-03 01:25:41 -07:00
Dave Johnson 59e01f90e8 fix: ensure autoplay on bad encoding 2025-09-01 09:23:39 +01:00
Jeff 59065d24bc Merge pull request #1034 from Lyall-A/private-mode
add private mode toggle to app menu
2025-08-27 22:02:28 -07:00
Lyall 2271c211cb display private mode status 2025-08-28 05:48:21 +01:00
Jeff 7394d639e2 Merge pull request #1044 from Der-Penz/development
fix song getting added twice to queue when using tab navigation in command palette
2025-08-27 21:05:47 -07:00
Jeff 352a8e71e6 Merge pull request #1037 from vimaexd/discord-displaytype
implement discord status types
2025-08-27 21:00:52 -07:00
Christoph Ritzer 377a3ea8ab fixed the api call to get musicgenres 2025-08-26 17:14:17 +02:00
Hans Yulian 35b869ee7b feature: improve add to playlist UX 2025-08-23 06:00:17 +07:00
dependabot[bot] 618d27ffc1 Bump tmp in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [tmp](https://github.com/raszi/node-tmp).


Updates `tmp` from 0.2.3 to 0.2.4
- [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/raszi/node-tmp/compare/v0.2.3...v0.2.4)

---
updated-dependencies:
- dependency-name: tmp
  dependency-version: 0.2.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-06 17:36:57 +00:00
DerPenz 24b9bf210c fix song getting added twice to queue 2025-08-03 17:19:07 +02:00
mae taylor 76770de7d8 feat: discord presence display type 2025-08-01 16:43:34 +01:00
mae taylor 7ff74b8d5e bump @xhayper/discord-rpc to 1.3.0 2025-08-01 15:50:53 +01:00
Lyall 7423b71a65 change text 2025-07-31 16:26:05 +01:00
Lyall a44ad66d46 add private mode toggle to app menu 2025-07-31 16:12:03 +01:00
jeffvli 5ab0eba23e update to 0.19.0 2025-07-30 19:53:07 -07:00
jeffvli 08fc307516 attempt to catch network errors to prevent credential invalidation 2025-07-30 19:51:46 -07:00
Hosted Weblate e5adc0caa9 Translated using Weblate (Norwegian Bokmål)
Currently translated at 53.4% (365 of 683 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 53.4% (365 of 683 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: klodrik <klodrik@zoominn.no>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/nb_NO/
Translation: feishin/Translation
2025-07-31 04:11:35 +02:00
Hosted Weblate 7f0bdf20fc Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (683 of 683 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-07-31 04:11:34 +02:00
Hosted Weblate deb89ef87d Translated using Weblate (French)
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (French)

Currently translated at 100.0% (683 of 683 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-07-31 04:11:34 +02:00
Hosted Weblate 9751e22db4 Translated using Weblate (Spanish)
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (683 of 683 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-07-31 04:11:33 +02:00
Hosted Weblate 6128470a47 Translated using Weblate (Czech)
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (683 of 683 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-07-31 04:11:32 +02:00
Jeff ea79885ef5 Merge pull request #1030 from jeffvli/dependabot/npm_and_yarn/npm_and_yarn-373e2693b3
Bump @eslint/plugin-kit from 0.3.3 to 0.3.4 in the npm_and_yarn group across 1 directory
2025-07-30 21:11:24 -05:00
dependabot[bot] 84fd6e482d Bump @eslint/plugin-kit in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [@eslint/plugin-kit](https://github.com/eslint/rewrite/tree/HEAD/packages/plugin-kit).


Updates `@eslint/plugin-kit` from 0.3.3 to 0.3.4
- [Release notes](https://github.com/eslint/rewrite/releases)
- [Changelog](https://github.com/eslint/rewrite/blob/main/packages/plugin-kit/CHANGELOG.md)
- [Commits](https://github.com/eslint/rewrite/commits/plugin-kit-v0.3.4/packages/plugin-kit)

---
updated-dependencies:
- dependency-name: "@eslint/plugin-kit"
  dependency-version: 0.3.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-30 02:24:51 +00:00
Jeff 904f05ff61 Merge pull request #1021 from jeffvli/dependabot/npm_and_yarn/npm_and_yarn-e04d5d616f
Bump form-data from 4.0.2 to 4.0.4 in the npm_and_yarn group across 1 directory
2025-07-29 21:23:23 -05:00
Jeff e78ec7688a Merge pull request #1024 from Der-Penz/development
Support tab navigation on ActionIcons in command palette
2025-07-29 21:22:47 -05:00
jeffvli f43de7f23c remove version from linux artifactName (#1020) 2025-07-29 19:18:27 -07:00
Jeff 07532ca55a Merge pull request #1018 from Lyall-A/fix-discord-disappearing
fix discord status clearing when song loops
2025-07-29 21:15:37 -05:00
Jeff 040a805f5f Merge pull request #1023 from chenqimiao/development
Add qm-music to an OpenSubsonic compatible server list
2025-07-29 21:04:39 -05:00
DerPenz 33af5e625b support tab navigation on ActionIcons in command palette 2025-07-26 14:01:05 +02:00
Qimiao Chen bdedcb883d introduce qm-music in readme 2025-07-25 18:22:34 +08:00
dependabot[bot] e842a75722 Bump form-data in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [form-data](https://github.com/form-data/form-data).


Updates `form-data` from 4.0.2 to 4.0.4
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v4.0.2...v4.0.4)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 4.0.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-25 03:38:33 +00:00
dependabot[bot] d28054cc7f Bump @eslint/plugin-kit in the npm_and_yarn group across 1 directory (#1014)
Bumps the npm_and_yarn group with 1 update in the / directory: [@eslint/plugin-kit](https://github.com/eslint/rewrite/tree/HEAD/packages/plugin-kit).


Updates `@eslint/plugin-kit` from 0.3.1 to 0.3.3
- [Release notes](https://github.com/eslint/rewrite/releases)
- [Changelog](https://github.com/eslint/rewrite/blob/main/packages/plugin-kit/CHANGELOG.md)
- [Commits](https://github.com/eslint/rewrite/commits/plugin-kit-v0.3.3/packages/plugin-kit)

---
updated-dependencies:
- dependency-name: "@eslint/plugin-kit"
  dependency-version: 0.3.3
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-25 03:37:07 +00:00
Lyall 41f8c34f6e fix discord status clearing when song loops 2025-07-22 10:23:02 +01:00
Kendall Garner 4b4df28641 add bit depth, sample rate 2025-07-13 07:12:13 -07:00
jeffvli 8b141d652c disable single attribute per line 2025-07-12 11:17:54 -07:00
Kendall Garner 92ed8e20c9 fix custom path 2025-07-12 07:21:34 -07:00
Kendall Garner 746ab8c2d9 large notification z-index 2025-07-11 19:21:52 -07:00
Kendall Garner 69341f4492 More typechecks on scrobble, use timeout on notification (#1004) 2025-07-10 13:53:40 +00:00
Kendall Garner 56130d8503 fix subsonic login error: use status instead 2025-07-08 16:42:30 -07:00
Kendall Garner 4407c8d424 convert query="" to query= for subsonic 2025-07-08 14:42:49 -07:00
Kendall Garner 58bb8e716e undo that change, remove magic numbers 2025-07-08 11:26:07 -07:00
Kendall Garner 0becfd4b59 subsonic limit to 500 2025-07-08 08:30:31 -07:00
jeffvli c94029012f update to v0.18.0 2025-07-08 00:48:01 -07:00
jeffvli 2d9176cd21 fix click propagation on right controls 2025-07-08 00:46:50 -07:00
jeffvli e28dad3f84 add code to language select label 2025-07-08 00:11:37 -07:00
jeffvli 60d3eec8f7 add sl to i18n config 2025-07-08 00:11:20 -07:00
Hosted Weblate 62f9d064d9 Translated using Weblate (Slovenian)
Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 9.1% (62 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 9.1% (62 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 9.1% (62 of 680 strings)

Added translation using Weblate (Slovenian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Martin Stojanoski <martin.stojanoski2000@gmail.com>
Co-authored-by: mytja <mamnju21@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sl/
Translation: feishin/Translation
2025-07-08 08:39:51 +02:00
Hosted Weblate 196b9be65b Translated using Weblate (French)
Currently translated at 100.0% (680 of 680 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-07-08 08:39:50 +02:00
Hosted Weblate 587ce68018 Translated using Weblate (Italian)
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (680 of 680 strings)

Co-authored-by: Daivy <reale805@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translation: feishin/Translation
2025-07-08 08:39:49 +02:00
Hosted Weblate 1ec6176b77 Translated using Weblate (Portuguese (Brazil))
Currently translated at 61.6% (419 of 680 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Renan <renan1211@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2025-07-08 08:39:49 +02:00
jeffvli a5f28e49eb fix click propagation on PlayButton 2025-07-07 23:20:10 -07:00
Gemini Wen 0b7d4bfb6a macOS: change window close behavior, like other macOS App (#999) 2025-07-07 23:00:21 -07:00
jeffvli 2492456b93 fix search on filtered list pages 2025-07-07 21:28:34 -07:00
jeffvli 1c22c9506e remove stale lock comments 2025-07-07 21:14:18 -07:00
Kendall Garner 49bb42a298 Use lazy loading (react-intersection-observer) for image loading 2025-07-07 20:11:32 -07:00
Kendall Garner e00aeb2b67 enable notify, simplify use-scrobble with types, remove unused check 2025-07-07 19:25:25 -07:00
Kendall Garner b219c900ca fix readme logo rendering 2025-07-06 21:37:00 -07:00
Kendall Garner 5eacb4e3cb ...lodash random uses inclusive on both ends 2025-07-06 21:26:30 -07:00
Kendall Garner a86d44a29e fix(queue): random start index when play shuffled center control is enabled, play mode is now, no start specified 2025-07-06 21:24:45 -07:00
Jeff b7a0b7f997 handle undefined options in GenericCell (#998) 2025-07-06 03:33:11 -07:00
Lyall cd2d531c54 Automatically reconnect to Discord RPC at interval (#996)
* initialize before setActivity
2025-07-06 00:34:26 -07:00
ENDzZ 19c8980784 Translation Display Normalization (#982) 2025-07-05 16:41:42 -07:00
Lyall a2e5f86eac fix navidrome filter labels (#995) 2025-07-05 16:31:35 -07:00
dependabot[bot] d8c93cadce Bump brace-expansion in the npm_and_yarn group across 1 directory (#955)
Bumps the npm_and_yarn group with 1 update in the / directory: [brace-expansion](https://github.com/juliangruber/brace-expansion).


Updates `brace-expansion` from 1.1.11 to 1.1.12
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-05 00:47:48 -07:00
Kendall Garner 35f87c8552 Fix ContextMenu star menu clicking (#987)
Resolves #985.
Currently, attempting to click on one of the `set rating` buttons is a no-op.
This is because it is considered "outside" the `ContextMenu`, which immediately closes it.
Pass in the same merged ref into the body of the `DropDown` component so that it is also treated as "inside".
2025-07-05 00:33:37 -07:00
Kendall Garner 4f7b0983ec port over ND stalebot (#991) 2025-07-02 21:55:02 -07:00
Kendall Garner 055d9ac5c1 use initial index for shuffling when availabe 2025-07-02 20:48:45 -07:00
Kendall Garner 039d008223 use fr plural setting translation from navidrome 2025-07-02 20:10:49 -07:00
Kendall Garner 2b8db9cfc1 fix table albumCount translation 2025-07-02 19:52:13 -07:00
Kendall Garner caa9448200 don't set sink on closed context 2025-07-02 19:19:51 -07:00
Kendall Garner 176a95a946 Compilation support for Jellyfin artist albums, misc other album filter fixes
- Jellyfin will use `ContributingArtistsId` (compilation), `AlbumArtistIds` (compilation is false), or `ArtistIds` (unspecified; all)
- Jellyfin can filter by compilation _only_ on the artist discography page
- Navidrome album filter fix for `defaultValue` display and prevent showing `tagQuery` 0 when querying
- Subsonic can filter by one or more artists in the album page. Sort is also applied on these items
- Bump genre/tag cache/stale time to 2/1 minutes
- Fix various cases where the album filter would display as active when it wasn't
2025-07-02 07:44:57 -07:00
Kendall Garner 6f5dd4881a join path with library path 2025-07-01 21:51:09 -07:00
Kendall Garner ce6aaa709f bugfix: handle table update when column is missing 2025-07-01 19:03:54 -07:00
Kendall Garner 217a4d65fd Merge branch 'development' of github.com:jeffvli/feishin into development 2025-07-01 17:34:32 -07:00
Kendall Garner b88671161a actually actually fix album list count for subsonic artists 2025-06-30 07:19:34 -07:00
jeffvli dde48335cd fix word-break overflow for CJK characters on lyrics 2025-06-30 00:47:13 -07:00
jeffvli 8611f08f54 right-align is-updated dialog buttons 2025-06-30 00:43:59 -07:00
Kendall Garner cd18e683bf yesnofilter null when not provided 2025-06-29 22:34:39 -07:00
Kendall Garner 286441c1b1 Merge branch 'development' of github.com:jeffvli/feishin into development 2025-06-29 22:30:36 -07:00
Kendall Garner 5456c2c2b8 Improve Jellyfin/Navidrome Album/Song filter, Navidrome artist recent release
- Use `compilation=false` for Navidrome recent releases with artist credit
- Add `YesNoSelect` (yes, no, undefined) for `favorite` for Navidrome/Jellyfin `album`/`track`, and Navidrome `compilation`
- Fix folderButton translation
2025-06-29 22:14:06 -07:00
jeffvli 5cd4fc227e update to v0.17.0 2025-06-29 21:36:36 -07:00
Hosted Weblate 737d672918 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (676 of 676 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-06-30 05:35:41 +02:00
Hosted Weblate a6ac4c8f67 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 76.9% (523 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hant/
Translation: feishin/Translation
2025-06-30 05:35:41 +02:00
Hosted Weblate c9217827ab Translated using Weblate (Serbian)
Currently translated at 75.8% (516 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sr/
Translation: feishin/Translation
2025-06-30 05:35:40 +02:00
Hosted Weblate 0ff8fad071 Translated using Weblate (Finnish)
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Finnish)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Finnish)

Currently translated at 100.0% (680 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-06-30 05:35:39 +02:00
Hosted Weblate f3cb15eae2 Translated using Weblate (French)
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (French)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (French)

Currently translated at 100.0% (676 of 676 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-06-30 05:35:39 +02:00
Hosted Weblate 5b34b287e2 Translated using Weblate (Spanish)
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (676 of 676 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-06-30 05:35:38 +02:00
Hosted Weblate dc461a253f Translated using Weblate (Indonesian)
Currently translated at 96.6% (657 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/id/
Translation: feishin/Translation
2025-06-30 05:35:37 +02:00
Hosted Weblate 958416af4c Translated using Weblate (Italian)
Currently translated at 75.7% (515 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translation: feishin/Translation
2025-06-30 05:35:37 +02:00
Hosted Weblate 1dd8eec4a5 Translated using Weblate (Polish)
Currently translated at 96.6% (657 of 680 strings)

Translated using Weblate (Polish)

Currently translated at 96.6% (657 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2025-06-30 05:35:36 +02:00
Hosted Weblate b263db5483 Translated using Weblate (Hungarian)
Currently translated at 30.5% (208 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/hu/
Translation: feishin/Translation
2025-06-30 05:35:35 +02:00
Hosted Weblate 528f60c5f3 Translated using Weblate (Czech)
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (676 of 676 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-06-30 05:35:35 +02:00
Hosted Weblate 007b0166ab Translated using Weblate (Japanese)
Currently translated at 75.7% (515 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ja/
Translation: feishin/Translation
2025-06-30 05:35:34 +02:00
Hosted Weblate d3fb2374ff Translated using Weblate (Russian)
Currently translated at 92.5% (629 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/
Translation: feishin/Translation
2025-06-30 05:35:34 +02:00
Hosted Weblate 676c091d28 Translated using Weblate (English)
Currently translated at 100.0% (680 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/en/
Translation: feishin/Translation
2025-06-30 05:35:33 +02:00
Hosted Weblate 58b7572a8b Translated using Weblate (German)
Currently translated at 86.0% (585 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2025-06-30 05:35:32 +02:00
Hosted Weblate fc77c32a0e Translated using Weblate (Tamil)
Currently translated at 96.6% (657 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ta/
Translation: feishin/Translation
2025-06-30 05:35:32 +02:00
Kendall Garner b5bdea1845 actually fix subsonic album count 2025-06-29 20:35:06 -07:00
jeffvli 8eb591bd08 properly handle overflow on sidebar items (#971) 2025-06-29 18:56:46 -07:00
jeffvli 88be98f703 cleanup unneeded div wrapper on lyric lines 2025-06-29 18:31:43 -07:00
jeffvli df6b6d514d update netease translation lyric line handling (#979)
- lyric should be appended to the original lyric line with a custom splitter
- the custom splitter is now handled in LyricLine
2025-06-29 18:29:59 -07:00
Lyall b6d902e425 fix: discord presence not clearing after pausing player (#973)
* add show rich presence when paused option
2025-06-28 13:46:12 -07:00
jeffvli d922d8b034 fix sidebar height when using custom window bar 2025-06-28 13:42:33 -07:00
jeffvli f4db8fdb84 fix background color of collapsed sidebar 2025-06-28 13:34:16 -07:00
Lyall 81ca6937bc add preserve pitch option (#972) 2025-06-28 13:18:08 -07:00
Kendall Garner c382e01f64 fix regex in proxy 2025-06-28 07:29:42 -07:00
Kendall Garner fb80b66310 update remote regex 2025-06-28 06:48:04 -07:00
Kendall Garner 63e3b97bca log -> error, remove unnecesary logs 2025-06-26 21:17:59 -07:00
Kendall Garner fb584b35a9 handle Navidrome login loop error 2025-06-26 21:14:20 -07:00
jeffvli bdc372636b update issue templates 2025-06-26 09:52:11 -07:00
jeffvli 2c5671cf38 update to v0.16.0 2025-06-26 01:39:47 -07:00
Hosted Weblate bd12fbecac Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (674 of 674 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-06-26 10:37:11 +02:00
Hosted Weblate c1d88ada91 Translated using Weblate (Finnish)
Currently translated at 100.0% (676 of 676 strings)

Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-06-26 10:37:11 +02:00
Hosted Weblate d6a3e1d90b Translated using Weblate (French)
Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (French)

Currently translated at 99.2% (669 of 674 strings)

Translated using Weblate (French)

Currently translated at 99.2% (669 of 674 strings)

Co-authored-by: Dylan MONTIGAUD <dylanmontigaud17@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-06-26 10:37:11 +02:00
Hosted Weblate 789c7f3d81 Translated using Weblate (Spanish)
Currently translated at 100.0% (674 of 674 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-06-26 10:37:11 +02:00
Hosted Weblate f3c785d0fa Translated using Weblate (German)
Currently translated at 86.7% (585 of 674 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Slincess <kisacikdevran0@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2025-06-26 10:37:10 +02:00
jeffvli 062c1c2b61 decrease brightness of header overlay on dark 2025-06-26 01:36:54 -07:00
jeffvli eb078d62cd more adjustments to styles on the fullscreen player 2025-06-26 01:36:42 -07:00
jeffvli c429ac9223 move fonts to assets folder 2025-06-26 01:36:16 -07:00
jeffvli bd26967ff2 fix word breaks on lyrics (#969) 2025-06-26 01:11:46 -07:00
jeffvli 620b810191 add option to set local lyric priority 2025-06-25 21:25:29 -07:00
jeffvli 64866c59bd adjust styles on fullscreen player image section
- fix image transition
- fix image aspect ratio
- adjust text sizes and shadow
2025-06-25 20:40:45 -07:00
jeffvli 0afbe4c0a2 improve visibility of fullscreen player buttons 2025-06-25 19:53:49 -07:00
jeffvli 6782cd0dcc re-add presence animation when collapsing sidebar image 2025-06-25 19:48:59 -07:00
jeffvli 8f585a5be9 adjust styles to better support light theme 2025-06-25 19:44:28 -07:00
jeffvli ac0c396712 fix sidebar image height when using Windows or macOS window bar 2025-06-25 09:02:22 -07:00
Kendall Garner b989a66991 only show owned playlists on playlist sidebar 2025-06-25 08:19:22 -07:00
Kendall Garner 2814b623e7 fix player button light theme and tooltip 2025-06-25 08:05:57 -07:00
jeffvli 7d29a692ef remove unused import 2025-06-24 22:34:06 -07:00
jeffvli 3f9eb446f7 update to v0.15.1 2025-06-24 22:27:12 -07:00
jeffvli d8f7b49ab6 increase size of play button icon 2025-06-24 22:22:15 -07:00
jeffvli 35e70a3eff fix synchronized lyric styles not applying 2025-06-24 22:20:26 -07:00
jeffvli ef9c16e940 attempt fix on docker build 2025-06-24 22:16:16 -07:00
Kendall Garner 0b39c35132 make item modal links have heavier font width 2025-06-24 21:39:47 -07:00
Kendall Garner 9f5b4e5410 remove unused length in visualizer 2025-06-24 21:20:41 -07:00
jeffvli dbf840b185 fix actionbar not growing to width of container 2025-06-24 20:33:50 -07:00
jeffvli e0f0524eb9 adjust button styles on playerbar 2025-06-24 20:31:33 -07:00
jeffvli 8598313d12 fix styling on web titlebar style 2025-06-24 20:14:15 -07:00
jeffvli c84dd648ea various clean up and fixes 2025-06-24 18:43:37 -07:00
jeffvli 01885c1a9b decrease spacing on playerbar details 2025-06-24 18:38:10 -07:00
jeffvli 5121f57171 use native img for sidebar image 2025-06-24 18:38:10 -07:00
jeffvli 3d7ee10328 add standalone fast-average-color function 2025-06-24 18:38:10 -07:00
jeffvli 4db47b4d37 switch image loading to lazy by default 2025-06-24 18:38:10 -07:00
jeffvli 786a693526 add animation presets 2025-06-24 18:38:10 -07:00
jeffvli 1faef6a1a7 fix unused var on visualizer 2025-06-24 18:38:10 -07:00
jeffvli 1598642389 re-add page fade in 2025-06-24 18:38:10 -07:00
Kendall Garner 8c4a7f4f91 only show lastfm/listenbrainz if configured 2025-06-24 17:58:43 -07:00
jeffvli 5878f89339 set sidebar items open by default 2025-06-24 15:04:22 -07:00
jeffvli 4acbb1820d set fullscreen player badges to transparent 2025-06-24 14:52:40 -07:00
jeffvli 01f5745629 update visualizer sizing and z-index 2025-06-24 14:52:27 -07:00
jeffvli 73dd781a88 fix regression on image blur in fullscreen player 2025-06-24 14:47:50 -07:00
jeffvli d777be6251 increase minRows on custom css input 2025-06-24 14:42:16 -07:00
jeffvli 6689e84f67 fix and update remote design 2025-06-24 14:36:14 -07:00
jeffvli ad533a1d9c update to v0.15.0 2025-06-24 00:07:51 -07:00
Hosted Weblate b691891e62 Translated using Weblate (Finnish)
Currently translated at 100.0% (668 of 668 strings)

Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-06-24 09:06:37 +02:00
Hosted Weblate 53fa265af9 Translated using Weblate (Spanish)
Currently translated at 100.0% (668 of 668 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-06-24 09:06:36 +02:00
Hosted Weblate 55f6a382d4 Translated using Weblate (Czech)
Currently translated at 100.0% (668 of 668 strings)

Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-06-24 09:06:36 +02:00
Hosted Weblate 9c30acdd56 Translated using Weblate (Portuguese (Brazil))
Currently translated at 62.1% (414 of 666 strings)

Co-authored-by: Brunno Hofmann <brunno.hofmann@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2025-06-24 09:06:35 +02:00
jeffvli b29d3e7f78 disable netease translation by default 2025-06-24 00:06:19 -07:00
Jeff c1330d92b2 Migrate to Mantine v8 and Design Changes (#961)
* mantine v8 migration

* various design changes and improvements
2025-06-24 00:04:36 -07:00
Benjamin bea55d48a8 discord rpc changes (#958) 2025-06-21 12:38:06 -07:00
et21ff ae41fe99bb lyrics: add translation lyrics for netease.ts (#951)
* lyrics: add translation lyrics for netease.ts
2025-06-21 12:19:23 -07:00
Pyx e3751229b6 update readme because subsonic is supported now (#960)
* Update README.md
2025-06-20 18:53:44 -07:00
Kendall Garner 87c9963354 fix subsonic album artist and album list count 2025-06-20 18:35:11 -07:00
Kendall Garner b7fb7c7f94 improve library header loading 2025-06-20 17:57:15 -07:00
Hosted Weblate b8ceb174b3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (666 of 666 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-06-11 02:38:13 +02:00
Hosted Weblate 48f085b0ac Translated using Weblate (Finnish)
Currently translated at 100.0% (666 of 666 strings)

Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-06-11 02:38:13 +02:00
Hosted Weblate dfc0639f95 Translated using Weblate (French)
Currently translated at 100.0% (666 of 666 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-06-11 02:38:13 +02:00
Hosted Weblate 80ffd1a925 Translated using Weblate (Spanish)
Currently translated at 100.0% (666 of 666 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-06-11 02:38:13 +02:00
Hosted Weblate c87bb65023 Translated using Weblate (Czech)
Currently translated at 100.0% (666 of 666 strings)

Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-06-11 02:38:13 +02:00
jeffvli 5ae21bd224 fix icon alignment for context menu items 2025-06-10 17:37:43 -07:00
jeffvli 12d293a74c remove trailing space 2025-06-10 17:34:00 -07:00
et21ff 62f4bb0d7b fix(player): Improve MPV stability and seek performance (#953) 2025-06-10 17:22:40 -07:00
Pyx 9f11061433 disable visualizer background (#949)
* disable visualizer background
2025-06-09 18:14:59 -07:00
Hans Yulian aba64b10d0 Feature: Shuffle Button (#941) 2025-06-09 02:02:03 -07:00
jeffvli c20e30e387 include sourcemap in vite build 2025-06-09 01:28:27 -07:00
jeffvli c4b4300845 fix lyrics offset type conversion (#948) 2025-06-09 01:28:27 -07:00
Kendall Garner f1e5ed41bc also gate by external link 2025-06-07 20:54:23 -07:00
Kendall Garner 9b79502022 config option for listenbrainz/lastfm links 2025-06-07 20:36:41 -07:00
jeffvli 636c227a83 replace and fix position of current track play icon 2025-06-03 01:05:19 -07:00
jeffvli e8a94a0b1c bump to node 23 image 2025-06-02 21:39:12 -07:00
jeffvli fa93dfd771 add pnpm install to alpine image 2025-06-02 21:37:27 -07:00
jeffvli 8629994eb6 fix docker build issues
- pnpm-lock instead of package-lock
- fix build out directory
2025-06-02 21:32:00 -07:00
jeffvli c54423a667 fix wrong lockfile copy 2025-06-02 21:30:57 -07:00
jeffvli d28fc9f630 allow workflow_dispath on docker deploy 2025-06-02 21:23:07 -07:00
jeffvli bd2b39fdfb re-add ng.conf.template file 2025-06-02 21:20:57 -07:00
jeffvli 2912cd72ef fix build artifactName to include arch 2025-06-02 20:49:55 -07:00
jeffvli 9d31d952b7 update to v0.14.0 2025-06-02 20:34:30 -07:00
jeffvli 8f692b6f4d call remote shutdown on app quit 2025-06-02 20:32:05 -07:00
jeffvli 7562c619d2 fix mpv path save dialog (#930) (#940) 2025-06-02 20:17:55 -07:00
Kendall Garner 6b91ee4a25 fix album genre filter 2025-06-02 19:38:39 -07:00
Kendall Garner 9e689468f9 info for playlists, show id, fix playlist duration 2025-06-02 00:26:36 -07:00
Kendall Garner 1cda4363ef add lockfile 2025-05-28 22:00:26 -07:00
Kendall Garner b6941df7a7 fix editorconfig and downgrade react player back to lazy 2025-05-28 21:57:47 -07:00
jeffvli 608b322f9e remove maintenance notice 2025-05-28 14:49:32 -07:00
jeffvli daee582e92 fix web player playback
- add missing forwardRef on AudioPlayer component
- bump react-player to latest
2025-05-28 10:39:25 -07:00
jeffvli 6525a8a725 fix remote dev path 2025-05-27 18:28:52 -07:00
jeffvli ee1896c345 fix version number 2025-05-27 01:47:18 -07:00
Jeff ec625c2c65 Merge pull request #933 from jeffvli/experimental/vite
Migrate from Webpack to Vite
2025-05-26 18:10:48 -07:00
jeffvli 52e4423cf1 update readme with new pnpm scripts 2025-05-26 17:20:45 -07:00
jeffvli a9f7e808cb update the docker build for pnpm 2025-05-26 17:20:45 -07:00
jeffvli 9c26187b45 fixes for pnpm v10 2025-05-26 17:20:45 -07:00
jeffvli 90afa11f20 set custom userData path for dev 2025-05-26 17:20:45 -07:00
jeffvli 6463ea937b add vite build for web 2025-05-26 17:20:45 -07:00
jeffvli ac682428e6 various cleanup 2025-05-26 17:20:45 -07:00
jeffvli 48917547b2 add vite build for remote 2025-05-26 17:20:45 -07:00
jeffvli 74554d9725 use lowercase in package productName 2025-05-26 17:20:45 -07:00
jeffvli 0d42a6ea49 update workflows for new build 2025-05-26 17:20:45 -07:00
jeffvli faadff0211 migrate to pnpm 2025-05-26 17:20:44 -07:00
jeffvli 91715ebf7d change build dir 2025-05-26 17:20:28 -07:00
jeffvli 1808f160b4 clean up dependencies 2025-05-26 17:20:28 -07:00
jeffvli e10a92a5c2 add legacy-peer-deps default 2025-05-26 17:20:02 -07:00
jeffvli 930165d006 fix all imports for new structure 2025-05-26 17:20:02 -07:00
jeffvli 249eaf89f8 update linter rules 2025-05-26 17:18:56 -07:00
jeffvli bf1cddae9d remove unusued paths from tsconfig node 2025-05-26 17:18:56 -07:00
jeffvli 9db2e51d2d reorganize global types to shared directory 2025-05-26 17:18:56 -07:00
jeffvli 26c02e03c5 update package.json and electron builder 2025-05-26 17:18:56 -07:00
jeffvli 1cf587bc8f restructure files onto electron-vite boilerplate 2025-05-26 17:18:55 -07:00
Hosted Weblate 91ce2cd8a1 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (662 of 662 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-05-26 11:11:24 +02:00
Hosted Weblate 4f61e82068 Translated using Weblate (Finnish)
Currently translated at 100.0% (659 of 659 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-05-26 11:11:24 +02:00
Hosted Weblate 1e6673fabd Translated using Weblate (French)
Currently translated at 100.0% (662 of 662 strings)

Co-authored-by: KosmoMoustache <hosted.weblate.org@kosmo.ovh>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-05-26 11:11:24 +02:00
Hosted Weblate 02951c92af Translated using Weblate (Spanish)
Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (659 of 659 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-05-26 11:11:24 +02:00
Hosted Weblate 05f8fb3114 Translated using Weblate (Czech)
Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (659 of 659 strings)

Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-05-26 11:11:24 +02:00
jeffvli 169da10c1b fix release version 2025-05-26 02:11:14 -07:00
jeffvli 5a79fee77e use missing UTC transform on navidrome dates (#928) 2025-05-26 02:08:08 -07:00
jeffvli 7ef80f14b0 fix casing on filtered list route titels (#929) 2025-05-26 01:58:16 -07:00
jeffvli 36cc37e39f update to v0.13.0 2025-05-26 01:47:13 -07:00
Kendall Garner d4e7c6bd18 fix copypasta 2025-05-20 08:40:24 -07:00
Kendall Garner 90f79b4ae7 add multiselect with invalid data handling to jellyfin album 2025-05-18 18:27:17 -07:00
Kendall Garner cf74625bfc warn if a value in select no longer exists 2025-05-18 10:59:45 -07:00
Kendall Garner f068d6e4b8 actually add type to query key 2025-05-18 09:29:13 -07:00
Kendall Garner e1aa8d74f3 Tag filter support
- Jellyfin: Uses `/items/filters` to get list of boolean tags. Notably, does not use this same filter for genres. Separate filter for song/album
- Navidrome: Uses `/api/tags`, which appears to be album-level as multiple independent selects. Same filter for song/album
2025-05-18 09:23:52 -07:00
Kendall Garner b0d86ee5c9 Support tags, and better participants for servers
- Parses `tags` for Navidrome (mapping string: string[])
- Parses `Tags` (and fetches for it) for Jellyfin (map a string to empty, and display as a bool)
- Clean parsing of participants for Navidrome/Subsonic
- Only show `People` for Jellyfin, not clickable
2025-05-17 21:35:58 -07:00
Kendall Garner 89e27ec6ff remove console.log 2025-05-16 11:50:26 -07:00
Kendall Garner 39c714a137 navidrome cover art workaround 2025-05-15 19:10:15 -07:00
Kendall Garner a8fb7ff11e fullscreen header image on click 2025-05-14 08:25:02 -07:00
jeffvli 9b95f47a91 update to v0.12.7 2025-05-12 18:27:37 -07:00
Hosted Weblate 2267e9bc9d Translated using Weblate (Czech)
Currently translated at 100.0% (657 of 657 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-05-13 03:24:48 +02:00
Kendall Garner 089311c673 add migrate from v8 (#925) 2025-05-12 18:24:42 -07:00
Kendall Garner 773f349b66 don't show song count if not present for home carousel 2025-05-09 19:08:36 -07:00
Kendall Garner 3980c8ea97 save the package-logk.json changes as well 2025-05-08 08:23:58 -07:00
Kendall Garner 257a5ceef0 force xmljs to 0.5.0 2025-05-08 08:08:31 -07:00
jeffvli fb022891fe update to v0.12.6 2025-05-08 00:44:13 -07:00
Kendall Garner 5d9906b8f2 include album artist song/album count for jellyfin, and disable playing/adding playinsts for artists with no albums 2025-05-07 21:16:47 -07:00
jeffvli 6f7cb468b2 fix regression on subsonic album artist play 2025-05-07 20:59:16 -07:00
Kendall Garner 076693e969 Merge branch 'development' of github.com:jeffvli/feishin into development 2025-05-07 20:01:04 -07:00
Kendall Garner 781d8055b5 minor artist count fixes 2025-05-07 19:53:23 -07:00
jeffvli 960bb5c660 fix navigation to detail page on artist list 2025-05-07 19:40:54 -07:00
jeffvli 42bb2bf66f fix regression on album artist play button 2025-05-07 19:25:25 -07:00
jeffvli f03d88cd8c batch jellyfin song list requests when fetching by albumId (#922) 2025-05-07 01:42:32 -07:00
jeffvli 58f6535ba6 revert electron to gtk 3 (#923) 2025-05-07 01:28:54 -07:00
jeffvli 9a59ce3613 fix casing on artist albums title 2025-05-07 01:15:00 -07:00
jeffvli 6f37e13611 additional fix to sticky table header to account for native 2025-05-06 18:54:10 -07:00
jeffvli 3c494f1c72 update to v0.12.5 2025-05-06 18:27:02 -07:00
jeffvli ec0e7256cb fix set rating click on context menu (#900)
- star rating icon overriddes the pointer click event
2025-05-06 18:23:14 -07:00
jeffvli 262203b62d handle arrow keys in global hotkey (#913) 2025-05-06 15:19:34 -07:00
jeffvli 41bdc1a7b7 disable toast overlay blocking playerbar (#888) 2025-05-06 15:00:43 -07:00
jeffvli d35e73792f fix item playback buttons on search list (#885) 2025-05-06 14:50:59 -07:00
jeffvli 4a3604b1a8 handle playback on new artist list 2025-05-06 14:43:42 -07:00
jeffvli b9611589ba fix casing on some translation strings 2025-05-06 13:23:29 -07:00
jeffvli 12c517f0ff update to v0.12.4 2025-05-06 03:40:42 -07:00
Hosted Weblate 01884ab656 Translated using Weblate (Finnish)
Currently translated at 100.0% (657 of 657 strings)

Translated using Weblate (Finnish)

Currently translated at 77.3% (508 of 657 strings)

Translated using Weblate (Finnish)

Currently translated at 69.2% (455 of 657 strings)

Translated using Weblate (Finnish)

Currently translated at 64.9% (427 of 657 strings)

Translated using Weblate (Finnish)

Currently translated at 64.9% (427 of 657 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lunya <Lunya2@protonmail.com>
Co-authored-by: Ricky Tigg <ricky.tigg@gmail.com>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
Hosted Weblate 0ba830d5d7 Translated using Weblate (Persian)
Currently translated at 74.8% (492 of 657 strings)

Co-authored-by: Hadi <xhopeter@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fa/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
Hosted Weblate b08a0d178c Translated using Weblate (Spanish)
Currently translated at 100.0% (657 of 657 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
Hosted Weblate 9afa64b537 Translated using Weblate (Polish)
Currently translated at 100.0% (657 of 657 strings)

Translated using Weblate (Polish)

Currently translated at 93.4% (614 of 657 strings)

Translated using Weblate (Polish)

Currently translated at 92.2% (606 of 657 strings)

Co-authored-by: Adam Perkowski <adas1per@protonmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: skajmer <skajmer@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
Hosted Weblate be8bc74ab5 Translated using Weblate (Russian)
Currently translated at 95.7% (629 of 657 strings)

Translated using Weblate (Russian)

Currently translated at 95.2% (626 of 657 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rachel Podya <homicide@disroot.org>
Co-authored-by: zv0r <mount.dev.brain@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
Hosted Weblate 2f4e228fa1 Translated using Weblate (Portuguese (Brazil))
Currently translated at 61.1% (402 of 657 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Joao <joaohirasawaa@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
jeffvli 35ee7e4606 fix position of sticky table header when titlebar present 2025-05-06 03:27:30 -07:00
jeffvli b265f2817b bump to electron 36 (#921) 2025-05-06 02:58:22 -07:00
Kendall Garner 48af447838 fix entities version 2025-04-25 10:35:52 -07:00
Kendall Garner 397df0c9c6 npm update 2025-04-25 09:53:15 -07:00
Kendall Garner 68759a2613 artists fixes 2025-04-25 09:30:17 -07:00
Kendall Garner c376293f2f always add all artists to subsonic 2025-04-23 23:33:58 -07:00
Kendall Garner e84a4b20bc add artist list 2025-04-23 23:27:06 -07:00
Kendall Garner 14e9f6ac41 bump electronVersion 2025-04-22 07:41:56 -07:00
Kendall Garner 0115ecb59b fix repeat one/repeat all scrobble 2025-04-20 10:54:44 -07:00
Kendall Garner 1555b827ee fix: normalize artists with no album count 2025-03-10 14:20:19 -07:00
Kendall Garner 41c2a7da69 make artist stats for navidrome api sane 2025-03-09 19:21:16 -07:00
jeffvli 592376316f Update to v0.12.3 2025-03-09 17:06:40 -07:00
Kendall Garner c6d7dc0b32 prepare bfr changes (#882)
* prepare bfr changes

* contributors to subsonic/navidrome

* show performer roles

* Add BFR smart playlist fields

* Fix upload-artifact action to handle v4

---------

Co-authored-by: jeffvli <jeffvictorli@gmail.com>
2025-03-09 16:55:27 -07:00
Kendall Garner 571aacbaa0 Merge branch 'development' of github.com:jeffvli/feishin into development 2025-02-27 16:43:21 -08:00
Kendall Garner ef194424e3 support css variables in sanitize 2025-02-27 16:42:02 -08:00
jeffvli 233c24cea6 Update to v0.12.2 2025-01-24 23:19:55 -08:00
jeffvli b48b0b0d11 Fix page header overlay on fullscreen player (#867) 2025-01-24 17:37:58 -08:00
jeffvli 65fe42d30c Add new languages to config 2025-01-24 16:47:49 -08:00
jeffvli 90ae7130f6 Fix invalid args on nd normalize 2025-01-24 16:44:02 -08:00
jeffvli d866dd211a Bump electron from v31 -> v33 2025-01-24 16:44:02 -08:00
Hosted Weblate 81446561e0 Translated using Weblate (Norwegian Bokmål)
Currently translated at 47.4% (312 of 657 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 41.0% (270 of 657 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 30.2% (199 of 657 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 20.2% (133 of 657 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: klodrik <klodrik@zoominn.no>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/nb_NO/
Translation: feishin/Translation
2025-01-15 22:35:53 +01:00
Hosted Weblate 4ef7213cf5 Translated using Weblate (Finnish)
Currently translated at 59.8% (393 of 657 strings)

Translated using Weblate (Finnish)

Currently translated at 31.6% (208 of 657 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lauri Koo <late91@gmail.com>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-01-15 22:35:53 +01:00
Hosted Weblate b639d7bfab Translated using Weblate (Persian)
Currently translated at 64.6% (425 of 657 strings)

Translated using Weblate (Persian)

Currently translated at 62.7% (412 of 657 strings)

Translated using Weblate (Persian)

Currently translated at 39.2% (258 of 657 strings)

Co-authored-by: Hadi <xhopeter@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fa/
Translation: feishin/Translation
2025-01-15 22:35:53 +01:00
Hosted Weblate 35e0af5164 Translated using Weblate (French)
Currently translated at 100.0% (657 of 657 strings)

Co-authored-by: Dylan MONTIGAUD <dylanmontigaud17@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-01-15 22:35:53 +01:00
Hosted Weblate 86cca7fca5 Translated using Weblate (Indonesian)
Currently translated at 100.0% (657 of 657 strings)

Translated using Weblate (Indonesian)

Currently translated at 6.0% (40 of 657 strings)

Added translation using Weblate (Indonesian)

Co-authored-by: Fadilah Riczky <friczky@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/id/
Translation: feishin/Translation
2025-01-15 22:35:53 +01:00
Hosted Weblate 132ebb6b52 Translated using Weblate (Hungarian)
Currently translated at 31.6% (208 of 657 strings)

Added translation using Weblate (Hungarian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: WilliamNT <hwbendeguz@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/hu/
Translation: feishin/Translation
2025-01-15 22:35:53 +01:00
Hosted Weblate e23906582a Translated using Weblate (Tamil)
Currently translated at 100.0% (657 of 657 strings)

Added translation using Weblate (Tamil)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ta/
Translation: feishin/Translation
2025-01-15 22:35:53 +01:00
jeffvli e57232f89c fix array parameter parsing for subsonic client 2024-12-31 05:56:34 -08:00
ももぴ f0978365d4 fix: fetch album art via Last.fm should use album artist name (#855) 2024-12-19 20:31:44 -08:00
Penelope Gwen / Pogmommy ae65922253 decoded plaintext credentials before params get re-encoded in ssApiClient (#862) 2024-12-19 20:31:07 -08:00
jeffvli ca58551b94 Make client param on SS/ND queries consistent 2024-12-19 17:15:07 -08:00
jeffvli be0ebac362 Update to v0.12.1 2024-11-20 10:50:04 -08:00
Mitja Ševerkar 8eb8290fc4 Fix URL encoding on Subsonic (#850)
* Revert "Encode credential for subsonic stream/coverart (#841)"

This reverts commit 8ec4551b46.

* Properly URL encode credentials on Subsonic

Previous commit (8ec4551b46) has been reverted, as it has encoded even equal signs (=), and and signs (&), which should not have been encoded. Nextcloud Music has subsequently failed to receive separate username and password and has therefore failed whilst authenticating the user.

Example of URL beforehand:
https://cloud.example.com/index.php/apps/music/subsonic/rest/stream.view?id=track-4936&v=1.13.0&c=feishin_&u%3Dtest-test%40example.com%26p%3Dpassword

Example of URL now:
https://cloud.example.com/index.php/apps/music/subsonic/rest/stream.view?id=track-4936&v=1.13.0&c=feishin_&u=test-test%40example.com&p=password
2024-11-19 19:00:53 -08:00
jeffvli fac1d3fb62 Update to v0.12.0 2024-11-18 20:43:41 -08:00
Hosted Weblate 93fbe1f49a Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (657 of 657 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-11-19 04:37:48 +00:00
Hosted Weblate 59f17a4faa Translated using Weblate (Korean)
Currently translated at 35.0% (230 of 657 strings)

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Korean)

Currently translated at 26.5% (174 of 655 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: tgp0625 <tgp0625@naver.com>
Co-authored-by: ᄒᄋ <prohack1109@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ko/
Translation: feishin/Translation
2024-11-19 04:37:47 +00:00
Hosted Weblate d9e41720c8 Translated using Weblate (Spanish)
Currently translated at 100.0% (657 of 657 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2024-11-19 04:37:46 +00:00
Hosted Weblate 8452780602 Translated using Weblate (Czech)
Currently translated at 100.0% (657 of 657 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2024-11-19 04:37:46 +00:00
jeffvli 96b5b660fb Add maintenance notice 2024-11-18 20:37:33 -08:00
Martin 610138c05c README.md: Colorize YAML block, fix macOS capitalization and remove deprecated compose version (#847) 2024-11-18 20:22:13 -08:00
jeffvli 6a619240fa Handle potential undefined value on CardRows (#834) 2024-11-18 20:17:33 -08:00
jeffvli b65c972da1 Handle negative values on gain calculation (#834) 2024-11-18 20:16:20 -08:00
jeffvli 8ec4551b46 Encode credential for subsonic stream/coverart (#841) 2024-11-13 17:54:54 -08:00
Jack Merrill 21f4a78dd7 feat: Discord Rich Presence album art via Last.fm (#341) (#817)
* feat: Discord Rich Presence album art via Last.fm

* fix: securely fetch album art
2024-10-31 12:09:17 -07:00
sel10ut 61d7e7c390 fix(jellyfin): return "Appears On" section to artist page (#812)
Exclude 'AlbumArtistIds' when querying "Appears On" items, which,
if put together with 'ContributingArtistIds', returns an empty list.
2024-10-31 11:33:10 -07:00
astrid 993841ddbf fix devEngines (#801) 2024-10-31 11:31:58 -07:00
jeffvli 98b8409592 Update description to include subsonic servers 2024-10-15 03:22:21 -07:00
jeffvli d3480a86c3 Fix release date parsing to use UTC (#794) 2024-10-15 03:15:59 -07:00
jeffvli 3a63ee4b95 Include all playlist types in Jellyfin playlist fetch 2024-10-15 03:04:38 -07:00
jeffvli 876376d65f Update to v0.11.1 2024-10-14 20:26:21 -07:00
Hosted Weblate 215abf615d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (655 of 655 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-10-15 04:37:52 +02:00
Hosted Weblate afad2843c6 Translated using Weblate (Spanish)
Currently translated at 100.0% (655 of 655 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2024-10-15 04:37:52 +02:00
Hosted Weblate 958ab1f31f Translated using Weblate (Czech)
Currently translated at 100.0% (655 of 655 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2024-10-15 04:37:51 +02:00
Hosted Weblate 0ca325aac2 Translated using Weblate (Portuguese (Brazil))
Currently translated at 31.1% (204 of 655 strings)

Co-authored-by: Rafael Vieira <rafaelvieiras@pm.me>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2024-10-15 04:37:50 +02:00
jeffvli 12b66e5fa0 Convert subsonic coverart property to string (#795) 2024-10-14 19:36:51 -07:00
jeffvli 7e78478fbe Fix combined title cell controls blocking links 2024-10-14 00:38:28 -07:00
jeffvli f783a6360e Update to v0.11.0 2024-10-09 20:04:42 -07:00
Hosted Weblate 8eb6c6a213 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (653 of 653 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-10-10 03:28:31 +02:00
Hosted Weblate ea5f0268cb Translated using Weblate (Serbian)
Currently translated at 79.0% (516 of 653 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Reportiv <reportiv@gmx.de>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sr/
Translation: feishin/Translation
2024-10-10 03:28:31 +02:00
Hosted Weblate 427272f8c8 Translated using Weblate (French)
Currently translated at 100.0% (653 of 653 strings)

Translated using Weblate (French)

Currently translated at 100.0% (653 of 653 strings)

Co-authored-by: Benjamin <iipython@proton.me>
Co-authored-by: D.M <dylan.montigaud@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2024-10-10 03:28:31 +02:00
Hosted Weblate 40d09404b3 Translated using Weblate (Spanish)
Currently translated at 100.0% (653 of 653 strings)

Co-authored-by: Benjamin <iipython@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2024-10-10 03:28:31 +02:00
Hosted Weblate f3ee198833 Translated using Weblate (Czech)
Currently translated at 100.0% (653 of 653 strings)

Co-authored-by: Benjamin <iipython@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2024-10-10 03:28:31 +02:00
Hosted Weblate 5416d6e596 Translated using Weblate (Russian)
Currently translated at 95.7% (625 of 653 strings)

Co-authored-by: Benjamin <iipython@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/
Translation: feishin/Translation
2024-10-10 03:28:31 +02:00
Hosted Weblate a0639cbd27 Translated using Weblate (English)
Currently translated at 100.0% (653 of 653 strings)

Co-authored-by: Benjamin <iipython@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/en/
Translation: feishin/Translation
2024-10-10 03:28:31 +02:00
Hosted Weblate 790961f29a Translated using Weblate (German)
Currently translated at 87.2% (570 of 653 strings)

Co-authored-by: Achim Walz <achim@aalso-walz.de>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2024-10-10 03:28:31 +02:00
jeffvli 18027d4292 Remove current song list index animation (#783) 2024-10-09 18:27:48 -07:00
jeffvli a8b3944c66 Set row play button to switch to song on queue lists 2024-10-09 18:20:04 -07:00
Trevor a00385e78f Add "Move to next" button to queue (#781) 2024-10-09 18:00:25 -07:00
Egor 5e628d96c7 Some fixes to #772 (Add play button to song table) (#784)
* Add play button to song table album cover, like it is in grid

* Fix: play button caused error for albums and artists tables

* Fix: play button caused error for some other tables
2024-10-09 17:40:30 -07:00
Egor ad34d8553e Add play button to song table album cover, like it is in grid (#772)
* Add play button to song table album cover, like it is in grid

* Fix: play button caused error for albums and artists tables
2024-10-03 19:22:51 -07:00
Kendall Garner a89b6640a9 horizontal scroll 2024-10-01 18:15:18 -07:00
Kendall Garner b3b810c62c funkwhale bodge 2024-10-01 17:21:28 -07:00
Kendall Garner ecef9bea5e fix speed state 2024-09-29 16:16:33 -07:00
Hosted Weblate c7214fc7ce Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.8% (652 of 653 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-09-29 06:44:18 +02:00
Hosted Weblate 84bcfb6eb9 Translated using Weblate (Spanish)
Currently translated at 99.8% (652 of 653 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2024-09-29 06:44:17 +02:00
Hosted Weblate 0ca7a0efc9 Translated using Weblate (Czech)
Currently translated at 100.0% (653 of 653 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2024-09-29 06:44:17 +02:00
Torsten Curdt cb76436a2a point help menu items to feishin instead of just electron (#767) 2024-09-28 21:44:13 -07:00
jeffvli 88a951e2e7 Update to v0.10.1 2024-09-28 21:39:30 -07:00
jeffvli 6f1b78c2d6 Fix Subsonic servertype lock from docker configuration 2024-09-28 21:37:09 -07:00
jeffvli 107074b240 Fix subsonic album list sort options 2024-09-28 21:35:32 -07:00
Kendall Garner 6e8ca7e035 fix navidrome getPlaylistSOngList end 2024-09-28 21:22:14 -07:00
jeffvli 3c99a662e8 Fix album detail header track count 2024-09-26 21:23:48 -07:00
jeffvli fc8110ca79 Fix layout shift on lyrics container hover 2024-09-26 21:21:54 -07:00
jeffvli 715f800788 Add getStructuredLyrics to navidrome controller 2024-09-26 12:13:29 -07:00
jeffvli 244aee45cd Handle potential null response on genre results from Navidrome 2024-09-26 12:13:03 -07:00
jeffvli c96f5b207d Handle subsonic endpoints that potentially return optional response when no items 2024-09-26 11:14:06 -07:00
Hosted Weblate 0e8b2aed72 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (642 of 642 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-09-26 06:57:33 +02:00
Hosted Weblate f2accd63fd Translated using Weblate (French)
Currently translated at 96.5% (620 of 642 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jucgshu <brewal.bouvet@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2024-09-26 06:57:33 +02:00
Hosted Weblate c024e975fb Translated using Weblate (Spanish)
Currently translated at 100.0% (642 of 642 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2024-09-26 06:57:33 +02:00
Hosted Weblate a3f725b0ef Translated using Weblate (Czech)
Currently translated at 100.0% (642 of 642 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (642 of 642 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2024-09-26 06:57:33 +02:00
Hosted Weblate f137f487aa Translated using Weblate (English)
Currently translated at 98.1% (641 of 653 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/en/
Translation: feishin/Translation
2024-09-26 06:57:33 +02:00
jeffvli 8e59514524 Update to v.10.0 2024-09-25 21:57:19 -07:00
Mikhail Tsarev 7bcfe30a8e Improved translations for English and Russian versions. (#760)
* First version of Russian translation

* Improvements

---------

Co-authored-by: Suoslex <mtsarev06@gmail.com>
2024-09-25 21:42:41 -07:00
Kendall Garner 8cddbef701 Subsonic 2, general rework (#758) 2024-09-25 21:23:08 -07:00
Xudong Zhou 31492fa9ef Lyrics Translation and Romaji (Fulfill #732) [Translation Part] (#747) 2024-09-23 20:25:17 -07:00
Jeff e3946a9413 Update Navidrome list sort mappings for ND v0.53.2 (#754)
* Update navidrome list sort mappings

* Rename ownerName to owner_name

* Remove deprecated client-side sort
2024-09-22 18:37:13 -07:00
Jamie King 28c12496f1 Removed references to "ElectronReact" in MacOS menu bar (#756) 2024-09-20 13:26:28 +00:00
jeffvli f8c2ff735b Replace "SortName" for "Name" in Jellyfin song sort 2024-09-19 20:39:47 -07:00
Kendall Garner 22e4974191 refactor navidrome-types 2024-09-18 20:43:35 -07:00
Kendall Garner 6eecc3c0fd handle sanitized sort and filter post-fact 2024-09-18 18:00:25 -07:00
Kendall Garner b628b684ae require limit to specified (nonzero) for shuffle all 2024-09-18 07:31:58 -07:00
Kendall Garner 4c49e403ab make headers optional? 2024-09-16 19:57:59 -07:00
Kendall Garner 730683fe25 different date formats based off of metadata 2024-09-16 17:33:06 -07:00
Kendall Garner 96b4f8dd89 update album play count 2024-09-15 21:48:32 -07:00
Kendall Garner f82889e5ec npm audit fix 2024-09-15 20:05:48 -07:00
Benjamin 8d8826a9b7 use utc for absolute date formatting (#743)
* use utc for date formatting

* add seperate utc function and call that instead

* swap date format to be a constant

* make dateadded use non-utc
2024-09-13 01:35:57 +00:00
Kendall Garner 660c9744bf clear queue when shuffle now 2024-09-11 20:36:46 -07:00
Kendall Garner 8221af9a8f break by newline for comment 2024-09-11 07:41:15 -07:00
jeffvli 93f2573847 Update to v0.9.0 2024-09-10 22:37:48 -07:00
Kendall Garner 03d97c6b1e use unique id for paginated playlist 2024-09-10 22:37:24 -07:00
Hosted Weblate 0b86cb51d3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (634 of 634 strings)

Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-09-10 04:01:31 +02:00
Hosted Weblate ee54b8219b Translated using Weblate (French)
Currently translated at 96.8% (610 of 630 strings)

Co-authored-by: Evan <evan_g@orange.fr>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2024-09-10 04:01:31 +02:00
Hosted Weblate 25b593aadd Translated using Weblate (Spanish)
Currently translated at 100.0% (634 of 634 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (632 of 632 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (631 of 632 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2024-09-10 04:01:31 +02:00
Hosted Weblate 5253e32b67 Translated using Weblate (Czech)
Currently translated at 100.0% (634 of 634 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (632 of 632 strings)

Translated using Weblate (Czech)

Currently translated at 99.6% (630 of 632 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2024-09-10 04:01:31 +02:00
Hosted Weblate b0b558c90a Translated using Weblate (German)
Currently translated at 85.0% (536 of 630 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Schroti <schrotihd@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2024-09-10 04:01:31 +02:00
Kendall Garner f11a53c1a4 fix suspense 2024-09-09 19:01:07 -07:00
Kendall Garner e2a05f4204 add track normalization for jellyfin as well 2024-09-09 07:15:26 -07:00
Kendall Garner fcc010eb54 move transcoding placeholder 2024-09-08 22:05:44 -07:00
Kendall Garner 1b41a5a674 enable disabling tray 2024-09-08 20:55:07 -07:00
Kendall Garner 74aa88e082 add web visualizer (#314)
* add web visualizer

* fallback to simple model

* less samples, hopefully more efficient

* Use audiomotion analyzer

- Note: fixed to 4.1.1 because 4.2.0 uses esm which breaks in the current workflow...

* revert publish changes

* r2

* don't massively change package.json

* lazy
2024-09-09 01:25:01 +00:00
Kendall Garner fbac33ceba add shuffle context menu item 2024-09-07 21:31:01 -07:00
Kendall Garner 42ba5a531c use feishin switch instead of default 2024-09-05 18:08:37 -07:00
Kendall Garner 257e1e2cd9 ... 2024-09-05 07:06:37 -07:00
Kendall Garner 3025e84c58 remove height everywhere for jellyfin images 2024-09-04 22:30:50 -07:00
Kendall Garner 4a111d9cf2 don't make artist clickable if no id 2024-09-04 20:01:45 -07:00
Kendall Garner e6bd8deb0c use unique id for places that may have duplicates 2024-09-04 19:34:07 -07:00
jeffvli 6b0c57998b Update to v0.8.1 2024-09-03 21:53:19 -07:00
jeffvli 6587e9cac8 Fix invalid DOM prop on playerbar 2024-09-03 21:51:50 -07:00
jeffvli 2e3c69e61c Fix song index skip when viewing synchronized lyrics 2024-09-03 21:51:18 -07:00
jeffvli 4a8cd63046 Update to v0.8.0 2024-09-02 22:48:52 -07:00
Hosted Weblate 549b53b4a4 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (630 of 630 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (630 of 630 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (630 of 630 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (610 of 610 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (595 of 595 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Shawn <xiaxinx@gmail.com>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-09-03 05:31:30 +00:00
Hosted Weblate f33d13f574 Translated using Weblate (French)
Currently translated at 100.0% (593 of 593 strings)

Co-authored-by: Dylan MONTIGAUD <dylanmontigaud17@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2024-09-03 05:31:29 +00:00
Hosted Weblate 4da51a16c9 Translated using Weblate (Spanish)
Currently translated at 100.0% (630 of 630 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (622 of 622 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (612 of 612 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (610 of 610 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (604 of 604 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (602 of 602 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (602 of 602 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (602 of 602 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (599 of 599 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (597 of 597 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (595 of 595 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2024-09-03 05:31:29 +00:00
Hosted Weblate 8d138ff974 Translated using Weblate (Dutch)
Currently translated at 40.1% (245 of 610 strings)

Translated using Weblate (Dutch)

Currently translated at 40.1% (245 of 610 strings)

Translated using Weblate (Dutch)

Currently translated at 40.0% (244 of 610 strings)

Translated using Weblate (Dutch)

Currently translated at 40.7% (244 of 599 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Idris Saklou <idrissaklou@hotmail.com>
Co-authored-by: Joren Vansteenkiste <vansteenkiste.joren@telenet.be>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/nl/
Translation: feishin/Translation
2024-09-03 05:31:28 +00:00
Hosted Weblate 9373937436 Translated using Weblate (Czech)
Currently translated at 100.0% (630 of 630 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (621 of 621 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (612 of 612 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (610 of 610 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (604 of 604 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (599 of 599 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (595 of 595 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2024-09-03 05:31:27 +00:00
Hosted Weblate 46bbe6b95f Translated using Weblate (German)
Currently translated at 88.2% (525 of 595 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: elia <me@elia.li>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2024-09-03 05:31:26 +00:00
Kendall Garner 56c229a5e0 [slightly less scuffed bugfix]: Update table rating/favorite when updated anywhere … (#707)
* [scuffed bugfix]: Update table rating/favorite when updated anywhere else

Modify player store to have temporary state for favorite/rating update
Add effect handler for `virtual-table` to update rating/favorite for players

Note that this does not handle song grid view.
Using a similar handler for gird view did not work, as it appeared to result in inconsistent state.

Finally, this is probably not the optimal solution.
Performance appears fine for ~20k items, but no guarantees.

* restore should update song

* update song rating/favorite/played everywhere except playlist

* special rule for playlists

* use iterator instead
2024-09-02 22:31:20 -07:00
Kendall Garner 9d44f0fc08 [bugfix]: don't be loading if top songs disabled 2024-09-02 19:26:47 -07:00
Benjamin 903d1479a4 adjust rules for user selection (#723) 2024-09-03 00:48:52 +00:00
Kendall Garner 7299bcefb2 Merge branch 'development' of github.com:jeffvli/feishin into development 2024-09-02 10:57:21 -07:00
Kendall Garner 6b7c69e90a fix seeking between 0-1 seconds 2024-09-02 10:56:46 -07:00
dependabot[bot] 4601838afe Bump electron-updater in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [electron-updater](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater).


Updates `electron-updater` from 6.3.0 to 6.3.1
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-updater/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/electron-updater@6.3.1/packages/electron-updater)

---
updated-dependencies:
- dependency-name: electron-updater
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 17:09:50 -07:00
Kendall Garner f7dd634f67 reorder album artist page 2024-09-01 16:48:43 -07:00
Pyx eb50c69a35 Album blur, allow clicking the playerbar to toggle the player, misc changes (#717)
* Album blur, allow clicking the playerbar to toggle the player

* Fix stopProporagion, sync package with upsteam, update translation

* recommit my existing changes

* Update default albumBackgroundBlur to 6

* according to git this commit resets the package files

* merge with our fork because pyx forgot to add it

* try adding a setting

* change the playerbar animation

* make the animation quicker bc its choppy

* change playerbar to use a bool instead

* requested opacity fix

* Refactor classes to use clsx

---------

Co-authored-by: iiPython <ben@iipython.dev>
Co-authored-by: Jeff <42182408+jeffvli@users.noreply.github.com>
2024-09-01 23:42:01 +00:00
Kendall Garner b93ad40571 Merge pull request #720 from pyxfluff/patch-1
Add play count to albums
2024-09-01 12:50:19 -07:00
Kendall Garner 748db032c7 add translation 2024-09-01 12:48:11 -07:00
Kendall Garner 80931d1b19 jellyfin random play filter 2024-09-01 12:25:50 -07:00
Kendall Garner 93377dcc4f fix jellyfin playlists, add is public 2024-09-01 09:37:37 -07:00
Kendall Garner 528bef01f0 provide transcoding support 2024-09-01 08:26:30 -07:00
Kendall Garner da95a644c8 upgrade webpack 2024-08-29 21:42:44 -07:00
Pyx f5a04980a4 Add play count to albums 2024-08-29 23:03:00 -04:00
Kendall Garner 93055b3bf1 allow disabling web audio 2024-08-29 19:44:24 -07:00
Kendall Garner e68847f50a slightly better error handling 2024-08-27 21:27:49 -07:00
Kendall Garner 43fe1a235e fix context menu original item 2024-08-27 21:21:44 -07:00
Kendall Garner 62c372d0c7 dont't move to 0 when removing current item from queue 2024-08-27 21:14:08 -07:00
Kendall Garner 279842b894 bump node mpv 2024-08-27 20:11:08 -07:00
Kendall Garner 6125901023 [enhancement]: custom css 2024-08-27 08:26:34 -07:00
Kendall Garner 004c9a8d06 allow hiding context menu items 2024-08-26 21:35:12 -07:00
Kendall Garner f746114041 increase metadata size of library header 2024-08-26 20:26:37 -07:00
Kendall Garner 9f4861a78a use context menu instead of button 2024-08-25 22:17:11 -07:00
Kendall Garner 32b984a18b add playlist context menu button to sidebar 2024-08-25 22:08:07 -07:00
Kendall Garner 8a8542ddb1 simplify disc/subtitle for album list 2024-08-25 21:34:43 -07:00
Kendall Garner b41a1a8b15 [bugfix]: properly update song when restoring queue 2024-08-25 20:02:44 -07:00
Kendall Garner 9923c021fa better album dates 2024-08-25 19:52:44 -07:00
Kendall Garner 8c929d0dc3 fixed size for different sizes 2024-08-25 18:07:51 -07:00
Kendall Garner fb1e33fad5 autosize library item text 2024-08-25 17:50:46 -07:00
Kendall Garner c4677a63f6 [enhancement]: allow downloading individual tracks for external use 2024-08-25 17:11:24 -07:00
Kendall Garner 10fca2dc12 enable reordering non-smart playlists 2024-08-25 15:21:56 -07:00
Kendall Garner 0b383b758e support collapsing shared playlists 2024-08-24 21:09:44 -07:00
Kendall Garner ccb6f2c8b0 very niche error handling for no audio device id but still have error checking 2024-08-24 20:36:04 -07:00
Kendall Garner a44071fedd add error checking for set sink id (case of no devices at all) 2024-08-24 20:13:30 -07:00
Kendall Garner b527d579fd Revert upgrade of discord-rpc
Some horrible magic can result in this upgrade causing compiler errors.
No idea why.
2024-08-24 15:22:55 -07:00
Kendall Garner 5b2977e5e8 [enhancement]: support viewing current/setting current time in remote 2024-08-24 13:26:45 -07:00
Kendall Garner b347b794b9 fix micromatch 2024-08-23 19:54:39 -07:00
Kendall Garner ad81790c90 add more places for share in context menu 2024-08-23 19:53:40 -07:00
Kendall Garner 906ffee8bc thanks discord [support changing listen type] 2024-08-23 10:34:18 -07:00
Kendall Garner 284db988c9 [enhancement]: use discord activity type listening 2024-08-23 08:27:40 -07:00
Kendall Garner 271be93a96 fix prettier/lint 2024-08-23 08:19:27 -07:00
Kendall Garner 121b036aaf bump i18next-parser 2024-08-23 08:00:59 -07:00
Kendall Garner 028ccfb1cd fix album art res 0 and allow resizing volume bar 2024-08-22 21:57:58 -07:00
Kendall Garner 37b0407188 simplify webaudio replaygain to reduce pop-in 2024-08-21 23:04:37 -07:00
Kendall Garner 616fd45734 add minimum duration check for crossfade 2024-08-21 22:47:35 -07:00
Kendall Garner a537642990 [bugfix]: set index to current track when unshuffling 2024-08-20 19:10:05 -07:00
Kendall Garner 9c6abcb32c Use break-word over break-all 2024-08-20 16:35:08 +00:00
Kendall Garner af69a58418 [bugfix]: use chrome-specific implementation for web audio sink 2024-08-19 22:38:51 -07:00
Kendall Garner ebebdc1e03 forcefully break long lines 2024-08-19 22:12:32 -07:00
Kendall Garner 7d185f6563 clarify text 2024-08-19 22:02:54 -07:00
Kendall Garner 88741a8616 add ability to configure double click behavior 2024-08-19 21:56:55 -07:00
Kendall Garner 94edda1856 better handling of grid refresh 2024-08-19 21:36:56 -07:00
Kendall Garner 886786d428 [enhancement]: add background opacity to buttons in full screen player 2024-08-19 19:03:19 -07:00
Kendall Garner e4ca0164fa [bugfix]: Jellyfin do not force width = height for images 2024-08-15 23:35:29 -07:00
Jeff 08db18359a Merge pull request #687 from jeffvli/dependabot/npm_and_yarn/npm_and_yarn-bb2c7e2e3f
Bump electron-updater from 4.6.5 to 6.3.0 in the npm_and_yarn group across 1 directory
2024-07-30 11:53:25 -07:00
jeffvli f2beeef0e9 Bump to v0.7.3 2024-07-30 03:26:21 -07:00
dependabot[bot] 6daba77bae Bump electron-updater in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [electron-updater](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater).


Updates `electron-updater` from 4.6.5 to 6.3.0
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-updater/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/electron-updater@6.3.0/packages/electron-updater)

---
updated-dependencies:
- dependency-name: electron-updater
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-30 10:19:42 +00:00
jeffvli fd893224b3 Bump electronVersion in build configuration (#686) 2024-07-30 03:17:32 -07:00
Hosted Weblate 8815246221 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (593 of 593 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-07-25 19:36:24 +00:00
Hosted Weblate 5e353649a4 Translated using Weblate (Korean)
Currently translated at 1.6% (10 of 593 strings)

Co-authored-by: 박용현 <pyh5523@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ko/
Translation: feishin/Translation
2024-07-25 19:36:24 +00:00
Jeff 4ca7b4221c Merge pull request #680 from dragonish/metadata
Fix full screen player metadata may not change when switching queue
2024-07-25 12:36:19 -07:00
dragonish 6c61ea898f Fix full screen player metadata may not change when switching queue 2024-07-26 01:52:40 +08:00
Kendall Garner 0b786b025f Merge pull request #676 from dragonish/lyrics
Fix synchronized lyrics that may become unaligned during playback after re-rendering
2024-07-23 04:09:11 +00:00
dragonish e106fb324f Fix synchronized lyrics that may become unaligned during playback after re-rendering 2024-07-22 21:33:01 +08:00
Jeff 3edc6bab04 Merge pull request #668 from yuygfgg/patch-1
fix blank screen when reopening window on macos
2024-07-21 04:16:17 -07:00
yuygfgg 0113ef2582 restore comments 2024-07-14 21:15:58 +08:00
yuygfgg 493b81875a fix blank screen when reopening window on macos 2024-07-14 20:46:04 +08:00
Jeff ed8e5e69ba Merge pull request #664 from sel10ut/bugfix/fix-minimize-setting
Fix minimize to tray setting toggle
2024-07-14 02:53:48 -07:00
jeffvli d27a656568 Bump electron to v31 (again) 2024-07-13 01:30:18 -07:00
sel10ut 582739a091 fix(settings): set proper default minimize to tray check 2024-07-04 13:29:47 +03:00
Jeff fb930f1197 Merge pull request #654 from minicoz/feat/docker-compose-readme
Adding in docker compose instructions to README
2024-07-03 16:30:45 -07:00
Jeff 849aa97e63 Merge pull request #663 from jeffvli/dependabot/npm_and_yarn/release/app/npm_and_yarn-99150a289a
Bump ws from 8.17.1 to 8.18.0 in /release/app in the npm_and_yarn group across 1 directory
2024-07-03 16:29:51 -07:00
dependabot[bot] bc5abe3ec1 Bump ws in /release/app in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the /release/app directory: [ws](https://github.com/websockets/ws).


Updates `ws` from 8.17.1 to 8.18.0
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.17.1...8.18.0)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-03 23:21:13 +00:00
Jeff 46cd783fa3 Merge pull request #662 from jeffvli/dependabot/npm_and_yarn/npm_and_yarn-8fcff2be61
Bump the npm_and_yarn group across 2 directories with 2 updates
2024-07-03 16:20:05 -07:00
jeffvli a93173f55a Bump to v0.7.2 2024-07-03 15:57:57 -07:00
jeffvli bd04168209 Add languages 2024-07-03 15:56:48 -07:00
dependabot[bot] 76ffdb6627 Bump the npm_and_yarn group across 2 directories with 2 updates
Bumps the npm_and_yarn group with 2 updates in the / directory: [ws](https://github.com/websockets/ws) and [braces](https://github.com/micromatch/braces).
Bumps the npm_and_yarn group with 1 update in the /release/app directory: [ws](https://github.com/websockets/ws).


Updates `ws` from 7.5.7 to 7.5.10
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.5.7...7.5.10)

Updates `braces` from 3.0.2 to 3.0.3
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

Updates `ws` from 8.13.0 to 8.17.1
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.5.7...7.5.10)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: braces
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: ws
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-03 22:31:09 +00:00
Hosted Weblate f674260df3 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (591 of 591 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.4% (588 of 591 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: SunSpring <yearnsun@gmail.com>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-07-03 22:29:28 +00:00
Hosted Weblate e9315886b7 Translated using Weblate (Korean)
Currently translated at 1.1% (7 of 591 strings)

Added translation using Weblate (Korean)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: hubag <pyosy17@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ko/
Translation: feishin/Translation
2024-07-03 22:29:28 +00:00
Hosted Weblate 4741dd0d77 Translated using Weblate (Finnish)
Currently translated at 19.6% (116 of 591 strings)

Added translation using Weblate (Finnish)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jonne Saloranta <saloranta.jonne@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2024-07-03 22:29:27 +00:00
Hosted Weblate 7a1c4f5082 Translated using Weblate (Spanish)
Currently translated at 100.0% (593 of 593 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (591 of 591 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (586 of 586 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (586 of 586 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2024-07-03 22:29:27 +00:00
Hosted Weblate abf339bb58 Translated using Weblate (Polish)
Currently translated at 100.0% (586 of 586 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2024-07-03 22:29:26 +00:00
Hosted Weblate bb8f67c4c1 Translated using Weblate (Czech)
Currently translated at 100.0% (593 of 593 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (591 of 591 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (586 of 586 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2024-07-03 22:29:26 +00:00
Hosted Weblate e416c2a3b6 Translated using Weblate (Russian)
Currently translated at 97.2% (575 of 591 strings)

Translated using Weblate (Russian)

Currently translated at 97.2% (575 of 591 strings)

Translated using Weblate (Russian)

Currently translated at 95.0% (562 of 591 strings)

Translated using Weblate (Russian)

Currently translated at 95.0% (562 of 591 strings)

Translated using Weblate (Russian)

Currently translated at 70.7% (418 of 591 strings)

Translated using Weblate (Russian)

Currently translated at 70.7% (418 of 591 strings)

Co-authored-by: Blueberry <igory.ygr200@gmail.com>
Co-authored-by: Eugeniy <zamelane@vk.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ShaDream <mogilnikovshadream@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/
Translation: feishin/Translation
2024-07-03 22:29:25 +00:00
Hosted Weblate 5af4344168 Translated using Weblate (English)
Currently translated at 100.0% (586 of 586 strings)

Co-authored-by: Benjamin <iipython@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/en/
Translation: feishin/Translation
2024-07-03 22:29:25 +00:00
Hosted Weblate 55e958b5da Translated using Weblate (Portuguese (Brazil))
Currently translated at 34.3% (201 of 586 strings)

Co-authored-by: Cyber Hippie <neves.j@protonmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2024-07-03 22:29:24 +00:00
Jeff 2a231ed7af Merge pull request #659 from kgarner7/fix-electron-31-build
[bugfix]: use tsx instead of ts-node, update @electron/rebuild
2024-07-03 15:29:17 -07:00
jeffvli a26f7feb31 Readd transpile-only on dev 2024-07-03 15:13:54 -07:00
jeffvli 90e267d9c7 Bump node version from 16 -> 18 in builders 2024-07-03 15:08:14 -07:00
jeffvli 1ab09c5488 Move tsx and electron/rebuild to devDependencies 2024-07-03 15:05:01 -07:00
jeffvli eadbf3ad7b Readd ts-node 2024-07-03 15:00:56 -07:00
Jeff 42bcc4190c Merge pull request #660 from sel10ut/bugfix/jellyfin-multiple-sessions
(Jellyfin) Allow multiple sessions from the same user with different instances
2024-07-03 14:49:41 -07:00
jeffvli 3c44db377b Revert "Bump electron to v31 (#643)"
This reverts commit 0c14427bdb.
2024-07-03 14:40:09 -07:00
sel10ut ba64f4c467 refactor(jellyfin): migrate auth method 2024-07-03 22:41:35 +03:00
sel10ut 596bf3a378 fix(jellyfin): allow multiple sessions from the same client type
Allow multiple sessions from the same user with different instances.
Instead of sending a hard-coded string, send a randomly generated
string `deviceId`, which already exists and is created for each
new installation.
2024-07-03 22:12:15 +03:00
Kendall Garner 91e6119afa use tsx instead of ts-node, update @electron/rebuild 2024-07-03 11:53:59 -07:00
mlnl b053538f94 Update README.md
removed unused volume
2024-07-03 18:51:46 +00:00
jeffvli 0c14427bdb Bump electron to v31 (#643) 2024-07-03 02:10:13 -07:00
Kendall Garner 110a1a63f0 simplify remote/media session (#632) 2024-07-03 01:47:26 -07:00
Kendall Garner d57b4b4b68 [bugfix]: properly clean up MPV on quit, use pid for socket (#627)
* fix cleanup

* don't delete file if windows
2024-07-03 01:36:01 -07:00
Benjamin 4191edb88c fix cache settings not being sentence cased (#657) 2024-07-03 01:29:53 -07:00
sel10ut b38930a277 tweak(jellyfin): fetch actual recent album releases (#629) 2024-07-03 01:29:34 -07:00
Gelaechter ea865f44b1 Allow jumping to lyrics (#656) 2024-07-03 01:24:31 -07:00
isaiahfuller 0768ce80a7 Add option to play similar tracks from the context menu (#650)
* Add option to play similar songs from context menu

* remove console.log
2024-07-03 01:17:56 -07:00
minicoz c960cc44b7 adding env options 2024-06-28 09:10:47 -07:00
minicoz a84276579b adding in docker compose instructions 2024-06-28 09:08:09 -07:00
Kendall Garner b30fadd149 navidrome album artist covoer art bodge 2024-05-29 02:53:41 -07:00
Kendall Garner aa89c5e80e [enhancement]: apply formatting to card values 2024-05-26 12:20:01 -07:00
Kendall Garner 38ed083693 [enhancement]: support using native image aspect ratio 2024-05-25 11:15:30 -07:00
Kendall Garner 961d1838c0 reopen window if exit to tray 2024-05-25 08:14:01 -07:00
Kendall Garner 67deb3e3d8 [bugfix]: only restart time when now for web 2024-05-23 20:41:01 -07:00
Kendall Garner 79384fa4ed add songCount to table localization 2024-05-17 23:17:31 -07:00
Kendall Garner bb2f8461ed [enhancement]: support toggling feature carousel 2024-05-15 21:48:20 -07:00
Kendall Garner 168153b211 [bugfix]: restart timestamp when adding to queue 2024-05-10 12:27:33 -07:00
Kendall Garner c5e8472746 [bugfix]: handle song grid sparse array 2024-05-09 00:14:59 -07:00
Kendall Garner a9e0689619 activate tray on single click 2024-05-08 19:10:46 -07:00
jeffvli 69acbc9a28 Bump to v0.7.1 2024-05-06 22:52:16 -07:00
jeffvli 58484b87f4 Split macOs and Windows builders 2024-05-06 22:31:22 -07:00
jeffvli 6858485e41 Add new languages 2024-05-06 19:56:16 -07:00
Hosted Weblate ebd97c253b Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (586 of 586 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: HanaO00 <lwin24452@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <KosmoMoustache@users.noreply.hosted.weblate.org>
Co-authored-by: Leonardo Pizio <pizio.leonardo@gmail.com>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-05-07 04:22:27 +02:00
Hosted Weblate 2c834cd3a8 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: HanaO00 <lwin24452@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <KosmoMoustache@users.noreply.hosted.weblate.org>
Co-authored-by: Leonardo Pizio <pizio.leonardo@gmail.com>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-05-07 04:22:27 +02:00
Hosted Weblate dff6d27c23 Translated using Weblate (Spanish)
Currently translated at 100.0% (586 of 586 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: HanaO00 <lwin24452@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <KosmoMoustache@users.noreply.hosted.weblate.org>
Co-authored-by: Leonardo Pizio <pizio.leonardo@gmail.com>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-05-07 04:22:27 +02:00
Hosted Weblate 3aed97c139 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: HanaO00 <lwin24452@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <KosmoMoustache@users.noreply.hosted.weblate.org>
Co-authored-by: Leonardo Pizio <pizio.leonardo@gmail.com>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-05-07 04:22:27 +02:00
Hosted Weblate 8fe93b4b2e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: HanaO00 <lwin24452@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <KosmoMoustache@users.noreply.hosted.weblate.org>
Co-authored-by: Leonardo Pizio <pizio.leonardo@gmail.com>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-05-07 04:22:27 +02:00
Hosted Weblate c634a07c5d Translated using Weblate (Czech)
Currently translated at 100.0% (586 of 586 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (525 of 585 strings)

Translated using Weblate (French)

Currently translated at 100.0% (570 of 570 strings)

Translated using Weblate (French)

Currently translated at 100.0% (559 of 559 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (585 of 585 strings)

Translated using Weblate (Italian)

Currently translated at 98.6% (576 of 584 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (565 of 566 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (585 of 585 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: HanaO00 <lwin24452@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <KosmoMoustache@users.noreply.hosted.weblate.org>
Co-authored-by: Leonardo Pizio <pizio.leonardo@gmail.com>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-05-07 04:22:27 +02:00
Hosted Weblate 0235a569a0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 32.0% (188 of 586 strings)

Co-authored-by: Cyber Hippie <neves.j@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2024-05-07 04:22:27 +02:00
jeffvli cbe1c878e7 Bump to v0.7.0 2024-05-06 19:21:48 -07:00
Kendall Garner 4afb893ce5 remove stray log 2024-05-05 19:56:35 -07:00
Kendall Garner 645697367d [enhancement]: support serach on settings page 2024-05-05 13:25:05 -07:00
jeffvli 683bb0222c Filter out current playlist on playlist operators 2024-05-02 23:04:57 -07:00
jeffvli ce0c07ebdb Add JSON preview for smart playlist query 2024-05-02 23:04:57 -07:00
jeffvli 785f0ef77f Add inPlaylist and notInPlaylist operators 2024-05-02 23:04:57 -07:00
jeffvli 7bfdbb5d92 Reduce min grid size on remaining list pages 2024-05-02 23:04:31 -07:00
Dylan Lathrum abdb2fee85 Allow smaller album covers in card/poster display 2024-05-02 23:04:31 -07:00
Kendall Garner d1bcd2b2fb [bugfix]: fix jellyfin add to playlist 2024-05-02 18:42:49 -07:00
Vukanović Stefan 297d6f0d2e LrcLib.net expects durations in seconds, not ms (#603) 2024-05-02 14:14:10 +00:00
dependabot[bot] 78ac5af178 Bump ejs in the npm_and_yarn group across 1 directory (#602)
Bumps the npm_and_yarn group with 1 update in the / directory: [ejs](https://github.com/mde/ejs).


Updates `ejs` from 3.1.9 to 3.1.10
- [Release notes](https://github.com/mde/ejs/releases)
- [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-02 14:03:29 +00:00
Kendall Garner 9cd8807a75 [bugfix]: Handle top-level songs for Jellyfin (#553)
* [bugfix]: Handle top-level songs for Jellyfin

If a song is at the top level of a music folder, Jellyfin will not
group that into an album (See https://jellyfin.org/docs/general/server/media/music/).

This PR introduces a few changes:
- Gives tracks with no album ID a special route (`/dummy/${id}`)
- Gives a new route for dummy albums, warning about the error. This is designed to look _like_ the album detail page

* `are are` > `are`

* revert name changes
2024-04-30 03:18:43 +00:00
Kendall Garner 620cca9ce3 Revert "Upgrade dependencies"
This reverts commit 89688455e0.
2024-04-28 21:03:31 -07:00
Kendall Garner 89688455e0 Upgrade dependencies
- mpris-service: migrate to @jellybrick/mpris-service, which has upgraded dependencies and uses class
- i18next-parser: 6 -> 8. This requires a small change to i18next-parser.config.js
2024-04-28 20:50:52 -07:00
Kendall Garner 5259f2401b upgrade framer-motion to 11 2024-04-28 18:59:05 -07:00
Kendall Garner c36f0a055d [enhancement]: parse replaygain from subsonic endpoints where available 2024-04-27 22:20:42 -07:00
Kendall Garner ef87a8c2a7 remove security from config 2024-04-24 07:38:59 -07:00
Kendall Garner 5da68d4243 Use issue templates 2024-04-24 07:37:38 -07:00
Kendall Garner dc95a3c66b [bugfix]: use persistent columns def instead of default merge behavior 2024-04-23 23:25:32 -07:00
Kendall Garner 087ea44737 [enhancement]: use jellyfin 10.9.0 lyrics 2024-04-22 19:44:10 -07:00
Benjamin cb2597d2c8 Implement Navidrome sharing (#575)
* add share item feature

* take care of (mostly) everything

* bugfixes

* allow clicking on notification to open url

* readd the missing modal after router migration

* remove unnecessary extension

---------

Co-authored-by: Kendall Garner <17521368+kgarner7@users.noreply.github.com>
2024-04-22 03:03:22 +00:00
Kendall Garner 0d03b66fe5 prevent change of media state with empty queue 2024-04-20 22:01:29 -07:00
Kendall Garner ba531505af [enhancement]: Support toggling Album/Track view for gneres (#591)
* [enhancement]: Support toggling Album/Track view for gneres

The _primary_ purpose of this PR is to enable viewing tracks OR albums for genres.
This has a few requirements:
1. Ability to set default route for genres, **except** when already on song/album page
2. Ability to toggle between album and genre view
3. Fixed refresh for genre ID

Additionally, there was some refactoring:
- Since the *-list-headers had very similar functions for search, export that as a hook instead

* also use hook for album artist

* support switching albumartist tracks/albums

* remove toggle on song/album list, simplify logic
2024-04-20 06:14:31 +00:00
Kendall Garner 595eba152a [jellyfin]: prefer sort name over name 2024-04-19 23:11:26 -07:00
Kendall Garner ebd2f07447 show macOS warning one, don't show artist link if invalid 2024-04-17 22:44:35 -07:00
Kendall Garner 5d6503c1f4 [bugfix]: do not show now playing for duplicate item in play queue 2024-04-17 21:51:39 -07:00
Kendall Garner d03a3a11eb [enhancement]: Support react-router links in Modal (#586) 2024-04-17 14:29:46 +00:00
Kaydax 04b4d92f69 Fix portrait mode detection (#582)
* Fix portrait mode detection

* Revert changes done on playbar
2024-04-17 06:21:49 +00:00
Kendall Garner ec69cc22f9 use clearer separator character 2024-04-14 21:58:25 -07:00
Kendall Garner 19a88fea86 [bodge]: deal with Jellyfin returning dupliate tracks for album query 2024-04-13 16:28:36 -07:00
Kendall Garner 729538d885 [bugfix]: restart synchronized lyrics on repeat one (or track queued multiple times) 2024-04-12 20:52:10 -07:00
Kendall Garner 9f86a8179f fix clipping description, update docker compose sample 2024-04-12 19:44:52 -07:00
Kendall Garner 3976f5e5bf don't assume ref exists 2024-04-12 09:33:48 -07:00
Kendall Garner 90d3fb219d [bugfix]: restart track in queue for web player 2024-04-12 09:29:36 -07:00
Kendall Garner cabd69772e [bugfix]: mantine bodge 2024-04-11 08:25:53 -07:00
Kendall Garner 9339c08777 [bugfix]: handle unclean MPV exit with existing content 2024-04-10 21:18:47 -07:00
Kendall Garner f5e047c7f5 update readme 2024-04-10 20:03:59 -07:00
Kendall Garner f79f9cc79e [bugfix]: deal with broken jellyfin 2024-04-09 22:49:44 -07:00
Kendall Garner c3fcb7487c [bugfix]: fix album artist order and mild race protection 2024-04-09 22:11:29 -07:00
Kendall Garner 15c6ef382a [bugfix]: fix combined title for artist, favoriting on grid pages 2024-04-08 23:15:59 -07:00
Kendall Garner 14086ebc9c improve similar items fallback, make ND album artist for song actually album artist, fix full screen race 2024-04-08 08:49:55 -07:00
Kendall Garner 2257e439a4 [navidrome]: prefer gerArtistInfo higher quality image 2024-04-06 21:36:30 -07:00
Kendall Garner 6824a5db7a [enhancement]: also save fullscreen/maximize 2024-04-06 21:14:05 -07:00
Kendall Garner c0110eff82 [enhancement]: save/restore screen position 2024-04-06 19:05:20 -07:00
Kendall Garner 2c17458fdf [enhancement]: allow copying/opening path in song modal 2024-04-06 16:13:09 -07:00
Kendall Garner c1345802aa bump size cell size 2024-04-03 21:28:27 -07:00
Kendall Garner 197497df05 [enhancement]: Show item details (#573)
* start

* More details, don't show manage server when other modal
2024-04-04 04:19:46 +00:00
Kendall Garner 7bebe286d5 sanitize album artist biography 2024-04-03 07:36:13 -07:00
Kendall Garner 24394fa858 Merge pull request #571 from iiPythonx/dynamicbg
[bugfix]: Add a fallback image to the dynamic background url
2024-04-03 01:54:15 +00:00
iiPython f7c6088cca add a fallback image to the dynamic background url 2024-04-02 12:58:26 -05:00
Kendall Garner 65eca32de3 [bugfix]: do not update mpris status unnecessarily 2024-04-02 08:46:38 -07:00
Kendall Garner ae167e63fd [bugfix]: shared only if owner exists 2024-04-01 22:31:59 -07:00
Kendall Garner ab17ba8add [bugfix]: fix scrobble race conditions 2024-04-01 22:13:06 -07:00
Kendall Garner 2854a91700 [bugfix]: actually implement size column 2024-04-01 20:53:00 -07:00
Kendall Garner 6bc778fa53 [bugfix]: fix smart playlist, do not error when trying to edit playlist as non-admin 2024-03-31 19:34:33 -07:00
Kendall Garner 44fcc33825 [enhancement]: add server menu on Navidrome error page 2024-03-31 17:47:17 -07:00
Kendall Garner e0e967385f Merge pull request #566 from kgarner7/fix-mpv-race-and-make-consistent
[bugfix]: Resolve MPV next/prev race condition
2024-03-31 23:12:03 +00:00
Kendall Garner 8900d8126c [bugfix]: queue all songs on search, consistent sort, clearing
- Previously, the search page would render initial page in one order, but search itself would be different order
This is resolved by having both virtual-table and search-header using listStoreKey
- When double clicking, now enqueue all the songs using the same sort
- Reset the search when clearing
2024-03-31 13:20:01 -07:00
Kendall Garner 65b045df03 [bugfix]: Resolve MPV next/prev race condition
Resolves #536.

With the previous implementation, next/previous would first update
the current queue and then call next/previous. However, since these were
asynchronous calls it was very likely that the second calls would fail
(and a test of adding delay showed that it actually caused a double skip).
This PR resolves this by just removing the prev/next.

Small other fixes:
- setQueue + pause -> setQueue(..., true)
- make MPV and web player have the same behavior for (pause/stop) where appropriate
2024-03-30 21:48:09 -07:00
Kendall Garner 918842e3a5 [bugfix]: use proper check for OS lyric existence 2024-03-30 20:36:49 -07:00
Kendall Garner a3573d4f9a add light theme for non-native titlebar 2024-03-30 14:11:57 -07:00
Kendall Garner 46fdacad81 Make home page modal play button use default behavior 2024-03-27 21:15:23 -07:00
Kendall Garner 67b8c7f1c0 Merge pull request #561 from jeffvli/dependabot/npm_and_yarn/npm_and_yarn-security-group-e0cd778f82
Bump the npm_and_yarn group across 1 directory with 1 update
2024-03-27 06:14:49 +00:00
dependabot[bot] 43f28317f6 Bump the npm_and_yarn group across 1 directory with 1 update
Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express).


Updates `express` from 4.18.0 to 4.19.2
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.0...4.19.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
  dependency-group: npm_and_yarn-security-group
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-27 02:11:54 +00:00
dependabot[bot] f61cf8c331 Bump the npm_and_yarn group across 1 directory with 1 update (#557)
Bumps the npm_and_yarn group with 1 update in the / directory: [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware).


Updates `webpack-dev-middleware` from 5.3.1 to 5.3.4
- [Release notes](https://github.com/webpack/webpack-dev-middleware/releases)
- [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.1...v5.3.4)

---
updated-dependencies:
- dependency-name: webpack-dev-middleware
  dependency-type: indirect
  dependency-group: npm_and_yarn-security-group
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-27 02:10:24 +00:00
dependabot[bot] 340344b791 Bump the npm_and_yarn group across 1 directory with 1 update (#551)
Bumps the npm_and_yarn group with 1 update in the / directory: [follow-redirects](https://github.com/follow-redirects/follow-redirects).


Updates `follow-redirects` from 1.15.5 to 1.15.6
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.5...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
  dependency-group: npm_and_yarn-security-group
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-19 06:08:14 +00:00
dependabot[bot] ba1a2d5495 Bump the npm_and_yarn group across 1 directory with 2 updates (#542)
Bumps the npm_and_yarn group with 2 updates in the / directory: [app-builder-lib](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/app-builder-lib) and [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder).


Updates `app-builder-lib` from 24.9.0 to 24.13.3
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/app-builder-lib/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/v24.13.3/packages/app-builder-lib)

Updates `electron-builder` from 24.9.0 to 24.13.3
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/v24.13.3/packages/electron-builder)

---
updated-dependencies:
- dependency-name: app-builder-lib
  dependency-type: indirect
  dependency-group: npm_and_yarn-security-group
- dependency-name: electron-builder
  dependency-type: direct:development
  dependency-group: npm_and_yarn-security-group
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-19 06:00:54 +00:00
jeffvli a177061f18 Bump to v0.6.1 2024-03-13 00:02:46 -07:00
jeffvli d806ade84c Potentially fix application stuck when Navidrome credential expires (#538) 2024-03-12 23:59:35 -07:00
jeffvli 854b76702b Downgrade to electron v26 (#534) 2024-03-12 23:33:33 -07:00
Hosted Weblate 1b08dfc5a5 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (549 of 549 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (543 of 543 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (519 of 519 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: TianMiao <tianmiao.work@foxmail.com>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2024-03-06 00:55:52 +01:00
Hosted Weblate 60fc552088 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (549 of 549 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (543 of 543 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: TianMiao <tianmiao.work@foxmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hant/
Translation: feishin/Translation
2024-03-06 00:55:52 +01:00
Hosted Weblate 86438fdb3d Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translation: feishin/Translation
2024-03-06 00:55:51 +01:00
Hosted Weblate 92beae6665 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Persian)

Currently translated at 50.0% (260 of 519 strings)

Added translation using Weblate (Persian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kaambiz <kambizx@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fa/
Translation: feishin/Translation
2024-03-06 00:55:51 +01:00
Hosted Weblate b110cfb94b Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translation: feishin/Translation
2024-03-06 00:55:50 +01:00
Hosted Weblate 08d4e80777 Translated using Weblate (Spanish)
Currently translated at 100.0% (549 of 549 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Spanish)

Currently translated at 100.0% (519 of 519 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2024-03-06 00:55:49 +01:00
Hosted Weblate ba03c19439 Translated using Weblate (Dutch)
Currently translated at 46.6% (242 of 519 strings)

Translated using Weblate (Dutch)

Currently translated at 39.4% (205 of 519 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Idris Saklou <idrissaklou@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/nl/
Translation: feishin/Translation
2024-03-06 00:55:49 +01:00
Hosted Weblate 1c6346572b Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translation: feishin/Translation
2024-03-06 00:55:48 +01:00
Hosted Weblate b91c715b13 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Polish)

Currently translated at 99.8% (518 of 519 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2024-03-06 00:55:48 +01:00
Hosted Weblate f22434a50c Translated using Weblate (Czech)
Currently translated at 100.0% (549 of 549 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Czech)

Currently translated at 100.0% (519 of 519 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (519 of 519 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (519 of 519 strings)

Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2024-03-06 00:55:47 +01:00
Hosted Weblate 2086b57fb2 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translation: feishin/Translation
2024-03-06 00:55:47 +01:00
Hosted Weblate 2247ba08ea Translated using Weblate (German)
Currently translated at 98.5% (548 of 556 strings)

Translated using Weblate (German)

Currently translated at 98.5% (548 of 556 strings)

Translated using Weblate (German)

Currently translated at 98.5% (548 of 556 strings)

Translated using Weblate (German)

Currently translated at 93.3% (519 of 556 strings)

Translated using Weblate (German)

Currently translated at 93.3% (519 of 556 strings)

Translated using Weblate (German)

Currently translated at 92.2% (513 of 556 strings)

Translated using Weblate (German)

Currently translated at 92.2% (513 of 556 strings)

Translated using Weblate (German)

Currently translated at 91.5% (509 of 556 strings)

Translated using Weblate (German)

Currently translated at 91.5% (509 of 556 strings)

Translated using Weblate (German)

Currently translated at 91.1% (507 of 556 strings)

Translated using Weblate (German)

Currently translated at 91.1% (507 of 556 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (German)

Currently translated at 89.9% (467 of 519 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lokke <accounts.lokke@googlemail.com>
Co-authored-by: Maik <maikguenes2003@gmail.com>
Co-authored-by: Rudi Mentaire <stoertebecker@byom.de>
Co-authored-by: full name <hosted-weblate.5w160@dralias.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2024-03-06 00:55:46 +01:00
jeffvli 5601613c3d Bump to v0.6.0 2024-03-05 15:55:28 -08:00
jeffvli d04d786951 Center auth loading spinner 2024-03-05 15:52:14 -08:00
jeffvli 613bfa7ae6 Various cleanup/fixes 2024-03-05 14:15:32 -08:00
jeffvli a7a5b92011 Adjust server feature naming convention 2024-03-05 14:12:37 -08:00
jeffvli a9315be259 Rename features types file 2024-03-05 14:05:01 -08:00
jeffvli e7b2f30718 Replace songId with albumId on dynamic image check 2024-03-05 00:45:45 -08:00
Kendall Garner 73845a9432 [enhancement]: better version checks for lyrics, Navidrome (#529)
- Actually make serverfeatures partial
- Navidrome: only set multiple structured lyrics if extension exists
- Navidrome/Subsonic: minor type checking of OS extension (Navidrome implementation detail)
- Jellyfin: add separate knob for lyrics. Note, this should also probably be behind some version check...
2024-03-05 00:31:51 -08:00
Benjamin d52d9136b8 [feat] Add a dynamic image option to the fullscreen player (#526)
* Add an option for a dynamic background image in the fullscreen player

* Center the background image and fix some more bugs

* More cleaning up the background image

* Add option for customizable blur amount

* Fix missing translation key for image blur

* Fix dynamic image shifting when player is opened

* Hide image blur size config if dynamic background is disabled

---------

Co-authored-by: Jeff <42182408+jeffvli@users.noreply.github.com>
2024-03-05 00:30:37 -08:00
Kendall Garner a45e7f24e4 [enhancements]: fix carousel, full screen metadata improvements (#524)
* fix carousel, full screen metadata improvements

* Add missing mapped keys on multiple artist

* Remove bg opacity on metadata section

* Improve visibility of currently playing song

---------

Co-authored-by: jeffvli <jeffvictorli@gmail.com>
2024-03-04 18:53:00 -08:00
Jeff 742cef3d81 Merge pull request #519 from kgarner7/related-similar-songs
[enhancement]: Make related tab on full screen player useful
2024-03-04 05:29:27 -08:00
Jeff 132b0e173f Merge branch 'development' into related-similar-songs 2024-03-04 05:04:54 -08:00
Jeff f7f3c5fe30 Merge pull request #517 from kgarner7/navidrome-shared-playlists
[enhancement]: Differentiate shared and owner playlists for Navidrome
2024-03-04 02:41:40 -08:00
jeffvli 83b5afb187 Remove ServerType check on shared playlist display 2024-03-04 02:37:37 -08:00
Kendall Garner 237fb91a60 [enhancement]: Differentiate shared and owner playlists for Navidrome
Resolves #368. If Navidrome, post-process the playlist list and separate
into owned and shared (in that order).
2024-03-04 02:29:35 -08:00
Jeff 8265ce48c4 Merge pull request #510 from kgarner7/improve-navidrome-auth
[bugfix]: Check for Navidrome authentication on startup
2024-03-04 02:27:10 -08:00
Jeff bf3431cbc6 Merge pull request #514 from kgarner7/navidrome-version
[enhancement]: Better version checks
2024-03-04 01:49:33 -08:00
Jeff cc6cad1d70 Merge branch 'development' into navidrome-version 2024-03-04 01:49:13 -08:00
jeffvli c8b1e2312a Change smart playlist feature check 2024-03-04 01:44:11 -08:00
jeffvli 84837a6887 Prevent version check from running on every query in Navidrome 2024-03-03 22:16:25 -08:00
jeffvli f1f6ccfd02 Normalize server feature set 2024-03-03 22:15:49 -08:00
Kendall Garner f50d1e0a8c support opacity 0, spellcheck 2024-03-01 19:54:30 -08:00
Kendall Garner 753ca01d41 [bugfix]: fix update rating for items with no data node 2024-02-29 17:28:46 -08:00
jeffvli 960c126283 Fix incorrect album artist sidebar icon 2024-02-28 21:07:50 -08:00
Kendall Garner 94b649fefe don't transform artist/album for fullscreen player 2024-02-26 22:47:17 -08:00
Alberto Rodríguez 28bb699024 Add a pre-defined server for the docker version (#413)
* Moved build to docker stage.

* Do not copy node_modules to the docker image

* Optimize Docker builds

* Lock a predefined server with enviroment variables

* Added a example docker compose file

* Removed useless layer

* Fix error with empty server type

* pass process via preload, use file, strict server check

* remove duplicate content-type

* update readme, docker compose

* bugfix: server lock false, not jellyfin

* fix preload type definition

* fix docker, web server lock check

---------

Co-authored-by: Kendall Garner <17521368+kgarner7@users.noreply.github.com>
2024-02-24 06:55:23 +00:00
Kendall Garner 5caf0d439f [enhancement]: Start minimized (#522)
* [enhancement]: support starting minimized

* show window when dock clicked macos
2024-02-23 16:31:17 +00:00
dependabot[bot] 77fa723cf8 Bump the npm_and_yarn group across 2 directories with 1 update (#521)
Bumps the npm_and_yarn group with 1 update in the /. directory: [ip](https://github.com/indutny/node-ip).


Updates `ip` from 1.1.5 to 1.1.9
- [Commits](https://github.com/indutny/node-ip/compare/v1.1.5...v1.1.9)

---
updated-dependencies:
- dependency-name: ip
  dependency-type: indirect
  dependency-group: npm_and_yarn-security-group
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-22 03:49:44 +00:00
Kendall Garner 77e220c873 [enhancement]: add codec column for tracks 2024-02-19 23:04:41 -08:00
Kendall Garner 860dd8b499 [enhancement]: add codec column for tracks 2024-02-19 20:34:36 -08:00
Kendall Garner 9113c6cc2e [bugfix]: carousel fixes 2024-02-19 13:55:11 -08:00
Kendall Garner 12d0eca2dd remember that current song can be an object 2024-02-19 10:27:00 -08:00
Kendall Garner 3a116e938e omit song from similar list, handle subsonic error 2024-02-19 10:09:05 -08:00
Kendall Garner f81bea339b don't pass song all the way down 2024-02-19 09:55:37 -08:00
Kendall Garner c947d09615 show nothing if no song exists 2024-02-19 09:01:44 -08:00
Kendall Garner af90d07414 bugfix 2024-02-19 08:56:06 -08:00
Kendall Garner 025124c379 [enhancement]: Make related tab on full screen player useful
Resolves #50. Adds a new set of components for fetching similar songs
from the current playing song. For Jellyfin, use the `/items/{itemId}/similar`
endpoint (may not work well for small libraries), and for Navidrome/Subsonic
use `getSimilarSongs`. _In theory_, this component can be used to get similar
songs anywhere.
2024-02-19 08:53:50 -08:00
Kendall Garner 74075fc374 [bugfix]: remove window clear cache handler in main for MacOS 2024-02-18 17:05:45 -08:00
Kendall Garner dae2f9bd0a [feat]: actually include version checks 2024-02-17 00:57:10 -08:00
jeffvli 9a43ea0e4a Attempt to fix player unresponsive on first start 2024-02-16 22:12:28 -08:00
Kendall Garner 2f105956b9 Improve grid size, language 2024-02-16 21:42:15 -08:00
Kendall Garner ce9c03b0e1 [bugfix]: Macos trusted accessibility (#512)
* [bugfix]: macos trusted accessibility

* update readme
2024-02-17 03:55:57 +00:00
Kendall Garner 1e5d446ced [bugfix]: song list play count -> genre 2024-02-16 13:53:42 -08:00
Kendall Garner b2fce071a9 [bugfix]: Check for Navidrome authentication on startup
Resolves #403.
This PR introduces a startup check for Navidrome that tries a simple API request (/songs) before loading homepage.
If the check fails, Navidrome API will fallback to trying saved password (if available).

Notes:
- It might also be worthwhile to do a periodic poll?
2024-02-16 13:37:49 -08:00
Kendall Garner 20b161ee86 [enhancement]: prreserve current song position when shuffling queue 2024-02-14 22:59:44 -08:00
darkpixlz 6e677d7454 Image Resolution Setting (#492)
* Add customizable resolution for the fullscreen player image

---------

Co-authored-by: iiPython <ben@iipython.dev>
Co-authored-by: Benjamin <iipython@proton.me>
2024-02-13 18:00:59 -08:00
Kendall Garner f796a35f5c [enhancement]: support reordering homepage (#494)
* [enhancement]: support reordering homepage

---------

Co-authored-by: jeffvli <jeffvictorli@gmail.com>
2024-02-13 17:56:08 -08:00
Jeff 83d5fee442 Merge pull request #484 from kgarner7/fix-structured-lyrics
[bugfix/enhancement]: Support Navidrome structured lyrics
2024-02-13 16:17:24 -08:00
Jeff eab11658bb Merge pull request #501 from kgarner7/allow-no-mpv
- OOBE default to web player
- Allow mpv to run using PATH env
- Add improved mpv error logging
- Add web player fallback on mpv error
2024-02-13 16:16:01 -08:00
jeffvli b4092c394a Set playback type to WEB by default 2024-02-13 05:50:38 -08:00
jeffvli 9b0c9ba3ac Fallback to web player if mpv fails to run 2024-02-13 02:05:59 -08:00
Kendall Garner e6b01d4e2b [bugfix]: set MPV queue when now or queue is empty 2024-02-13 00:04:28 -08:00
jeffvli fb08502e51 Add mpv path reload and clear functionality 2024-02-12 21:21:17 -08:00
jeffvli 8f4ff9286a Allow deletion on local settings keys 2024-02-12 20:50:50 -08:00
jeffvli dcd130fb6c Refactor mpv log to allow for custom toast 2024-02-12 20:50:09 -08:00
jeffvli 60105103f3 Improve mpv error logging 2024-02-12 20:11:55 -08:00
jeffvli ff4ce89bc9 Remove "disable mpv" setting and desktop requirement 2024-02-12 14:14:08 -08:00
jeffvli eb4d099804 Increase toast duration defaults 2024-02-12 14:04:19 -08:00
jeffvli b69290f9f2 Add listeners and preload for log/toast from main 2024-02-12 14:02:59 -08:00
jeffvli 69f82a9427 Add logger functions and move player functions to feature 2024-02-12 13:58:50 -08:00
jeffvli adf5fc348a Bump electron-log 2024-02-12 13:50:02 -08:00
Kendall Garner f82da2e76b [enhancement]: Support disabling MPV entirely
Supports running Feishin solely using web audio (useful for clients with problems with MPV).
Also moves save/restore queue to utils, as MPV object is now optional
2024-02-11 13:56:29 -08:00
Kendall Garner 8de21a707c Merge pull request #500 from jeffvli/dependabot/npm_and_yarn/npm_and_yarn-security-group-593a984358
Bump the npm_and_yarn group across 2 directories with 2 updates
2024-02-10 09:23:52 +00:00
dependabot[bot] 1f1916f005 Bump the npm_and_yarn group across 2 directories with 2 updates
Bumps the npm_and_yarn group with 2 updates in the /. directory: [semver](https://github.com/npm/node-semver) and [eslint-plugin-compat](https://github.com/amilajack/eslint-plugin-compat).
Bumps the npm_and_yarn group with 1 update in the /release/app directory: [semver](https://github.com/npm/node-semver).


Updates `semver` from 7.3.8 to 7.6.0
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.3.8...v7.6.0)

Updates `eslint-plugin-compat` from 4.1.4 to 4.2.0
- [Release notes](https://github.com/amilajack/eslint-plugin-compat/releases)
- [Changelog](https://github.com/amilajack/eslint-plugin-compat/blob/main/CHANGELOG.md)
- [Commits](https://github.com/amilajack/eslint-plugin-compat/compare/v4.1.4...v4.2.0)

Updates `semver` from 6.3.0 to 6.3.1
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.3.8...v7.6.0)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: indirect
  dependency-group: npm_and_yarn-security-group
- dependency-name: eslint-plugin-compat
  dependency-type: direct:development
  dependency-group: npm_and_yarn-security-group
- dependency-name: semver
  dependency-type: indirect
  dependency-group: npm_and_yarn-security-group
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-10 08:43:06 +00:00
Kendall Garner ae8fc6df13 [bugfix]: improve play behavior
- when adding songs to queue, only `play()` if the queue was empty
- when adding next/last to empty queue, behavior should be same as now
2024-02-10 00:38:21 -08:00
Kendall Garner 0a658e3a22 [bugfix]: default go libsecret, support changing secret store (#493)
* [bugfix]: default go libsecret, support changing secret store

* update readme and rename libsecret
2024-02-09 23:20:01 +00:00
Kendall Garner 92478b5ca5 [bugfix]: update mpris volume when set by mpris 2024-02-07 20:51:07 -08:00
Kendall Garner 49cbef729b encode uri component for authorization header 2024-02-07 20:29:29 -08:00
Kendall Garner 73c6ddd116 Merge branch 'development' of github.com:jeffvli/feishin into development 2024-02-04 10:24:24 -08:00
Kendall Garner e3553074a3 [bugfix]: use accent color for cache clearing 2024-02-04 10:23:45 -08:00
lymnyx 29df2a6215 [bugfix/enhancement] Fixes german translations being sentence-case (#491)
* Fixes german translations' case (#490).

* Smaller improvements to german translations.

* Changes to sentenceCasePostProcessor.
2024-02-04 06:47:52 -08:00
Kendall Garner aba7cb302f add navidrome version check for smart playlists 2024-02-03 22:47:57 -08:00
Kendall Garner 46cc1a635f address changes 2024-02-03 21:22:03 -08:00
Kendall Garner 6520a105d2 Merge pull request #489 from lymnyx/mostplayed-bugfix
[bugfix] Fixes route of most played songs on home page
2024-02-04 02:29:16 +00:00
lymnyx 69cb63a8b0 Fixes route of most played songs in home (#434). 2024-02-04 02:27:26 +01:00
Benjamin 1fb7290603 [bugfix] Fix global hotkeys not working on startup (#488)
* Simple one line fix for global hotkeys

* Clean up codebase via default values
2024-02-04 00:37:53 +00:00
Kendall Garner 24bf7ae31f [enhancement/localization]: sort navidrome albums by year, add more language keys 2024-02-03 15:05:33 -08:00
Benjamin 86a93866d0 [enhancement] Add a button size setting (#486)
* Add a button size setting

* Reduce setting size and add px suffix

* Looks like I don't need || inside of control-settings

* Update translation

* Bump settings version to 7
2024-02-03 21:22:26 +00:00
lymnyx 933573b57f Order artist's Top Songs by play count (#410). (#487) 2024-02-03 21:21:15 +00:00
Jeff ccb0e14e48 Merge pull request #450 from kgarner7/more-metadata
[feature]: Show album comment, Last.fm/MusicBrainz links
2024-02-02 14:56:46 -08:00
jeffvli aca6826221 Refactor artist biography to use spoiler 2024-02-02 01:39:19 -08:00
jeffvli 095edfd49f Add custom spoiler component 2024-02-02 01:38:58 -08:00
Kendall Garner 73cd647486 os lyrics 2024-02-01 23:53:10 -08:00
Kendall Garner 9e4664a54c Merge branch 'development' into fix-structured-lyrics 2024-02-01 22:13:41 -08:00
Kendall Garner efa0d9ec35 [enhancement]: larger player buttons, clearer random icon 2024-02-01 20:59:00 -08:00
Kendall Garner 9720fcc202 add server info query 2024-02-01 08:17:31 -08:00
jeffvli 7c25d12639 Enable external links by default 2024-02-01 04:14:02 -08:00
jeffvli 3daa1aef4b Normalize section spacing on album/artist detail pages 2024-02-01 04:06:56 -08:00
jeffvli 6aba41c3d9 Add spoiler UI component 2024-02-01 03:58:36 -08:00
Kendall Garner eff1cee6a3 [bugfix]: Fix repeated track scrobbling (#480)
* [bugfix]: Fix repeated track scrobbling

This commit fixes scrobbling tracks that are repeated in the queue (either due
to a REPEAT_ONE or just enqueued multiple times). There are two extra cases:

1. The current player changes. The player alternates from 1 -> 2 -> 1 whenever playback
finishes normally, so this is a sort of epoch that can be used to detect both repeat one
and track being enqueued multiple times.
2. The current index changes. The player gets set back to 1 in a variety of cases (most often
previous/next), so the check in (1) is not enough. However, the index changing will help identify
that this is a new song.

* use unique id instead
2024-02-01 04:12:39 +00:00
Kendall Garner 9995b2e774 [enhancement]: support clearing query and http cache (#475)
* [enhancement]: support clearing query and http cache

  - Adds the ability to invalidate all queries (useful for forcing refresh, and clearing lyrics which are cached forever)
  - [Desktop only] adds the ability to clear the Electron HTTP cache (e.g. cached images)

* use clearer language

* move cache settings to general
2024-01-31 06:27:56 +00:00
Kendall Garner 04a468f8c9 [bugfix]: fetch higher resolution artist images from Navidrome 2024-01-28 20:01:57 -08:00
Kendall Garner afb8510cd7 [enhancement]: increase padding for synchronizer lyric container 2024-01-28 19:42:23 -08:00
Kendall Garner 8287347f91 expose more mpris metadata 2024-01-28 14:26:02 -08:00
Kendall Garner 5cc2276781 [bugfix]: web player edge cases
Two bugs addressed in response to Safari changes:
1. Only handle `onEnded` for real streams, preventing `autoNext()` spam when the last track finishes
2. `.play()` is not necessarily a safe operation (if empty wave was started, can cause exception later). Catch this exception and discard it. This also only occurred when playing the last track
2024-01-28 01:50:51 -08:00
Kendall Garner 47ce0ed47b [bugfix]: fix repeat one with shuffle and one track 2024-01-28 00:49:17 -08:00
Kendall Garner f467a85a86 [bugfix]: use proper language key for lyrics size 2024-01-27 10:07:10 -08:00
Kendall Garner 097211954c [enhancement]: default to space for play/pause toggle 2024-01-27 08:15:13 -08:00
Kendall Garner 0cdfc64023 [bugfix]: allow Jellyfin to have empty password on edit 2024-01-26 22:54:50 -08:00
Kendall Garner bc7f4a5722 [bugfix]: Fix safari audio context (#471)
* test 3

* comments

* [bugfix]: SAFARI WHY. Use GainNode volume instead for volume control

* force vercel refresh?

* Revert "force vercel refresh?"

This reverts commit af31f38e03.

* move volume scaling calculation to setGain
2024-01-27 01:10:34 +00:00
Kendall Garner 8e7356fa7b Merge pull request #473 from kgarner7/fix-playlist-add-message
[bugfix]: Fix add to playlist success message
2024-01-27 00:51:00 +00:00
Kendall Garner bbf59a4942 [bugfix]: Fix add to playlist success message
The prior code used `form.addToPlaylist`, not `.success`. Also fixes English pluralization and
uses the correct `entity.track` as opposed to `entity.song` for other languages (I am not sure
if the en syntax could be applied to other languages, so I will just leave pluralization as-is
for now).
2024-01-25 23:58:21 -08:00
Kendall Garner 45e589fbb1 [enhancement]: use ColorInput for text rgb selection 2024-01-24 23:39:50 -08:00
Kendall Garner 527e6a76b5 [bugfix]: disable play button when queue is empty 2024-01-24 21:35:58 -08:00
Kendall Garner 362a88b6bc [bugfix]: fix race condition for opening play queue/playlist details 2024-01-24 21:15:11 -08:00
Kendall Garner 26102bd70a [bugfix]: do not change scroll position when focus changes 2024-01-24 21:05:26 -08:00
Kendall Garner 5f1d0a3b5e [bugfix]: Validate audio sample range, catch AudioContext error (#470) 2024-01-24 20:36:20 -08:00
Kendall Garner 3bca85b3a8 Merge pull request #435 from kgarner7/fix-init-timing
[bugfix]: defer restore queue until mpv exists
2024-01-23 05:18:20 +00:00
Kendall Garner 61ecd3253e Merge pull request #209 from jeffvli/fix/#202
Add frame to macOS native window bar
2024-01-23 05:07:10 +00:00
Kendall Garner 5e9ef9f23f use type, remove console 2024-01-22 18:52:14 -08:00
David Rappo c8701d1da4 Fixed incorrect label for album sort by release date (#458) 2024-01-22 10:09:15 -08:00
Kendall Garner b3a9e7ccba default theme dark 2024-01-21 22:58:10 -08:00
Kendall Garner 33972c2a83 titlebar switching 2024-01-21 22:47:59 -08:00
Kendall Garner f0f2f54e5a Merge remote-tracking branch 'upstream/development' into origin/fix/#202 2024-01-21 22:22:04 -08:00
Kendall Garner 99a188a62d Merge pull request #461 from jeffvli/dependabot/npm_and_yarn/follow-redirects-1.15.5
Bump follow-redirects from 1.15.2 to 1.15.5
2024-01-22 05:29:51 +00:00
Kendall Garner 1760e14ac5 Merge pull request #464 from jeffvli/dependabot/npm_and_yarn/release/app/electron-25.8.4
Bump electron from 25.3.0 to 25.8.4 in /release/app
2024-01-22 05:28:54 +00:00
Kendall Garner 888b5f9e90 Merge pull request #463 from jeffvli/dependabot/npm_and_yarn/postcss-8.4.33
Bump postcss from 8.4.27 to 8.4.33
2024-01-22 05:28:46 +00:00
Kendall Garner 5f099bedc2 Merge pull request #462 from jeffvli/dependabot/npm_and_yarn/babel/traverse-7.23.7
Bump @babel/traverse from 7.22.19 to 7.23.7
2024-01-22 05:28:39 +00:00
Kendall Garner b2bb2f33a9 Merge pull request #460 from jeffvli/dependabot/npm_and_yarn/zod-3.22.3
Bump zod from 3.21.4 to 3.22.3
2024-01-22 05:28:30 +00:00
dependabot[bot] f169fc7f3b Bump follow-redirects from 1.15.2 to 1.15.5
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.2 to 1.15.5.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.5)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-22 04:41:16 +00:00
Kendall Garner a970f967bc Merge pull request #459 from jeffvli/dependabot/npm_and_yarn/axios-1.6.0
Bump axios from 1.5.1 to 1.6.0
2024-01-22 04:40:18 +00:00
dependabot[bot] 7c0320d69a Bump electron from 25.3.0 to 25.8.4 in /release/app
Bumps [electron](https://github.com/electron/electron) from 25.3.0 to 25.8.4.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v25.3.0...v25.8.4)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-22 04:33:28 +00:00
dependabot[bot] 8fcfbce0d5 Bump postcss from 8.4.27 to 8.4.33
Bumps [postcss](https://github.com/postcss/postcss) from 8.4.27 to 8.4.33.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.27...8.4.33)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-22 04:33:15 +00:00
dependabot[bot] 432a128b85 Bump @babel/traverse from 7.22.19 to 7.23.7
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.22.19 to 7.23.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.23.7/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-22 04:33:13 +00:00
dependabot[bot] 85e889a414 Bump zod from 3.21.4 to 3.22.3
Bumps [zod](https://github.com/colinhacks/zod) from 3.21.4 to 3.22.3.
- [Release notes](https://github.com/colinhacks/zod/releases)
- [Changelog](https://github.com/colinhacks/zod/blob/master/CHANGELOG.md)
- [Commits](https://github.com/colinhacks/zod/compare/v3.21.4...v3.22.3)

---
updated-dependencies:
- dependency-name: zod
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-22 04:33:07 +00:00
dependabot[bot] 4df5c555b0 Bump axios from 1.5.1 to 1.6.0
Bumps [axios](https://github.com/axios/axios) from 1.5.1 to 1.6.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.5.1...v1.6.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-22 04:33:03 +00:00
marksdestiny 372b96a349 Improve the playback speed control (#437)
* Change playback speed selector to slider

* Improve playback speed bar

Display BPM
Improve style
Add markers

* Improve playback speed slider style
2024-01-21 20:06:46 -08:00
SlyFabi dcccccea2f Use startIndex in Jellyfin getPlaylistSongList (#449) 2024-01-21 19:46:34 -08:00
Leonardo Salgueiro 2095ff6ab9 Update scrobble-settings.tsx (#440) 2024-01-21 19:43:09 -08:00
Tarulia a0b761c9ac AppImage: Set proper categories on desktop entry (#430) 2024-01-21 19:41:23 -08:00
Kendall Garner ea67a18962 include lastfm/mbz links 2024-01-15 22:10:50 -08:00
Kendall Garner 5516daab6e enable comments, safer note 2024-01-15 20:46:06 -08:00
jeffvli 2f28cb07bc Reverse workflow changes 2024-01-14 08:32:33 -08:00
jeffvli 21cd657f0c Temporarily set releaseType to release 2024-01-14 08:18:49 -08:00
jeffvli 1ef7968834 Test electron builder action 2024-01-14 08:11:09 -08:00
jeffvli 925b1b4f68 Add release publish builds 2024-01-14 07:51:53 -08:00
jeffvli e7c665b0a0 Fix arm64 build command 2024-01-14 07:42:37 -08:00
jeffvli 245213d08a Remove unused rpm build target 2024-01-14 07:35:32 -08:00
Kendall Garner c5e08b643d [bugfix]: defer restore queue until mpv exists 2024-01-06 19:24:29 -08:00
jeffvli 960427fce8 Remove deb 2023-12-13 20:33:44 -08:00
jeffvli 118a9f3257 Separate regular and arm64 build 2023-12-13 20:32:03 -08:00
jeffvli 971bfe3823 Bump to v0.5.3 2023-12-13 19:40:51 -08:00
jeffvli 7765f14110 Add rpm and deb build targets 2023-12-13 19:39:06 -08:00
jeffvli 36b465504f Add arm64 linux build 2023-12-13 19:38:36 -08:00
jeffvli 7b639b45f7 Add new translations 2023-12-13 18:19:24 -08:00
Hosted Weblate 85d9162b12 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (519 of 519 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2023-12-13 09:28:56 +01:00
Hosted Weblate 36670b330f Translated using Weblate (Swedish)
Currently translated at 52.6% (273 of 519 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mattias <mattiasghodsian@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sv/
Translation: feishin/Translation
2023-12-13 09:28:56 +01:00
Hosted Weblate 9c380a8241 Translated using Weblate (French)
Currently translated at 99.4% (516 of 519 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <KosmoMoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2023-12-13 09:28:56 +01:00
Hosted Weblate c26820ee82 Translated using Weblate (Dutch)
Currently translated at 35.8% (186 of 519 strings)

Translated using Weblate (Dutch)

Currently translated at 32.3% (168 of 519 strings)

Translated using Weblate (Dutch)

Currently translated at 15.2% (79 of 519 strings)

Added translation using Weblate (Dutch)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Idris Saklou <idrissaklou@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/nl/
Translation: feishin/Translation
2023-12-13 09:28:56 +01:00
Hosted Weblate dccd6afc3d Translated using Weblate (Italian)
Currently translated at 99.0% (514 of 519 strings)

Translated using Weblate (Italian)

Currently translated at 96.5% (501 of 519 strings)

Co-authored-by: Aurora <arci@anche.no>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NicKoehler <grillinicola@proton.me>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translation: feishin/Translation
2023-12-13 09:28:56 +01:00
Hosted Weblate c6a520b0d7 Translated using Weblate (Polish)
Currently translated at 99.8% (518 of 519 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2023-12-13 09:28:56 +01:00
Hosted Weblate 1f4f3a5497 Translated using Weblate (Czech)
Currently translated at 100.0% (519 of 519 strings)

Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2023-12-13 09:28:56 +01:00
Hosted Weblate 58d04b3126 Translated using Weblate (German)
Currently translated at 88.8% (461 of 519 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Maik <maikguenes2003@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2023-12-13 09:28:56 +01:00
Hosted Weblate fcac4a5547 Translated using Weblate (Portuguese (Brazil))
Currently translated at 28.3% (147 of 519 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rafael Vieira <rafaelvieiras@pm.me>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2023-12-13 09:28:56 +01:00
Kendall Garner c05b474827 fix navi null date (#408) 2023-12-13 00:28:53 -08:00
mcneb10 a8814d3e8a Fix 'undefined' in window title when song has no artist name (#402) 2023-12-05 19:05:08 -08:00
Kendall Garner 3f9cdab450 convert value to number on set (#390) 2023-12-04 20:20:19 -08:00
jeffvli 1d2e9484d8 Bump node-abi version 2023-11-18 01:49:00 -08:00
jeffvli f5ec294e0c Add new languages 2023-11-18 01:32:59 -08:00
jeffvli 0beef2a0b7 Bump electron builder version 2023-11-18 01:30:19 -08:00
Hosted Weblate 86209b6272 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (518 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (518 of 518 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kaiyang Wu <self@origincode.me>
Co-authored-by: kare-Udon <laoliu735@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate b32afc0e49 Translated using Weblate (Serbian)
Currently translated at 100.0% (518 of 518 strings)

Added translation using Weblate (Serbian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ilija <zojka2g@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sr/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate 58c4ab4a67 Translated using Weblate (Swedish)
Currently translated at 43.4% (225 of 518 strings)

Added translation using Weblate (Swedish)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mattias <mattiasghodsian@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sv/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate bcbd169507 Translated using Weblate (French)
Currently translated at 94.9% (492 of 518 strings)

Translated using Weblate (French)

Currently translated at 94.2% (488 of 518 strings)

Translated using Weblate (French)

Currently translated at 94.2% (488 of 518 strings)

Translated using Weblate (French)

Currently translated at 90.3% (468 of 518 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <KosmoMoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate 55a4e74118 Translated using Weblate (Spanish)
Currently translated at 100.0% (518 of 518 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate e4c449d6de Translated using Weblate (Italian)
Currently translated at 96.1% (498 of 518 strings)

Translated using Weblate (Italian)

Currently translated at 96.1% (498 of 518 strings)

Co-authored-by: Aurora <arci@anche.no>
Co-authored-by: CraftWorks <thelonegamer87@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate aa5004c866 Translated using Weblate (Polish)
Currently translated at 98.6% (511 of 518 strings)

Translated using Weblate (Polish)

Currently translated at 98.6% (511 of 518 strings)

Co-authored-by: 7Adrian <7adrian.mail@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate a1aa5f323c Translated using Weblate (Czech)
Currently translated at 100.0% (518 of 518 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (518 of 518 strings)

Added translation using Weblate (Czech)

Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate 92f91be650 Translated using Weblate (Japanese)
Currently translated at 100.0% (518 of 518 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: aorinngoDo <aorinngo@email.cz>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ja/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate 419462b22b Translated using Weblate (Russian)
Currently translated at 72.2% (374 of 518 strings)

Translated using Weblate (Russian)

Currently translated at 72.0% (373 of 518 strings)

Translated using Weblate (Russian)

Currently translated at 72.0% (373 of 518 strings)

Co-authored-by: Arseniy <_senyaa@tutanota.com>
Co-authored-by: Gitized <s.v.lazarev.89@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate 22e31a7b09 Translated using Weblate (German)
Currently translated at 87.0% (451 of 518 strings)

Translated using Weblate (German)

Currently translated at 87.0% (451 of 518 strings)

Translated using Weblate (German)

Currently translated at 62.7% (325 of 518 strings)

Translated using Weblate (German)

Currently translated at 62.7% (325 of 518 strings)

Translated using Weblate (German)

Currently translated at 59.6% (309 of 518 strings)

Translated using Weblate (German)

Currently translated at 59.6% (309 of 518 strings)

Translated using Weblate (German)

Currently translated at 56.9% (295 of 518 strings)

Translated using Weblate (German)

Currently translated at 56.9% (295 of 518 strings)

Translated using Weblate (German)

Currently translated at 55.4% (287 of 518 strings)

Translated using Weblate (German)

Currently translated at 55.4% (287 of 518 strings)

Translated using Weblate (German)

Currently translated at 53.8% (279 of 518 strings)

Translated using Weblate (German)

Currently translated at 53.8% (279 of 518 strings)

Translated using Weblate (German)

Currently translated at 1.9% (10 of 518 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kobayashi <kobayashi90@protonmail.ch>
Co-authored-by: Rudi Mentaire <stoertebecker@byom.de>
Co-authored-by: ThetaDev <t.testboy@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
Hosted Weblate dce0284e0b Translated using Weblate (Portuguese (Brazil))
Currently translated at 23.5% (122 of 518 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 22.5% (117 of 518 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 13.3% (69 of 518 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rafael Vieira <rafaelvieiras@pm.me>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2023-11-18 10:18:08 +01:00
jeffvli 2afe7e8920 Bump to v0.5.2 2023-11-18 01:17:57 -08:00
jeffvli 9ca364dd0e Fix title case transformer 2023-11-17 02:03:01 -08:00
jeffvli ccd8d2b6b0 Add network error catch 2023-11-16 23:35:26 -08:00
jeffvli fdfbad68e2 Fix app single instance lock (#385) 2023-11-16 23:29:19 -08:00
jeffvli 48a529dd51 Bump electron to v27.1.0 (#383) 2023-11-16 10:17:39 -08:00
jeffvli bc40f93b59 Fix translation titlecase for accented characters (#357) 2023-11-12 03:46:12 -08:00
doggo cf544bea61 Fixed incorrect docker command argument (#365) 2023-11-12 03:40:38 -08:00
Samuli Piipponen f24cf5a928 Fix Discord status with no Artists (#359) 2023-11-12 03:40:28 -08:00
Kendall Garner 11af31c539 [bugfix]: correct text for albumDetail (#376) 2023-11-12 03:40:17 -08:00
jeffvli adc09e6bbf Bump to v0.5.1 2023-11-02 11:41:05 -07:00
jeffvli ba20dc0972 Add languages to config
- Spanish
- German
- French
- Italian
- Japanese
- Russian
- Portugese
- Polish
- Chinese (simplified)
2023-11-02 11:37:24 -07:00
Hosted Weblate 999b6afd0e Added translation using Weblate (Norwegian Bokmål)
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2023-11-02 19:33:32 +01:00
Hosted Weblate bf0cd0e76f Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (518 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (518 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.8% (517 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (518 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 95.5% (495 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 92.8% (481 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 91.5% (474 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.7% (465 of 518 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kaiyang Wu <self@origincode.me>
Co-authored-by: kare-Udon <laoliu735@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2023-11-02 19:33:32 +01:00
Hosted Weblate f98950fe19 Added translation using Weblate (Chinese (Traditional))
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kaiyang Wu <self@origincode.me>
2023-11-02 19:33:32 +01:00
Hosted Weblate 4e58feedd0 Translated using Weblate (English)
Currently translated at 100.0% (518 of 518 strings)

Co-authored-by: 7Adrian <7adrian.mail@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/en/
Translation: feishin/Translation
2023-11-02 19:33:32 +01:00
Hosted Weblate 50aa3960e6 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Chinese (Simplified))

Currently translated at 89.5% (464 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 56.7% (294 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 51.9% (269 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 51.1% (265 of 518 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 52.0% (265 of 509 strings)

Co-authored-by: Darwin <daerwendeshu@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: kare-Udon <laoliu735@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2023-11-02 03:58:29 +01:00
Hosted Weblate 5a821bf5ce Translated using Weblate (French)
Currently translated at 77.2% (393 of 509 strings)

Translated using Weblate (French)

Currently translated at 77.0% (392 of 509 strings)

Translated using Weblate (French)

Currently translated at 68.7% (350 of 509 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <KosmoMoustache@users.noreply.hosted.weblate.org>
Co-authored-by: KosmoMoustache <hosted.weblate.org@kosmo.ovh>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2023-11-02 03:58:29 +01:00
Hosted Weblate 123c9795dc Translated using Weblate (Spanish)
Currently translated at 100.0% (518 of 518 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (517 of 518 strings)

Translated using Weblate (Spanish)

Currently translated at 99.2% (514 of 518 strings)

Translated using Weblate (Spanish)

Currently translated at 88.6% (459 of 518 strings)

Translated using Weblate (Spanish)

Currently translated at 88.4% (458 of 518 strings)

Translated using Weblate (Spanish)

Currently translated at 88.4% (458 of 518 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jeff <jeffvictorli@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2023-11-02 03:58:29 +01:00
Hosted Weblate 6ac0b8734a Translated using Weblate (Italian)
Currently translated at 94.2% (488 of 518 strings)

Translated using Weblate (Italian)

Currently translated at 5.5% (29 of 518 strings)

Translated using Weblate (Italian)

Currently translated at 5.0% (26 of 518 strings)

Translated using Weblate (Italian)

Currently translated at 4.2% (22 of 518 strings)

Added translation using Weblate (Italian)

Co-authored-by: Aurora <arci@anche.no>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translation: feishin/Translation
2023-11-02 03:58:29 +01:00
Hosted Weblate 8f45d01d00 Translated using Weblate (Polish)
Currently translated at 98.8% (512 of 518 strings)

Translated using Weblate (Polish)

Currently translated at 83.2% (431 of 518 strings)

Translated using Weblate (Polish)

Currently translated at 83.2% (431 of 518 strings)

Translated using Weblate (Polish)

Currently translated at 76.2% (395 of 518 strings)

Translated using Weblate (Polish)

Currently translated at 74.6% (380 of 509 strings)

Translated using Weblate (Polish)

Currently translated at 46.5% (237 of 509 strings)

Co-authored-by: 7Adrian <7adrian.mail@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jeff <jeffvictorli@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2023-11-02 03:58:29 +01:00
Hosted Weblate 809f2683a2 Translated using Weblate (Japanese)
Currently translated at 98.6% (511 of 518 strings)

Translated using Weblate (Japanese)

Currently translated at 97.6% (506 of 518 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jeff <jeffvictorli@gmail.com>
Co-authored-by: aorinngoDo <aorinngo@email.cz>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ja/
Translation: feishin/Translation
2023-11-02 03:58:29 +01:00
Hosted Weblate 8e0ef96596 Translated using Weblate (Russian)
Currently translated at 36.9% (188 of 509 strings)

Translated using Weblate (Russian)

Currently translated at 18.0% (92 of 509 strings)

Added translation using Weblate (Russian)

Co-authored-by: Arseniy <_senyaa@tutanota.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/
Translation: feishin/Translation
2023-11-02 03:58:29 +01:00
Hosted Weblate f74c2bc4e2 Translated using Weblate (English)
Currently translated at 100.0% (518 of 518 strings)

Translated using Weblate (English)

Currently translated at 100.0% (509 of 509 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jeff <jeffvictorli@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/en/
Translation: feishin/Translation
2023-11-02 03:58:29 +01:00
Hosted Weblate 8e8380854e Translated using Weblate (German)
Currently translated at 1.3% (7 of 518 strings)

Added translation using Weblate (German)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kobayashi <kobayashi90@protonmail.ch>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2023-11-02 03:58:29 +01:00
Hosted Weblate 0a48add9f4 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Portuguese (Brazil))

Currently translated at 3.0% (16 of 518 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 2.5% (13 of 518 strings)

Added translation using Weblate (Portuguese (Brazil))

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rafael Vieira <rafaelvieiras@pm.me>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2023-11-02 03:58:29 +01:00
jeffvli b05d532941 Add missing translation keys to sidebar 2023-11-01 05:40:42 -07:00
jeffvli d517afdfd3 Set fullscreen player text shadow to css var 2023-11-01 04:00:58 -07:00
jeffvli 63e441429e Set most played to display songs on Jellyfin (#324) 2023-11-01 03:57:30 -07:00
jeffvli c46fa75266 Add imageSize parameter to song list hook 2023-11-01 03:51:03 -07:00
jeffvli fd851714ae Add missing translation keys to list filters 2023-11-01 03:32:28 -07:00
jeffvli 364f53e124 Increase sidebar image scale from 300px -> 450px 2023-10-31 22:03:48 -07:00
jeffvli 9756ed2d27 Fix translation key 2023-10-31 22:03:48 -07:00
Kendall Garner 6bd836fad0 [bugfix]: Remove setting path in attempt to bypass bug (#344)
* Remove setting path in attempt to bypass bug
2023-10-31 22:02:34 -07:00
Hosted Weblate 327fa2b02f Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Chinese (Simplified))

Currently translated at 51.7% (263 of 508 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 51.7% (263 of 508 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 51.7% (263 of 508 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 15.7% (80 of 508 strings)

Added translation using Weblate (Chinese (Simplified))

Co-authored-by: Darwin <daerwendeshu@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ken <kenxu2022@gmail.com>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2023-11-01 00:45:28 +01:00
Hosted Weblate 88922766db Translated using Weblate (French)
Currently translated at 67.9% (345 of 508 strings)

Translated using Weblate (French)

Currently translated at 66.9% (340 of 508 strings)

Translated using Weblate (French)

Currently translated at 50.0% (254 of 508 strings)

Translated using Weblate (French)

Currently translated at 49.6% (252 of 508 strings)

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (French)

Currently translated at 49.2% (250 of 508 strings)

Added translation using Weblate (French)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <hosted.weblate.org@kosmo.ovh>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2023-11-01 00:45:28 +01:00
Hosted Weblate f5b185f5f0 Translated using Weblate (Spanish)
Currently translated at 82.0% (417 of 508 strings)

Added translation using Weblate (Spanish)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2023-11-01 00:45:28 +01:00
Hosted Weblate ce08a70d89 Translated using Weblate (Polish)
Currently translated at 16.5% (84 of 508 strings)

Added translation using Weblate (Polish)

Co-authored-by: FaboThePlayer <fabianszafranski@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mistify <fabianszafranski@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2023-11-01 00:45:28 +01:00
Hosted Weblate b635eb20cf Translated using Weblate (Japanese)
Currently translated at 99.8% (507 of 508 strings)

Added translation using Weblate (Japanese)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: aorinngoDo <aorinngo@email.cz>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ja/
Translation: feishin/Translation
2023-11-01 00:45:28 +01:00
Hosted Weblate 9b0fad6742 Translated using Weblate (English)
Currently translated at 100.0% (508 of 508 strings)

Translated using Weblate (English)

Currently translated at 100.0% (508 of 508 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jeff <jeffvictorli@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/en/
Translation: feishin/Translation
2023-11-01 00:45:28 +01:00
jeffvli 401912a70c Fix translation keys on full screen player 2023-10-31 04:17:15 -07:00
jeffvli cd3ec158d3 Fix opacity on fullscreen player queue 2023-10-31 04:16:46 -07:00
jeffvli d51ca37e1b Bump to v0.5.0 2023-10-31 03:10:51 -07:00
jeffvli 9d8dcc7ade Add weblate notice 2023-10-31 00:24:29 -07:00
Jeff 8430b1ec95 Add localization support (#333)
* Add updated i18n config and en locale
2023-10-30 19:22:45 -07:00
Martin Pauli 11863fd4c1 Fix clear rating hotkey (#338) 2023-10-30 18:50:48 -07:00
Nicholas Malcolm cf9c7e2640 Build docker container for arm (#336)
* Build all supported container platforms

* Remove less popular platforms
2023-10-30 18:50:21 -07:00
Kendall Garner 9d780e0342 [bugfix]: prevent default (#334)
* [bugfix]: prevent default on rating
2023-10-28 21:10:52 -07:00
Kendall Garner 4ec981df83 [bugfix/feature]: Improve ratings (#332)
* [bugfix/feature]: Improve ratings

Fix: add preventDefault/stopPropagation to prevent scrolling to top in queue
Feat: instead of double click for clear, click on same value
2023-10-28 20:00:01 -07:00
jeffvli e5564c2ac2 Add additional dependencies to linux build (#320) 2023-10-28 16:51:07 -07:00
Martin Pauli 7a580c2c65 Add favorite hotkey options (#326)
* Add favorite hotkey options

* Update wording

---------

Co-authored-by: Jeff <42182408+jeffvli@users.noreply.github.com>
2023-10-27 18:22:16 -07:00
jeffvli ac84088c69 Set owner field edit to Navidrome only (#327) 2023-10-26 16:42:21 -07:00
jeffvli 3c2e4d40ec Update play button for dynamic theme 2023-10-23 15:45:47 -07:00
jeffvli fdff79496a Set pause status on last track end (#291) 2023-10-23 09:02:48 -07:00
jeffvli ccfadda729 Add play count to jellyfin album sort (#324) 2023-10-23 08:37:04 -07:00
jeffvli f21b8d6bbd Update base button styles
- Use brightness filter for hover/focus styles
- Re-add default active style
2023-10-23 08:24:23 -07:00
jeffvli 244c00c4c6 Add discord rich presence (#72) 2023-10-23 06:58:39 -07:00
Kendall Garner 2664a80851 Support changing playback rate (#275)
* initial idea for playback rate

* Add transparency to dropdown

* Move playback speed component to right controls

* Set mpv speed on startup

---------

Co-authored-by: jeffvli <jeffvictorli@gmail.com>
2023-10-22 17:47:44 -07:00
Kendall Garner 742b13d65e [Feature] Support changing accent/primary color (#282)
* [Feature] Support changing accent/primary color

- adds color picker to settings with five swatches (blue default, yellow green and red imported from sonixd, purple new)
- changing color will change the appropriate css variable

* Remove hover styles that use an alternate primary

---------

Co-authored-by: Jeff <42182408+jeffvli@users.noreply.github.com>
Co-authored-by: jeffvli <jeffvictorli@gmail.com>
2023-10-22 17:46:28 -07:00
jeffvli 8dcd49d574 Fix add to playlist from artist page (#296) 2023-10-22 16:18:55 -07:00
jeffvli 02c8cbcad6 Revert jellyfin getPlaylistList implementation (#272) 2023-10-22 16:00:41 -07:00
jeffvli 86fb52f6d4 Fix current song row when queue is empty 2023-10-22 15:57:15 -07:00
Kendall Garner 452ef783f2 [bugfix/feat]: always fetch artist image for Navidrome (#317)
* [bugfix/feat]: always fetch artist image for Navidrome

* Add error fallback to library header image

---------

Co-authored-by: jeffvli <jeffvictorli@gmail.com>
2023-10-22 15:46:48 -07:00
Kendall Garner 74cab01013 [feature]: Support using system fonts (#304)
* [feature]: Support using system fonts

Uses the **experimental** queryLocalFonts API, when prompted, to get the fonts and do CSS.
Resolves #270 and #288 (by proxy)

Caveats/notes:
- This is experimental, and is only supported by Chrome/Chromium/Edgeium (see https://caniuse.com/?search=querylocalfonts)
- As far as I can tell, the only way to dynamically change the font (shown in https://wicg.github.io/local-font-access/#example-style-with-local-fonts) was by DOM manipulation; css variables did not seem to work
- This shows **all** fonts, including their variants (bold/italic/etc); given that the style names could be localized, not sure of a way to parse this (on my system, for instance, I had 859 different combinations)
- I made fonts a separate top-level setting because it was easier to manipulate without causing as many rerenders; feel free to put that back

* add permission chec

* add electron magic to support custom font

* restrict content types
2023-10-22 15:25:17 -07:00
Kendall Garner e6ed9229c2 [bugfix]: fix queue offset when removing tracks (#301)
* [bugfix]: fix queue offset when removing tracks

* Fix song index numbers when removing songs

---------

Co-authored-by: jeffvli <jeffvictorli@gmail.com>
2023-10-22 15:21:31 -07:00
jeffvli 3a144ab821 Fix query editor not scrolling (#322) 2023-10-22 15:09:48 -07:00
jeffvli 913e89b01b Set column defs on play queue to use correct row index 2023-10-19 04:33:09 -07:00
jeffvli 768a88de8f Fix row refresh on status change for current song 2023-10-19 03:37:17 -07:00
jeffvli 8e2a107d4a Fix className clash on current song 2023-10-19 03:36:16 -07:00
jeffvli e77efcf836 Add artist name to window title 2023-10-18 20:49:50 -07:00
jeffvli 818f155993 Hide playing icon if player is paused 2023-10-18 19:55:57 -07:00
jeffvli b28fe4cbc9 Convert play icon from base64 to svg 2023-10-18 19:51:55 -07:00
Kendall Garner 8a53fab751 add more emphasis to current song (#283)
* add more emphasis to current song

* add css indicator (rivolumelineup)

* don't use absolute position, support album track number

* Respect order of set-queue function (fix race condition)

* Fix table row actions button on album detail and play queue

* Fix album detail table customizations

* Bump to v0.4.1

* Fix opacity mask for unsynced lyrics container

* Separate sidebar icons to new component

- Fixes react render issue

* Add app focus hook

* Remove css play image

* Add player status as cell refresh condition for queue

* Add current song images

* Add current song styles for all song tables

* Revert row index cell width

* Remove animated svg on browser

---------

Co-authored-by: jeffvli <jeffvictorli@gmail.com>
Co-authored-by: Jeff <42182408+jeffvli@users.noreply.github.com>
2023-10-18 18:32:11 -07:00
Kendall Garner 9964f95d5d [Remote] Full PWA support, misc bugfixes (#280)
- Fix setting remote port properly
- Add web worker support (so it can be installed as an "app")
- build fixes/removing stray console.log
2023-10-18 10:49:09 -07:00
Kendall Garner fe298d3232 Reset Carousel position on data refresh (#303)
* Reset Carousel position on data refresh

* add refresh for all carousels
2023-10-18 10:47:55 -07:00
Kendall Garner 03e582f301 [feature]: support running feishin on custom path (#307)
* [feature]: support running feishin on custom path

* add details in readme
2023-10-17 22:10:53 -07:00
Kendall Garner d7b3d5c0bd [bugfix]: do not duplicate tracks when adding to multiple playlists (#300) 2023-10-17 16:11:14 -07:00
Kendall Garner 5fdf4c06f9 properly implement Jellyfin getSongDetail (#298) 2023-10-17 16:05:44 -07:00
TacoCake c7aa5d09c9 In the fullscreen player use dynamic resolution for the main image (#290)
* In the fullscreen player use dynamic resolution for the main image

* Use ceil instead of round

* Add types and lint

---------

Co-authored-by: Jeff <42182408+jeffvli@users.noreply.github.com>
2023-10-17 06:47:50 -07:00
Kendall Garner f4f73289c9 [bugfix]: remove ignore CORS/SSL switches from web version (#305) 2023-10-17 06:21:36 -07:00
Lily Rose ac7ec133db Replace hardcoded Jellyfin authentication DeviceId to include hostname and username (#312) 2023-10-17 06:21:15 -07:00
Kendall Garner 1a948ab86b fix artist discography year filter (#299) 2023-10-17 06:05:36 -07:00
Kendall Garner f6667a39a0 fix toggle replay (#292) 2023-10-17 05:49:29 -07:00
jeffvli cbeb4ab7d8 Separate sidebar icons to new component
- Fixes react render issue
2023-10-17 05:46:42 -07:00
jeffvli 6f969294b0 Set macos titlebarstyle to default 2023-08-10 01:54:15 -07:00
jeffvli 3c278d5e17 Add frame to macOS native window bar 2023-08-09 21:07:27 -07:00
787 changed files with 69044 additions and 64045 deletions
+3
View File
@@ -0,0 +1,3 @@
node_modules
Dockerfile
docker-compose.*
+4 -7
View File
@@ -1,12 +1,9 @@
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
trim_trailing_whitespace = true
-7
View File
@@ -1,7 +0,0 @@
{
"rules": {
"no-console": "off",
"global-require": "off",
"import/no-dynamic-require": "off"
}
}
-64
View File
@@ -1,64 +0,0 @@
/**
* Base webpack config used across other specific configs
*/
import webpack from 'webpack';
import { dependencies as externals } from '../../release/app/package.json';
import webpackPaths from './webpack.paths';
import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin';
const createStyledComponentsTransformer = require('typescript-plugin-styled-components').default;
const styledComponentsTransformer = createStyledComponentsTransformer();
const configuration: webpack.Configuration = {
externals: [...Object.keys(externals || {})],
module: {
rules: [
{
exclude: /node_modules/,
test: /\.[jt]sx?$/,
use: {
loader: 'ts-loader',
options: {
// Remove this line to enable type checking in webpack builds
transpileOnly: true,
getCustomTransformers: () => ({ before: [styledComponentsTransformer] }),
},
},
},
],
},
output: {
// https://github.com/webpack/webpack/issues/1114
library: {
type: 'commonjs2',
},
path: webpackPaths.srcPath,
},
plugins: [
new webpack.EnvironmentPlugin({
NODE_ENV: 'production',
}),
],
/**
* Determine the array of extensions that should be used to resolve modules.
*/
resolve: {
extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'],
fallback: {
child_process: false,
},
plugins: [new TsconfigPathsPlugin({ baseUrl: webpackPaths.srcPath })],
modules: [webpackPaths.srcPath, 'node_modules'],
},
stats: 'errors-only',
};
export default configuration;
-3
View File
@@ -1,3 +0,0 @@
/* eslint import/no-unresolved: off, import/no-self-import: off */
module.exports = require('./webpack.config.renderer.dev').default;
-84
View File
@@ -1,84 +0,0 @@
/**
* Webpack config for production electron main process
*/
import path from 'path';
import TerserPlugin from 'terser-webpack-plugin';
import webpack from 'webpack';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import { merge } from 'webpack-merge';
import checkNodeEnv from '../scripts/check-node-env';
import deleteSourceMaps from '../scripts/delete-source-maps';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
checkNodeEnv('production');
deleteSourceMaps();
const devtoolsConfig =
process.env.DEBUG_PROD === 'true'
? {
devtool: 'source-map',
}
: {};
const configuration: webpack.Configuration = {
...devtoolsConfig,
mode: 'production',
target: 'electron-main',
entry: {
main: path.join(webpackPaths.srcMainPath, 'main.ts'),
preload: path.join(webpackPaths.srcMainPath, 'preload.ts'),
},
output: {
path: webpackPaths.distMainPath,
filename: '[name].js',
},
optimization: {
minimizer: [
new TerserPlugin({
parallel: true,
}),
],
},
plugins: [
new BundleAnalyzerPlugin({
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
}),
/**
* Create global constants which can be configured at compile time.
*
* Useful for allowing different behaviour between development builds and
* release builds
*
* NODE_ENV should be production so that modules do not perform certain
* development checks
*/
new webpack.EnvironmentPlugin({
NODE_ENV: 'production',
DEBUG_PROD: false,
START_MINIMIZED: false,
}),
],
/**
* Disables webpack processing of __dirname and __filename.
* If you run the bundle in node.js it falls back to these values of node.js.
* https://github.com/webpack/webpack/issues/2010
*/
node: {
__dirname: false,
__filename: false,
},
};
export default merge(baseConfig, configuration);
@@ -1,70 +0,0 @@
import path from 'path';
import webpack from 'webpack';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import { merge } from 'webpack-merge';
import checkNodeEnv from '../scripts/check-node-env';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
// at the dev webpack config is not accidentally run in a production environment
if (process.env.NODE_ENV === 'production') {
checkNodeEnv('development');
}
const configuration: webpack.Configuration = {
devtool: 'inline-source-map',
mode: 'development',
target: 'electron-preload',
entry: path.join(webpackPaths.srcMainPath, 'preload.ts'),
output: {
path: webpackPaths.dllPath,
filename: 'preload.js',
},
plugins: [
new BundleAnalyzerPlugin({
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
}),
/**
* Create global constants which can be configured at compile time.
*
* Useful for allowing different behaviour between development builds and
* release builds
*
* NODE_ENV should be production so that modules do not perform certain
* development checks
*
* By default, use 'development' as NODE_ENV. This can be overriden with
* 'staging', for example, by changing the ENV variables in the npm scripts
*/
new webpack.EnvironmentPlugin({
NODE_ENV: 'development',
}),
new webpack.LoaderOptionsPlugin({
debug: true,
}),
],
/**
* Disables webpack processing of __dirname and __filename.
* If you run the bundle in node.js it falls back to these values of node.js.
* https://github.com/webpack/webpack/issues/2010
*/
node: {
__dirname: false,
__filename: false,
},
watch: true,
};
export default merge(baseConfig, configuration);
-120
View File
@@ -1,120 +0,0 @@
import 'webpack-dev-server';
import path from 'path';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import webpack from 'webpack';
import { merge } from 'webpack-merge';
import checkNodeEnv from '../scripts/check-node-env';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
// at the dev webpack config is not accidentally run in a production environment
if (process.env.NODE_ENV === 'production') {
checkNodeEnv('development');
}
const port = process.env.PORT || 4343;
const configuration: webpack.Configuration = {
devtool: 'inline-source-map',
mode: 'development',
target: ['web'],
entry: [path.join(webpackPaths.srcRemotePath, 'index.tsx')],
output: {
path: webpackPaths.dllPath,
publicPath: '/',
filename: 'remote.js',
library: {
type: 'umd',
},
},
module: {
rules: [
{
test: /\.s?css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: true,
sourceMap: true,
importLoaders: 1,
},
},
'sass-loader',
],
include: /\.module\.s?(c|a)ss$/,
},
{
test: /\.s?css$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
exclude: /\.module\.s?(c|a)ss$/,
},
// Fonts
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
type: 'asset/resource',
},
// Images
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource',
},
],
},
plugins: [
new webpack.NoEmitOnErrorsPlugin(),
/**
* Create global constants which can be configured at compile time.
*
* Useful for allowing different behaviour between development builds and
* release builds
*
* NODE_ENV should be production so that modules do not perform certain
* development checks
*
* By default, use 'development' as NODE_ENV. This can be overriden with
* 'staging', for example, by changing the ENV variables in the npm scripts
*/
new webpack.EnvironmentPlugin({
NODE_ENV: 'development',
}),
new webpack.LoaderOptionsPlugin({
debug: true,
}),
new HtmlWebpackPlugin({
filename: path.join('index.html'),
template: path.join(webpackPaths.srcRemotePath, 'index.ejs'),
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
minify: {
collapseWhitespace: true,
removeAttributeQuotes: true,
removeComments: true,
},
isBrowser: true,
env: process.env.NODE_ENV,
isDevelopment: process.env.NODE_ENV !== 'production',
nodeModules: webpackPaths.appNodeModulesPath,
}),
],
node: {
__dirname: false,
__filename: false,
},
watch: true,
};
export default merge(baseConfig, configuration);
-132
View File
@@ -1,132 +0,0 @@
/**
* Build config for electron renderer process
*/
import path from 'path';
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
import TerserPlugin from 'terser-webpack-plugin';
import webpack from 'webpack';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import { merge } from 'webpack-merge';
import checkNodeEnv from '../scripts/check-node-env';
import deleteSourceMaps from '../scripts/delete-source-maps';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
checkNodeEnv('production');
deleteSourceMaps();
const devtoolsConfig =
process.env.DEBUG_PROD === 'true'
? {
devtool: 'source-map',
}
: {};
const configuration: webpack.Configuration = {
...devtoolsConfig,
mode: 'production',
target: ['web'],
entry: [path.join(webpackPaths.srcRemotePath, 'index.tsx')],
output: {
path: webpackPaths.distRemotePath,
publicPath: './',
filename: 'remote.js',
library: {
type: 'umd',
},
},
module: {
rules: [
{
test: /\.s?(a|c)ss$/,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
modules: true,
sourceMap: true,
importLoaders: 1,
},
},
'sass-loader',
],
include: /\.module\.s?(c|a)ss$/,
},
{
test: /\.s?(a|c)ss$/,
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
exclude: /\.module\.s?(c|a)ss$/,
},
// Fonts
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
type: 'asset/resource',
},
// Images
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource',
},
],
},
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
parallel: true,
}),
new CssMinimizerPlugin(),
],
},
plugins: [
/**
* Create global constants which can be configured at compile time.
*
* Useful for allowing different behaviour between development builds and
* release builds
*
* NODE_ENV should be production so that modules do not perform certain
* development checks
*/
new webpack.EnvironmentPlugin({
NODE_ENV: 'production',
DEBUG_PROD: false,
}),
new MiniCssExtractPlugin({
filename: 'remote.css',
}),
new BundleAnalyzerPlugin({
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
}),
new HtmlWebpackPlugin({
filename: 'index.html',
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
minify: {
collapseWhitespace: true,
removeAttributeQuotes: true,
removeComments: true,
},
isBrowser: false,
isDevelopment: process.env.NODE_ENV !== 'production',
}),
],
};
export default merge(baseConfig, configuration);
@@ -1,79 +0,0 @@
/**
* Builds the DLL for development electron renderer process
*/
import path from 'path';
import webpack from 'webpack';
import { merge } from 'webpack-merge';
import { dependencies } from '../../package.json';
import checkNodeEnv from '../scripts/check-node-env';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
checkNodeEnv('development');
const dist = webpackPaths.dllPath;
const configuration: webpack.Configuration = {
context: webpackPaths.rootPath,
devtool: 'eval',
mode: 'development',
target: 'electron-renderer',
externals: ['fsevents', 'crypto-browserify'],
/**
* Use `module` from `webpack.config.renderer.dev.js`
*/
module: require('./webpack.config.renderer.dev').default.module,
entry: {
renderer: Object.keys(dependencies || {}),
},
output: {
path: dist,
filename: '[name].dev.dll.js',
library: {
name: 'renderer',
type: 'var',
},
},
plugins: [
new webpack.DllPlugin({
path: path.join(dist, '[name].json'),
name: '[name]',
}),
/**
* Create global constants which can be configured at compile time.
*
* Useful for allowing different behaviour between development builds and
* release builds
*
* NODE_ENV should be production so that modules do not perform certain
* development checks
*/
new webpack.EnvironmentPlugin({
NODE_ENV: 'development',
}),
new webpack.LoaderOptionsPlugin({
debug: true,
options: {
context: webpackPaths.srcPath,
output: {
path: webpackPaths.dllPath,
},
},
}),
],
};
export default merge(baseConfig, configuration);
-198
View File
@@ -1,198 +0,0 @@
import 'webpack-dev-server';
import { execSync, spawn } from 'child_process';
import fs from 'fs';
import path from 'path';
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
import chalk from 'chalk';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import webpack from 'webpack';
import { merge } from 'webpack-merge';
import checkNodeEnv from '../scripts/check-node-env';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
// at the dev webpack config is not accidentally run in a production environment
if (process.env.NODE_ENV === 'production') {
checkNodeEnv('development');
}
const port = process.env.PORT || 4343;
const manifest = path.resolve(webpackPaths.dllPath, 'renderer.json');
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const requiredByDLLConfig = module.parent!.filename.includes('webpack.config.renderer.dev.dll');
/**
* Warn if the DLL is not built
*/
if (!requiredByDLLConfig && !(fs.existsSync(webpackPaths.dllPath) && fs.existsSync(manifest))) {
console.log(
chalk.black.bgYellow.bold(
'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"',
),
);
execSync('npm run postinstall');
}
const configuration: webpack.Configuration = {
devtool: 'inline-source-map',
mode: 'development',
target: ['web', 'electron-renderer'],
entry: [
`webpack-dev-server/client?http://localhost:${port}/dist`,
'webpack/hot/only-dev-server',
path.join(webpackPaths.srcRendererPath, 'index.tsx'),
],
output: {
path: webpackPaths.distRendererPath,
publicPath: '/',
filename: 'renderer.dev.js',
library: {
type: 'umd',
},
},
module: {
rules: [
{
test: /\.s?css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: {
localIdentName: '[name]__[local]--[hash:base64:5]',
exportLocalsConvention: 'camelCaseOnly',
},
sourceMap: true,
importLoaders: 1,
},
},
'sass-loader',
],
include: /\.module\.s?(c|a)ss$/,
},
{
test: /\.s?css$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
exclude: /\.module\.s?(c|a)ss$/,
},
// Fonts
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
type: 'asset/resource',
},
// Images
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource',
},
],
},
plugins: [
...(requiredByDLLConfig
? []
: [
new webpack.DllReferencePlugin({
context: webpackPaths.dllPath,
manifest: require(manifest),
sourceType: 'var',
}),
]),
new webpack.NoEmitOnErrorsPlugin(),
/**
* Create global constants which can be configured at compile time.
*
* Useful for allowing different behaviour between development builds and
* release builds
*
* NODE_ENV should be production so that modules do not perform certain
* development checks
*
* By default, use 'development' as NODE_ENV. This can be overriden with
* 'staging', for example, by changing the ENV variables in the npm scripts
*/
new webpack.EnvironmentPlugin({
NODE_ENV: 'development',
}),
new webpack.LoaderOptionsPlugin({
debug: true,
}),
new ReactRefreshWebpackPlugin(),
new HtmlWebpackPlugin({
filename: path.join('index.html'),
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
minify: {
collapseWhitespace: true,
removeAttributeQuotes: true,
removeComments: true,
},
isBrowser: false,
env: process.env.NODE_ENV,
isDevelopment: process.env.NODE_ENV !== 'production',
nodeModules: webpackPaths.appNodeModulesPath,
}),
],
node: {
__dirname: false,
__filename: false,
},
devServer: {
port,
compress: true,
hot: true,
headers: { 'Access-Control-Allow-Origin': '*' },
static: {
publicPath: '/',
},
historyApiFallback: {
verbose: true,
},
setupMiddlewares(middlewares) {
console.log('Starting preload.js builder...');
const preloadProcess = spawn('npm', ['run', 'start:preload'], {
shell: true,
stdio: 'inherit',
})
.on('close', (code: number) => process.exit(code!))
.on('error', (spawnError) => console.error(spawnError));
console.log('Starting remote.js builder...');
const remoteProcess = spawn('npm', ['run', 'start:remote'], {
shell: true,
stdio: 'inherit',
})
.on('close', (code: number) => process.exit(code!))
.on('error', (spawnError) => console.error(spawnError));
console.log('Starting Main Process...');
spawn('npm', ['run', 'start:main'], {
shell: true,
stdio: 'inherit',
})
.on('close', (code: number) => {
preloadProcess.kill();
remoteProcess.kill();
process.exit(code!);
})
.on('error', (spawnError) => console.error(spawnError));
return middlewares;
},
},
};
export default merge(baseConfig, configuration);
@@ -1,134 +0,0 @@
/**
* Build config for electron renderer process
*/
import path from 'path';
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
import TerserPlugin from 'terser-webpack-plugin';
import webpack from 'webpack';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import { merge } from 'webpack-merge';
import checkNodeEnv from '../scripts/check-node-env';
import deleteSourceMaps from '../scripts/delete-source-maps';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
checkNodeEnv('production');
deleteSourceMaps();
const devtoolsConfig =
process.env.DEBUG_PROD === 'true'
? {
devtool: 'source-map',
}
: {};
const configuration: webpack.Configuration = {
...devtoolsConfig,
mode: 'production',
target: ['web', 'electron-renderer'],
entry: [path.join(webpackPaths.srcRendererPath, 'index.tsx')],
output: {
path: webpackPaths.distRendererPath,
publicPath: './',
filename: 'renderer.js',
library: {
type: 'umd',
},
},
module: {
rules: [
{
test: /\.s?(a|c)ss$/,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
modules: {
localIdentName: '[name]__[local]--[hash:base64:5]',
exportLocalsConvention: 'camelCaseOnly',
},
sourceMap: true,
importLoaders: 1,
},
},
'sass-loader',
],
include: /\.module\.s?(c|a)ss$/,
},
{
test: /\.s?(a|c)ss$/,
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
exclude: /\.module\.s?(c|a)ss$/,
},
// Fonts
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
type: 'asset/resource',
},
// Images
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource',
},
],
},
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
parallel: true,
}),
new CssMinimizerPlugin(),
],
},
plugins: [
/**
* Create global constants which can be configured at compile time.
*
* Useful for allowing different behaviour between development builds and
* release builds
*
* NODE_ENV should be production so that modules do not perform certain
* development checks
*/
new webpack.EnvironmentPlugin({
NODE_ENV: 'production',
DEBUG_PROD: false,
}),
new MiniCssExtractPlugin({
filename: 'style.css',
}),
new BundleAnalyzerPlugin({
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
}),
new HtmlWebpackPlugin({
filename: 'index.html',
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
minify: {
collapseWhitespace: true,
removeAttributeQuotes: true,
removeComments: true,
},
isBrowser: false,
isDevelopment: process.env.NODE_ENV !== 'production',
}),
],
};
export default merge(baseConfig, configuration);
-144
View File
@@ -1,144 +0,0 @@
import 'webpack-dev-server';
import path from 'path';
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import webpack from 'webpack';
import { merge } from 'webpack-merge';
import checkNodeEnv from '../scripts/check-node-env';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
// at the dev webpack config is not accidentally run in a production environment
if (process.env.NODE_ENV === 'production') {
checkNodeEnv('development');
}
const port = process.env.PORT || 4343;
const configuration: webpack.Configuration = {
devtool: 'inline-source-map',
mode: 'development',
target: ['web', 'electron-renderer'],
entry: [
`webpack-dev-server/client?http://localhost:${port}/dist`,
'webpack/hot/only-dev-server',
path.join(webpackPaths.srcRendererPath, 'index.tsx'),
],
output: {
path: webpackPaths.distRendererPath,
publicPath: '/',
filename: 'renderer.dev.js',
library: {
type: 'umd',
},
},
module: {
rules: [
{
test: /\.s?css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: {
localIdentName: '[name]__[local]--[hash:base64:5]',
exportLocalsConvention: 'camelCaseOnly',
},
sourceMap: true,
importLoaders: 1,
},
},
'sass-loader',
],
include: /\.module\.s?(c|a)ss$/,
},
{
test: /\.s?css$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
exclude: /\.module\.s?(c|a)ss$/,
},
// Fonts
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
type: 'asset/resource',
},
// Images
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource',
},
],
},
plugins: [
new webpack.NoEmitOnErrorsPlugin(),
/**
* Create global constants which can be configured at compile time.
*
* Useful for allowing different behaviour between development builds and
* release builds
*
* NODE_ENV should be production so that modules do not perform certain
* development checks
*
* By default, use 'development' as NODE_ENV. This can be overriden with
* 'staging', for example, by changing the ENV variables in the npm scripts
*/
new webpack.EnvironmentPlugin({
NODE_ENV: 'development',
}),
new webpack.LoaderOptionsPlugin({
debug: true,
}),
new ReactRefreshWebpackPlugin(),
new HtmlWebpackPlugin({
filename: path.join('index.html'),
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
minify: {
collapseWhitespace: true,
removeAttributeQuotes: true,
removeComments: true,
},
isBrowser: false,
env: process.env.NODE_ENV,
isDevelopment: process.env.NODE_ENV !== 'production',
nodeModules: webpackPaths.appNodeModulesPath,
}),
],
node: {
__dirname: false,
__filename: false,
},
devServer: {
port,
compress: true,
hot: true,
headers: { 'Access-Control-Allow-Origin': '*' },
static: {
publicPath: '/',
},
historyApiFallback: {
verbose: true,
},
setupMiddlewares(middlewares) {
return middlewares;
},
},
};
export default merge(baseConfig, configuration);
-135
View File
@@ -1,135 +0,0 @@
/**
* Build config for electron renderer process
*/
import path from 'path';
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
import TerserPlugin from 'terser-webpack-plugin';
import webpack from 'webpack';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import { merge } from 'webpack-merge';
import checkNodeEnv from '../scripts/check-node-env';
import deleteSourceMaps from '../scripts/delete-source-maps';
import baseConfig from './webpack.config.base';
import webpackPaths from './webpack.paths';
checkNodeEnv('production');
deleteSourceMaps();
const devtoolsConfig =
process.env.DEBUG_PROD === 'true'
? {
devtool: 'source-map',
}
: {};
const configuration: webpack.Configuration = {
...devtoolsConfig,
mode: 'production',
target: ['web'],
entry: [path.join(webpackPaths.srcRendererPath, 'index.tsx')],
output: {
path: webpackPaths.distWebPath,
publicPath: '/',
filename: 'renderer.js',
library: {
type: 'umd',
},
},
module: {
rules: [
{
test: /\.s?(a|c)ss$/,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
modules: {
localIdentName: '[name]__[local]--[hash:base64:5]',
exportLocalsConvention: 'camelCaseOnly',
},
sourceMap: true,
importLoaders: 1,
},
},
'sass-loader',
],
include: /\.module\.s?(c|a)ss$/,
},
{
test: /\.s?(a|c)ss$/,
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
exclude: /\.module\.s?(c|a)ss$/,
},
// Fonts
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
type: 'asset/resource',
},
// Images
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource',
},
],
},
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
parallel: true,
}),
new CssMinimizerPlugin(),
],
},
plugins: [
/**
* Create global constants which can be configured at compile time.
*
* Useful for allowing different behaviour between development builds and
* release builds
*
* NODE_ENV should be production so that modules do not perform certain
* development checks
*/
new webpack.EnvironmentPlugin({
NODE_ENV: 'production',
DEBUG_PROD: false,
}),
new MiniCssExtractPlugin({
filename: 'style.css',
}),
new BundleAnalyzerPlugin({
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
}),
new HtmlWebpackPlugin({
filename: 'index.html',
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
minify: {
collapseWhitespace: true,
removeAttributeQuotes: true,
removeComments: true,
},
isBrowser: false,
isDevelopment: process.env.NODE_ENV !== 'production',
}),
],
};
export default merge(baseConfig, configuration);
-46
View File
@@ -1,46 +0,0 @@
const path = require('path');
const rootPath = path.join(__dirname, '../..');
const dllPath = path.join(__dirname, '../dll');
const srcPath = path.join(rootPath, 'src');
const assetsPath = path.join(rootPath, 'assets');
const srcMainPath = path.join(srcPath, 'main');
const srcRemotePath = path.join(srcPath, 'remote');
const srcRendererPath = path.join(srcPath, 'renderer');
const releasePath = path.join(rootPath, 'release');
const appPath = path.join(releasePath, 'app');
const appPackagePath = path.join(appPath, 'package.json');
const appNodeModulesPath = path.join(appPath, 'node_modules');
const srcNodeModulesPath = path.join(srcPath, 'node_modules');
const distPath = path.join(appPath, 'dist');
const distMainPath = path.join(distPath, 'main');
const distRemotePath = path.join(distPath, 'remote');
const distRendererPath = path.join(distPath, 'renderer');
const distWebPath = path.join(distPath, 'web');
const buildPath = path.join(releasePath, 'build');
export default {
assetsPath,
rootPath,
dllPath,
srcPath,
srcMainPath,
srcRemotePath,
srcRendererPath,
releasePath,
appPath,
appPackagePath,
appNodeModulesPath,
srcNodeModulesPath,
distPath,
distMainPath,
distRemotePath,
distRendererPath,
distWebPath,
buildPath,
};
-1
View File
@@ -1 +0,0 @@
export default 'test-file-stub';
-8
View File
@@ -1,8 +0,0 @@
{
"rules": {
"no-console": "off",
"global-require": "off",
"import/no-dynamic-require": "off",
"import/no-extraneous-dependencies": "off"
}
}
-33
View File
@@ -1,33 +0,0 @@
// Check if the renderer and main bundles are built
import path from 'path';
import chalk from 'chalk';
import fs from 'fs';
import webpackPaths from '../configs/webpack.paths';
const mainPath = path.join(webpackPaths.distMainPath, 'main.js');
const remotePath = path.join(webpackPaths.distMainPath, 'remote.js');
const rendererPath = path.join(webpackPaths.distRendererPath, 'renderer.js');
if (!fs.existsSync(mainPath)) {
throw new Error(
chalk.whiteBright.bgRed.bold(
'The main process is not built yet. Build it by running "npm run build:main"',
),
);
}
if (!fs.existsSync(remotePath)) {
throw new Error(
chalk.whiteBright.bgRed.bold(
'The remote process is not built yet. Build it by running "npm run build:remote"',
),
);
}
if (!fs.existsSync(rendererPath)) {
throw new Error(
chalk.whiteBright.bgRed.bold(
'The renderer process is not built yet. Build it by running "npm run build:renderer"',
),
);
}
-54
View File
@@ -1,54 +0,0 @@
import fs from 'fs';
import chalk from 'chalk';
import { execSync } from 'child_process';
import { dependencies } from '../../package.json';
if (dependencies) {
const dependenciesKeys = Object.keys(dependencies);
const nativeDeps = fs
.readdirSync('node_modules')
.filter((folder) => fs.existsSync(`node_modules/${folder}/binding.gyp`));
if (nativeDeps.length === 0) {
process.exit(0);
}
try {
// Find the reason for why the dependency is installed. If it is installed
// because of a devDependency then that is okay. Warn when it is installed
// because of a dependency
const { dependencies: dependenciesObject } = JSON.parse(
execSync(`npm ls ${nativeDeps.join(' ')} --json`).toString()
);
const rootDependencies = Object.keys(dependenciesObject);
const filteredRootDependencies = rootDependencies.filter((rootDependency) =>
dependenciesKeys.includes(rootDependency)
);
if (filteredRootDependencies.length > 0) {
const plural = filteredRootDependencies.length > 1;
console.log(`
${chalk.whiteBright.bgYellow.bold(
'Webpack does not work with native dependencies.'
)}
${chalk.bold(filteredRootDependencies.join(', '))} ${
plural ? 'are native dependencies' : 'is a native dependency'
} and should be installed inside of the "./release/app" folder.
First, uninstall the packages from "./package.json":
${chalk.whiteBright.bgGreen.bold('npm uninstall your-package')}
${chalk.bold(
'Then, instead of installing the package to the root "./package.json":'
)}
${chalk.whiteBright.bgRed.bold('npm install your-package')}
${chalk.bold('Install the package to "./release/app/package.json"')}
${chalk.whiteBright.bgGreen.bold(
'cd ./release/app && npm install your-package'
)}
Read more about native dependencies at:
${chalk.bold(
'https://electron-react-boilerplate.js.org/docs/adding-dependencies/#module-structure'
)}
`);
process.exit(1);
}
} catch (e) {
console.log('Native dependencies could not be checked');
}
}
-16
View File
@@ -1,16 +0,0 @@
import chalk from 'chalk';
export default function checkNodeEnv(expectedEnv) {
if (!expectedEnv) {
throw new Error('"expectedEnv" not set');
}
if (process.env.NODE_ENV !== expectedEnv) {
console.log(
chalk.whiteBright.bgRed.bold(
`"process.env.NODE_ENV" must be "${expectedEnv}" to use this webpack config`
)
);
process.exit(2);
}
}
-16
View File
@@ -1,16 +0,0 @@
import chalk from 'chalk';
import detectPort from 'detect-port';
const port = process.env.PORT || '4343';
detectPort(port, (err, availablePort) => {
if (port !== String(availablePort)) {
throw new Error(
chalk.whiteBright.bgRed.bold(
`Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 npm start`
)
);
} else {
process.exit(0);
}
});
-17
View File
@@ -1,17 +0,0 @@
import rimraf from 'rimraf';
import process from 'process';
import webpackPaths from '../configs/webpack.paths';
const args = process.argv.slice(2);
const commandMap = {
dist: webpackPaths.distPath,
release: webpackPaths.releasePath,
dll: webpackPaths.dllPath,
};
args.forEach((x) => {
const pathToRemove = commandMap[x];
if (pathToRemove !== undefined) {
rimraf.sync(pathToRemove);
}
});
-9
View File
@@ -1,9 +0,0 @@
import path from 'path';
import rimraf from 'rimraf';
import webpackPaths from '../configs/webpack.paths';
export default function deleteSourceMaps() {
rimraf.sync(path.join(webpackPaths.distMainPath, '*.js.map'));
rimraf.sync(path.join(webpackPaths.distRemotePath, '*.js.map'));
rimraf.sync(path.join(webpackPaths.distRendererPath, '*.js.map'));
}
-20
View File
@@ -1,20 +0,0 @@
import { execSync } from 'child_process';
import fs from 'fs';
import { dependencies } from '../../release/app/package.json';
import webpackPaths from '../configs/webpack.paths';
if (
Object.keys(dependencies || {}).length > 0 &&
fs.existsSync(webpackPaths.appNodeModulesPath)
) {
const electronRebuildCmd =
'../../node_modules/.bin/electron-rebuild --force --types prod,dev,optional --module-dir .';
const cmd =
process.platform === 'win32'
? electronRebuildCmd.replace(/\//g, '\\')
: electronRebuildCmd;
execSync(cmd, {
cwd: webpackPaths.appPath,
stdio: 'inherit',
});
}
-9
View File
@@ -1,9 +0,0 @@
import fs from 'fs';
import webpackPaths from '../configs/webpack.paths';
const { srcNodeModulesPath } = webpackPaths;
const { appNodeModulesPath } = webpackPaths;
if (!fs.existsSync(srcNodeModulesPath) && fs.existsSync(appNodeModulesPath)) {
fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, 'junction');
}
-30
View File
@@ -1,30 +0,0 @@
const { notarize } = require('electron-notarize');
const { build } = require('../../package.json');
exports.default = async function notarizeMacos(context) {
const { electronPlatformName, appOutDir } = context;
if (electronPlatformName !== 'darwin') {
return;
}
if (process.env.CI !== 'true') {
console.warn('Skipping notarizing step. Packaging is not running in CI');
return;
}
if (!('APPLE_ID' in process.env && 'APPLE_ID_PASS' in process.env)) {
console.warn(
'Skipping notarizing step. APPLE_ID and APPLE_ID_PASS env variables must be set'
);
return;
}
const appName = context.packager.appInfo.productFilename;
await notarize({
appBundleId: build.appId,
appPath: `${appOutDir}/${appName}.app`,
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_ID_PASS,
});
};
-34
View File
@@ -1,34 +0,0 @@
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
# Coverage directory used by tools like istanbul
coverage
.eslintcache
# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
# OSX
.DS_Store
src/i18n
release/app/dist
release/build
.erb/dll
.idea
npm-debug.log.*
*.css.d.ts
*.sass.d.ts
*.scss.d.ts
# eslint ignores hidden directories by default:
# https://github.com/eslint/eslint/issues/8429
!.erb
-97
View File
@@ -1,97 +0,0 @@
module.exports = {
extends: ['erb', 'plugin:typescript-sort-keys/recommended'],
ignorePatterns: ['.erb/*', 'server'],
parser: '@typescript-eslint/parser',
parserOptions: {
createDefaultProgram: true,
ecmaVersion: 12,
parser: '@typescript-eslint/parser',
project: './tsconfig.json',
sourceType: 'module',
tsconfigRootDir: './',
},
plugins: ['@typescript-eslint', 'import', 'sort-keys-fix'],
rules: {
'@typescript-eslint/naming-convention': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-shadow': ['off'],
'@typescript-eslint/no-unused-vars': ['error'],
'@typescript-eslint/no-use-before-define': ['error'],
'default-case': 'off',
'import/extensions': 'off',
'import/no-absolute-path': 'off',
// A temporary hack related to IDE not resolving correct package.json
'import/no-extraneous-dependencies': 'off',
'import/no-unresolved': 'error',
'import/order': [
'error',
{
alphabetize: {
caseInsensitive: true,
order: 'asc',
},
groups: ['builtin', 'external', 'internal', ['parent', 'sibling']],
'newlines-between': 'never',
pathGroups: [
{
group: 'external',
pattern: 'react',
position: 'before',
},
],
pathGroupsExcludedImportTypes: ['react'],
},
],
'import/prefer-default-export': 'off',
'jsx-a11y/click-events-have-key-events': 'off',
'jsx-a11y/interactive-supports-focus': 'off',
'jsx-a11y/media-has-caption': 'off',
'no-await-in-loop': 'off',
'no-console': 'off',
'no-nested-ternary': 'off',
'no-restricted-syntax': 'off',
'no-shadow': 'off',
'no-underscore-dangle': 'off',
'no-unused-vars': 'off',
'no-use-before-define': 'off',
'prefer-destructuring': 'off',
'react/function-component-definition': 'off',
'react/jsx-filename-extension': [2, { extensions: ['.js', '.jsx', '.ts', '.tsx'] }],
'react/jsx-no-useless-fragment': 'off',
'react/jsx-props-no-spreading': 'off',
'react/jsx-sort-props': [
'error',
{
callbacksLast: true,
ignoreCase: false,
noSortAlphabetically: false,
reservedFirst: true,
shorthandFirst: true,
shorthandLast: false,
},
],
'react/no-array-index-key': 'off',
'react/react-in-jsx-scope': 'off',
'react/require-default-props': 'off',
'sort-keys-fix/sort-keys-fix': 'warn',
},
settings: {
'import/parsers': {
'@typescript-eslint/parser': ['.ts', '.tsx'],
},
'import/resolver': {
// See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below
node: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
typescript: {
alwaysTryTypes: true,
project: './tsconfig.json',
},
webpack: {
config: require.resolve('./.erb/configs/webpack.config.eslint.ts'),
},
},
},
};
@@ -0,0 +1,33 @@
name: Feature request
description: Request a feature to be added to Feishin
title: '[Feature]: '
labels: ['enhancement']
body:
- type: checkboxes
id: check-duplicate
attributes:
label: I have already checked through the existing feature requests and found no duplicates
options:
- label: 'Yes'
required: true
- type: dropdown
id: server-specific
attributes:
label: Is this a server-specific feature?
options:
- Not server-specific
- OpenSubsonic
- Jellyfin
- Navidrome
default: 0
validations:
required: true
- type: textarea
id: solution
attributes:
label: What do you want to be added?
placeholder: I would like to see [...]
validations:
required: true
+74
View File
@@ -0,0 +1,74 @@
name: Bug report
description: You're having technical issues.
title: '[Bug]: '
labels: ['bug']
body:
- type: checkboxes
id: check-duplicate
attributes:
label: I have already checked through the existing bug reports and found no duplicates
options:
- label: 'Yes'
required: true
- type: input
id: version
attributes:
label: App Version
description: What version of the app are you running?
placeholder: ex. 1.0.0
validations:
required: true
- type: input
id: server-version
attributes:
label: Music Server and Version
description: What music server are you using?
placeholder: ex. Navidrome v0.55.0, LMS v3.67.0, Jellyfin v10.10.7, etc.
validations:
required: true
- type: dropdown
id: environments
attributes:
label: What local environments are you seeing the problem on?
multiple: true
options:
- Desktop Windows
- Desktop macOS
- Desktop Linux
- Web Firefox
- Web Chrome
- Web Safari
- Web Microsoft Edge
- Other (please specify in the next field)
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Also tell us, what did you expect to happen?
placeholder: Include screenshots and error logs if possible. The browser devtools can be opened using CTRL + SHIFT + I (Windows/Linux) or CMD + SHIFT + I (macOS).
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Steps to reproduce
description: How can we reproduce this issue? Are there any specific settings that are enabled that could be the cause?
placeholder: |
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
validations:
required: true
- type: textarea
id: logs
attributes:
label: Relevant log output
description: Please copy and paste any relevant log output. This will be automatically formatted into code.
render: shell
-45
View File
@@ -1,45 +0,0 @@
---
name: Bug report
about: You're having technical issues. 🐞
labels: 'bug'
---
## Expected Behavior
<!--- What should have happened? -->
## Current Behavior
<!--- What went wrong? -->
<!-- Add screenshots to help explain your problem -->
<!-- (Open the browser dev tools in the menu or using CTRL + SHIFT + I) -->
## Steps to Reproduce
<!-- Add relevant code and/or a live example -->
<!-- Add stack traces -->
1.
2.
3.
4.
## Possible Solution (Not obligatory)
<!--- Suggest a reason for the bug or how to fix it. -->
## Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
## Your Environment
<!--- Include as many relevant details about the environment you experienced the bug in -->
- Application version (e.g. v0.1.0) :
- Operating System and version (e.g. Windows 10) :
- Server and version (e.g. Navidrome v0.48.0) :
- Node version (if developing locally) :
-9
View File
@@ -1,9 +0,0 @@
---
name: Question
about: Ask a question.❓
labels: 'question'
---
<!-- Question issues will be closed. -->
<!-- Ask questions in the discussions tab: Please use discussions https://github.com/jeffvli/feishin/discussions -->
<!-- Or join the Discord/Matrix servers: https://discord.gg/FVKpcMDy5f https://matrix.to/#/#sonixd:matrix.org -->
@@ -1,11 +0,0 @@
---
name: Feature request
about: Request a feature to be added to Feishin 🎉
labels: 'enhancement'
---
## What do you want to be added?
## Additional context
<!-- Is this a server-specific feature? (e.g. Jellyfin only). -->
+11
View File
@@ -0,0 +1,11 @@
blank_issues_enabled: false
contact_links:
- name: Questions or help
url: https://github.com/jeffvli/feishin/discussions
about: Ask questions or get help in the discussions section
- name: Discord Community
url: https://discord.gg/FVKpcMDy5f
about: The discord/matrix servers are bridged so you can join whichever you prefer
- name: Matrix Community
url: https://matrix.to/#/#sonixd:matrix.org
about: The discord/matrix servers are bridged so you can join whichever you prefer
+329
View File
@@ -0,0 +1,329 @@
name: Publish Beta (Manual)
on:
workflow_dispatch:
inputs:
version:
description: 'Semantic version number (e.g., 1.0.0) - beta suffix will be added automatically'
required: false
type: string
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
steps:
- name: Checkout git repo
uses: actions/checkout@v1
- name: Install Node and PNPM
uses: pnpm/action-setup@v4.1.0
with:
version: 9
- name: Install dependencies
run: pnpm install
- name: Validate and set version with beta suffix
id: version
shell: pwsh
run: |
$inputVersion = "${{ github.event.inputs.version }}"
Write-Host "Input version: $inputVersion"
if ($inputVersion -eq "" -or $inputVersion -eq "null") {
# No input version provided, auto-increment patch version
Write-Host "No version provided, auto-incrementing patch version..."
# Get current version from package.json
$currentVersion = (Get-Content package.json | ConvertFrom-Json).version
Write-Host "Current version: $currentVersion"
# Remove any existing suffix (like -beta) to get clean semantic version
$cleanVersion = $currentVersion -replace '-.*$', ''
# Extract major, minor, patch components
$versionParts = $cleanVersion.Split('.')
if ($versionParts.Length -ne 3) {
Write-Error "Current version format is invalid: $cleanVersion"
exit 1
}
$major = [int]$versionParts[0]
$minor = [int]$versionParts[1]
$patch = [int]$versionParts[2]
# Increment patch version
$newPatch = $patch + 1
$inputVersion = "$major.$minor.$newPatch"
Write-Host "Auto-generated version: $inputVersion"
} else {
# Validate semantic version format (major.minor.patch)
$versionPattern = '^\d+\.\d+\.\d+$'
if ($inputVersion -notmatch $versionPattern) {
Write-Error "Invalid version format. Expected semantic version (e.g., 1.0.0), got: $inputVersion"
exit 1
}
}
# Add beta suffix
$versionWithBeta = "$inputVersion-beta"
Write-Host "Setting version to: $versionWithBeta"
# Update package.json
$packageJson = Get-Content package.json | ConvertFrom-Json
$packageJson.version = $versionWithBeta
$packageJson | ConvertTo-Json -Depth 10 | Set-Content package.json
Write-Host "Updated package.json version to: $versionWithBeta"
# Set output for other jobs
echo "version=$versionWithBeta" >> $env:GITHUB_OUTPUT
- name: Delete existing releases and tags
shell: pwsh
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Get the version that was set in the previous step
$versionWithBeta = "${{ steps.version.outputs.version }}"
Write-Host "Checking for existing releases with tag: $versionWithBeta"
# Find and delete any releases with isPrerelease "true"
Write-Host "Deleting existing prereleases..."
Write-Host "Searching for releases with isPrerelease 'true'..."
$betaReleases = gh release list --limit 100 --json tagName,isPrerelease,name | ConvertFrom-Json | Where-Object { $_.isPrerelease -eq $true }
if ($betaReleases) {
Write-Host "Found $($betaReleases.Count) release(s) with isPrerelease 'true':"
foreach ($release in $betaReleases) {
Write-Host " - Tag: $($release.tagName), Title: $($release.name)"
gh release delete $release.tagName --yes --cleanup-tag
Write-Host " Deleted release with tag: $($release.tagName)"
}
} else {
Write-Host "No releases found with isPrerelease 'true'"
}
publish:
needs: prepare
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [windows-latest, macos-latest, ubuntu-latest]
steps:
- name: Checkout git repo
uses: actions/checkout@v1
- name: Install Node and PNPM
uses: pnpm/action-setup@v4.1.0
with:
version: 9
- name: Install dependencies
run: pnpm install
- name: Set version from prepare job
shell: pwsh
run: |
$versionWithBeta = "${{ needs.prepare.outputs.version }}"
Write-Host "Setting version from prepare job: $versionWithBeta"
# Update package.json with the version from prepare job
$packageJson = Get-Content package.json | ConvertFrom-Json
$packageJson.version = $versionWithBeta
$packageJson | ConvertTo-Json -Depth 10 | Set-Content package.json
Write-Host "Updated package.json version to: $versionWithBeta"
- name: Build and Publish releases (Windows)
if: matrix.os == 'windows-latest'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
EP_PRE_RELEASE: true
uses: nick-invision/retry@v2.8.2
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
pnpm run publish:win:beta
on_retry_command: pnpm cache delete
- name: Build and Publish releases (macOS)
if: matrix.os == 'macos-latest'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
EP_PRE_RELEASE: true
uses: nick-invision/retry@v2.8.2
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
pnpm run publish:mac:beta
on_retry_command: pnpm cache delete
- name: Build and Publish releases (Linux)
if: matrix.os == 'ubuntu-latest'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
EP_PRE_RELEASE: true
uses: nick-invision/retry@v2.8.2
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
pnpm run publish:linux:beta
on_retry_command: pnpm cache delete
- name: Build and Publish releases (Linux ARM64)
if: matrix.os == 'ubuntu-latest'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
EP_PRE_RELEASE: true
uses: nick-invision/retry@v2.8.2
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
pnpm run publish:linux-arm64:beta
on_retry_command: pnpm cache delete
edit-release:
needs: [prepare, publish]
runs-on: ubuntu-latest
steps:
- name: Checkout git repo
uses: actions/checkout@v1
- name: Edit release with commits and title
shell: pwsh
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Get the version from the prepare job
$versionWithBeta = "${{ needs.prepare.outputs.version }}"
$tagVersion = "v" + $versionWithBeta
Write-Host "Editing release for tag: $tagVersion"
# Check if release exists
$releaseExists = gh release view $tagVersion 2>$null
if ($LASTEXITCODE -eq 0) {
Write-Host "Found release with tag $tagVersion"
# Get current release notes
# Find the latest non-prerelease tag
Write-Host "Finding latest non-prerelease tag..."
$latestNonPrerelease = gh release list --limit 100 --json tagName,isPrerelease | ConvertFrom-Json | Where-Object { $_.isPrerelease -eq $false } | Select-Object -First 1
if ($latestNonPrerelease) {
$latestTag = $latestNonPrerelease.tagName
Write-Host "Latest non-prerelease tag: $latestTag"
# Get commits between latest non-prerelease and current HEAD
Write-Host "Getting commits between $latestTag and HEAD..."
# Use proper git range syntax and handle PowerShell string interpolation
$gitRange = "$latestTag..HEAD"
Write-Host "Git range: $gitRange"
# Get commits using proper git command with datetime
$commits = git log --oneline --pretty=format:"%ad|%s|%h" --date=short $gitRange
# Check if commits exist
if ($commits -and $commits.Trim() -ne "") {
Write-Host "Found commits:"
Write-Host $commits
# Group commits by date
$groupedCommits = @{}
foreach ($line in $commits) {
if ($line.Trim() -ne "") {
$parts = $line.Split('|')
$date = $parts[0]
$message = $parts[1]
$hash = $parts[2]
if (-not $groupedCommits.ContainsKey($date)) {
$groupedCommits[$date] = @()
}
$groupedCommits[$date] += "- $message ($hash)"
}
}
# Build formatted release notes grouped by date
$commitNotes = "## Changes since $latestTag`n`n"
$sortedDates = $groupedCommits.Keys | Sort-Object -Descending
foreach ($date in $sortedDates) {
$commitNotes += "### $date`n"
foreach ($commit in $groupedCommits[$date]) {
$commitNotes += "$commit`n"
}
$commitNotes += "`n"
}
$releaseNotes = $commitNotes
} else {
Write-Host "No commits found between $latestTag and HEAD"
Write-Host "Trying alternative approach..."
# Alternative: get commits since the tag (not range) with datetime
$commits = git log --oneline --pretty=format:"%ad|%s|%h" --date=short $latestTag.. --not $latestTag
if ($commits -and $commits.Trim() -ne "") {
Write-Host "Found commits with alternative method:"
Write-Host $commits
# Group commits by date
$groupedCommits = @{}
foreach ($line in $commits) {
if ($line.Trim() -ne "") {
$parts = $line.Split('|')
$date = $parts[0]
$message = $parts[1]
$hash = $parts[2]
if (-not $groupedCommits.ContainsKey($date)) {
$groupedCommits[$date] = @()
}
$groupedCommits[$date] += "- $message ($hash)"
}
}
# Build formatted release notes grouped by date
$commitNotes = "## Changes since $latestTag`n`n"
$sortedDates = $groupedCommits.Keys | Sort-Object -Descending
foreach ($date in $sortedDates) {
$commitNotes += "### $date`n"
foreach ($commit in $groupedCommits[$date]) {
$commitNotes += "$commit`n"
}
$commitNotes += "`n"
}
$releaseNotes = $commitNotes
} else {
Write-Host "Still no commits found, using basic release notes"
$releaseNotes = "## Beta Release`n`nThis is a beta release."
}
}
} else {
Write-Host "No non-prerelease tags found, using basic release notes"
$releaseNotes = "## Beta Release`n`nThis is a beta release."
}
# Update the release with new title and notes
Write-Host "Updating release with title 'Beta' and new notes..."
gh release edit $tagVersion --title "Beta" --notes "$releaseNotes"
Write-Host "Successfully updated release title to 'Beta' and added commit notes"
} else {
Write-Host "No release found with tag $tagVersion"
}
@@ -3,6 +3,7 @@ name: Publish Docker to GHCR
permissions: write-all
on:
workflow_dispatch:
push:
tags:
- 'v*.*.*'
@@ -37,6 +38,10 @@ jobs:
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Setup Docker buildx
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
with:
@@ -44,3 +49,7 @@ jobs:
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: |
linux/amd64
linux/arm/v7
linux/arm64/v8
+9 -3
View File
@@ -24,11 +24,13 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=latest,enable={{is_default_branch}}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Setup Docker buildx
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
with:
@@ -36,3 +38,7 @@ jobs:
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: |
linux/amd64
linux/arm/v7
linux/arm64/v8
+19 -11
View File
@@ -14,17 +14,15 @@ jobs:
- name: Checkout git repo
uses: actions/checkout@v1
- name: Install Node and NPM
uses: actions/setup-node@v1
- name: Install Node and PNPM
uses: pnpm/action-setup@v4.1.0
with:
node-version: 16
cache: npm
version: 9
- name: Install dependencies
run: |
npm install --legacy-peer-deps
run: pnpm install
- name: Publish releases
- name: Build and Publish releases
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: nick-invision/retry@v2.8.2
@@ -33,7 +31,17 @@ jobs:
max_attempts: 3
retry_on: error
command: |
npm run postinstall
npm run build
npm exec electron-builder -- --publish always --linux
on_retry_command: npm cache clean --force
pnpm run publish:linux
on_retry_command: pnpm cache delete
- name: Build and Publish releases (arm64)
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: nick-invision/retry@v2.8.2
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
pnpm run publish:linux-arm64
on_retry_command: pnpm cache delete
+8 -12
View File
@@ -1,4 +1,4 @@
name: Publish Windows and macOS (Manual)
name: Publish macOS (Manual)
on: workflow_dispatch
@@ -14,17 +14,15 @@ jobs:
- name: Checkout git repo
uses: actions/checkout@v1
- name: Install Node and NPM
uses: actions/setup-node@v1
- name: Install Node and PNPM
uses: pnpm/action-setup@v4.1.0
with:
node-version: 16
cache: npm
version: 9
- name: Install dependencies
run: |
npm install --legacy-peer-deps
run: pnpm install
- name: Publish releases
- name: Build and Publish releases
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: nick-invision/retry@v2.8.2
@@ -33,7 +31,5 @@ jobs:
max_attempts: 3
retry_on: error
command: |
npm run postinstall
npm run build
npm exec electron-builder -- --publish always --win --mac
on_retry_command: npm cache clean --force
pnpm run publish:mac
on_retry_command: pnpm cache delete
+56 -23
View File
@@ -11,50 +11,83 @@ jobs:
strategy:
matrix:
os: [macos-latest]
os: [macos-latest, ubuntu-latest, windows-latest]
steps:
- name: Checkout git repo
uses: actions/checkout@v3
- name: Install Node and NPM
uses: actions/setup-node@v3
- name: Install Node and PNPM
uses: pnpm/action-setup@v4.1.0
with:
node-version: 16
cache: npm
version: 9
- name: Install dependencies
run: |
npm install --legacy-peer-deps
run: pnpm install
- name: Build releases
- name: Build for Windows
if: ${{ matrix.os == 'windows-latest' }}
uses: nick-invision/retry@v2.8.2
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
npm run postinstall
npm run build
npm run package:pr
on_retry_command: npm cache clean --force
pnpm run package:win:pr
- uses: actions/upload-artifact@v3
- name: Build for Linux
if: ${{ matrix.os == 'ubuntu-latest' }}
uses: nick-invision/retry@v2.8.2
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
pnpm run package:linux:pr
- name: Build for MacOS
if: ${{ matrix.os == 'macos-latest' }}
uses: nick-invision/retry@v2.8.2
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
pnpm run package:mac:pr
- name: Zip Windows Binaries
if: ${{ matrix.os == 'windows-latest' }}
shell: pwsh
run: |
Compress-Archive -Path "dist/*.exe" -DestinationPath "dist/windows-binaries.zip" -Force
- name: Zip Linux Binaries
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
zip -r dist/linux-binaries.zip dist/*.{AppImage,deb,rpm}
- name: Zip MacOS Binaries
if: ${{ matrix.os == 'macos-latest' }}
run: |
zip -r dist/macos-binaries.zip dist/*.dmg
- name: Upload Windows Binaries
if: ${{ matrix.os == 'windows-latest' }}
uses: actions/upload-artifact@v4
with:
name: windows-binaries
path: |
release/build/*.exe
path: dist/windows-binaries.zip
- uses: actions/upload-artifact@v3
- name: Upload Linux Binaries
if: ${{ matrix.os == 'ubuntu-latest' }}
uses: actions/upload-artifact@v4
with:
name: linux-binaries
path: |
release/build/*.AppImage
release/build/*.deb
release/build/*.rpm
path: dist/linux-binaries.zip
- uses: actions/upload-artifact@v3
- name: Upload MacOS Binaries
if: ${{ matrix.os == 'macos-latest' }}
uses: actions/upload-artifact@v4
with:
name: macos-binaries
path: |
release/build/*.dmg
path: dist/macos-binaries.zip
+35
View File
@@ -0,0 +1,35 @@
name: Publish Windows (Manual)
on: workflow_dispatch
jobs:
publish:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [windows-latest]
steps:
- name: Checkout git repo
uses: actions/checkout@v1
- name: Install Node and PNPM
uses: pnpm/action-setup@v4.1.0
with:
version: 9
- name: Install dependencies
run: pnpm install
- name: Build and Publish releases
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: nick-invision/retry@v2.8.2
with:
timeout_minutes: 30
max_attempts: 3
retry_on: error
command: |
pnpm run publish:win
on_retry_command: pnpm cache delete
+47
View File
@@ -0,0 +1,47 @@
name: 'Close stale issues and PRs'
on:
workflow_dispatch:
schedule:
- cron: '30 1 * * *'
permissions:
contents: read
jobs:
stale:
permissions:
issues: write
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v5
with:
process-only: 'issues, prs'
issue-inactive-days: 120
pr-inactive-days: 120
log-output: true
add-issue-labels: 'frozen-due-to-age'
add-pr-labels: 'frozen-due-to-age'
- uses: actions/stale@v9
with:
operations-per-run: 999
days-before-issue-stale: 180
days-before-pr-stale: 180
days-before-issue-close: 30
days-before-pr-close: 30
stale-issue-message: >
This issue has been automatically marked as stale because it has not had recent activity. The resources of the Feishin team are limited, and so we are asking for your help.
If this is a **bug** and you can still reproduce this error on the <code>development</code> branch, please reply with all of the information you have about it in order to keep the issue open.
This issue will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions.
stale-pr-message: >
This PR has been automatically marked as stale because it has not had recent activity. The resources of the Feishin team are limited, and so we are asking for your help.
This PR will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions.
stale-issue-label: 'stale'
exempt-issue-labels: 'keep,security'
stale-pr-label: 'stale'
exempt-pr-labels: 'keep,security'
+7 -15
View File
@@ -14,21 +14,13 @@ jobs:
- name: Check out Git repository
uses: actions/checkout@v1
- name: Install Node.js and NPM
uses: actions/setup-node@v2
- name: Install Node.js and PNPM
uses: pnpm/action-setup@v4.1.0
with:
node-version: 16
cache: npm
version: 9
- name: npm install
run: |
npm install --legacy-peer-deps
- name: Install dependencies
run: pnpm install
- name: npm test
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
npm run lint
npm run package
npm exec tsc
npm test
- name: Lint Files
run: pnpm run lint
+5 -29
View File
@@ -1,31 +1,7 @@
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
# Coverage directory used by tools like istanbul
coverage
.eslintcache
# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
# OSX
dist
out
.DS_Store
release/app/dist
release/build
.erb/dll
.idea
npm-debug.log.*
*.css.d.ts
*.sass.d.ts
*.scss.d.ts
.env*
.eslintcache
*.log*
release
-4
View File
@@ -1,4 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged
+2
View File
@@ -0,0 +1,2 @@
legacy-peer-deps=true
only-built-dependencies=electron,esbuild
+6
View File
@@ -0,0 +1,6 @@
out
dist
pnpm-lock.yaml
LICENSE.md
tsconfig.json
tsconfig.*.json
-22
View File
@@ -1,22 +0,0 @@
{
"printWidth": 100,
"semi": true,
"singleQuote": true,
"tabWidth": 4,
"useTabs": false,
"overrides": [
{
"files": ["**/*.css", "**/*.scss", "**/*.html"],
"options": {
"singleQuote": true
}
}
],
"trailingComma": "all",
"bracketSpacing": true,
"arrowParens": "always",
"proseWrap": "never",
"htmlWhitespaceSensitivity": "strict",
"endOfLine": "lf",
"singleAttributePerLine": true
}
+14
View File
@@ -0,0 +1,14 @@
singleQuote: true
semi: true
printWidth: 100
tabWidth: 4
trailingComma: all
useTabs: false
arrowParens: always
proseWrap: never
htmlWhitespaceSensitivity: strict
endOfLine: lf
singleAttributePerLine: false
bracketSpacing: true
plugins:
- prettier-plugin-packagejson
+9 -7
View File
@@ -1,17 +1,19 @@
{
"customSyntax": "postcss-styled-syntax",
"extends": [
"stylelint-config-standard",
"stylelint-config-styled-components",
"stylelint-config-css-modules",
"stylelint-config-recess-order"
],
"rules": {
"declaration-empty-line-before": null,
"declaration-block-no-redundant-longhand-properties": null,
"selector-class-pattern": null,
"block-no-empty": null,
"selector-type-case": ["lower", { "ignoreTypes": ["/^\\$\\w+/"] }],
"selector-type-no-unknown": [true, { "ignoreTypes": ["/-styled-mixin/", "/^\\$\\w+/"] }],
"declaration-colon-newline-after": null,
"property-no-vendor-prefix": null
"declaration-block-no-shorthand-property-overrides": null,
"declaration-block-no-redundant-longhand-properties": null,
"at-rule-no-unknown": [true, { "ignoreAtRules": ["mixin", "value"] }],
"function-no-unknown": [true, { "ignoreFunctions": ["darken", "alpha", "lighten"] }],
"declaration-property-value-no-unknown": null,
"no-descending-specificity": null,
"no-empty-source": null
}
}
+1 -8
View File
@@ -1,10 +1,3 @@
{
"recommendations": [
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"stylelint.vscode-stylelint",
"esbenp.prettier-vscode",
"clinyong.vscode-css-modules",
"Huuums.vscode-fast-folder-structure"
]
"recommendations": ["dbaeumer.vscode-eslint"]
}
+37 -26
View File
@@ -1,28 +1,39 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Electron: Main",
"type": "node",
"request": "launch",
"protocol": "inspector",
"runtimeExecutable": "npm",
"runtimeArgs": ["run start:main --inspect=5858 --remote-debugging-port=9223"],
"preLaunchTask": "Start Webpack Dev"
},
{
"name": "Electron: Renderer",
"type": "chrome",
"request": "attach",
"port": 9223,
"webRoot": "${workspaceFolder}",
"timeout": 15000
}
],
"compounds": [
{
"name": "Electron: All",
"configurations": ["Electron: Main", "Electron: Renderer"]
}
]
"version": "0.2.0",
"configurations": [
{
"name": "Debug Main Process",
"type": "node",
"request": "launch",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite",
"windows": {
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd"
},
"runtimeArgs": ["--sourcemap"],
"env": {
"REMOTE_DEBUGGING_PORT": "9222"
}
},
{
"name": "Debug Renderer Process",
"port": 9222,
"request": "attach",
"type": "chrome",
"webRoot": "${workspaceFolder}/src/renderer",
"timeout": 60000,
"presentation": {
"hidden": true
}
}
],
"compounds": [
{
"name": "Debug All",
"configurations": ["Debug Main Process", "Debug Renderer Process"],
"presentation": {
"order": 1
}
}
]
}
+27 -16
View File
@@ -1,26 +1,30 @@
{
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"files.associations": {
".eslintrc": "jsonc",
".prettierrc": "jsonc",
".eslintignore": "ignore"
},
"eslint.validate": ["typescript"],
"eslint.validate": ["typescript", "typescriptreact"],
"eslint.workingDirectories": [
{ "directory": "./", "changeProcessCWD": true },
{ "directory": "./server", "changeProcessCWD": true }
],
"typescript.tsserver.experimental.enableProjectDiagnostics": true,
"typescript.tsserver.experimental.enableProjectDiagnostics": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.fixAll.stylelint": true,
"source.organizeImports": false,
"source.formatDocument": true
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit",
"source.organizeImports": "never",
"source.formatDocument": "explicit"
},
"css.validate": true,
"less.validate": false,
"scss.validate": true,
"scss.lint.unknownAtRules": "warning",
"scss.lint.unknownProperties": "warning",
"javascript.validate.enable": false,
"javascript.format.enable": false,
"typescript.format.enable": false,
@@ -33,14 +37,21 @@
"npm-debug.log.*": true,
"test/**/__snapshots__": true,
"package-lock.json": true,
"*.{css,sass,scss}.d.ts": true
"*.{css,sass,scss}.d.ts": true,
"out/**/*": true,
"dist/**/*": true
},
"i18n-ally.localesPaths": ["src/i18n", "src/i18n/locales"],
"typescript.tsdk": "node_modules\\typescript\\lib",
"typescript.preferences.importModuleSpecifier": "non-relative",
"stylelint.validate": ["css", "scss", "typescript", "typescriptreact"],
"stylelint.config": null,
"stylelint.validate": ["css", "postcss"],
"typescript.updateImportsOnFileMove.enabled": "always",
"[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"typescript.preferences.autoImportFileExcludePatterns": [
"@mantine/core",
"@mantine/modals",
"@mantine/dates"
],
"[typescriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"typescript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": true,
"folderTemplates.structures": [
@@ -53,14 +64,14 @@
"template": "Functional Component with CSS Modules"
},
{
"fileName": "<FTName | kebabcase>.module.scss"
"fileName": "<FTName | kebabcase>.module.css"
}
]
}
],
"folderTemplates.fileTemplates": {
"Functional Component with CSS Modules": [
"import styles from './<FTName | kebabcase>.module.scss';",
"import styles from './<FTName | kebabcase>.module.css';",
"",
"interface <FTName | pascalcase>Props {}",
"",
-25
View File
@@ -1,25 +0,0 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"label": "Start Webpack Dev",
"script": "start:renderer",
"options": {
"cwd": "${workspaceFolder}"
},
"isBackground": true,
"problemMatcher": {
"owner": "custom",
"pattern": {
"regexp": "____________"
},
"background": {
"activeOnStart": true,
"beginsPattern": "Compiling\\.\\.\\.$",
"endsPattern": "(Compiled successfully|Failed to compile)\\.$"
}
}
}
]
}
+15 -7
View File
@@ -1,17 +1,25 @@
# --- Builder stage
FROM node:18-alpine as builder
FROM node:23-alpine as builder
WORKDIR /app
COPY . /app
# Scripts include electron-specific dependencies, which we don't need
RUN npm install --legacy-peer-deps --ignore-scripts
RUN npm run build:web
# Copy package.json first to cache node_modules
COPY package.json pnpm-lock.yaml .
RUN npm install -g pnpm
RUN pnpm install
# Copy code and build with cached modules
COPY . .
RUN pnpm run build:web
# --- Production stage
FROM nginx:alpine-slim
COPY --from=builder /app/release/app/dist/web /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --chown=nginx:nginx --from=builder /app/out/web /usr/share/nginx/html
COPY ./settings.js.template /etc/nginx/templates/settings.js.template
COPY ng.conf.template /etc/nginx/templates/default.conf.template
ENV PUBLIC_PATH="/"
EXPOSE 9180
CMD ["nginx", "-g", "daemon off;"]
+103 -18
View File
@@ -1,4 +1,4 @@
<img src="assets/icons/icon.png" alt="logo" title="feishin" align="right" height="60px" />
<img src="assets/icons/icon.png" alt="logo" title="feishin" align="right" height="60px" width="60px" />
# Feishin
@@ -27,17 +27,19 @@
</a>
</p>
---
Rewrite of [Sonixd](https://github.com/jeffvli/sonixd).
## Features
- [x] MPV player backend
- [x] Web player backend
- [x] Modern UI
- [x] Scrobble playback to your server
- [x] Smart playlist editor (Navidrome)
- [x] Synchronized and unsynchronized lyrics support
- [ ] [Request a feature](https://github.com/jeffvli/feishin/issues) or [view taskboard](https://github.com/users/jeffvli/projects/5/views/1)
- [x] MPV player backend
- [x] Web player backend
- [x] Modern UI
- [x] Scrobble playback to your server
- [x] Smart playlist editor (Navidrome)
- [x] Synchronized and unsynchronized lyrics support
- [ ] [Request a feature](https://github.com/jeffvli/feishin/issues) or [view taskboard](https://github.com/users/jeffvli/projects/5/views/1)
## Screenshots
@@ -49,8 +51,12 @@ Rewrite of [Sonixd](https://github.com/jeffvli/sonixd).
Download the [latest desktop client](https://github.com/jeffvli/feishin/releases). The desktop client is the recommended way to use Feishin. It supports both the MPV and web player backends, as well as includes built-in fetching for lyrics.
#### macOS Notes
If you're using a device running macOS 12 (Monterey) or higher, [check here](https://github.com/jeffvli/feishin/issues/104#issuecomment-1553914730) for instructions on how to remove the app from quarantine.
For media keys to work, you will be prompted to allow Feishin to be a Trusted Accessibility Client. After allowing, you will need to restart Feishin for the privacy settings to take effect.
### Web and Docker
Visit [https://feishin.vercel.app](https://feishin.vercel.app) to use the hosted web version of Feishin. The web client only supports the web player backend.
@@ -59,11 +65,34 @@ Feishin is also available as a Docker image. The images are hosted via `ghcr.io`
```bash
# Run the latest version
docker run --name feishin --port 9180:9180 ghcr.io/jeffvli/feishin:latest
docker run --name feishin -p 9180:9180 ghcr.io/jeffvli/feishin:latest
# Build the image locally
docker build -t feishin .
docker run --name feishin --port 9180:9180 feishin
docker run --name feishin -p 9180:9180 feishin
```
#### Docker Compose
To install via Docker Compose use the following snippit. This also works on Portainer.
```yaml
services:
feishin:
container_name: feishin
image: 'ghcr.io/jeffvli/feishin:latest'
environment:
- SERVER_NAME=jellyfin # pre defined server name
- SERVER_LOCK=true # When true AND name/type/url are set, only username/password can be toggled
- SERVER_TYPE=jellyfin # navidrome also works
- SERVER_URL= # http://address:port
- PUID=1000
- PGID=1000
- UMASK=002
- TZ=America/Los_Angeles
ports:
- 9180:9180
restart: unless-stopped
```
### Configuration
@@ -72,7 +101,12 @@ docker run --name feishin --port 9180:9180 feishin
2. After restarting the app, you will be prompted to select a server. Click the `Open menu` button and select `Manage servers`. Click the `Add server` button in the popup and fill out all applicable details. You will need to enter the full URL to your server, including the protocol and port if applicable (e.g. `https://navidrome.my-server.com` or `http://192.168.0.1:4533`).
- **Navidrome** - For the best experience, select "Save password" when creating the server and configure the `SessionTimeout` setting in your Navidrome config to a larger value (e.g. 72h).
- **Navidrome** - For the best experience, select "Save password" when creating the server and configure the `SessionTimeout` setting in your Navidrome config to a larger value (e.g. 72h).
- **Linux users** - The default password store uses `libsecret`. `kwallet4/5/6` are also supported, but must be explicitly set in Settings > Window > Passwords/secret score.
3. _Optional_ - If you want to host Feishin on a subpath (not `/`), then pass in the following environment variable: `PUBLIC_PATH=PATH`. For example, to host on `/feishin`, pass in `PUBLIC_PATH=/feishin`.
4. _Optional_ - To hard code the server url, pass the following environment variables: `SERVER_NAME`, `SERVER_TYPE` (one of `jellyfin` or `navidrome`), `SERVER_URL`. To prevent users from changing these settings, pass `SERVER_LOCK=true`. This can only be set if all three of the previous values are set.
## FAQ
@@ -82,18 +116,69 @@ First thing to do is check that your MPV binary path is correct. Navigate to the
### What music servers does Feishin support?
Feishin supports any music server that implements a [Navidrome](https://www.navidrome.org/) or [Jellyfin](https://jellyfin.org/) API. **Subsonic API is not currently supported**. This will likely be added in [later when the new Subsonic API is decided on](https://support.symfonium.app/t/subsonic-servers-participation/1233).
Feishin supports any music server that implements a [Navidrome](https://www.navidrome.org/), [Jellyfin](https://jellyfin.org/), or [OpenSubsonic compatible](https://opensubsonic.netlify.app/) API.
- [Navidrome](https://github.com/navidrome/navidrome)
- [Jellyfin](https://github.com/jellyfin/jellyfin)
- [Funkwhale](https://funkwhale.audio/) - TBD
- Subsonic-compatible servers - TBD
- [Navidrome](https://github.com/navidrome/navidrome)
- [Jellyfin](https://github.com/jellyfin/jellyfin)
- [OpenSubsonic](https://opensubsonic.netlify.app/) compatible servers, such as...
- [Airsonic-Advanced](https://github.com/airsonic-advanced/airsonic-advanced)
- [Ampache](https://ampache.org)
- [Astiga](https://asti.ga/)
- [Funkwhale](https://www.funkwhale.audio/)
- [Gonic](https://github.com/sentriz/gonic)
- [LMS](https://github.com/epoupon/lms)
- [Nextcloud Music](https://apps.nextcloud.com/apps/music)
- [Supysonic](https://github.com/spl0k/supysonic)
- [Qm-Music](https://github.com/chenqimiao/qm-music)
- More (?)
### I have the issue "The SUID sandbox helper binary was found, but is not configured correctly" on Linux
This happens when you have user (unprivileged) namespaces disabled (`sysctl kernel.unprivileged_userns_clone` returns 0). You can fix this by either enabling unprivileged namespaces, or by making the `chrome-sandbox` Setuid.
```bash
chmod 4755 chrome-sandbox
sudo chown root:root chrome-sandbox
```
Ubunutu 24.04 specifically introduced breaking changes that affect how namespaces work. Please see https://discourse.ubuntu.com/t/ubuntu-24-04-lts-noble-numbat-release-notes/39890#:~:text=security%20improvements%20 for possible fixes.
## Development
Built and tested using Node `v16.15.0`.
Built and tested using Node `v23.11.0`.
This project is built off of [electron-react-boilerplate](https://github.com/electron-react-boilerplate/electron-react-boilerplate) v4.6.0.
This project is built off of [electron-vite](https://github.com/alex8088/electron-vite)
- `pnpm run dev` - Start the development server
- `pnpm run dev:watch` - Start the development server in watch mode (for main / preload HMR)
- `pnpm run start` - Starts the app in production preview mode
- `pnpm run build` - Builds the app for desktop
- `pnpm run build:electron` - Build the electron app (main, preload, and renderer)
- `pnpm run build:remote` - Build the remote app (remote)
- `pnpm run build:web` - Build the standalone web app (renderer)
- `pnpm run package` - Package the project
- `pnpm run package:dev` - Package the project for development locally
- `pnpm run package:linux` - Package the project for Linux locally
- `pnpm run package:mac` - Package the project for Mac locally
- `pnpm run package:win` - Package the project for Windows locally
- `pnpm run publish:linux` - Publish the project for Linux
- `pnpm run publish:linux:beta` - Publish the project for Linux (beta channel)
- `pnpm run publish:linux-arm64` - Publish the project for Linux ARM64
- `pnpm run publish:linux-arm64:beta` - Publish the project for Linux ARM64 (beta channel)
- `pnpm run publish:mac` - Publish the project for Mac
- `pnpm run publish:mac:beta` - Publish the project for Mac (beta channel)
- `pnpm run publish:win` - Publish the project for Windows
- `pnpm run publish:win:beta` - Publish the project for Windows (beta channel)
- `pnpm run typecheck` - Type check the project
- `pnpm run typecheck:node` - Type check the project with tsconfig.node.json
- `pnpm run typecheck:web` - Type check the project with tsconfig.web.json
- `pnpm run lint` - Lint the project
- `pnpm run lint:fix` - Lint the project and fix linting errors
- `pnpm run i18next` - Generate i18n files
## Translation
This project uses [Weblate](https://hosted.weblate.org/projects/feishin/) for translations. If you would like to contribute, please visit the link and submit a translation.
## License
+3 -1
View File
@@ -2,9 +2,11 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
</dict>
</plist>
Binary file not shown.
+3
View File
@@ -0,0 +1,3 @@
provider: generic
url: https://example.com/auto-updates
updaterCacheDirName: feishin-updater
+13
View File
@@ -0,0 +1,13 @@
version: '3.5'
services:
feishin:
container_name: feishin
image: ghcr.io/jeffvli/feishin:latest
restart: unless-stopped
ports:
- 9180:9180
environment:
- SERVER_NAME=jellyfin # pre defined server name
- SERVER_LOCK=true # When true AND name/type/url are set, only username/password can be toggled
- SERVER_TYPE=jellyfin # navidrome also works
- SERVER_URL= # http://address:port
+57
View File
@@ -0,0 +1,57 @@
appId: org.jeffvli.feishin
productName: Feishin
artifactName: ${productName}-${version}-${os}-${arch}.${ext}
electronVersion: 35.1.5
directories:
buildResources: assets
files:
- 'out/**/*'
- 'package.json'
extraResources:
- assets/**
asarUnpack:
- resources/**
win:
target:
- zip
- nsis
icon: assets/icons/icon.png
nsis:
allowToChangeInstallationDirectory: true
oneClick: false
shortcutName: ${productName}
uninstallDisplayName: ${productName}
createDesktopShortcut: always
mac:
target:
target: default
arch:
- arm64
- x64
icon: assets/icons/icon.icns
type: distribution
hardenedRuntime: true
entitlements: assets/entitlements.mac.plist
entitlementsInherit: assets/entitlements.mac.plist
gatekeeperAssess: false
notarize: false
dmg:
contents: [{ x: 130, y: 220 }, { x: 410, y: 220, type: link, path: /Applications }]
linux:
target:
- AppImage
- tar.xz
category: AudioVideo;Audio;Player
icon: assets/icons/icon.png
artifactName: ${productName}-${os}-${arch}.${ext}
npmRebuild: false
publish:
provider: github
owner: jeffvli
repo: feishin
channel: beta
+57
View File
@@ -0,0 +1,57 @@
appId: org.jeffvli.feishin
productName: Feishin
artifactName: ${productName}-${version}-${os}-${arch}.${ext}
electronVersion: 35.1.5
directories:
buildResources: assets
files:
- 'out/**/*'
- 'package.json'
extraResources:
- assets/**
asarUnpack:
- resources/**
win:
target:
- zip
- nsis
icon: assets/icons/icon.png
nsis:
allowToChangeInstallationDirectory: true
oneClick: false
shortcutName: ${productName}
uninstallDisplayName: ${productName}
createDesktopShortcut: always
mac:
target:
target: default
arch:
- arm64
- x64
icon: assets/icons/icon.icns
type: distribution
hardenedRuntime: true
entitlements: assets/entitlements.mac.plist
entitlementsInherit: assets/entitlements.mac.plist
gatekeeperAssess: false
notarize: false
dmg:
contents: [{ x: 130, y: 220 }, { x: 410, y: 220, type: link, path: /Applications }]
linux:
target:
- AppImage
- tar.xz
category: AudioVideo;Audio;Player
icon: assets/icons/icon.png
artifactName: ${productName}-${os}-${arch}.${ext}
npmRebuild: false
publish:
provider: github
owner: jeffvli
repo: feishin
channel: latest
+66
View File
@@ -0,0 +1,66 @@
import react from '@vitejs/plugin-react';
import { externalizeDepsPlugin, UserConfig } from 'electron-vite';
import { resolve } from 'path';
import conditionalImportPlugin from 'vite-plugin-conditional-import';
import dynamicImportPlugin from 'vite-plugin-dynamic-import';
import { ViteEjsPlugin } from 'vite-plugin-ejs';
const currentOSEnv = process.platform;
const config: UserConfig = {
main: {
build: {
rollupOptions: {
external: ['source-map-support'],
},
sourcemap: true,
},
define: {
'import.meta.env.IS_LINUX': JSON.stringify(currentOSEnv === 'linux'),
'import.meta.env.IS_MACOS': JSON.stringify(currentOSEnv === 'darwin'),
'import.meta.env.IS_WIN': JSON.stringify(currentOSEnv === 'win32'),
},
plugins: [
externalizeDepsPlugin(),
dynamicImportPlugin(),
conditionalImportPlugin({
currentEnv: currentOSEnv,
envs: ['win32', 'linux', 'darwin'],
}),
],
resolve: {
alias: {
'/@/main': resolve('src/main'),
'/@/shared': resolve('src/shared'),
},
},
},
preload: {
plugins: [externalizeDepsPlugin()],
resolve: {
alias: {
'/@/preload': resolve('src/preload'),
'/@/shared': resolve('src/shared'),
},
},
},
renderer: {
css: {
modules: {
generateScopedName: 'fs-[name]-[local]',
localsConvention: 'camelCase',
},
},
plugins: [react(), ViteEjsPlugin({ web: false })],
resolve: {
alias: {
'/@/i18n': resolve('src/i18n'),
'/@/remote': resolve('src/remote'),
'/@/renderer': resolve('src/renderer'),
'/@/shared': resolve('src/shared'),
},
},
},
};
export default config;
+53
View File
@@ -0,0 +1,53 @@
import eslintConfigPrettier from '@electron-toolkit/eslint-config-prettier';
import tseslint from '@electron-toolkit/eslint-config-ts';
import perfectionist from 'eslint-plugin-perfectionist';
import eslintPluginReact from 'eslint-plugin-react';
import eslintPluginReactHooks from 'eslint-plugin-react-hooks';
import eslintPluginReactRefresh from 'eslint-plugin-react-refresh';
export default tseslint.config(
{ ignores: ['**/node_modules', '**/dist', '**/out'] },
tseslint.configs.recommended,
perfectionist.configs['recommended-natural'],
eslintPluginReact.configs.flat.recommended,
eslintPluginReact.configs.flat['jsx-runtime'],
{
settings: {
react: {
version: 'detect',
},
},
},
{
files: ['**/*.{ts,tsx}'],
plugins: {
'react-hooks': eslintPluginReactHooks,
'react-refresh': eslintPluginReactRefresh,
},
rules: {
...eslintPluginReactHooks.configs.recommended.rules,
...eslintPluginReactRefresh.configs.vite.rules,
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-duplicate-enum-values': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-unused-vars': 'warn',
curly: ['error', 'all'],
indent: [
'error',
'tab',
{
offsetTernaryExpressions: true,
SwitchCase: 1,
},
],
'no-unused-vars': 'off',
'no-use-before-define': 'off',
quotes: ['error', 'single'],
'react-refresh/only-export-components': 'off',
'react/display-name': 'off',
semi: ['error', 'always'],
'single-attribute-per-line': 'off',
},
},
eslintConfigPrettier,
);
+11 -4
View File
@@ -12,9 +12,16 @@ server {
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 9;
root /usr/share/nginx/html;
location / {
location ${PUBLIC_PATH} {
alias /usr/share/nginx/html/;
try_files $uri $uri/ /index.html =404;
}
}
location ${PUBLIC_PATH}settings.js {
alias /etc/nginx/conf.d/settings.js;
}
location ${PUBLIC_PATH}/settings.js {
alias /etc/nginx/conf.d/settings.js;
}
}
-37221
View File
File diff suppressed because it is too large Load Diff
+134 -283
View File
@@ -1,259 +1,61 @@
{
"name": "feishin",
"productName": "Feishin",
"description": "Feishin music server",
"version": "0.4.1",
"scripts": {
"build": "concurrently \"npm run build:main\" \"npm run build:renderer\" \"npm run build:remote\"",
"build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts",
"build:remote": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.remote.prod.ts",
"build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts",
"build:web": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.web.prod.ts",
"build:docker": "npm run build:web && docker build -t jeffvli/feishin .",
"rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app",
"lint": "concurrently \"npm run lint:code\" \"npm run lint:styles\"",
"lint:code": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx --fix",
"lint:styles": "npx stylelint **/*.tsx --fix",
"package": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never",
"package:pr": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --win --mac --linux",
"package:dev": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --dir",
"postinstall": "ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts",
"start": "ts-node ./.erb/scripts/check-port-in-use.js && npm run start:renderer",
"start:main": "cross-env NODE_ENV=development electron -r ts-node/register/transpile-only ./src/main/main.ts",
"start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.preload.dev.ts",
"start:remote": "cross-env NODE_ENV=developemnt TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.remote.dev.ts",
"start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts",
"start:web": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.web.ts",
"test": "jest",
"prepare": "husky install",
"i18next": "i18next -c src/renderer/i18n/i18next-parser.config.js",
"prod:buildserver": "pwsh -c \"./scripts/server-build.ps1\"",
"prod:publishserver": "pwsh -c \"./scripts/server-publish.ps1\""
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"cross-env NODE_ENV=development eslint --cache"
],
"*.json,.{eslintrc,prettierrc}": [
"prettier --ignore-path .eslintignore --parser json --write"
],
"*.{css,scss}": [
"prettier --ignore-path .eslintignore --single-quote --write"
],
"*.{html,md,yml}": [
"prettier --ignore-path .eslintignore --single-quote --write"
]
},
"build": {
"productName": "Feishin",
"appId": "org.jeffvli.feishin",
"artifactName": "${productName}-${version}-${os}-${arch}.${ext}",
"asar": true,
"asarUnpack": "**\\*.{node,dll}",
"files": [
"dist",
"node_modules",
"package.json"
],
"afterSign": ".erb/scripts/notarize.js",
"electronVersion": "25.8.1",
"mac": {
"target": {
"target": "default",
"arch": [
"arm64",
"x64"
]
},
"icon": "assets/icons/icon.icns",
"type": "distribution",
"hardenedRuntime": true,
"entitlements": "assets/entitlements.mac.plist",
"entitlementsInherit": "assets/entitlements.mac.plist",
"gatekeeperAssess": false
},
"dmg": {
"contents": [
{
"x": 130,
"y": 220
},
{
"x": 410,
"y": 220,
"type": "link",
"path": "/Applications"
}
]
},
"win": {
"target": [
"nsis",
"zip"
],
"icon": "assets/icons/icon.ico"
},
"linux": {
"target": [
"AppImage",
"tar.xz"
],
"icon": "assets/icons/icon.png",
"category": "Development"
},
"directories": {
"app": "release/app",
"buildResources": "assets",
"output": "release/build"
},
"extraResources": [
"./assets/**"
],
"publish": {
"provider": "github",
"owner": "jeffvli",
"repo": "feishin"
}
},
"repository": {
"type": "git",
"url": "git+https://github.com/jeffvli/feishin.git"
},
"author": {
"name": "jeffvli",
"url": "https://github.com/jeffvli/"
},
"contributors": [],
"license": "GPL-3.0",
"bugs": {
"url": "https://github.com/jeffvli/feishin/issues"
},
"version": "0.21.0",
"description": "A modern self-hosted music player.",
"keywords": [
"subsonic",
"navidrome",
"airsonic",
"jellyfin",
"react",
"electron"
],
"homepage": "https://github.com/jeffvli/feishin",
"jest": {
"testURL": "http://localhost/",
"testEnvironment": "jsdom",
"transform": {
"\\.(ts|tsx|js|jsx)$": "ts-jest"
},
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/.erb/mocks/fileMock.js",
"\\.(css|less|sass|scss)$": "identity-obj-proxy"
},
"moduleFileExtensions": [
"js",
"jsx",
"ts",
"tsx",
"json"
],
"moduleDirectories": [
"node_modules",
"release/app/node_modules"
],
"testPathIgnorePatterns": [
"release/app/dist"
],
"setupFiles": [
"./.erb/scripts/check-build-exists.ts"
]
"bugs": {
"url": "https://github.com/jeffvli/feishin/issues"
},
"devDependencies": {
"@electron/rebuild": "^3.2.10",
"@pmmmwh/react-refresh-webpack-plugin": "0.5.5",
"@stylelint/postcss-css-in-js": "^0.38.0",
"@teamsupercell/typings-for-css-modules-loader": "^2.5.1",
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^13.0.0",
"@types/electron-localshortcut": "^3.1.0",
"@types/jest": "^27.4.1",
"@types/lodash": "^4.14.188",
"@types/md5": "^2.3.2",
"@types/node": "^17.0.23",
"@types/react": "^18.0.25",
"@types/react-dom": "^18.0.8",
"@types/react-test-renderer": "^17.0.1",
"@types/react-virtualized-auto-sizer": "^1.0.1",
"@types/react-window": "^1.8.5",
"@types/react-window-infinite-loader": "^1.0.6",
"@types/styled-components": "^5.1.26",
"@types/terser-webpack-plugin": "^5.0.4",
"@types/webpack-bundle-analyzer": "^4.4.1",
"@types/webpack-env": "^1.16.3",
"@typescript-eslint/eslint-plugin": "^5.47.0",
"@typescript-eslint/parser": "^5.47.0",
"browserslist-config-erb": "^0.0.3",
"chalk": "^4.1.2",
"concurrently": "^7.1.0",
"core-js": "^3.21.1",
"cross-env": "^7.0.3",
"css-loader": "^6.7.1",
"css-minimizer-webpack-plugin": "^3.4.1",
"detect-port": "^1.3.0",
"electron": "^25.8.1",
"electron-builder": "^24.6.3",
"electron-devtools-installer": "^3.2.0",
"electron-notarize": "^1.2.1",
"electronmon": "^2.0.2",
"eslint": "^8.30.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-erb": "^4.0.3",
"eslint-import-resolver-typescript": "^2.7.1",
"eslint-import-resolver-webpack": "^0.13.2",
"eslint-plugin-compat": "^4.0.2",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-jest": "^26.1.3",
"eslint-plugin-jsx-a11y": "^6.5.1",
"eslint-plugin-promise": "^6.0.0",
"eslint-plugin-react": "^7.29.4",
"eslint-plugin-react-hooks": "^4.4.0",
"eslint-plugin-sort-keys-fix": "^1.1.2",
"eslint-plugin-typescript-sort-keys": "^2.1.0",
"file-loader": "^6.2.0",
"html-webpack-plugin": "^5.5.0",
"husky": "^7.0.4",
"i18next-parser": "^6.3.0",
"identity-obj-proxy": "^3.0.0",
"jest": "^27.5.1",
"lint-staged": "^12.3.7",
"mini-css-extract-plugin": "^2.6.0",
"postcss-scss": "^4.0.4",
"postcss-styled-syntax": "^0.5.0",
"postcss-syntax": "^0.36.2",
"prettier": "^2.6.2",
"react-refresh": "^0.12.0",
"react-refresh-typescript": "^2.0.4",
"react-test-renderer": "^18.0.0",
"rimraf": "^3.0.2",
"sass": "^1.49.11",
"sass-loader": "^12.6.0",
"style-loader": "^3.3.1",
"stylelint": "^15.10.3",
"stylelint-config-css-modules": "^4.3.0",
"stylelint-config-recess-order": "^4.3.0",
"stylelint-config-standard": "^34.0.0",
"stylelint-config-standard-scss": "^4.0.0",
"stylelint-config-styled-components": "^0.1.1",
"terser-webpack-plugin": "^5.3.1",
"ts-jest": "^27.1.4",
"ts-loader": "^9.2.8",
"ts-node": "^10.7.0",
"tsconfig-paths-webpack-plugin": "^4.0.0",
"typescript": "^5.2.2",
"typescript-plugin-styled-components": "^3.0.0",
"url-loader": "^4.1.1",
"webpack": "^5.71.0",
"webpack-bundle-analyzer": "^4.5.0",
"webpack-cli": "^4.9.2",
"webpack-dev-server": "^4.8.0",
"webpack-merge": "^5.8.0"
"license": "GPL-3.0",
"author": {
"name": "jeffvli",
"url": "https://github.com/jeffvli/"
},
"main": "./out/main/index.js",
"scripts": {
"build": "pnpm run typecheck && pnpm run build:electron && pnpm run build:remote",
"build:electron": "electron-vite build",
"build:remote": "vite build --config remote.vite.config.ts",
"build:web": "vite build --config web.vite.config.ts",
"dev": "electron-vite dev",
"dev:remote": "vite dev --config remote.vite.config.ts",
"dev:watch": "electron-vite dev --watch",
"i18next": "i18next -c src/i18n/i18next-parser.config.js",
"postinstall": "electron-builder install-app-deps",
"lint": "pnpm run lint-code && pnpm run lint-styles",
"lint-code": "eslint --max-warnings=0 --cache .",
"lint-code:fix": "eslint --cache --fix .",
"lint-styles": "stylelint --max-warnings=0 'src/**/*.{css,scss}'",
"lint-styles:fix": "stylelint 'src/**/*.{css,scss}' --fix",
"lint:fix": "pnpm run lint-code:fix && pnpm run lint-styles:fix",
"package": "pnpm run build && electron-builder",
"package:dev": "pnpm run build && electron-builder --dir",
"package:linux": "pnpm run build && electron-builder --linux",
"package:linux-arm64:pr": "pnpm run build && electron-builder --linux --arm64 --publish never",
"package:linux:pr": "pnpm run build && electron-builder --linux --publish never",
"package:mac": "pnpm run build && electron-builder --mac",
"package:mac:pr": "pnpm run build && electron-builder --mac --publish never",
"package:win": "pnpm run build && electron-builder --win",
"package:win:pr": "pnpm run build && electron-builder --win --publish never",
"publish:linux": "pnpm run build && electron-builder --publish always --linux",
"publish:linux-arm64": "pnpm run build && electron-builder --publish always --linux --arm64",
"publish:linux-arm64:beta": "pnpm run build && electron-builder --config electron-builder-beta.yml --publish always --linux --arm64",
"publish:linux:beta": "pnpm run build && electron-builder --config electron-builder-beta.yml --publish always --linux",
"publish:mac": "pnpm run build && electron-builder --publish always --mac",
"publish:mac:beta": "pnpm run build && electron-builder --config electron-builder-beta.yml --publish always --mac",
"publish:win": "pnpm run build && electron-builder --publish always --win",
"publish:win:beta": "pnpm run build && electron-builder --config electron-builder-beta.yml --publish always --win",
"start": "electron-vite preview",
"typecheck": "pnpm run typecheck:node && pnpm run typecheck:web",
"typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
"typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false"
},
"dependencies": {
"@ag-grid-community/client-side-row-model": "^28.2.1",
@@ -261,73 +63,122 @@
"@ag-grid-community/infinite-row-model": "^28.2.1",
"@ag-grid-community/react": "^28.2.1",
"@ag-grid-community/styles": "^28.2.1",
"@emotion/react": "^11.10.4",
"@mantine/core": "^6.0.17",
"@mantine/dates": "^6.0.17",
"@mantine/form": "^6.0.17",
"@mantine/hooks": "^6.0.17",
"@mantine/modals": "^6.0.17",
"@mantine/notifications": "^6.0.17",
"@mantine/utils": "^6.0.17",
"@atlaskit/pragmatic-drag-and-drop": "1.4.0",
"@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.0",
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3",
"@electron-toolkit/preload": "^3.0.1",
"@electron-toolkit/utils": "^4.0.0",
"@mantine/colors-generator": "^8.2.8",
"@mantine/core": "^8.2.8",
"@mantine/dates": "^8.2.8",
"@mantine/form": "^8.2.8",
"@mantine/hooks": "^8.2.8",
"@mantine/modals": "^8.2.8",
"@mantine/notifications": "^8.2.8",
"@tanstack/react-query": "^4.32.1",
"@tanstack/react-query-devtools": "^4.32.1",
"@tanstack/react-query-persist-client": "^4.32.1",
"@ts-rest/core": "^3.23.0",
"axios": "^1.4.0",
"@xhayper/discord-rpc": "^1.3.0",
"audiomotion-analyzer": "^4.5.0",
"auto-text-size": "^0.2.3",
"axios": "^1.12.0",
"cheerio": "^1.0.0",
"clsx": "^2.0.0",
"cmdk": "^0.2.0",
"dayjs": "^1.11.6",
"dompurify": "^3.1.6",
"electron-debug": "^3.2.0",
"electron-localshortcut": "^3.2.1",
"electron-log": "^4.4.6",
"electron-log": "^5.1.1",
"electron-store": "^8.1.0",
"electron-updater": "^4.6.5",
"electron-updater": "^6.3.9",
"fast-average-color": "^9.3.0",
"format-duration": "^2.0.0",
"framer-motion": "^10.13.0",
"fuse.js": "^6.6.2",
"history": "^5.3.0",
"i18next": "^21.6.16",
"i18next": "^21.10.0",
"idb-keyval": "^6.2.1",
"immer": "^9.0.21",
"is-electron": "^2.2.2",
"lodash": "^4.17.21",
"md5": "^2.3.0",
"memoize-one": "^6.0.0",
"motion": "^12.18.1",
"mpris-service": "^2.1.2",
"nanoid": "^3.3.3",
"net": "^1.0.2",
"node-mpv": "github:jeffvli/Node-MPV",
"overlayscrollbars": "^2.2.1",
"overlayscrollbars-react": "^0.5.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"node-mpv": "github:jeffvli/Node-MPV#32b4d64395289ad710c41d481d2707a7acfc228f",
"overlayscrollbars": "^2.11.1",
"overlayscrollbars-react": "^0.5.6",
"qs": "^6.14.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-error-boundary": "^3.1.4",
"react-i18next": "^11.16.7",
"react-icons": "^4.10.1",
"react-i18next": "^11.18.6",
"react-icons": "^5.5.0",
"react-image": "^4.1.0",
"react-intersection-observer": "^9.16.0",
"react-loading-skeleton": "^3.5.0",
"react-player": "^2.11.0",
"react-router": "^6.16.0",
"react-router-dom": "^6.16.0",
"react-simple-img": "^3.0.0",
"react-virtualized-auto-sizer": "^1.0.17",
"react-window": "^1.8.9",
"react-window-infinite-loader": "^1.0.9",
"styled-components": "^6.0.8",
"semver": "^7.5.4",
"swiper": "^9.3.1",
"zod": "^3.21.4",
"zustand": "^4.3.9"
"use-sync-external-store": "^1.5.0",
"ws": "^8.18.2",
"zod": "^3.22.3",
"zustand": "^5.0.5"
},
"resolutions": {
"styled-components": "^6"
"devDependencies": {
"@electron-toolkit/eslint-config-prettier": "^3.0.0",
"@electron-toolkit/eslint-config-ts": "^3.0.0",
"@electron-toolkit/tsconfig": "^1.0.1",
"@types/electron-localshortcut": "^3.1.0",
"@types/lodash": "^4.17.18",
"@types/md5": "^2.3.5",
"@types/node": "^22.15.32",
"@types/react": "^18.3.23",
"@types/react-dom": "^18.3.7",
"@types/react-window": "^1.8.5",
"@types/react-window-infinite-loader": "^1.0.6",
"@types/source-map-support": "^0.5.10",
"@types/ws": "^8.18.1",
"@vitejs/plugin-react": "^4.3.4",
"concurrently": "^7.1.0",
"cross-env": "^7.0.3",
"electron": "^37.4.0",
"electron-builder": "^26.0.12",
"electron-devtools-installer": "^3.2.0",
"electron-vite": "^3.1.0",
"eslint": "^9.24.0",
"eslint-plugin-perfectionist": "^4.13.0",
"eslint-plugin-prettier": "^5.4.0",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.19",
"i18next-parser": "^9.0.2",
"postcss-preset-mantine": "^1.17.0",
"prettier": "^3.5.3",
"prettier-plugin-packagejson": "^2.5.14",
"sass-embedded": "^1.89.0",
"stylelint": "^16.14.1",
"stylelint-config-css-modules": "^4.4.0",
"stylelint-config-recess-order": "^7.1.0",
"stylelint-config-standard": "^38.0.0",
"typescript": "^5.8.3",
"vite": "^6.3.6",
"vite-plugin-conditional-import": "^0.1.7",
"vite-plugin-dynamic-import": "^1.6.0",
"vite-plugin-ejs": "^1.7.0",
"vite-plugin-pwa": "^1.0.3"
},
"devEngines": {
"node": ">=14.x",
"npm": ">=7.x"
},
"browserslist": [],
"electronmon": {
"patterns": [
"!server",
"!src/renderer"
"pnpm": {
"onlyBuiltDependencies": [
"electron",
"esbuild"
]
}
},
"productName": "feishin"
}
+11744
View File
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +1,5 @@
module.exports = {
plugins: {
'postcss-preset-mantine': {},
},
};
-2331
View File
File diff suppressed because it is too large Load Diff
-24
View File
@@ -1,24 +0,0 @@
{
"name": "feishin",
"version": "0.4.1",
"description": "",
"main": "./dist/main/main.js",
"author": {
"name": "jeffvli",
"url": "https://github.com/jeffvli/"
},
"scripts": {
"electron-rebuild": "node -r ts-node/register ../../.erb/scripts/electron-rebuild.js",
"link-modules": "node -r ts-node/register ../../.erb/scripts/link-modules.ts",
"postinstall": "npm run electron-rebuild && npm run link-modules"
},
"dependencies": {
"cheerio": "^1.0.0-rc.12",
"mpris-service": "^2.1.2",
"ws": "^8.13.0"
},
"devDependencies": {
"electron": "25.3.0"
},
"license": "GPL-3.0"
}
+51
View File
@@ -0,0 +1,51 @@
import react from '@vitejs/plugin-react';
import path from 'path';
import { defineConfig, normalizePath } from 'vite';
import { ViteEjsPlugin } from 'vite-plugin-ejs';
import { version } from './package.json';
export default defineConfig({
build: {
emptyOutDir: true,
outDir: path.resolve(__dirname, './out/remote'),
rollupOptions: {
input: {
favicon: normalizePath(path.resolve(__dirname, './assets/icons/favicon.ico')),
index: normalizePath(path.resolve(__dirname, './src/remote/index.html')),
manifest: normalizePath(path.resolve(__dirname, './src/remote/manifest.json')),
remote: normalizePath(path.resolve(__dirname, './src/remote/index.tsx')),
worker: normalizePath(path.resolve(__dirname, './src/remote/service-worker.ts')),
},
output: {
assetFileNames: '[name].[ext]',
chunkFileNames: '[name].js',
entryFileNames: '[name].js',
},
},
sourcemap: true,
},
css: {
modules: {
generateScopedName: 'fs-[name]-[local]',
localsConvention: 'camelCase',
},
},
plugins: [
react(),
ViteEjsPlugin({
prod: process.env.NODE_ENV === 'production',
root: normalizePath(path.resolve(__dirname, './src/remote')),
version,
}),
],
resolve: {
alias: {
'/@/i18n': path.resolve(__dirname, './src/i18n'),
'/@/remote': path.resolve(__dirname, './src/remote'),
'/@/renderer': path.resolve(__dirname, './src/renderer'),
'/@/shared': path.resolve(__dirname, './src/shared'),
},
},
root: path.resolve(__dirname, './src/remote'),
});
Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

+1
View File
@@ -0,0 +1 @@
"use strict";window.SERVER_URL="${SERVER_URL}";window.SERVER_NAME="${SERVER_NAME}";window.SERVER_TYPE="${SERVER_TYPE}";window.SERVER_LOCK=${SERVER_LOCK};
-9
View File
@@ -1,9 +0,0 @@
import '@testing-library/jest-dom';
import { render } from '@testing-library/react';
import { App } from '../renderer/app';
describe('App', () => {
it('should render', () => {
expect(render(<App />)).toBeTruthy();
});
});
-32
View File
@@ -1,32 +0,0 @@
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
const en = require('./locales/en.json');
const resources = {
en: { translation: en },
};
export const Languages = [
{
label: 'English',
value: 'en',
},
];
i18n
.use(initReactI18next) // passes i18n down to react-i18next
.init({
fallbackLng: 'en',
// language to use, more information here: https://www.i18next.com/overview/configuration-options#languages-namespaces-resources
// you can use the i18n.changeLanguage function to change the language manually: https://www.i18next.com/overview/api#changelanguage
// if you're using a language detector, do not define the lng option
interpolation: {
escapeValue: false, // react already safes from xss
},
lng: 'en',
resources,
});
export default i18n;
+230
View File
@@ -0,0 +1,230 @@
import { PostProcessorModule, StringMap, TOptions } from 'i18next';
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import ca from './locales/ca.json';
import cs from './locales/cs.json';
import de from './locales/de.json';
import en from './locales/en.json';
import es from './locales/es.json';
import fa from './locales/fa.json';
import fi from './locales/fi.json';
import fr from './locales/fr.json';
import hu from './locales/hu.json';
import id from './locales/id.json';
import it from './locales/it.json';
import ja from './locales/ja.json';
import ko from './locales/ko.json';
import nbNO from './locales/nb-NO.json';
import nl from './locales/nl.json';
import pl from './locales/pl.json';
import ptBr from './locales/pt-BR.json';
import pt from './locales/pt.json';
import ru from './locales/ru.json';
import sl from './locales/sl.json';
import sr from './locales/sr.json';
import sv from './locales/sv.json';
import ta from './locales/ta.json';
import tr from './locales/tr.json';
import zhHans from './locales/zh-Hans.json';
import zhHant from './locales/zh-Hant.json';
const resources = {
ca: { translation: ca },
cs: { translation: cs },
de: { translation: de },
en: { translation: en },
es: { translation: es },
fa: { translation: fa },
fi: { translation: fi },
fr: { translation: fr },
hu: { translation: hu },
id: { translation: id },
it: { translation: it },
ja: { translation: ja },
ko: { translation: ko },
'nb-NO': { translation: nbNO },
nl: { translation: nl },
pl: { translation: pl },
pt: { translation: pt },
'pt-BR': { translation: ptBr },
ru: { translation: ru },
sl: { translation: sl },
sr: { translation: sr },
sv: { translation: sv },
ta: { translation: ta },
tr: { translation: tr },
'zh-Hans': { translation: zhHans },
'zh-Hant': { translation: zhHant },
};
export const languages = [
{
label: 'English',
value: 'en',
},
{
label: 'Català',
value: 'ca',
},
{
label: 'Čeština',
value: 'cs',
},
{
label: 'Español',
value: 'es',
},
{
label: 'Deutsch',
value: 'de',
},
{
label: 'Français',
value: 'fr',
},
{
label: 'Bahasa Indonesia',
value: 'id',
},
{
label: 'Suomeksi',
value: 'fi',
},
{
label: 'Magyar',
value: 'hu',
},
{
label: 'Italiano',
value: 'it',
},
{
label: '日本語',
value: 'ja',
},
{
label: '한국어',
value: 'ko',
},
{
label: 'Nederlands',
value: 'nl',
},
{
label: 'Norsk (Bokmål)',
value: 'nb-NO',
},
{
label: 'فارسی',
value: 'fa',
},
{
label: 'Português',
value: 'pt',
},
{
label: 'Português (Brasil)',
value: 'pt-BR',
},
{
label: 'Polski',
value: 'pl',
},
{
label: 'Русский',
value: 'ru',
},
{
label: 'Slovenščina',
value: 'sl',
},
{
label: 'Srpski',
value: 'sr',
},
{
label: 'Svenska',
value: 'sv',
},
{
label: 'Tamil',
value: 'ta',
},
{
label: 'Türkçe',
value: 'tr',
},
{
label: '简体中文',
value: 'zh-Hans',
},
{
label: '繁體中文',
value: 'zh-Hant',
},
];
const lowerCasePostProcessor: PostProcessorModule = {
name: 'lowerCase',
process: (value: string) => {
return value.toLocaleLowerCase();
},
type: 'postProcessor',
};
const upperCasePostProcessor: PostProcessorModule = {
name: 'upperCase',
process: (value: string) => {
return value.toLocaleUpperCase();
},
type: 'postProcessor',
};
const titleCasePostProcessor: PostProcessorModule = {
name: 'titleCase',
process: (value: string) => {
return value.replace(/\S\S*/g, (txt) => {
return txt.charAt(0).toLocaleUpperCase() + txt.slice(1).toLowerCase();
});
},
type: 'postProcessor',
};
const ignoreSentenceCaseLanguages = ['de'];
const sentenceCasePostProcessor: PostProcessorModule = {
name: 'sentenceCase',
process: (value: string, _key: string, _options: TOptions<StringMap>, translator: any) => {
const sentences = value.split('. ');
return sentences
.map((sentence) => {
return (
sentence.charAt(0).toLocaleUpperCase() +
(!ignoreSentenceCaseLanguages.includes(translator.language)
? sentence.slice(1).toLocaleLowerCase()
: sentence.slice(1))
);
})
.join('. ');
},
type: 'postProcessor',
};
i18n.use(lowerCasePostProcessor)
.use(upperCasePostProcessor)
.use(titleCasePostProcessor)
.use(sentenceCasePostProcessor)
.use(initReactI18next) // passes i18n down to react-i18next
.init({
fallbackLng: 'en',
// language to use, more information here: https://www.i18next.com/overview/configuration-options#languages-namespaces-resources
// you can use the i18n.changeLanguage function to change the language manually: https://www.i18next.com/overview/api#changelanguage
// if you're using a language detector, do not define the lng option
interpolation: {
escapeValue: false, // react already safes from xss
},
resources,
});
export default i18n;
+41 -114
View File
@@ -1,117 +1,44 @@
// i18next-parser.config.js
// Reference: https://github.com/i18next/i18next-parser#options
module.exports = {
contextSeparator: '_',
// Key separator used in your translation keys
createOldCatalogs: true,
// Exit with an exit code of 1 when translations are updated (for CI purpose)
customValueTemplate: null,
// Save the \_old files
defaultNamespace: 'translation',
// Default namespace used in your i18next config
defaultValue: '',
// Exit with an exit code of 1 on warnings
failOnUpdate: false,
// Display info about the parsing including some stats
failOnWarnings: false,
// The locale to compare with default values to determine whether a default value has been changed.
// If this is set and a default value differs from a translation in the specified locale, all entries
// for that key across locales are reset to the default value, and existing translations are moved to
// the `_old` file.
i18nextOptions: null,
// Default value to give to empty keys
// You may also specify a function accepting the locale, namespace, and key as arguments
indentation: 2,
// Plural separator used in your translation keys
// If you want to use plain english keys, separators such as `_` might conflict. You might want to set `pluralSeparator` to a different string that does not occur in your keys.
input: [
'../components/**/*.{js,jsx,ts,tsx}',
'../features/**/*.{js,jsx,ts,tsx}',
'../layouts/**/*.{js,jsx,ts,tsx}',
'!../../src/node_modules/**',
'!../../src/**/*.prod.js',
],
// Indentation of the catalog files
keepRemoved: false,
// Keep keys from the catalog that are no longer in code
keySeparator: '.',
// Key separator used in your translation keys
// If you want to use plain english keys, separators such as `.` and `:` will conflict. You might want to set `keySeparator: false` and `namespaceSeparator: false`. That way, `t('Status: Loading...')` will not think that there are a namespace and three separator dots for instance.
// see below for more details
lexers: {
default: ['JavascriptLexer'],
handlebars: ['HandlebarsLexer'],
hbs: ['HandlebarsLexer'],
htm: ['HTMLLexer'],
html: ['HTMLLexer'],
js: ['JavascriptLexer'],
jsx: ['JsxLexer'],
mjs: ['JavascriptLexer'],
// if you're writing jsx inside .js files, change this to JsxLexer
ts: ['JavascriptLexer'],
tsx: ['JsxLexer'],
},
lineEnding: 'auto',
// Control the line ending. See options at https://github.com/ryanve/eol
locales: ['en'],
// An array of the locales in your applications
namespaceSeparator: false,
// Namespace separator used in your translation keys
// If you want to use plain english keys, separators such as `.` and `:` will conflict. You might want to set `keySeparator: false` and `namespaceSeparator: false`. That way, `t('Status: Loading...')` will not think that there are a namespace and three separator dots for instance.
output: 'src/renderer/i18n/locales/$LOCALE.json',
// Supports $LOCALE and $NAMESPACE injection
// Supports JSON (.json) and YAML (.yml) file formats
// Where to write the locale files relative to process.cwd()
pluralSeparator: '_',
// If you wish to customize the value output the value as an object, you can set your own format.
// ${defaultValue} is the default value you set in your translation function.
// Any other custom property will be automatically extracted.
//
// Example:
// {
// message: "${defaultValue}",
// description: "${maxLength}", //
// }
resetDefaultValueLocale: 'en',
// Whether or not to sort the catalog. Can also be a [compareFunction](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#parameters)
skipDefaultValues: false,
// An array of globs that describe where to look for source files
// relative to the location of the configuration file
sort: true,
// Whether to ignore default values
// You may also specify a function accepting the locale and namespace as arguments
useKeysAsDefaultValue: true,
// Whether to use the keys as the default value; ex. "Hello": "Hello", "World": "World"
// This option takes precedence over the `defaultValue` and `skipDefaultValues` options
// You may also specify a function accepting the locale and namespace as arguments
verbose: false,
// If you wish to customize options in internally used i18next instance, you can define an object with any
// configuration property supported by i18next (https://www.i18next.com/overview/configuration-options).
// { compatibilityJSON: 'v3' } can be used to generate v3 compatible plurals.
contextSeparator: '_',
createOldCatalogs: true,
customValueTemplate: null,
defaultNamespace: 'translation',
defaultValue: function (locale, namespace, key) {
return key;
},
failOnUpdate: false,
failOnWarnings: false,
i18nextOptions: null,
indentation: 4,
input: [
'../renderer/components/**/*.{js,jsx,ts,tsx}',
'../renderer/features/**/*.{js,jsx,ts,tsx}',
'../renderer/layouts/**/*.{js,jsx,ts,tsx}',
'!../src/node_modules/**',
'!../src/**/*.prod.js',
],
keepRemoved: false,
keySeparator: '.',
lexers: {
default: ['JavascriptLexer'],
handlebars: ['HandlebarsLexer'],
hbs: ['HandlebarsLexer'],
htm: ['HTMLLexer'],
html: ['HTMLLexer'],
js: ['JavascriptLexer'],
jsx: ['JsxLexer'],
mjs: ['JavascriptLexer'],
ts: ['JavascriptLexer'],
tsx: ['JsxLexer'],
},
lineEnding: 'auto',
locales: ['en'],
namespaceSeparator: false,
output: 'src/renderer/i18n/locales/$LOCALE.json',
pluralSeparator: '_',
resetDefaultValueLocale: 'en',
sort: true,
verbose: false,
};
+831
View File
@@ -0,0 +1,831 @@
{
"page": {
"sidebar": {
"myLibrary": "La meva llibreria",
"albumArtists": "$t(entity.albumArtist_other)",
"albums": "$t(entity.album_other)",
"artists": "$t(entity.artist_other)",
"folders": "$t(entity.folder_other)",
"genres": "$t(entity.genre_other)",
"home": "$t(common.home)",
"playlists": "$t(entity.playlist_other)",
"search": "$t(common.search)",
"settings": "$t(common.setting_other)",
"tracks": "$t(entity.track_other)",
"nowPlaying": "ara sona",
"shared": "$t(entity.playlist_other) compartida"
},
"albumArtistDetail": {
"relatedArtists": "$t(entity.artist_other) similars",
"viewAllTracks": "veure totes les $t(entity.track_other)",
"about": "Sobre {{artist}}",
"appearsOn": "apareix a",
"recentReleases": "Llançaments recents",
"viewDiscography": "Mosta la discografia",
"topSongs": "millos cançons",
"topSongsFrom": "les millors cançons de {{title}}",
"viewAll": "mostra-ho tot"
},
"albumArtistList": {
"title": "$t(entity.albumArtist_other)"
},
"albumDetail": {
"moreFromArtist": "més d'aquest $t(entity.artist_one)",
"moreFromGeneric": "més de {{item}}",
"released": "publicat"
},
"albumList": {
"title": "$t(entity.album_other)",
"artistAlbums": "àlbums de {{artist}}",
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
},
"appMenu": {
"quit": "$t(common.quit)",
"settings": "$t(common.setting_other)",
"goBack": "torna enrere",
"goForward": "avança",
"collapseSidebar": "replega la barra lateral",
"expandSidebar": "expandeix la barra lateral",
"manageServers": "gestionar servidors",
"selectServer": "seleccionar servidor",
"version": "versió {{version}}",
"openBrowserDevtools": "obre les eines de desenvolupament del navegador",
"privateModeOff": "desactiva el mode privat",
"privateModeOn": "activa el mode privat"
},
"contextMenu": {
"addFavorite": "$t(action.addToFavorites)",
"addLast": "$t(player.addLast)",
"addNext": "$t(player.addNext)",
"addToFavorites": "$t(action.addToFavorites)",
"addToPlaylist": "$t(action.addToPlaylist)",
"createPlaylist": "$t(action.createPlaylist)",
"deletePlaylist": "$t(action.deletePlaylist)",
"deselectAll": "$t(action.deselectAll)",
"moveToNext": "$t(action.moveToNext)",
"moveToBottom": "$t(action.moveToBottom)",
"moveToTop": "$t(action.moveToTop)",
"play": "$t(player.play)",
"playSimilarSongs": "$t(player.playSimilarSongs)",
"removeFromFavorites": "$t(action.removeFromFavorites)",
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
"removeFromQueue": "$t(action.removeFromQueue)",
"setRating": "$t(action.setRating)",
"playShuffled": "$t(player.shuffle)",
"download": "descarregar",
"showDetails": "informació",
"numberSelected": "{{count}} seleccionat",
"shareItem": "comparteix l'element",
"goToAlbumArtist": "Ves a $t(entity.albumArtist_one)",
"goToAlbum": "ves a $t(entity.album_one)"
},
"genreList": {
"title": "$t(entity.genre_other)",
"showAlbums": "mostra $t(entity.album_other) $t(entity.genre_one)",
"showTracks": "mostra $t(entity.track_other) $t(entity.genre_one)"
},
"home": {
"title": "$t(common.home)",
"explore": "explora la teva biblioteca",
"newlyAdded": "afegits recentment",
"mostPlayed": "els més reproduïts",
"recentlyPlayed": "reproduït recentment"
},
"playlistList": {
"title": "$t(entity.playlist_other)"
},
"trackList": {
"title": "$t(entity.track_other)",
"artistTracks": "pistes de {{artist}}",
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
},
"manageServers": {
"username": "nom d'usuari",
"title": "gestionar servidors",
"serverDetails": "detalls del servidor",
"editServerDetailsTooltip": "editar els detalls del servidor",
"removeServer": "eliminar el servidor",
"url": "URL"
},
"fullscreenPlayer": {
"config": {
"opacity": "opacitat",
"synchronized": "sincronitzat",
"unsynchronized": "no sincronitzat",
"useImageAspectRatio": "utilitza la relació d'aspecte de la imatge",
"dynamicBackground": "fons dinàmic",
"dynamicIsImage": "activar la imatge de fons",
"followCurrentLyric": "seguir la lletra actual",
"lyricAlignment": "alineació de la lletra",
"lyricSize": "tamany de la lletra",
"dynamicImageBlur": "mida del desenfocament de la imatge",
"lyricOffset": "demora de la lletra (ms)",
"showLyricMatch": "mosta coincidències de lletres",
"showLyricProvider": "mostra el proveïdor de la lletra",
"lyricGap": "espera entre lletres"
},
"lyrics": "lletres",
"visualizer": "visualitzador",
"noLyrics": "no s'ha trobat cap lletra",
"related": "relacionat",
"upNext": "a continuació"
},
"setting": {
"advanced": "avançat",
"generalTab": "general",
"hotkeysTab": "tecles d'accés ràpid",
"playbackTab": "reproducció",
"windowTab": "finestra"
},
"globalSearch": {
"commands": {
"goToPage": "anar a la pàgina",
"searchFor": "cerca {{query}}",
"serverCommands": "ordres del servidor"
},
"title": "ordres"
},
"itemDetail": {
"copyPath": "copia ruta al porta-retalls",
"copiedPath": "ruta copiada correctament",
"openFile": "mostra la pista al gestor d'arxius"
},
"playlist": {
"reorder": "el reordenament només s'activa quan s'ordena per id"
}
},
"common": {
"home": "inici",
"year": "any",
"add": "afegir",
"ascending": "ascendent",
"biography": "biografia",
"bitrate": "taxa de bits",
"bpm": "bpm",
"cancel": "cancel·lar",
"center": "centrar",
"close": "tancar",
"codec": "còdec",
"configure": "configurar",
"confirm": "confirmar",
"create": "crear",
"decrease": "disminuir",
"delete": "eliminar",
"descending": "descendent",
"description": "descripció",
"disable": "desactivar",
"disc": "disc",
"dismiss": "descartar",
"duration": "duració",
"edit": "editar",
"enable": "activar",
"expand": "expandir",
"filters": "filtres",
"increase": "incrementar",
"left": "esquerra",
"maximize": "maximitzar",
"menu": "menú",
"minimize": "minimitzar",
"modified": "modificació",
"name": "nom",
"no": "no",
"none": "cap",
"note": "nota",
"ok": "bé",
"preview": "vista prèvia",
"quit": "sortir",
"random": "aleatori",
"rating": "valoració",
"reload": "torna a carregar",
"reset": "restablir",
"right": "dreta",
"save": "desar",
"search": "cercar",
"share": "compartir",
"size": "mida",
"sortOrder": "ordenar",
"tags": "etiquetes",
"title": "títol",
"translation": "traducció",
"unknown": "desconegut",
"version": "versió",
"yes": "sí",
"additionalParticipants": "participants addicionals",
"channel_one": "canal",
"channel_many": "canals",
"channel_other": "canals",
"filter_one": "filtre",
"filter_many": "filtres",
"filter_other": "filtres",
"saveAs": "desar com",
"action_one": "acció",
"action_many": "accions",
"action_other": "accions",
"newVersion": "s'ha instal·lat una nova versió ({{version}})",
"viewReleaseNotes": "veure les notes de la versió",
"currentSong": "$t(entity.track_one) actual",
"limit": "límit",
"previousSong": "$t(entity.track_one) anterior",
"trackNumber": "pista",
"albumGain": "guany de l'àlbum",
"albumPeak": "pic de l'àlbum",
"areYouSure": "estàs segur?",
"backward": "enrere",
"clear": "neteja",
"collapse": "col·lapsa",
"comingSoon": "aviat disponible…",
"favorite": "preferit",
"forceRestartRequired": "reinicia per aplicar els canvis… tanca la notificació per reiniciar",
"owner": "propietari",
"refresh": "actualitzar",
"resetToDefault": "restablir els valors predeterminats",
"saveAndReplace": "desar i substituir",
"bitDepth": "profunditat de bits",
"forward": "endavant",
"manage": "gestiona",
"mbid": "ID de MusicBrainz",
"noResultsFromQuery": "la petició no ha produït resultats",
"path": "ruta",
"playerMustBePaused": "cal pausar el reproductor",
"restartRequired": "cal reiniciar",
"sampleRate": "freqüència de mostreig",
"setting": "configuració",
"trackGain": "guany de pista",
"trackPeak": "pic de pista",
"gap": "espera"
},
"entity": {
"album_one": "àlbum",
"album_many": "àlbums",
"album_other": "àlbums",
"albumWithCount_one": "{{count}} àlbum",
"albumWithCount_many": "{{count}} àlbums",
"albumWithCount_other": "{{count}} àlbums",
"albumArtist_one": "artista de l'àlbum",
"albumArtist_many": "artistes de l'àlbum",
"albumArtist_other": "artistes de l'àlbum",
"albumArtistCount_one": "{{count}} artista de l'àlbum",
"albumArtistCount_many": "{{count}} artistes de l'àlbum",
"albumArtistCount_other": "{{count}} artistes de l'àlbum",
"artist_one": "artista",
"artist_many": "artistes",
"artist_other": "artistes",
"artistWithCount_one": "{{count}} artista",
"artistWithCount_many": "{{count}} artistes",
"artistWithCount_other": "{{count}} artistes",
"playlist_one": "llista de reproducció",
"playlist_many": "llistes de reproducció",
"playlist_other": "llistes de reproducció",
"playlistWithCount_one": "{{count}} llista de reproducció",
"playlistWithCount_many": "{{count}} llistes de reproducció",
"playlistWithCount_other": "{{count}} llistes de reproducció",
"smartPlaylist": "$t(entity.playlist_one) intel·ligent",
"play_one": "{{count}} reproducció",
"play_many": "{{count}} reproduccions",
"play_other": "{{count}} reproduccions",
"folderWithCount_one": "{{count}} carpeta",
"folderWithCount_many": "{{count}} carpetes",
"folderWithCount_other": "{{count}} carpetes",
"genreWithCount_one": "{{count}} gènere",
"genreWithCount_many": "{{count}} gèneres",
"genreWithCount_other": "{{count}} gèneres",
"track_one": "pista",
"track_many": "pistes",
"track_other": "pistes",
"trackWithCount_one": "{{count}} pista",
"trackWithCount_many": "{{count}} pistes",
"trackWithCount_other": "{{count}} pistes",
"folder_one": "carpeta",
"folder_many": "carpetes",
"folder_other": "carpetes",
"genre_one": "gènere",
"genre_many": "gèneres",
"genre_other": "gèneres",
"song_one": "cançó",
"song_many": "cançons",
"song_other": "cançons",
"favorite_one": "preferit",
"favorite_many": "preferits",
"favorite_other": "preferits"
},
"form": {
"addToPlaylist": {
"input_playlists": "$t(entity.playlist_other)",
"title": "afegir a una $t(entity.playlist_one)",
"input_skipDuplicates": "salta't els duplicats",
"success": "s'ha afegit $t(entity.trackWithCount, {\"count\": {{message}} }) a $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })"
},
"createPlaylist": {
"input_description": "$t(common.description)",
"input_name": "$t(common.name)",
"input_owner": "$t(common.owner)",
"success": "$t(entity.playlist_one) s'ha creat amb èxit",
"title": "crear una $t(entity.playlist_one)",
"input_public": "públic"
},
"deletePlaylist": {
"success": "$t(entity.playlist_one) s'ha eliminat amb èxit",
"title": "elimina la $t(entity.playlist_one)",
"input_confirm": "escriviu el nom de la $t(entity.playlist_one) per confirmar"
},
"editPlaylist": {
"success": "$t(entity.playlist_one) s'ha actualitzat amb èxit",
"title": "editar la $t(entity.playlist_one)",
"publicJellyfinNote": "Per algun motiu, Jellyfin no exposa si una llista de reproducció és pública o no. Si voleu que es mantingui pública, seleccioneu la següent entrada"
},
"lyricSearch": {
"input_artist": "$t(entity.artist_one)",
"input_name": "$t(common.name)",
"title": "cerca de lletres"
},
"addServer": {
"input_password": "contrasenya",
"input_username": "nom d'usuari",
"error_savePassword": "hi ha hagut un error en intentar desar la contrasenya",
"ignoreCors": "ignora el cors ($t(common.restartRequired))",
"ignoreSsl": "ignora l'ssl ($t(common.restartRequired))",
"input_legacyAuthentication": "activa l'autenticació antiga",
"input_name": "nom del servidor",
"input_savePassword": "desa la contrasenya",
"input_url": "url",
"success": "servidor afegit correctament",
"title": "afegeix un servidor"
},
"shareItem": {
"description": "descripció",
"allowDownloading": "permetre descàrrega",
"setExpiration": "estableix expiració",
"success": "s'ha copiat l'enllaç de compartició al porta-retalls (o feu clic aquí per obrir-lo)",
"expireInvalid": "la data d'expiració ha de ser al futur",
"createFailed": "no s'ha pogut crear el recurs compartit (està habilitat, l'ús compartit?)"
},
"updateServer": {
"success": "s'ha actualitzat el servidor amb èxit",
"title": "actualitzar el servidor"
},
"queryEditor": {
"title": "editor de consultes",
"input_optionMatchAll": "coincidències totals",
"input_optionMatchAny": "coincidències parcials"
},
"privateMode": {
"enabled": "mode privat actiu; l'estat de reproducció ara està ocult d'integracions externes",
"disabled": "mode privat inactiu; l'estat de reproducció ara és visible per les integracions externes",
"title": "mode privat"
}
},
"action": {
"addToFavorites": "afegir als $t(entity.favorite_other)",
"addToPlaylist": "afegir a $t(entity.playlist_one)",
"createPlaylist": "crear $t(entity.playlist_one)",
"deletePlaylist": "elimina la $t(entity.playlist_one)",
"editPlaylist": "edita la $t(entity.playlist_one)",
"refresh": "$t(common.refresh)",
"removeFromFavorites": "elimina dels $t(entity.favorite_other)",
"removeFromPlaylist": "elimina de $t(entity.playlist_one)",
"clearQueue": "buidar la cua",
"removeFromQueue": "treure de la cua",
"goToPage": "anar a la pàgina",
"openIn": {
"lastfm": "Obrir a Last.fm",
"musicbrainz": "Obrir a MusicBrainz"
},
"deselectAll": "deselecciona-ho tot",
"viewPlaylists": "veure$t(entity.playlist_other)",
"moveToNext": "passar al següent",
"moveToBottom": "anar al final",
"moveToTop": "anar al principi",
"setRating": "Qualifica",
"toggleSmartPlaylistEditor": "canvia l'editor $t(entity.smartPlaylist)"
},
"setting": {
"language_description": "estableix l'idioma de l'aplicació ($t(common.restartRequired))",
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
"playButtonBehavior_optionPlay": "$t(player.play)",
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
"replayGainMode_optionAlbum": "$t(entity.album_one)",
"replayGainMode_optionNone": "$t(common.none)",
"replayGainMode_optionTrack": "$t(entity.track_one)",
"font": "tipus de lletra",
"fontType": "selecció de tipus de lletra",
"fontType_optionBuiltIn": "tipus de lletra integrats",
"fontType_optionCustom": "tipus de lletra personalitzats",
"fontType_optionSystem": "tipus de lletra del sistema",
"disableAutomaticUpdates": "desactivar les actualitzacions automàtiques",
"disableLibraryUpdateOnStartup": "desactiva la comprovació de noves versions a l'inici",
"homeConfiguration": "configuració de la pàgina d'inici",
"sidebarConfiguration": "configuració de la barra lateral",
"contextMenu": "configuració del menú contextual (clic amb el botó dret)",
"hotkey_playbackNext": "pista següent",
"hotkey_playbackPrevious": "pista anterior",
"sidePlayQueueStyle_optionAttached": "unida",
"sidePlayQueueStyle_optionDetached": "separada",
"audioDevice": "dispositiu d'àudio",
"audioDevice_description": "seleccioneu el dispositiu d'àudio que voleu utilitzar per a la reproducció (només pel reproductor web)",
"audioPlayer": "reproductor d'àudio",
"audioPlayer_description": "seleccioneu el reproductor d'àudio que voleu utilitzar per a la reproducció",
"sidebarConfiguration_description": "selecciona els elements i l'ordre en què apareixen a la barra lateral",
"sidebarPlaylistList_description": "mostra o amaga les llistes de reproducció a la barra lateral",
"accentColor": "color de ressaltat",
"accentColor_description": "estableix el color de ressaltat de l'aplicació",
"useSystemTheme_description": "seguir la preferència de d'aspecte clar o fosc definida pel sistema",
"themeDark": "aspecte fosc",
"theme": "aspecte",
"themeLight": "aspecte clar",
"useSystemTheme": "utilitzar l'aspecte del sistema",
"discordUpdateInterval_description": "el temps en segons entre cada actualització (mínim 15 segons)",
"enableRemote": "activar el servidor de control remot",
"enableRemote_description": "el servidor de control remot permet que altres dispositius controlin l'aplicació",
"notify": "activa les notificacions de cançons",
"transcode": "activa la transcodificació",
"transcode_description": "permet la transcodificació a diferents formats",
"albumBackground": "imatge de fons de l'àlbum",
"albumBackground_description": "afegeix una imatge de fons per les pàgines d'àlbum amb caràtula",
"albumBackgroundBlur": "mida del desenfocament de la imatge de fons de l'àlbum",
"albumBackgroundBlur_description": "ajusa la quantitat de desenfocament que s'aplica a la imatge de fons de l'àlbum",
"applicationHotkeys": "tecles de drecera de l'aplicació",
"applicationHotkeys_description": "configura les tecles de drecera de l'aplicació. marca la casella per configurar-les com a derecres globals (només per ordinador)",
"artistConfiguration": "configuració de la pàgina de l'artista de l'àlbum",
"artistConfiguration_description": "configura quins elements es mostren i el seu ordre de la pàgina de l'artista de l'àlbum",
"audioExclusiveMode": "mode d'àudio exclusiu",
"audioExclusiveMode_description": "activa el mode d'àudio exclusiu. En aquest mode, el sistema normalment estarà bloquejat i només mpv podrà emetre àudio",
"buttonSize": "mida dels botons de la barra de reproducció",
"buttonSize_description": "la mida dels botons de la barra de reproducció",
"clearCache": "neteja la memòria del navegador",
"clearCache_description": "una \"neteja profunda\" del feishin. a més de netejar la memòria del feishin, buida la memòria del navegador (com les imatges desades i altres recursos). la configuració i les credencials del servidor es mantenen",
"clearQueryCache": "buida la memòria de feishin",
"clearQueryCache_description": "una neteja superficial de feishin. això refrescarà les llistes de reproducció, les metadades de les pistes i reestablirà les lletres desades. la configuració, les credencials del servidor i les imatges desades es mantindran",
"clearCacheSuccess": "memòria netejada correctament",
"contextMenu_description": "us permet amagar els elements que es mostren al menú quan fas clic dret sobre un element. els elements no seleccionats estaran amagats",
"crossfadeDuration": "duracció de la fosa encadenada",
"crossfadeDuration_description": "estableix la duració de l'efecte de fosa encadenada",
"crossfadeStyle": "estil de fosa encadenada",
"crossfadeStyle_description": "selecciona l'estil de fosa encadenada que s'utilitzarà pel reproductor d'àudio",
"customCssEnable": "activa el css personalitzat",
"customCssEnable_description": "permet escriure CSS personalitzat.",
"customCssNotice": "Atenció: tot i que hi ha un filtre (no es permet ni url() ni content:), l'ús de CSS personalitzat pot presentar riscs si canvieu la interfície.",
"customCss": "css personalitzat",
"customCss_description": "contingut del css personalitzat. Nota: la propietat \"content\" i els urls remots no es permeten. A sota hi teniu una previsualització. Els camps addicionals que no establiu hi apareixin pel filtre.",
"customFontPath": "ruta de font personalitzada",
"customFontPath_description": "estableix la ruta a una font personalitzada per utilitzar-la a l'aplicació",
"discordApplicationId": "id d'aplicació de {{discord}}",
"discordApplicationId_description": "l'id d'aplicació per l'estat d'activitat de {{discord}} (per defecte, {{defaultId}})",
"discordPausedStatus": "mosta l'estat d'activitat quan està en pausa",
"discordPausedStatus_description": "si està activat, l'estat es mostrarà quan el reproductor estigui pausat",
"discordIdleStatus": "mosta l'estat d'activitat en inactivitat",
"discordIdleStatus_description": "si està activat, s'actualitzarà l'estat mentre el reproductor estigui inactiu",
"discordListening": "mosta l'estat com escoltant",
"discordListening_description": "mosta l'estat com escoltant en comptes de jugant",
"discordRichPresence": "estat d'activitat de {{discord}}",
"discordRichPresence_description": "activa l'estat de reproducció a l'activitat de {{discord}}. Les tecles d'imatge són: {{icon}}, {{playing}} i {{paused}}",
"discordServeImage": "serveix imatges de {{discord}} des del servidor",
"discordServeImage_description": "comparteix la caràtula per l'estat d'activitat de {{discord}} des del servidor; només disponible per jellyfin i navidrome",
"discordUpdateInterval": "interval d'actualització de l'estat d'activitat de {{discord}}",
"doubleClickBehavior": "posa en cua totes les pistes cercades en fer doble clic",
"doubleClickBehavior_description": "si està actiu, totes les pistes coincidents en una cerca de pistes es posaran a la cua. altrament, només la que seleccioneu s'afegirà a la cua",
"externalLinks": "mostra enllaços externs",
"externalLinks_description": "permet mostrar enllaços externs (Last.fm, MusicBrainz) a les pàgines d'artista/àlbum",
"exitToTray": "surt a la safata",
"exitToTray_description": "en sortir de l'aplicació, minimitza-la a la safa del sistema",
"floatingQueueArea": "mostra la zona flotant de la cua",
"floatingQueueArea_description": "mostra una icona flotant al costat dret de la pantalla per veure la cua de reproducció",
"followLyric": "segueix la lletra actual",
"followLyric_description": "desplaça la lletra a la posició de reproducció actual",
"preferLocalLyrics": "prefereix les lletres locals",
"preferLocalLyrics_description": "prefereix les lletres locals per sobre de les remotes, si estan disponibles",
"font_description": "estableix la font utilitzada a l'aplicació",
"fontType_description": "\"font incorporada\" selecciona una de les fonts proporcionades per Feishin. \"font del sistema\" us permet seleccionar qualsevol font proporcionada pel sistema operatiu. \"personalitzada\" us permet proporcionar la vostra pròpia font",
"gaplessAudio": "àudio sense pauses",
"gaplessAudio_description": "estableix la configuració d'àudio sense pauses per mpv",
"gaplessAudio_optionWeak": "feble (recomanat)",
"genreBehavior": "comportament predeterminat per les pàgines de gènere",
"genreBehavior_description": "determina si clicar sobre un gènere obre per defecte la llista de pistes o d'àlbums",
"globalMediaHotkeys": "tecles de drecera globals",
"globalMediaHotkeys_description": "activa o desactiva l'ús de les tecles multimèdia del sistema per controlar la reproducció",
"homeConfiguration_description": "configura quins objectes es mostren, i en quin ordre, a la pàgina d'inici",
"homeFeature": "carrusel de destacats d'inici",
"homeFeature_description": "controla si es mostra el gran carrusel d'elements destacats a la pàgina d'inici",
"hotkey_browserBack": "anar enrere",
"hotkey_browserForward": "anar endavant",
"hotkey_favoriteCurrentSong": "marca $t(common.currentSong) com a preferida",
"hotkey_favoritePreviousSong": "marca $t(common.previousSong) com a preferida",
"hotkey_globalSearch": "cerca global",
"hotkey_localSearch": "cerca a la pàgina",
"hotkey_playbackPause": "pausa",
"hotkey_playbackPlay": "reprodueix",
"hotkey_playbackPlayPause": "reprodueix / pausa",
"hotkey_playbackStop": "atura",
"hotkey_rate0": "neteja la qualificació",
"hotkey_rate1": "qualifica amb 1 estrella",
"hotkey_rate2": "qualifica amb 2 estrelles",
"hotkey_rate3": "qualifica amb 3 estrelles",
"hotkey_rate4": "qualifica amb 4 estrelles",
"hotkey_rate5": "qualifica amb 5 estrelles",
"hotkey_skipBackward": "salta enrere",
"hotkey_skipForward": "salta endavant",
"hotkey_toggleCurrentSongFavorite": "canvia si $t(common.currentSong) és preferida",
"hotkey_toggleFullScreenPlayer": "activa o desactiva el reproductor a pantalla completa",
"hotkey_togglePreviousSongFavorite": "canvia si $t(common.previousSong) és preferida",
"hotkey_toggleQueue": "activa o desactiva la cua",
"hotkey_toggleRepeat": "activa o desactiva la repetició",
"hotkey_toggleShuffle": "activa o desactiva la reproducció a l'atzar",
"hotkey_unfavoriteCurrentSong": "elimina $t(common.currentSong) dels preferits",
"hotkey_unfavoritePreviousSong": "elimina $t(common.previousSong) dels preferits",
"hotkey_volumeDown": "redueix el volum",
"hotkey_volumeMute": "silencia el volum",
"hotkey_volumeUp": "augmenta el volum",
"hotkey_zoomIn": "amplia",
"hotkey_zoomOut": "redueix",
"imageAspectRatio": "utilitza la relació d'aspecte predeterminada de la caràtula",
"imageAspectRatio_description": "si està activat, la caràtula es mostrarà amb la relació d'aspecte predeterminada. per caràtules que no siguin 1:1, l'espai restant estarà buit",
"language": "llengua",
"lastfm": "mostra els enllaços last.fm",
"lastfm_description": "mosta enllaços a last.fm a les pàgines d'artista/àlbum",
"lastfmApiKey": "clau d'API per {{lastfm}}",
"lastfmApiKey_description": "la clau d'API per {{lastfm}}. necessària per la caràtula",
"lyricFetch": "extreu la lletra d'internet",
"lyricFetch_description": "extreu la lletra de diverses fonts d'internet",
"lyricFetchProvider": "proveïdors de lletres",
"lyricFetchProvider_description": "selecciona els proveïdors de lletres. l'ordre en què apareixen és l'ordre en què es consultaran",
"lyricOffset": "desfasament de la lletra (ms)",
"lyricOffset_description": "desplaça la lletra els mil·lisegons especificats",
"notify_description": "mostra notificacions en canvia la cançó actual",
"minimizeToTray": "minimitza a la safata",
"minimizeToTray_description": "minimitza l'aplicació a la safata del sistema",
"minimumScrobblePercentage": "duració mínima de l'scrobble (percentatge)",
"minimumScrobblePercentage_description": "el percentatge mínim de la cançó que cal reproduir abans d'activar l'scrobble",
"minimumScrobbleSeconds": "scrobble mínim (segons)",
"minimumScrobbleSeconds_description": "la duració mínima en segons durant la qual cal reproduir la cançó abans d'activar l'scrobble",
"mpvExecutablePath": "ruta de l'executable de l'mpv",
"mpvExecutablePath_description": "estableix la ruta de l'executable de l'mpv. si el deixeu buit, s'utilitzarà la ruta predeterminada",
"mpvExtraParameters": "paràmetres de l'mpv",
"mpvExtraParameters_help": "un per línia",
"musicbrainz": "mostra els enllaços de musicbrainz",
"musicbrainz_description": "mostra enllaços a les pàgines d'artista/àlbum a musicbrainz si hi ha mbid",
"neteaseTranslation": "activeu les traduccions NetEase",
"neteaseTranslation_description": "Si ho activeu, cerca i mostra lletres traduïdes de NetEase si estan disponibles.",
"passwordStore": "contrasenyes/emmagatzematge secret",
"passwordStore_description": "quina contrasenya/emmagatzematge secret s'utilitza. canvieu-ho si teniu problemes per desar contrasenyes.",
"playbackStyle": "estil de reproducció",
"playbackStyle_description": "selecciona l'estil de reproducció a utilitzar pel reproductor d'àudio",
"playbackStyle_optionCrossFade": "fosa encadenada",
"playbackStyle_optionNormal": "normal",
"playButtonBehavior": "comportament del botó de reproducció",
"playButtonBehavior_description": "estableix el comportament predeterminat del botó de reproducció quan s'afegeixen cançons a la cua",
"playerAlbumArtResolution": "resolució de la caràtula de l'àlbum al reproductor",
"playerAlbumArtResolution_description": "la resolució de la previsualització gran de la caràtula al reproductor. si és més alta, serà més nítida, però es carregarà més lent. el valor predeterminat 0 vol dir automàtic",
"playerbarOpenDrawer": "activa el reproductor en pantalla completa",
"playerbarOpenDrawer_description": "permet fer clic a la barra de reproducció per obrir el reproductor de pantalla completa",
"remotePassword": "contrasenya del servidor de control remot",
"remotePassword_description": "estableix la contrasenya pel servidor de control remot. Aquestes credencials es transfereixen de forma no segura per defecte, de manera que hauríeu d'utilitzar una contrasenya única no relacionada amb res més",
"remotePort": "port del servidor de control remot",
"remotePort_description": "estableix el port pel servidor de control remot",
"remoteUsername": "nom d'usuari pel servidor de control remot",
"remoteUsername_description": "estableix el nom d'usuari pel servidor de control remot. si tant el nom d'usuari com la contrasenya són buits, l'autenticació estarà desactivada",
"replayGainPreamp_description": "ajusta el guany del preamplificador aplicat als valors de {{ReplayGain}}",
"sampleRate": "ràtio de mostratge",
"sampleRate_description": "selecciona el ràtio de mostratge de sortida que s'ha d'utilitzar si la freqüència de mostratge seleccionada és diferent a la del mitjà actual. un valor inferior a 8000 utilitzarà la freqüència predeterminada",
"savePlayQueue": "desa la cua de reproducció",
"savePlayQueue_description": "desa la cua de reproducció quan l'aplicació es tanca i la restaura quan s'obre",
"scrobble": "scrobble",
"scrobble_description": "fa scrobble de les reproduccions al vostre servidor multimèdia",
"showSkipButton": "mostra els botons de saltar",
"showSkipButton_description": "mostra o amaga els botons de saltar a la barra de reproducció",
"showSkipButtons": "mostra els botons de saltar",
"showSkipButtons_description": "mostra o amaga els botons de saltar a la barra de reproducció",
"sidebarCollapsedNavigation": "navegació de la barra lateral (plegada)",
"sidebarCollapsedNavigation_description": "mostra o amaga la navegació a la barra lateral plegada",
"sidebarPlaylistList": "llista de reproducció lateral",
"sidePlayQueueStyle": "estil de la cua de reproducció lateral",
"sidePlayQueueStyle_description": "estableix l'estil de la cua de reproducció lateral",
"skipDuration": "interval de salt",
"skipDuration_description": "estableix l'interval de temps que se saltarà en fer servir els botons de saltar a la barra de reproducció",
"skipPlaylistPage": "salta la pàgina de la llista de reproducció",
"skipPlaylistPage_description": "en navegar a una llista de reproducció, obre la pàgina de cançons de la llista de reproducció en comptes de la pàgina predeterminada",
"startMinimized": "obre minimitzada",
"startMinimized_description": "obre l'aplicació a la safata del sistema",
"theme_description": "estableix el tema visual per l'aplicació",
"themeDark_description": "estableix el tema fosc per l'aplicació",
"themeLight_description": "estableix el tema clar per l'aplicació",
"transcodeNote": "tindrà efecte després d'1 (web) o 2 (mpv) cançons",
"transcodeBitrate": "taxa de bits per transcodificar",
"transcodeBitrate_description": "selecciona la taxa de bits per transcodificar. 0 significa deixar que el servidor triï",
"transcodeFormat": "format per transcodificar",
"transcodeFormat_description": "selecciona el format per transcodificar. deixeu-ho buit per deixar que el servidor decideixi",
"translationApiProvider": "proveïdor d'api de traducció",
"translationApiProvider_description": "proveïdor de l'api de traducció",
"translationApiKey": "clau de l'api de traducció",
"translationTargetLanguage": "llengua meta de traducció",
"translationTargetLanguage_description": "llengua meta per la traducció",
"trayEnabled": "mostra a la safata",
"trayEnabled_description": "mostra/oculta la icona/menú de la safata. si està desactivat, també desactiva la funcionalitat de minimitzar/sortir a la safata",
"volumeWheelStep": "increment de volum de la roda",
"volumeWheelStep_description": "la quantitat de volum a canviar quan utilitzeu la roda del ratolí sobre el controlador de volum",
"volumeWidth": "amplada del controlador de volum",
"volumeWidth_description": "l'amplada del controlador de volum",
"webAudio": "utilitza l'àudio web",
"webAudio_description": "utilitza l'àudio web. això habilita funcions avançades com Replaygain. desactiveu-ho si teniu una experiència diferent",
"replayGainClipping": "saturació de {{ReplayGain}}",
"replayGainClipping_description": "rebaixa automàticament el guany per evitar la saturació causada pel {{ReplayGain}}",
"replayGainFallback": "alternativa per {{ReplayGain}}",
"replayGainFallback_description": "guany en db que s'ha d'aplicar si el fitxer no té etiquetes de {{ReplayGain}}",
"replayGainMode": "mode de {{ReplayGain}}",
"replayGainMode_description": "ajuda el volum del guany segons els vlors de {{ReplayGain}} desats a les metadades del fitxer",
"replayGainPreamp": "preamplificador de {{ReplayGain}} (dB)",
"translationApiKey_description": "clau api per la traducció (només per serveis globals)",
"preservePitch": "mantén el to",
"preservePitch_description": "manté el to quan s'altera la velocitat de reproducció",
"windowBarStyle": "estil de la barra de la finestra",
"windowBarStyle_description": "selecciona l'estil de la barra de la finestra",
"zoom": "percentatge de zoom",
"zoom_description": "estableix el percentatge de zoom de l'aplicació",
"discordDisplayType": "tipus de pantalla d'activitat de {{discord}}",
"discordDisplayType_description": "canvia què escolteu al vostre estat",
"discordDisplayType_songname": "nom de la cançó",
"discordDisplayType_artistname": "nom de l'artista",
"hotkey_navigateHome": "ves a l'inici",
"preventSleepOnPlayback": "evitar entrar en repòs durant la reproducció",
"preventSleepOnPlayback_description": "evita que la pantalla s'adormi mentre la música es reprodueix"
},
"table": {
"column": {
"albumCount": "$t(entity.album_other)",
"artist": "$t(entity.artist_one)",
"channels": "$t(common.channel_other)",
"codec": "$t(common.codec)",
"genre": "$t(entity.genre_one)",
"size": "$t(common.size)",
"songCount": "$t(entity.track_other)",
"releaseYear": "any",
"playCount": "reproduccions",
"releaseDate": "data de llançament",
"album": "àlbum",
"albumArtist": "artista de l'àlbum",
"biography": "biografia",
"bitrate": "taxa de bits",
"bpm": "bpm",
"dateAdded": "data d'addició",
"discNumber": "disc",
"trackNumber": "pista",
"comment": "comentari",
"favorite": "preferit",
"lastPlayed": "última reproducció",
"path": "ruta",
"rating": "qualificació",
"title": "títol"
},
"config": {
"general": {
"gap": "$t(common.gap)",
"size": "$t(common.size)",
"autoFitColumns": "ajusta les columnes automàticament",
"followCurrentSong": "segueix la cançó actual",
"displayType": "tipus de visualització",
"itemGap": "espai entre elements (px)",
"itemSize": "mida dels elements (px)",
"tableColumns": "columnes de la taula"
},
"label": {
"actions": "$t(common.action_other)",
"album": "$t(entity.album_one)",
"albumArtist": "$t(entity.albumArtist_one)",
"artist": "$t(entity.artist_one)",
"biography": "$t(common.biography)",
"bitrate": "$t(common.bitrate)",
"bpm": "$t(common.bpm)",
"channels": "$t(common.channel_other)",
"codec": "$t(common.codec)",
"duration": "$t(common.duration)",
"favorite": "$t(common.favorite)",
"genre": "$t(entity.genre_one)",
"note": "$t(common.note)",
"owner": "$t(common.owner)",
"path": "$t(common.path)",
"rating": "$t(common.rating)",
"size": "$t(common.size)",
"songCount": "$t(entity.track_other)",
"title": "$t(common.title)",
"year": "$t(common.year)",
"playCount": "compte de reproduccions",
"releaseDate": "data de llançament",
"dateAdded": "data d'addició",
"trackNumber": "número de pista",
"discNumber": "número de disc",
"lastPlayed": "última reproducció",
"rowIndex": "índex de files",
"titleCombined": "$t(common.title) (combinat)"
},
"view": {
"table": "taula",
"card": "targeta",
"grid": "quadrícula",
"list": "llista",
"poster": "pòster"
}
}
},
"filter": {
"fromYear": "des de l'any",
"releaseYear": "any de llançament",
"toYear": "fins a l'any",
"album": "$t(entity.album_one)",
"albumArtist": "$t(entity.albumArtist_one)",
"artist": "$t(entity.artist_one)",
"biography": "biografia",
"bitrate": "taxa de bits",
"bpm": "bpm",
"channels": "$t(common.channel_other)",
"comment": "comentari",
"disc": "disc",
"duration": "durada",
"genre": "$t(entity.genre_one)",
"id": "identificador",
"name": "nom",
"note": "nota",
"owner": "$t(common.owner)",
"random": "aleatori",
"rating": "valoració",
"search": "cercar",
"title": "títol",
"playCount": "compte de reproduccions",
"releaseDate": "data de llançament",
"mostPlayed": "els més reproduïts",
"dateAdded": "data d'addició",
"trackNumber": "pista",
"communityRating": "valoració de la comunitat",
"criticRating": "valoració dels crítics",
"recentlyAdded": "afegit recentment",
"recentlyPlayed": "reproduït recentment",
"recentlyUpdated": "actualitzat recentment",
"albumCount": "nombre de $t(entity.album_other)",
"favorited": "preferits",
"isCompilation": "és una compilació",
"isFavorited": "és un preferit",
"isPublic": "és públic",
"isRated": "està qualificat",
"isRecentlyPlayed": "s'ha reproduït fa poc",
"lastPlayed": "última reproducció",
"path": "ruta",
"songCount": "nombre de cançons"
},
"player": {
"muted": "silenciat",
"repeat": "repetició d'una pista",
"skip": "saltar",
"stop": "parar",
"queue_clear": "buidar la cua",
"viewQueue": "veure la cua",
"playbackFetchInProgress": "carregant cançons…",
"playbackFetchNoResults": "no s'han trobat cançons",
"playbackSpeed": "velocitat de reproducció",
"playSimilarSongs": "reproduir cançons similars",
"repeat_off": "repetició desactivada",
"repeat_all": "repetició",
"shuffle": "reproducció aleatòria",
"shuffle_off": "reproducció aleatòria desactivada",
"addLast": "afegeix al final",
"addNext": "afegeix a continuació",
"favorite": "marcar com a preferida",
"mute": "silencia",
"next": "següent",
"play": "reprodueix",
"playbackFetchCancel": "està trigant bastant... tanqueu la notificació per cancel·lar",
"playRandom": "reproducció a l'atzar",
"previous": "anterior",
"queue_moveToBottom": "mou la selecció a l'inici",
"queue_moveToTop": "mou la selecció al final",
"queue_remove": "elimina la selecció",
"skip_back": "salta enrere",
"skip_forward": "salta endavant",
"toggleFullscreenPlayer": "activa el reproductor de pantalla completa",
"unfavorite": "elimina de preferits",
"pause": "pausa"
},
"error": {
"credentialsRequired": "credencials requerides",
"genericError": "s'ha produït un error",
"invalidServer": "servidor no vàlid",
"localFontAccessDenied": "accés denegat als tipus de lletra locals",
"networkError": "s'ha produït un error de xarxa",
"openError": "no s'ha pogut obrir el fitxer",
"remotePortError": "s'ha produït un error en intentar configurar el port del servidor remot",
"serverNotSelectedError": "no s'ha seleccionat cap servidor",
"sessionExpiredError": "la sessió ha caducat",
"systemFontError": "s'ha produït un error en intentar obtenir els tipus de lletra del sistema",
"remoteEnableError": "s'ha produït un error en intentar $t(common.enable) el servidor remot",
"remotePortWarning": "reiniciar el servidor per aplicar el nou port",
"serverRequired": "servidor requerit",
"apiRouteError": "no es pot encaminar la sol·licitud",
"audioDeviceFetchError": "hi ha hagut un error en obtenir els dispositius d'àudio",
"authenticationFailed": "autenticació fallida",
"badAlbum": "esteu veient aquesta pàgina perquè aquesta cançó no és part de cap àlbum. aquest problema pot passar si teniu una cançó al nivell superior de la vostra carpeta de música. jellyfin només agrupa pistes si són en una carpeta.",
"badValue": "l'opció \"{{value}}\"és invàlida. aquest valor ja no existeix",
"loginRateError": "massa intents d'inici de sessió, intenteu-ho de nou d'aquí uns segons",
"mpvRequired": "Cal l'MPV",
"notificationDenied": "s'han negat els permisos per enviar notificacions. aquesta opció no té cap efecte",
"playbackError": "hi ha hagut un error en intentar reproduir el mitjà",
"remoteDisableError": "hi ha hagut un error en intentar $t(common.disable) el servidor remot",
"endpointNotImplementedError": "el punt final {{endpoint}} no està implementat per {{serverType}}"
}
}
+831
View File
@@ -0,0 +1,831 @@
{
"player": {
"repeat_all": "opakovat vše",
"stop": "zastavit",
"repeat": "opakovat",
"queue_remove": "odebrat vybrané",
"playRandom": "přehrát náhodně",
"skip": "přeskočit",
"previous": "předchozí",
"toggleFullscreenPlayer": "přepnout celoobrazovkový přehrávač",
"skip_back": "přeskočit dozadu",
"favorite": "oblíbené",
"next": "další",
"shuffle": "přehrát náhodně",
"playbackFetchNoResults": "nenalezeny žádné skladby",
"playbackFetchInProgress": "načítání skladeb…",
"addNext": "přidat další",
"playbackSpeed": "rychlost přehrávání",
"playbackFetchCancel": "chvíli to trvá… zavřete oznámení pro zrušení akce",
"play": "přehrát",
"repeat_off": "opakování zakázáno",
"pause": "pozastavit",
"queue_clear": "vymazat frontu",
"muted": "ztlumeno",
"unfavorite": "odebrat z oblíbených",
"queue_moveToTop": "přesunout vybrané dolů",
"queue_moveToBottom": "přesunout vybrané nahoru",
"shuffle_off": "náhodně zakázáno",
"addLast": "přidat poslední",
"mute": "ztlumit",
"skip_forward": "přeskočit dopředu",
"playSimilarSongs": "přehrát podobné skladby",
"viewQueue": "zobrazit frontu"
},
"setting": {
"crossfadeStyle_description": "vyberte způsob prolnutí u přehrávače zvuku",
"remotePort_description": "nastavení portu pro server vzdáleného ovládání",
"hotkey_skipBackward": "přeskočení zpět",
"replayGainMode_description": "úprava zesílení hlasitosti podle hodnot {{ReplayGain}} uložených v metadatech souborů",
"volumeWheelStep_description": "počet procent, o které má být hlasitost posunuta při přejetí kolečkem myši na posuvníku hlasitosti",
"audioDevice_description": "vyberte zvukové zařízení k přehrávání (pouze webový přehrávač)",
"theme_description": "nastavení motivu použitého v aplikaci",
"hotkey_playbackPause": "pozastavení",
"replayGainFallback": "fallback {{ReplayGain}}",
"sidebarCollapsedNavigation_description": "zobrazit nebo skrýt navigaci ve sbaleném postranním panelu",
"hotkey_volumeUp": "zvýšení hlasitosti",
"skipDuration": "doba k přeskočení",
"discordIdleStatus_description": "při povolení bude upraven stav když je přehrávač nečinný",
"showSkipButtons": "zobrazit tlačítka k přeskočení",
"playButtonBehavior_optionPlay": "$t(player.play)",
"minimumScrobblePercentage": "minimální doba pro scrobblování (v procentech)",
"lyricFetch": "načtení textů z internetu",
"scrobble": "scrobblování",
"skipDuration_description": "nastavení doby k přeskočení při použití tlačítek k přeskočení na liště přehrávače",
"enableRemote_description": "povolí vzdálený ovládací server pro umožnění ostatním zařízením ovládat aplikaci",
"fontType_optionSystem": "systémové písmo",
"mpvExecutablePath_description": "nastavení cesty ke spustitelnému souboru mpv. pokud je prázdné, bude použita výchozí cesta",
"replayGainClipping_description": "Zabránění clippingu způsobenému funkcí {{ReplayGain}} automatickým snížením zesílení",
"replayGainPreamp": "před-zesílení {{ReplayGain}} (dB)",
"hotkey_favoriteCurrentSong": "oblíbit $t(common.currentSong)",
"sampleRate": "vzorkovací frekvence",
"crossfadeStyle": "způsob prolnutí",
"sidePlayQueueStyle_optionAttached": "připojené",
"sidebarConfiguration": "nastavení postranního panelu",
"sampleRate_description": "vyberte výstupní vzorkovací frekvenci k použití, když je vybraná vzorkovací frekvence jiná, než ta u aktuálního média. hodnota nižší než 8000 použije výchozí frekvenci",
"replayGainMode_optionNone": "$t(common.none)",
"replayGainClipping": "clipping {{ReplayGain}}",
"hotkey_zoomIn": "přiblížení",
"scrobble_description": "scrobblovat přehrání na váš multimediální server",
"hotkey_browserForward": "vpřed v prohlížeči",
"audioExclusiveMode_description": "zapnout režim výhradního výstupu. V tomto režimu bude obvykle v systému schopný přehrávat zvuk pouze přehrávač mpv",
"discordUpdateInterval": "interval aktualizací {{discord}} rich presence",
"themeLight": "motiv (světlý)",
"fontType_optionBuiltIn": "vestavěné písmo",
"hotkey_playbackPlayPause": "přehrání / pozastavení",
"hotkey_rate1": "hodnocení 1 hvězdou",
"hotkey_skipForward": "přeskočení vpřed",
"disableLibraryUpdateOnStartup": "vypnout kontrolu nových verzí při spuštění",
"discordApplicationId_description": "id aplikace pro {{discord}} rich presence (výchozí je {{defaultId}})",
"sidePlayQueueStyle": "styl postranní fronty přehrávání",
"gaplessAudio": "zvuk bez mezer",
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
"zoom": "procento přiblížení",
"minimizeToTray_description": "minimalizovat aplikaci do systémové lišty",
"hotkey_playbackPlay": "přehrání",
"hotkey_togglePreviousSongFavorite": "přepnutí oblíbení u $t(common.previousSong)",
"hotkey_volumeDown": "snížení hlasitosti",
"hotkey_unfavoritePreviousSong": "zrušení oblíbení u $t(common.previousSong)",
"audioPlayer_description": "vyberte zvukový přehrávač pro použití k přehrávání",
"globalMediaHotkeys": "globální klávesové zkratky médií",
"hotkey_globalSearch": "globální vyhledávání",
"gaplessAudio_description": "nastavení přehrávače mpv pro přehrávání bez mezer",
"remoteUsername_description": "nastavení uživatelského jména pro server vzdáleného ovládání. pokud je jméno i heslo prázdné, bude autentifikace zakázána",
"disableAutomaticUpdates": "vypnout automatické aktualizace",
"exitToTray_description": "ukončit aplikaci do systémové lišty",
"followLyric_description": "přesouvat texty s aktuální pozicí přehrávání",
"hotkey_favoritePreviousSong": "oblíbit $t(common.previousSong)",
"replayGainMode_optionAlbum": "$t(entity.album_one)",
"lyricOffset": "odsazení textů (ms)",
"discordUpdateInterval_description": "čas v sekundách mezi každou aktualizací (minimálně 15 sekund)",
"fontType_optionCustom": "vlastní písmo",
"themeDark_description": "nastavit použití tmavého motivu v aplikaci",
"audioExclusiveMode": "režim výhradního výstupu",
"remotePassword": "heslo serveru pro vzdálené ovládání",
"lyricFetchProvider": "poskytovatelé textů",
"language_description": "nastavení jazyka aplikace ($t(common.restartRequired))",
"playbackStyle_optionCrossFade": "křížové prolnutí",
"hotkey_rate3": "hodnocení 3 hvězdami",
"font": "písmo",
"mpvExtraParameters": "parametry mpv",
"replayGainMode_optionTrack": "$t(entity.track_one)",
"themeLight_description": "nastavit použití světlého motivu v aplikaci",
"hotkey_toggleFullScreenPlayer": "přepnutí přehrávače na celou obrazovku",
"hotkey_localSearch": "vyhledávání na stránce",
"hotkey_toggleQueue": "přepnutí fronty",
"zoom_description": "nastavte procento přiblížení aplikace",
"remotePassword_description": "nastavení hesla pro server vzdáleného ovládání. Tyto údaje jsou ve výchozím nastavení přenášeny nezabezpečeným spojením, takže doporučujeme použití unikátního hesla, na kterém vám nezáleží",
"hotkey_rate5": "hodnocení 5 hvězdami",
"hotkey_playbackPrevious": "předchozí skladba",
"showSkipButtons_description": "zobrazit nebo skrýt tlačítka k přeskočení na liště přehrávače",
"crossfadeDuration_description": "nastavte trvání efektu prolnutí",
"language": "jazyk",
"playbackStyle": "způsob přehrávání",
"hotkey_toggleShuffle": "přepnutí náhodného přehrávání",
"theme": "motiv",
"playbackStyle_description": "nastavení způsobu přehrávání pro přehrávač zvuku",
"discordRichPresence_description": "povolit stav přehrávání v {{discord}} rich presence. Klíče obrázků jsou: {{icon}}, {{playing}}, {{paused}}",
"mpvExecutablePath": "cesta ke spustitelnému souboru mpv",
"audioDevice": "zvukové zařízení",
"hotkey_rate2": "hodnocení 2 hvězdami",
"playButtonBehavior_description": "nastavení výchozího chování tlačítka přehrávání při přidávání skladeb do fronty",
"minimumScrobblePercentage_description": "minimální procento skladby, které musí být přehráno před jejím scrobblováním",
"exitToTray": "ukončit do lišty",
"hotkey_rate4": "hodnocení 4 hvězdami",
"enableRemote": "povolit vzdálený ovládací server",
"showSkipButton_description": "zobrazit nebo skrýt tlačítka k přeskočení na liště přehrávače",
"savePlayQueue": "uložit frontu přehrávání",
"minimumScrobbleSeconds_description": "minimální doba v sekundách, která musí být přehrána před scrobblováním skladby",
"skipPlaylistPage_description": "při navigaci na playlist přejít na stránku seznamu skladeb v playlistu namísto výchozí stránky",
"fontType_description": "vestavěné písmo vybere jedno z písem poskytovaných programem Feishin. systémové písmo vám umožní vybrat si jakékoli písmo poskytované vaším operačním systémem. vlastní vám umožňuje použít vaše vlastní písmo",
"playButtonBehavior": "chování tlačítka přehrávání",
"volumeWheelStep": "krok kolečka hlasitosti",
"sidebarPlaylistList_description": "zobrazit nebo skrýt seznam playlistů v postranním panelu",
"accentColor": "barva",
"sidePlayQueueStyle_description": "nastavení stylu postranní fronty přehrávání",
"accentColor_description": "nastaví barvu aplikace",
"replayGainMode": "režim {{ReplayGain}}",
"playbackStyle_optionNormal": "normální",
"windowBarStyle": "styl záhlaví okna",
"floatingQueueArea": "zobrazit plovoucí oblast přejetí nad frontou",
"replayGainFallback_description": "zesílení v db k použití, když nemá soubor žádné značky {{ReplayGain}}",
"replayGainPreamp_description": "úprava předběžného zesílení použitého na hodnoty {{ReplayGain}}",
"hotkey_toggleRepeat": "přepnutí opakování",
"lyricOffset_description": "odsazení textů o určité množství milisekund",
"sidebarConfiguration_description": "vyberte položky a pořadí, ve kterém budou v postranním panelu",
"fontType": "typ písma",
"remotePort": "port serveru vzdáleného ovládání",
"applicationHotkeys": "aplikační zkratky",
"hotkey_playbackNext": "další skladba",
"useSystemTheme_description": "následovat systémovou předvolbu světlého nebo tmavého motivu",
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
"lyricFetch_description": "načtení textů z různých internetových zdrojů",
"lyricFetchProvider_description": "vyberte poskytovatele textů. pořadí poskytovatelů je pořadí, ve kterém budou načítány",
"globalMediaHotkeys_description": "zapnout nebo vypnout použití vašich systémových zkratek médií pro ovládání přehrávače",
"customFontPath": "vlastní cesta k písmům",
"followLyric": "zobrazit aktuální texty",
"crossfadeDuration": "trvání prolnutí",
"discordIdleStatus": "zobrazit stav nečinnosti v rich presence",
"sidePlayQueueStyle_optionDetached": "odpojené",
"audioPlayer": "zvukový přehrávač",
"hotkey_zoomOut": "oddálení",
"hotkey_unfavoriteCurrentSong": "zrušení oblíbení u $t(common.currentSong)",
"hotkey_rate0": "vymazání hodnocení",
"discordApplicationId": "id aplikace pro {{discord}}",
"applicationHotkeys_description": "nastavení klávesových zkratek aplikace. přepněte pole pro nastavení jako globální zkratku (pouze na počítači)",
"floatingQueueArea_description": "zobrazit ikonu přejetí myší na pravé straně obrazovky pro zobrazení fronty",
"hotkey_volumeMute": "ztlumení",
"hotkey_toggleCurrentSongFavorite": "přepnutí oblíbení u $t(common.currentSong)",
"remoteUsername": "uživatelské jméno serveru vzdáleného ovládání",
"hotkey_browserBack": "zpět v prohlížeči",
"showSkipButton": "zobrazit tlačítka k přeskočení",
"sidebarPlaylistList": "postranní seznam playlistů",
"minimizeToTray": "minimalizovat do lišty",
"skipPlaylistPage": "přeskočit stránku playlistu",
"themeDark": "motiv (tmavý)",
"sidebarCollapsedNavigation": "postranní (sbalená) navigace",
"customFontPath_description": "nastavení cesty k vlastnímu písmu k využití v aplikaci",
"gaplessAudio_optionWeak": "slabý (doporučeno)",
"minimumScrobbleSeconds": "minimální scrobblování (v sekundách)",
"hotkey_playbackStop": "zastavení",
"windowBarStyle_description": "vyberte styl záhlaví okna",
"discordRichPresence": "{{discord}} rich presence",
"font_description": "nastavení písma použitého v aplikaci",
"savePlayQueue_description": "uložit frontu přehrávání, když je aplikace zavřena a obnovit ji při otevření aplikace",
"useSystemTheme": "použít systémový motiv",
"buttonSize": "velikost tlačítek lišty přehrávače",
"buttonSize_description": "velikost tlačítek na liště přehrávače",
"clearCache": "vymazat mezipaměť prohlížeče",
"clearCache_description": "„tvrdé pročištění“ aplikace feishin. kromě mezipaměti aplikace feishin vymaže i mezipaměť prohlížeče (uložené obrázky a další zdroje). přihlašovací údaje k serveru a nastavení nebudou ovlivněny",
"clearQueryCache": "vymazat mezipaměť aplikace feishin",
"clearQueryCache_description": "„lehké pročištění“ aplikace feishin. tímto obnovíte seznamy skladeb, metadata skladeb a resetujete uložené texty. nastavení, přihlašovací údaje k serveru a obrázky v mezipaměti nebudou ovlivněny",
"startMinimized": "spustit minimalizované",
"homeConfiguration_description": "nastavte, které položky a v jakém pořadí mají být zobrazeny na domovské stránce",
"passwordStore": "ukládání hesel / tajných klíčů",
"mpvExtraParameters_help": "jeden na řádek",
"homeConfiguration": "nastavení domovské stránky",
"playerAlbumArtResolution_description": "rozlišení náhledu obalu alba ve velkém přehrávači. větší hodnota znamená kvalitnější obrázek, ale může se déle načítat. výchozí hodnota je 0, což znamená automatické rozlišení",
"playerAlbumArtResolution": "rozlišení obalu alba v přehrávači",
"genreBehavior": "výchozí chování stránky žánrů",
"externalLinks_description": "zapne zobrazování externích odkazů (Last.fm, MusicBrainz) na stránce umělce/alba",
"genreBehavior_description": "určuje, zda kliknutí na žánr otevře seznam skladeb nebo alb",
"clearCacheSuccess": "mezipaměť úspěšně vymazána",
"externalLinks": "zobrazit externí odkazy",
"startMinimized_description": "spustit aplikaci do systémové lišty",
"passwordStore_description": "který způsob ukládání hesel / tajných klíčů použít. změňte tuto možnost, pokud máte problémy s ukládáním hesel.",
"homeFeature": "carousel doporučení na domovské stránce",
"homeFeature_description": "ovládá, zda se má zobrazovat velký carousel s doporučenými alby na domovské stránce",
"imageAspectRatio": "použít nativní poměr stran obalů alb",
"imageAspectRatio_description": "pokud je povoleno, budou obaly alb zobrazeny s jejich nativním poměrem stran. u obalů, které nemají poměr 1:1, bude zbývající místo prázdné",
"doubleClickBehavior": "dvojitým kliknutím zařadit všechny vyhledané skladby do fronty",
"doubleClickBehavior_description": "pokud je zapnuto, budou všechny odpovídající skladby ve vyhledávání zařazeny do fronty. v opačném případě bude zařazena pouze ta, na kterou kliknete",
"volumeWidth": "šířka posuvníku hlasitosti",
"volumeWidth_description": "horizontální velikost posuvníku hlasitosti",
"discordListening": "zobrazit stav jako „Poslouchá“",
"discordListening_description": "zobrazit stav jako „Poslouchá“ namísto „Hraje“",
"contextMenu": "nastavení kontextové nabídky (kliknutí pravým)",
"contextMenu_description": "umožňuje skrýt položky, které se zobrazí v nabídce po kliknutí pravým tlačítkem myši na položku. položky, které nejsou zaškrtnuté, se skryjí",
"customCssEnable": "povolit vlastní CSS",
"customCssEnable_description": "povolit vlastní CSS.",
"customCssNotice": "Varování: i když provádíme určitou sanitizaci (zakázáním url() a content:), může používání CSS stále představovat riziko změnami rozhraní.",
"customCss_description": "vlastní CSS obsah. Upozornění: vlastnosti content a vzdálené url jsou zakázané. Níže je zobrazen náhled vašeho obsahu. Další pole, která jste nenastavili, jsou přítomna z důvodu sanitizace.",
"customCss": "vlastní CSS",
"webAudio": "použít webový zvuk",
"webAudio_description": "použít webový zvuk. tím povolíte pokročilé funkce jako replaygain. zakažte, pokud se objeví problémy",
"transcodeNote": "projeví se po 1 (web) - 2 (mpv) skladbách",
"transcode": "povolit překódování",
"transcode_description": "zapnout překódování do různých formátů",
"transcodeFormat_description": "vybere formát k překódování. pokud chcete nechat rozhodnout server, ponechte prázdné",
"transcodeFormat": "formát k překódování",
"transcodeBitrate": "datový tok k překódování",
"transcodeBitrate_description": "vybere datový tok k překódování. 0 znamená, že necháte server vybrat",
"albumBackground": "obrázek alba na pozadí",
"albumBackground_description": "přidá obrázek alba na pozadí pro stránky alba obsahující obrázky alba",
"albumBackgroundBlur": "velikost rozostření obrázku alba na pozadí",
"albumBackgroundBlur_description": "upraví množství rozostření použité na obrázek alba na pozadí",
"playerbarOpenDrawer": "lišta přehrávače jako přepínač celé obrazovky",
"playerbarOpenDrawer_description": "umožňuje kliknutí na lištu přehrávače pro otevření celoobrazovkového přehrávače",
"artistConfiguration": "nastavení stránky umělce alba",
"artistConfiguration_description": "nastavit, které položky na stránce umělce alba budou zobrazeny a v jakém pořadí",
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
"trayEnabled": "zobrazit v oznamovací oblasti",
"trayEnabled_description": "zobrazit/skrýt ikonu/nabídku v oznamovací oblasti. pokud je zakázáno, vypne také minimalizaci/ukončení do oznamovací oblasti",
"translationApiProvider": "poskytovatel api překladů",
"translationApiProvider_description": "poskytovatel api pro překlady",
"translationApiKey": "klíč api překladů",
"translationApiKey_description": "klíč api pro překlady (podporuje pouze koncový bod globální služby)",
"translationTargetLanguage": "cílový jazyk překladu",
"translationTargetLanguage_description": "cílový jazyk pro překlad",
"lastfmApiKey": "klíč API {{lastfm}}",
"lastfmApiKey_description": "klíč API pro {{lastfm}}. vyžadováno pro obaly alb",
"discordServeImage": "načítat obrázky {{discord}} ze serveru",
"discordServeImage_description": "sdílet obaly alb pro {{discord}} rich presence ze samotného serveru, dostupné pouze pro jellyfin a navidrome",
"lastfm": "zobrazit odkazy na last.fm",
"lastfm_description": "na stránkách umělců a alb zobrazit odkazy na last.fm",
"musicbrainz": "zobrazit odkazy na musicbrainz",
"musicbrainz_description": "na stránkách umělců a alb, kde existuje mbid, zobrazit odkazy na musicbrainz",
"neteaseTranslation": "Povolit překlady NetEase",
"neteaseTranslation_description": "Pokud je povoleno, načte a zobrazí přeložené texty ze služby NetEase, pokud jsou dostupné.",
"preferLocalLyrics": "preferovat místní texty",
"preferLocalLyrics_description": "preferovat místní texty před vzdálenými, pokud jsou dostupné",
"discordPausedStatus": "zobrazit rich presence při pozastavení",
"discordPausedStatus_description": "pokud je povoleno, bude při pozastavení přehrávače zobrazen stav",
"preservePitch": "zachovat výšku",
"preservePitch_description": "zachová výšku při úpravě rychlosti přehrávání",
"notify": "povolit oznámení o skladbách",
"notify_description": "zobrazit oznámení při změně aktuální skladby",
"discordDisplayType": "typ zobrazení stavu {{discord}}",
"discordDisplayType_description": "změní, co posloucháte, ve vašem stavu",
"discordDisplayType_songname": "název skladby",
"discordDisplayType_artistname": "jména umělců",
"hotkey_navigateHome": "přejít domů",
"preventSleepOnPlayback": "zabránit uspání při přehrávání",
"preventSleepOnPlayback_description": "zabránit uspání displeje během přehrávání hudby"
},
"action": {
"editPlaylist": "upravit $t(entity.playlist_one)",
"goToPage": "přejít na stránku",
"moveToTop": "přesunout nahoru",
"clearQueue": "vymazat frontu",
"addToFavorites": "přidat do $t(entity.favorite_other)",
"addToPlaylist": "přidat do $t(entity.playlist_one)",
"createPlaylist": "vytvořit $t(entity.playlist_one)",
"removeFromPlaylist": "odebrat z $t(entity.playlist_one)",
"viewPlaylists": "zobrazit $t(entity.playlist_other)",
"refresh": "$t(common.refresh)",
"deletePlaylist": "odstranit $t(entity.playlist_one)",
"removeFromQueue": "odebrat z fronty",
"deselectAll": "zrušit výběr všeho",
"moveToBottom": "přesunout dolů",
"setRating": "nastavit hodnocení",
"toggleSmartPlaylistEditor": "přepnout editor $t(entity.smartPlaylist)",
"removeFromFavorites": "odebrat z $t(entity.favorite_other)",
"openIn": {
"lastfm": "Otevřít v Last.fm",
"musicbrainz": "Otevřít v MusicBrainz"
},
"moveToNext": "přesunout na další"
},
"common": {
"backward": "zpátky",
"increase": "zvýčit",
"rating": "hodnocení",
"bpm": "bpm",
"refresh": "obnovit",
"unknown": "neznámý",
"areYouSure": "opravdu?",
"edit": "upravit",
"favorite": "oblíbený",
"left": "vlevo",
"save": "uložit",
"right": "vpravo",
"currentSong": "aktuální $t(entity.track_one)",
"collapse": "sbalit",
"trackNumber": "stopa",
"descending": "sestupně",
"add": "přidat",
"gap": "mezera",
"ascending": "vzestupně",
"dismiss": "zavřít",
"year": "rok",
"manage": "správa",
"limit": "limit",
"minimize": "minimalizovat",
"modified": "upraveno",
"duration": "trvání",
"name": "název",
"maximize": "maximalizovat",
"decrease": "snížit",
"ok": "ok",
"description": "popis",
"configure": "nastavit",
"path": "cesta",
"center": "uprostřed",
"no": "ne",
"owner": "majitel",
"enable": "zapnout",
"clear": "vymazat",
"forward": "vpřed",
"delete": "odstranit",
"cancel": "zrušit",
"forceRestartRequired": "restartujte pro použití změn… zavřete oznámení pro restartování",
"setting": "nastavení",
"version": "verze",
"title": "název",
"filter_one": "filtr",
"filter_few": "filtry",
"filter_other": "filtrů",
"filters": "filtry",
"create": "vytvořit",
"bitrate": "datový tok",
"saveAndReplace": "uložit a nahradit",
"action_one": "akce",
"action_few": "akce",
"action_other": "akcí",
"playerMustBePaused": "přehrávač musí být pozastaven",
"confirm": "potvrdit",
"resetToDefault": "resetovat na výchozí",
"home": "domů",
"comingSoon": "již brzy…",
"reset": "resetovat",
"channel_one": "kanál",
"channel_few": "kanály",
"channel_other": "kanálů",
"disable": "vypnout",
"sortOrder": "pořadí",
"none": "žádný",
"menu": "nabídka",
"restartRequired": "vyžadován restart",
"previousSong": "předchozí $t(entity.track_one)",
"noResultsFromQuery": "nebyly nalezeny žádné výsledky",
"quit": "ukončit",
"expand": "rozbalit",
"search": "hledat",
"saveAs": "uložit jako",
"disc": "disk",
"yes": "ano",
"random": "náhodně",
"size": "velikost",
"biography": "biografie",
"note": "poznámka",
"albumGain": "gain alba",
"albumPeak": "vrchol alba",
"close": "zavřít",
"mbid": "ID MusicBrainz",
"trackGain": "zisk (gain) skladby",
"reload": "znovu načíst",
"share": "sdílet",
"codec": "kodek",
"trackPeak": "vrchol skladby",
"preview": "náhled",
"translation": "překlad",
"additionalParticipants": "další přispívající",
"tags": "štítky",
"viewReleaseNotes": "zobrazit seznam změn",
"newVersion": "byla nainstalována nová verze ({{version}})",
"bitDepth": "bitová hloubka",
"sampleRate": "vzorkovací frekvence"
},
"table": {
"config": {
"view": {
"card": "karta",
"table": "tabulka",
"poster": "plakát",
"list": "seznam",
"grid": "mřížka"
},
"general": {
"displayType": "typ zobrazení",
"gap": "$t(common.gap)",
"tableColumns": "sloupce tabulky",
"autoFitColumns": "automaticky přizpůsobit sloupce",
"size": "$t(common.size)",
"itemGap": "mezera mezi položkami (px)",
"itemSize": "velikost položek (px)",
"followCurrentSong": "následovat aktuální skladbu"
},
"label": {
"releaseDate": "datum vydání",
"title": "$t(common.title)",
"duration": "$t(common.duration)",
"titleCombined": "$t(common.title) (kombinovaný)",
"dateAdded": "datum přidání",
"size": "$t(common.size)",
"bpm": "$t(common.bpm)",
"lastPlayed": "naposledy přehráno",
"trackNumber": "číslo stopy",
"rowIndex": "index řádku",
"rating": "$t(common.rating)",
"artist": "$t(entity.artist_one)",
"album": "$t(entity.album_one)",
"note": "$t(common.note)",
"biography": "$t(common.biography)",
"owner": "$t(common.owner)",
"path": "$t(common.path)",
"channels": "$t(common.channel_other)",
"playCount": "počet přehrání",
"bitrate": "$t(common.bitrate)",
"actions": "$t(common.action_other)",
"genre": "$t(entity.genre_one)",
"discNumber": "číslo disku",
"favorite": "$t(common.favorite)",
"year": "$t(common.year)",
"albumArtist": "$t(entity.albumArtist_one)",
"codec": "$t(common.codec)",
"songCount": "$t(entity.track_other)"
}
},
"column": {
"comment": "komentář",
"album": "album",
"rating": "hodnocení",
"favorite": "oblíbené",
"playCount": "přehrání",
"albumCount": "$t(entity.album_other)",
"releaseYear": "rok",
"lastPlayed": "naposledy přehráno",
"biography": "biografie",
"releaseDate": "datum vydání",
"bitrate": "datový tok",
"title": "název",
"bpm": "bpm",
"dateAdded": "datum přidání",
"artist": "$t(entity.artist_one)",
"songCount": "$t(entity.track_other)",
"trackNumber": "skladba",
"genre": "$t(entity.genre_one)",
"albumArtist": "umělec alba",
"path": "cesta",
"discNumber": "disk",
"channels": "$t(common.channel_other)",
"size": "$t(common.size)",
"codec": "$t(common.codec)"
}
},
"error": {
"remotePortWarning": "restartujte server pro použití nového portu",
"systemFontError": "při pokusu o získání systémových písem se vyskytla chyba",
"playbackError": "při pokusu o přehrání médií se vyskytla chyba",
"endpointNotImplementedError": "endpoint {{endpoint}} není u serveru {{serverType}} implementován",
"remotePortError": "při pokusu o nastavení portu vzdáleného serveru se vyskytla chyba",
"serverRequired": "vyžadován server",
"authenticationFailed": "ověření selhalo",
"apiRouteError": "nepodařilo se přesměrovat žádost",
"genericError": "vyskytla se chyba",
"credentialsRequired": "vyžadovány údaje",
"sessionExpiredError": "vaše relace vypršela",
"remoteEnableError": "při pokusu $t(common.enable) vzdálený server se vyskytla chyba",
"localFontAccessDenied": "přístup k místním písmům zakázán",
"serverNotSelectedError": "není vybrán žádný server",
"remoteDisableError": "při pokusu $t(common.disable) vzdálený server se vyskytla chyba",
"mpvRequired": "vyžadován přehrávač MPV",
"audioDeviceFetchError": "při pokusu o přístup ke zvukovým zařízením se vyskytla chyba",
"invalidServer": "neplatný server",
"loginRateError": "příliš mnoho pokusů o přihlášení, zkuste to znovu za pár vteřin",
"badAlbum": "tuto stránku vidíte, protože tato skladba není součástí alba. tento problém může nastat, pokud máte skladbu na nejvyšší úrovni vaší složky s hudbou. jellyfin seskupuje skladby pouze, pokud se nacházejí ve složce.",
"networkError": "vyskytla se chyba sítě",
"openError": "nepodařilo se otevřít soubor",
"badValue": "neplatná možnost „{{value}}“. tato možnost již neexistuje",
"notificationDenied": "oprávnění k posílání oznámení byla zamítnuta. toto nastavení nemá žádný vliv"
},
"filter": {
"mostPlayed": "nejvíce přehráváno",
"comment": "komentář",
"playCount": "počet přehrání",
"recentlyUpdated": "nedávno upraveno",
"channels": "$t(common.channel_other)",
"isCompilation": "je kompilace",
"recentlyPlayed": "nedávno přehráno",
"isRated": "je hodnoceno",
"owner": "$t(common.owner)",
"title": "název",
"rating": "hodnocení",
"search": "hledat",
"bitrate": "datový tok",
"genre": "$t(entity.genre_one)",
"recentlyAdded": "nedávno přidáno",
"note": "poznámka",
"name": "název",
"dateAdded": "datum přidání",
"releaseDate": "datum vydání",
"albumCount": "počet $t(entity.album_other)",
"communityRating": "komunitní hodnocení",
"path": "cesta",
"favorited": "oblíbené",
"albumArtist": "$t(entity.albumArtist_one)",
"isRecentlyPlayed": "je nedávno přehráno",
"isFavorited": "je oblíbené",
"bpm": "bpm",
"releaseYear": "rok vydání",
"id": "id",
"disc": "disk",
"biography": "biografie",
"songCount": "počet skladeb",
"artist": "$t(entity.artist_one)",
"duration": "trvání",
"isPublic": "je veřejné",
"random": "náhodně",
"lastPlayed": "naposledy přehráno",
"toYear": "do roku",
"fromYear": "z roku",
"criticRating": "hodnocení kritiků",
"album": "$t(entity.album_one)",
"trackNumber": "skladba"
},
"page": {
"sidebar": {
"nowPlaying": "právě hraje",
"playlists": "$t(entity.playlist_other)",
"search": "$t(common.search)",
"tracks": "$t(entity.track_other)",
"albums": "$t(entity.album_other)",
"genres": "$t(entity.genre_other)",
"folders": "$t(entity.folder_other)",
"settings": "$t(common.setting_other)",
"home": "$t(common.home)",
"artists": "$t(entity.artist_other)",
"albumArtists": "$t(entity.albumArtist_other)",
"shared": "$t(entity.playlist_other) sdíleny",
"myLibrary": "moje knihovna"
},
"fullscreenPlayer": {
"config": {
"showLyricMatch": "zobrazit shodu textů",
"dynamicBackground": "dynamické pozadí",
"synchronized": "synchronizováno",
"followCurrentLyric": "následovat aktuální text",
"opacity": "neprůhlednost",
"lyricSize": "velikost textů",
"showLyricProvider": "zobrazit poskytovatele textů",
"unsynchronized": "nesynchronizováno",
"lyricAlignment": "zarovnání textů",
"useImageAspectRatio": "použít poměr stran obrázku",
"lyricGap": "mezera textů",
"dynamicImageBlur": "velikost rozostření obrázku",
"dynamicIsImage": "povolit obrázek na pozadí",
"lyricOffset": "posunutí textů (ms)"
},
"upNext": "další",
"lyrics": "texty",
"related": "související",
"visualizer": "vizualizér",
"noLyrics": "nenalezeny žádné texty"
},
"appMenu": {
"selectServer": "vybrat server",
"version": "verze {{version}}",
"settings": "$t(common.setting_other)",
"manageServers": "správce serverů",
"expandSidebar": "rozbalit postranní panel",
"collapseSidebar": "sbalit postranní panel",
"openBrowserDevtools": "otevřít vývojářské nástroje",
"quit": "$t(common.quit)",
"goBack": "přejít zpět",
"goForward": "přejít vpřed",
"privateModeOff": "vypnout soukromý režim",
"privateModeOn": "zapnout soukromý režim"
},
"contextMenu": {
"addToPlaylist": "$t(action.addToPlaylist)",
"addToFavorites": "$t(action.addToFavorites)",
"setRating": "$t(action.setRating)",
"moveToTop": "$t(action.moveToTop)",
"deletePlaylist": "$t(action.deletePlaylist)",
"moveToBottom": "$t(action.moveToBottom)",
"createPlaylist": "$t(action.createPlaylist)",
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
"removeFromFavorites": "$t(action.removeFromFavorites)",
"addNext": "$t(player.addNext)",
"deselectAll": "$t(action.deselectAll)",
"addLast": "$t(player.addLast)",
"addFavorite": "$t(action.addToFavorites)",
"play": "$t(player.play)",
"numberSelected": "vybráno {{count}}",
"removeFromQueue": "$t(action.removeFromQueue)",
"showDetails": "získat informace",
"shareItem": "sdílet položku",
"playSimilarSongs": "$t(player.playSimilarSongs)",
"download": "stáhnout",
"playShuffled": "$t(player.shuffle)",
"moveToNext": "$t(action.moveToNext)",
"goToAlbum": "přejít na $t(entity.album_one)",
"goToAlbumArtist": "přejít na $t(entity.albumArtist_one)"
},
"home": {
"mostPlayed": "nejpřehrávanější",
"newlyAdded": "nově přidáno",
"title": "$t(common.home)",
"explore": "procházet z vaší knihovny",
"recentlyPlayed": "nedávno přehráno"
},
"albumDetail": {
"moreFromArtist": "více od tohoto umělce",
"moreFromGeneric": "více od {{item}}",
"released": "vydáno"
},
"setting": {
"playbackTab": "přehrávání",
"generalTab": "obecné",
"hotkeysTab": "klávesové zkratky",
"windowTab": "okno",
"advanced": "pokročilé"
},
"albumArtistList": {
"title": "$t(entity.albumArtist_other)"
},
"genreList": {
"title": "$t(entity.genre_other)",
"showTracks": "zobrazit $t(entity.track_other) s žánrem",
"showAlbums": "zobrazit $t(entity.album_other) s žánrem"
},
"trackList": {
"title": "$t(entity.track_other)",
"artistTracks": "skladby od umělce {{artist}}",
"genreTracks": "$t(entity.track_other) s žánrem „{{genre}}“"
},
"globalSearch": {
"commands": {
"serverCommands": "příkazy serveru",
"goToPage": "přejít na stránku",
"searchFor": "hledání {{query}}"
},
"title": "příkazy"
},
"playlistList": {
"title": "$t(entity.playlist_other)"
},
"albumList": {
"title": "$t(entity.album_other)",
"artistAlbums": "alba od umělce {{artist}}",
"genreAlbums": "$t(entity.album_other) s žánrem „{{genre}}“"
},
"albumArtistDetail": {
"recentReleases": "nedávno vydáno",
"viewDiscography": "zobrazit diskografii",
"about": "O umělci {{artist}}",
"appearsOn": "také v",
"topSongs": "nejlepší skladby",
"topSongsFrom": "nejlepší skladby od umělce {{title}}",
"relatedArtists": "podobní $t(entity.artist_other)",
"viewAllTracks": "zobrazit všechny $t(entity.track_other)",
"viewAll": "zobrazit vše"
},
"itemDetail": {
"copiedPath": "cesta úspěšně zkopírována",
"copyPath": "kopírovat cestu do schránky",
"openFile": "zobrazit skladbu ve správci souborů"
},
"playlist": {
"reorder": "změna pořadí povolena pouze při řazení podle id"
},
"manageServers": {
"url": "URL",
"username": "uživatelské jméno",
"editServerDetailsTooltip": "upravit podrobnosti o serveru",
"removeServer": "odstranit server",
"serverDetails": "podrobnosti o serveru",
"title": "správa serverů"
}
},
"form": {
"deletePlaylist": {
"title": "odstranit $t(entity.playlist_one)",
"success": "$t(entity.playlist_one) úspěšně odstraněn",
"input_confirm": "pro potvrzení zadejte název $t(entity.playlist_one)u"
},
"createPlaylist": {
"input_description": "$t(common.description)",
"title": "vytvořit $t(entity.playlist_one)",
"input_public": "veřejné",
"input_name": "$t(common.name)",
"success": "$t(entity.playlist_one) úspěšně vytvořen",
"input_owner": "$t(common.owner)"
},
"addServer": {
"title": "přidat server",
"input_username": "uživatelské jméno",
"input_url": "adresa url",
"input_password": "heslo",
"input_legacyAuthentication": "zapnout zastaralé ověřování",
"input_name": "název serveru",
"success": "server úspěšně přidán",
"input_savePassword": "uložit heslo",
"ignoreSsl": "ignorovat SSL $t(common.restartRequired)",
"ignoreCors": "ignorovat CORS $t(common.restartRequired)",
"error_savePassword": "při ukládání hesla se vyskytla chyba"
},
"addToPlaylist": {
"success": "přidáno $t(entity.trackWithCount, {\"count\": {{message}} }) do $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
"title": "přidat do $t(entity.playlist_one)",
"input_skipDuplicates": "přeskočit duplicity",
"input_playlists": "$t(entity.playlist_other)"
},
"updateServer": {
"title": "upravit server",
"success": "server úspěšně upraven"
},
"queryEditor": {
"input_optionMatchAll": "shoda všeho",
"input_optionMatchAny": "shoda libovolného",
"title": "editor dotazů"
},
"lyricSearch": {
"input_name": "$t(common.name)",
"input_artist": "$t(entity.artist_one)",
"title": "Hledat texty"
},
"editPlaylist": {
"title": "upravit $t(entity.playlist_one)",
"success": "$t(entity.playlist_one) úspěšně aktualizován",
"publicJellyfinNote": "Jellyfin z nějakého důvodu neukazuje, zda je seznam skladeb veřejný, nebo ne. Pokud si přejete, aby zůstal veřejný, zvolte prosím následující vstup"
},
"shareItem": {
"allowDownloading": "umožnit stahování",
"success": "odkaz ke sdílení zkopírován do schránky (klikněte sem pro otevření)",
"description": "popis",
"expireInvalid": "čas vypršení musí být v budoucnosti",
"setExpiration": "nastavit vypršení",
"createFailed": "nepodařilo se vytvořit sdílení (je sdílení povoleno?)"
},
"privateMode": {
"enabled": "soukromý režim povolen, stav přehrávání je nyní skryt před externími integracemi",
"disabled": "soukromý režim povolen, stav přehrávání je nyní viditelný pro externími integrace",
"title": "soukromý režim"
}
},
"entity": {
"genre_one": "žánr",
"genre_few": "žánry",
"genre_other": "žánry",
"playlistWithCount_one": "{{count}} playlist",
"playlistWithCount_few": "{{count}} playlisty",
"playlistWithCount_other": "{{count}} playlistů",
"playlist_one": "playlist",
"playlist_few": "playlisty",
"playlist_other": "playlisty",
"artist_one": "umělec",
"artist_few": "umělci",
"artist_other": "umělci",
"folderWithCount_one": "{{count}} složka",
"folderWithCount_few": "{{count}} složky",
"folderWithCount_other": "{{count}} složek",
"albumArtist_one": "umělec alba",
"albumArtist_few": "umělci alb",
"albumArtist_other": "umělci alb",
"track_one": "skladba",
"track_few": "skladby",
"track_other": "skladby",
"albumArtistCount_one": "{{count}} umělec alba",
"albumArtistCount_few": "{{count}} umělci alba",
"albumArtistCount_other": "{{count}} umělců alba",
"albumWithCount_one": "{{count}} album",
"albumWithCount_few": "{{count}} alba",
"albumWithCount_other": "{{count}} alb",
"favorite_one": "oblíbená",
"favorite_few": "oblíbené",
"favorite_other": "oblíbených",
"artistWithCount_one": "{{count}} umělec",
"artistWithCount_few": "{{count}} umělci",
"artistWithCount_other": "{{count}} umělců",
"folder_one": "složka",
"folder_few": "složky",
"folder_other": "složky",
"smartPlaylist": "chytrý $t(entity.playlist_one)",
"album_one": "album",
"album_few": "alba",
"album_other": "alba",
"genreWithCount_one": "{{count}} žánr",
"genreWithCount_few": "{{count}} žánry",
"genreWithCount_other": "{{count}} žánrů",
"trackWithCount_one": "{{count}} skladba",
"trackWithCount_few": "{{count}} skladby",
"trackWithCount_other": "{{count}} skladeb",
"play_one": "{{count}} přehrání",
"play_few": "{{count}} přehrání",
"play_other": "{{count}} přehrání",
"song_one": "píseň",
"song_few": "písničky",
"song_other": "písní"
}
}
+714
View File
@@ -0,0 +1,714 @@
{
"action": {
"editPlaylist": "bearbeiten $t(entity.playlist_one)",
"clearQueue": "Warteschlange löschen",
"addToFavorites": "hinzufügen zu $t(entity.favorite_other)",
"addToPlaylist": "hinzufügen zu $t(entity.playlist_one)",
"createPlaylist": "erstelle $t(entity.playlist_one)",
"deletePlaylist": "löschen $t(entity.playlist_one)",
"deselectAll": "Alle abwählen",
"goToPage": "Gehe zur Seite",
"moveToTop": "Nach oben",
"moveToBottom": "Nach unten",
"removeFromPlaylist": "Entfernen von $t(entity.playlist_one)",
"viewPlaylists": "Ansicht $t(entity.playlist_other)",
"refresh": "$t(common.refresh)",
"removeFromQueue": "Von Warteschlange entfernen",
"setRating": "Bewertung festlegen",
"toggleSmartPlaylistEditor": "Editor $t(entity.smartPlaylist) umschalten",
"removeFromFavorites": "Entfernen von $t(entity.favorite_other)",
"openIn": {
"lastfm": "In Last.fm öffnen",
"musicbrainz": "In MusicBrainz öffnen"
},
"moveToNext": "nach unten verschieben"
},
"common": {
"backward": "rückwärts",
"increase": "erhöhen",
"rating": "Wertung",
"bpm": "bpm",
"refresh": "Aktualisieren",
"unknown": "Unbekannt",
"areYouSure": "Bist Du sicher?",
"edit": "Bearbeiten",
"favorite": "Favorit",
"left": "links",
"save": "Speichern",
"right": "rechts",
"currentSong": "momentaner $t(entity.track_one)",
"collapse": "Zusammenklappen",
"trackNumber": "Track",
"descending": "absteigend",
"add": "Hinzufügen",
"gap": "Lücke",
"ascending": "aufsteigend",
"dismiss": "Verwerfen",
"year": "Jahr",
"manage": "Verwalten",
"limit": "Limit",
"minimize": "minimieren",
"modified": "geändert",
"duration": "Laufzeit",
"name": "Name",
"maximize": "maximieren",
"decrease": "verringern",
"ok": "okay",
"description": "Beschreibung",
"configure": "Konfigurieren",
"path": "Pfad",
"center": "Zentrieren",
"no": "Nein",
"owner": "Eigentümer",
"enable": "Aktivieren",
"clear": "Bereinigen",
"forward": "vorwärts",
"delete": "Löschen",
"cancel": "Abbrechen",
"forceRestartRequired": "Neustarten um die Änderungen zu übernehmen... Schließe die Benachrichtigung zum Neustarten",
"setting": "Einstellungen",
"setting_one": "Einstellung",
"setting_other": "Einstellungen",
"version": "Version",
"title": "Titel",
"filter_one": "Filter",
"filter_other": "Filter",
"filters": "Filter",
"create": "Erstellen",
"bitrate": "Bitrate",
"saveAndReplace": "Speichern und Ersetzen",
"action_one": "Aktion",
"action_other": "Aktionen",
"playerMustBePaused": "Player muss pausiert sein",
"confirm": "Bestätigen",
"resetToDefault": "Auf Standard zurücksetzen",
"home": "Home",
"comingSoon": "Kommt bald…",
"reset": "zurücksetzen",
"channel_one": "Kanal",
"channel_other": "Kanäle",
"disable": "Deaktivieren",
"sortOrder": "Reihenfolge",
"none": "keine",
"menu": "Menü",
"restartRequired": "(Neustart benötigt)",
"previousSong": "vorheriger $t(entity.track_one)",
"noResultsFromQuery": "Die Abfrage brachte keine Ergebnisse",
"quit": "Verlassen",
"expand": "expandieren",
"search": "Suchen",
"saveAs": "Speichern unter",
"disc": "Disk",
"yes": "Ja",
"random": "zufällig",
"size": "Größe",
"biography": "Biografie",
"note": "Hinweis",
"preview": "Vorschau",
"reload": "Neu Laden",
"mbid": "MusicBrainz ID",
"close": "schliessen",
"share": "Teilen",
"translation": "Übersetzung",
"trackGain": "Track-Pegelverstärkung",
"trackPeak": "Track-Spitzenpegel",
"codec": "Codec",
"albumPeak": "Album-Spitzenpegel",
"albumGain": "Album-Pegelverstärkung",
"tags": "tags",
"viewReleaseNotes": "Release Notes anzeigen",
"newVersion": "eine neue Version wurde installiert ({{version}})",
"bitDepth": "Bittiefe",
"sampleRate": "Abtastrate"
},
"error": {
"remotePortWarning": "Starten Sie den Server neu, um den neuen Port anzuwenden",
"systemFontError": "Beim Versuch, Systemschriftarten abzurufen, ist ein Fehler aufgetreten",
"playbackError": "Beim Versuch, das Medium abzuspielen, ist ein Fehler aufgetreten",
"endpointNotImplementedError": "Endgerät {{endpoint}} ist nicht für {{serverType}} implementiert",
"remotePortError": "Beim Versuch, den Remote-Server-Port festzulegen, ist ein Fehler aufgetreten",
"serverRequired": "Server benötigt",
"authenticationFailed": "Authentifizierung fehlgeschlagen",
"apiRouteError": "Anforderung kann nicht weitergeleitet werden",
"genericError": "Ein Fehler ist aufgetreten",
"credentialsRequired": "Anmeldeinformationen erforderlich",
"sessionExpiredError": "Deine Sitzung ist abgelaufen",
"remoteEnableError": "Beim Versuch, den Remote-Server mit $t(common.enable), ist ein Fehler aufgetreten",
"localFontAccessDenied": "Zugriff auf lokale Schriftarten verweigert",
"serverNotSelectedError": "Kein Server ausgewählt",
"remoteDisableError": "Beim Versuch, den Remote-Server mit $t(common.disable), ist ein Fehler aufgetreten",
"mpvRequired": "MPV benötigt",
"audioDeviceFetchError": "Beim Versuch, Audiogeräte abzurufen, ist ein Fehler aufgetreten",
"invalidServer": "Ungültiger Server",
"loginRateError": "Zu viele Anmeldeversuche, bitte versuche es in einigen Sekunden erneut",
"badAlbum": "Sie sehen diese Seite, weil dieses Lied nicht Teil eines Albums ist. Wahrscheinlich sehen Sie dieses Problem, wenn Sie einen Song in Ihrem Musikordner auf oberster Ebene haben. Jellyfin gruppiert nur Songs, wenn sie sich in einem Ordner befinden.",
"networkError": "ein Netzwerkfehler ist aufgetreten",
"openError": "datei kann nicht geöffnet werden",
"badValue": "ungültige option \"{{value}}\". Dieser Wert existiert nicht mehr",
"notificationDenied": "Berechtigungen über Benachrichtigungen wurden verweigert. Diese Einstellung hat keinen Effekt"
},
"filter": {
"mostPlayed": "Meistgespielt",
"comment": "Kommentar",
"playCount": "Anzahl abgespielt",
"recentlyUpdated": "kürzlich aktualisiert",
"isCompilation": "ist Zusammenstellung",
"recentlyPlayed": "kürzlich gespielt",
"isRated": "ist bewertet",
"title": "Titel",
"rating": "Bewertung",
"search": "Suche",
"bitrate": "Bitrate",
"recentlyAdded": "kürzlich hinzugefügt",
"note": "Hinweis",
"name": "Name",
"dateAdded": "Datum hinzugefügt",
"releaseDate": "Veröffentlichungsdatum",
"albumCount": "$t(entity.album_other) Anzahl",
"communityRating": "Community-Wertung",
"path": "Pfad",
"favorited": "favorisiert",
"albumArtist": "$t(entity.albumArtist_one)",
"isRecentlyPlayed": "wurde kürzlich gespielt",
"isFavorited": "wird favorisiert",
"bpm": "bpm",
"releaseYear": "Erscheinungsjahr",
"id": "ID",
"disc": "Disk",
"biography": "Biografie",
"songCount": "Anzahl Lieder",
"duration": "Dauer",
"isPublic": "ist öffentlich",
"random": "zufällig",
"lastPlayed": "Zuletzt gespielt",
"toYear": "bis Jahr",
"fromYear": "ab Jahr",
"criticRating": "Kritikerbewertung",
"album": "$t(entity.album_one)",
"trackNumber": "Track",
"channels": "$t(common.channel_other)",
"owner": "$t(common.owner)",
"genre": "$t(entity.genre_one)",
"artist": "$t(entity.artist_one)"
},
"form": {
"deletePlaylist": {
"title": "$t(entity.playlist_one) löschen",
"success": "$t(entity.playlist_one) erfolgreich gelöscht",
"input_confirm": "Geben Sie zur Bestätigung den Namen von $t(entity.playlist_one) ein"
},
"createPlaylist": {
"input_description": "$t(common.description)",
"title": "$t(entity.playlist_one) erstellen",
"input_public": "öffentlich",
"success": "$t(entity.playlist_one) erfolgreich erstellt",
"input_name": "$t(common.name)",
"input_owner": "$t(common.owner)"
},
"addServer": {
"title": "Server hinzufügen",
"input_username": "Benutzername",
"input_url": "URL",
"input_password": "Passwort",
"input_legacyAuthentication": "Aktivieren der Legacy-Authentifizierung",
"input_name": "Server Name",
"success": "Server erfolgreich hinzugefügt",
"input_savePassword": "Passwort speichern",
"ignoreSsl": "ignoriere ssl $t(common.restartRequired)",
"ignoreCors": "ignoriere cors $t(common.restartRequired)",
"error_savePassword": "Beim Versuch, das Passwort zu speichern, ist ein Fehler aufgetreten"
},
"addToPlaylist": {
"success": "{{message}} $t(entity.track_other) zu {{numOfPlaylists}} $t(entity.playlist_other) hinzugefügt",
"title": "Zu $t(entity.playlist_one) hinzufügen",
"input_skipDuplicates": "Duplikate überspringen",
"input_playlists": "$t(entity.playlist_other)"
},
"updateServer": {
"title": "Server aktualisieren",
"success": "Server erfolgreich aktualisiert"
},
"queryEditor": {
"input_optionMatchAll": "Treffer Alle",
"input_optionMatchAny": "Treffer Einige"
},
"editPlaylist": {
"title": "Bearbeite $t(entity.playlist_one)",
"success": "$t(entity.playlist_one) erfolgreich aktualisiert"
},
"lyricSearch": {
"title": "Songtext Suche",
"input_name": "$t(common.name)",
"input_artist": "$t(entity.artist_one)"
},
"shareItem": {
"description": "Beschreibung",
"setExpiration": "Ablaufdatum setzen",
"expireInvalid": "Ablaufdatum muss in der Zukunft liegen",
"allowDownloading": "Herunterladen zulassen",
"success": "Link in die Zwischenablage kopiert (oder hier klicken um zu öffnen)"
}
},
"entity": {
"genre_one": "Genre",
"genre_other": "Genres",
"playlistWithCount_one": "{{count}} Wiedergabeliste",
"playlistWithCount_other": "{{count}} Wiedergabelisten",
"playlist_one": "Wiedergabeliste",
"playlist_other": "Wiedergabelisten",
"artist_one": "Interpret",
"artist_other": "Interpreten",
"folderWithCount_one": "{{count}} Verzeichnis",
"folderWithCount_other": "{{count}} Verzeichnisse",
"albumArtist_one": "Albuminterpret",
"albumArtist_other": "Albuminterpreten",
"track_one": "Track",
"track_other": "Tracks",
"albumArtistCount_one": "{{count}} Albuminterpret",
"albumArtistCount_other": "{{count}} Albuminterpreten",
"albumWithCount_one": "{{count}} Album",
"albumWithCount_other": "{{count}} Alben",
"favorite_one": "Favorit",
"favorite_other": "Favoriten",
"artistWithCount_one": "{{count}} Interpret",
"artistWithCount_other": "{{count}} Interpreten",
"folder_one": "Verzeichnis",
"folder_other": "Verzeichnisse",
"album_one": "Album",
"album_other": "Alben",
"genreWithCount_one": "{{count}} Genre",
"genreWithCount_other": "{{count}} Genres",
"trackWithCount_one": "{{count}} Track",
"trackWithCount_other": "{{count}} Tracks",
"smartPlaylist": "Smart $t(entity.playlist_one)",
"play_one": "{{count}} Wiedergabe",
"play_other": "{{count}} Wiedergaben",
"song_one": "Lied",
"song_other": "Lieder"
},
"table": {
"config": {
"view": {
"table": "Tabelle",
"card": "Karte",
"poster": "Poster"
},
"general": {
"tableColumns": "Tabellenspalten",
"gap": "$t(common.gap)",
"size": "$t(common.size)",
"displayType": "Anzeigestil"
},
"label": {
"dateAdded": "Hinzugefügt am",
"lastPlayed": "zuletzt gespielt",
"rowIndex": "Reihenindex",
"trackNumber": "Tracknummer",
"biography": "$t(common.biography)",
"bitrate": "$t(common.bitrate)",
"albumArtist": "$t(entity.albumArtist_one)",
"artist": "$t(entity.artist_one)",
"favorite": "$t(common.favorite)",
"actions": "$t(common.action_other)",
"genre": "$t(entity.genre_one)",
"album": "$t(entity.album_one)",
"size": "$t(common.size)",
"bpm": "$t(common.bpm)",
"titleCombined": "$t(common.title) (kombiniert)",
"channels": "$t(common.channel_other)",
"duration": "$t(common.duration)",
"note": "$t(common.note)",
"owner": "$t(common.owner)",
"path": "$t(common.path)",
"rating": "$t(common.rating)",
"releaseDate": "Veröffentlichungsdatum",
"title": "$t(common.title)",
"year": "$t(common.year)"
}
},
"column": {
"releaseYear": "Jahr",
"biography": "Biografie",
"releaseDate": "Veröffentlichungsdatum",
"bitrate": "Bitrate",
"title": "Titel",
"path": "Pfad",
"album": "Album",
"albumArtist": "Albenkünstler",
"bpm": "bpm",
"favorite": "Favorit",
"lastPlayed": "zuletzt gespielt",
"rating": "Bewertung",
"albumCount": "$t(entity.album_other)",
"artist": "$t(entity.artist_one)",
"channels": "$t(common.channel_other)",
"comment": "Kommentar",
"dateAdded": "hinzugefügt am",
"playCount": "Abgespielt",
"discNumber": "Disk",
"genre": "$t(entity.genre_one)",
"songCount": "$t(entity.track_other)",
"trackNumber": "Nr.",
"size": "$t(common.size)"
}
},
"page": {
"fullscreenPlayer": {
"config": {
"showLyricMatch": "Textübereinstimmung anzeigen",
"dynamicBackground": "Dynamischer Hintergrund",
"synchronized": "synchronisiert",
"followCurrentLyric": "dem Songtext folgen",
"opacity": "Deckkraft",
"lyricSize": "Songtext-Größe",
"showLyricProvider": "Songtext-Anbieter anzeigen",
"unsynchronized": "nicht synchronisiert",
"lyricAlignment": "Songtext-Ausrichtung",
"useImageAspectRatio": "Bildseitenverhältnis verwenden",
"lyricGap": "Songtext-Lücke",
"dynamicIsImage": "Hintergrundbild aktivieren",
"dynamicImageBlur": "Größe der Bildunschärfe",
"lyricOffset": "Zeitversetzung des Liedtexts (ms)"
},
"upNext": "als nächstes",
"lyrics": "Songtexte",
"related": "Ähnliche",
"noLyrics": "Keine Liedtexte gefunden",
"visualizer": "visualizer"
},
"appMenu": {
"selectServer": "Server auswählen",
"version": "Version {{version}}",
"manageServers": "Server verwalten",
"expandSidebar": "Seitenleiste erweitern",
"collapseSidebar": "Seitenleiste einklappen",
"openBrowserDevtools": "Browser-Entwicklungswerkzeuge öffnen",
"goBack": "Gehe zurück",
"goForward": "Gehe vorwärts",
"settings": "$t(common.setting_other)",
"quit": "$t(common.quit)"
},
"home": {
"mostPlayed": "Meistgespielt",
"newlyAdded": "Neu hinzugefügte Veröffentlichungen",
"explore": "Entdecke deine Bibliothek",
"recentlyPlayed": "Kürzlich gespielt",
"title": "$t(common.home)"
},
"albumDetail": {
"moreFromArtist": "Mehr von diesem $t(entity.artist_one)",
"moreFromGeneric": "Mehr von {{item}}",
"released": "erschienen"
},
"globalSearch": {
"commands": {
"serverCommands": "Serverbefehle",
"goToPage": "Gehe zur Seite",
"searchFor": "Nach {{query}} suchen"
},
"title": "Befehle"
},
"contextMenu": {
"numberSelected": "{{count}} ausgewählt",
"addToPlaylist": "$t(action.addToPlaylist)",
"addToFavorites": "$t(action.addToFavorites)",
"setRating": "$t(action.setRating)",
"moveToTop": "$t(action.moveToTop)",
"deletePlaylist": "$t(action.deletePlaylist)",
"moveToBottom": "$t(action.moveToBottom)",
"createPlaylist": "$t(action.createPlaylist)",
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
"removeFromFavorites": "$t(action.removeFromFavorites)",
"addNext": "$t(player.addNext)",
"deselectAll": "$t(action.deselectAll)",
"addLast": "$t(player.addLast)",
"addFavorite": "$t(action.addToFavorites)",
"play": "$t(player.play)",
"removeFromQueue": "$t(action.removeFromQueue)",
"playShuffled": "$t(player.shuffle)",
"download": "Download",
"playSimilarSongs": "$t(player.playSimilarSongs)",
"moveToNext": "$t(action.moveToNext)"
},
"sidebar": {
"nowPlaying": "läuft gerade",
"playlists": "$t(entity.playlist_other)",
"search": "$t(common.search)",
"tracks": "$t(entity.track_other)",
"albums": "$t(entity.album_other)",
"genres": "$t(entity.genre_other)",
"folders": "$t(entity.folder_other)",
"settings": "$t(common.setting_other)",
"home": "$t(common.home)",
"artists": "$t(entity.artist_other)",
"albumArtists": "$t(entity.albumArtist_other)",
"shared": "$t(entity.playlist_other) geteilt",
"myLibrary": "meine bibliothek"
},
"setting": {
"playbackTab": "Wiedergabe",
"generalTab": "Allgemein",
"hotkeysTab": "Kurzbefehle",
"windowTab": "Fenster",
"advanced": "Erweitert"
},
"albumArtistList": {
"title": "$t(entity.albumArtist_other)"
},
"genreList": {
"title": "$t(entity.genre_other)",
"showTracks": "$t(entity.genre_one) $t(entity.track_other) anzeigen",
"showAlbums": "$t(entity.genre_one) $t(entity.album_other) anzeigen"
},
"trackList": {
"title": "$t(entity.track_other)",
"artistTracks": "Tracks von {{artist}}",
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
},
"playlistList": {
"title": "$t(entity.playlist_other)"
},
"albumList": {
"title": "$t(entity.album_other)",
"artistAlbums": "Alben von {{artist}}",
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
},
"albumArtistDetail": {
"about": "Über {{artist}}",
"appearsOn": "erscheint auf",
"recentReleases": "Kürzliche Veröffentlichungen",
"viewDiscography": "Diskographie ansehen",
"viewAllTracks": "Alle $t(entity.track_other) ansehen",
"topSongsFrom": "Toplieder von {{title}}",
"viewAll": "Alles ansehen",
"topSongs": "Toplieder"
},
"manageServers": {
"title": "Servers verwalten",
"editServerDetailsTooltip": "Serverdetails editieren",
"removeServer": "Server entfernen",
"url": "URL",
"serverDetails": "Serverdetails",
"username": "Benutzername"
},
"itemDetail": {
"copyPath": "Pfad in Zwischenablage kopieren",
"copiedPath": "Pfad erfolgreich kopiert",
"openFile": "Track im Dateiexplorer anzeigen"
}
},
"player": {
"next": "Nächster",
"addNext": "Als Nächstes einfügen",
"play": "Abspielen",
"muted": "Stummgeschaltet",
"addLast": "Ans Ende einzufügen",
"mute": "Stumm",
"playRandom": "Zufällige Wiedergabe",
"previous": "Vorheriger",
"favorite": "Favorit",
"playbackFetchNoResults": "Keine Lieder gefunden",
"playbackFetchInProgress": "Lieder werden geladen…",
"playbackSpeed": "Wiedergabegeschwindigkeit",
"playbackFetchCancel": "Das dauert eine Weile. Schließen Sie die Benachrichtigung, um den Vorgang abzubrechen",
"queue_clear": "Bereinige Warteschlange",
"repeat_all": "Alle wiederholen",
"repeat": "Wiederholen",
"queue_remove": "Ausgewählte entfernen",
"shuffle": "Zufallswiedergabe",
"repeat_off": "Nicht wiederholen",
"queue_moveToTop": "Ausgewählte nach unten verschieben",
"queue_moveToBottom": "Ausgewählte nach oben verschieben",
"shuffle_off": "Zufallswiedergabe deaktiviert",
"stop": "Stopp",
"toggleFullscreenPlayer": "Vollbildmodus",
"skip_back": "Zurückspulen",
"pause": "Pause",
"unfavorite": "Aus Favoriten entfernen",
"skip_forward": "Vorspulen",
"skip": "Überspringen",
"playSimilarSongs": "Ähnliche Lieder abspielen",
"viewQueue": "Warteschlange anzeigen"
},
"setting": {
"audioDevice_description": "Wählen Sie das Audiogerät aus, das für die Wiedergabe verwendet werden soll (nur Webplayer)",
"audioExclusiveMode": "Audio-Exklusivmodus",
"audioDevice": "Audiogerät",
"accentColor": "Akzentfarbe",
"accentColor_description": "Legt die Akzentfarbe für die Anwendung fest",
"applicationHotkeys": "Tastenkombinationen der Anwendung",
"applicationHotkeys_description": "Konfiguriere die Tastenkombinationen der Anwendung. Setze einen Haken, um die Tastenkombination global zu verwenden (nur für die Desktopanwendung)",
"crossfadeStyle_description": "Wählen Sie Art des Überblendungseffekts aus, welcher für den Audioplayer verwendet werden soll",
"discordIdleStatus_description": "Wenn aktiviert wird der Rich Presence Status aktiviert, wenn sich der Player im Leerlauf befindet",
"crossfadeStyle": "Art der Überblendung",
"audioExclusiveMode_description": "Aktivieren Sie den exklusiven Ausgabemodus. In diesem Modus ist das System normalerweise gesperrt und nur MPV ist in der Lage Audio ausgeben",
"disableLibraryUpdateOnStartup": "Beim Start nicht nach neuen Versionen suchen",
"discordApplicationId_description": "Die Application-ID für {{discord}} Rich Presence (Standard: {{defaultId}})",
"audioPlayer_description": "Wählen Sie den Audioplayer aus, der für die Wiedergabe verwendet werden soll",
"disableAutomaticUpdates": "Automatische Updates deaktivieren",
"crossfadeDuration_description": "Legt die Dauer der Überblendung fest",
"customFontPath": "Benutzerdefinierter Pfad für Schriftarten",
"crossfadeDuration": "Dauer der Überblendung",
"discordIdleStatus": "Rich Presence Status im Leerlauf",
"audioPlayer": "Audio-Player",
"discordApplicationId": "{{discord}} Anwendungs ID",
"customFontPath_description": "Legt den Pfad zur benutzerdefinierten Schriftart fest, welche für die Anwendung verwendet werden soll",
"discordRichPresence": "{{discord}} Rich Presence",
"remotePort_description": "Legt den Port des Fernsteuerungsserver fest",
"hotkey_skipBackward": "rückwärts springen",
"replayGainMode_description": "Passen Sie die Lautstärkeverstärkung entsprechend den in den Dateimetadaten gespeicherten {{ReplayGain}}-Werten an",
"volumeWheelStep_description": "die Lautstärke, die beim Scrollen des Mausrads auf dem Lautstärkeregler geändert werden soll",
"theme_description": "Legt das für die Anwendung zu verwendende Thema fest",
"hotkey_playbackPause": "Pause",
"sidebarCollapsedNavigation_description": "Zeigt die Navigation in der minimierten Seitenleiste an oder verbirgt sie",
"hotkey_volumeUp": "Lauter",
"skipDuration": "Sprungdauer",
"showSkipButtons": "Schaltflächen zum Überspringen anzeigen",
"playButtonBehavior_optionPlay": "$t(player.play)",
"minimumScrobblePercentage": "minimale Scrobble-Dauer (Prozentsatz)",
"lyricFetch": "Songtexte aus dem Internet abrufen",
"scrobble": "Scrobbeln",
"skipDuration_description": "Legt die zu überspringende Dauer fest, wenn die Überspringen-Schaltflächen in der Player-Leiste verwendet werden",
"mpvExecutablePath_description": "Legt den Pfad zur ausführbaren MPV-Datei fest. Wenn leer gelassen, wird der Standard-Pfad verwendet",
"replayGainClipping_description": "Verhindern Sie durch {{ReplayGain}} verursachtes Clipping, indem Sie die Verstärkung automatisch verringern",
"replayGainPreamp": "{{ReplayGain}} Vorverstärker (db)",
"hotkey_favoriteCurrentSong": "Favorit $t(common.currentSong)",
"sampleRate": "Abtastrate",
"sidePlayQueueStyle_optionAttached": "angefügt",
"sidebarConfiguration": "Seitenleistenkonfiguration",
"sampleRate_description": "Wähle die auszugebende Abtastrate aus, wenn sich die ausgewählte Abtastfrequenz von der des aktuellen Mediums unterscheidet. Ein Wert unter 8000 wird die Standard-Frequenz verwenden",
"replayGainMode_optionNone": "$t(common.none)",
"hotkey_zoomIn": "Hineinzoomen",
"scrobble_description": "Scrobble wird auf Ihrem Medienserver abgespielt",
"hotkey_browserForward": "Browser vor",
"hotkey_playbackPlayPause": "Wiedergabe / Pause",
"hotkey_rate1": "Bewertung 1 Stern",
"hotkey_skipForward": "vorwärts springen",
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
"minimizeToTray_description": "Minimieren der Anwendung in die Taskleiste",
"hotkey_playbackPlay": "Wiedergabe",
"hotkey_volumeDown": "Leiser",
"hotkey_unfavoritePreviousSong": "$t(common.previousSong) aus Favoriten entfernen",
"globalMediaHotkeys": "Globale Medien Kurzbefehle",
"hotkey_globalSearch": "Globale Suche",
"gaplessAudio_description": "Legt die lückenlose Audioeinstellung für MPV fest",
"remoteUsername_description": "Legt den Benutzernamen für den Fernsteuerungsserver fest. Wenn sowohl Benutzername als auch Passwort leer sind, wird die Authentifizierung deaktiviert",
"hotkey_favoritePreviousSong": "Favorit $t(common.previousSong)",
"replayGainMode_optionAlbum": "$t(entity.album_one)",
"lyricOffset": "Liedtext-Versatz (ms)",
"themeDark_description": "Legt das dunkle Design fest, das für die Anwendung verwendet werden soll",
"remotePassword": "Passwort des Fernsteuerungsservers",
"lyricFetchProvider": "Anbieter, von denen Liedtexte abgerufen werden können",
"language_description": "Legt die Sprache für die Anwendung fest $t(common.restartRequired)",
"playbackStyle_optionCrossFade": "Überblendung",
"hotkey_rate3": "Bewertung 3 Sterne",
"mpvExtraParameters": "mpv Parameter",
"replayGainMode_optionTrack": "$t(entity.track_one)",
"themeLight_description": "Legt das helle Thema fest, das für die Anwendung verwendet werden soll",
"hotkey_toggleFullScreenPlayer": "Vollbildmodus umschalten",
"hotkey_localSearch": "Suche auf Seite",
"hotkey_toggleQueue": "Warteschlange umschalten",
"remotePassword_description": "Legt das Passwort für den Fernsteuerungsserver fest. Diese Anmeldeinformationen werden standardmäßig unsicher übertragen, daher sollten Sie ein eindeutiges Passwort verwenden, das Ihnen egal ist",
"hotkey_rate5": "Bewertung 5 Sterne",
"hotkey_playbackPrevious": "Vorheriger Track",
"showSkipButtons_description": "Ein- oder Ausblenden der Überspringen-Schaltflächen in der Player-Leiste",
"language": "Sprache",
"playbackStyle": "Wiedergabestil",
"hotkey_toggleShuffle": "Zufallswiedergabe umschalten",
"theme": "Thema",
"playbackStyle_description": "Wählen Sie den Wiedergabestil aus, der für den Audioplayer verwendet werden soll",
"mpvExecutablePath": "Pfad der ausführbaren MPV-Datei",
"hotkey_rate2": "Bewertung 2 Sterne",
"playButtonBehavior_description": "Legt das Standardverhalten der Wiedergabeschaltfläche fest, wenn Songs zur Warteschlange hinzugefügt werden",
"minimumScrobblePercentage_description": "Der Mindestprozentsatz des Songs, der gespielt werden muss, bevor er gescrobbelt wird",
"hotkey_rate4": "Bewertung 4 Sterne",
"showSkipButton_description": "Ein- oder Ausblenden der Überspringen-Schaltflächen in der Player-Leiste",
"savePlayQueue": "Wiedergabe-Warteschlange speichern",
"minimumScrobbleSeconds_description": "die Mindestdauer in Sekunden, die das Lied abspielen muss, bevor es gescrobbelt wird",
"skipPlaylistPage_description": "Gehen Sie beim Navigieren zu einer Wiedergabeliste zur Titelseite der Wiedergabeliste und nicht zur Standardseite",
"fontType_description": "Die integrierte Schriftart wählt eine der von Feishin bereitgestellten Schriftarten aus. Mit der Systemschriftart können Sie jede von Ihrem Betriebssystem bereitgestellte Schriftart auswählen. Benutzerdefiniert erlaubt es eine eigene Schriftart bereitzustellen",
"playButtonBehavior": "Verhalten der Wiedergabetaste",
"volumeWheelStep": "Lautstärkeregler Stufe",
"sidebarPlaylistList_description": "Ein- oder Ausblenden der Playlisten-Liste in der Seitenleiste",
"sidePlayQueueStyle_description": "Legt den Stil der Wiedergabewarteliste in der Seitenleiste fest",
"replayGainMode": "{{ReplayGain}} Modus",
"playbackStyle_optionNormal": "Normal",
"windowBarStyle": "Fensterleistenstil",
"replayGainFallback_description": "Verstärkung in db, die angewendet werden soll, wenn die Datei keine {{ReplayGain}}-Tags hat",
"replayGainPreamp_description": "Passen Sie die Vorverstärkerverstärkung an, die auf die {{ReplayGain}}-Werte angewendet wird",
"hotkey_toggleRepeat": "Wiederholung umschalten",
"lyricOffset_description": "Versetzen Sie den Liedtext um die angegebene Anzahl von Millisekunden",
"sidebarConfiguration_description": "Wählen Sie die Elemente und die Reihenfolge aus, in der sie in der Seitenleiste angezeigt werden",
"remotePort": "Port des Fernsteuerungsserver",
"hotkey_playbackNext": "Nächster Track",
"useSystemTheme_description": "der systemdefinierten Hell- oder Dunkelpräferenz folgen",
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
"lyricFetch_description": "Songtexte aus verschiedenen Internetquellen abrufen",
"lyricFetchProvider_description": "Wählen Sie die Anbieter aus, von denen Sie Liedtexte abrufen möchten. Die Reihenfolge der Anbieter ist die Reihenfolge, in der sie abgefragt werden",
"globalMediaHotkeys_description": "Aktivieren oder deaktivieren Sie die Verwendung der Medien-Kurzbefehle Ihres Systems zur Steuerung der Wiedergabe",
"hotkey_zoomOut": "Herauszoomen",
"hotkey_unfavoriteCurrentSong": "$t(common.currentSong) aus Favoriten entfernen",
"hotkey_rate0": "Bewertung löschen",
"hotkey_volumeMute": "Lautstärke stumm",
"remoteUsername": "Benutzername des Fernsteuerungsserver",
"hotkey_browserBack": "Browser zurück",
"showSkipButton": "Schaltflächen zum Überspringen anzeigen",
"sidebarPlaylistList": "Seitenleiste Playlisten-Liste",
"minimizeToTray": "Zur Taskleiste minimieren",
"skipPlaylistPage": "Playlisten-Seite überspringen",
"themeDark": "Thema (dunkel)",
"sidebarCollapsedNavigation": "Navigation in der Seitenleiste (komprimiert)",
"gaplessAudio_optionWeak": "schwach (empfohlen)",
"minimumScrobbleSeconds": "minimales Scrobble (Sekunden)",
"hotkey_playbackStop": "Stoppen",
"savePlayQueue_description": "Speichert Wiedergabewarteschlange, wenn die Anwendung geschlossen wird, und stellt sie wieder her, wenn die Anwendung geöffnet wird",
"useSystemTheme": "Systemdesign verwenden",
"enableRemote_description": "Aktiviere den eingebauten Webserver, um die Anwendung von anderen Geräten aus zu steuern",
"fontType_optionSystem": "Systemschriftart",
"discordUpdateInterval": "{{discord}} Rich Presence Aktualisierungsintervall",
"fontType_optionBuiltIn": "Eingebaute Schriftart",
"gaplessAudio": "Unterbrechungsfreie Wiedergabe",
"exitToTray_description": "Die Anwendung beim Schließen in die Taskleiste minimieren",
"followLyric_description": "Der Songtext scrollt automatisch mir der Wiedergabe",
"discordUpdateInterval_description": "Zeit in Sekunden zwischen den Statusupdates (Minimum: 15s)",
"fontType_optionCustom": "Benutzerdefinierte Schriftart",
"font": "Schriftart",
"exitToTray": "In die Taskleiste minimieren",
"enableRemote": "Server für Fernzugriff aktivieren",
"floatingQueueArea": "Beim Darüberfahren schwebende Warteschlange anzeigen",
"fontType": "Schriftartenquelle",
"followLyric": "Songtext synchronisieren",
"floatingQueueArea_description": "Zeige ein Icon auf der rechten Seite, um beim Darüberfahren die Wartschlange anzuzeigen",
"font_description": "Wähle die Schriftart für die Anwendung",
"themeLight": "Thema (hell)",
"sidePlayQueueStyle_optionDetached": "lösgelöst",
"windowBarStyle_description": "Wähle den Stil der Windows-Leiste",
"hotkey_toggleCurrentSongFavorite": "$t(common.currentSong) zu Favoriten hinzufügen",
"clearQueryCache_description": "\"Weiches\" Zurücksetzen. Dies wird Playlisten, Musik-Metadaten und gespeicherte Liedtexte zurücksetzen, Zugangsinformationen und zwischengespeicherte Bilder werden behalten",
"discordRichPresence_description": "Zeige deinen Wiedergabe-Status in {{discord}} als rich presence an. Angezeigte Bilder sind: {{icon}}, {{playing}}, und {{paused}}",
"clearCache": "Browser-Zwischenspeicher löschen",
"clearQueryCache": "feishins Zwischenspeicher leeren",
"clearCache_description": "Hartes Zurücksetzen. Neben feishins Zwischenspeicher wird auch der des Browsers gelöscht (Bilder und andere Daten). Zugangsinformationen und Einstellungen werden behalten",
"sidePlayQueueStyle": "Wiedergabelistenstil in der Seitenleiste",
"zoom_description": "Setzt den Zoom (in %) für das Programm",
"zoom": "Zoom",
"albumBackground": "Album Hintergrund",
"customCss": "Benutzerdefiniert css",
"homeConfiguration": "Startseite Konfiguration",
"lastfmApiKey": "{{lastfm}} API-Schlüssel",
"lastfmApiKey_description": "Der API-Schlüssel für {{lastfm}}. wird für benötigt",
"discordListening": "Status als hört zu anzeigen",
"discordListening_description": "Status als hört zu statt als spielt anzeigen",
"lastfm": "zeige last.fm links",
"lastfm_description": "zeige links zu last.fm auf dem Künstler/Album-Seiten",
"musicbrainz": "Zeig musicbrainz links",
"customCssEnable": "aktiviere Benutzerdefinierte css",
"albumBackground_description": "fügt ein Hintergrundbild für die Albumseiten hinzu, welche das Albumcover zeigen",
"albumBackgroundBlur": "Größe der Album-Bildunschärfe",
"albumBackgroundBlur_description": "passt die Stärke der Unschärfe an, welche auf das Hintergrundbild des Albums angewandt wird",
"clearCacheSuccess": "Cache erfolgreich geleert",
"contextMenu": "Kontextmenü-Einstellungen (Rechtsklick)",
"customCssEnable_description": "ermöglicht das Schreiben benutzerdefinierten CSS.",
"doubleClickBehavior": "bei Doppelklick alle gesuchten Tracks zur Warteschlange hinzufügen"
}
}
+828 -7
View File
@@ -1,9 +1,830 @@
{
"player": {
"next": "player.next",
"play": "player.play",
"prev": "player.prev",
"seekBack": "player.seekBack",
"seekForward": "player.seekForward"
}
"action": {
"addToFavorites": "add to $t(entity.favorite_other)",
"addToPlaylist": "add to $t(entity.playlist_one)",
"clearQueue": "clear queue",
"createPlaylist": "create $t(entity.playlist_one)",
"deletePlaylist": "delete $t(entity.playlist_one)",
"deselectAll": "deselect all",
"editPlaylist": "edit $t(entity.playlist_one)",
"goToPage": "go to page",
"moveToNext": "move to next",
"moveToBottom": "move to bottom",
"moveToTop": "move to top",
"refresh": "$t(common.refresh)",
"removeFromFavorites": "remove from $t(entity.favorite_other)",
"removeFromPlaylist": "remove from $t(entity.playlist_one)",
"removeFromQueue": "remove from queue",
"setRating": "set rating",
"toggleSmartPlaylistEditor": "toggle $t(entity.smartPlaylist) editor",
"viewPlaylists": "view $t(entity.playlist_other)",
"openIn": {
"lastfm": "Open in Last.fm",
"musicbrainz": "Open in MusicBrainz"
}
},
"common": {
"action_one": "action",
"action_other": "actions",
"add": "add",
"additionalParticipants": "additional participants",
"newVersion": "a new version has been installed ({{version}})",
"viewReleaseNotes": "view release notes",
"albumGain": "album gain",
"albumPeak": "album peak",
"areYouSure": "are you sure?",
"ascending": "ascending",
"backward": "backward",
"biography": "biography",
"bitDepth": "bit depth",
"bitrate": "bitrate",
"bpm": "bpm",
"cancel": "cancel",
"center": "center",
"channel_one": "channel",
"channel_other": "channels",
"clear": "clear",
"close": "close",
"codec": "codec",
"collapse": "collapse",
"comingSoon": "coming soon…",
"configure": "configure",
"confirm": "confirm",
"create": "create",
"currentSong": "current $t(entity.track_one)",
"decrease": "decrease",
"delete": "delete",
"descending": "descending",
"description": "description",
"disable": "disable",
"disc": "disc",
"dismiss": "dismiss",
"duration": "duration",
"edit": "edit",
"enable": "enable",
"expand": "expand",
"favorite": "favorite",
"filter_one": "filter",
"filter_other": "filters",
"filters": "filters",
"forceRestartRequired": "restart to apply changes… close the notification to restart",
"forward": "forward",
"gap": "gap",
"home": "home",
"increase": "increase",
"left": "left",
"limit": "limit",
"manage": "manage",
"maximize": "maximize",
"menu": "menu",
"minimize": "minimize",
"modified": "modified",
"mbid": "MusicBrainz ID",
"name": "name",
"no": "no",
"none": "none",
"noResultsFromQuery": "the query returned no results",
"note": "note",
"ok": "ok",
"owner": "owner",
"path": "path",
"playerMustBePaused": "player must be paused",
"preview": "preview",
"previousSong": "previous $t(entity.track_one)",
"quit": "quit",
"random": "random",
"rating": "rating",
"refresh": "refresh",
"reload": "reload",
"reset": "reset",
"resetToDefault": "reset to default",
"restartRequired": "restart required",
"right": "right",
"sampleRate": "sample rate",
"save": "save",
"saveAndReplace": "save and replace",
"saveAs": "save as",
"search": "search",
"setting": "setting",
"setting_one": "setting",
"setting_other": "settings",
"share": "share",
"size": "size",
"sortOrder": "order",
"tags": "tags",
"title": "title",
"trackNumber": "track",
"trackGain": "track gain",
"trackPeak": "track peak",
"translation": "translation",
"unknown": "unknown",
"version": "version",
"year": "year",
"yes": "yes"
},
"entity": {
"album_one": "album",
"album_other": "albums",
"albumArtist_one": "album artist",
"albumArtist_other": "album artists",
"albumArtistCount_one": "{{count}} album artist",
"albumArtistCount_other": "{{count}} album artists",
"albumWithCount_one": "{{count}} album",
"albumWithCount_other": "{{count}} albums",
"artist_one": "artist",
"artist_other": "artists",
"artistWithCount_one": "{{count}} artist",
"artistWithCount_other": "{{count}} artists",
"favorite_one": "favorite",
"favorite_other": "favorites",
"folder_one": "folder",
"folder_other": "folders",
"folderWithCount_one": "{{count}} folder",
"folderWithCount_other": "{{count}} folders",
"genre_one": "genre",
"genre_other": "genres",
"genreWithCount_one": "{{count}} genre",
"genreWithCount_other": "{{count}} genres",
"playlist_one": "playlist",
"playlist_other": "playlists",
"play_one": "{{count}} play",
"play_other": "{{count}} plays",
"playlistWithCount_one": "{{count}} playlist",
"playlistWithCount_other": "{{count}} playlists",
"smartPlaylist": "smart $t(entity.playlist_one)",
"track_one": "track",
"track_other": "tracks",
"song_one": "song",
"song_other": "songs",
"trackWithCount_one": "{{count}} track",
"trackWithCount_other": "{{count}} tracks"
},
"error": {
"apiRouteError": "unable to route request",
"audioDeviceFetchError": "an error occurred when trying to get audio devices",
"authenticationFailed": "authentication failed",
"badAlbum": "you are seeing this page because this song is not part of an album. you are most likely seeing this issue if you have a song at the top level of your music folder. jellyfin only groups tracks if they are in a folder.",
"badValue": "invalid option \"{{value}}\". this value no longer exists",
"credentialsRequired": "credentials required",
"endpointNotImplementedError": "endpoint {{endpoint}} is not implemented for {{serverType}}",
"genericError": "an error occurred",
"invalidServer": "invalid server",
"localFontAccessDenied": "access denied to local fonts",
"loginRateError": "too many login attempts, please try again in a few seconds",
"mpvRequired": "MPV required",
"networkError": "a network error occurred",
"notificationDenied": "permissions for notifications were denied. this setting has no effect",
"openError": "could not open file",
"playbackError": "an error occurred when trying to play the media",
"remoteDisableError": "an error occurred when trying to $t(common.disable) the remote server",
"remoteEnableError": "an error occurred when trying to $t(common.enable) the remote server",
"remotePortError": "an error occurred when trying to set the remote server port",
"remotePortWarning": "restart the server to apply the new port",
"serverNotSelectedError": "no server selected",
"serverRequired": "server required",
"sessionExpiredError": "your session has expired",
"systemFontError": "an error occurred when trying to get system fonts"
},
"filter": {
"album": "$t(entity.album_one)",
"albumArtist": "$t(entity.albumArtist_one)",
"albumCount": "$t(entity.album_other) count",
"artist": "$t(entity.artist_one)",
"biography": "biography",
"bitrate": "bitrate",
"bpm": "bpm",
"channels": "$t(common.channel_other)",
"comment": "comment",
"communityRating": "community rating",
"criticRating": "critic rating",
"dateAdded": "date added",
"disc": "disc",
"duration": "duration",
"favorited": "favorited",
"fromYear": "from year",
"genre": "$t(entity.genre_one)",
"id": "id",
"isCompilation": "is compilation",
"isFavorited": "is favorited",
"isPublic": "is public",
"isRated": "is rated",
"isRecentlyPlayed": "is recently played",
"lastPlayed": "last played",
"mostPlayed": "most played",
"name": "name",
"note": "note",
"owner": "$t(common.owner)",
"path": "path",
"playCount": "play count",
"random": "random",
"rating": "rating",
"recentlyAdded": "recently added",
"recentlyPlayed": "recently played",
"recentlyUpdated": "recently updated",
"releaseDate": "release date",
"releaseYear": "release year",
"search": "search",
"songCount": "song count",
"title": "title",
"toYear": "to year",
"trackNumber": "track"
},
"form": {
"addServer": {
"error_savePassword": "an error occurred when trying to save the password",
"ignoreCors": "ignore cors ($t(common.restartRequired))",
"ignoreSsl": "ignore ssl ($t(common.restartRequired))",
"input_legacyAuthentication": "enable legacy authentication",
"input_name": "server name",
"input_password": "password",
"input_preferInstantMix": "prefer instant mix",
"input_preferInstantMixDescription": "only use instant mix to get similar songs. useful if you have plugins that modify this behavior",
"input_savePassword": "save password",
"input_url": "url",
"input_username": "username",
"success": "server added successfully",
"title": "add server"
},
"addToPlaylist": {
"input_playlists": "$t(entity.playlist_other)",
"input_skipDuplicates": "skip duplicates",
"success": "added $t(entity.trackWithCount, {\"count\": {{message}} }) to $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
"title": "add to $t(entity.playlist_one)"
},
"createPlaylist": {
"input_description": "$t(common.description)",
"input_name": "$t(common.name)",
"input_owner": "$t(common.owner)",
"input_public": "public",
"success": "$t(entity.playlist_one) created successfully",
"title": "create $t(entity.playlist_one)"
},
"deletePlaylist": {
"input_confirm": "type the name of the $t(entity.playlist_one) to confirm",
"success": "$t(entity.playlist_one) deleted successfully",
"title": "delete $t(entity.playlist_one)"
},
"editPlaylist": {
"publicJellyfinNote": "Jellyfin for some reason does not expose whether a playlist is public or not. If you wish for this to remain public, please have the following input selected",
"success": "$t(entity.playlist_one) updated successfully",
"title": "edit $t(entity.playlist_one)"
},
"lyricSearch": {
"input_artist": "$t(entity.artist_one)",
"input_name": "$t(common.name)",
"title": "lyric search"
},
"queryEditor": {
"title": "query editor",
"input_optionMatchAll": "match all",
"input_optionMatchAny": "match any"
},
"shareItem": {
"allowDownloading": "allow downloading",
"description": "description",
"setExpiration": "set expiration",
"success": "share link copied to clipboard (or click here to open)",
"expireInvalid": "expiration must be in the future",
"createFailed": "failed to create share (is sharing enabled?)"
},
"updateServer": {
"success": "server updated successfully",
"title": "update server"
},
"privateMode": {
"enabled": "private mode enabled, playback status is now hidden from external integrations",
"disabled": "private mode disabled, playback status is now visible to enabled external integrations",
"title": "private mode"
}
},
"page": {
"albumArtistDetail": {
"about": "About {{artist}}",
"appearsOn": "appears on",
"recentReleases": "recent releases",
"viewDiscography": "view discography",
"relatedArtists": "related $t(entity.artist_other)",
"topSongs": "top songs",
"topSongsFrom": "top songs from {{title}}",
"viewAll": "view all",
"viewAllTracks": "view all $t(entity.track_other)"
},
"albumArtistList": {
"title": "$t(entity.albumArtist_other)"
},
"albumDetail": {
"moreFromArtist": "more from this $t(entity.artist_one)",
"moreFromGeneric": "more from {{item}}",
"released": "released"
},
"albumList": {
"artistAlbums": "albums by {{artist}}",
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
"title": "$t(entity.album_other)"
},
"appMenu": {
"collapseSidebar": "collapse sidebar",
"expandSidebar": "expand sidebar",
"goBack": "go back",
"goForward": "go forward",
"manageServers": "manage servers",
"privateModeOff": "turn off private mode",
"privateModeOn": "turn on private mode",
"openBrowserDevtools": "open browser devtools",
"quit": "$t(common.quit)",
"selectServer": "select server",
"settings": "$t(common.setting_other)",
"version": "version {{version}}"
},
"manageServers": {
"title": "manage servers",
"serverDetails": "server details",
"url": "URL",
"username": "username",
"editServerDetailsTooltip": "edit server details",
"removeServer": "remove server"
},
"contextMenu": {
"addFavorite": "$t(action.addToFavorites)",
"addLast": "$t(player.addLast)",
"addNext": "$t(player.addNext)",
"addToFavorites": "$t(action.addToFavorites)",
"addToPlaylist": "$t(action.addToPlaylist)",
"createPlaylist": "$t(action.createPlaylist)",
"deletePlaylist": "$t(action.deletePlaylist)",
"deselectAll": "$t(action.deselectAll)",
"download": "download",
"moveToNext": "$t(action.moveToNext)",
"moveToBottom": "$t(action.moveToBottom)",
"moveToTop": "$t(action.moveToTop)",
"numberSelected": "{{count}} selected",
"play": "$t(player.play)",
"playSimilarSongs": "$t(player.playSimilarSongs)",
"removeFromFavorites": "$t(action.removeFromFavorites)",
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
"removeFromQueue": "$t(action.removeFromQueue)",
"setRating": "$t(action.setRating)",
"playShuffled": "$t(player.shuffle)",
"shareItem": "share item",
"goToAlbum": "go to $t(entity.album_one)",
"goToAlbumArtist": "go to $t(entity.albumArtist_one)",
"showDetails": "get info"
},
"fullscreenPlayer": {
"config": {
"dynamicBackground": "dynamic background",
"dynamicImageBlur": "image blur size",
"dynamicIsImage": "enable background image",
"followCurrentLyric": "follow current lyric",
"lyricAlignment": "lyric alignment",
"lyricOffset": "lyrics offset (ms)",
"lyricGap": "lyric gap",
"lyricSize": "lyric size",
"opacity": "opacity",
"showLyricMatch": "show lyric match",
"showLyricProvider": "show lyric provider",
"synchronized": "synchronized",
"unsynchronized": "unsynchronized",
"useImageAspectRatio": "use image aspect ratio"
},
"lyrics": "lyrics",
"related": "related",
"upNext": "up next",
"visualizer": "visualizer",
"noLyrics": "no lyrics found"
},
"genreList": {
"showAlbums": "show $t(entity.genre_one) $t(entity.album_other)",
"showTracks": "show $t(entity.genre_one) $t(entity.track_other)",
"title": "$t(entity.genre_other)"
},
"globalSearch": {
"commands": {
"goToPage": "go to page",
"searchFor": "search for {{query}}",
"serverCommands": "server commands"
},
"title": "commands"
},
"home": {
"explore": "explore from your library",
"mostPlayed": "most played",
"newlyAdded": "newly added releases",
"recentlyPlayed": "recently played",
"recentlyReleased": "recently released",
"title": "$t(common.home)"
},
"itemDetail": {
"copyPath": "copy path to clipboard",
"copiedPath": "path copied successfully",
"openFile": "show track in file manager"
},
"playlist": {
"reorder": "reordering only enabled when sorting by id"
},
"playlistList": {
"title": "$t(entity.playlist_other)"
},
"setting": {
"advanced": "advanced",
"generalTab": "general",
"hotkeysTab": "hotkeys",
"playbackTab": "playback",
"windowTab": "window"
},
"sidebar": {
"albumArtists": "$t(entity.albumArtist_other)",
"albums": "$t(entity.album_other)",
"artists": "$t(entity.artist_other)",
"folders": "$t(entity.folder_other)",
"genres": "$t(entity.genre_other)",
"home": "$t(common.home)",
"myLibrary": "my library",
"nowPlaying": "now playing",
"playlists": "$t(entity.playlist_other)",
"search": "$t(common.search)",
"settings": "$t(common.setting_other)",
"shared": "shared $t(entity.playlist_other)",
"tracks": "$t(entity.track_other)"
},
"trackList": {
"artistTracks": "tracks by {{artist}}",
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
"title": "$t(entity.track_other)"
}
},
"player": {
"addLast": "add last",
"addNext": "add next",
"favorite": "favorite",
"mute": "mute",
"muted": "muted",
"next": "next",
"play": "play",
"playbackFetchCancel": "this is taking a while… close the notification to cancel",
"playbackFetchInProgress": "loading songs…",
"playbackFetchNoResults": "no songs found",
"playbackSpeed": "playback speed",
"playRandom": "play random",
"playSimilarSongs": "play similar songs",
"previous": "previous",
"queue_clear": "clear queue",
"queue_moveToBottom": "move selected to top",
"queue_moveToTop": "move selected to bottom",
"queue_remove": "remove selected",
"repeat": "repeat",
"repeat_all": "repeat all",
"repeat_off": "repeat disabled",
"repeat_one": "repeat one",
"repeat_other": "",
"shuffle": "play shuffled",
"shuffle_off": "shuffle disabled",
"skip": "skip",
"skip_back": "skip backwards",
"skip_forward": "skip forwards",
"stop": "stop",
"toggleFullscreenPlayer": "toggle fullscreen player",
"unfavorite": "unfavorite",
"pause": "pause",
"viewQueue": "view queue"
},
"setting": {
"accentColor": "accent color",
"accentColor_description": "sets the accent color for the application",
"albumBackground": "album background image",
"albumBackground_description": "adds a background image for album pages containing the album art",
"albumBackgroundBlur": "album background image blur size",
"albumBackgroundBlur_description": "adjusts the amount of blur applied to the album background image",
"applicationHotkeys": "application hotkeys",
"applicationHotkeys_description": "configure application hotkeys. toggle the checkbox to set as a global hotkey (desktop only)",
"artistBackground": "artist background image",
"artistBackground_description": "adds a background image for artist pages containing the artist art",
"artistBackgroundBlur": "artist background image blur size",
"artistBackgroundBlur_description": "adjusts the amount of blur applied to the artist background image",
"artistConfiguration": "album artist page configuration",
"artistConfiguration_description": "configure what items are shown, and in what order, on the album artist page",
"audioDevice": "audio device",
"audioDevice_description": "select the audio device to use for playback (web player only)",
"audioExclusiveMode": "audio exclusive mode",
"audioExclusiveMode_description": "enable exclusive output mode. In this mode, the system is usually locked out, and only mpv will be able to output audio",
"audioPlayer": "audio player",
"audioPlayer_description": "select the audio player to use for playback",
"buttonSize": "player bar button size",
"buttonSize_description": "the size of the player bar buttons",
"clearCache": "clear browser cache",
"clearCache_description": "a 'hard clear' of feishin. in addition to clearing feishin's cache, empty the browser cache (saved images and other assets). server credentials and settings are preserved",
"clearQueryCache": "clear feishin cache",
"clearQueryCache_description": "a 'soft clear' of feishin. this will refresh playlists, track metadata, and reset saved lyrics. settings, server credentials and cached images are preserved",
"clearCacheSuccess": "cache cleared successfully",
"contextMenu": "context menu (right click) configuration",
"contextMenu_description": "allows you to hide items that are shown in the menu when you right click on an item. items that are unchecked will be hidden",
"crossfadeDuration": "crossfade duration",
"crossfadeDuration_description": "sets the duration of the crossfade effect",
"crossfadeStyle": "crossfade style",
"crossfadeStyle_description": "select the crossfade style to use for the audio player",
"customCssEnable": "enable custom css",
"customCssEnable_description": "allow for writing custom css.",
"customCssNotice": "Warning: while there is some sanitization (disallowing url() and content:), using custom CSS can still pose risks by changing the interface.",
"customCss": "custom css",
"customCss_description": "custom css content. Note: content and remote urls are disallowed properties. A preview of your content is shown below. Additional fields you didn't set are present due to sanitization.",
"customFontPath": "custom font path",
"customFontPath_description": "sets the path to the custom font to use for the application",
"disableAutomaticUpdates": "disable automatic updates",
"releaseChannel_optionLatest": "latest",
"releaseChannel_optionBeta": "beta",
"releaseChannel": "release channel",
"releaseChannel_description": "choose between stable releases or beta releases for automatic updates",
"disableLibraryUpdateOnStartup": "disable checking for new versions on startup",
"discordApplicationId": "{{discord}} application id",
"discordApplicationId_description": "the application id for {{discord}} rich presence (defaults to {{defaultId}})",
"discordPausedStatus": "show rich presence when paused",
"discordPausedStatus_description": "when enabled, status will show when player is paused",
"discordIdleStatus": "show rich presence idle status",
"discordIdleStatus_description": "when enabled, update status while player is idle",
"discordListening": "show status as listening",
"discordListening_description": "show status as listening instead of playing",
"discordRichPresence": "{{discord}} rich presence",
"discordRichPresence_description": "enable playback status in {{discord}} rich presence. Image keys are: {{icon}}, {{playing}}, and {{paused}}",
"discordServeImage": "serve {{discord}} images from server",
"discordServeImage_description": "share cover art for {{discord}} rich presence from server itself, only available for jellyfin and navidrome. {{discord}} uses a bot to fetch images, so your server must be reachable from the public internet.",
"discordUpdateInterval": "{{discord}} rich presence update interval",
"discordUpdateInterval_description": "the time in seconds between each update (minimum 15 seconds)",
"discordDisplayType": "{{discord}} presence display type",
"discordDisplayType_description": "changes what you are listening to in your status",
"discordDisplayType_songname": "song name",
"discordDisplayType_artistname": "artist name(s)",
"discordLinkType": "{{discord}} presence links",
"discordLinkType_description": "adds external links to {{lastfm}} or {{musicbrainz}} to the song and artist fields in {{discord}} rich presence. {{musicbrainz}} is the most accurate but requires tags and doesn't provide artist links while {{lastfm}} should always provide a link. makes no extra network requests",
"discordLinkType_none": "$t(common.none)",
"discordLinkType_mbz_lastfm": "{{musicbrainz}} with {{lastfm}} fallback",
"doubleClickBehavior": "queue all searched tracks when double clicking",
"doubleClickBehavior_description": "if true, all matching tracks in a track search will be queued. otherwise, only the clicked one will be queued",
"enableRemote": "enable remote control server",
"enableRemote_description": "enables the remote control server to allow other devices to control the application",
"externalLinks": "show external links",
"externalLinks_description": "enables showing external links (Last.fm, MusicBrainz) on artist/album pages",
"exitToTray": "exit to tray",
"exitToTray_description": "exit the application to the system tray",
"floatingQueueArea": "show floating queue hover area",
"floatingQueueArea_description": "display a hover icon on the right side of the screen to view the play queue",
"followLyric": "follow current lyric",
"followLyric_description": "scroll the lyric to the current playing position",
"preferLocalLyrics": "prefer local lyrics",
"preferLocalLyrics_description": "prefer local lyrics over remote lyrics when available",
"font": "font",
"font_description": "sets the font to use for the application",
"fontType": "font type",
"fontType_description": "built-in font selects one of the fonts provided by Feishin. system font allows you to select any font provided by your operating system. custom allows you to provide your own font",
"fontType_optionBuiltIn": "built-in font",
"fontType_optionCustom": "custom font",
"fontType_optionSystem": "system font",
"gaplessAudio": "gapless audio",
"gaplessAudio_description": "sets the gapless audio setting for mpv",
"gaplessAudio_optionWeak": "weak (recommended)",
"genreBehavior": "genre page default behavior",
"genreBehavior_description": "determines whether clicking on a genre opens by default in track or album list",
"globalMediaHotkeys": "global media hotkeys",
"globalMediaHotkeys_description": "enable or disable the usage of your system media hotkeys to control playback",
"homeConfiguration": "home page configuration",
"homeConfiguration_description": "configure what items are shown, and in what order, on the home page",
"homeFeature": "home featured carousel",
"homeFeature_description": "controls whether to show the large featured carousel on the home page",
"hotkey_browserBack": "browser back",
"hotkey_browserForward": "browser forward",
"hotkey_favoriteCurrentSong": "favorite $t(common.currentSong)",
"hotkey_favoritePreviousSong": "favorite $t(common.previousSong)",
"hotkey_globalSearch": "global search",
"hotkey_localSearch": "in-page search",
"hotkey_navigateHome": "navigate to home",
"hotkey_playbackNext": "next track",
"hotkey_playbackPause": "pause",
"hotkey_playbackPlay": "play",
"hotkey_playbackPlayPause": "play / pause",
"hotkey_playbackPrevious": "previous track",
"hotkey_playbackStop": "stop",
"hotkey_rate0": "rating clear",
"hotkey_rate1": "rating 1 star",
"hotkey_rate2": "rating 2 stars",
"hotkey_rate3": "rating 3 stars",
"hotkey_rate4": "rating 4 stars",
"hotkey_rate5": "rating 5 stars",
"hotkey_skipBackward": "skip backward",
"hotkey_skipForward": "skip forward",
"hotkey_toggleCurrentSongFavorite": "toggle $t(common.currentSong) favorite",
"hotkey_toggleFullScreenPlayer": "toggle full screen player",
"hotkey_togglePreviousSongFavorite": "toggle $t(common.previousSong) favorite",
"hotkey_toggleQueue": "toggle queue",
"hotkey_toggleRepeat": "toggle repeat",
"hotkey_toggleShuffle": "toggle shuffle",
"hotkey_unfavoriteCurrentSong": "unfavorite $t(common.currentSong)",
"hotkey_unfavoritePreviousSong": "unfavorite $t(common.previousSong)",
"hotkey_volumeDown": "volume down",
"hotkey_volumeMute": "volume mute",
"hotkey_volumeUp": "volume up",
"hotkey_zoomIn": "zoom in",
"hotkey_zoomOut": "zoom out",
"imageAspectRatio": "use native cover art aspect ratio",
"imageAspectRatio_description": "if enabled, cover art will be shown using their native aspect ratio. for art that is not 1:1, the remaining space will be empty",
"language": "language",
"language_description": "sets the language for the application ($t(common.restartRequired))",
"lastfm": "show last.fm links",
"lastfm_description": "show links to last.fm on artist/album pages",
"lastfmApiKey": "{{lastfm}} API key",
"lastfmApiKey_description": "the API key for {{lastfm}}. required for cover art",
"lyricFetch": "fetch lyrics from the internet",
"lyricFetch_description": "fetch lyrics from various internet sources",
"lyricFetchProvider": "providers to fetch lyrics from",
"lyricFetchProvider_description": "select the providers to fetch lyrics from. the order of the providers is the order in which they will be queried",
"lyricOffset": "lyric offset (ms)",
"lyricOffset_description": "offset the lyric by the specified amount of milliseconds",
"notify": "enable song notifications",
"notify_description": "show notifications when changing the current song",
"minimizeToTray": "minimize to tray",
"minimizeToTray_description": "minimize the application to the system tray",
"minimumScrobblePercentage": "minimum scrobble duration (percentage)",
"minimumScrobblePercentage_description": "the minimum percentage of the song that must be played before it is scrobbled",
"minimumScrobbleSeconds": "minimum scrobble (seconds)",
"minimumScrobbleSeconds_description": "the minimum duration in seconds of the song that must be played before it is scrobbled",
"mpvExecutablePath": "mpv executable path",
"mpvExecutablePath_description": "sets the path to the mpv executable. if left empty, the default path will be used",
"mpvExtraParameters": "mpv parameters",
"mpvExtraParameters_help": "one per line",
"musicbrainz": "show musicbrainz links",
"musicbrainz_description": "show links to musicbrainz on artist/album pages, where mbid exists",
"neteaseTranslation": "Enable NetEase translations",
"neteaseTranslation_description": "When enabled, fetches and displays translated lyrics from NetEase if available.",
"passwordStore": "passwords/secret store",
"passwordStore_description": "what password/secret store to use. change this if you are having issues storing passwords.",
"playbackStyle": "playback style",
"playbackStyle_description": "select the playback style to use for the audio player",
"playbackStyle_optionCrossFade": "crossfade",
"playbackStyle_optionNormal": "normal",
"playButtonBehavior": "play button behavior",
"playButtonBehavior_description": "sets the default behavior of the play button when adding songs to the queue",
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
"playButtonBehavior_optionPlay": "$t(player.play)",
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
"playerAlbumArtResolution": "player album art resolution",
"playerAlbumArtResolution_description": "the resolution for the large player's album art preview. larger makes it look more crisp, but may slow loading down. defaults to 0, meaning auto",
"playerbarOpenDrawer": "playerbar fullscreen toggle",
"playerbarOpenDrawer_description": "allows clicking of the playerbar to open the full screen player",
"remotePassword": "remote control server password",
"remotePassword_description": "sets the password for the remote control server. These credentials are by default transferred insecurely, so you should use a unique password that you do not care about",
"remotePort": "remote control server port",
"remotePort_description": "sets the port for the remote control server",
"remoteUsername": "remote control server username",
"remoteUsername_description": "sets the username for the remote control server. if both username and password are empty, authentication will be disabled",
"replayGainClipping": "{{ReplayGain}} clipping",
"replayGainClipping_description": "Prevent clipping caused by {{ReplayGain}} by automatically lowering the gain",
"replayGainFallback": "{{ReplayGain}} fallback",
"replayGainFallback_description": "gain in db to apply if the file has no {{ReplayGain}} tags",
"replayGainMode": "{{ReplayGain}} mode",
"replayGainMode_description": "adjust volume gain according to {{ReplayGain}} values stored in the file metadata",
"replayGainMode_optionAlbum": "$t(entity.album_one)",
"replayGainMode_optionNone": "$t(common.none)",
"replayGainMode_optionTrack": "$t(entity.track_one)",
"replayGainPreamp": "{{ReplayGain}} preamp (dB)",
"replayGainPreamp_description": "adjust the preamp gain applied to the {{ReplayGain}} values",
"sampleRate": "sample rate",
"sampleRate_description": "select the output sample rate to be used if the sample frequency selected is different from that of the current media. a value less than 8000 will use the default frequency",
"savePlayQueue": "save play queue",
"savePlayQueue_description": "save the play queue when the application is closed and restore it when the application is opened",
"scrobble": "scrobble",
"scrobble_description": "scrobble plays to your media server",
"showSkipButton": "show skip buttons",
"showSkipButton_description": "show or hide the skip buttons on the player bar",
"showSkipButtons": "show skip buttons",
"showSkipButtons_description": "show or hide the skip buttons on the player bar",
"sidebarCollapsedNavigation": "sidebar (collapsed) navigation",
"sidebarCollapsedNavigation_description": "show or hide the navigation in the collapsed sidebar",
"sidebarConfiguration": "sidebar configuration",
"sidebarConfiguration_description": "select the items and order in which they appear in the sidebar",
"sidebarPlaylistList": "sidebar playlist list",
"sidebarPlaylistList_description": "show or hide the playlist list in the sidebar",
"sidePlayQueueStyle": "side play queue style",
"sidePlayQueueStyle_description": "sets the style of the side play queue",
"sidePlayQueueStyle_optionAttached": "attached",
"sidePlayQueueStyle_optionDetached": "detached",
"skipDuration": "skip duration",
"skipDuration_description": "sets the duration to skip when using the skip buttons on the player bar",
"skipPlaylistPage": "skip playlist page",
"skipPlaylistPage_description": "when navigating to a playlist, go to the playlist song list page instead of the default page",
"startMinimized": "start minimized",
"startMinimized_description": "start the application in system tray",
"preventSleepOnPlayback": "prevent sleep on playback",
"preventSleepOnPlayback_description": "prevent the display from sleeping while music is playing",
"theme": "theme",
"theme_description": "sets the theme to use for the application",
"themeDark": "theme (dark)",
"themeDark_description": "sets the dark theme to use for the application",
"themeLight": "theme (light)",
"themeLight_description": "sets the light theme to use for the application",
"transcodeNote": "takes effect after 1 (web) - 2 (mpv) songs",
"transcode": "enable transcoding",
"transcode_description": "enables transcoding to different formats",
"transcodeBitrate": "bitrate to transcode",
"transcodeBitrate_description": "selects the bitrate to transcode. 0 means let the server pick",
"transcodeFormat": "format to transcode",
"transcodeFormat_description": "selects the format to transcode. leave empty to let the server decide",
"translationApiProvider": "translation api provider",
"translationApiProvider_description": "api provider for translation",
"translationApiKey": "translation api key",
"translationApiKey_description": "api key for translation (Support global service endpoint only)",
"translationTargetLanguage": "translation target language",
"translationTargetLanguage_description": "target language for translation",
"trayEnabled": "show tray",
"trayEnabled_description": "show/hide tray icon/menu. if disabled, also disables minimize/exit to tray",
"useSystemTheme": "use system theme",
"useSystemTheme_description": "follow the system-defined light or dark preference",
"volumeWheelStep": "volume wheel step",
"volumeWheelStep_description": "the amount of volume to change when scrolling the mouse wheel on the volume slider",
"volumeWidth": "volume slider width",
"volumeWidth_description": "the width of the volume slider",
"webAudio": "use web audio",
"webAudio_description": "use web audio. this enables advanced features like replaygain. disable if you experience otherwise",
"preservePitch": "preserve pitch",
"preservePitch_description": "preserves pitch when modifying playback speed",
"windowBarStyle": "window bar style",
"windowBarStyle_description": "select the style of the window bar",
"zoom": "zoom percentage",
"zoom_description": "sets the zoom percentage for the application"
},
"table": {
"column": {
"album": "album",
"albumArtist": "album artist",
"albumCount": "$t(entity.album_other)",
"artist": "$t(entity.artist_one)",
"biography": "biography",
"bitrate": "bitrate",
"bpm": "bpm",
"channels": "$t(common.channel_other)",
"codec": "$t(common.codec)",
"comment": "comment",
"dateAdded": "date added",
"discNumber": "disc",
"favorite": "favorite",
"genre": "$t(entity.genre_one)",
"lastPlayed": "last played",
"path": "path",
"playCount": "plays",
"rating": "rating",
"releaseDate": "release date",
"releaseYear": "year",
"size": "$t(common.size)",
"songCount": "$t(entity.track_other)",
"title": "title",
"trackNumber": "track"
},
"config": {
"general": {
"autoFitColumns": "auto fit columns",
"followCurrentSong": "follow current song",
"displayType": "display type",
"gap": "$t(common.gap)",
"itemGap": "item gap (px)",
"itemSize": "item size (px)",
"size": "$t(common.size)",
"tableColumns": "table columns"
},
"label": {
"actions": "$t(common.action_other)",
"album": "$t(entity.album_one)",
"albumArtist": "$t(entity.albumArtist_one)",
"artist": "$t(entity.artist_one)",
"biography": "$t(common.biography)",
"bitrate": "$t(common.bitrate)",
"bpm": "$t(common.bpm)",
"channels": "$t(common.channel_other)",
"codec": "$t(common.codec)",
"dateAdded": "date added",
"discNumber": "disc number",
"duration": "$t(common.duration)",
"favorite": "$t(common.favorite)",
"genre": "$t(entity.genre_one)",
"lastPlayed": "last played",
"note": "$t(common.note)",
"owner": "$t(common.owner)",
"path": "$t(common.path)",
"playCount": "play count",
"rating": "$t(common.rating)",
"releaseDate": "release date",
"rowIndex": "row index",
"size": "$t(common.size)",
"songCount": "$t(entity.track_other)",
"title": "$t(common.title)",
"titleCombined": "$t(common.title) (combined)",
"trackNumber": "track number",
"year": "$t(common.year)"
},
"view": {
"card": "card",
"grid": "grid",
"list": "list",
"poster": "poster",
"table": "table"
}
}
}
}
+831
View File
@@ -0,0 +1,831 @@
{
"player": {
"repeat_all": "repetir todo",
"stop": "detener",
"repeat": "repetir",
"queue_remove": "eliminar seleccionado",
"playRandom": "reproducción aleatoria",
"skip": "saltar",
"previous": "anterior",
"toggleFullscreenPlayer": "activar el reproductor a pantalla completa",
"skip_back": "retroceder",
"favorite": "favorito",
"next": "siguiente",
"shuffle": "Reproducir aleatoriamente",
"playbackFetchNoResults": "ninguna canción encontrada",
"playbackFetchInProgress": "cargando canciones…",
"addNext": "añadir siguiente",
"playbackSpeed": "velocidad de reproducción",
"playbackFetchCancel": "esto está tomando un tiempo... cierra la notificación para cancelar",
"play": "reproducir",
"repeat_off": "repetir desactivado",
"queue_clear": "limpiar cola",
"muted": "silenciado",
"unfavorite": "no favorita",
"queue_moveToTop": "mover seleccionado al final",
"queue_moveToBottom": "mover seleccionado al principio",
"shuffle_off": "mezclar desactivado",
"addLast": "añadir último",
"mute": "silencio",
"skip_forward": "saltar hacia delante",
"pause": "pausa",
"playSimilarSongs": "Reproducir canciones similares",
"viewQueue": "ver cola"
},
"setting": {
"crossfadeStyle_description": "selecciona el estilo de crossfade a usar por el reproductor de audio",
"remotePort_description": "establece el puerto para el control remoto del servidor",
"hotkey_skipBackward": "retroceder",
"replayGainMode_description": "ajusta el volumen de ganancia acorde a los valores de {{ReplayGain}} almacenados en los metadatos del archivo",
"audioDevice_description": "selecciona el dispositivo de audio a usar durante la reproducción (solo reproductor web)",
"theme_description": "establece el tema a usar por la aplicación",
"hotkey_playbackPause": "pausa",
"replayGainFallback": "{{ReplayGain}} alternativa",
"sidebarCollapsedNavigation_description": "mostrar u ocultar la navegación en la barra lateral contraída",
"hotkey_volumeUp": "subir volumen",
"skipDuration": "duración de salto",
"discordIdleStatus_description": "cuando se activa, actualiza el estado mientras el reproductor está inactivo",
"showSkipButtons": "mostrar botones de saltar",
"playButtonBehavior_optionPlay": "$t(player.play)",
"minimumScrobblePercentage": "mínima duración de scrobble (porcentaje)",
"lyricFetch": "busca letras en Internet",
"scrobble": "scrobble",
"skipDuration_description": "establece la duración a saltar cuando se usa los botones de saltar en la barra del reproductor",
"enableRemote_description": "activa el control remoto del servidor para permitir a otros dispositivos controlar la aplicación",
"fontType_optionSystem": "fuente del sistema",
"mpvExecutablePath_description": "establece la ruta del ejecutable mpv. si se deja vacío, se usará la ruta predeterminada",
"replayGainClipping_description": "previene el recorte causado por {{ReplayGain}} bajando automáticamente la ganancia",
"replayGainPreamp": "preamplificador (dB) de {{ReplayGain}}",
"hotkey_favoriteCurrentSong": "$t(common.currentSong) favorita",
"sampleRate": "ratio de muestreo",
"crossfadeStyle": "estilo de crossfade",
"sidePlayQueueStyle_optionAttached": "acoplada",
"sidebarConfiguration": "configuración de la barra lateral",
"sampleRate_description": "selecciona el ratio de muestreo de salida a ser usado si la frecuencia de muestreo seleccionada es diferente de la del medio actual. un valor inferior a 8000 usará la frecuencia predeterminada",
"replayGainMode_optionNone": "$t(common.none)",
"replayGainClipping": "recortar {{ReplayGain}}",
"hotkey_zoomIn": "ampliar",
"scrobble_description": "hace scrobble de las reproducciones en tu servidor de medios",
"audioExclusiveMode_description": "activa el modo de audio exclusivo. En este modo, el sistema es normalmente bloqueado, y solo se permitirá mpv en la salida de audio",
"discordUpdateInterval": "intervalo de actualización del estado de actividad de {{discord}}",
"themeLight": "tema (claro)",
"fontType_optionBuiltIn": "fuente incorporada",
"hotkey_playbackPlayPause": "play / pausa",
"hotkey_rate1": "calificar con 1 estrella",
"hotkey_skipForward": "saltar hacia delante",
"disableLibraryUpdateOnStartup": "desactiva la comprobación de nuevas versiones al inicio",
"discordApplicationId_description": "el id de aplicación para el estado de actividad de {{discord}} (por defecto es {{defaultId}})",
"sidePlayQueueStyle": "estilo de la cola de reproducción lateral",
"gaplessAudio": "audio sin pausas",
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
"minimizeToTray_description": "minimiza la aplicación a la bandeja del sistema",
"hotkey_playbackPlay": "reproducir",
"hotkey_togglePreviousSongFavorite": "cambia $t(common.previousSong) a favorito",
"hotkey_volumeDown": "bajar volumen",
"hotkey_unfavoritePreviousSong": "$t(common.previousSong) no favorita",
"audioPlayer_description": "selecciona el reproductor de audio a usar durante la reproducción",
"globalMediaHotkeys": "teclas de acceso rápido globales a medios",
"hotkey_globalSearch": "búsqueda global",
"gaplessAudio_description": "establece la configuración de audio sin pausas para mpv",
"remoteUsername_description": "establece el nombre de usuario para el control remoto del servidor. si el usuario y la contraseña están vacíos, la autenticación será deshabilitada",
"disableAutomaticUpdates": "desactiva las actualizaciones automáticas",
"exitToTray_description": "sale de la aplicación a la bandeja del sistema",
"followLyric_description": "desplaza la letra a la posición de reproducción actual",
"hotkey_favoritePreviousSong": "$t(common.previousSong) favorita",
"replayGainMode_optionAlbum": "$t(entity.album_one)",
"lyricOffset": "desfase de letra (ms)",
"discordUpdateInterval_description": "el tiempo en segundos entre cada actualización (mínimo 15 segundos)",
"fontType_optionCustom": "fuente personalizada",
"themeDark_description": "establece el tema oscuro a usar por la aplicación",
"audioExclusiveMode": "modo de audio exclusivo",
"remotePassword": "contraseña del control remoto del servidor",
"lyricFetchProvider": "proveedores para buscar letras",
"language_description": "establece el idioma de la aplicación ($t(common.restartRequired))",
"playbackStyle_optionCrossFade": "crossfade",
"hotkey_rate3": "calificar con 3 estrellas",
"font": "fuente",
"mpvExtraParameters": "parámetros de mpv",
"replayGainMode_optionTrack": "$t(entity.track_one)",
"themeLight_description": "establece el tema claro a usar por la aplicación",
"hotkey_toggleFullScreenPlayer": "cambia el reproductor a pantalla completa",
"hotkey_localSearch": "búsqueda en la página",
"hotkey_toggleQueue": "cambia la cola",
"remotePassword_description": "establece la contraseña para el control remoto del servidor. Esas credenciales son transferidas de forma insegura por defecto, por lo que deberías usar una contraseña única para que no tengas nada de lo que preocuparte",
"hotkey_rate5": "calificar con 5 estrellas",
"hotkey_playbackPrevious": "pista anterior",
"showSkipButtons_description": "muestra o esconde los botones de saltar en la barra del reproductor",
"crossfadeDuration_description": "establece la duración del efecto de crossfade",
"language": "idioma",
"playbackStyle": "estilo de reproducción",
"hotkey_toggleShuffle": "alterna aleatorio",
"theme": "tema",
"playbackStyle_description": "selecciona el estilo de reproducción a usar por el reproductor de audio",
"discordRichPresence_description": "activa el estado de reproducción en el estado de actividad de {{discord}}. Las teclas de imagen son: {{icon}}, {{playing}}, y {{paused}}",
"mpvExecutablePath": "ruta del ejecutable mpv",
"audioDevice": "dispositivo de audio",
"hotkey_rate2": "calificar con 2 estrellas",
"playButtonBehavior_description": "establece el comportamiento por defecto del botón de reproducción cuando se añaden canciones a la cola",
"minimumScrobblePercentage_description": "el porcentaje mínimo de la canción que debe ser reproducido antes de hacer scrobble",
"exitToTray": "salir a la bandeja",
"hotkey_rate4": "calificar con 4 estrellas",
"enableRemote": "activar control remoto del servidor",
"showSkipButton_description": "muestra o esconde los botones de saltar en la barra del reproductor",
"savePlayQueue": "guardar cola de reproducción",
"minimumScrobbleSeconds_description": "la duración mínima en segundos de la canción que debe ser reproducida antes de hacer scrobble",
"fontType_description": "fuente incorporada selecciona una de las fuentes proporcionadas por Feishin. fuente del sistema te permite seleccionar cualquier fuente proporcionada por tu sistema operativo. personalizada te permite proporcionar tu propia fuente",
"playButtonBehavior": "comportamiento del botón de reproducción",
"sidebarPlaylistList_description": "muestra o esconde las listas de reproducción en la barra lateral",
"sidePlayQueueStyle_description": "establece el estilo de la cola de reproducción lateral",
"replayGainMode": "modo de {{ReplayGain}}",
"playbackStyle_optionNormal": "normal",
"floatingQueueArea": "mostrar área flotante de cola",
"replayGainFallback_description": "ganancia en db a aplicar si el archivo no tiene etiquetas de {{ReplayGain}}",
"replayGainPreamp_description": "ajusta la ganancia del preamplificador aplicada a los valores de {{ReplayGain}}",
"hotkey_toggleRepeat": "alterna repetir",
"lyricOffset_description": "desfasa la letra en la cantidad de milisegundos especificada",
"sidebarConfiguration_description": "selecciona los elementos y el orden en que aparecerán en la barra lateral",
"fontType": "tipo de fuente",
"remotePort": "puerto del control remoto del servidor",
"applicationHotkeys": "teclas de acceso rápido de la aplicación",
"hotkey_playbackNext": "pista siguiente",
"useSystemTheme_description": "sigue la preferencia clara u oscura definida por el sistema",
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
"lyricFetch_description": "busca letras en varias fuentes de Internet",
"lyricFetchProvider_description": "selecciona los proveedores para buscar letras. el orden de los proveedores es el orden en el que se consultarán",
"globalMediaHotkeys_description": "activa o desactiva el uso de las teclas de acceso rápidas del sistema a medios para controlar la reproducción",
"customFontPath": "ruta de fuente personalizada",
"followLyric": "seguir la letra actual",
"crossfadeDuration": "duración del crossfade",
"discordIdleStatus": "mostrar el estado inactivo en el estado de actividad",
"sidePlayQueueStyle_optionDetached": "separada",
"audioPlayer": "reproductor de audio",
"hotkey_zoomOut": "reducir",
"hotkey_unfavoriteCurrentSong": "$t(common.currentSong) no favorita",
"hotkey_rate0": "Limpiar calificación",
"discordApplicationId": "id de aplicación {{discord}}",
"applicationHotkeys_description": "configura las teclas de acceso rápido de la aplicación. marca la casilla para establecerlas como teclas de acceso rápido globales (solo escritorio)",
"floatingQueueArea_description": "muestra un icono flotante en el lado derecho de la pantalla para ver la cola de reproducción",
"hotkey_volumeMute": "silenciar volumen",
"hotkey_toggleCurrentSongFavorite": "$t(common.currentSong) cambia a favorita",
"remoteUsername": "nombre de usuario del control remoto del servidor",
"showSkipButton": "mostrar botones de saltar",
"sidebarPlaylistList": "listas de reproducción de la barra lateral",
"minimizeToTray": "minimizar a la bandeja",
"themeDark": "tema (oscuro)",
"sidebarCollapsedNavigation": "navegación de barra lateral (contraída)",
"customFontPath_description": "establece la ruta de la fuente personalizada a usar por la aplicación",
"gaplessAudio_optionWeak": "débil (recomendado)",
"minimumScrobbleSeconds": "mínimo scrobble (segundos)",
"hotkey_playbackStop": "parar",
"discordRichPresence": "estado de actividad de {{discord}}",
"font_description": "establece la fuente a usar por la aplicación",
"savePlayQueue_description": "guarda la cola de reproducción cuando se cierra la aplicación y la restaura cuando se abre",
"useSystemTheme": "usar tema del sistema",
"volumeWheelStep_description": "la cantidad de volumen a cambiar cuando se desplaza la rueda del ratón en el control deslizante del volumen",
"zoom": "porcentaje de zoom",
"zoom_description": "establece el porcentaje de zoom de la aplicación",
"volumeWheelStep": "paso de rueda del volumen",
"windowBarStyle": "estilo de la barra de ventana",
"windowBarStyle_description": "selecciona el estilo de la barra de ventana",
"skipPlaylistPage_description": "cuando se navega a una lista de reproducción, se va a la página de lista de canciones de la lista de reproducción en lugar de a la página por defecto",
"accentColor": "color de realce",
"accentColor_description": "establece el color de realce de la aplicación",
"skipPlaylistPage": "saltar página de lista de reproducción",
"hotkey_browserForward": "avance",
"hotkey_browserBack": "retroceso",
"clearCache": "Limpiar la caché del navegador",
"clearQueryCache": "Limpiar la caché de Feishin",
"clearQueryCache_description": "Una 'limpieza suave' de Feishin. Esto refrescará las listas de reproducción, los metadatos de las pistas y restablecerá las letras guardadas. Se mantienen los ajustes, credenciales del servidor y las imágenes en caché",
"buttonSize": "tamaño del botón de la barra de reproducción",
"clearCache_description": "Una 'limpieza fuerte' de Feishin. Para limpiar la caché de Feishin, vacía la caché del navegador (imágenes guardadas y otros elementos). Se mantienen las credenciales y ajustes del servidor",
"buttonSize_description": "el tamaño de los botones de la barra de reproducción",
"passwordStore_description": "qué método de almacenamiento de contraseñas/claves secretas utilizar. cambia esta opción si tienes problemas para guardar contraseñas.",
"startMinimized_description": "inicia la aplicación en la bandeja del sistema",
"startMinimized": "iniciar minimizado",
"passwordStore": "contraseñas/almacenamiento secreto",
"playerAlbumArtResolution_description": "la resolución para la vista previa de la carátula del álbum del reproductor grande. más grande hace que parezca más nítido, pero puede ralentizar la carga. El valor predeterminado es 0, lo que significa automático",
"playerAlbumArtResolution": "resolución de la carátula del álbum del reproductor",
"homeConfiguration": "Configuración de la página de inicio",
"mpvExtraParameters_help": "Uno por línea",
"genreBehavior": "Comportamiento predeterminado de la página de géneros",
"externalLinks_description": "Permite mostrar enlaces externos (Last.fm, MusicBrainz) en las páginas del artista/álbum",
"genreBehavior_description": "Determina si al hacer clic en un género se abre por defecto la lista de pistas o de álbumes",
"homeConfiguration_description": "Configura qué elementos son mostrados y en qué orden en la página de inicio",
"clearCacheSuccess": "Caché limpiada correctamente",
"externalLinks": "Mostrar enlaces externos",
"homeFeature": "Carrusel destacado de inicio",
"homeFeature_description": "Controla si se muestra el gran carrusel destacado en la página de inicio",
"imageAspectRatio_description": "Si está habilitado, la portada será mostrada usando su relación de aspecto nativa. Para arte que no es 1:1, el espacio restante estará vacío",
"imageAspectRatio": "Usar relación de aspecto nativa de portada",
"doubleClickBehavior": "poner en cola todas las pistas buscadas al hacer doble clic",
"doubleClickBehavior_description": "si está activado, se pondrán en cola todas las pistas que coincidan en una búsqueda de pistas. De lo contrario, solo se pondrán en cola las pistas seleccionadas",
"volumeWidth": "Ancho del deslizador de volumen",
"volumeWidth_description": "La anchura del deslizador de volumen",
"discordListening_description": "muestra el estado como Escuchando en lugar de Jugando a",
"discordListening": "Mostrar estado como escuchando",
"contextMenu": "Configuración del menú de contexto (clic derecho)",
"contextMenu_description": "Te permite esconder elementos que son mostrados en el menú cuando haces clic derecho en un elemento. Los elementos que no estén seleccionados serán escondidos",
"customCssEnable": "Habilitar CSS personalizado",
"customCssEnable_description": "Permite escribir CSS personalizado.",
"customCss": "CSS personalizado",
"customCssNotice": "Aviso: mientras hay alguna sanitización (rechazar url() y content:), usar CSS personalizado puede aún entrañar riesgos cambiando la interfaz.",
"customCss_description": "Content CSS personalizado. Nota: content y urls remotas son propiedades rechazadas. Una vista previa de tu content se muestra debajo. Las entradas adicionales que no estableciste están presentes debido a la sanitización.",
"webAudio": "usar audio web",
"webAudio_description": "Utilizar audio web. Esto habilita funciones avanzadas como Replaygain. Desactiva esta opción si tienes problemas",
"transcode": "activar la transcodificación",
"transcode_description": "permite la transcodificación a distintos formatos",
"transcodeBitrate": "tasa de bits a transcodificar",
"transcodeBitrate_description": "selecciona el bitrate a transcodificar. 0 significa dejar que el servidor elija",
"transcodeNote": "tendrá efecto después de 1 (web) - 2 (mpv) canciones",
"transcodeFormat": "formato a transcodificar",
"transcodeFormat_description": "selecciona el formato a transcodificar. dejar vacío para que el servidor decida",
"albumBackground": "imagen de fondo del álbum",
"albumBackground_description": "Añade una imagen de fondo a las páginas del álbum que contienen la carátula del álbum",
"albumBackgroundBlur": "Tamaño de desenfoque de la imagen de fondo del álbum",
"albumBackgroundBlur_description": "Ajusta la cantidad de desenfoque aplicado a la imagen de fondo del álbum",
"playerbarOpenDrawer": "Cambiar la barra del reproductor a pantalla completa",
"playerbarOpenDrawer_description": "Permite hacer clic en la barra del reproductor para abrir el reproductor a pantalla completa",
"artistConfiguration": "Configuración de la página del artista del álbum",
"artistConfiguration_description": "Configura qué elementos se muestran y en qué orden en la página del artista del álbum",
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
"trayEnabled": "Mostrar en el área de notificación",
"trayEnabled_description": "muestra/oculta el icono/menú del área de notificación. si está deshabilitado, también deshabilita minimizar/salir a la bandeja",
"translationApiProvider": "Proveedor de API de traducción",
"translationApiProvider_description": "Proveedor de API para traducción",
"translationApiKey": "clave api de traducción",
"translationApiKey_description": "Clave API para la traducción (solo para el punto final del servicio global)",
"translationTargetLanguage": "idioma final de la traducción",
"translationTargetLanguage_description": "lengua de destino de la traducción",
"lastfmApiKey_description": "la clave API para {{lastfm}}. Requerida para la portada",
"lastfmApiKey": "Clave API para {{lastfm}}",
"discordServeImage": "Servir imágenes de {{discord}} desde el servidor",
"discordServeImage_description": "Comparte el arte de la portada para el estado de actividad de {{discord}} desde el propio servidor, solo disponible para Jellyfin y Navidrome",
"lastfm": "Mostrar enlaces de last.fm",
"lastfm_description": "Muestra enlaces a last.fm en las páginas de artistas/álbumes",
"musicbrainz": "Mostrar enlaces de MusicBrainz",
"musicbrainz_description": "Muestra enlaces a MusicBrainz en las páginas de artistas/álbumes, donde exista mbid",
"neteaseTranslation": "Activar traducciones de NetEase",
"neteaseTranslation_description": "Cuando se habilita, busca y muestra letras traducidas desde NetEase si está disponible.",
"preferLocalLyrics_description": "Prefiere letras locales sobre letras remotas cuando esté disponible",
"preferLocalLyrics": "Preferir letras locales",
"discordPausedStatus": "Mostrar estado de actividad cuando esté en pausa",
"discordPausedStatus_description": "Cuando está activado, el estado mostrará cuando el reproductor esté en pausa",
"preservePitch": "Mantener el tono",
"preservePitch_description": "Mantiene el tono cuando se modifica la velocidad de reproducción",
"notify": "Activar notificaciones de canciones",
"notify_description": "Muestra notificaciones cuando se cambia la canción actual",
"discordDisplayType_songname": "Nombre de la canción",
"discordDisplayType_artistname": "Nombre(s) del artista(s)",
"discordDisplayType_description": "Cambia qué estás escuchando en tu estado",
"discordDisplayType": "Tipo de pantalla de actividad de {{discord}}",
"hotkey_navigateHome": "Navegar a inicio",
"preventSleepOnPlayback": "Evitar entrar en reposo durante la reproducción",
"preventSleepOnPlayback_description": "Evita que la pantalla entre en reposo mientras se está reproduciendo música"
},
"action": {
"editPlaylist": "editar $t(entity.playlist_one)",
"goToPage": "ir a la página",
"moveToTop": "mover al principio",
"clearQueue": "limpiar cola",
"addToFavorites": "añadir a $t(entity.favorite_other)",
"addToPlaylist": "añadir a $t(entity.playlist_one)",
"createPlaylist": "crear $t(entity.playlist_one)",
"removeFromPlaylist": "eliminar de $t(entity.playlist_one)",
"viewPlaylists": "ver $t(entity.playlist_other)",
"refresh": "$t(common.refresh)",
"deletePlaylist": "eliminar $t(entity.playlist_one)",
"removeFromQueue": "eliminar de la cola",
"deselectAll": "desmarcar todo",
"moveToBottom": "mover al final",
"setRating": "establecer calificación",
"toggleSmartPlaylistEditor": "cambiar editor $t(entity.smartPlaylist)",
"removeFromFavorites": "eliminar de $t(entity.favorite_other)",
"openIn": {
"lastfm": "Abrir en Last.fm",
"musicbrainz": "Abrir en MusicBrainz"
},
"moveToNext": "pasar al siguiente"
},
"common": {
"backward": "hacia atrás",
"increase": "aumentar",
"rating": "calificación",
"bpm": "lpm",
"refresh": "actualizar",
"unknown": "desconocido",
"areYouSure": "estás seguro?",
"edit": "editar",
"favorite": "favorito",
"left": "izquierda",
"save": "guardar",
"right": "derecha",
"currentSong": "$t(entity.track_one) actual",
"collapse": "contraer",
"trackNumber": "pista",
"descending": "descendiente",
"add": "añadir",
"ascending": "ascendente",
"dismiss": "descartar",
"year": "año",
"manage": "gestionar",
"limit": "limitar",
"minimize": "minimizar",
"modified": "modificado",
"duration": "duración",
"name": "nombre",
"maximize": "maximizar",
"decrease": "reducir",
"ok": "vale",
"description": "descripción",
"configure": "configurar",
"path": "ruta",
"center": "centrar",
"no": "no",
"owner": "propietario",
"enable": "activar",
"clear": "limpiar",
"forward": "hacia delante",
"delete": "eliminar",
"cancel": "cancelar",
"forceRestartRequired": "reiniciar para aplicar cambios... cerrar la notificación para reiniciar",
"setting": "configuración",
"version": "versión",
"title": "título",
"filters": "filtros",
"create": "crear",
"bitrate": "tasa de bits",
"saveAndReplace": "guardar y reemplazar",
"playerMustBePaused": "el reproductor debe pausarse",
"confirm": "confirmar",
"resetToDefault": "restablecer al valor predeterminado",
"home": "inicio",
"comingSoon": "próximamente…",
"reset": "restablecer",
"disable": "desactivar",
"sortOrder": "ordenar",
"none": "ninguno",
"menu": "menú",
"restartRequired": "reinicio requerido",
"previousSong": "anterior $t(entity.track_one)",
"noResultsFromQuery": "la petición no devolvió resultados",
"quit": "salir",
"expand": "expandir",
"search": "buscar",
"saveAs": "guardar como",
"disc": "disco",
"yes": "sí",
"random": "aleatorio",
"size": "tamaño",
"biography": "biografía",
"note": "nota",
"gap": "desfase",
"filter_one": "filtro",
"filter_many": "filtros",
"filter_other": "filtros",
"action_one": "acción",
"action_many": "acciones",
"action_other": "acciones",
"channel_one": "Canal",
"channel_many": "Canales",
"channel_other": "Canales",
"trackPeak": "pico de pista",
"albumPeak": "pico del álbum",
"albumGain": "Ganancia de álbum",
"mbid": "ID de MusicBrainz",
"codec": "Códec",
"close": "Cerrar",
"reload": "Recargar",
"share": "Compartir",
"trackGain": "Ganancia de pista",
"preview": "Vista previa",
"translation": "traducción",
"additionalParticipants": "Participantes adicionales",
"tags": "Etiquetas",
"newVersion": "Una nueva versión ha sido instalada ({{version}})",
"viewReleaseNotes": "Ver notas de lanzamiento",
"bitDepth": "Profundidad de bit",
"sampleRate": "Frecuencia de muestreo"
},
"error": {
"remotePortWarning": "reiniciar el servidor para aplicar el nuevo puerto",
"systemFontError": "un error ocurrió cuando se intentó obtener las fuentes del sistema",
"playbackError": "un error ocurrió cuando se intentó reproducir el medio",
"endpointNotImplementedError": "el punto final {{endpoint}} no está implementado para {{serverType}}",
"remotePortError": "un error ocurrió cuando se intentó establecer el puerto del servidor remoto",
"serverRequired": "servidor requerido",
"authenticationFailed": "autenticación fallida",
"apiRouteError": "no se puede encaminar la solicitud",
"genericError": "sucedió un error",
"credentialsRequired": "credenciales requeridas",
"sessionExpiredError": "tu sesión ha expirado",
"remoteEnableError": "un error ocurrió cuando se intentó $t(common.enable) el servidor remoto",
"localFontAccessDenied": "acceso denegado a las fuentes locales",
"serverNotSelectedError": "ningún servidor seleccionado",
"remoteDisableError": "un error ocurrió cuando se intentó $t(common.disable) el servidor remoto",
"mpvRequired": "MPV requerido",
"audioDeviceFetchError": "un error ocurrió cuando se intentó obtener los dispositivos de audio",
"invalidServer": "servidor inválido",
"loginRateError": "demasiados intentos de inicio de sesión, por favor inténtalo en unos segundos",
"badAlbum": "Estás viendo esta página porque esta canción no forma parte de un álbum. Este problema puede ocurrir si tienes una canción en el nivel superior de tu carpeta de música. Jellyfin solo agrupa pistas si están en una carpeta.",
"networkError": "Ocurrió un error de red",
"openError": "No se pudo abrir el archivo",
"badValue": "Opción inválida \"{{value}}\". Este valor ya no existe",
"notificationDenied": "Se denegaron los permisos para notificaciones. Esta configuración no tiene efecto"
},
"filter": {
"mostPlayed": "más reproducido",
"isCompilation": "es una compilación",
"recentlyPlayed": "recientemente reproducido",
"isRated": "es clasificado",
"title": "título",
"rating": "calificación",
"search": "buscar",
"bitrate": "tasa de bits",
"recentlyAdded": "recientemente añadido",
"note": "nota",
"name": "nombre",
"dateAdded": "fecha añadida",
"releaseDate": "fecha de lanzamiento",
"communityRating": "calificación de la comunidad",
"path": "ruta",
"favorited": "favoritos",
"albumArtist": "$t(entity.albumArtist_one)",
"isRecentlyPlayed": "reproducido recientemente",
"isFavorited": "es favorito",
"bpm": "lpm",
"releaseYear": "año de lanzamiento",
"disc": "disco",
"biography": "biografía",
"artist": "$t(entity.artist_one)",
"duration": "duración",
"random": "aleatorio",
"lastPlayed": "última reproducción",
"toYear": "hasta el año",
"fromYear": "desde el año",
"criticRating": "calificación de la crítica",
"trackNumber": "pista",
"comment": "comentarios",
"playCount": "número de reproducciones",
"recentlyUpdated": "actualizado recientemente",
"channels": "$t(common.channel_other)",
"owner": "$t(common.owner)",
"genre": "$t(entity.genre_one)",
"id": "id",
"songCount": "número de canción",
"isPublic": "es público",
"album": "$t(entity.album_one)",
"albumCount": "Contar $t(entity.album_other)"
},
"page": {
"sidebar": {
"nowPlaying": "en reproducción",
"playlists": "$t(entity.playlist_other)",
"search": "$t(common.search)",
"tracks": "$t(entity.track_other)",
"albums": "$t(entity.album_other)",
"genres": "$t(entity.genre_other)",
"folders": "$t(entity.folder_other)",
"settings": "$t(common.setting_other)",
"home": "$t(common.home)",
"artists": "$t(entity.artist_other)",
"albumArtists": "$t(entity.albumArtist_other)",
"shared": "compartido $t(entity.playlist_other)",
"myLibrary": "Mi biblioteca"
},
"appMenu": {
"selectServer": "seleccionar servidor",
"version": "versión {{version}}",
"settings": "$t(common.setting_other)",
"manageServers": "gestionar servidores",
"expandSidebar": "ampliar barra lateral",
"collapseSidebar": "contraer barra lateral",
"openBrowserDevtools": "abrir herramientas de desarrollador del navegador",
"quit": "$t(common.quit)",
"goBack": "retroceder",
"goForward": "avanzar",
"privateModeOff": "Apagar modo privado",
"privateModeOn": "Encender modo privado"
},
"contextMenu": {
"addToPlaylist": "$t(action.addToPlaylist)",
"addToFavorites": "$t(action.addToFavorites)",
"setRating": "$t(action.setRating)",
"moveToTop": "$t(action.moveToTop)",
"deletePlaylist": "$t(action.deletePlaylist)",
"moveToBottom": "$t(action.moveToBottom)",
"createPlaylist": "$t(action.createPlaylist)",
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
"removeFromFavorites": "$t(action.removeFromFavorites)",
"addNext": "$t(player.addNext)",
"deselectAll": "$t(action.deselectAll)",
"addLast": "$t(player.addLast)",
"addFavorite": "$t(action.addToFavorites)",
"play": "$t(player.play)",
"numberSelected": "{{count}} seleccionado",
"removeFromQueue": "$t(action.removeFromQueue)",
"shareItem": "Compartir elemento",
"showDetails": "Obtener información",
"playSimilarSongs": "$t(player.playSimilarSongs)",
"download": "descargar",
"playShuffled": "$t(player.shuffle)",
"moveToNext": "$t(action.moveToNext)",
"goToAlbum": "Ir a $t(entity.album_one)",
"goToAlbumArtist": "Ir a $t(entity.albumArtist_one)"
},
"home": {
"mostPlayed": "más reproducidos",
"newlyAdded": "nuevos lanzamientos añadidos",
"title": "$t(common.home)",
"explore": "explora desde tu biblioteca",
"recentlyPlayed": "reproducidos recientemente"
},
"fullscreenPlayer": {
"upNext": "siguiente",
"config": {
"dynamicBackground": "fondo dinámico",
"synchronized": "sincronizado",
"followCurrentLyric": "seguir la letra actual",
"opacity": "opacidad",
"lyricSize": "tamaño de letra",
"showLyricProvider": "mostrar proveedor de letra",
"unsynchronized": "no sincronizado",
"lyricAlignment": "alineación de letra",
"useImageAspectRatio": "usar ratio de aspecto de imagen",
"showLyricMatch": "mostrar coincidencia de letras",
"lyricGap": "desfase de letra",
"dynamicImageBlur": "tamaño de desenfoque de imagen",
"dynamicIsImage": "habilitar imagen de fondo",
"lyricOffset": "desplazamiento de letras (ms)"
},
"lyrics": "letras",
"related": "relacionado",
"visualizer": "visualizador",
"noLyrics": "sin letras"
},
"albumDetail": {
"moreFromArtist": "más de este $t(entity.artist_one)",
"moreFromGeneric": "más de {{item}}",
"released": "publicado el"
},
"setting": {
"playbackTab": "reproducción",
"generalTab": "general",
"hotkeysTab": "teclas de acceso rápido",
"windowTab": "ventana",
"advanced": "Avanzado"
},
"albumArtistList": {
"title": "$t(entity.albumArtist_other)"
},
"genreList": {
"title": "$t(entity.genre_other)",
"showAlbums": "Mostrar $t(entity.genre_one) $t(entity.album_other)",
"showTracks": "Mostrar $t(entity.genre_one) $t(entity.track_other)"
},
"trackList": {
"title": "$t(entity.track_other)",
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
"artistTracks": "Pistas de {{artist}}"
},
"globalSearch": {
"commands": {
"serverCommands": "comandos del servidor",
"goToPage": "ir a la página",
"searchFor": "buscar por {{query}}"
},
"title": "comandos"
},
"playlistList": {
"title": "$t(entity.playlist_other)"
},
"albumList": {
"title": "$t(entity.album_other)",
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
"artistAlbums": "Álbumes de {{artist}}"
},
"albumArtistDetail": {
"viewAllTracks": "ver todas las $t(entity.track_other)",
"relatedArtists": "$t(entity.artist_other) similares",
"topSongs": "mejores canciones",
"topSongsFrom": "las mejores canciones de {{title}}",
"viewAll": "Ver todo",
"recentReleases": "Lanzamientos recientes",
"viewDiscography": "Ver discografía",
"about": "Sobre {{artist}}",
"appearsOn": "Aparece en"
},
"itemDetail": {
"copiedPath": "Ruta copiada correctamente",
"openFile": "Mostrar pista en el gestor de archivos",
"copyPath": "Copiar ruta al portapapeles"
},
"playlist": {
"reorder": "la reordenación solo se activa al ordenar por id"
},
"manageServers": {
"removeServer": "eliminar servidor",
"title": "administrar servidores",
"serverDetails": "detalles del servidor",
"username": "nombre de usuario",
"editServerDetailsTooltip": "editar detalles del servidor",
"url": "URL"
}
},
"form": {
"deletePlaylist": {
"title": "eliminar $t(entity.playlist_one)",
"success": "$t(entity.playlist_one) eliminado correctamente",
"input_confirm": "escribe el nombre de $t(entity.playlist_one) para confirmar"
},
"createPlaylist": {
"input_description": "$t(common.description)",
"title": "crear $t(entity.playlist_one)",
"input_public": "público",
"input_name": "$t(common.name)",
"success": "$t(entity.playlist_one) creado correctamente",
"input_owner": "$t(common.owner)"
},
"addServer": {
"title": "añadir servidor",
"input_username": "nombre de usuario",
"input_url": "url",
"input_password": "contraseña",
"input_legacyAuthentication": "permitir autenticación heredada",
"input_name": "nombre del servidor",
"success": "servidor añadido correctamente",
"input_savePassword": "guardar contraseña",
"ignoreSsl": "ignorar ssl ($t(common.restartRequired))",
"ignoreCors": "ignorar cors ($t(common.restartRequired))",
"error_savePassword": "un error ocurrió cuando se intentó guardar la contraseña"
},
"addToPlaylist": {
"success": "añadido $t(entity.trackWithCount, {\"count\": {{message}} }) a $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
"title": "añadir a $t(entity.playlist_one)",
"input_skipDuplicates": "saltar duplicados",
"input_playlists": "$t(entity.playlist_other)"
},
"updateServer": {
"title": "actualizar servidor",
"success": "servidor actualizado correctamente"
},
"lyricSearch": {
"input_name": "$t(common.name)",
"input_artist": "$t(entity.artist_one)",
"title": "buscar letras"
},
"editPlaylist": {
"title": "editar $t(entity.playlist_one)",
"success": "$t(entity.playlist_one) actualizada correctamente",
"publicJellyfinNote": "Jellyfin por alguna razón no expone si una lista de reproducción es pública o no. Si deseas que ésta siga siendo pública, por favor ten seleccionada la siguiente entrada"
},
"queryEditor": {
"input_optionMatchAll": "coincidir todos",
"input_optionMatchAny": "coincidir cualquiera",
"title": "Editor de consultas"
},
"shareItem": {
"createFailed": "No se pudo crear el recurso compartido (¿está habilitado el uso compartido?)",
"allowDownloading": "Permitir la descarga",
"description": "Descripción",
"setExpiration": "Establecer expiración",
"success": "Enlace de compartición copiado al portapapeles (o pulsa aquí para abrir)",
"expireInvalid": "La expiración debe ser en el futuro"
},
"privateMode": {
"enabled": "Modo privado activado, el estado de reproducción ahora está oculto de integraciones externas",
"disabled": "Modo privado desactivado, el estado de reproducción ahora es visible a las integraciones externas habilitadas",
"title": "Modo privado"
}
},
"table": {
"column": {
"rating": "calificación",
"comment": "comentarios",
"album": "álbum",
"favorite": "favorito",
"playCount": "reproducciones",
"albumCount": "$t(entity.album_other)",
"releaseYear": "año",
"lastPlayed": "última reproducción",
"biography": "biografía",
"releaseDate": "fecha de lanzamiento",
"bitrate": "tasa de bits",
"title": "título",
"bpm": "lpm",
"dateAdded": "fecha de adición",
"artist": "$t(entity.artist_one)",
"songCount": "$t(entity.track_other)",
"trackNumber": "pista",
"genre": "$t(entity.genre_one)",
"albumArtist": "artista del álbum",
"path": "ruta",
"discNumber": "disco",
"channels": "$t(common.channel_other)",
"size": "$t(common.size)",
"codec": "$t(common.codec)"
},
"config": {
"label": {
"rating": "$t(common.rating)",
"dateAdded": "fecha de adición",
"bpm": "$t(common.bpm)",
"lastPlayed": "última reproducción",
"artist": "$t(entity.artist_one)",
"album": "$t(entity.album_one)",
"biography": "$t(common.biography)",
"channels": "$t(common.channel_other)",
"bitrate": "$t(common.bitrate)",
"actions": "$t(common.action_other)",
"albumArtist": "$t(entity.albumArtist_one)",
"discNumber": "número de disco",
"releaseDate": "fecha de lanzamiento",
"title": "$t(common.title)",
"duration": "$t(common.duration)",
"titleCombined": "$t(common.title) (combinado)",
"size": "$t(common.size)",
"trackNumber": "número de pista",
"rowIndex": "índice de filas",
"note": "$t(common.note)",
"owner": "$t(common.owner)",
"path": "$t(common.path)",
"playCount": "número de reproducciones",
"genre": "$t(entity.genre_one)",
"favorite": "$t(common.favorite)",
"year": "$t(common.year)",
"codec": "$t(common.codec)",
"songCount": "$t(entity.track_other)"
},
"general": {
"gap": "$t(common.gap)",
"tableColumns": "columnas de la tabla",
"autoFitColumns": "ajuste automático de columnas",
"size": "$t(common.size)",
"displayType": "tipo de visualización",
"itemGap": "espacio entre elementos (px)",
"itemSize": "tamaño del elemento (px)",
"followCurrentSong": "seguir la canción actual"
},
"view": {
"card": "tarjeta",
"table": "tabla",
"poster": "cartel",
"list": "Lista",
"grid": "Cuadrícula"
}
}
},
"entity": {
"smartPlaylist": "$t(entity.playlist_one) inteligente",
"genre_one": "género",
"genre_many": "géneros",
"genre_other": "géneros",
"playlistWithCount_one": "{{count}} lista de reproducción",
"playlistWithCount_many": "{{count}} listas de reproducción",
"playlistWithCount_other": "{{count}} listas de reproducción",
"playlist_one": "lista de reproducción",
"playlist_many": "listas de reproducción",
"playlist_other": "listas de reproducción",
"artist_one": "artista",
"artist_many": "artistas",
"artist_other": "artistas",
"folderWithCount_one": "{{count}} carpeta",
"folderWithCount_many": "{{count}} carpetas",
"folderWithCount_other": "{{count}} carpetas",
"albumArtist_one": "artista del álbum",
"albumArtist_many": "artistas del álbum",
"albumArtist_other": "artistas del álbum",
"track_one": "pista",
"track_many": "pistas",
"track_other": "pistas",
"albumArtistCount_one": "{{count}} artista del álbum",
"albumArtistCount_many": "{{count}} artistas del álbum",
"albumArtistCount_other": "{{count}} artistas del álbum",
"albumWithCount_one": "{{count}} álbum",
"albumWithCount_many": "{{count}} álbumes",
"albumWithCount_other": "{{count}} álbumes",
"favorite_one": "favorito",
"favorite_many": "favoritos",
"favorite_other": "favoritos",
"artistWithCount_one": "{{count}} artista",
"artistWithCount_many": "{{count}} artistas",
"artistWithCount_other": "{{count}} artistas",
"folder_one": "carpeta",
"folder_many": "carpetas",
"folder_other": "carpetas",
"album_one": "álbum",
"album_many": "álbumes",
"album_other": "álbumes",
"genreWithCount_one": "{{count}} género",
"genreWithCount_many": "{{count}} géneros",
"genreWithCount_other": "{{count}} géneros",
"trackWithCount_one": "{{count}} pista",
"trackWithCount_many": "{{count}} pistas",
"trackWithCount_other": "{{count}} pistas",
"play_one": "{{count}} reproducción",
"play_many": "{{count}} reproducciones",
"play_other": "{{count}} reproducciones",
"song_one": "canción",
"song_many": "canciones",
"song_other": "canciones"
}
}
+626
View File
@@ -0,0 +1,626 @@
{
"player": {
"repeat_all": "تکرار همه",
"stop": "توقف",
"repeat": "تکرار",
"skip": "رد کن",
"toggleFullscreenPlayer": "تغییر به پخش‌کنندهٔ تمام‌صفحه",
"skip_back": "برو عقب",
"shuffle": "پخش تصادفی",
"repeat_off": "تکرار غیرفعال",
"pause": "ایست",
"unfavorite": "حذف از موردعلاقه‌ها",
"shuffle_off": "پخش تصادفی غیر فعال",
"skip_forward": "برو جلو",
"queue_moveToTop": "جابجا کردن انتخاب شده به پایین",
"queue_clear": "خالی کردن صف",
"queue_remove": "حذف انتخاب شده",
"addLast": "افزودن به پایان",
"next": "پسین",
"play": "پخش",
"playbackSpeed": "تندی پخش",
"playRandom": "پخش تصادفی",
"previous": "پیشین",
"mute": "بی‌صدا کردن",
"playbackFetchCancel": "دارد طول می‌کشد... برای لفو کردن اعلان را ببندید",
"playbackFetchInProgress": "بارگذاری قطعه‌ها…",
"queue_moveToBottom": "جابجا کردن انتخاب شده به بالا",
"addNext": "افزودن به پسین",
"favorite": "مورد علاقه",
"playSimilarSongs": "پخش آهنگ‌های همگون",
"playbackFetchNoResults": "هیچ آهنگی پیدا نشد",
"viewQueue": "دیدن صف",
"muted": "بی‌صدا"
},
"action": {
"editPlaylist": "ویرایش $t(entity.playlist_one)",
"goToPage": "برو به صفحهٔ",
"moveToTop": "انتقال به بالا",
"clearQueue": "خالی کردن صف",
"addToFavorites": "افزودن به $t(entity.favorite_other)",
"addToPlaylist": "افزودن به $t(entity.playlist_one)",
"createPlaylist": "ساخت $t(entity.playlist_one)",
"removeFromPlaylist": "حذف از $t(entity.playlist_one)",
"viewPlaylists": "نمایش $t(entity.playlist_other)",
"refresh": "$t(common.refresh)",
"deletePlaylist": "حذف $t(entity.playlist_one)",
"removeFromQueue": "حذف از صف",
"deselectAll": "لغو انتخاب همه",
"moveToBottom": "انتقال به پایین",
"setRating": "تعیین امتیاز",
"toggleSmartPlaylistEditor": "تغییر ویرایشگر $t(entity.smartPlaylist)",
"removeFromFavorites": "حذف از $t(entity.favorite_other)",
"openIn": {
"lastfm": "باز کردن در Last.fm",
"musicbrainz": "باز کردن در MusicBranz"
},
"moveToNext": "جابجا کردن به بعدی"
},
"setting": {
"hotkey_skipBackward": "برو عقب",
"audioDevice_description": "دستگاه صوتی را برای پخش انتخاب کنید (فقط پخش‌کنندهٔ تحت وب)",
"hotkey_playbackPause": "pause",
"hotkey_volumeUp": "زیاد کردن صدا",
"playButtonBehavior_optionPlay": "$t(player.play)",
"lyricFetch": "دریافت متن ترانه از اینترنت",
"enableRemote_description": "کنترل از راه دور سرویس‌دهنده را فعال کنید تا به دستگاه‌های دیگر اجازهٔ مدیریت اپلیکیشن را بدهید",
"mpvExecutablePath_description": "تعیین مسیر فایل اجرایی MPV",
"sampleRate": "sample rate",
"replayGainMode_optionNone": "$t(common.none)",
"hotkey_rate1": "امتیاز ۱ ستاره",
"hotkey_skipForward": "برو جلو",
"disableLibraryUpdateOnStartup": "غیرفعال کردن بررسی آخرین نسخه در آغاز به کار برنامه",
"discordApplicationId_description": "the application id for {{discord}} rich presence (defaults to {{defaultId}})",
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
"hotkey_playbackPlay": "پخش",
"hotkey_volumeDown": "کم کردن صدا",
"audioPlayer_description": "پخش‌کنندهٔ صدا را برای پخش انتخاب کنید",
"hotkey_globalSearch": "جست و جوی سراسری",
"disableAutomaticUpdates": "غیرفعال کردن به‌‌روزرسانی خودکار",
"exitToTray_description": "خروج از اپلیکیشن به system tray",
"replayGainMode_optionAlbum": "$t(entity.album_one)",
"discordUpdateInterval_description": "فاصلهٔ بین هر به روزرسانی به ثانیه (حداقل ۱۵ ثانیه)",
"audioExclusiveMode": "حالت اختصاصی صدا",
"remotePassword": "رمز عبور کنترل از راه دور",
"language_description": "زبان اپلیکیشن را معین می‌کند $t(common.restartRequired)",
"hotkey_rate3": "امتیاز ۳ ستاره",
"font": "قلم",
"replayGainMode_optionTrack": "$t(entity.track_one)",
"hotkey_toggleFullScreenPlayer": "تغییر به پخش‌کنندهٔ تمام‌صفحه",
"hotkey_localSearch": "جست و جو در صفحه",
"hotkey_toggleQueue": "تغییر صف",
"hotkey_rate5": "امتیاز ۵ ستاره",
"hotkey_playbackPrevious": "قطعهٔ قبل",
"language": "زبان",
"hotkey_toggleShuffle": "تغییر شافل",
"mpvExecutablePath": "مسیر اجرای MPV",
"audioDevice": "دستگاه صوتی",
"hotkey_rate2": "امتیاز ۲ ستاره",
"playButtonBehavior_description": "رفتار پیش‌فرض دکمهٔ پخش را هنگامی که آهنگی به صف افزوده می‌شود را معین می‌کند",
"exitToTray": "خروج به tray",
"hotkey_rate4": "امتیاز ۴ ستاره",
"enableRemote": "فعال کردن کنترل از راه دور سرویس‌دهنده",
"showSkipButton_description": "نمایش یا مخفی کردن دکمهٔ رد کردن روی نوار پخش‌کننده",
"playButtonBehavior": "رفتار دکمهٔ پخش",
"playbackStyle_optionNormal": "عادی",
"hotkey_toggleRepeat": "تغییر تکرار",
"fontType": "نوع قلم",
"hotkey_playbackNext": "قطعهٔ بعد",
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
"lyricFetch_description": "دریافت متن ترانه از منابع اینترنتی",
"customFontPath": "مسیر قلم سفارشی",
"audioPlayer": "پخش‌کنندهٔ صدا",
"hotkey_rate0": "حذف امتیاز",
"discordApplicationId": "{{discord}} application id",
"hotkey_volumeMute": "بستن صدا",
"showSkipButton": "نمایش دکمهٔ رد کردن",
"customFontPath_description": "مسیر قلم سفارشی را برای استفاده در اپلیکیشن مشخص کنید",
"gaplessAudio_optionWeak": "ضعیف (توصیه شده)",
"hotkey_playbackStop": "توقف",
"font_description": "قلم مورد استفادهٔ اپلیکیشن را معین می‌کند",
"accentColor_description": "رنگ شاخص را برای نرم‌افزار مشخص می‌کند",
"applicationHotkeys": "کلیدهای میان‌بر نرم‌افزار",
"accentColor": "رنگ شاخص",
"albumBackgroundBlur": "اندازه‌ی مبهمی نگاره‌ی پس‌زمینه‌ی آلبوم",
"albumBackgroundBlur_description": "مقدار مبهمی‌ای که روی نگاره‌ی پس‌زمینه‌ی آلبوم اعمال می‌شود را تنظیم می‌کند",
"albumBackground": "نگاره‌ی پس‌زمینه‌ی آلبوم",
"albumBackground_description": "یک نگاره‌ی پس‌زمینه برای صفحات آلبوم دارای نگار آلبوم هستند، می‌افزاید",
"artistConfiguration": "پیکربندی صفحه‌ی هنرمند آلبوم",
"applicationHotkeys_description": "پیکربندی کلیدهای میان‌بر نرم‌افزار. برای تنظیم یک کلید میان‌بر عمومی مربع چک را فعال کنید (فقط پخش‌کننده‌ی میزکار)",
"clearCache": "پاک‌سازی کَش مرورگر",
"clearQueryCache": "پاک‌سازی کَش فیشین",
"clearCacheSuccess": "با موفقیت کَش پاک شد",
"artistConfiguration_description": "پیکربندی اینکه چه آیتمی‌هایی و در چه ترتیبی در صفحه‌ی هنرمند آلبوم نمایش داده شوند",
"buttonSize": "اندازه‌ی دکمه‌ی پخش نوار",
"contextMenu": "پیکربندی فهرست زمینه (کلیک راست)",
"buttonSize_description": "اندازه‌ی دکمه‌های پخش نوار",
"audioExclusiveMode_description": "حالت اختصاصی خروجی را فعال می‌کند. در این حالت، سامانه معمولاً قفل است و فقط mpv می‌تواند خروجی صدا دهد",
"clearQueryCache_description": "یک 'پاک‌سازی نرم' از فیشین. این فهرست‌های پخش و فراداده‌ی قطعه‌ها را تازه می‌کند و متن شعرهای ذخیره شده را بازنشانی می‌کند. پیکربندی‌ها، اعتبارنامه‌های سرویس‌دهنده و نگاره‌های کَش شده حفظ می‌شوند",
"clearCache_description": "یک 'پاک‌سازی سخت' فیشین. افزون بر پاک‌سازی کَش فیشین، کَش مرورگر هم تهی می‌شود (نگاره‌های ذخیره شده و باقی دارایی‌ها). اعتبارنامه‌ها و پیکربندی‌ها حفظ می‌شوند",
"contextMenu_description": "به شما اجازه می‌دهد که آیتم‌های نمایش داده شده در فهرستی که وقتی روی یک آیتم کلیک راست می‌کنید پدیدار می‌شود، را پنهان کنید. آیتم‌هایی که منتخب نیستند پنهان می‌شوند",
"crossfadeStyle": "شیوه‌ی crossfade",
"customCssEnable_description": "اجازه دادن برای نوشتن css سفارشی.",
"translationApiKey": "کلید API ترجمه",
"webAudio_description": "از صدای وب بهره‌مند می‌شود. این قابلیت‌های پیشرفته‌ای مانند گین بازپخش (replygain) را فعال می‌کند. غیرفعال کنید اگر غیر از این را تجربه می‌کنید",
"windowBarStyle_description": "گزینش سبک نوار پنجره",
"translationApiKey_description": "کلید API برای ترجمه (پشتیبانی فقط برای نقطه‌ی پایانی سرویس‌دهنده‌ی جهانی)",
"theme": "تم",
"hotkey_togglePreviousSongFavorite": "تغییر وضعیت برای مورد علاقه‌ی $t(common.previousSong)",
"transcode": "فعال‌سازی رمزگردانی",
"transcode_description": "رمزگردانی به فرمت‌های گوناگون را فعال می‌کند",
"transcodeBitrate": "نرخ انتقال رمزگردانی",
"startMinimized": "پنهان‌شده آغاز کن",
"theme_description": "تم مورد استفاده در نرم‌افزار را می‌گزیند",
"themeLight": "تم (روشن)",
"transcodeBitrate_description": "نرخ انتقال برای رمزگردانی را انتخاب می‌کند. 0 بدان معناست سرور آن را انتخاب کند",
"transcodeFormat": "فرمت رمزگردانی",
"transcodeFormat_description": "فرمت رمزگردانی را انتخاب می‌کند. برای اینکه سرور آن را انتخاب کند، خالی بگذارید",
"customCssEnable": "فعال کردن css سفارشی",
"translationTargetLanguage": "زبان هدف ترجمه",
"hotkey_toggleCurrentSongFavorite": "تغییر وضعیت مورد علاقه برای $t(common.currentSong)",
"themeDark_description": "تم تاریک را برای استفاده‌ی نرم‌افزار می‌گزیند",
"volumeWheelStep_description": "اندازه‌ای از حجم صدا را در زمان اسکرول کردن روی نوار لغزنده تغییر داده شود",
"trayEnabled": "نمایش سینی",
"trayEnabled_description": "نمایش/پنهان کردن آیکون/فهرست در سینی. اگر غیرفعال باشد، کوچک کردن/خروج به سینی را نیز غیرفعال می‌کند",
"useSystemTheme_description": "از روشنی یا تاریکی که سیستم تعریف کرده است، پیروی می‌کند",
"crossfadeDuration": "زمان محو کردن گذار قطعه به قطعه‌ی بعدی",
"themeLight_description": "تم روشن را برای استفاده‌ی نرم‌افزار می‌گزیند",
"volumeWidth": "عرض نوار لغزنده‌ی حجم صدا",
"crossfadeStyle_description": "شیوه‌ی crossfade که می‌خواهید پخش‌کننده از آن استفاده کند را انتخاب کنید",
"startMinimized_description": "نرم‌افزار را در سینی اجرا کن",
"volumeWidth_description": "عرضی که نوار لغزنده‌ی حجم صدا داشته باشد",
"themeDark": "تم (تاریک)",
"useSystemTheme": "استفاده از تم سیستم",
"volumeWheelStep": "گام چرخ حجم صدا",
"webAudio": "استفاده از صدای وب",
"windowBarStyle": "سبک نوار پنجره",
"crossfadeDuration_description": "زمان افکت crossfade را مشخص می‌کند"
},
"common": {
"backward": "به عقب",
"increase": "افزایش",
"rating": "امتیاز",
"bpm": "bpm",
"refresh": "تازه‌سازی",
"unknown": "ناشناخته",
"areYouSure": "مطمئنید؟",
"edit": "ویرایش",
"favorite": "موردعلاقه",
"left": "چپ",
"save": "ذخیره",
"right": "راست",
"currentSong": "فعلی $t(entity.track_one)",
"collapse": "بستن",
"trackNumber": "قطعه",
"descending": "نزولی",
"add": "افزودن",
"gap": "فاصله",
"ascending": "صعودی",
"dismiss": "رد",
"year": "سال",
"manage": "مدیریت",
"limit": "محدود",
"minimize": "کمینه",
"modified": "ویراسته شده",
"duration": "مدت",
"name": "نام",
"maximize": "بیشینه",
"decrease": "کم کردن",
"ok": "باشه",
"description": "شرح",
"configure": "تنظیم",
"path": "مسیر",
"center": "وسط",
"no": "خیر",
"owner": "مالک",
"enable": "فعال",
"clear": "خالی",
"forward": "جلو",
"delete": "حذف",
"cancel": "لغو",
"forceRestartRequired": "برای اعمال تغییرها دوباره راه‌اندازی کنید… اعلان را برای راه‌اندازی دوباره ببندید",
"version": "نسخه",
"title": "عنوان",
"filter_one": "پالایش",
"filter_other": "پالایش",
"filters": "پالایش",
"create": "ساختن",
"bitrate": "بیت‌ریت",
"saveAndReplace": "ذخیره و جایگزین",
"action_one": "عملیات",
"action_other": "عملیات",
"playerMustBePaused": "پخش‌کننده باید متوقف شود",
"confirm": "تایید",
"resetToDefault": "بازنشانی به پیش‌فرض",
"home": "خانه",
"comingSoon": "به زودی…",
"reset": "بازنشانی",
"channel_one": "کانال",
"channel_other": "کانال",
"disable": "غیرفعال",
"sortOrder": "ترتیب",
"none": "هیچ",
"menu": "منو",
"restartRequired": "راه‌اندازی دوباره لازم است",
"previousSong": "$t(entity.track_one) پیشین",
"noResultsFromQuery": "جست‌وجو نتیجه‌ای نداشت",
"quit": "خروج",
"expand": "گسترش",
"search": "جست‌وجو",
"saveAs": "ذخیره کن با اسم",
"disc": "دیسک",
"yes": "بله",
"random": "تصادفی",
"size": "حجم",
"biography": "زندگی‌نامه",
"note": "توجه",
"albumGain": "گین آلبوم",
"close": "بستن",
"albumPeak": "اوج آلبوم",
"mbid": "شناسه‌ی MusicBrainz",
"reload": "بارگذاری مجدد",
"setting": "پیکربندی",
"trackGain": "گین قطعه",
"trackPeak": "اوج قطعه",
"translation": "ترجمه",
"preview": "پیش‌نمایش",
"share": "اشتراک‌گذاری",
"codec": "کدک"
},
"error": {
"remotePortWarning": "برای تعیین port تازه، سرویس دهنده را دوباره راه‌اندازی کنید",
"playbackError": "هنگام پخش خطایی رخ داد",
"remotePortError": "هنگام تعیین port سرویس دهنده خطایی رخ داد",
"serverRequired": "سرویس‌دهنده ضروری است",
"authenticationFailed": "احراز هویت شکست خورد",
"apiRouteError": "درخواست منتقل نشد",
"genericError": "خطایی رخ داد",
"credentialsRequired": "باید وارد شوید",
"sessionExpiredError": "جلسه شما منقضی شده است",
"remoteEnableError": "هنگام $t(common.enable) سرویس دهنده خطای رخ داد",
"serverNotSelectedError": "سرویس‌دهنده‌ای انتخاب نشده",
"remoteDisableError": "هنگام $t(common.disable) سرویس دهنده خطایی رخ داد",
"mpvRequired": "وجود MPV ضروری است",
"audioDeviceFetchError": "هنگام دسترسی به دستگاه صوتی خطایی رخ داد",
"localFontAccessDenied": "دسترسی به فونت‌های محلی پذیرفته نشد",
"loginRateError": "تلاش‌های بسیار برای ورود انجام داده‌اید،‌لطفاً بعد از چند ثانیه دوباره امتحان کنید",
"networkError": "خطای شبکه رخ داد",
"badAlbum": "شما این صفحه را می‌بینید چون‌که این آهنگ قسمتی از یک آلبوم نیست. شما احتمالا این مسأله را به این خاطر می‌بینید که آهنگی در پوشه‌ی سطح بالای آهنگ‌هایتان دارید. جلی‌فین فقط قطعه‌هایی را گروه‌بندی می‌کند که در یک پوشه قرار دارند.",
"invalidServer": "سرویس‌دهنده‌ی نامعتبر",
"openError": "نمی‌توان پرونده را باز کرد",
"endpointNotImplementedError": "نقطه‌ی پایان {{endpoint}} برای {{serverType}} قرار داده نشده است",
"systemFontError": "خطایی هنگام تلاش برای دریافت فونت‌های سیستم رخ داد"
},
"filter": {
"mostPlayed": "بیشتر پخش شده",
"comment": "نظر",
"playCount": "تعداد پخش",
"recentlyUpdated": "به تازگی به روز شده",
"channels": "$t(common.channel_other)",
"recentlyPlayed": "به تازگی پخش شده",
"isRated": "امتیاز داده شده است",
"owner": "$t(common.owner)",
"title": "عنوان",
"rating": "امتیاز",
"search": "جست‌وجو",
"bitrate": "بیت‌ریت",
"genre": "$t(entity.genre_one)",
"recentlyAdded": "به تازگی افزوده شده",
"note": "توجه",
"name": "نام",
"dateAdded": "تاریخ افزوده شدن",
"releaseDate": "تاریخ انتشار",
"albumCount": "$t(entity.album_other) عدد",
"path": "مسیر",
"favorited": "موردعلاقه",
"albumArtist": "$t(entity.albumArtist_one)",
"isRecentlyPlayed": "به تازگی پخش شده است",
"isFavorited": "موردعلاقه است",
"bpm": "bpm",
"releaseYear": "سال انتشار",
"id": "id",
"disc": "دیسک",
"biography": "زندگی‌نامه",
"songCount": "تعداد ترانه",
"artist": "$t(entity.artist_one)",
"duration": "مدت",
"isPublic": "عمومی است",
"random": "تصادفی",
"lastPlayed": "به تازگی پخش شده",
"toYear": "تا سال",
"fromYear": "از سال",
"criticRating": "امتیاز منتقدین",
"album": "$t(entity.album_one)",
"trackNumber": "قطعه",
"communityRating": "رتبه بندی جامعه",
"isCompilation": "مخلوط است"
},
"form": {
"deletePlaylist": {
"title": "حذف $t(entity.playlist_one)",
"success": "$t(entity.playlist_one) حذف شد",
"input_confirm": "برای تایید، نام $t(entity.playlist_one) را وارد کنید"
},
"createPlaylist": {
"input_description": "$t(common.description)",
"title": "ساخت $t(entity.playlist_one)",
"input_public": "عمومی",
"input_name": "$t(common.name)",
"success": "$t(entity.playlist_one) ساخته شد",
"input_owner": "$t(common.owner)"
},
"addServer": {
"title": "افزودن سرویس دهنده",
"input_username": "نام کاربری",
"input_url": "نشانی",
"input_password": "رمز عبور",
"input_name": "نام سرویس‌دهنده",
"success": "سرویس‌دهنده افزوده شد",
"input_savePassword": "ذخیرهٔ رمز",
"error_savePassword": "هنگام ذخیره رمز خطایی رخ داد",
"ignoreCors": "نادیده گرفتن هسته‌ها ($t(common.restartRequired))",
"input_legacyAuthentication": "فعال‌سازی احراز هویت سنتی",
"ignoreSsl": "نادیده گرفتن ssl ($t(common.restartRequired))"
},
"addToPlaylist": {
"success": "$t(entity.song_other) به {{numOfPlaylists}}$t(entity.playlist_other) افزوده شد",
"title": "افزودن به $t(entity.playlist_one)",
"input_playlists": "$t(entity.playlist_other)",
"input_skipDuplicates": "پرش از تکراری‌ها"
},
"lyricSearch": {
"input_name": "$t(common.name)",
"input_artist": "$t(entity.artist_one)",
"title": "جست‌وجو در متن شعر"
},
"editPlaylist": {
"title": "ویرایش $t(entity.playlist_one)",
"success": "$t(entity.playlist_one) با موفقیت بروزرسانی شد",
"publicJellyfinNote": "جلی‌فین به دلیلی این‌که فهرست پخش عمومی‌ست یا خصوصی را فاش نمی‌کند. اگر می‌خواهید این عمومی باقی بماند، لطفاٌ ورودی پیش‌رو را منتخب داشته باشید"
},
"queryEditor": {
"input_optionMatchAny": "همخوانی داشتن هر کدام",
"input_optionMatchAll": "همخوانی داشتن همه"
},
"shareItem": {
"expireInvalid": "انقضا باید در آینده باشد",
"description": "بازنمود",
"setExpiration": "تنظیم انقضا",
"success": "پیوند اشتراک‌گذاری در کلیپ‌بورد کپی شد (یا اینجا را کلیک کنید تا باز شود)",
"allowDownloading": "اجازه دادن بارگیری",
"createFailed": "ناکامی در ساخت پیوند اشتراک‌گذاری (آیا اشتراک‌گذاری فعال است؟)"
},
"updateServer": {
"success": "سرویس‌دهنده با موفقیت بروزرسانی شد",
"title": "بروزرسانی سرویس‌دهنده"
}
},
"entity": {
"genre_one": "ژانر",
"genre_other": "ژانرها",
"playlistWithCount_one": "{{count}} فهرست پخش",
"playlistWithCount_other": "{{count}} فهرست پخش",
"playlist_one": "فهرست پخش",
"playlist_other": "فهرست‌های پخش",
"artist_one": "هنرمند",
"artist_other": "هنرمندان",
"folderWithCount_one": "{{count}} پوشه",
"folderWithCount_other": "{{count}} پوشه",
"albumArtist_one": "هنرمند آلبوم",
"albumArtist_other": "هنرمندان آلبوم",
"track_one": "قطعه",
"track_other": "قطعه‌ها",
"albumArtistCount_one": "{{count}} هنرمند آلبوم",
"albumArtistCount_other": "{{count}} هنرمند آلبوم",
"albumWithCount_one": "{{count}} آلبوم",
"albumWithCount_other": "{{count}} آلبوم",
"favorite_one": "موردعلاقه",
"favorite_other": "موردعلاقه",
"artistWithCount_one": "{{count}} هنرمند",
"artistWithCount_other": "{{count}} هنرمند",
"folder_one": "پوشه",
"folder_other": "پوشه‌ها",
"smartPlaylist": "$t(entity.playlist_one) هوشمند",
"album_one": "آلبوم",
"album_other": "آلبوم‌ها",
"genreWithCount_one": "{{count}} ژانر",
"genreWithCount_other": "{{count}} ژانر",
"trackWithCount_one": "{{count}} قطعه",
"trackWithCount_other": "{{count}} قطعه",
"play_one": "{{count}} بار پخش",
"play_other": "{{count}} بار پخش",
"song_one": "آهنگ",
"song_other": "آهنگ‌ها"
},
"page": {
"albumList": {
"title": "$t(entity.album_other)",
"artistAlbums": "آلبوم‌های {{artist}}",
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
},
"appMenu": {
"settings": "$t(common.setting_other)",
"selectServer": "گزینش سرویس‌دهنده",
"expandSidebar": "گسترش نوار کناری",
"collapseSidebar": "فروکش نوار کناری",
"goBack": "بازگشت",
"openBrowserDevtools": "باز کردن ابزارهای توسعه مرورگر",
"quit": "$t(common.quit)",
"goForward": "پیش رفتن",
"manageServers": "مدیریت سرویس‌دهنده‌ها",
"version": "نسخه‌ی {{version}}"
},
"albumArtistDetail": {
"appearsOn": "مشاهده می‌شود در",
"about": "درباره‌ی {{artist}}",
"recentReleases": "عرضه‌های اخیر",
"viewAllTracks": "نمایش همه‌ی $t(entity.track_other)",
"topSongsFrom": "قطعه‌های برتر از {{title}}",
"viewAll": "نمایش همه",
"viewDiscography": "نمایش کاتالوگ",
"relatedArtists": "$t(entity.artist_other) مربوطه",
"topSongs": "قطعه‌های برتر"
},
"contextMenu": {
"addFavorite": "$t(action.addToFavorites)",
"addLast": "$t(player.addLast)",
"addNext": "$t(player.addNext)",
"addToFavorites": "$t(action.addToFavorites)",
"numberSelected": "{{count}} تا انتخاب شده",
"play": "$t(player.play)",
"removeFromFavorites": "$t(action.removeFromFavorites)",
"deselectAll": "$t(action.deselectAll)",
"download": "بارگیری",
"shareItem": "اشتراک‌گذاری آیتم",
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
"showDetails": "دریافت داده",
"playSimilarSongs": "$t(player.playSimilarSongs)",
"removeFromQueue": "$t(action.removeFromQueue)",
"playShuffled": "$t(player.shuffle)",
"addToPlaylist": "$t(action.addToPlaylist)",
"createPlaylist": "$t(action.createPlaylist)",
"moveToBottom": "$t(action.moveToBottom)",
"moveToTop": "$t(action.moveToTop)",
"setRating": "$t(action.setRating)",
"deletePlaylist": "$t(action.deletePlaylist)",
"moveToNext": "$t(action.moveToNext)"
},
"fullscreenPlayer": {
"related": "موارد مربوطه",
"visualizer": "تجسم یافته",
"config": {
"dynamicImageBlur": "اندازه مبهمی نگاره",
"dynamicIsImage": "فعال‌سازی نگاره به عنوان پس‌زمینه",
"lyricOffset": "انحراف متن شعر (میلی‌ثانیه)",
"unsynchronized": "همگام نشده",
"dynamicBackground": "پس‌زمینه پویا",
"followCurrentLyric": "دنبال کردن متن شعر کنونی",
"lyricAlignment": "هم‌ترازی متن شعر",
"lyricGap": "فاصله‌ی متن شعر",
"showLyricProvider": "نمایش فراهم‌گر متن شعر",
"useImageAspectRatio": "استفاده از نسبت نمای نگاره",
"lyricSize": "اندازه‌ی متن شعر",
"opacity": "شفافی",
"showLyricMatch": "نمایش همخوانی متن شعر",
"synchronized": "همگام شده"
},
"noLyrics": "هیچ متن شعری پیدا نشد",
"lyrics": "متن شعر",
"upNext": "در ادامه"
},
"home": {
"mostPlayed": "بیشترین پخش‌شده‌ها",
"title": "$t(common.home)",
"explore": "در کتاب‌خانه‌ی خود کاوش کنید",
"newlyAdded": "عرضه‌های تازه افزوده شده",
"recentlyPlayed": "تازه پخش شده‌ها"
},
"playlist": {
"reorder": "مرتب کردن دوباره زمانی فقط زمانی فعال شود که مرتب‌سازی بر اساس شناسه است"
},
"setting": {
"advanced": "پیشرفته",
"windowTab": "پنجره",
"generalTab": "همگانی",
"hotkeysTab": "کلیدهای میان‌بر",
"playbackTab": "پخش"
},
"sidebar": {
"genres": "$t(entity.genre_other)",
"playlists": "$t(entity.playlist_other)",
"search": "$t(common.search)",
"albumArtists": "$t(entity.albumArtist_other)",
"albums": "$t(entity.album_other)",
"folders": "$t(entity.folder_other)",
"artists": "$t(entity.artist_other)",
"home": "$t(common.home)",
"nowPlaying": "پخش کنونی",
"tracks": "$t(entity.track_other)",
"settings": "$t(common.setting_other)",
"shared": "$t(entity.playlist_other) اشتراک‌گذاری شده"
},
"albumDetail": {
"moreFromArtist": "موارد بیشتر از این $t(entity.artist_one)",
"moreFromGeneric": "موارد بیشتر از {{item}}",
"released": "عرضه شده"
},
"manageServers": {
"title": "مدیریت سرویس‌دهنده‌ها",
"url": "آدرس",
"serverDetails": "ریزگان سرویس‌دهنده",
"removeServer": "حذف سرویس‌دهنده",
"username": "نام کاربری",
"editServerDetailsTooltip": "ویرایش ریزگان سرویس‌دهنده"
},
"genreList": {
"showAlbums": "نمایش $t(entity.genre_one) $t(entity.album_other)",
"title": "$t(entity.genre_other)",
"showTracks": "نمایش $t(entity.genre_one) $t(entity.track_other)"
},
"globalSearch": {
"commands": {
"goToPage": "رفتن به صفحه‌ی",
"searchFor": "جست‌و‌جو برای {{query}}",
"serverCommands": "فرمان‌های سرویس‌دهنده"
},
"title": "فرمان‌ها"
},
"playlistList": {
"title": "$t(entity.playlist_other)"
},
"trackList": {
"title": "$t(entity.track_other)",
"artistTracks": "قطعه‌های {{artist}}",
"genreTracks": "$t(entity.track_other) \"{{genre}}\""
},
"albumArtistList": {
"title": "$t(entity.albumArtist_other)"
},
"itemDetail": {
"copyPath": "کپی کردن مسیر در کلیپ‌بورد",
"copiedPath": "مسیر با موفقیت کپی شد",
"openFile": "نمایش قطعه در مدیر پرونده"
}
},
"table": {
"column": {
"size": "$t(common.size)",
"lastPlayed": "آخرین بار پخش شده",
"discNumber": "دیسک",
"songCount": "$t(entity.track_other)",
"title": "عنوان",
"trackNumber": "قطعه",
"favorite": "مورد علاقه",
"genre": "$t(entity.genre_one)",
"comment": "دیدگاه",
"playCount": "تعداد پخش",
"rating": "امتیاز",
"path": "مسیر",
"releaseYear": "سال",
"dateAdded": "تاریخ افزوده شدن",
"releaseDate": "تاریخ عرضه"
},
"config": {
"general": {
"followCurrentSong": "آهنگ کنونی را دنبال کن",
"displayType": "نوع نمایش",
"itemSize": "اندازه‌ی آیتم (px)",
"size": "$t(common.size)",
"tableColumns": "ستون‌های جدول",
"autoFitColumns": "تطبیق دادن ستون‌ها به شیوه‌ی خودکار",
"gap": "$t(common.gap)",
"itemGap": "فاصله‌ی آیتم (px)"
},
"view": {
"card": "کارت"
},
"label": {
"playCount": "تعداد پخش",
"dateAdded": "تاریخ افزوده شدن",
"discNumber": "شماره‌ی دیسک",
"lastPlayed": "آخرین بار پخش شده",
"actions": "$t(common.action_other)"
}
}
}
}
+795
View File
@@ -0,0 +1,795 @@
{
"common": {
"size": "koko",
"search": "etsi",
"sortOrder": "järjestys",
"setting": "asetus",
"title": "otsikko",
"trackNumber": "raita",
"action_one": "toiminto",
"action_other": "toiminnot",
"add": "lisää",
"areYouSure": "oletko varma?",
"ascending": "nouseva",
"backward": "takaperin",
"bitrate": "bittinopeus",
"channel_one": "kanava",
"channel_other": "kanavat",
"collapse": "luhista",
"comingSoon": "tulossa pian…",
"configure": "konfiguroi",
"confirm": "hyväksy",
"disable": "poista käytöstä",
"disc": "levy",
"dismiss": "hylkää",
"favorite": "suosikki",
"filter_one": "suodatin",
"filter_other": "suodattimet",
"filters": "suodattimet",
"forceRestartRequired": "käynnistä uudelleen ottaaksesi muutokset käyttöön… sulje ilmoitus käynnistääksesi uudelleen",
"gap": "väli",
"home": "koti",
"left": "vasen",
"limit": "raja",
"manage": "hallitse",
"menu": "valikko",
"minimize": "minimoi",
"modified": "muokattu",
"name": "nimi",
"no": "ei",
"none": "ei mitään",
"noResultsFromQuery": "kysely ei tuottanut tuloksia",
"note": "huomautus",
"ok": "ok",
"owner": "omistaja",
"path": "polku",
"preview": "esikatsele",
"previousSong": "edellinen $t(entity.track_one)",
"resetToDefault": "palauta oletusarvoihin",
"restartRequired": "vaatii uudelleenkäynnistyksen",
"right": "oikea",
"save": "tallenna",
"saveAndReplace": "tallenna ja korvaa",
"saveAs": "tallenna nimellä",
"unknown": "tuntematon",
"version": "versio",
"year": "vuosi",
"yes": "kyllä",
"close": "sulje",
"descending": "laskeva",
"biography": "biografia",
"cancel": "peruuta",
"bpm": "bpm",
"decrease": "pienennä",
"center": "keskitä",
"clear": "tyhjennä",
"codec": "koodekki",
"create": "luo",
"description": "kuvaus",
"currentSong": "nykyinen $t(entity.track_one)",
"delete": "poista",
"duration": "kesto",
"edit": "muokkaa",
"enable": "ota käyttöön",
"expand": "laajenna",
"increase": "lisää",
"forward": "eteenpäin",
"maximize": "maksimoi",
"mbid": "MusicBrainz ID",
"share": "jaa",
"random": "satunnainen",
"reload": "lataa uudelleen",
"quit": "poistu",
"rating": "arvostelu",
"refresh": "virkistä",
"reset": "nollaa",
"playerMustBePaused": "soittimen täytyy olla pysäytetty",
"translation": "käännös",
"albumGain": "albumin vahvistus (gain)",
"albumPeak": "albumin huippu (peak)",
"trackGain": "raidan vahvistus (gain)",
"trackPeak": "kappaleen huippu (peak)",
"additionalParticipants": "muut osallistujat",
"tags": "tägit",
"newVersion": "uusi versio on asennettu ({{version}})",
"viewReleaseNotes": "katsele julkaisutietoja",
"bitDepth": "bittisyvyys",
"sampleRate": "näytteenottotaajuus"
},
"entity": {
"album_one": "albumi",
"album_other": "albumit",
"albumArtist_one": "albumin artisti",
"albumArtist_other": "albumin artistit",
"artistWithCount_one": "{{count}} artisti",
"artistWithCount_other": "{{count}} artistia",
"playlist_one": "soittolista",
"playlist_other": "soittolistat",
"playlistWithCount_one": "{{count}} soittolista",
"playlistWithCount_other": "{{count}} soittolistaa",
"albumArtistCount_one": "{{count}} albumin artisti",
"albumArtistCount_other": "{{count}} albumin artistia",
"albumWithCount_one": "{{count}} albumi",
"albumWithCount_other": "{{count}} albumia",
"artist_one": "artisti",
"artist_other": "artistit",
"favorite_one": "suosikki",
"favorite_other": "suosikit",
"folder_one": "kansio",
"folder_other": "kansiot",
"folderWithCount_one": "{{count}} kansio",
"folderWithCount_other": "{{count}} kansiota",
"genre_one": "genre",
"genre_other": "genret",
"genreWithCount_one": "{{count}} genre",
"genreWithCount_other": "{{count}} genreä",
"smartPlaylist": "älykäs $t(entity.playlist_one)",
"track_one": "raita",
"track_other": "raidat",
"trackWithCount_one": "{{count}} raita",
"trackWithCount_other": "{{count}} raitaa",
"play_one": "{{count}} toisto",
"play_other": "{{count}} toistoa",
"song_one": "kappale",
"song_other": "kappaleet"
},
"action": {
"clearQueue": "tyhjennä jono",
"createPlaylist": "luo $t(entity.playlist_one)",
"deselectAll": "poista kaikkien valinta",
"editPlaylist": "muokkaa $t(entity.playlist_one)",
"removeFromQueue": "poista jonosta",
"viewPlaylists": "katsele $t(entity.playlist_other)",
"openIn": {
"lastfm": "Avaa Last.fm:ssä",
"musicbrainz": "Avaa MusicBrainz:ssä"
},
"goToPage": "mene sivulle",
"moveToBottom": "siirry pohjalle",
"moveToTop": "siirry ylös",
"addToFavorites": "lisää kohteeseen $t(entity.favorite_other)",
"addToPlaylist": "lisää kohteeseen $t(entity.playlist_one)",
"refresh": "$t(common.refresh)",
"removeFromFavorites": "poista kohteesta $t(entity.favorite_other)",
"toggleSmartPlaylistEditor": "kytke $t(entity.smartPlaylist) editori",
"deletePlaylist": "poista $t(entity.playlist_one)",
"removeFromPlaylist": "poista kohteesta $t(entity.playlist_one)",
"setRating": "aseta arvostelu",
"moveToNext": "siirry seuraavaan"
},
"error": {
"remoteEnableError": "virhe tapahtui yrittäessä $t(common.enable) etäpalvelinta",
"remotePortError": "virhe tapahtui etäpalvelimen porttia määrittäessä",
"serverNotSelectedError": "palvelinta ei ole valittu",
"remoteDisableError": "virhe tapahtui yrittäessä $t(common.disable) etäpalvelinta",
"serverRequired": "palvelin vaadittu",
"systemFontError": "virhe tapahtui yrittäessä hakea järjestelmän fontteja",
"sessionExpiredError": "istuntosi on vanhentunut",
"genericError": "tapahtui virhe",
"invalidServer": "virheellinen palvelin",
"audioDeviceFetchError": "äänentoistolaitteita haettaessa tapahtui virhe",
"authenticationFailed": "tunnistautuminen epäonnistui",
"badAlbum": "näet tämän sivun koska tämä kappale ei ole osa albumia. Näet tämän todennäköisesti jos kappaleesi on päämusiikkikansiosi juuressa. jellyfin ryhmittää kappaleet vain jos ne ovat kansiossa.",
"apiRouteError": "pyynnön reititys epäonnistui",
"credentialsRequired": "käyttäjätunnuksia vaaditaan",
"loginRateError": "liian monta kirjautumisyritystä, kokeile muutaman sekuntin päästä uudestaan",
"mpvRequired": "MPV vaadittu",
"networkError": "verkkoyhteysvirhe",
"openError": "tiedostoa ei voitu avata",
"localFontAccessDenied": "paikallisiin fontteihin pääsy on kielletty",
"playbackError": "mediaa toistaessa tapahtui virhe",
"remotePortWarning": "käynnistä palvelin uudestaan ottaaksesi uuden portin käyttöön",
"endpointNotImplementedError": "päätepiste {{endpoint}} ei ole toteutettu {{serverType}} varten",
"badValue": "kelpaamaton optio \"{{value}}\". tätä arvoa ei ole enää olemassa",
"notificationDenied": "luvat ilmouilmoituksia varten evättiin. tällä asetuksella ei ole vaikutusta"
},
"filter": {
"album": "$t(entity.album_one)",
"albumArtist": "$t(entity.albumArtist_one)",
"artist": "$t(entity.artist_one)",
"biography": "biografia",
"bitrate": "bittinopeus",
"bpm": "lyöntiä minuutissa (bpm)",
"channels": "$t(common.channel_other)",
"title": "otsikko",
"playCount": "toistomäärä",
"dateAdded": "lisätty päivänä",
"lastPlayed": "viimeksi toistettu",
"mostPlayed": "eniten toistettu",
"isRecentlyPlayed": "on äskettäin toistettu",
"rating": "arvostelu",
"recentlyAdded": "äskettäin lisätty",
"recentlyUpdated": "äskettäin päivitetty",
"releaseDate": "julkaisupäivä",
"toYear": "vuoteen",
"releaseYear": "julkaisuvuosi",
"search": "haku",
"trackNumber": "raita",
"isPublic": "on julkinen",
"genre": "$t(entity.genre_one)",
"favorited": "suosikeissa",
"fromYear": "vuodelta",
"isRated": "on arvosteltu",
"recentlyPlayed": "äskettäin toistetut",
"albumCount": "$t(entity.album_other) määrä",
"disc": "levy",
"duration": "kesto",
"id": "tunnus",
"random": "satunnainen",
"isFavorited": "on suosikeissa",
"isCompilation": "on osa kokoelmaa",
"comment": "kommentti",
"communityRating": "yhteisön arvostelu",
"criticRating": "kriitikon arvostelu",
"name": "nimi",
"note": "muistiinpano",
"owner": "$t(common.owner)",
"path": "polku",
"songCount": "kappalemäärä"
},
"form": {
"addServer": {
"input_legacyAuthentication": "käytä vanhaa kirjautumistapaa",
"ignoreCors": "ohita CORS ($t(common.restartRequired))",
"input_name": "palvelimen nimi",
"ignoreSsl": "ohita SSL ($t(common.restartRequired))",
"input_savePassword": "tallenna salasana",
"input_url": "url-osoite",
"title": "lisää palvelin",
"error_savePassword": "salasanaa tallentaessa tapahtui virhe",
"input_password": "salasana",
"input_username": "käyttäjänimi",
"success": "palvelin lisätty onnistuneesti"
},
"createPlaylist": {
"input_public": "julkinen",
"input_name": "$t(common.name)",
"input_owner": "$t(common.owner)",
"success": "$t(entity.playlist_one) luotu onnistuneesti",
"title": "luo $t(entity.playlist_one)",
"input_description": "$t(common.description)"
},
"addToPlaylist": {
"input_skipDuplicates": "ohita kaksoiskappaleet",
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) lisätty $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
"title": "lisää soittolistalle $t(entity.playlist_one)",
"input_playlists": "$t(entity.playlist_other)"
},
"updateServer": {
"success": "palvelin on päivitetty onnistuneesti",
"title": "päivitä palvelin"
},
"deletePlaylist": {
"success": "$t(entity.playlist_one) poistettu onnistuneesti",
"title": "poista $t(entity.playlist_one)",
"input_confirm": "kirjoita soittolistan $t(entity.playlist_one) nimi vahvistaaksesi"
},
"editPlaylist": {
"success": "$t(entity.playlist_one) päivitetty onnistuneesti",
"title": "muokkaa $t(entity.playlist_one)",
"publicJellyfinNote": "Jellyfin ei jostain syystä kerro onko soittolista julkinen vai ei. Jos haluat sen pysyvän julkisena, pidä seuraava valinta valittuna"
},
"lyricSearch": {
"input_artist": "$t(entity.artist_one)",
"input_name": "$t(common.name)",
"title": "sanojen haku"
},
"shareItem": {
"createFailed": "jaon luonti epäonnistui (onko jako päällä?)",
"allowDownloading": "salli lataus",
"description": "kuvaus",
"setExpiration": "aseta vanheneminen",
"success": "jakolinkki kopioitu leikepöydälle (tai klikkaa tästä avataksesi)",
"expireInvalid": "vanhetumisen pitää olla tulevaisuudessa"
},
"queryEditor": {
"input_optionMatchAny": "sovita joku",
"input_optionMatchAll": "sovita kaikki",
"title": "kyselyeditori"
}
},
"setting": {
"clearCacheSuccess": "välimuisti on tyhjennetty onnistuneesti",
"artistConfiguration_description": "valise näytettävät asiat ja niiden järjestys albumin artistin sivulla",
"audioDevice": "äänilaite",
"clearQueryCache_description": "feishinin 'pehmeä tyhjennys'. tämä tyhjentää soittolistat, raitojen metadatat ja tallennetut sanoitukset. asetukset, palvelimien käyttäjätunnukset ja välimuistissa olevat kuvat säilyvät",
"crossfadeDuration": "ristihäivytyksen kesto",
"audioPlayer_description": "valitse toistossa käytettävä soitin",
"buttonSize": "soittimen palkin nappien koko",
"buttonSize_description": "soittimen palkin nappien koko",
"clearCache": "tyhjennä selaimen välimuisti",
"clearQueryCache": "tyhjennä feishinin välimuisti",
"crossfadeDuration_description": "aseta ristihäivytystehosteen kesto",
"applicationHotkeys_description": "aseta sovelluksen pikanäppäimet. vaihda valintaruutua asettaaksesi valinta globaaliksi pikanäppäimeksi (vain työpöydällä)",
"crossfadeStyle": "ristihäivytyksen tyyli",
"crossfadeStyle_description": "valitse soittimessa käytettävän ristihäivytyksen tyyli",
"contextMenu_description": "mahdollistaa sinun piilottaa asiat, jotka näytetään valikossa klikatessasi objektia hiiren väärällä painikkella. poistetut valinnat piilotetaan",
"customCssEnable_description": "mahdollista oman css:n kirjoittaminen.",
"accentColor": "korostusväri",
"customCssEnable": "käytä omaa css:ää",
"albumBackgroundBlur_description": "säätää albumin taustakuvan sumennuksen määrää",
"audioExclusiveMode_description": "käytä yksinomaista ulostulotilaa. Tässä tilassa järjestelmä on yleensä lukittuna ja vain mpv voi tuottaa ääntä",
"albumBackgroundBlur": "albumin taustakuvan sumennuksen koko",
"clearCache_description": "feishinin 'kova tyhjennys'. feishinin välimuistin lisäksi tyhjennä selaimen välimuisti (tallennetut kuvat ja muut kohteet). palvelimien käyttäjättunnukset ja asetukset säilyvät",
"audioExclusiveMode": "äänen yksinomainen tila",
"audioPlayer": "soitin",
"contextMenu": "kontekstivalikon (hiiren väärä näppäin) asetukset",
"accentColor_description": "aseta sovelluksen korostusväri",
"albumBackground_description": "lisää taustakuva albumin sivuille, jotka sisältävät albumin kuvitusta",
"artistConfiguration": "albumin artistin sivun hallinta",
"audioDevice_description": "valitse toistossa käytettävä äänilaite (vain verkkosoittimessa)",
"applicationHotkeys": "sovelluksen pikanäppäimet",
"albumBackground": "albumin taustakuva",
"customCss": "oma css",
"customFontPath_description": "asettaa polun mukautetulle fontille jota sovellus käyttää",
"homeConfiguration": "koti sivun muokkaus",
"homeConfiguration_description": "määritä mitä osioita näkyy, ja missä järjestyksessä, koti sivulla",
"gaplessAudio_optionWeak": "heikko (suositus)",
"genreBehavior_description": "määrittää avautuuko generä painettaessa oletuksena ääniraita vaiko albumi listassa",
"hotkey_browserBack": "selain takaisin",
"hotkey_playbackPlay": "toista",
"hotkey_playbackPlayPause": "toista / tauko",
"hotkey_playbackPrevious": "edellinen ääniraita",
"hotkey_rate3": "arvostelu 3 tähteä",
"hotkey_playbackStop": "lopeta",
"hotkey_rate4": "arvostelu 4 tähteä",
"hotkey_rate1": "arvostelu 1 tähti",
"hotkey_rate2": "arvostelu 2 tähteä",
"hotkey_unfavoriteCurrentSong": "poista suosikeista $t(common.currentSong)",
"fontType_description": "sisäänrakennettu fontti valitsee yhden Feishinin tuomista fonteista. järjestelmän fontti antaa sinun valita minkä tahansa käyttöjärjestelmään asennetun fontin. mukautettu antaa sinun tuoda oman fontin",
"fontType_optionBuiltIn": "sisäänrakennettu fontti",
"fontType_optionSystem": "järjestelmän fontti",
"fontType_optionCustom": "mukautettu fontti",
"hotkey_favoriteCurrentSong": "lisää suosikiksi $t(common.currentSong)",
"hotkey_favoritePreviousSong": "lisää suosikiksi $t(common.previousSong)",
"hotkey_rate5": "arvostelu 5 tähteä",
"hotkey_skipBackward": "ohita taaksepäin",
"hotkey_skipForward": "ohita eteenpäin",
"font": "kirjaisin",
"font_description": "asettaa fontin jota sovellus käyttää",
"discordApplicationId": "{{discord}} sovelluksen tunnus",
"hotkey_globalSearch": "globaali haku",
"hotkey_playbackNext": "seuraava ääniraita",
"hotkey_browserForward": "selain eteenpäin",
"hotkey_playbackPause": "tauko",
"hotkey_localSearch": "hae sivulta",
"customFontPath": "mukautetun fontin polku",
"fontType": "fonttityyppi",
"hotkey_unfavoritePreviousSong": "poista suosikeista $t(common.previousSong)",
"customCss_description": "mukautettu CSS-sisältö. Huomautus: content- ja etä-URL-osoitteet ovat estettyjä ominaisuuksia. Esikatselu sisällöstäsi on alla. Lisäkenttiä, joita et ole määrittänyt, on näkyvissä puhdistuksen vuoksi.",
"customCssNotice": "Varoitus: vaikka jonkinlainen puhdistus onkin tehty (url()- ja content:-komentojen estäminen), mukautetun CSS:n käyttäminen voi silti aiheuttaa riskejä muuttamalla käyttöliittymää.",
"disableLibraryUpdateOnStartup": "poista uusimman version tarkistus käynnistyksen yhteydessä käytöstä",
"disableAutomaticUpdates": "poista automaattiset päivitykset käytöstä",
"discordIdleStatus": "näytä rich presencen käyttämätön tila",
"discordIdleStatus_description": "kun käytössä, päivitä tila kun soitin on käyttämättömänä",
"doubleClickBehavior": "lisää kaikki haetut kappaleet soittojonoon tuplaklikkauksella",
"discordUpdateInterval_description": "päivitysväli sekunnteina (vähintään 15 sekunttia)",
"discordRichPresence": "{{discord}} rich presence",
"discordRichPresence_description": "ota toiston tila käyttöön {{discord}}n rich presence-toiminnossa. Kuvakkeiden avaimet ovat {{icon}}, {{playing}} ja {{paused}}",
"discordUpdateInterval": "{{discord}} rich presencen päivitysväli",
"enableRemote": "aktivoi etäohjauspalvelin",
"externalLinks_description": "ottaa ulkoiset linkit (Last.fm, MusicBrainz) artistien/albumien sivuilla",
"exitToTray": "sulje tehtäväpalkkiin",
"doubleClickBehavior_description": "jos päällä, kaikki hakutuloksissa olevat kappaleet lisätään soittojonoon. muuten vain napsautettu kappale lisätään jonoon",
"discordApplicationId_description": "{{discord}}n ohjelma-ID rich presenceä varten (oletuksena {{defaultId}})",
"enableRemote_description": "aktivoi etäohjauspalvelimen, jolla muut laitteet voivat ohjata sovellusta",
"externalLinks": "näytä ulkoiset linkit",
"exitToTray_description": "sovellus suljetaan tehtäväpalkkiin",
"discordListening_description": "näytä status kuuntelee pelaa sijaan",
"discordListening": "näytä status kuuntelee",
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
"lastfmApiKey_description": "API-avain {{lastfm}}:lle. tarvitaan kansikuvia varten",
"passwordStore_description": "mitä salasanojen/avaimien tallennusta käytetään. muuta tätä, jos sinulla on ongelmia salasanojen tallennuksessa.",
"floatingQueueArea_description": "näyttää ikonin ikkunan oikealla reunalla jonon katselua varten",
"homeFeature_description": "ohjaa näytetäänkö suuri esittelykaruselli kotisivulla",
"hotkey_rate0": "arvostelun tyhjennys",
"hotkey_togglePreviousSongFavorite": "vaihda $t(common.previousSong) suosikkiasetus",
"imageAspectRatio_description": "jos käytössä, kansikuvat näytetään niiden alkuperäisellä kuvasuhteella. jos kuvasuhde ei ole 1:1, jäljelle jäävä tila jää tyhjäksi",
"language_description": "asettaa sovelluksen kielen $t(common.restartRequired)",
"lyricFetch": "hae sanoitukset internetistä",
"lyricFetchProvider_description": "valitse lähteet sanoituksien hakua varten. lähteiden järjestys on se järjestys, jossa ne tiedustellaan",
"minimumScrobblePercentage": "pienin skrobblauksen kesto (prosenttia)",
"mpvExecutablePath": "mpv:n suoritettavan tiedoston polku",
"mpvExecutablePath_description": "asettaa mpv:n suoritettavan tiedoston polun. ollessa tyhjä, käytetään oletuspolkua",
"mpvExtraParameters_help": "yksi per rivi",
"playButtonBehavior_optionPlay": "$t(player.play)",
"genreBehavior": "genre-sivun oletustoiminta",
"globalMediaHotkeys": "globaalit median pikanäppäimet",
"globalMediaHotkeys_description": "ota käyttöön tai poista käytöstä järjestelmän median pikanäppäinten käyttö toiston hallintaa",
"hotkey_toggleCurrentSongFavorite": "vaihda $t(common.currentSong) suosikkiasetus",
"imageAspectRatio": "käytä alkuperäistä kansikuvan kuvasuhdetta",
"language": "kieli",
"lyricOffset_description": "siirrä sanoituksia valitun ajan millisekuntteina",
"minimizeToTray": "pienennä ilmaisinalueelle",
"gaplessAudio_description": "asettaa tauottoman toiston asetukset mpv:hen",
"hotkey_volumeDown": "äänenvoimakkuuden vähentäminen",
"hotkey_zoomIn": "lähennä",
"lyricFetch_description": "hae sanoitukset eri lähteistä internetissä",
"lyricFetchProvider": "lähteet sanoituksia varten",
"lyricOffset": "sanotuksien siirto (ms)",
"mpvExtraParameters": "mpv:n parametrit",
"followLyric": "seuraa lyriikoita",
"followLyric_description": "vieritä lyriikat tämänhetkiseen paikkaan",
"hotkey_toggleQueue": "vaihda jono",
"minimumScrobblePercentage_description": "vähimmäisprosentti kappaleesta, joka on soitettava ennen kuin se skrobblataan",
"minimumScrobbleSeconds": "pienin skrobblaus (sekunttia)",
"minimumScrobbleSeconds_description": "vähimmäisaika kappaleesta, joka on soitettava ennen kuin se skrobblataan",
"passwordStore": "salasanojen/avaimien tallennus",
"hotkey_volumeUp": "äänenvoimakkuuden lisääminen",
"hotkey_toggleShuffle": "vaihda sekoitus",
"hotkey_volumeMute": "mykistäminen",
"lastfmApiKey": "{{lastfm}} API-avain",
"minimizeToTray_description": "pienennä sovellus ilmaisinalueelle",
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
"hotkey_zoomOut": "loitonna",
"floatingQueueArea": "näytä kelluvan jonon avausalue",
"homeFeature": "kodin esittelykaruselli",
"hotkey_toggleFullScreenPlayer": "vaihda kokonäytön toistin",
"hotkey_toggleRepeat": "vaihda kertaus",
"gaplessAudio": "tauoton toisto",
"transcodeFormat_description": "valitsee transkoodattavan formaatin. jätä tyhjäksi palvelimen valintaa varten",
"replayGainMode_optionNone": "$t(common.none)",
"replayGainMode_optionTrack": "$t(entity.track_one)",
"themeDark": "teema (tumma)",
"transcodeNote": "tulee voimaan 1 (web) - 2 (mpv) kappaleen jälkeen",
"translationApiKey_description": "API-avain käännöstä varten (tukee vain globaalia palvelun palvelupistettä)",
"playbackStyle_description": "valitse toiston tyyli, jota käytetään soittimessa",
"transcode_description": "ottaa transkoodaksen käyttöön eri formaateille",
"transcodeBitrate": "transkoodattava bittinopeus",
"translationApiProvider": "käännös-API:n palveluntarjoaja",
"trayEnabled_description": "näytä/piilota järjestelmäpalkin kuvake/valikko. jos poistettu käytöstä, myös pienennä/sulje järjestelmäpalkkiin -toiminto poistetaan käytöstä",
"windowBarStyle_description": "valitse ikkunapalkin tyyli",
"webAudio": "käytä web-ääntä",
"windowBarStyle": "ikkunapalkin tyyli",
"zoom": "zoomausprosentti",
"playbackStyle": "toiston tyyli",
"remotePassword": "kauko-ohjauspalvelimen salasana",
"remoteUsername_description": "asettaa käyttäjänimen kauko-ohjauspalvelimelle. jos sekä käyttäjätunnus, että salasana ovat tyhjänä, todennus poistetaan käytöstä",
"skipPlaylistPage": "ohita soittolistojen sivu",
"themeDark_description": "asettaa tumman teeman käytettäväksi sovelluksessa",
"playbackStyle_optionCrossFade": "ristivaihto",
"playbackStyle_optionNormal": "normaali",
"playButtonBehavior": "toistopainikkeen toiminta",
"playButtonBehavior_description": "asettaa toistopainikkeen oletustoiminnan lisättäessä kappaleita jonoon",
"remotePort": "kauko-ohjauspalvelimen portti",
"replayGainMode": "{{ReplayGain}} tila",
"sampleRate_description": "valitse käytettävä näytteenottotaajuus, jos valittu näytetaajuus poikkeaa nykyisen median taajuudesta. arvo, joka on alle 8 000, käyttää oletustaajuutta",
"skipDuration": "ohituksen kesto",
"sidePlayQueueStyle_description": "asettaa tyylin sivupalkin toistojonolle",
"sidePlayQueueStyle_optionAttached": "liitetty",
"sidePlayQueueStyle_optionDetached": "irrotettu",
"startMinimized_description": "käynnistä sovellus järjestelmäpalkissa",
"theme": "teema",
"useSystemTheme_description": "seuraa järjestelmän määrittämää asetusta vaalealle tai tummalle asetukselle",
"remoteUsername": "kauko-ohjauspalvelimen käyttäjänimi",
"remotePort_description": "asettaa kauko-ohjauspalvelimen portin",
"remotePassword_description": "asettaa kauko-ohjauspalvelimen salasanan. Nämä tunnukset siirretään oletuksena turvattomasti, joten sinun kuuluisi käyttää uniikkia salasanaa, josta et välitä",
"replayGainClipping": "{{ReplayGain}} leikkaus",
"replayGainClipping_description": "Estää {{ReplayGain}}n aiheuttaman leikkauksen laskemalla vahvistusta automaatisesti",
"replayGainFallback": "{{ReplayGain}} palautus",
"playerAlbumArtResolution_description": "suurien kansikuvien resoluutio soittimen esikatselussa. suurempi tekee niistä terävempiä, mutta voi hidastaa latausta. oletuksena on 0, joka tarkoittaa automaattista",
"replayGainMode_optionAlbum": "$t(entity.album_one)",
"replayGainPreamp": "{{ReplayGain}} esivahvistus (dB)",
"scrobble_description": "skrobblaa toistot mediapalvelimellesi",
"replayGainPreamp_description": "säätää esivahvistuksen määrää {{ReplayGain}} arvoon",
"showSkipButtons": "näytä ohituspainikkeet",
"showSkipButtons_description": "näytä tai piilota soitinpalkin ohituspainikkeet",
"showSkipButton": "näytä ohituspainikkeet",
"showSkipButton_description": "näytä tai piilota soitinpalkin ohituspainikkeet",
"sidebarPlaylistList": "sivupakin soittolistojen lista",
"skipDuration_description": "asettaa ohitettavan ajan käytettäessä soitinpalkin ohituspainikkeita",
"volumeWidth": "äänenvoimakkuuden säätimen leveys",
"sidebarCollapsedNavigation_description": "näytä tai piilota navigointi romautetussa sivupalkissa",
"sidebarConfiguration": "sivupalkin asetukset",
"sidebarConfiguration_description": "valitse kohteet ja niiden järjestys sivupalkissa",
"volumeWidth_description": "äänenvoimakkuuden säätimen leveys",
"playerAlbumArtResolution": "soittimen kansikuvien resoluutio",
"playerbarOpenDrawer": "toistipalkin kokoruudun kytkin",
"playerbarOpenDrawer_description": "sallii toistopalkin klikkaamisen avaamaan kokonäytön soittimen",
"replayGainFallback_description": "asetettava vahvistus desibelinä (dB), jos tiedostolla ei ole {{ReplayGain}} tageja",
"replayGainMode_description": "säätää äänenvoimmakkuutta {{ReplayGain}} arvojen mukaisesti tiedoston metadatasta",
"sampleRate": "näytteenottotaajuus",
"savePlayQueue": "tallenna toistojono",
"savePlayQueue_description": "tallenna toistojono, kun sovellus suljetaan ja avaa se uudestaan, kun sovellus avataan",
"scrobble": "skrobblaus",
"sidebarCollapsedNavigation": "sivupalkin (romautettu) navigointi",
"sidebarPlaylistList_description": "näytä tai piilota soittolistojen lista sivupalkissa",
"sidePlayQueueStyle": "sivupalkin jonon tyyli",
"skipPlaylistPage_description": "navigoidessa soittolistaan, mene soittolistan kappaleiden listaan oletussivun sijaan",
"theme_description": "asettaa ohjelmassa käytettävän teeman",
"themeLight": "teema (vaalea)",
"themeLight_description": "asettaa vaalean teeman käytettäväksi sovelluksessa",
"transcode": "ota transkoodaus käyttöön",
"transcodeBitrate_description": "valitsee transkoodattavan bittinopeuden. 0 tarkoittaa palvelimen valintaa",
"transcodeFormat": "transkoodattava formaatti",
"translationApiProvider_description": "palveluntarjoajan API käännöstä varten",
"translationApiKey": "käännöksen API-avain",
"translationTargetLanguage": "käännöksen kohdekieli",
"translationTargetLanguage_description": "kohdekieli käännöstä varten",
"trayEnabled": "näytä järjestelmäpalkki",
"volumeWheelStep_description": "äänenvoimakkuuden muutoksen suuruus rullattaessa hiiren rullalla äänenvoimakkuuden säätimen päällä",
"zoom_description": "asettaa sovelluksen zoomausprosentin",
"webAudio_description": "käytä web-ääntä. tämä mahdollistaa edistyneet ominaisuudet, kuten replaygainin. poista käytöstä, jos koet ongelmia",
"startMinimized": "käynnistä pienennettynä",
"useSystemTheme": "käytä järjestelmän teemaa",
"volumeWheelStep": "äänenvoimakkuusrullan askel",
"discordServeImage": "jaa {{discord}} kuvat palvelimelta",
"discordServeImage_description": "jaa kansikuvat {{discord}}n rich presenceä varten suoraan palvelimelta. saatavilla vain jellyfinille ja navidromelle",
"musicbrainz_description": "näytä linkit musicbrainz sivulle artistin/albumin sivuilla, jos musicbrainz-id löytyy",
"lastfm": "näytä last.fm linkit",
"lastfm_description": "näytä linkit last.fm sivulle artistin/albumin sivuilla",
"musicbrainz": "näytä musicbrainz linkit",
"neteaseTranslation": "Ota NetEasen käännökset käyttöön",
"neteaseTranslation_description": "Käytöss ollessa noutaa ja näyttää käännetyt sanat NetEasesta, jos ne ovat saatavilla.",
"preferLocalLyrics_description": "suosi paikallisia sanoituksia ulkoisten sijasta, kun saatavilla",
"preferLocalLyrics": "suosi paikallisia sanoituksia",
"discordPausedStatus": "näytä rich presence tauotettuna",
"discordPausedStatus_description": "ollessak käytössä, status näyttää milloin soitin on tautotettuna",
"preservePitch": "säilytä sävelkorkeus",
"preservePitch_description": "säilytä sävelkorkeus toistonopeutta muokatessa",
"notify": "käytä kappaleen ilmoituksia",
"notify_description": "näytä limoituksia, kun vaihdetaan nykyistä kappaletta"
},
"page": {
"itemDetail": {
"copiedPath": "polku on kopioitu onnistuneesti",
"copyPath": "kopioi reitti leikepöytälle",
"openFile": "näytä kappale tiedostonhallinnassa"
},
"albumArtistList": {
"title": "$t(entity.albumArtist_other)"
},
"albumDetail": {
"moreFromArtist": "siirrä kohteesta $t(entity.artist_one)",
"moreFromGeneric": "listää kohteesta {{item}}",
"released": "julkaistu"
},
"albumList": {
"artistAlbums": "artistin {{artist}} albumit",
"genreAlbums": "\"{{genre}}\"$t(entity.album_other)",
"title": "$t(entity.album_other)"
},
"appMenu": {
"goBack": "mene takaisin",
"openBrowserDevtools": "avaa selaimen kehitystyökalut",
"quit": "$t(common.quit)",
"selectServer": "valitse palvelin",
"settings": "$t(common.setting_other)",
"expandSidebar": "laajenna sivupalkki",
"goForward": "mene eteenpäin",
"manageServers": "hallitse palvelimia",
"collapseSidebar": "kutista sivupalkki",
"version": "versio {{version}}"
},
"contextMenu": {
"playSimilarSongs": "$t(player.playSimilarSongs)",
"addNext": "$t(player.addNext)",
"addToFavorites": "$t(action.addToFavorites)",
"addToPlaylist": "$t(action.addToPlaylist)",
"createPlaylist": "$t(action.createPlaylist)",
"deletePlaylist": "$t(action.deletePlaylist)",
"deselectAll": "$t(action.deselectAll)",
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
"setRating": "$t(action.setRating)",
"playShuffled": "$t(player.shuffle)",
"numberSelected": "{{count}} valittuna",
"play": "$t(player.play)",
"download": "lataa",
"moveToBottom": "$t(action.moveToBottom)",
"moveToTop": "$t(action.moveToTop)",
"removeFromFavorites": "$t(action.removeFromFavorites)",
"shareItem": "jaa kohde",
"showDetails": "lisätietoa",
"addFavorite": "$t(action.addToFavorites)",
"addLast": "$t(player.addLast)",
"moveToNext": "$t(action.moveToNext)",
"removeFromQueue": "$t(action.removeFromQueue)"
},
"sidebar": {
"albumArtists": "$t(entity.albumArtist_other)",
"albums": "$t(entity.album_other)",
"settings": "$t(common.setting_other)",
"shared": "$t(entity.playlist_other) jaettu",
"tracks": "$t(entity.track_other)",
"artists": "$t(entity.artist_other)",
"folders": "$t(entity.folder_other)",
"genres": "$t(entity.genre_other)",
"home": "$t(common.home)",
"nowPlaying": "nyt soi",
"playlists": "$t(entity.playlist_other)",
"search": "$t(common.search)",
"myLibrary": "oma kirjasto"
},
"setting": {
"generalTab": "yleinen",
"windowTab": "ikkuna",
"hotkeysTab": "pikanäppäimet",
"playbackTab": "toisto",
"advanced": "edistyneet"
},
"fullscreenPlayer": {
"upNext": "seuraavaksi",
"visualizer": "visualisaattori",
"noLyrics": "sanoja ei löytynyt",
"config": {
"showLyricMatch": "näytä sanojen yhteneväisyys",
"showLyricProvider": "näytä sanojen tarjoaja",
"lyricGap": "sanojen rako",
"synchronized": "synkronoitu",
"lyricSize": "sanojen koko",
"opacity": "läpinäkyvyys",
"unsynchronized": "synkronoimaton",
"useImageAspectRatio": "käytä kuvan kuvasuhdetta",
"dynamicBackground": "liikkuva tausta",
"dynamicImageBlur": "kuvan sumennuksen koko",
"dynamicIsImage": "käytä taustakuvaa",
"lyricOffset": "sanojen kompensointi (ms)",
"followCurrentLyric": "seuraa nykyisiä sanoja",
"lyricAlignment": "sanojen kohdistus"
},
"lyrics": "sanat",
"related": "liittyvät"
},
"genreList": {
"showAlbums": "näytä $t(entity.genre_one) $t(entity.album_other)",
"showTracks": "näytä $t(entity.genre_one) $t(entity.track_other)",
"title": "$t(entity.genre_other)"
},
"globalSearch": {
"commands": {
"searchFor": "hae {{query}}",
"serverCommands": "palvelimen komennot",
"goToPage": "mene sivulle"
},
"title": "komennot"
},
"home": {
"explore": "tutki kirjastotasi",
"recentlyPlayed": "hiljattain soitetut",
"title": "$t(common.home)",
"mostPlayed": "eniten soitetut",
"newlyAdded": "hiljattain lisätyt julkaisut"
},
"albumArtistDetail": {
"about": "{{artist}}{sta/stä",
"viewDiscography": "katsele diskografiaa",
"relatedArtists": "liittyvät $t(entity.artist_other)",
"appearsOn": "esiintyy",
"topSongs": "parhaat kappaleet",
"topSongsFrom": "parhaat kappaleet albumilta {{title}}",
"recentReleases": "hiljattaiset julkaisut",
"viewAll": "katsele kaikkia",
"viewAllTracks": "katsele kaikkia $t(entity.track_other)"
},
"playlistList": {
"title": "$t(entity.playlist_other)"
},
"manageServers": {
"title": "hallitse palvelimia",
"serverDetails": "palvelimen lisätiedot",
"url": "URL",
"username": "käyttäjänimi",
"editServerDetailsTooltip": "muokkaa palvelimen lisätietoja",
"removeServer": "etäpalvelin"
},
"playlist": {
"reorder": "uudelleenjärjestely mahdollista vain, kun järjestellään id:n mukaan"
},
"trackList": {
"artistTracks": "artistin {{artist}} kappaleet",
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
"title": "$t(entity.track_other)"
}
},
"player": {
"addLast": "lisää viimeinen",
"addNext": "lisää seuraava",
"favorite": "suosikki",
"queue_moveToTop": "siirrä valittu alas",
"queue_remove": "poista valittu",
"repeat": "kertaus",
"previous": "edellinen",
"queue_clear": "tyhjennä jono",
"skip": "ohita",
"skip_forward": "ohita eteenpäin",
"stop": "pysäytä",
"skip_back": "ohita taaksepäin",
"unfavorite": "poista suosikeista",
"playbackFetchNoResults": "kappaleita ei löytynyt",
"queue_moveToBottom": "siittä valittu ylös",
"pause": "tauota",
"playbackSpeed": "toistonopeus",
"repeat_all": "kertaa kaikki",
"playbackFetchCancel": "tämä vie aikaa... sulje ilmoitus peruaksesi",
"mute": "mykistä",
"shuffle": "soita sekoitettuna",
"next": "seuraava",
"play": "toista",
"playbackFetchInProgress": "ladataan kappaleita…",
"viewQueue": "katsele jonoa",
"muted": "mykistetty",
"playRandom": "toista satunnainen",
"playSimilarSongs": "toista samanlaisia kappaleita",
"repeat_off": "kertaus pois päältä",
"shuffle_off": "sekoitus pois päältä",
"toggleFullscreenPlayer": "vaihda kokoruudun soittimeen"
},
"table": {
"config": {
"general": {
"gap": "$t(common.gap)",
"size": "$t(common.size)",
"autoFitColumns": "sovita sarakkeet",
"followCurrentSong": "seuraa nykyistä kappaletta",
"displayType": "näytön tyyppi",
"itemGap": "kohteiden väli (px)",
"itemSize": "kohteiden koko (px)",
"tableColumns": "taulukon sarakkeet"
},
"label": {
"channels": "$t(common.channel_other)",
"trackNumber": "raidan numero",
"album": "$t(entity.album_one)",
"actions": "$t(common.action_other)",
"codec": "$t(common.codec)",
"dateAdded": "lisäyspäivämäärä",
"owner": "$t(common.owner)",
"path": "$t(common.path)",
"albumArtist": "$t(entity.albumArtist_one)",
"artist": "$t(entity.artist_one)",
"discNumber": "levyn numero",
"duration": "$t(common.duration)",
"favorite": "$t(common.favorite)",
"lastPlayed": "viimeksi soitettu",
"note": "$t(common.note)",
"titleCombined": "$t(common.title) (yhdistetty)",
"rowIndex": "rivin indeksi",
"biography": "$t(common.biography)",
"bitrate": "$t(common.bitrate)",
"bpm": "$t(common.bpm)",
"genre": "$t(entity.genre_one)",
"playCount": "toistojen lukumäärä",
"rating": "$t(common.rating)",
"releaseDate": "julkaisupäivämäärä",
"size": "$t(common.size)",
"songCount": "$t(entity.track_other)",
"title": "$t(common.title)",
"year": "$t(common.year)"
},
"view": {
"table": "taulukko",
"card": "kortti",
"poster": "juliste",
"grid": "ruudukko",
"list": "lista"
}
},
"column": {
"releaseYear": "vuosi",
"bpm": "bpm",
"artist": "$t(entity.artist_one)",
"biography": "biografia",
"dateAdded": "lisäyspäivämäärä",
"album": "albumi",
"albumArtist": "albumin artisti",
"lastPlayed": "viimeksi toistettu",
"path": "polku",
"size": "$t(common.size)",
"songCount": "$t(entity.track_other)",
"title": "nimi",
"trackNumber": "raita",
"codec": "$t(common.codec)",
"comment": "kommentti",
"albumCount": "$t(entity.album_other)",
"bitrate": "bittinopeus",
"channels": "$t(common.channel_other)",
"discNumber": "levy",
"favorite": "suosikki",
"genre": "$t(entity.genre_one)",
"playCount": "toistoja",
"rating": "arvostelu",
"releaseDate": "julkaisupäivämäärä"
}
}
}

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