+ switch (_resolution) {
+ case RESOLUTION_2K:
+ return libdcp::Size (2048, 1080);
+ case RESOLUTION_4K:
+ return libdcp::Size (4096, 2160);
+ }
+
+ assert (false);
+ return libdcp::Size ();
+}
+
+libdcp::KDM
+Film::make_kdm (
+ shared_ptr<libdcp::Certificate> target,
+ boost::posix_time::ptime from,
+ boost::posix_time::ptime until
+ ) const
+{
+ shared_ptr<const Signer> signer = make_signer ();
+
+ /* Find the DCP to make the KDM for */
+ string const dir = this->directory ();
+ list<boost::filesystem::path> dcps;
+ for (boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator(dir); i != boost::filesystem::directory_iterator(); ++i) {
+ if (boost::filesystem::is_directory (*i) && i->path().leaf() != "j2c" && i->path().leaf() != "video" && i->path().leaf() != "info") {
+ dcps.push_back (i->path());
+ }
+ }
+
+ if (dcps.empty()) {
+ throw KDMError (_("Could not find DCP to make KDM for"));
+ } else if (dcps.size() > 1) {
+ throw KDMError (_("More than one possible DCP to make KDM for"));
+ }
+
+ libdcp::DCP dcp (dcps.front ());
+
+ try {
+ dcp.read ();
+ } catch (...) {
+ throw KDMError (_("Could not read DCP to make KDM for"));
+ }
+
+ time_t now = time (0);
+ struct tm* tm = localtime (&now);
+ string const issue_date = libdcp::tm_to_string (tm);
+
+ dcp.cpls().front()->set_mxf_keys (key ());
+
+ return libdcp::KDM (dcp.cpls().front(), signer, target, from, until, "DCP-o-matic", issue_date);
+}
+
+list<libdcp::KDM>
+Film::make_kdms (
+ list<shared_ptr<Screen> > screens,
+ boost::posix_time::ptime from,
+ boost::posix_time::ptime until
+ ) const
+{
+ list<libdcp::KDM> kdms;
+
+ for (list<shared_ptr<Screen> >::iterator i = screens.begin(); i != screens.end(); ++i) {
+ kdms.push_back (make_kdm ((*i)->certificate, from, until));
+ }
+
+ return kdms;