Skip to content

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 21 Aug 14:21
· 138 commits to main since this release

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-tvos toolchain (Flutter 3.47 base). CI scaffolds tvos/ fresh each build, overlays our adapted Swift files, injects the AetherEngine packages into the Xcode project, and produces an unsigned DreamPlayer-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.swift imports 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 pins TVOS_DEPLOYMENT_TARGET=15.0 at project level, which beats a target-level override, so both names are set at both levels).
  • Adapted Swift filesAvPlayerView.swift guards MPVolumeView/brightness/EDR-headroom with #if !os(tvOS); AppDelegate.swift drops 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.swift is Documents-only (no document picker — picker calls are graceful no-ops). WebDAVClient, JellyfinDiscovery, BufferedSMBReader, CacheCleaner copied unchanged from iOS.
  • tvOS plugins portedshared_preferences_tvos + package_info_plus_tvos (from fluttertv/plugins) give resume/continue-watching, TMDB cache, and saved servers real persistence; package_info_plus bumped 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 committed tvos/Runner/*.swift before regenerating; Ruby xcodeproj adds the AetherEngine SPM package reference + both products to the Runner target, disables code signing (flutter-tvos has no --no-codesign; equivalent of flutter build ios --no-codesign), and registers every overlaid Swift file in the Sources phase; PlistBuddy adds Bonjour services + local-networking ATS; packaging discovers Runner.app dynamically 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 skipTraversal node 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.png in AndroidManifest.xml for TV launchers.
  • TV long-press — Enter/select key held 500ms fires onLongPress; KeyRepeatEvent swallowed.
  • Home scroll-on-returnSliverAppBar pinned, 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 fixMainActivity.kt sets Color.TRANSPARENT on TV devices; ExoPlayerView.kt calls setZOrderMediaOverlay(true) — video visible on Fire TV Stick.

Player

  • Gesture controls — vertical swipe on left half adjusts brightness (Window.screenBrightness on Android, UIScreen.main.brightness on iOS); right half adjusts system volume (AudioManager STREAM_MUSIC on Android, MPVolumeView hidden 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_TvControlButton alwaysShowRing parameter; center play-pause uses alwaysShowRing: !_isTv so the ring glow shows on phones/tablets without a D-pad.

Bug fixes

  • SMB badgeVideoItem.playbackSource now accepts both smb: and smb_ 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:

  1. Install SideStore or AltStore on your iPhone/iPad (sidestore.io / altstore.io).
  2. Download DreamPlayer-<version>.ipa from this release.
  3. Open SideStore/AltStore → + → select DreamPlayer-<version>.ipa. It signs it with your Apple ID and installs.
  4. 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:

  1. Open Xcode (needs a Mac or Mac-in-the-cloud).
  2. Window → Devices and Simulators → select your Apple TV.
  3. Click + under Installed Apps → select the downloaded IPA.
  4. 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