diff --git a/VERIFICATION-0.85.0.md b/VERIFICATION-0.85.0.md new file mode 100644 index 0000000..cda1ca7 --- /dev/null +++ b/VERIFICATION-0.85.0.md @@ -0,0 +1,6 @@ +# Orbit TV 0.85.0: every Blender ident, and a smoother handover + +- Every channel's ident is now the approved Blender film, except VHS, Riot, Rewind and ToonZ, which stay 2D on purpose. Paradox's ident carries "Expect the unexpected" with a stronger logo shadow. Built by design/channels/build-idents.sh, re-encoded small and silent as before. +- Size: idents and intro 17.2 MB, up from 13.7 MB. The app is 31.4 MB, up from 27.9 MB. +- Handover: once the ident covers the show completely, the show's player is stopped, which frees its decoder and buffers for the ident and the next programme. Back during an ident now tunes the picture afresh instead of handing back a stopped stream. +- Unit tests: 323 passed. Lint passed. diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index c2fb525..858d740 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -9,8 +9,8 @@ android { applicationId = "tv.orbit.classic" minSdk = 26 targetSdk = 36 - versionCode = 104 - versionName = "0.84.2-paradox-who" + versionCode = 105 + versionName = "0.85.0-blender-idents-all" } buildFeatures { compose = true } compileOptions { sourceCompatibility = JavaVersion.VERSION_17; targetCompatibility = JavaVersion.VERSION_17 } diff --git a/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt b/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt index 666e4f7..a2ff187 100644 --- a/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt +++ b/android/app/src/main/java/tv/orbit/classic/EmbyClient.kt @@ -66,7 +66,7 @@ internal class HttpsEmbyTransport(internal val deviceId: String = UUID.randomUUI connection.connectTimeout = 10_000 connection.readTimeout = request.readTimeoutMs ?: if (request.path == "/Sessions/Logout") 5_000 else 15_000 connection.setRequestProperty("Accept", "application/json") - connection.setRequestProperty("X-Emby-Authorization", "Emby Client=\"Orbit TV\", Device=\"Orbit TV\", DeviceId=\"$deviceId\", Version=\"0.84.2\"") + connection.setRequestProperty("X-Emby-Authorization", "Emby Client=\"Orbit TV\", Device=\"Orbit TV\", DeviceId=\"$deviceId\", Version=\"0.85.0\"") request.token?.let { connection.setRequestProperty("X-Emby-Token", it) } if (request.method == "POST") { val bytes = request.body.orEmpty().toByteArray(Charsets.UTF_8) diff --git a/android/app/src/main/java/tv/orbit/classic/EmbyPlaybackDialog.kt b/android/app/src/main/java/tv/orbit/classic/EmbyPlaybackDialog.kt index 984ec23..c80297a 100644 --- a/android/app/src/main/java/tv/orbit/classic/EmbyPlaybackDialog.kt +++ b/android/app/src/main/java/tv/orbit/classic/EmbyPlaybackDialog.kt @@ -233,6 +233,8 @@ internal fun EmbyPlaybackDialog(session: EmbySampleSession, plan: EmbyPlaybackPl if (covered) { repeat(10) { step -> player.volume = 1f - (step + 1) / 10f; delay(50) } player.pause() + // The ident covers it completely now. Stopping frees its decoder and buffers for the ident and the next programme. + player.stop() } } LaunchedEffect(player, ready) { @@ -252,7 +254,8 @@ internal fun EmbyPlaybackDialog(session: EmbySampleSession, plan: EmbyPlaybackPl } val dismiss: () -> Unit = { if (intro?.showing == true) intro.skip() else if (trackMenu != null) trackMenu = null else if (numberEntry != null) { numberEntry = null; numberProblem = null } else { // Backing out keeps the stream running in the picture, without subtitles at that size. - if (ready && failure == null && foreground && onHandBack?.invoke(player) == true) { + // A programme stopped under its ident has nothing left to hand back, so the picture tunes in afresh. + if (ready && !covered && failure == null && foreground && onHandBack?.invoke(player) == true) { handedBack = true player.trackSelectionParameters = player.trackSelectionParameters.buildUpon().setTrackTypeDisabled(C.TRACK_TYPE_TEXT, true).build() } diff --git a/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt b/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt index e1ac809..1e5b4c3 100644 --- a/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt +++ b/android/app/src/main/java/tv/orbit/classic/SecureMediaDataSource.kt @@ -33,7 +33,7 @@ internal class SecureMediaDataSource(private val session: EmbySampleSession) : B next.instanceFollowRedirects = false next.connectTimeout = 10_000 next.readTimeout = 20_000 - next.setRequestProperty("User-Agent", "OrbitTV/0.84.2") + next.setRequestProperty("User-Agent", "OrbitTV/0.85.0") next.setRequestProperty("Accept-Encoding", "identity") session.mediaHeaders(address).forEach { (key, value) -> next.setRequestProperty(key, value) } if (dataSpec.position != 0L || dataSpec.length != C.LENGTH_UNSET.toLong()) { diff --git a/android/app/src/main/res/raw/ident_102.mp4 b/android/app/src/main/res/raw/ident_102.mp4 index 691a31e..6639587 100644 Binary files a/android/app/src/main/res/raw/ident_102.mp4 and b/android/app/src/main/res/raw/ident_102.mp4 differ diff --git a/android/app/src/main/res/raw/ident_103.mp4 b/android/app/src/main/res/raw/ident_103.mp4 index e107da6..bf0c8e3 100644 Binary files a/android/app/src/main/res/raw/ident_103.mp4 and b/android/app/src/main/res/raw/ident_103.mp4 differ diff --git a/android/app/src/main/res/raw/ident_104.mp4 b/android/app/src/main/res/raw/ident_104.mp4 index cb1d367..b34f79e 100644 Binary files a/android/app/src/main/res/raw/ident_104.mp4 and b/android/app/src/main/res/raw/ident_104.mp4 differ diff --git a/android/app/src/main/res/raw/ident_106.mp4 b/android/app/src/main/res/raw/ident_106.mp4 index 45eb56b..591c6af 100644 Binary files a/android/app/src/main/res/raw/ident_106.mp4 and b/android/app/src/main/res/raw/ident_106.mp4 differ diff --git a/android/app/src/main/res/raw/ident_107.mp4 b/android/app/src/main/res/raw/ident_107.mp4 index 2632ba2..cdd9d9d 100644 Binary files a/android/app/src/main/res/raw/ident_107.mp4 and b/android/app/src/main/res/raw/ident_107.mp4 differ diff --git a/android/app/src/main/res/raw/ident_203.mp4 b/android/app/src/main/res/raw/ident_203.mp4 index 506b0b7..d37dec2 100644 Binary files a/android/app/src/main/res/raw/ident_203.mp4 and b/android/app/src/main/res/raw/ident_203.mp4 differ diff --git a/android/app/src/main/res/raw/ident_204.mp4 b/android/app/src/main/res/raw/ident_204.mp4 index c5227e7..f6d6fd3 100644 Binary files a/android/app/src/main/res/raw/ident_204.mp4 and b/android/app/src/main/res/raw/ident_204.mp4 differ diff --git a/android/app/src/main/res/raw/ident_301.mp4 b/android/app/src/main/res/raw/ident_301.mp4 index 0afcc61..828bcd2 100644 Binary files a/android/app/src/main/res/raw/ident_301.mp4 and b/android/app/src/main/res/raw/ident_301.mp4 differ diff --git a/android/app/src/main/res/raw/ident_302.mp4 b/android/app/src/main/res/raw/ident_302.mp4 index 47d8fa2..b2dd8a8 100644 Binary files a/android/app/src/main/res/raw/ident_302.mp4 and b/android/app/src/main/res/raw/ident_302.mp4 differ diff --git a/android/app/src/main/res/raw/ident_303.mp4 b/android/app/src/main/res/raw/ident_303.mp4 index 6f8629c..739894f 100644 Binary files a/android/app/src/main/res/raw/ident_303.mp4 and b/android/app/src/main/res/raw/ident_303.mp4 differ diff --git a/android/app/src/main/res/raw/ident_307.mp4 b/android/app/src/main/res/raw/ident_307.mp4 index ba3601e..1e25874 100644 Binary files a/android/app/src/main/res/raw/ident_307.mp4 and b/android/app/src/main/res/raw/ident_307.mp4 differ diff --git a/android/app/src/main/res/raw/ident_308.mp4 b/android/app/src/main/res/raw/ident_308.mp4 index 9bae872..550e5c0 100644 Binary files a/android/app/src/main/res/raw/ident_308.mp4 and b/android/app/src/main/res/raw/ident_308.mp4 differ diff --git a/android/app/src/main/res/raw/ident_309.mp4 b/android/app/src/main/res/raw/ident_309.mp4 index 05d4b42..e0b3ee4 100644 Binary files a/android/app/src/main/res/raw/ident_309.mp4 and b/android/app/src/main/res/raw/ident_309.mp4 differ diff --git a/android/app/src/main/res/raw/ident_401.mp4 b/android/app/src/main/res/raw/ident_401.mp4 index 63dd71c..d3985ad 100644 Binary files a/android/app/src/main/res/raw/ident_401.mp4 and b/android/app/src/main/res/raw/ident_401.mp4 differ diff --git a/android/app/src/main/res/raw/ident_601.mp4 b/android/app/src/main/res/raw/ident_601.mp4 index 1236b1b..e7f42a8 100644 Binary files a/android/app/src/main/res/raw/ident_601.mp4 and b/android/app/src/main/res/raw/ident_601.mp4 differ diff --git a/android/app/src/main/res/raw/ident_602.mp4 b/android/app/src/main/res/raw/ident_602.mp4 index 68dc301..129b331 100644 Binary files a/android/app/src/main/res/raw/ident_602.mp4 and b/android/app/src/main/res/raw/ident_602.mp4 differ diff --git a/android/app/src/main/res/raw/ident_603.mp4 b/android/app/src/main/res/raw/ident_603.mp4 index f812ec6..9b62a06 100644 Binary files a/android/app/src/main/res/raw/ident_603.mp4 and b/android/app/src/main/res/raw/ident_603.mp4 differ diff --git a/android/app/src/main/res/raw/ident_611.mp4 b/android/app/src/main/res/raw/ident_611.mp4 index b565eec..27a0623 100644 Binary files a/android/app/src/main/res/raw/ident_611.mp4 and b/android/app/src/main/res/raw/ident_611.mp4 differ diff --git a/android/app/src/main/res/raw/ident_612.mp4 b/android/app/src/main/res/raw/ident_612.mp4 index 0a01cf7..8aa3efe 100644 Binary files a/android/app/src/main/res/raw/ident_612.mp4 and b/android/app/src/main/res/raw/ident_612.mp4 differ diff --git a/android/app/src/main/res/raw/ident_613.mp4 b/android/app/src/main/res/raw/ident_613.mp4 index 37fe7ad..00edaec 100644 Binary files a/android/app/src/main/res/raw/ident_613.mp4 and b/android/app/src/main/res/raw/ident_613.mp4 differ diff --git a/design/channels/build-idents.sh b/design/channels/build-idents.sh index a0ca83b..4886c3c 100755 --- a/design/channels/build-idents.sh +++ b/design/channels/build-idents.sh @@ -1,38 +1,38 @@ #!/bin/bash -# The app's copies of the channel idents: the approved versions, Blender where there is one, re-encoded small and silent, named by channel number. +# The app's copies of the channel idents: the approved versions, Blender for all but VHS, Riot, Rewind and ToonZ, which stay 2D on purpose; Paradox with its tagline, re-encoded small and silent, named by channel number. D=${1:?folder holding depth-native}; OUT=$(dirname "$0")/../../android/app/src/main/res/raw while read -r number source; do ffmpeg -nostdin -y -loglevel error -i "$D/$source" -an -vf fps=30 -c:v libx264 -profile:v main -pix_fmt yuv420p -crf 30 -maxrate 1400k -bufsize 2800k -movflags +faststart "$OUT/ident_$number.mp4" done <<'LIST' 101 blender/orbit-1/orbit-1_blender.mp4 -102 world/orbit-2/orbit-2_3d.mp4 -103 world/orbit-three/orbit-three_3d.mp4 -104 world/orbit-gold/orbit-gold_3d.mp4 +102 blender/orbit-2/orbit-2_blender.mp4 +103 blender/orbit-three/orbit-three_blender.mp4 +104 blender/orbit-gold/orbit-gold_blender.mp4 105 world/orbit-riot/orbit-riot_3d.mp4 -106 blender/paradox/paradox_blender.mp4 -107 world/evidence/evidence_3d.mp4 +106 blender/paradox/paradox_blender_tagline.mp4 +107 blender/evidence/evidence_blender.mp4 201 blender/orbit-terra/orbit-terra_blender.mp4 202 blender/orbit-odyssey/orbit-odyssey_blender.mp4 -203 world/orbit-wild/orbit-wild_3d.mp4 -204 world/orbit-dark-files/orbit-dark-files_3d.mp4 -301 world/orbit-premiere/orbit-premiere_3d.mp4 -302 world/orbit-action/orbit-action_3d.mp4 -303 world/orbit-sci-fi/orbit-sci-fi_3d.mp4 +203 blender/orbit-wild/orbit-wild_blender.mp4 +204 blender/orbit-dark-files/orbit-dark-files_blender.mp4 +301 blender/orbit-premiere/orbit-premiere_blender.mp4 +302 blender/orbit-action/orbit-action_blender.mp4 +303 blender/orbit-sci-fi/orbit-sci-fi_blender.mp4 304 blender/orbit-horror/orbit-horror_blender.mp4 305 blender/orbit-after-dark/orbit-after-dark_blender.mp4 306 world/orbit-vhs/orbit-vhs_3d.mp4 -307 world/orbit-romance/orbit-romance_3d.mp4 -308 world/orbit-detour/orbit-detour_3d.mp4 -309 world/orbit-britx/orbit-britx_3d.mp4 -401 world/orbit-ring-x/orbit-ring-x_3d.mp4 +307 blender/orbit-romance/orbit-romance_blender.mp4 +308 blender/orbit-detour/orbit-detour_blender.mp4 +309 blender/orbit-britx/orbit-britx_blender.mp4 +401 blender/orbit-ring-x/orbit-ring-x_blender.mp4 601 blender/vortex/vortex_blender.mp4 -602 city/heroes/heroes_city.mp4 -603 world/orbit-x/orbit-x_3d.mp4 +602 blender/heroes/heroes_blender.mp4 +603 blender/orbit-x/orbit-x_blender.mp4 604 world/rewind/rewind_3d.mp4 605 world/toonz/toonz_3d.mp4 -611 world/orbit-junior/orbit-junior_3d.mp4 -612 world/wonder/wonder_3d.mp4 -613 world/orbit-pixelz/orbit-pixelz_3d.mp4 +611 blender/orbit-junior/orbit-junior_blender.mp4 +612 blender/wonder/wonder_blender.mp4 +613 blender/orbit-pixelz/orbit-pixelz_blender.mp4 LIST # Tots keeps its jingles, and has a film for morning and evening. Built by orbit-tots/build-idents.py. cp "$D/tots/tots_morning.mp4" "$OUT/ident_614_morning.mp4"