From 60adc5a3312a9412b8988a0e2e82724779b5b84e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 19 Nov 2020 15:04:28 +0100 Subject: [PATCH] Recover subtitle language metadata from the places is was written in older films. --- src/lib/film.cc | 33 +++++++++++++++ test/data | 2 +- test/subtitle_metadata_test.cc | 76 ++++++++++++++++++++++++++++++++++ test/wscript | 1 + 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 test/subtitle_metadata_test.cc diff --git a/src/lib/film.cc b/src/lib/film.cc index 9943711f5..5d298baae 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -686,6 +686,39 @@ Film::read_metadata (optional path) set_backtrace_file (file ("backtrace.txt")); } + /* Around 2.15.108 we removed subtitle language state from the text content and the ISDCF + * metadata and put it into the Film instead. If we've loaded an old Film let's try and fish + * out the settings from where they were so that they don't get lost. + */ + + optional found_language; + + BOOST_FOREACH (cxml::ConstNodePtr i, f.node_child("Playlist")->node_children("Content")) { + cxml::ConstNodePtr text = i->optional_node_child("Text"); + if (text && text->optional_string_child("Language") && !found_language) { + try { + found_language = dcp::LanguageTag(text->string_child("Language")); + } catch (...) {} + } + } + + optional isdcf_language = f.node_child("ISDCFMetadata")->optional_string_child("SubtitleLanguage"); + if (isdcf_language && !found_language) { + try { + found_language = dcp::LanguageTag(*isdcf_language); + } catch (...) { + try { + found_language = dcp::LanguageTag(boost::algorithm::to_lower_copy(*isdcf_language)); + } catch (...) { + + } + } + } + + if (found_language) { + _subtitle_languages.push_back (*found_language); + } + _dirty = false; return notes; } diff --git a/test/data b/test/data index 30022e624..eebc165cf 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit 30022e624852127f464933f5008f8ac6226d831c +Subproject commit eebc165cf7df4af980e918bc3176d93521f5beea diff --git a/test/subtitle_metadata_test.cc b/test/subtitle_metadata_test.cc new file mode 100644 index 000000000..a60d0675c --- /dev/null +++ b/test/subtitle_metadata_test.cc @@ -0,0 +1,76 @@ +/* + Copyright (C) 2020 Carl Hetherington + + 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 . + +*/ + +/** @file test/subtitle_metadata_test.cc + * @brief Test that subtitle language metadata is recovered from metadata files + * written by versions before the subtitle language was only stored in Film. + */ + + +#include "lib/film.h" +#include "test.h" +#include +#include +#include + + +using std::vector; +using boost::shared_ptr; + + +BOOST_AUTO_TEST_CASE (subtitle_metadata_test1) +{ + using namespace boost::filesystem; + + path p = test_film_dir ("subtitle_metadata_test1"); + if (exists (p)) { + remove_all (p); + } + create_directory (p); + + copy_file ("test/data/subtitle_metadata1.xml", p / "metadata.xml"); + shared_ptr film(new Film(p)); + film->read_metadata(); + + vector langs = film->subtitle_languages (); + BOOST_REQUIRE (!langs.empty()); + BOOST_CHECK_EQUAL (langs.front().to_string(), "de-DE"); +} + + +BOOST_AUTO_TEST_CASE (subtitle_metadata_test2) +{ + using namespace boost::filesystem; + + path p = test_film_dir ("subtitle_metadata_test2"); + if (exists (p)) { + remove_all (p); + } + create_directory (p); + + copy_file ("test/data/subtitle_metadata2.xml", p / "metadata.xml"); + shared_ptr film(new Film(p)); + film->read_metadata(); + + vector langs = film->subtitle_languages (); + BOOST_REQUIRE (!langs.empty()); + BOOST_CHECK_EQUAL (langs.front().to_string(), "fr"); +} + diff --git a/test/wscript b/test/wscript index ec01bf4f8..9a3347be3 100644 --- a/test/wscript +++ b/test/wscript @@ -118,6 +118,7 @@ def build(bld): ssa_subtitle_test.cc stream_test.cc subtitle_charset_test.cc + subtitle_metadata_test.cc subtitle_reel_test.cc subtitle_reel_number_test.cc subtitle_trim_test.cc -- 2.30.2