diff options
| author | Carl Hetherington <cth@carlh.net> | 2025-08-22 21:50:00 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2025-08-25 08:47:42 +0200 |
| commit | 99a191c599724ee8bab43146f9ea5da388c10225 (patch) | |
| tree | 74146db5ab45cec449a396bf6a08b7828fc0e788 /src/lib/cover_sheet.cc | |
| parent | 07efa1af2aafabe6c98098adf2bcfd5cff5f9191 (diff) | |
Move write_cover_sheet() out to its own file.
Diffstat (limited to 'src/lib/cover_sheet.cc')
| -rw-r--r-- | src/lib/cover_sheet.cc | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/lib/cover_sheet.cc b/src/lib/cover_sheet.cc new file mode 100644 index 000000000..43a749682 --- /dev/null +++ b/src/lib/cover_sheet.cc @@ -0,0 +1,111 @@ +/* + Copyright (C) 2025 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#include "config.h" +#include "cover_sheet.h" +#include "dcp_content_type.h" +#include "film.h" +#include <dcp/file.h> +#include <dcp/filesystem.h> +#include <dcp/locale_convert.h> +#include <boost/algorithm/string.hpp> + +#include "i18n.h" + + +using std::shared_ptr; +using std::string; + + +void +dcpomatic::write_cover_sheet(shared_ptr<const Film> film, boost::filesystem::path dcp_directory, boost::filesystem::path output) +{ + dcp::File file(output, "w"); + if (!file) { + throw OpenFileError(output, file.open_error(), OpenFileError::WRITE); + } + + auto text = Config::instance()->cover_sheet(); + boost::algorithm::replace_all(text, "$CPL_NAME", film->name()); + auto cpls = film->cpls(); + if (!cpls.empty()) { + boost::algorithm::replace_all(text, "$CPL_FILENAME", cpls[0].cpl_file.filename().string()); + } + boost::algorithm::replace_all(text, "$TYPE", film->dcp_content_type()->pretty_name()); + boost::algorithm::replace_all(text, "$CONTAINER", film->container().container_nickname()); + + auto audio_language = film->audio_language(); + if (audio_language) { + boost::algorithm::replace_all(text, "$AUDIO_LANGUAGE", audio_language->description()); + } else { + boost::algorithm::replace_all(text, "$AUDIO_LANGUAGE", _("None")); + } + + auto const subtitle_languages = film->open_text_languages(); + if (subtitle_languages.first) { + boost::algorithm::replace_all(text, "$SUBTITLE_LANGUAGE", subtitle_languages.first->description()); + } else { + boost::algorithm::replace_all(text, "$SUBTITLE_LANGUAGE", _("None")); + } + + boost::uintmax_t size = 0; + for ( + auto i = dcp::filesystem::recursive_directory_iterator(dcp_directory); + i != dcp::filesystem::recursive_directory_iterator(); + ++i) { + if (dcp::filesystem::is_regular_file(i->path())) { + size += dcp::filesystem::file_size(i->path()); + } + } + + if (size > (1000000000L)) { + boost::algorithm::replace_all(text, "$SIZE", fmt::format("{}GB", dcp::locale_convert<string>(size / 1000000000.0, 1, true))); + } else { + boost::algorithm::replace_all(text, "$SIZE", fmt::format("{}MB", dcp::locale_convert<string>(size / 1000000.0, 1, true))); + } + + auto ch = audio_channel_types(film->mapped_audio_channels(), film->audio_channels()); + auto description = fmt::format("{}.{}", ch.first, ch.second); + + if (description == "0.0") { + description = _("None"); + } else if (description == "1.0") { + description = _("Mono"); + } else if (description == "2.0") { + description = _("Stereo"); + } + boost::algorithm::replace_all(text, "$AUDIO", description); + + auto const hmsf = film->length().split(film->video_frame_rate()); + string length; + if (hmsf.h == 0 && hmsf.m == 0) { + length = fmt::format("{}s", hmsf.s); + } else if (hmsf.h == 0 && hmsf.m > 0) { + length = fmt::format("{}m{}s", hmsf.m, hmsf.s); + } else if (hmsf.h > 0 && hmsf.m > 0) { + length = fmt::format("{}h{}m{}s", hmsf.h, hmsf.m, hmsf.s); + } + + boost::algorithm::replace_all(text, "$LENGTH", length); + + file.checked_write(text.c_str(), text.length()); +} + |
