* hotfix for context sheet items being too close to the system navigation bar
remove nitro image
fix tap gesture overriding pan gesture in the SwipeableRow
* Slimify JellifyTrack type
Reduces the overall size of a JellifyTrack object in memory with the goal of lowing the overhead on serialization both to native and to zustand
* simplify addToQueue
fix issue where using the swipeable row would cause a crash
* Add swipe-to-queue functionality and related tests for track management
* Refactor imports to use runOnJS from react-native-worklets for consistency across components
* Implement SwipeableRow component for track management with swipe actions
* Add haptic feedback and improve swipe action handling in SwipeableRow component
* Enhance SwipeableRow component with quick action support for right swipe and refactor left swipe actions in ItemRow and Track components
* Update publish-beta.yml
* Add SwipeToSkip component for track navigation gestures in PlayerScreen
* Implement swipe gesture handling in SongInfo and PlayerScreen for track navigation
* Add swipe action settings and enhance SwipeableRow functionality
- Introduced left and right swipe action settings in the swipe settings store.
- Updated SwipeableRow to support quick action menus for left and right swipes.
- Enhanced ItemRow and Track components to utilize new swipe settings.
- Added GesturesTab for configuring swipe actions in settings.
- Improved PreferencesTab to allow users to select swipe actions.
* Enhance SwipeableRow and Track components with improved action handling and UI updates
* Refactor SwipeableRow integration and enhance swipe action configuration
* Refactor Track component to include prependElement prop for drag icon display in editing mode
* fix build
git blame violet
* Implement swipeable row management with close handlers and integrate into various components
* goddammit violet
* Add tests for SwipeableRow and swipeable row registry behavior
* fix maestro settings tab tests
---------
Co-authored-by: Violet Caulfield <42452695+anultravioletaurora@users.noreply.github.com>
Remove `JellifyContext` provider in favor of a persisted Zustand store
This should address issues where the user would open the app and be randomly signed out and have to sign back in
What is the change
Implement persistent player queue state with a dedicated Zustand store (MMKV-backed): queue, currentTrack, currentIndex, shuffled, unShuffledQueue, and queueRef.
Restore the queue on app start: new initialization reads persisted state and rebuilds the TrackPlayer queue and active index.
Unify queue mutations to keep React Native Track Player and the persisted store in sync:
Loading a new queue sets queueRef, honors shuffle, computes start index, and writes to both RNTP and store.
"Play Next" and "Add to Queue" update RNTP, the live queue, and unShuffledQueue consistently.
Active track/index changes now propagate to the store and query cache.
Tighten/refine player query/invalidations so UI reflects the latest RNTP state.
Minor housekeeping in config/scripts to support the above (ESLint flat config, metro/jest/script updates).
What does this address
Fixes queue not restoring after relaunch or crash; playback position and the current track persist correctly.
Preserves shuffle state and the original unshuffled ordering for reliable shuffle toggle behavior.
Ensures "Play Next"/"Add to Queue" behave consistently with what the user sees, avoiding duplication or desyncs.
Reduces UI state drift by syncing RNTP events to both React Query and persistent store.
Co-authored-by: Violet Caulfield <42452695+anultravioletaurora@users.noreply.github.com>
Adds internal over-the-air update support
Powered by `react-native-nitro-modules`, this OTA functionality is faster than the previous implementation, and won't slow down the UI when updates are being applied since updates occur off the main thread
Migrate from `react-native-fast-image` to `react-native-nitro-image`
Images will now display a blurry placeholder while loading, and then animate into the full image when loaded
Introduces a redesign to the artist page that is easier to navigate, especially when there are many albums belonging to a given artist
---------
Co-authored-by: riteshshukla04 <riteshshukla2381@gmail.com>
Implements proper server negotation for performing transcoding
Depending on the user's platform (i.e. iOS, Android) and the desired quality specified in the settings, Jellify will playback a transcoded audio file from Jellyfin
This is helpful when the source audio file is not compatible with the user's device (i.e. playing back an ALAC encoded .M4A on Android) or if the user want to stream at a lower quality to save bandwidth
This also drives downloads in different qualities, meaning the download quality selector in the Settings is now working properly. When a track is downloaded, it will download at the quality selected by the user, and in a format compatible with the device
There is also a toggle in the "Player" Settings for displaying a badge in the player that shows the quality and container of the audio being played
Deps updates, fixes text tickers not ticking
Fix blurred background on android
fix library selector being disabled when multiple libraries do exist
Fix issue where mp3 containers ('mpeg') would crash the app
* update readme, fix maestro
* make now playing change faster when loading a new queue
* queue provider optimizations
* Improvements to the alphabetical selector handling in the artists page.
* Improvements to artists pagination - fetching more artists at a given time
* fix issue where items added to queue weren't always queued
* On Repeat and Recently Played Sections in CarPlay now load tracks into the queue and start playback
Clean up Jest and Maestro Folders
Reduction of the number of calls being made by components
Fix issue where a different track would display than the one that is currently playing
Update OTA dependency to fix an issue on iOS
* Gapless playback (#372)
* Add gapless playback prefetch logic for next track
* Enhance player context to support multiple track downloads and prevent redundant prefetching
* Add download quality settings and integrate into track mapping and network contexts (#386)
* Add Shuffle
* Add Library Selection screen and navigation to account tab
* player redesign featuring blurred background artwork
* add repeat modes to player
* Fix Height&Width not changing
* Remove RN 79.2 patch
update locks
* comment out sentry module for now
* Fix Jest Unit Tests for RN 80
* Run linting
* update fastfile for android
---------
Co-authored-by: Violet Caulfield <violet@cosmonautical.cloud>
Implements OTA updates, fetched via GitHub from our `App-Bundles` repository
All Typescript changes can be delivered this way
All native changes will need to go through the traditional `publish-beta` workflow, which is now run manually
Welcome to Jellify 0.12.2!
This update comes with a much anticipated developer feature - and that is opt-in logging and telemetry. This is purely an opt-in feature, and can be toggled at anytime either when logging in for the first time, or in the settings tab. Under no circumstances will this ever be required to use Jellify, and all data that is collected is anonymized
The Settings tab has had a facelift, stealing design queues from the library page. This is where adjustable settings will make their home in updates to come, as well as how beta testing larger features will occur with “Labs”
This update also fixes issues with playback reporting, where the Jellyfin server wasn’t marking songs as played. This was not intended and has been fixed for those using the Last.FM plugin for scrobbling
There is also a slew of upgrades to underlying dependencies to make sure we are up to date on that front
Thanks for reading! ~Violet
Adds a revamped library page - where items aren't limited to just a user's favorites.
Fixes scrubber lag in player screen
Reorganizes component folder into separate components - providers - screens for better visibility and separation of concerns
Addresses some styling issues with text and font legibility
Refactors the client.ts file and moves it's functionality into the JellifyContext for use in other componentry. Lots of touching in the api folder to refactor this. I also found an issue when adding items to a playlist, so I bumped the axios package - which fixed the issue.
Adds "Most Played" and "On Repeat" sections to CarPlay. Most Played will allow users to view their most played artists, while On Repeat will give users access to their top tracks, of which they can select and start playback
Fixes an issue where on startup, if the user was logged in and had a persisted queue, it wouldn't playback. Users should be able to directly start up the queue upon relaunching the app if they are authenticated
Re-enables new architecture on Android by switching to a different fork of React Native Track Player
Removes dependency on react-native-blurhash - we aren't using it as our image component can handle this for us
Improves album layout on artist screen by adjusting flex of album details and album artwork
Adds an Instant Mix Button and Screen - users can view an instant mix from the album page by tapping on the Compass icon (which is styled for Dark and Light mode, respectfully)
Fixes Android playback controls not showing up - this is a regression introduced by React Native's New Architecture and is being rolled back. A future update will fix this and get Android builds back on the New Architecture
Adds Tamagui styling to toasts so that they are more homogenous with the rest of the UI
I hope this fixes android - restored a dependency that wasnt present in previous versions (.5, .6, .7)
Tightening up player refactor, namely around indexes and skipping tracks