This commit is contained in:
ponzischeme89
2026-08-18 08:41:48 +12:00
parent 1da91e40a1
commit 36d171e51b
50 changed files with 4972 additions and 377 deletions
+21 -10
View File
@@ -8,6 +8,10 @@ plugins {
id("androidx.baselineprofile")
}
// One Media3 version for every artifact in the build — see the dependency block for why
// the Jellyfin FFmpeg extension pins which line that can be.
val media3Version = "1.9.4"
// Set in gradle.properties (or ~/.gradle/gradle.properties, or -Pmemby.serverUrl=...).
// Blank means "no hardwired server": the setup screen asks the user for an address.
val embyServerUrl: String = (project.findProperty("memby.serverUrl") as String?).orEmpty().trim()
@@ -46,7 +50,7 @@ val projectNoticeText =
// A release workflow can derive the app version from its Git tag without editing the
// source tree. Local builds keep using the checked-in default.
val defaultVersionName = "0.2.74"
val defaultVersionName = "0.2.75"
val membyVersionName: String =
(project.findProperty("memby.versionName") as String?)
?.trim()
@@ -235,7 +239,7 @@ dependencies {
implementation("androidx.compose.material:material-icons-extended")
// Compose for TV
implementation("androidx.tv:tv-material:1.0.0")
implementation("androidx.tv:tv-material:1.1.0")
// Image loading
implementation("io.coil-kt:coil-compose:2.7.0")
@@ -248,20 +252,27 @@ dependencies {
implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0")
// DataStore (persisted settings)
implementation("androidx.datastore:datastore-preferences:1.1.1")
implementation("androidx.datastore:datastore-preferences:1.2.1")
// Media3 / ExoPlayer for in-app playback
implementation("androidx.media3:media3-exoplayer:1.5.1")
implementation("androidx.media3:media3-exoplayer-hls:1.5.1")
implementation("androidx.media3:media3-ui:1.5.1")
// One version for the whole Media3 line, including the Jellyfin FFmpeg extension below.
// That extension is compiled against media3-exoplayer and reached reflectively through
// EXTENSION_RENDERER_MODE_ON, so a core built from a different minor line fails at
// renderer construction rather than at compile time — and PlayerEngine's LinkageError
// fallback would swallow it, silently withdrawing surround software decode with nothing
// in the log to say why. Jellyfin publishes up to the 1.9 line, so that is the line this
// app is on; moving the core past it means finding a matching extension first.
implementation("androidx.media3:media3-exoplayer:$media3Version")
implementation("androidx.media3:media3-exoplayer-hls:$media3Version")
implementation("androidx.media3:media3-ui:$media3Version")
// Lets the player pull its bytes through the app's one OkHttp stack instead of
// media3's own HttpURLConnection client — see ui/player/PlayerEngine.kt.
implementation("androidx.media3:media3-datasource-okhttp:1.5.1")
implementation("androidx.media3:media3-datasource-okhttp:$media3Version")
// Moonfin's Android TV backend keeps a software audio renderer behind Media3 so a
// surround track that is not bitstreamed is decoded to PCM instead of making the
// server re-encode the video beside it. This build targets Media3 1.5.x; Jellyfin's
// 1.5.0 extension is the matching published binary for that line.
// server re-encode the video beside it. This build targets Media3 1.9.x; Jellyfin's
// 1.9.0 extension is the matching published binary for that line.
//
// This is the ONLY native dependency the app carries, and it is 1.5MB per ABI because
// it links just the audio decoders it needs. It replaced a libmpv software-decoding
@@ -270,7 +281,7 @@ dependencies {
// the release APK from 3.1MB to 168MB and made every sideload a several-minute
// affair. A last-resort video path is not worth fifty times the app. If one is wanted
// again, it belongs behind a separately downloaded split, not in the base APK.
implementation("org.jellyfin.media3:media3-ffmpeg-decoder:1.5.0+1")
implementation("org.jellyfin.media3:media3-ffmpeg-decoder:1.9.0+1")
debugImplementation("androidx.compose.ui:ui-tooling")