Give every channel its own ident film
pauljd/davidson-ci: Davidson CI / quality (push) Failing after 1m59s
pauljd/davidson-ci: Davidson CI / ai-review (push) Failing after 1m28s

Blender versions on seven channels, new films for Wild, Detour, BritX and Junior.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-11-02 19:25:36 +00:00
co-authored by Claude Opus 5.5
parent 1ed2b6ade4
commit ed2a553822
22 changed files with 28 additions and 19 deletions
+5
View File
@@ -0,0 +1,5 @@
# Orbit TV 0.80.0
- Every channel now has its own ident film: 29 in the app, 12 MB, 7 s each.
- Blender versions on 101, 106, 201, 202, 304, 305, 601. New films for 203, 308, 309, 611. Refined flat versions on the rest.
- Still to confirm on the TV: a changeover with a Blender ident, and any stutter from the larger files on 305 and 601.
+2 -2
View File
@@ -9,8 +9,8 @@ android {
applicationId = "tv.orbit.classic"
minSdk = 26
targetSdk = 36
versionCode = 89
versionName = "0.79.3-orbithive-canvas"
versionCode = 90
versionName = "0.80.0-blender-idents"
}
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.79.3\"")
connection.setRequestProperty("X-Emby-Authorization", "Emby Client=\"Orbit TV\", Device=\"Orbit TV\", DeviceId=\"$deviceId\", Version=\"0.80.0\"")
request.token?.let { connection.setRequestProperty("X-Emby-Token", it) }
if (request.method == "POST") {
val bytes = request.body.orEmpty().toByteArray(Charsets.UTF_8)
@@ -33,9 +33,9 @@ internal const val IDENT_LOAD_AHEAD_MS = 12_000L
private const val IDENT_SHORTEST_PROGRAMME_MS = 3 * 60_000L
private val IdentVideos = mapOf(101 to R.raw.ident_101, 102 to R.raw.ident_102, 103 to R.raw.ident_103, 104 to R.raw.ident_104, 105 to R.raw.ident_105, 106 to R.raw.ident_106, 107 to R.raw.ident_107,
201 to R.raw.ident_201, 202 to R.raw.ident_202, 204 to R.raw.ident_204, 301 to R.raw.ident_301, 302 to R.raw.ident_302, 303 to R.raw.ident_303, 304 to R.raw.ident_304, 305 to R.raw.ident_305,
306 to R.raw.ident_306, 307 to R.raw.ident_307, 401 to R.raw.ident_401, 601 to R.raw.ident_601, 602 to R.raw.ident_602, 603 to R.raw.ident_603, 604 to R.raw.ident_604, 605 to R.raw.ident_605,
612 to R.raw.ident_612, 613 to R.raw.ident_613)
201 to R.raw.ident_201, 202 to R.raw.ident_202, 203 to R.raw.ident_203, 204 to R.raw.ident_204, 301 to R.raw.ident_301, 302 to R.raw.ident_302, 303 to R.raw.ident_303, 304 to R.raw.ident_304, 305 to R.raw.ident_305,
306 to R.raw.ident_306, 307 to R.raw.ident_307, 308 to R.raw.ident_308, 309 to R.raw.ident_309, 401 to R.raw.ident_401, 601 to R.raw.ident_601, 602 to R.raw.ident_602, 603 to R.raw.ident_603, 604 to R.raw.ident_604, 605 to R.raw.ident_605,
611 to R.raw.ident_611, 612 to R.raw.ident_612, 613 to R.raw.ident_613)
internal fun identVideo(number: Int) = IdentVideos[number]
internal fun identLength(number: Int) = if (number in IdentVideos) IDENT_VIDEO_MS else IDENT_STING_MS
@@ -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.79.3")
next.setRequestProperty("User-Agent", "OrbitTV/0.80.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.
@@ -22,11 +22,11 @@ class IdentTest {
@Test fun channelsWithoutAFilmUseAShorterSting() {
assertEquals(IDENT_VIDEO_MS, identLength(101))
assertNull(identVideo(308))
assertEquals(IDENT_STING_MS, identLength(308))
assertNull(identVideo(999))
assertEquals(IDENT_STING_MS, identLength(999))
}
@Test fun everyIdentBelongsToARealChannel() {
SmartChannels.map { it.number }.filter { identVideo(it) == null }.let { assertEquals(listOf(203, 308, 309, 611), it.sorted()) }
@Test fun everyChannelHasItsOwnIdent() {
SmartChannels.map { it.number }.filter { identVideo(it) == null }.let { assertEquals(emptyList<Int>(), it) }
}
}
+12 -8
View File
@@ -1,32 +1,36 @@
#!/bin/bash
# The app's copies of the channel idents: the approved 3D versions, re-encoded small and silent, named by channel number.
# 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.
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 world/orbit-1/orbit-1_3d.mp4
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
105 world/orbit-riot/orbit-riot_3d.mp4
106 world/paradox/paradox_3d.mp4
106 blender/paradox/paradox_blender.mp4
107 world/evidence/evidence_3d.mp4
201 world/orbit-terra/orbit-terra_3d.mp4
202 world/orbit-odyssey/orbit-odyssey_3d.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
304 world/orbit-horror/orbit-horror_3d.mp4
305 world/orbit-after-dark/orbit-after-dark_3d.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
601 world/vortex/vortex_3d.mp4
601 blender/vortex/vortex_blender.mp4
602 city/heroes/heroes_city.mp4
603 world/orbit-x/orbit-x_3d.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
LIST