Compare commits

...

49 Commits

Author SHA1 Message Date
Lei Nelissen 4508f6cc1c draft: android screenshots 2023-04-11 18:34:48 +02:00
Lei Nelissen 56647cd7ab chore: add Android screenshots 2023-04-11 18:34:12 +02:00
Lei Nelissen 1648389ccc fix: disable BlurView on Android as it crashes the app 2023-04-11 18:27:55 +02:00
Lei Nelissen a532154ce0 fix: use debug signing config when not having a keystore 2023-04-11 10:48:24 +02:00
Lei Nelissen 74d82eb77a fix: only set signingConfig to release when a keystore is available 2023-04-10 17:42:51 +02:00
Lei Nelissen a8c0003fc1 fix: linter issue 2023-04-10 17:15:32 +02:00
Lei Nelissen ba805e061e feat: Add base Android content for F-Droid and Play Store 2023-04-10 17:10:53 +02:00
Lei Nelissen cc14373575 feat: setup Fastlane for Google Play Store 2023-04-10 17:10:12 +02:00
Lei Nelissen 943815e4a6 chore: update fastlane 2023-04-10 17:09:24 +02:00
Lei Nelissen 2f45f868c8 fix: linting issue 2023-03-08 10:09:59 +01:00
Lei Nelissen 0a0c78f3d5 feat: add fallback images when album cover isn't available 2023-03-07 23:03:09 +01:00
Lei Nelissen 40ecfb08fb chore: release v2.0.3 2023-02-28 10:25:22 +01:00
Lei Nelissen 099bbebe38 fix: improve album list scrolling performance 2023-02-28 10:08:24 +01:00
Lei Nelissen a34b6c5114 fix: prevent track indexes from overflowing 2023-02-10 17:08:12 +01:00
Lei Nelissen 7353b04dd1 chore: add CHANGELOG 2023-01-10 23:25:38 +01:00
Lei Nelissen a2c1a82ebb chore: relase v2.0.2 2023-01-10 23:08:02 +01:00
Lei Nelissen ccfa68c530 fix: allow user-supplied CA certificates on Android
fixes #110
2023-01-10 22:35:02 +01:00
Lei Nelissen 6885ae6216 fix: font colour for dark mode on input 2023-01-10 22:07:53 +01:00
Lei Nelissen 6d8535e24b chore: release v2.0.1 2022-11-28 22:59:29 +01:00
Lei Nelissen d4570b60ae fix: screenshotting logic 2022-11-28 22:56:22 +01:00
Lei Nelissen 9c8e474d51 feat: Save App metadata in the repo 2022-11-28 22:55:36 +01:00
Lei Nelissen 9a1defbeef fix: switch album id to demo instance 2022-11-27 21:19:31 +01:00
Lei Nelissen 87f992d912 fix: use entire input box as touch area for focus 2022-11-27 21:13:09 +01:00
Lei Nelissen 845b379e09 fix: android and ios builds 2022-11-27 21:07:32 +01:00
Lei Nelissen 2f8cf6e081 Merge pull request #105 from leinelissen/feat/rename
feat: Rename Jellyfin Audio Player to Fintunes
2022-11-17 21:25:09 +01:00
Lei Nelissen 0a7f6abf3e fix: Rename Jellyfin Audio Player to Fintunes in translation files 2022-11-17 21:12:52 +01:00
Lei Nelissen 398e38e748 chore: Update fastlane snapshots 2022-11-17 21:08:19 +01:00
Lei Nelissen d072292008 fix: Depcreated createReducer calls 2022-11-17 21:08:07 +01:00
Lei Nelissen 2c7abb72ba chore: migrated from deprecated createReducer syntax 2022-11-13 16:28:05 +01:00
Lei Nelissen e5d1dea925 chore: linter 2022-11-13 12:11:41 +01:00
Lei Nelissen 9807b0e920 fix: jumpy progress animations 2022-11-13 12:09:48 +01:00
Lei Nelissen 7ed389ead6 fix: Only show single line for tracks without artists or albums 2022-11-13 12:09:36 +01:00
Lei Nelissen 0ffc5b6489 fix: Input icon alignment on Android 2022-11-13 11:25:57 +01:00
Lei Nelissen cce15ab46b chore: patch for sentry 2022-11-13 11:04:51 +01:00
Lei Nelissen d81c4c3c92 chore: linter 2022-11-12 17:47:43 +01:00
Lei Nelissen b2bd211758 fix: BlurView on Android 2022-11-12 17:43:24 +01:00
Lei Nelissen cd10ddd260 fix: Ensure proper spacing in downloads screen 2022-11-12 17:30:30 +01:00
Lei Nelissen f8812bc75c chore: remove redundant console.log 2022-11-12 17:27:18 +01:00
Lei Nelissen 68de2ca80e fix: margin on connection notice 2022-11-12 17:27:12 +01:00
Lei Nelissen e0493c4a55 fix: Blur obscuring buttons on Android 2022-11-12 17:27:04 +01:00
Lei Nelissen f50e5914ec chore: fix android build issues 2022-11-12 17:20:02 +01:00
Lei Nelissen c7aec30e39 chore: Upgrade to latest react-native 2022-11-12 16:22:39 +01:00
Lei Nelissen c19b9d8920 Add screenshotting 2022-10-01 13:04:24 +02:00
Lei Nelissen a402757c96 Remove ClosePlayer 2022-10-01 13:01:40 +02:00
Lei Nelissen 4d025d5411 Base commit 2022-10-01 13:01:40 +02:00
Lei Nelissen b41031eeac fix: Remove any restrictions on bitrate and samplerate 2022-08-14 15:39:49 +02:00
Lei Nelissen f0e8dc998c chore: update Fastlane plugins 2022-08-14 15:39:27 +02:00
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
196 changed files with 9547 additions and 8666 deletions
+4
View File
@@ -70,3 +70,7 @@ certificates/
.env .env
sentry.properties sentry.properties
screenshots
fastlane/Preview.html
fastlane/play-store-credentials.json
+1
View File
@@ -0,0 +1 @@
16
+1
View File
@@ -0,0 +1 @@
legacy-peer-deps=true
+160
View File
@@ -0,0 +1,160 @@
## [2.0.3](https://github.com/leinelissen/jellyfin-audio-player/compare/v2.0.2...v2.0.3) (2023-02-28)
### Bug Fixes
* improve album list scrolling performance ([099bbeb](https://github.com/leinelissen/jellyfin-audio-player/commit/099bbebe38942f2c72782e6c34ad3cea0876b291))
* prevent track indexes from overflowing ([a34b6c5](https://github.com/leinelissen/jellyfin-audio-player/commit/a34b6c51141cb3cd6058733ccb3323d75f40bbd5))
## [2.0.2](https://github.com/leinelissen/jellyfin-audio-player/compare/v2.0.1...v2.0.2) (2023-01-10)
### Bug Fixes
* allow user-supplied CA certificates on Android ([ccfa68c](https://github.com/leinelissen/jellyfin-audio-player/commit/ccfa68c53045dfc1a7071d282da477a3ec6c9f60)), closes [#110](https://github.com/leinelissen/jellyfin-audio-player/issues/110)
* font colour for dark mode on input ([6885ae6](https://github.com/leinelissen/jellyfin-audio-player/commit/6885ae6216119155e86146c39ca502fa8a18183f))
## [2.0.1](https://github.com/leinelissen/jellyfin-audio-player/compare/v2.0.0...v2.0.1) (2022-11-28)
### Bug Fixes
* android and ios builds ([845b379](https://github.com/leinelissen/jellyfin-audio-player/commit/845b379e0983f012a2eda65350748307d4b74dca))
* Blur obscuring buttons on Android ([e0493c4](https://github.com/leinelissen/jellyfin-audio-player/commit/e0493c4a55157abff8fbb1eddeab331ac856feff))
* BlurView on Android ([b2bd211](https://github.com/leinelissen/jellyfin-audio-player/commit/b2bd211758f13a789294b98b5a129b07519ec3f8))
* Depcreated createReducer calls ([d072292](https://github.com/leinelissen/jellyfin-audio-player/commit/d072292008929aa53738bf69e91eb6925686687a))
* Ensure proper spacing in downloads screen ([cd10ddd](https://github.com/leinelissen/jellyfin-audio-player/commit/cd10ddd260c0a8d2b967248fe6dc0aeb09983e32))
* Input icon alignment on Android ([0ffc5b6](https://github.com/leinelissen/jellyfin-audio-player/commit/0ffc5b64894099d761451483fa7cd35e76446054))
* jumpy progress animations ([9807b0e](https://github.com/leinelissen/jellyfin-audio-player/commit/9807b0e920379ea646f6940d814cd2ed239a2054))
* margin on connection notice ([68de2ca](https://github.com/leinelissen/jellyfin-audio-player/commit/68de2ca80e3ba55489a34d9464af4f891093ffe6))
* Only show single line for tracks without artists or albums ([7ed389e](https://github.com/leinelissen/jellyfin-audio-player/commit/7ed389ead647c299be229b15fab47a8cc97be8c7))
* Remove any restrictions on bitrate and samplerate ([b41031e](https://github.com/leinelissen/jellyfin-audio-player/commit/b41031eeac9b5a9976b10a93d620bfd108c8d97c))
* Rename Jellyfin Audio Player to Fintunes in translation files ([0a7f6ab](https://github.com/leinelissen/jellyfin-audio-player/commit/0a7f6abf3e6af6f5684b63b0005868f250e687a2))
* screenshotting logic ([d4570b6](https://github.com/leinelissen/jellyfin-audio-player/commit/d4570b60aecdeae4ce8dedb63c511f359e9760cb))
* switch album id to demo instance ([9a1defb](https://github.com/leinelissen/jellyfin-audio-player/commit/9a1defbeef61a79addec4f71e0363e0b0271a111))
* use entire input box as touch area for focus ([87f992d](https://github.com/leinelissen/jellyfin-audio-player/commit/87f992d912f0846773a85d67b6f67a90fe1ac293))
### Features
* Save App metadata in the repo ([9c8e474](https://github.com/leinelissen/jellyfin-audio-player/commit/9c8e474d51402f5e6fa24ab683cc86aa3e131552))
## [1.2.7](https://github.com/leinelissen/jellyfin-audio-player/compare/v1.2.6...v1.2.7) (2022-08-13)
### Features
* Allow FLAC playback ([5b54760](https://github.com/leinelissen/jellyfin-audio-player/commit/5b54760e4ee6620062ce0cc4c79daf81753f00ae))
## [1.2.6](https://github.com/leinelissen/jellyfin-audio-player/compare/v1.2.6-beta.1...v1.2.6) (2022-08-09)
### Bug Fixes
* Peer dependency chain ([63bbbf2](https://github.com/leinelissen/jellyfin-audio-player/commit/63bbbf2719aa5d296a6ec99774f9bf1a1aa068d0))
* Remove unused imports ([c7f0d46](https://github.com/leinelissen/jellyfin-audio-player/commit/c7f0d46b410825765ab5d074469ec23d32ffd45d))
## [1.2.6-beta.1](https://github.com/leinelissen/jellyfin-audio-player/compare/v1.2.5...v1.2.6-beta.1) (2022-06-09)
## [1.2.5](https://github.com/leinelissen/jellyfin-audio-player/compare/v1.2.4...v1.2.5) (2022-05-18)
### Bug Fixes
* Only pull Exoplayer from jcenter ([89d2984](https://github.com/leinelissen/jellyfin-audio-player/commit/89d29844b9821e1a42b3b60c43dc4c3078231d56))
### Features
* Apply default text styles to ReText ([37ead0e](https://github.com/leinelissen/jellyfin-audio-player/commit/37ead0ec989a8b714fde1bcb6dd36e568c6e7e8c))
* Create new progress slider from scratch ([6efc8e7](https://github.com/leinelissen/jellyfin-audio-player/commit/6efc8e757c10c66019914f7561d075c3ecaf2f69))
* Implement colored blur backgrounds ([f48d248](https://github.com/leinelissen/jellyfin-audio-player/commit/f48d2481443850888a0bd1a1cf2604420e633b26))
* Tweak progress bar gestures ([b0961d3](https://github.com/leinelissen/jellyfin-audio-player/commit/b0961d3263d5f4ef3978fde748a6a277059cb0cb))
## [1.2.4](https://github.com/leinelissen/jellyfin-audio-player/compare/v1.2.3...v1.2.4) (2022-05-04)
### Bug Fixes
* No interaction on Android webview ([#59](https://github.com/leinelissen/jellyfin-audio-player/issues/59)) ([91eaa1d](https://github.com/leinelissen/jellyfin-audio-player/commit/91eaa1d864f66e1a6597809bd46c17907acc99ee))
## [1.2.3](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.2.3...v1.2.3) (2022-01-16)
## [0.2.3](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.2.2...v0.2.3) (2022-01-15)
## [0.2.2](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.2.1...v0.2.2) (2022-01-03)
## [0.2.1](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.2.0...v0.2.1) (2022-01-02)
# [0.2.0](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.1.7...v0.2.0) (2022-01-02)
## [0.1.7](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.1.6...v0.1.7) (2021-10-25)
## [0.1.6](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.1.5...v0.1.6) (2021-04-25)
## [0.1.5](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.1.4...v0.1.5) (2021-04-24)
## [0.1.4](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.1.3...v0.1.4) (2021-04-03)
## [0.1.3](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.1.2...v0.1.3) (2021-03-21)
## [0.1.2](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.1.1...v0.1.2) (2021-03-09)
## [0.1.1](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.1.0...v0.1.1) (2021-02-13)
# [0.1.0](https://github.com/leinelissen/jellyfin-audio-player/compare/v1.0.0-beta3...v0.1.0) (2021-02-07)
# [1.0.0-beta3](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.0.1-alpha1...v1.0.0-beta3) (2020-08-25)
## [0.0.1-alpha1](https://github.com/leinelissen/jellyfin-audio-player/compare/v0.0.1-alpha0...v0.0.1-alpha1) (2020-07-26)
## 0.0.1-alpha0 (2020-07-10)
+142 -64
View File
@@ -1,51 +1,103 @@
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
CFPropertyList (3.0.3) CFPropertyList (3.0.6)
addressable (2.8.0) rexml
public_suffix (>= 2.0.2, < 5.0) activesupport (6.1.6)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
zeitwerk (~> 2.3)
addressable (2.8.4)
public_suffix (>= 2.0.2, < 6.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
json (>= 1.5.1)
artifactory (3.0.15) artifactory (3.0.15)
atomos (0.1.3) atomos (0.1.3)
aws-eventstream (1.1.1) aws-eventstream (1.2.0)
aws-partitions (1.488.0) aws-partitions (1.743.0)
aws-sdk-core (3.119.0) aws-sdk-core (3.171.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.239.0) aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.63.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
jmespath (~> 1.0) aws-sdk-s3 (1.120.1)
aws-sdk-kms (1.46.0) aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-core (~> 3, >= 3.119.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.99.0)
aws-sdk-core (~> 3, >= 3.119.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.4)
aws-sigv4 (1.2.4) aws-sigv4 (1.5.2)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4) babosa (1.0.4)
claide (1.0.3) claide (1.1.0)
cocoapods (1.11.3)
addressable (~> 2.8)
claide (>= 1.0.2, < 2.0)
cocoapods-core (= 1.11.3)
cocoapods-deintegrate (>= 1.0.3, < 2.0)
cocoapods-downloader (>= 1.4.0, < 2.0)
cocoapods-plugins (>= 1.0.0, < 2.0)
cocoapods-search (>= 1.0.0, < 2.0)
cocoapods-trunk (>= 1.4.0, < 2.0)
cocoapods-try (>= 1.1.0, < 2.0)
colored2 (~> 3.1)
escape (~> 0.0.4)
fourflusher (>= 2.3.0, < 3.0)
gh_inspector (~> 1.0)
molinillo (~> 0.8.0)
nap (~> 1.0)
ruby-macho (>= 1.0, < 3.0)
xcodeproj (>= 1.21.0, < 2.0)
cocoapods-core (1.11.3)
activesupport (>= 5.0, < 7)
addressable (~> 2.8)
algoliasearch (~> 1.0)
concurrent-ruby (~> 1.1)
fuzzy_match (~> 2.0.4)
nap (~> 1.0)
netrc (~> 0.11)
public_suffix (~> 4.0)
typhoeus (~> 1.0)
cocoapods-deintegrate (1.0.5)
cocoapods-downloader (1.6.3)
cocoapods-plugins (1.0.0)
nap
cocoapods-search (1.0.1)
cocoapods-trunk (1.6.0)
nap (>= 0.8, < 2.0)
netrc (~> 0.11)
cocoapods-try (1.2.0)
colored (1.2) colored (1.2)
colored2 (3.1.2) colored2 (3.1.2)
commander (4.6.0) commander (4.6.0)
highline (~> 2.0.0) highline (~> 2.0.0)
concurrent-ruby (1.1.10)
declarative (0.0.20) declarative (0.0.20)
digest-crc (0.6.4) digest-crc (0.6.4)
rake (>= 12.0.0, < 14.0.0) rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701) domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
dotenv (2.7.6) dotenv (2.8.1)
emoji_regex (3.2.2) emoji_regex (3.2.3)
excon (0.85.0) escape (0.0.4)
faraday (1.7.0) ethon (0.15.0)
ffi (>= 1.15.0)
excon (0.99.0)
faraday (1.10.3)
faraday-em_http (~> 1.0) faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0) faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1) faraday-excon (~> 1.1)
faraday-httpclient (~> 1.0.1) faraday-httpclient (~> 1.0)
faraday-multipart (~> 1.0)
faraday-net_http (~> 1.0) faraday-net_http (~> 1.0)
faraday-net_http_persistent (~> 1.1) faraday-net_http_persistent (~> 1.0)
faraday-patron (~> 1.0) faraday-patron (~> 1.0)
faraday-rack (~> 1.0) faraday-rack (~> 1.0)
multipart-post (>= 1.2, < 3) faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4) ruby2_keywords (>= 0.0.4)
faraday-cookie_jar (0.0.7) faraday-cookie_jar (0.0.7)
faraday (>= 0.8.0) faraday (>= 0.8.0)
@@ -54,14 +106,17 @@ GEM
faraday-em_synchrony (1.0.0) faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0) faraday-excon (1.1.0)
faraday-httpclient (1.0.1) faraday-httpclient (1.0.1)
faraday-multipart (1.0.4)
multipart-post (~> 2)
faraday-net_http (1.0.1) faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0) faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0) faraday-patron (1.0.0)
faraday-rack (1.0.0) faraday-rack (1.0.0)
faraday_middleware (1.1.0) faraday-retry (1.0.3)
faraday_middleware (1.2.0)
faraday (~> 1.0) faraday (~> 1.0)
fastimage (2.2.5) fastimage (2.2.6)
fastlane (2.191.0) fastlane (2.212.1)
CFPropertyList (>= 2.3, < 4.0.0) CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0) addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0) artifactory (~> 3.0)
@@ -87,6 +142,7 @@ GEM
mini_magick (>= 4.9.4, < 5.0.0) mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (~> 2.0.0) multipart-post (~> 2.0.0)
naturally (~> 2.2) naturally (~> 2.2)
optparse (~> 0.1.1)
plist (>= 3.1.0, < 4.0.0) plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0) rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.3) security (= 0.1.3)
@@ -99,11 +155,17 @@ GEM
xcodeproj (>= 1.13.0, < 2.0.0) xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.3.0) xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3) xcpretty-travis-formatter (>= 0.0.3)
fastlane-plugin-sentry (1.8.1) fastlane-plugin-load_json (0.0.1)
fastlane-plugin-sentry (1.14.0)
os (~> 1.1, >= 1.1.4)
fastlane-plugin-versioning_android (0.1.0)
ffi (1.15.5)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3) gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.10.0) google-apis-androidpublisher_v3 (0.38.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.4.1) google-apis-core (0.11.0)
addressable (~> 2.5, >= 2.5.1) addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a) httpclient (>= 2.8.1, < 3.a)
@@ -112,85 +174,97 @@ GEM
retriable (>= 2.0, < 4.a) retriable (>= 2.0, < 4.a)
rexml rexml
webrick webrick
google-apis-iamcredentials_v1 (0.6.0) google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.5.0) google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.6.0) google-apis-storage_v1 (0.19.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.9.0, < 2.a)
google-cloud-core (1.6.0) google-cloud-core (1.6.0)
google-cloud-env (~> 1.0) google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0) google-cloud-errors (~> 1.0)
google-cloud-env (1.5.0) google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.1.0) google-cloud-errors (1.3.1)
google-cloud-storage (1.34.1) google-cloud-storage (1.44.0)
addressable (~> 2.5) addressable (~> 2.8)
digest-crc (~> 0.4) digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1) google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.1) google-apis-storage_v1 (~> 0.19.0)
google-cloud-core (~> 1.6) google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0) mini_mime (~> 1.0)
googleauth (0.17.0) googleauth (1.5.0)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0) jwt (>= 1.4, < 3.0)
memoist (~> 0.16) memoist (~> 0.16)
multi_json (~> 1.11) multi_json (~> 1.11)
os (>= 0.9, < 2.0) os (>= 0.9, < 2.0)
signet (~> 0.14) signet (>= 0.16, < 2.a)
highline (2.0.3) highline (2.0.3)
http-cookie (1.0.4) http-cookie (1.0.5)
domain_name (~> 0.5) domain_name (~> 0.5)
httpclient (2.8.3) httpclient (2.8.3)
jmespath (1.4.0) i18n (1.10.0)
json (2.5.1) concurrent-ruby (~> 1.0)
jwt (2.2.3) jmespath (1.6.2)
json (2.6.3)
jwt (2.7.0)
memoist (0.16.2) memoist (0.16.2)
mini_magick (4.11.0) mini_magick (4.12.0)
mini_mime (1.1.0) mini_mime (1.1.2)
minitest (5.15.0)
molinillo (0.8.0)
multi_json (1.15.0) multi_json (1.15.0)
multipart-post (2.0.0) multipart-post (2.0.0)
nanaimo (0.3.0) nanaimo (0.3.0)
nap (1.1.0)
naturally (2.2.1) naturally (2.2.1)
os (1.1.1) netrc (0.11.0)
plist (3.6.0) optparse (0.1.1)
public_suffix (4.0.6) os (1.1.4)
plist (3.7.0)
public_suffix (4.0.7)
rake (13.0.6) rake (13.0.6)
representable (3.1.1) representable (3.2.0)
declarative (< 0.1.0) declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0) trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0) uber (< 0.2.0)
retriable (3.1.2) retriable (3.1.2)
rexml (3.2.5) rexml (3.2.5)
rouge (2.0.7) rouge (2.0.7)
ruby-macho (2.5.1)
ruby2_keywords (0.0.5) ruby2_keywords (0.0.5)
rubyzip (2.3.2) rubyzip (2.3.2)
security (0.1.3) security (0.1.3)
signet (0.15.0) signet (0.17.0)
addressable (~> 2.3) addressable (~> 2.8)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0) jwt (>= 1.5, < 3.0)
multi_json (~> 1.10) multi_json (~> 1.10)
simctl (1.6.8) simctl (1.6.10)
CFPropertyList CFPropertyList
naturally naturally
terminal-notifier (2.0.0) terminal-notifier (2.0.0)
terminal-table (1.8.0) terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1) unicode-display_width (~> 1.1, >= 1.1.1)
trailblazer-option (0.1.1) trailblazer-option (0.1.2)
tty-cursor (0.7.1) tty-cursor (0.7.1)
tty-screen (0.8.1) tty-screen (0.8.1)
tty-spinner (0.9.3) tty-spinner (0.9.3)
tty-cursor (~> 0.7) tty-cursor (~> 0.7)
typhoeus (1.4.0)
ethon (>= 0.9.0)
tzinfo (2.0.4)
concurrent-ruby (~> 1.0)
uber (0.1.0) uber (0.1.0)
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
unf_ext (0.0.7.7) unf_ext (0.0.8.2)
unicode-display_width (1.7.0) unicode-display_width (1.8.0)
webrick (1.7.0) webrick (1.8.1)
word_wrap (1.0.0) word_wrap (1.0.0)
xcodeproj (1.21.0) xcodeproj (1.22.0)
CFPropertyList (>= 2.3.3, < 4.0) CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3) atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0) claide (>= 1.0.2, < 2.0)
@@ -201,13 +275,17 @@ GEM
rouge (~> 2.0.7) rouge (~> 2.0.7)
xcpretty-travis-formatter (1.0.1) xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7) xcpretty (~> 0.2, >= 0.0.7)
zeitwerk (2.6.0)
PLATFORMS PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
cocoapods (~> 1.11, >= 1.11.2)
fastlane (~> 2.153) fastlane (~> 2.153)
fastlane-plugin-load_json
fastlane-plugin-sentry fastlane-plugin-sentry
fastlane-plugin-versioning_android
BUNDLED WITH BUNDLED WITH
1.17.2 1.17.2
+2 -2
View File
@@ -35,12 +35,12 @@ android_library(
android_build_config( android_build_config(
name = "build_config", name = "build_config",
package = "com.jellyfinaudioplayer", package = "nl.moeilijkedingen.jellyfinaudioplayer",
) )
android_resource( android_resource(
name = "res", name = "res",
package = "com.jellyfinaudioplayer", package = "nl.moeilijkedingen.jellyfinaudioplayer",
res = "src/main/res", res = "src/main/res",
) )
+56 -40
View File
@@ -79,7 +79,7 @@ import org.apache.tools.ant.taskdefs.condition.Os
*/ */
project.ext.react = [ project.ext.react = [
enableHermes: false, // clean and rebuild if changing enableHermes: true, // clean and rebuild if changing
] ]
apply from: "../../node_modules/react-native/react.gradle" apply from: "../../node_modules/react-native/react.gradle"
@@ -135,35 +135,23 @@ android {
compileSdkVersion rootProject.ext.compileSdkVersion compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig { defaultConfig {
applicationId "com.jellyfinaudioplayer" applicationId "nl.moeilijkedingen.jellyfinaudioplayer"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 10 versionCode 15
versionName "1.2.6" versionName "2.0.3"
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
if (isNewArchitectureEnabled()) { if (isNewArchitectureEnabled()) {
// We configure the NDK build only if you decide to opt-in for the New Architecture. // We configure the CMake build only if you decide to opt-in for the New Architecture.
externalNativeBuild { externalNativeBuild {
ndkBuild { cmake {
arguments "APP_PLATFORM=android-21", arguments "-DPROJECT_BUILD_DIR=$buildDir",
"APP_STL=c++_shared", "-DREACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
"NDK_TOOLCHAIN_VERSION=clang", "-DREACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build",
"GENERATED_SRC_DIR=$buildDir/generated/source", "-DNODE_MODULES_DIR=$rootDir/../node_modules",
"PROJECT_BUILD_DIR=$buildDir", "-DANDROID_STL=c++_shared"
"REACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
"REACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build"
cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
cppFlags "-std=c++17"
// Make sure this target name is the same you specify inside the
// src/main/jni/Android.mk file for the `LOCAL_MODULE` variable.
targets "rndiffapp_appmodules"
// Fix for windows limit on number of character in file paths and in command lines
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
arguments "NDK_OUT=${rootProject.projectDir.getParent()}\\.cxx",
"NDK_APP_SHORT_COMMANDS=true"
}
} }
} }
if (!enableSeparateBuildPerCPUArchitecture) { if (!enableSeparateBuildPerCPUArchitecture) {
@@ -177,8 +165,8 @@ android {
if (isNewArchitectureEnabled()) { if (isNewArchitectureEnabled()) {
// We configure the NDK build only if you decide to opt-in for the New Architecture. // We configure the NDK build only if you decide to opt-in for the New Architecture.
externalNativeBuild { externalNativeBuild {
ndkBuild { cmake {
path "$projectDir/src/main/jni/Android.mk" path "$projectDir/src/main/jni/CMakeLists.txt"
} }
} }
def reactAndroidProjectDir = project(':ReactAndroid').projectDir def reactAndroidProjectDir = project(':ReactAndroid').projectDir
@@ -200,15 +188,15 @@ android {
preReleaseBuild.dependsOn(packageReactNdkReleaseLibs) preReleaseBuild.dependsOn(packageReactNdkReleaseLibs)
// Due to a bug inside AGP, we have to explicitly set a dependency // Due to a bug inside AGP, we have to explicitly set a dependency
// between configureNdkBuild* tasks and the preBuild tasks. // between configureCMakeDebug* tasks and the preBuild tasks.
// This can be removed once this is solved: https://issuetracker.google.com/issues/207403732 // This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
configureNdkBuildRelease.dependsOn(preReleaseBuild) configureCMakeRelWithDebInfo.dependsOn(preReleaseBuild)
configureNdkBuildDebug.dependsOn(preDebugBuild) configureCMakeDebug.dependsOn(preDebugBuild)
reactNativeArchitectures().each { architecture -> reactNativeArchitectures().each { architecture ->
tasks.findByName("configureNdkBuildDebug[${architecture}]")?.configure { tasks.findByName("configureCMakeDebug[${architecture}]")?.configure {
dependsOn("preDebugBuild") dependsOn("preDebugBuild")
} }
tasks.findByName("configureNdkBuildRelease[${architecture}]")?.configure { tasks.findByName("configureCMakeRelWithDebInfo[${architecture}]")?.configure {
dependsOn("preReleaseBuild") dependsOn("preReleaseBuild")
} }
} }
@@ -230,6 +218,14 @@ android {
keyAlias 'androiddebugkey' keyAlias 'androiddebugkey'
keyPassword 'android' keyPassword 'android'
} }
release {
if (project.hasProperty('FINTUNES_UPLOAD_STORE_FILE')) {
storeFile file(FINTUNES_UPLOAD_STORE_FILE)
storePassword FINTUNES_UPLOAD_STORE_PASSWORD
keyAlias FINTUNES_UPLOAD_KEY_ALIAS
keyPassword FINTUNES_UPLOAD_KEY_PASSWORD
}
}
} }
buildTypes { buildTypes {
debug { debug {
@@ -238,7 +234,11 @@ android {
release { release {
// Caution! In production, you need to generate your own keystore file. // Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android. // see https://reactnative.dev/docs/signed-apk-android.
signingConfig signingConfigs.debug if (project.hasProperty('FINTUNES_UPLOAD_STORE_FILE')) {
signingConfig signingConfigs.release
} else {
signingConfig signingConfigs.debug
}
minifyEnabled enableProguardInReleaseBuilds minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
} }
@@ -282,10 +282,26 @@ dependencies {
exclude group:'com.facebook.flipper' exclude group:'com.facebook.flipper'
} }
// fastlane screengrab, falcon is a dependency of screengrab
androidTestImplementation 'com.jraska:falcon:2.2.0'
androidTestImplementation "tools.fastlane:screengrab:2.1.0"
// Espresso dependencies
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
// Hamcrest library
androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'
// Core library
androidTestImplementation 'androidx.test:core:1.4.0'
// AndroidJUnitRunner and JUnit Rules
androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test:rules:1.4.0'
if (enableHermes) { if (enableHermes) {
def hermesPath = "../../node_modules/hermes-engine/android/"; //noinspection GradleDynamicVersion
debugImplementation files(hermesPath + "hermes-debug.aar") implementation("com.facebook.react:hermes-engine:+") { // From node_modules
releaseImplementation files(hermesPath + "hermes-release.aar") exclude group:'com.facebook.fbjni'
}
} else { } else {
implementation jscFlavor implementation jscFlavor
} }
@@ -298,12 +314,12 @@ if (isNewArchitectureEnabled()) {
configurations.all { configurations.all {
resolutionStrategy.dependencySubstitution { resolutionStrategy.dependencySubstitution {
substitute(module("com.facebook.react:react-native")) substitute(module("com.facebook.react:react-native"))
.using(project(":ReactAndroid")).because("On New Architecture we're building React Native from source") .using(project(":ReactAndroid"))
.because("On New Architecture we're building React Native from source")
substitute(module("com.facebook.react:hermes-engine"))
.using(project(":ReactAndroid:hermes-engine"))
.because("On New Architecture we're building Hermes from source")
} }
resolutionStrategy {
force 'com.google.android.exoplayer:exoplayer-core:2.11.4'
}
} }
} }
@@ -0,0 +1,105 @@
package nl.moeilijkedingen.jellyfinaudioplayer;
import androidx.test.rule.ActivityTestRule;
import nl.moeilijkedingen.jellyfinaudioplayer.R;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.Arrays;
import tools.fastlane.screengrab.Screengrab;
import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy;
import tools.fastlane.screengrab.cleanstatusbar.BluetoothState;
import tools.fastlane.screengrab.cleanstatusbar.CleanStatusBar;
import tools.fastlane.screengrab.cleanstatusbar.MobileDataType;
import tools.fastlane.screengrab.locale.LocaleTestRule;
import androidx.test.espresso.NoMatchingViewException;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.core.AllOf.allOf;
@RunWith(JUnit4.class)
public class ScreenshotTest {
@ClassRule
public static final LocaleTestRule localeTestRule = new LocaleTestRule();
@Rule
public ActivityTestRule<MainActivity> activityRule = new ActivityTestRule<>(MainActivity.class);
@BeforeClass
public static void beforeAll() {
Screengrab.setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy());
CleanStatusBar.enableWithDefaults();
}
@AfterClass
public static void afterAll() {
CleanStatusBar.disable();
}
/*
Custom wait function. In order to make sure each button press yields a
desirable screen, we use the wait function to delay further actions until
the current one has achieved its purpose.
`duration` indicates the amount of milli-seconds to wait. The value of
`duration` is acquired by emperical trial-and-error.
*/
public void wait(int duration) {
try {
Thread.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void inputText(Integer id, String text) {
try {
onView(allOf(withId(id))).perform(typeText(text));
} catch (NoMatchingViewException e) {
e.printStackTrace();
}
}
@Test
public void testTakeScreenshot() {
System.out.println("AVAILABLE IDS:" + Arrays.toString(R.id.class.getFields()));
// wait(10000);
// Screengrab.screenshot("04RecentAlbums");
// onView(allOf(withId(R.id.all_albums))).perform(click());
// wait(5000);
// Screengrab.screenshot("05AlbumsScreen");
// onView(allOf(withId(R.id.search_tab))).perform(click());
// wait(5000);
// onView(allOf(withId(R.id.search_input_container))).perform(click());
// wait(5000);
// onView(allOf(withId(R.id.search_input_textinput))).perform(typeText("bicep"));
// wait(5000);
// onView(allOf(withId(R.id.search_result_a644f8d23821601d2feb86ddae5e64f4))).perform(click());
// wait(5000);
// Screengrab.screenshot("02AlbumScreen");
// onView(allOf(withId(R.id.play_album))).perform(click());
// wait(5000);
// onView(allOf(withId(R.id.open_player_modal))).perform(click());
// wait(5000);
// Screengrab.screenshot("01PlayModal");
}
}
+13 -1
View File
@@ -3,9 +3,21 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.DUMP"/>
<!-- Allows unlocking your device and activating its screen so UI tests can succeed -->
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<!-- Allows for storing and retrieving screenshots -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Allows changing locales -->
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<application <application
android:usesCleartextTraffic="true" android:networkSecurityConfig="@xml/react_native_config"
tools:targetApi="28" tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning"> tools:ignore="GoogleAppIndexingWarning">
<activity <activity
@@ -4,7 +4,7 @@
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root * <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree. * directory of this source tree.
*/ */
package com.jellyfinaudioplayer; package nl.moeilijkedingen.jellyfinaudioplayer;
import android.content.Context; import android.content.Context;
import com.facebook.flipper.android.AndroidFlipperClient; import com.facebook.flipper.android.AndroidFlipperClient;
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="user"/>
<certificates src="system"/>
</trust-anchors>
</base-config>
</network-security-config>
+2 -2
View File
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jellyfinaudioplayer"> package="nl.moeilijkedingen.jellyfinaudioplayer">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
@@ -9,7 +9,7 @@
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="false" android:allowBackup="false"
android:usesCleartextTraffic="true" android:networkSecurityConfig="@xml/react_native_config"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
@@ -1,7 +1,8 @@
package com.jellyfinaudioplayer; package nl.moeilijkedingen.jellyfinaudioplayer;;
import com.facebook.react.ReactActivity; import com.facebook.react.ReactActivity;
import android.os.Bundle; import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
public class MainActivity extends ReactActivity { public class MainActivity extends ReactActivity {
@@ -11,11 +12,37 @@ public class MainActivity extends ReactActivity {
*/ */
@Override @Override
protected String getMainComponentName() { protected String getMainComponentName() {
return "JellyfinAudioPlayer"; return "Fintunes";
} }
/**
* Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and
* you can specify the renderer you wish to use - the new renderer (Fabric) or the old renderer
* (Paper).
*/
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected ReactActivityDelegate createReactActivityDelegate() {
super.onCreate(null); return new MainActivityDelegate(this, getMainComponentName());
}
public static class MainActivityDelegate extends ReactActivityDelegate {
public MainActivityDelegate(ReactActivity activity, String mainComponentName) {
super(activity, mainComponentName);
}
@Override
protected ReactRootView createRootView() {
ReactRootView reactRootView = new ReactRootView(getContext());
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED);
return reactRootView;
}
@Override
protected boolean isConcurrentRootEnabled() {
// If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18).
// More on this on https://reactjs.org/blog/2022/03/29/react-v18.html
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
}
} }
} }
@@ -1,4 +1,4 @@
package com.jellyfinaudioplayer; package nl.moeilijkedingen.jellyfinaudioplayer;
import android.app.Application; import android.app.Application;
import android.content.Context; import android.content.Context;
@@ -70,7 +70,7 @@ public class MainApplication extends Application implements ReactApplication {
We use reflection here to pick up the class that initializes Flipper, We use reflection here to pick up the class that initializes Flipper,
since Flipper library is not available in release mode since Flipper library is not available in release mode
*/ */
Class<?> aClass = Class.forName("com.jellyfinaudioplayer.ReactNativeFlipper"); Class<?> aClass = Class.forName("nl.moeilijkedingen.jellyfinaudioplayer.ReactNativeFlipper");
aClass aClass
.getMethod("initializeFlipper", Context.class, ReactInstanceManager.class) .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
.invoke(null, context, reactInstanceManager); .invoke(null, context, reactInstanceManager);
+7
View File
@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 3.13)
# Define the library name here.
project(rndiffapp_appmodules)
# This file includes all the necessary to let you build your application with the New Architecture.
include(${REACT_ANDROID_DIR}/cmake-utils/ReactNative-application.cmake)
@@ -0,0 +1,32 @@
#include "MainApplicationModuleProvider.h"
#include <rncli.h>
#include <rncore.h>
namespace facebook {
namespace react {
std::shared_ptr<TurboModule> MainApplicationModuleProvider(
const std::string &moduleName,
const JavaTurboModule::InitParams &params) {
// Here you can provide your own module provider for TurboModules coming from
// either your application or from external libraries. The approach to follow
// is similar to the following (for a library called `samplelibrary`:
//
// auto module = samplelibrary_ModuleProvider(moduleName, params);
// if (module != nullptr) {
// return module;
// }
// return rncore_ModuleProvider(moduleName, params);
// Module providers autolinked by RN CLI
auto rncli_module = rncli_ModuleProvider(moduleName, params);
if (rncli_module != nullptr) {
return rncli_module;
}
return rncore_ModuleProvider(moduleName, params);
}
} // namespace react
} // namespace facebook
@@ -0,0 +1,16 @@
#pragma once
#include <memory>
#include <string>
#include <ReactCommon/JavaTurboModule.h>
namespace facebook {
namespace react {
std::shared_ptr<TurboModule> MainApplicationModuleProvider(
const std::string &moduleName,
const JavaTurboModule::InitParams &params);
} // namespace react
} // namespace facebook
@@ -0,0 +1,45 @@
#include "MainApplicationTurboModuleManagerDelegate.h"
#include "MainApplicationModuleProvider.h"
namespace facebook {
namespace react {
jni::local_ref<MainApplicationTurboModuleManagerDelegate::jhybriddata>
MainApplicationTurboModuleManagerDelegate::initHybrid(
jni::alias_ref<jhybridobject>) {
return makeCxxInstance();
}
void MainApplicationTurboModuleManagerDelegate::registerNatives() {
registerHybrid({
makeNativeMethod(
"initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid),
makeNativeMethod(
"canCreateTurboModule",
MainApplicationTurboModuleManagerDelegate::canCreateTurboModule),
});
}
std::shared_ptr<TurboModule>
MainApplicationTurboModuleManagerDelegate::getTurboModule(
const std::string &name,
const std::shared_ptr<CallInvoker> &jsInvoker) {
// Not implemented yet: provide pure-C++ NativeModules here.
return nullptr;
}
std::shared_ptr<TurboModule>
MainApplicationTurboModuleManagerDelegate::getTurboModule(
const std::string &name,
const JavaTurboModule::InitParams &params) {
return MainApplicationModuleProvider(name, params);
}
bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule(
const std::string &name) {
return getTurboModule(name, nullptr) != nullptr ||
getTurboModule(name, {.moduleName = name}) != nullptr;
}
} // namespace react
} // namespace facebook
@@ -0,0 +1,38 @@
#include <memory>
#include <string>
#include <ReactCommon/TurboModuleManagerDelegate.h>
#include <fbjni/fbjni.h>
namespace facebook {
namespace react {
class MainApplicationTurboModuleManagerDelegate
: public jni::HybridClass<
MainApplicationTurboModuleManagerDelegate,
TurboModuleManagerDelegate> {
public:
// Adapt it to the package you used for your Java class.
static constexpr auto kJavaDescriptor =
"Lcom/rndiffapp/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate;";
static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject>);
static void registerNatives();
std::shared_ptr<TurboModule> getTurboModule(
const std::string &name,
const std::shared_ptr<CallInvoker> &jsInvoker) override;
std::shared_ptr<TurboModule> getTurboModule(
const std::string &name,
const JavaTurboModule::InitParams &params) override;
/**
* Test-only method. Allows user to verify whether a TurboModule can be
* created by instances of this class.
*/
bool canCreateTurboModule(const std::string &name);
};
} // namespace react
} // namespace facebook
@@ -0,0 +1,65 @@
#include "MainComponentsRegistry.h"
#include <CoreComponentsRegistry.h>
#include <fbjni/fbjni.h>
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
#include <react/renderer/components/rncore/ComponentDescriptors.h>
#include <rncli.h>
namespace facebook {
namespace react {
MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {}
std::shared_ptr<ComponentDescriptorProviderRegistry const>
MainComponentsRegistry::sharedProviderRegistry() {
auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry();
// Autolinked providers registered by RN CLI
rncli_registerProviders(providerRegistry);
// Custom Fabric Components go here. You can register custom
// components coming from your App or from 3rd party libraries here.
//
// providerRegistry->add(concreteComponentDescriptorProvider<
// AocViewerComponentDescriptor>());
return providerRegistry;
}
jni::local_ref<MainComponentsRegistry::jhybriddata>
MainComponentsRegistry::initHybrid(
jni::alias_ref<jclass>,
ComponentFactory *delegate) {
auto instance = makeCxxInstance(delegate);
auto buildRegistryFunction =
[](EventDispatcher::Weak const &eventDispatcher,
ContextContainer::Shared const &contextContainer)
-> ComponentDescriptorRegistry::Shared {
auto registry = MainComponentsRegistry::sharedProviderRegistry()
->createComponentDescriptorRegistry(
{eventDispatcher, contextContainer});
auto mutableRegistry =
std::const_pointer_cast<ComponentDescriptorRegistry>(registry);
mutableRegistry->setFallbackComponentDescriptor(
std::make_shared<UnimplementedNativeViewComponentDescriptor>(
ComponentDescriptorParameters{
eventDispatcher, contextContainer, nullptr}));
return registry;
};
delegate->buildRegistryFunction = buildRegistryFunction;
return instance;
}
void MainComponentsRegistry::registerNatives() {
registerHybrid({
makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid),
});
}
} // namespace react
} // namespace facebook
@@ -0,0 +1,32 @@
#pragma once
#include <ComponentFactory.h>
#include <fbjni/fbjni.h>
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
#include <react/renderer/componentregistry/ComponentDescriptorRegistry.h>
namespace facebook {
namespace react {
class MainComponentsRegistry
: public facebook::jni::HybridClass<MainComponentsRegistry> {
public:
// Adapt it to the package you used for your Java class.
constexpr static auto kJavaDescriptor =
"Lcom/rndiffapp/newarchitecture/components/MainComponentsRegistry;";
static void registerNatives();
MainComponentsRegistry(ComponentFactory *delegate);
private:
static std::shared_ptr<ComponentDescriptorProviderRegistry const>
sharedProviderRegistry();
static jni::local_ref<jhybriddata> initHybrid(
jni::alias_ref<jclass>,
ComponentFactory *delegate);
};
} // namespace react
} // namespace facebook
+11
View File
@@ -0,0 +1,11 @@
#include <fbjni/fbjni.h>
#include "MainApplicationTurboModuleManagerDelegate.h"
#include "MainComponentsRegistry.h"
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
return facebook::jni::initialize(vm, [] {
facebook::react::MainApplicationTurboModuleManagerDelegate::
registerNatives();
facebook::react::MainComponentsRegistry::registerNatives();
});
}
+1 -1
View File
@@ -1,3 +1,3 @@
<resources> <resources>
<string name="app_name">JellyfinAudioPlayer</string> <string name="app_name">Fintunes</string>
</resources> </resources>
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="user"/>
<certificates src="system"/>
</trust-anchors>
</base-config>
</network-security-config>
+6 -12
View File
@@ -4,10 +4,11 @@ import org.apache.tools.ant.taskdefs.condition.Os
buildscript { buildscript {
ext { ext {
buildToolsVersion = "31.0.0" buildToolsVersion = "33.0.0"
kotlin_version = "1.7.20"
minSdkVersion = 21 minSdkVersion = 21
compileSdkVersion = 31 compileSdkVersion = 33
targetSdkVersion = 31 targetSdkVersion = 33
if (System.properties['os.arch'] == "aarch64") { if (System.properties['os.arch'] == "aarch64") {
// For M1 Users we need to use the NDK 24 which added support for aarch64 // For M1 Users we need to use the NDK 24 which added support for aarch64
@@ -26,9 +27,9 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath("com.android.tools.build:gradle:7.0.4") classpath("com.android.tools.build:gradle:7.2.1")
classpath("com.facebook.react:react-native-gradle-plugin") classpath("com.facebook.react:react-native-gradle-plugin")
classpath("de.undercouch:gradle-download-task:4.1.2") classpath("de.undercouch:gradle-download-task:5.0.1")
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
} }
@@ -53,12 +54,5 @@ allprojects {
} }
google() google()
maven { url 'https://www.jitpack.io' } maven { url 'https://www.jitpack.io' }
jcenter() {
content {
includeGroup("com.google.android.exoplayer")
includeGroupByRegex("com.eightbitlab.*")
}
}
} }
} }
+2 -2
View File
@@ -10,7 +10,7 @@
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m # Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=512m
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # This option should only be used with decoupled projects. More details, visit
@@ -25,7 +25,7 @@ android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
# Version of flipper SDK to use with React Native # Version of flipper SDK to use with React Native
FLIPPER_VERSION=0.125.0 FLIPPER_VERSION=0.164.0
# Use this property to specify which architecture you want to build. # Use this property to specify which architecture you want to build.
# You can also override it from the CLI using # You can also override it from the CLI using
Binary file not shown.
+1 -1
View File
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
+3 -1
View File
@@ -1,4 +1,4 @@
rootProject.name = 'JellyfinAudioPlayer' rootProject.name = 'Fintunes'
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
include ':app' include ':app'
includeBuild('../node_modules/react-native-gradle-plugin') includeBuild('../node_modules/react-native-gradle-plugin')
@@ -6,4 +6,6 @@ includeBuild('../node_modules/react-native-gradle-plugin')
if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true") { if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true") {
include(":ReactAndroid") include(":ReactAndroid")
project(":ReactAndroid").projectDir = file('../node_modules/react-native/ReactAndroid') project(":ReactAndroid").projectDir = file('../node_modules/react-native/ReactAndroid')
include(":ReactAndroid:hermes-engine")
project(":ReactAndroid:hermes-engine").projectDir = file('../node_modules/react-native/ReactAndroid/hermes-engine')
} }
+2 -2
View File
@@ -1,4 +1,4 @@
{ {
"name": "JellyfinAudioPlayer", "name": "Fintunes",
"displayName": "Jellyfin Player" "displayName": "Fintunes"
} }
+2 -1
View File
@@ -32,6 +32,7 @@ module.exports = {
[ [
'module:react-native-dotenv' 'module:react-native-dotenv'
], ],
'react-native-reanimated/plugin' 'react-native-reanimated/plugin',
'@babel/plugin-proposal-numeric-separator'
] ]
}; };
+1
View File
@@ -2,3 +2,4 @@ package_name("nl.moeilijkedingen.jellyfinaudioplayer")
app_identifier("nl.moeilijkedingen.jellyfinaudioplayer") app_identifier("nl.moeilijkedingen.jellyfinaudioplayer")
apple_id("lei@moeilijkedingen.nl") apple_id("lei@moeilijkedingen.nl")
team_id("238P3C58WC") team_id("238P3C58WC")
json_key_file("./fastlane/play-store-credentials.json")
+4
View File
@@ -0,0 +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)
+70 -12
View File
@@ -3,35 +3,60 @@ default_platform(:ios)
package = load_json(json_path: "package.json") package = load_json(json_path: "package.json")
platform :ios do platform :ios do
lane :beta do before_all do
get_certificates( get_certificates(
output_path: 'certificates/' output_path: 'certificates/'
) )
get_provisioning_profile( get_provisioning_profile(
output_path: 'certificates/', output_path: 'certificates/',
filename: "provisioning.mobileprovision", filename: "provisioning.mobileprovision",
fail_on_name_taken: true, fail_on_name_taken: false,
) )
update_code_signing_settings( update_code_signing_settings(
use_automatic_signing: true, use_automatic_signing: true,
path: "ios/JellyfinAudioPlayer.xcodeproj" path: "ios/Fintunes.xcodeproj"
) )
increment_version_number( increment_version_number(
version_number: package["version"], version_number: package["version"],
xcodeproj: "ios/JellyfinAudioPlayer.xcodeproj", xcodeproj: "ios/Fintunes.xcodeproj",
); );
increment_build_number( increment_build_number(
xcodeproj: "ios/JellyfinAudioPlayer.xcodeproj", xcodeproj: "ios/Fintunes.xcodeproj",
) )
end
lane :release do
build_app( build_app(
scheme: "Jellyfin Player", scheme: "Fintunes",
output_directory: "build", output_directory: "build",
workspace: "ios/JellyfinAudioPlayer.xcworkspace", workspace: "ios/Fintunes.xcworkspace",
export_method: "app-store", export_method: "app-store",
) )
upload_to_testflight upload_to_app_store
end
lane :beta do
build_app(
scheme: "Fintunes",
output_directory: "build",
workspace: "ios/Fintunes.xcworkspace",
export_method: "app-store",
)
upload_to_testflight()
end
lane :build do
build_app(
scheme: "Fintunes",
output_directory: "build",
workspace: "ios/Fintunes.xcworkspace",
export_method: "app-store",
)
end
after_all do
build_number = get_build_number( build_number = get_build_number(
xcodeproj: "ios/JellyfinAudioPlayer.xcodeproj", xcodeproj: "ios/Fintunes.xcodeproj",
) )
Dir.chdir("..") do Dir.chdir("..") do
sh( sh(
@@ -50,8 +75,8 @@ platform :ios do
finalize: true finalize: true
) )
sentry_upload_dsym( sentry_upload_dsym(
dsym_path: 'build/Jellyfin Player.app.dSYM.zip', dsym_path: 'build/Fintunes.app.dSYM.zip',
info_plist: 'ios/JellyfinAudioPlayer/Info.plist', info_plist: 'ios/Fintunes/Info.plist',
) )
sentry_upload_file( sentry_upload_file(
version: "1.0+#{build_number}", version: "1.0+#{build_number}",
@@ -67,6 +92,11 @@ platform :ios do
rewrite: true rewrite: true
) )
end end
lane :screenshots do
capture_screenshots
# upload_to_app_store
end
end end
platform :android do platform :android do
@@ -80,8 +110,36 @@ platform :android do
gradle_file: "android/app/build.gradle" gradle_file: "android/app/build.gradle"
) )
gradle( gradle(
task: "assembleRelease", task: "assemble",
build_type: "Release",
project_dir: "android" project_dir: "android"
) )
end end
lane :release do
gradle(
task: "bundle",
build_type: 'Release',
project_dir: "android"
)
upload_to_play_store
end
lane :screenshots do
gradle(task: 'clean', project_dir: 'android/')
gradle(
task: 'assemble',
build_type: 'Debug',
project_dir: 'android/',
)
gradle(
task: 'assemble',
build_type: 'AndroidTest',
project_dir: 'android/',
)
capture_android_screenshots(
app_apk_path: "android/app/build/outputs/apk/debug/app-debug.apk",
tests_apk_path: "android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk"
)
end
end end
+40
View File
@@ -15,6 +15,14 @@ For _fastlane_ installation instructions, see [Installing _fastlane_](https://do
## iOS ## iOS
### ios release
```sh
[bundle exec] fastlane ios release
```
### ios beta ### ios beta
```sh ```sh
@@ -23,6 +31,22 @@ For _fastlane_ installation instructions, see [Installing _fastlane_](https://do
### ios build
```sh
[bundle exec] fastlane ios build
```
### ios screenshots
```sh
[bundle exec] fastlane ios screenshots
```
---- ----
@@ -36,6 +60,22 @@ For _fastlane_ installation instructions, see [Installing _fastlane_](https://do
Generate beta build Generate beta build
### android release
```sh
[bundle exec] fastlane android release
```
### android screenshots
```sh
[bundle exec] fastlane android screenshots
```
---- ----
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
+42
View File
@@ -0,0 +1,42 @@
# Uncomment the lines below you want to change by removing the # in the beginning
# A list of devices you want to take the screenshots from
devices([
"iPhone 14 Plus",
"iPhone 14 Pro Max",
"iPhone 8 Plus",
])
languages([
"en-US",
"es-ES",
"fr-FR",
"ja",
"nl-NL",
"zh-Hans",
])
# The name of the scheme which contains the UI Tests
scheme("Fintunes")
workspace("ios/Fintunes.xcworkspace")
# Where should the resulting screenshots be stored?
output_directory("./fastlane/screenshots")
# remove the '#' to clear all previously generated screenshots before creating new ones
clear_previous_screenshots(true)
# Remove the '#' to set the status bar to 9:41 AM, and show full battery and reception. See also override_status_bar_arguments for custom options.
# override_status_bar(true)
# Arguments to pass to the app on launch. See https://docs.fastlane.tools/actions/snapshot/#launch-arguments
# launch_arguments(["-favColor red"])
# For more information about all available options run
# fastlane action snapshot
# Enabling this option will prevent displaying the simulator window
headless(false)
# Enabling this option will configure the Simulator to be in dark mode (false for light, true for dark)
dark_mode(false)
+1
View File
@@ -0,0 +1 @@
review_information
@@ -0,0 +1 @@
Fintunes is a streaming audio player for the Jellyfin media system. It features a gorgeous interface that allows you to play your favourite music with ease. You can search your entire library for any track, or just take it easy with a playlist that you've created earlier in Jellyfin. All tracks are streamed directly at the highest quality from your Jellyfin library. Streaming not always an option? Any track in your Jellyfin library can be downloaded and played offline.
@@ -0,0 +1 @@
Streaming audio player for Jellyfin
@@ -0,0 +1 @@
Fintunes
Binary file not shown.

After

Width:  |  Height:  |  Size: 746 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

+1
View File
@@ -0,0 +1 @@
2022 Lei Nelissen
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Fintunes is a streaming audio player for the Jellyfin media system. It features a gorgeous interface that allows you to play your favourite music with ease. You can search your entire library for any track, or just take it easy with a playlist that you've created earlier in Jellyfin. All tracks are streamed directly at the highest quality from your Jellyfin library. Streaming not always an option? Any track in your Jellyfin library can be downloaded and played offline.
+1
View File
@@ -0,0 +1 @@
jellyfin, audio, player, streaming, downloads, music
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Fintunes
+1
View File
@@ -0,0 +1 @@
https://github.com/leinelissen/jellyfin-audio-player/blob/master/docs/privacy-policy.md
@@ -0,0 +1 @@
A streaming audio player for Jellyfin, with support for search and downloads.
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Audio player for Jellyfin
+1
View File
@@ -0,0 +1 @@
https://github.com/leinelissen/jellyfin-audio-player
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Fintunes es un reproductor de transmisión de audio para el sistema multimedia Jellyfin. Cuenta con una hermosa interfaz que te permite reproducir tu música favorita con facilidad. Puede buscar cualquier pista en toda su biblioteca, o simplemente tomarlo con calma con una lista de reproducción que haya creado anteriormente en Jellyfin. Todas las pistas se transmiten directamente con la más alta calidad desde su biblioteca Jellyfin. ¿Transmitir no siempre es una opción? Cualquier pista en su biblioteca Jellyfin se puede descargar y reproducir sin conexión.
+1
View File
@@ -0,0 +1 @@
gelatina, audio, reproductor, transmisión, descargas, música
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Fintunes
+1
View File
@@ -0,0 +1 @@
https://github.com/leinelissen/jellyfin-audio-player/blob/master/docs/privacy-policy.md
@@ -0,0 +1 @@
Un reproductor de audio en streaming para Jellyfin, con soporte para búsqueda y descargas.
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Audio player for Jellyfin
+1
View File
@@ -0,0 +1 @@
https://github.com/leinelissen/jellyfin-audio-player
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +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.
+1
View File
@@ -0,0 +1 @@
jellyfin, audio, joueur, diffusion, téléchargements, musique
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Fintunes
+1
View File
@@ -0,0 +1 @@
https://github.com/leinelissen/jellyfin-audio-player/blob/master/docs/privacy-policy.md
@@ -0,0 +1 @@
Un lecteur audio en streaming pour Jellyfin, avec prise en charge de la recherche et des téléchargements.
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Audio player for Jellyfin
+1
View File
@@ -0,0 +1 @@
https://github.com/leinelissen/jellyfin-audio-player
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Fintunesは、Jellyfinメディアシステム用のストリーミングオーディオプレーヤーです。 それはあなたが簡単にあなたの好きな音楽を演奏することを可能にするゴージャスなインターフェースを特徴とします。 ライブラリ全体で任意のトラックを検索することも、Jellyfinで以前に作成したプレイリストを使用して簡単に検索することもできます。 すべてのトラックは、Jellyfinライブラリから最高品質で直接ストリーミングされます。 ストリーミングは必ずしもオプションではありませんか? Jellyfinライブラリ内のすべてのトラックをダウンロードして、オフラインで再生できます。
+1
View File
@@ -0,0 +1 @@
ジェリーフィン、オーディオ、プレーヤー、ストリーミング、ダウンロード、音楽
+1
View File
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Fintunes
+1
View File
@@ -0,0 +1 @@
https://github.com/leinelissen/jellyfin-audio-player/blob/master/docs/privacy-policy.md
@@ -0,0 +1 @@
Jellyfin用のストリーミングオーディオプレーヤー。検索とダウンロードをサポートしています。
+1
View File
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Audio player for Jellyfin
+1
View File
@@ -0,0 +1 @@
https://github.com/leinelissen/jellyfin-audio-player
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Fintunes is een streaming audiospeler voor het Jellyfin mediasysteem. Het heeft een prachtige interface waarmee je gemakkelijk je favoriete muziek kunt afspelen. Je kunt in je hele bibliotheek zoeken naar elk nummer, of het rustig aan doen met een afspeellijst die je eerder in Jellyfin hebt gemaakt. Alle nummers worden direct in de hoogste kwaliteit gestreamd vanuit je Jellyfin-bibliotheek. Streamen niet altijd een optie? Elk nummer in je Jellyfin-bibliotheek kan worden gedownload en offline worden afgespeeld.
+1
View File
@@ -0,0 +1 @@
jellyfin, audio, speler, streaming, downloads, muziek
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Fintunes
+1
View File
@@ -0,0 +1 @@
https://github.com/leinelissen/jellyfin-audio-player/blob/master/docs/privacy-policy.md
@@ -0,0 +1 @@
Een streaming audiospeler voor Jellyfin, met ondersteuning voor zoeken en downloaden.
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
Audiospeler voor Jellyfin
+1
View File
@@ -0,0 +1 @@
https://github.com/leinelissen/jellyfin-audio-player
+1
View File
@@ -0,0 +1 @@
MUSIC
@@ -0,0 +1 @@
@@ -0,0 +1 @@

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