Skip to content

Releases: colfin22/intro-quiz

v1.31.1 — A phone dropping off wifi no longer stops the game

Choose a tag to compare

@colfin22 colfin22 released this 09 Aug 08:30

v1.31.1 — A phone dropping off wifi no longer stops the game

A crash fix. Nothing about how your games play has changed.

When the server sends an update to every phone, it sends them one at a time and
collects any that failed. A phone that locks its screen, drops off wifi or walks
out of range leaves exactly that kind of failed socket. The server then tried to
remove it from its list, but by then the disconnect had often already removed it,
and that raised an error.

The error did not stop at the phone that left. It came back out into whoever was
driving the game at that moment, which is usually the host, and it killed their
connection. In the report it happened in the middle of starting a round.

The removal is now done in a way that is safe no matter how many times a socket
has already gone. There is a test covering it, and that test fails on the old code
with the exact error from the report.

One related tidy up. The pause before a true or false verdict was the only place
that sent an update without taking the lock every other place takes. It takes the
lock now, so its checks and the host skipping ahead cannot cross over each other.

This is issue 77.

v1.31.0 — Start the game without scrolling past the settings

Choose a tag to compare

@colfin22 colfin22 released this 07 Aug 21:59
0dd19a4

v1.31.0 — Start the game without scrolling past the settings

The phone's opening screen had quietly filled up. Between the board picker, the
half-time toggle and the difficulty added in v1.30.0, it carried seven full-width
buttons — and "Start a new game" had dropped off the bottom of the screen on a
phone. The first thing a guest saw was a wall of options and no obvious way to play.

Half-time trivia and difficulty now live on /admin. They apply to every new game
and are remembered, so they belong with the other things the person running the server
decides, behind ADMIN_PASSWORD if you have one set. The phone keeps the board picker,
since which screen to play on genuinely changes from game to game.

That also closes a side door: previously any player could change either setting, and
the change stuck for every future game. A guest picking a harder mix on their way out
was not obvious to anyone afterwards.

Also fixed: the "no scoreboard" option named a specific room. It now reads
"No scoreboard — music on the speaker", the speaker being whichever one you have
configured.

Upgrading changes nothing about how your games play — the same settings, in a better
place. As always, the app never touches your music files.

v1.30.0 — Pick your difficulty, or ignore the tiers entirely

Choose a tag to compare

@colfin22 colfin22 released this 07 Aug 21:22
9645170

v1.30.0 — Pick your difficulty, or ignore the tiers entirely

Until now every game drew from the same fixed pool: the two most-recognisable
difficulty tiers, with no way to change it. That works badly for a library whose
tier data is sparse — and for some collections it meant the game would not start at all.

A difficulty setting on the setup screen, remembered across games and restarts:

Normal the songs most people know — unchanged default behaviour
Harder deeper cuts
Everything anything in your library, ignoring the popularity tiers completely

Everything is the one to reach for if your collection is niche, or if scoring has
left most of it outside the usual pool. It selects across the whole playable library.

Existing installs are unaffected: no setting means Normal, which is exactly what the
game did before.

Difficulty tiering itself is unchanged in this release. Worth knowing if your library
shows few or no "easy" tracks: that tier is assigned purely from your own listening
history in your music server, so a fresh install with no plays or starred tracks will
never have any, whatever the size of the collection. Choosing a difficulty that is
actually populated is the fix.

As always, the app never touches your music files.

v1.29.0 — Switch off the half-time trivia

Choose a tag to compare

@colfin22 colfin22 released this 07 Aug 11:13

Switch off the half-time trivia

The fun facts and true/false questions between rounds aren't for everyone. There's now a toggle on the setup screen: turn it off and the game plays straight through, with no half-time break at all.

It's on by default, so nothing changes unless you turn it off. The choice is remembered — it's a household preference, not something to set every game, so it survives restarts too.

With trivia off, the game never pauses at the midpoint, nobody is handed a fact to read aloud, and no true/false bonus points are on offer — the scoring is purely about the music. The trivia pack isn't seeded and Open Trivia DB isn't contacted either, since no game will ask for them.

v1.28.0 — Wrong answers that fit the song

Choose a tag to compare

@colfin22 colfin22 released this 07 Aug 10:03

Wrong answers that fit the song

The four options could give a round away on their own: if the clip is clearly a rock song and three of the four artists are hip-hop acts, the answer is the odd one out and nobody has to listen.

Decoys are now drawn from the same genre as the correct answer, preferring the same decade, and widen in stages when the library can't supply them — same genre and decade, then same genre, then same decade, then anything. The last two stages are what the game did before, so a track with no genre tag, or a library too small for the narrow stages, plays exactly as it did.

Genre tags are matched across spelling variants, so Hip Hop and Hip-Hop count as one genre. Related-but-distinct tags are kept apart on purpose: Rock, Hard Rock and Classic Rock are not merged into a family. Nothing needs re-syncing or re-cutting — this reads the genre tags already in the database.

Also in this release: two options can no longer be the same act under different credits (Nirvana and Nirvana Feat. …).

Measured on a 49,000-track library, 92% of rounds now get three same-genre wrong answers, up from effectively none.

v1.27.0 — Option to start clips further into the song

Choose a tag to compare

@colfin22 colfin22 released this 07 Aug 07:49

Start clips further into the song

Some music opens with a long instrumental before anyone sings, which makes a five-second clip taken from the very beginning hard to place for the wrong reason.

Set CLIP_START_S=30 to start every clip 30 seconds in instead. It is off by default, so nothing changes unless you turn it on.

  • It is a floor over the existing silence detection — a song whose audible start is detected later still uses the later one.
  • The reveal's payoff clip moves along with it.
  • Short songs are clamped so the 20-second clip still fits.
  • It is library-wide rather than a per-game option, because clips are cut ahead of time.

Because it applies when clips are cut, turning it on for a library that already has clips means re-cutting — but nothing goes offline while that happens. Tracks cut at a different setting are queued behind anything still waiting for its first clips, and keep their existing clips until each one is replaced. The nightly cut converts the library over the following sessions; a single POST /api/clips/cut?limit=20000 (or the Cut clips button on /admin) does it in one pass.

Also in this release: a re-cut that fails part-way no longer removes a playable track's existing clips, and a raised start can no longer cut past the end of a track whose duration isn't known.

See docs/setup.md for the details.

v1.26.0 — One track per artist per game

Choose a tag to compare

@colfin22 colfin22 released this 04 Aug 15:28

One track per artist per game (#57)

Reported by a player who kept seeing the same bands session after session.

  • A game now plays at most one track per artist, including the per-player
    artist-boost rounds. If two players pick the same band, only one round comes
    from it — the second player's boost comes from another of their picks rather
    than being lost.
  • Featured credits and reversed names fold onto the same act, so
    Nirvana Feat. … and Nirvana, or Beatles, The and The Beatles, count as
    one artist.
  • Small libraries keep working. If the eligible pool has fewer distinct
    artists than the game has rounds, repeats are still allowed — a game that
    refuses to start would be worse than a repeated artist.

If your library is large, note that the general pool was rarely the culprit: on a
12,000-track pool, plain random selection yields a given popular artist about
once every sixteen 10-round games. The per-player artist picks were the real
driver of "the same bands every session", which is what this release changes.

Weighting selection against recent games is tracked separately in #73.

No database, configuration or API changes. Decoy answers are unaffected.

Also in this release: the image build workflow moved to current GitHub Actions
versions (no functional change).

Docker images for this release are published to GHCR and Docker Hub.

v1.25.1 — Maintenance

Choose a tag to compare

@colfin22 colfin22 released this 04 Aug 14:35

Maintenance

No gameplay changes — dependency updates and documentation fixes.

  • FastAPI 0.141 and uvicorn 0.52 (from 0.139 / 0.51). Verified with the
    full test suite plus a complete game played over real websockets — lobby,
    host controls, all four rounds, the payoff gate and finish.
  • Docs: the board screenshot now shows the lobby — the screen players
    actually see — rather than the idle screen.
  • Docs: clearer guidance that guest networks often block guests from reaching
    any other host (client/AP isolation), not just the main LAN, and that the
    join URL must be reachable from the guest network.
  • Docs: note that browsers need one click before the first round's audio will
    play.

Docker images for this release are published to GHCR and Docker Hub.

v1.25.0 — Guest-WiFi QR

Choose a tag to compare

@colfin22 colfin22 released this 24 Jul 13:39

Guest-WiFi QR (#55)

Companion to v1.24.0's scan-to-join QR — a guest's first hurdle is the network, not the URL:

  • Set GUEST_WIFI_SSID / GUEST_WIFI_PASSWORD (and GUEST_WIFI_AUTH — WPA default, nopass for open networks) and the cast board shows a second QR that joins guests to the WiFi, labelled as step 1 before scan-to-join's step 2. The phone lobby's invite section gets it too.
  • Uses the standard WIFI: payload phones auto-join from, with full escaping of the format's special characters (tested — semicolons, quotes, backslashes and emoji in SSIDs all survive).
  • Unset = entirely absent: the endpoint 404s and the board hides every trace — no behaviour change for existing installs.
  • ⚠️ Use a guest network's credentials, never your main one — anyone who can reach the app can read this QR (that's the point). See docs/setup.md.
  • ⚠️ Check the join URL is reachable from the guest network — guest networks are deliberately locked down: most isolate guests from the main LAN, and many block guests from connecting to any other host (client/AP isolation). Either way a guest can join the WiFi (scan 1) but the join address (scan 2) times out. Test once from a phone on the guest SSID; if it can't connect, add a router firewall exception allowing the guest network to reach just the quiz host and port. Details in docs/setup.md.

Docker images for this release are published to GHCR and Docker Hub.

v1.24.0 — Scan-to-join QR

Choose a tag to compare

@colfin22 colfin22 released this 24 Jul 13:30

Scan-to-join QR (#54) — contributed by @Axeion 🎉

The first external contribution to the project:

  • The cast board's waiting and lobby screens now show a QR of the app's join address (plain URL beneath it) — players point a phone camera at the TV instead of typing a URL.
  • The phone lobby gets the same QR plus a Share the link action (Web Share API, clipboard fallback), so anyone can invite another player without the TV.
  • The encoded address is inferred (the board's own origin, then BOARD_URL); a new optional JOIN_URL env var overrides it for reverse-proxy setups where players should use a different address than the board — see the note in docs/setup.md.
  • Fail-safe like everything on the board: a failed QR load just falls back to the address text.
  • One new dependency: segno (pure Python, zero transitive deps).

Follow-up idea up for grabs: #55 — a second QR that joins guests to the guest WiFi.

Docker images for this release are published to GHCR and Docker Hub.