Fifth beta for v0.13.0, cut from master. 2 PRs since beta.4. No migrations.
Flatpak publishing
The Linux player's Flatpak channels shipped in beta.4 but never published. This is the first release where flatpak-publish can complete, and three separate faults had to be fixed for that to be true.
- The repository signing public key is committed.
make-flatpakrepo.shembeds it in both.flatpakrepofiles so clients can verify the OSTree commits, and the script exits 1 when the key is absent, so the job failed before it ever reached R2. - The staged repo now survives the artifact round trip.
upload-artifactdoes not preserve empty directories, and an ostree repo keepsrefs/remotes,refs/mirrors,extensions,stateandtmp/cacheempty after a build. They were gone by the timeflatpak build-commit-fromread the downloaded repo, which exited withListing refs: opendir(refs/remotes): No such file or directory. That is what killed the publish on beta.4. - The dry run could not have caught that. Its rehearsal points
publish.shat$PWD/staged-repoinside the build job, which never passes through an artifact, so the skeleton is intact there and the rehearsal passes while the real path fails. - rclone can upload against a bucket-scoped R2 token. Such a token cannot call
ListBuckets, so rclone's existence probe fails and it falls back toCreateBucket, which the token also cannot do. Uploads died onAccessDenied: CreateBucket, which reads like bad credentials while the credentials are correct.
Operator setup was completed alongside this: the mydia-flatpak R2 bucket, flatpak.mydia.dev attached as its custom domain, and the signing and storage secrets.
Once this release publishes, the beta channel can be added with:
flatpak remote-add --if-not-exists --from mydia-beta https://flatpak.mydia.dev/mydia-beta.flatpakrepo
flatpak install mydia-beta dev.mydia.player
Casting
- Skip Intro and Skip Credits work while casting. Both were bound to the local media_kit
Player, which the cast path deliberately never builds, so the button was gated off, auto-skip read a position from a listener that does not exist, and the seek returned early. The feature was missing on the surface where sitting through an intro is most annoying. - Local and cast playback share one auto-skip rule now, rather than two copies that can drift.
- A failed cast skip no longer escapes into the zone.
- Two limits remain. Auto-skip only fires while the app is awake and foregrounded, because every skip is the phone issuing a seek and the stock receiver knows nothing about segments. Skip is also available on the player screen only, not from the mini controller.