Skip to content

Feat/addon support - #323

Closed
ggottes wants to merge 3 commits into
moss-apps:mainfrom
ggottes:feat/addon-support
Closed

ggottes wants to merge 3 commits into
moss-apps:mainfrom
ggottes:feat/addon-support

Conversation

@ggottes

@ggottes ggottes commented Oct 19, 2026

Copy link
Copy Markdown

Summary

Related issue

Checklist

  • flutter analyze passes
  • flutter test passes
  • Rust changes: cargo test --manifest-path rust/Cargo.toml passes
  • Built and ran the app if the change touches a playback path (flutter run --flavor full)
  • Generated code regenerated and committed if bridge/drift/freezed models changed
  • CHANGELOG.md updated for user-facing changes
  • No secrets, keys, tokens, or machine-local files committed
  • One change per PR; no unrelated reformatting in the same diff
  • Hardware tested if the Rust audio engine or USB/DAC output changed

ggottes and others added 3 commits October 20, 2026 01:38
Addon sources are remote HTTP JSON services exposing /manifest.json,
/search and /stream/{id}. Flick is the client: the JSON is parsed and the
returned media URL is handed to the existing audio engine, so the addon's
code is never executed and bit-perfect playback, DSP, gapless and DSD are
unchanged.

- AddonService implements NetworkSourceService (the seam behind Subsonic,
  Jellyfin, WebDAV, UPnP, SMB and Tidal). The manifest is cached in the
  existing networkServers.token column, so no Isar migration is needed.
- Addon hits appear as a section in global search and play as ephemeral
  Song objects: nothing is written to the database, and _savePosition skips
  them so an ephemeral track cannot replace the local resume point.
- Only direct streams (manifest: none) are accepted. HLS, DASH and
  encrypted renditions throw a typed error and are reported before a
  playback spinner starts, rather than being silently downgraded.
- quality=LOSSLESS is requested on every search and stream call.
- Settings reuse the Network Sources screens: no username or password, no
  sync action, and the manifest name/version replaces the song count.

Adds docs/ADDONS_PLAN.md with the wire contract and known limitations.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Adds a workflow that builds the full-flavor release APK and attaches it to
a GitHub Release, so releases no longer depend on one machine having the
SDK, NDK and Rust toolchain.

Signing material comes from repository secrets and is written to the
gitignored android/key.properties at build time; the job fails with the
secret list if they are missing, instead of producing a build that cannot
update over an existing install. google-services.json is also gitignored
and the app does not use Firebase, but the plugin is applied and fails
without the file, so a placeholder is written unless a real one is
provided.

Builds can also be started manually for either flavor, in which case the
APK is uploaded as a workflow artifact and no release is touched.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Upstream tags releases as 0.23.0-beta.1, without a v prefix, so a v*-only
trigger would never fire for them. Accept both forms.

Co-Authored-By: Claude Code <noreply@anthropic.com>
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.

1 participant