summaryrefslogtreecommitdiff
path: root/src/lib/film.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/film.cc')
-rw-r--r--src/lib/film.cc30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/lib/film.cc b/src/lib/film.cc
index b0276086a..de6343b9c 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -113,6 +113,7 @@ using namespace dcpomatic;
static constexpr char metadata_file[] = "metadata.xml";
static constexpr char ui_state_file[] = "ui.xml";
static constexpr char assets_file[] = "assets.xml";
+static constexpr char info_dir[] = "info";
/* 5 -> 6
@@ -289,7 +290,7 @@ boost::filesystem::path
Film::info_file(DCPTimePeriod period) const
{
boost::filesystem::path p;
- p /= "info";
+ p /= info_dir;
p /= video_identifier() + "_" + fmt::to_string(period.from.get()) + "_" + fmt::to_string(period.to.get());
return file(p);
}
@@ -1440,7 +1441,7 @@ Film::cpls() const
for (auto const& item: dcp::filesystem::directory_iterator(dir)) {
if (
dcp::filesystem::is_directory(item) &&
- item.path().filename() != "j2c" && item.path().filename() != "video" && item.path().filename() != "info" && item.path().filename() != "analysis"
+ item.path().filename() != "j2c" && item.path().filename() != "video" && item.path().filename() != info_dir && item.path().filename() != "analysis"
) {
try {
@@ -2204,12 +2205,35 @@ Film::speed_up_range(int dcp_frame_rate) const
return _playlist->speed_up_range(dcp_frame_rate);
}
+
void
-Film::copy_from(shared_ptr<const Film> film)
+Film::copy_from(shared_ptr<const Film> film, std::function<void (float)> set_progress)
{
read_metadata(film->file(metadata_file));
+
+ auto old_assets = film->read_remembered_assets();
+ auto new_assets = std::vector<RememberedAsset>{};
+
+ /* Find source film's remembered assets that still exist and copy them to our new film */
+ for (auto path: dcp::filesystem::recursive_directory_iterator(*film->directory())) {
+ auto iter = std::find_if(old_assets.begin(), old_assets.end(), [path](RememberedAsset const& asset) {
+ return asset.filename() == path.path().filename();
+ });
+ if (iter != old_assets.end()) {
+ copy_in_bits(path, assets_path() / path.path().filename(), set_progress);
+ new_assets.push_back({path.path().filename(), iter->period(), iter->identifier()});
+ }
+ }
+
+ write_remembered_assets(new_assets);
+
+ /* To use the assets we also need the info files */
+ for (auto path: dcp::filesystem::directory_iterator(film->dir(info_dir))) {
+ dcp::filesystem::copy_file(path.path(), dir(info_dir) / path.path().filename());
+ }
}
+
bool
Film::references_dcp_video() const
{