Added support for "VOB lists" (files containing <vob> elements to be inserted into...
authorBen Hutchings <ben@decadent.org.uk>
Thu, 15 Dec 2005 00:46:47 +0000 (00:46 +0000)
committerBen Hutchings <ben@decadent.org.uk>
Sun, 2 Nov 2008 23:19:48 +0000 (23:19 +0000)
Added early test of VOB/list file existence, since dvdauthor doesn't test any files until it has processed the previous ones and this may take a long time.

webdvd.cpp

index 5b3cd9b..cf71bb6 100644 (file)
@@ -219,8 +219,12 @@ namespace
            .second)
        {
            Glib::ustring hostname;
-           video_paths_.push_back(Glib::filename_from_uri(uri, hostname));
+           std::string filename(Glib::filename_from_uri(uri, hostname));
            // FIXME: Should check the hostname
+           if (!Glib::file_test(filename, Glib::FILE_TEST_IS_REGULAR))
+               throw std::runtime_error(
+                   filename + " is missing or not a regular file");
+           video_paths_.push_back(filename);
        }
     }
 
@@ -498,8 +502,11 @@ namespace
                check(uri->GetPath(path));
                // FIXME: This is a bit of a hack.  Perhaps we could decide
                // later based on the MIME type determined by Mozilla?
-               if (path.Length() > 4
-                   && std::strcmp(path.EndReading() - 4, ".vob") == 0)
+               if ((path.Length() > 4
+                    && std::strcmp(path.EndReading() - 4, ".vob") == 0)
+                   || (path.Length() > 8
+                       && std::strcmp(path.EndReading() - 8, ".voblist")
+                          == 0))
                {
                    PRBool is_file;
                    check(uri->SchemeIs("file", &is_file));
@@ -806,10 +813,25 @@ namespace
                "    <titles>\n"
                "      <pgc>\n"
                // Record calling page/menu.
-               "        <pre> g12 = g1; </pre>\n"
+               "        <pre> g12 = g1; </pre>\n";
+
+           // Write a reference to a linked VOB file, or the contents
+           // of a linked VOB list file.
+           const std::string & video_path = video_paths_[video_num - 1];
+           if (video_path.compare(video_path.size() - 4, 4, ".vob") == 0)
+           {
                // FIXME: Should XML-escape the path
-               "        <vob file='" << video_paths_[video_num - 1]
-                << "'/>\n"
+               file << "        <vob file='" << video_path << "'/>\n";
+           }
+           else
+           {
+               assert(video_path.compare(video_path.size() - 8, 8,
+                                         ".voblist") == 0);
+               // TODO: Validate the file contents;
+               file << Glib::file_get_contents(video_path);
+           }
+
+           file <<
                // If page/menu location has not been changed during the
                // video, change the location to be the following
                // link/button when returning to it.  In any case,