diff --git a/app/api/scenes.py b/app/api/scenes.py index ee5de79..333ab81 100644 --- a/app/api/scenes.py +++ b/app/api/scenes.py @@ -980,6 +980,15 @@ def _build_scene_out(session: Session, scene: Scene, *, device_id: str = LEGACY_ playback_out: list[PlaybackSourceOut] = [] for p in playback_rows: out = PlaybackSourceOut.model_validate(p) + # sxyprn: podmień martwy trafficdeposit URL na żywy on-demand resolver + # (/proxy/sxyprn-thumb/) — TAK JAK lista (_build_scenes_out_batch). Bez tego + # detal sceny pokazywał martwą miniaturę sxyprn mimo że lista działała, i "refresh + # thumbnail" nie pomagał (sxyprn IP-bound, enrich z VPS pada). Report 2026-07-22. + sxy = _sxyprn_thumb_url(p.page_url) + if sxy: + out.thumbnail_url = sxy + elif out.thumbnail_url and _is_rotting_thumb(out.thumbnail_url): + out.thumbnail_url = None # Wrap thumbnail URL-e przez backend image proxy gdy CDN wymaga Refera # (hqporner — fastporndelivery zwraca 403 bez Referer headera, expo-image # nie wysyła go domyślnie). Token ma 30-dniowy TTL bo thumby są stabilne. diff --git a/mobile/src/changelog.ts b/mobile/src/changelog.ts index 2a38e4f..85b88fa 100644 --- a/mobile/src/changelog.ts +++ b/mobile/src/changelog.ts @@ -16,6 +16,13 @@ export type ChangelogEntry = { }; export const CHANGELOG: ChangelogEntry[] = [ + { + id: '2026-07-22b', + date: 'July 2026', + items: [ + 'The brief burst of sound before a video starts is now fully silenced, including sites whose player auto-plays with sound as the app grabs the stream.', + ], + }, { id: '2026-07-22', date: 'July 2026', diff --git a/mobile/src/screens/PlayerScreen.tsx b/mobile/src/screens/PlayerScreen.tsx index 1b3462e..12ffb82 100644 --- a/mobile/src/screens/PlayerScreen.tsx +++ b/mobile/src/screens/PlayerScreen.tsx @@ -1043,6 +1043,31 @@ const INJECTED_JS = ` }; window.addEventListener('touchstart', _goonAllowSound, { once: true, capture: true }); window.addEventListener('click', _goonAllowSound, { once: true, capture: true }); + + // Attribute-autoplay (