Install fpcalc in the image; release 0.21.0

The image installed ffmpeg but not libchromaprint-tools, so hark fingerprint
and discover-ads would have been inert in the deploy rather than broken:
fpcalc_available() returns False, the command exits tidily, and a
healthy-looking container silently never matches an ad. Same defect adscrub
0.8.0 fixed in its own image.

Bumps __version__ alongside pyproject, which has drifted in sibling repos.
This commit is contained in:
flan
2026-07-23 22:10:39 +00:00
parent e0d42ffcb6
commit a292238d8c
5 changed files with 38 additions and 4 deletions
+30
View File
@@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [0.21.0] - 2026-07-23
### Added
- **`hark fingerprint`** — matches episode AUDIO against ad recordings already confirmed in
this corpus (adscrub 0.8.0's fingerprint tier). It costs no tokens and needs no transcript,
so it runs while the Claude-driven pipeline stays disabled. Verified against a read-only
snapshot of the live database: **337 ad spans across 82 of 82 episodes, 0 failures, no model
called.**
- **`hark discover-ads --show <id>`** — cold start for one show, finding ads by matching that
show's episodes against each other, with no confirmed ads to seed from. Scoped to a single
show deliberately: recurrence is measured against whatever set it is given, and this database
holds ~70 unrelated feeds that share no ad pool. Its `recur` spans are inference and are not
cut by default.
- Both commands go per-episode rather than through adscrub's bulk helpers, so the per-show
`ad_stripping_enabled` toggle actually applies — the same reason `repeats` does.
### Fixed
- **`libchromaprint-tools` (fpcalc) added to the image.** Without it the two commands above are
not broken but inert: they exit tidily and silently match nothing, behind a container that
looks healthy.
- **`_PrecomputedDetector` accepts the `skip` argument** that `AdSpanDetector.detect` grew in
adscrub 0.8.0. `LayeredDetector` passes it positionally, so without this every
`load-ad-detections` record failed with a `TypeError`.
### Changed
- adscrub pinned 0.7.2 -> 0.8.0.
## [0.20.0] - 2026-07-15
### Added
+5 -1
View File
@@ -99,7 +99,11 @@ RUN if [ "$GPU" = "1" ]; then \
# matches TrueNAS SCALE's standard "apps" account, so files land owned by
# the same user/group as every other app on that host; harmless elsewhere.
# ffmpeg is for adscrub's cut.py, called as a library (see cli.py).
RUN apt-get update && apt-get install -y --no-install-recommends gosu ffmpeg \
# libchromaprint-tools provides fpcalc, which adscrub's fingerprint tier shells out to for
# `hark fingerprint`/`discover-ads`. Without it those commands are not broken but INERT:
# fpcalc_available() returns False, the command exits with a tidy message, and a
# healthy-looking container silently never matches an ad.
RUN apt-get update && apt-get install -y --no-install-recommends gosu ffmpeg libchromaprint-tools \
&& rm -rf /var/lib/apt/lists/* \
&& groupadd --gid 568 hark \
&& useradd --system --uid 568 --gid 568 --no-create-home hark
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "hark"
version = "0.20.0"
version = "0.21.0"
description = "Cross-podcast topic index and discovery service"
readme = "README.md"
requires-python = ">=3.12"
+1 -1
View File
@@ -1,3 +1,3 @@
"""hark — cross-podcast topic index and discovery service."""
__version__ = "0.20.0"
__version__ = "0.21.0"
Generated
+1 -1
View File
@@ -242,7 +242,7 @@ wheels = [
[[package]]
name = "hark"
version = "0.20.0"
version = "0.21.0"
source = { editable = "." }
dependencies = [
{ name = "adscrub" },