v0.2.0
What's new in DreamPlayer 0.2.0
Major release — Apple TV support lands, Android TV / Fire TV playback rebuilt on the in-app player, and phone gesture controls.
Apple TV (tvOS) — alpha, CI-green
- tvOS build works end-to-end — DreamPlayer builds for Apple TV via the community
flutter-tvostoolchain (Flutter 3.47 base). CI scaffoldstvos/fresh each build, overlays our adapted Swift files, injects the AetherEngine packages into the Xcode project, and produces an unsignedDreamPlayer-tvOS-alpha-<version>.ipa. Alpha — compiles and ships, but not yet verified on Apple TV hardware. - AetherEngine on tvOS — the same playback engine as iOS resolves as a Swift Package Manager dependency for appletvos:
AvPlayerView.swiftimports AetherEngine + AetherEngineSMB; FFmpeg demux/decode and DV/HDR10 via the native AVPlayer path come along automatically. Deployment target raised to tvOS 17.0 (the engine's minimum — the scaffold pinsTVOS_DEPLOYMENT_TARGET=15.0at project level, which beats a target-level override, so both names are set at both levels). - Adapted Swift files —
AvPlayerView.swiftguardsMPVolumeView/brightness/EDR-headroom with#if !os(tvOS);AppDelegate.swiftdrops IntentBridge (no "Open with") and registers the player view factory, file browser, WebDAV client, Jellyfin discovery, and cache cleaner behind the implicit-engine delegate;FileBrowser.swiftis Documents-only (no document picker — picker calls are graceful no-ops).WebDAVClient,JellyfinDiscovery,BufferedSMBReader,CacheCleanercopied unchanged from iOS. - tvOS plugins ported —
shared_preferences_tvos+package_info_plus_tvos(from fluttertv/plugins) give resume/continue-watching, TMDB cache, and saved servers real persistence;package_info_plusbumped to ^10.2.1 for compatibility. Plugins without tvOS implementations (url_launcher, multicast-lock channel) are wrapped in try/catch so nothing crashes. - CI plumbing solved (
tvos.yml) — scaffold step backs up our committedtvos/Runner/*.swiftbefore regenerating; Rubyxcodeprojadds the AetherEngine SPM package reference + both products to the Runner target, disables code signing (flutter-tvos has no--no-codesign; equivalent offlutter build ios --no-codesign), and registers every overlaid Swift file in the Sources phase; PlistBuddy adds Bonjour services + local-networking ATS; packaging discoversRunner.appdynamically instead of hardcoding the output path. - Siri Remote — arrow keys reveal controls / seek ±10s, select activates focused buttons, Menu hides controls then exits; the remote's play/pause media key toggles playback even off the TV code path (fixed this release).
Android TV / Fire TV
- Custom focus highlight — blue 3px border + glow shadow + AnimatedScale (1.25× transport buttons, 1.05× cards/list tiles/fields) across all TV-focusable widgets: transport controls, sheet list tiles, seekbar, home cards.
- TvTile shared widget — single source of truth for TV focus-glow wrapper (
lib/widgets/tv_tile.dart). - TvOverscan safe-area — wraps each TV screen with 36px side / 20px top-bottom padding (
lib/widgets/tv_overscan.dart). - TvTextField — two-FocusNode design: outer glow node for D-pad targeting, inner
skipTraversalnode for the TextField. OK/select opens the system Leanback IME; back/Done hands focus back to the glow node. No custom keyboard. - Leanback banner — 640×360
banner.pnginAndroidManifest.xmlfor TV launchers. - TV long-press — Enter/select key held 500ms fires
onLongPress;KeyRepeatEventswallowed. - Home scroll-on-return —
SliverAppBarpinned,jumpTo(0)on load with stable keys. - Buffer sizing — adaptive by heap class: Fire TV 24MB ring buffer (heap 192MB), phones 96MB (heap ≥ 256MB).
- Transparent window fix —
MainActivity.ktsetsColor.TRANSPARENTon TV devices;ExoPlayerView.ktcallssetZOrderMediaOverlay(true)— video visible on Fire TV Stick.
Player
- Gesture controls — vertical swipe on left half adjusts brightness (
Window.screenBrightnesson Android,UIScreen.main.brightnesson iOS); right half adjusts system volume (AudioManager STREAM_MUSICon Android,MPVolumeViewhidden slider on iOS). Dark centered feedback pill with icon + percentage, auto-fades 0.8s. Controls hide during gesture. - Swipe gestures toggle — "Swipe gestures" switch in Settings → Player section (default on); hidden on TV via
isTvMode(). - Play-pause ring highlight —
_TvControlButtonalwaysShowRingparameter; center play-pause usesalwaysShowRing: !_isTvso the ring glow shows on phones/tablets without a D-pad.
Bug fixes
- SMB badge —
VideoItem.playbackSourcenow accepts bothsmb:andsmb_prefixes for backward compat with stored data. - Double-back-press exit — root screen shows a SnackBar and requires two taps within 2s to exit (prevents accidental back-press exits on Android).
- Seekbar minimal highlight — TV focus highlight on seekbar is a thin 2px border only (no glow, no scale).
- Flutter 3.47.1 — local toolchain upgraded to match CI and the flutter-tvos base (Dart 3.13); all 129 tests pass, analyzer clean.
Download & install
Android
Pick the APK for your device and allow "Install unknown apps" when prompted:
| File | Best for |
|---|---|
DreamPlayer-<version>-arm64-v8a.apk |
64-bit ARM phones (most modern Android devices) |
DreamPlayer-<version>-armeabi-v7a.apk |
32-bit ARM phones (older devices) |
DreamPlayer-<version>-x86_64.apk |
64-bit Intel/AMD devices (emulators, some tablets) |
DreamPlayer-<version>-universal.apk |
Universal — all architectures in one file, installs everywhere |
Not sure which to pick? Grab the Universal APK.
iOS / iPadOS (sideload)
The DreamPlayer-<version>.ipa in this release is unsigned — Apple only allows app installation through the App Store / TestFlight, so the IPA must be signed with your own (free) Apple ID. It's quick:
- Install SideStore or AltStore on your iPhone/iPad (sidestore.io / altstore.io).
- Download
DreamPlayer-<version>.ipafrom this release. - Open SideStore/AltStore → + → select
DreamPlayer-<version>.ipa. It signs it with your Apple ID and installs. - The signature lasts 7 days; SideStore/AltStore auto-refresh it in the background over WiFi — a weekly open is all that's needed.
Notes:
- A free Apple ID can keep ~3 sideloaded apps active per device.
- First-time setup of SideStore/AltStore needs a computer (or a second Apple device).
- No automatic updates — re-download the newest IPA from this page when a new version is published.
Apple TV (tvOS) — alpha
The DreamPlayer-tvOS-alpha-<version>.ipa is unsigned and in alpha (CI-built, not yet verified on Apple TV hardware). To sideload:
- Open Xcode (needs a Mac or Mac-in-the-cloud).
- Window → Devices and Simulators → select your Apple TV.
- Click + under Installed Apps → select the downloaded IPA.
- The app appears on the Apple TV home screen.
What works: AetherEngine playback (DV/HDR10, lossless audio via FFmpeg), Jellyfin + WebDAV browsing/playback (self-signed HTTPS included), TMDB metadata, resume/continue-watching persistence (shared_preferences_tvos), saved servers. Navigate with the Siri Remote: swipe to move focus, click to select, play/pause button toggles playback, Menu goes back.
Known alpha limitations: no overscan padding (edges may clip on some TVs); "Network shares" and "Add folder to library" are no-ops (no document picker on tvOS); server login requires typing via the remote; HDR chips have no EDR probe (content still plays).
Versioning
App version follows semver, bumped per release (current release: 0.2.0).
Playing videos from your NAS / SMB share
DreamPlayer plays NAS files through the Files app's built-in SMB support and "Open with"
- iPhone/iPad: Files → ⋯ → Connect to Server → enter
smb://<address>→ browse to a video → long-press → Share → Open in "DreamPlayer". Prefer a folder? Bookmark it once: home + → Add folder to library → your NAS folder. - Android: CX Explorer → Open with → DreamPlayer (streams over CX's local HTTP proxy).
Full walkthrough: SMB / NAS playback tutorial.
Full Changelog: v0.1.11...v0.2.0