android: the whole discography, on a page of its own

The artist page already filed every release the desktop's way, but it only
ever showed one category at a time and it showed all of it: no slice anywhere
in that grid, so an artist with 140 releases drew 140 cards. There is a page
now — All in front of the categories, a sort, a grouping by year, and the
editions opened in place under their own record, which is the part a flat
list loses — and the grid behind it stops at twelve with the way down under
it. It is the same classifier twice over the same cached albums, which the
desktop cannot do because its filing waits on a background description
harvest; the three things its own page has and this one does not — a
tracklist per record, an accent sampled per cover, the scroll-led banner —
are 140 calls and 140 decodes over mobile data for rows that are one tap
away, and ANDROID.md says so rather than leaving them looking forgotten.

The list caps at sixty with the rest a button away, before the grouping, so
the last year on screen can be a part of itself; under a name order By year
is not offered, because the years would repeat out of sequence. The mock
gains a 140-record artist so both caps are walked rather than argued about.
This commit is contained in:
KeelrLeek committed 2026-09-14 03:41:16 -05:00
1 parent 1258b2b78d
commit f2cde4ec7c
9 files changed
+491 -12

No files matched your search

+37 -6
View File
@@ -24,7 +24,7 @@ implements is `research/mobile-mockup/` (gitignored; see its README).
| `crates/tauri-plugin-media-session/` | a Tauri plugin with a Kotlin foreground service (`MediaService`) that owns the `MediaSession`, the MediaStyle notification, audio focus and the becoming-noisy pause. The audio never passes through it; it is what keeps the process alive in the background and what the lock screen shows |
| `crates/tauri-plugin-transfer-notice/` | a second Tauri plugin with a second Kotlin foreground service (`TransferService`, `dataSync`) — the downloads' own progress notification on its own low-importance channel, with Stop all and Open on it, and the reason a Save outlives the app going to the background with nothing playing |
| `src/mobile/Sheet.svelte`, `HalfSheet.svelte`, `SyncRoom.svelte`, `Lane.svelte`, `Cover.svelte`, `Release.svelte` | the player (art / lyrics / queue faces, container transform from the mini bar, drags), the bottom sheets (track, record, sort, the page overflow, the sleep timer), the tap-to-sync room, the waveform lane, the two card pieces (a long press on a card is its sheet) |
| `src/mobile/screens/` | Home, Search (the library half: records and artists here, tracks through `library_track_search`), Library (albums / artists / tracks / playlists), Album, Artist (the library's shell at once, the catalog dissolving in: portrait, Popular, discography with what is here marked), CatalogAlbum (a catalog record, rows the library has play), Playlist, Community (sign in; rooms, chat, buddies, taste — the Soulseek side; the private layer waits), Room, Thread, You (Appearance switches, real) |
| `src/mobile/screens/` | Home, Search (the library half: records and artists here, tracks through `library_track_search`), Library (albums / artists / tracks / playlists), Album, Artist (the library's shell at once, the catalog dissolving in: portrait, Popular, discography with what is here marked), CatalogAlbum (a catalog record, rows the library has play), Discography (every release, on one page), Playlist, Community (sign in; rooms, chat, buddies, taste — the Soulseek side; the private layer waits), Room, Thread, You (Appearance switches, real) |
| `src/mobile/prefs.svelte.js` | Appearance, kept in localStorage: ambience, accent from artwork, motion |
| `src/mobile/util.js` | what every screen shares and no screen should write twice: the formatters (`mmss` / `longDur` / `stamp` for a length in seconds, in words and in milliseconds; `ago` / `clock`; `fmtBytes` / `fmtCount`; `fmtOf` / `albumFmt`), the name and folder readers a peer's file needs, the `drag` action, and `devBuild` |
| `src-tauri/tauri.android.conf.json` | merged over `tauri.conf.json` on Android: one window at `mobile.html`, no desktop resources, `minSdkVersion` 26 |
@@ -163,6 +163,34 @@ shows on the next visit at once instead of behind a whole catalog page — and
both lanes are forgotten with the page when a hero is set or removed, or the
old banner would answer while the new one was still being fetched.
The **whole discography** is a page of its own
(`src/mobile/screens/Discography.svelte`), reached from the artist page's
Discography head with **All**, and from under its grid with "Show all N
Albums" — which is also where that grid now stops: it shows twelve of the
active tab, because before this an artist with 140 releases rendered 140
cards. The page is the desktop's `CatalogDiscography.svelte` reduced to the
four things it has that the artist page's tabs do not: **All** in front of
the categories (built by CONCATENATING the per-category families, never by
re-folding the whole set — a single sharing an album's base title would fold
into it as a phantom edition), a **sort** (newest, oldest, A–Z, Z–A), a
**grouping** by year, and the **editions kept whole**, opened in place under
their own record. Three of the desktop's are deliberately left behind: the
per-record tracklists (140 records is 140 `catalog_album` calls over mobile
data, for rows one tap away on the record page), the per-record accent
sampled from each cover, and the scroll-led banner. The year is written into
the list where the desktop has a sticky year rail — a phone list is read top
to bottom. The order and the grouping live on the nav entry and are edited
from the **Sort & group** sheet, Library's own idiom; under a name order By
year is not offered, because the years would repeat out of sequence, and the
sheet says so. The list is capped at sixty rows with a "+ N more releases"
button (Browse's rule), and the cap is taken BEFORE the grouping, so the last
year on screen can be a part of itself. Filing, families and labels all come
from `src/mobile/disco.js` — the artist page's own classifier, called a
second time over the same cached albums. The desktop cannot do that: its
filing depends on a background description harvest and deferred MB type
hints a second page would not read, which is why `CatalogDiscography.svelte`
takes the artist page's computed tab list as the same array object instead.
The **catalog record page** is the desktop's album page: the kind, the
artist byline with a portrait, year · tracks · runtime, Last.fm's totals,
Play / Save / Shuffle, the record's other editions (the artist's page folded
@@ -1183,7 +1211,11 @@ waveform growing; backend events go over the mock's own bus, which
`src/lib/events.js` puts in front of Tauri's `listen`), drives Home → a long
press → Search → Library and its tabs → a record → its sheets → the player's
three faces → the back gesture → an artist page → Community → a room → a
catalog search → a song through the resolver → the lane rising in the sheet →
catalog search → that artist's whole discography on a page of its own (All
in front of six categories, a year header per year, the editions opened in
place, a name order dropping the grouping, and a 140-record artist whose
grid caps at twelve and whose page shows sixty with the rest a button away)
→ a song through the resolver → the lane rising in the sheet →
a catalog record, its Save and the Transfers burst (and the shade's notice:
posted with a count while rows are in flight, gone when they are not) →
Gaps → the playlist
@@ -1305,10 +1337,9 @@ symptom.
- **Off by design — external runtimes.** yt-dlp and deno, the vocal
separator, the lyric alignment models, and the listener door that needs
them.
- **Still desktop-only, smaller.** Catalog track previews, the full
discography page, and the fused-artist portrait verdict — that last one
needs the identity merge the phone does not run, so porting it means
porting the merge first.
- **Still desktop-only, smaller.** Catalog track previews and the
fused-artist portrait verdict — that last one needs the identity merge the
phone does not run, so porting it means porting the merge first.
- **Per library folder.** Follows and the play history live in the library
folder, so the phone's own folder starts empty of both; they arrive with a
shared library.