Compare commits
94 Commits
feat/emby-
...
v2.4.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9d995d795b | ||
|
|
b8a2c0d889 | ||
|
|
bf4b9bd446 | ||
|
|
55bfbee3b0 | ||
|
|
614066c11e | ||
|
|
b381537b62 | ||
|
|
f4f5089d7f | ||
|
|
34916e4ca0 | ||
|
|
b1c86f2142 | ||
|
|
4e30fa0a40 | ||
|
|
3629f8c756 | ||
|
|
314bc3b2c4 | ||
|
|
b9e8a94c7a | ||
|
|
6316814eba | ||
|
|
8bef5c66e3 | ||
|
|
96a11804ba | ||
|
|
9462a3e294 | ||
|
|
f90e9be378 | ||
|
|
cacdba531d | ||
|
|
2f1b9c180d | ||
|
|
dc9541eea7 | ||
|
|
b9a6c66584 | ||
|
|
b03d449a1b | ||
|
|
77db5a51d2 | ||
|
|
4dd0d6e0e5 | ||
|
|
f2cac91e2f | ||
|
|
2c42a897d9 | ||
|
|
502f39db0e | ||
|
|
1972f489aa | ||
|
|
95d8748936 | ||
|
|
38af15fe44 | ||
|
|
6283c8cfa5 | ||
|
|
01e25a89b1 | ||
|
|
399340127d | ||
|
|
b6431bf71d | ||
|
|
6668479bc2 | ||
|
|
ba9d049699 | ||
|
|
eb5cf684cd | ||
|
|
6a950ecbad | ||
|
|
10547540f7 | ||
|
|
260674ece3 | ||
|
|
8510fe358a | ||
|
|
eb6b4a05c8 | ||
|
|
4dee62aaaa | ||
|
|
286509d1db | ||
|
|
7b723cd653 | ||
|
|
1804e54f10 | ||
|
|
e91d34c9f1 | ||
|
|
0bc6c91c2e | ||
|
|
c6026c8148 | ||
|
|
5bb633b836 | ||
|
|
14f4a27ce6 | ||
|
|
7afe170da5 | ||
|
|
a6452f0a5e | ||
|
|
c15f8fe1fc | ||
|
|
f223cbab3a | ||
|
|
6c7b3d2198 | ||
|
|
806e8577f0 | ||
|
|
019cdd9e20 | ||
|
|
766298c798 | ||
|
|
84429b91a4 | ||
|
|
2a669044dd | ||
|
|
79942e38e5 | ||
|
|
ac50b2188d | ||
|
|
b3b7ad9819 | ||
|
|
bbbd04405e | ||
|
|
29d6b03a8a | ||
|
|
25f14e3f9b | ||
|
|
8d4f199bfc | ||
|
|
144733a9bf | ||
|
|
21a604a0f2 | ||
|
|
64db1e2a83 | ||
|
|
bb205fef34 | ||
|
|
7d9ccddc44 | ||
|
|
654e694d10 | ||
|
|
4a26b93b10 | ||
|
|
1cafdc4759 | ||
|
|
3229a0416b | ||
|
|
3ec7d95241 | ||
|
|
668e441e25 | ||
|
|
27a200f291 | ||
|
|
9d8d8a2476 | ||
|
|
892c8134fa | ||
|
|
385f44036a | ||
|
|
f396712d3a | ||
|
|
6578f0bc1d | ||
|
|
16b11f24d1 | ||
|
|
5e872e8a58 | ||
|
|
14626fbe97 | ||
|
|
14206ba86e | ||
|
|
aa26d46ba9 | ||
|
|
b0c85f4836 | ||
|
|
10c2dcac8b | ||
|
|
5528855128 |
2
.github/workflows/fastlane.yml
vendored
2
.github/workflows/fastlane.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
||||
SENTRY_DISABLE_AUTO_UPLOAD: true
|
||||
run: bundle exec fastlane android build
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: jellyfin-audio-player-android-${{ steps.vars.outputs.sha_short }}.apk
|
||||
path: android/app/build/outputs/**/*.apk
|
||||
|
||||
41
CHANGELOG.md
41
CHANGELOG.md
@@ -1,3 +1,44 @@
|
||||
## [2.4.1](https://github.com/leinelissen/jellyfin-audio-player/compare/v2.4.0...v2.4.1) (2025-01-27)
|
||||
|
||||
|
||||
|
||||
# [2.4.0](https://github.com/leinelissen/jellyfin-audio-player/compare/v2.3.3...v2.4.0) (2025-01-26)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* accept any valid mime type for downloadable tracks ([2c42a89](https://github.com/leinelissen/jellyfin-audio-player/commit/2c42a897d9e77ba8f767896512b80c8c10a72e30))
|
||||
* align all album titles in track list view ([7cdd01e](https://github.com/leinelissen/jellyfin-audio-player/commit/7cdd01e71378fded86411b8dc79c9748c315be96)), closes [#172](https://github.com/leinelissen/jellyfin-audio-player/issues/172)
|
||||
* bump blur-view ([8bef5c6](https://github.com/leinelissen/jellyfin-audio-player/commit/8bef5c66e3242c1ad359eb3a96ef3177031cd22f))
|
||||
* clean up lyrics implementation ([2f1b9c1](https://github.com/leinelissen/jellyfin-audio-player/commit/2f1b9c180d205228768d0d82b13e9f6e51944928))
|
||||
* dark mode inconsistencies ([a64f52c](https://github.com/leinelissen/jellyfin-audio-player/commit/a64f52c4f913f92d8caeea74188d1260ff7c2ce5)), closes [#226](https://github.com/leinelissen/jellyfin-audio-player/issues/226) [#198](https://github.com/leinelissen/jellyfin-audio-player/issues/198)
|
||||
* don't attempt to parse playback reporting responses ([746c96d](https://github.com/leinelissen/jellyfin-audio-player/commit/746c96d45932f3a23122ada165acc49e8053da11))
|
||||
* ensure all cover images load properly ([b9e8a94](https://github.com/leinelissen/jellyfin-audio-player/commit/b9e8a94c7a4682076c05c4562b8996e47e84311f))
|
||||
* fine-tune default orderings ([38ce998](https://github.com/leinelissen/jellyfin-audio-player/commit/38ce9986e590392667fae7c8119aa1057e95cd23)), closes [#229](https://github.com/leinelissen/jellyfin-audio-player/issues/229)
|
||||
* further limit extraneous events from playback reporting ([c9f7f71](https://github.com/leinelissen/jellyfin-audio-player/commit/c9f7f71194105944f051e7329b88956e4c863976))
|
||||
* make progress bars initialise out of view ([0b13e69](https://github.com/leinelissen/jellyfin-audio-player/commit/0b13e69854a361a67bcc67baaf22c9364a53378f))
|
||||
* missing background on track pop-up menu ([f2cac91](https://github.com/leinelissen/jellyfin-audio-player/commit/f2cac91e2f08db7945a88e9ad29daa797ab96edd))
|
||||
* missing cover images in now playing view ([96a1180](https://github.com/leinelissen/jellyfin-audio-player/commit/96a11804ba390dc665282f1fc49e7f0fb710e642)), closes [#245](https://github.com/leinelissen/jellyfin-audio-player/issues/245) [#209](https://github.com/leinelissen/jellyfin-audio-player/issues/209)
|
||||
* missing image covers for emby ([01e25a8](https://github.com/leinelissen/jellyfin-audio-player/commit/01e25a89b1adcbacd7a58642d4d4ef8731480d8c))
|
||||
* more accurately return current track ([9462a3e](https://github.com/leinelissen/jellyfin-audio-player/commit/9462a3e294bffc46f25797688aefec2a43f7cccb))
|
||||
* prevent error on lyrics screen when tab height is unavailable ([b9a6c66](https://github.com/leinelissen/jellyfin-audio-player/commit/b9a6c66584b215e3ee86d1808864a04aa26065c9))
|
||||
* properly pre-insert queued tracks before played track ([3993401](https://github.com/leinelissen/jellyfin-audio-player/commit/399340127dd4026881397a269381aaca72c07751))
|
||||
* retrieve codec metadata and lyrics asynchronously ([77db5a5](https://github.com/leinelissen/jellyfin-audio-player/commit/77db5a51d2e2ba5ecd37439588dd83dcf2437b1c))
|
||||
* send last position for `Stopped` event ([68c8808](https://github.com/leinelissen/jellyfin-audio-player/commit/68c88081885bb3bda196dfe71b684e21e678787e))
|
||||
* show past lyrics in grey ([b03d449](https://github.com/leinelissen/jellyfin-audio-player/commit/b03d449a1bd5d16e16f15dbb215a75cfd2e0cc7c))
|
||||
* support audio/ogg in downloads ([1972f48](https://github.com/leinelissen/jellyfin-audio-player/commit/1972f489aaed4780c74733532e3597dbb54a5536))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* also store cover images for downloaded tracks ([6316814](https://github.com/leinelissen/jellyfin-audio-player/commit/6316814eba59ed2bd2c0fe1a23ed64bfe2f1bed3))
|
||||
* Emby support ([#234](https://github.com/leinelissen/jellyfin-audio-player/issues/234)) ([a6452f0](https://github.com/leinelissen/jellyfin-audio-player/commit/a6452f0a5e81b2f70ecdd7900138ef1a8ecb5554))
|
||||
* enable playlists for emby ([f90e9be](https://github.com/leinelissen/jellyfin-audio-player/commit/f90e9be3783363bd65b4c8b7c15964338b19dc38)), closes [#242](https://github.com/leinelissen/jellyfin-audio-player/issues/242)
|
||||
* Media stream info in now playing modal ([#233](https://github.com/leinelissen/jellyfin-audio-player/issues/233)) ([0d09c6f](https://github.com/leinelissen/jellyfin-audio-player/commit/0d09c6f0b8a5fc218af1182324a73cb667eccbce))
|
||||
* separate discs in album view when multiple are available ([ec4a2b6](https://github.com/leinelissen/jellyfin-audio-player/commit/ec4a2b6831fb8aa3c5e8f1fc658c235ced59cfd9)), closes [#179](https://github.com/leinelissen/jellyfin-audio-player/issues/179)
|
||||
|
||||
|
||||
|
||||
## [2.3.3](https://github.com/leinelissen/jellyfin-audio-player/compare/v2.3.2...v2.3.3) (2024-06-15)
|
||||
|
||||
|
||||
|
||||
105
Gemfile.lock
105
Gemfile.lock
@@ -1,7 +1,9 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.6)
|
||||
CFPropertyList (3.0.7)
|
||||
base64
|
||||
nkf
|
||||
rexml
|
||||
activesupport (6.1.7.6)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
@@ -9,30 +11,31 @@ GEM
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
zeitwerk (~> 2.3)
|
||||
addressable (2.8.6)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
addressable (2.8.7)
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
algoliasearch (1.27.5)
|
||||
httpclient (~> 2.8, >= 2.8.3)
|
||||
json (>= 1.5.1)
|
||||
artifactory (3.0.15)
|
||||
artifactory (3.0.17)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.885.0)
|
||||
aws-sdk-core (3.191.0)
|
||||
aws-partitions (1.1042.0)
|
||||
aws-sdk-core (3.217.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.8)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.77.0)
|
||||
aws-sdk-core (~> 3, >= 3.191.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.143.0)
|
||||
aws-sdk-core (~> 3, >= 3.191.0)
|
||||
aws-sdk-kms (1.97.0)
|
||||
aws-sdk-core (~> 3, >= 3.216.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.178.0)
|
||||
aws-sdk-core (~> 3, >= 3.216.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.8)
|
||||
aws-sigv4 (1.8.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (1.11.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
base64 (0.2.0)
|
||||
claide (1.1.0)
|
||||
cocoapods (1.15.0)
|
||||
addressable (~> 2.8)
|
||||
@@ -87,7 +90,7 @@ GEM
|
||||
ethon (0.16.0)
|
||||
ffi (>= 1.15.0)
|
||||
excon (0.109.0)
|
||||
faraday (1.10.3)
|
||||
faraday (1.10.4)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
faraday-excon (~> 1.1)
|
||||
@@ -106,24 +109,24 @@ GEM
|
||||
faraday-em_synchrony (1.0.0)
|
||||
faraday-excon (1.1.0)
|
||||
faraday-httpclient (1.0.1)
|
||||
faraday-multipart (1.0.4)
|
||||
multipart-post (~> 2)
|
||||
faraday-net_http (1.0.1)
|
||||
faraday-multipart (1.1.0)
|
||||
multipart-post (~> 2.0)
|
||||
faraday-net_http (1.0.2)
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday-rack (1.0.0)
|
||||
faraday-retry (1.0.3)
|
||||
faraday_middleware (1.2.0)
|
||||
faraday_middleware (1.2.1)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.3.0)
|
||||
fastlane (2.219.0)
|
||||
fastimage (2.4.0)
|
||||
fastlane (2.226.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
aws-sdk-s3 (~> 1.0)
|
||||
babosa (>= 1.0.3, < 2.0.0)
|
||||
bundler (>= 1.12.0, < 3.0.0)
|
||||
colored
|
||||
colored (~> 1.2)
|
||||
commander (~> 4.6)
|
||||
dotenv (>= 2.1.1, < 3.0.0)
|
||||
emoji_regex (>= 0.1, < 4.0)
|
||||
@@ -132,6 +135,7 @@ GEM
|
||||
faraday-cookie_jar (~> 0.0.6)
|
||||
faraday_middleware (~> 1.0)
|
||||
fastimage (>= 2.1.0, < 3.0.0)
|
||||
fastlane-sirp (>= 1.0.0)
|
||||
gh_inspector (>= 1.1.2, < 2.0.0)
|
||||
google-apis-androidpublisher_v3 (~> 0.3)
|
||||
google-apis-playcustomapp_v1 (~> 0.1)
|
||||
@@ -144,10 +148,10 @@ GEM
|
||||
mini_magick (>= 4.9.4, < 5.0.0)
|
||||
multipart-post (>= 2.0.0, < 3.0.0)
|
||||
naturally (~> 2.2)
|
||||
optparse (>= 0.1.1)
|
||||
optparse (>= 0.1.1, < 1.0.0)
|
||||
plist (>= 3.1.0, < 4.0.0)
|
||||
rubyzip (>= 2.0.0, < 3.0.0)
|
||||
security (= 0.1.3)
|
||||
security (= 0.1.5)
|
||||
simctl (~> 1.6.3)
|
||||
terminal-notifier (>= 2.0.0, < 3.0.0)
|
||||
terminal-table (~> 3)
|
||||
@@ -155,12 +159,14 @@ GEM
|
||||
tty-spinner (>= 0.8.0, < 1.0.0)
|
||||
word_wrap (~> 1.0.0)
|
||||
xcodeproj (>= 1.13.0, < 2.0.0)
|
||||
xcpretty (~> 0.3.0)
|
||||
xcpretty-travis-formatter (>= 0.0.3)
|
||||
xcpretty (~> 0.4.0)
|
||||
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
|
||||
fastlane-plugin-load_json (0.0.1)
|
||||
fastlane-plugin-sentry (1.18.0)
|
||||
os (~> 1.1, >= 1.1.4)
|
||||
fastlane-plugin-versioning_android (0.1.1)
|
||||
fastlane-sirp (1.0.0)
|
||||
sysrandom (~> 1.0)
|
||||
ffi (1.16.3)
|
||||
fourflusher (2.3.1)
|
||||
fuzzy_match (2.0.4)
|
||||
@@ -202,40 +208,42 @@ GEM
|
||||
os (>= 0.9, < 2.0)
|
||||
signet (>= 0.16, < 2.a)
|
||||
highline (2.0.3)
|
||||
http-cookie (1.0.5)
|
||||
http-cookie (1.0.8)
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
i18n (1.14.1)
|
||||
concurrent-ruby (~> 1.0)
|
||||
jmespath (1.6.2)
|
||||
json (2.7.1)
|
||||
jwt (2.7.1)
|
||||
mini_magick (4.12.0)
|
||||
json (2.7.6)
|
||||
jwt (2.10.1)
|
||||
base64
|
||||
mini_magick (4.13.2)
|
||||
mini_mime (1.1.5)
|
||||
minitest (5.21.2)
|
||||
molinillo (0.8.0)
|
||||
multi_json (1.15.0)
|
||||
multipart-post (2.3.0)
|
||||
nanaimo (0.3.0)
|
||||
multipart-post (2.4.1)
|
||||
nanaimo (0.4.0)
|
||||
nap (1.1.0)
|
||||
naturally (2.2.1)
|
||||
netrc (0.11.0)
|
||||
optparse (0.4.0)
|
||||
nkf (0.2.0)
|
||||
optparse (0.6.0)
|
||||
os (1.1.4)
|
||||
plist (3.7.1)
|
||||
plist (3.7.2)
|
||||
public_suffix (4.0.7)
|
||||
rake (13.1.0)
|
||||
rake (13.2.1)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
uber (< 0.2.0)
|
||||
retriable (3.1.2)
|
||||
rexml (3.2.6)
|
||||
rouge (2.0.7)
|
||||
rexml (3.4.0)
|
||||
rouge (3.28.0)
|
||||
ruby-macho (2.5.1)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.3.2)
|
||||
security (0.1.3)
|
||||
rubyzip (2.4.1)
|
||||
security (0.1.5)
|
||||
signet (0.18.0)
|
||||
addressable (~> 2.8)
|
||||
faraday (>= 0.17.5, < 3.a)
|
||||
@@ -244,6 +252,7 @@ GEM
|
||||
simctl (1.6.10)
|
||||
CFPropertyList
|
||||
naturally
|
||||
sysrandom (1.0.5)
|
||||
terminal-notifier (2.0.0)
|
||||
terminal-table (3.0.2)
|
||||
unicode-display_width (>= 1.1.1, < 3)
|
||||
@@ -257,20 +266,18 @@ GEM
|
||||
tzinfo (2.0.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
uber (0.1.0)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.9.1)
|
||||
unicode-display_width (2.5.0)
|
||||
unf (0.2.0)
|
||||
unicode-display_width (2.6.0)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.24.0)
|
||||
xcodeproj (1.27.0)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
nanaimo (~> 0.3.0)
|
||||
rexml (~> 3.2.4)
|
||||
xcpretty (0.3.0)
|
||||
rouge (~> 2.0.7)
|
||||
nanaimo (~> 0.4.0)
|
||||
rexml (>= 3.3.6, < 4.0)
|
||||
xcpretty (0.4.0)
|
||||
rouge (~> 3.28.0)
|
||||
xcpretty-travis-formatter (1.0.1)
|
||||
xcpretty (~> 0.2, >= 0.0.7)
|
||||
zeitwerk (2.6.12)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
[](https://github.com/leinelissen/jellyfin-audio-player/releases/latest)
|
||||
[](https://apple.co/3MFYIJH)
|
||||
[](https://play.google.com/store/apps/details?id=nl.moeilijkedingen.jellyfinaudioplayer)
|
||||
[](https://testflight.apple.com/join/cf2AMDpx)
|
||||
[](https://testflight.apple.com/join/TpHWMmfM)
|
||||
[](https://f-droid.org/en/packages/nl.moeilijkedingen.jellyfinaudioplayer/)
|
||||

|
||||
[](./LICENSE.md)
|
||||
|
||||
@@ -85,8 +85,8 @@ android {
|
||||
applicationId "nl.moeilijkedingen.jellyfinaudioplayer"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 29
|
||||
versionName "2.3.3"
|
||||
versionCode 33
|
||||
versionName "2.4.3"
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# The Deliverfile allows you to store various App Store Connect metadata
|
||||
# For more information, check out the docs
|
||||
# https://docs.fastlane.tools/actions/deliver/
|
||||
overwrite_screenshots(true)
|
||||
overwrite_screenshots(false)
|
||||
@@ -4,6 +4,11 @@ package = load_json(json_path: "package.json")
|
||||
|
||||
platform :ios do
|
||||
before_all do
|
||||
app_store_connect_api_key(
|
||||
key_id: "Z98N7N8ZMW",
|
||||
issuer_id: "f0fa1c89-6a9a-4144-bfba-529dfe05f09b",
|
||||
key_filepath: "./certificates/AuthKey_Z98N7N8ZMW.p8"
|
||||
)
|
||||
get_certificates(
|
||||
output_path: "certificates/"
|
||||
)
|
||||
@@ -32,7 +37,9 @@ platform :ios do
|
||||
workspace: "ios/Fintunes.xcworkspace",
|
||||
export_method: "app-store",
|
||||
)
|
||||
upload_to_app_store
|
||||
upload_to_app_store(
|
||||
precheck_include_in_app_purchases: false
|
||||
)
|
||||
end
|
||||
|
||||
lane :beta do
|
||||
|
||||
@@ -1 +1 @@
|
||||
Fintunes ist ein Streaming Audioplayer für das Jellyfin Media System. Es bietet eine großartige Benutzeroberfläche, welche Ihnen ermöglicht Ihre Lieblingsmusik mit Leichtigkeit wiedergeben zu können. Sie können Ihre gesammte Bibliothek nach einen Titel suchen oder einfach eine Playlist anhören, welche Sie zuvor in Jellyfin erstellt haben. Alle Titel werden direkt mit bester Qualität von Ihrer Jellyfin-Bibliothek gestreamt. Ist Streaming nicht immer möglich? Jeder Titel in Ihrer Jellyfin Bibliothek kann heruntergeladen und offline abgespielt werden.
|
||||
Fintunes ist ein Streaming Audioplayer für das Jellyfin Media System. Es bietet eine großartige Benutzeroberfläche, welche Ihnen ermöglicht Ihre Lieblingsmusik mit Leichtigkeit wiedergeben zu können. Sie können Ihre gesamte Bibliothek nach einem beliebigen Titel durchsuchen, oder einfach eine Wiedergabeliste verwenden, die Sie zuvor in Jellyfin erstellt haben. Alle Titel werden direkt in höchster Qualität von Ihrer Jellyfin-Bibliothek gestreamt. Ist Streaming nicht immer eine Option? Jeder Titel in Ihrer Jellyfin Bibliothek kann heruntergeladen und offline abgespielt werden.
|
||||
|
||||
@@ -1 +1 @@
|
||||
Fintunes est un lecteur audio en streaming pour le système multimédia Jellyfin. Il dispose d'une interface magnifique qui vous permet de jouer facilement votre musique préférée. Vous pouvez rechercher n'importe quelle piste dans toute votre bibliothèque ou simplement vous détendre avec une liste de lecture que vous avez créée précédemment dans Jellyfin. Toutes les pistes sont diffusées directement à la plus haute qualité depuis votre bibliothèque Jellyfin. Le streaming n'est pas toujours une option ? N'importe quelle piste de votre bibliothèque Jellyfin peut être téléchargée et lue hors ligne.
|
||||
Fintunes est un lecteur audio en streaming pour le système multimédia Jellyfin. Il dispose d'une magnifique interface qui vous permet de lire facilement votre musique préférée. Vous pouvez rechercher n'importe quelle piste dans toute votre bibliothèque ou simplement vous détendre avec une liste de lecture que vous avez créée précédemment dans Jellyfin. Toutes les pistes sont diffusées directement à la plus haute qualité depuis votre bibliothèque Jellyfin. Vous ne disposez pas d'une connexion à Internet en permanence ? N'importe quelle piste de votre bibliothèque Jellyfin peut être téléchargée et lue hors ligne.
|
||||
|
||||
1
fastlane/metadata/android/ta-IN/full_description.txt
Normal file
1
fastlane/metadata/android/ta-IN/full_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
செல்லிஃபின் மீடியா சிச்டத்திற்கான ச்ட்ரீமிங் ஆடியோ பிளேயர் ஃபிண்டுன்ச் ஆகும். இது ஒரு அழகிய இடைமுகத்தைக் கொண்டுள்ளது, இது உங்களுக்கு பிடித்த இசையை எளிதாக இயக்க அனுமதிக்கிறது. எந்தவொரு தடத்திற்கும் உங்கள் முழு நூலகத்தையும் நீங்கள் தேடலாம் அல்லது செல்லிஃபினில் நீங்கள் முன்பு உருவாக்கிய பிளேலிச்ட்டுடன் எளிதாக எடுத்துக் கொள்ளலாம். அனைத்து தடங்களும் உங்கள் செல்லிஃபின் நூலகத்திலிருந்து மிக உயர்ந்த தரத்தில் நேரடியாக ச்ட்ரீம் செய்யப்படுகின்றன. ச்ட்ரீமிங் எப்போதும் ஒரு விருப்பமல்லவா? உங்கள் செல்லிஃபின் நூலகத்தில் உள்ள எந்த தடத்தையும் பதிவிறக்கம் செய்து ஆஃப்லைனில் இயக்கலாம்.
|
||||
1
fastlane/metadata/android/ta-IN/short_description.txt
Normal file
1
fastlane/metadata/android/ta-IN/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
செலிஃபினுக்கான ச்ட்ரீமிங் ஆடியோ பிளேயர்
|
||||
1
fastlane/metadata/android/ta-IN/title.txt
Normal file
1
fastlane/metadata/android/ta-IN/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Fintunes
|
||||
1
fastlane/metadata/android/zh-TW/full_description.txt
Normal file
1
fastlane/metadata/android/zh-TW/full_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Fintunes 是 Jellyfin 媒體系統的流媒體音訊播放器。 它具有華麗的介面,讓您輕鬆播放您最喜歡的音樂。 您可以在整個庫中搜索任何曲目,或者輕鬆使用您之前在 Jellyfin 中建立的播放列表。 所有曲目都直接從您的 Jellyfin 庫中以最高品質流式傳輸。 不一定每次播放都能連接到網路嗎? Jellyfin庫中的任何曲目都可以下載並離線播放。
|
||||
1
fastlane/metadata/android/zh-TW/short_description.txt
Normal file
1
fastlane/metadata/android/zh-TW/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Jellyfin 的流媒體音訊播放器
|
||||
1
fastlane/metadata/android/zh-TW/title.txt
Normal file
1
fastlane/metadata/android/zh-TW/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Fintunes
|
||||
@@ -1 +1,7 @@
|
||||
Aquesta és una correcció ràpida que permet tornar a accedir al vostre servidor Jellyfin mitjançant HTTP. Si us plau, utilitzeu HTTPS si el teniu disponible.
|
||||
Fintunes ara admet la visualització de lletres perquè puguis cantar les teves cançons preferides! A més, ara pots utilitzar Fintunes com a client per a Emby. Les característiques menors d’aquesta versió inclouen:
|
||||
|
||||
• Les imatges de portada es desen per a les pistes descarregades (torna a descarregar les teves pistes per assegurar-te que apareguin)
|
||||
• Una pantalla que mostra informació sobre el còdec de les pistes que s’estan reproduint
|
||||
• Moltes noves traduccions, com el polonès, tàmil, xinès tradicional, finès i indonesi. Gràcies a tots els col·laboradors lingüístics!
|
||||
|
||||
La versió 2.4.2 corregeix un error introduït a la versió 2.4.0 que impedia descarregar pistes sense portada.
|
||||
@@ -1 +1,7 @@
|
||||
Toto je oprava hotfix, která umožňuje znovu přistupovat k serveru Jellyfin přes HTTP. Použijte prosím HTTPS, pokud je to pro vás dostupné.
|
||||
Fintunes nyní podporuje zobrazování textů písní, takže si můžete zpívat své oblíbené skladby! Také nyní můžete používat Fintunes jako klienta pro Emby. Menší funkce v této verzi zahrnují:
|
||||
|
||||
• Ukládání obalů alb pro stažené skladby (znovu si stáhněte skladby, aby se obaly zobrazily)
|
||||
• Displej zobrazující informace o kodeku právě přehrávaných skladeb
|
||||
• Spousta nových překladů, například polština, tamilština, tradiční čínština, finština a indonéština. Děkujeme všem překladatelům!
|
||||
|
||||
Verze 2.4.2 opravuje chybu zavedenou ve verzi 2.4.0, která znemožňovala stahování skladeb bez obalu.
|
||||
@@ -1 +1,7 @@
|
||||
Hierbei handelt es sich um einen Hotfix, der es wieder möglich macht, über HTTP auf Ihren Jellyfin-Server zuzugreifen. Bitte verwenden Sie HTTPS, sofern Ihnen dies zur Verfügung steht.
|
||||
Fintunes unterstützt jetzt die Anzeige von Liedtexten, sodass du deine Lieblingssongs mitsingen kannst! Außerdem kannst du Fintunes jetzt als Client für Emby nutzen. Kleinere Funktionen in dieser Version umfassen:
|
||||
|
||||
• Coverbilder werden für heruntergeladene Titel gespeichert (lade deine Titel erneut herunter, um sicherzustellen, dass sie angezeigt werden)
|
||||
• Eine Anzeige, die Codec-Informationen für die aktuell abgespielten Titel zeigt
|
||||
• Viele neue Übersetzungen, darunter Polnisch, Tamil, Traditionelles Chinesisch, Finnisch und Indonesisch. Vielen Dank an alle Sprachbeiträger!
|
||||
|
||||
Version 2.4.2 behebt einen Fehler aus Version 2.4.0, der das Herunterladen von Titeln ohne Cover verhinderte.
|
||||
@@ -1 +1,7 @@
|
||||
This is a hotfix that makes it possible to access your Jellyfin server over HTTP again. Do please use HTTPS if that's available to you.
|
||||
Fintunes now supports displaying lyrics so you can sign along to your favourite tunes! Also, you can now use Fintunes as a client for Emby. Minor features in this release include:
|
||||
|
||||
• Cover images being saved for downloaded tracks (re-download your tracks to make sure they appear)
|
||||
• A display that shows codec information for your currently playing tracks
|
||||
• Loads of new translations, such as Polish, Tamil, Traditional Chinese, Finnish and Indonesian. Thanks to all language contributors!
|
||||
|
||||
v2.4.2 contains a fix for an error introduced with v2.4.0 that prohibited downloading tracks without cover art.
|
||||
@@ -1 +1,7 @@
|
||||
Esta es una revisión que permite acceder nuevamente a su servidor Jellyfin a través de HTTP. Utilice HTTPS si está disponible para usted.
|
||||
Fintunes ahora admite la visualización de letras para que puedas cantar tus canciones favoritas. Además, ahora puedes usar Fintunes como cliente para Emby. Las características menores de esta versión incluyen:
|
||||
|
||||
• Se guardan las imágenes de portada para las pistas descargadas (vuelve a descargar tus pistas para asegurarte de que aparezcan)
|
||||
• Una pantalla que muestra información del códec de las pistas que estás reproduciendo
|
||||
• Muchas nuevas traducciones, como polaco, tamil, chino tradicional, finlandés e indonesio. ¡Gracias a todos los colaboradores de idiomas!
|
||||
|
||||
La versión 2.4.2 corrige un error introducido en la versión 2.4.0 que impedía descargar pistas sin portada.
|
||||
@@ -1 +1 @@
|
||||
Fintunes est un lecteur audio en streaming pour le système multimédia Jellyfin. Il dispose d'une interface magnifique qui vous permet de jouer facilement votre musique préférée. Vous pouvez rechercher n'importe quelle piste dans toute votre bibliothèque ou simplement vous détendre avec une liste de lecture que vous avez créée précédemment dans Jellyfin. Toutes les pistes sont diffusées directement à la plus haute qualité depuis votre bibliothèque Jellyfin. Le streaming n'est pas toujours une option ? N'importe quelle piste de votre bibliothèque Jellyfin peut être téléchargée et lue hors ligne.
|
||||
Fintunes est un lecteur audio en streaming pour le système multimédia Jellyfin. Il dispose d'une magnifique interface qui vous permet de lire facilement votre musique préférée. Vous pouvez rechercher n'importe quelle piste dans toute votre bibliothèque ou simplement vous détendre avec une liste de lecture que vous avez créée précédemment dans Jellyfin. Toutes les pistes sont diffusées directement à la plus haute qualité depuis votre bibliothèque Jellyfin. Vous ne disposez pas d'une connexion à Internet en permanence ? N'importe quelle piste de votre bibliothèque Jellyfin peut être téléchargée et lue hors ligne.
|
||||
|
||||
@@ -1 +1 @@
|
||||
jellyfin, audio, joueur, diffusion, téléchargements, musique
|
||||
jellyfin, audio, lecteur, streaming, téléchargements, musique
|
||||
|
||||
@@ -1 +1,7 @@
|
||||
Il s'agit d'un correctif qui permet d'accéder à nouveau à votre serveur Jellyfin via HTTP. Veuillez utiliser HTTPS si vous en avez la possibilité.
|
||||
Fintunes prend désormais en charge l’affichage des paroles, afin que vous puissiez chanter vos morceaux préférés ! De plus, vous pouvez maintenant utiliser Fintunes comme client pour Emby. Les fonctionnalités mineures de cette version incluent :
|
||||
|
||||
• Les images de couverture sont enregistrées pour les morceaux téléchargés (retéléchargez vos morceaux pour vous assurer qu’elles apparaissent)
|
||||
• Un affichage indiquant les informations du codec des morceaux en cours de lecture
|
||||
• De nombreuses nouvelles traductions, notamment en polonais, tamoul, chinois traditionnel, finnois et indonésien. Merci à tous les contributeurs linguistiques !
|
||||
|
||||
La version 2.4.2 corrige une erreur introduite avec la version 2.4.0 qui empêchait le téléchargement des morceaux sans pochette.
|
||||
@@ -1 +1,7 @@
|
||||
Questo è un hotfix che rende possibile accedere nuovamente al tuo server Jellyfin tramite HTTP. Ti preghiamo di utilizzare HTTPS se è disponibile per te.
|
||||
Fintunes ora supporta la visualizzazione dei testi, così puoi cantare le tue canzoni preferite! Inoltre, ora puoi usare Fintunes come client per Emby. Le funzionalità minori di questa versione includono:
|
||||
|
||||
• Le immagini di copertina vengono salvate per i brani scaricati (riscarica i brani per assicurarti che appaiano)
|
||||
• Un display che mostra le informazioni sul codec per i brani attualmente in riproduzione
|
||||
• Molte nuove traduzioni, come polacco, tamil, cinese tradizionale, finlandese e indonesiano. Grazie a tutti i contributori linguistici!
|
||||
|
||||
La versione 2.4.2 corregge un errore introdotto con la versione 2.4.0 che impediva il download di brani senza copertina.
|
||||
@@ -1 +1,7 @@
|
||||
これは、HTTP 経由で Jellyfin サーバーに再びアクセスできるようにするホットフィックスです。 HTTPS が利用可能な場合は、HTTPS を使用してください。
|
||||
Fintunesは歌詞の表示をサポートするようになり、お気に入りの曲を一緒に歌えるようになりました!さらに、FintunesをEmbyのクライアントとして使用できるようになりました。このリリースの小さな新機能には以下が含まれます:
|
||||
|
||||
• ダウンロードした曲のカバー画像を保存(曲を再ダウンロードすると表示されるようになります)
|
||||
• 現在再生中の曲のコーデック情報を表示する画面
|
||||
• ポーランド語、タミル語、繁体字中国語、フィンランド語、インドネシア語など、多くの新しい翻訳。すべての翻訳者の皆さんに感謝します!
|
||||
|
||||
バージョン 2.4.2 は、バージョン 2.4.0 で発生したカバーアートなしの曲をダウンロードできないバグを修正しました。
|
||||
@@ -1 +1,7 @@
|
||||
Dit is een hotfix die het mogelijk maakt om weer via HTTP toegang te krijgen tot je Jellyfin-server. Gebruik alsjeblieft HTTPS als dat voor jou beschikbaar is.
|
||||
Fintunes ondersteunt nu het weergeven van songteksten, zodat je kunt meezingen met je favoriete nummers! Daarnaast kun je Fintunes nu gebruiken als een client voor Emby. Kleine functies in deze release zijn onder andere:
|
||||
|
||||
• Coverafbeeldingen worden opgeslagen voor gedownloade nummers (download je nummers opnieuw om ervoor te zorgen dat ze verschijnen)
|
||||
• Een weergave die codec-informatie toont voor de nummers die je momenteel afspeelt
|
||||
• Veel nieuwe vertalingen, zoals Pools, Tamil, Traditioneel Chinees, Fins en Indonesisch. Bedankt aan alle taalbijdragers!
|
||||
|
||||
Versie 2.4.2 lost een fout op die in versie 2.4.0 werd geïntroduceerd en die verhinderde dat nummers zonder cover konden worden gedownload.
|
||||
@@ -1 +1,7 @@
|
||||
Dette er en hurtigreparasjon som gjør det mulig å få tilgang til Jellyfin-serveren din over HTTP igjen. Vennligst bruk HTTPS hvis det er tilgjengelig for deg.
|
||||
Fintunes støtter nå visning av sangtekster, slik at du kan synge med til favorittsangene dine! I tillegg kan du nå bruke Fintunes som en klient for Emby. Mindre funksjoner i denne utgivelsen inkluderer:
|
||||
|
||||
• Coverbilder lagres for nedlastede spor (last ned sporene dine på nytt for å sikre at de vises)
|
||||
• En visning som viser kodekinformasjon for sporene du spiller av
|
||||
• Massevis av nye oversettelser, som polsk, tamil, tradisjonell kinesisk, finsk og indonesisk. Takk til alle språkbidragsytere!
|
||||
|
||||
Versjon 2.4.2 inneholder en feilretting for en feil som ble introdusert i versjon 2.4.0, som forhindret nedlasting av spor uten cover.
|
||||
@@ -1 +1,7 @@
|
||||
Jest to poprawka umożliwiająca ponowne uzyskanie dostępu do serwera Jellyfin za pośrednictwem protokołu HTTP. Jeśli masz taką możliwość, użyj protokołu HTTPS.
|
||||
Fintunes obsługuje teraz wyświetlanie tekstów piosenek, dzięki czemu możesz śpiewać razem ze swoimi ulubionymi utworami! Dodatkowo możesz teraz używać Fintunes jako klienta dla Emby. Drobne zmiany w tej wersji obejmują:
|
||||
|
||||
• Zapisywanie okładek dla pobranych utworów (ponownie pobierz utwory, aby upewnić się, że okładki się pojawią)
|
||||
• Wyświetlanie informacji o kodeku dla aktualnie odtwarzanych utworów
|
||||
• Wiele nowych tłumaczeń, takich jak polski, tamilski, tradycyjny chiński, fiński i indonezyjski. Dziękujemy wszystkim tłumaczom!
|
||||
|
||||
Wersja 2.4.2 naprawia błąd wprowadzony w wersji 2.4.0, który uniemożliwiał pobieranie utworów bez okładki.
|
||||
@@ -1 +1,7 @@
|
||||
Este é um hotfix que torna possível acessar novamente o servidor Jellyfin por HTTP. Use HTTPS se estiver disponível para você.
|
||||
O Fintunes agora suporta a exibição de letras, para que você possa cantar junto com suas músicas favoritas! Além disso, agora você pode usar o Fintunes como cliente para o Emby. Pequenas melhorias nesta versão incluem:
|
||||
|
||||
• As imagens de capa agora são salvas para faixas baixadas (baixe novamente suas faixas para garantir que apareçam)
|
||||
• Uma exibição que mostra informações do codec para as faixas que estão sendo reproduzidas
|
||||
• Muitas novas traduções, incluindo polonês, tâmil, chinês tradicional, finlandês e indonésio. Obrigado a todos os colaboradores de idiomas!
|
||||
|
||||
A versão 2.4.2 corrige um erro introduzido na versão 2.4.0 que impedia o download de faixas sem capa.
|
||||
@@ -1 +1,7 @@
|
||||
Это исправление, которое позволяет снова получить доступ к вашему серверу Jellyfin через HTTP. Пожалуйста, используйте HTTPS, если он вам доступен.
|
||||
Fintunes теперь поддерживает отображение текстов песен, чтобы вы могли подпевать своим любимым мелодиям! Кроме того, теперь вы можете использовать Fintunes в качестве клиента для Emby. Незначительные изменения в этом выпуске включают:
|
||||
|
||||
• Сохранение обложек для загруженных треков (перекачайте треки, чтобы убедиться, что обложки отображаются)
|
||||
• Отображение информации о кодеке для текущих воспроизводимых треков
|
||||
• Множество новых переводов, таких как польский, тамильский, традиционный китайский, финский и индонезийский. Спасибо всем переводчикам!
|
||||
|
||||
Версия 2.4.2 исправляет ошибку, появившуюся в версии 2.4.0, которая препятствовала загрузке треков без обложек.
|
||||
@@ -1 +1,7 @@
|
||||
Detta är en snabbkorrigering som gör det möjligt att komma åt din Jellyfin-server över HTTP igen. Använd HTTPS om det är tillgängligt för dig.
|
||||
Fintunes har nu stöd för att visa låttexter så att du kan sjunga med i dina favoritlåtar! Dessutom kan du nu använda Fintunes som en klient för Emby. Mindre funktioner i denna version inkluderar:
|
||||
|
||||
• Omslagsbilder sparas för nedladdade låtar (ladda ner låtarna igen för att säkerställa att omslagen visas)
|
||||
• En visning som visar codec-information för låtar du spelar upp
|
||||
• Massor av nya översättningar, såsom polska, tamilska, traditionell kinesiska, finska och indonesiska. Tack till alla språkbidragsgivare!
|
||||
|
||||
Version 2.4.2 innehåller en fix för ett fel som introducerades i version 2.4.0, vilket förhindrade nedladdning av låtar utan omslagsbild.
|
||||
@@ -1 +1,7 @@
|
||||
Це виправлення, яке знову робить можливим доступ до вашого сервера Jellyfin через HTTP. Використовуйте HTTPS, якщо він доступний.
|
||||
Fintunes тепер підтримує відображення текстів пісень, щоб ви могли підспівувати улюбленим мелодіям! Також тепер ви можете використовувати Fintunes як клієнт для Emby. Незначні оновлення у цьому випуску включають:
|
||||
|
||||
• Збереження обкладинок для завантажених треків (перезавантажте ваші треки, щоб переконатися, що обкладинки відображаються)
|
||||
• Дисплей, що показує інформацію про кодек для поточно відтворюваних треків
|
||||
• Багато нових перекладів, таких як польська, тамільська, традиційна китайська, фінська та індонезійська. Дякуємо всім, хто допоміг із перекладами!
|
||||
|
||||
Версія 2.4.2 виправляє помилку, яка з’явилася у версії 2.4.0 і заважала завантаженню треків без обкладинок.
|
||||
@@ -1 +1,7 @@
|
||||
这是一个修补程序,可以再次通过 HTTP 访问 Jellyfin 服务器。 如果您可以使用 HTTPS,请务必使用它。
|
||||
Fintunes 现在支持歌词显示,让你可以跟唱你最喜欢的歌曲!此外,你现在可以将 Fintunes 用作 Emby 的客户端。本次更新的其他小功能包括:
|
||||
|
||||
• 下载的歌曲现在会保存封面图像(请重新下载歌曲以确保封面显示)
|
||||
• 显示当前播放歌曲的编解码器信息
|
||||
• 许多新翻译,例如波兰语、泰米尔语、繁体中文、芬兰语和印尼语。感谢所有语言贡献者!
|
||||
|
||||
版本 2.4.2 修复了在 2.4.0 版本中引入的一个错误,该错误阻止了无封面歌曲的下载。
|
||||
1
fastlane/metadata/zh-Hant/apple_tv_privacy_policy.txt
Normal file
1
fastlane/metadata/zh-Hant/apple_tv_privacy_policy.txt
Normal file
@@ -0,0 +1 @@
|
||||
https://github.com/leinelissen/jellyfin-audio-player/blob/master/docs/privacy-policy.md
|
||||
1
fastlane/metadata/zh-Hant/description.txt
Normal file
1
fastlane/metadata/zh-Hant/description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Fintunes 是 Jellyfin 媒體系統的流媒體音訊播放器。它具有華麗的介面,讓您輕鬆播放您最喜歡的音樂。您可以在整個庫中搜索任何曲目,或者輕鬆使用您之前在 Jellyfin 中建立的播放列表。所有曲目都直接從您的 Jellyfin 庫中以最高品質流式傳輸。不一定每次播放都能連接到網路嗎?Jellyfin庫中的任何曲目都可以下載並離線播放。
|
||||
1
fastlane/metadata/zh-Hant/keywords.txt
Normal file
1
fastlane/metadata/zh-Hant/keywords.txt
Normal file
@@ -0,0 +1 @@
|
||||
Jellyfin, 音訊, 播放器, 流媒體, 下載, 音樂
|
||||
1
fastlane/metadata/zh-Hant/marketing_url.txt
Normal file
1
fastlane/metadata/zh-Hant/marketing_url.txt
Normal file
@@ -0,0 +1 @@
|
||||
https://fintunes.app/
|
||||
1
fastlane/metadata/zh-Hant/name.txt
Normal file
1
fastlane/metadata/zh-Hant/name.txt
Normal file
@@ -0,0 +1 @@
|
||||
Fintunes
|
||||
1
fastlane/metadata/zh-Hant/privacy_url.txt
Normal file
1
fastlane/metadata/zh-Hant/privacy_url.txt
Normal file
@@ -0,0 +1 @@
|
||||
https://github.com/leinelissen/jellyfin-audio-player/blob/master/docs/privacy-policy.md
|
||||
1
fastlane/metadata/zh-Hant/promotional_text.txt
Normal file
1
fastlane/metadata/zh-Hant/promotional_text.txt
Normal file
@@ -0,0 +1 @@
|
||||
Jellyfin 的流媒體音訊播放器,支援搜尋和下載。
|
||||
7
fastlane/metadata/zh-Hant/release_notes.txt
Normal file
7
fastlane/metadata/zh-Hant/release_notes.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
Fintunes 現在支援顯示歌詞,讓你可以跟唱你最喜愛的歌曲!此外,你現在可以將 Fintunes 用作 Emby 的客戶端。本次更新的其他小功能包括:
|
||||
|
||||
• 下載的歌曲現在會儲存封面圖片(請重新下載歌曲以確保封面顯示)
|
||||
• 顯示當前播放歌曲的編解碼器資訊
|
||||
• 許多新翻譯,例如波蘭語、泰米爾語、繁體中文、芬蘭語和印尼語。感謝所有語言貢獻者!
|
||||
|
||||
版本 2.4.2 修復了在 2.4.0 版本中引入的一個錯誤,該錯誤阻止了無封面歌曲的下載。
|
||||
1
fastlane/metadata/zh-Hant/subtitle.txt
Normal file
1
fastlane/metadata/zh-Hant/subtitle.txt
Normal file
@@ -0,0 +1 @@
|
||||
Jellyfin 的音樂播放器
|
||||
1
fastlane/metadata/zh-Hant/support_url.txt
Normal file
1
fastlane/metadata/zh-Hant/support_url.txt
Normal file
@@ -0,0 +1 @@
|
||||
https://github.com/leinelissen/jellyfin-audio-player
|
||||
@@ -578,7 +578,7 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 94;
|
||||
CURRENT_PROJECT_VERSION = 106;
|
||||
DEVELOPMENT_TEAM = HD2D35G9Y4;
|
||||
ENABLE_BITCODE = NO;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
@@ -616,7 +616,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 94;
|
||||
CURRENT_PROJECT_VERSION = 106;
|
||||
DEVELOPMENT_TEAM = HD2D35G9Y4;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HD2D35G9Y4;
|
||||
INFOPLIST_FILE = Fintunes/Info.plist;
|
||||
@@ -796,7 +796,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 94;
|
||||
CURRENT_PROJECT_VERSION = 106;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = HD2D35G9Y4;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
@@ -831,7 +831,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 94;
|
||||
CURRENT_PROJECT_VERSION = 106;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = HD2D35G9Y4;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2.4.0</string>
|
||||
<string>2.4.2</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>94</string>
|
||||
<string>106</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>LSSupportsOpeningDocumentsInPlace</key>
|
||||
|
||||
108
ios/Podfile.lock
108
ios/Podfile.lock
@@ -970,7 +970,7 @@ PODS:
|
||||
- ReactCommon/turbomodule/bridging
|
||||
- ReactCommon/turbomodule/core
|
||||
- Yoga
|
||||
- react-native-blur (4.4.0):
|
||||
- react-native-blur (4.4.1):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- hermes-engine
|
||||
@@ -1610,66 +1610,66 @@ SPEC CHECKSUMS:
|
||||
RCTRequired: d530a0f489699c8500e944fde963102c42dcd0c2
|
||||
RCTTypeSafety: b20878506b094fa3d9007d7b9e4be0faa3562499
|
||||
React: 2f9da0177233f60fa3462d83fcccde245759f81a
|
||||
react-airplay: 8197767f12cae11a7623b1507d29a89482a720ad
|
||||
react-airplay: 7cfb97ebe4ee2e81a3674d5585fa3915b2491494
|
||||
React-callinvoker: d0205f0dcebf72ec27263ab41e3a5ad827ed503f
|
||||
React-Codegen: b4457c8557cb61a27508745f8b03f16afeb9ef59
|
||||
React-Core: 690ebbbf8f8dcfba6686ce8927731d3f025c3114
|
||||
React-CoreModules: 185da31f5eb2e6043c3d19b10c64c4661322ed6a
|
||||
React-cxxreact: c53d2ac9246235351086b8c588feaf775b4ec7f7
|
||||
React-Codegen: 5e5ea1445e92a34b60dfedb3f231ea9fde102118
|
||||
React-Core: 77ec025801a9c03613ec3744918e5a3d58f96227
|
||||
React-CoreModules: dc1e1d2724273ae4594596c4105d15fb2f6a98b0
|
||||
React-cxxreact: efa12baf9dbf0170209633acc125e0de5991e335
|
||||
React-debug: dd8f7c772fda4196814a3b12620863d1d98b3a53
|
||||
React-Fabric: 68935648d5c81e6b84445d9e726a79301f1fac8f
|
||||
React-FabricImage: c92bd5ed4b553c800ca39aee305aaf8dd3e9f4b0
|
||||
React-Fabric: d0ffc842b849a8223f23e6184b99ca6f8bdebf3c
|
||||
React-FabricImage: 8f9753fbbfa379b1a74f3bdd9a68ce0ead81305a
|
||||
React-featureflags: ead50fe0ee4ab9278b5fd9f3f2f0f63e316452f4
|
||||
React-graphics: 71c87b09041e45c61809cd357436e570dea5ed48
|
||||
React-hermes: 917b7ab4c3cb9204c2ad020d74f313830097148b
|
||||
React-ImageManager: 1086d48d00fcb511ea119bfc58fb12a72c4dcb95
|
||||
React-jserrorhandler: 84d45913636750c2e620a8c8e049964967040405
|
||||
React-jsi: 024b933267079f80c30a5cae97bf5ce521217505
|
||||
React-jsiexecutor: 45cb079c87db3f514da3acfc686387a0e01de5c5
|
||||
React-jsinspector: 1066f8b3da937daf8ced4cf3786eb29e1e4f9b30
|
||||
React-jsitracing: 6b3c8c98313642140530f93c46f5a6ca4530b446
|
||||
React-logger: fa92ba4d3a5d39ac450f59be2a3cec7b099f0304
|
||||
React-Mapbuffer: 9f68550e7c6839d01411ac8896aea5c868eff63a
|
||||
react-native-accessibility-settings: 0262dd0c27543f39670729f2a1ad7b6e4c834548
|
||||
react-native-blur: a2acf22fd7bd13621df5e0b1c130b81adea7009c
|
||||
react-native-netinfo: 8a7fd3f7130ef4ad2fb4276d5c9f8d3f28d2df3d
|
||||
react-native-safe-area-context: b7daa1a8df36095a032dff095a1ea8963cb48371
|
||||
react-native-skia: dc11459441dd994f77baa92357b13af3977acba0
|
||||
react-native-track-player: 97d76dbbd35f27cc709e5f04540615e54264b3f9
|
||||
react-native-webview: e507c4058331c43546200e8e8529453e73a98635
|
||||
React-graphics: a2fe5d65b470eb8d6187e4a9791aa71ad68105cb
|
||||
React-hermes: 92709612ce5cdce3a2b9e07183e581548101a8d8
|
||||
React-ImageManager: b8e0cb2e430c52daf823fb08318ea8cda101d269
|
||||
React-jserrorhandler: 39694c5b1cd4c773c89196bcd1e846ae3b8a5bda
|
||||
React-jsi: c391df50eb8766c2ea12dba2e3112c77a99b371d
|
||||
React-jsiexecutor: 679632acd5792dd8dc6c090b7313b15eccdd9e45
|
||||
React-jsinspector: 1bf2fa762cf0e67c5632e5e95c0db180cdbe3bcc
|
||||
React-jsitracing: eee70a10f1e17690d33fb46a0989a19657c546a3
|
||||
React-logger: bbd09ad59f304e718962b2867534204710873bd9
|
||||
React-Mapbuffer: da4470fdf42b2e389efbc4e7af958bf96e921a0b
|
||||
react-native-accessibility-settings: 6e8630983d893f86b2a963695051089e58ebdfe7
|
||||
react-native-blur: 207ec2bf853b9a3b7751e3a29f7f497e69010b44
|
||||
react-native-netinfo: f084f2324cb11b986503a39a3ccbb5d15e2a56d3
|
||||
react-native-safe-area-context: b72c4611af2e86d80a59ac76279043d8f75f454c
|
||||
react-native-skia: e0979ddcd929ac07474d07fe37c980b2c213e272
|
||||
react-native-track-player: 5c2e08a38dd7e69c0f0ad6b382ac3257637d4a0b
|
||||
react-native-webview: 5a4de0fb0241b16cfaef4138aef94b786dbcf1cd
|
||||
React-nativeconfig: fa5de9d8f4dbd5917358f8ad3ad1e08762f01dcb
|
||||
React-NativeModulesApple: 585d1b78e0597de364d259cb56007052d0bda5e5
|
||||
React-NativeModulesApple: 714d4a6ea3c580c31b25ad01f9650b259fad9818
|
||||
React-perflogger: 7bb9ba49435ff66b666e7966ee10082508a203e8
|
||||
React-RCTActionSheet: a2816ae2b5c8523c2bc18a8f874a724a096e6d97
|
||||
React-RCTAnimation: e78f52d7422bac13e1213e25e9bcbf99be872e1a
|
||||
React-RCTAppDelegate: 24f46de486cfa3a9f46e4b0786eaf17d92e1e0c6
|
||||
React-RCTBlob: 9f9d6599d1b00690704dadc4a4bc33a7e76938be
|
||||
React-RCTFabric: 609e66bb0371b9082c62ed677ee0614efe711bf2
|
||||
React-RCTImage: 39dd5aee6b92213845e1e7a7c41865801dc33493
|
||||
React-RCTLinking: 35d742a982f901f9ea416d772763e2da65c2dc7d
|
||||
React-RCTNetwork: b078576c0c896c71905f841716b9f9f5922111dc
|
||||
React-RCTSettings: 900aab52b5b1212f247c2944d88f4defbf6146f2
|
||||
React-RCTText: a3895ab4e5df4a5fd41b6f059eed484a0c7016d1
|
||||
React-RCTVibration: ab4912e1427d8de00ef89e9e6582094c4c25dc05
|
||||
React-rendererdebug: 542934058708a643fa5743902eb2fedc0833770a
|
||||
React-RCTAnimation: 082083adea9e61f75be6564120e3f266e9dd2040
|
||||
React-RCTAppDelegate: 5075f1d00c9353105f5b0906ba477db1dd3f4993
|
||||
React-RCTBlob: 43976a6aa15df43b12136de396bd72bdced5eb23
|
||||
React-RCTFabric: 5351cfc7d92a1ed66a3fe87fa24fb27db5a5b4d8
|
||||
React-RCTImage: 0ed46bd0092e0ca29ed7269831934e32b809a934
|
||||
React-RCTLinking: 9eeefa11941ce0faded2c9eb2242f0c96db1e23c
|
||||
React-RCTNetwork: ec125edeac233d33638b40361238bfbd698e13f6
|
||||
React-RCTSettings: 47195b7e31bba95d38dbdd2c8a1b1fc6d7c1a7f2
|
||||
React-RCTText: 14b0bd5b70e058b2b62b47945057602bc67f9e68
|
||||
React-RCTVibration: 084119dd03a27c975c382d9b71a48722ee74b2e7
|
||||
React-rendererdebug: 94a00e425316b11b2891e3b7a1232c2cd7f4e7ea
|
||||
React-rncore: f6c23d9810c8de9e369781bb7b1d5511e9d9f4e7
|
||||
React-RuntimeApple: ce41ba7df744c7a6c2cc490a9b2e15fc58019508
|
||||
React-RuntimeCore: 350218ac9ee1412ddc9806f248141c8fb9bccd8b
|
||||
React-RuntimeApple: 70840b529724c0f9dae0b9efcc0b05a26495776d
|
||||
React-RuntimeCore: f679bc2949b36d7d210f3860360c7e0694fe939c
|
||||
React-runtimeexecutor: 69cab8ddf409de6d6a855a71c8af9e7290c4e55b
|
||||
React-RuntimeHermes: 9d0812e3370111dd175aa1fa8bd4da93a9efc4fd
|
||||
React-runtimescheduler: 0c80752bceb80924cb8a4babc2a8e3ed70d41e87
|
||||
React-utils: a06061b3887c702235d2dac92dacbd93e1ea079e
|
||||
ReactCommon: f00e436b3925a7ae44dfa294b43ef360fbd8ccc4
|
||||
RNCAsyncStorage: 618d03a5f52fbccb3d7010076bc54712844c18ef
|
||||
RNDateTimePicker: fc2e4f2795877d45e84d85659bebe627eba5c931
|
||||
RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8
|
||||
RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
|
||||
RNGestureHandler: 9b113eb9b7a4cbe66e1dbf4d9914281863ee0703
|
||||
RNLocalize: 4222a3756cdbe2dc9a5bdf445765a4d2572107cb
|
||||
RNReanimated: f4ff116e33e0afc3d127f70efe928847c7c66355
|
||||
RNScreens: 23dad53fc9db1da2c93e647ae33fd7ce2bd49d60
|
||||
RNSentry: 85fe1023bf60ead12d059d9c845de19de0ed6f0d
|
||||
RNSVG: ba3e7232f45e34b7b47e74472386cf4e1a676d0a
|
||||
React-RuntimeHermes: df3172370e3fbb593189afe23baa9c583cc6c853
|
||||
React-runtimescheduler: 444c28666d8e9d275c600fe3a3cc7f014fa86406
|
||||
React-utils: 595335727912553f56aad7f580254ce4ca95a09c
|
||||
ReactCommon: 57d127dbf2ca045a07604e13f51c8e97ba176e56
|
||||
RNCAsyncStorage: a03b770a50541a761447cea9c24536047832124d
|
||||
RNDateTimePicker: 078355128345a5c07ec26ce51fd648d46678de97
|
||||
RNFastImage: 462a183c4b0b6b26fdfd639e1ed6ba37536c3b87
|
||||
RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8
|
||||
RNGestureHandler: 293aea360e79439e2272b8a5ffebd582a1e4c486
|
||||
RNLocalize: 4d11b58a95c6f8c77156911f7df9906f86f23c2c
|
||||
RNReanimated: fe62058b0e1ecb46e252d63d27580f36cd6d9eb2
|
||||
RNScreens: 5d770465a09cbb7cf83e2ad43d6f049b52e62bad
|
||||
RNSentry: 95749b709b85c9da2015c3fd69978cda34f04df8
|
||||
RNSVG: 6d5ed33b6635ed6d6ecb50744dcf127580c39ed5
|
||||
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
|
||||
SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d
|
||||
Sentry: 9c1188876ea1291d1a9db4b38c3f17ebd8e6985e
|
||||
@@ -1679,4 +1679,4 @@ SPEC CHECKSUMS:
|
||||
|
||||
PODFILE CHECKSUM: c602c315882be26f4a1eb7ed171506d9af16c238
|
||||
|
||||
COCOAPODS: 1.15.2
|
||||
COCOAPODS: 1.16.2
|
||||
|
||||
79
package-lock.json
generated
79
package-lock.json
generated
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"name": "fintunes",
|
||||
"version": "2.4.0",
|
||||
"version": "2.4.3",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "fintunes",
|
||||
"version": "2.4.0",
|
||||
"version": "2.4.3",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@react-native-async-storage/async-storage": "^1.21.0",
|
||||
"@react-native-community/blur": "^4.4.0",
|
||||
"@react-native-community/datetimepicker": "^7.6.2",
|
||||
"@react-native-community/blur": "^4.4.1",
|
||||
"@react-native-community/datetimepicker": "^8.2.0",
|
||||
"@react-native-community/netinfo": "^11.2.1",
|
||||
"@react-navigation/bottom-tabs": "^6.5.12",
|
||||
"@react-navigation/elements": "^1.3.22",
|
||||
@@ -25,6 +25,7 @@
|
||||
"fuse.js": "^7.0.0",
|
||||
"i18n-js": "^4.3.2",
|
||||
"lodash": "^4.17.21",
|
||||
"mime": "^4.0.6",
|
||||
"react": "^18.2.0",
|
||||
"react-airplay": "^1.2.0",
|
||||
"react-native": "0.74.3",
|
||||
@@ -1873,9 +1874,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@react-native-community/blur": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@react-native-community/blur/-/blur-4.4.0.tgz",
|
||||
"integrity": "sha512-P+xdT2LIq1ewOsF3zx7C0nu4dj7nxl2NVTsMXEzRDjM3bWMdrrEbTRA7uwPV5ngn7/BXIommBPlT/JW4SAedrw==",
|
||||
"version": "4.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@react-native-community/blur/-/blur-4.4.1.tgz",
|
||||
"integrity": "sha512-XBSsRiYxE/MOEln2ayunShfJtWztHwUxLFcSL20o+HNNRnuUDv+GXkF6FmM2zE8ZUfrnhQ/zeTqvnuDPGw6O8A==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"react": "*",
|
||||
"react-native": "*"
|
||||
@@ -2155,6 +2157,18 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@react-native-community/cli-tools/node_modules/mime": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
|
||||
"integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"mime": "cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@react-native-community/cli-tools/node_modules/p-limit": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
|
||||
@@ -2248,11 +2262,26 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@react-native-community/datetimepicker": {
|
||||
"version": "7.6.2",
|
||||
"resolved": "https://registry.npmjs.org/@react-native-community/datetimepicker/-/datetimepicker-7.6.2.tgz",
|
||||
"integrity": "sha512-ogZnvCmNG/lGHhEQypqz/mPymiIWD5jv6uKczg/l/aWgiKs1RDPQH1abh+R0I26aKoXmgamJJPuXKeC5eRWtZg==",
|
||||
"version": "8.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@react-native-community/datetimepicker/-/datetimepicker-8.2.0.tgz",
|
||||
"integrity": "sha512-qrUPhiBvKGuG9Y+vOqsc56RPFcHa1SU2qbAMT0hfGkoFIj3FodE0VuPVrEa8fgy7kcD5NQmkZIKgHOBLV0+hWg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"invariant": "^2.2.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"expo": ">=50.0.0",
|
||||
"react": "*",
|
||||
"react-native": "*",
|
||||
"react-native-windows": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"expo": {
|
||||
"optional": true
|
||||
},
|
||||
"react-native-windows": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@react-native-community/netinfo": {
|
||||
@@ -8404,20 +8433,25 @@
|
||||
}
|
||||
},
|
||||
"node_modules/mime": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
|
||||
"integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
|
||||
"version": "4.0.6",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-4.0.6.tgz",
|
||||
"integrity": "sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==",
|
||||
"funding": [
|
||||
"https://github.com/sponsors/broofa"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"mime": "cli.js"
|
||||
"mime": "bin/cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
"node": ">=16"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||
"version": "1.53.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz",
|
||||
"integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
@@ -8433,6 +8467,15 @@
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-types/node_modules/mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mimic-fn": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "fintunes",
|
||||
"version": "2.4.0",
|
||||
"version": "2.4.3",
|
||||
"main": "src/index.js",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
@@ -13,8 +13,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@react-native-async-storage/async-storage": "^1.21.0",
|
||||
"@react-native-community/blur": "^4.4.0",
|
||||
"@react-native-community/datetimepicker": "^7.6.2",
|
||||
"@react-native-community/blur": "^4.4.1",
|
||||
"@react-native-community/datetimepicker": "^8.2.0",
|
||||
"@react-native-community/netinfo": "^11.2.1",
|
||||
"@react-navigation/bottom-tabs": "^6.5.12",
|
||||
"@react-navigation/elements": "^1.3.22",
|
||||
@@ -28,6 +28,7 @@
|
||||
"fuse.js": "^7.0.0",
|
||||
"i18n-js": "^4.3.2",
|
||||
"lodash": "^4.17.21",
|
||||
"mime": "^4.0.6",
|
||||
"react": "^18.2.0",
|
||||
"react-airplay": "^1.2.0",
|
||||
"react-native": "0.74.3",
|
||||
|
||||
13
patches/@shopify+react-native-skia+0.1.238.patch
Normal file
13
patches/@shopify+react-native-skia+0.1.238.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
diff --git a/node_modules/@shopify/react-native-skia/android/build.gradle b/node_modules/@shopify/react-native-skia/android/build.gradle
|
||||
index 29e74bf..f2b35a5 100644
|
||||
--- a/node_modules/@shopify/react-native-skia/android/build.gradle
|
||||
+++ b/node_modules/@shopify/react-native-skia/android/build.gradle
|
||||
@@ -135,6 +135,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion safeExtGet('minSdkVersion', DEFAULT_MIN_SDK_VERSION)
|
||||
targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION)
|
||||
+ ndkVersion safeExtGet('ndkVersion', '26.1.10909125')
|
||||
+
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
|
||||
@@ -63,7 +63,7 @@ function generateStyles(scheme: ColorSchemeName, highContrast: boolean) {
|
||||
color: scheme === 'dark' ? '#fff' : '#000',
|
||||
},
|
||||
trackBackground: {
|
||||
backgroundColor: scheme === 'dark' ? '#111' : '#fff',
|
||||
backgroundColor: scheme === 'dark' ? '#161616' : '#fff',
|
||||
},
|
||||
stackHeader: {
|
||||
color: scheme === 'dark' ? 'white' : 'black'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React, { useMemo } from 'react';
|
||||
import React, { useMemo, useState } from 'react';
|
||||
import { Dimensions, ViewProps } from 'react-native';
|
||||
import { Canvas, Blur, Image as SkiaImage, useImage, Offset, Mask, RoundedRect, Shadow } from '@shopify/react-native-skia';
|
||||
import useDefaultStyles, { useUserOrSystemScheme } from './Colors';
|
||||
@@ -13,7 +13,7 @@ const Container = styled.View<{ size: number }>`
|
||||
z-index: 0;
|
||||
`;
|
||||
|
||||
const BlurContainer = styled(Canvas)<{ size: number, offset: number }>`
|
||||
const BlurContainer = styled(Canvas) <{ size: number, offset: number }>`
|
||||
position: absolute;
|
||||
left: -${(props) => props.offset}px;
|
||||
top: -${(props) => props.offset}px;
|
||||
@@ -31,35 +31,34 @@ interface Props {
|
||||
src: string;
|
||||
}
|
||||
|
||||
const emptyAlbumLight = require('@/assets/images/empty-album-light.png');
|
||||
const emptyAlbumDark = require('@/assets/images/empty-album-dark.png');
|
||||
|
||||
/**
|
||||
* This will take a cover image, and apply shadows and a really nice background
|
||||
* blur to the image in question. Additionally, we'll add some margin and radius
|
||||
* to the corners.
|
||||
*/
|
||||
function CoverImage({
|
||||
blurRadius = 256,
|
||||
opacity = 0.85,
|
||||
margin = 112,
|
||||
radius = 12,
|
||||
blurRadius = 256,
|
||||
opacity = 0.85,
|
||||
margin = 112,
|
||||
radius = 12,
|
||||
style,
|
||||
src,
|
||||
src,
|
||||
}: Props) {
|
||||
const defaultStyles = useDefaultStyles();
|
||||
const colorScheme = useUserOrSystemScheme();
|
||||
const [hasFailed, setFailed] = useState(false);
|
||||
|
||||
const image = useImage(src || null);
|
||||
const fallback = useImage(colorScheme === 'light'
|
||||
? require('@/assets/images/empty-album-light.png')
|
||||
: require('@/assets/images/empty-album-dark.png')
|
||||
);
|
||||
const image = useImage(src || null, () => setFailed(true));
|
||||
const fallback = useImage(colorScheme === 'light' ? emptyAlbumLight : emptyAlbumDark);
|
||||
const { canvasSize, imageSize } = useMemo(() => {
|
||||
const imageSize = Screen.width - margin;
|
||||
const canvasSize = imageSize + blurRadius * 2;
|
||||
return { imageSize, canvasSize };
|
||||
}, [blurRadius, margin]);
|
||||
|
||||
const skiaImage = useMemo(() => (image || fallback), [image, fallback]);
|
||||
|
||||
return (
|
||||
<Container size={imageSize} style={style}>
|
||||
<BlurContainer size={canvasSize} offset={blurRadius}>
|
||||
@@ -70,19 +69,52 @@ function CoverImage({
|
||||
<Shadow dx={0} dy={8} blur={16} color="#0000000d" />
|
||||
<Shadow dx={0} dy={16} blur={32} color="#0000000d" />
|
||||
</RoundedRect>
|
||||
{skiaImage ? (
|
||||
{src && (
|
||||
<>
|
||||
<SkiaImage image={skiaImage} width={imageSize} height={imageSize} opacity={opacity}>
|
||||
<SkiaImage
|
||||
image={image}
|
||||
width={imageSize}
|
||||
height={imageSize}
|
||||
opacity={opacity}
|
||||
key="image-blur"
|
||||
>
|
||||
<Offset x={blurRadius} y={blurRadius} />
|
||||
<Blur blur={blurRadius / 2} />
|
||||
</SkiaImage>
|
||||
<Mask mask={<RoundedRect width={imageSize} height={imageSize} x={blurRadius} y={blurRadius} r={radius} />}>
|
||||
<SkiaImage image={skiaImage} width={imageSize} height={imageSize}>
|
||||
<Mask
|
||||
mask={
|
||||
<RoundedRect
|
||||
width={imageSize}
|
||||
height={imageSize}
|
||||
x={blurRadius}
|
||||
y={blurRadius} r={radius}
|
||||
/>
|
||||
}
|
||||
key="image"
|
||||
>
|
||||
<SkiaImage image={image} width={imageSize} height={imageSize}>
|
||||
<Offset x={blurRadius} y={blurRadius} />
|
||||
</SkiaImage>
|
||||
</Mask>
|
||||
</>
|
||||
) : null}
|
||||
)}
|
||||
{(!src || hasFailed) && (
|
||||
<Mask
|
||||
mask={
|
||||
<RoundedRect
|
||||
width={imageSize}
|
||||
height={imageSize}
|
||||
x={blurRadius}
|
||||
y={blurRadius} r={radius}
|
||||
/>
|
||||
}
|
||||
key="fallback"
|
||||
>
|
||||
<SkiaImage image={fallback} width={imageSize} height={imageSize}>
|
||||
<Offset x={blurRadius} y={blurRadius} />
|
||||
</SkiaImage>
|
||||
</Mask>
|
||||
)}
|
||||
</BlurContainer>
|
||||
</Container>
|
||||
);
|
||||
|
||||
@@ -3,6 +3,7 @@ import { useEffect, useRef, useState } from 'react';
|
||||
import { DocumentDirectoryPath, readDir } from 'react-native-fs';
|
||||
import { useAppDispatch, useTypedSelector } from '@/store';
|
||||
import { completeDownload, downloadTrack } from '@/store/downloads/actions';
|
||||
import { getMimeTypeForExtension } from '@/utility/mimeType';
|
||||
|
||||
/**
|
||||
* The maximum number of concurrent downloads we allow to take place at once.
|
||||
@@ -77,11 +78,17 @@ function DownloadManager () {
|
||||
// Loop through the mp3 files
|
||||
files.filter((file) => file.isFile())
|
||||
.forEach((file) => {
|
||||
const [id] = file.name.split('.');
|
||||
const [id, extension] = file.name.split('.');
|
||||
const mimeType = getMimeTypeForExtension(extension);
|
||||
|
||||
// GUARD: Only process audio mime types
|
||||
if (!mimeType || mimeType.startsWith('audio')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// GUARD: If the id is already in the store, there's nothing
|
||||
// left for us to do.
|
||||
if (ids.includes(id) && file.path === entities[id]?.location) {
|
||||
if (ids.includes(id)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -90,6 +97,7 @@ function DownloadManager () {
|
||||
id,
|
||||
location: file.path,
|
||||
size: file.size,
|
||||
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"play-album": "Пусни албум",
|
||||
"track": "Песен",
|
||||
"jellyfin-user-id": "Jellyfin потребител",
|
||||
"user-id": "Jellyfin потребител",
|
||||
"play-playlist": "Пусни списък",
|
||||
"color-scheme-system": "Система",
|
||||
"streaming": "Предава се поточно",
|
||||
"download-album": "Изтегли албум",
|
||||
"jellyfin-access-token": "Jellyfin Жетон за достъп (access token)",
|
||||
"access-token": "Jellyfin Жетон за достъп (access token)",
|
||||
"delete-playlist": "Изтрий списък",
|
||||
"add-to-queue": "Добави към опашката",
|
||||
"playback-reporting": "Докладване на изпълненията",
|
||||
@@ -16,7 +16,7 @@
|
||||
"no-results": "Няма резултати…",
|
||||
"total-duration": "Обща продължителност",
|
||||
"error-reporting": "Доклаване на грешки",
|
||||
"jellyfin-server-url": "Адрес на Jellyfin сървър",
|
||||
"server-url": "Адрес на Jellyfin сървър",
|
||||
"downloads": "Изтеглени",
|
||||
"onboarding-cta": "За да започнете Ви трябва Jellyfin сървър. Натиснете бутона отдолу, за да въведете адресът на вашия Jellyfin сървър и се впишете в него.",
|
||||
"shuffle-album": "Разбъркай албум",
|
||||
@@ -26,7 +26,7 @@
|
||||
"artists": "Изпълнители",
|
||||
"queue": "Опашка",
|
||||
"error-reporting-description": "Докато използвате приложението, може да срещнете грешки. Докладването на тези грешки помага на програмата да стане по-сигурна и стабилна.",
|
||||
"set-jellyfin-server": "Настройте Jellyfin сървър",
|
||||
"set-server": "Настройте Jellyfin сървър",
|
||||
"similar-albums": "Подобни албуми",
|
||||
"albums": "Албуми",
|
||||
"why-use-tracking-description": "Проследяването помага да се ускори процесът по разработка на приложението, като се докладват странни гранични случаи и недоглеждания. Това помага на приложението да стане по стабилно и приятно за използване от всички.",
|
||||
@@ -52,7 +52,7 @@
|
||||
"disable": "Изключи",
|
||||
"search": "Търси",
|
||||
"download-playlist": "Изтегли списък",
|
||||
"jellyfin-library": "Jellyfin Библиотека",
|
||||
"library": "Jellyfin Библиотека",
|
||||
"enable-error-reporting": "Желаете ли да пуснете докладването на грешки?",
|
||||
"color-scheme-description": "По подразбиране Fintunes ще следва цветовата схмена на вашата операционна система. Вие обаче можете да изберете Fintunes да се показва винаги в тъмен или светъл режим.",
|
||||
"color-scheme": "Цветова схема",
|
||||
@@ -66,7 +66,7 @@
|
||||
"setting-cache": "Кеш",
|
||||
"local-playback": "Локално изпълняване",
|
||||
"clear-queue": "Изчисти опашката",
|
||||
"set-jellyfin-server-instruction": "Моля въведете адресът на вашия Jellyfin сървър. Трябва да включва протоколът и порта",
|
||||
"set-server-instruction": "Моля въведете адресът на вашия Jellyfin сървър. Трябва да включва протоколът и порта",
|
||||
"delete-all-tracks": "Изтрий всички песни",
|
||||
"where-is-data-stored": "Къде се пазят данните?",
|
||||
"color-scheme-light": "Светъл режим",
|
||||
@@ -76,5 +76,6 @@
|
||||
"cancel": "Отказ",
|
||||
"delete": "Изтрий",
|
||||
"disc": "диск",
|
||||
"lyrics": "Текст на песен"
|
||||
"lyrics": "Текст на песен",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
"streaming": "Transmissió",
|
||||
"total-duration": "Durada total",
|
||||
"similar-albums": "Àlbums similars",
|
||||
"playback-reporting-description": "Amb Playback Reporting, tots els teus esdeveniments de reproducció es retransmeten a Jellyfin. Aquest lloc web utilitza galetes per millorar la vostra experiència. Podeu desactivar-lo si ho voleu. Accepto Més informació.",
|
||||
"playback-reporting-description": "Amb Playback Reporting, tots els vostres esdeveniments de reproducció es retransmeten al vostre servidor. Aquest lloc web utilitza galetes per millorar la vostra experiència. Podeu desactivar-lo si ho voleu. Accepto Més informació.",
|
||||
"color-scheme": "Aspecte",
|
||||
"color-scheme-description": "Per defecte, Fintunes farà servir l'aspecte del vostre sistema operatiu. Tanmateix, podeu optar per anul·lar-ho i així assegurar-vos que Fintunes estigui sempre en mode fosc o en mode clar.",
|
||||
"color-scheme-system": "Sistema",
|
||||
@@ -51,16 +51,16 @@
|
||||
"now-playing": "Reproduïnt Ara",
|
||||
"onboarding-welcome": "Benvinguts!",
|
||||
"onboarding-intro": "Fintunes us permetrà reproduir la vostra biblioteca de música des de qualsevol lloc, amb total suport per a l'àudio en segon pla i l'enviament del so a altres dispositius.",
|
||||
"onboarding-cta": "Per començar, necessiteu un servidor de Jellyfin. Si us plau, introdueix dins de la caixa de text els caràcters que veu a la imatge de sota. Això és requerit per evitar enviaments automàtics.",
|
||||
"set-jellyfin-server": "Configura el servidor Jellyfin",
|
||||
"set-jellyfin-server-instruction": "Introduïu l'URL del vostre servidor Jellyfin. Assegureu-vos d'incloure el protocol i el port",
|
||||
"onboarding-cta": "Per començar, necessiteu un servidor de Jellyfin (o Emby). Si us plau, introdueix dins de la caixa de text els caràcters que veu a la imatge de sota. Això és requerit per evitar enviaments automàtics.",
|
||||
"set-server": "Configura el servidor Jellyfin",
|
||||
"set-server-instruction": "Introduïu l'URL del vostre servidor Jellyfin. Assegureu-vos d'incloure el protocol i el port",
|
||||
"settings": "Configuració",
|
||||
"jellyfin-library": "Biblioteca Jellyfin",
|
||||
"jellyfin-server-url": "Preguntes Freqüents - FAQ",
|
||||
"jellyfin-access-token": "Jellyfin Access Token",
|
||||
"jellyfin-user-id": "Jellyfin User ID",
|
||||
"library": "Biblioteca Jellyfin",
|
||||
"server-url": "Preguntes Freqüents - FAQ",
|
||||
"access-token": "Jellyfin Access Token",
|
||||
"user-id": "Jellyfin User ID",
|
||||
"setting-cache": "Caché",
|
||||
"setting-cache-description": "Si heu actualitzat la vostra biblioteca de Jellyfin, però l’aplicació està subjectant a actius amagats, podeu esborrar la memòria cau amb aquest botó. Això obligarà l’aplicació a fer una cerca de la biblioteca des de zero.",
|
||||
"setting-cache-description": "Si heu actualitzat la vostra biblioteca, però l’aplicació està subjectant a actius amagats, podeu esborrar la memòria cau amb aquest botó. Això obligarà l’aplicació a fer una cerca de la biblioteca des de zero.",
|
||||
"recent-albums": "Afegit Recentment",
|
||||
"error-reporting": "Informe d'errors",
|
||||
"error-reporting-description": "Durant l'ús d'aquesta aplicació, es poden trobar errors. L’aplicació és més segura i estable.",
|
||||
@@ -74,7 +74,11 @@
|
||||
"sleep-timer": "Temporitzador son",
|
||||
"confirm-delete-all-tracks": "Estàs segur que vols eliminar totes les pistes descarregades actualment?",
|
||||
"delete": "Esborrar",
|
||||
"cancel": "Cancel·la",
|
||||
"cancel": "Cancel·lar",
|
||||
"disc": "Disc",
|
||||
"lyrics": "Lletres"
|
||||
"lyrics": "Lletra",
|
||||
"khz": "k Hz",
|
||||
"direct-play": "Joc directe",
|
||||
"transcoded": "Transcodificat",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"play-album": "Přehrát Album",
|
||||
"track": "Skladba",
|
||||
"jellyfin-user-id": "ID uživatele Jellyfin",
|
||||
"user-id": "ID uživatele Jellyfin",
|
||||
"play-playlist": "Přehrát seznam skladeb",
|
||||
"color-scheme-system": "Systém",
|
||||
"streaming": "Streamování",
|
||||
"download-album": "Stáhnout Album",
|
||||
"jellyfin-access-token": "Přístupový token Jellyfin",
|
||||
"access-token": "Přístupový token Jellyfin",
|
||||
"delete-playlist": "Smazat seznam skladeb",
|
||||
"add-to-queue": "Přidat do Fronty",
|
||||
"playback-reporting": "Hlášení o přehrávání",
|
||||
@@ -16,9 +16,9 @@
|
||||
"no-results": "Žádné výsledky…",
|
||||
"total-duration": "Celková doba trvání",
|
||||
"error-reporting": "Hlášení chyb",
|
||||
"jellyfin-server-url": "Adresa URL serveru Jellyfin",
|
||||
"server-url": "Adresa URL serveru Jellyfin",
|
||||
"downloads": "Ke stažení",
|
||||
"onboarding-cta": "Abyste mohli začít, potřebujete server Jellyfin. Kliknutím na tlačítko níže zadejte adresu svého serveru Jellyfin a přihlaste se k němu.",
|
||||
"onboarding-cta": "Chcete-li začít, potřebujete server Jellyfin (nebo Emby). Kliknutím na tlačítko níže zadejte adresu serveru a přihlaste se k němu.",
|
||||
"shuffle-album": "Zamíchat album",
|
||||
"total-download-size": "Celková velikost pro stažení",
|
||||
"play-next": "Přehrát Další",
|
||||
@@ -26,10 +26,10 @@
|
||||
"artists": "Umělci",
|
||||
"queue": "Fronta",
|
||||
"error-reporting-description": "Během používání této aplikace můžete narazit na chyby. Nahlášení těchto chyb pomáhá vytvářet bezpečnější a stabilnější prostředí aplikace.",
|
||||
"set-jellyfin-server": "Nastavit Jellyfin Server",
|
||||
"set-server": "Nastavit Jellyfin Server",
|
||||
"similar-albums": "Podobná alba",
|
||||
"albums": "Alba",
|
||||
"why-use-tracking-description": "Sledování pomáhá urychlit vývoj pro tuto aplikaci tím, že nahlásí divné případy hran a dohledy. To pomáhá, aby aplikace stabilnější a robustní, čímž zlepšuje zážitek z aplikace pro každého.",
|
||||
"why-use-tracking-description": "Sledování pomáhá urychlit vývoj této aplikace hlášením podivných okrajových chyb a přehlédnutí. To pomáhá, aby byla aplikace stabilnější a robustnější, a tím se zlepšuje zážitek z aplikace pro každého.",
|
||||
"onboarding-welcome": "Vítejte!",
|
||||
"reset-cache": "Resetovat mezipaměť",
|
||||
"album": "Album",
|
||||
@@ -52,21 +52,21 @@
|
||||
"disable": "Zakázat",
|
||||
"search": "Vyhledat",
|
||||
"download-playlist": "Stáhnnout seznam skladeb",
|
||||
"jellyfin-library": "Knihovna Jellyfin",
|
||||
"library": "Knihovna Jellyfin",
|
||||
"enable-error-reporting": "Chcete povolit hlášení chyb?",
|
||||
"color-scheme-description": "Ve výchozím nastavení bude Fintunes sledovat barevné schéma vašeho operačního systému. Můžete se však rozhodnout toto nastavení změnit, abyste zajistili, že Fintunes bude vždy v tmavém nebo světlém režimu.",
|
||||
"color-scheme": "Barevné Schéma",
|
||||
"color-scheme-dark": "Tmavý Režim",
|
||||
"more-info": "Více informací",
|
||||
"settings": "Nastavení",
|
||||
"playback-reporting-description": "S hlášením o přehrávání jsou všechny vaše události přehrávání přenášeny zpět do Jellyfin. To vám umožní sledovat vaše nejposlouchanější skladby, zejména pomocí pluginů Jellyfin, jako je ListenBrainz.",
|
||||
"playback-reporting-description": "S Playback Reporting, všechny vaše herní události jsou relé zpět do vašeho serveru. To vám umožní sledovat vaše nejvíce poslouchané písně, zejména s pluginy, jako je například Poslechy nebo LastFM.",
|
||||
"what-data-is-gathered": "Jaká data se shromažďují?",
|
||||
"all-albums": "Všechny Alba",
|
||||
"onboarding-intro": "Fintunes vám umožní streamovat svou hudební knihovnu odkudkoli, s plnou podporou pro zvuk na pozadí a odlévání.",
|
||||
"setting-cache": "Mezipaměť",
|
||||
"local-playback": "Místní přehrávání",
|
||||
"clear-queue": "Vymazat Frontu",
|
||||
"set-jellyfin-server-instruction": "Zadejte adresu URL serveru Jellyfin. Nezapomeňte uvést protokol a port",
|
||||
"set-server-instruction": "Zadejte adresu URL serveru Jellyfin. Nezapomeňte uvést protokol a port",
|
||||
"delete-all-tracks": "Smazat Všechny Skladby",
|
||||
"where-is-data-stored": "Kde jsou data uložena?",
|
||||
"color-scheme-light": "Světlý Režim",
|
||||
@@ -76,5 +76,9 @@
|
||||
"delete": "Čeština",
|
||||
"cancel": "Hledat",
|
||||
"disc": "Čeština",
|
||||
"lyrics": "Text skladby"
|
||||
"lyrics": "Text skladby",
|
||||
"direct-play": "Přímé hraní",
|
||||
"transcoded": "Transcoded",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"error-reporting": "Fejlrapportering",
|
||||
"music": "Musik",
|
||||
"album": "Album",
|
||||
"jellyfin-server-url": "Jellyfin server URL",
|
||||
"server-url": "Jellyfin server URL",
|
||||
"setting-cache": "Cache",
|
||||
"reset-cache": "Nulstil cache",
|
||||
"enable": "Aktivér",
|
||||
@@ -31,15 +31,15 @@
|
||||
"play-album": "Afspil album",
|
||||
"queue": "Kø",
|
||||
"add-to-queue": "Tilføj til kø",
|
||||
"jellyfin-library": "Jellyfin bibliotek",
|
||||
"jellyfin-user-id": "Jellyfin bruger ID",
|
||||
"library": "Jellyfin bibliotek",
|
||||
"user-id": "Jellyfin bruger ID",
|
||||
"recent-albums": "Seneste albummer",
|
||||
"clear-queue": "Ryd kø",
|
||||
"no-results": "Ingen resultater…",
|
||||
"set-jellyfin-server": "Sæt Jellyfin Server",
|
||||
"set-server": "Sæt Jellyfin Server",
|
||||
"why-use-tracking": "Hvorfor bruge sporing?",
|
||||
"what-data-is-gathered": "Hvilke data indsamles?",
|
||||
"where-is-data-stored": "Hvor gemmes data?",
|
||||
"where-is-data-stored": "Fintunes giver dig mulighed for at streame dit musikbibliotek overalt, med fuld støtte til baggrundslyd og støbning.",
|
||||
"enable-error-reporting": "Vil du aktivere fejlrapportering?",
|
||||
"playlists": "Spillelister",
|
||||
"playlist": "Playlist",
|
||||
@@ -47,21 +47,21 @@
|
||||
"shuffle-playlist": "Shuffle Playlist",
|
||||
"streaming": "Streaming",
|
||||
"playback-reporting": "Tilbagemeldingsrapportering",
|
||||
"color-scheme": "Farveskema",
|
||||
"color-scheme": "Farvesammensætninger",
|
||||
"color-scheme-system": "Systemsystem",
|
||||
"why-use-tracking-description": "Tracing hjælper med at fremskynde udviklingen for denne app ved at rapportere underlige kantsager og tilsyn. Dette hjælper med at gøre appen mere stabil og robust og dermed forbedre appoplevelsen for alle.",
|
||||
"sleep-timer": "Søvn timer",
|
||||
"onboarding-intro": "Fintunes giver dig mulighed for at streame dit musikbibliotek overalt, med fuld støtte til baggrundslyd og støbning.",
|
||||
"onboarding-cta": "For at komme i gang skal du bruge en Jellyfin server. Klik på knappen nedenfor for at indtaste din Jellyfin-serveradresse og log ind på den.",
|
||||
"set-jellyfin-server-instruction": "Indtast venligst din Jellyfin server URL. Sørg for at inkludere protokollen og havnen",
|
||||
"jellyfin-access-token": "Jellyfin Access Token",
|
||||
"setting-cache-description": "Hvis du har opdateret dit Jellyfin-bibliotek, men appen holder på cachelagrede aktiver, kan du tvinges til at rydde cachen ved hjælp af denne knap. Dette vil tvinge app til at hente biblioteket fra bunden.",
|
||||
"onboarding-cta": "For at komme i gang skal du bruge en Jellyfin (eller Emby) server. Klik på knappen nedenfor for at indtaste din serveradresse og logge ind på den.",
|
||||
"set-server-instruction": "Indtast venligst din Jellyfin server URL. Sørg for at inkludere protokollen og havnen",
|
||||
"access-token": "Jellyfin Access Token",
|
||||
"setting-cache-description": "Hvis du har opdateret dit bibliotek, men appen holder på cachelagrede aktiver, kan du tvinges til at rydde cachen ved hjælp af denne knap. Dette vil tvinge app til at hente biblioteket fra bunden.",
|
||||
"error-reporting-description": "Under brug af denne app, kan du støde fejl. Rapportering af disse fejl hjælper med at skabe en mere sikker og stabil appoplevelse.",
|
||||
"error-reporting-rationale": "Når du aktiverer fejlrapportering, hver gang en fejl opstår, oprettes en rapport automatisk og sendes til en server, sammen med nyttige fejlfindingsoplysninger såsom enheder, versioner og den specifikke fejl.",
|
||||
"what-data-is-gathered-description": "Vi logger fejlen, enhedstype, OS-version, app-version og enhed id. Ingen ansøgningstilstand sendes i enhver fejlrapportering. Enheden id er et unikt hash, der kan nulstilles i dine enhedsindstillinger, og vi kan ikke deducere personlige oplysninger fra denne identifikator.",
|
||||
"where-is-data-stored-description": "Sentry backend er selv-hosted på vores egen infrastruktur. Ingen, men vi har adgang til servere, databaser, ansøgning og dataloger, mindst af alle Sentry personale. infrastrukturen hostes i Den Europæiske Union.",
|
||||
"downloads": "Downloads",
|
||||
"download-track": "Download Track",
|
||||
"download-track": "Annuller",
|
||||
"download-album": "Download Album",
|
||||
"download-playlist": "Download Playlist",
|
||||
"no-downloads": "Du har endnu ikke downloadet nogen spor",
|
||||
@@ -70,11 +70,15 @@
|
||||
"retry-failed-downloads": "Detaljerede downloads",
|
||||
"you-are-offline-message": "Du er i øjeblikket offline. Du kan kun afspille tidligere downloadet musik.",
|
||||
"playing-on": "At spille på",
|
||||
"playback-reporting-description": "Med Playback Reporting bliver alle dine afspilningsbegivenheder sendt tilbage til Jellyfin. Dette giver dig mulighed for at spore dine mest lyttede sange, især med Jellyfin plugins såsom LytBrainz.",
|
||||
"playback-reporting-description": "Med Playback Reporting bliver alle dine afspilningsbegivenheder sendt tilbage til din server. Dette giver dig mulighed for at spore dine mest lyttede sange, især med plugins såsom LytBrainz eller LastFM.",
|
||||
"color-scheme-description": "Som standard vil Fineunes følge dit operativsystems farveordning. Du kan dog vælge at tilsidesætte dette for at sikre, at Fineunes altid er i mørk tilstand eller lystilstand.",
|
||||
"delete": "Slet",
|
||||
"cancel": "Annuller",
|
||||
"confirm-delete-all-tracks": "Er du sikker på, at du vil slette alle aktuelt downloadede spor?",
|
||||
"disc": "Disk",
|
||||
"lyrics": "Sangtekster"
|
||||
"lyrics": "Sangtekster",
|
||||
"direct-play": "Direkte spil",
|
||||
"transcoded": "Transkode",
|
||||
"kbps": "kbps",
|
||||
"khz": "kHz"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"onboarding-welcome": "Willkommen!",
|
||||
"settings": "Einstellungen",
|
||||
"jellyfin-library": "Jellyfin-Bibliothek",
|
||||
"library": "Jellyfin-Bibliothek",
|
||||
"more-info": "Mehr Informationen",
|
||||
"track": "Titel",
|
||||
"playlists": "Wiedergabelisten",
|
||||
@@ -14,7 +14,7 @@
|
||||
"color-scheme-dark": "Dunkler-Modus",
|
||||
"artists": "Künstler",
|
||||
"privacy-policy": "Datenschutz-Bestimmungen",
|
||||
"play-next": "Nächste Wiedergabe",
|
||||
"play-next": "Als nächstes abspielen",
|
||||
"play-album": "Album abspielen",
|
||||
"queue": "Warteschlange",
|
||||
"add-to-queue": "Zur Warteschlange hinzufügen",
|
||||
@@ -27,21 +27,21 @@
|
||||
"music": "Musik",
|
||||
"now-playing": "Läuft gerade",
|
||||
"onboarding-intro": "Mit Fintunes können Sie Ihre Musikbibliothek von überall aus streamen, mit voller Unterstützung für Hintergrundwiedergabe und Casting.",
|
||||
"onboarding-cta": "Um loslegen zu können benötigen Sie einen Jellyfin Server. Klicken Sie auf den Button und geben Sie ihre Jellyfin Serveradresse und Logindaten ein.",
|
||||
"set-jellyfin-server": "Legen Sie den Jellyfin-Server fest",
|
||||
"set-jellyfin-server-instruction": "Bitte geben Sie die URL Ihres Jellyfin-Servers ein. Stellen Sie sicher, dass Sie das Protokoll und den Port angeben",
|
||||
"jellyfin-server-url": "Jellyfin-Server-URL",
|
||||
"jellyfin-access-token": "Jellyfin-Zugriffstoken",
|
||||
"jellyfin-user-id": "Jellyfin-Benutzer-ID",
|
||||
"onboarding-cta": "Um loslegen zu können, benötigen Sie einen Jellyfin (oder Emby) Server. Klicken Sie auf die Schaltfläche unten, um Ihre Serveradresse einzugeben und sich anzumelden.",
|
||||
"set-server": "Legen Sie den Jellyfin-Server fest",
|
||||
"set-server-instruction": "Bitte geben Sie die URL Ihres Jellyfin-Servers ein. Stellen Sie sicher, dass Sie das Protokoll und den Port angeben",
|
||||
"server-url": "Jellyfin-Server-URL",
|
||||
"access-token": "Jellyfin-Zugriffstoken",
|
||||
"user-id": "Jellyfin-Benutzer-ID",
|
||||
"setting-cache": "Zwischenspeicher",
|
||||
"setting-cache-description": "Wenn Sie Ihre Jellyfin-Bibliothek aktualisiert haben, aber weiterhin zwischengespeicherte Elemente angezeigt werden kann man mit diesen Button erzwingen, den Zwischenspeicher vollständig zu leeren. Dies zwingt die App Ihre Bibliothek vollständig neu abzurufen.",
|
||||
"setting-cache-description": "Wenn Sie Ihre Bibliothek aktualisiert haben, die App aber an zwischengespeicherten Inhalten festhält, können Sie den Pufferspeicher mit dieser Schaltfläche zwangsweise löschen. Dies zwingt die App, Ihre Bibliothek vollständig neu abzurufen.",
|
||||
"reset-cache": "Zwischenspeicher zurücksetzen",
|
||||
"recent-albums": "Aktuelle Alben",
|
||||
"error-reporting": "Fehler melden",
|
||||
"error-reporting-description": "Bei der Nutzung dieser App können Fehler auftreten. Das Melden dieser Fehler trägt dazu bei, ein sichereres und stabileres App-Erlebnis zu schaffen.",
|
||||
"error-reporting-rationale": "Wenn Sie die Fehlerberichterstattung aktivieren, wird jedes Mal, wenn ein Fehler auftritt, automatisch ein Bericht erstellt und an einen Server gesendet, zusammen mit hilfreichen Debugging-Informationen wie Geräte, Versionen und der spezifische Fehler.",
|
||||
"why-use-tracking": "Warum werden Tracker verwendet?",
|
||||
"why-use-tracking-description": "Die Verfolgung hilft, die Entwicklung für diese App zu beschleunigen, indem sie seltsame Randfälle und Aufsichten meldet. Dies hilft, die App stabiler und robuster zu machen und so das App-Erlebnis für jeden zu verbessern.",
|
||||
"why-use-tracking-description": "Tracer helfen, die Entwicklung dieser App zu beschleunigen, indem merkwürdige Sonderfälle oder übersehende Fehler direkt an uns gemeldet werden können. Dies hilft uns die App für alle zu verbessern.",
|
||||
"what-data-is-gathered": "Welche Daten werden gesammelt?",
|
||||
"what-data-is-gathered-description": "Wir protokollieren den Fehler, den Gerätetyp, die Betriebssystemversion, die App-Version und die Geräte-ID. In den Fehlerberichten wird kein Anwendungsstatus gesendet. Die Geräte-ID ist ein eindeutiger Hash, der in Ihren Geräteeinstellungen zurückgesetzt werden kann, und wir können aus dieser Kennung keine persönlichen Informationen ableiten.",
|
||||
"where-is-data-stored": "Wo werden die Daten gespeichert?",
|
||||
@@ -69,12 +69,16 @@
|
||||
"total-duration": "Gesamtdauer",
|
||||
"similar-albums": "Ähnliche Alben",
|
||||
"playback-reporting": "Wiedergabeberichte",
|
||||
"playback-reporting-description": "Mit Wiedergabeberichte werden alle Ihre Wiedergabeereignisse zurück an Jellyfin weitergeleitet. Auf diese Weise können Sie Ihre am häufigsten gehörten Songs verfolgen, insbesondere mit Jellyfin-Plugins wie ListenBrainz.",
|
||||
"playback-reporting-description": "Mit der Wiedergabeberichterstattung werden alle Ihre Wiedergabeereignisse an Ihren Server zurückgesendet. So können Sie Ihre meistgehörten Songs verfolgen, insbesondere mit Plugins wie ListenBrainz oder LastFM.",
|
||||
"color-scheme": "Farbschema",
|
||||
"sleep-timer": "Schlummerfunktion",
|
||||
"confirm-delete-all-tracks": "Sind Sie sicher, dass Sie alle aktuell heruntergeladenen Titel löschen möchten?",
|
||||
"delete": "Löschen",
|
||||
"cancel": "Abbrechen",
|
||||
"disc": "Scheiben",
|
||||
"lyrics": "Sangtekster"
|
||||
"lyrics": "Liedtexte",
|
||||
"direct-play": "Direkte Wiedergabe",
|
||||
"transcoded": "Transkodiert",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
@@ -13,16 +13,16 @@
|
||||
"now-playing": "Now Playing",
|
||||
"onboarding-welcome": "Welcome!",
|
||||
"onboarding-intro": "Fintunes will allow you to stream your music library from anywhere, with full support for background audio and casting.",
|
||||
"onboarding-cta": "In order to get started, you need a Jellyfin server. Click the button below to enter your Jellyfin server address and login to it.",
|
||||
"set-jellyfin-server": "Set Jellyfin Server",
|
||||
"set-jellyfin-server-instruction": "Please enter your Jellyfin server URL. Make sure to include the protocol and port",
|
||||
"onboarding-cta": "In order to get started, you need a Jellyfin (or Emby) server. Click the button below to enter your server address and login to it.",
|
||||
"set-server": "Set Server",
|
||||
"set-server-instruction": "Please enter your server URL. Make sure to include the protocol and port",
|
||||
"settings": "Settings",
|
||||
"jellyfin-library": "Jellyfin Library",
|
||||
"jellyfin-server-url": "Jellyfin Server URL",
|
||||
"jellyfin-access-token": "Jellyfin Access Token",
|
||||
"jellyfin-user-id": "Jellyfin User ID",
|
||||
"library": "Library",
|
||||
"server-url": "Server URL",
|
||||
"access-token": "Access Token",
|
||||
"user-id": "User ID",
|
||||
"setting-cache": "Cache",
|
||||
"setting-cache-description": "If you have updated your Jellyfin library, but the app is holding on to cached assets, you can forcefully clear the cache using this button. This will force the app to fetch the library from scratch.",
|
||||
"setting-cache-description": "If you have updated your library, but the app is holding on to cached assets, you can forcefully clear the cache using this button. This will force the app to fetch the library from scratch.",
|
||||
"reset-cache": "Reset Cache",
|
||||
"recent-albums": "Recent Albums",
|
||||
"error-reporting": "Error Reporting",
|
||||
@@ -64,7 +64,7 @@
|
||||
"total-duration": "Total duration",
|
||||
"similar-albums": "Similar albums",
|
||||
"playback-reporting": "Playback Reporting",
|
||||
"playback-reporting-description": "With Playback Reporting, all your playback events are relayed back to Jellyfin. This allows you to track your most listened songs, particularly with Jellyfin plugins such as ListenBrainz.",
|
||||
"playback-reporting-description": "With Playback Reporting, all your playback events are relayed back to your server. This allows you to track your most listened songs, particularly with plugins such as ListenBrainz or LastFM.",
|
||||
"color-scheme": "Color Scheme",
|
||||
"color-scheme-description": "By default, Fintunes will follow your operating system's color scheme. You can however choose to override this to make sure Fintunes is always in dark mode or light mode.",
|
||||
"color-scheme-system": "System",
|
||||
|
||||
@@ -13,17 +13,17 @@
|
||||
"now-playing": "Reproduciendo ahora",
|
||||
"onboarding-welcome": "Bienvenido!",
|
||||
"onboarding-intro": "Fintunes te permitirá reproducir tu biblioteca musical desde cualquier sitio, con suporte completo para audio en segundo plano y casteo en otros dispositivos.",
|
||||
"onboarding-cta": "Para empezar necesitas un servidor de Jellyfin. Pulsa el botón de abajo para introducir la dirección del servidor y autentifícate con tus credenciales.",
|
||||
"set-jellyfin-server": "Introduce servidor de Jellyfin",
|
||||
"set-jellyfin-server-instruction": "Por favor introduce la URL de tu servidor de Jellyfin. Acuérdate de incluir protocolo y puerto",
|
||||
"onboarding-cta": "Para empezar, necesitas un servidor de Jellyfin (o Emby). Haz clic en el botón de abajo para introducir tu dirección de servidor e iniciar sesión.",
|
||||
"set-server": "Introduce servidor de Jellyfin",
|
||||
"set-server-instruction": "Por favor introduce la URL de tu servidor de Jellyfin. Acuérdate de incluir protocolo y puerto",
|
||||
"settings": "Configuración",
|
||||
"jellyfin-library": "Biblioteca Jellyfin",
|
||||
"jellyfin-server-url": "Url del servidor Jellyfin",
|
||||
"jellyfin-access-token": "Token de acceso Jellyfin",
|
||||
"jellyfin-user-id": "ID de usuario Jellyfin",
|
||||
"library": "Biblioteca Jellyfin",
|
||||
"server-url": "Url del servidor Jellyfin",
|
||||
"access-token": "Token de acceso Jellyfin",
|
||||
"user-id": "ID de usuario Jellyfin",
|
||||
"setting-cache": "Caché",
|
||||
"setting-cache-description": "Si actualizó la biblioteca Jellyfin, pero el software aún muestra el contenido anterior, puede hacer clic en el botón a continuación para forzar una actualización. Esto obligará al software a recuperar la información del servidor.",
|
||||
"reset-cache": "Resetear Caché",
|
||||
"setting-cache-description": "Si has actualizado tu biblioteca, pero la aplicación conserva los recursos almacenados en caché, puedes borrar la caché de forma manual con este botón. Esto obligará a la aplicación a recuperar la biblioteca desde cero.",
|
||||
"reset-cache": "Restablecer caché",
|
||||
"recent-albums": "Álbumes recientes",
|
||||
"error-reporting-rationale": "Cuando habilita el informe de errores, cada vez que ocurre un error, se crea y envía automáticamente un informe a un servidor, junto con información útil de depuración, como dispositivos, versiones y el error específico.",
|
||||
"what-data-is-gathered": "¿Qué datos se recopilan?",
|
||||
@@ -50,7 +50,7 @@
|
||||
"playing-on": "Jugando en",
|
||||
"local-playback": "Reproducción local",
|
||||
"playback-reporting": "Informes de reproducción",
|
||||
"playback-reporting-description": "Con los informes de reproducción, todos sus eventos de reproducción se transmiten a Jellyfin. Esto le permite rastrear sus canciones más escuchadas, particularmente con los complementos de Jellyfin como ListenBrainz.",
|
||||
"playback-reporting-description": "Con Playback Reporting, todos los eventos de reproducción se retransmiten a tu servidor. Esto te permite realizar un seguimiento de las canciones más escuchadas, especialmente con complementos como ListenBrainz o LastFM.",
|
||||
"color-scheme-description": "De forma predeterminada, Fintunes seguirá el esquema de color de su sistema operativo. Sin embargo, puede optar por anular esto para asegurarse de que Fintunes esté siempre en modo oscuro o en modo claro.",
|
||||
"color-scheme-light": "Modo de luz",
|
||||
"why-use-tracking": "¿Por qué usar el seguimiento?",
|
||||
@@ -76,5 +76,9 @@
|
||||
"delete": "Borrar",
|
||||
"cancel": "Cancelar",
|
||||
"disc": "Disco",
|
||||
"lyrics": "Letras"
|
||||
"lyrics": "Letras",
|
||||
"direct-play": "Reproducción directa",
|
||||
"transcoded": "Transcodificar",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
84
src/localisation/lang/fi/locale.json
Normal file
84
src/localisation/lang/fi/locale.json
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"albums": "Albumit",
|
||||
"album": "Albumi",
|
||||
"queue": "Jono",
|
||||
"add-to-queue": "Lisää jonoon",
|
||||
"clear-queue": "Tyhjennä jono",
|
||||
"no-results": "Ei tuloksia…",
|
||||
"play-next": "Toista seuraava",
|
||||
"play-album": "Toista albumi",
|
||||
"all-albums": "Kaikki albumit",
|
||||
"search": "Etsi",
|
||||
"sleep-timer": "Uniajastin",
|
||||
"delete": "Poista",
|
||||
"cancel": "Peruuta",
|
||||
"disc": "Levy",
|
||||
"lyrics": "Sanoitukset",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps",
|
||||
"music": "Musiikki",
|
||||
"now-playing": "Nyt soitetaan",
|
||||
"onboarding-welcome": "Tervetuloa!",
|
||||
"settings": "Asetukset",
|
||||
"library": "Kirjasto",
|
||||
"server-url": "Palvelimen URL-osoite",
|
||||
"access-token": "Access Token",
|
||||
"user-id": "Käyttäjätunnus",
|
||||
"setting-cache": "Välimuisti",
|
||||
"enable": "Ota käyttöön",
|
||||
"disable": "Poista käytöstä",
|
||||
"more-info": "Lisätietoja",
|
||||
"track": "Kappale",
|
||||
"playlists": "Soittolistat",
|
||||
"playlist": "Soittolista",
|
||||
"shuffle-playlist": "Sekoita soittolista",
|
||||
"downloads": "Lataukset",
|
||||
"delete-track": "Poista kappale",
|
||||
"delete-playlist": "Poista soittolista",
|
||||
"total-duration": "Kesto yhteensä",
|
||||
"color-scheme": "Ulkoasu",
|
||||
"color-scheme-system": "Järjestelmä",
|
||||
"color-scheme-light": "Vaalea tila",
|
||||
"color-scheme-dark": "Tumma tila",
|
||||
"artists": "Artistit",
|
||||
"privacy-policy": "Yksityisyydensuoja",
|
||||
"why-use-tracking": "Miksi käyttää seurantaa?",
|
||||
"what-data-is-gathered": "Mitä tietoja kerätään?",
|
||||
"where-is-data-stored": "Missä tietoja säilytetään?",
|
||||
"direct-play": "Toista heti",
|
||||
"transcoded": "Transkoodattu",
|
||||
"onboarding-intro": "Fintunesin avulla voit striimata musiikkia kirjastostasi missä tahansa. Tukee täysin tausta- ja suoratoistoa.",
|
||||
"onboarding-cta": "Tarvitset Jellyfin (tai Emby) -palvelimen aloittaaksesi. Klikkaa alla olevaa painiketta syöttääksesi palvelinosoitteesi ja kirjautuaksesi siihen.",
|
||||
"set-server": "Aseta palvelin",
|
||||
"set-server-instruction": "Ole hyvä ja syötä palvelimesi URL-osoite ja lisää protokolla sekä portti",
|
||||
"setting-cache-description": "Voit tyhjentää välimuistin tämän painikkeen avulla, jos sovellus säilyttää välimuistissa olevat tiedot kirjaston päivittämisen jälkeen. Tämä pakottaa sovelluksen hakemaan kirjaston uudelleen.",
|
||||
"reset-cache": "Aseta välimuisti uudelleen",
|
||||
"recent-albums": "Viimeaikaiset albumit",
|
||||
"error-reporting": "Virheiden raportointi",
|
||||
"error-reporting-description": "Tämän sovelluksen käytön aikana saatat huomata virheitä. Näiden virheiden ilmoittaminen auttaa luomaan turvallisemman ja vakaamman sovelluskokemuksen.",
|
||||
"error-reporting-rationale": "Virhetilanteista luodaan raportti automaattisesti ja se lähetetään palvelimelle, kun virheiden raportointi on päällä. Raportissa on mukana tietoa laitteeseen, ohjelmaversioon ja virheeseen liittyviä tietoja.",
|
||||
"why-use-tracking-description": "Seuranta ja virhetapausten raportointi nopeuttaa sovelluksen kehitystyötä. Tämä auttaa tekemään sovelluksesta vakaamman parantaen kaikkien käyttökokemusta.",
|
||||
"what-data-is-gathered-description": "Kirjaamme lokiin virheen, laitteen tyypin, käyttöjärjestelmän version, sovelluksen version ja laitteen tunnisteen (device id). Virheraportissa ei lähetetä sovelluksen tilatietoja. Laitteen tunniste on yksilöllinen hash, joka voidaan nollata laitteen asetuksissa. Laitteen tunnisteesta ei voi päätellä käyttäjän henkilökohtaisia tietoja.",
|
||||
"where-is-data-stored-description": "Sentryn taustapalvelinta ylläpidetään itse. Kenelläkään muulla, ei myöskään Sentryn henkilökunnalla, ei ole pääsyä palvelimille, tietokantoihin, sovellus- ja tietolokeihin. Infrastruktuuria ylläpidetään Euroopan Unionin alueella.",
|
||||
"enable-error-reporting": "Haluatko sallia virheiden raportoinnin?",
|
||||
"enable-error-reporting-description": "Tämä auttaa parantamaan sovelluskokemusta lähettämällä virheilmoituksia meille.",
|
||||
"play-playlist": "Toista soittolista",
|
||||
"shuffle-album": "Sekoita albumi",
|
||||
"download-track": "Lataa kappale",
|
||||
"download-album": "Lataa albumi",
|
||||
"download-playlist": "Lataa soittolista",
|
||||
"no-downloads": "Et ole vielä ladannut kappaleita",
|
||||
"delete-all-tracks": "Poista kaikki kappaleet",
|
||||
"confirm-delete-all-tracks": "Oletko varma, että haluat poistaa kaikki tällä hetkellä ladatut kappaleet?",
|
||||
"delete-album": "Poista albumi",
|
||||
"total-download-size": "Latauksen yhteenlaskettu koko",
|
||||
"retry-failed-downloads": "Lataa epäonnistuneet uudelleen",
|
||||
"you-are-offline-message": "Olet tällä hetkellä offline-tilassa. Voit toistaa vain aiemmin ladattua musiikkia.",
|
||||
"playing-on": "Toistaa",
|
||||
"local-playback": "Paikallinen toisto",
|
||||
"streaming": "Striimaa",
|
||||
"similar-albums": "Samanlaisia albumeja",
|
||||
"playback-reporting": "Toiston raportointi",
|
||||
"playback-reporting-description": "Toiston raportoinnin avulla kaikki toistotapahtumat palautetaan palvelimellesi. Näin voit seurata eniten kuunneltuja kappaleita, esimerkiksi pluginien, kuten ListenBrainz tai LastFM, avulla.",
|
||||
"color-scheme-description": "Fintunes noudattaa oletuksena käyttöjärjestelmän ulkoasua. Voit kuitenkin ohittaa tämän varmistaaksesi, että Fintunes on aina tummassa tai vaaleassa tilassa."
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"play-next": "Lire ensuite",
|
||||
"play-album": "Jouer l'album",
|
||||
"play-album": "Lire l'album",
|
||||
"queue": "File d'attente",
|
||||
"add-to-queue": "Ajouter à la file d'attente",
|
||||
"clear-queue": "Vider la file d'attente",
|
||||
@@ -11,22 +11,22 @@
|
||||
"search": "Rechercher",
|
||||
"music": "Musique",
|
||||
"now-playing": "En cours",
|
||||
"onboarding-welcome": "Bienvenue !",
|
||||
"onboarding-intro": "Fintunes vous permettra de diffuser votre bibliothèque musicale de n'importe où, avec un support de la lecture en arrière plan et la diffusion à distance.",
|
||||
"onboarding-cta": "Pour utiliser Fintunes, vous avez besoin d'un serveur Jellyfin. Cliquez sur le bouton ci-dessous pour entrer l'adresse de votre serveur Jellyfin et vous y connecter.",
|
||||
"set-jellyfin-server": "Configurer le serveur Jellyfin",
|
||||
"set-jellyfin-server-instruction": "Veuillez entrer l'URL de votre serveur Jellyfin. Assurez-vous d'inclure le protocole et le port",
|
||||
"onboarding-welcome": "Bienvenue !",
|
||||
"onboarding-intro": "Fintunes vous permettra de diffuser votre bibliothèque musicale de n'importe où, avec un support de la lecture en arrière-plan et la diffusion à distance.",
|
||||
"onboarding-cta": "Pour commencer, vous avez besoin d'un serveur Jellyfin (ou Emby). Cliquez sur le bouton ci-dessous pour entrer l'adresse du serveur et vous y connecter.",
|
||||
"set-server": "Configurer le serveur Jellyfin",
|
||||
"set-server-instruction": "Veuillez entrer l'URL de votre serveur Jellyfin. Assurez-vous d'inclure le protocole et le port",
|
||||
"settings": "Réglages",
|
||||
"jellyfin-library": "Bibliothèque Jellyfin",
|
||||
"jellyfin-server-url": "URL du serveur Jellyfin",
|
||||
"jellyfin-access-token": "Jeton d'accès à la Jellyfin",
|
||||
"jellyfin-user-id": "ID utilisateur Jellyfin",
|
||||
"library": "Bibliothèque Jellyfin",
|
||||
"server-url": "URL du serveur Jellyfin",
|
||||
"access-token": "Jeton d'accès au serveur Jellyfin",
|
||||
"user-id": "ID utilisateur Jellyfin",
|
||||
"setting-cache": "Cache",
|
||||
"setting-cache-description": "Si vous avez mis à jour votre bibliothèque Jellyfin mais que l'application conserve toujours des ressources en cache, vous pouvez vider le cache en utilisant ce bouton. Cela forcera l'application à récupérer l’intégralité de bibliothèque.",
|
||||
"setting-cache-description": "Si vous avez mis à jour votre bibliothèque mais que l'application conserve toujours des ressources en cache, vous pouvez vider le cache en utilisant ce bouton. Cela forcera l'application à récupérer l’intégralité de bibliothèque.",
|
||||
"reset-cache": "Réinitialiser le cache",
|
||||
"recent-albums": "Albums récents",
|
||||
"what-data-is-gathered": "Quelles données sont collectées ?",
|
||||
"error-reporting-rationale": "Lorsque vous activez le rapport d'erreurs, chaque fois qu'une erreur se produit, un rapport est automatiquement créé et envoyé à un serveur, avec des informations de débogage utiles telles que les périphériques, les versions et l'erreur spécifique.",
|
||||
"error-reporting-rationale": "Lorsque vous activez le rapport d'erreurs, chaque fois qu'une erreur se produit, un rapport est automatiquement créé et envoyé à un serveur, avec des informations de débogage utiles telles que les périphériques, les versions et l'erreur en question.",
|
||||
"why-use-tracking-description": "Le suivi aide à accélérer le développement de cette application en signalant les cas étranges et les oublis. Ceci contribue à rendre l'application plus stable et plus robuste, augmentant ainsi l'expérience de l'application pour tout le monde.",
|
||||
"what-data-is-gathered-description": "Nous enregistrons l'erreur, le type d'appareil, la version du système d'exploitation, la version de l'application et l'identifiant de l'appareil. Aucun état d'application n'est envoyé dans les rapports d'erreurs. L'identifiant de l'appareil est un hachage unique qui peut être réinitialisé dans les paramètres de votre appareil, et nous ne pouvons déduire aucune information personnelle de cet identifiant.",
|
||||
"more-info": "Plus d'informations",
|
||||
@@ -37,14 +37,14 @@
|
||||
"you-are-offline-message": "Vous êtes actuellement hors ligne. Vous ne pouvez lire que de la musique précédemment téléchargée.",
|
||||
"similar-albums": "Albums similaires",
|
||||
"playback-reporting": "Rapport de lecture",
|
||||
"playback-reporting-description": "Avec Playback Reporting, tous vos évènements de lecture sont relayés vers Jellyfin. Ceci vous permet de suivre vos chansons les plus écoutées, notamment avec les plugins Jellyfin tels que ListenBrainz.",
|
||||
"color-scheme-description": "Par défaut, Fintunes suivra le schéma de couleurs de votre système d'exploitation. Vous pouvez cependant choisir de forcer ce réglage pour vous assurer que Fintunes est toujours en mode sombre ou en mode clair.",
|
||||
"playback-reporting-description": "Grâce au \"Playback Reporting\", tous les évènements de playback sont relayés à votre serveur. Cela vous permet de retrouver vos chansons les plus écoutées, en particulier avec les plugins de ListenBrainz où LastFM.",
|
||||
"color-scheme-description": "Par défaut, Fintunes suivra le thème de votre système d'exploitation. Vous pouvez cependant choisir d'imposer ce réglage pour vous assurer que Fintunes reste en mode sombre ou en mode clair.",
|
||||
"why-use-tracking": "Pourquoi utiliser le suivi ?",
|
||||
"where-is-data-stored": "Où sont stockées les données ?",
|
||||
"enable-error-reporting": "Voulez-vous activer le rapport d'erreur ?",
|
||||
"local-playback": "Lecture locale",
|
||||
"streaming": "Streaming",
|
||||
"color-scheme": "Schéma de couleur",
|
||||
"color-scheme": "Thème",
|
||||
"color-scheme-system": "Système",
|
||||
"where-is-data-stored-description": "Le backend Sentry est auto-hébergé sur notre propre infrastructure. Personne d'autre que nous n'a accès aux serveurs, aux bases de données, aux applications et aux journaux de données, et encore moins le personnel de Sentry. L'infrastructure est hébergée dans l'Union Européenne.",
|
||||
"enable-error-reporting-description": "Cela permet d'améliorer l'expérience de l'application en nous envoyant des rapports de plantage et d'erreur.",
|
||||
@@ -55,26 +55,30 @@
|
||||
"download-album": "Télécharger l'album",
|
||||
"delete-album": "Supprimer l'album",
|
||||
"delete-playlist": "Supprimer la liste de lecture",
|
||||
"total-download-size": "Taille totale de téléchargement",
|
||||
"playing-on": "Jouer sur",
|
||||
"total-download-size": "Taille totale des téléchargements",
|
||||
"playing-on": "En lecture sur",
|
||||
"total-duration": "Durée totale",
|
||||
"color-scheme-light": "Mode clair",
|
||||
"color-scheme-dark": "Mode sombre",
|
||||
"artists": "Artistes",
|
||||
"download-track": "Télécharger la piste",
|
||||
"download-track": "Télécharger le morceau",
|
||||
"download-playlist": "Télécharger la liste de lecture",
|
||||
"delete-track": "Supprimer la piste",
|
||||
"delete-all-tracks": "Supprimer toutes les pistes",
|
||||
"delete-track": "Supprimer le morceau",
|
||||
"delete-all-tracks": "Supprimer tous les morceaux",
|
||||
"playlists": "Listes de lecture",
|
||||
"downloads": "Téléchargements",
|
||||
"track": "Piste",
|
||||
"track": "Morceau",
|
||||
"error-reporting-description": "Lors de l'utilisation de cette application, vous pouvez rencontrer des erreurs. Le signalement de ces erreurs aide à créer une expérience d'application plus stable et sécurisée.",
|
||||
"error-reporting": "Rapport d'erreur",
|
||||
"privacy-policy": "Politique de confidentialité",
|
||||
"sleep-timer": "Minuterie de veille",
|
||||
"confirm-delete-all-tracks": "Êtes-vous sûr de vouloir supprimer toutes les pistes actuellement téléchargées ?",
|
||||
"sleep-timer": "Minuteur",
|
||||
"confirm-delete-all-tracks": "Êtes-vous sûr de vouloir supprimer tous les morceaux actuellement téléchargées ?",
|
||||
"delete": "Supprimer",
|
||||
"cancel": "Annuler",
|
||||
"disc": "Disc",
|
||||
"lyrics": "Paroles"
|
||||
"disc": "Disque",
|
||||
"lyrics": "Paroles",
|
||||
"direct-play": "Lecture directe",
|
||||
"transcoded": "Converti",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
84
src/localisation/lang/id/locale.json
Normal file
84
src/localisation/lang/id/locale.json
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"play-next": "Sitemap",
|
||||
"play-album": "Login",
|
||||
"where-is-data-stored": "Hapus Semua Tracks",
|
||||
"playing-on": "Bermain di",
|
||||
"direct-play": "Bermain langsung",
|
||||
"transcoded": "Login",
|
||||
"khz": "login",
|
||||
"add-to-queue": "Tambahkan ke Queue",
|
||||
"clear-queue": "Login",
|
||||
"onboarding-intro": "Fintunes akan memungkinkan Anda untuk streaming perpustakaan musik Anda dari mana saja, dengan dukungan penuh untuk audio latar belakang dan pengecoran.",
|
||||
"onboarding-cta": "Untuk memulai, Anda membutuhkan server Jellyfin (atau Emby). Klik tombol di bawah ini untuk memasukkan alamat server dan login ke dalamnya.",
|
||||
"set-server": "Login",
|
||||
"set-server-instruction": "Silakan masukkan URL server Anda. Pastikan untuk menyertakan protokol dan port",
|
||||
"access-token": "Token Akses",
|
||||
"setting-cache-description": "Jika Anda telah memperbarui perpustakaan Anda, tetapi aplikasi ini memegang aset yang tersimpan, Anda dapat dengan kekuatan menghapus cache menggunakan tombol ini. Ini akan memaksa aplikasi untuk mengambil perpustakaan dari awal.",
|
||||
"reset-cache": "Login",
|
||||
"recent-albums": "Album terbaru",
|
||||
"error-reporting": "Login",
|
||||
"error-reporting-description": "Selama penggunaan aplikasi ini, Anda dapat menemukan kesalahan. Pelaporan kesalahan ini membantu dalam menciptakan pengalaman aplikasi yang lebih aman dan stabil.",
|
||||
"error-reporting-rationale": "Ketika Anda mengaktifkan pelaporan kesalahan, setiap kali kesalahan terjadi, laporan secara otomatis diciptakan dan dikirim ke server, bersama dengan informasi debugging yang membantu seperti perangkat, versi dan kesalahan tertentu.",
|
||||
"why-use-tracking": "Mengapa menggunakan pelacakan?",
|
||||
"why-use-tracking-description": "Tracing membantu mempercepat pengembangan untuk aplikasi ini dengan melaporkan kasus tepi aneh dan pengawasan. Ini membantu membuat aplikasi lebih stabil dan kuat, sehingga meningkatkan pengalaman aplikasi untuk semua orang.",
|
||||
"what-data-is-gathered": "Data apa yang dikumpulkan?",
|
||||
"what-data-is-gathered-description": "Kami mencatat kesalahan, jenis perangkat, versi OS, versi aplikasi dan id perangkat. Tidak ada state aplikasi yang dikirim dalam laporan kesalahan. Perangkat id adalah hash unik yang dapat diatur dalam pengaturan perangkat Anda, dan kami tidak dapat mengurangi informasi pribadi dari pengidentifikasi ini.",
|
||||
"where-is-data-stored-description": "Login",
|
||||
"enable-error-reporting": "Apakah Anda ingin mengaktifkan pelaporan kesalahan?",
|
||||
"enable-error-reporting-description": "Ini membantu meningkatkan pengalaman aplikasi dengan mengirimkan laporan kecelakaan dan kesalahan kepada kami.",
|
||||
"play-playlist": "Login",
|
||||
"shuffle-album": "Album di Shuffle",
|
||||
"download-track": "Unduh Track",
|
||||
"download-album": "Unduh Album",
|
||||
"download-playlist": "Unduh Playlist",
|
||||
"no-downloads": "Mode cahaya",
|
||||
"delete-all-tracks": "Hapus Semua Tracks",
|
||||
"confirm-delete-all-tracks": "Apakah Anda yakin Anda ingin menghapus semua trek yang diunduh saat ini?",
|
||||
"delete-album": "Hapus Album",
|
||||
"delete-playlist": "Hapus Playlist",
|
||||
"total-download-size": "Login Login",
|
||||
"retry-failed-downloads": "Sitemap",
|
||||
"you-are-offline-message": "Anda saat ini offline. Anda hanya dapat bermain musik yang sebelumnya diunduh.",
|
||||
"local-playback": "Pemutaran lokal",
|
||||
"streaming": "Login",
|
||||
"total-duration": "Total durasi",
|
||||
"similar-albums": "Album serupa",
|
||||
"playback-reporting": "Login",
|
||||
"playback-reporting-description": "Dengan Pelaporan Playback, semua acara pemutaran Anda di relay kembali ke server Anda. Ini memungkinkan Anda untuk melacak lagu-lagu paling didengar Anda, terutama dengan plugin seperti ListenBrainz atau LastFM.",
|
||||
"color-scheme-description": "Secara default, Fintunes akan mengikuti skema warna sistem operasi Anda. Anda dapat memilih untuk menimpa ini untuk memastikan Fintunes selalu dalam mode gelap atau mode cahaya.",
|
||||
"color-scheme-light": "Mode cahaya",
|
||||
"queue": "Antrean",
|
||||
"disc": "Disk",
|
||||
"lyrics": "Lirik",
|
||||
"kbps": "kbps",
|
||||
"no-results": "Tidak ada hasil",
|
||||
"album": "Album",
|
||||
"albums": "Album",
|
||||
"all-albums": "Semua Album",
|
||||
"search": "Cari",
|
||||
"music": "Musik",
|
||||
"now-playing": "Sekarang Bermain",
|
||||
"onboarding-welcome": "Selamat Datang!",
|
||||
"settings": "Pengaturan",
|
||||
"library": "Perpustakaan",
|
||||
"server-url": "URL server",
|
||||
"user-id": "ID Pengguna",
|
||||
"setting-cache": "Tembolok",
|
||||
"enable": "Aktifkan",
|
||||
"disable": "Matikan",
|
||||
"more-info": "Lebih banyak info",
|
||||
"track": "Jejak",
|
||||
"playlists": "Daftar putar",
|
||||
"playlist": "Daftar Putar",
|
||||
"shuffle-playlist": "Acak Daftar Putar",
|
||||
"downloads": "Unduhan",
|
||||
"delete-track": "Delete Track",
|
||||
"color-scheme": "Skema Warna",
|
||||
"color-scheme-system": "Sistem",
|
||||
"color-scheme-dark": "Modus Gelap",
|
||||
"artists": "Artis",
|
||||
"privacy-policy": "Kebijakan Privasi",
|
||||
"sleep-timer": "Pengatur Waktu Tidur",
|
||||
"delete": "Hapus",
|
||||
"cancel": "Batal"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"jellyfin-server-url": "URL del Server Jellyfin",
|
||||
"server-url": "URL del Server Jellyfin",
|
||||
"settings": "Impostazioni",
|
||||
"why-use-tracking": "Perché utilizzare il Monitoraggio?",
|
||||
"streaming": "Streaming",
|
||||
@@ -22,12 +22,12 @@
|
||||
"now-playing": "Ora in Riproduzione",
|
||||
"onboarding-welcome": "Benvenuto!",
|
||||
"onboarding-intro": "Fintunes ti consentirà di riprodurre in streaming la tua libreria musicale da dove vuoi, con pieno supporto per l'audio di sottofondo e la trasmissione.",
|
||||
"onboarding-cta": "Per iniziare, hai bisogno di un server Jellyfin. Fai clic sul pulsante in basso per inserire l'indirizzo del tuo server Jellyfin e accedere.",
|
||||
"set-jellyfin-server": "Imposta il Server Jellyfin",
|
||||
"set-jellyfin-server-instruction": "Inserisci l'URL del tuo server Jellyfin. Assicurati di includere il protocollo e la porta",
|
||||
"jellyfin-library": "Libreria Jellyfin",
|
||||
"jellyfin-access-token": "Token di Accesso Jellyfin",
|
||||
"jellyfin-user-id": "ID Utente Jellyfin",
|
||||
"onboarding-cta": "Per iniziare, è necessario un server Jellyfin (o Emby). Fare clic sul pulsante qui sotto per inserire l'indirizzo del server e accedervi.",
|
||||
"set-server": "Imposta il Server Jellyfin",
|
||||
"set-server-instruction": "Inserisci l'URL del tuo server Jellyfin. Assicurati di includere il protocollo e la porta",
|
||||
"library": "Libreria Jellyfin",
|
||||
"access-token": "Token di Accesso Jellyfin",
|
||||
"user-id": "ID Utente Jellyfin",
|
||||
"setting-cache": "Cache",
|
||||
"setting-cache-description": "Se hai aggiornato la tua libreria Jellyfin, ma l'app trattiene le risorse memorizzate nella cache, puoi forzare la cancellazione della cache utilizzando questo pulsante. Ciò costringerà l'app a recuperare la libreria da zero.",
|
||||
"reset-cache": "Reimposta Cache",
|
||||
@@ -35,7 +35,7 @@
|
||||
"error-reporting": "Segnalazione Errori",
|
||||
"error-reporting-description": "Durante l'utilizzo di questa app, potresti riscontrare errori. La segnalazione di questi errori ci aiuta a creare un'esperienza dell'app più sicura e stabile.",
|
||||
"error-reporting-rationale": "Quando abiliti la segnalazione degli errori, ogni volta che si verifica un errore, viene creato automaticamente un rapporto e inviato a un server, insieme a utili informazioni di debug come dispositivi, versioni e l'errore specifico.",
|
||||
"why-use-tracking-description": "Tracing aiuta a velocizzare lo sviluppo per questa applicazione segnalando strani casi di bordo e sovrastudini. Questo aiuta a rendere l'applicazione più stabile e robusto, migliorando così l'esperienza app per tutti.",
|
||||
"why-use-tracking-description": "Il monitoraggio aiuta ad accelerare lo sviluppo di questa app segnalando casi strani e sviste. Ciò ci aiuta a rendere l'app più stabile e robusta, aumentando così l'esperienza dell'app per tutti.",
|
||||
"what-data-is-gathered": "Quali dati vengono raccolti?",
|
||||
"what-data-is-gathered-description": "Registriamo l'errore, il tipo di dispositivo, la versione del sistema operativo, la versione dell'app e l'ID del dispositivo. Nessuno stato dell'applicazione viene inviato in nessuna segnalazione di errore. L'ID del dispositivo è un hash unico che può essere ripristinato nelle impostazioni del dispositivo e non possiamo dedurre alcuna informazione personale da questo identificatore.",
|
||||
"where-is-data-stored": "Dove vengono archiviati i dati?",
|
||||
@@ -68,7 +68,7 @@
|
||||
"total-duration": "Durata Totale",
|
||||
"similar-albums": "Album Simili",
|
||||
"playback-reporting": "Rapporto di Riproduzione",
|
||||
"playback-reporting-description": "Con il Rapporto di Riproduzione, tutti i tuoi eventi di riproduzione vengono ritrasmessi a Jellyfin. Ciò ti consente di tenere traccia delle tue canzoni più ascoltate, in particolare con i plug-in Jellyfin come ListenBrainz.",
|
||||
"playback-reporting-description": "Gioco diretto",
|
||||
"color-scheme-description": "Di default, Fintunes usa il tema colori del tuo sistema operativo. Puoi tuttavia scegliere di sovrascrivere questa impostazione per assicurarti che Fintunes sia sempre in modalità notte o luce.",
|
||||
"privacy-policy": "Politica sulla riservatezza",
|
||||
"sleep-timer": "Tempo di sonno",
|
||||
@@ -76,5 +76,9 @@
|
||||
"cancel": "Annulla",
|
||||
"confirm-delete-all-tracks": "Sei sicuro di voler eliminare tutte le tracce attualmente scaricate?",
|
||||
"disc": "Disc",
|
||||
"lyrics": "Testi"
|
||||
"lyrics": "Testi",
|
||||
"direct-play": "Gioco diretto",
|
||||
"transcoded": "Transcodifica",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
@@ -13,23 +13,23 @@
|
||||
"now-playing": "再生中",
|
||||
"onboarding-welcome": "ようこそ。",
|
||||
"onboarding-intro": "Fintunes は、どこからでも音楽ライブラリをストリーミングすることができます。バックグラウンド・オーディオやキャスティングを完全にサポートします。",
|
||||
"onboarding-cta": "始めるためには、Jellyfin サーバーが必要です。下のボタンをクリックして、Jellyfin サーバーのアドレスを入力し、ログインしてください。",
|
||||
"set-jellyfin-server": "Jellyfin サーバ を設定",
|
||||
"set-jellyfin-server-instruction": "Jellyfin サーバの URL を入力してください。プロトコルとポートを必ず含めてください。",
|
||||
"onboarding-cta": "起動するには、Jellyfin(または Emby)サーバーが必要です。下のボタンをクリックして、サーバーアドレスを入力してログインします。",
|
||||
"set-server": "Jellyfin サーバ を設定",
|
||||
"set-server-instruction": "Jellyfin サーバの URL を入力してください。プロトコルとポートを必ず含めてください。",
|
||||
"settings": "設定",
|
||||
"jellyfin-library": "Jellyfin ライブライ",
|
||||
"jellyfin-server-url": "Jellyfin サーバの URL",
|
||||
"jellyfin-access-token": "Jellyfin アクセストークン",
|
||||
"jellyfin-user-id": "Jellyfin ユーザ ID",
|
||||
"library": "Jellyfin ライブライ",
|
||||
"server-url": "Jellyfin サーバの URL",
|
||||
"access-token": "Jellyfin アクセストークン",
|
||||
"user-id": "Jellyfin ユーザ ID",
|
||||
"setting-cache": "キャッシュ",
|
||||
"setting-cache-description": "Jellyfinライブラリをアップデートしたにもかかわらず、アプリがキャッシュされたアセットを保持している場合、このボタンを使って強制的にキャッシュをクリアすることができます。これにより、アプリはライブラリを最初から取得するようになります。",
|
||||
"setting-cache-description": "ライブラリをアップデートしたにもかかわらず、アプリがキャッシュされたアセットを保持している場合、このボタンを使って強制的にキャッシュをクリアすることができます。これにより、アプリはライブラリを最初から取得するようになります。",
|
||||
"reset-cache": "キャッシュをリセット",
|
||||
"recent-albums": "最近のアルバム",
|
||||
"error-reporting": "エラー報告",
|
||||
"error-reporting-description": "このアプリを使用中に、エラーの可能性があります。これらのエラーを報告することで、よりセキュアで安定したアプリ体験を実現することができます。",
|
||||
"error-reporting-rationale": "エラーレポートを有効にすると、エラーが発生するたびにレポートが自動的に作成され、デバイス、バージョン、特定のエラーなど、デバッグに役立つ情報とともにサーバーに送信されます。",
|
||||
"why-use-tracking": "なぜトラッキングを使うか?",
|
||||
"why-use-tracking-description": "リリック",
|
||||
"why-use-tracking-description": "トレースは、奇妙なエッジケースや見落としを報告することで、このアプリの開発を促進します。これにより、アプリの安定性と堅牢性が向上し、すべてのユーザーのアプリ体験が向上します。",
|
||||
"what-data-is-gathered": "どのデータが集まりますか?",
|
||||
"what-data-is-gathered-description": "エラー、デバイスタイプ、OSバージョン、アプリバージョン、デバイスIDが記録されます。いかなるエラー報告においても、アプリケーションの状態は送信されません。デバイスIDは、デバイスの設定でリセット可能な一意のハッシュであり、この識別子から個人情報を推測することはできません。",
|
||||
"where-is-data-stored": "データはどこに保存されていますか?",
|
||||
@@ -58,7 +58,7 @@
|
||||
"total-duration": "合計期間",
|
||||
"similar-albums": "類似のアルバム",
|
||||
"playback-reporting": "再生レポート",
|
||||
"playback-reporting-description": "Playback Reporting を使用すると、すべての再生イベントが Jellyfin に中継されます。これにより、特に ListenBrainz などの Jellyfin プラグインを使用して、最もよく聴いている曲を追跡できます。",
|
||||
"playback-reporting-description": "再生レポートを使用すると、すべての再生した曲がサーバーに中継されます。これにより、ListenBrainzやLastFMなどのプラグインを使用して、最もよく聴かれた曲を追跡することができます。",
|
||||
"color-scheme-description": "デフォルトでは、Fintunes はオペレーティング システムの配色に従います。ただし、Fintunes が常にダーク モードまたはライト モードであることを確認するために、これをオーバーライドすることを選択できます。",
|
||||
"color-scheme-light": "ライトモード",
|
||||
"color-scheme-dark": "ダークモード",
|
||||
@@ -66,7 +66,7 @@
|
||||
"color-scheme": "カラースキーム",
|
||||
"artists": "アーティスト",
|
||||
"downloads": "ダウンロード",
|
||||
"no-downloads": "まだトラックをダウンロードしていません",
|
||||
"no-downloads": "まだ何もダウンロードしていません",
|
||||
"streaming": "ストリーミング",
|
||||
"local-playback": "ローカル再生",
|
||||
"color-scheme-system": "システム",
|
||||
@@ -76,5 +76,9 @@
|
||||
"delete": "削除",
|
||||
"cancel": "キャンセル",
|
||||
"disc": "ディスク",
|
||||
"lyrics": "歌詞"
|
||||
"lyrics": "歌詞",
|
||||
"direct-play": "ダイレクトプレイ",
|
||||
"transcoded": "トランスコード",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
@@ -26,13 +26,13 @@
|
||||
"onboarding-welcome": "Velkommen.",
|
||||
"onboarding-intro": "Fintunes lar deg strømme musikkbiblioteket ditt fra hvor som helst, med full støtte for bakgrunnslyd og casting.",
|
||||
"onboarding-cta": "For å begynne trenger du en Jellyfin-tjener. Klikk på knappen nedenfor for å angi Jellyfin-tjeneradressen din og logge på den.",
|
||||
"set-jellyfin-server": "Sett Jellyfin-tjener",
|
||||
"set-jellyfin-server-instruction": "Skriv inn Jellyfin-tjenerens nettadresse. Sørg for å inkludere protokollen og porten.",
|
||||
"set-server": "Sett Jellyfin-tjener",
|
||||
"set-server-instruction": "Skriv inn Jellyfin-tjenerens nettadresse. Sørg for å inkludere protokollen og porten.",
|
||||
"settings": "Innstillinger",
|
||||
"jellyfin-library": "Jellyfin-bibliotek",
|
||||
"jellyfin-server-url": "Jellyfin-tjenernettadresse",
|
||||
"jellyfin-access-token": "Jellyfin-tilgangssymbol",
|
||||
"jellyfin-user-id": "Jellyfin-bruker-ID",
|
||||
"library": "Jellyfin-bibliotek",
|
||||
"server-url": "Jellyfin-tjenernettadresse",
|
||||
"access-token": "Jellyfin-tilgangssymbol",
|
||||
"user-id": "Jellyfin-bruker-ID",
|
||||
"setting-cache": "Mellomlager",
|
||||
"setting-cache-description": "Du tømme hurtiglageret med denne knappen hvis du har oppdatert Jellyfin-biblioteket ditt, men programmet holder på hurtiglagrede eiendeler. Dette vil tvinge programmet til å hente biblioteket fra bunnen av.",
|
||||
"reset-cache": "Tilbakestill hurtiglager",
|
||||
@@ -76,5 +76,7 @@
|
||||
"cancel": "Avbryt",
|
||||
"confirm-delete-all-tracks": "Er du sikker på at du vil slette alle nedlastede spor?",
|
||||
"disc": "Plate",
|
||||
"lyrics": "Sangtekster"
|
||||
"lyrics": "Sangtekster",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
@@ -13,16 +13,16 @@
|
||||
"now-playing": "Nu spelend",
|
||||
"onboarding-welcome": "Welkom!",
|
||||
"onboarding-intro": "Fintunes maakt het mogelijk om van waar dan ook je muziek te streamen, met volledige support voor achtergroundaudio en casting.",
|
||||
"onboarding-cta": "Om te starten moet je een Jellyfin server hebben. Klik de onderstaande knop om het adres van je Jellyfin server in te vullen en er in te loggen.",
|
||||
"set-jellyfin-server": "Stel Jellyfin Server in",
|
||||
"set-jellyfin-server-instruction": "Vul alsjeblieft je Jellyfin server URL in. Voeg ook het protocol en de poort toe",
|
||||
"onboarding-cta": "Om te beginnen, heb je een Jellyfin (of Emby)-server nodig. Vul je serveradres in om daarop in te loggen.",
|
||||
"set-server": "Stel server in",
|
||||
"set-server-instruction": "Vul alsjeblieft je server URL in. Voeg ook het protocol en de poort toe",
|
||||
"settings": "Instellingen",
|
||||
"jellyfin-library": "Jellyfin Bibliotheek",
|
||||
"jellyfin-server-url": "Jellyfin Server URL",
|
||||
"jellyfin-access-token": "Jellyfin Toegangstoken",
|
||||
"jellyfin-user-id": "Jellyfin Gebruiker ID",
|
||||
"library": "Bibliotheek",
|
||||
"server-url": "Server URL",
|
||||
"access-token": "Toegangstoken",
|
||||
"user-id": "Gebruiker ID",
|
||||
"setting-cache": "Cache",
|
||||
"setting-cache-description": "Als je Jellyfin bibliotheek geüpdatet hebt, maar de app nog aan elementen uit de cache vasthoudt, kun je de cache geforceerd leegmaken met deze knop. Dit forceert de app om de bibliotheek weer vanaf het begin op te bouwen.",
|
||||
"setting-cache-description": "Als je jouw Jellyfin bibliotheek geüpdatet hebt, maar de app nog aan elementen uit de cache vasthoudt, kun je de cache geforceerd leegmaken met de knop \"Leeg Cache\". Dit forceert de app om de bibliotheek weer vanaf het begin op te bouwen.",
|
||||
"reset-cache": "Leeg Cache",
|
||||
"recent-albums": "Recente Albums",
|
||||
"error-reporting": "Foutmeldingen Rapporteren",
|
||||
@@ -63,7 +63,7 @@
|
||||
"streaming": "Streamen",
|
||||
"total-duration": "Totale duur",
|
||||
"similar-albums": "Vergelijkbare albums",
|
||||
"playback-reporting-description": "Met Playback Reporting worden al uw afspeelgebeurtenissen teruggestuurd naar Jellyfin. Hiermee kunt u uw meest beluisterde nummers volgen, vooral met Jellyfin-plug-ins zoals ListenBrainz.",
|
||||
"playback-reporting-description": "Met afspeelrapportage, word je luistergeschiedenis doorgegeven aan je server. Hierdoor kun je jouw meest geluisterde liedjes volgen, met plug-ins zoals ListenBrainz of LastFM.",
|
||||
"color-scheme-description": "Fintunes volgt standaard het kleurenschema van uw besturingssysteem. U kunt er echter voor kiezen om dit te overschrijven om ervoor te zorgen dat Fintunes altijd in de donkere of lichte modus staat.",
|
||||
"color-scheme": "Kleurenschema",
|
||||
"artists": "Artiesten",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"onboarding-welcome": "Witaj!",
|
||||
"onboarding-intro": "Fintunes umożliwia strumieniowe przesyłanie biblioteki muzycznej z dowolnego miejsca, z pełną obsługą dźwięku w tle i przesyłania.",
|
||||
"set-jellyfin-server": "Ustaw Serwer Jellyfin",
|
||||
"set-server": "Ustaw Serwer Jellyfin",
|
||||
"settings": "Ustawienia",
|
||||
"reset-cache": "Zresetuj pamięć podręczną",
|
||||
"color-scheme-light": "Jasny motyw",
|
||||
@@ -18,12 +18,12 @@
|
||||
"search": "Szukaj",
|
||||
"music": "Muzyka",
|
||||
"now-playing": "Teraz gra",
|
||||
"onboarding-cta": "Aby rozpocząć pracę, potrzebujesz serwera Jellyfin. Kliknij poniższy przycisk, aby wprowadzić adres serwera Jellyfin i zalogować się do niego.",
|
||||
"set-jellyfin-server-instruction": "Wprowadź adres URL serwera Jellyfin. Upewnij się, że podałeś protokół i port",
|
||||
"jellyfin-library": "Biblioteka Jellyfin",
|
||||
"jellyfin-server-url": "URL do serwera Jellyfin",
|
||||
"jellyfin-access-token": "Token dostępowy do Jellyfin",
|
||||
"jellyfin-user-id": "ID użytkownika Jellyfin",
|
||||
"onboarding-cta": "Aby się rozpocząć, potrzebuje serwera Jellyfin (lub Emby). Click the button below to enter your server address and login to it.",
|
||||
"set-server-instruction": "Wprowadź adres URL serwera Jellyfin. Upewnij się, że podałeś protokół i port",
|
||||
"library": "Biblioteka Jellyfin",
|
||||
"server-url": "URL do serwera Jellyfin",
|
||||
"access-token": "Token dostępowy do Jellyfin",
|
||||
"user-id": "ID użytkownika Jellyfin",
|
||||
"setting-cache": "Pamięć podręczna",
|
||||
"setting-cache-description": "Jeśli zaktualizowałeś bibliotekę Jellyfin, ale aplikacja przechowuje zasoby w pamięci podręcznej, możesz wymusić wyczyszczenie pamięci podręcznej za pomocą tego przycisku. Zmusi to aplikację do pobrania biblioteki od zera.",
|
||||
"recent-albums": "Ostatnie Albumy",
|
||||
@@ -65,7 +65,7 @@
|
||||
"total-duration": "Całkowity czas trwania",
|
||||
"similar-albums": "Podobne albumy",
|
||||
"playback-reporting": "Raportowanie odtwarzania",
|
||||
"playback-reporting-description": "Dzięki raportowaniu odtwarzania wszystkie zdarzenia odtwarzania są przekazywane z powrotem do Jellyfin. Umożliwia to śledzenie najczęściej słuchanych utworów, szczególnie przy użyciu wtyczek Jellyfin, takich jak ListenBrainz.",
|
||||
"playback-reporting-description": "Dyrektywa",
|
||||
"color-scheme": "Schemat kolorów",
|
||||
"color-scheme-description": "Domyślnie Fintunes będzie stosować się do schematu kolorów Twojego systemu operacyjnego. Możesz jednak pominąć tę opcję, aby mieć pewność, że Fintunes jest zawsze w trybie ciemnym lub jasnym.",
|
||||
"color-scheme-system": "System",
|
||||
@@ -76,5 +76,9 @@
|
||||
"cancel": "Anuluj",
|
||||
"confirm-delete-all-tracks": "Czy na pewno chcesz usunąć wszystkie aktualnie pobrane utwory?",
|
||||
"disc": "Disc disc",
|
||||
"lyrics": "Tekst utworu"
|
||||
"lyrics": "Tekst",
|
||||
"direct-play": "Dyrektywa",
|
||||
"transcoded": "Transkod",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
@@ -23,16 +23,16 @@
|
||||
"now-playing": "Tocando agora",
|
||||
"onboarding-welcome": "Boas-vindas!",
|
||||
"onboarding-intro": "O Fintunes permite a você fazer streaming de sua biblioteca de músicas de qualquer lugar, com suporte total para reprodução de áudio em segundo plano e transmissão de áudio.",
|
||||
"onboarding-cta": "Para usar o Fintunes, você precisa de um servidor Jellyfin. Clique no botão abaixo para inserir o endereço do servidor Jellyfin e fazer login.",
|
||||
"set-jellyfin-server": "Configurar o servidor Jellyfin",
|
||||
"set-jellyfin-server-instruction": "Insira a URL do servidor Jellyfin. Certifique-se de incluir o protocolo e a porta",
|
||||
"onboarding-cta": "Para começar, você precisa de um servidor Jellyfin (ou Emby). Clique no botão abaixo para inserir o endereço do servidor e iniciá-lo.",
|
||||
"set-server": "Configurar o servidor Jellyfin",
|
||||
"set-server-instruction": "Insira a URL do servidor Jellyfin. Certifique-se de incluir o protocolo e a porta",
|
||||
"settings": "Configurações",
|
||||
"error-reporting-description": "Durante o uso deste aplicativo, você pode encontrar erros. Relatar esses erros ajuda a criar uma experiência de aplicativo mais segura e estável.",
|
||||
"error-reporting-rationale": "Quando você ativa o relatório de erros, toda vez que ocorre um erro, um relatório é criado automaticamente e enviado a um servidor, juntamente com informações úteis de depuração, como dispositivos, versões e o erro específico.",
|
||||
"jellyfin-library": "Biblioteca do Jellyfin",
|
||||
"jellyfin-server-url": "URL do servidor Jellyfin",
|
||||
"jellyfin-access-token": "Token de acesso do Jellyfin",
|
||||
"jellyfin-user-id": "ID de usuário do Jellyfin",
|
||||
"library": "Biblioteca do Jellyfin",
|
||||
"server-url": "URL do servidor Jellyfin",
|
||||
"access-token": "Token de acesso do Jellyfin",
|
||||
"user-id": "ID de usuário do Jellyfin",
|
||||
"setting-cache": "Cache",
|
||||
"setting-cache-description": "Se você atualizou sua biblioteca do Jellyfin, mas o aplicativo continua usando os recursos em cache, você pode forçar a limpeza do cache usando este botão. Isso forçará o aplicativo a recuperar a biblioteca do zero.",
|
||||
"reset-cache": "Redefinir cache",
|
||||
@@ -63,7 +63,7 @@
|
||||
"delete-album": "Excluir álbum",
|
||||
"delete-playlist": "Excluir playlist",
|
||||
"total-download-size": "Tamanho total dos downloads",
|
||||
"playback-reporting-description": "Com o relatório de reprodução, todos os seus eventos de reprodução são retransmitidos para o Jellyfin. Isso permite que você monitore suas músicas mais ouvidas, principalmente com plug-ins do Jellyfin como o ListenBrainz.",
|
||||
"playback-reporting-description": "Jogo direto",
|
||||
"color-scheme": "Tema",
|
||||
"color-scheme-description": "Por padrão, o Fintunes segue o esquema de cores do seu sistema operacional. No entanto, você pode mudar isso, para garantir que o Fintunes fique sempre no modo escuro ou no modo claro.",
|
||||
"color-scheme-system": "Sistema",
|
||||
@@ -76,5 +76,9 @@
|
||||
"delete": "Excluir",
|
||||
"cancel": "Cancelar",
|
||||
"disc": "Disco",
|
||||
"lyrics": "Letras"
|
||||
"lyrics": "Letras",
|
||||
"direct-play": "Jogo direto",
|
||||
"transcoded": "Transcodificado",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
@@ -26,14 +26,14 @@
|
||||
"now-playing": "Сейчас играет",
|
||||
"onboarding-welcome": "Добро пожаловать!",
|
||||
"onboarding-intro": "Fintunes позволит вам транслировать вашу музыкальную библиотеку из любого места с полной поддержкой фонового воспроизведения и трансляций.",
|
||||
"onboarding-cta": "Для начала вам нужен сервер Jellyfin. Нажмите кнопку ниже, чтобы ввести адрес своего сервера Jellyfin и авторизоваться на нем.",
|
||||
"set-jellyfin-server": "Установить сервер Jellyfin",
|
||||
"set-jellyfin-server-instruction": "Пожалуйста, введите URL вашего сервера Jellyfin. Обязательно укажите протокол и порт",
|
||||
"onboarding-cta": "Для начала вам нужен сервер Jellyfin (или Emby). Нажмите на кнопку ниже, чтобы ввести свой адрес сервера и войти в него.",
|
||||
"set-server": "Установить сервер Jellyfin",
|
||||
"set-server-instruction": "Пожалуйста, введите URL вашего сервера Jellyfin. Обязательно укажите протокол и порт",
|
||||
"settings": "Настройки",
|
||||
"jellyfin-library": "Библиотека Jellyfin",
|
||||
"jellyfin-server-url": "URL сервера Jellyfin",
|
||||
"jellyfin-access-token": "Токен доступа Jellyfin",
|
||||
"jellyfin-user-id": "Идентификатор пользователя Jellyfin",
|
||||
"library": "Библиотека Jellyfin",
|
||||
"server-url": "URL сервера Jellyfin",
|
||||
"access-token": "Токен доступа Jellyfin",
|
||||
"user-id": "Идентификатор пользователя Jellyfin",
|
||||
"setting-cache": "Кэш",
|
||||
"setting-cache-description": "Если вы обновили свою библиотеку Jellyfin, но приложение сохраняет кэшированные ресурсы, вы можете принудительно очистить кэш с помощью этой кнопки. Это заставит приложение обновить библиотеку.",
|
||||
"reset-cache": "Сбросить кеш",
|
||||
@@ -42,7 +42,7 @@
|
||||
"error-reporting-description": "Во время использования этого приложения вы можете столкнуться с ошибками. Сообщение об этих ошибках помогает сделать приложение более безопасным и стабильным.",
|
||||
"error-reporting-rationale": "Когда вы включаете создание отчетов об ошибках, при каждом возникновении ошибки автоматически создается отчет и отправляется на сервер вместе с полезной отладочной информацией, такой как устройства, версии и конкретная ошибка.",
|
||||
"why-use-tracking": "Зачем использовать отслеживание?",
|
||||
"why-use-tracking-description": "Отслеживание помогает ускорить разработку этого приложения, сообщая о странных случаях и надзорах. Это помогает сделать приложение более стабильным и надежным, тем самым улучшая опыт приложений для всех.",
|
||||
"why-use-tracking-description": "Отслеживание помогает ускорить разработку этого приложения, сообщая о странных случаях и упущениях. Это помогает сделать приложение более стабильным и надежным, тем самым повышая удобство работы с приложением для всех.",
|
||||
"what-data-is-gathered": "Какие данные собираются?",
|
||||
"what-data-is-gathered-description": "Мы собираем ошибки, тип устройства, версию ОС, версию приложения и идентификатор устройства. Ни в одном отчете об ошибках не передается состояние приложения. Идентификатор устройства - это уникальный хэш, который можно сбросить в настройках вашего устройства, и мы не можем извлечь какую-либо личную информацию из этого идентификатора.",
|
||||
"where-is-data-stored": "Где хранятся данные?",
|
||||
@@ -63,7 +63,7 @@
|
||||
"total-duration": "Общая продолжительность",
|
||||
"similar-albums": "Похожие альбомы",
|
||||
"playback-reporting": "Отчет о воспроизведении",
|
||||
"playback-reporting-description": "С помощью отчетов о воспроизведении все ваши события воспроизведения передаются обратно в Jellyfin. Это позволяет вам отслеживать ваши наиболее прослушиваемые песни, особенно с помощью плагинов Jellyfin, таких как ListenBrainz.",
|
||||
"playback-reporting-description": "Прямая игра",
|
||||
"color-scheme": "Цветовая тема",
|
||||
"color-scheme-description": "По умолчанию, Fintunes будет следовать цветовой теме вашей операционной системы. Однако вы можете переназначить это, чтобы Fintunes всегда находился в темной или светлой теме.",
|
||||
"color-scheme-system": "Система",
|
||||
@@ -76,5 +76,9 @@
|
||||
"delete": "Удалить",
|
||||
"cancel": "Отмена",
|
||||
"disc": "Disc",
|
||||
"lyrics": "Текст песни"
|
||||
"lyrics": "Текст песни",
|
||||
"direct-play": "Прямая игра",
|
||||
"transcoded": "Transcode",
|
||||
"khz": "кГц",
|
||||
"kbps": "кбит/с"
|
||||
}
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
"search": "Iskanje",
|
||||
"music": "Glasba",
|
||||
"now-playing": "Zdaj igra",
|
||||
"set-jellyfin-server": "Nastavite strežnik Jellyfin",
|
||||
"set-jellyfin-server-instruction": "Vnesite URL svojega strežnika Jellyfin. Ne pozabite vključiti protokola in vrat",
|
||||
"set-server": "Nastavite strežnik Jellyfin",
|
||||
"set-server-instruction": "Vnesite URL svojega strežnika Jellyfin. Ne pozabite vključiti protokola in vrat",
|
||||
"settings": "Nastavitve",
|
||||
"jellyfin-library": "Knjižnica Jellyfin",
|
||||
"jellyfin-server-url": "URL strežnika Jellyfin",
|
||||
"jellyfin-access-token": "Žeton za dostop Jellyfin",
|
||||
"jellyfin-user-id": "ID uporabnika Jellyfin",
|
||||
"library": "Knjižnica Jellyfin",
|
||||
"server-url": "URL strežnika Jellyfin",
|
||||
"access-token": "Žeton za dostop Jellyfin",
|
||||
"user-id": "ID uporabnika Jellyfin",
|
||||
"setting-cache": "Predpomnilnik",
|
||||
"setting-cache-description": "Če ste posodobili knjižnico Jellyfin, vendar aplikacija zadržuje predpomnjena sredstva, lahko s tem gumbom prisilno počistite predpomnilnik. To bo prisililo aplikacijo, da znova pridobi knjižnico.",
|
||||
"reset-cache": "Ponastavi predpomnilnik",
|
||||
@@ -76,5 +76,7 @@
|
||||
"confirm-delete-all-tracks": "Ali ste prepričani, da želite izbrisati vse trenutno prenesene skladbe?",
|
||||
"delete": "Izbriši",
|
||||
"disc": "Disk",
|
||||
"lyrics": "Besedilo"
|
||||
"lyrics": "Besedilo",
|
||||
"khz": "kHz",
|
||||
"transcoded": "prekodiraj [▲]"
|
||||
}
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
"now-playing": "Nu spelas",
|
||||
"onboarding-welcome": "Välkommen!",
|
||||
"onboarding-intro": "Fintunes låter dig strömma ditt musikbibliotek var som helst, med fullt stöd för bakgrundsljud och casting.",
|
||||
"onboarding-cta": "För att komma igång behöver du en Jellyfin-server. Klicka på knappen nedan för att ange din Jellyfin-serveradress och logga in på den.",
|
||||
"set-jellyfin-server": "Ställ in Jellyfin-server",
|
||||
"set-jellyfin-server-instruction": "Ange din Jellyfin-server-URL. Se till att inkludera protokoll och port",
|
||||
"onboarding-cta": "För att komma igång behöver du en Jellyfin-server. Klicka på knappen nedan för att ange din serveradress och logga in på den.",
|
||||
"set-server": "Ställ in Jellyfin-server",
|
||||
"set-server-instruction": "Ange din Jellyfin-server-URL. Se till att inkludera protokoll och port",
|
||||
"settings": "inställningar",
|
||||
"jellyfin-library": "Jellyfin-bibliotek",
|
||||
"jellyfin-server-url": "Jellyfin Server URL",
|
||||
"jellyfin-access-token": "Jellyfin Access Token",
|
||||
"jellyfin-user-id": "Jellyfin användar-ID",
|
||||
"library": "Jellyfin-bibliotek",
|
||||
"server-url": "Jellyfin Server URL",
|
||||
"access-token": "Jellyfin Access Token",
|
||||
"user-id": "Jellyfin användar-ID",
|
||||
"setting-cache": "Cache",
|
||||
"setting-cache-description": "Om du har uppdaterat ditt Jellyfin-bibliotek men appen håller kvar cachelagrade tillgångar kan du tvångsrensa cachen med den här knappen. Detta kommer att tvinga appen att hämta biblioteket från början.",
|
||||
"reset-cache": "Töm cache",
|
||||
@@ -65,7 +65,7 @@
|
||||
"total-duration": "Total varaktighet",
|
||||
"similar-albums": "Liknande album",
|
||||
"playback-reporting": "Uppspelningsrapportering",
|
||||
"playback-reporting-description": "Med uppspelningsrapportering skickas alla dina uppspelningshändelser tillbaka till Jellyfin. Detta låter dig spåra dina mest lyssnade låtar, särskilt med Jellyfin-plugins som ListenBrainz.",
|
||||
"playback-reporting-description": "Direkt spel",
|
||||
"color-scheme": "Färgschema",
|
||||
"color-scheme-description": "Som standard följer Fintunes ditt operativsystems färgschema. Du kan dock välja att åsidosätta detta för att se till att Fintunes alltid är i mörkt läge eller ljust läge.",
|
||||
"color-scheme-system": "System",
|
||||
@@ -76,5 +76,9 @@
|
||||
"cancel": "Avbokning",
|
||||
"confirm-delete-all-tracks": "Är du säker på att du vill ta bort alla för närvarande nedladdade spår?",
|
||||
"disc": "Disc",
|
||||
"lyrics": "Låttext"
|
||||
"lyrics": "Låttext",
|
||||
"direct-play": "Direkt spel",
|
||||
"transcoded": "Transkoded",
|
||||
"khz": "kHz",
|
||||
"kbps": "kb/s"
|
||||
}
|
||||
|
||||
84
src/localisation/lang/ta/locale.json
Normal file
84
src/localisation/lang/ta/locale.json
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"queue": "வரிசை",
|
||||
"clear-queue": "தெளிவான வரிசை",
|
||||
"no-results": "முடிவுகள் இல்லை…",
|
||||
"album": "ஆல்பம்",
|
||||
"albums": "ஆல்பம்",
|
||||
"search": "தேடல்",
|
||||
"music": "இசை",
|
||||
"enable": "இயக்கு",
|
||||
"delete": "நீக்கு",
|
||||
"now-playing": "இப்போது விளையாடுகிறது",
|
||||
"onboarding-welcome": "வரவேற்கிறோம்!",
|
||||
"settings": "அமைப்புகள்",
|
||||
"library": "நூலகம்",
|
||||
"server-url": "சேவையக முகவரி",
|
||||
"user-id": "பயனர் ஐடி",
|
||||
"setting-cache": "கேச்",
|
||||
"disable": "முடக்கு",
|
||||
"more-info": "மேலும் செய்தி",
|
||||
"track": "மின்தடம்",
|
||||
"playlists": "பிளேலிச்ட்கள்",
|
||||
"playlist": "பிளேலிச்ட்",
|
||||
"shuffle-album": "கலக்கு ஆல்பம்",
|
||||
"downloads": "பதிவிறக்கங்கள்",
|
||||
"delete-track": "தடத்தை நீக்கு",
|
||||
"delete-all-tracks": "எல்லா தடங்களையும் நீக்கு",
|
||||
"delete-playlist": "பிளேலிச்ட்டை நீக்கு",
|
||||
"color-scheme": "வண்ணத் திட்டம்",
|
||||
"color-scheme-system": "மண்டலம்",
|
||||
"color-scheme-light": "ஒளி பயன்முறை",
|
||||
"color-scheme-dark": "இருண்ட முறை",
|
||||
"artists": "கலைஞர்கள்",
|
||||
"privacy-policy": "தனியுரிமைக் கொள்கை",
|
||||
"sleep-timer": "தூக்க நேரங்குறிகருவி",
|
||||
"cancel": "ரத்துசெய்",
|
||||
"disc": "வட்டு",
|
||||
"lyrics": "பாடல்",
|
||||
"khz": "khz",
|
||||
"play-next": "அடுத்து விளையாடுங்கள்",
|
||||
"play-album": "ஆல்பம்",
|
||||
"add-to-queue": "வரிசையில் சேர்க்கவும்",
|
||||
"all-albums": "அனைத்து ஆல்பங்களும்",
|
||||
"onboarding-cta": "தொடங்குவதற்கு, உங்களுக்கு செல்லிஃபின் (அல்லது எம்பி) சேவையகம் தேவை. உங்கள் சேவையக முகவரியை உள்ளிட கீழே உள்ள பொத்தானைக் சொடுக்கு செய்து அதில் உள்நுழைக.",
|
||||
"onboarding-intro": "பின்னணி ஆடியோ மற்றும் வார்ப்புகளுக்கு முழு ஆதரவோடு, உங்கள் இசை நூலகத்தை எங்கிருந்தும் ச்ட்ரீம் செய்ய ஃபிண்டுன்ச் உங்களை அனுமதிக்கும்.",
|
||||
"set-server": "சேவையகத்தை அமைக்கவும்",
|
||||
"set-server-instruction": "உங்கள் சேவையக முகவரி ஐ உள்ளிடவும். நெறிமுறை மற்றும் துறைமுகத்தை சேர்க்க உறுதிப்படுத்தவும்",
|
||||
"access-token": "அணுகல் கிள்ளாக்கு",
|
||||
"setting-cache-description": "உங்கள் நூலகத்தை நீங்கள் புதுப்பித்திருந்தால், ஆனால் பயன்பாடு தற்காலிக சேமிப்பு சொத்துக்களை வைத்திருந்தால், இந்த பொத்தானைப் பயன்படுத்தி தற்காலிக சேமிப்பை நீங்கள் வலுக்கட்டாயமாக அழிக்கலாம். இது புதிதாக நூலகத்தை பெற பயன்பாட்டை கட்டாயப்படுத்தும்.",
|
||||
"reset-cache": "தற்காலிக சேமிப்பை மீட்டமைக்கவும்",
|
||||
"recent-albums": "அண்மைக் கால ஆல்பங்கள்",
|
||||
"error-reporting": "பிழை அறிக்கை",
|
||||
"error-reporting-description": "இந்த பயன்பாட்டின் போது, நீங்கள் பிழைகளை சந்திக்க நேரிடும். இந்த பிழைகளைப் புகாரளிப்பது மிகவும் பாதுகாப்பான மற்றும் நிலையான பயன்பாட்டு அனுபவத்தை உருவாக்க உதவுகிறது.",
|
||||
"error-reporting-rationale": "பிழை அறிக்கையிடலை நீங்கள் இயக்கும்போது, ஒவ்வொரு முறையும் ஒரு பிழை ஏற்படும் போது, ஒரு அறிக்கை தானாகவே உருவாக்கப்பட்டு சேவையகத்திற்கு அனுப்பப்படும், மேலும் சாதனங்கள், பதிப்புகள் மற்றும் குறிப்பிட்ட பிழை போன்ற பயனுள்ள பிழைத்திருத்த தகவலுடன்.",
|
||||
"why-use-tracking": "கண்காணிப்பை ஏன் பயன்படுத்த வேண்டும்?",
|
||||
"why-use-tracking-description": "வித்தியாசமான விளிம்பு வழக்குகள் மற்றும் மேற்பார்வைகளைப் புகாரளிப்பதன் மூலம் இந்த பயன்பாட்டிற்கான வளர்ச்சியை விரைவுபடுத்த உதவுகிறது. இது பயன்பாட்டை மிகவும் நிலையானதாகவும் வலுவானதாகவும் மாற்ற உதவுகிறது, இதனால் அனைவருக்கும் பயன்பாட்டு அனுபவத்தை மேம்படுத்துகிறது.",
|
||||
"what-data-is-gathered": "என்ன தரவு சேகரிக்கப்படுகிறது?",
|
||||
"what-data-is-gathered-description": "பிழை, சாதன வகை, OS பதிப்பு, பயன்பாட்டு பதிப்பு மற்றும் சாதன ஐடி ஆகியவற்றை நாங்கள் பதிவு செய்கிறோம். எந்தவொரு பிழை அறிக்கையிலும் விண்ணப்ப நிலை அனுப்பப்படவில்லை. சாதன ஐடி என்பது உங்கள் சாதன அமைப்புகளில் மீட்டமைக்கக்கூடிய ஒரு தனித்துவமான ஆச் ஆகும், மேலும் இந்த அடையாளங்காட்டியிலிருந்து எந்தவொரு தனிப்பட்ட தகவலையும் எங்களால் குறைக்க முடியாது.",
|
||||
"where-is-data-stored": "தரவு எங்கே சேமிக்கப்படுகிறது?",
|
||||
"where-is-data-stored-description": "சென்ட்ரி பின்தளத்தில் எங்கள் சொந்த உள்கட்டமைப்பில் சுயமாக புரவலன் செய்யப்படுகிறது. சேவையகங்கள், தரவுத்தளங்கள், பயன்பாடு மற்றும் தரவு பதிவுகள், குறைந்தது எந்தவொரு சென்ட்ரி ஊழியர்களுக்கும் அணுகல் இல்லை. உள்கட்டமைப்பு ஐரோப்பிய ஒன்றியத்தில் வழங்கப்படுகிறது.",
|
||||
"enable-error-reporting": "பிழை அறிக்கையிடலை இயக்க விரும்புகிறீர்களா?",
|
||||
"enable-error-reporting-description": "விபத்து மற்றும் பிழை அறிக்கைகளை எங்களுக்கு அனுப்புவதன் மூலம் பயன்பாட்டு அனுபவத்தை மேம்படுத்த இது உதவுகிறது.",
|
||||
"play-playlist": "பிளேலிச்ட்டை விளையாடுங்கள்",
|
||||
"shuffle-playlist": "கலக்கு பிளேலிச்ட்",
|
||||
"download-track": "டிராக் பதிவிறக்க",
|
||||
"download-album": "ஆல்பத்தைப் பதிவிறக்கவும்",
|
||||
"download-playlist": "பிளேலிச்ட்டைப் பதிவிறக்கவும்",
|
||||
"no-downloads": "நீங்கள் இதுவரை எந்த தடங்களையும் பதிவிறக்கம் செய்யவில்லை",
|
||||
"confirm-delete-all-tracks": "தற்போது பதிவிறக்கம் செய்யப்பட்ட அனைத்து தடங்களையும் நீக்க விரும்புகிறீர்களா?",
|
||||
"delete-album": "ஆல்பத்தை நீக்கு",
|
||||
"playback-reporting-description": "பிளேபேக் அறிக்கையிடலுடன், உங்கள் பிளேபேக் நிகழ்வுகள் அனைத்தும் உங்கள் சேவையகத்திற்கு மீண்டும் அனுப்பப்படுகின்றன. இது மிகவும் கேட்கப்பட்ட பாடல்களைக் கண்காணிக்க உங்களை அனுமதிக்கிறது, குறிப்பாக கேட்பது பிரெய்ன்ச் அல்லது லாச்ட்எம் போன்ற செருகுநிரல்களுடன்.",
|
||||
"total-download-size": "மொத்த பதிவிறக்க அளவு",
|
||||
"retry-failed-downloads": "மீண்டும் பதிவிறக்கங்களை மீண்டும் முயற்சிக்கவும்",
|
||||
"you-are-offline-message": "நீங்கள் தற்போது ஆஃப்லைனில் இருக்கிறீர்கள். நீங்கள் முன்பு பதிவிறக்கம் செய்யப்பட்ட இசையை மட்டுமே இயக்க முடியும்.",
|
||||
"playing-on": "விளையாடுவது",
|
||||
"local-playback": "உள்ளக பின்னணி",
|
||||
"streaming": "ச்ட்ரீமிங்",
|
||||
"total-duration": "மொத்த காலம்",
|
||||
"similar-albums": "ஒத்த ஆல்பங்கள்",
|
||||
"playback-reporting": "பின்னணி அறிக்கை",
|
||||
"color-scheme-description": "இயல்பாக, உங்கள் இயக்க முறைமையின் வண்ணத் திட்டத்தை FINTUNES பின்பற்றும். இருப்பினும் நீங்கள் இதை மேலெழுத தேர்வு செய்யலாம் fintunes எப்போதும் இருண்ட பயன்முறையில் அல்லது ஒளி பயன்முறையில் இருப்பதை உறுதிப்படுத்தலாம்.",
|
||||
"direct-play": "நேரடி நாடகம்",
|
||||
"transcoded": "டிரான்ச்கோடட்",
|
||||
"kbps": "கே.பி.பி.எச்"
|
||||
}
|
||||
@@ -13,16 +13,16 @@
|
||||
"now-playing": "Зараз грає",
|
||||
"onboarding-welcome": "Ласкаво просимо!",
|
||||
"onboarding-intro": "Fintunes дозволить вам транслювати свою музичну бібліотеку з будь-якого місця з повною підтримкою фонового звуку та трансляції.",
|
||||
"onboarding-cta": "Щоб почати, вам потрібен сервер Jellyfin. Натисніть кнопку нижче, щоб ввести адресу свого сервера Jellyfin і увійти на нього.",
|
||||
"set-jellyfin-server": "Встановити сервер Jellyfin",
|
||||
"set-jellyfin-server-instruction": "Будь ласка, введіть URL-адресу вашого сервера Jellyfin. Не забудьте вказати протокол і порт",
|
||||
"onboarding-cta": "Для того, щоб розпочати роботу, потрібно сервер Jellyfin (або Emby) Натисніть кнопку нижче, щоб ввести адресу сервера і увійти до неї.",
|
||||
"set-server": "Встановити сервер Jellyfin",
|
||||
"set-server-instruction": "Будь ласка, введіть URL-адресу вашого сервера Jellyfin. Не забудьте вказати протокол і порт",
|
||||
"settings": "Налаштування",
|
||||
"jellyfin-library": "Бібліотека Jellyfin",
|
||||
"jellyfin-server-url": "URL-адреса сервера Jellyfin",
|
||||
"jellyfin-access-token": "Токен доступу Jellyfin",
|
||||
"jellyfin-user-id": "ID користувача Jellyfin",
|
||||
"library": "Бібліотека Jellyfin",
|
||||
"server-url": "URL-адреса сервера Jellyfin",
|
||||
"access-token": "Токен доступу Jellyfin",
|
||||
"user-id": "ID користувача Jellyfin",
|
||||
"setting-cache": "Кеш",
|
||||
"setting-cache-description": "Якщо ви оновили свою бібліотеку Jellyfin, але застосунок зберігає кешовані ресурси, ви можете примусово очистити кеш за допомогою цієї кнопки. Це змусить застосунок отримати бібліотеку з нуля.",
|
||||
"setting-cache-description": "Якщо ви оновили свою бібліотеку, але застосунок зберігає кешовані ресурси, ви можете примусово очистити кеш за допомогою цієї кнопки. Це змусить застосунок отримати бібліотеку з нуля.",
|
||||
"reset-cache": "Скинути кеш",
|
||||
"recent-albums": "Останні альбоми",
|
||||
"error-reporting": "Звіт про помилку",
|
||||
@@ -50,7 +50,7 @@
|
||||
"total-duration": "Загальна тривалість",
|
||||
"similar-albums": "Схожі альбоми",
|
||||
"playback-reporting": "Звіт про відтворення",
|
||||
"playback-reporting-description": "Завдяки звіту про відтворення всі ваші події відтворення передаються назад до Jellyfin. Це дозволяє відстежувати пісні, які ви найчастіше слухаєте, зокрема за допомогою плаґінів Jellyfin, таких як ListenBrainz.",
|
||||
"playback-reporting-description": "З повідомленням відтворення, всі ваші події відтворюються назад на сервер. Це дозволяє відслідковувати свої найслуховіші пісні, зокрема, плагіни, такі як RadioBrainz або LastFM.",
|
||||
"color-scheme": "Кольорова схема",
|
||||
"color-scheme-description": "За замовчуванням Fintunes дотримуватиметься колірної схеми вашої операційної системи. Однак ви можете змінити це, щоб Fintunes завжди перебував у темному або світлому режимі.",
|
||||
"color-scheme-system": "Системна",
|
||||
@@ -76,5 +76,9 @@
|
||||
"delete": "Видалити",
|
||||
"cancel": "Скасувати",
|
||||
"disc": "Диски",
|
||||
"lyrics": "Лірика"
|
||||
"lyrics": "Текст пісень",
|
||||
"direct-play": "Пряме відтворення",
|
||||
"transcoded": "Перекодований",
|
||||
"khz": "кГц",
|
||||
"kbps": "кбіт/с"
|
||||
}
|
||||
|
||||
@@ -13,16 +13,16 @@
|
||||
"now-playing": "正在播放",
|
||||
"onboarding-welcome": "欢迎",
|
||||
"onboarding-intro": "Fintunes可以在任何地方播放Jellyfin库中的音乐。",
|
||||
"onboarding-cta": "在开始前,你需要一个Jellyfin服务器。点击下方的按钮连接到服务器并登录。",
|
||||
"set-jellyfin-server": "设置Jellyfin服务器",
|
||||
"set-jellyfin-server-instruction": "设置Jellyfin服务器的完整网址,包括HTTP/HTTS和端口。",
|
||||
"onboarding-cta": "首先,您需要一个 Jellyfin(或 Emby)服务器。单击下面的按钮输入您的服务器地址并登录。",
|
||||
"set-server": "设置Jellyfin服务器",
|
||||
"set-server-instruction": "设置Jellyfin服务器的完整网址,包括HTTP/HTTS和端口。",
|
||||
"settings": "设置",
|
||||
"jellyfin-library": "Jellyfin库",
|
||||
"jellyfin-server-url": "Jellyfin服务器网址",
|
||||
"jellyfin-access-token": "Jellyfin Access Token",
|
||||
"jellyfin-user-id": "Jellyfin用户ID",
|
||||
"library": "Jellyfin库",
|
||||
"server-url": "Jellyfin服务器网址",
|
||||
"access-token": "Jellyfin Access Token",
|
||||
"user-id": "Jellyfin用户ID",
|
||||
"setting-cache": "缓存",
|
||||
"setting-cache-description": "如果你更新了Jellyfin库,但软件仍显示之前的内容,你可以点击下面的按钮强制刷新。这将强制软件重新从服务器获取信息。",
|
||||
"setting-cache-description": "如果您已更新库,但应用仍保留缓存的资源,则可以使用此按钮强制清除缓存。这将强制应用从头开始获取库。",
|
||||
"reset-cache": "清除缓存",
|
||||
"recent-albums": "最近专辑",
|
||||
"error-reporting": "报告错误",
|
||||
@@ -68,13 +68,17 @@
|
||||
"color-scheme-system": "系统",
|
||||
"artists": "艺术家",
|
||||
"color-scheme-dark": "深色模式",
|
||||
"playback-reporting-description": "借助回放报告,您的所有回放事件都会转发回 Jellyfin。这使您可以跟踪您最常听的歌曲,尤其是使用 ListenBrainz 等 Jellyfin 插件时。",
|
||||
"playback-reporting-description": "使用播放报告,您的所有播放事件都会被转发回您的服务器。这让您可以跟踪您最常听的歌曲,特别是使用 ListenBrainz 或 LastFM 等插件时。",
|
||||
"color-scheme-light": "灯光模式",
|
||||
"privacy-policy": "隐私政策",
|
||||
"sleep-timer": "睡眠定时器",
|
||||
"confirm-delete-all-tracks": "您确定要删除所有当前下载的曲目吗?",
|
||||
"delete": "删除",
|
||||
"cancel": "取消",
|
||||
"disc": "歧视",
|
||||
"lyrics": "歌词"
|
||||
"disc": "光盘",
|
||||
"lyrics": "歌词",
|
||||
"direct-play": "直接播放",
|
||||
"transcoded": "转码",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps"
|
||||
}
|
||||
|
||||
84
src/localisation/lang/zh_Hant/locale.json
Normal file
84
src/localisation/lang/zh_Hant/locale.json
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"play-next": "播放下一首",
|
||||
"onboarding-welcome": "歡迎!",
|
||||
"settings": "設定",
|
||||
"library": "音樂庫",
|
||||
"server-url": "伺服器 URL",
|
||||
"access-token": "存取令牌",
|
||||
"user-id": "使用者 ID",
|
||||
"setting-cache": "快取",
|
||||
"error-reporting": "錯誤報告",
|
||||
"enable": "啟用",
|
||||
"disable": "停用",
|
||||
"more-info": "更多資訊",
|
||||
"track": "音軌",
|
||||
"playlists": "播放清單",
|
||||
"playlist": "播放清單",
|
||||
"shuffle-playlist": "隨機播放清單",
|
||||
"downloads": "下載",
|
||||
"delete-track": "刪除音軌",
|
||||
"total-duration": "總播放時長",
|
||||
"color-scheme": "色調配置",
|
||||
"color-scheme-system": "系統",
|
||||
"color-scheme-dark": "深色模式",
|
||||
"khz": "kHz",
|
||||
"kbps": "kbps",
|
||||
"queue": "佇列",
|
||||
"add-to-queue": "加入佇列",
|
||||
"clear-queue": "清除佇列",
|
||||
"no-results": "沒找到結果…",
|
||||
"album": "專輯",
|
||||
"albums": "專輯",
|
||||
"all-albums": "全部專輯",
|
||||
"search": "搜尋",
|
||||
"music": "音樂",
|
||||
"now-playing": "正在播放",
|
||||
"artists": "藝術家",
|
||||
"privacy-policy": "隱私權政策",
|
||||
"sleep-timer": "睡眠倒數",
|
||||
"delete": "刪除",
|
||||
"cancel": "取消",
|
||||
"disc": "碟片",
|
||||
"lyrics": "歌詞",
|
||||
"onboarding-intro": "Fintunes 將允許您從任何地方流式傳輸您的音樂庫,並完全支援背景播放和投放。",
|
||||
"onboarding-cta": "為了開始,您需要一個Jellyfin(或Emby)伺服器。 點選下面的按鈕輸入您的伺服器地址並登入。",
|
||||
"set-server": "設定伺服器",
|
||||
"set-server-instruction": "請輸入您的伺服器 URL。 確保包括協議和端口",
|
||||
"setting-cache-description": "如果您已經更新了音樂庫,但應用程式保留了快取的資料,您可以使用此按鈕強制清除快取。 這將迫使應用程式從頭開始獲取音樂庫資料。",
|
||||
"reset-cache": "重設快取",
|
||||
"recent-albums": "最近的專輯",
|
||||
"error-reporting-description": "在使用此應用程式時,您可能會遇到錯誤。 報告這些錯誤有助於建立更安全、更穩定的應用程式體驗。",
|
||||
"error-reporting-rationale": "當您啟用錯誤報告時,每次出現錯誤時,都會自動建立報告併發送到伺服器,以及有用的除錯資訊,如裝置、版本和特定錯誤。",
|
||||
"what-data-is-gathered-description": "我們記錄錯誤、裝置型別、作業系統版本、應用程式版本和裝置ID。 在任何錯誤報告中都不會傳送應用程式狀態。 裝置ID是一個唯一的雜湊,可以在您的裝置設定中重置,我們無法從此識別符號中推斷出任何個人資訊。",
|
||||
"where-is-data-stored": "資料儲存在哪裡?",
|
||||
"where-is-data-stored-description": "Sentry 的後端部署在我們自有的基礎設施上,只有我們能夠訪問伺服器、資料庫、應用程序和數據日誌,Sentry 的員工更無法接觸到。基礎設施托管於歐盟境內。",
|
||||
"enable-error-reporting": "您想啟用錯誤報告嗎?",
|
||||
"play-playlist": "播放播放清單",
|
||||
"shuffle-album": "隨機專輯",
|
||||
"download-track": "下載音軌",
|
||||
"download-album": "下載專輯",
|
||||
"download-playlist": "下載播放清單",
|
||||
"no-downloads": "您尚未下載任何曲目",
|
||||
"delete-all-tracks": "删除所有音軌",
|
||||
"confirm-delete-all-tracks": "您確定要刪除所有當前下載的曲目嗎?",
|
||||
"delete-album": "删除專輯",
|
||||
"delete-playlist": "删除播放清單",
|
||||
"total-download-size": "總下載大小",
|
||||
"retry-failed-downloads": "重試下載失敗",
|
||||
"you-are-offline-message": "您當前離線。 您只能播放之前下載的音樂。",
|
||||
"playing-on": "播放 在",
|
||||
"local-playback": "本地回放",
|
||||
"streaming": "串流",
|
||||
"similar-albums": "相似專輯",
|
||||
"playback-reporting": "播放報告",
|
||||
"playback-reporting-description": "透過播放報告,您的所有播放事件都會轉發回您的伺服器。 這允許您跟蹤收聽最多的歌曲,特別是使用ListenBrainz或LastFM等外掛。",
|
||||
"color-scheme-description": "預設情況下,Fintunes將遵循您作業系統的配色方案。 然而,您可以選擇覆蓋此選項,以確保Fintunes始終處於深色或淺色模式。",
|
||||
"color-scheme-light": "淺色模式",
|
||||
"direct-play": "直接播放",
|
||||
"transcoded": "已轉碼",
|
||||
"play-album": "播放專輯",
|
||||
"why-use-tracking": "為什麼要使用跟蹤?",
|
||||
"why-use-tracking-description": "跟蹤透過報告奇怪的邊緣案例和疏忽來幫助加快此應用程式的開發。 這有助於使應用程式更加穩定和強大,從而改善每個人的應用程式體驗。",
|
||||
"what-data-is-gathered": "收集了哪些資料?",
|
||||
"enable-error-reporting-description": "這透過向我們傳送崩潰和錯誤報告來幫助改善應用程式體驗。"
|
||||
}
|
||||
@@ -13,13 +13,13 @@ export type LocaleKeys = 'play-next'
|
||||
| 'onboarding-welcome'
|
||||
| 'onboarding-intro'
|
||||
| 'onboarding-cta'
|
||||
| 'set-jellyfin-server'
|
||||
| 'set-jellyfin-server-instruction'
|
||||
| 'set-server'
|
||||
| 'set-server-instruction'
|
||||
| 'settings'
|
||||
| 'jellyfin-library'
|
||||
| 'jellyfin-server-url'
|
||||
| 'jellyfin-access-token'
|
||||
| 'jellyfin-user-id'
|
||||
| 'library'
|
||||
| 'server-url'
|
||||
| 'access-token'
|
||||
| 'user-id'
|
||||
| 'setting-cache'
|
||||
| 'setting-cache-description'
|
||||
| 'reset-cache'
|
||||
|
||||
@@ -11,11 +11,11 @@ import Button from '@/components/Button';
|
||||
import DownloadIcon from '@/components/DownloadIcon';
|
||||
import styled from 'styled-components/native';
|
||||
import { Text } from '@/components/Typography';
|
||||
import FastImage from 'react-native-fast-image';
|
||||
import { useGetImage } from '@/utility/JellyfinApi/lib';
|
||||
import { ShadowWrapper } from '@/components/Shadow';
|
||||
import { SafeFlatList } from '@/components/SafeNavigatorView';
|
||||
import { t } from '@/localisation';
|
||||
import BaseAlbumImage from '../Music/stacks/components/AlbumImage';
|
||||
|
||||
const DownloadedTrack = styled.View`
|
||||
flex: 1 0 auto;
|
||||
@@ -25,7 +25,7 @@ const DownloadedTrack = styled.View`
|
||||
margin: 0 20px;
|
||||
`;
|
||||
|
||||
const AlbumImage = styled(FastImage)`
|
||||
const AlbumImage = styled(BaseAlbumImage)`
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
border-radius: 4px;
|
||||
@@ -136,7 +136,7 @@ function Downloads() {
|
||||
<DownloadedTrack>
|
||||
<View style={{ marginRight: 12 }}>
|
||||
<ShadowWrapper size="small">
|
||||
<AlbumImage source={{ uri: getImage(item as string) }} style={defaultStyles.imageBackground} />
|
||||
<AlbumImage source={{ uri: getImage(item) }} style={defaultStyles.imageBackground} />
|
||||
</ShadowWrapper>
|
||||
</View>
|
||||
<View style={{ flexShrink: 1, marginRight: 8 }}>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import React, { useCallback, useEffect, useRef } from 'react';
|
||||
import React, { useCallback, useContext, useEffect, useRef } from 'react';
|
||||
import { ActivityIndicator, Animated, Dimensions, Platform, Pressable, View } from 'react-native';
|
||||
import FastImage from 'react-native-fast-image';
|
||||
import styled, { css } from 'styled-components/native';
|
||||
|
||||
import PlayIcon from '@/assets/icons/play.svg';
|
||||
@@ -16,8 +15,9 @@ import { useNavigation } from '@react-navigation/native';
|
||||
import { calculateProgressTranslation } from '@/components/Progresstrack';
|
||||
import { NavigationProp } from '@/screens/types';
|
||||
import { ShadowWrapper } from '@/components/Shadow';
|
||||
import { useBottomTabBarHeight } from '@react-navigation/bottom-tabs';
|
||||
import { BottomTabBarHeightContext } from '@react-navigation/bottom-tabs';
|
||||
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
||||
import AlbumImage from '../../stacks/components/AlbumImage';
|
||||
|
||||
export const NOW_PLAYING_POPOVER_MARGIN = 6;
|
||||
export const NOW_PLAYING_POPOVER_WIDTH = Dimensions.get('screen').width - 2 * NOW_PLAYING_POPOVER_MARGIN;
|
||||
@@ -62,7 +62,7 @@ const ShadowOverlay = styled.View`
|
||||
bottom: 0;
|
||||
`;
|
||||
|
||||
const Cover = styled(FastImage)`
|
||||
const Cover = styled(AlbumImage)`
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
border-radius: 4px;
|
||||
@@ -112,7 +112,13 @@ function NowPlaying({ offset = 0, inset }: { offset?: number, inset?: boolean })
|
||||
const { index, track } = useCurrentTrack();
|
||||
const { buffered, position } = useProgress();
|
||||
const defaultStyles = useDefaultStyles();
|
||||
const tabBarHeight = useBottomTabBarHeight();
|
||||
|
||||
// The regular `useBottomTabBarHeight` hook will throw an error when it
|
||||
// cannot find a height. Since we might use this component in places where
|
||||
// it is unavailable, we'll just use the context directly, which will output
|
||||
// `undefined` when it's not set.
|
||||
const tabBarHeight = useContext(BottomTabBarHeightContext);
|
||||
|
||||
const insets = useSafeAreaInsets();
|
||||
const previousBuffered = usePrevious(buffered);
|
||||
const previousPosition = usePrevious(position);
|
||||
|
||||
@@ -2,7 +2,7 @@ import React, { useCallback, useEffect } from 'react';
|
||||
import { useRoute, RouteProp, useNavigation } from '@react-navigation/native';
|
||||
import { useAppDispatch, useTypedSelector } from '@/store';
|
||||
import TrackListView from './components/TrackListView';
|
||||
import { fetchAlbum, fetchTracksByAlbum } from '@/store/music/actions';
|
||||
import { fetchAlbum, fetchSimilarAlbums, fetchTracksByAlbum } from '@/store/music/actions';
|
||||
import { differenceInDays } from 'date-fns';
|
||||
import { ALBUM_CACHE_AMOUNT_OF_DAYS } from '@/CONSTANTS';
|
||||
import { t } from '@/localisation';
|
||||
@@ -33,7 +33,7 @@ function SimilarAlbum({ id }: { id: string }) {
|
||||
const handlePress = useCallback(() => {
|
||||
album && navigation.push('Album', { id, album });
|
||||
}, [id, album, navigation]);
|
||||
|
||||
|
||||
return (
|
||||
<Pressable
|
||||
style={({ pressed }) => ({
|
||||
@@ -43,7 +43,7 @@ function SimilarAlbum({ id }: { id: string }) {
|
||||
})}
|
||||
onPress={handlePress}
|
||||
>
|
||||
<Cover key={id} source={{ uri: getImage(id) }} />
|
||||
<Cover key={id} source={{ uri: getImage(album) }} />
|
||||
<Text numberOfLines={1} style={{ fontSize: 13, marginBottom: 2 }}>{album?.Name}</Text>
|
||||
<Text numberOfLines={1} style={{ opacity: 0.5, fontSize: 13 }}>{album?.Artists.join(', ')}</Text>
|
||||
</Pressable>
|
||||
@@ -62,6 +62,7 @@ const Album: React.FC = () => {
|
||||
const refresh = useCallback(() => {
|
||||
dispatch(fetchTracksByAlbum(id));
|
||||
dispatch(fetchAlbum(id));
|
||||
dispatch(fetchSimilarAlbums(id));
|
||||
}, [id, dispatch]);
|
||||
|
||||
// Auto-fetch the track data periodically
|
||||
@@ -76,7 +77,7 @@ const Album: React.FC = () => {
|
||||
trackIds={albumTracks || []}
|
||||
title={album?.Name}
|
||||
artist={album?.AlbumArtist}
|
||||
entityId={id}
|
||||
entityId={album?.PrimaryImageItemId || album.Id}
|
||||
refresh={refresh}
|
||||
playButtonText={t('play-album')}
|
||||
shuffleButtonText={t('shuffle-album')}
|
||||
|
||||
@@ -149,7 +149,7 @@ const Albums: React.FC = () => {
|
||||
<GeneratedAlbumItem
|
||||
key={id}
|
||||
id={id}
|
||||
imageUrl={getImage(id as string)}
|
||||
imageUrl={getImage(albums[id])}
|
||||
name={albums[id]?.Name || ''}
|
||||
artist={albums[id]?.AlbumArtist || ''}
|
||||
onPress={selectAlbum}
|
||||
|
||||
@@ -68,7 +68,7 @@ const Artist: React.FC = () => {
|
||||
<GeneratedAlbumItem
|
||||
key={id}
|
||||
id={id}
|
||||
imageUrl={getImage(id as string)}
|
||||
imageUrl={getImage(albums[id])}
|
||||
name={albums[id]?.Name || ''}
|
||||
artist={albums[id]?.AlbumArtist || ''}
|
||||
onPress={selectAlbum}
|
||||
|
||||
@@ -178,7 +178,7 @@ const Artists: React.FC = () => {
|
||||
key={item.Id}
|
||||
item={item}
|
||||
onPress={selectArtist}
|
||||
imageURL={getImage(item.Id)}
|
||||
imageURL={getImage(item)}
|
||||
/>
|
||||
</View>
|
||||
);
|
||||
|
||||
@@ -70,14 +70,14 @@ const Playlists: React.FC = () => {
|
||||
<View style={{ flexDirection: 'row', marginLeft: 10, marginRight: 10 }} key={item}>
|
||||
<GeneratedPlaylistItem
|
||||
id={item}
|
||||
imageUrl={getImage(item as string)}
|
||||
imageUrl={getImage(entities[item])}
|
||||
name={entities[item]?.Name || ''}
|
||||
onPress={selectAlbum}
|
||||
/>
|
||||
{nextItem &&
|
||||
<GeneratedPlaylistItem
|
||||
id={nextItemId}
|
||||
imageUrl={getImage(nextItemId as string)}
|
||||
imageUrl={getImage(nextItem)}
|
||||
name={nextItem.Name || ''}
|
||||
onPress={selectAlbum}
|
||||
/>
|
||||
|
||||
@@ -39,9 +39,15 @@ const NavigationHeader: React.FC = () => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<ListButton onPress={handleAllAlbumsClick} testID="all-albums">{t('all-albums')}</ListButton>
|
||||
<ListButton onPress={handleArtistsClick} testID="artists">{t('artists')}</ListButton>
|
||||
<ListButton onPress={handlePlaylistsClick} testID="playlists">{t('playlists')}</ListButton>
|
||||
<ListButton onPress={handleAllAlbumsClick} testID="all-albums">
|
||||
{t('all-albums')}
|
||||
</ListButton>
|
||||
<ListButton onPress={handleArtistsClick} testID="artists">
|
||||
{t('artists')}
|
||||
</ListButton>
|
||||
<ListButton onPress={handlePlaylistsClick} testID="playlists">
|
||||
{t('playlists')}
|
||||
</ListButton>
|
||||
<ListContainer>
|
||||
<HeaderContainer>
|
||||
<Header>{t('recent-albums')}</Header>
|
||||
@@ -86,7 +92,7 @@ const RecentAlbums: React.FC = () => {
|
||||
<TouchableHandler id={item} onPress={selectAlbum} testID={`select-album-${item}`}>
|
||||
<AlbumItem>
|
||||
<ShadowWrapper size="medium">
|
||||
<AlbumImage source={{ uri: getImage(item) }} style={defaultStyles.imageBackground} />
|
||||
<AlbumImage source={{ uri: getImage(albums[item]) }} style={defaultStyles.imageBackground} />
|
||||
</ShadowWrapper>
|
||||
<Text style={defaultStyles.text} numberOfLines={1}>{albums[item]?.Name}</Text>
|
||||
<Text style={defaultStyles.textHalfOpacity} numberOfLines={1}>{albums[item]?.AlbumArtist}</Text>
|
||||
|
||||
@@ -114,7 +114,7 @@ const TrackListView: React.FC<TrackListViewProps> = ({
|
||||
return [['0', trackIds]];
|
||||
}
|
||||
|
||||
const groups = groupBy(trackIds, (id) => tracks[id].ParentIndexNumber);
|
||||
const groups = groupBy(trackIds, (id) => tracks[id]?.ParentIndexNumber);
|
||||
return Object.entries(groups);
|
||||
}, [trackIds, tracks, listNumberingStyle]);
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ const Logo = styled.Image`
|
||||
|
||||
function Onboarding() {
|
||||
// Get account from Redux and dispatcher
|
||||
const account = useTypedSelector(state => state.settings.jellyfin);
|
||||
const account = useTypedSelector(state => state.settings.credentials);
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
// Also retrieve the navigation handler so that we can open the modal in
|
||||
@@ -71,7 +71,7 @@ function Onboarding() {
|
||||
</Text>
|
||||
<ButtonContainer>
|
||||
<Button
|
||||
title={t('set-jellyfin-server')}
|
||||
title={t('set-server')}
|
||||
onPress={handleClick}/>
|
||||
</ButtonContainer>
|
||||
</TextContainer>
|
||||
|
||||
@@ -9,7 +9,6 @@ import { FlatList } from 'react-native-gesture-handler';
|
||||
import TouchableHandler from '@/components/TouchableHandler';
|
||||
import { useNavigation } from '@react-navigation/native';
|
||||
import { useGetImage } from '@/utility/JellyfinApi/lib';
|
||||
import FastImage from 'react-native-fast-image';
|
||||
import { t } from '@/localisation';
|
||||
import useDefaultStyles, { ColoredBlurView } from '@/components/Colors';
|
||||
import { searchAndFetchAlbums } from '@/store/music/actions';
|
||||
@@ -22,6 +21,7 @@ import { ShadowWrapper } from '@/components/Shadow';
|
||||
import { useKeyboardHeight } from '@/utility/useKeyboardHeight';
|
||||
import { NavigationProp } from '@/screens/types';
|
||||
import { useNavigationOffsets } from '@/components/SafeNavigatorView';
|
||||
import BaseAlbumImage from '@/screens/Music/stacks/components/AlbumImage';
|
||||
// import MicrophoneIcon from '@/assets/icons/microphone.svg';
|
||||
// import AlbumIcon from '@/assets/icons/collection.svg';
|
||||
// import TrackIcon from '@/assets/icons/note.svg';
|
||||
@@ -52,7 +52,7 @@ const Loading = styled.View`
|
||||
justify-content: center;
|
||||
`;
|
||||
|
||||
const AlbumImage = styled(FastImage)`
|
||||
const AlbumImage = styled(BaseAlbumImage)`
|
||||
border-radius: 4px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
@@ -298,7 +298,7 @@ export default function Search() {
|
||||
<TouchableHandler<string> id={album.Id} onPress={selectAlbum} testID={`search-result-${album.Id}`}>
|
||||
<SearchResult>
|
||||
<ShadowWrapper>
|
||||
<AlbumImage source={{ uri: getImage(album.Id) }} style={defaultStyles.imageBackground} />
|
||||
<AlbumImage source={{ uri: getImage(album) }} style={defaultStyles.imageBackground} />
|
||||
</ShadowWrapper>
|
||||
<View style={{ flex: 1 }}>
|
||||
<Text numberOfLines={1}>
|
||||
|
||||
@@ -27,7 +27,7 @@ export function SettingsList() {
|
||||
|
||||
return (
|
||||
<SafeScrollView>
|
||||
<ListButton onPress={handleLibraryClick}>{t('jellyfin-library')}</ListButton>
|
||||
<ListButton onPress={handleLibraryClick}>{t('library')}</ListButton>
|
||||
<ListButton onPress={handleCacheClick}>{t('setting-cache')}</ListButton>
|
||||
<ListButton onPress={handleSentryClick}>{t('error-reporting')}</ListButton>
|
||||
<ListButton onPress={handlePlaybackReportingClick}>{t('playback-reporting')}</ListButton>
|
||||
@@ -50,7 +50,7 @@ export default function Settings() {
|
||||
headerBackground: () => <ColoredBlurView style={StyleSheet.absoluteFill} />,
|
||||
}}>
|
||||
<Stack.Screen name="SettingList" component={SettingsList} options={{ headerTitle: t('settings') }} />
|
||||
<Stack.Screen name="Library" component={Library} options={{ headerTitle: t('jellyfin-library') }} />
|
||||
<Stack.Screen name="Library" component={Library} options={{ headerTitle: t('library') }} />
|
||||
<Stack.Screen name="Cache" component={Cache} options={{ headerTitle: t('setting-cache') }} />
|
||||
<Stack.Screen name="Sentry" component={Sentry} options={{ headerTitle: t('error-reporting') }} />
|
||||
<Stack.Screen name="Playback Reporting" component={PlaybackReporting} options={{ headerTitle: t('playback-reporting')}} />
|
||||
|
||||
@@ -11,25 +11,25 @@ import { InputContainer, Input } from '../components/Input';
|
||||
|
||||
export default function LibrarySettings() {
|
||||
const defaultStyles = useDefaultStyles();
|
||||
const { jellyfin } = useTypedSelector(state => state.settings);
|
||||
const { credentials } = useTypedSelector(state => state.settings);
|
||||
const navigation = useNavigation<NavigationProp>();
|
||||
const handleSetLibrary = useCallback(() => navigation.navigate('SetJellyfinServer'), [navigation]);
|
||||
|
||||
return (
|
||||
<Container>
|
||||
<InputContainer>
|
||||
<Paragraph style={defaultStyles.text}>{t('jellyfin-server-url')}</Paragraph>
|
||||
<Input placeholder="https://jellyfin.yourserver.com/" value={jellyfin?.uri} editable={false} style={defaultStyles.input} />
|
||||
<Paragraph style={defaultStyles.text}>{t('server-url')}</Paragraph>
|
||||
<Input placeholder="https://jellyfin.yourserver.com/" value={credentials?.uri} editable={false} style={defaultStyles.input} />
|
||||
</InputContainer>
|
||||
<InputContainer>
|
||||
<Paragraph style={defaultStyles.text}>{t('jellyfin-access-token')}</Paragraph>
|
||||
<Input placeholder="deadbeefdeadbeefdeadbeef" value={jellyfin?.access_token} editable={false} style={defaultStyles.input} />
|
||||
<Paragraph style={defaultStyles.text}>{t('access-token')}</Paragraph>
|
||||
<Input placeholder="deadbeefdeadbeefdeadbeef" value={credentials?.access_token} editable={false} style={defaultStyles.input} />
|
||||
</InputContainer>
|
||||
<InputContainer>
|
||||
<Paragraph style={defaultStyles.text}>{t('jellyfin-user-id')}</Paragraph>
|
||||
<Input placeholder="deadbeefdeadbeefdeadbeef" value={jellyfin?.user_id} editable={false} style={defaultStyles.input} />
|
||||
<Paragraph style={defaultStyles.text}>{t('user-id')}</Paragraph>
|
||||
<Input placeholder="deadbeefdeadbeefdeadbeef" value={credentials?.user_id} editable={false} style={defaultStyles.input} />
|
||||
</InputContainer>
|
||||
<Button title={t('set-jellyfin-server')} onPress={handleSetLibrary} />
|
||||
<Button title={t('set-server')} onPress={handleSetLibrary} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
@@ -41,6 +41,7 @@ function LyricsLine({
|
||||
const active = useMemo(() => (
|
||||
position > start && position < end
|
||||
), [start, end, position]);
|
||||
const past = useMemo(() => position > end, [end, position]);
|
||||
|
||||
// Call the parent when the active state changes
|
||||
useEffect(() => {
|
||||
@@ -50,10 +51,10 @@ function LyricsLine({
|
||||
// Determine the current style for this line
|
||||
const lyricsTextStyle: StyleProp<TextStyle> = useMemo(() => ({
|
||||
color: active ? defaultStyles.themeColor.color : defaultStyles.text.color,
|
||||
opacity: active ? 1 : 0.7,
|
||||
opacity: active ? 1 : (past ? 0.25 : 0.7),
|
||||
transformOrigin: 'left center',
|
||||
fontSize: size === 'full' ? 24 : 18,
|
||||
}), [active, defaultStyles, size]);
|
||||
}), [active, defaultStyles, size, past]);
|
||||
|
||||
const scale = useDerivedValue(() => withTiming(active ? 1.05 : 1));
|
||||
const animatedStyle = useAnimatedStyle(() => ({
|
||||
|
||||
@@ -65,8 +65,6 @@ export default function LyricsProgress({
|
||||
};
|
||||
});
|
||||
|
||||
console.log(progressAnimation.value);
|
||||
|
||||
// GUARD: Only show durations if they last for more than 5 seconds.
|
||||
if (duration < 5e7) {
|
||||
return null;
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
import React, {useCallback, useMemo, useRef, useState} from 'react';
|
||||
import { LayoutChangeEvent, LayoutRectangle, StyleSheet, View } from 'react-native';
|
||||
import Animated from 'react-native-reanimated';
|
||||
import { Lyrics } from '@/utility/JellyfinApi/lyrics';
|
||||
import { useProgress } from 'react-native-track-player';
|
||||
import useCurrentTrack from '@/utility/useCurrentTrack';
|
||||
import LyricsLine from './LyricsLine';
|
||||
import { useNavigation } from '@react-navigation/native';
|
||||
import { useTypedSelector } from '@/store';
|
||||
import { NOW_PLAYING_POPOVER_HEIGHT } from '@/screens/Music/overlays/NowPlaying';
|
||||
import LyricsProgress, { LyricsProgressProps } from './LyricsProgress';
|
||||
|
||||
type LyricsLine = Lyrics['Lyrics'][number];
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
lyricsContainerFull: {
|
||||
padding: 40,
|
||||
@@ -42,9 +38,7 @@ export default function LyricsRenderer({ size = 'full' }: LyricsRendererProps) {
|
||||
const scrollViewRef = useRef<Animated.ScrollView>(null);
|
||||
const lineLayoutsRef = useRef(new Map<number, LayoutRectangle>());
|
||||
const { position } = useProgress(100);
|
||||
const { track: trackPlayerTrack } = useCurrentTrack();
|
||||
const tracks = useTypedSelector((state) => state.music.tracks.entities);
|
||||
const track = useMemo(() => tracks[trackPlayerTrack?.backendId], [trackPlayerTrack?.backendId, tracks]);
|
||||
const { track, albumTrack } = useCurrentTrack();
|
||||
const navigation = useNavigation();
|
||||
|
||||
// We will be using isUserScrolling to prevent lyrics controller scroll lyrics view
|
||||
@@ -83,12 +77,12 @@ export default function LyricsRenderer({ size = 'full' }: LyricsRendererProps) {
|
||||
const handleScrollBeginDrag = useCallback(() => isUserScrolling.current = true, []);
|
||||
const handleScrollEndDrag = useCallback(() => isUserScrolling.current = false, []);
|
||||
|
||||
if (!track) {
|
||||
if (!track || !albumTrack) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// GUARD: If the track has no lyrics, close the modal
|
||||
if (!track.HasLyrics || !track.Lyrics) {
|
||||
if (!albumTrack.HasLyrics || !albumTrack.Lyrics) {
|
||||
navigation.goBack();
|
||||
return null;
|
||||
}
|
||||
@@ -107,18 +101,18 @@ export default function LyricsRenderer({ size = 'full' }: LyricsRendererProps) {
|
||||
>
|
||||
<LyricsProgress
|
||||
start={0}
|
||||
end={track.Lyrics.Lyrics[0].Start - TIME_OFFSET}
|
||||
end={albumTrack.Lyrics.Lyrics[0].Start - TIME_OFFSET}
|
||||
position={currentTime}
|
||||
index={-1}
|
||||
onActive={handleActive}
|
||||
onLayout={handleLayoutChange}
|
||||
/>
|
||||
{track.Lyrics.Lyrics.map((lyrics, i) => {
|
||||
{albumTrack.Lyrics.Lyrics.map((lyrics, i) => {
|
||||
const props: LyricsProgressProps = {
|
||||
start: lyrics.Start - TIME_OFFSET,
|
||||
end: track.Lyrics!.Lyrics.length === i + 1
|
||||
end: albumTrack.Lyrics!.Lyrics.length === i + 1
|
||||
? track.RunTimeTicks
|
||||
: track.Lyrics!.Lyrics[i + 1]?.Start - TIME_OFFSET
|
||||
: albumTrack.Lyrics!.Lyrics[i + 1]?.Start - TIME_OFFSET
|
||||
,
|
||||
position: currentTime,
|
||||
onLayout: handleLayoutChange,
|
||||
|
||||
@@ -4,7 +4,6 @@ import { GestureHandlerRootView } from 'react-native-gesture-handler';
|
||||
import { Platform } from 'react-native';
|
||||
import BackButton from '../Player/components/Backbutton';
|
||||
import { ColoredBlurView } from '@/components/Colors';
|
||||
import NowPlaying from '@/screens/Music/overlays/NowPlaying';
|
||||
|
||||
export default function Lyrics() {
|
||||
return (
|
||||
@@ -12,7 +11,6 @@ export default function Lyrics() {
|
||||
<ColoredBlurView style={{ flex: 1 }}>
|
||||
{Platform.OS === 'android' && (<BackButton />)}
|
||||
<LyricsRenderer />
|
||||
<NowPlaying inset />
|
||||
</ColoredBlurView>
|
||||
</GestureHandlerRootView>
|
||||
);
|
||||
|
||||
@@ -11,7 +11,7 @@ import { LayoutChangeEvent } from 'react-native';
|
||||
import { Defs, LinearGradient, Rect, Stop, Svg } from 'react-native-svg';
|
||||
|
||||
const Container = styled.TouchableOpacity`
|
||||
border-radius: 8px;
|
||||
border-radius: 12px;
|
||||
margin-top: 24px;
|
||||
margin-left: -16px;
|
||||
margin-right: -16px;
|
||||
@@ -67,10 +67,10 @@ function InnerLyricsPreview() {
|
||||
onPress={handleShowLyrics}
|
||||
onLayout={handleLayoutChange}
|
||||
>
|
||||
<Header style={defaultStyles.activeBackground}>
|
||||
<Header style={defaultStyles.trackBackground}>
|
||||
<HeaderInnerContainer>
|
||||
<LyricsIcon fill={defaultStyles.themeColor.color} />
|
||||
<Label style={defaultStyles.themeColor}>
|
||||
<LyricsIcon fill={defaultStyles.textHalfOpacity.color} />
|
||||
<Label style={defaultStyles.textHalfOpacity}>
|
||||
{t('lyrics')}
|
||||
</Label>
|
||||
</HeaderInnerContainer>
|
||||
@@ -88,7 +88,7 @@ function InnerLyricsPreview() {
|
||||
<Stop
|
||||
offset="0"
|
||||
stopColor={defaultStyles.trackBackground.backgroundColor}
|
||||
stopOpacity={1}
|
||||
stopOpacity={0.9}
|
||||
/>
|
||||
<Stop
|
||||
offset="0.75"
|
||||
|
||||
@@ -22,13 +22,13 @@ const Info = styled.View`
|
||||
flex-shrink: 1;
|
||||
`;
|
||||
|
||||
const Label = styled(Text)<{ overflow?: boolean }>`
|
||||
const Label = styled(Text)<{ $overflow?: boolean }>`
|
||||
opacity: 0.5;
|
||||
font-size: 13px;
|
||||
|
||||
${(props) => props?.overflow && css`
|
||||
${(props) => props?.$overflow ? css`
|
||||
flex: 0 1 auto;
|
||||
`}
|
||||
`: null}
|
||||
`;
|
||||
|
||||
/**
|
||||
@@ -51,19 +51,19 @@ export default function MediaInformation() {
|
||||
<Container>
|
||||
<WaveformIcon fill={styles.icon.color} height={16} width={16} />
|
||||
<Info>
|
||||
<Label numberOfLines={1} overflow>
|
||||
{track.isDirectPlay ? t('direct-play') : t('transcoded')}
|
||||
<Label numberOfLines={1} $overflow>
|
||||
{albumTrack.Codec?.isDirectPlay ? t('direct-play') : t('transcoded')}
|
||||
</Label>
|
||||
<Label numberOfLines={1}>
|
||||
{track.isDirectPlay
|
||||
{albumTrack.Codec?.isDirectPlay
|
||||
? mediaStream?.Codec.toUpperCase()
|
||||
: track.contentType?.replace('audio/', '').toUpperCase()
|
||||
: albumTrack.Codec?.contentType?.replace('audio/', '').toUpperCase()
|
||||
}
|
||||
</Label>
|
||||
{mediaStream && (
|
||||
<>
|
||||
<Label numberOfLines={1}>
|
||||
{((track.isDirectPlay ? mediaStream.BitRate : track.bitRate) / 1000)
|
||||
{((albumTrack.Codec?.isDirectPlay ? mediaStream.BitRate : track.bitRate) / 1000)
|
||||
.toFixed(0)}
|
||||
{t('kbps')}
|
||||
</Label>
|
||||
|
||||
@@ -7,8 +7,8 @@ import TimerIcon from '@/assets/icons/timer.svg';
|
||||
import { setTimerDate } from '@/store/sleep-timer';
|
||||
import ticksToDuration from '@/utility/ticksToDuration';
|
||||
import useDefaultStyles from '@/components/Colors';
|
||||
import { TouchableOpacity } from 'react-native-gesture-handler';
|
||||
import { t } from '@/localisation';
|
||||
import { TouchableOpacity } from 'react-native';
|
||||
|
||||
const Container = styled.View`
|
||||
align-self: flex-start;
|
||||
|
||||
@@ -5,9 +5,50 @@ import { AppState } from '@/store';
|
||||
|
||||
interface Props {
|
||||
serverUrl: string;
|
||||
onCredentialsRetrieved: (credentials: AppState['settings']['jellyfin']) => void;
|
||||
onCredentialsRetrieved: (credentials: AppState['settings']['credentials']) => void;
|
||||
}
|
||||
|
||||
type CredentialEventData = {
|
||||
credentials: {
|
||||
Servers: {
|
||||
ManualAddress: string,
|
||||
ManualAddressOnly: boolean,
|
||||
IsLocalServer: boolean,
|
||||
DateLastAccessed: number,
|
||||
LastConnectionMode: number,
|
||||
Type: string,
|
||||
Name: string,
|
||||
Id: string,
|
||||
UserId: string | null,
|
||||
AccessToken: string | null,
|
||||
Users: {
|
||||
UserId: string,
|
||||
AccessToken: string,
|
||||
}[]
|
||||
LocalAddress: string,
|
||||
RemoteAddress: string,
|
||||
}[]
|
||||
},
|
||||
deviceId: string,
|
||||
type: 'emby',
|
||||
} | {
|
||||
credentials: {
|
||||
Servers: {
|
||||
ManualAddress: string,
|
||||
manualAddressOnly: boolean,
|
||||
DateLastAccessed: number,
|
||||
LastConnectionMode: number,
|
||||
Name: string,
|
||||
Id: string,
|
||||
UserId: string | null,
|
||||
AccessToken: string | null,
|
||||
LocalAddress: string,
|
||||
}[]
|
||||
},
|
||||
deviceId: string,
|
||||
type: 'jellyfin',
|
||||
} | undefined;
|
||||
|
||||
class CredentialGenerator extends Component<Props> {
|
||||
ref = createRef<WebView>();
|
||||
|
||||
@@ -18,12 +59,18 @@ class CredentialGenerator extends Component<Props> {
|
||||
|
||||
checkIfCredentialsAreThere = debounce(() => {
|
||||
// Inject some javascript to check if the credentials can be extracted
|
||||
// from localstore
|
||||
// from localstore. We simultaneously attempt to extract credentials for
|
||||
// any back-end.
|
||||
this.ref.current?.injectJavaScript(`
|
||||
try {
|
||||
let credentials = JSON.parse(window.localStorage.getItem('jellyfin_credentials'));
|
||||
let deviceId = window.localStorage.getItem('_deviceId2');
|
||||
window.ReactNativeWebView.postMessage(JSON.stringify({ credentials, deviceId }))
|
||||
window.ReactNativeWebView.postMessage(JSON.stringify({ credentials, deviceId, type: 'jellyfin' }))
|
||||
} catch(e) { }; true;
|
||||
try {
|
||||
let credentials = JSON.parse(window.localStorage.getItem('servercredentials3'));
|
||||
let deviceId = window.localStorage.getItem('_deviceId2');
|
||||
window.ReactNativeWebView.postMessage(JSON.stringify({ credentials, deviceId, type: 'emby' }))
|
||||
} catch(e) { }; true;
|
||||
`);
|
||||
}, 500);
|
||||
@@ -35,36 +82,73 @@ class CredentialGenerator extends Component<Props> {
|
||||
}
|
||||
|
||||
// Parse the content
|
||||
const data = JSON.parse(event.nativeEvent.data);
|
||||
const data = JSON.parse(event.nativeEvent.data) as CredentialEventData;
|
||||
if (__DEV__) {
|
||||
console.log('Received credential event data: ', JSON.stringify(data));
|
||||
}
|
||||
|
||||
if (!data.deviceId
|
||||
|| !data.credentials?.Servers?.length
|
||||
|| !data.credentials?.Servers[0]?.UserId
|
||||
|| !data.credentials?.Servers[0]?.AccessToken) {
|
||||
// Since Jellyfin and Emby are similar, we'll attempt to extract the
|
||||
// credentials in a generic way.
|
||||
let userId: string | undefined, accessToken: string | undefined;
|
||||
|
||||
// GUARD: Attempt to extract emby format credentials
|
||||
if (data?.type === 'emby'
|
||||
&& data.credentials?.Servers?.length
|
||||
&& data.credentials?.Servers[0]?.Users?.length
|
||||
) {
|
||||
userId = data.credentials.Servers[0].Users[0].UserId;
|
||||
accessToken = data.credentials.Servers[0].Users[0].AccessToken;
|
||||
// GUARD: Attempt to extract jellyfin format credentials
|
||||
} else if (data?.type === 'jellyfin'
|
||||
&& data.credentials?.Servers?.length
|
||||
) {
|
||||
userId = data.credentials.Servers[0].UserId || undefined;
|
||||
accessToken = data.credentials.Servers[0].AccessToken || undefined;
|
||||
}
|
||||
|
||||
// We can extract the deviceId and server address in the same way for
|
||||
// both Jellyfin and Emby.
|
||||
const deviceId = data?.deviceId;
|
||||
const address = data?.credentials?.Servers?.length
|
||||
&& data?.credentials.Servers[0].ManualAddress;
|
||||
|
||||
// GUARD: log extract credentials in dev
|
||||
if (__DEV__) {
|
||||
console.log('Extracted the following credentials:', { userId, accessToken, deviceId, address });
|
||||
}
|
||||
|
||||
// GUARD: Check that all the required credentials are available
|
||||
if (!userId || !accessToken || !deviceId || !address) {
|
||||
if (__DEV__) {
|
||||
console.error('Failed to extract credentials from event');
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const { credentials: { Servers: [ credentials ] }, deviceId } = data;
|
||||
|
||||
// Attempt to perform a request using the credentials to see if they're
|
||||
// good
|
||||
const response = await fetch(`${credentials.ManualAddress}/Users/Me`, {
|
||||
const response = await fetch(`${address}/Users/${userId}`, {
|
||||
headers: {
|
||||
'X-Emby-Authorization': `MediaBrowser Client="", Device="", DeviceId="", Version="", Token="${credentials.AccessToken}"`
|
||||
'X-Emby-Authorization': `MediaBrowser Client="", Device="", DeviceId="", Version="", Token="${accessToken}"`
|
||||
}
|
||||
});
|
||||
|
||||
// GUARD: The request must succeed
|
||||
if (response.status !== 200) {
|
||||
if (__DEV__) {
|
||||
const body = await response.text();
|
||||
console.error('Failed to retrieve user object using credentials:', response.status, body);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// If a message is received, the credentials should be there
|
||||
this.props.onCredentialsRetrieved({
|
||||
uri: credentials.ManualAddress,
|
||||
user_id: credentials.UserId,
|
||||
access_token: credentials.AccessToken,
|
||||
uri: address,
|
||||
user_id: userId,
|
||||
access_token: accessToken,
|
||||
device_id: deviceId,
|
||||
type: data.type,
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import { t } from '@/localisation';
|
||||
import useDefaultStyles from '@/components/Colors';
|
||||
import { Text } from '@/components/Typography';
|
||||
import { AppState, useAppDispatch } from '@/store';
|
||||
import { fetchRecentAlbums } from '@/store/music/actions';
|
||||
|
||||
|
||||
export default function SetJellyfinServer() {
|
||||
@@ -22,10 +23,11 @@ export default function SetJellyfinServer() {
|
||||
const navigation = useNavigation();
|
||||
|
||||
// Save creedentials to store and close the modal
|
||||
const saveCredentials = useCallback((credentials: AppState['settings']['jellyfin']) => {
|
||||
const saveCredentials = useCallback((credentials: AppState['settings']['credentials']) => {
|
||||
if (credentials) {
|
||||
dispatch(setJellyfinCredentials(credentials));
|
||||
navigation.dispatch(StackActions.popToTop());
|
||||
navigation.dispatch(StackActions.popToTop());
|
||||
dispatch(fetchRecentAlbums());
|
||||
}
|
||||
}, [navigation, dispatch]);
|
||||
|
||||
@@ -39,7 +41,7 @@ export default function SetJellyfinServer() {
|
||||
) : (
|
||||
<View style={{ padding: 20, flex: 1, justifyContent: 'center', alignItems: 'center' }}>
|
||||
<Text>
|
||||
{t('set-jellyfin-server-instruction')}
|
||||
{t('set-server-instruction')}
|
||||
</Text>
|
||||
<Input
|
||||
placeholder="https://jellyfin.yourserver.io/"
|
||||
@@ -51,7 +53,7 @@ export default function SetJellyfinServer() {
|
||||
style={[ defaultStyles.input, { width: '100%' } ]}
|
||||
/>
|
||||
<Button
|
||||
title={t('set-jellyfin-server')}
|
||||
title={t('set-server')}
|
||||
onPress={() => setIsLogginIn(true)}
|
||||
disabled={!serverUrl?.length}
|
||||
color={defaultStyles.themeColor.color}
|
||||
|
||||
@@ -16,6 +16,7 @@ import { queueTrackForDownload, removeDownloadedTrack } from '@/store/downloads/
|
||||
import usePlayTracks from '@/utility/usePlayTracks';
|
||||
import { selectIsDownloaded } from '@/store/downloads/selectors';
|
||||
import { useGetImage } from '@/utility/JellyfinApi/lib';
|
||||
import { ColoredBlurView } from '@/components/Colors';
|
||||
|
||||
type Route = RouteProp<StackParams, 'TrackPopupMenu'>;
|
||||
|
||||
@@ -74,20 +75,22 @@ function TrackPopupMenu() {
|
||||
}, [trackId, dispatch, closeModal]);
|
||||
|
||||
return (
|
||||
<Container>
|
||||
<Artwork src={getImage(track?.Id || '')} />
|
||||
<Header>{track?.Name}</Header>
|
||||
<SubHeader style={{ marginBottom: 18 }}>{track?.AlbumArtist} {track?.Album ? '— ' + track?.Album : ''}</SubHeader>
|
||||
<WrappableButtonRow>
|
||||
<WrappableButton title={t('play-next')} icon={PlayIcon} onPress={handlePlayNext} />
|
||||
<WrappableButton title={t('add-to-queue')} icon={QueueAppendIcon} onPress={handleAddToQueue} />
|
||||
{isDownloaded ? (
|
||||
<WrappableButton title={t('delete-track')} icon={TrashIcon} onPress={handleDelete} />
|
||||
) : (
|
||||
<WrappableButton title={t('download-track')} icon={DownloadIcon} onPress={handleDownload} />
|
||||
)}
|
||||
</WrappableButtonRow>
|
||||
</Container>
|
||||
<ColoredBlurView>
|
||||
<Container>
|
||||
<Artwork src={getImage(track)} />
|
||||
<Header>{track?.Name}</Header>
|
||||
<SubHeader style={{ marginBottom: 18 }}>{track?.AlbumArtist} {track?.Album ? '— ' + track?.Album : ''}</SubHeader>
|
||||
<WrappableButtonRow>
|
||||
<WrappableButton title={t('play-next')} icon={PlayIcon} onPress={handlePlayNext} />
|
||||
<WrappableButton title={t('add-to-queue')} icon={QueueAppendIcon} onPress={handleAddToQueue} />
|
||||
{isDownloaded ? (
|
||||
<WrappableButton title={t('delete-track')} icon={TrashIcon} onPress={handleDelete} />
|
||||
) : (
|
||||
<WrappableButton title={t('download-track')} icon={DownloadIcon} onPress={handleDownload} />
|
||||
)}
|
||||
</WrappableButtonRow>
|
||||
</Container>
|
||||
</ColoredBlurView>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,65 +2,73 @@ import { createAction, createAsyncThunk, createEntityAdapter } from '@reduxjs/to
|
||||
import { AppState } from '@/store';
|
||||
import { downloadFile, unlink, DocumentDirectoryPath, exists } from 'react-native-fs';
|
||||
import { DownloadEntity } from './types';
|
||||
import MimeTypes from '@/utility/MimeTypes';
|
||||
import { generateTrackUrl } from '@/utility/JellyfinApi/track';
|
||||
|
||||
import { getImage } from '@/utility/JellyfinApi/lib';
|
||||
import { getExtensionForUrl } from '@/utility/mimeType';
|
||||
|
||||
export const downloadAdapter = createEntityAdapter<DownloadEntity>();
|
||||
|
||||
export const queueTrackForDownload = createAction<string>('download/queue');
|
||||
export const initializeDownload = createAction<{ id: string, size?: number, jobId?: number, location: string }>('download/initialize');
|
||||
export const initializeDownload = createAction<{ id: string, size?: number, jobId?: number, location: string, image?: string }>('download/initialize');
|
||||
export const progressDownload = createAction<{ id: string, progress: number, jobId?: number }>('download/progress');
|
||||
export const completeDownload = createAction<{ id: string, location: string, size?: number }>('download/complete');
|
||||
export const completeDownload = createAction<{ id: string, location: string, size?: number, image?: string }>('download/complete');
|
||||
export const failDownload = createAction<{ id: string }>('download/fail');
|
||||
|
||||
export const downloadTrack = createAsyncThunk(
|
||||
'/downloads/track',
|
||||
async (id: string, { dispatch }) => {
|
||||
// Generate the URL we can use to download the file
|
||||
const url = generateTrackUrl(id);
|
||||
const audioUrl = generateTrackUrl(id);
|
||||
const imageUrl = getImage(id);
|
||||
|
||||
// Get the content-type from the URL by doing a HEAD-only request
|
||||
const contentType = (await fetch(url, { method: 'HEAD' })).headers.get('Content-Type');
|
||||
if (!contentType) {
|
||||
throw new Error('Jellyfin did not return a Content-Type for a streaming URL.');
|
||||
}
|
||||
|
||||
// Then convert the MIME-type to an extension
|
||||
const extension = MimeTypes[contentType as keyof typeof MimeTypes];
|
||||
if (!extension) {
|
||||
throw new Error(`Unsupported MIME-type ${contentType}`);
|
||||
}
|
||||
const [audioExt, imageExt] = await Promise.all([
|
||||
getExtensionForUrl(audioUrl),
|
||||
// Image files may be absent
|
||||
getExtensionForUrl(imageUrl).catch(() => null)
|
||||
]);
|
||||
|
||||
// Then generate the proper location
|
||||
const location = `${DocumentDirectoryPath}/${id}${extension}`;
|
||||
const audioLocation = `${DocumentDirectoryPath}/${id}.${audioExt}`;
|
||||
const imageLocation = imageExt ? `${DocumentDirectoryPath}/${id}.${imageExt}` : undefined;
|
||||
|
||||
// Actually kick off the download
|
||||
const { promise } = await downloadFile({
|
||||
fromUrl: url,
|
||||
// Actually kick off the download
|
||||
const { promise: audioPromise } = downloadFile({
|
||||
fromUrl: audioUrl,
|
||||
progressInterval: 250,
|
||||
background: true,
|
||||
begin: ({ jobId, contentLength }) => {
|
||||
// Dispatch the initialization
|
||||
dispatch(initializeDownload({ id, jobId, size: contentLength, location }));
|
||||
dispatch(initializeDownload({ id, jobId, size: contentLength, location: audioLocation, image: imageLocation }));
|
||||
},
|
||||
progress: (result) => {
|
||||
// Dispatch a progress update
|
||||
dispatch(progressDownload({ id, progress: result.bytesWritten / result.contentLength }));
|
||||
},
|
||||
toFile: location,
|
||||
toFile: audioLocation,
|
||||
});
|
||||
|
||||
const { promise: imagePromise } = imageExt && imageLocation
|
||||
? downloadFile({
|
||||
fromUrl: imageUrl,
|
||||
toFile: imageLocation,
|
||||
background: true,
|
||||
})
|
||||
: { promise: Promise.resolve(null) };
|
||||
|
||||
// Await job completion
|
||||
const result = await promise;
|
||||
dispatch(completeDownload({ id, location, size: result.bytesWritten }));
|
||||
const [audioResult, imageResult] = await Promise.all([audioPromise, imagePromise]);
|
||||
const totalSize = audioResult.bytesWritten + (imageResult?.bytesWritten || 0);
|
||||
dispatch(completeDownload({ id, location: audioLocation, size: totalSize, image: imageLocation }));
|
||||
},
|
||||
);
|
||||
|
||||
export const removeDownloadedTrack = createAsyncThunk(
|
||||
'/downloads/remove/track',
|
||||
async(id: string, { getState }) => {
|
||||
async (id: string, { getState }) => {
|
||||
// Retrieve the state
|
||||
const { downloads: { entities }} = getState() as AppState;
|
||||
const { downloads: { entities } } = getState() as AppState;
|
||||
|
||||
// Attempt to retrieve the entity from the state
|
||||
const download = entities[id];
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user