v4.0.0 (2026-06-29)
This release is published under the LGPL-3.0-or-later License.
Bug Fixes
-
Do not absorb a bracketed or non-target-preposition country into the title (
e758839) -
Do not turn an "other"-only bracket into an anime release_group (
ec809f7) -
Don't mutate shared config list values between guesses (
6eb4dd5) -
Don't pin an enum for the OS-dependent mimetype property (
c5003b9) -
Extend lone-article merge to episode_title so it absorbs a following other word (#743,
6dfde2d) -
Gate the leading-anime-bracket release_group guard on an episode/season (
c5be00b) -
Keep a subtitle language glued to its extension even if it is a common word (
24952af) -
Keep edition/scene-tag words as properties, not titles (review follow-up) (
4ad33df) -
Keep leading hyphenated title whole instead of splitting into release_group (
b25e97b) -
Keep properties() keys alphabetically sorted (
56768df) -
Let the filename's season/episode win over a parent directory's (
d3dc53a) -
Only keep a lowercase subtitle language glued to its extension (review #839) (
6fa58a3) -
Only treat a leading dash token as a hyphenated title when it is one word (
f027ffb) -
Prefer the leading anime [bracket] over a trailing parenthetical as release_group (
c0ec184) -
Read Unicode × as a resolution separator and bound CJK season markers (
7bdade6) -
Reclaim a bare "Cam" after the episode marker as episode_title, not source (#732,
bc33ee8) -
Recognise CJK & Unicode × episode markers, numeric episode_title as episode (
a2c9f54) -
Stop a real title word being consumed as country/language/edition/other (
f5e43f7) -
Stop short tokens matching glued inside a larger word (
58e5a47) -
Weight season+episode completeness so the filename wins without mixing fileparts (
15eeb45) -
Widen valid_year bounds and reject a year used as a season number (
19bd458) -
api,release_group: Clear error on None input and stable release-group casing (
01d32ab) -
date: Absorb a weekday glued to a date so episode_title survives (#794,
690aea0) -
episode_title: Keep title when a release tag follows the episode marker (
8d049b4) -
episodes: Keep release-group digit prefix out of episodes with -t episode (
ad30fcb) -
numeral: Initialise word-numeral regex to "" (Nuitka workaround) (
f28c911) -
screen_size: Tolerate trailing "up" upscaled marker (
4fb072c) -
title: Keep dash-joined parent-directory title whole (#796,
d28eea7) -
title: Keep trailing "Us" in a title ending on "of" (The Last of Us) (
c4d21ce)
Build System
-
Add pre-commit (ruff + commitizen) and expand ruff ruleset (
e6b6e22) -
Add ruff-format hook and run pre-commit tools via uv run (
b66a372) -
Add tox (tox-uv) for local multi-version testing (
7d646c4) -
Migrate to uv and modernize tooling (
6131554) -
Require Python >=3.10 and rebulk 6 for guessit 4 (
d2a6a06) -
Require rebulk >=4,<5 and add mypy tooling (
ae69e25) -
Require rebulk >=4.1 and exploit its precise query overloads (
6a4566e) -
Run pre-commit hooks locally via uvx and bump CI to Python 3.14 (
e15d702) -
deps: Require rebulk >=6,<7 (
6a57efc)
Chores
Code Style
-
Clean up code for the expanded ruff ruleset (
3a6cdf2) -
Format the codebase with ruff format (
6510028)
Continuous Integration
-
Check last commit instead of skipping on new-branch push (
65acf6a) -
Drop pypy-3.10 from the test matrix (
275ad91) -
Drop pypy-3.11 from the matrix (babelfish segfault) (
24ed0bd) -
Fix semantic_release commit message (
b145ae2) -
Link upstream pypy issue for the pypy-3.11 babelfish segfault (
3e14ad9) -
Publish to PyPI via Trusted Publishing (
120c84b) -
Re-stamp uv.lock on release to avoid lockfile drift (
fcf45bc) -
Rename the release branch master -> main (
8af01ec) -
Update GitHub Actions to latest versions (
c9ebf35) -
Use uv run --no-sync in the test job (
2aaf930)
Documentation
-
Add CLAUDE.md with architecture and dev guidance (
726ad46) -
Drop guessit-js parity mentions from comments (
58fd8d5) -
Mention mypy in CLAUDE.md commands and pre-commit hooks (
e17aab5) -
Note GitHub closing keywords to auto-close issues on merge (
7c73d08) -
Record won't-fix structural-ambiguity cases as known limitations (
99d537e) -
Remove Build Status from README (
0ddd49d) -
known-limitations: Add historical won't-fix cases from issue tracker (
e550b7d) -
known-limitations: Add structural cases found sweeping closed Invalid Guess issues (
2feb20a) -
known-limitations: Record #637/#693/#690/#660 as structural won't-fix (
8228d2b) -
properties: Document credits_number and Creditless (#863,
b6d1834) -
rules: Correct stale rebulk 5 references to rebulk 6 (
7ff1fc0)
Features
-
Add GUESSIT_SCHEMA machine-readable property schema (
7b37408) -
Add other values (VR, Micro HD, credits) and month-name dates (
0865f2d) -
Add volume, imdb_id, tmdb_id and tvdb_id properties (
c7afecb) -
Classify artwork files as other, register svg mimetype (
67acb99) -
Make properties() code-complete against GUESSIT_SCHEMA (
83255a1) -
Recognise archive and image extensions as container (
a44d244) -
Ship output-schema.json and schema regression tests (
b52e9af) -
deps: Require rebulk 5 and adopt typed Key handles (
625b1da) -
deps: Require rebulk>=4.2.1 and use multi-name Matches.named (
8eefc50) -
episode_title: Title from parent directory for absolute-numbered episodes (
44f3bae) -
episodes: Support Chinese season/episode markers 第N季 / 第N集 (#779,
4a6b07e) -
other: Add VR angle and stereoscopic 3D format support (#864,
509de77) -
other: Detect DoVi as Dolby Vision (
94cc4ad) -
other: Match opening/ending credits with index and version (#863,
b6d1834) -
other: Match opening/ending credits with index and version (#705) (#863,
b6d1834) -
other: OPED yields both Opening and Ending Credits (#863,
b6d1834) -
rules: Adopt rebulk declared Keys and enforce value types in CI (
3fedc4e) -
rules: Centralize typed Keys in a registry and wire config formatters (
bcd451a) -
source: Add Laserdisc (LDRip / Laserdisc) (
0f142cc) -
streaming_service: Add ADN, Channel 5, Max and NowTV (
4013e94) -
title: Align TITLE_STOP_WORDS with guessit-js (full set) (
d0699d6)
Refactoring
-
title: Use Match.tagged(*RELEASE_TAG_MARKERS) (
3302bf3) -
types: Annotate api, options, cli, markers and rules core (
66371b7) -
types: Annotate common helpers and utils for mypy strict (
2fdb2e7) -
types: Annotate config and the simpler property modules (
31c450e) -
types: Annotate date, country and screen_size properties (
7321220) -
types: Annotate language and subtitle_language rules (
0a27ecf) -
types: Annotate other, audio_codec, streaming_service, release_group (
d47db2f) -
types: Annotate source and episodes rules (
c2fb57b) -
types: Annotate tests and enable the mypy strict pre-commit hook (
5d3764d) -
types: Annotate title and episode_title rules (
11293ed)
Testing
-
Add fixtures, regenerate schema and document new properties (
b9143df) -
Add regression anchors for ambiguity-prone parsing boundaries (
654b785) -
Add regression anchors for historically-fixed Invalid Guess Result issues (
9a536c5) -
Anchor correct behaviour of the shared rules touched by recent fixes (
da4cb47) -
Archive/artwork tests, fixtures, schema and docs (
86736ed) -
Complete the container enum with all archive/image extensions (
a78a057) -
Fixture for filename season winning over a parent-directory season (#797,
bb77e04) -
Fixtures for a common-word language kept before a subtitle extension (#668,
a27d225) -
Fixtures for anime leading-bracket release group (#696/#757) (
c0c8ef1) -
Fixtures for CJK / × markers and numeric episode_title (
38508eb) -
Fixtures for glued short tokens and release_group bracket edges (
1fc886f) -
Fixtures for hyphenated/compound titles kept whole (
2f319a8) -
Fixtures for title words wrongly consumed as country/language/other (
cf75378) -
Fixtures for year/season validation (
e0289b8) -
Memoize corpus sweeps in schema tests (
20af1ca)
Breaking Changes
- Drops support for Python 3.7, 3.8 and 3.9 — guessit now requires Python >=3.10. PyPy is no longer tested or supported. The rebulk engine dependency moves to >=6,<7 (from >=3). Downstream users on an older Python or pinning rebulk <6 must upgrade.
Detailed Changes: v3.8.0...v4.0.0