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"
33 using namespace boost;
35 /** @param fs FilmState for the film to write DVD data into.
36 * @param l Log that we can write to.
38 CopyFromDVDJob::CopyFromDVDJob (shared_ptr<const FilmState> fs, Log* l)
39 : Job (fs, shared_ptr<Options> (), l)
45 CopyFromDVDJob::name () const
47 return "Copy film from DVD";
51 CopyFromDVDJob::run ()
53 /* Remove any old DVD rips */
54 filesystem::remove_all (_fs->dir ("dvd"));
56 string const dvd = find_dvd ();
58 set_error ("could not find DVD");
59 set_state (FINISHED_ERROR);
62 list<DVDTitle> const t = dvd_titles (dvd);
64 set_error ("no titles found on DVD");
65 set_state (FINISHED_ERROR);
68 int longest_title = 0;
69 uint64_t longest_size = 0;
70 for (list<DVDTitle>::const_iterator i = t.begin(); i != t.end(); ++i) {
71 if (longest_size < i->size) {
72 longest_size = i->size;
73 longest_title = i->number;
78 c << "vobcopy -n " << longest_title << " -l -o \"" << _fs->dir ("dvd") << "\" 2>&1";
80 FILE* f = popen (c.str().c_str(), "r");
82 set_error ("could not run vobcopy command");
83 set_state (FINISHED_ERROR);
89 if (fscanf (f, "%s", buf)) {
91 if (!s.empty () && s[s.length() - 1] == '%') {
92 set_progress (atof (s.substr(0, s.length() - 1).c_str()) / 100.0);
97 int const r = pclose (f);
98 if (WEXITSTATUS (r) != 0) {
99 set_error ("call to vobcopy failed");
100 set_state (FINISHED_ERROR);
102 set_state (FINISHED_OK);