Don't import luminance of 0 from 2.14.x metadata files (part of #2130).
[dcpomatic.git] / src / lib / film.cc
index 7dadd8bea9ca29c9c1f67b5c518040dd6a4a0376..64fc04f5ddbcbc4172502b443bab05ca32617857 100644 (file)
@@ -59,6 +59,7 @@
 #include "upload_job.h"
 #include "util.h"
 #include "video_content.h"
+#include "version.h"
 #include <libcxml/cxml.h>
 #include <dcp/certificate_chain.h>
 #include <dcp/cpl.h>
@@ -111,7 +112,9 @@ using namespace boost::placeholders;
 using dcp::raw_convert;
 using namespace dcpomatic;
 
-string const Film::metadata_file = "metadata.xml";
+
+static constexpr char metadata_file[] = "metadata.xml";
+
 
 /* 5 -> 6
  * AudioMapping XML changed.
@@ -459,6 +462,9 @@ Film::metadata (bool with_content_paths) const
        auto root = doc->create_root_node ("Metadata");
 
        root->add_child("Version")->add_child_text (raw_convert<string> (current_state_version));
+       auto last_write = root->add_child("LastWrittenBy");
+       last_write->add_child_text (dcpomatic_version);
+       last_write->set_attribute("git", dcpomatic_git_commit);
        root->add_child("Name")->add_child_text (_name);
        root->add_child("UseISDCFName")->add_child_text (_use_isdcf_name ? "1" : "0");
 
@@ -723,6 +729,43 @@ Film::read_metadata (optional<boost::filesystem::path> path)
                _audio_language = dcp::LanguageTag(*audio_language);
        }
 
+       /* Read the old ISDCFMetadata tag from 2.14.x metadata */
+       auto isdcf = f.optional_node_child("ISDCFMetadata");
+       if (isdcf) {
+               if (auto territory = isdcf->optional_string_child("Territory")) {
+                       try {
+                               _release_territory = dcp::LanguageTag::RegionSubtag(*territory);
+                       } catch (...) {
+                               /* Invalid region subtag; just ignore it */
+                       }
+               }
+               if (auto audio_language = isdcf->optional_string_child("AudioLanguage")) {
+                       try {
+                               _audio_language = dcp::LanguageTag(*audio_language);
+                       } catch (...) {
+                               /* Invalid language tag; just ignore it */
+                       }
+               }
+               if (auto content_version = isdcf->optional_string_child("ContentVersion")) {
+                       _content_versions.push_back (*content_version);
+               }
+               if (auto rating = isdcf->optional_string_child("Rating")) {
+                       _ratings.push_back (dcp::Rating("", *rating));
+               }
+               if (auto mastered_luminance = isdcf->optional_number_child<float>("MasteredLuminance")) {
+                       if (*mastered_luminance > 0) {
+                               _luminance = dcp::Luminance(*mastered_luminance, dcp::Luminance::Unit::FOOT_LAMBERT);
+                       }
+               }
+               _studio = isdcf->optional_string_child("Studio");
+               _facility = isdcf->optional_string_child("Facility");
+               _temp_version = isdcf->optional_bool_child("TempVersion").get_value_or("false");
+               _pre_release = isdcf->optional_bool_child("PreRelease").get_value_or("false");
+               _red_band = isdcf->optional_bool_child("RedBand").get_value_or("false");
+               _two_d_version_of_three_d = isdcf->optional_bool_child("TwoDVersionOfThreeD").get_value_or("false");
+               _chain = isdcf->optional_string_child("Chain");
+       }
+
        list<string> notes;
        _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"), _state_version, notes);
 
@@ -1880,7 +1923,7 @@ void
 Film::use_template (string name)
 {
        _template_film.reset (new Film (optional<boost::filesystem::path>()));
-       _template_film->read_metadata (Config::instance()->template_path (name));
+       _template_film->read_metadata (Config::instance()->template_read_path(name));
        _use_isdcf_name = _template_film->_use_isdcf_name;
        _dcp_content_type = _template_film->_dcp_content_type;
        _container = _template_film->_container;