Skip to content

LesPrimus/pyKDM

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pyKDM

Python wrapper for DCP-o-matic CLI tools (DCP creation and KDM generation).

Requirements

  • Python 3.12+
  • DCP-o-matic installed (provides dcpomatic2_cli, dcpomatic2_kdm_cli, and dcpomatic2_create)

Installation

uv add pykdm

Or with pip:

pip install pykdm

CLI Usage

KDM Generation

Generate a KDM for an encrypted DCP:

pykdm kdm generate /path/to/dcpomatic-project \
  -c /path/to/certificate.pem \
  -o /path/to/output.kdm.xml \
  -f "2024-01-01" \
  -t "2024-01-31" \
  --cinema-name "My Cinema" \
  --screen-name "Screen 1"

Note: The path should be the DCP-o-matic project folder (containing metadata.xml), not the DCP output subfolder.

Generate a KDM from a DKDM:

pykdm kdm generate-dkdm /path/to/dkdm.xml \
  -c /path/to/certificate.pem \
  -o /path/to/output.kdm.xml \
  -f "2024-01-01" \
  -t "2024-01-31"

DCP Creation

Create a DCP from a DCP-o-matic project:

pykdm dcp create /path/to/project.dcp -o /path/to/output

Create an encrypted DCP:

pykdm dcp create /path/to/project.dcp -o /path/to/output -e

DCP Project Creation (from video files)

Create a DCP-o-matic project from video/audio files:

pykdm dcp create-from-video video.mp4 -o ./my-project -n "My Film"

Create a project with multiple content files:

pykdm dcp create-from-video video.mp4 audio.wav -o ./project

Create a project and build the DCP in one step:

pykdm dcp create-from-video video.mp4 -o ./project --build

Create an encrypted DCP with custom output location:

pykdm dcp create-from-video video.mp4 -o ./project -e --build --dcp-output ./dcp

Specify content type and resolution:

pykdm dcp create-from-video video.mp4 -o ./project -c TLR --fourk --standard smpte

Test Certificate Generation

Generate a test projector certificate for KDM testing:

pykdm cert generate test_projector.pem

Generate with custom device info:

pykdm cert generate projector.pem -m Barco -M DP2K -s ABC123

Generate with different DCI role:

pykdm cert generate cert.pem --role LINK_DECRYPTOR

Generate a CA + leaf certificate chain:

pykdm cert generate-chain ./test-certs -m Christie -M CP4230 -s XYZ789

Version Info

pykdm kdm version
pykdm dcp version
pykdm dcp project-version

Options

Run pykdm --help or pykdm <command> --help for all available options.

Python API

KDM Generation

from datetime import datetime, timedelta
from pathlib import Path
from pykdm import KDMGenerator, KDMType

generator = KDMGenerator()

# Note: project should be the DCP-o-matic project folder (containing metadata.xml),
# not the DCP output subfolder
result = generator.generate(
    project=Path("/path/to/dcpomatic-project"),
    certificate=Path("/path/to/certificate.pem"),
    output=Path("/path/to/output.kdm.xml"),
    valid_from=datetime.now(),
    valid_to=datetime.now() + timedelta(days=7),
    kdm_type=KDMType.MODIFIED_TRANSITIONAL_1,
    cinema_name="My Cinema",
    screen_name="Screen 1",
)

print(f"KDM created at: {result.output_path}")

DCP Creation

from pathlib import Path
from pykdm import DCPCreator

creator = DCPCreator()

result = creator.create(
    project=Path("/path/to/project.dcp"),
    output=Path("/path/to/output"),
    encrypt=True,
)

print(f"DCP created at: {result.output_path}")

DCP Project Creation (from video files)

from pathlib import Path
from pykdm import DCPProjectCreator, DCPContentType, ContainerRatio, DCPStandard, Resolution

creator = DCPProjectCreator()

# Create a project
result = creator.create(
    content=Path("/path/to/video.mp4"),
    output=Path("/path/to/project"),
    name="My Film",
    content_type=DCPContentType.FTR,
    container_ratio=ContainerRatio.RATIO_185,
    standard=DCPStandard.SMPTE,
    resolution=Resolution.TWO_K,
)

print(f"Project created at: {result.output_path}")

Create and build DCP in one step:

from pathlib import Path
from pykdm import DCPProjectCreator

creator = DCPProjectCreator()

project_result, dcp_result = creator.create_and_build(
    content=[Path("/path/to/video.mp4"), Path("/path/to/audio.wav")],
    output=Path("/path/to/project"),
    dcp_output=Path("/path/to/dcp"),
    name="My Film",
    encrypt=True,
)

print(f"Project created at: {project_result.output_path}")
print(f"DCP created at: {dcp_result.output_path}")

Test Certificate Generation

from pathlib import Path
from pykdm import CertificateGenerator, DCIRole

generator = CertificateGenerator()

# Generate a single test certificate
result = generator.generate(
    output=Path("projector.pem"),
    manufacturer="Barco",
    model="DP2K",
    serial="ABC123",
    role=DCIRole.PROJECTOR,
    validity_days=3650,
)

print(f"Certificate: {result.certificate_path}")
print(f"Private key: {result.private_key_path}")
print(f"Thumbprint: {result.thumbprint}")

Generate a CA + leaf certificate chain:

from pathlib import Path
from pykdm import CertificateGenerator

generator = CertificateGenerator()

ca_result, leaf_result = generator.generate_chain(
    output_dir=Path("./test-certs"),
    manufacturer="Christie",
    model="CP4230",
    serial="XYZ789",
)

print(f"CA certificate: {ca_result.certificate_path}")
print(f"Leaf certificate: {leaf_result.certificate_path}")

KDM Types

  • modified-transitional-1 (default) - Most compatible format
  • dci-any - DCI compliant, any device
  • dci-specific - DCI compliant, specific device

DCP Content Types

  • FTR - Feature
  • SHR - Short
  • TLR - Trailer
  • TST - Test
  • XSN - Transitional
  • RTG - Rating
  • TSR - Teaser
  • POL - Policy
  • PSA - Public Service Announcement
  • ADV - Advertisement

Container Ratios

  • 119 - 1.19:1
  • 133 - 1.33:1 (4:3)
  • 137 - 1.37:1 (Academy)
  • 138 - 1.38:1
  • 166 - 1.66:1 (European Widescreen)
  • 178 - 1.78:1 (16:9)
  • 185 - 1.85:1 (Flat)
  • 239 - 2.39:1 (Scope)

DCP Standards

  • smpte - SMPTE standard (recommended)
  • interop - Interop standard (legacy)

DCI Certificate Roles

For test certificate generation:

  • PROJECTOR - Media Decryptor (LE.SPB-MD) - default
  • LINK_DECRYPTOR - Link Decryptor (LE.SPB-LD)
  • SECURE_PROCESSOR - Secure Processor (LE.SPB-SP)
  • CS - Content Signer
  • SMPTE - SMPTE role

Note: Test certificates are self-signed and won't work with real DCI infrastructure.

License

MIT

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages