summaryrefslogtreecommitdiffstats
path: root/filedisplay.cpp
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2016-09-03 21:03:34 +0200
committerArno <arno@disconnect.de>2016-09-03 21:03:34 +0200
commite11e257f88726fd04774bf0ca4584d1678bc7f9b (patch)
tree848c1f16d09f1a06afd7d638f40b6e39e4cd6ead /filedisplay.cpp
parentb49c6828a92590311712d766d54c15596f13addf (diff)
downloadShemovCleaner-e11e257f88726fd04774bf0ca4584d1678bc7f9b.tar.gz
ShemovCleaner-e11e257f88726fd04774bf0ca4584d1678bc7f9b.tar.bz2
ShemovCleaner-e11e257f88726fd04774bf0ca4584d1678bc7f9b.zip
Add detailed video dialog
Show each and everything ffprobe can extract from a video file and display it as a tree.
Diffstat (limited to 'filedisplay.cpp')
-rw-r--r--filedisplay.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/filedisplay.cpp b/filedisplay.cpp
index bce77d9..fe832b1 100644
--- a/filedisplay.cpp
+++ b/filedisplay.cpp
@@ -11,13 +11,23 @@
#include <QPushButton>
#include <QGroupBox>
#include <QDir>
+#include <QTreeView>
+#include <QStandardItemModel>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonArray>
+#include <QSettings>
+#include <QHeaderView>
#include "filedisplay.h"
+#include "helper.h"
FileDisplay::FileDisplay(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) {
mTab = new QTabWidget;
mDBData = new DBData;
+ mFileData = new FileData;
mTab->addTab(mDBData, tr("Database"));
+ mTab->addTab(mFileData, tr("File"));
//button layout
QHBoxLayout *buttonL = new QHBoxLayout;
@@ -39,6 +49,7 @@ void FileDisplay::setFileData(const QString &fullPath, const QString &md5Sum) {
mFullPath = fullPath;
mMd5 = md5Sum;
mDBData->setFileData(fullPath, md5Sum);
+ mFileData->setFileData(fullPath);
}
DBData::DBData(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) {
@@ -153,3 +164,90 @@ void DBData::gatherData(){
QString genresText = genres.join("\n");
mGenres->setText(genresText);
}
+
+FileData::FileData(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f){
+ mView = new QTreeView;
+ mModel = new QStandardItemModel;
+ mView->setModel(mModel);
+ QGroupBox *gb = new QGroupBox(tr("ffprobe Output"));
+ QHBoxLayout *gbLayout = new QHBoxLayout;
+ gbLayout->addWidget(mView);
+ gb->setLayout(gbLayout);
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addWidget(gb);
+ setLayout(mainLayout);
+}
+
+FileData::~FileData(){
+ writeHeaderData();
+}
+
+void FileData::setFileData(const QString &fullPath){
+ mModel->clear();
+ mModel->setHorizontalHeaderLabels(QStringList() << tr("Key") << tr("Value"));
+ readHeaderData();
+ QJsonDocument jDoc = Helper::ffpmegData(fullPath);
+ QStandardItem *rootItem = mModel->invisibleRootItem();
+ rootItem->setColumnCount(2);
+ QStandardItem *streamItem = new QStandardItem(tr("Stream"));
+ streamItem->setEditable(false);
+ rootItem->appendRow(streamItem);
+ QStandardItem *formatItem = new QStandardItem(tr("Format"));
+ formatItem->setEditable(false);
+ rootItem->appendRow(formatItem);
+
+ QJsonObject jObject = jDoc.object();
+ FileDataRecursive(jObject.value("format"), formatItem);
+ QJsonArray streams = jObject.value("streams").toArray();
+ for(int i = 0; i < streams.size(); ++i){
+ QString itemName = QString(tr("Stream %1 [%2]")).arg(QString::number(i + 1)).arg(streams.at(i).toObject().value("codec_type").toString());
+ QStandardItem *item = new QStandardItem(itemName);
+ item->setEditable(false);
+ QStandardItem *item2 = new QStandardItem;
+ item2->setEditable(false);
+ streamItem->appendRow(QList<QStandardItem*>() << item << item2);
+ QStandardItem *next = streamItem->child(i, 0);
+ FileDataRecursive(streams.at(i), next);
+ }
+ QModelIndex i1 = mModel->indexFromItem(streamItem);
+ mView->expand(i1);
+ QModelIndex i2 = mModel->indexFromItem(formatItem);
+ mView->expand(i2);
+}
+
+void FileData::FileDataRecursive(QJsonValue start, QStandardItem *appendTo){
+ QJsonObject startObject = start.toObject();
+ QJsonObject::const_iterator it;
+ for(it = startObject.constBegin(); it != startObject.constEnd(); ++it){
+ QVariantList data = QVariantList() << it.key() << it.value().toVariant();
+ if(it.key() == "duration"){
+ qint64 seconds = it.value().toString().toDouble();
+ Helper::Duration dur(seconds);
+ data[1] = dur.toString();
+ }
+ if(it.key() == "bit_rate"){
+ qint64 br = it.value().toString().toInt() / 1000;
+ data[1] = QString("%1 kb/s").arg(QString::number(br));
+ }
+ QStandardItem *key = new QStandardItem(data.at(0).toString());
+ key->setEditable(false);
+ QStandardItem *value = new QStandardItem(data.at(1).toString());
+ value->setEditable(false);
+ appendTo->appendRow(QList<QStandardItem*>() << key << value);
+ QStandardItem *newItem = appendTo->child(0, 0);
+ FileDataRecursive(*it, newItem);
+ }
+}
+
+void FileData::writeHeaderData(){
+ QSettings s;
+ s.setValue("fd/fileheaders", mView->header()->saveState());
+}
+
+void FileData::readHeaderData(){
+ QSettings s;
+ QByteArray headers = s.value("fd/fileheaders").toByteArray();
+ if(!headers.isEmpty()){
+ mView->header()->restoreState(headers);
+ }
+}