Move make_dcp() out of Film (#2132).
[dcpomatic.git] / src / lib / film.cc
index 296066f58756d5d48e903cea458bc1202802cebc..7cf67546ea1d504386289d579bea8e11322eb5e8 100644 (file)
 #include <boost/filesystem.hpp>
 #include <boost/regex.hpp>
 #include <unistd.h>
-#include <stdexcept>
-#include <iostream>
 #include <algorithm>
 #include <cstdlib>
 #include <iomanip>
+#include <iostream>
 #include <set>
+#include <stdexcept>
 
 #include "i18n.h"
 
@@ -155,7 +155,7 @@ int const Film::current_state_version = 38;
 
 Film::Film (optional<boost::filesystem::path> dir)
        : _playlist (new Playlist)
-       , _use_isdcf_name (true)
+       , _use_isdcf_name (Config::instance()->use_isdcf_name_by_default())
        , _dcp_content_type (Config::instance()->default_dcp_content_type ())
        , _container (Config::instance()->default_container ())
        , _resolution (Resolution::TWO_K)
@@ -377,77 +377,6 @@ Film::subtitle_analysis_path (shared_ptr<const Content> content) const
 }
 
 
-/** Add suitable Jobs to the JobManager to create a DCP for this Film.
- *  @param gui true if this is being called from a GUI tool.
- *  @param check true to check the content in the project for changes before making the DCP.
- */
-void
-Film::make_dcp (bool gui, bool check)
-{
-       if (dcp_name().find ("/") != string::npos) {
-               throw BadSettingError (_("name"), _("Cannot contain slashes"));
-       }
-
-       if (container() == nullptr) {
-               throw MissingSettingError (_("container"));
-       }
-
-       if (content().empty()) {
-               throw runtime_error (_("You must add some content to the DCP before creating it"));
-       }
-
-       if (length() == DCPTime()) {
-               throw runtime_error (_("The DCP is empty, perhaps because all the content has zero length."));
-       }
-
-       if (dcp_content_type() == nullptr) {
-               throw MissingSettingError (_("content type"));
-       }
-
-       if (name().empty()) {
-               set_name ("DCP");
-       }
-
-       for (auto i: content ()) {
-               if (!i->paths_valid()) {
-                       throw runtime_error (_("some of your content is missing"));
-               }
-               auto dcp = dynamic_pointer_cast<const DCPContent>(i);
-               if (dcp && dcp->needs_kdm()) {
-                       throw runtime_error (_("Some of your content needs a KDM"));
-               }
-               if (dcp && dcp->needs_assets()) {
-                       throw runtime_error (_("Some of your content needs an OV"));
-               }
-       }
-
-       set_isdcf_date_today ();
-
-       for (auto i: environment_info ()) {
-               LOG_GENERAL_NC (i);
-       }
-
-       for (auto i: content ()) {
-               LOG_GENERAL ("Content: %1", i->technical_summary());
-       }
-       LOG_GENERAL ("DCP video rate %1 fps", video_frame_rate());
-       if (Config::instance()->only_servers_encode ()) {
-               LOG_GENERAL_NC ("0 threads: ONLY SERVERS SET TO ENCODE");
-       } else {
-               LOG_GENERAL ("%1 threads", Config::instance()->master_encoding_threads());
-       }
-       LOG_GENERAL ("J2K bandwidth %1", j2k_bandwidth());
-
-       auto tj = make_shared<TranscodeJob>(shared_from_this());
-       tj->set_encoder (make_shared<DCPEncoder>(shared_from_this(), tj));
-       if (check) {
-               auto cc = make_shared<CheckContentChangeJob>(shared_from_this(), tj, gui);
-               JobManager::instance()->add (cc);
-       } else {
-               JobManager::instance()->add (tj);
-       }
-}
-
 /** Start a job to send our DCP to the configured TMS */
 void
 Film::send_dcp_to_tms ()
@@ -729,6 +658,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);
 
@@ -1254,6 +1220,7 @@ Film::set_isdcf_date_today ()
        _isdcf_date = boost::gregorian::day_clock::local_day ();
 }
 
+
 boost::filesystem::path
 Film::j2c_path (int reel, Frame frame, Eyes eyes, bool tmp) const
 {
@@ -1886,7 +1853,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;