Skip to content

Releases: fvhde/origin-ghost-player

Origin Ghost Player v0.3.4

Choose a tag to compare

@fvhde fvhde released this 04 Sep 15:57

Hotfix release.

Fixes #2: pressing play with Tidal as the mirrored source could flicker rapidly between
play/pause instead of starting cleanly, eventually exhausting the system's AudioTrack pool
(No More Track Available). Root cause: MediaProbeListener.playSilentBlip() unconditionally
re-issued transportControls.play() on the real controller after each keep-alive blip, "just in
case" the blip had interrupted playback. It never actually did on this device, but Tidal's
onPlay() isn't idempotent — calling it while already playing hard-restarts its player, and each
restart looked like a fresh play transition, queuing more blips faster than they could drain.

  • Removed the redundant post-blip resume call.
  • Added a 2.5s floor between silent-blip bursts as defense in depth.

Fixed and verified on-device by @serrj-sv in #3 — thank you!

Same signing key as origin-isle and prior releases (fingerprint unchanged). Two identities as
before — install whichever matches what you had:

  • origin-ghost-player-kugou-0.3.4.apk (com.kugou.android.lite)
  • origin-ghost-player-luna-0.3.4.apk (com.luna.music)

Origin Ghost Player v0.3.3

Choose a tag to compare

@fvhde fvhde released this 25 Aug 18:30

Fixes #1: OriginPlayer's now-playing chip could get stuck animating "playing" forever
after the source app was killed or swiped away in the background — the last
PlaybackState it had ever seen from us was STATE_PLAYING, so isActive=false alone
gave it nothing to react to. This release explicitly pushes a STOPPED state and drops
the stale metadata before deactivating the session, so there's a real "this stopped"
signal.

Same signing key as origin-isle and prior releases (fingerprint unchanged). Two identities
as before — install whichever matches what you had:

  • origin-ghost-player-kugou-0.3.3.apk (com.kugou.android.lite)
  • origin-ghost-player-luna-0.3.3.apk (com.luna.music)

v0.3.2

Choose a tag to compare

@fvhde fvhde released this 20 Aug 19:04

Hotfix for two bridge bugs found on-device:

  • Firefox never stopped: sources that report no PlaybackState at all (Firefox does this)
    used to be mirrored as "playing" forever, with no way to ever notice a real stop — even after
    the tab finished or Firefox was closed. Fixed with a staleness timeout: if such a source's
    metadata sits unchanged for 3+ minutes, it's now treated as finished and cleared.
  • Stuck until manual reselect: OriginPlayer could let go of us during a paused/idle stretch,
    and resuming an already-tracked session never re-triggered the silent-audio signal that gets
    its attention back — only a brand-new session did. It now fires on any resume, not just a new
    session.

Same signing key as origin-isle and prior releases (fingerprint unchanged). Two identities as
before — install whichever matches what you had:

  • origin-ghost-player-kugou-0.3.2.apk (com.kugou.android.lite)
  • origin-ghost-player-luna-0.3.2.apk (com.luna.music)

Origin Ghost Player v0.3.1

Choose a tag to compare

@fvhde fvhde released this 19 Aug 21:20

Hotfix: fixes the click-through redirect being unreliable — it previously fired unconditionally on
any launch based purely on "is something playing," with no way to distinguish OriginPlayer's
tap-through from opening the app icon yourself, and only checked on a cold start (which the far
more common "already running" launch never re-triggers). Result: sometimes it didn't redirect from
OriginPlayer, sometimes it redirected when you just wanted to open the app.

Fixed using Activity.getReferrer(), confirmed empirically on-device:

  • Direct launcher tap → referrer is the launcher itself.
  • OriginPlayer's Control Panel tap → com.vivo.musicwidgetmix.
  • A second system-UI tap surface → com.vivo.systemuiplugin.

Only those two vivo system referrers trigger the redirect now. Every other launch (including
opening the app icon directly) shows our own screen — which now also displays what's currently
playing (title, artist, source app, tap to open) instead of just permission status.

Origin Ghost Player v0.3.0

Choose a tag to compare

@fvhde fvhde released this 19 Aug 16:59

Two builds now, same code, different spoofed identity — pick whichever native widget you prefer:

  • origin-ghost-player-kugou-0.3.0.apk — the original, most-tested identity.
  • origin-ghost-player-luna-0.3.0.apk — Luna Music's identity gets a noticeably bigger
    lockscreen widget (more room for album art and text) and surfaces karaoke support in
    OriginPlayer that Kugou's doesn't.

Both are signed with the same key (fingerprint matches origin-isle's and each other) and can be
installed side by side, since they're different package identities.

Other changes

  • More informative first-run screen — explains why notification access is needed, and adds a
    button to request unrestricted background running (so OriginOS is less likely to kill the
    bridge while your screen is off). Also fixes content drawing behind the status bar under
    edge-to-edge (targetSdk 36).
  • Less flickering between album art when switching source apps — source tracking is now
    sticky instead of re-evaluating "which session is playing" from scratch every second.
  • More resilient to long background stretches — if another app holds real audio output for an
    extended period (observed: ~10 minutes), the bridge process could get killed under memory
    pressure without ever being swiped away, so the existing swipe-away recovery never engaged. A
    periodic health-check alarm now catches this case too.

See docs/DEV.md for details.

Origin Ghost Player v0.2.1

Choose a tag to compare

@fvhde fvhde released this 18 Aug 21:00

Hotfix: fixes a bug where a track you'd deliberately paused could resume playing on its own after
a while (e.g. once the listener reconnected after being idle and re-picked-up that same paused
session). The v0.2.0 auto-focus fix's safety-net resume call was unconditional; it's now gated on
the track actually still being in a playing state, so a real pause is never overridden.

Origin Ghost Player v0.2.0

Choose a tag to compare

@fvhde fvhde released this 18 Aug 20:22

Adds auto-focus: OriginPlayer now picks up whatever's playing through the bridge automatically,
instead of needing a manual reselect in OriginOS's own widget picker every time playback starts
fresh or a native app (Spotify, etc.) takes the widget over.

Turns out OriginPlayer's takeover trigger is keyed on real audio output, not the MediaSession or a
posted notification. On picking up a new source, the app now briefly plays a genuinely silent
AudioTrack — deliberately without ever requesting audio focus, so there's no
focus-arbitration event and nothing audible happens to the real app — purely to register as active
audio output. Verified with no audible glitch.

See docs/DEV.md for the full
writeup of how this was tracked down.

Origin Ghost Player v0.1.1

Choose a tag to compare

@fvhde fvhde released this 18 Aug 15:29

Hotfix: adds a proper launcher icon. The app previously shipped with the generic Android
placeholder icon.

  • Adaptive icon: Google Material Symbols' "music_note" (rounded, Apache 2.0), white on a purple
    background.

No functional changes otherwise.

Origin Ghost Player v0.1.0

Choose a tag to compare

@fvhde fvhde released this 18 Aug 13:16

First release. Bridges any real app's media session onto a whitelisted identity (Kugou Music
Lite, com.kugou.android.lite) so OriginOS's native OriginPlayer widget renders for it —
regardless of which app is actually playing. Confirmed working with Metrolist and Firefox as
sources.

  • No notification, no persistent UI — the app is invisible; OriginOS's own OriginPlayer chrome is
    the only thing you see.
  • Real playback controls, wired back to the actual source app.
  • Survives being swiped away (same keep-alive recipe as origin-isle).

Companion project to origin-isle — same maintainer, same
signing key (fingerprint below matches origin-isle's exactly).

See docs/DEV.md for how the
identity bridge actually works.