Skip to content

new tabs: home, artist, albums. fixed all music playlist to sort by letter. - #34

Open
hamoudydev wants to merge 10 commits into
joeyberkovitz:masterfrom
hamoudydev:feature/music-library-browsing
Open

new tabs: home, artist, albums. fixed all music playlist to sort by letter.#34
hamoudydev wants to merge 10 commits into
joeyberkovitz:masterfrom
hamoudydev:feature/music-library-browsing

Conversation

@hamoudydev

@hamoudydev hamoudydev commented Jan 7, 2026

Copy link
Copy Markdown

-added home tab with recently played and recently added.
-added tab for artists.
-added tab for albums.
-fixed "all music" in playlist to group by letter. no more searching for songs by groups of 100 (1-100, 101-200, etc.)
-added 4 new screenshots to folder
Screenshot_20260106_202140
Screenshot_20260106_202157
Screenshot_20260106_202210
Screenshot_20260106_202217

Edit: the artist/album art work, I just screenshotted before it fully loaded.

hamoudydev and others added 5 commits January 6, 2026 08:10
This implements the "Support for music selection other than playlists" TODO item.

New browse hierarchy:
- Root
  ├── Playlists (existing)
  ├── Artists → [Artist] → [Albums] → Tracks
  └── Albums → [Album] → Tracks

Changes:

MusicSource.kt:
- Added interface methods for loading artists, albums, artist albums, album tracks
- Added state management and callbacks for async loading

PlexSource.kt:
- Implemented all new MusicSource methods
- Added caching for artists, albums, and tracks
- Auto-discovers music library section on initialization

BrowseTree.kt:
- Added UAMP_ARTISTS_ROOT and UAMP_ALBUMS_ROOT constants
- Added ARTIST_PREFIX and ALBUM_PREFIX for media ID encoding
- Added extension functions for Artist and Album metadata building

MyMusicService.kt:
- Expanded onLoadChildren() to handle Artists, Albums, and nested navigation
- Updated onPrepareFromMediaId() to support album-based playback
- Added buildAlbumPlaylist() for album track playback

Resources:
- Added artists_title and albums_title strings
- Added baseline_person_24 and baseline_album_24 icons

Requires kotlin-plexapi 0.2.0 with library browsing support.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Documented Artists and Albums browsing feature
- Added browse hierarchy diagram
- Added changelog section
- Marked "music selection other than playlists" TODO as complete
- Added requirements, building, and dependencies sections

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix albumTracksWhenReady to return cached tracks instead of null
- Add getAlbumTracks method to MusicSource interface
- Make signing config optional for debug builds
- Remove hardcoded signing config from shared module
- Add debug logging for album track media IDs
- Update README with detailed build instructions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Home tab with Recently Played and Recently Added sections
- Add All Music tab to browse all tracks grouped alphabetically (A-Z, #)
- Large playlists now grouped alphabetically instead of page numbers
- Add new drawable icons for home sections
- Update README with new features and browse hierarchy

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Remove All Music browsing feature (keep Home, Playlists, Artists, Albums)
- Add screenshots showing Home, Artists, Albums, and playlist browsing
- Update README with screenshot gallery

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@dslugPX

dslugPX commented Jan 7, 2026

Copy link
Copy Markdown

@joeyberkovitz this would be an AMAZING addition to your already awesome project.

Really hope you will merge this!

Thanks for the efforts @hamoudydev!

@joeyberkovitz

Copy link
Copy Markdown
Owner

I'll take a look over the weekend. just at first glance, the corresponding API PR looked like it had some odd behavior due that will likely need correction

@hamoudydev

Copy link
Copy Markdown
Author

I'll take a look over the weekend. just at first glance, the corresponding API PR looked like it had some odd behavior due that will likely need correction

I played around with it for a few hours in the emulator and had no issues, but if it does let me know and I'll correct it. Also noticed in one of the issue threads you said you no longer had an AAOS car and I just got mine and plan on keeping it for at least the next 5 years, would you be willing to transfer ownership of the repo/app so that someone like me can continue to maintain it?

hamoudydev and others added 3 commits January 12, 2026 15:52
- Renamed package from us.berkovitz.plexaaos to us.tiba.plexamp
- Updated LICENSE with dual copyright (original + modifications)
- Now uses JitPack for plexamp-for-aaos-api dependency
- Updated README with new branding and author info
- Updated authenticator and content provider authorities
- Version bump to 1.0.0

Based on original work by Joey Berkovitz (MIT License).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace original Firebase configuration with new project:
- Project: plexamp-for-aaos (previously plex-aaos)
- Package: us.tiba.plexamp (matches rebranded app)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@joeyberkovitz

Copy link
Copy Markdown
Owner

I'm happy to review PRs but even transferring the repo doesn't get you anywhere as it's all down to the play store listing

Anyway, I left outstanding comments on the API PR as there are still large issues

hamoudydev and others added 2 commits January 12, 2026 16:39
- New app icon (car with Plex arrows)
- Renamed app to "Plexamp for AAOS"
- Fixed all package references from us.berkovitz to us.tiba
- Added signing config for release builds
- Added Play Store screenshots (phone, tablet, AAOS)
- Version code 35

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@topclaudy

Copy link
Copy Markdown

Any update on this? Thanks for the work @hamoudydev !

@wmmunn

wmmunn commented Jul 2, 2026

Copy link
Copy Markdown

I have some valuable tips and hints for the network stack if you are interested. I built my own plex streaming AAOS app on my own, and found quite a lot of interesting quirks when working on the communications side of plex streaming. everything is not as it seems.

@joeyberkovitz

joeyberkovitz commented Jul 2, 2026

Copy link
Copy Markdown
Owner

sure, IDK what that has to do with this PR, but feel free to share

the server selection logic is pretty simple: https://github.com/joeyberkovitz/plex-aaos/blob/master/automotive/src/main/java/us/berkovitz/plexaaos/library/PlexSource.kt

it just selects the non-local address - AKA either a public IP if port-forwarding is enabled or the proxied address. If a user doesn't have plex-pass, the proxy refuses to send through larger files, or files without transcoding enabled, depending on how restrictive plex is feeling at the moment.

@wmmunn

wmmunn commented Jul 3, 2026

Copy link
Copy Markdown

sure, IDK what that has to do with this PR, but feel free to share

the server selection logic is pretty simple: https://github.com/joeyberkovitz/plex-aaos/blob/master/automotive/src/main/java/us/berkovitz/plexaaos/library/PlexSource.kt

it just selects the non-local address - AKA either a public IP if port-forwarding is enabled or the proxied address. If a user doesn't have plex-pass, the proxy refuses to send through larger files, or files without transcoding enabled, depending on how restrictive plex is feeling at the moment.

Thanks for sharing that. Your server selection approach makes sense — simple and readable. One thing I noticed is that you're probing connections sequentially; I found that parallel probing with cancellation on first success made a significant difference on cold start time, getting it from around 9-10 seconds down to about 2.5 seconds. Worth considering if startup latency is something your users have raised.
I'm also curious how you're constructing your stream URLs — that's where I ran into the most interesting behavior. I initially went through the transcode endpoint and hit some surprising quirks around FLAC handling that weren't immediately obvious. Happy to share what I found if it's relevant to your implementation.
Worth noting I have a lifetime Plex Pass, so some of what I experienced may not generalize — which is actually why I'm curious how your users without it fare on FLAC libraries.

@joeyberkovitz

Copy link
Copy Markdown
Owner

the settings menu allows for manual server selection if start time is a concern and there are multiple options available for some reason, though there are no issues relating to startup time here

this app doesn't currently do transcoding, though the plex API is officially somewhat documented now (https://developer.plex.tv/pms/) along with the various unofficial reverse engineering that had been done for years.

@wmmunn

wmmunn commented Jul 3, 2026

Copy link
Copy Markdown

the settings menu allows for manual server selection if start time is a concern and there are multiple options available for some reason, though there are no issues relating to startup time here

this app doesn't currently do transcoding, though the plex API is officially somewhat documented now (https://developer.plex.tv/pms/) along with the various unofficial reverse engineering that had been done for years.

That makes sense — the question I was getting at isn't whether the app requests transcoding, but what endpoint the stream URL itself is built on, and whether you've verified at the server log level that FLAC files actually arrive as FLAC on the client. The reason I ask is that I found the two things can come apart in non-obvious ways depending on how Plex interprets the request path and client profile, even when directPlay is requested. Curious whether that's something your users with FLAC libraries have run into.

@joeyberkovitz

Copy link
Copy Markdown
Owner

It shouldn't really be a mystery because it's all open source :)

But to answer your question, the "stream" URI is just the first media entry on the track https://github.com/joeyberkovitz/kotlin-plexapi/blob/master/src/jvmMain/kotlin/us/berkovitz/plexapi/media/MediaItem.kt

I know there's a feature to have the Plex server preconvert media (mainly video) from a higher quality file to a more mobile friendly one. I haven't looked into if that would lead to multiple media entries being present on the track

@wmmunn

wmmunn commented Jul 3, 2026

Copy link
Copy Markdown

It shouldn't really be a mystery because it's all open source :)

But to answer your question, the "stream" URI is just the first media entry on the track https://github.com/joeyberkovitz/kotlin-plexapi/blob/master/src/jvmMain/kotlin/us/berkovitz/plexapi/media/MediaItem.kt

I know there's a feature to have the Plex server preconvert media (mainly video) from a higher quality file to a more mobile friendly one. I haven't looked into if that would lead to multiple media entries being present on the track

Tested your app against my server with the car on LTE. Plex server logs confirm decision=direct play on every track, FLAC files served directly throughout. Good result. Have you done the same verification on your end?
Separately — have you thought about voice control integration? I've been using Gemini's onPlayFromSearch to navigate playlists and jump to tracks by title hands-free, which feels a lot safer for in-car use.

@joeyberkovitz

Copy link
Copy Markdown
Owner

Aside from burning tokens on your end, what's the intent here? If you have various improvements working, you're welcome to PR them here, open source your own, sell it, or just keep it to yourself.

Yes, improvements can be made here. IDK when I'll get to it though without an actual AAOS car, so if anything, I'm usually on standard plexamp via AA

@wmmunn

wmmunn commented Jul 10, 2026

Copy link
Copy Markdown

significantly improved performance can be had by a more strategic application of caching to local storage, and doing so before the user ever clicks into the categories. the cache stays persistent through cold boot, and then only fetches what is actually new on the server, or missing from the prefetch. That single improvement completely resolves the complaints you have been getting regarding sluggish access to the playlists, and would easily give you the overhead needed to add artists, albums and genres, all sorted by letter as a previous pull request noted. I have written a plexamp player myself, from the ground up, completely separate from what you have done here. That being said, the lessons I learned could easily be applied to your project.

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants