/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "archiveeditdialog.h" #include "archivefilewidget.h" #include "listeditor.h" #include "covereditor.h" #include "listmodel.h" #include "moviemodel.h" #include "helper.h" #include "coveritem.h" #include "listmodelsingleton.h" #include "moviemodelsingleton.h" ArchiveEditDialog::ArchiveEditDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { //setup mGenreModel = ListModelSingleton::instance()->model("genre"); mActorsModel = ListModelSingleton::instance()->model("actor"); mMovieModel = MovieModelSingleton::instance(); QSplitter *hSplitter = new QSplitter(Qt::Horizontal); QWidget *editorWidget = new QWidget; QVBoxLayout *editorLayout = new QVBoxLayout; //genre editor QLabel *l1 = new QLabel(tr("Edit genres")); mGenreEditor = new ListEditor(mGenreModel); editorLayout->addWidget(l1); editorLayout->addWidget(mGenreEditor); //actor editor QLabel *l2 = new QLabel(tr("Edit actors")); mActorsEditor = new ListEditor(mActorsModel); editorLayout->addWidget(l2); editorLayout->addWidget(mActorsEditor); //cover editor QLabel *l3 = new QLabel(tr("Configure cover pictures")); mCoverEditor = new CoverEditor; editorLayout->addWidget(l3); editorLayout->addWidget(mCoverEditor); editorLayout->addStretch(); editorWidget->setLayout(editorLayout); editorWidget->setMinimumWidth(300); //archive editor mFileWidget = new ArchiveFileWidget; connect(mActorsEditor, SIGNAL(itemAdded(const QString &)), mFileWidget, SLOT(setActor(const QString &))); //join splitters hSplitter->addWidget(mFileWidget); hSplitter->addWidget(editorWidget); hSplitter->setStretchFactor(0, 2); hSplitter->setStretchFactor(1, 1); //button layout QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(); mGuess = new QPushButton(tr("Guess values")); connect(mGuess, SIGNAL(clicked()), this, SLOT(guess())); buttonLayout->addWidget(mGuess); mArchive = new QPushButton(tr("Archive")); connect(mArchive, SIGNAL(clicked()), this, SLOT(archive())); buttonLayout->addWidget(mArchive); mClose = new QPushButton(tr("Close")); connect(mClose, SIGNAL(clicked()), this, SLOT(reject())); buttonLayout->addWidget(mClose); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(hSplitter); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); QString winTitle = QString("%1 - Archive files").arg(qApp->applicationName()); setWindowTitle(winTitle); } void ArchiveEditDialog::setFiles(const QStringList &files){ mFileWidget->setFiles(files); mCoverEditor->setCovers(files); } void ArchiveEditDialog::archive(){ const QList actors = mFileWidget->actorIds(); int genre = mFileWidget->genreId(); QString front = mCoverEditor->frontCover(); QString back = mCoverEditor->backCover(); QString general = mCoverEditor->covers(); QString file = mCoverEditor->movie(); QString title = mFileWidget->movieTitle().toLower(); int quality = mFileWidget->quality(); int seriesno = mFileWidget->seriesNo(); int partno = mFileWidget->partNo(); QStringList files; files << front << back << general; files.removeAll(QString()); files << file; QHash md5Sums; foreach(QString f, files){ md5Sums[f] = Helper::md5Sum(f); } if(checkInput(genre, actors, files, title, file, quality)){ QSettings s; QString archivePath = s.value("paths/archivedir").toString(); if(archivePath.isEmpty()){ QMessageBox::critical(this, tr("Error"), tr("No archive path found. Please set it via Edit->Configure!")); return; } QFileInfo archiveInfo(archivePath); if(!archiveInfo.exists()){ QDir root = QDir::root(); root.mkpath(archivePath); } archiveInfo = QFileInfo(archivePath); if(!archiveInfo.isDir()){ QString msg = QString(tr("Archive path %1 is not a directory. Aborting!")).arg(archivePath); QMessageBox::critical(this, tr("Error"), msg); return; } QList data; QFileInfo movie(file); data << title << movie.fileName() << md5Sums.value(file) << movie.size() << genre << quality << -1 << seriesno << partno; QList covers; if(!front.isEmpty()){ covers << coverItem(front, "front", md5Sums.value(front)); } if(!back.isEmpty()){ covers << coverItem(back, "back", md5Sums.value(back)); } if(!general.isEmpty()){ covers << coverItem(general, "general", md5Sums.value(general)); } QList vAList; foreach(int a, actors){ vAList << a; } mMovieModel->addMovie(data, vAList, covers); foreach(QString f, files){ QFileInfo file(f); QString hash = md5Sums.value(f); QString destDirS = QString("%1/%2/%3").arg(archivePath).arg(hash[0]).arg(hash[1]); QString destFileS = QString("%1/%2/%3/%4").arg(archivePath).arg(hash[0]).arg(hash[1]).arg(file.fileName()); QFileInfo dir(destDirS); if(!dir.exists()){ QDir root = QDir::root(); root.mkpath(destDirS); } QFileInfo destFile(destFileS); if(destFile.exists()){ destFileS = QString("%1/%2/%3/%4_%5.%6").arg(archivePath).arg(hash[0]).arg(hash[1]).arg(destFile.completeBaseName()).arg(hash).arg(destFile.suffix()); } QFile::rename(f, destFileS); } } } void ArchiveEditDialog::guess(){ QString fileName = mCoverEditor->movie(); if(fileName.isEmpty()){ return; } QFileInfo fi(fileName); QString rfn = fi.completeBaseName(); rfn.chop(1); QModelIndexList idx = mMovieModel->columnContains(rfn, MovieItem::Filename); if(idx.size() > 0){ QModelIndex cur = idx.at(0); QList actors = cur.data(MovieModel::ActorsRole).toList(); foreach(QVariant v, actors){ mFileWidget->setActor(v.toString()); } mFileWidget->setMovieTitle(cur.data(MovieModel::TitleBaseRole).toString()); mFileWidget->setQuality(cur.data(MovieModel::QualityRole).toInt()); mFileWidget->setSeriesNo(cur.data(MovieModel::SeriesNoRole).toInt()); int partno = cur.data(MovieModel::PartNoRole).toInt() + 1; mFileWidget->setPartNo(partno); } } bool ArchiveEditDialog::checkInput(int genre, const QList &actors, const QStringList &files, const QString &title, const QString &movie, int quality) { if(genre < 0){ QMessageBox::critical(this, tr("Error"), tr("Genre is invalid")); return false; } if(actors.isEmpty()){ int answer = QMessageBox::question(this, tr("Question"), tr("No actors selected. Continue anyway?"), QMessageBox::Yes | QMessageBox::No); return (answer == QMessageBox::Yes); } foreach(QString f, files){ QFileInfo info(f); if(!info.isFile()){ QString msg = QString(tr("%1 does not seem to be a file. Aborting")).arg(info.absoluteFilePath()); QMessageBox::critical(this, tr("Error"), msg); return false; } } QString mt = Helper::mimeType(movie); if(!mt.toLower().startsWith("video")){ QString msg = QString(tr("Movie %1 is not of MIME type video (%2). Continue anyway?")).arg(movie).arg(mt); int answer = QMessageBox::question(this, tr("Question"), msg, QMessageBox::Yes | QMessageBox::No); return (answer == QMessageBox::Yes); } if(title.isEmpty()){ QMessageBox::critical(this, tr("Error"), tr("No movie title given!")); return false; } if(quality == 0){ int answer = QMessageBox::question(this, tr("Question"), tr("Quality is set to 0. Continue anyway?"), QMessageBox::Yes | QMessageBox::No); return (answer == QMessageBox::Yes); } return true; } bool ArchiveEditDialog::checkMd5(const QHash &md5sums, const QStringList &files){ foreach(QString f, files){ if(!md5sums.contains(f)){ QString msg = QString(tr("I don't have an MD5 hash for %1. Aborting!")).arg(f); QMessageBox::critical(this, tr("Error"), msg); return false; } } return true; } const CoverItem ArchiveEditDialog::coverItem(const QString &filePath, const QString type, const QString &md5) const{ QFileInfo info(filePath); return CoverItem(info.fileName(), type, md5); }