From 3c59d07d90e85355e320ed6d30efa30242ed6c31 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 2 Jun 2021 00:33:01 +0200 Subject: [PATCH] Pass through CompositionMetadataAsset correctly. We weren't saving Id, and were not quite handling FullContentText correctly. --- src/cpl.cc | 6 ++++-- src/cpl.h | 4 ++++ test/combine_test.cc | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/cpl.cc b/src/cpl.cc index 0eb25052..20d22b65 100644 --- a/src/cpl.cc +++ b/src/cpl.cc @@ -237,6 +237,8 @@ CPL::write_xml (boost::filesystem::path file, shared_ptr void CPL::read_composition_metadata_asset (cxml::ConstNodePtr node) { + _cpl_metadata_id = remove_urn_uuid(node->string_child("Id")); + auto fctt = node->node_child("FullContentTitleText"); _full_content_title_text = fctt->content(); _full_content_title_text_language = fctt->optional_string_attribute("language"); @@ -337,14 +339,14 @@ CPL::maybe_write_composition_metadata_asset (xmlpp::Element* node) const auto meta = node->add_child("meta:CompositionMetadataAsset"); meta->set_namespace_declaration (cpl_metadata_ns, "meta"); - meta->add_child("Id")->add_child_text("urn:uuid:" + make_uuid()); + meta->add_child("Id")->add_child_text("urn:uuid:" + _cpl_metadata_id); auto mp = _reels.front()->main_picture(); meta->add_child("EditRate")->add_child_text(mp->edit_rate().as_string()); meta->add_child("IntrinsicDuration")->add_child_text(raw_convert(mp->intrinsic_duration())); auto fctt = meta->add_child("FullContentTitleText", "meta"); - if (_full_content_title_text) { + if (_full_content_title_text && !_full_content_title_text->empty()) { fctt->add_child_text (*_full_content_title_text); } if (_full_content_title_text_language) { diff --git a/src/cpl.h b/src/cpl.h index 797c49d2..9c85dccd 100644 --- a/src/cpl.h +++ b/src/cpl.h @@ -323,6 +323,10 @@ private: ContentKind _content_kind; ///< <ContentKind> std::vector _content_versions; std::vector _ratings; + /** ID for CompositionMetadataAsset tag; either a random one, ready for writing a new tag, + * or the one read in from the existing CPL. + */ + std::string _cpl_metadata_id = make_uuid(); /** Human-readable name of the composition, without any metadata (i.e. no -FTR-EN-XX- etc.) */ boost::optional _full_content_title_text; boost::optional _full_content_title_text_language; diff --git a/test/combine_test.cc b/test/combine_test.cc index 0dcfd2d3..e1512e41 100644 --- a/test/combine_test.cc +++ b/test/combine_test.cc @@ -397,5 +397,21 @@ BOOST_AUTO_TEST_CASE (combine_two_dcps_with_duplicated_asset) } +BOOST_AUTO_TEST_CASE (check_cpls_unchanged_after_combine) +{ + boost::filesystem::path in = "build/test/combine_one_dcp_with_composition_metadata_in"; + boost::filesystem::path out = "build/test/combine_one_dcp_with_composition_metadata_out"; + auto dcp = make_simple (in); + dcp->write_xml (); + + dcp::combine ({in}, out); + + BOOST_REQUIRE_EQUAL (dcp->cpls().size(), 1U); + auto cpl = dcp->cpls()[0]->file(); + BOOST_REQUIRE (cpl); + check_file (*cpl, out / cpl->filename()); +} + + /* XXX: same CPL names */ /* XXX: Interop PNG subs */ -- 2.30.2