diff options
author | Arno <am@disconnect.de> | 2014-12-07 12:40:35 +0100 |
---|---|---|
committer | Arno <am@disconnect.de> | 2014-12-07 12:40:35 +0100 |
commit | 51bc87ebc73b5777ad36e35ec20445b07a0d7639 (patch) | |
tree | 71b7b02041a5a728cf7dc2b62892328d3bd2d907 | |
parent | bd3716dcab86c7d3e018004a1f26b470a7f6cfb7 (diff) | |
download | SheMov-51bc87ebc73b5777ad36e35ec20445b07a0d7639.tar.gz SheMov-51bc87ebc73b5777ad36e35ec20445b07a0d7639.tar.bz2 SheMov-51bc87ebc73b5777ad36e35ec20445b07a0d7639.zip |
Redesign of NewMovieWizard
Make it possible to add parent files to files, so we can identify
already downloaded files even if we reencoded them. Record the md5sum in
a new table files_origin.
-rw-r--r-- | archivemodel.cpp | 18 | ||||
-rw-r--r-- | archivemodel.h | 2 | ||||
-rw-r--r-- | archiveview.cpp | 78 | ||||
-rw-r--r-- | archiveview.h | 11 | ||||
-rw-r--r-- | newmoviewizard.cpp | 107 | ||||
-rw-r--r-- | newmoviewizard.h | 11 | ||||
-rw-r--r-- | smglobals.cpp | 1 | ||||
-rw-r--r-- | smglobals.h | 1 |
8 files changed, 130 insertions, 99 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index 1da5833..ff37e73 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -603,24 +603,6 @@ bool ArchiveModel::addSeriesPart(int partno, QString subtitle, const QModelIndex return false; } -QStringList ArchiveModel::allSources() const{ - QSqlQuery sQ("SELECT DISTINCT(tsourcemedium) FROM metadata ORDER BY tsourcemedium ASC", mDb); - QStringList retval; - while(sQ.next()){ - retval << sQ.value(0).toString(); - } - return retval; -} - -QStringList ArchiveModel::allReleaseGroups() const{ - QSqlQuery rQ("SELECT DISTINCT(treleasegroup) FROM metadata ORDER BY treleasegroup ASC", mDb); - QStringList retval; - while(rQ.next()){ - retval << rQ.value(0).toString(); - } - return retval; -} - void ArchiveModel::setOrder(int order) { mOrder = order; SmTreeItem *rootItem = readCache(mOrder); diff --git a/archivemodel.h b/archivemodel.h index 0c66b0d..6903cfd 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -50,8 +50,6 @@ class ArchiveModel : public SmTreeModel { QString metadata(int partId) const; QList<QVariant> metadataList(int partId) const; void setMetadata(int partId, const QList<QVariant> &data); - QStringList allSources() const; - QStringList allReleaseGroups() const; bool setPartNo(int partId, int newPartId, const QString &subtitle); bool setFavorite(int partId, bool favorite); void addFiles(int partId, const QStringList files); diff --git a/archiveview.cpp b/archiveview.cpp index 2f4c77c..95fc7aa 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -11,9 +11,12 @@ #include <QInputDialog> #include <QLabel> #include <QLineEdit> +#include <QRadioButton> +#include <QFileDialog> #include <QMessageBox> #include <QPushButton> #include <QSettings> +#include <QStandardPaths> #include <QSplitter> #include <QVBoxLayout> #include <QHeaderView> @@ -361,10 +364,6 @@ void ArchiveTree::editMetadata(){ } MetadataEditor e(this); ArchiveController *c = SmGlobals::instance()->archiveController(); - QStringList sources = c->archiveTreeModel()->allSources(); - e.widget()->setSources(sources); - QStringList relGroups = c->archiveTreeModel()->allReleaseGroups(); - e.widget()->setReleaseGroups(relGroups); int pId = idx.data(ArchiveModel::SeriesPartIdRole).toInt(); QList<QVariant> curMetadata = c->archiveTreeModel()->metadataList(pId); e.widget()->setMetadata(curMetadata); @@ -741,61 +740,55 @@ MappingEditor::MappingEditor(const QString &caption, QWidget *parent, Qt::Window /* Metadata Editor Widget */ -MetadataEditorWidget::MetadataEditorWidget(QWidget *parent) : QWidget(parent) { +MetadataEditorWidget::MetadataEditorWidget(QWidget *parent) : QWidget(parent){ QLabel *captionL = new QLabel(tr("<b>Edit Metadata</b>")); - QFormLayout *dataLayout = new QFormLayout; + QGroupBox *genGB = new QGroupBox(tr("General")); + QFormLayout *genGBL = new QFormLayout; mReleaseYear = new QSpinBox; mReleaseYear->setMinimum(1900); mReleaseYear->setMaximum(3000); - dataLayout->addRow(tr("&Release Year"), mReleaseYear); - mSource = new QComboBox; - mSource->setEditable(true); - dataLayout->addRow(tr("&Source"), mSource); - mRelGroup = new QComboBox; - mRelGroup->setEditable(true); - dataLayout->addRow(tr("Release &Group"), mRelGroup); + genGBL->addRow(tr("&Release Year"), mReleaseYear); mSubject = new QLineEdit; - dataLayout->addRow(tr("Sub&ject"), mSubject); - mEncoderOpts = new QLineEdit; - dataLayout->addRow(tr("&Encoder Opts."), mEncoderOpts); - mPasses = new QSpinBox; - mPasses->setMinimum(0); - mPasses->setMaximum(10); - dataLayout->addRow(tr("&Passes"), mPasses); - - QVBoxLayout *commentLayout = new QVBoxLayout; - QLabel *commentL = new QLabel(tr("<b>Comment</b>")); - commentLayout->addWidget(commentL); + genGBL->addRow(tr("Name/Sub&ject"), mSubject); + genGB->setLayout(genGBL); + + QGroupBox *srcGB = new QGroupBox(tr("Source")); + QHBoxLayout *srcGBL = new QHBoxLayout; + mTorrent = new QRadioButton(tr("BitTorrent")); + mUsenet = new QRadioButton(tr("Usenet")); + srcGBL->addWidget(mTorrent); + srcGBL->addWidget(mUsenet); + srcGBL->addStretch(); + srcGB->setLayout(srcGBL); + + //comment + QGroupBox *commentGB = new QGroupBox(tr("Comment")); mComment = new QTextEdit; - commentLayout->addWidget(mComment); - - mWidgets << mReleaseYear << mSource << mRelGroup << mSubject << mEncoderOpts << mPasses << mComment; + QHBoxLayout *commentGBL = new QHBoxLayout; + commentGBL->addWidget(mComment); + commentGB->setLayout(commentGBL); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(captionL); - mainLayout->addLayout(dataLayout); - mainLayout->addLayout(commentLayout); - setLayout(mainLayout); -} -void MetadataEditorWidget::setSources(const QStringList &sources){ - mSource->clear(); - mSource->addItems(sources); -} + mainLayout->addWidget(genGB); + mainLayout->addWidget(srcGB); + mainLayout->addWidget(commentGB); + setLayout(mainLayout); -void MetadataEditorWidget::setReleaseGroups(const QStringList &relGroups){ - mRelGroup->clear(); - mRelGroup->addItems(relGroups); + connect(this, SIGNAL(oldSelected(QString)), this, SLOT(setOld(QString))); } void MetadataEditorWidget::setMetadata(const QList<QVariant> &data){ mReleaseYear->setValue(data.at(ArchiveModel::ReleaseYear).toInt()); - mSource->setCurrentText(data.at(ArchiveModel::Source).toString()); + QString src = data.at(ArchiveModel::Source).toString(); + if(src == "torrent"){ + mTorrent->toggle(); + }else{ + mUsenet->toggle(); + } mSubject->setText(data.at(ArchiveModel::Subject).toString()); - mRelGroup->setCurrentText(data.at(ArchiveModel::ReleaseGroup).toString()); - mEncoderOpts->setText(data.at(ArchiveModel::EncoderOpts).toString()); - mPasses->setValue(data.at(ArchiveModel::Passes).toInt()); mComment->setText(data.at(ArchiveModel::Comment).toString()); mAdded = data.at(ArchiveModel::Added).toDate(); } @@ -823,7 +816,6 @@ void MetadataEditorWidget::setEnabledAll(bool enabled){ } /* Metadata Editor */ - MetadataEditor::MetadataEditor(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ mWidget = new MetadataEditorWidget; diff --git a/archiveview.h b/archiveview.h index e6f741d..ffb4c0d 100644 --- a/archiveview.h +++ b/archiveview.h @@ -35,6 +35,7 @@ class QSpinBox; class QToolBar; class QMouseEvent; class QDragEnterEvent; +class QRadioButton; class ArchiveView : public QWidget { Q_OBJECT @@ -201,13 +202,14 @@ class MetadataEditorWidget : public QWidget { Q_OBJECT public: explicit MetadataEditorWidget(QWidget *parent = 0); - void setSources(const QStringList &sources); - void setReleaseGroups(const QStringList &relGroups); void setMetadata(const QList<QVariant> &data); QList<QVariant> metadata() const; public slots: - void setEnabledAll(bool enabled); + void setEnabledAll(bool enabled); + + signals: + void oldSelected(const QString &); private: QSpinBox *mReleaseYear; @@ -217,6 +219,9 @@ class MetadataEditorWidget : public QWidget { QLineEdit *mEncoderOpts; QSpinBox *mPasses; QTextEdit *mComment; + QRadioButton *mTorrent; + QRadioButton *mUsenet; + QLineEdit *mOldSizeLE; QDate mAdded; QList<QWidget*> mWidgets; }; diff --git a/newmoviewizard.cpp b/newmoviewizard.cpp index 0fe0bae..2500e78 100644 --- a/newmoviewizard.cpp +++ b/newmoviewizard.cpp @@ -23,6 +23,7 @@ #include <QFileInfo> #include <QPixmap> #include <QHeaderView> +#include <QSortFilterProxyModel> #include "newmoviewizard.h" #include "smtreeitem.h" @@ -113,9 +114,12 @@ void NewMovieWizard::accept(){ WizardTreeModel *wizardModel = movieInfoPage->model(); QSqlQuery insertFilesQ(db); insertFilesQ.prepare("INSERT INTO files (iseriespart_id, tfilename, cmd5sum, bisize, sifiletype, sifileno, siquality, cpicsize, iduration) VALUES(:ipid, :tfn, :md5, :size, :ft, :fno, :qual, :psize, :dur)"); + QSqlQuery insertOriginQ(db); + insertOriginQ.prepare("INSERT INTO files_origin (ifiles_id, tname, cmd5sum, bisize, ibitrate) VALUES(:oid, :oname, :omd5, :osize, :obitrate)"); QHash<QString, QString> md5Sums; for(int i = 0; i < wizardModel->rowCount(QModelIndex()); ++i){ - QList<QVariant> fData = wizardModel->fileData(i); + QModelIndex curIdx = wizardModel->index(i, 0, QModelIndex()); + QList<QVariant> fData = wizardModel->fileData(curIdx); QString fullPath = fData.value(WizardTreeModel::FullPath).toString(); QFileInfo fi(fullPath); qint64 size = fi.size(); @@ -125,10 +129,28 @@ void NewMovieWizard::accept(){ QString picSize; int type = fData.value(WizardTreeModel::FileType).toInt(); QVariant quality; + QString oName, oMD5; + qint64 oSize, oldBitrate; + bool hasOrigin = false; if(type == FT_MOVIE){ QVariantMap m = Helper::ffmpegData(fullPath); secs = m.value("duration").toDouble(); quality = field("quality").toInt(); + //check for origin + QModelIndex oIdx = curIdx.child(0, 0); + if(oIdx.isValid()){ + QList<QVariant> oData = wizardModel->fileData(oIdx); + QString oFullPath = oData.value(WizardTreeModel::FullPath).toString(); + QFileInfo oFi(oFullPath); + oName = fi.fileName(); + oSize = oFi.size(); + oMD5 = Helper::md5Sum(oFullPath); + QVariantMap oldFfmpeg = Helper::ffmpegData(oFullPath); + oldBitrate = oldFfmpeg.value("bit_rate").toLongLong(); + oldBitrate /= 1000; + hasOrigin = true; + } + }else{ QPixmap pix(fullPath); picSize = QString("%1x%2").arg(QString::number(pix.width())).arg(QString::number(pix.height())); @@ -142,10 +164,28 @@ void NewMovieWizard::accept(){ insertFilesQ.bindValue(":qual", quality); insertFilesQ.bindValue(":psize", picSize); insertFilesQ.bindValue(":dur", secs); - if(!insertFilesQ.exec()){ + if(insertFilesQ.exec()){ + if(hasOrigin){ + int curFileId = -1; + QSqlQuery curval("SELECT currval('files_ifiles_id__seq')", db); + while(curval.next()){ + curFileId= curval.value(0).toInt(); + } + insertOriginQ.bindValue(":oid", curFileId); + insertOriginQ.bindValue(":oname", oName); + insertOriginQ.bindValue(":omd5", oMD5); + insertOriginQ.bindValue(":osize", oSize); + insertOriginQ.bindValue(":obitrate", oldBitrate); + if(!insertOriginQ.exec()){ + db.rollback(); + return; + } + } + }else{ db.rollback(); return; } + } //files have landed //handle actors @@ -240,7 +280,8 @@ void NewMovieWizard::accept(){ //we're still here, good //now actually move the files for(int i = 0; i < wizardModel->rowCount(QModelIndex()); ++i){ - QList<QVariant> fData = wizardModel->fileData(i); + QModelIndex curIdx = wizardModel->index(i, 0, QModelIndex()); + QList<QVariant> fData = wizardModel->fileData(curIdx); QString fullPath = fData.value(WizardTreeModel::FullPath).toString(); QString md5 = md5Sums.value(fullPath); Helper::moveToArchive(fullPath, md5); @@ -264,9 +305,9 @@ void MovieInfoPage::setupGui(){ //files view mFileView = new SmTreeView; - QSortFilterProxyModel *p = new QSortFilterProxyModel(this); - p->setSourceModel(mFileModel); - mFileView->setModel(p); + mProxy = new QSortFilterProxyModel(this); + mProxy->setSourceModel(mFileModel); + mFileView->setModel(mProxy); mFileView->setItemDelegateForColumn(WizardTreeModel::FileType, new FileTypeDelegate(mFileView)); mFileView->setItemDelegateForColumn(WizardTreeModel::FileSize, new SizeDelegate(mFileView)); mFileView->setItemDelegateForColumn(WizardTreeModel::FilePart, new FileNoDelegate(mFileView)); @@ -276,6 +317,9 @@ void MovieInfoPage::setupGui(){ //add + remove files QHBoxLayout *fileButtonLayout = new QHBoxLayout; fileButtonLayout->addStretch(); + mAddOld = new QPushButton(tr("Add Old...")); + fileButtonLayout->addWidget(mAddOld); + connect(mAddOld, SIGNAL(clicked()), this, SLOT(addOld())); mAddFile = new QPushButton(tr("Add files...")); fileButtonLayout->addWidget(mAddFile); connect(mAddFile, SIGNAL(clicked()), this, SLOT(addFiles())); @@ -377,6 +421,30 @@ void MovieInfoPage::initCompleters(){ mSeriesCompleterModel->setStringList(series); } +void MovieInfoPage::addOld(){ + QSettings s; + QString startDir = s.value("paths/addfilespath", QDir::homePath()).toString(); + QString oldFile = QFileDialog::getOpenFileName(this, tr("Select files"), startDir); + if(oldFile.isEmpty()){ + return; + } + QFileInfo fi(oldFile); + qint64 oldSize = fi.size(); + QString fullPath = fi.absoluteFilePath(); + QString fn = fi.fileName(); + int filetype = FT_ORIGIN; + + //prepare item data + QList<QVariant> itemData; + itemData << fn << oldSize << filetype << QVariant() << fullPath; + QModelIndexList curIdxList = mFileView->selectionModel()->selectedRows(); + if(!curIdxList.isEmpty()){ + QModelIndex realIdx = mProxy->mapToSource(curIdxList[0]); + mFileModel->appendRow(itemData, realIdx); + mFileView->expandAll(); + } +} + void MovieInfoPage::addFiles(){ QSettings s; QString startDir = s.value("paths/addfilespath", QDir::homePath()).toString(); @@ -385,7 +453,7 @@ void MovieInfoPage::addFiles(){ return; } foreach(QString f, files){ - addFile(f); + addFile(f); } QFileInfo fi(files.at(0)); s.setValue("paths/addfilespath", fi.absolutePath()); @@ -432,40 +500,23 @@ MovieMetadataPage::MovieMetadataPage(QWidget *parent) : QWizardPage(parent){ void MovieMetadataPage::setupGui(){ mWidget = new MetadataEditorWidget; - - QHBoxLayout *enabledLayout = new QHBoxLayout; - enabledLayout->setAlignment(Qt::AlignRight); - mMetadataEnabled = new QCheckBox(tr("Enable metadata")); - enabledLayout->addWidget(mMetadataEnabled); - connect(mMetadataEnabled, SIGNAL(stateChanged(int)), this, SLOT(toggleMetadata(int))); - toggleMetadata(Qt::Unchecked); - registerField("enabled", mMetadataEnabled); - - QVBoxLayout *mainLayout = new QVBoxLayout; + QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mWidget); - mainLayout->addLayout(enabledLayout); setLayout(mainLayout); } void MovieMetadataPage::initializePage(){ - ArchiveController *c = SmGlobals::instance()->archiveController(); - mWidget->setReleaseGroups(c->archiveTreeModel()->allReleaseGroups()); - mWidget->setSources(c->archiveTreeModel()->allSources()); QList<QVariant> curMetadata; for(int i = 0; i < ArchiveModel::MetadataNumFields; ++i){ curMetadata << QVariant(); } curMetadata[ArchiveModel::ReleaseYear] = QDate::currentDate().year(); - curMetadata[ArchiveModel::Source] = "unknown"; + curMetadata[ArchiveModel::Source] = "torrent"; curMetadata[ArchiveModel::ReleaseGroup] = "unknown"; curMetadata[ArchiveModel::Added] = QDate::currentDate(); mWidget->setMetadata(curMetadata); } -void MovieMetadataPage::toggleMetadata(int state){ - mWidget->setEnabledAll(state == Qt::Checked); -} - WizardTreeModel::WizardTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){ mFiletypeMap = SmGlobals::instance()->filetypeMap(); } @@ -477,8 +528,8 @@ Qt::ItemFlags WizardTreeModel::flags(const QModelIndex &index) const{ return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } -QList<QVariant> WizardTreeModel::fileData(int row) const{ - SmTreeItem *item = root()->child(row); +QList<QVariant> WizardTreeModel::fileData(const QModelIndex &idx) const{ + SmTreeItem *item = itemAt(idx); QList<QVariant> retval; for(int i = 0; i < item->columnCount(); ++i){ retval << item->data(i); diff --git a/newmoviewizard.h b/newmoviewizard.h index 20c0b89..b198267 100644 --- a/newmoviewizard.h +++ b/newmoviewizard.h @@ -18,6 +18,7 @@ class QSpinBox; class QComboBox; class QCheckBox; class QPlainTextEdit; +class QSortFilterProxyModel; class SeriesMetadataModel; class WizardTreeModel; class MovieInfoPage; @@ -60,6 +61,7 @@ class MovieInfoPage : public QWizardPage { void initCompleters(); private slots: + void addOld(); void addFiles(); void removeFile(); @@ -70,6 +72,7 @@ class MovieInfoPage : public QWizardPage { QLineEdit *mSubtitle; QSpinBox *mSeriesNo; QSpinBox *mQuality; + QPushButton *mAddOld; QPushButton *mAddFile; QPushButton *mRemoveFile; WizardTreeModel *mFileModel; @@ -77,6 +80,7 @@ class MovieInfoPage : public QWizardPage { SmTreeItem *mCoversItem; QCompleter *mSeriesCompleter; QStringListModel *mSeriesCompleterModel; + QSortFilterProxyModel *mProxy; }; class MovieMappingPage : public QWizardPage { @@ -99,9 +103,6 @@ class MovieMetadataPage : public QWizardPage { MetadataEditorWidget *widget() { return mWidget; } virtual void initializePage(); - private slots: - void toggleMetadata(int state); - private: void setupGui(); /* defined in archiveview.h */ @@ -115,14 +116,14 @@ class WizardTreeModel : public SmTreeModel { enum CustomRoles { FileNameRole = Qt::UserRole + 1, FileSizeRole = Qt::UserRole + 2, FileTypeRole = Qt::UserRole + 3, FilePartRole = Qt::UserRole + 4, FullPathRole = Qt::UserRole + 5 }; enum Fields { FileName = 0, FileSize = 1, FileType = 2, FilePart = 3, FullPath = 4 }; enum { NumFields = 5 }; - enum Types { Movie = 1, FrontCover = 2, BackCover = 3, GeneralCover = 4 }; + enum Types { Movie = 1, FrontCover = 2, BackCover = 3, GeneralCover = 4, Origin = 5 }; explicit WizardTreeModel(QStringList &headers, QObject *parent = 0); //data + flags virtual QVariant data(const QModelIndex &index, int role) const; virtual bool setData(const QModelIndex &index, const QVariant &value, int role); virtual Qt::ItemFlags flags(const QModelIndex &index) const; - QList<QVariant> fileData(int row) const; + QList<QVariant> fileData(const QModelIndex &idx) const; void clear(); private: diff --git a/smglobals.cpp b/smglobals.cpp index 24a89bf..f228504 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -169,4 +169,5 @@ SmGlobals::SmGlobals() : mPictureViewer(0), mArchiveController(0){ mFiletypeMap.insert(FT_FRONTCOVER, tr("Front Cover")); mFiletypeMap.insert(FT_BACKCOVER, tr("Back Cover")); mFiletypeMap.insert(FT_GENERALCOVER, tr("General Cover")); + mFiletypeMap.insert(FT_ORIGIN, tr("Origin")); } diff --git a/smglobals.h b/smglobals.h index 9bd6fd2..cbabbde 100644 --- a/smglobals.h +++ b/smglobals.h @@ -26,6 +26,7 @@ class ArchiveController; #define FT_FRONTCOVER 2 #define FT_BACKCOVER 3 #define FT_GENERALCOVER 4 +#define FT_ORIGIN 5 class SmGlobals : public QObject { Q_OBJECT |