summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2009-09-27 17:21:26 -0400
committerJason A. Donenfeld <Jason@zx2c4.com>2009-09-27 17:21:26 -0400
commit89c443bd183ffe579625d94545026d7243207a9f (patch)
tree178480cdedbc7c839cc18f5fd78f4b7b08c36cbc
parentAdd from ISO (diff)
downloadAnyRip-89c443bd183ffe579625d94545026d7243207a9f.tar.xz
AnyRip-89c443bd183ffe579625d94545026d7243207a9f.zip
Termination, slotted dvd title loading, framework fixes.
-rw-r--r--AnyRip.pro6
-rw-r--r--dvdimagejob.cpp62
-rw-r--r--dvdimagejob.h12
-rw-r--r--encodemp4job.cpp87
-rw-r--r--encodemp4job.h13
-rw-r--r--job.cpp20
-rw-r--r--job.h5
-rw-r--r--mainwindow.cpp23
-rw-r--r--newdvdgui.cpp16
-rw-r--r--newdvdgui.h6
-rw-r--r--newimagegui.cpp2
-rw-r--r--titleloader.cpp44
-rw-r--r--titleloader.h25
-rw-r--r--titleloadjob.cpp10
-rw-r--r--titleloadjob.h7
-rw-r--r--uploadjob.cpp9
-rw-r--r--uploadjob.h6
-rw-r--r--video.cpp28
-rw-r--r--video.h4
19 files changed, 279 insertions, 106 deletions
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 <QIODevice>
#include <QFile>
-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 <QReadWriteLock>
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 <QWidget>
#include <QLabel>
-#include <QProcess>
#include <QStringList>
#include <QRegExp>
#include <QTime>
+#include <QFile>
-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<int, QString> 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<int, QString> EncodeMP4Job::titles(const QString &location)
+QWidget* EncodeMP4Job::gui()
{
- QMap<int, QString> 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 <QTime>
#include <QMap>
+#include <QProcess>
class EncodeMP4Job : public Job
{
Q_OBJECT
public:
- EncodeMP4Job(Video *video, QString encodePath, QString imagePath);
+ EncodeMP4Job(Video *video);
+ ~EncodeMP4Job();
Video::Jobs jobType() const;
- static QMap<int, QString> titles(const QString &location);
- QMap<int, QString> 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 <QtConcurrentRun>
-Job::Job(Video *parent)
+Job::Job(Video *parent, bool threaded)
: QObject(parent),
m_gui(0),
m_video(parent)
{
- m_watcher = new QFutureWatcher<bool>;
- m_watcher->setParent(this);
- connect(m_watcher, SIGNAL(finished()), this, SLOT(jobFinished()));
+ if (threaded) {
+ m_watcher = new QFutureWatcher<bool>;
+ 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<bool>* 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<bool>* watcher() const;
private:
QFutureWatcher<bool> *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<Video*> 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 <QLabel>
#include <QLineEdit>
#include <QPushButton>
@@ -14,9 +15,8 @@ NewDVDGui::NewDVDGui() :
m_loadingTitles(tr("<i>%1 inserted. Scanning titles...</i>")),
m_ripping(tr("Created new video from DVD."))
{
- m_watcher = new QFutureWatcher<QMap<int, QString> >;
- 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<int,QString>)), this, SLOT(loadedTitles(QMap<int,QString>)));
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<int, QString> 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 <QGroupBox>
#include <QMap>
-#include <QFutureWatcher>
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<QMap<int, QString> > *m_watcher;
+ TitleLoader *m_titleLoader;
private slots:
void dvdAdded();
void dvdRemoved();
void validateName(const QString &name);
void rip();
- void loadedTitles();
+ void loadedTitles(QMap<int, QString> titles);
signals:
void newDVD(QString name, QMap<int, QString> 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<int, QString> 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<int,QString>());
+}
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 <QObject>
+#include <QMap>
+#include <QProcess>
+
+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<int, QString> 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 <QWidget>
#include <QLabel>
-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 <QWidget>
#include <QLabel>
-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<int, QString> 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<int, QString> titles);
QMap<int, QString> dvdTitles() const;
+ QString imagePath() const;
+ QString encodePath() const;
+ QString subtitlePath() const;
+ QString posterPath() const;
private:
QBitArray m_jobsCompleted;
QBitArray m_jobsInProgress;