X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fkdm_cli.cc;h=a76155a2c8d8a4bd6ad17bbe9f508e5fb7561c59;hb=1671e097a24cd169f1ad4ea89b0cb3ae105b1e70;hp=e89da6e373913757df420164fd494cd37eaf01be;hpb=d5d9e143a5778928c5f386a7bd9cb140d4f1191a;p=dcpomatic.git diff --git a/src/lib/kdm_cli.cc b/src/lib/kdm_cli.cc index e89da6e37..a76155a2c 100644 --- a/src/lib/kdm_cli.cc +++ b/src/lib/kdm_cli.cc @@ -70,8 +70,8 @@ help (std::function out) 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"); @@ -250,7 +250,7 @@ from_film ( } 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())); @@ -357,8 +357,8 @@ from_dkdm ( 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, offset_hour, offset_minute); - dcp::LocalTime end(valid_to, offset_hour, offset_minute); + 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, @@ -383,7 +383,7 @@ from_dkdm ( } 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())); @@ -422,7 +422,8 @@ try auto filename_format = Config::instance()->kdm_filename_format(); optional cinema_name; shared_ptr cinema; - string screen_description; + optional certificate; + optional screen; list> screens; optional dkdm; optional valid_from; @@ -439,6 +440,9 @@ try 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[] = { @@ -534,19 +538,14 @@ try cinema = make_shared(optarg, list(), "", 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 = std::make_shared(screen_description, "", chain.leaf(), boost::none, vector()); - 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 ()) { @@ -562,6 +561,16 @@ try } } + 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.get_value_or(""), "", chain.leaf(), boost::none, vector()); + 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) { @@ -593,6 +602,9 @@ try } screens = find_cinema (*cinema_name)->screens (); + if (screen) { + screens.erase(std::remove_if(screens.begin(), screens.end(), [&screen](shared_ptr s) { return s->name != *screen; }), screens.end()); + } } if (duration_string) {