Skip to content

Releases: issinoho/tvtimes

v0.1.63

Choose a tag to compare

@issinoho issinoho released this 04 Sep 18:09
7e52a7c

Changed

  • The guide's date arrows now move a day. They moved the window three hours while sitting either side of a date, so most presses changed nothing you could see — the label only moved when a press happened to cross midnight, after one press or after seven. Paging within the day keeps its own control, with the window's time range between it, so every press now moves something visible. (#152)

Fixed

  • A source row being dragged now dims as you pick it up. The drag state was held in a ref and read while rendering; mutating a ref doesn't re-render, so the styling only appeared once dragging over another row happened to trigger one. (#150)
  • The programme sheet's progress bar advances. It was computed once from the clock when the sheet opened and never again, so it froze where it started and "on now" stayed after the programme had ended. (#150)

Added

Internal

  • eslint 10, with eslint-plugin-react-hooks 7 and the React Compiler rules it brings. The two fixes above came out of that upgrade; the rest were a setState in an effect for something knowable at render, a prop mirrored into state via an effect, and a useMemo that wanted to be a module constant. (#150)

Migration

None.

Images

issinoho1969/tvtimes:0.1.63 · :latest (+ ghcr.io/issinoho/tvtimes), linux/amd64 + linux/arm64. Note the tag carries no leading v.

v0.1.62

Choose a tag to compare

@issinoho issinoho released this 04 Sep 07:40
e3fa471

Fixed

  • A source's channel list showed blank logos for channels whose logos render fine in the guide. It loaded each provider's logo_url directly, and those are routinely http:// on a LAN — an HDHomeRun at http://192.168.0.11, a Pluto feed at http://192.168.0.218 — which an https page blocks as mixed content, leaving an empty tile. Logos here now go through the same origin proxy every other view uses, so they load whatever the provider serves them over. (#149)

    They also pick up the adaptive ground from 0.1.61, which this table had missed for the same reason.

Migration

None.

Images

issinoho1969/tvtimes:0.1.62 · :latest (+ ghcr.io/issinoho/tvtimes), linux/amd64 + linux/arm64. Note the tag carries no leading v.

v0.1.61

Choose a tag to compare

@issinoho issinoho released this 04 Sep 00:49
73444c3

Fixed

  • Channel logos are legible whatever ink they use. The tile a logo sits on is now chosen from the logo itself: white artwork gets a dark ground, dark artwork a light one. (#148)

    0.1.59 and 0.1.60 both tried to solve this with a single tile colour and couldn't. A line-up mixes pure-white marks (Pluto, Narcos) with near-black ones (TCM, FXM), and measured against those inks the best possible flat value reaches only 3.23:1 — clearing the 3:1 bar for a graphical element with nothing to spare. 0.1.59's light tile left white logos at 1.50:1; 0.1.60's darker tile left charcoal ones at 2.85:1.

    Logos already load through the app's own origin proxy, so the artwork can be sampled on load. Luminance is weighted by alpha, so the transparent padding most provider logos ship doesn't drag every one of them dark. Anything not yet read — or that can't be read — keeps a neutral ground that carries every ink, so a logo is never unreadable in the meantime.

Worth knowing

The test added alongside 0.1.60 measured candidate tiles against pure black, which no real logo uses, and so blessed a tile that failed on the charcoal TCM and FXM actually ship. It now measures ink sampled from real artwork.

Migration

None.

Images

issinoho1969/tvtimes:0.1.61 · :latest (+ ghcr.io/issinoho/tvtimes), linux/amd64 + linux/arm64. Note the tag carries no leading v.

v0.1.60

Choose a tag to compare

@issinoho issinoho released this 04 Sep 00:21
0fbc5c2

Fixed

  • Channel logos still washed out. 0.1.59 gave the logo tile a light-grey ground, which didn't help: most provider logos ship as white on transparent, and white against that tile measured 1.50:1 — only the occasional dark logo was legible. (#147)

    The tile is now #6b6478, the one band where white (5.65:1), black (3.72:1) and saturated colour (4.57:1) all clear the 3:1 bar for a graphical element. A lighter tile fails white artwork; a darker one fails black. It applies to both themes now — the artwork doesn't change with the theme, so the ground that suits it shouldn't either. Dark mode was quietly affected too, putting white logos at 2.00:1.

Worth knowing

The browser test added alongside the previous attempt asserted the tile stood out from the surface — which it did, while logos stayed invisible. It now measures the artwork against the tile, and fails on both the 0.1.59 value and the original one, in both themes.

Migration

None.

Images

issinoho1969/tvtimes:0.1.60 · :latest (+ ghcr.io/issinoho/tvtimes), linux/amd64 + linux/arm64. Note the tag carries no leading v.

v0.1.59

Choose a tag to compare

@issinoho issinoho released this 03 Sep 23:54
232a818

Fixed

  • Channel logos washed out in light mode. Most logos were near-invisible while a handful stayed crisp. The tile a logo sits on was a translucent white designed for the dark UI, where the surface shows through to a mid grey; in light mode it resolved to near-white, so every white-on-transparent logo — Pluto's, and most IPTV feeds' — disappeared into it. Dark logos survived, which is why only some rows looked broken. The tile is now a theme token with a proper light-mode value, and the same fix reaches the guide, Tonight and search, which had all copy-pasted it. (#146)

  • The programme sheet's Close button scrolled out of view. On a long description it left the viewport entirely, leaving no visible way to close the sheet. The button is positioned against the sheet, and the sheet was itself the scroll container — so it scrolled along with the content it was meant to float above. The scrolling moved to an inner element; the shell, and the button, now stay put. (#144)

Internal

  • Layout tests now run in a real browser, alongside the existing jsdom suite. Four interface bugs shipped past a green suite this week — overlap, scroll position and contrast are all invisible to jsdom, which has no box model. Each new test was verified by reintroducing the original defect. (#145)

Migration

None.

Images

issinoho1969/tvtimes:0.1.59 · :latest (+ ghcr.io/issinoho/tvtimes), linux/amd64 + linux/arm64. Note the tag carries no leading v.

v0.1.58

Choose a tag to compare

@issinoho issinoho released this 03 Sep 23:00
818eeeb

Added

  • Point a channel at the guide entry it can't find. Some channels never match any guide data — a tuner numbering BBC One Scotland HD 101 while the guide carries that programming under 1 will never connect the two, because neither the ids nor the names agree. The channel sits in the grid with an empty row and there was nothing you could do about it. (#143)

    Settings → Sources → the source now shows a Guide count and a Guide key for every channel. A count of none is how you find the affected channel; put the key the guide actually uses in the box beside it and the channel picks up those listings on the next refresh. Two channels can share a key — each gets its own copy, which is how an HD variant borrows the SD channel's listings. Clear the box to go back to automatic matching.

    The override is exclusive: it replaces the tvg-id and name matching for that channel, so a feed that happens to carry the old id can't win back a match you deliberately overrode. It also survives a channel refresh, unlike the name and tvg-id, which the source overwrites every time.

Changed

  • PATCH /api/channels/{id} is now properly patch-style — clock_shift_seconds is optional, so setting a guide key can't silently reset a clock offset you tuned earlier. Its response carries epg_override_id too.
  • The channel list on a source shows how many programmes each channel currently has.

Migration

One nullable column on channel, applied automatically on start. Automatic matching is unchanged unless you set an override.

Images

issinoho1969/tvtimes:0.1.58 · :latest (+ ghcr.io/issinoho/tvtimes), linux/amd64 + linux/arm64. Note the tag carries no leading v.

v0.1.57

Choose a tag to compare

@issinoho issinoho released this 03 Sep 21:40
48dee3f

Three interface fixes, all reported from real use on a phone.

Fixed

  • Search results ran their two lines together — "King Kong · 197670s Cinema · Fri 01:00". The title and the channel are separate spans, but their container was never made a flex column, so they stayed inline. That also meant a long title overflowed the row instead of truncating, because text-overflow: ellipsis needs a block box. One change fixed both. (#140)

  • The programme sheet's Close button was hidden behind hero artwork — and, less obviously, dead: the artwork was taking the clicks as well as covering the button. Both elements were positioned with no z-index, so paint order fell back to DOM order and the artwork, whose negative margins pull it into that corner, won. (#141)

  • Light mode rendered pale text invisibly on white. The source status pills were the visible symptom, but the same dark-theme-only literals were in five more places — the danger buttons and the inline error and success messages in both Sources and Settings. Those measured 1.2 to 1.6 against a 4.5 contrast requirement, so an error message was unreadable exactly when you needed it. All six now use the --callout-*-fg tokens that already existed for this, and a new --callout-warn-fg covers "stale". (#142)

Worth knowing

Every one of these passed a green test suite, because jsdom does no layout — a component test cannot see that two elements overlap or that text has no contrast. The contrast fix is now guarded by a check that scans every stylesheet for hardcoded colours too light to work on white and reports file, line and hex, so the next one is caught before it ships rather than in a screenshot.

Migration

None — no schema change, no configuration.

Images

issinoho1969/tvtimes:0.1.57 · :latest (+ ghcr.io/issinoho/tvtimes), linux/amd64 + linux/arm64. Note the tag carries no leading v.

v0.1.56

Choose a tag to compare

@issinoho issinoho released this 03 Sep 08:03
f2a1a13

Added

  • See what's actually using your export feeds. Settings → Export feeds now shows when the feeds were last fetched, and lists the players reporting watch state back — by their --device-name, or grouped as a single "Unlabelled player" for any running without one. (#133)

    This was previously invisible. An export token never creates a row on the Sessions screen (that's browser sign-ins), and a watchlist or favourites poll is a plain read — so a box that had stopped reporting, and a token still live on a machine you'd retired, both looked exactly like nothing at all. The only remedy was rotating the token, which kills every consumer at once.

    Two things worth knowing: "last fetched" is recorded at most once a minute, so it's deliberately coarse — and the device list is derived from stored viewing intervals rather than a device registry, so a player drops off once its last interval ages out of the 90-day retention. It answers "who has been watching", not "what is paired".

Security

Ten open advisories cleared, including the one critical:

Package Advisories
vitest 2.1.8 → 3.2.6 CVE-2026-47429 (critical)
cryptography 44.0.3 → 50.0.1 CVE-2026-69247, CVE-2026-69249, GHSA-537c-gmf6-5ccf, CVE-2026-26007 (high) · CVE-2026-34073 (low)
pyopenssl 25.1.0 → 26.4.0 CVE-2026-27459 (high) · CVE-2026-27448 (low)
react-router-dom 6.28.1 → 7.18.0 CVE-2026-53669, CVE-2026-53666 (medium)

The vitest and react-router fixes existed only across a major, which the grouped minor/patch update rules don't raise — so neither had been offered automatically.

The cryptography upgrade also had to get past a transitive trap: fido2 < 2 pins cryptography < 45, and soft-webauthn (the virtual authenticator the passkey tests drive) caps fido2 < 2, so asking for cryptography 50 resolved backwards to a 2021 fido2 — green CI, quietly gutted passkey tests. Pinned and overridden, with the real registration and login ceremonies still passing. (#130)

Changed

  • React 18 → 19, @types/node 22 → 26, @testing-library/jest-dom 6 → 7, and webauthn 2.7 → 3.0. No source changes were needed for any of them. (#130, #134)
  • framer-motion removed. It had no reference anywhere in the source and the bundle is byte-identical without it. (#134)

Migration

One nullable column on tenant, applied automatically on start. Existing tenants start with no recorded last-use — the honest answer, since nothing was recording it before.

Images

issinoho1969/tvtimes:0.1.56 · :latest (+ ghcr.io/issinoho/tvtimes), linux/amd64 + linux/arm64. Note the tag carries no leading v.

v0.1.55

Choose a tag to compare

@issinoho issinoho released this 03 Sep 06:23
379ac4c

Added

  • Favourites export. /api/exports/favourites.json lists the channels anyone on the account has starred, behind the export token you already have. tvdinner 1.39+ picks them up with --sync-favourites, so a star set in the web app shows in its guide too. (#129)

    It's additive and one-way by design: un-starring here won't un-star it there. tvdinner records favourites by name with no note of where each came from, so a two-way reconcile couldn't tell "removed upstream" from "added locally" — and quietly deleting a favourite someone set themselves is the worse failure of the two.

  • Hand a title to the search page. /search?q=<title> now pre-fills the search box, so another app can send you here for a specific programme. tvdinner 1.39+ uses it for its new T keybinding — the reverse of tvtimes' own Play button. The q is consumed once and dropped from the address bar, so a reload or a bookmark doesn't re-run a search you've since typed over. (#129)

Worth knowing

That completes the tvdinner pairing — whole line-up, watchlist recording, watched state, favourites, and a jump back to the web guide. All five ride the one export token; there's no second credential and no per-feature pairing. The full story, including exactly what that token reaches, is now on the wiki: Pairing with tvdinner.

Deep-linking to the exact guide cell was considered and dropped: the grid is virtualised, so pointing at one cell would need scroll-to-row support, and arriving from a player what you actually want is to find the thing by name.

Migration

None — no schema change, no configuration.

Images

issinoho1969/tvtimes:0.1.55 · :latest (+ ghcr.io/issinoho/tvtimes), linux/amd64 + linux/arm64. Note the tag carries no leading v.

v0.1.54

Choose a tag to compare

@issinoho issinoho released this 03 Sep 03:53
11ce9c9

Added

  • Watch state. The guide grid now dims and ticks programmes you've already seen, fed by whatever player you point at it. tvdinner 1.38+ reports this with --report-watch-state; a new POST /api/exports/watch-events accepts it behind the export token you already have. (#127, #128)

    What a player sends is plain start/stop intervals — never "programme X was watched". tvtimes works out which programmes those cover by overlapping them against its own guide, so re-ingesting the EPG, or correcting a channel's clock offset, updates the answer with nothing re-reported and nothing left dangling. A programme counts as watched once half of it — or 30 minutes, whichever is less — is covered, so flicking past doesn't count and half a three-hour film isn't demanded. --device-name labels the reporting box, so a household with two players can tell them apart.

Worth knowing

This is the only write the export token permits, and it stays narrow: it can append viewing intervals for channels already on your account and nothing else. The worst a leaked token could do here is pollute your own watched badges — that token already exposes the whole line-up and streams through it. Leave --report-watch-state off and nothing is ever written.

Migration

One new table (watch_event), applied automatically on start. No configuration.

Images

issinoho1969/tvtimes:0.1.54 · :latest (+ ghcr.io/issinoho/tvtimes), linux/amd64 + linux/arm64.