2 Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 /** @file src/copy_from_dvd_job.cc
21 * @brief A job to copy a film from a DVD.
25 #include <boost/algorithm/string.hpp>
26 #include <boost/filesystem.hpp>
27 #include "copy_from_dvd_job.h"
28 #include "film_state.h"
32 using namespace boost;
34 /** @param fs FilmState for the film to write DVD data into.
35 * @param l Log that we can write to.
37 CopyFromDVDJob::CopyFromDVDJob (shared_ptr<const FilmState> fs, Log* l)
38 : Job (fs, shared_ptr<Options> (), l)
44 CopyFromDVDJob::name () const
46 return "Copy film from DVD";
50 CopyFromDVDJob::run ()
52 /* Remove any old DVD rips */
53 filesystem::remove_all (_fs->dir ("dvd"));
55 string const dvd = find_dvd ();
57 set_error ("could not find DVD");
58 set_state (FINISHED_ERROR);
61 list<DVDTitle> const t = dvd_titles (dvd);
63 set_error ("no titles found on DVD");
64 set_state (FINISHED_ERROR);
67 int longest_title = 0;
68 uint64_t longest_size = 0;
69 for (list<DVDTitle>::const_iterator i = t.begin(); i != t.end(); ++i) {
70 if (longest_size < i->size) {
71 longest_size = i->size;
72 longest_title = i->number;
77 c << "vobcopy -n " << longest_title << " -l -o \"" << _fs->dir ("dvd") << "\" 2>&1";
79 FILE* f = popen (c.str().c_str(), "r");
81 set_error ("could not run vobcopy command");
82 set_state (FINISHED_ERROR);
88 if (fscanf (f, "%s", buf)) {
90 if (!s.empty () && s[s.length() - 1] == '%') {
91 set_progress (atof (s.substr(0, s.length() - 1).c_str()) / 100.0);
96 int const r = pclose (f);
97 if (WEXITSTATUS (r) != 0) {
98 set_error ("call to vobcopy failed");
99 set_state (FINISHED_ERROR);
101 set_state (FINISHED_OK);