Skip to content

Releases: TheAcharya/OpenFCPXMLKit

3.0.3

Choose a tag to compare

@github-actions github-actions released this 10 Jul 05:02

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-level ref-clipmedia/sequence). ReportBuilder / buildReport and 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 optional ExcelReportTest), including FCPXMLCompoundClipReportTests.

🐛 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’s media sequence instead.

3.0.2

Choose a tag to compare

@github-actions github-actions released this 08 Jul 12:44

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-format accepts the same values.
  • Format-aware column headers: Timecode columns use dynamic suffixes in Excel (e.g. Timeline In (frames)); ReportColumn exclusion 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 GUI onPhaseStarted callbacks 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 100 before 20).
  • Test suite: Expanded to 925 tests (924 in OpenFCPXMLKitTests + 1 optional ExcelReportTest), including FCPXMLReportTimecodeFormatTests and FCPXMLReportBuildPhaseTests, 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; and Tests/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

Choose a tag to compare

@github-actions github-actions released this 06 Jul 21:56

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.excludedColumns and ReportColumn omit named columns from every applicable workbook sheet at export. CLI --exclude-column (repeatable; case-insensitive aliases such as Metadata, Row Numbers, Source File Path).
  • Disabled-clip filtering: ReportOptions.excludeDisabledClips and CLI --exclude-disabled-clips omit enabled="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.excludedColumns resolved at build time and applied across inventory, section sheets, summary metrics, and media summary. FCPXMLReportWorkbookExporter applies sheet-specific row text colours via RoleRowColorContext: 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 optional ExcelReportTest integration), including FCPXMLRoleInventoryColumnLayoutTests, FCPXMLReportColumnExclusionTests, FCPXMLReportExcludeDisabledClipsTests, and FCPXMLReportExcelExportTests (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, and Tests/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

Choose a tag to compare

@github-actions github-actions released this 02 Jul 01:00

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 OpenFCPXMLKit module, the OpenFCPXMLKit-CLI binary, and the OFKXML* 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 .xlsx workbooks 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:) with ReportBuilder, typed Report/section/row models, and ReportOptions presets (.full, .markersOnly, .roleInventoryOnly, .summaryOnly, and more), plus role exclusions, project-name filtering, progress callbacks, and RoleDisplayPreference. ReportExcelExport renders any Report to a workbook or writes it to an .xlsx file.
  • CLI --report: New REPORT command on OpenFCPXMLKit-CLI. --report alone exports the role inventory; --report-full adds 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-project refine the output. Writes {project-name}.xlsx to the output directory.
  • Extraction presets: Added TitlesExtractionPreset and EffectsExtractionPreset alongside 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 FCPXML prefix, with the module-named umbrella OpenFCPXMLKitTests as 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, and Tests/README.md updated for the reporting subsystem, OpenFCPXMLKit naming, and the standardised FCPXML-prefixed test naming.

🐛 Bug Fixes

  • None in this release.

2.5.2

Choose a tag to compare

@github-actions github-actions released this 27 Mar 11:38

2.5.2 - 2026-03-27

✨ New Features

  • None in this release.

🔧 Improvements

  • Timeline test availability wording: Clarified TimelineManipulationTests availability 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) to offset in _fcpOffsetAsTimecode, aligning naming with actual semantics and reducing maintenance confusion.
  • Timestamp test redundancy removal: Removed a redundant tolerance assertion in testTimelineTimestampsInitialization now that both timestamps are intentionally injected with the same baseline value.

2.5.1

Choose a tag to compare

@github-actions github-actions released this 21 Mar 08:09

2.5.1 - 2026-03-21

✨ New Features

  • None in this release.

🔧 Improvements

  • Timeline API documentation: Clarified Timeline.insertingClipWithRipple behavior to explicitly state that clips overlapping the insertion point but starting before it are not shifted.
  • Timeline test coverage clarity: TimelineManipulationTests now 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 TimelineManipulationTests to 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 testTimelineTimestampsInitialization to use fixed injected timestamps instead of real-time clock comparisons, removing race-prone timing assertions.

2.5.0

Choose a tag to compare

@github-actions github-actions released this 16 Mar 03:51

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/: Protocols PNXMLNode, 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), and ImportOptionsTests. Updated Tests/README.md with 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 .cursorrules with cross-platform XML layer, iOS support, 686 tests, and FCPXMLStructuralValidator / PNXML naming.
  • CI: New iOS Simulator build job.

🐛 Bug Fixes

  • removeChildren(where:) index mismatch (PR #17): The default implementation previously used indices from childElements (elements only) when calling removeChild(at:) on the full children array (including text nodes), removing the wrong nodes when text/whitespace was present. It now iterates the full children array so indices match. Fixes failures in ImportOptionsTests and EventClips removal.

2.4.3

Choose a tag to compare

@github-actions github-actions released this 07 Mar 05:17

2.4.3- 2026-03-07

✨ New Features

  • None in this release.

🔧 Improvements

  • Documentation alignment: Normalized AGENT.md and .cursorrules so both files reflect the same architecture guidance, section coverage, and documentation-sync checklist terminology.
  • CLI documentation: Updated Sources/PipelineNeoCLI/README.md and manual pages (Documentation/Manual/16-CLI.md, Documentation/Manual/17-Examples.md) to use --project-version for create-project examples and option descriptions.
  • Test consistency: Updated TimelineManipulationTests.testTimelineModifiedAtUpdatesOnAutoLaneInsert to remove an unnecessary throws signature and use explicit do/catch + XCTFail for clearer failure reporting.

🐛 Bug Fixes

  • Xcode 26 dynamic linking compatibility (PR #16): Added swift-log as an explicit package dependency and Logging as a direct target dependency in Package.swift to resolve undefined Logging.Logger symbols when building Pipeline Neo as a dynamic framework under Xcode 26's stricter transitive dependency linking rules. Thanks @stovak!
  • CLI --version conflict: Resolved option-name collision between the built-in --version flag and create-project's timeline version option by renaming the create-project option from --version to --project-version. pipeline-neo --version now correctly prints the CLI tool version.

2.4.2

Choose a tag to compare

@github-actions github-actions released this 06 Mar 14:33

2.4.2 - 2026-03-06

✨ New Features

  • None in this release.

🔧 Improvements

  • Test quality: Cleaned up TimelineManipulationTests by removing an unnecessary throws from testTimelineModifiedAtUpdatesOnRippleInsert, aligning the signature with actual non-throwing behavior and reducing static analysis noise.

🐛 Bug Fixes

  • None in this release.

2.4.1

Choose a tag to compare

@github-actions github-actions released this 02 Mar 08:12

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 + DispatchSemaphore with a lock-based class (NSLock) to avoid thread exhaustion and deadlock risk when providing injectable "now" in timestamp tests; replaced XCTAssertNoThrow with do-catch and non-optional bindings for insertClipAutoLane and insertingClipAutoLane to 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 outputs standalone="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.