anitomy-ng
A pure-Rust port of erengy/anitomy, an
anime video filename parser, with Python, JavaScript, and .NET bindings. The
core library is pure safe Rust — no unsafe, no C dependencies.
[TaigaSubs]_Toradora!_(2008)_-_01v2_-_Tiger_and_Dragon_[1280x720_H.264_FLAC][1234ABCD].mkv
parses into release group, title, year, episode, resolution, video/audio codec, release version, and file checksum — see the examples below.
Status: conformance-tested against upstream's own bundled test data (the
current C++ rewrite on the develop branch and the original, long-frozen
master implementation), plus the
anitopy Python port's fixtures. On
each suite it scores at least as high as that suite's reference parser, run
as a compiled/installed binary rather than judged from its source.
Install
Rust:
cargo add anitomy-ng
Python (wheels built via maturin):
pip install anitomy-ng
JavaScript / TypeScript (WebAssembly, works in Node and bundlers):
npm install anitomy-ng
Command line: prebuilt binaries for Linux, macOS, and Windows are attached to each GitHub release. Download one directly, or install with either:
cargo binstall anitomy-ng # prebuilt binary, no toolchain needed
cargo install anitomy-ng --features cli # builds from source
.NET (prebuilt native binaries ship in the package, no Rust toolchain needed):
dotnet add package AnitomyNg
Usage
Rust:
let elements = anitomy_ng::parse(
"[TaigaSubs]_Toradora!_(2008)_-_01v2_-_Tiger_and_Dragon_[1280x720_H.264_FLAC][1234ABCD].mkv",
anitomy_ng::Options::default(),
);
for element in &elements {
println!("{:?}: {}", element.kind, element.value);
}
Python:
import anitomy_ng
for element in anitomy_ng.parse(
"[TaigaSubs]_Toradora!_(2008)_-_01v2_-_Tiger_and_Dragon_[1280x720_H.264_FLAC][1234ABCD].mkv"
):
print(element.kind, element.value)
JavaScript / TypeScript:
import { parse } from "anitomy-ng";
for (const element of parse(
"[TaigaSubs]_Toradora!_(2008)_-_01v2_-_Tiger_and_Dragon_[1280x720_H.264_FLAC][1234ABCD].mkv",
)) {
console.log(element.kind, element.value);
}
C# / .NET:
using AnitomyNg;
foreach (var element in Anitomy.Parse(
"[TaigaSubs]_Toradora!_(2008)_-_01v2_-_Tiger_and_Dragon_[1280x720_H.264_FLAC][1234ABCD].mkv"))
{
Console.WriteLine($"{element.Kind}: {element.Value}");
}
They all return an ordered list of elements (position in the filename, kind,
and value); ElementKind/kind covers title, episode, season, release group,
video/audio terms, resolution, checksum, and so on — see
anitomy/src/element.rs for the full set.
Parsing a path
parse treats its input as one flat string, matching upstream — given a path,
separators and duplicated folder text end up in the title. parse_path strips a
real directory prefix first, and recovers a title that lives only in the parent
folder. Both / and \ are recognized on every platform, including UNC and
drive-letter roots.
An input with no directory prefix is exactly parse, and a separator inside a
title (Fate/stay night) is left alone.
// parse -> title "My Show/My Show"
// parse_path -> title "My Show"
let elements = anitomy_ng::parse_path(
"My Show/My Show - 01.mkv",
anitomy_ng::Options::default(),
);
elements = anitomy_ng.parse_path("My Show/My Show - 01.mkv")
import { parse_path } from "anitomy-ng";
const elements = parse_path("My Show/My Show - 01.mkv");
var elements = Anitomy.ParsePath("My Show/My Show - 01.mkv");
On the command line, --path (-p) does the same:
anitomy --path 'My Show/My Show - 01.mkv'
For a set of related files, prefer parse_together below — it does everything
parse_path does, plus uses what varies across the set.
Parsing a set together
parse_together parses a set of related filenames at once, returning one
element list per input (result i is for input i). Using the whole set as
shared context resolves things a single filename can't — most importantly, a
directory batch range like (01-12) no longer masks the real per-file episode,
and a series title that lives only in a parent folder is recovered. Unrelated or
single-item lists are a safe no-op (each is just its ordinary parse). Full and
relative paths work on every platform (/ and \, including UNC/drive-letter).
Parsing each of these on its own would read 01 and 12 from the folder's
(01-12) range and miss the actual episode; together, they come back as 05
and 06:
Rust:
let results = anitomy_ng::parse_together(
&[
"Frieren (01-12) [Batch]/Frieren - 05 [1080p].mkv",
"Frieren (01-12) [Batch]/Frieren - 06 [1080p].mkv",
],
anitomy_ng::Options::default(),
);
// results[0] -> episode "05", results[1] -> episode "06"
Python:
results = anitomy_ng.parse_together([
"Frieren (01-12) [Batch]/Frieren - 05 [1080p].mkv",
"Frieren (01-12) [Batch]/Frieren - 06 [1080p].mkv",
])
# results[0] -> episode "05", results[1] -> episode "06"
JavaScript / TypeScript:
import { parse_together } from "anitomy-ng";
const results = parse_together([
"Frieren (01-12) [Batch]/Frieren - 05 [1080p].mkv",
"Frieren (01-12) [Batch]/Frieren - 06 [1080p].mkv",
]);
// results[0] -> episode "05", results[1] -> episode "06"
C# / .NET:
var results = Anitomy.ParseTogether(new[]
{
"Frieren (01-12) [Batch]/Frieren - 05 [1080p].mkv",
"Frieren (01-12) [Batch]/Frieren - 06 [1080p].mkv",
});
// results[0] -> episode "05", results[1] -> episode "06"
Command line (anitomy) takes filenames as arguments or reads them from
stdin (one per line), and prints an aligned table or, with --json, an array
of { filename, elements }:
anitomy '[TaigaSubs]_Toradora!_(2008)_-_01v2_-_Tiger_and_Dragon_[1280x720_H.264_FLAC][1234ABCD].mkv'
ls *.mkv | anitomy --json
Pass --no-title, --no-episode, etc. to disable individual categories; see
anitomy --help.
Layout
anitomy/ core Rust crate (published as `anitomy-ng`) — no unsafe, no non-dev dependencies
anitomy-py/ Python bindings (pyo3 + maturin, published as `anitomy-ng`), typed:
ElementKind is a real enum.Enum, Element a real dataclass
anitomy-js/ JavaScript/TypeScript bindings (wasm-bindgen, published to npm as `anitomy-ng`)
anitomy-c/ C ABI (cdylib/staticlib) over the core — the only crate with `unsafe`;
the foundation for non-Rust bindings
bindings/csharp/ .NET bindings (P/Invoke over anitomy-c, published to NuGet as `AnitomyNg`)
third_party/ vendored upstream test fixtures, not compiled — see third_party/README.md
scripts/ fixture-generation tooling
Development
cargo test -p anitomy-ng --test conformance # Rust conformance suite
cd anitomy-py && uv run --extra test pytest tests/ -q # Python conformance suite
License
Licensed under the Mozilla Public License 2.0 — see LICENSE.
This project builds on the following, all MPL-2.0, and is distributed under the same license accordingly:
- erengy/anitomy (© Eren Okka) — the C++ implementation this project is a port of.
- Rapptz/anitomy-rs (© Rapptz) — an independent Rust reimplementation; some logic and beyond-upstream keywords are adapted from it.
- igorcmoura/anitopy (© Igor C.
Moura) — its test data (
table.py/failing_table.py) is used as a conformance fixture suite.
third_party/ vendors this upstream material under their own MPL-2.0
licenses — see third_party/README.md.
Release files for anitomy-ng 1.0.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| anitomy_ng-1.0.8.tar.gz | 147.0 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| anitomy_ng-1.0.8-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| anitomy_ng-1.0.8-cp39-abi3-win32.whl | CPython 3.9 | abi3 | Windows x86-32 | Details |
| anitomy_ng-1.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| anitomy_ng-1.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| anitomy_ng-1.0.8-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64, macOS 11.0+ ARM64, macOS 10.12+ universal2 (ARM64, x86-64) | Details |
Total release size: 3.3 MB
Release files / anitomy_ng-1.0.8.tar.gz
| Download URL | anitomy_ng-1.0.8.tar.gz |
|---|---|
| Size | 147.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
300f8eb7131e21c5ce8b088cb67706c35b8d2d3c59c3fd91fce42fbd43bf1b98
|
|
BLAKE2b-256 checksum How to use checksums |
76417010bae71ab190e3e78fc0b7c660eb3ff0eb57064ba788d5b875ff20befc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / anitomy_ng-1.0.8-cp39-abi3-win_amd64.whl
| Download URL | anitomy_ng-1.0.8-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 438.6 kB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
72826dc458925e9df82185675d8be9005036227ad9c1872f4fa8e1e47046a5af
|
|
BLAKE2b-256 checksum How to use checksums |
d7a8213d1c5a878c10816ee88296ccba0b28230c50b2c04bf66ae2c3949cc267
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / anitomy_ng-1.0.8-cp39-abi3-win32.whl
| Download URL | anitomy_ng-1.0.8-cp39-abi3-win32.whl |
|---|---|
| Size | 406.9 kB |
| Tags | CPython 3.9 Windows x86-32 abi3 |
|
SHA-256 checksum How to use checksums |
84533dbe83af100b23b7b8416de1bd66ffe3562002f8f61f34ef487f022b2ef0
|
|
BLAKE2b-256 checksum How to use checksums |
ecbd01a7ecccc3fc350a9560bedae38508e7491547055f5924e04e5f14355b1f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / anitomy_ng-1.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | anitomy_ng-1.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 608.0 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
65774104149706c85f1ba9290ce9e745ef3bc63dc8b42afefe480b17bfe56688
|
|
BLAKE2b-256 checksum How to use checksums |
dbf0c27398a04ebf94149c9687bd84c2b1742f3034c3408a8351e15a7504c13e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / anitomy_ng-1.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | anitomy_ng-1.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 603.3 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
1f785684623ffa3849dda5d5f1613b3d6200d08efbcee13dc2a5663674ad2baa
|
|
BLAKE2b-256 checksum How to use checksums |
593dee49bf869144e5c3b8dde3637ae055cd3e861d7267a5e7fbd05e801e8283
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / anitomy_ng-1.0.8-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
| Download URL | anitomy_ng-1.0.8-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
d7a825ab723461395773896ca336f2b321a02be0c74182039c63c6ad7df1f743
|
|
BLAKE2b-256 checksum How to use checksums |
e6824c87027e411beef7d51e9e04bba0c5fcaf41d857ceb5663de5a8fd43a11a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency log