Skip to content
Switch branches/tags
Go to file

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Build Status PyPI version Code coverage


Clairmeta is a python package for Digital Cinema Package (DCP) probing and checking.


  • DCP Probe : metadata extraction of the whole DCP, including all XML fields and MXF assets inspection.
  • DCP Checker : advanced DCP validation tool, including (non exhaustive) :
    • SMPTE / Interop standard convention (naming, …)
    • Integrity (MIME type, size, hash) of all assets
    • Foreign file identification
    • XSD Schema validation for XML files (VOLINDEX, ASSETMAP, CPL, PKL)
    • Digital signature validation (CPL, PKL)
    • Intra / Inter Reels integrity and coherence
    • Metadata match between CPL assets and MXF headers
    • Re-link VF / OV
    • Picture tests : FrameRate, BitRate, …
    • Sound tests : Channels, Sampling, …
    • Subtitle : Deep inspection of Interop and SMPTE subtitles
  • DSM / DCDM Checker : basic image file sequence validation with some specific rules.


Requirements :

  • Python :
    • Should work on python 2.7 and python 3.4+
    • Tested on : python 2.7, python 3.6
  • Platform :
    • Should work on Windows, macOS, Linux
    • Tested on : macOS 10.12
  • External (non-python) dependencies :
    • asdcplib
    • mediainfo (opt)
    • sox (opt)

Install from PyPI package (reminder : this does not install external dependencies):

pip install clairmeta

Install from Debian package (all requirements will be automatically installed):

# Optional : add Bintray public key
apt-get install dirmngr
gpg --keyserver hkp:// --recv 379CE192D401AB61
gpg --export --armor 379CE192D401AB61 | apt-key add -

# Add Clairmeta repository to apt sources
# Replace <distro> appropriately
# Ubuntu 14.04 : use trusty
# Ubuntu 16.04 : use xenial
# Ubuntu 17.04 : use artful
# Ubuntu 18.04 : use bionic
echo "deb <distro> main" | sudo tee /etc/apt/sources.list.d/clairmeta.list

sudo apt-get update
sudo apt-get install python3-clairmeta



As a command line tool :

python3 -m clairmeta.cli probe -type dcp path/to/dcp
python3 -m clairmeta.cli probe -type dcp path/to/dcp -format json > dcp.json
python3 -m clairmeta.cli probe -type dcp path/to/dcp -format xml > dcp.xml
python3 -m clairmeta.cli check -type dcp path/to/dcp
python3 -m clairmeta.cli check -type dcp path/to/dcp -format json > check.json
python3 -m clairmeta.cli check -type dcp path/to/dcp -format xml > check.xml
python3 -m clairmeta.cli check -type dcp path/to/dcp -kdm /path/to/kdm -key /path/to/privatekey
python3 -m clairmeta.cli check -type dcp path/to/dcp -progress

As a python library :

from clairmeta import DCP

dcp = DCP("path/to/dcp")
# Parse DCP
# Check DCP
status, report = dcp.check()
# Check DCP VF against OV
status, report = dcp.check(ov_path="/path/to/dcp_ov")

# Check DCP with default console progression report
from clairmeta.utils.file import ConsoleProgress
status, report = dcp.check(hash_callback=ConsoleProgress())
# Alternatives
# - function matching utils.file.ConsoleProgress.__call__ signature
# - derived class from utils.file.ConsoleProgress


Check profile allow custom configuration of the DCP check process such as bypassing some unwanted tests or criteria specification. To implement a check profile, simply write a JSON file derived from this template (actual content listed below is for demonstration purposes only) :

  • criticality key allow custom criteria level specification, check name can be incomplete to quickly ignore a bunch of tests, default is used if no other match where found.
  • bypass key allow specific test bypassing, incomplete names are not allowed.
    "criticality": {
        "default": "ERROR",
        "check_dcnc_": "WARNING",
        "check_cpl_reel_duration_picture_subtitles": "WARNING",
        "check_picture_cpl_avg_bitrate": "WARNING",
        "check_picture_cpl_resolution": "WARNING"
    "bypass": ["check_assets_pkl_hash"]

Custom profile check :

python3 -m clairmeta.cli check -type dcp path/to/dcp -profile path/to/profile.json
from clairmeta import DCP
from clairmeta.profile import load_profile

dcp = DCP("path/to/dcp")
profile = load_profile("/path/to/profile.json")
status, report = dcp.check(profile=profile)


Logging is customizable, see file or below. By default Clairmeta logs to stdout and a rotated log file.

'level': 'INFO'  # Minimum log level
'enable_console': True  # Enable / Disable stdout logging
'enable_file': True  # Enable / Disable file logging
'file_name': '/log/path/clairmeta.log'  # Log file absolute path
'file_size': 1e6  # Individual log file maximum size
'file_count': 10  # Number of files to rotate on


  • To setup your environment, use pipenv :
pip install pipenv
git clone
cd clairmeta
pipenv install --dev [--two]
pipenv check
# Enter virtual environment
pipenv shell
# Code...
# Get tests resources
git clone tests/resources
# Run tests
nosetests --nocapture --with-doctest --doctest-options=+ELLIPSIS --with-coverage --cover-package=clairmeta
# Leave virtual environment
  • Open a Pull Request
  • Open an Issue


The release changes are available on Github:


The following sources / software were used :



Clairmeta is a python package for Digital Cinema Package (DCP) probing and checking.




No packages published