out (" -e, --email email KDMs to cinemas");
out (" -z, --zip ZIP each cinema's KDMs into its own file");
out (" -v, --verbose be verbose");
- out (" -c, --cinema specify a cinema, either by name or email address");
- out (" -S, --screen screen description");
+ out (" -c, --cinema cinema name (when using -C) or name/email (to filter cinemas)");
+ out (" -S, --screen screen name (when using -C) or screen name (to filter screens when using -c)");
out (" -C, --certificate file containing projector certificate");
out (" -T, --trusted-device file containing a trusted device's certificate");
out (" --list-cinemas list known cinemas from the DCP-o-matic settings");
}
write_files (kdms, zip, output, container_name_format, filename_format, verbose, out);
if (email) {
- send_emails ({kdms}, container_name_format, filename_format, film->dcp_name());
+ send_emails ({kdms}, container_name_format, filename_format, film->dcp_name(), {});
}
} catch (FileError& e) {
throw KDMCLIError (String::compose("%1 (%2)", e.what(), e.file().string()));
continue;
}
- dcp::LocalTime begin(valid_from, i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute());
- dcp::LocalTime end(valid_to, i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute());
+ int const offset_hour = i->cinema ? i->cinema->utc_offset_hour() : 0;
+ int const offset_minute = i->cinema ? i->cinema->utc_offset_minute() : 0;
+
+ dcp::LocalTime begin(valid_from, dcp::UTCOffset(offset_hour, offset_minute));
+ dcp::LocalTime end(valid_to, dcp::UTCOffset(offset_hour, offset_minute));
auto const kdm = kdm_from_dkdm(
dkdm,
);
dcp::NameFormat::Map name_values;
- name_values['c'] = i->cinema->name;
+ name_values['c'] = i->cinema ? i->cinema->name : "";
name_values['s'] = i->name;
- name_values['f'] = dkdm.annotation_text().get_value_or("");
+ name_values['f'] = kdm.content_title_text();
name_values['b'] = begin.date() + " " + begin.time_of_day(true, false);
name_values['e'] = end.date() + " " + end.time_of_day(true, false);
name_values['i'] = kdm.cpl_id();
- kdms.push_back (make_shared<KDMWithMetadata>(name_values, i->cinema.get(), i->cinema->emails, kdm));
+ kdms.push_back (make_shared<KDMWithMetadata>(name_values, i->cinema.get(), i->cinema ? i->cinema->emails : list<string>(), kdm));
}
write_files (kdms, zip, output, container_name_format, filename_format, verbose, out);
if (email) {
- send_emails ({kdms}, container_name_format, filename_format, dkdm.annotation_text().get_value_or(""));
+ send_emails ({kdms}, container_name_format, filename_format, dkdm.annotation_text().get_value_or(""), {});
}
} catch (FileError& e) {
throw KDMCLIError (String::compose("%1 (%2)", e.what(), e.file().string()));
kdm_cli (int argc, char* argv[], std::function<void (string)> out)
try
{
- boost::filesystem::path output = ".";
+ boost::filesystem::path output = boost::filesystem::current_path();
auto container_name_format = Config::instance()->kdm_container_name_format();
auto filename_format = Config::instance()->kdm_filename_format();
optional<string> cinema_name;
shared_ptr<Cinema> cinema;
- string screen_description;
+ optional<boost::filesystem::path> certificate;
+ optional<string> screen;
list<shared_ptr<Screen>> screens;
optional<dcp::EncryptedKDM> dkdm;
optional<boost::posix_time::ptime> valid_from;
program_name = argv[0];
+ /* Reset getopt() so we can call this method several times in one test process */
+ optind = 1;
+
int option_index = 0;
while (true) {
static struct option long_options[] = {
cinema = make_shared<Cinema>(optarg, list<string>(), "", 0, 0);
break;
case 'S':
- screen_description = optarg;
+ /* Similarly, this could be the name of a new (temporary) screen or the name of a screen
+ * to search for.
+ */
+ screen = optarg;
break;
case 'C':
- {
- /* Make a new screen and add it to the current cinema */
- dcp::CertificateChain chain (dcp::file_to_string(optarg));
- auto screen = make_shared<Screen>(screen_description, "", chain.leaf(), vector<TrustedDevice>());
- if (cinema) {
- cinema->add_screen (screen);
- }
- screens.push_back (screen);
+ certificate = optarg;
break;
- }
case 'T':
/* A trusted device ends up in the last screen we made */
if (!screens.empty ()) {
}
}
+ if (certificate) {
+ /* Make a new screen and add it to the current cinema */
+ dcp::CertificateChain chain(dcp::file_to_string(*certificate));
+ auto screen_to_add = std::make_shared<Screen>(screen.get_value_or(""), "", chain.leaf(), boost::none, vector<TrustedDevice>());
+ if (cinema) {
+ cinema->add_screen(screen_to_add);
+ }
+ screens.push_back(screen_to_add);
+ }
+
if (list_cinemas) {
auto cinemas = Config::instance()->cinemas ();
for (auto i: cinemas) {
}
screens = find_cinema (*cinema_name)->screens ();
+ if (screen) {
+ screens.erase(std::remove_if(screens.begin(), screens.end(), [&screen](shared_ptr<Screen> s) { return s->name != *screen; }), screens.end());
+ }
}
if (duration_string) {
valid_to = valid_from.get() + duration_from_string (*duration_string);
}
- dcpomatic_setup_path_encoding ();
- dcpomatic_setup ();
-
if (verbose) {
out (String::compose("Making KDMs valid from %1 to %2", boost::posix_time::to_simple_string(valid_from.get()), boost::posix_time::to_simple_string(valid_to.get())));
}