0.85.0: every approved Blender ident, Paradox with its tagline, and the covered show stopped to smooth the handover
pauljd/davidson-ci: Davidson CI / quality (push) Failing after 2m4s
pauljd/davidson-ci: Davidson CI / ai-review (push) Failing after 1m30s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-11-03 12:06:03 +00:00
co-authored by Claude Opus 5.5
parent f1f28454d8
commit 3bb6885537
26 changed files with 34 additions and 25 deletions
+6
View File
@@ -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.
+2 -2
View File
@@ -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 }
@@ -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)
@@ -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()
}
@@ -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()) {
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+20 -20
View File
@@ -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"