Prevent import of directories as DCPs if they do not have an
authorCarl Hetherington <cth@carlh.net>
Wed, 28 Oct 2020 11:48:48 +0000 (12:48 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 28 Oct 2020 11:48:48 +0000 (12:48 +0100)
ASSETMAP{,.xml} in the top level.

This should avoid some confusion, as previously DoM would scan the
whole directory tree looking for an ASSETMAP.  It also prevents
people adding a DCP-o-matic project to itself, which I believe is the
cause of #1620.

src/lib/dcp_content.cc

index b4ee1444c95a51f5e9597b99b83a2dff43939e3a..f695332ec5d92bf156c7f3b6216f15b046c73a63 100644 (file)
@@ -169,18 +169,31 @@ DCPContent::DCPContent (cxml::ConstNodePtr node, int version)
 void
 DCPContent::read_directory (boost::filesystem::path p)
 {
-       read_sub_directory (p);
+       using namespace boost::filesystem;
 
        bool have_assetmap = false;
-       BOOST_FOREACH (boost::filesystem::path i, paths()) {
-               if (i.filename() == "ASSETMAP" || i.filename() == "ASSETMAP.xml") {
+       bool have_metadata = false;
+
+       for (directory_iterator i(p); i != directory_iterator(); ++i) {
+               if (i->path().filename() == "ASSETMAP" || i->path().filename() == "ASSETMAP.xml") {
                        have_assetmap = true;
+               } else if (i->path().filename() == "metadata.xml") {
+                       have_metadata = true;
                }
        }
 
        if (!have_assetmap) {
-               throw DCPError ("No ASSETMAP or ASSETMAP.xml file found: is this a DCP?");
+               if (!have_metadata) {
+                       throw DCPError ("No ASSETMAP or ASSETMAP.xml file found: is this a DCP?");
+               } else {
+                       throw DCPError (
+                               "This looks like a DCP-o-matic project folder, which cannot be added to a different project.  "
+                               "Choose the DCP directory inside the DCP-o-matic project folder if that's what you want to import."
+                               );
+               }
        }
+
+       read_sub_directory (p);
 }
 
 void