Changelog

All notable changes to CDL Convert are documented in this file.

Version 1.0.0

Breaking Changes

  • Python 3.11+ Required - Dropped support for Python 2.7-3.10 and PyPy

  • OpenTimelineIO Required - We’ve moved to using OpenTimelineIO’s robust EDL adaptor system to parse ALE, CMX, and OTIO EDL files

  • Windows w/ Python 3.14 is not supported - Due to an OTIO build issue, running on Windows with Python 3.14 is at your own risk

  • MediaRef URI behavior has changed - Previously, MediaRef URIs could be impacted based on the OS you were running cdl_convert on. cdl_convert now attempts to maintain the original os behavior which wrote the URI to start with.

  • SatNode XML tag default changed - The default XML element tag for Saturation nodes has changed from SATNode to SatNode for consistency with SOPNode naming. Use --sat-tag SATNode to maintain legacy behavior.

  • CDL to CCC conversion deduplicates ColorCorrections - When converting from CDL (ColorDecisionList) to CCC (ColorCorrectionCollection) format, ColorCorrections are no longer duplicated. Previously, if a ColorCorrection appeared both directly in a ColorDecision and was referenced by a ColorCorrectionRef in another ColorDecision, it would appear twice in the output. Now each unique ColorCorrection appears only once.

  • ColorCorrection ID sanitization now preserves Unicode characters - Previously, IDs were sanitized to ASCII-only characters. Now, Unicode characters (e.g., accented letters, CJK characters) are preserved in IDs, with only invalid XML characters being removed. This allows for international character support in CDL identifiers while maintaining XML validity.

New Features

  • Configurable character encoding - Set input and output file encodings with CLI options

  • Nuke OCIOCDLTransform support - Full bidirectional support for Foundry Nuke’s OCIOCDLTransform node format (.nk files)

  • OTIO support - Now ingests .otio files with CDL metadata

  • Hatch & pyproject.toml - Modern Python packaging and building

  • Type hints throughout - Full type annotation for better IDE support

  • pathlib integration - Modern file path handling with pathlib.Path

  • ColorValues dataclass - Structured color correction data with validation

  • Enhanced error handling - Specific exception types (ValidationError, ParseError, FormatError)

  • Colored CLI output - Enhanced command-line experience with colored error messages

  • f-string formatting - Improved string operations throughout

  • Context managers - Safe resource management

  • Match statements - Cleaner control flow (Python 3.10+ features)

Infrastructure Changes

  • Build System: Migrated from setup.py to pyproject.toml with Hatch

  • CI/CD: Migrated from Travis CI to GitHub Actions

  • Dependencies: Upgraded OpenTimelineIO to 18.1+

  • Documentation: Modernized to Sphinx + MyST Parser with Furo theme

Bug Fixes

  • #26: Fixed ColorCorrection ID changes not updating references - When a ColorCorrection’s ID is changed, ColorDecision.members and ColorCorrectionRef.members dictionaries are now properly updated, and references continue to resolve correctly

  • #46: Fixed auto-generated ID collision issue - IDs are now generated by finding the first available number instead of using member count, preventing collisions with explicitly specified IDs

  • #55: Fixed parsing of CCC files with multiple xmlns attributes - previously only the first ColorCorrection with xmlns would be parsed

  • #61: Removed deprecated ‘rU’ file open mode that caused failures on Python 3.11+

Compatibility

CLI and API should be generally compatible with tools written for 0.9.2, however see the breaking changes listed above which could result in changed output your tools may have been expecting.

See Installation for updated installation instructions.

Version 0.9.2

Fixed

  • Fixed a bug where ALEs with blank lines would not convert correctly

  • Fixed a bug preventing cdl_convert from being correctly installed in Python 2.6

  • Fixed continuous integration testing

Changed

  • No longer officially supporting Python 3.2 (removed from CI builds, but should still work)

Version 0.9

Added

  • Ability to parse CMX EDLs

  • cdl_convert.py stub file at package root level for running without installation

Fixed

  • Script bug where collection formats containing color decisions would not export those decisions as individual color corrections

  • Bug where line endings weren’t being read correctly in certain situations

  • Script now writes errors to stderr correctly and exits with status 1

Version 0.8

Added

  • --single flag: When provided with an output collection format, each color correction in the input will be exported to its own collection

Changed

  • Giving a ColorCorrection a non-duplicate ID now works unless the --halt flag is given

  • Incoming collections with duplicate IDs will no longer fail

Version 0.7.1

Fixed

  • Bug where ALEs without ‘Scan Filename’ fields could not parse correctly

Version 0.7

  • Addition of collection format support.

  • .ccc (Color Correction Collections) and .cdl (Color Decision Lists) can now be parsed and written.

  • .ale and .flex files now return a collection.

Added

Changed

  • Renamed ColorCollectionBase to ColorCollection

  • ColorCollection is now a fully functional container class

  • Calling sop_node or sat_node on ColorCorrection before setting values now works

  • ColorCorrection cdl_file init argument renamed to input_file

  • parse_cc() and parse_rnh_cdl now yield a single ColorCorrection, not a list

  • All determine_dest methods now take a directory argument

  • Renamed parse_cdl/write_cdl to parse_rnh_cdl/write_rnh_cdl

  • Renamed cdl_file argument to input_file in parse functions

Python Structure Refactoring

Version 0.6.1

Added

  • AscXMLBase class for XML-representable nodes

  • Tests for write_cc - brings coverage to 100%

Changed

  • Suppressed scientific notation when writing files

  • write_cc now writes 100% correct XML using ElementTree

Version 0.6

Major release adding ASC CDL XML compliance and restructuring the class hierarchy.

Added

  • Much greater ASC CDL XML compliance with new classes representing XML schema nodes

  • AscColorSpaceBase: Base class for viewing_desc and input_desc

  • AscDescBase: Base class for desc attribute

  • ColorCollectionBase: Basis for collection type nodes

  • MediaRef: Represents MediaRef node with convenient file handling

  • HALT_ON_ERROR module variable for exception handling behavior

  • Class-level member dictionary for ColorCorrection lookup by ID

  • SatNode and SopNode classes for color operations

Changed

  • Renamed AscCdl to ColorCorrection

  • ColorCorrection now requires unique ID

  • Moved SOP and SAT operations into separate node classes

  • Removed metadata attribute, split into input_desc, viewing_desc, and desc

  • desc is now a list of all description fields

  • Renamed cc_id to id

  • Slope, Offset, and Power now return tuples instead of lists

  • parse_cc() now parses wider variety of .cc files

  • Significantly simplified parse_flex()

Added

  • PyPy support

  • ReadTheDocs documentation

  • Test suite broken into sub-modules

Version 0.5

Changed

  • Restructured project according to Python packaging guidelines

  • Some AscCdl attributes moved into dictionaries (reversed in 0.6)

  • Refactored parse functions to reduce complexity

  • Simplified write_cdl to be more pythonic

Version 0.4.2

Fixed

  • Hotfix for from __future__ imports

Version 0.4.1

Changed

  • PEP 8 conversion

  • Added landscape.io support

  • Uses from __future__ for print function

Version 0.4

Added

  • Python 3 compatibility

  • Better type and exception handling for AscCdl setters

  • ID field sanitization

  • Travis CI for continuous integration

  • ElementTree for XML parsing in parse_cc

Changed

  • More unit testing bug fixes and enhancements

  • Test suite now runs on Windows


For the latest changes, see the GitHub repository.