Parsec Validation Checks¶
The check command performs comprehensive integrity and consistency checks on a media file to ensure it adheres to the project specification.
Usage¶
You can provide one or more files or directories to be checked. Directories will be scanned recursively for Matroska (.mkv) files.
Rendering Saved Reports¶
The check command can also be used to view previously saved JSON reports in the interactive human-readable format. parsec automatically detects if a file is a JSON report by sniffing its content.
# Save a report to a file
parsec check movie.mkv --json > report.json
# View the saved report later in interactive mode
parsec check report.json
Quarantining Failed Files¶
The check command can automatically move files that fail validation into a quarantine directory. This is useful for separating bad files during batch intake or staging pipelines.
# Move all files that fail any check to a quarantine folder
parsec check /path/to/media --move-failed /path/to/quarantine
# Preview which files would be moved without modifying anything
parsec check /path/to/media --move-failed /path/to/quarantine --dry-run
# Only move files failing a specific check identifier
parsec check /path/to/media --move-failed /path/to/quarantine --failing-check mdb_runtime
# Move failing files unattended without interactive confirmation prompts
parsec check /path/to/media --move-failed /path/to/quarantine -u
--move-failed <dir>: Target folder for failing files. The directory will be created if it does not already exist. In interactive mode,parsecprompts for confirmation (Move N failing file(s) to <dir>? [y/N]) before moving.--failing-check <identifier>: Restricts relocation to only files that failed a specific check (e.g.mdb_runtime,filename_characters). Requires--move-failed. Shell auto-completion suggests all available check identifiers.--dry-run/-d: Simulates moving files and prints what would be relocated without touching the filesystem.
Features¶
- Batch Processing: Validate multiple files or entire directories in one command.
- Recursive Scanning: Automatically finds all Matroska files within provided directories.
- Filename Integrity: Verifies that the filename matches the internal metadata.
- Technical Analysis: Checks for technical anomalies using MediaInfo.
- Matroska Verification: Ensures the container and track tagging meet standards.
- MDB Consistency: Validates that file metadata matches information in online databases.
- Quarantine Failing Files: Automatically relocate files failing any check (or a specific check identifier) to a destination directory.
- JSON Reports: Machine-readable output for integration with other tools.
Flags¶
ID Flags¶
Force identification using specific database IDs.
| Flag | Shorthand | Type | Description |
|---|---|---|---|
--imdb |
string | IMDb ID (e.g., tt1234567). |
|
--tmdb |
integer | TMDB ID. | |
--tvdb |
integer | TVDB ID. | |
--tvdb-order |
string | TVDB episode ordering for completeness checks (default, official, dvd, absolute, alternate, regional). |
Output Flags¶
| Flag | Shorthand | Type | Description |
|---|---|---|---|
--json |
-j |
boolean | Output check results in JSON format. |
--individual |
-i |
boolean | Display the full individual reports for each file in the batch. |
--verbose |
boolean | Enable verbose output. |
Other Flags¶
| Flag | Shorthand | Type | Description |
|---|---|---|---|
--move-failed |
string | Move files failing checks to destination folder. | |
--failing-check |
string | Only move files failing this specific check identifier (requires --move-failed). |
|
--dry-run |
-d |
boolean | Simulate actions without modifying or moving files. |
--unattended |
-u |
boolean | Do not prompt for confirmation. |
--jobs |
integer | Number of parallel jobs to run (default is number of CPUs). | |
--original-language |
string | Override original language of media for integrity checks. |
Available Checks¶
This document lists all individual checks performed by the parsec check command. Most of these can be disabled in the Config if you don't want to use them.
Default Status: - ✅ : Can be disabled (Enabled by default) - ❌ : Can be disabled (Disabled by default) - 🔒 : Cannot be disabled
Filename Checks¶
| Check | Function | Identifier | Status | Description |
|---|---|---|---|---|
| Allowed Characters | checkAllowedCharacters |
filename_characters |
✅ | Ensures filename only contains [a-zA-Z0-9\-\.]. |
| Disallowed Sequences | checkCharacterSequences |
filename_sequences |
✅ | Detects invalid patterns like .-., .., or multiple dots/dashes. |
| Missing Year | checkYearMissing |
filename_year_missing |
✅ | Ensures movies have a release year in the filename. |
| Redundant Year | checkYearRedundant |
filename_year_redundant |
✅ | Checks if a year tag is redundant (e.g., when using S20YY style naming for episodes). |
| Streaming Service | checkStreamingService |
filename_streaming |
✅ | Ensures a streaming service tag is present for WEB sources. |
| TV Specials | checkTvSpecial |
filename_tv_special |
✅ | Requires air date and episode title for TV specials (Season 00). |
| Name Mismatch | checkNameMismatch |
filename_generation_mismatch |
✅ | Verifies that the filename matches the name generated from its metadata. |
Technical Quality Checks (MediaInfo)¶
| Check | Function | Identifier | Status | Description |
|---|---|---|---|---|
| Video Track Presence | mediainfo.Get |
N/A | 🔒 | Verifies that the file contains at least one video track. Mandatory for processing. |
| Audio Track Presence | mediainfo.Get |
N/A | 🔒 | Verifies that the file contains at least one audio track. Mandatory for processing. |
| Interlaced WEB | checkInterlacedWeb |
mediainfo_interlaced_web |
✅ | Issues a warning if a WEB source is detected as interlaced. |
| Frame Rate | checkFrameRate |
mediainfo_framerate |
✅ | Validates against standard framerates (23.976, 24, 25, 29.97, 30, 50, 59.94, 60). |
| Low Bitrate | checkBitRate |
mediainfo_bitrate |
✅ | Checks for minimum bitrate thresholds based on resolution (e.g., 2 Mbps for 1080p). |
| Track Durations | checkDurations |
mediainfo_durations |
✅ | Detects significant timing discrepancies between video, audio, and subtitle tracks. |
| Redundant Audio | checkRedundantAudio |
mediainfo_redundant_audio |
✅ | Identifies multiple standard audio tracks for the same language. |
| Resolution | checkResolution |
mediainfo_resolution |
✅ | Checks for odd resolution, standard widths, and sane aspect ratios. |
| Dialogue Normalization | checkDialogueNormalization |
mediainfo_dialogue_normalization |
✅ | Verifies that dialogue normalization is removed for lossless (TrueHD, DTS-HD MA) and DTS-HD HRA tracks. |
| Stereo/Mono Lossless Codec | checkStereoLossless |
mediainfo_stereo_lossless |
✅ | Warns if an audio track with 2 or less channels uses a different lossless codec than FLAC (e.g., TrueHD, DTS-HD MA, or PCM). |
| Empty Tracks | checkEmptyTracks |
mediainfo_empty_tracks |
✅ | Issues an error if a track is determined to be empty (e.g., duration is 0, size is 0 bytes, audio has 0 channels, or subtitles have 0 elements). |
| Missing Statistics | checkMissingStatistics |
mediainfo_missing_statistics |
✅ | Warns if a track is missing statistics tags (e.g., DURATION, NUMBER_OF_BYTES, or ElementCount), making it difficult to determine if it is empty. |
| Fixed GOP with Encoder Tag | checkFixedGOP |
mediainfo_fixed_gop |
✅ | Warns if video stream has a fixed GOP length (scenecut disabled) while the filename contains an encoder tag (x264/x265), indicating a mislabeled WEB-DL or poor encoding settings. |
Matroska / EBML Checks¶
These checks ensure the Matroska container and its components meet quality standards.
Container & Audio¶
| Check | Function | Identifier | Status | Description |
|---|---|---|---|---|
| Matroska Format | checkMatroskaFormat |
matroska_ebml_error |
🔒 | Verifies that the file is a valid Matroska (MKV) container. |
| Title Hygiene | checkTitleHygiene |
matroska_title_hygiene |
✅ | Verifies that the global container title is either empty or matches the official database title, and doesn't contain technical metadata noise. |
| Metadata Privacy | checkAppHygiene |
matroska_app_hygiene |
✅ | Verifies that the WritingApplication field doesn't contain potentially identifiable information like local file paths or UUIDs. |
| Matroska Format | checkDataLayout |
matroska_data_layout |
✅ | Verifies that the Info and Tracks Elemnts are placed before the first Cluster |
| Creation Time Privacy | checkCreationTimePrivacy |
matroska_creation_time_privacy |
❌ | Warns if the file contains creation/encode time metadata such as DateUTC, DateLocal, or track-level encoded dates, which might be a privacy concern. Disabled by default. |
| Video Cropping | checkVideoCropping |
matroska_video_cropping |
✅ | Warns if resolution-based black bars are detected but no MKV crop values are set. |
| Track Delay | checkTrackDelay |
matroska_track_delay |
✅ | Warns if a track has a container delay exceeding ±1001ms (excluding TrueHD audio). |
| TrueHD Compatibility | checkTrueHDCompatibility |
matroska_truehd_compatibility |
✅ | Verifies that any Dolby TrueHD audio track is followed by a lossy compatibility track (AC3/E-AC3) of the same language. |
| Commentary Channels | checkCommentaryChannels |
matroska_commentary_channels |
✅ | Warns if a commentary audio track has more than 2 channels. |
| Commentary Bitrate | checkCommentaryBitrate |
matroska_commentary_bitrate |
✅ | Warns if a commentary audio track has a bitrate exceeding 128 kbps (except for lossless codecs). |
| Commentary Prefix | checkCommentaryPrefix |
matroska_commentary_prefix |
✅ | Verifies commentary track names start with a standard prefix like "Commentary by...". |
| Commentary Pairing | checkCommentaryPairing |
matroska_commentary_pairing |
✅ | Verifies that subtitle commentary tracks have a corresponding audio commentary track. |
Tracks¶
| Check | Function | Identifier | Status | Description |
|---|---|---|---|---|
| Language Tags | validateTrackBasics |
matroska_language_tag |
✅ | Verifies that all tracks have a valid ISO language tag. |
| 'mul' Track Name | validateTrackBasics |
matroska_multi_lang |
✅ | Ensures that tracks with language 'mul' (Multiple) have a Name field listing at least two full language names. |
| Name Quality | checkTrackNameQuality |
matroska_name_quality |
✅ | Detects "junk" keywords (STEREO, ENCODED, SURROUND, etc.) in track names. |
| Simple Codecs | checkTrackNameCodecs |
matroska_name_codecs |
✅ | Detects simple codecs (AC3, AAC, DTS) in track names that are easily identified from technical metadata. |
| Redundant Language | checkTrackNameRedundantLang |
matroska_name_redundant_lang |
✅ | Flags full language names (e.g., "German") in the track title that match the track's language tag. |
| Original Language Consistency | checkOriginalLanguageConsistency |
matroska_original_language |
✅ | Verifies that the OriginalLanguage flag is applied consistently. |
| Duplicate Tracks | checkDuplicateTracks |
matroska_duplicate_tracks |
✅ | Identifies identical tracks (same language, flags, and name). |
| Flag Keywords | checkNameKeywords |
matroska_name_keywords |
✅ | Enforces strict two-way correlation between flags and keywords (SDH, Forced, Commentary, Descriptive/AD) in track names. |
| Default Flags | checkDefaultFlags |
matroska_default_flags |
✅ | Ensures specialized tracks (Forced, SDH, Commentary, etc.) are NOT marked as Default, and that the first standard track per language IS marked as Default. |
| Track Order | checkTrackOrder |
matroska_track_order |
✅ | Ensures audio and subtitle tracks are sorted by language priority (preferred_language, Original, and then alphabetical by English language and dialect name ) and type (Forced, Standard/Default, SDH/Descriptive, Commentary). |
Subtitles¶
| Check | Function | Identifier | Status | Description |
|---|---|---|---|---|
| Subtitle Format | checkSubtitleFormat |
matroska_subtitle_format |
✅ | Verifies that all text subtitle tracks are in SRT or ASS format. All other text formats should be converted to SRT. |
| Subtitle Fonts | checkSubtitleFonts |
matroska_subtitle_fonts |
✅ | Verifies that all fonts used in SubStationAlpha (SSA/ASS) subtitle track Styles are included as attachments. Matching is done using internal font names (via sfnt), making it independent of attachment filenames. |
| Subtitle Inline Fonts | checkSubtitleInlineFontsWithContent |
matroska_subtitle_inline_fonts |
❌ | Verifies fonts used in inline tags within SSA/ASS subtitle tracks. Uses internal font names for matching. Requires demuxing the track, which makes this check significantly slower. Disabled by default. |
| SRT Validation | checkSRTValidation |
matroska_srt_validation |
❌ | Verifies that SRT subtitle tracks contain valid HTML formatting tags, all tags are properly nested and closed, and throws a warning if positioning/alignment information is present (which should use ASS instead). Disabled by default. |
| Unused Fonts | checkUnusedFonts |
matroska_unused_fonts |
✅ | Identifies font attachments that are not used by any subtitle track. Uses internal font names to ensure accuracy. |
| Font Filename Compliance | checkFontFilenameCompliance |
matroska_font_filename_compliance |
✅ | Verifies that the filename of a font attachment matches its internal font name (Family or Full Name). |
| ASS Script Info | checkASSScriptInfo |
matroska_ass_script_info |
✅ | Verifies that the [Script Info] section of an ASS subtitle track contains recommended headers like ScaledBorderAndShadow and YCbCr Matrix. |
| ASS Style Validation | checkASSStyles |
matroska_ass_styles |
✅ | Performs deep validation of ASS [V4+ Styles], checking for valid font sizes, alignments, encodings, and avoiding trailing whitespace in style names. |
| ASS Event Validation | checkASSEvents |
matroska_ass_events |
❌ | Validates ASS [Events], ensuring all used styles are defined, time formats are correct, and forbidden tags (like \fe) are avoided. Disabled by default. |
| ASS Unused Styles | checkASSUnusedStyles |
matroska_ass_unused_styles |
❌ | Identifies styles defined in the [V4+ Styles] section that are never referenced by any event (either as a base style or inline \r style override). Disabled by default. |
| Zlib Compression | checkZlibCompression |
matroska_zlib_compression |
✅ | Verifies that zlib compression is disabled for all tracks. |
Chapters¶
| Check | Function | Identifier | Status | Description |
|---|---|---|---|---|
| Chapter Existence | checkChaptersExistence |
matroska_chapters_existence |
❌ | Verifies that there is at least one chapter in the file. (Disabled by default) |
| Chapter Non-Zero Start | checkChaptersStartNonZero |
matroska_chapters_start_non_zero |
✅ | Verifies that the first chapter starts at exactly 00:00:00.000. |
| Chapter Non-Monotonic Order | checkChaptersNonMonotonic |
matroska_chapters_non_monotonic |
✅ | Verifies that chapter start times are strictly increasing. |
| Chapter Duplicate Timestamps | checkChaptersDuplicate |
matroska_chapters_duplicate |
✅ | Flags cases where multiple chapters share the exact same timestamp. |
| Chapter Interval Too Short | checkChaptersTooClose |
matroska_chapters_too_close |
✅ | Flags consecutive chapters that are less than 10 seconds apart. |
| Chapter Exceeds Duration | checkChaptersExceedDuration |
matroska_chapters_exceed_duration |
✅ | Ensures no chapter starts after the total duration of the video. |
| Chapter Name Hygiene | checkChaptersNameHygiene |
matroska_chapters_name_hygiene |
✅ | Verifies chapter display names are present, and have no consecutive duplicate names. |
| Chapter Language Hygiene | checkChaptersLanguageHygiene |
matroska_chapters_language_hygiene |
✅ | Ensures all chapter displays have valid, consistent language tags (and are not undetermined/missing). |
| Chapter Keyframe Alignment | checkChaptersKeyframeAlignment |
matroska_chapters_keyframe_alignment |
✅ | Verifies that chapter timestamps fall exactly on video keyframes (seek points) using the container's Cues index. |
Media Database (MDB) Consistency Checks¶
| Check | Function | Identifier | Status | Description |
|---|---|---|---|---|
| MDB Error | checkMdbError |
mdb_error |
🔒 | Reports errors when communicating with TMDB/TVDB. |
| No Match Found | checkNoMatch |
mdb_no_match |
🔒 | Issued when the media cannot be found in the database. |
| Title Match | checkTitle |
mdb_title |
✅ | Compares filename title with the official title from TMDB/TVDB. |
| Movie Year Match | checkMovieYear |
mdb_movie_year |
✅ | Verifies release year against database records for movies. |
| Series Year Match | checkSeriesYear |
mdb_series_year |
✅ | Verifies series start year against database records. |
| Unknown Original Language | checkUnknownOriginalLang |
mdb_unknown_original_lang |
✅ | Warns if the original language from TMDB/TVDB is not recognized or missing (could cause issues with other language checks). |
| Unwanted Audio Language | checkUnwantedAudioLang |
mdb_unwanted_audio_lang |
✅ | Flags audio tracks in languages that are neither the preferred nor the original language (often considered bloated) |
| Episode Existence | checkEpisode |
mdb_episode_existence |
✅ | Verifies that the Season/Episode exists in the database. |
| Episode Title Match | checkEpisodeTitle |
mdb_episode_title |
✅ | Compares filename episode title with the official database title. |
| Special Date Match | checkSpecialDate |
mdb_episode_date |
✅ | Verifies air date for TV specials against database records. |
| Runtime Match | checkRuntime |
mdb_runtime |
✅ | Checks if the video duration differs significantly (>10%) from the expected runtime on TMDB/TVDB. |
| Title Type Mismatch | checkTitleTypeMismatch |
mdb_title_type_mismatch |
✅ | Warns if the file's packaging (movie vs. episodic) contradicts the title type from IMDb/TMDB (e.g. a movie file matched to a TV Episode, or a TV file matched to a Movie). |
| Track Languages | checkTrackLanguages |
mdb_track_languages |
✅ | Verifies presence of audio and subtitle tracks in both preferred and original languages. |
Aggregate Checks¶
Aggregate checks are performed after all individual files have been processed. They evaluate consistency and completeness across the entire set of provided files.
| Check | Function | Identifier | Description |
|---|---|---|---|
| Season Completeness | RunSeasonCompletenessCheck |
mdb_season_completeness |
Compares the set of local episodes against the official episode list on TVDB/TMDB for a given season. |
Season Completeness Check¶
This check identifies missing episodes in a season pack. It is designed to be helpful but non-intrusive:
- Activation: Only runs when more than one episode of the same season is provided in a single command.
- Verification: Cross-references local episode numbers with the official list from TVDB (preferred) or TMDB (fallback).
- Season 0: Automatically skips Season 0 (Specials), as these are often inconsistent across databases.
- Output: Provides a summary of whether the season is complete or lists the specific missing episode numbers.
Note: This check is currently only displayed in the interactive terminal output and is not included in JSON reports.
JSON Output¶
When the --json flag is used, parsec check always outputs detailed reports as a JSON array of objects, even when processing a single file.
This ensures consistent machine-readable output.
Passed checks and empty fields are generally omitted to reduce noise.
The interactive output contains the same information as the JSON output, but in an easy-to-read human-readable format.
Top-Level Structure¶
| Field | Type | Description |
|---|---|---|
file |
string | Full path or filename of the checked file. |
passed |
boolean | true if all checks passed, false otherwise. |
filename |
string | The original filename without extension. |
generated_name |
string | The expected filename generated based on metadata and naming conventions. |
version |
string | The version of parsec used to generate the report. |
issues |
array | A list of issue groups, categorized by source. |
Example:
{
"file": "Die.Kaenguru.Chroniken.2020.German.AC3.1080p.BluRay.x265-FuN.mkv",
"passed": false,
"filename": "Die.Kaenguru.Chroniken.2020.German.AC3.1080p.BluRay.x265-FuN",
"generated_name": "Die.Kaenguru.Chroniken.2020.GERMAN.1080p.BluRay.DD5.1.H.265-FuN",
"version": "v0.3.0",
"issues": []
}
Issue Group¶
| Field | Type | Description |
|---|---|---|
category |
string | The category of issues. Possible values: FILENAME, MDB, MEDIAINFO, MATROSKA. |
results |
array | A list of individual check results for this category. |
Example:
Result Object¶
| Field | Type | Description |
|---|---|---|
identifier |
string | Unique identifier for the check (see Available Checks). |
passed |
boolean | Whether this specific check passed. |
severity |
string | The importance of the issue. Possible values: info, warning, error. |
warning |
string | Human-readable description of the problem. |
expected |
string | The expected value (optional, depends on the check). |
actual |
string | The actual value found (optional, depends on the check). |
list |
array | A list of string bullet points (optional, used for multi-line formatting). |
tracks |
array | List of track-specific results (optional, for checks that evaluate individual tracks). |
table |
object | Table-formatted data (optional, see TableData Object). |
Example:
{
"identifier": "filename_generation_mismatch",
"passed": false,
"severity": "warning",
"warning": "Generated name does not match the original",
"expected": "Die.Kaenguru.Chroniken.2020.German.AC3.1080p.BluRay.x265-FuN",
"actual": "Die.Kaenguru.Chroniken.2020.GERMAN.1080p.BluRay.DD5.1.x265-FuN",
"tracks": []
}
Track Object¶
| Field | Type | Description |
|---|---|---|
id |
string | The MediaInfo track ID (Number, starting from 1). |
type |
string | The track type (e.g., video, audio, subtitle). |
passed |
boolean | Whether the check passed for this specific track. |
type_order |
integer | The sequential order of this track among tracks of the same type. |
codec |
string | Technical codec name (e.g., V_MPEG4/ISO/AVC, A_AC3). |
name |
string | The track's Name field in Matroska. |
language |
string | The track's ISO 639-2/T language tag (e.g., ger, eng). |
flags |
array | List of applied track flags. See Track Flags. |
warning |
string | Human-readable description of the track-specific issue. |
list |
array | A list of string bullet points (optional, used for multi-line formatting). |
table |
object | Table-formatted data for this track (optional, see TableData Object). |
Example:
{
"id": "2",
"type": "audio",
"passed": false,
"type_order": 1,
"codec": "AC-3",
"name": "Surround",
"language": "ger",
"flags": [
"Default"
],
"warning": "junk keyword 'SURROUND' in Name"
}
Track Flags¶
Possible values in the flags array:
Default: Track is marked as the default for its type.Forced: Track is marked as forced.Hearing Impaired: Track is marked for hearing impaired (SDH).Visual Impaired: Track is marked for visual impaired (Descriptive Audio).Commentary: Track is marked as commentary.Original: Track is marked as being in the original language.
TableData Object¶
Used to display structured, multi-dimensional tabular data.
| Field | Type | Description |
|---|---|---|
headers |
array | List of column header names (strings). |
rows |
array | List of row entries, where each entry is a list of strings corresponding to the headers. |
Example:
{
"headers": [
"Line #",
"Style Name",
"Validation Issue"
],
"rows": [
[
"18",
"Default",
"Encoding should be 1, got 0"
]
]
}
Full Example¶
[
{
"file": "Die.Kaenguru.Chroniken.2020.German.AC3.1080p.BluRay.x265-FuN.mkv",
"passed": false,
"filename": "Die.Kaenguru.Chroniken.2020.German.AC3.1080p.BluRay.x265-FuN",
"generated_name": "Die.Kaenguru.Chroniken.2020.GERMAN.1080p.BluRay.DD5.1.x265-FuN",
"version": "v0.3.0",
"issues": [
{
"category": "FILENAME",
"results": [
{
"identifier": "filename_generation_mismatch",
"passed": false,
"severity": "warning",
"warning": "Generated name does not match the original",
"expected": "Die.Kaenguru.Chroniken.2020.German.AC3.1080p.BluRay.x265-FuN",
"actual": "Die.Kaenguru.Chroniken.2020.GERMAN.1080p.BluRay.DD5.1.x265-FuN"
}
]
},
{
"category": "MDB",
"results": [
{
"identifier": "mdb_subtitle_language_preferred",
"passed": false,
"severity": "warning",
"warning": "Subtitle track in preferred language 'de' is missing",
"expected": "de"
}
]
},
{
"category": "MATROSKA",
"results": [
{
"identifier": "matroska_name_quality",
"passed": false,
"severity": "info",
"warning": "Track Name contains junk keywords",
"tracks": [
{
"id": "2",
"type": "audio",
"passed": false,
"type_order": 1,
"codec": "AC-3",
"name": "Surround",
"language": "ger",
"flags": [
"Default"
],
"warning": "junk keyword 'SURROUND' in Name"
}
]
}
]
}
]
}
]