The cut is per account, not per device: a file request from any device signed in to the same account (another
phone, an iPod, the Mac) cut this phone's stream. The player's own stream now also asks for the file as a
download (?download=1), which Plex leaves out of that rule; the plain address follows for servers that refuse
downloads. Transcodes aren't affected.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two causes, both fixed:
- Plex keeps one file stream per device and cuts the one in progress when another starts, so the read-ahead
and the player cut each other off. Whole-file fetches (read-ahead, downloads, download-first) now ask for
the file as a download (?download=1), which Plex leaves out of that rule; the plain address follows for
servers that refuse downloads.
- Http.abort closed the socket of a response already read to the end, whose connection was back in the pool
and could be carrying the read-ahead. abort now leaves finished responses alone (test/PoolAbortTest.java).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- One build per Android level, as in Tenda: build/PlexampLite.apk (Android 2.2+, versionCode 1508) and
build/PlexampLite-api16.apk (Android 4.1+, 1516), from shared src/ plus platform/api8 or platform/api16.
- Android 4.1 build: ExoPlayer 2.18.7 behind a small Engine interface (gapless hand-over to read-ahead and
downloaded files, a longer buffer, MediaPlayer fallback for tracks it can't decode), a notification and
lock screen with art and buttons, a resizable widget, Holo, a menu button without a Menu key, metered networks.
R8 shrinks ExoPlayer and Guava (tools/fetch_exoplayer.sh, tools/r8-rules.pro).
- Both builds: lyrics in Now Playing as in the Mac app (timed lyrics follow and seek), a home-screen widget,
media play/pause keys, the moon icon drawn without clipPath.
- PlexampLite-noreport on the SD card stops play reports, for tests against a real server.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Read-ahead keeps the next two tracks on the SD card (one without it) and drops files
that are no longer coming up. Trusted roots are cached once read, and a failed read
is retried instead of leaving every server untrusted until a restart.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New launcher icon (ldpi to xhdpi from the pack, master and 512 px in art/). The status-bar
play icon still fits it and stays.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Renames the app (label, texts, log files, Plex product name, User-Agent, APK). The package
name, preferences and signing key stay, so it installs over Minamp and keeps its settings.
tools/strings.py catches up with the strings added straight to the XML in 9440536.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On weak Wi-Fi shared with Bluetooth audio, Android 2.x's player (a few seconds
of stream buffer) ran dry and went silent for 6-7 s at a time; the speaker then
sometimes hung up. While a track plays, the next one is fetched whole (Wi-Fi
only) and played from the file. DiagLog lines also go to logcat (tag Minamp).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Installed on the SD card (installLocation auto), Minamp was killed whenever USB
storage was turned on. A2DP dropouts send AUDIO_BECOMING_NOISY like an unplug:
after a Bluetooth loss, resume if the speaker is back within 20 s. Focus loss,
media buttons and stream failures now go to the connection log.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Downloads for offline listening: long-press a track, album, artist or
playlist -> Download; Menu -> Downloads lists them (progress, space used/free,
play/shuffle, retry, remove). Saved on the SD card (Android/data/com.minamp/
files/downloads). MP3 originals kept as they are unless above a lower
download quality; the rest transcoded to MP3 (320 kbps by default). One at a
time, Range resume for originals, retried when the server is back, Wi-Fi lock.
- Downloaded tracks play from the SD card, offline too; plays made offline
are reported to Plex when a connection works again.
- Server.pick: when last time's connection was remote, give the plain home
addresses 2 s first (a hairpinned remote address kept us encrypted and
capped at home). test/PreferHomeTest.java.
- Playback "playing" but not moving for 12 s: say so instead of staying silent.
- Menu -> Close Minamp: stop the music and close every screen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Launcher icon is now a supplied asset (masters in art/), with an xhdpi size
added; make_icons.py only draws the notification icon, redrawn to match:
an amber play triangle between orange arcs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- New setting "Text and button size" (Normal / Large / Extra large): scales
text, icons and buttons on top of the phone's density (App.UI_SCALES)
- Larger default text, rows, tiles, touch targets and player icons; all sizes
now live in res/values/dimens.xml
- Seek bar knob drawn in code, since Android 2.x caches XML shapes at the
size they were first loaded
- Full-width buttons wrap to two lines instead of cutting words off
- Shorter labels so they fit 240x320 screens in both languages
- tools/check_fit.py checks that UI texts fit their slots at every size and
language using Droid Sans metrics; build.sh runs it and setup_toolchain.sh
fetches the font
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Interface in Galician by default regardless of the phone's language, with
English selectable under Axustes -> Idioma; switching rebuilds the screens
- All text in tools/strings.py (key -> English, Galician), generating
res/values/strings.xml (gl) and res/values-en/strings.xml; layouts now use
string resources
- util/Tr.java: translations for the network and Plex layers, which can't
read Android resources (falls back to English in desktop tests)
- net/RefusedException: distinguish "server answered but refused" from
connection failures
- The connection log stays in English for troubleshooting
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Remember the connection that worked and try it alone first next start
- Prefer plain HTTP on the home network (each TLS handshake costs seconds on a
600 MHz phone); new setting "Encrypt at home too" to keep HTTPS
- Try secure addresses one at a time instead of in parallel, so they don't
all time out together
- TLS 1.2 with session resumption: reconnects skip the full handshake
- Cache certificate chains already verified; changing the trusted roots
clears that cache and all TLS sessions
- README: updated connection order; test: session resumption check and
HandshakeProfile
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Fix NoSuchMethodError on Android 2.x: Dalvik before 4.0 can't link Object
methods (toString/equals/...) called through an interface. Patch the bundled
Bouncy Castle (tools/patch_bc_dalvik.py) and our own CertVerifier, and make
build.sh fail if tools/scan_dalvik.py finds any such call
- Treat a manually entered private address (10.x, 172.16-31.x, 192.168.x,
.local) as home, so LAN servers that allow access without sign-in work
- Send Plex client headers on media requests (files and transcodes)
- Explain a 503 on a file as the server being unable to open it (drive or
folder not available)
- Connection log: home/away, token presence, Plex's file check and a direct
file request in the streaming test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Transcoding: send client identities Plex has a profile for (unknown ones get
400 "unable to find a matching profile"), with a fresh session id per variant
- Stream proxy: fetch transcodes once into a temp file and serve every player
request from it, so reconnects no longer restart the transcode (503s, tracks
cut short); original files still pass Range requests through
- Sign-in: remember the pending link code so it survives Minamp being closed
while the code is entered elsewhere; add "I've entered it - check now"
- Diagnostics: in-app connection log (DiagLog) with a streaming test and save
to SD card; tokens are never logged
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Run network/TLS work on 256 KB-stack threads (net/Threads.java): Android 2.x's
~16 KB default stack overflowed during the bundled TLS handshake
- Close pooled TLS connections off the caller thread
- Try several Plex music-transcoder URL variants until the server accepts one,
and remember the one that worked
- Accept pasted server URLs with paths; default to 443 for https
- Catch fatal errors and save a crash report (shown on next launch and written
to Minamp-error.txt on the SD card)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>