diff --git a/README.md b/README.md index d6907f6..6fa3a55 100644 --- a/README.md +++ b/README.md @@ -192,8 +192,10 @@ device, the tablet sets on AOSP AVDs; see [docs/STORE_LISTING.md](docs/STORE_LIS `python3 tools/make-demo-photos.py` draws the synthetic photo library the results screenshot is captured over, so the listing never shows a real one. The finished assets are **committed** — including the foreground-service demonstration video that [the declaration](docs/PLAY_RELEASE_CHECKLIST.md) -links to — and Gitea serves them without a login (`…/raw/branch/main/store-assets/…`), so pushing -is the deployment step and that URL is the link itself. +links to — and Gitea serves them without a login, so pushing is the deployment step: +`…/src/branch/main/store-assets/…` is the page a browser opens (and the shape Play's video link +takes, because a `/raw/` URL carries a `default-src 'none'` CSP that stops a video playing inline), +`…/raw/branch/main/…` is the bytes. User-visible changes are tracked in [CHANGELOG.md](CHANGELOG.md); the Play "What's new" text you type per release is separate and lives only in the Play Console. diff --git a/docs/PLAY_RELEASE_CHECKLIST.md b/docs/PLAY_RELEASE_CHECKLIST.md index 6d91feb..180d339 100644 --- a/docs/PLAY_RELEASE_CHECKLIST.md +++ b/docs/PLAY_RELEASE_CHECKLIST.md @@ -283,23 +283,38 @@ action except the items marked **[code]**. CANCEL"*, 13–18 s) while the scan kept running behind it, and the finished results (*17 duplicate groups · 54 of 5,385 photos*) at the end. - **The link to paste** is the committed file's own URL — no login, no second host: + **The link to paste** is the file's page in Gitea — what the repository's own *view* of + the file opens, and what plays it: ``` - https://gitea.softwareapp-hb.de/fishfacegit/foto-duplicate-finder/raw/branch/main/store-assets/fgs-demo/foreground-service-demo.mp4 + https://gitea.softwareapp-hb.de/fishfacegit/foto-duplicate-finder/src/branch/main/store-assets/fgs-demo/foreground-service-demo.mp4 ``` - Checked from outside this network: **200**, `Content-Type: video/mp4`, - `Content-Length: 1847900` and `Content-Disposition: inline`, so a reviewer's browser plays - it in the tab rather than prompting a download, and the served bytes are identical to the - recording (sha256 match). A `Range: bytes=0-99` request answers **206** with exactly those - 100 bytes even though `Accept-Ranges` is not advertised, so seeking works and a player can - start without fetching the whole file first — which matters here because `screenrecord` - writes the `moov` atom at the very end of the file. Two things to know before pasting: the - URL is pinned to `main`, so a re-shoot has to **overwrite the file in place** rather than - be added alongside it; and replacing the video at all means resubmitting the declaration. - (An unlisted YouTube upload of the same file works equally well if a link that survives - future commits is preferred — but then it is a second place to keep in step.) + ⚠️ **Not the `/raw/` URL**, even though that is the file itself. Gitea answers raw + responses with `Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; + sandbox` — a deliberate guard against raw HTML and SVG — and that blocks the media load of a + document that navigates straight to a video: the tab stays blank with no error, which is + exactly how this behaved in a browser. The same URL is fine as a *subresource*: the page + above embeds `