1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include "titleloader.h"
TitleLoader::TitleLoader(const QString &location, QObject *parent) :
QObject(parent),
m_location(location)
{
}
TitleLoader::TitleLoader(QObject *parent) :
QObject(parent),
m_location(QString())
{
}
void TitleLoader::setLocation(const QString &location)
{
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>());
}
|