Releases: TheAcharya/OpenFCPXMLKit
Releases · TheAcharya/OpenFCPXMLKit
Release list
3.0.3
3.0.3 - 2026-07-10
✨ New Features
- Compound-clip Excel reports:
FinalCutPro.FCPXML.allReportTimelineSources()discovers both project sequences and standalone compound-clip timelines (event-levelref-clip→media/sequence).ReportBuilder/buildReportand Summary use this so FCP “Export XML” of a compound clip (no<project>) produces role inventory, markers, and other sheets like a normal project.
🔧 Improvements
- Test suite: Expanded to 933 tests (932 in
OpenFCPXMLKitTests+ 1 optionalExcelReportTest), includingFCPXMLCompoundClipReportTests.
🐛 Bug Fixes
- Report timeline resolution: Documents that contain only an event-level compound clip no longer fail with
ReportError.noProjectsFound; reporting walks the compound clip’smediasequence instead.
3.0.2
3.0.2 - 2026-07-08
✨ New Features
- Configurable report timecode formats:
ReportOptions.timecodeFormat/Report.timecodeFormat(ReportTimecodeFormat) control timeline time cells across all report sheets. Modes:.smpteFrames(HH:MM:SS:FF, default),.frames(Frames),.feetAndFrames(Feet+Frames), and.smpteNoFrames(HH:MM:SS). CLI--timecode-formataccepts the same values. - Format-aware column headers: Timecode columns use dynamic suffixes in Excel (e.g.
Timeline In (frames));ReportColumnexclusion matches both plain and suffixed headers. - Shared build / progress order:
ReportBuildPhase.enabledPhases(for:)is the single source of truth for inventory-first product order (Selected Roles Inventory → Markers → … → Media Summary).ReportBuilder, CLI progress, and GUIonPhaseStartedcallbacks share the same phase list.
🔧 Improvements
- Timeline string formatting: Report SMPTE cells use SwiftTimecode
stringValue()so non-drop-frame uses:and drop-frame uses;before frames. - Sort guardrails: Timeline position sorting is numeric for Frames and Feet+Frames (avoids lexicographic order issues such as
100before20). - Test suite: Expanded to 925 tests (924 in
OpenFCPXMLKitTests+ 1 optionalExcelReportTest), includingFCPXMLReportTimecodeFormatTestsandFCPXMLReportBuildPhaseTests, plus format-aware header and numeric-sort coverage in formatting/column-exclusion tests. - Documentation: Updated manual chapters 16 — CLI, 17 — Examples, and 19 — Reporting & Excel Export; CLI README; project README;
AGENT.md,ARCHITECTURE.md(§2.7 / §3),.cursorrules; andTests/README.md/Tests/ExcelReportTest/README.md.
🐛 Bug Fixes
- Drop-frame notation: SMPTE report cells for drop-frame rates (e.g. 29.97 DF) now correctly use semicolon separators instead of always formatting as non-drop-frame.
- Build progress order: Report build and progress callbacks no longer finish inventory after optional sheets; phases now match the GUI / workbook product order (Selected Roles Inventory first).
3.0.1
3.0.1 - 2026-07-07
✨ New Features
- Media Summary sheet: Split missing-media reporting out of Summary into a dedicated Media Summary sheet.
ReportOptions.includeMediaSummary,.mediaSummaryOnly, and CLI--report-media-summary(included in--report-full). - Global column exclusion:
ReportOptions.excludedColumnsandReportColumnomit named columns from every applicable workbook sheet at export. CLI--exclude-column(repeatable; case-insensitive aliases such asMetadata,Row Numbers,Source File Path). - Disabled-clip filtering:
ReportOptions.excludeDisabledClipsand CLI--exclude-disabled-clipsomitenabled="0"clips from all timeline-based report sections (role inventory, markers, keywords, titles, transitions, effects, speed-change effects, summary role durations). - Expanded role inventory columns: Selected Roles Inventory and per-role sheets now use a shared 32-column layout (
RoleInventoryColumnLayout): Row index, 23 fixed columns (including Take, Camera Angle/Name, Frame Rate/Sample Rate, Frame Size, Source File Name/Path), plus sorted dynamic metadata key columns.
🔧 Improvements
- Sheet naming: Main role inventory tab renamed to Selected Roles Inventory; workbook sheet titles use Title Case.
- Excel export: Improved column auto-fit (wider maximum and header-based minimum widths for path columns);
Report.excludedColumnsresolved at build time and applied across inventory, section sheets, summary metrics, and media summary.FCPXMLReportWorkbookExporterapplies sheet-specific row text colours viaRoleRowColorContext: inventory rows tinted by role category (video/caption blue, titles purple, audio green, gap gray); Keywords, Titles & Generators, Effects, Speed Change Effects, and Transitions use dedicated rules when Category is unavailable; Summary project title uses the table header style with black data rows; Media Summary missing paths use red text; Markers retain marker-type colours. - Test suite: Expanded to 894 tests (893 in
OpenFCPXMLKitTests+ 1 optionalExcelReportTestintegration), includingFCPXMLRoleInventoryColumnLayoutTests,FCPXMLReportColumnExclusionTests,FCPXMLReportExcludeDisabledClipsTests, andFCPXMLReportExcelExportTests(workbook cell formatting: Summary title header, black role-duration data, red missing-media paths, inventory/section-sheet colour rules). - Documentation: Updated manual chapters 16 — CLI and 19 — Reporting & Excel Export (workbook cell colour policy), CLI README, project README,
AGENT.md,ARCHITECTURE.md(§2.7 reporting layers, top-down Mermaid diagrams),.cursorrules, andTests/README.md/Tests/ExcelReportTest/README.md.
🐛 Bug Fixes
- Summary sheet formatting: Role-duration rows and % of Total no longer incorrectly tinted with role colours; data uses default black text. Project title row (row 1) now uses the table header style (bold white text on black fill).
- Section sheet row colours: Keywords, Titles & Generators, Effects, Speed Change Effects, and Transitions no longer default to green when the Category column is absent; each sheet now applies its documented colour rules.
- Media Summary: Missing media file paths now render in red (
#FF0000). - Gap role colour: Inventory gap rows use gray (
#808080) instead of black.
3.0.0
3.0.0 - 2026-07-02
✨ New Features
- Project renamed to OpenFCPXMLKit: Pipeline Neo is now OpenFCPXMLKit. All code, APIs, documentation, and tooling use OpenFCPXMLKit naming exclusively — the
OpenFCPXMLKitmodule, theOpenFCPXMLKit-CLIbinary, and theOFKXML*cross-platform XML types. Existing FCPXML parsing, creation, and manipulation APIs remain source-compatible; the product name and module are what changed. - Production's Best Friend–style Excel reports: A new reporting subsystem builds structured, multi-sheet
.xlsxworkbooks from an FCPXML/FCPXMLD, modelled on Production's Best Friend report layouts. Sheets include Role Inventory (Selected Roles plus per-role sheets), Markers, Keywords, Titles & Generators, Transitions, Video & Audio Effects, Speed Change Effects, and a Summary sheet with per-role duration totals and percentages. Workbook export is XLKit-backed with Production's Best Friend–style formatting (black header rows, role and marker colour coding, numeric percentage cells, column auto-fit). - Reporting API:
FinalCutPro.FCPXML.buildReport(options:)withReportBuilder, typedReport/section/row models, andReportOptionspresets (.full,.markersOnly,.roleInventoryOnly,.summaryOnly, and more), plus role exclusions, project-name filtering, progress callbacks, andRoleDisplayPreference.ReportExcelExportrenders anyReportto a workbook or writes it to an.xlsxfile. - CLI
--report: New REPORT command on OpenFCPXMLKit-CLI.--reportalone exports the role inventory;--report-fulladds every optional sheet; per-section flags (--report-markers,--report-keywords,--report-titles-generators,--report-transitions,--report-effects,--report-speed-change-effects,--report-summary) select individual sheets, and--exclude-role/--report-projectrefine the output. Writes{project-name}.xlsxto the output directory. - Extraction presets: Added
TitlesExtractionPresetandEffectsExtractionPresetalongside the existing presets to drive report-oriented element extraction.
🔧 Improvements
- Dependencies: Added XLKit for Excel workbook generation (
Reporting/Excel). - Test suite: Expanded to 877 tests with dedicated reporting and extraction coverage (role inventory, markers, keywords, titles, transitions, effects, speed-change effects, summary, Excel export, role display/exclusion, and extraction scope/presets). Test files and classes are standardised on the
FCPXMLprefix, with the module-named umbrellaOpenFCPXMLKitTestsas the sole exception. - Documentation: New manual chapter 19 — Reporting & Excel Export; updated CLI and Extraction chapters, the manual index/README, and examples.
AGENT.md,ARCHITECTURE.md,.cursorrules, andTests/README.mdupdated for the reporting subsystem, OpenFCPXMLKit naming, and the standardisedFCPXML-prefixed test naming.
🐛 Bug Fixes
- None in this release.
2.5.2
2.5.2 - 2026-03-27
✨ New Features
- None in this release.
🔧 Improvements
- Timeline test availability wording: Clarified
TimelineManipulationTestsavailability comments to state behavior consistency across all supported macOS versions (12.0 and later), removing ambiguous minor-version phrasing.
🐛 Bug Fixes
- Offset helper naming correctness: In
FCPXMLElementOffset, renamed a misleading local variable (dur) tooffsetin_fcpOffsetAsTimecode, aligning naming with actual semantics and reducing maintenance confusion. - Timestamp test redundancy removal: Removed a redundant tolerance assertion in
testTimelineTimestampsInitializationnow that both timestamps are intentionally injected with the same baseline value.
2.5.1
2.5.1 - 2026-03-21
✨ New Features
- None in this release.
🔧 Improvements
- Timeline API documentation: Clarified
Timeline.insertingClipWithRipplebehavior to explicitly state that clips overlapping the insertion point but starting before it are not shifted. - Timeline test coverage clarity:
TimelineManipulationTestsnow includes explicit availability context for@available(macOS 12.0, *)and stronger comments describing ripple and lane-selection semantics.
🐛 Bug Fixes
- Deterministic lane-selection assertions: Updated
TimelineManipulationTeststo assert exact lane outcomes for outward lane search and multi-conflict auto-lane placement, preventing ambiguous assertions from masking behavior changes. - Timestamp test stability: Reworked
testTimelineTimestampsInitializationto use fixed injected timestamps instead of real-time clock comparisons, removing race-prone timing assertions.
2.5.0
2.5.0 - 2026-03-16
✨ New Features
- Cross-platform XML abstraction layer — iOS support (PR #17): Pipeline Neo can now target iOS 15+ in addition to macOS. A protocol-based XML layer decouples the library from Foundation’s DOM API (macOS-only) and adds an AEXML-backed implementation for non-macOS platforms. Thanks @stovak!
- New
Sources/PipelineNeo/XML/: ProtocolsPNXMLNode,PNXMLElement,PNXMLDocument,PNXMLDTDProtocol,PNXMLFactory; Foundation backend on macOS (byte-identical behavior); AEXML backend for iOS and other platforms;PNXMLDefaultFactory()for platform dispatch. - DTD validation: On macOS, full DTD validation is unchanged. On iOS, FCPXMLStructuralValidator performs cross-platform structural validation (root element, required children, element allowlist, required attributes) when Foundation DTD is unavailable.
- Package.swift:
.iOS(.v15)added to platforms; AEXML added as a dependency. - Backwards compatibility: macOS behavior is unchanged; existing APIs remain source-compatible.
🔧 Improvements
- Test suite: Expanded to 686 tests. Added
AEXMLSerializationParityTests(AEXML round-trip and backend parity),FCPXMLDTDValidatorTests(platform-conditional DTD vs structural fallback),FCPXMLStructuralValidatorTests(cross-platform structural validation), andImportOptionsTests. UpdatedTests/README.mdwith current structure tree, categories, and coverage. - Documentation: New manual chapter 18 — Cross-Platform & iOS; updated Overview, Loading/Parsing, Validation, XML Extensions, and Documentation README. Aligned
AGENT.md,ARCHITECTURE.md, and.cursorruleswith cross-platform XML layer, iOS support, 686 tests, andFCPXMLStructuralValidator/ PNXML naming. - CI: New iOS Simulator build job.
🐛 Bug Fixes
removeChildren(where:)index mismatch (PR #17): The default implementation previously used indices fromchildElements(elements only) when callingremoveChild(at:)on the fullchildrenarray (including text nodes), removing the wrong nodes when text/whitespace was present. It now iterates the fullchildrenarray so indices match. Fixes failures in ImportOptionsTests and EventClips removal.
2.4.3
2.4.3- 2026-03-07
✨ New Features
- None in this release.
🔧 Improvements
- Documentation alignment: Normalized
AGENT.mdand.cursorrulesso both files reflect the same architecture guidance, section coverage, and documentation-sync checklist terminology. - CLI documentation: Updated
Sources/PipelineNeoCLI/README.mdand manual pages (Documentation/Manual/16-CLI.md,Documentation/Manual/17-Examples.md) to use--project-versionfor create-project examples and option descriptions. - Test consistency: Updated
TimelineManipulationTests.testTimelineModifiedAtUpdatesOnAutoLaneInsertto remove an unnecessarythrowssignature and use explicitdo/catch+XCTFailfor clearer failure reporting.
🐛 Bug Fixes
- Xcode 26 dynamic linking compatibility (PR #16): Added
swift-logas an explicit package dependency andLoggingas a direct target dependency inPackage.swiftto resolve undefinedLogging.Loggersymbols when building Pipeline Neo as a dynamic framework under Xcode 26's stricter transitive dependency linking rules. Thanks @stovak! - CLI
--versionconflict: Resolved option-name collision between the built-in--versionflag and create-project's timeline version option by renaming the create-project option from--versionto--project-version.pipeline-neo --versionnow correctly prints the CLI tool version.
2.4.2
2.4.2 - 2026-03-06
✨ New Features
- None in this release.
🔧 Improvements
- Test quality: Cleaned up
TimelineManipulationTestsby removing an unnecessarythrowsfromtestTimelineModifiedAtUpdatesOnRippleInsert, aligning the signature with actual non-throwing behavior and reducing static analysis noise.
🐛 Bug Fixes
- None in this release.
2.4.1
2.4.1 - 2026-03-02
✨ New Features
- None in this release.
🔧 Improvements
- Test suite: Expanded to 655 tests. Added in TimelineExportValidationTests: testFCPXMLExporterExportsClipMarkers, testFCPXMLExporterExportsClipChapterMarkers, testFCPXMLExporterExportsClipKeywords, testFCPXMLExporterExportsClipRatings, testFCPXMLExporterExportsClipMetadata, testFCPXMLExporterClipMetadataAllTypesValidatesAgainstDTD (export with all metadata types then DTD validate), testFCPXMLExporterXmlDeclarationStandaloneNo (assert exported XML uses standalone="no" for DTD/xmllint compatibility).
- PR #14 (clip-level metadata export): Test coverage for FCPXMLExporter exporting clip-level metadata (markers, chapter-markers, keywords, ratings, custom metadata) as children of
<asset-clip>per FCPXML DTD; tests in TimelineExportValidationTests; Tests/README.md updated with coverage and XML declaration standalone note. Thanks @stovak! - TimelineManipulationTests: Addressed GitHub Code Scan findings: replaced actor-based
NowBox+DispatchSemaphorewith a lock-based class (NSLock) to avoid thread exhaustion and deadlock risk when providing injectable "now" in timestamp tests; replacedXCTAssertNoThrowwith do-catch and non-optional bindings forinsertClipAutoLaneandinsertingClipAutoLaneto properly verify success and handle thrown errors.
🐛 Bug Fixes
- xmllint / DTD validation: Resolved "standalone" warnings when validating exported FCPXML with
xmllint --dtdvalid. XML declaration now outputsstandalone="no"instead of removing the attribute, so libxml2 treats the document as dependent on an external DTD and no longer warns about whitespace nodes from pretty-printing. Change in XMLDocumentExtension.fcpxmlString.