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"
34 using std::stringstream;
35 using boost::shared_ptr;
37 /** @param f Film to write DVD data into.
39 CopyFromDVDJob::CopyFromDVDJob (shared_ptr<Film> f, shared_ptr<Job> req)
46 CopyFromDVDJob::name () const
48 return "Copy film from DVD";
52 CopyFromDVDJob::run ()
54 /* Remove any old DVD rips */
55 boost::filesystem::remove_all (_film->dir ("dvd"));
57 string const dvd = find_dvd ();
59 set_error ("could not find DVD");
60 set_state (FINISHED_ERROR);
63 list<DVDTitle> const t = dvd_titles (dvd);
65 set_error ("no titles found on DVD");
66 set_state (FINISHED_ERROR);
69 int longest_title = 0;
70 uint64_t longest_size = 0;
71 for (list<DVDTitle>::const_iterator i = t.begin(); i != t.end(); ++i) {
72 if (longest_size < i->size) {
73 longest_size = i->size;
74 longest_title = i->number;
79 c << "vobcopy -n " << longest_title << " -l -o \"" << _film->dir ("dvd") << "\" 2>&1";
81 FILE* f = popen (c.str().c_str(), "r");
83 set_error ("could not run vobcopy command");
84 set_state (FINISHED_ERROR);
90 if (fscanf (f, "%s", buf)) {
92 if (!s.empty () && s[s.length() - 1] == '%') {
93 set_progress (atof (s.substr(0, s.length() - 1).c_str()) / 100.0);
98 const string dvd_dir = _film->dir ("dvd");
101 uintmax_t largest_size = 0;
102 for (boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator (dvd_dir); i != boost::filesystem::directory_iterator(); ++i) {
103 uintmax_t const s = boost::filesystem::file_size (*i);
104 if (s > largest_size) {
106 #if BOOST_FILESYSTEM_VERSION == 3
107 largest_file = boost::filesystem::path(*i).generic_string();
109 largest_file = i->string ();
115 _film->set_content (largest_file);
117 int const r = pclose (f);
118 if (WEXITSTATUS (r) != 0) {
119 set_error ("call to vobcopy failed");
120 set_state (FINISHED_ERROR);
122 set_state (FINISHED_OK);