Skip to content

Browse Clementine's internet services - #291

Merged
hatstand merged 4 commits into
masterfrom
claude/internet-browse
Sep 29, 2026
Merged

hatstand merged 4 commits into
masterfrom
claude/internet-browse

Conversation

@hatstand

Copy link
Copy Markdown
Contributor

Adds an Internet screen that browses the tree Clementine's Internet sidebar shows — SomaFM, Radio Browser, Jamendo, Subsonic, Plex, your saved radio streams and the rest — using the protocol from clementine-player/Clementine#7530 (first released in 1.4.1-242). The iOS remote gets the same screens and wording in clementine-player/iOS-Remote#15.

What it does

  • Internet destination after Library, shown only when Clementine advertises SERVER_FEATURE_BROWSE; if that goes while it's showing, the app goes to the Queue.
  • Top level lists the services with their own icons. Tapping a node with children opens it; back goes up and asks Clementine for that level again, so it keeps sending updates for the level shown.
  • Tapping a track or stream plays it if Clementine isn't playing, otherwise adds it to the playlist (as tapping a library song does). Long press on anything addable: Play now, Play next, Add to playlist, Replace playlist. An opened album or playlist has Play and Add to playlist buttons and its item count.
  • Loading, "Set up in Clementine" (with Clementine's message), "Nothing here", pull to refresh, and a snackbar after adding.
  • Levels arrive in pages of up to 500, asked for as the last row shows. Node ids last only for a connection, so each new connection starts from the services and answers from an older one are ignored; a node that's gone goes back up a level.

Changes

  • remotecontrolmessages.proto: Clementine's browse messages, enums and fields 70–73 (additions only; the app's version stays 21). check-proto-drift.py passes.
  • ClementineMessageFactory: buildBrowse / buildBrowseAdd. RemoteRepository: browse support flag and a flow of browse answers tagged by connection.
  • New ui/internet/: InternetBrowser (plain, testable state: levels, paging merge, GONE, reset, tap choice, add results), InternetViewModel, InternetScreen.
  • AppShell: the destination, back handling and fallback to the Queue. BrowseList: the library row's tile shared as BrowseTile.
  • New icons (globe, folder, radio waves, sparkles) and strings; README feature list.

Tests and screenshots

  • New InternetBrowserTest (17) and InternetScreenTest (11, Robolectric), plus additions to RemoteRepositoryTest, AppShellTest and ClementineMessageFactoryTest. lintFdroidDebug testFdroidDebugUnitTest assembleFdroidDebug bundlePlayRelease pass locally.
  • Store screenshots add 10_internet (the services) and 11_internet_radio ("Your radio streams" opened), light and dark. The CI Clementine now has three saved SomaFM streams, so that service has the same rows on every run. Both passed in a manual run of store-screenshots on this branch.
  • 10_internet/11_internet_radio have two-digit names, so store_graphics.py leaves them out of the store listing; they only appear on pull requests.

Release-note: Browse Clementine's internet services, such as radio stations, Jamendo and Subsonic, and play from them.

🤖 Generated with Claude Code

https://claude.ai/code/session_015dJQ8hcp9Vd6tD9gJAXxTx


Generated by Claude Code

Clementine can now be browsed like its Internet sidebar (SomaFM, Radio
Browser, Jamendo, Subsonic, saved radio streams...), and put what's
there on the playlist as a drag from the sidebar does. This adds an
Internet screen, after the Library, shown when Clementine says it can
be browsed (SERVER_FEATURE_BROWSE), as the iOS remote does.

The top level lists the services, with their own icons. Tapping a node
with children opens it; back goes up and asks for that level again, so
Clementine keeps it up to date. Tapping a track or stream plays it, or
adds it while Clementine is playing, as tapping a song in the library
does. A long press on anything that can go on the playlist offers Play
now, Play next, Add to playlist and Replace playlist; an opened album or
playlist has Play and Add to playlist buttons, with how many items it
has. Services that need setting up say so with Clementine's message.

Large levels come in pages of up to 500, asked for as the last row
shows. Node ids last only as long as the connection, so each new one
starts again from the services, and answers from an earlier one are
ignored. A node that's gone goes back up a level.

The protocol file gains Clementine's browse messages. The store
screenshots add the Internet screen's top level, as 10_internet.

Release-note: Browse Clementine's internet services, such as radio stations, Jamendo and Subsonic, and play from them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015dJQ8hcp9Vd6tD9gJAXxTx
The CI Clementine gets three saved radio streams, so "Your radio
streams" has something to show without depending on a service online.
The screenshots open it after the Internet screen's top level, as
11_internet_radio, in light and dark.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015dJQ8hcp9Vd6tD9gJAXxTx
"Your radio streams" is the last of Clementine's services, below the
fold, and a lazy list only has the rows in sight. The dark screenshots
also scroll the services back to the top first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015dJQ8hcp9Vd6tD9gJAXxTx
A Compose list says it can't scroll further when it can, so the
screenshots stopped after one scroll, short of "Your radio streams".
They now scroll until it shows, at most 15 times.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015dJQ8hcp9Vd6tD9gJAXxTx
@github-actions

Copy link
Copy Markdown

Store screenshots

From run 36606543921, against clementine-it. Left: the store listing on master. Right: this pull request, light and dark.

Screen master This PR This PR, dark
1_player
2_library
2_library_album
3_playlist
4_search
5_connection
6_connect
10_internet –
11_internet_radio –
settings –

@hatstand
hatstand merged commit 9439f79 into master Sep 29, 2026
7 checks passed
@hatstand
hatstand deleted the claude/internet-browse branch September 29, 2026 22:20
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.

2 participants