From 89c443bd183ffe579625d94545026d7243207a9f Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sun, 27 Sep 2009 17:21:26 -0400 Subject: Termination, slotted dvd title loading, framework fixes. --- AnyRip.pro | 6 ++-- dvdimagejob.cpp | 62 ++++++++++++++++++++++++++++++++++++---- dvdimagejob.h | 12 ++++---- encodemp4job.cpp | 87 ++++++++++++++++++++++++++++++-------------------------- encodemp4job.h | 13 ++++++--- job.cpp | 20 +++++++++---- job.h | 5 +++- mainwindow.cpp | 23 +++++++++------ newdvdgui.cpp | 16 +++++------ newdvdgui.h | 6 ++-- newimagegui.cpp | 2 +- titleloader.cpp | 44 ++++++++++++++++++++++++++++ titleloader.h | 25 ++++++++++++++++ titleloadjob.cpp | 10 ++++--- titleloadjob.h | 7 ++--- uploadjob.cpp | 9 ++++-- uploadjob.h | 6 ++-- video.cpp | 28 +++++++++++++----- video.h | 4 +++ 19 files changed, 279 insertions(+), 106 deletions(-) create mode 100644 titleloader.cpp create mode 100644 titleloader.h diff --git a/AnyRip.pro b/AnyRip.pro index 46cbd14..4ecbd1c 100644 --- a/AnyRip.pro +++ b/AnyRip.pro @@ -13,7 +13,8 @@ SOURCES += main.cpp \ mainwindow.cpp \ encodemp4jobgui.cpp \ newdvdgui.cpp \ - newimagegui.cpp + newimagegui.cpp \ + titleloader.cpp HEADERS += dvdimagejob.h \ dvdimagejobgui.h \ job.h \ @@ -28,7 +29,8 @@ HEADERS += dvdimagejob.h \ mainwindow.h \ encodemp4jobgui.h \ newdvdgui.h \ - newimagegui.h + newimagegui.h \ + titleloader.h LIBS += -ldvdcss \ -ldvdread QT += dbus diff --git a/dvdimagejob.cpp b/dvdimagejob.cpp index 1a669c9..ebc818a 100644 --- a/dvdimagejob.cpp +++ b/dvdimagejob.cpp @@ -11,12 +11,18 @@ #include #include -DVDImageJob::DVDImageJob(Video *video, QString defaultPath) - : Job(video), - m_defaultPath(defaultPath) +DVDImageJob::DVDImageJob(Video *video) + : Job(video, true), + m_terminate(false) { } +DVDImageJob::~DVDImageJob() +{ + disconnect(this, 0, 0, 0); + terminate(); +} + int DVDImageJob::cmpvob(const void *p1, const void *p2) { vobfile *v1 = (vobfile*)p1; @@ -31,7 +37,7 @@ int DVDImageJob::cmpvob(const void *p1, const void *p2) bool DVDImageJob::executeJob() { - return saveImageToPath(m_defaultPath); + return saveImageToPath(video()->imagePath()); } Video::Jobs DVDImageJob::jobType() const @@ -45,6 +51,8 @@ bool DVDImageJob::saveImageToPath(const QString &path) file.open(QFile::WriteOnly); bool ret = saveImageToDevice(file); file.close(); + if (!ret) + file.remove(); return ret; } @@ -52,13 +60,24 @@ bool DVDImageJob::saveImageToPath(const QString &path) // http://www.google.com/codesearch/p?hl=en&sa=N&cd=10&ct=rc#PY4_fj37fsw/uia/netsteria/dvd/read.cc&q=DVDCSS_SEEK_KEY bool DVDImageJob::saveImageToDevice(QIODevice &out) { + m_locker.lockForRead(); + if (m_terminate) { + m_locker.unlock(); + return false; + } + m_locker.unlock(); QString dvdDevice = DVDDrive::instance()->dvdDevice(); dvd_reader_t *dvdr = DVDOpen(dvdDevice.toStdString().c_str()); if (!dvdr) { qDebug() << "can't open DVD (dvdread)"; return false; } - + m_locker.lockForRead(); + if (m_terminate) { + m_locker.unlock(); + return false; + } + m_locker.unlock(); // Find the extents of all the potentially-encrypted VOB files uint32_t discend = 0; vobfile vobs[100*10]; @@ -66,10 +85,15 @@ bool DVDImageJob::saveImageToDevice(QIODevice &out) const int NBLOCKS = 16; char buf[DVDCSS_BLOCK_SIZE * NBLOCKS]; for (int i = 0; i < 100; i++) { - // Find the IFO and BUP files for this titleset, // just to make sure hiblock accounts for them. for (int j = 0; j < 2; j++) { + m_locker.lockForRead(); + if (m_terminate) { + m_locker.unlock(); + return false; + } + m_locker.unlock(); char filename[30]; const char *ext = j ? "BUP" : "IFO"; if (i == 0) { @@ -89,6 +113,12 @@ bool DVDImageJob::saveImageToDevice(QIODevice &out) // Find each VOB part for decryption for (int j = 0; j < 10; j++) { + m_locker.lockForRead(); + if (m_terminate) { + m_locker.unlock(); + return false; + } + m_locker.unlock(); char filename[30]; if (i == 0) { if (j > 0) @@ -111,6 +141,12 @@ bool DVDImageJob::saveImageToDevice(QIODevice &out) nvobs++; } } + m_locker.lockForRead(); + if (m_terminate) { + m_locker.unlock(); + return false; + } + m_locker.unlock(); qsort(&vobs, nvobs, sizeof(vobfile), cmpvob); vobs[nvobs].start = vobs[nvobs].end = INT_MAX; @@ -125,6 +161,12 @@ bool DVDImageJob::saveImageToDevice(QIODevice &out) int blkno = 0; int curvob = 0; while (1) { + m_locker.lockForRead(); + if (m_terminate) { + m_locker.unlock(); + return false; + } + m_locker.unlock();; //printf("% 3d%%: block %d of %d (byte %lld of %lld)\r", // (int)((long long)blkno*100/discend), blkno, discend, // (long long)blkno*DVDCSS_BLOCK_SIZE, (long long)discend*DVDCSS_BLOCK_SIZE); @@ -202,3 +244,11 @@ QWidget* DVDImageJob::gui() { return new DVDImageJobGui(this); } + +void DVDImageJob::terminate() +{ + m_locker.lockForWrite(); + m_terminate = true; + m_locker.unlock(); + watcher()->waitForFinished(); +} diff --git a/dvdimagejob.h b/dvdimagejob.h index d53d7e6..53050db 100644 --- a/dvdimagejob.h +++ b/dvdimagejob.h @@ -2,28 +2,30 @@ #define DVDIMAGEJOB_H #include "job.h" +#include class QIODevice; class DVDImageJob : public Job { Q_OBJECT public: - DVDImageJob(Video *video, QString defaultPath); + DVDImageJob(Video *video); + ~DVDImageJob(); bool saveImageToDevice(QIODevice &out); bool saveImageToPath(const QString &path); Video::Jobs jobType() const; - +public slots: + void terminate(); private: static int cmpvob(const void *p1, const void *p2); typedef struct vobfile { int32_t start, end; } vobfile; - QString m_defaultPath; - + QReadWriteLock m_locker; + bool m_terminate; protected: bool executeJob(); QWidget* gui(); - signals: void extractProgress(int current, int total); }; diff --git a/encodemp4job.cpp b/encodemp4job.cpp index 9713193..49c7042 100644 --- a/encodemp4job.cpp +++ b/encodemp4job.cpp @@ -2,26 +2,34 @@ #include "encodemp4jobgui.h" #include #include -#include #include #include #include +#include -EncodeMP4Job::EncodeMP4Job(Video *video, QString encodePath, QString imagePath) : - Job(video), - m_encodePath(encodePath), - m_imagePath(imagePath) +EncodeMP4Job::EncodeMP4Job(Video *video) : + Job(video, false), + m_process(0) { } +EncodeMP4Job::~EncodeMP4Job() +{ + disconnect(this, 0, 0, 0); + terminate(); +} Video::Jobs EncodeMP4Job::jobType() const { return Video::EncodeMP4; } bool EncodeMP4Job::executeJob() { - QProcess process; + m_process = new QProcess(this); + connect(m_process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(terminate())); + connect(m_process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(finished(int,QProcess::ExitStatus))); + connect(m_process, SIGNAL(readyRead()), this, SLOT(readyRead())); QStringList arguments; - arguments << "-i" << m_imagePath; + arguments << "-i" << video()->imagePath(); + m_encodePath = video()->encodePath(); arguments << "-o" << m_encodePath; arguments << "-e" << "x264"; arguments << "-b" << "500"; @@ -37,15 +45,18 @@ bool EncodeMP4Job::executeJob() arguments << "--optimize" << "--decomb" << "--deblock" << "--denoise=\"weak\""; arguments << "-x" << "ref=3:mixed-refs:bframes=6:weightb:direct=auto:b-pyramid:me=umh:subme=9:analyse=all:8x8dct:trellis=1:no-fast-pskip:psy-rd=1,1"; qDebug() << "starting handbreak with arguments:" << arguments; - //process.setStandardErrorFile("/home/zx2c4/Desktop/error.log"); - //process.setStandardOutputFile("/home/zx2c4/Desktop/out.log"); - process.start(QLatin1String("./HandBrakeCLI"), arguments, QIODevice::ReadOnly); - if (!process.waitForStarted()) - return false; - QRegExp percentLinePattern(QLatin1String("^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\\.[0-9]*) % (\\(([0-9]*\\.[0-9]*) fps, avg ([0-9]*\\.[0-9]*) fps, ETA ([0-9]{2})h([0-9]{2})m([0-9]{2})s\\))?")); - QRegExp lessPercentLinePattern(QLatin1String("^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\\.[0-9]*) %")); - while (process.waitForReadyRead(-1)) { - QString line = QString(process.readLine()).trimmed(); + //m_process->setStandardErrorFile("/home/zx2c4/Desktop/error.log"); + //m_process->setStandardOutputFile("/home/zx2c4/Desktop/out.log"); + m_process->start(QLatin1String("./HandBrakeCLI"), arguments, QIODevice::ReadOnly); + return true; +} +void EncodeMP4Job::readyRead() +{ + static const QRegExp percentLinePattern(QLatin1String("^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\\.[0-9]*) % (\\(([0-9]*\\.[0-9]*) fps, avg ([0-9]*\\.[0-9]*) fps, ETA ([0-9]{2})h([0-9]{2})m([0-9]{2})s\\))?")); + static const QRegExp lessPercentLinePattern(QLatin1String("^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\\.[0-9]*) %")); + QByteArray byteLine; + while (!(byteLine = m_process->readLine()).isEmpty()) { + QString line = QString(byteLine).trimmed(); if (percentLinePattern.exactMatch(line)) { int currentTask = percentLinePattern.cap(1).toInt(); int totalTasks = percentLinePattern.cap(2).toInt(); @@ -61,35 +72,29 @@ bool EncodeMP4Job::executeJob() emit encodeProgress(currentTask, totalTasks, percent, -1, -1, QTime()); } } - process.waitForFinished(-1); - return process.exitStatus() == QProcess::NormalExit; } -QWidget* EncodeMP4Job::gui() +void EncodeMP4Job::terminate() { - return new EncodeMP4JobGui(this); + if (m_process) { + disconnect(m_process, 0, 0, 0); + delete m_process; + m_process = 0; + QFile::remove(m_encodePath); + } + emit completed(false); } -QMap EncodeMP4Job::titles() const +void EncodeMP4Job::finished(int exitCode, QProcess::ExitStatus exitStatus) { - return titles(m_encodePath); + if (exitCode == 0 && exitStatus == QProcess::NormalExit) { + disconnect(m_process, 0, 0, 0); + delete m_process; + m_process = 0; + emit completed(true); + } + else + terminate(); } -QMap EncodeMP4Job::titles(const QString &location) +QWidget* EncodeMP4Job::gui() { - QMap titles; - QProcess process; - QStringList arguments; - arguments << "-i" << location; - arguments << "-t" << "0"; - arguments << "--dvdnav"; - process.start(QLatin1String("./HandBrakeCLI"), arguments, QIODevice::ReadOnly); - if (!process.waitForStarted()) - return titles; - process.waitForFinished(-1); - QRegExp titleDurationPattern(QLatin1String("\\+ title ([0-9]*):\\n[^\\n]*\\n[^\\n]*\\n \\+ duration: ([0-9]{2}:[0-9]{2}:[0-9]{2})")); - QString output(process.readAllStandardError()); - int matchLocation = 0; - while ((matchLocation = titleDurationPattern.indexIn(output, matchLocation)) != -1) { - matchLocation += titleDurationPattern.matchedLength(); - titles.insert(titleDurationPattern.cap(1).toInt(), titleDurationPattern.cap(2)); - } - return titles; + return new EncodeMP4JobGui(this); } diff --git a/encodemp4job.h b/encodemp4job.h index ea0c1fd..97d3e50 100644 --- a/encodemp4job.h +++ b/encodemp4job.h @@ -5,21 +5,26 @@ #include "video.h" #include #include +#include class EncodeMP4Job : public Job { Q_OBJECT public: - EncodeMP4Job(Video *video, QString encodePath, QString imagePath); + EncodeMP4Job(Video *video); + ~EncodeMP4Job(); Video::Jobs jobType() const; - static QMap titles(const QString &location); - QMap titles() const; protected: bool executeJob(); QWidget* gui(); private: + QProcess *m_process; QString m_encodePath; - QString m_imagePath; +private slots: + void finished(int exitCode, QProcess::ExitStatus exitStats); + void readyRead(); +public slots: + void terminate(); signals: void encodeProgress(int currentTask, int totalTasks, float percent, float currentFps, float avgFps, QTime timeRemaining); }; diff --git a/job.cpp b/job.cpp index af35104..bbc55b4 100644 --- a/job.cpp +++ b/job.cpp @@ -2,14 +2,17 @@ #include "video.h" #include -Job::Job(Video *parent) +Job::Job(Video *parent, bool threaded) : QObject(parent), m_gui(0), m_video(parent) { - m_watcher = new QFutureWatcher; - m_watcher->setParent(this); - connect(m_watcher, SIGNAL(finished()), this, SLOT(jobFinished())); + if (threaded) { + m_watcher = new QFutureWatcher; + m_watcher->setParent(this); + connect(m_watcher, SIGNAL(finished()), this, SLOT(jobFinished())); + } else + m_watcher = 0; } Video* Job::video() const { @@ -17,7 +20,10 @@ Video* Job::video() const } void Job::runJob() { - m_watcher->setFuture(QtConcurrent::run(this, &Job::executeJob)); + if (m_watcher) + m_watcher->setFuture(QtConcurrent::run(this, &Job::executeJob)); + else + executeJob(); } void Job::jobFinished() { @@ -29,3 +35,7 @@ QWidget* Job::widget() m_gui = gui(); return m_gui; } +QFutureWatcher* Job::watcher() const +{ + return m_watcher; +} diff --git a/job.h b/job.h index 9b276ca..53843e5 100644 --- a/job.h +++ b/job.h @@ -15,15 +15,18 @@ public: QWidget* widget(); Video* video() const; protected: - Job(Video *parent); + Job(Video *parent, bool threaded); virtual bool executeJob() = 0; virtual QWidget* gui() = 0; + QFutureWatcher* watcher() const; private: QFutureWatcher *m_watcher; QWidget *m_gui; Video *m_video; private slots: void jobFinished(); +public slots: + virtual void terminate() = 0; signals: void completed(bool result); }; diff --git a/mainwindow.cpp b/mainwindow.cpp index 29925ec..e89df5a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -15,6 +15,18 @@ MainWindow::MainWindow() { + QSettings settings; + settings.beginGroup(QLatin1String("Videos")); + //We delay adding because addVideo needs things to be contructed. + //We need to remove bad entries though because other constructors here rely on our settings + QList toAdd; + foreach(QString title, settings.childGroups()) { + Video *video = new Video(title, this); + if (video->isJobCompleted(Video::DVDImage)) + toAdd.append(video); + else + settings.remove(title); + } m_queue = new VideoQueue; connect(m_queue, SIGNAL(runningJob(Job*)), this, SLOT(runningJob(Job*))); m_videoGuis = new QVBoxLayout; @@ -30,15 +42,8 @@ MainWindow::MainWindow() NewImageGui *newImageGui = new NewImageGui; connect(newImageGui, SIGNAL(newImage(QString,QString)), this, SLOT(newVideoFromImage(QString,QString))); m_jobGuis->addWidget(newImageGui, 0, Qt::AlignTop); - QSettings settings; - settings.beginGroup(QLatin1String("Videos")); - foreach(QString title, settings.childGroups()) { - Video *video = new Video(title, this); - if (video->isJobCompleted(Video::DVDImage)) - addVideo(video); - else - settings.remove(title); - } + foreach (Video *video, toAdd) + addVideo(video); setLayout(layout); } void MainWindow::addVideo(Video *video) diff --git a/newdvdgui.cpp b/newdvdgui.cpp index 3bceaa2..031764e 100644 --- a/newdvdgui.cpp +++ b/newdvdgui.cpp @@ -1,6 +1,7 @@ #include "newdvdgui.h" #include "dvddrive.h" #include "encodemp4job.h" +#include "titleloader.h" #include #include #include @@ -14,9 +15,8 @@ NewDVDGui::NewDVDGui() : m_loadingTitles(tr("%1 inserted. Scanning titles...")), m_ripping(tr("Created new video from DVD.")) { - m_watcher = new QFutureWatcher >; - m_watcher->setParent(this); - connect(m_watcher, SIGNAL(finished()), this, SLOT(loadedTitles())); + m_titleLoader = new TitleLoader(DVDDrive::instance()->dvdDevice(), this); + connect(m_titleLoader, SIGNAL(loadedTitles(QMap)), this, SLOT(loadedTitles(QMap))); m_status = new QLabel; m_dvdName = new QLineEdit; connect(m_dvdName, SIGNAL(textChanged(QString)), this, SLOT(validateName(QString))); @@ -45,22 +45,22 @@ void NewDVDGui::dvdAdded() { QString name = DVDDrive::instance()->dvdName(); m_status->setText(m_loadingTitles.arg(name)); - m_dvdName->setText(name); //Calls validateName + m_dvdName->setText(name); m_dvdName->setVisible(false); m_status->setVisible(true); m_rip->setVisible(false); m_eject->setVisible(false); - m_watcher->setFuture(QtConcurrent::run(&EncodeMP4Job::titles, DVDDrive::instance()->dvdDevice())); + m_titleLoader->loadTitles(); } void NewDVDGui::validateName(const QString &name) { QSettings settings; settings.beginGroup(QLatin1String("Videos")); - m_rip->setEnabled(!settings.childGroups().contains(name)); + m_rip->setEnabled(!settings.childGroups().contains(QString(name).replace(QChar('/'), QChar('-'))) && !name.trimmed().isEmpty()); } -void NewDVDGui::loadedTitles() +void NewDVDGui::loadedTitles(QMap titles) { - m_titles = m_watcher->result(); + m_titles = titles; m_rip->setVisible(true); m_eject->setVisible(true); m_status->setVisible(false); diff --git a/newdvdgui.h b/newdvdgui.h index 28d97c5..d7f7505 100644 --- a/newdvdgui.h +++ b/newdvdgui.h @@ -3,10 +3,10 @@ #include #include -#include class QLineEdit; class QLabel; class QPushButton; +class TitleLoader; class NewDVDGui : public QGroupBox { @@ -22,13 +22,13 @@ private: const QString m_ripping; QPushButton *m_rip; QPushButton *m_eject; - QFutureWatcher > *m_watcher; + TitleLoader *m_titleLoader; private slots: void dvdAdded(); void dvdRemoved(); void validateName(const QString &name); void rip(); - void loadedTitles(); + void loadedTitles(QMap titles); signals: void newDVD(QString name, QMap titles); }; diff --git a/newimagegui.cpp b/newimagegui.cpp index ebda750..69298ad 100644 --- a/newimagegui.cpp +++ b/newimagegui.cpp @@ -48,7 +48,7 @@ void NewImageGui::validateName(const QString &name) { QSettings settings; settings.beginGroup(QLatin1String("Videos")); - m_importImageButton->setEnabled(!settings.childGroups().contains(name)); + m_importImageButton->setEnabled(!settings.childGroups().contains(QString(name).replace(QChar('/'), QChar('-'))) && !name.trimmed().isEmpty()); } void NewImageGui::browse() { diff --git a/titleloader.cpp b/titleloader.cpp new file mode 100644 index 0000000..c67517d --- /dev/null +++ b/titleloader.cpp @@ -0,0 +1,44 @@ +#include "titleloader.h" + +TitleLoader::TitleLoader(const QString &location, QObject *parent) : + QObject(parent), + m_location(location) +{ +} +void TitleLoader::loadTitles() +{ + m_process = new QProcess(this); + QStringList arguments; + arguments << "-i" << m_location; + arguments << "-t" << "0"; + arguments << "--dvdnav"; + connect(m_process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(terminate())); + connect(m_process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(finished(int,QProcess::ExitStatus))); + m_process->start(QLatin1String("./HandBrakeCLI"), arguments, QIODevice::ReadOnly); +} +void TitleLoader::finished(int exitCode, QProcess::ExitStatus exitStatus) +{ + QMap titles; + if (exitCode == 0 && exitStatus == QProcess::NormalExit) { + static const QRegExp titleDurationPattern(QLatin1String("\\+ title ([0-9]*):\\n[^\\n]*\\n[^\\n]*\\n \\+ duration: ([0-9]{2}:[0-9]{2}:[0-9]{2})")); + QString output(m_process->readAllStandardError()); + int matchLocation = 0; + while ((matchLocation = titleDurationPattern.indexIn(output, matchLocation)) != -1) { + matchLocation += titleDurationPattern.matchedLength(); + titles.insert(titleDurationPattern.cap(1).toInt(), titleDurationPattern.cap(2)); + } + } + disconnect(m_process, 0, 0, 0); + delete m_process; + m_process = 0; + emit loadedTitles(titles); +} +void TitleLoader::terminate() +{ + if (m_process) { + disconnect(m_process, 0, 0, 0); + delete m_process; + m_process = 0; + } + emit loadedTitles(QMap()); +} diff --git a/titleloader.h b/titleloader.h new file mode 100644 index 0000000..52e9b37 --- /dev/null +++ b/titleloader.h @@ -0,0 +1,25 @@ +#ifndef TITLELOADER_H +#define TITLELOADER_H + +#include +#include +#include + +class TitleLoader : public QObject +{ + Q_OBJECT +public: + TitleLoader(const QString &location, QObject *parent = 0); + void loadTitles(); +private: + QString m_location; + QProcess *m_process; +private slots: + void finished(int exitCode ,QProcess::ExitStatus exitStatus); +public slots: + void terminate(); +signals: + void loadedTitles(QMap titles); +}; + +#endif // TITLELOADER_H diff --git a/titleloadjob.cpp b/titleloadjob.cpp index d0c613c..b59470a 100644 --- a/titleloadjob.cpp +++ b/titleloadjob.cpp @@ -2,10 +2,8 @@ #include #include -TitleLoadJob::TitleLoadJob(Video *video, QString subtitlePath, QString posterPath) : - Job(video), - m_subtitlePath(subtitlePath), - m_posterPath(posterPath) +TitleLoadJob::TitleLoadJob(Video *video) : + Job(video, false) { } Video::Jobs TitleLoadJob::jobType() const @@ -23,3 +21,7 @@ QWidget* TitleLoadJob::gui() //TODO: make a gui return new QLabel("Bet your ass this is title loading."); } +void TitleLoadJob::terminate() +{ + //TODO: implement terminating +} diff --git a/titleloadjob.h b/titleloadjob.h index 4a1729e..a2119da 100644 --- a/titleloadjob.h +++ b/titleloadjob.h @@ -8,14 +8,13 @@ class TitleLoadJob : public Job { Q_OBJECT public: - TitleLoadJob(Video *video, QString subtitlePath, QString posterPath); + TitleLoadJob(Video *video); Video::Jobs jobType() const; protected: bool executeJob(); QWidget* gui(); -private: - QString m_subtitlePath; - QString m_posterPath; +public slots: + void terminate(); }; #endif // TITLELOADJOB_H diff --git a/uploadjob.cpp b/uploadjob.cpp index a4691c4..786ce52 100644 --- a/uploadjob.cpp +++ b/uploadjob.cpp @@ -2,9 +2,8 @@ #include #include -UploadJob::UploadJob(Video *video, QString encodePath) : - Job(video), - m_encodePath(encodePath) +UploadJob::UploadJob(Video *video) : + Job(video, false) { } Video::Jobs UploadJob::jobType() const @@ -22,3 +21,7 @@ QWidget* UploadJob::gui() //TODO: make a gui return new QLabel("Endoplasmic sludge in your upload house"); } +void UploadJob::terminate() +{ + //TODO: implement terminating +} diff --git a/uploadjob.h b/uploadjob.h index e8453f2..0bf2989 100644 --- a/uploadjob.h +++ b/uploadjob.h @@ -8,13 +8,13 @@ class UploadJob : public Job { Q_OBJECT public: - UploadJob(Video *video, QString encodePath); + UploadJob(Video *video); Video::Jobs jobType() const; protected: bool executeJob(); QWidget* gui(); -private: - QString m_encodePath; +public slots: + void terminate(); }; #endif // UPLOADJOB_H diff --git a/video.cpp b/video.cpp index 041fb48..6e94f5b 100644 --- a/video.cpp +++ b/video.cpp @@ -17,7 +17,7 @@ Video::Video(QString title, QObject *parent) : m_jobsInProgress(QBitArray(6)), m_dvdTitle(1) { - title = title.replace(QChar('/'), QChar('-')); + title.replace(QChar('/'), QChar('-')); m_settingsKey = QString("Videos/%1/%2").arg(title); QSettings settings; settings.beginGroup("Videos"); @@ -64,7 +64,7 @@ void Video::completedJob(bool success) DVDImageJob* Video::dvdImageJob() { if (!m_jobsInProgress.at(Video::DVDImage) && !m_jobsCompleted.at(Video::DVDImage) && DVDDrive::instance()->dvdInserted()) { - DVDImageJob *job = new DVDImageJob(this, m_imagePath); + DVDImageJob *job = new DVDImageJob(this); connect(job, SIGNAL(completed(bool)), this, SLOT(completedJob(bool))); m_jobsInProgress.setBit(Video::DVDImage, true); return job; @@ -74,7 +74,7 @@ DVDImageJob* Video::dvdImageJob() EncodeMP4Job* Video::encodeMP4Job() { if (!m_jobsInProgress.at(Video::EncodeMP4) && !m_jobsCompleted.at(Video::EncodeMP4) && m_jobsCompleted.at(Video::DVDImage)) { - EncodeMP4Job *job = new EncodeMP4Job(this, m_encodePath, m_imagePath); + EncodeMP4Job *job = new EncodeMP4Job(this); connect(job, SIGNAL(completed(bool)), this, SLOT(completedJob(bool))); m_jobsInProgress.setBit(Video::EncodeMP4, true); return job; @@ -84,7 +84,7 @@ EncodeMP4Job* Video::encodeMP4Job() UploadJob* Video::uploadJob() { if (!m_jobsInProgress.at(Video::Upload) && !m_jobsCompleted.at(Video::Upload) && m_jobsCompleted.at(Video::EncodeMP4)) { - UploadJob *job = new UploadJob(this, m_encodePath); + UploadJob *job = new UploadJob(this); connect(job, SIGNAL(completed(bool)), this, SLOT(completedJob(bool))); m_jobsInProgress.setBit(Video::Upload, true); return job; @@ -94,7 +94,7 @@ UploadJob* Video::uploadJob() TitleLoadJob* Video::titleLoadJob() { if (!m_jobsInProgress.at(Video::TitleLoad) && !m_jobsCompleted.at(Video::TitleLoad) && m_jobsCompleted.at(Video::Upload) && m_jobsCompleted.at(Video::Subtitle) && m_jobsCompleted.at(Video::Poster)) { - TitleLoadJob *job = new TitleLoadJob(this, m_subtitlePath, m_posterPath); + TitleLoadJob *job = new TitleLoadJob(this); connect(job, SIGNAL(completed(bool)), this, SLOT(completedJob(bool))); m_jobsInProgress.setBit(Video::TitleLoad, true); return job; @@ -131,8 +131,6 @@ void Video::setDvdImage(const QString &path) if (image.exists() && image != QFileInfo(path)) QFile::remove(m_imagePath); QFile::rename(path, m_imagePath); - m_dvdTitle = 1; - m_dvdTitles = EncodeMP4Job::titles(m_imagePath); m_jobsCompleted.setBit(Video::DVDImage, true); saveState(); m_jobsInProgress.setBit(Video::DVDImage, false); @@ -188,3 +186,19 @@ void Video::setDvdTitles(QMap titles) m_dvdTitles = titles; saveState(); } +QString Video::imagePath() const +{ + return m_imagePath; +} +QString Video::encodePath() const +{ + return m_encodePath; +} +QString Video::posterPath() const +{ + return m_posterPath; +} +QString Video::subtitlePath() const +{ + return m_subtitlePath; +} diff --git a/video.h b/video.h index e5449dc..ec24ab2 100644 --- a/video.h +++ b/video.h @@ -35,6 +35,10 @@ public: bool isJobCompleted(Video::Jobs job) const; void setDvdTitles(QMap titles); QMap dvdTitles() const; + QString imagePath() const; + QString encodePath() const; + QString subtitlePath() const; + QString posterPath() const; private: QBitArray m_jobsCompleted; QBitArray m_jobsInProgress; -- cgit v1.2.3-59-g8ed1b