-
Notifications
You must be signed in to change notification settings - Fork 0
/
xmltosrtconverter.cpp
82 lines (70 loc) · 2.71 KB
/
xmltosrtconverter.cpp
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "xmltosrtconverter.h"
#include <QDir>
#include <QFile>
#include <QBuffer>
#include <QStringList>
#include <QXmlStreamReader>
#include <QTemporaryFile>
#define BUF_SIZE 8096
XmlToSrtConverter::XmlToSrtConverter(const QByteArray & input) {
QBuffer buffer(&m_buffer);
buffer.open(QIODevice::WriteOnly);
QXmlStreamReader xml_reader(input);
if (xml_reader.readNextStartElement() && xml_reader.name() == "transcript") {
int index = 0;
while (xml_reader.readNextStartElement()) {
QXmlStreamAttributes attributes = xml_reader.attributes();
if (xml_reader.name() != "text" || !attributes.hasAttribute("start") || !attributes.hasAttribute("dur")) {
xml_reader.skipCurrentElement();
continue;
}
bool ok;
QString s0 = attributes.value("start").toString();
buffer.write(QString("%1\n%2 --> %3\n%4\n\n").arg(++index).arg(formatSrtTime(s0)).arg(formatSrtTime(QString::number(s0.toDouble(&ok) + attributes.value("dur").toString().toDouble(&ok),'f',3))).arg(xml_reader.readElementText().replace("'", "'").replace(""", "\"").replace(">", ">").replace("<", "<")).toUtf8());
if (!ok) {
xml_reader.skipCurrentElement();
continue;
}
}
if (buffer.size() > 0) return;
}
buffer.close();
m_buffer.clear();
return;
}
bool XmlToSrtConverter::writeToSrtTempFile(const QByteArray & input,QString & tempFileName) {
QTemporaryFile file(QDir::tempPath() + QDir::separator() + "XXXXXX.srt");
file.setAutoRemove(false);
if (!file.open()) return false;
tempFileName= file.fileName();
return writeToSrtFile(input,tempFileName);
}
bool XmlToSrtConverter::writeToSrtFile(const QByteArray & input,const QString & fileName) {
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) return false;
QByteArray result = XmlToSrtConverter(input).result();
QBuffer in_buffer(&result);
in_buffer.open(QBuffer::ReadOnly);
while (!in_buffer.atEnd()) {
if (file.write(in_buffer.read(BUF_SIZE)) == -1) return false;
}
return true;
}
QString XmlToSrtConverter::formatSrtTime(const QString & time) const {
QStringList parts = time.split('.');
if (parts.count() < 2) parts = (time+".0").split('.');
bool ok;
int s = parts.at(0).toInt(&ok);
if (!ok) return QString();
int m = s / 60;
s = s % 60;
int h = m / 60;
m = m % 60;
#if QT_VERSION < 0x050000
QString ret;
ret.sprintf("%02d:%02d:%02d,%s",h,m,s,parts.at(1).toLocal8Bit().data());
return ret;
#else
return QString::asprintf("%02d:%02d:%02d,%s",h,m,s,parts.at(1).toLocal8Bit().data());
#endif
}