app 1.15.1 -> 1.15.2, appCode 459 -> 460. That single edit drives Android's versionName/versionCode, Desktop and CLI packageVersion, quartz's Maven version and geode's RelayInfo.VERSION. Three substantive PRs since v1.15.1, plus Crowdin translations and the packaging syncs the bump workflows opened after the last tag: - #4092 media previews: an extension match now requires a real dot, so a player page whose path merely ends in the letters `_mp3` stops going to the video player, and `og:audio`/`og:video` are read and played with the page's `og:image` as poster. A declaration whose type is `text/html` -- YouTube's -- is refused. - #4095 nested NIP-22 replies: engagement subscriptions asked only for the lowercase `e`/`a` tags, so a comment two or more levels deep was invisible until ThreadScreen opened its own subscription. Each relay gets a second, root-scoped filter on `E`/`A`. Kind 1619 moves there too -- NIP-34 gives PR updates only an uppercase `E`, so it had been in a filter it could never match. - #4096 Health Connect: a rationale screen Play requires, reachable from the composer, from Health Connect's permission screen and standalone without an account; reads moved off the UI thread; source names memoized; and the workout form is replaced rather than merged when a second suggestion is picked. Verified on a Pixel 9 emulator before cutting, since two of the three are only observable on device: the og:audio track plays in a thread with real transport controls (00:30 / 05:00) where it used to buffer forever, and the Health Connect rationale opens from all three routes -- including the one that matters for review, where Health Connect's own permission screen launches our ViewPermissionUsageActivity through the START_VIEW_PERMISSION_USAGE-guarded filter. RELEASE_NOTES_ID deliberately stays on the v1.15.0 note: RELEASE_OPS has it repointed on x.y.0 only. Left alone deliberately: everything under */packaging/ and translators.json's tag, which the bump workflows and the Crowdin job write after the tag exists. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VgVDQQXAg4cmzsWHoJj61k
2.3 KiB
v1.15.2: Media Previews, Nested Replies, and Health Connect
Improvements and Bug fixes
-
Plays the track a media player page is about, instead of trying to play the page. A link to
e.nostr.build/a_<id>_mp3rendered a permanently-buffering player: that URL answerstext/html— it is the HTML player page, and the file it is about is named in itsog:audio. Two separate defects produced it, and both are fixed. File-extension matching now requires a real dot, so a path ending in the letters of an extension (_mp3, or a prose slug like/my-thoughts-on-mp3) is no longer handed to the video player; and the preview pipeline readsog:audio/og:videoand plays that file, with the page'sog:imageas poster.Reading a declaration is not trusting it: YouTube declares an
og:videowhose type istext/html— an embed page, not a video — so it is refused and keeps its link card. -
Loads nested NIP-22 replies in the feed, not only after a thread is opened. NIP-22 puts the direct parent in lowercase
e/aand the conversation root in uppercaseE/A, and a comment two or more levels deep carries only the root. The engagement subscriptions asked for the lowercase tags alone, so everything below the first level was invisible untilThreadScreenopened a subscription of its own. Each relay now gets a second, root-scoped filter.Kind 1619 (NIP-34 PR updates) moves with it: the spec gives it only
["E", <pull-request-id>]and no lowercaseeat all, so it had been sitting in a filter it could never match.
Health Connect
- Adds a rationale screen explaining what Amethyst reads from Health Connect and why — the data types, their purposes, the seven-day and composer-only limits, and what it never does (no writes, no route or location). It opens from the workout composer, from Health Connect's own permission screen, and stands alone without an account, which is what Google Play requires of it.
- Stops blocking the UI thread on Health Connect reads, and memoizes source app
names rather than asking
PackageManageragain for each record. - Replaces the whole form when a second workout suggestion is picked, so the distance and calories of the first no longer leak into the second.
- Documents the integration for Play Console review, and in
PRIVACY.md.
Build
- Bumps
appCodeto 460.