Skip to main content

Digital Cinema Package (DCP) probing and checking utility

Project description

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 :

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for clairmeta, version 1.1.2
Filename, size File type Python version Upload date Hashes
Filename, size clairmeta-1.1.2.tar.gz (90.6 kB) File type Source Python version None Upload date Hashes View
Filename, size clairmeta-1.1.2-py2.py3-none-any.whl (116.5 kB) File type Wheel Python version py2.py3 Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page