summaryrefslogtreecommitdiffstats
path: root/filestreemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filestreemodel.cpp')
-rw-r--r--filestreemodel.cpp125
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:
;
}