Updated cs_CZ translation from Tomáš Begeni.
[dcpomatic.git] / src / lib / kdm_with_metadata.cc
index a826327ca1bff8f692f019cb0d178663de1baa8d..f7ff8443536d8ad7cfa92b70c082946d461beb17 100644 (file)
 #include "config.h"
 #include "cross.h"
 #include "dcpomatic_log.h"
-#include "emailer.h"
+#include "email.h"
 #include "kdm_with_metadata.h"
 #include "screen.h"
 #include "util.h"
 #include "zipper.h"
 #include <dcp/file.h>
+#include <dcp/filesystem.h>
 
 #include "i18n.h"
 
@@ -38,6 +39,7 @@ using std::function;
 using std::list;
 using std::shared_ptr;
 using std::string;
+using std::vector;
 using boost::optional;
 
 
@@ -61,14 +63,14 @@ write_files (
                return written;
        }
 
-       if (!boost::filesystem::exists (directory)) {
-               boost::filesystem::create_directories (directory);
+       if (!dcp::filesystem::exists(directory)) {
+               dcp::filesystem::create_directories(directory);
        }
 
        /* Write KDMs to the specified directory */
        for (auto i: kdms) {
-               auto out = dcp::fix_long_path(directory / careful_string_filter(name_format.get(i->name_values(), ".xml")));
-               if (!boost::filesystem::exists (out) || confirm_overwrite (out)) {
+               auto out = directory / careful_string_filter(name_format.get(i->name_values(), ".xml"));
+               if (!dcp::filesystem::exists(out) || confirm_overwrite(out)) {
                        i->kdm_as_xml (out);
                        ++written;
                }
@@ -149,11 +151,11 @@ write_directories (
        for (auto const& kdm: kdms) {
                auto path = directory;
                path /= container_name_format.get(kdm.front()->name_values(), "", "s");
-               if (!boost::filesystem::exists (path) || confirm_overwrite (path)) {
-                       boost::filesystem::create_directories (path);
+               if (!dcp::filesystem::exists(path) || confirm_overwrite(path)) {
+                       dcp::filesystem::create_directories(path);
                        write_files(kdm, path, filename_format, confirm_overwrite);
+                       written += kdm.size();
                }
-               written += kdm.size();
        }
 
        return written;
@@ -175,10 +177,10 @@ write_zip_files (
        for (auto const& kdm: kdms) {
                auto path = directory;
                path /= container_name_format.get(kdm.front()->name_values(), ".zip", "s");
-               if (!boost::filesystem::exists (path) || confirm_overwrite (path)) {
-                       if (boost::filesystem::exists (path)) {
+               if (!dcp::filesystem::exists(path) || confirm_overwrite(path)) {
+                       if (dcp::filesystem::exists(path)) {
                                /* Creating a new zip file over an existing one is an error */
-                               boost::filesystem::remove (path);
+                               dcp::filesystem::remove(path);
                        }
                        make_zip_file(kdm, path, filename_format);
                        written += kdm.size();
@@ -201,25 +203,26 @@ send_emails (
        list<list<KDMWithMetadataPtr>> kdms,
        dcp::NameFormat container_name_format,
        dcp::NameFormat filename_format,
-       string cpl_name
+       string cpl_name,
+       vector<string> extra_addresses
        )
 {
        auto config = Config::instance ();
 
        if (config->mail_server().empty()) {
-               throw NetworkError (_("No mail server configured in preferences"));
+               throw MissingConfigurationError(_("No outgoing mail server configured in the Email tab of preferences"));
+       }
+
+       if (config->kdm_from().empty()) {
+               throw MissingConfigurationError(_("No from address configured in the KDM Email tab of preferences"));
        }
 
        for (auto const& kdms_for_cinema: kdms) {
 
                auto first = kdms_for_cinema.front();
 
-               if (first->emails().empty()) {
-                       continue;
-               }
-
                auto zip_file = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path();
-               boost::filesystem::create_directories (zip_file);
+               dcp::filesystem::create_directories(zip_file);
                zip_file /= container_name_format.get(first->name_values(), ".zip");
                make_zip_file (kdms_for_cinema, zip_file, filename_format);
 
@@ -235,16 +238,26 @@ send_emails (
                auto subject = substitute_variables(config->kdm_subject());
                auto body = substitute_variables(config->kdm_email());
 
-               string screens;
+               vector<string> screens;
                for (auto kdm: kdms_for_cinema) {
-                       auto screen_name = kdm->get('s');
-                       if (screen_name) {
-                               screens += *screen_name + ", ";
+                       if (auto screen_name = kdm->get('s')) {
+                               screens.push_back(*screen_name);
                        }
                }
-               boost::algorithm::replace_all (body, "$SCREENS", screens.substr (0, screens.length() - 2));
+               boost::algorithm::replace_all(body, "$SCREENS", screen_names_to_string(screens));
+
+               auto emails = first->emails();
+               std::copy(extra_addresses.begin(), extra_addresses.end(), std::back_inserter(emails));
+               if (emails.empty()) {
+                       continue;
+               }
 
-               Emailer email (config->kdm_from(), first->emails(), subject, body);
+               Email email(config->kdm_from(), { emails.front() }, subject, body);
+
+               /* Use CC for the second and subsequent email addresses, so we seem less spammy (#2310) */
+               for (auto cc = std::next(emails.begin()); cc != emails.end(); ++cc) {
+                       email.add_cc(*cc);
+               }
 
                for (auto cc: config->kdm_cc()) {
                        email.add_cc (cc);
@@ -254,23 +267,22 @@ send_emails (
                }
 
                email.add_attachment (zip_file, container_name_format.get(first->name_values(), ".zip"), "application/zip");
+               dcp::filesystem::remove(zip_file);
+
+               auto log_details = [](Email& email) {
+                       dcpomatic_log->log("Email content follows", LogEntry::TYPE_DEBUG_EMAIL);
+                       dcpomatic_log->log(email.email(), LogEntry::TYPE_DEBUG_EMAIL);
+                       dcpomatic_log->log("Email session follows", LogEntry::TYPE_DEBUG_EMAIL);
+                       dcpomatic_log->log(email.notes(), LogEntry::TYPE_DEBUG_EMAIL);
+               };
 
                try {
                        email.send (config->mail_server(), config->mail_port(), config->mail_protocol(), config->mail_user(), config->mail_password());
                } catch (...) {
-                       boost::filesystem::remove (zip_file);
-                       dcpomatic_log->log ("Email content follows", LogEntry::TYPE_DEBUG_EMAIL);
-                       dcpomatic_log->log (email.email(), LogEntry::TYPE_DEBUG_EMAIL);
-                       dcpomatic_log->log ("Email session follows", LogEntry::TYPE_DEBUG_EMAIL);
-                       dcpomatic_log->log (email.notes(), LogEntry::TYPE_DEBUG_EMAIL);
+                       log_details (email);
                        throw;
                }
 
-               boost::filesystem::remove (zip_file);
-
-               dcpomatic_log->log ("Email content follows", LogEntry::TYPE_DEBUG_EMAIL);
-               dcpomatic_log->log (email.email(), LogEntry::TYPE_DEBUG_EMAIL);
-               dcpomatic_log->log ("Email session follows", LogEntry::TYPE_DEBUG_EMAIL);
-               dcpomatic_log->log (email.notes(), LogEntry::TYPE_DEBUG_EMAIL);
+               log_details (email);
        }
 }