#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "filedisplay.h" #include "helper.h" FileDisplay::FileDisplay(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { QTabWidget *tabW = new QTabWidget; mDBData = new DBData; mFileData = new FileData; tabW->addTab(mDBData, tr("Database")); tabW->addTab(mFileData, tr("File")); //button layout QHBoxLayout *buttonL = new QHBoxLayout; QPushButton *closeBtn = new QPushButton(tr("Close")); connect(closeBtn, &QPushButton::clicked, this, &FileDisplay::hide); buttonL->addStretch(); buttonL->addWidget(closeBtn); buttonL->addStretch(); //dialog layout QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabW); mainLayout->addLayout(buttonL); setLayout(mainLayout); setWindowTitle(tr("File Info")); readSettings(); } FileDisplay::~FileDisplay(){ writeSettings(); } void FileDisplay::setFileData(const QString &fullPath, const QString &md5Sum) { mFullPath = fullPath; mMd5 = md5Sum; mDBData->setFileData(fullPath, md5Sum); mFileData->setFileData(fullPath); } void FileDisplay::readSettings(){ QSettings s; QByteArray geometry = s.value("fd/geometry").toByteArray(); restoreGeometry(geometry); QSize size = s.value("fd/size").toSize(); resize(size); } void FileDisplay::writeSettings(){ QSettings s; s.value("fd/geometry", saveGeometry()); s.setValue("fd/size", size()); } DBData::DBData(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) { QLabel *seriesNameL = new QLabel(tr("Series")); mSeriesName = new QLineEdit; mSeriesName->setReadOnly(true); QLabel *fullPathL = new QLabel(tr("File")); mFullPath = new QLineEdit; mFullPath->setReadOnly(true); QLabel *md5L = new QLabel(tr("MD5")); mMd5 = new QLineEdit; mMd5->setReadOnly(true); QGridLayout *topL = new QGridLayout; topL->addWidget(seriesNameL, 0, 0); topL->addWidget(mSeriesName, 0, 1); topL->addWidget(fullPathL, 1, 0); topL->addWidget(mFullPath, 1, 1); topL->addWidget(md5L, 2, 0); topL->addWidget(mMd5, 2, 1); QGroupBox *topGB = new QGroupBox(tr("General")); topGB->setLayout(topL); mActors = new QTextEdit; mActors->setReadOnly(true); QGroupBox *actorsGB = new QGroupBox(tr("Actors")); QHBoxLayout *actorsGBL = new QHBoxLayout; actorsGBL->addWidget(mActors); actorsGB->setLayout(actorsGBL); mGenres = new QTextEdit; mGenres->setReadOnly(true); QGroupBox *genresGB = new QGroupBox(tr("Genres")); QHBoxLayout *genresGBL = new QHBoxLayout; genresGBL->addWidget(mGenres); genresGB->setLayout(genresGBL); QHBoxLayout *textL = new QHBoxLayout; textL->addWidget(genresGB); textL->addWidget(actorsGB); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(topGB); mainLayout->addLayout(textL); setLayout(mainLayout); } void DBData::setFileData(const QString &fullPath, const QString &md5Sum){ mFullPath->setText(QDir::toNativeSeparators(fullPath)); mFullPath->home(false); mMd5->setText(md5Sum); gatherData(); } void DBData::gatherData(){ const QString &md5 = mMd5->text(); const QString &fp = mFullPath->text(); QSqlDatabase db = QSqlDatabase::database("shemovdb"); if(!db.isOpen()){ db.open(); } //series name QVariantList seriesRes; QSqlQuery seriesQ1(db); seriesQ1.prepare("SELECT series.tseries_name, seriesparts.tsubtitle, seriesparts.iseriespart, seriesparts.iseriesparts_id FROM files, seriesparts, series WHERE files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id AND files.cmd5sum = :md5"); seriesQ1.bindValue(":md5", md5); seriesQ1.exec(); while(seriesQ1.next()){ seriesRes << seriesQ1.value(0) << seriesQ1.value(1) << seriesQ1.value(2) << seriesQ1.value(3); } if(seriesRes.isEmpty()){ QSqlQuery seriesQ2(db); seriesQ2.prepare("SELECT series.tseries_name, seriesparts.tsubtitle, seriesparts.iseriespart, seriesparts.iseriesparts_id FROM files_origin, files, seriesparts, series WHERE files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id AND files_origin.cmd5sum = :md5 AND files_origin.ifiles_id = files.ifiles_id"); seriesQ2.bindValue(":md5", md5); seriesQ2.exec(); while(seriesQ2.next()){ seriesRes << seriesQ2.value(0) << seriesQ2.value(1) << seriesQ2.value(2) << seriesQ2.value(3); } } if(seriesRes.isEmpty()){ mActors->setText(tr("not in database!")); mGenres->setText(tr("not in database!")); mSeriesName->clear(); return; } QString seriesName(seriesRes.at(0).toString()); if(seriesRes.at(1).isValid()){ seriesName.append(QString(" - %1").arg(seriesRes.at(1).toString())); } if(seriesRes.at(2).toInt()){ seriesName.append(QString(" - %1").arg(seriesRes.at(2).toString())); } mSeriesName->setText(seriesName); //actors int seriesPartId = seriesRes.at(3).toInt(); QSqlQuery actorsQ(db); actorsQ.prepare("SELECT actors.tactorname FROM actors, seriesparts, seriesparts_actormap WHERE actors.iactors_id = seriesparts_actormap.iactors_id AND seriesparts_actormap.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseriesparts_id = :id ORDER BY actors.tactorname"); QStringList actors; actorsQ.bindValue(":id", seriesPartId); actorsQ.exec(); while(actorsQ.next()){ actors << actorsQ.value(0).toString(); } QString actorsText = actors.join("\n"); mActors->setText(actorsText); //genres QSqlQuery genresQ(db); genresQ.prepare("SELECT genres.tgenrename FROM genres, seriesparts, seriesparts_genremap WHERE genres.igenres_id = seriesparts_genremap.igenres_id AND seriesparts_genremap.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseriesparts_id = :id ORDER BY genres.tgenrename"); QStringList genres; genresQ.bindValue(":id", seriesPartId); genresQ.exec(); while(genresQ.next()){ genres << genresQ.value(0).toString(); } 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); readHeaderData(); } FileData::~FileData(){ writeHeaderData(); } void FileData::setFileData(const QString &fullPath){ mModel->clear(); mModel->setHorizontalHeaderLabels(QStringList() << tr("Key") << tr("Value")); 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() << 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); readHeaderData(); } 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)); } if(it.key() == "filename"){ data[1] = QDir::toNativeSeparators(it.value().toString()); } 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() << 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); } }