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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#include <QFile>
#include <QFileInfo>
#include <QCryptographicHash>
#include <QByteArray>
#include <QSettings>
#include <QProcess>
#include "helper.h"
namespace Helper {
const QString md5Sum(const QString &path){
QFileInfo info(path);
if(!info.exists() || !info.isFile()){
return QString();
}
QString retval;
QCryptographicHash h(QCryptographicHash::Md5);
QFile file(path);
file.open(QIODevice::ReadOnly);
qint64 read = 0;
if(info.size() < (5 * 1024 * 1024)){
QByteArray data(4096, '\0');
do {
read = file.read(data.data(), 4096);
if(read > 0){
h.addData(data.data(), read);
}
} while (read == 4096);
QByteArray res = h.result();
retval = res.toHex().toLower();
}else{
QByteArray data(512, '\0');
int offset = info.size() / 3;
file.seek(offset);
int numBytes = 512 * 1024;
int readBytes = 0;
do {
read = file.read(data.data(), 512);
if(read > 0){
readBytes += read;
}else{
return QString();
}
h.addData(data.data(), read);
} while(readBytes < numBytes);
QByteArray res = h.result();
retval = res.toHex().toLower();
}
return retval;
}
const QJsonDocument ffpmegData(const QString &path){
QSettings s;
QString ffProbe = s.value("ext/ffprobe").toString();
QStringList args;
args << "-v" << "quiet" << "-print_format" << "json" << "-show_format" << "-show_streams" << path;
QProcess ffproc;
ffproc.start(ffProbe, args);
if(!ffproc.waitForStarted()){
return QJsonDocument();
}
ffproc.waitForFinished();
QByteArray ffData = ffproc.readAllStandardOutput();
return QJsonDocument::fromJson(ffData);
}
Duration::Duration() : mHours(0), mMinutes(0), mSeconds(0) {}
Duration::Duration(qint64 seconds){
int sec(0), min(0), h(0);
// get hours
h = (seconds / 60 / 60);
// remaining minutes
min = (seconds / 60) % 60;
// seconds
sec = seconds % 60;
mHours = h;
mMinutes = min;
mSeconds = sec;
}
Duration::Duration(const QString &dur) : mHours(0), mMinutes(0), mSeconds(0){
QStringList parts = dur.split(':');
if(parts.size() == 3){
mHours = parts.at(0).toInt();
mMinutes = parts.at(1).toInt();
mSeconds = parts.at(2).toInt();
}
}
Duration Duration::operator+(const Duration &dur) const{
Duration retval;
retval.mSeconds = mSeconds + dur.mSeconds;
retval.mMinutes = mMinutes + dur.mMinutes + retval.mSeconds / 60;
retval.mSeconds %= 60;
retval.mHours = mHours + dur.mHours + retval.mMinutes / 60;
retval.mMinutes %= 60;
return retval;
}
const QString Duration::toString() const {
QString retval = QString("%1:%2:%3").arg(QString::number(mHours), 2, '0').arg(QString::number(mMinutes), 2, '0').arg(QString::number(mSeconds), 2, '0');
return retval;
}
bool Duration::isNull() const {
return mHours == 0 && mMinutes == 0 && mSeconds == 0;
}
qint64 Duration::toSeconds() const {
qint64 retval;
retval = mHours * 60 * 60 + mMinutes * 60 + mSeconds;
return retval;
}
}
|