diff options
Diffstat (limited to 'filestreemodel.cpp')
-rw-r--r-- | filestreemodel.cpp | 125 |
1 files changed, 103 insertions, 22 deletions
diff --git a/filestreemodel.cpp b/filestreemodel.cpp index c44e449..fd42802 100644 --- a/filestreemodel.cpp +++ b/filestreemodel.cpp @@ -13,6 +13,9 @@ #include <QSettings> #include <QProcess> #include <QImage> +#include <QDataStream> +#include <QDesktopServices> +#include <QDir> #include "filestreemodel.h" #include "smtreeitem.h" @@ -20,7 +23,7 @@ #include "seriestreemodel.h" #include "smglobals.h" -FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mMode(Normal){ +FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mMode(Normal), mMagic(0xAABBCCDD){ //database setup mDb = QSqlDatabase::database("treedb"); mUpdateDvdQuery = new QSqlQuery(mDb); @@ -51,6 +54,7 @@ FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeMo //misc mSeriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); + readCache(); } FilesTreeModel::~FilesTreeModel(){ @@ -265,16 +269,12 @@ QHash<QString, QString> FilesTreeModel::filesBySeriesPartId(int seriesPartId) co return retval; } -QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QModelIndex &idx){ +QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QString &path) const{ QList<QMap<QString, QString> > retval; - if(!idx.isValid()){ - return retval; - } QSettings s; QString ffProbe = s.value("paths/ffprobe").toString(); - QString fullPath = idx.data(FullPathRole).toString(); QStringList args; - args << "-show_streams" << fullPath; + args << "-show_streams" << path; QProcess ffproc; ffproc.start(ffProbe, args); if(!ffproc.waitForStarted()){ @@ -301,13 +301,13 @@ QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QModelIndex &idx return retval; } -QMap<QString, QString> FilesTreeModel::pictureInfo(const QModelIndex &idx){ +QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QModelIndex &idx) const{ + return streamInfo(idx.data(FullPathRole).toString()); +} + +QMap<QString, QString> FilesTreeModel::pictureInfo(const QString &path) const{ QMap<QString, QString> retval; - if(!idx.isValid()){ - return retval; - } - QString fullPath = idx.data(FullPathRole).toString(); - QImage img(fullPath); + QImage img(path); if(img.isNull()){ return retval; } @@ -322,6 +322,10 @@ QMap<QString, QString> FilesTreeModel::pictureInfo(const QModelIndex &idx){ return retval; } +QMap<QString, QString> FilesTreeModel::pictureInfo(const QModelIndex &idx) const{ + return pictureInfo(idx.data(FullPathRole).toString()); +} + QMap<QString, QString> FilesTreeModel::pictureMetaInfo(const QModelIndex &idx){ QMap<QString, QString> retval; if(!idx.isValid()){ @@ -404,12 +408,55 @@ bool FilesTreeModel::deleteFiles(const QModelIndexList &files){ return true; } +void FilesTreeModel::readCache(){ + QString settingsDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation); + QString cacheFile = QString("%1/%2").arg(settingsDir).arg("sizeduration.cache"); + QFileInfo fi(cacheFile); + if(!fi.exists()){ + return; + } + QFile cache(cacheFile); + cache.open(QIODevice::ReadOnly); + QDataStream stream(&cache); + qint32 magic; + stream >> magic; + if(magic != mMagic){ + QFile::remove(cacheFile); + return; + } + while(!stream.atEnd()){ + QString key, value; + stream >> key; + stream >> value; + mPicsDurationCache.insert(key, value); + } +} + +void FilesTreeModel::writeCache(){ + QString settingsDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation); + QFileInfo fi(settingsDir); + if(!fi.exists()){ + QDir root = QDir::root(); + root.mkpath(settingsDir); + } + QString cacheFile = QString("%1/%2").arg(settingsDir).arg("sizeduration.cache"); + QFile cache(cacheFile); + cache.open(QIODevice::WriteOnly); + QDataStream stream(&cache); + stream << mMagic; + QHash<QString, QString>::const_iterator it = mPicsDurationCache.constBegin(); + while(it != mPicsDurationCache.constEnd()){ + stream << it.key() << it.value(); + ++it; + } +} + void FilesTreeModel::populate(QSqlQuery &filesQuery){ - SmTreeItem *root = new SmTreeItem(11); - SmTreeItem *files = new SmTreeItem(11, root); + SmTreeItem *root = new SmTreeItem(14); + SmTreeItem *files = new SmTreeItem(14, root); files->setData(FileName, tr("Movies")); root->appendChild(files); - SmTreeItem *covers = new SmTreeItem(11, root); + SmTreeItem *covers = new SmTreeItem(14, root); covers->setData(FileName, tr("Covers")); root->appendChild(covers); QLocale l; @@ -430,19 +477,53 @@ void FilesTreeModel::populate(QSqlQuery &filesQuery){ data << filesQuery.value(10); //seriespart QString displayName = QString("%1 %2").arg(filesQuery.value(9).toString()).arg(filesQuery.value(10).toString()); data << displayName; + data << tr("N/A"); // duration or size + QString fullPath = data.at(FullPath).toString(); + QFileInfo fi(fullPath); switch(filesQuery.value(5).toInt()){ case Movie:{ - SmTreeItem *item = new SmTreeItem(data, files); - files->appendChild(item); - break; + if(fi.exists()){ + if(mPicsDurationCache.contains(fullPath)){ + data[SizeDuration] = mPicsDurationCache.value(fullPath); + SmTreeItem *item = new SmTreeItem(data, files); + files->appendChild(item); + break; + } + QList<QMap<QString, QString> > sInfo = streamInfo(fullPath); + for(int i = 0; i < sInfo.size(); ++i){ + QString duration = sInfo.at(i).value("duration"); + if(!duration.isEmpty() && (duration != "N/A")){ + QString durFromSeconds = Helper::durationFromSecs(duration.toFloat()); + mPicsDurationCache.insert(fullPath, durFromSeconds); + data[SizeDuration] = durFromSeconds; + } + } } + SmTreeItem *item = new SmTreeItem(data, files); + files->appendChild(item); + break; + } case FrontCover: case BackCover: case GeneralCover:{ - SmTreeItem *item = new SmTreeItem(data, covers); - covers->appendChild(item); - break; + if(fi.exists()){ + if(mPicsDurationCache.contains(fullPath)){ + data[SizeDuration] = mPicsDurationCache.value(fullPath); + SmTreeItem *item = new SmTreeItem(data, files); + covers->appendChild(item); + break; + } } + QMap<QString, QString> pInfo = pictureInfo(fullPath); + if(!pInfo.isEmpty()){ + QString setVal = QString("%1x%2").arg(pInfo.value("Width")).arg(pInfo.value("Height")); + mPicsDurationCache.insert(fullPath, setVal); + data[SizeDuration] = setVal; + } + SmTreeItem *item = new SmTreeItem(data, covers); + covers->appendChild(item); + break; + } default: ; } |