diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-11-19 15:04:28 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-11-20 23:47:03 +0100 |
| commit | 60adc5a3312a9412b8988a0e2e82724779b5b84e (patch) | |
| tree | b95575a4f1dcdd03fab05f2d80ba4499a9319c7a | |
| parent | 84a0d8a228f36f95ac265bac163c8e3f02dc1fd0 (diff) | |
Recover subtitle language metadata from the places is was written
in older films.
| -rw-r--r-- | src/lib/film.cc | 33 | ||||
| m--------- | test/data | 0 | ||||
| -rw-r--r-- | test/subtitle_metadata_test.cc | 76 | ||||
| -rw-r--r-- | test/wscript | 1 |
4 files changed, 110 insertions, 0 deletions
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<boost::filesystem::path> 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<dcp::LanguageTag> 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<string> 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 -Subproject 30022e624852127f464933f5008f8ac6226d831 +Subproject eebc165cf7df4af980e918bc3176d93521f5bee 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 <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/>. + +*/ + +/** @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 <boost/filesystem.hpp> +#include <boost/shared_ptr.hpp> +#include <boost/test/unit_test.hpp> + + +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> film(new Film(p)); + film->read_metadata(); + + vector<dcp::LanguageTag> 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> film(new Film(p)); + film->read_metadata(); + + vector<dcp::LanguageTag> 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 |
