Compare commits

...

17 Commits

Author SHA1 Message Date
Lei Nelissen
8e0809bcdc chore: Release v1.2.7 2022-08-14 00:49:48 +02:00
Lei Nelissen
5b54760e4e feat: Allow FLAC playback 2022-08-14 00:30:20 +02:00
Lei Nelissen
8a9c14e940 chore: Release v1.2.6 2022-08-09 11:41:19 +02:00
Lei Nelissen
6d57ec6d9a Merge pull request #91 from HySand/master
Update /src/localisation/lang/zh/locale.json
2022-08-09 10:46:10 +02:00
HySand
afb25a0422 Update locale.json 2022-08-07 05:18:08 +08:00
HySand
64c81d1813 Update locale.json
Add full simplified Chinese translation.
2022-08-07 05:07:28 +08:00
Lei Nelissen
cb792c8dd4 Add privacy policy 2022-06-15 11:49:33 +02:00
Lei Nelissen
63bbbf2719 fix: Peer dependency chain 2022-06-12 22:06:51 +02:00
Lei Nelissen
c7f0d46b41 fix: Remove unused imports 2022-06-12 21:59:21 +02:00
Lei Nelissen
6c7b320ae8 chore: Replace async-storage package 2022-06-12 21:51:20 +02:00
Lei Nelissen
f39ab85624 Fix android crashes and add modal exit button 2022-06-09 23:37:07 +02:00
Lei Nelissen
01bd17e8cb Fix borderStyle on image compilation issue 2022-05-19 23:06:03 +02:00
Lei Nelissen
1075e31623 Apply proper padding in Android FlatList 2022-05-19 23:05:46 +02:00
Lei Nelissen
8678e3d881 Render playback text properly on Android 2022-05-19 23:05:28 +02:00
Lei Nelissen
0fc087e832 Update screenshots and README 2022-05-18 23:07:08 +02:00
Lei Nelissen
a8d563f66d Release v1.2.5 2022-05-18 22:29:57 +02:00
Lei Nelissen
1c659d7d90 Merge pull request #83 from leinelissen/feature/redesign
Feature/redesign
2022-05-18 22:13:00 +02:00
29 changed files with 497 additions and 1356 deletions

View File

@@ -7,8 +7,10 @@ This is a [React Native](https://reactnative.dev/)-based audio streaming app for
## ❗Now open for beta testing on iOS
Please follow this link to enroll for the TestFlight beta release of Jellyfin Audio Player: https://testflight.apple.com/join/cf2AMDpx.
|![](./docs/images/now-playing.png)|![](./docs/images/recent-albums.png)|![](./docs/images/album-list.png)|![](./docs/images/search.png)|
|-|-|-|-|
|![](./docs/images/now-playing.png)|![](./docs/images/recent-albums.png)|![](./docs/images/album-list.png)
|-|-|-|
|![](./docs/images/album.png)|![](./docs/images/downloads.png)|![](./docs/images/search.png)
## Features
* Sorting by recent albums
@@ -18,14 +20,12 @@ Please follow this link to enroll for the TestFlight beta release of Jellyfin Au
* AirPlay and Chromecast support
* Background audio
* Native Dark Mode
### Features being considered
* Downloading music for offline playback
* Searching based on track names
* Looping and shuffling queue
## Getting Started
This piece of software is in alpha. I am working on getting this app in ~~TestFlight and~~ Google Play Developer Console, but this is contingent on keys being available. In the meantime, IPAs and APK are intermittenly released on the [Releases page](https://github.com/leinelissen/jellyfin-audio-player/releases). Alternatively, you can build this app from source using the build instructions.
This piece of software is in beta. I am working on getting this app in ~~TestFlight and~~ Google Play Developer Console, but this is contingent on keys being available. In the meantime, IPAs and APK are intermittenly released on the [Releases page](https://github.com/leinelissen/jellyfin-audio-player/releases). Alternatively, you can build this app from source using the build instructions.
### Using the app
You will need to setup your Jellyfin account for the application to be able to pull in all your audio. To do this, go over to the "Settings" tab and click the "Set Jellyfin server"-button. A modal will pop up in which you will enter your Jellyfin server url, after which you enter your credentials in the provided browser view. When the app detects your credentials, they will automatically be remembered for the future.

View File

@@ -138,8 +138,8 @@ android {
applicationId "com.jellyfinaudioplayer"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 8
versionName "1.2.4"
versionCode 11
versionName "1.2.7"
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
if (isNewArchitectureEnabled()) {
@@ -322,4 +322,4 @@ def isNewArchitectureEnabled() {
// - Invoke gradle with `-newArchEnabled=true`
// - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

After

Width:  |  Height:  |  Size: 2.9 MiB

BIN
docs/images/album.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

BIN
docs/images/downloads.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 KiB

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 261 KiB

8
docs/privacy-policy.md Normal file
View File

@@ -0,0 +1,8 @@
Fintunes does not collect any personal data. Period. We respect your right to
autonomy and vow to not collect any information without user consent at all.
If you opt-in to crash logging, we will collect analytics data from your device,
every time a crash occurs. This data includes debugging information such as
devices, versions and the specific error. All data is sent to a server
controlled by the first party. No third parties can access this data in any
form. No personal data is included in the analytics data.

View File

@@ -555,7 +555,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 36;
CURRENT_PROJECT_VERSION = 39;
DEVELOPMENT_TEAM = 238P3C58WC;
ENABLE_BITCODE = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -591,7 +591,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 36;
CURRENT_PROJECT_VERSION = 39;
DEVELOPMENT_TEAM = 238P3C58WC;
INFOPLIST_FILE = JellyfinAudioPlayer/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";

View File

@@ -17,11 +17,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.2.4</string>
<string>1.2.7</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>36</string>
<string>39</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>

View File

@@ -15,10 +15,10 @@
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.2.4</string>
<string>1.2.7</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>36</string>
<string>39</string>
</dict>
</plist>

View File

@@ -2,14 +2,14 @@ PODS:
- boost (1.76.0)
- CocoaAsyncSocket (7.6.5)
- DoubleConversion (1.1.6)
- FBLazyVector (0.68.1)
- FBReactNativeSpec (0.68.1):
- FBLazyVector (0.68.2)
- FBReactNativeSpec (0.68.2):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.68.1)
- RCTTypeSafety (= 0.68.1)
- React-Core (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- RCTRequired (= 0.68.2)
- RCTTypeSafety (= 0.68.2)
- React-Core (= 0.68.2)
- React-jsi (= 0.68.2)
- ReactCommon/turbomodule/core (= 0.68.2)
- Flipper (0.125.0):
- Flipper-Folly (~> 2.6)
- Flipper-RSocket (~> 1.4)
@@ -95,207 +95,207 @@ PODS:
- DoubleConversion
- fmt (~> 6.2.1)
- glog
- RCTRequired (0.68.1)
- RCTTypeSafety (0.68.1):
- FBLazyVector (= 0.68.1)
- RCTRequired (0.68.2)
- RCTTypeSafety (0.68.2):
- FBLazyVector (= 0.68.2)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.68.1)
- React-Core (= 0.68.1)
- React (0.68.1):
- React-Core (= 0.68.1)
- React-Core/DevSupport (= 0.68.1)
- React-Core/RCTWebSocket (= 0.68.1)
- React-RCTActionSheet (= 0.68.1)
- React-RCTAnimation (= 0.68.1)
- React-RCTBlob (= 0.68.1)
- React-RCTImage (= 0.68.1)
- React-RCTLinking (= 0.68.1)
- React-RCTNetwork (= 0.68.1)
- React-RCTSettings (= 0.68.1)
- React-RCTText (= 0.68.1)
- React-RCTVibration (= 0.68.1)
- react-airplay (1.1.2):
- RCTRequired (= 0.68.2)
- React-Core (= 0.68.2)
- React (0.68.2):
- React-Core (= 0.68.2)
- React-Core/DevSupport (= 0.68.2)
- React-Core/RCTWebSocket (= 0.68.2)
- React-RCTActionSheet (= 0.68.2)
- React-RCTAnimation (= 0.68.2)
- React-RCTBlob (= 0.68.2)
- React-RCTImage (= 0.68.2)
- React-RCTLinking (= 0.68.2)
- React-RCTNetwork (= 0.68.2)
- React-RCTSettings (= 0.68.2)
- React-RCTText (= 0.68.2)
- React-RCTVibration (= 0.68.2)
- react-airplay (1.2.0):
- React-Core
- React-callinvoker (0.68.1)
- React-Codegen (0.68.1):
- FBReactNativeSpec (= 0.68.1)
- React-callinvoker (0.68.2)
- React-Codegen (0.68.2):
- FBReactNativeSpec (= 0.68.2)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.68.1)
- RCTTypeSafety (= 0.68.1)
- React-Core (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-Core (0.68.1):
- RCTRequired (= 0.68.2)
- RCTTypeSafety (= 0.68.2)
- React-Core (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- ReactCommon/turbomodule/core (= 0.68.2)
- React-Core (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.68.1)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-Core/Default (= 0.68.2)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/CoreModulesHeaders (0.68.1):
- React-Core/CoreModulesHeaders (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/Default (0.68.1):
- React-Core/Default (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/DevSupport (0.68.1):
- React-Core/DevSupport (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.68.1)
- React-Core/RCTWebSocket (= 0.68.1)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-jsinspector (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-Core/Default (= 0.68.2)
- React-Core/RCTWebSocket (= 0.68.2)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-jsinspector (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/RCTActionSheetHeaders (0.68.1):
- React-Core/RCTActionSheetHeaders (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/RCTAnimationHeaders (0.68.1):
- React-Core/RCTAnimationHeaders (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/RCTBlobHeaders (0.68.1):
- React-Core/RCTBlobHeaders (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/RCTImageHeaders (0.68.1):
- React-Core/RCTImageHeaders (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/RCTLinkingHeaders (0.68.1):
- React-Core/RCTLinkingHeaders (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/RCTNetworkHeaders (0.68.1):
- React-Core/RCTNetworkHeaders (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/RCTSettingsHeaders (0.68.1):
- React-Core/RCTSettingsHeaders (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/RCTTextHeaders (0.68.1):
- React-Core/RCTTextHeaders (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/RCTVibrationHeaders (0.68.1):
- React-Core/RCTVibrationHeaders (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-Core/RCTWebSocket (0.68.1):
- React-Core/RCTWebSocket (0.68.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.68.1)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsiexecutor (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-Core/Default (= 0.68.2)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsiexecutor (= 0.68.2)
- React-perflogger (= 0.68.2)
- Yoga
- React-CoreModules (0.68.1):
- React-CoreModules (0.68.2):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.1)
- React-Codegen (= 0.68.1)
- React-Core/CoreModulesHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- React-RCTImage (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-cxxreact (0.68.1):
- RCTTypeSafety (= 0.68.2)
- React-Codegen (= 0.68.2)
- React-Core/CoreModulesHeaders (= 0.68.2)
- React-jsi (= 0.68.2)
- React-RCTImage (= 0.68.2)
- ReactCommon/turbomodule/core (= 0.68.2)
- React-cxxreact (0.68.2):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.68.1)
- React-jsi (= 0.68.1)
- React-jsinspector (= 0.68.1)
- React-logger (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-runtimeexecutor (= 0.68.1)
- React-jsi (0.68.1):
- React-callinvoker (= 0.68.2)
- React-jsi (= 0.68.2)
- React-jsinspector (= 0.68.2)
- React-logger (= 0.68.2)
- React-perflogger (= 0.68.2)
- React-runtimeexecutor (= 0.68.2)
- React-jsi (0.68.2):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsi/Default (= 0.68.1)
- React-jsi/Default (0.68.1):
- React-jsi/Default (= 0.68.2)
- React-jsi/Default (0.68.2):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsiexecutor (0.68.1):
- React-jsiexecutor (0.68.2):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-perflogger (= 0.68.1)
- React-jsinspector (0.68.1)
- React-logger (0.68.1):
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-perflogger (= 0.68.2)
- React-jsinspector (0.68.2)
- React-logger (0.68.2):
- glog
- react-native-blur (0.8.0):
- React
- react-native-flipper (0.127.0):
- react-native-flipper (0.146.0):
- React-Core
- react-native-netinfo (8.3.0):
- React-Core
@@ -305,120 +305,114 @@ PODS:
- RCTTypeSafety
- React
- ReactCommon/turbomodule/core
- react-native-skia (0.1.123):
- react-native-skia (0.1.124):
- React
- React-callinvoker
- React-Core
- react-native-skia/Api (= 0.1.123)
- react-native-skia/Jsi (= 0.1.123)
- react-native-skia/RNSkia (= 0.1.123)
- react-native-skia/SkiaHeaders (= 0.1.123)
- react-native-skia/Utils (= 0.1.123)
- react-native-skia/Api (0.1.123):
- react-native-skia/Api (= 0.1.124)
- react-native-skia/Jsi (= 0.1.124)
- react-native-skia/RNSkia (= 0.1.124)
- react-native-skia/SkiaHeaders (= 0.1.124)
- react-native-skia/Utils (= 0.1.124)
- react-native-skia/Api (0.1.124):
- React
- React-callinvoker
- React-Core
- react-native-skia/Jsi (0.1.123):
- react-native-skia/Jsi (0.1.124):
- React
- React-callinvoker
- React-Core
- react-native-skia/RNSkia (0.1.123):
- react-native-skia/RNSkia (0.1.124):
- React
- React-callinvoker
- React-Core
- react-native-skia/SkiaHeaders (0.1.123):
- react-native-skia/SkiaHeaders (0.1.124):
- React
- React-callinvoker
- React-Core
- react-native-skia/Utils (0.1.123):
- react-native-skia/Utils (0.1.124):
- React
- React-callinvoker
- React-Core
- react-native-slider (4.2.2):
- React-Core
- react-native-track-player (2.1.3):
- react-native-track-player (2.2.0-rc3):
- React-Core
- SwiftAudioEx (= 0.14.7)
- react-native-webview (11.18.2):
- React-Core
- React-perflogger (0.68.1)
- React-RCTActionSheet (0.68.1):
- React-Core/RCTActionSheetHeaders (= 0.68.1)
- React-RCTAnimation (0.68.1):
- React-perflogger (0.68.2)
- React-RCTActionSheet (0.68.2):
- React-Core/RCTActionSheetHeaders (= 0.68.2)
- React-RCTAnimation (0.68.2):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.1)
- React-Codegen (= 0.68.1)
- React-Core/RCTAnimationHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTBlob (0.68.1):
- RCTTypeSafety (= 0.68.2)
- React-Codegen (= 0.68.2)
- React-Core/RCTAnimationHeaders (= 0.68.2)
- React-jsi (= 0.68.2)
- ReactCommon/turbomodule/core (= 0.68.2)
- React-RCTBlob (0.68.2):
- RCT-Folly (= 2021.06.28.00-v2)
- React-Codegen (= 0.68.1)
- React-Core/RCTBlobHeaders (= 0.68.1)
- React-Core/RCTWebSocket (= 0.68.1)
- React-jsi (= 0.68.1)
- React-RCTNetwork (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTImage (0.68.1):
- React-Codegen (= 0.68.2)
- React-Core/RCTBlobHeaders (= 0.68.2)
- React-Core/RCTWebSocket (= 0.68.2)
- React-jsi (= 0.68.2)
- React-RCTNetwork (= 0.68.2)
- ReactCommon/turbomodule/core (= 0.68.2)
- React-RCTImage (0.68.2):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.1)
- React-Codegen (= 0.68.1)
- React-Core/RCTImageHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- React-RCTNetwork (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTLinking (0.68.1):
- React-Codegen (= 0.68.1)
- React-Core/RCTLinkingHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTNetwork (0.68.1):
- RCTTypeSafety (= 0.68.2)
- React-Codegen (= 0.68.2)
- React-Core/RCTImageHeaders (= 0.68.2)
- React-jsi (= 0.68.2)
- React-RCTNetwork (= 0.68.2)
- ReactCommon/turbomodule/core (= 0.68.2)
- React-RCTLinking (0.68.2):
- React-Codegen (= 0.68.2)
- React-Core/RCTLinkingHeaders (= 0.68.2)
- React-jsi (= 0.68.2)
- ReactCommon/turbomodule/core (= 0.68.2)
- React-RCTNetwork (0.68.2):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.1)
- React-Codegen (= 0.68.1)
- React-Core/RCTNetworkHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTSettings (0.68.1):
- RCTTypeSafety (= 0.68.2)
- React-Codegen (= 0.68.2)
- React-Core/RCTNetworkHeaders (= 0.68.2)
- React-jsi (= 0.68.2)
- ReactCommon/turbomodule/core (= 0.68.2)
- React-RCTSettings (0.68.2):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.1)
- React-Codegen (= 0.68.1)
- React-Core/RCTSettingsHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-RCTText (0.68.1):
- React-Core/RCTTextHeaders (= 0.68.1)
- React-RCTVibration (0.68.1):
- RCTTypeSafety (= 0.68.2)
- React-Codegen (= 0.68.2)
- React-Core/RCTSettingsHeaders (= 0.68.2)
- React-jsi (= 0.68.2)
- ReactCommon/turbomodule/core (= 0.68.2)
- React-RCTText (0.68.2):
- React-Core/RCTTextHeaders (= 0.68.2)
- React-RCTVibration (0.68.2):
- RCT-Folly (= 2021.06.28.00-v2)
- React-Codegen (= 0.68.1)
- React-Core/RCTVibrationHeaders (= 0.68.1)
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (= 0.68.1)
- React-runtimeexecutor (0.68.1):
- React-jsi (= 0.68.1)
- ReactCommon/turbomodule/core (0.68.1):
- React-Codegen (= 0.68.2)
- React-Core/RCTVibrationHeaders (= 0.68.2)
- React-jsi (= 0.68.2)
- ReactCommon/turbomodule/core (= 0.68.2)
- React-runtimeexecutor (0.68.2):
- React-jsi (= 0.68.2)
- ReactCommon/turbomodule/core (0.68.2):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.68.1)
- React-Core (= 0.68.1)
- React-cxxreact (= 0.68.1)
- React-jsi (= 0.68.1)
- React-logger (= 0.68.1)
- React-perflogger (= 0.68.1)
- RNCAsyncStorage (1.12.1):
- React-Core
- RNCMaskedView (0.1.11):
- React
- RNCPicker (1.8.1):
- React-callinvoker (= 0.68.2)
- React-Core (= 0.68.2)
- React-cxxreact (= 0.68.2)
- React-jsi (= 0.68.2)
- React-logger (= 0.68.2)
- React-perflogger (= 0.68.2)
- RNCAsyncStorage (1.17.6):
- React-Core
- RNFastImage (8.5.11):
- React-Core
- SDWebImage (~> 5.11.1)
- SDWebImageWebPCoder (~> 0.8.4)
- RNFS (2.19.0):
- RNFS (2.20.0):
- React-Core
- RNGestureHandler (2.4.1):
- RNGestureHandler (2.4.2):
- React-Core
- RNLocalize (2.2.1):
- React-Core
@@ -521,7 +515,6 @@ DEPENDENCIES:
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
- "react-native-skia (from `../node_modules/@shopify/react-native-skia`)"
- "react-native-slider (from `../node_modules/@react-native-community/slider`)"
- react-native-track-player (from `../node_modules/react-native-track-player`)
- react-native-webview (from `../node_modules/react-native-webview`)
- React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`)
@@ -536,9 +529,7 @@ DEPENDENCIES:
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
- React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
- "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)"
- "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)"
- "RNCPicker (from `../node_modules/@react-native-community/picker`)"
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
- RNFastImage (from `../node_modules/react-native-fast-image`)
- RNFS (from `../node_modules/react-native-fs`)
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
@@ -621,8 +612,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-safe-area-context"
react-native-skia:
:path: "../node_modules/@shopify/react-native-skia"
react-native-slider:
:path: "../node_modules/@react-native-community/slider"
react-native-track-player:
:path: "../node_modules/react-native-track-player"
react-native-webview:
@@ -652,11 +641,7 @@ EXTERNAL SOURCES:
ReactCommon:
:path: "../node_modules/react-native/ReactCommon"
RNCAsyncStorage:
:path: "../node_modules/@react-native-community/async-storage"
RNCMaskedView:
:path: "../node_modules/@react-native-community/masked-view"
RNCPicker:
:path: "../node_modules/@react-native-community/picker"
:path: "../node_modules/@react-native-async-storage/async-storage"
RNFastImage:
:path: "../node_modules/react-native-fast-image"
RNFS:
@@ -680,8 +665,8 @@ SPEC CHECKSUMS:
boost: a7c83b31436843459a1961bfd74b96033dc77234
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
FBLazyVector: 2c76493a346ef8cacf1f442926a39f805fffec1f
FBReactNativeSpec: 371350f24afa87b6aba606972ec959dcd4a95c9a
FBLazyVector: a7a655862f6b09625d11c772296b01cd5164b648
FBReactNativeSpec: 81ce99032d5b586fddd6a38d450f8595f7e04be4
Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0
Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c
Flipper-DoubleConversion: 3d3d04a078d4f3a1b6c6916587f159dc11f232c4
@@ -697,45 +682,42 @@ SPEC CHECKSUMS:
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c
RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8
RCTRequired: 00581111c53531e39e3c6346ef0d2c0cf52a5a37
RCTTypeSafety: 07e03ee7800e7dd65cba8e52ad0c2edb06c96604
React: e61f4bf3c573d0c61c56b53dc3eb1d9daf0768a0
react-airplay: 19bc646b4cc698c00772f4cb0e45ca8e280d4c6e
React-callinvoker: 047d47230bb6fd66827f8cb0bea4e944ffd1309b
React-Codegen: bb0403cde7374af091530e84e492589485aab480
React-Core: a4a3a8e10d004b08e013c3d0438259dd89a3894c
React-CoreModules: bb9f8bc36f1ae6d780b856927fa9d4aa01ccccc0
React-cxxreact: 7dd472aefb8629d6080cbb859240bafccd902704
React-jsi: b25808afe821b607d51c779bdd1717be8393b7ec
React-jsiexecutor: 4a4bae5671b064a2248a690cf75957669489d08c
React-jsinspector: 218a2503198ff28a085f8e16622a8d8f507c8019
React-logger: f79dd3cc0f9b44f5611c6c7862badd891a862cf8
RCTRequired: 3e917ea5377751094f38145fdece525aa90545a0
RCTTypeSafety: c43c072a4bd60feb49a9570b0517892b4305c45e
React: 176dd882de001854ced260fad41bb68a31aa4bd0
react-airplay: 8197767f12cae11a7623b1507d29a89482a720ad
React-callinvoker: c2864d1818d6e64928d2faf774a3800dfc38fe1f
React-Codegen: 98b6f97f0a7abf7d67e4ce435c77c05b7a95cf05
React-Core: fdaa2916b1c893f39f02cff0476d1fb0cab1e352
React-CoreModules: fd8705b80699ec36c2cdd635c2ce9d874b9cfdfc
React-cxxreact: 1832d971f7b0cb2c7b943dc0ec962762c90c906e
React-jsi: 72af715135abe8c3f0dcf3b2548b71d048b69a7e
React-jsiexecutor: b7b553412f2ec768fe6c8f27cd6bafdb9d8719e6
React-jsinspector: c5989c77cb89ae6a69561095a61cce56a44ae8e8
React-logger: a0833912d93b36b791b7a521672d8ee89107aff1
react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c
react-native-flipper: b9e2e817604af8da0d5a9ba20a8516e780e30f3c
react-native-flipper: 5b0191d194d8581f1a25efd07fd6048323dc9c04
react-native-netinfo: 3671b091c4843fda5e153612866ef4024b8f5d62
react-native-safe-area-context: ebf8c413eb8b5f7c392a036a315eb7b46b96845f
react-native-skia: 8a3e1b513020e2c9b0b4e49404f396d2a88f9ac7
react-native-slider: 2f25c919f1dc309b90e2cc8346b8042ecec2102f
react-native-track-player: c4147afddd29de936caa06561f78a32d6502eb12
react-native-skia: 69a2b9b42999325db20e18ef459bf4dfc1b51a69
react-native-track-player: c4a4c5ec8090aec5b97a3f634dab8bdb657491a0
react-native-webview: 8ec7ddf9eb4ddcd92b32cee7907efec19a9ec7cb
React-perflogger: 30ab8d6db10e175626069e742eead3ebe8f24fd5
React-RCTActionSheet: 4b45da334a175b24dabe75f856b98fed3dfd6201
React-RCTAnimation: d6237386cb04500889877845b3e9e9291146bc2e
React-RCTBlob: bc9e2cd738c43bd2948e862e371402ef9584730a
React-RCTImage: 9f8cac465c6e5837007f59ade2a0a741016dd6a3
React-RCTLinking: 5073abb7d30cc0824b2172bd4582fc15bfc40510
React-RCTNetwork: 28ff94aa7d8fc117fc800b87dd80869a00d2bef3
React-RCTSettings: f27aa036f7270fe6ca43f8cdd1819e821fa429a0
React-RCTText: 7cb6f86fa7bc86f22f16333ad243b158e63b2a68
React-RCTVibration: 9e344c840176b0af9c84d5019eb4fed8b3c105a1
React-runtimeexecutor: 7285b499d0339104b2813a1f58ad1ada4adbd6c0
ReactCommon: bf2888a826ceedf54b99ad1b6182d1bc4a8a3984
RNCAsyncStorage: b03032fdbdb725bea0bd9e5ec5a7272865ae7398
RNCMaskedView: 0e1bc4bfa8365eba5fbbb71e07fbdc0555249489
RNCPicker: 914b557e20b3b8317b084aca9ff4b4edb95f61e4
React-perflogger: a18b4f0bd933b8b24ecf9f3c54f9bf65180f3fe6
React-RCTActionSheet: 547fe42fdb4b6089598d79f8e1d855d7c23e2162
React-RCTAnimation: bc9440a1c37b06ae9ebbb532d244f607805c6034
React-RCTBlob: a1295c8e183756d7ef30ba6e8f8144dfe8a19215
React-RCTImage: a30d1ee09b1334067fbb6f30789aae2d7ac150c9
React-RCTLinking: ffc6d5b88d1cb9aca13c54c2ec6507fbf07f2ac4
React-RCTNetwork: f807a2facab6cf5cf36d592e634611de9cf12d81
React-RCTSettings: 861806819226ed8332e6a8f90df2951a34bb3e7f
React-RCTText: f3fb464cc41a50fc7a1aba4deeb76a9ad8282cb9
React-RCTVibration: 79040b92bfa9c3c2d2cb4f57e981164ec7ab9374
React-runtimeexecutor: b960b687d2dfef0d3761fbb187e01812ebab8b23
ReactCommon: 095366164a276d91ea704ce53cb03825c487a3f2
RNCAsyncStorage: 466b9df1a14bccda91da86e0b7d9a345d78e1673
RNFastImage: 1f2cab428712a4baaf78d6169eaec7f622556dd7
RNFS: fc610f78fdf8bfc89a9e5cc2f898519f4dba1002
RNGestureHandler: 4f4986408310a43f1606c391f38f76e0d6e790d5
RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
RNGestureHandler: 61628a2c859172551aa2100d3e73d1e57878392f
RNLocalize: cbcb55d0e19c78086ea4eea20e03fe8000bbbced
RNReanimated: 64573e25e078ae6bec03b891586d50b9ec284393
RNScreens: 40a2cb40a02a609938137a1e0acfbf8fc9eebf19
@@ -746,7 +728,7 @@ SPEC CHECKSUMS:
Sentry: 0c5cd63d714187b4a39c331c1f0eb04ba7868341
SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608
SwiftAudioEx: 3a4024e48f3b3e45dac6bf2668d7adbe7b83f50e
Yoga: 17cd9a50243093b547c1e539c749928dd68152da
Yoga: 99652481fcd320aefa4a7ef90095b95acd181952
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
PODFILE CHECKSUM: 85fc028e296eda015f9e9d002b5f5c9dbff66827

1129
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "JellyfinAudioPlayer",
"version": "1.2.4",
"version": "1.2.7",
"main": "src/index.js",
"private": true,
"scripts": {
@@ -12,13 +12,9 @@
"build:ios": "react-native bundle --entry-file='index.ts' --bundle-output='./ios/main.jsbundle' --dev=false --platform='ios'"
},
"dependencies": {
"@react-native-community/async-storage": "^1.12.1",
"@react-native-async-storage/async-storage": "^1.17.6",
"@react-native-community/blur": "^3.6.0",
"@react-native-community/masked-view": "^0.1.11",
"@react-native-community/netinfo": "^8.3.0",
"@react-native-community/picker": "^1.8.1",
"@react-native-community/slider": "^4.2.2",
"@react-native/normalize-color": "^2.0.0",
"@react-navigation/bottom-tabs": "^6.3.1",
"@react-navigation/native": "^6.0.10",
"@react-navigation/native-stack": "^6.6.2",
@@ -49,7 +45,7 @@
"react-native-shadow-2": "^6.0.5",
"react-native-svg": "^12.3.0",
"react-native-svg-transformer": "^1.0.0",
"react-native-track-player": "^2.1.3",
"react-native-track-player": "^2.2.0-rc3",
"react-native-webview": "^11.18.2",
"react-redux": "^8.0.1",
"redux": "^4.2.0",
@@ -80,6 +76,7 @@
"metro-config": "^0.70.3",
"metro-react-native-babel-preset": "^0.70.3",
"metro-react-native-babel-transformer": "^0.70.3",
"react-dom": "^17.0.2",
"react-native-codegen": "^0.69.1",
"react-test-renderer": "^17.0.2",
"typescript": "^4.6.4"

View File

@@ -0,0 +1,3 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.18849 19.0509C6.81935 19.4201 6.80177 20.0792 7.19728 20.466C7.58399 20.8527 8.24317 20.8439 8.61231 20.4747L13.9912 15.087L19.3789 20.4747C19.7568 20.8527 20.4072 20.8527 20.794 20.466C21.1719 20.0704 21.1807 19.4288 20.794 19.0509L15.415 13.6632L20.794 8.28431C21.1807 7.90638 21.1807 7.25599 20.794 6.86927C20.3984 6.49134 19.7568 6.48255 19.3789 6.86048L13.9912 12.2482L8.61231 6.86048C8.24317 6.49134 7.5752 6.47376 7.19728 6.86927C6.81056 7.25599 6.81935 7.91517 7.18849 8.28431L12.5762 13.6632L7.18849 19.0509Z" fill="#1C1C1E"/>
</svg>

After

Width:  |  Height:  |  Size: 651 B

View File

@@ -2,7 +2,7 @@ import { BlurView, BlurViewProperties } from '@react-native-community/blur';
import { THEME_COLOR } from 'CONSTANTS';
import React, { PropsWithChildren } from 'react';
import { useContext } from 'react';
import { ColorSchemeName, Platform, StyleSheet, useColorScheme } from 'react-native';
import { ColorSchemeName, Platform, StyleSheet, useColorScheme, View } from 'react-native';
const majorPlatformVersion = typeof Platform.Version === 'string' ? parseInt(Platform.Version, 10) : Platform.Version;
@@ -100,12 +100,16 @@ export function DefaultStylesProvider(props: DefaultStylesProviderProps) {
export function ColoredBlurView(props: PropsWithChildren<BlurViewProperties>) {
const scheme = useColorScheme();
return (
return Platform.OS === 'ios' ? (
<BlurView
{...props}
blurType={Platform.OS === 'ios' && majorPlatformVersion >= 13
? 'material'
: scheme === 'dark' ? 'extraDark' : 'xlight'
} />
) : (
<View {...props} style={[ props.style, {
backgroundColor: scheme === 'light' ? '#f6f6f6f6' : '#333333f6',
} ]} />
);
}

View File

@@ -1,6 +1,6 @@
{
"play-next": "播放下一首",
"play-album": "播放专辑",
"play-album": "播放全部",
"queue": "歌曲队列",
"add-to-queue": "加入队列",
"clear-queue": "清除队列",
@@ -12,8 +12,8 @@
"music": "歌曲",
"now-playing": "正在播放",
"onboarding-welcome": "欢迎",
"onboarding-intro": "Jellyfin Audio Player 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.",
"onboarding-intro": "Jellyfin Audio Player可以在任何地方播放Jellyfin库中的音乐。",
"onboarding-cta": "在开始前你需要一个Jellyfin服务器。点击下方的按钮连接到服务器并登录。",
"set-jellyfin-server": "设置Jellyfin服务器",
"set-jellyfin-server-instruction": "设置Jellyfin服务器的完整网址包括HTTP/HTTS和端口。",
"settings": "设置",
@@ -22,21 +22,42 @@
"jellyfin-access-token": "Jellyfin Access Token",
"jellyfin-user-id": "Jellyfin用户ID",
"setting-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": "如果你更新了Jellyfin库但软件仍显示之前的内容你可以点击下面的按钮强制刷新。这将强制软件重新从服务器获取信息。",
"reset-cache": "清除缓存",
"recent-albums": "最近专辑",
"error-reporting": "Error Reporting",
"error-reporting-description": "During use of this app, you may encounter errors. Reporting these errors helps in creating a more secure and stable app experience.",
"error-reporting-rationale": "When you enable error reporting, every time an error occurs, a report is automatically created and sent to a server, along with helpful debugging information such as devices, versions and the specific error.",
"why-use-tracking": "Why use tracking?",
"why-use-tracking-description": "Tracking helps speed up development for this app by reporting weird edge cases and oversights. This helps make the app more stable and robust, thus increasing the app experience for everyone.",
"what-data-is-gathered": "What data is gathered?",
"what-data-is-gathered-description": "We log the error, device type, OS version, app version and device id. No application state is sent in any error reporting. The device id is a unique hash that can be reset in your device settings, and we cannot deduce any personal information from this identifier.",
"where-is-data-stored": "Where is data stored?",
"where-is-data-stored-description": "The Sentry backend is self-hosted on our own infrastructure. No-one but us has access to the servers, databases, application and data logs, least of all any Sentry staff. The infrastructure is hosted in the European Union.",
"enable-error-reporting": "Do you want to enable error reporting?",
"enable-error-reporting-description": "This helps improve the app experience by sending crash and error reports to us.",
"error-reporting": "报告错误",
"error-reporting-description": "在使用本软件过程中,你可能遇到一些问题。报告这些问题可以使日后的使用更稳定。",
"error-reporting-rationale": "启用错误报告后,每当错误发生时会自动发送错误信息、设备信息、版本等到服务器。",
"why-use-tracking": "为什么要求追踪?",
"why-use-tracking-description": "追踪帮助我们收集那些易被忽略的错误信息以加快我们的开发。这将让软件更稳定从而提高每个人的使用体验。",
"what-data-is-gathered": "收集什么信息?",
"what-data-is-gathered-description": "我们收集错误日志、设备型号、系统版本、软件版本和设备ID在任何情况下都不会发送软件状况。设备ID是你设备的唯一散列值它可以被重置且我们无法从中推断出你的任何个人信息。",
"where-is-data-stored": "数据被收集到哪?",
"where-is-data-stored-description": "数据在我们在欧洲的后端服务器上保存,除了我们没有其他人能访问这些服务器、数据库和应用程序及数据日志。",
"enable-error-reporting": "是否开启错误信息发送",
"enable-error-reporting-description": "这将帮助你在遇到错误时发送报告以提升使用体验。",
"enable": "启用",
"disable": "禁用",
"more-info": "更多信息"
"more-info": "更多信息",
"track": "歌曲",
"playlists": "播放列表",
"playlist": "播放列表",
"play-playlist": "播放全部",
"shuffle-album": "随机播放",
"shuffle-playlist": "随机播放",
"downloads": "下载",
"download-track": "下载歌曲",
"download-album": "下载专辑",
"download-playlist": "下载播放列表",
"no-downloads": "你还没有下载任何歌曲",
"delete-track": "删除歌曲",
"delete-all-tracks": "删除所有歌曲",
"delete-album": "删除专辑",
"delete-playlist": "删除播放列表",
"total-download-size": "总体积",
"retry-failed-downloads": "重试失败下载",
"you-are-offline-message": "你当前处于离线状态,仅能播放缓存的歌曲。",
"playing-on": "播放",
"local-playback": "本地播放",
"streaming": "远程串流"
}

View File

@@ -32,7 +32,8 @@ const Logo = styled.Image`
height: 150px;
margin: 0 auto 50px auto;
border-radius: 12px;
border: 1px solid #e6e6e6;
border-width: 1px;
border-color: #e6e6e6;
`;
function Onboarding() {

View File

@@ -0,0 +1,28 @@
import React, { useCallback } from 'react';
import { useNavigation } from '@react-navigation/native';
import XmarkIcon from 'assets/icons/xmark.svg';
import { TouchableOpacity } from 'react-native';
import styled from 'styled-components/native';
const Container = styled.View`
padding: 6px 12px;
`;
function BackButton() {
const navigation = useNavigation();
const handlePress = useCallback(() => {
console.log(navigation.canGoBack());
navigation.goBack();
}, [navigation]);
return (
<Container>
<TouchableOpacity onPress={handlePress}>
<XmarkIcon />
</TouchableOpacity>
</Container>
);
}
export default BackButton;

View File

@@ -1,16 +1,14 @@
import { t } from '@localisation';
import React from 'react';
import { Text } from 'react-native';
import styled from 'styled-components/native';
const Button = styled.View`
margin: 20px 40px;
const Label = styled.Text`
font-size: 13px;
`;
function Casting() {
return (
<Button>
<Text>Local Playback</Text>
</Button>
<Label>{t('local-playback')}</Label>
);
}

View File

@@ -18,7 +18,7 @@ import ticksToDuration from 'utility/ticksToDuration';
const ICON_SIZE = 16;
const Container = styled.FlatList<Track>`
padding: 40px;
`;
const Header = styled.View`
@@ -103,6 +103,7 @@ export default function Queue({ header }: Props) {
return (
<Container
contentContainerStyle={{ padding: 40 }}
data={queue}
ListHeaderComponent={
<>

View File

@@ -6,10 +6,13 @@ import Queue from './components/Queue';
import ConnectionNotice from './components/ConnectionNotice';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import StreamStatus from './components/StreamStatus';
import { Platform } from 'react-native';
import BackButton from './components/Backbutton';
export default function Player() {
return (
<GestureHandlerRootView style={{ flex: 1 }}>
{Platform.OS === 'android' && (<BackButton />)}
<Queue header={(
<>
<NowPlaying />

View File

@@ -1,15 +1,16 @@
import { createAction, createAsyncThunk, createEntityAdapter, EntityId } from '@reduxjs/toolkit';
import { AppState } from 'store';
import { generateTrackUrl } from 'utility/JellyfinApi';
import { downloadFile, unlink, DocumentDirectoryPath } from 'react-native-fs';
import { downloadFile, unlink, DocumentDirectoryPath, exists } from 'react-native-fs';
import { DownloadEntity } from './types';
import MimeTypes from 'utility/MimeTypes';
export const downloadAdapter = createEntityAdapter<DownloadEntity>({
selectId: (entity) => entity.id,
});
export const queueTrackForDownload = createAction<EntityId>('download/queue');
export const initializeDownload = createAction<{ id: EntityId, size?: number, jobId?: number }>('download/initialize');
export const initializeDownload = createAction<{ id: EntityId, size?: number, jobId?: number, location: string }>('download/initialize');
export const progressDownload = createAction<{ id: EntityId, progress: number, jobId?: number }>('download/progress');
export const completeDownload = createAction<{ id: EntityId, location: string, size?: number }>('download/complete');
export const failDownload = createAction<{ id: EntityId }>('download/fail');
@@ -22,7 +23,21 @@ export const downloadTrack = createAsyncThunk(
// Generate the URL we can use to download the file
const url = generateTrackUrl(id as string, credentials);
const location = `${DocumentDirectoryPath}/${id}.mp3`;
// 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('Jellyfin returned an unrecognized MIME-type');
}
// Then generate the proper location
const location = `${DocumentDirectoryPath}/${id}${extension}`;
// Actually kick off the download
const { promise } = await downloadFile({
@@ -31,7 +46,7 @@ export const downloadTrack = createAsyncThunk(
background: true,
begin: ({ jobId, contentLength }) => {
// Dispatch the initialization
dispatch(initializeDownload({ id, jobId, size: contentLength }));
dispatch(initializeDownload({ id, jobId, size: contentLength, location }));
},
progress: (result) => {
// Dispatch a progress update
@@ -48,8 +63,20 @@ export const downloadTrack = createAsyncThunk(
export const removeDownloadedTrack = createAsyncThunk(
'/downloads/remove/track',
async(id: EntityId) => {
return unlink(`${DocumentDirectoryPath}/${id}.mp3`);
async(id: EntityId, { getState }) => {
// Retrieve the state
const { downloads: { entities }} = getState() as AppState;
// Attempt to retrieve the entity from the state
const download = entities[id];
if (!download) {
throw new Error('Attempted to remove unknown downloaded track.');
}
// Then unlink the file, if it exists
if (await exists(download.location)) {
return unlink(download.location);
}
}
);

View File

@@ -6,6 +6,6 @@ export interface DownloadEntity {
isFailed: boolean;
isComplete: boolean;
size?: number;
location?: string;
location: string;
jobId?: number;
}

View File

@@ -1,6 +1,6 @@
import { configureStore, getDefaultMiddleware, combineReducers } from '@reduxjs/toolkit';
import { useSelector, TypedUseSelectorHook, useDispatch } from 'react-redux';
import AsyncStorage from '@react-native-community/async-storage';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { persistStore, persistReducer, PersistConfig, createMigrate } from 'redux-persist';
import autoMergeLevel2 from 'redux-persist/es/stateReconciler/autoMergeLevel2';

View File

@@ -22,8 +22,7 @@ const baseTrackOptions: Record<string, string> = {
// This must be set to support client seeking
TranscodingProtocol: 'http',
TranscodingContainer: 'aac',
Container: 'mp3,aac,m4a,m4b|aac,alac,m4a,m4b|alac,flac|ogg',
AudioCodec: 'aac',
Container: 'mp3,aac,m4a,m4b|aac,flac,alac,m4a,m4b|alac,flac|ogg',
static: 'true',
};

18
src/utility/MimeTypes.ts Normal file
View File

@@ -0,0 +1,18 @@
/**
* The filetypes this application will most probably receive.
* Adapted from: https://github.com/jellyfin/jellyfin/blob/63d943aab92a4b5f69e625a269eb830bcbfb4d22/MediaBrowser.Model/Net/MimeTypes.cs#L107
*/
const MimeTypes = {
'audio/aac': '.aac',
'audio/ac3': '.ac3',
'audio/dsf': '.dsf',
'audio/dsp': '.dsp',
'audio/flac': '.flac',
'audio/m4b': '.m4b',
'audio/vorbis': '.vorbis',
'audio/x-ape': '.ape',
'audio/xsp': '.xsp',
'audio/x-wavpack': '.wv',
};
export default MimeTypes;

View File

@@ -1,5 +1,5 @@
import { SENTRY_DSN } from '@env';
import AsyncStorage from '@react-native-community/async-storage';
import AsyncStorage from '@react-native-async-storage/async-storage';
import * as Sentry from '@sentry/react-native';
const SENTRY_ASYNC__ITEM_STRING = 'sentry_enabled';