Cleanup: extract encrypt() call from Film::make_kdm().
[dcpomatic.git] / src / lib / film.cc
index e021c0aa91801949a980d85242b7b2af96f7e8bd..8e409fc696fd114fe569bb1a25f07fee286571f0 100644 (file)
@@ -32,6 +32,7 @@
 #include "cinema.h"
 #include "compose.hpp"
 #include "config.h"
+#include "constants.h"
 #include "cross.h"
 #include "dcp_content.h"
 #include "dcp_content_type.h"
@@ -56,7 +57,6 @@
 #include "text_content.h"
 #include "transcode_job.h"
 #include "upload_job.h"
-#include "util.h"
 #include "video_content.h"
 #include "version.h"
 #include <libcxml/cxml.h>
@@ -174,6 +174,7 @@ Film::Film (optional<boost::filesystem::path> dir)
        , _user_explicit_container (false)
        , _user_explicit_resolution (false)
        , _name_language (dcp::LanguageTag("en-US"))
+       , _release_territory(Config::instance()->default_territory())
        , _version_number (1)
        , _status (dcp::Status::FINAL)
        , _audio_language(Config::instance()->default_audio_language())
@@ -631,7 +632,7 @@ Film::read_metadata (optional<boost::filesystem::path> path)
                _sign_language_video_language = dcp::LanguageTag(*sign_language_video_language);
        }
 
-       _version_number = f.optional_number_child<int>("VersionNumber").get_value_or(0);
+       _version_number = f.optional_number_child<int>("VersionNumber").get_value_or(1);
 
        auto status = f.optional_string_child("Status");
        if (status) {
@@ -808,6 +809,11 @@ Film::isdcf_name (bool if_created_now) const
 
        auto raw_name = name ();
 
+       auto to_upper = [](string s) {
+               transform(s.begin(), s.end(), s.begin(), ::toupper);
+               return s;
+       };
+
        /* Split the raw name up into words */
        vector<string> words;
        split (words, raw_name, is_any_of (" _-"));
@@ -902,13 +908,14 @@ Film::isdcf_name (bool if_created_now) const
                isdcf_name += "_" + container()->isdcf_name();
        }
 
+       auto content_list = content();
+
        /* XXX: this uses the first bit of content only */
 
        /* Interior aspect ratio.  The standard says we don't do this for trailers, for some strange reason */
        if (dcp_content_type() && dcp_content_type()->libdcp_kind() != dcp::ContentKind::TRAILER) {
-               auto cl = content();
-               auto first_video = std::find_if(cl.begin(), cl.end(), [](shared_ptr<Content> c) { return static_cast<bool>(c->video); });
-               if (first_video != cl.end()) {
+               auto first_video = std::find_if(content_list.begin(), content_list.end(), [](shared_ptr<Content> c) { return static_cast<bool>(c->video); });
+               if (first_video != content_list.end()) {
                        auto first_ratio = lrintf((*first_video)->video->scaled_size(frame_size()).ratio() * 100);
                        auto container_ratio = lrintf(container()->ratio() * 100);
                        if (first_ratio != container_ratio) {
@@ -938,7 +945,7 @@ Film::isdcf_name (bool if_created_now) const
 
        auto burnt_in = true;
        auto ccap = false;
-       for (auto i: content()) {
+       for (auto i: content_list) {
                for (auto j: i->text) {
                        if (j->type() == TextType::OPEN_SUBTITLE && j->use() && !j->burn()) {
                                burnt_in = false;
@@ -969,9 +976,7 @@ Film::isdcf_name (bool if_created_now) const
        if (_release_territory) {
                auto territory = _release_territory->subtag();
                isdcf_name += "_" + to_upper (territory);
-               if (_ratings.empty ()) {
-                       isdcf_name += "-NR";
-               } else {
+               if (!_ratings.empty()) {
                        auto label = _ratings[0].label;
                        boost::erase_all(label, "+");
                        boost::erase_all(label, "-");
@@ -997,6 +1002,10 @@ Film::isdcf_name (bool if_created_now) const
                isdcf_name += "-VI";
        }
 
+       if (find_if(content_list.begin(), content_list.end(), [](shared_ptr<Content> c) { return static_cast<bool>(c->atmos); }) != content_list.end()) {
+               isdcf_name += "-ATMOS";
+       }
+
        isdcf_name += "_" + resolution_to_string (_resolution);
 
        if (_studio && _studio->length() >= 2) {
@@ -1024,7 +1033,7 @@ Film::isdcf_name (bool if_created_now) const
        }
 
        auto vf = false;
-       for (auto i: content()) {
+       for (auto i: content_list) {
                auto dc = dynamic_pointer_cast<const DCPContent>(i);
                if (!dc) {
                        continue;
@@ -1625,37 +1634,18 @@ Film::active_area () const
 }
 
 
-/** @param recipient KDM recipient certificate.
- *  @param trusted_devices Certificate thumbprints of other trusted devices (can be empty).
- *  @param cpl_file CPL filename.
+/*  @param cpl_file CPL filename.
  *  @param from KDM from time expressed as a local time with an offset from UTC.
  *  @param until KDM to time expressed as a local time with an offset from UTC.
- *  @param formulation KDM formulation to use.
- *  @param disable_forensic_marking_picture true to disable forensic marking of picture.
- *  @param disable_forensic_marking_audio if not set, don't disable forensic marking of audio.  If set to 0,
- *  disable all forensic marking; if set above 0, disable forensic marking above that channel.
  */
-dcp::EncryptedKDM
-Film::make_kdm (
-       dcp::Certificate recipient,
-       vector<string> trusted_devices,
-       boost::filesystem::path cpl_file,
-       dcp::LocalTime from,
-       dcp::LocalTime until,
-       dcp::Formulation formulation,
-       bool disable_forensic_marking_picture,
-       optional<int> disable_forensic_marking_audio
-       ) const
+dcp::DecryptedKDM
+Film::make_kdm(boost::filesystem::path cpl_file, dcp::LocalTime from, dcp::LocalTime until) const
 {
        if (!_encrypted) {
                throw runtime_error (_("Cannot make a KDM as this project is not encrypted."));
        }
 
        auto cpl = make_shared<dcp::CPL>(cpl_file);
-       auto signer = Config::instance()->signer_chain();
-       if (!signer->valid ()) {
-               throw InvalidSignerError ();
-       }
 
        /* Find keys that have been added to imported, encrypted DCP content */
        list<dcp::DecryptedKDMKey> imported_keys;
@@ -1694,7 +1684,7 @@ Film::make_kdm (
 
        return dcp::DecryptedKDM (
                cpl->id(), keys, from, until, cpl->content_title_text(), cpl->content_title_text(), dcp::LocalTime().as_string()
-               ).encrypt (signer, recipient, trusted_devices, formulation, disable_forensic_marking_picture, disable_forensic_marking_audio);
+               );
 }