edde746
cf8f1849aa
fix: harden watch together teardown sync
2026-03-06 12:52:28 +01:00
edde746
c9a1bc97c4
fix: remove dead state paths and restore track hotkeys
2026-03-06 11:50:45 +01:00
edde746
581f665f58
fix: restore iOS inline player after PiP closes
2026-03-06 11:35:25 +01:00
edde746
7b3a8ad642
fix: guard missing client in season detail screen
2026-03-06 11:09:42 +01:00
edde746
c1e2bc36ea
refactor: share Apple MPV core and media helpers
2026-03-06 10:16:33 +01:00
edde746
72aed76a1c
fix: remove unused _applyFilterWithFallback
2026-03-06 07:55:59 +01:00
edde746
7ae293631a
fix: trust server-computed subtitle selection flags
...
The Plex server already applies all preference levels (account,
show/season, per-item) into stream `selected` flags. Remove redundant
client-side subtitleMode/account prefs logic and show/season metadata
fetching (2 fewer API calls per episode).
2026-03-06 04:25:47 +01:00
edde746
f3d24866b7
fix: trust Plex stream selection for subtitle defaults
2026-03-06 03:43:10 +01:00
edde746
985ba5d2c7
fix: toggle PiP button closes PiP when already active
2026-03-06 03:08:28 +01:00
edde746
f7ca80de77
Merge pull request #637 from micahmo/fix/setting-episode-artwork
...
Fix an issue setting episode artwork
2026-03-06 03:08:20 +01:00
Micah Morrison
a9c7130d55
Fix an issue setting episode artwork
2026-03-05 19:21:30 -05:00
edde746
9730ffd541
fix: coerce subtitleMode string from Plex API to num
2026-03-05 21:53:52 +01:00
edde746
232f018ae7
fix: report JSON deserialization errors
2026-03-05 21:00:52 +01:00
edde746
8571ee74c4
fix: use addedAt for unwatched on-deck sort fallback
...
close #636
2026-03-05 19:57:36 +01:00
edde746
9566e0b897
perf: parallelize show/season metadata fetches
2026-03-05 18:56:52 +01:00
edde746
863f90f65d
fix: respect series-level subtitle mode for episodes
2026-03-05 18:55:44 +01:00
edde746
22a733280a
fix: respect view mode in detail screens, disable scale in list mode
...
close #631
2026-03-05 17:38:38 +01:00
edde746
a4008d3d6b
fix: move mpv operations off UI thread
2026-03-05 16:55:44 +01:00
edde746
819d7b0f8f
fix: scope library display settings per user profile
...
close #630
2026-03-05 16:42:13 +01:00
edde746
c785ce1f88
fix: queue sheet image loading priority with itemExtent
2026-03-05 16:11:14 +01:00
edde746
0c3588210a
fix: pause hero auto-scroll on desktop background transition
2026-03-05 15:36:35 +01:00
edde746
db57fa73ce
feat: add option to hide bottom navigation bar labels
2026-03-05 15:05:48 +01:00
edde746
0269825179
fix: windows single instance mutex
2026-03-05 14:59:40 +01:00
edde746
588b413223
fix: browse tab scrolling after alpha jump libraries
2026-03-05 14:41:21 +01:00
edde746
a2cd3397c9
fix: desktop context menu position and bottom sheet sizing
2026-03-05 14:25:23 +01:00
edde746
268f293704
refactor: deduplicate Dolby Vision conversion code
...
- Extract shared processNal() for NAL classification/conversion logic
- Share DoviExtractorOutputWrapper between MKV and MP4 paths
- Deduplicate DV profile codec queries via deviceSupportsDvProfile()
- Collapse repeated doviTrackOutput access chain in stats
2026-03-05 12:02:33 +01:00
edde746
317d5dbdd9
feat: DV Profile 7→8.1 RPU conversion via libdovi
...
Convert Dolby Vision Profile 7 RPU NALUs to Profile 8.1 using libdovi
native bridge, preserving dynamic tone mapping on devices with DV8
decoders. Falls back to HEVC stripping when no DV8 decoder is present.
- Add JNI bridge (dovi_bridge.cpp) wrapping libdovi's RPU converter
- Download prebuilt libdovi from edde746/libdovi-builds releases
- DoviConvertingTrackOutput: DV81 mode converts RPUs, HEVC_STRIP strips
- Retry logic: if native DV7 decoding fails, auto-retry with conversion
- Performance overlay shows active DV conversion mode
2026-03-05 11:11:57 +01:00
edde746
7f2d548d32
fix: item 0 steals focus after sidenav return
2026-03-04 18:39:49 +01:00
edde746
5877673755
fix: reduce UI padding between media items
...
close #629
2026-03-04 18:36:12 +01:00
edde746
3b351d7634
fix: iOS OOM during PiP playback cycles
...
Cancel leaked stream subscriptions in video player dispose and flush
sample buffer layer on PiP teardown/cleanup to release video frames.
2026-03-04 17:34:30 +01:00
edde746
e6ee83d9c2
fix: preserve home screen scroll position on back navigation
2026-03-04 16:34:36 +01:00
edde746
8b57e810ab
feat: detail screen context menu button
2026-03-04 15:11:46 +01:00
edde746
4121d568c8
fix: sanitize mpv event channel strings for valid UTF-8
2026-03-04 14:59:11 +01:00
edde746
551bd83ffe
fix: player disposed race condition
2026-03-04 14:37:51 +01:00
edde746
5f4e4bfdd3
fix: ExoPlayer fallback for unsupported DV formats
...
- Detect decoder hangs via AnalyticsListener (onVideoDecoderInitialized
→ onRenderedFirstFrame gap, confirmed by DecoderCounters)
- Detect deselected video tracks and trigger immediate MPV fallback
- Use reinhard tone-mapping on GPUs without compute shaders
2026-03-04 13:18:40 +01:00
edde746
8cd48f3af5
fix: firstClient null check race
2026-03-04 10:01:40 +01:00
edde746
13b5d7bae8
feat: secondary subtitle tracks
...
close #625
2026-03-04 09:35:36 +01:00
edde746
3a76754af9
feat: custom GLSL shader import
...
close #624
2026-03-04 08:47:40 +01:00
edde746
73eeac35a8
fix: disable async codec queueing
2026-03-04 07:53:13 +01:00
edde746
18abcef8a2
fix: offload large UTF-8 decoding to background isolate
...
Prevents ANR when Dio's responseDecoder synchronously decodes large API
responses on the main thread. Responses >50KB use compute(). Also caches
MediaCodecList query results in ExoPlayerCore companion object.
2026-03-04 07:42:26 +01:00
edde746
85800abf9f
fix: disable tunneling for video codecs without tunneling support
2026-03-04 07:27:02 +01:00
edde746
2b72327013
fix: hide metal layer when window is occluded
2026-03-04 05:06:25 +01:00
edde746
cc86afb31d
fix: sparkle update detection and startup hang
2026-03-04 01:09:35 +01:00
edde746
efac1a9f28
fix: watch together stream use after close
2026-03-04 00:20:48 +01:00
edde746
a9e4091500
fix: disable http breadcrumbs for sentry
2026-03-04 00:02:51 +01:00
edde746
891c4f8c32
fix: reduce currently-airing program contrast
...
close #622
2026-03-03 23:40:07 +01:00
edde746
96f7bd431c
fix: ExoPlayer logs never reaching Dart log output
...
setLogLevel silently no-oped because initialized was false at call time.
emitLog gated all levels behind debugLoggingEnabled which was never set.
2026-03-03 23:23:06 +01:00
edde746
cd2ab9d9cd
refactor: deduplicate shared patterns, replace hardcoded colors
2026-03-03 22:43:00 +01:00
edde746
8f3d52142d
fix: watch together sync bugs and code quality
...
- Reset _firstPlayCompleted on detach so episode switches wait for peers
- Remove duplicate host join announcement from sync manager
- Use dedicated isPlaying field in sessionConfig with legacy fallback
- Replace Future.delayed with cancellable Timer to prevent sync indicator flicker
- Make Participant fields final and constructor const
2026-03-03 21:41:32 +01:00
edde746
cb7de47aed
fix: guard ScrollController.position access in HorizontalScrollWithArrows
...
Prevents "Too many elements" StateError on Android TV when the controller
temporarily has multiple positions during widget rebuilds.
2026-03-03 20:45:38 +01:00