Don't offer to make KDMs for CPLs with no encrypted assets (#1490).
authorCarl Hetherington <cth@carlh.net>
Fri, 15 Mar 2019 12:18:10 +0000 (12:18 +0000)
committerCarl Hetherington <cth@carlh.net>
Fri, 15 Mar 2019 12:18:10 +0000 (12:18 +0000)
src/lib/film.cc
src/lib/types.cc
src/lib/types.h
src/wx/kdm_cpl_panel.cc
src/wx/kdm_dialog.cc

index f1d066f..76cd8da 100644 (file)
@@ -92,6 +92,7 @@ using std::runtime_error;
 using std::copy;
 using std::back_inserter;
 using std::map;
+using std::exception;
 using boost::shared_ptr;
 using boost::weak_ptr;
 using boost::dynamic_pointer_cast;
@@ -1055,17 +1056,7 @@ Film::cpls () const
                        ) {
 
                        try {
-                               dcp::DCP dcp (*i);
-                               dcp.read ();
-                               DCPOMATIC_ASSERT (dcp.cpls().front()->file());
-                               out.push_back (
-                                       CPLSummary (
-                                               i->path().leaf().string(),
-                                               dcp.cpls().front()->id(),
-                                               dcp.cpls().front()->annotation_text(),
-                                               dcp.cpls().front()->file().get()
-                                               )
-                                       );
+                               out.push_back (CPLSummary(*i));
                        } catch (...) {
 
                        }
index 898abec..ee36431 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2018 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 #include "compose.hpp"
 #include "dcpomatic_assert.h"
 #include <dcp/raw_convert.h>
+#include <dcp/cpl.h>
+#include <dcp/dcp.h>
+#include <dcp/reel_mxf.h>
+#include <dcp/reel_asset.h>
 #include <libxml++/libxml++.h>
 #include <libcxml/cxml.h>
+#include <boost/foreach.hpp>
 
 #include "i18n.h"
 
@@ -183,3 +188,24 @@ string_to_video_frame_type (string s)
 
        DCPOMATIC_ASSERT (false);
 }
+
+CPLSummary::CPLSummary (boost::filesystem::path p)
+       : dcp_directory (p.leaf().string())
+{
+       dcp::DCP dcp (p);
+       dcp.read ();
+
+       cpl_id = dcp.cpls().front()->id();
+       cpl_annotation_text = dcp.cpls().front()->annotation_text();
+       cpl_file = dcp.cpls().front()->file().get();
+
+       encrypted = false;
+       BOOST_FOREACH (shared_ptr<dcp::CPL> j, dcp.cpls()) {
+               BOOST_FOREACH (shared_ptr<const dcp::ReelAsset> k, j->reel_assets()) {
+                       shared_ptr<const dcp::ReelMXF> mxf = boost::dynamic_pointer_cast<const dcp::ReelMXF> (k);
+                       if (mxf && mxf->key_id()) {
+                               encrypted = true;
+                       }
+               }
+       }
+}
index 607c9e2..3c9a802 100644 (file)
@@ -205,17 +205,22 @@ struct Crop
 
 struct CPLSummary
 {
-       CPLSummary (std::string d, std::string i, std::string a, boost::filesystem::path f)
+       CPLSummary (boost::filesystem::path p);
+
+       CPLSummary (std::string d, std::string i, std::string a, boost::filesystem::path f, bool e)
                : dcp_directory (d)
                , cpl_id (i)
                , cpl_annotation_text (a)
                , cpl_file (f)
+               , encrypted (e)
        {}
 
        std::string dcp_directory;
        std::string cpl_id;
        std::string cpl_annotation_text;
        boost::filesystem::path cpl_file;
+       /** true if this CPL has any encrypted assets */
+       bool encrypted;
 };
 
 extern bool operator== (Crop const & a, Crop const & b);
index db05db2..341b5f7 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2015-2018 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2015-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -23,6 +23,7 @@
 #include "static_text.h"
 #include "dcpomatic_button.h"
 #include <libcxml/cxml.h>
+#include <boost/foreach.hpp>
 
 using std::vector;
 
@@ -67,8 +68,8 @@ KDMCPLPanel::update_cpl_choice ()
 {
        _cpl->Clear ();
 
-       for (vector<CPLSummary>::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) {
-               _cpl->Append (std_to_wx (i->cpl_id));
+       BOOST_FOREACH (CPLSummary const & i, _cpls) {
+               _cpl->Append (std_to_wx(i.cpl_id));
 
                if (_cpls.size() > 0) {
                        _cpl->SetSelection (0);
@@ -109,13 +110,33 @@ KDMCPLPanel::cpl_browse_clicked ()
        cxml::Document cpl_document ("CompositionPlaylist");
        cpl_document.read_file (cpl_file);
 
+       bool encrypted = false;
+       BOOST_FOREACH (cxml::ConstNodePtr i, cpl_document.node_children("ReelList")) {
+               BOOST_FOREACH (cxml::ConstNodePtr j, i->node_children("Reel")) {
+                       BOOST_FOREACH (cxml::ConstNodePtr k, j->node_children("AssetList")) {
+                               BOOST_FOREACH (cxml::ConstNodePtr l, k->node_children()) {
+                                       if (!l->node_children("KeyId").empty()) {
+                                               encrypted = true;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       if (!encrypted) {
+               /* XXX: this needs to be marked translatable after 2.14.0 */
+               error_dialog (this, wxT("This CPL contains no encrypted assets."));
+               return;
+       }
+
        try {
                _cpls.push_back (
                        CPLSummary (
                                dcp_dir.filename().string(),
                                cpl_document.string_child("Id").substr (9),
-                               cpl_document.string_child ("ContentTitleText"),
-                               cpl_file
+                               cpl_document.string_child("ContentTitleText"),
+                               cpl_file,
+                               encrypted
                                )
                        );
        } catch (cxml::Error) {
index c31e6f6..920f54a 100644 (file)
@@ -87,7 +87,15 @@ KDMDialog::KDMDialog (wxWindow* parent, shared_ptr<const Film> film)
        h = new StaticText (this, _("CPL"));
        h->SetFont (subheading_font);
        right->Add (h, 0, wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_Y_GAP * 2);
-       _cpl = new KDMCPLPanel (this, film->cpls ());
+
+       vector<CPLSummary> cpls;
+       BOOST_FOREACH (CPLSummary const & i, film->cpls()) {
+               if (i.encrypted) {
+                       cpls.push_back (i);
+               }
+       }
+
+       _cpl = new KDMCPLPanel (this, cpls);
        right->Add (_cpl, 0, wxEXPAND);
 
        /* Sub-heading: Output */