184 Commits
Author SHA1 Message Date
austinried ad12a7e15d don't use build number in version 2023-04-28 16:04:59 +09:00
austinried 1c5fea2dd4 Update README.md 2023-04-28 13:22:23 +09:00
austinried 90ac4dc59b fix weblate multiple language issue 2023-04-28 13:13:07 +09:00
austinried 11e50946d2 build on tags 2023-04-28 12:58:49 +09:00
austinried abd0bcd4b9 setup workflows for main 2023-04-28 12:26:02 +09:00
austinried c3c957d527 create .env file first 2023-04-28 12:26:02 +09:00
austinried f415d8a98f rename workflow 2023-04-28 12:26:02 +09:00
austinried 963c15636c aab build, release signing
clean up analyze issues
2023-04-28 12:26:02 +09:00
austinried 7562d93113 get version? 2023-04-28 12:26:02 +09:00
austinried aae58bc5ee use a valid .env file from example 2023-04-28 12:26:02 +09:00
austinried 5be08c16d5 please grab artifact 2023-04-28 12:26:02 +09:00
austinried 0f29b757ee forgot .env file 2023-04-28 12:26:02 +09:00
austinried 49b8d2c423 signing config & build apk 2023-04-28 12:26:02 +09:00
austinried f0f812e66a v2 2023-04-28 12:26:02 +09:00
mohammed_9456 35b037f66c Better README 2023-04-27 18:08:38 +09:00
Roman 985995d45d Translated using Weblate (Czech)
Currently translated at 82.0% (55 of 67 strings)

Translated using Weblate (Czech)

Currently translated at 1.4% (1 of 67 strings)

Added translation using Weblate (Czech)

Co-authored-by: Roman <peposik.r@seznam.cz>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/cs/
Translation: Subtracks/subtracks
2023-03-24 09:07:53 +09:00
Burak Orcun OZKABLAN cb786d6360 Translated using Weblate (Turkish)
Currently translated at 100.0% (67 of 67 strings)

Co-authored-by: Burak Orcun OZKABLAN <borcunozkablan@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/tr/
Translation: Subtracks/subtracks
2023-03-24 09:07:53 +09:00
Mohammed 89416a9017 Translated using Weblate (Arabic)
Currently translated at 97.0% (65 of 67 strings)

Added translation using Weblate (Arabic)

Co-authored-by: Mohammed <lym0991903165@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ar/
Translation: Subtracks/subtracks
2023-03-24 09:07:53 +09:00
jazzyjabroni 6aa8df7d9a Translated using Weblate (Danish)
Currently translated at 82.0% (55 of 67 strings)

Translated using Weblate (Danish)

Currently translated at 77.6% (52 of 67 strings)

Co-authored-by: jazzyjabroni <lordcarmack@tuta.io>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/da/
Translation: Subtracks/subtracks
2023-03-24 09:07:53 +09:00
Maite Guix 16f9f8c54d Translated using Weblate (Catalan)
Currently translated at 100.0% (67 of 67 strings)

Co-authored-by: Maite Guix <maite.guix@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ca/
Translation: Subtracks/subtracks
2023-03-24 09:07:53 +09:00
mariobros 2b041580de Translated using Weblate (Punjabi)
Currently translated at 100.0% (67 of 67 strings)

Translated using Weblate (Punjabi)

Currently translated at 71.6% (48 of 67 strings)

Co-authored-by: mariobros <damanjitsingh96@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/pa/
Translation: Subtracks/subtracks
2023-03-24 09:07:53 +09:00
Nikita Epifanov 9de0984553 Translated using Weblate (Russian)
Currently translated at 100.0% (67 of 67 strings)

Co-authored-by: Nikita Epifanov <nikgreens@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ru/
Translation: Subtracks/subtracks
2022-07-12 16:12:23 +09:00
M-Kedzior 4a73c0ba17 Translated using Weblate (Polish)
Currently translated at 100.0% (67 of 67 strings)

Added translation using Weblate (Polish)

Co-authored-by: M-Kedzior <marcin.kedzior@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/pl/
Translation: Subtracks/subtracks
2022-07-12 16:12:23 +09:00
Joel Calado 3d1d226c43 Translated using Weblate (Portuguese)
Currently translated at 100.0% (67 of 67 strings)

Translated using Weblate (Portuguese)

Currently translated at 11.9% (8 of 67 strings)

Added translation using Weblate (Portuguese)

Co-authored-by: Joel Calado <joelcalado@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/pt/
Translation: Subtracks/subtracks
2022-07-04 10:14:43 +09:00
Xosé M ccead686aa Translated using Weblate (Galician)
Currently translated at 100.0% (67 of 67 strings)

Added translation using Weblate (Galician)

Co-authored-by: Xosé M <xosem@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/gl/
Translation: Subtracks/subtracks
2022-06-28 14:01:35 +09:00
Clyhtsuriva 1f57cc503c Translated using Weblate (French)
Currently translated at 100.0% (67 of 67 strings)

Co-authored-by: Clyhtsuriva <aimeric@adjutor.xyz>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/
Translation: Subtracks/subtracks
2022-06-20 19:06:26 +09:00
austinried 24f9fddae0 Create PRIVACY.md 2022-06-20 19:01:25 +09:00
Maite Guix e4875b10de Translated using Weblate (Catalan)
Currently translated at 98.5% (66 of 67 strings)

Co-authored-by: Maite Guix <maite.guix@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ca/
Translation: Subtracks/subtracks
2022-06-20 18:17:46 +09:00
mariobros 48f1a4ca3a Translated using Weblate (Punjabi)
Currently translated at 70.1% (47 of 67 strings)

Translated using Weblate (Punjabi)

Currently translated at 47.7% (32 of 67 strings)

Co-authored-by: mariobros <damanjitsingh96@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/pa/
Translation: Subtracks/subtracks
2022-06-20 18:17:46 +09:00
dependabot[bot] 0a475c0a0f Bump simple-plist from 1.3.0 to 1.3.1
Bumps [simple-plist](https://github.com/wollardj/simple-plist) from 1.3.0 to 1.3.1.
- [Release notes](https://github.com/wollardj/simple-plist/releases)
- [Commits](https://github.com/wollardj/simple-plist/compare/v1.3.0...v1.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-06 09:37:26 +09:00
Ali Mürteza Yeşil 1859c5c32d Translated using Weblate (Turkish)
Currently translated at 95.5% (64 of 67 strings)

Added translation using Weblate (Turkish)

Co-authored-by: Ali Mürteza Yeşil <murtezayesil@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/tr/
Translation: Subtracks/subtracks
2022-06-06 08:52:40 +09:00
HeavyDutySoul f159a8fc42 Translated using Weblate (Russian)
Currently translated at 95.5% (64 of 67 strings)

Co-authored-by: HeavyDutySoul <putsli@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ru/
Translation: Subtracks/subtracks
2022-05-07 19:13:31 +09:00
Quyen Truong f700ac9935 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (67 of 67 strings)

Added translation using Weblate (Vietnamese)

Co-authored-by: Quyen Truong <quyent22@cs.washington.edu>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/vi/
Translation: Subtracks/subtracks
2022-05-07 19:13:31 +09:00
ChocolateMoo53 70729bb0e5 Translated using Weblate (Spanish)
Currently translated at 100.0% (67 of 67 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (67 of 67 strings)

Co-authored-by: ChocolateMoo53 <rion020806@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/es/
Translation: Subtracks/subtracks
2022-05-07 19:13:31 +09:00
Sargon-Isa 7d5b0d285d Translated using Weblate (German)
Currently translated at 100.0% (67 of 67 strings)

Co-authored-by: Sargon-Isa <Sargon_isa@hotmail.de>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/de/
Translation: Subtracks/subtracks
2022-05-03 12:07:17 +09:00
ChocolateMoo53 72f53d6d21 Translated using Weblate (Spanish)
Currently translated at 2.9% (2 of 67 strings)

Added translation using Weblate (Spanish)

Co-authored-by: ChocolateMoo53 <rion020806@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/es/
Translation: Subtracks/subtracks
2022-05-03 12:07:17 +09:00
mariobros 5707c93295 Translated using Weblate (Punjabi)
Currently translated at 8.9% (6 of 67 strings)

Added translation using Weblate (Punjabi)

Co-authored-by: mariobros <damanjitsingh96@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/pa/
Translation: Subtracks/subtracks
2022-05-03 12:07:17 +09:00
jazzyjabroni 46a90169a9 Translated using Weblate (Danish)
Currently translated at 74.6% (50 of 67 strings)

Co-authored-by: jazzyjabroni <lordcarmack@tuta.io>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/da/
Translation: Subtracks/subtracks
2022-04-28 18:17:43 +09:00
austinried 27754bd3c3 minor reorg/cleanup 2022-04-28 15:41:45 +09:00
austinried 2bf3e8853d 1.3.0 changelog 2022-04-26 13:19:45 +09:00
austinried e14099472a bump version 1.3.0 2022-04-26 13:17:01 +09:00
austinried ac06e21f37 Update release.yml 2022-04-26 12:53:43 +09:00
austinried 92e2fd93f9 Create release.yml 2022-04-26 12:49:50 +09:00
jazzyjabroni a5ccba69ec Translated using Weblate (Danish)
Currently translated at 59.7% (40 of 67 strings)

Added translation using Weblate (Danish)

Co-authored-by: jazzyjabroni <lordcarmack@tuta.io>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/da/
Translation: Subtracks/subtracks
2022-04-26 11:59:34 +09:00
Sargon-Isa 23eb05a368 Translated using Weblate (German)
Currently translated at 100.0% (67 of 67 strings)

Co-authored-by: Sargon-Isa <Sargon_isa@hotmail.de>
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/de/
Translation: Subtracks/subtracks
2022-04-26 11:59:34 +09:00
austinried 1f9ee9b462 Merge remote-tracking branch 'weblate/main' into main 2022-04-21 15:01:28 +09:00
Weblate (bot)andHillwah 237b8d2fc6 Translations update from Hosted Weblate (#112)
* Added translation using Weblate (Chinese (Simplified))

* Translated using Weblate (Chinese (Simplified))

Currently translated at 86.5% (58 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/zh_Hans/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (67 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/zh_Hans/

Co-authored-by: Hillwah <curvycode@gmail.com>
2022-04-21 15:00:36 +09:00
Hillwah 35eada710e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (67 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/zh_Hans/
2022-04-21 07:58:39 +02:00
Hillwah 86ef5af6f6 Translated using Weblate (Chinese (Simplified))
Currently translated at 86.5% (58 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/zh_Hans/
2022-04-21 07:58:39 +02:00
Hillwah 76b290c8b3 Added translation using Weblate (Chinese (Simplified)) 2022-04-21 07:58:39 +02:00
austinried a92ad7bfc9 Bugfix/large playlist crash (#111)
* get all song coverArt as they are rendered

doing it all up front was too heavy
temporarily disabled mapping artwork in setQueue, need to fix this

* use cache data for track artwork when available

* fix round art in context menu for songs

* set only the first artwork at play time

then set the rest in the playback service

* handle both cached images and fetching images

* remove commented code

* fix shuffle

fix first thumbnail not being updated on shuffle for now playing background
2022-04-21 14:58:35 +09:00
austinried 1944add558 disable/unmount tabs while clearing image cache 2022-04-21 12:32:01 +09:00
austinried 05e4b46469 fix context menu i18n & view actions 2022-04-21 11:16:28 +09:00
austinried 00652952d8 remove CHECK_LICENSE permission
seems to have been added by react-native-blob-util
2022-04-19 12:55:47 +09:00
retiolus 83864217f9 Translated using Weblate (Catalan)
Currently translated at 89.5% (60 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ca/
2022-04-19 10:30:08 +09:00
retiolus b3ab75699e Added translation using Weblate (Catalan) 2022-04-19 10:30:08 +09:00
Saverio Napolitano 5cde911113 Translated using Weblate (Italian)
Currently translated at 100.0% (67 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/it/
2022-04-19 10:30:08 +09:00
Saverio Napolitano 7fda50857f Added translation using Weblate (Italian) 2022-04-19 10:30:08 +09:00
austinried 4ab51ea11a Update issue templates 2022-04-19 10:02:51 +09:00
Austin Riedhammer fcd5c1b167 Translated using Weblate (Japanese)
Currently translated at 28.3% (19 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ja/
2022-04-17 15:06:51 +09:00
austinried 2ccb397164 Merge branch 'main' of github.com:austinried/subtracks into main 2022-04-16 20:20:55 +09:00
Weblate (bot)andSargon 4e3a3133d7 Translations update from Hosted Weblate (#103)
* Translated using Weblate (German)

Currently translated at 97.0% (65 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/de/

* Translated using Weblate (German)

Currently translated at 100.0% (67 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/de/

Co-authored-by: Sargon <Sargon_isa@hotmail.de>
2022-04-16 20:16:59 +09:00
Sargon 2edd3a73fd Translated using Weblate (German)
Currently translated at 100.0% (67 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/de/
2022-04-16 11:38:38 +02:00
Sargon 4855043cda Translated using Weblate (German)
Currently translated at 97.0% (65 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/de/
2022-04-16 11:38:38 +02:00
austinried e6e997e4b5 fix plurals falling back to en when no count 2022-04-16 18:38:22 +09:00
austinried c78fc65279 fix empty strings in nb-NO
(i don't know how to pluralize these though, just placeholders)
2022-04-16 18:06:59 +09:00
austinried 52e95dc959 don't use i18n namespaces
there's no need to keep reloading different parts of the object we already cached
2022-04-16 18:06:06 +09:00
austinried b8948fb646 fix norwegian language not being selected
use BCP langauge codes for file names
2022-04-16 17:41:36 +09:00
austinried a91ac29626 Merge remote-tracking branch 'weblate/main' into main 2022-04-16 17:16:19 +09:00
aca677a432 Translations update from Hosted Weblate (#102)
* Added translation using Weblate (German)

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 98.5% (66 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/nb_NO/

* Translated using Weblate (French)

Currently translated at 100.0% (67 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/

* Translated using Weblate (Russian)

Currently translated at 95.5% (64 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ru/

* Translated using Weblate (German)

Currently translated at 94.0% (63 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/de/

Co-authored-by: Sargon <Sargon_isa@hotmail.de>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Clyhtsuriva <aimeric@adjutor.xyz>
Co-authored-by: Nikita Epifanov <nikgreens@protonmail.com>
2022-04-16 17:10:23 +09:00
Sargon 708a404a21 Translated using Weblate (German)
Currently translated at 94.0% (63 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/de/
2022-04-16 10:01:49 +02:00
Nikita Epifanov 7fa861d609 Translated using Weblate (Russian)
Currently translated at 95.5% (64 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ru/
2022-04-16 10:01:49 +02:00
Clyhtsuriva 5a201c783f Translated using Weblate (French)
Currently translated at 100.0% (67 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/
2022-04-16 10:01:49 +02:00
Allan Nordhøy f98ed31475 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.5% (66 of 67 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/nb_NO/
2022-04-16 10:01:49 +02:00
Sargon 6ebf1d265e Added translation using Weblate (German) 2022-04-16 10:01:49 +02:00
austinried 07c4d14adf don't require build for i18n file PRs 2022-04-16 17:01:39 +09:00
Weblate (bot)andNikita Epifanov 6b1b4c2c4f Added translation using Weblate (Russian) (#101)
Co-authored-by: Nikita Epifanov <nikgreens@protonmail.com>
2022-04-15 22:49:15 +09:00
dependabot[bot] 658d134f64 Bump async from 2.6.3 to 2.6.4 (#100)
Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4.
- [Release notes](https://github.com/caolan/async/releases)
- [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md)
- [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-15 14:02:22 +09:00
austinried a9dbcfb69d add edit server string i18n
set add/edit header title with i18n
fix albums plural in artist view
2022-04-15 12:55:11 +09:00
860a4cec16 Localization support (#99)
* basic i18n poc

* translate home, filters, tabs

support dot notation in backend for namespaces

* i18n context menu, artist filters, list controls

also nothings here
fix backend not caching fallback

* i18n queue, artist view, search/results

* i18n settings and server view

* Added translation using Weblate (Norwegian Bokmål)

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (6 of 6 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/nb_NO/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/

* fix url escaping

* added some mostly naive text overflow fixes

rewrote filter context menu as a slide in because the old one apparently can't handle dynamic width

* Added translation using Weblate (French)

* Translated using Weblate (French)

Currently translated at 17.4% (11 of 63 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/

* Translated using Weblate (French)

Currently translated at 19.0% (12 of 63 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/

* Translated using Weblate (French)

Currently translated at 40.0% (26 of 65 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/

* add weblate and some pretty badges to readme

* fix link

* Translated using Weblate (French)

Currently translated at 50.7% (33 of 65 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/

* Translated using Weblate (English)

Currently translated at 100.0% (65 of 65 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/en/

* Translated using Weblate (French)

Currently translated at 90.7% (59 of 65 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/

* i18n now playing context type

fix overscroll on new filter menu
fix getting default namespace from the i18n backend

* Translated using Weblate (French)

Currently translated at 96.9% (63 of 65 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (66 of 66 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/fr/

* Translated using Weblate (Japanese) (#98)

Currently translated at 7.5% (5 of 66 strings)

Translation: Subtracks/subtracks
Translate-URL: https://hosted.weblate.org/projects/subtracks/subtracks/ja/

Co-authored-by: Austin Riedhammer <austinried@functionkey.xyz>

* little note to remind me why that's there

* update licenses

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Clyhtsuriva <aimeric@adjutor.xyz>
2022-04-15 12:11:00 +09:00
austinried 4905f75564 Merge branch 'main' of github.com:austinried/subtracks into main 2022-04-12 10:21:37 +09:00
austinried 6b53d9444d bump version 2022-04-12 10:18:33 +09:00
austinried f39a29159a Fix pausing after playing a few tracks (#94)
we only get this error when playing so we should always keep playing
2022-04-12 09:45:38 +09:00
austinried c1a4b5ede8 restore repeat mode when rebuilding the queue (#93) 2022-04-12 09:45:10 +09:00
austinried d0319eb32d remove ruby stuff for iOS 2022-04-11 15:36:18 +09:00
austinried 9524080d00 move back to api 30 2022-04-11 15:15:57 +09:00
austinried cba32e75b3 downgrade async-storage a bit
some kind of java/jetifier issue in 1.17 that i don't want to deal with
2022-04-11 13:53:11 +09:00
austinried 37d81cb87a update licences 2022-04-11 12:28:33 +09:00
austinried f911688c78 upgade deps
async-storage 1.17.3: required updating sdk to 31, kotlin to 1.6.10
react-native-track-player 2.1.3: added new "android:exported" prop required by API 31
react-native-fs: 2.19.0
2022-04-11 12:14:45 +09:00
austinried bfa6b6f08a upgrade to react-native 0.67.4 2022-04-11 11:07:17 +09:00
austinried 87e83516a1 filter topSongs backup search by artistName 2022-04-11 10:47:51 +09:00
austinried 8196704ccd React Query refactor (#91)
* initial react-query experiments

* use queries for item screens

send the data we do have over routing to prepopulate (album/playlist)
use number for starred because sending Date freaks out react-navigation

* add in equiv. song cover art fix

* reorg, switch artistview over

start mapping song cover art when any are available

* refactor useStar to queries

fix caching for starred items and album cover art

* add hook to reset queries on server change

* refactor search to use query

* fix song cover art setting

* use query for artistInfo

* remove last bits of library state

* cleanup

* use query key factory

already fixed one wrong key...

* require coverart size

* let's try no promise queues on these for now

* image cache uses query

* perf fix for playlist parsing

also use placeholder data so we don't have to deal with staleness

* drill that disabled

also list controls doesn't need its own songs hook/copy

* switch to react-native-blob-util for downloads

slightly slower but allows us to use DownloadManager, which backgrounds downloads so they are no longer corrupted when the app suspends

* add a fake "top songs" based on artist search

then sorted by play count/ratings
artistview should load now even if topSongs fails

* try not to swap between topSongs/search on refetch

set queueContext by song list so the index isn't off if the list changes

* add content type validation for file fetching

also try to speed up existing file return by limiting fs ops

* if the HEAD fails, don't queue the download

* clean up params

* reimpl clear image cache

* precompute contextId

prevents wrong "is playing" when any mismatch between queue and list

* clear images from all servers

use external files dir instead of cache

* fix pressable disabled flicker

don't retry topsongs on failure
try to optimize setqueue and fixcoverart a bit

* wait for queries during clear

* break out fetchExistingFile from fetchFile

allows to tell if file is coming from disk or not
only show placeholder/loading spinner if actually fetching image

* forgot these wouldn't do anything with objects

* remove query cache when switching servers

* add content-disposition extension gathering

add support for progress hook (needs native support still)

* added custom RNBU pkg with progress changes

* fully unmount tabs when server changes

prevents unwanted requests, gives fresh start on switch
fix fixCoverArt not re-rendering in certain cases on search

* use serverId from fetch deps

* fix lint

* update licenses

* just use the whole lodash package

* make using cache buster optional
2022-04-11 09:40:51 +09:00
dependabot[bot] cbd88d0f13 Bump cocoapods-downloader from 1.5.1 to 1.6.3 (#88)
Bumps [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader) from 1.5.1 to 1.6.3.
- [Release notes](https://github.com/CocoaPods/cocoapods-downloader/releases)
- [Changelog](https://github.com/CocoaPods/cocoapods-downloader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/CocoaPods/cocoapods-downloader/compare/1.5.1...1.6.3)

---
updated-dependencies:
- dependency-name: cocoapods-downloader
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-06 17:12:10 +09:00
austinried ecb706310b remove react-native-get-random-values (#87)
swap in react-native-uuid, which is a js-only impl of uuid without native requirements
2022-04-06 01:22:05 +09:00
austinried caf544069e switch to useSafeAreaInsets().top (#85)
StatusBar.currentHeight seems just broken on some devices
2022-04-04 12:48:10 +09:00
austinried 8bc4caae78 some files still using old folder names 2022-04-03 10:29:23 +09:00
austinried 5a2ab98af5 repeat v1.1.2 changelog for google play 2022-04-01 10:22:23 +09:00
austinried 3ab9ea9fe8 bump version for google play 2022-04-01 10:19:32 +09:00
austinried b761ad8b84 Release/v1.1.2 (#82)
* add changelog

* increment version
2022-03-28 16:16:48 +09:00
austinried 5169b726ce encode values before using in url (#81) 2022-03-28 15:44:58 +09:00
austinried 41f00ef3f1 update build to main branch
add new ignores
2022-03-28 14:32:08 +09:00
dependabot[bot] abdd1667b7 Bump ansi-regex from 4.1.0 to 4.1.1 (#80)
Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v4.1.0...v4.1.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-28 14:21:17 +09:00
dependabot[bot] b6c689ea7e Bump minimist from 1.2.5 to 1.2.6 (#79)
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-28 14:21:05 +09:00
dependabot[bot] 2c8bcbcb2f Bump plist from 3.0.4 to 3.0.5 (#78)
Bumps [plist](https://github.com/TooTallNate/node-plist) from 3.0.4 to 3.0.5.
- [Release notes](https://github.com/TooTallNate/node-plist/releases)
- [Changelog](https://github.com/TooTallNate/plist.js/blob/master/History.md)
- [Commits](https://github.com/TooTallNate/node-plist/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-28 14:06:20 +09:00
austinried e412b33d4e run validation before yarn license (#77)
* run validation before yarn license

* attempt to fix CI errors

https://github.com/yarnpkg/yarn/issues/7212
2022-03-28 14:05:49 +09:00
austinried 081251061d Library store refactor (#76)
* start of music store refactor

moving stuff into a state cache
better separate it from view logic

* added paginated list/album list

* reworked fetchAlbumList to remove ui state

refactored home screen to use new method
i broke playing songs somehow, JS thread goes into a loop

* don't reset parts manually, do it all at once

* fixed perf issue related to too many rerenders

rerenders were caused by strict equality check on object/array picks
switched artistInfo to new store
updated zustand and fixed deprecation warnings

* update typescript

and use workspace tsc version for vscode

* remove old artistInfo

* switched to new playlist w/songs

removed more unused stuff

* remove unused + (slightly) rework search

* refactor star

* use only original/large imges for covers/artist

fix view artist from context menu
add loading indicators to song list and artist views (show info we have right away)

* set starred/unstar assuming it works

and correct state on error

* reorg, remove old music slice files

* added back fix for song cover art

* sort artists by localCompare name

* update licenses

* fix now playing background grey bar

* update react-native-gesture-handler

for node-fetch security alert

* fix another gradient height grey bar issue

* update licenses again

* remove thumbnail cache

* rename to remove "Library" from methods

* Revert "remove thumbnail cache"

This reverts commit e0db4931f1.

* use ids for lists, pull state later

* Revert "use only original/large imges for covers/artist"

This reverts commit c9aea9065c.

* deep equal ListItem props for now

this needs a bigger refactor

* use immer as middleware

* refactor api client to use string method

hoping to use this for requestKey/deduping next

* use thumbnails in list items

* Revert "refactor api client to use string method"

This reverts commit 234326135b.

* rename/cleanup

* store servers by id

* get rid of settings selectors

* renames for clarity

remove unused estimateContentLength setting

* remove trackplayer selectors

* fix migration for library filter settings

* fixed shuffle order reporting wrong track/queue

* removed the other selectors

* don't actually need es6/react for our state

* fix slow artist sort on star

localeCompare is too slow for large lists
2022-03-28 13:30:57 +09:00
austinried 09ca4974c5 don't run prepare on yarn install... 2022-03-12 09:24:52 +09:00
austinried d9781f3a47 add build instructions
add yarn script to prepare exoplayer/ffmpeg
2022-02-02 16:03:05 +09:00
austinried ec390f593c Upgrade React Native and deps (#68)
* upgrade RN to 0.67-rc.6
upgrade react-native-reanimated to 2.3.1
debug and release building/working

* update to RN stable 0.67

* yarn upgrade

also use xmldom builtin types

* ignore ndk dir for linting

* upgrade types (RN 0.67 not out yet)

* remove deprecated rule

* actually i like that one, keep for now

* update licenses

* upgrade RN types and use builtin dep

* upgrade RN 0.67.1
2022-01-23 13:36:02 +09:00
austinried 6883a556bf fix boolean 2022-01-12 09:25:45 +09:00
Andrej Shadura 100be96fca Fix autocorrect/autofill in server settings (#59) (#60)
Prevent autocorrection on URLs, disable autoCorrect and
autoCapitalise and set importantForAutofill.
2022-01-11 22:08:42 +09:00
austinried c1e26d23cf reduce api version to lowest currently needed (#53) 2021-12-18 09:50:16 +09:00
austinried 329ef919f7 add .nvmrc for node 14.x 2021-12-15 14:38:15 +09:00
austinried 336e106e01 changelog for 1.1.1 2021-12-15 14:08:37 +09:00
austinried c0f802c27b bump version 1.1.1 2021-12-15 14:05:51 +09:00
austinried da033e697f check if we paused on duck before playing again (#51)
prevents music playing after an alarm or call ends if it wasn't paused by that alarm/call in the first place
2021-12-15 13:59:58 +09:00
austinried 5bb32df16b Create FUNDING.yml 2021-12-13 09:34:22 +09:00
austinried 6cb364531b Release/v1.1.0 (#47)
* bump version for 1.1.0

* add changelog for 1.1.0
2021-12-06 11:05:18 +09:00
austinried 72fa2c765d Trust self-signed user certificates (#46)
* add network config to trust user certificates

* allow clear text traffic again
2021-12-06 10:16:06 +09:00
austinried 0643b6d719 use .view method suffix for 1.14.0 (#45) 2021-12-06 10:05:59 +09:00
dependabot[bot] da79b306b2 Bump tmpl from 1.0.4 to 1.0.5 (#44)
Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/daaku/nodejs-tmpl/releases)
- [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5)

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

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-04 15:26:22 +09:00
Theo Salzmannandaustinried 9a6f8b86fc FEATURE: add plain text password toggle to settings (#22)
* FEATURE: add plain text password toggle to settings

* clean up state types, lint, and add migrate

Co-authored-by: austinried <4966622+austinried@users.noreply.github.com>
2021-12-03 15:18:05 +09:00
austinried 37214fcbdc add f-droid badge to readme 2021-09-11 16:40:32 +09:00
austinried eb578fa5e6 use consistent user agent for requests 2021-09-08 15:49:01 +09:00
austinried 51f79ac8ad stop saying my project is html pls 2021-09-08 10:13:54 +09:00
aux4 ddef0fc2c8 Merge pull request #15 from austinried/exoplayer-extension
Build ExoPlayer ffmpeg extension for ALAC playback
2021-09-08 10:06:38 +09:00
austinried dbc72d5259 add ffmpeg license
reworked licenses into a single generated file
2021-09-08 09:32:35 +09:00
austinried f686294aab too many files in here for watchman 2021-09-07 18:37:19 +09:00
austinried 29cdebe424 quiet down wget and unzip
really don't need 5mb of logs every time those run...
2021-09-07 18:32:22 +09:00
austinried ef476552e0 remove gradle wrapper that fails validation 2021-09-07 16:48:49 +09:00
austinried dd0d4d52c1 remove unused exoplayer modules
update licenses
2021-09-07 16:36:12 +09:00
austinried 0c825a3d85 don't lint submodules 2021-09-07 15:44:18 +09:00
austinried 2d07d5f1fa Revert "regen lockfile"
This reverts commit 2dc9e71ab5.
2021-09-07 15:38:52 +09:00
austinried 2dc9e71ab5 regen lockfile 2021-09-07 15:35:10 +09:00
austinried 062b0cadd2 Merge branch 'master' into exoplayer-extension 2021-09-07 15:26:04 +09:00
austinried ad92e6d3ff enable ffmpeg prep for GH builds 2021-09-07 15:23:57 +09:00
austinried 328956d84a bump ram for release builds 2021-09-07 15:23:37 +09:00
austinried 9d58e15b39 build and use ffmpeg extension
pointing at my own repo for RNTP to enable extensions in exoplayer
new prepare script needs to be run to build ffmpeg
2021-09-07 14:40:22 +09:00
austinried 721a42f60f pull in/rely on exoplayer locally 2021-09-07 12:20:52 +09:00
aux4 6a0f5678ec Merge pull request #14 from austinried/dependabot/npm_and_yarn/immer-9.0.6
Bump immer from 9.0.5 to 9.0.6
2021-09-04 15:09:13 +09:00
dependabot[bot] dbfc4172fb Bump immer from 9.0.5 to 9.0.6
Bumps [immer](https://github.com/immerjs/immer) from 9.0.5 to 9.0.6.
- [Release notes](https://github.com/immerjs/immer/releases)
- [Commits](https://github.com/immerjs/immer/compare/v9.0.5...v9.0.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-04 05:46:58 +00:00
austinried 2097a9f7fd remove non-working cast button for now 2021-09-04 14:45:08 +09:00
austinried 3053e2b5c9 add changelog for 1.0.1 2021-09-02 18:01:58 +09:00
austinried 7f1585a6ad bump version 1.0.1 2021-09-02 17:23:38 +09:00
austinried 704edfbaaf remove unused permissions 2021-09-01 18:23:13 +09:00
austinried 5622c007f2 fix text cutting off bottom w/fixed height 2021-09-01 15:11:24 +09:00
austinried 3719a71e0f Merge branch 'master' of github.com:austinried/subtracks 2021-09-01 14:53:10 +09:00
aux4 44fb9a022d update readme coming soon 2021-09-01 10:17:38 +09:00
austinried 45cc51192a Merge branch 'master' of github.com:austinried/subtracks 2021-08-27 15:42:22 +09:00
aux4 d981690ba6 update readme with google play link 2021-08-27 15:41:39 +09:00
austinried 161a621d71 address xmldom security issue
https://github.com/advisories/GHSA-6fc8-4gx4-v693
2021-08-27 13:11:03 +09:00
austinried 7da1afa643 bump version 1.0.0 for release 2021-08-27 11:17:58 +09:00
austinried 77e89fc9e2 add version number to about setion 2021-08-27 09:58:49 +09:00
austinried 36e97cb621 update metadata per google play standards 2021-08-26 16:38:30 +09:00
austinried c539376cc4 add metadata for stores 2021-08-26 16:10:49 +09:00
austinried 0465147a7c bump sdk version for google play 2021-08-26 15:19:03 +09:00
austinried 2e96c61b82 let's do some pre-release builds 2021-08-26 14:38:22 +09:00
austinried 08470aaf00 Merge branch 'master' of github.com:austinried/subtracks 2021-08-26 13:41:38 +09:00
aux4 8ee98327fe update readme 2021-08-26 13:41:07 +09:00
austinried a91f455534 add scripts for bumping versions 2021-08-26 13:33:15 +09:00
austinried ac175d091f ignore html for languages 2021-08-26 12:58:35 +09:00
austinried 872dde4e1c remove bad button style 2021-08-26 12:49:26 +09:00
austinried 23807a3506 update header for better dark mode 2021-08-26 12:48:06 +09:00
austinried a3fda31743 added licenses and webview for them
added link to github page
2021-08-26 12:47:56 +09:00
austinried b8f04e5426 update readme 2021-08-26 08:18:29 +09:00
austinried 46eb293f98 fix net state not being right on startup 2021-08-26 08:17:39 +09:00
austinried 5af187ba48 lint builds 2021-08-26 08:07:32 +09:00
austinried 9847cdb894 fix for search clearing text/not scrolling 2021-08-25 16:32:04 +09:00
austinried fac2b62ec2 improved large album/playlist performance
switched to flatlist for all of those
2021-08-25 16:13:35 +09:00
austinried 81b5bfb56b readme update 2021-08-25 11:26:03 +09:00
austinried 7abf5c0e88 settings wording 2021-08-25 10:43:36 +09:00
austinried ed4a32cba3 remove UI option to disable estimateContentLength 2021-08-25 10:29:59 +09:00
austinried 0778c49b18 Merge branch 'master' of github.com:austinried/subtracks 2021-08-25 10:25:03 +09:00
austinried 3db1d795dc fix player crashing at the end of transcoded track 2021-08-25 10:24:42 +09:00
aux4 07fc618fd2 specify android app in readme 2021-08-24 16:00:21 +09:00
austinried 75da5d16ac Merge branch 'master' of github.com:austinried/subtracks 2021-08-24 15:58:01 +09:00
austinried 1d40ac5b35 stop building on non-app file changes 2021-08-24 15:57:46 +09:00
aux4 6bdd052472 added download badge to readme 2021-08-24 15:52:34 +09:00
austinried 74632eff10 added "get it on" badges" 2021-08-24 15:49:41 +09:00
austinried 3055726fb3 better name/group artifacts 2021-08-24 15:31:22 +09:00
aux4 d10a29b931 fix readme link, add server examples 2021-08-24 14:46:07 +09:00
aux4 75a264ca83 fix readme image formatting 2021-08-24 14:27:27 +09:00
austinried dcd764bd68 add images/features/coming soon to readme 2021-08-24 14:23:00 +09:00
aux4 1a596077fa Merge pull request #1 from austinried/github-actions-test
Use actions to build and sign PRs/releases
2021-08-24 11:27:12 +09:00
21 changed files with 976 additions and 1194 deletions
+2 -6
View File
@@ -23,14 +23,10 @@ A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Device**
- Model: [e.g. Pixel 4]
**Smartphone (please complete the following information):**
- Device: [e.g. Pixel 4]
- OS: [e.g. Android 12]
- Subtracks version [e.g. 1.2.0]
**Server**
- Software: [e.g. Navidrome]
- Version: [e.g. 0.49.3]
**Additional context**
Add any other context about the problem here.
+60
View File
@@ -146,8 +146,13 @@
],
"de": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
@@ -172,6 +177,13 @@
],
"es": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
@@ -226,6 +238,37 @@
"settingsServersFieldsName"
],
"gl": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
"resourcesFilterArtist",
"resourcesFilterOwner",
"resourcesFilterYear",
"resourcesPlaylistCount",
"resourcesSongCount",
"resourcesSongListDeleteAllContent",
"resourcesSongListDeleteAllTitle",
"resourcesSortByAlbum",
"resourcesSortByAlbumCount",
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
"settingsNetworkOptionsStreamFormat",
"settingsNetworkOptionsStreamFormatServerDefault",
"settingsServersFieldsName"
],
"it": [
"actionsCancel",
"actionsDelete",
@@ -551,11 +594,28 @@
],
"zh": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
"resourcesFilterArtist",
"resourcesFilterOwner",
"resourcesFilterYear",
"resourcesPlaylistCount",
"resourcesSongCount",
"resourcesSongListDeleteAllContent",
"resourcesSongListDeleteAllTitle",
"resourcesSortByAlbum",
"resourcesSortByAlbumCount",
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
+33 -29
View File
@@ -1,30 +1,34 @@
## To-do
- Star/unstar
- Context menus
- Download actions for song
- Playlist management
- Add to playlist (from context)
- Queue management
- View playing queue
- Re-order queue
- Add to queue (from context)
- Remove from queue
- Scrobbling
- Library filters (year/genre/etc)
- Library list display modes
- Search
- Individual "more" results pages
- Now playing gestures
- Swipe bar/album to skip
- Double-tap to seek forward/back (bar only)
- Settings
- Music
- Scrobble
- Downloads
- Used/available space
- Clear downloads
- Clear images
- About
- Licenses
- Welcome/setup flow
- Proper loading screen/animation
- [ ] Star/unstar
- [ ] Context menus
- [ ] Download actions for song
- [ ] Playlist management
- [ ] Add to playlist (from context)
- [ ] Queue management
- [ ] View playing queue
- [ ] Re-order queue
- [ ] Add to queue (from context)
- [ ] Remove from queue
- [ ] Scrobbling
- [ ] Library filters (year/genre/etc)
- [ ] Library list display modes
- [ ] Search
- [ ] Individual "more" results pages
- [ ] Radio modes
- [ ] Artist
- [ ] Now playing gestures
- [ ] Swipe bar/album to skip
- [ ] Double-tap to seek forward/back (bar only)
- [ ] Settings
- [ ] Sources
- [ ] Use plaintext password
- [ ] Music
- [ ] Scrobble
- [ ] Downloads
- [ ] Used/available space
- [ ] Clear downloads
- [ ] Clear images
- [ ] About
- [ ] Licenses
- [ ] Welcome/setup flow
- [ ] Proper loading screen/animation
+1 -3
View File
@@ -1,4 +1,3 @@
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
@@ -78,8 +77,7 @@ class App extends HookConsumerWidget {
),
routeInformationParser: appRouter.defaultRouteParser(),
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: [...AppLocalizations.supportedLocales]
..moveToTheFront(const Locale('en')),
supportedLocales: AppLocalizations.supportedLocales,
);
}
}
-26
View File
@@ -1,19 +1,13 @@
import 'dart:math';
import 'package:auto_route/auto_route.dart';
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import '../../database/database.dart';
import '../../models/query.dart';
import '../../models/support.dart';
import '../../services/audio_service.dart';
import '../../state/music.dart';
import '../../state/settings.dart';
import '../app_router.dart';
import '../buttons.dart';
import '../images.dart';
import '../items.dart';
@@ -33,26 +27,6 @@ class ArtistPage extends HookConsumerWidget {
final albums = ref.watch(albumsByArtistIdProvider(id));
return Scaffold(
floatingActionButton: RadioPlayFab(
onPressed: () => artist.hasValue
? ref.read(audioControlProvider).playRadio(
context: QueueContextType.artist,
contextId: artist.valueOrNull!.id,
query: ListQuery(
filters: IList([
FilterWith.equals(
column: 'artist_id',
value: artist.valueOrNull!.id,
)
]),
),
getSongs: (query) => ref
.read(databaseProvider)
.songsList(ref.read(sourceIdProvider), query)
.get(),
)
: null,
),
body: CustomScrollView(
slivers: [
SliverToBoxAdapter(
+34 -56
View File
@@ -41,7 +41,6 @@ class SourcePage extends HookConsumerWidget {
label: l.settingsServersFieldsAddress,
initialValue: source?.address.toString(),
keyboardType: TextInputType.url,
autofillHints: const [AutofillHints.url],
required: true,
validator: (value, label) {
if (Uri.tryParse(value!) == null) {
@@ -53,27 +52,15 @@ class SourcePage extends HookConsumerWidget {
final username = LabeledTextField(
label: l.settingsServersFieldsUsername,
initialValue: source?.username,
autofillHints: const [AutofillHints.username],
required: true,
);
final password = LabeledTextField(
label: l.settingsServersFieldsPassword,
initialValue: source?.password,
obscureText: true,
autofillHints: const [AutofillHints.password],
required: true,
);
final forcePlaintextPassword = useState(!(source?.useTokenAuth ?? false));
final forcePlaintextSwitch = SwitchListTile(
value: forcePlaintextPassword.value,
title: Text(l.settingsServersOptionsForcePlaintextPasswordTitle),
subtitle: forcePlaintextPassword.value
? Text(l.settingsServersOptionsForcePlaintextPasswordDescriptionOn)
: Text(l.settingsServersOptionsForcePlaintextPasswordDescriptionOff),
onChanged: (value) => forcePlaintextPassword.value = value,
);
return WillPopScope(
onWillPop: () async => !isSaving.value && !isDeleting.value,
child: Scaffold(
@@ -141,7 +128,6 @@ class SourcePage extends HookConsumerWidget {
address: Uri.parse(address.value),
username: username.value,
password: password.value,
useTokenAuth: !forcePlaintextPassword.value,
),
);
} else {
@@ -156,8 +142,7 @@ class SourcePage extends HookConsumerWidget {
features: IList(),
username: username.value,
password: password.value,
useTokenAuth:
Value(!forcePlaintextPassword.value),
useTokenAuth: const Value(true),
),
);
}
@@ -178,25 +163,21 @@ class SourcePage extends HookConsumerWidget {
),
body: Form(
key: form,
child: AutofillGroup(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 24),
child: ListView(
children: [
const SizedBox(height: 96 - kToolbarHeight),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(
source == null
? l.settingsServersActionsAdd
: l.settingsServersActionsEdit,
style: theme.textTheme.displaySmall,
),
Text(
source == null
? l.settingsServersActionsAdd
: l.settingsServersActionsEdit,
style: theme.textTheme.displaySmall,
),
name,
address,
username,
password,
const SizedBox(height: 24),
forcePlaintextSwitch,
const FabPadding(),
],
),
@@ -213,7 +194,6 @@ class LabeledTextField extends HookConsumerWidget {
final bool obscureText;
final bool required;
final TextInputType? keyboardType;
final Iterable<String>? autofillHints;
final String? Function(String? value, String label)? validator;
// ignore: prefer_const_constructors_in_immutables
@@ -224,7 +204,6 @@ class LabeledTextField extends HookConsumerWidget {
this.obscureText = false,
this.keyboardType,
this.validator,
this.autofillHints,
this.required = false,
});
@@ -245,36 +224,35 @@ class LabeledTextField extends HookConsumerWidget {
final theme = Theme.of(context);
_controller = useTextEditingController(text: initialValue);
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const SizedBox(height: 24),
Text(label, style: theme.textTheme.titleMedium),
TextFormField(
controller: _controller,
obscureText: obscureText,
keyboardType: keyboardType,
autofillHints: autofillHints,
validator: (value) {
String? error;
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const SizedBox(height: 24),
Text(
label,
style: theme.textTheme.titleMedium,
),
TextFormField(
controller: _controller,
obscureText: obscureText,
keyboardType: keyboardType,
validator: (value) {
String? error;
if (required) {
error = _requiredValidator(value);
if (error != null) {
return error;
}
if (required) {
error = _requiredValidator(value);
if (error != null) {
return error;
}
}
if (validator != null) {
return validator!(value, label);
}
return null;
},
),
],
),
if (validator != null) {
return validator!(value, label);
}
return null;
},
),
],
);
}
}
+49 -97
View File
@@ -17,10 +17,6 @@ import 'converters.dart';
part 'database.g.dart';
// don't exceed SQLITE_MAX_VARIABLE_NUMBER (32766 for version >= 3.32.0)
// https://www.sqlite.org/limits.html
const kSqliteMaxVariableNumber = 32766;
@DriftDatabase(include: {'tables.drift'})
class SubtracksDatabase extends _$SubtracksDatabase {
SubtracksDatabase() : super(_openConnection());
@@ -173,27 +169,12 @@ class SubtracksDatabase extends _$SubtracksDatabase {
});
}
Future<void> deleteArtistsNotIn(int sourceId, Set<String> ids) {
return transaction(() async {
final allIds = (await (selectOnly(artists)
..addColumns([artists.id])
..where(artists.sourceId.equals(sourceId)))
.map((row) => row.read(artists.id))
.get())
.whereNotNull()
.toSet();
final downloadIds = (await artistIdsWithDownloadStatus(sourceId).get())
.whereNotNull()
.toSet();
final diff = allIds.difference(downloadIds).difference(ids);
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
await (delete(artists)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
.go();
}
});
Future<void> deleteArtistsNotIn(int sourceId, Iterable<String> ids) async {
await (delete(artists)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isNotIn(ids),
))
.go();
}
Future<void> saveAlbums(Iterable<AlbumsCompanion> albums) async {
@@ -202,27 +183,15 @@ class SubtracksDatabase extends _$SubtracksDatabase {
});
}
Future<void> deleteAlbumsNotIn(int sourceId, Set<String> ids) {
return transaction(() async {
final allIds = (await (selectOnly(albums)
..addColumns([albums.id])
..where(albums.sourceId.equals(sourceId)))
.map((row) => row.read(albums.id))
.get())
.whereNotNull()
.toSet();
final downloadIds = (await albumIdsWithDownloadStatus(sourceId).get())
.whereNotNull()
.toSet();
Future<void> deleteAlbumsNotIn(int sourceId, Iterable<String> ids) async {
final alsoKeep = (await albumIdsWithDownloaded(sourceId).get()).toSet();
final diff = allIds.difference(downloadIds).difference(ids);
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
await (delete(albums)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
.go();
}
});
ids = ids.toList()..addAll(alsoKeep);
await (delete(albums)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isNotIn(ids),
))
.go();
}
Future<void> savePlaylists(
@@ -246,31 +215,18 @@ class SubtracksDatabase extends _$SubtracksDatabase {
});
}
Future<void> deletePlaylistsNotIn(int sourceId, Set<String> ids) {
return transaction(() async {
final allIds = (await (selectOnly(playlists)
..addColumns([playlists.id])
..where(playlists.sourceId.equals(sourceId)))
.map((row) => row.read(playlists.id))
.get())
.whereNotNull()
.toSet();
final downloadIds = (await playlistIdsWithDownloadStatus(sourceId).get())
.whereNotNull()
.toSet();
final diff = allIds.difference(downloadIds).difference(ids);
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
await (delete(playlists)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
.go();
await (delete(playlistSongs)
..where((tbl) =>
tbl.sourceId.equals(sourceId) & tbl.playlistId.isIn(slice)))
.go();
}
});
Future<void> deletePlaylistsNotIn(int sourceId, Iterable<String> ids) async {
await (delete(playlists)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isNotIn(ids),
))
.go();
await (delete(playlistSongs)
..where(
(tbl) =>
tbl.sourceId.equals(sourceId) & tbl.playlistId.isNotIn(ids),
))
.go();
}
Future<void> savePlaylistSongs(
@@ -294,33 +250,29 @@ class SubtracksDatabase extends _$SubtracksDatabase {
});
}
Future<void> deleteSongsNotIn(int sourceId, Set<String> ids) {
return transaction(() async {
final allIds = (await (selectOnly(songs)
..addColumns([songs.id])
..where(
songs.sourceId.equals(sourceId) &
songs.downloadFilePath.isNull() &
songs.downloadTaskId.isNull(),
))
.map((row) => row.read(songs.id))
.get())
.whereNotNull()
.toSet();
final diff = allIds.difference(ids);
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
await (delete(songs)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
.go();
await (delete(playlistSongs)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.songId.isIn(slice),
))
.go();
}
});
Future<void> deleteSongsNotIn(int sourceId, Iterable<String> ids) async {
await (delete(songs)
..where(
(tbl) =>
tbl.sourceId.equals(sourceId) &
tbl.id.isNotIn(ids) &
tbl.downloadFilePath.isNull() &
tbl.downloadTaskId.isNull(),
))
.go();
final remainingIds = (await (selectOnly(songs)
..addColumns([songs.id])
..where(songs.sourceId.equals(sourceId)))
.map((row) => row.read(songs.id))
.get())
.whereNotNull();
await (delete(playlistSongs)
..where(
(tbl) =>
tbl.sourceId.equals(sourceId) &
tbl.songId.isNotIn(remainingIds),
))
.go();
}
Selectable<LastBottomNavStateData> getLastBottomNavState() {
+1 -27
View File
@@ -4596,7 +4596,7 @@ abstract class _$SubtracksDatabase extends GeneratedDatabase {
));
}
Selectable<String> albumIdsWithDownloadStatus(int sourceId) {
Selectable<String> albumIdsWithDownloaded(int sourceId) {
return customSelect(
'SELECT albums.id FROM albums JOIN songs ON songs.source_id = albums.source_id AND songs.album_id = albums.id WHERE albums.source_id = ?1 AND(songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)GROUP BY albums.id',
variables: [
@@ -4608,32 +4608,6 @@ abstract class _$SubtracksDatabase extends GeneratedDatabase {
}).map((QueryRow row) => row.read<String>('id'));
}
Selectable<String> artistIdsWithDownloadStatus(int sourceId) {
return customSelect(
'SELECT artists.id FROM artists LEFT JOIN albums ON artists.source_id = albums.source_id AND artists.id = albums.artist_id LEFT JOIN songs ON albums.source_id = songs.source_id AND albums.id = songs.album_id WHERE artists.source_id = ?1 AND(songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)GROUP BY artists.id',
variables: [
Variable<int>(sourceId)
],
readsFrom: {
artists,
albums,
songs,
}).map((QueryRow row) => row.read<String>('id'));
}
Selectable<String> playlistIdsWithDownloadStatus(int sourceId) {
return customSelect(
'SELECT playlists.id FROM playlists LEFT JOIN playlist_songs ON playlist_songs.source_id = playlists.source_id AND playlist_songs.playlist_id = playlists.id LEFT JOIN songs ON playlist_songs.source_id = songs.source_id AND playlist_songs.song_id = songs.id WHERE playlists.source_id = ?1 AND(songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)GROUP BY playlists.id',
variables: [
Variable<int>(sourceId)
],
readsFrom: {
playlists,
playlistSongs,
songs,
}).map((QueryRow row) => row.read<String>('id'));
}
Selectable<int> searchArtists(String query, int limit, int offset) {
return customSelect(
'SELECT "rowid" FROM artists_fts WHERE artists_fts MATCH ?1 ORDER BY rank LIMIT ?2 OFFSET ?3',
+1 -21
View File
@@ -244,7 +244,7 @@ allSubsonicSources WITH SubsonicSettings:
FROM sources
JOIN subsonic_sources ON subsonic_sources.source_id = sources.id;
albumIdsWithDownloadStatus:
albumIdsWithDownloaded:
SELECT albums.id
FROM albums
JOIN songs on songs.source_id = albums.source_id AND songs.album_id = albums.id
@@ -253,26 +253,6 @@ albumIdsWithDownloadStatus:
AND (songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)
GROUP BY albums.id;
artistIdsWithDownloadStatus:
SELECT artists.id
FROM artists
LEFT JOIN albums ON artists.source_id = albums.source_id AND artists.id = albums.artist_id
LEFT JOIN songs ON albums.source_id = songs.source_id AND albums.id = songs.album_id
WHERE
artists.source_id = :source_id
AND (songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)
GROUP BY artists.id;
playlistIdsWithDownloadStatus:
SELECT playlists.id
FROM playlists
LEFT JOIN playlist_songs ON playlist_songs.source_id = playlists.source_id AND playlist_songs.playlist_id = playlists.id
LEFT JOIN songs ON playlist_songs.source_id = songs.source_id AND playlist_songs.song_id = songs.id
WHERE
playlists.source_id = :source_id
AND (songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)
GROUP BY playlists.id;
searchArtists:
SELECT rowid
FROM artists_fts
+194 -204
View File
@@ -1,206 +1,196 @@
{
"actionsStar": "Markieren",
"@actionsStar": {},
"actionsUnstar": "Markierung entfernen",
"@actionsUnstar": {},
"messagesNothingHere": "Hier ist nichts…",
"@messagesNothingHere": {},
"navigationTabsHome": "Startseite",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Bibliothek",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Suche",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Einstellungen",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Album abspielen",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Album anzeigen",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Alben sortieren",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Album} other{Alben}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Interpret anzeigen",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Interpreten sortieren",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Interpret} other{Interpreten}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Nach Genre",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Favoriten",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Wiedergabeliste abspielen",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Wiedergabeliste} other{Wiedergabelisten}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Warteschlange} other{Warteschlangen}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Top Lieder",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Lied} other{Lieder}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Kürzlich hinzugefügt",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Nach Interpreten",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Häufig abgespielt",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Nach Name",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Zufällig",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Kürzlich abgespielt",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Nach Jahr",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Suche: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Suche",
"@searchInputPlaceholder": {},
"searchMoreResults": "Mehr…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Suchergebnis",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Lizenzen",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Projektseite",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Über",
"@settingsAboutName": {},
"settingsAboutVersion": "Version {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Musik",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Kein Scrobble für Wiedergabeverlauf",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble Wiedergabeverlauf",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Scrobble Wiedergabe",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Netzwerk",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Maximale Bitrate (Mobil)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Maximale Bitrate (WLAN)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Maximale Pufferzeit",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Minimale Pufferzeit",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} Sekunden",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Unbegrenzt",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Bildzwischenspeicher löschen",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Zurücksetzen",
"@settingsResetName": {},
"settingsServersActionsAdd": "Server hinzufügen",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Löschen",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Server bearbeiten",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Speichern",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Verbindung testen",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Adresse",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Passwort",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Nutzername",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Verbindung zu {address} fehlgeschlagen, überprüfe Einstellungen oder Server",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Verbindung zu {address} ist OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Server",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Sende Passwort als Token + Salt",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Passwort als Klartext senden (Veraltet, stellen Sie sicher, dass Ihre Verbindung sicher ist!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Erzwinge Klartextpasswort",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"actionsDelete": "Löschen",
"@actionsDelete": {},
"actionsDownload": "Herunterladen",
"@actionsDownload": {},
"actionsDownloadCancel": "Download abbrechen",
"@actionsDownloadCancel": {},
"controlsShuffle": "Zufall",
"@controlsShuffle": {},
"actionsCancel": "Abbrechen",
"@actionsCancel": {}
"actionsStar": "Markieren",
"@actionsStar": {},
"actionsUnstar": "Markierung entfernen",
"@actionsUnstar": {},
"messagesNothingHere": "Hier ist nichts…",
"@messagesNothingHere": {},
"navigationTabsHome": "Startseite",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Bibliothek",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Suche",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Einstellungen",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Album abspielen",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Album anzeigen",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Alben sortieren",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Album} other{Alben}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Interpret anzeigen",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Interpreten sortieren",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Interpret} other{Interpreten}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Nach Genre",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Favoriten",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Wiedergabeliste abspielen",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Wiedergabeliste} other{Wiedergabelisten}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Warteschlange} other{Warteschlangen}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Top Lieder",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Lied} other{Lieder}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Kürzlich hinzugefügt",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Nach Interpreten",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Häufig abgespielt",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Nach Name",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Zufällig",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Kürzlich abgespielt",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Nach Jahr",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Suche: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Suche",
"@searchInputPlaceholder": {},
"searchMoreResults": "Mehr…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Suchergebnis",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Lizenzen",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Projektseite",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Über",
"@settingsAboutName": {},
"settingsAboutVersion": "Version {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Musik",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Kein Scrobble für Wiedergabeverlauf",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble Wiedergabeverlauf",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Scrobble Wiedergabe",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Netzwerk",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Maximale Bitrate (Mobil)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Maximale Bitrate (WLAN)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Maximale Pufferzeit",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Minimale Pufferzeit",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} Sekunden",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Unbegrenzt",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Bildzwischenspeicher löschen",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Zurücksetzen",
"@settingsResetName": {},
"settingsServersActionsAdd": "Server hinzufügen",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Löschen",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Server bearbeiten",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Speichern",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Verbindung testen",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Adresse",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Passwort",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Nutzername",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Verbindung zu {address} fehlgeschlagen, überprüfe Einstellungen oder Server",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Verbindung zu {address} ist OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Server",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Sende Passwort als Token + Salt",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Passwort als Klartext senden (Veraltet, stellen Sie sicher, dass Ihre Verbindung sicher ist!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Erzwinge Klartextpasswort",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}
+194 -208
View File
@@ -1,210 +1,196 @@
{
"actionsStar": "Favorito",
"@actionsStar": {},
"actionsUnstar": "Retirar favorito",
"@actionsUnstar": {},
"messagesNothingHere": "Nada aquí…",
"@messagesNothingHere": {},
"navigationTabsHome": "Casa",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Biblioteca",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Buscar",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Entorno",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Reproducir Álbum",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Ver Álbum",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Ordenar Álbumes",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbumes}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Ver Artista",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Oredenar Artistas",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Por Género",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Estrellas",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Reproducir Lista de reproducción",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Lista de reproducción} other{Listas de reproducción}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Cola} other{Colas}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Mejores Canciones",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Cancion} other{Canciones}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Recientemente Añadido",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Por Artista",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Jugado Frecuentemente",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Por Nombre",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Aleatorio",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Recientemente Jugado",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Por Año",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Buscar: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Buscar",
"@searchInputPlaceholder": {},
"searchMoreResults": "Más…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Resultados de la búsqueda",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Licencias",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Página de inicio del proyecto",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Información",
"@settingsAboutName": {},
"settingsAboutVersion": "versión {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Música",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "No hagas historial de reproducción de scrobble",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Historial de reproducción de scrobble",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Obras de teatro de Scrobble",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Sitio",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Tasa de bits máxima (mobile)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Tasa de bits máxima (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Máxima de buffer tiempo",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Mínimo de buffer tiempo",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value} kilobytes por segundo",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} segundos",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Ilimitados",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Caché de imágenes claras",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Reinicializar",
"@settingsResetName": {},
"settingsServersActionsAdd": "Agregar Servidor",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Supr",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Editar Servidor",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Enviar",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Conexión de prueba",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Alocución",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "La contraseña",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Nombre de usuario",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "La conexión a {address} falló, verifique la configuracón o el servidor",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "¡Conexión con {address} Ok!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servidores",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contraseña como token + sal",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contraseña en texto plano (¡legado, asegúrese de que su conexión sea segura!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contraseña de texto sin formato",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"actionsDelete": "Borrar",
"@actionsDelete": {},
"actionsOk": "Ok",
"@actionsOk": {},
"actionsDownload": "Descargar",
"@actionsDownload": {},
"actionsDownloadCancel": "Anular descargar",
"@actionsDownloadCancel": {},
"controlsShuffle": "Reproducir aleatoriamente",
"@controlsShuffle": {},
"actionsCancel": "Cancelar",
"@actionsCancel": {},
"actionsDownloadDelete": "Eliminar descargado",
"@actionsDownloadDelete": {}
"actionsStar": "Estrella",
"@actionsStar": {},
"actionsUnstar": "Retirar estrella",
"@actionsUnstar": {},
"messagesNothingHere": "Nada aquí…",
"@messagesNothingHere": {},
"navigationTabsHome": "Casa",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Biblioteca",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Buscar",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Entorno",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Reproducir Álbum",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Ver Álbum",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Ordenar Álbumes",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbumes}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Ver Artista",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Oredenar Artistas",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Por Género",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Estrellas",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Reproducir Lista de reproducción",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Lista de reproducción} other{Listas de reproducción}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Cola} other{Colas}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Mejores Canciones",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Cancion} other{Canciones}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Recientemente Añadido",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Por Artista",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Jugado Frecuentemente",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Por Nombre",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Aleatorio",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Recientemente Jugado",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Por Año",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Buscar: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Buscar",
"@searchInputPlaceholder": {},
"searchMoreResults": "Más…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Resultados de la búsqueda",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Licencias",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Página de inicio del proyecto",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Información",
"@settingsAboutName": {},
"settingsAboutVersion": "versión {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Música",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "No hagas historial de reproducción de scrobble",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Historial de reproducción de scrobble",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Obras de teatro de Scrobble",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Sitio",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Tasa de bits máxima (mobile)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Tasa de bits máxima (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Máxima de buffer tiempo",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Mínimo de buffer tiempo",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value} kilobytes por segundo",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} segundos",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Ilimitados",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Caché de imágenes claras",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Reinicializar",
"@settingsResetName": {},
"settingsServersActionsAdd": "Agregar Servidor",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Supr",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Editar Servidor",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Enviar",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Conexión de prueba",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Alocución",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "La contraseña",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Nombre de usuario",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "La conexión a {address} falló, verifique la configuracón o el servidor",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "¡Conexión con {address} Ok!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servidores",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contraseña como token + sal",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contraseña en texto plano (¡legado, asegúrese de que su conexión sea segura!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contraseña de texto sin formato",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}
+194 -274
View File
@@ -1,276 +1,196 @@
{
"actionsStar": "Estrela",
"@actionsStar": {},
"actionsUnstar": "Retirar",
"@actionsUnstar": {},
"messagesNothingHere": "Nada por aquí…",
"@messagesNothingHere": {},
"navigationTabsHome": "Inicio",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Biblioteca",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Buscar",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Axustes",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Reproducir",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Ver Álbum",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Ordenar Álbums",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbums}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Ver Artista",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Ordenar Artistas",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Por xénero",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Favoritas",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Reproducir lista",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Listaxe} other{Listaxes}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Fila} other{Filas}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Máis reproducidas",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Canción} other{Cancións}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Últimas engadidas",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Por artista",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Reproducidas a miúdo",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Por nome",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Ao chou",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Reproducidas a miúdo",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Por ano",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Buscar: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Buscar",
"@searchInputPlaceholder": {},
"searchMoreResults": "Máis…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Resultados",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Licenzas",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Web do Proxecto",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Acerca de",
"@settingsAboutName": {},
"settingsAboutVersion": "versión {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Música",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Non rexistrar o historial de reprodución",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Rexistrar o historial de reprodución",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Rexistrar reprodución",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Rede",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Bitrate máx. (móbil)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Bitrate máx. (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Tempo máximo na memoria",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Tempo mínimo na memoria",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} segundos",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Sen límite",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Limpar a caché de imaxes",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Restablecer",
"@settingsResetName": {},
"settingsServersActionsAdd": "Engadir Servidor",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Eliminar",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Editar Servidor",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Gardar",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Comprobar Conexión",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Enderezo",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Contrasinal",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Identificador",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Fallou a conexión a {address}, comproba os axustes",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Conexión con {address} OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servidores",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contrasinal como token + salt",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contrasinal en texto plano (herdado, pon coidado en que a conexión sexa segura!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contrasinal en texto plano",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"actionsCancel": "Cancelar",
"@actionsCancel": {},
"actionsDelete": "Eliminar",
"@actionsDelete": {},
"actionsDownload": "Descargar",
"@actionsDownload": {},
"actionsDownloadCancel": "Cancelar a descarga",
"@actionsDownloadCancel": {},
"actionsDownloadDelete": "Eliminar o descargado",
"@actionsDownloadDelete": {},
"actionsOk": "OK",
"@actionsOk": {},
"controlsShuffle": "Barallar",
"@controlsShuffle": {},
"resourcesAlbumCount": "{count,plural, =1{{count} álbum} other{{count} álbums}}",
"@resourcesAlbumCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistCount": "{count,plural, =1{{count} artista} other{{count} artistas}}",
"@resourcesArtistCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterAlbum": "Álbum",
"@resourcesFilterAlbum": {},
"resourcesFilterArtist": "Artista",
"@resourcesFilterArtist": {},
"resourcesFilterOwner": "Dono",
"@resourcesFilterOwner": {},
"resourcesFilterYear": "Ano",
"@resourcesFilterYear": {},
"resourcesPlaylistCount": "{count,plural, =1{{count} lista} other{{count} listas}}",
"@resourcesPlaylistCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongCount": "{count,plural, =1{{count} canción} other{{count} cancións}}",
"@resourcesSongCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListDeleteAllContent": "Vas eliminar todas as cancións descargadas.",
"@resourcesSongListDeleteAllContent": {},
"resourcesSongListDeleteAllTitle": "Eliminar descargas?",
"@resourcesSongListDeleteAllTitle": {},
"resourcesSortByAlbum": "Álbum",
"@resourcesSortByAlbum": {},
"resourcesSortByAlbumCount": "Número de álbums",
"@resourcesSortByAlbumCount": {},
"settingsAboutActionsSupport": "Axuda ao desenvolvemento 💜",
"@settingsAboutActionsSupport": {},
"settingsNetworkOptionsOfflineMode": "Modo sen conexión",
"@settingsNetworkOptionsOfflineMode": {},
"settingsNetworkOptionsOfflineModeOff": "Usa internet para sincr. música.",
"@settingsNetworkOptionsOfflineModeOff": {},
"settingsNetworkOptionsOfflineModeOn": "Non usar internet para sincr. ou reproducir música.",
"@settingsNetworkOptionsOfflineModeOn": {},
"settingsNetworkOptionsStreamFormat": "Modo de reprodución preferido",
"@settingsNetworkOptionsStreamFormat": {},
"settingsNetworkOptionsStreamFormatServerDefault": "Usar por defecto do servidor",
"@settingsNetworkOptionsStreamFormatServerDefault": {},
"settingsServersFieldsName": "Nome",
"@settingsServersFieldsName": {},
"resourcesSortByTitle": "Título",
"@resourcesSortByTitle": {},
"resourcesSortByUpdated": "Actualizado recentemente",
"@resourcesSortByUpdated": {}
"actionsStar": "Estrela",
"@actionsStar": {},
"actionsUnstar": "Retirar",
"@actionsUnstar": {},
"messagesNothingHere": "Nada por aquí…",
"@messagesNothingHere": {},
"navigationTabsHome": "Inicio",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Biblioteca",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Buscar",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Axustes",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Reproducir",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Ver Álbum",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Ordenar Álbums",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbums}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Ver Artista",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Ordenar Artistas",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Por xénero",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Favoritas",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Reproducir lista",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Listaxe} other{Listaxes}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Fila} other{Filas}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Máis reproducidas",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Canción} other{Cancións}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Últimas engadidas",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Por artista",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Reproducidas a miúdo",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Por nome",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Ao chou",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Reproducidas a miúdo",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Por ano",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Buscar: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Buscar",
"@searchInputPlaceholder": {},
"searchMoreResults": "Máis…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Resultados",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Licenzas",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Web do Proxecto",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Acerca de",
"@settingsAboutName": {},
"settingsAboutVersion": "versión {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Música",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Non rexistrar o historial de reprodución",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Rexistrar o historial de reprodución",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Rexistrar reprodución",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Rede",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Bitrate máx. (móbil)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Bitrate máx. (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Tempo máximo na memoria",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Tempo mínimo na memoria",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} segundos",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Sen límite",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Limpar a caché de imaxes",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Restablecer",
"@settingsResetName": {},
"settingsServersActionsAdd": "Engadir Servidor",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Eliminar",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Editar Servidor",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Gardar",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Comprobar Conexión",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Enderezo",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Contrasinal",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Identificador",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Fallou a conexión a {address}, comproba os axustes",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Conexión con {address} OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servidores",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contrasinal como token + salt",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contrasinal en texto plano (herdado, pon coidado en que a conexión sexa segura!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contrasinal en texto plano",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}
+194 -228
View File
@@ -1,230 +1,196 @@
{
"actionsStar": "收藏",
"@actionsStar": {},
"actionsUnstar": "移除收藏",
"@actionsUnstar": {},
"messagesNothingHere": "什么都没有…",
"@messagesNothingHere": {},
"navigationTabsHome": "首页",
"@navigationTabsHome": {},
"navigationTabsLibrary": "所有",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "搜索",
"@navigationTabsSearch": {},
"navigationTabsSettings": "设置",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "播放专辑",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "查看专辑",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "专辑排序",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, other{专辑}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "查看歌手",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "歌手排序",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, other{歌手}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "根据类型",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "已收藏",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "全部播放",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, other{播放列表}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, other{队列}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "热门歌曲",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, other{歌曲}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "最近添加",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "根据歌手",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "播放最多",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "根据名称",
"@resourcesSortByName": {},
"resourcesSortByRandom": "随机",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "最近播放",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "根据年份",
"@resourcesSortByYear": {},
"searchHeaderTitle": "搜索: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "搜索",
"@searchInputPlaceholder": {},
"searchMoreResults": "更多…",
"@searchMoreResults": {},
"searchNowPlayingContext": "搜索结果",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "许可",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "项目地址",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "关于",
"@settingsAboutName": {},
"settingsAboutVersion": "版本 {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "音乐",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "不记录scrobble历史",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble播放历史",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Scrobble模式",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "网络",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "最大比特率 (3G/4G/5G)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "最大比特率 (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "最大缓冲时间",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "最小缓冲时间",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} 秒",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "不限制",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "清除图片缓存",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "重置",
"@settingsResetName": {},
"settingsServersActionsAdd": "添加服务器",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "删除",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "编辑服务器",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "保存",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "测试连接",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "地址",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "密码",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "用户名",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "连接到 {address} 失败,检查设置或服务器",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "连接到 {address} 正常!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "服务器",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "密码以 token + salt 加密发送",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "密码以明文发送(不推荐,注意链接安全!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "强制使用明文密码",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"actionsDownload": "下载",
"@actionsDownload": {},
"actionsDownloadCancel": "取消下载",
"@actionsDownloadCancel": {},
"actionsDownloadDelete": "删除已下载",
"@actionsDownloadDelete": {},
"actionsOk": "确定",
"@actionsOk": {},
"resourcesFilterArtist": "歌手",
"@resourcesFilterArtist": {},
"resourcesFilterOwner": "所有者",
"@resourcesFilterOwner": {},
"resourcesSongListDeleteAllTitle": "删除下载?",
"@resourcesSongListDeleteAllTitle": {},
"resourcesSortByAlbum": "专辑",
"@resourcesSortByAlbum": {},
"resourcesSortByAlbumCount": "专辑数量",
"@resourcesSortByAlbumCount": {},
"resourcesSortByUpdated": "最近添加",
"@resourcesSortByUpdated": {},
"settingsAboutActionsSupport": "支持开发者",
"@settingsAboutActionsSupport": {},
"resourcesFilterAlbum": "专辑",
"@resourcesFilterAlbum": {},
"resourcesSortByTitle": "标题",
"@resourcesSortByTitle": {},
"actionsCancel": "取消",
"@actionsCancel": {},
"actionsDelete": "删除",
"@actionsDelete": {},
"resourcesFilterYear": "年份",
"@resourcesFilterYear": {},
"resourcesSongListDeleteAllContent": "该操作会删除所有已下载的歌曲文件。",
"@resourcesSongListDeleteAllContent": {}
"actionsStar": "收藏",
"@actionsStar": {},
"actionsUnstar": "移除收藏",
"@actionsUnstar": {},
"messagesNothingHere": "什么都没有…",
"@messagesNothingHere": {},
"navigationTabsHome": "首页",
"@navigationTabsHome": {},
"navigationTabsLibrary": "所有",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "搜索",
"@navigationTabsSearch": {},
"navigationTabsSettings": "设置",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "播放专辑",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "查看专辑",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "专辑排序",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, other{专辑}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "查看歌手",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "歌手排序",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, other{歌手}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "根据类型",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "已收藏",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "全部播放",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, other{播放列表}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, other{队列}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "热门歌曲",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, other{歌曲}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "最近添加",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "根据歌手",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "播放最多",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "根据名称",
"@resourcesSortByName": {},
"resourcesSortByRandom": "随机",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "最近播放",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "根据年份",
"@resourcesSortByYear": {},
"searchHeaderTitle": "搜索: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "搜索",
"@searchInputPlaceholder": {},
"searchMoreResults": "更多…",
"@searchMoreResults": {},
"searchNowPlayingContext": "搜索结果",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "许可",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "项目地址",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "关于",
"@settingsAboutName": {},
"settingsAboutVersion": "版本 {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "音乐",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "不记录scrobble历史",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble播放历史",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Scrobble模式",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "网络",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "最大比特率 (3G/4G/5G)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "最大比特率 (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "最大缓冲时间",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "最小缓冲时间",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} 秒",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "不限制",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "清除图片缓存",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "重置",
"@settingsResetName": {},
"settingsServersActionsAdd": "添加服务器",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "删除",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "编辑服务器",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "保存",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "测试连接",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "地址",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "密码",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "用户名",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "连接到 {address} 失败,检查设置或服务器",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "连接到 {address} 正常!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "服务器",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "密码以 token + salt 加密发送",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "密码以明文发送(不推荐,注意链接安全!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "强制使用明文密码",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}
+1 -2
View File
@@ -68,8 +68,7 @@ enum QueueContextType {
album('album'),
playlist('playlist'),
library('library'),
genre('genre'),
artist('artist');
genre('genre');
const QueueContextType(this.value);
final String value;
-1
View File
@@ -28,7 +28,6 @@ const _$QueueContextTypeEnumMap = {
QueueContextType.playlist: 'playlist',
QueueContextType.library: 'library',
QueueContextType.genre: 'genre',
QueueContextType.artist: 'artist',
};
_$_MediaItemData _$$_MediaItemDataFromJson(Map<String, dynamic> json) =>
+1 -1
View File
@@ -214,7 +214,7 @@ class DownloadService extends _$DownloadService {
Future<void> deleteAll(int sourceId) async {
final db = ref.read(databaseProvider);
final albumIds = await db.albumIdsWithDownloadStatus(sourceId).get();
final albumIds = await db.albumIdsWithDownloaded(sourceId).get();
for (var id in albumIds) {
await deleteAlbum(await (db.albumById(sourceId, id)).getSingle());
}
+1 -1
View File
@@ -6,7 +6,7 @@ part of 'download_service.dart';
// RiverpodGenerator
// **************************************************************************
String _$downloadServiceHash() => r'c72c49f980e307f3013467e76b6564d14a34a736';
String _$downloadServiceHash() => r'92e963b5c070f4d1edb0cd81899b16393c2b9a70';
/// See also [DownloadService].
@ProviderFor(DownloadService)
+4 -4
View File
@@ -31,7 +31,7 @@ class SyncService extends _$SyncService {
final source = ref.read(musicSourceProvider);
final db = ref.read(databaseProvider);
final ids = <String>{};
final ids = <String>[];
await for (var artists in source.allArtists()) {
ids.addAll(artists.map((e) => e.id.value));
await db.saveArtists(artists);
@@ -44,7 +44,7 @@ class SyncService extends _$SyncService {
final source = ref.read(musicSourceProvider);
final db = ref.read(databaseProvider);
final ids = <String>{};
final ids = <String>[];
await for (var albums in source.allAlbums()) {
ids.addAll(albums.map((e) => e.id.value));
await db.saveAlbums(albums);
@@ -57,7 +57,7 @@ class SyncService extends _$SyncService {
final source = ref.read(musicSourceProvider);
final db = ref.read(databaseProvider);
final ids = <String>{};
final ids = <String>[];
await for (var playlists in source.allPlaylists()) {
ids.addAll(playlists.map((e) => e.playist.id.value));
await db.savePlaylists(playlists);
@@ -70,7 +70,7 @@ class SyncService extends _$SyncService {
final source = ref.read(musicSourceProvider);
final db = ref.read(databaseProvider);
final ids = <String>{};
final ids = <String>[];
await for (var songs in source.allSongs()) {
ids.addAll(songs.map((e) => e.id.value));
await db.saveSongs(songs);
+1 -1
View File
@@ -6,7 +6,7 @@ part of 'sync_service.dart';
// RiverpodGenerator
// **************************************************************************
String _$syncServiceHash() => r'58ebee4e6f055b64ee6789ae43d63c0e15c679e0';
String _$syncServiceHash() => r'2b8da374c3143bc56f17115440d57bc70468a17e';
/// See also [SyncService].
@ProviderFor(SyncService)
+6
View File
@@ -82,4 +82,10 @@ class MusicSource implements BaseMusicSource {
@override
Uri streamUri(String songId) => _source.streamUri(songId);
@override
bool operator ==(other) => other is BaseMusicSource && (other.id == id);
@override
int get hashCode => id;
}
+1 -1
View File
@@ -4,7 +4,7 @@ homepage: https://github.com/austinried/subtracks
repository: https://github.com/austinried/subtracks
issue_tracker: https://github.com/austinried/subtracks/issues
publish_to: 'none'
version: 2.0.0-alpha.2+11
version: 2.0.0-alpha.1+10
environment:
sdk: '>=2.19.2 <3.0.0'