github guessit-io/guessit v4.0.0

latest releases: v4.0.2, v4.0.1
6 hours ago

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

  • deps: Require rebulk >=4.2.2 (10f871e)

  • title: Fix contradictory TITLE_STOP_WORDS comment (af24bab)

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

Don't miss a new guessit release

NewReleases is sending notifications on new releases.