Act on the screen-by-screen review: 17 findings
All checks were successful
Build TV app / build (push) Successful in 43s

Defects. "Kopplung zurücksetzen" now asks first, naming how many phones
would have to scan again — one stray OK used to wipe a working pairing, and
the settings put the focus right on it: entering the screen landed on the
gear, one press down jumped into the right column onto that very action, and
every further press down did nothing. Focus now starts on the first row of
the left column. 1. FC Köln was labelled "EFC". An unreachable source used
to look like an evening without programmes — cached list, empty EPG, club
menus counting down to zero — so both repositories now record when they last
came through, and the top bar says "Server nicht erreichbar · Stand 14:46".
The field labels on "Erweitert" sat on the outline with the border running
through them; they sit above their field now.

Polish. The app opens on the channel list — on the channel last watched,
which survives a restart — instead of the settings gear. Rows without EPG
fill their empty half with the channel's group. The club chip says "ab
15:06" like the row next to it, the club menu carries the club's name
instead of "FCSP", and a fixture title is shortened to the fixture, so
"Pokal: Nordstadt - FC St. P…" became "Nordstadt - FC St. Pauli".
The settings are three columns and no longer scroll (CONTEXT.md's ten-foot
rule).

Features. Favourites work for a plain M3U source too, stored on the device
and mirrored to the phone; they used to exist only with a Dispatcharr login.
The channel keys jump the list by initial letter, left and right jump a
division in the club picker, and right on a channel opens its day plan —
the EPG beyond now/next, which was parsed all along and never shown. When a
club match starts elsewhere the player offers to switch. The remote asked
for a code "unten auf dem TV-Bildschirm" where none was; the welcome screen
shows it now and the wording points at where it is.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
be-nj
2026-08-26 15:54:00 +02:00
parent ac90898a46
commit 4cb7a6efdb
21 changed files with 994 additions and 139 deletions

59
tests/unit/FixtureTest.kt Normal file
View File

@@ -0,0 +1,59 @@
package dev.castarr.tv.data
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
class FixtureTest {
@Test
fun `competition prefix and round suffix fall away`() {
assertEquals(
"Nordstadt - FC St. Pauli",
TeamFilters.fixture("Pokal: Nordstadt - FC St. Pauli, 1. Runde"),
)
}
@Test
fun `a bare pairing survives unchanged`() {
assertEquals(
"FC Bayern München - Borussia Dortmund",
TeamFilters.fixture("FC Bayern München - Borussia Dortmund"),
)
}
@Test
fun `en dash and vs count as separators`() {
assertEquals("Schalke - HSV", TeamFilters.fixture("2. Liga: Schalke HSV"))
assertEquals("Kiel - Rostock", TeamFilters.fixture("Kiel vs. Rostock"))
}
@Test
fun `trailing channel detail is dropped`() {
assertEquals(
"Werder - Union Berlin",
TeamFilters.fixture("Bundesliga: Werder - Union Berlin | live"),
)
}
/** A magazine about the club is a hit, but has no pairing to shorten. */
@Test
fun `a title without a pairing keeps the original`() {
assertNull(TeamFilters.fixture("FC St. Pauli: Der Rückblick"))
assertNull(TeamFilters.fixture("Sportschau"))
}
@Test
fun `a dangling separator is not a pairing`() {
assertNull(TeamFilters.fixture("Pokal: - , 1. Runde"))
}
/** Hyphenated club names must not be mistaken for the separator. */
@Test
fun `hyphens inside a name do not split`() {
assertEquals(
"Rot-Weiss Essen - Preußen Münster",
TeamFilters.fixture("3. Liga: Rot-Weiss Essen - Preußen Münster"),
)
}
}