summaryrefslogtreecommitdiffstats
path: root/helper.cpp
blob: db113ec7906b9b6e1d10aa3057083cc6612f4dc8 (plain)
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;
    }
}