26 Commits
Author SHA1 Message Date
XoséandClaude Opus 5.5 4834c6af08 Plexamp Lite 1.14.2: stream originals as downloads too
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>
2026-11-01 21:54:18 +01:00
XoséandClaude Opus 5.5 a37711afc0 Plexamp Lite 1.14.1: read-ahead no longer cut off ("Unexpected end of stream")
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>
2026-11-01 19:09:53 +01:00
XoséandClaude Opus 5.5 13f29e26c4 Plexamp Lite 1.14: Android 4.1 build with ExoPlayer, lyrics, home-screen widget
- 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>
2026-11-01 18:41:26 +01:00
XoséandClaude Opus 5.5 2e7476669e Add spec.md: goal, limits and rules for working on the project
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 09:05:35 +01:00
XoséandClaude Opus 5.5 30cc96cb34 Merge branch 'read-ahead-2' into main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 14:02:37 +02:00
XoséandClaude Opus 5.5 b6f696a8c8 Plexamp Lite 1.13: read ahead the next two tracks, keep loaded roots
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>
2026-10-20 14:00:46 +02:00
xocko 30d7742fb5 Merge pull request 'Plexamp Lite 1.12: read-ahead, renamed from Minamp, cassette icon' (#3) from ios-backports into main 2026-10-19 17:11:35 +00:00
XoséandClaude Opus 5.5 d47f705c7f Plexamp Lite 1.12: cassette icon
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>
2026-10-19 18:57:01 +02:00
XoséandClaude Opus 5.5 dbe3203c84 README: former name, read-ahead, logcat, the other tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:40:21 +02:00
XoséandClaude Opus 5.5 7eebb0d881 Plexamp Lite 1.11: Minamp is now Plexamp Lite
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>
2026-10-19 16:57:47 +02:00
XoséandClaude Opus 5.5 08590f3224 Read ahead on mobile data too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:28:07 +02:00
XoséandClaude Opus 5.5 29ed836b4c Minamp 1.10: read the next track ahead; log to logcat too
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>
2026-10-18 15:25:54 +02:00
xocko 9aaeb57c87 Merge pull request 'Minamp 1.9: playback fixes for Bluetooth and USB' (#2) from ios-backports into main 2026-10-18 12:49:56 +00:00
XoséandClaude Opus 5.5 430da46544 README: internal install, quality over Bluetooth, stall recovery
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 14:49:45 +02:00
XoséandClaude Opus 5.5 9440536fa1 Recover from playback stalls; cap quality over Bluetooth
On the Galaxy Mini, Wi-Fi and Bluetooth audio share one radio: streams starve
and the media player then sits at the same position forever while showing
playing. After 10 s without progress, recover like a network failure (reconnect
and resume, then download first, then skip). New setting: quality over
Bluetooth (default 192 kbps) to leave the radio airtime for the speaker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 14:20:22 +02:00
XoséandClaude Opus 5.5 a610b090f0 Minamp 1.9: install internally, resume after Bluetooth dropouts, log why playback stops
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>
2026-10-18 14:16:56 +02:00
xocko 0f38670880 Merge pull request 'Backport from the iOS version: offline downloads, home-first reconnect, stall warning, Close' (#1) from ios-backports into main
Reviewed-on: xocko/minamp#1
2026-10-17 14:27:06 +00:00
xockoandClaude Opus 5.5 f7f49ecfbb Minamp 1.7: new launcher icon
- 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>
2026-10-15 10:07:45 +02:00
xockoandClaude Opus 5.5 bbdab09f83 Minamp 1.6: adjustable UI size, larger text and controls
- 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>
2026-10-15 08:02:49 +02:00
xockoandClaude Opus 5.5 fa67e95fde Minamp 1.5: Galician interface
- 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>
2026-10-15 00:11:41 +02:00
xockoandClaude Opus 5.5 6fd17bc9c5 Minamp 1.4: faster connecting
- 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>
2026-10-14 21:16:09 +02:00
xockoandClaude Opus 5.5 58d21b6d68 Minamp 1.3
- 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>
2026-10-14 20:56:27 +02:00
xockoandClaude Opus 5.5 a4b875ef34 Minamp 1.2
- 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>
2026-10-14 20:38:17 +02:00
xockoandClaude Opus 5.5 0a2ac901bd Minamp 1.1
- 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>
2026-10-14 19:59:58 +02:00
xockoandClaude Opus 5.5 948d1198ad Sign APK in classic SignApk format so it installs on Android <= 4.2
Replace jarsigner + zipalign.py with tools/signapk.py, which writes the v1
signature the way old JarUtils expects and aligns the APK.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 19:46:20 +02:00
xockoandClaude Opus 5.5 0df8124629 Import minamp 1.0 source
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 19:38:37 +02:00