From: Jean-Baptiste Mardelle Date: Sun, 23 Nov 2008 23:32:50 +0000 (+0000) Subject: Cleanup some mess introduced by last commit, looking for missing slideshow clips... X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=be66261963a86a1d5197750587ec5a64a2caea22;p=kdenlive Cleanup some mess introduced by last commit, looking for missing slideshow clips now works svn path=/branches/KDE4/; revision=2724 --- diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index c2eae7c7..af567b60 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -521,6 +521,7 @@ void DocClipBase::clearProperty(const QString &key) { } void DocClipBase::getFileHash(const QString &url) { + if (m_clipType == SLIDESHOW) return; QFile file(url); if (file.open(QIODevice::ReadOnly)) { // write size and hash only if resource points to a file QByteArray fileData; diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index b07a4b90..860ac84c 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -17,6 +17,9 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ +#include +#include + #include #include #include @@ -25,7 +28,6 @@ #include #include -#include #include @@ -1004,25 +1006,34 @@ void KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem) if (clip == NULL) { elem.setAttribute("id", producerId); QString path = elem.attribute("resource"); + QString extension; + if (elem.attribute("type").toInt() == SLIDESHOW) { + extension = KUrl(path).fileName(); + path = KUrl(path).directory(); + } if (!path.isEmpty() && !QFile::exists(path)) { const QString size = elem.attribute("file_size"); const QString hash = elem.attribute("file_hash"); QString newpath; KMessageBox::ButtonCode action = KMessageBox::No; if (!size.isEmpty() && !hash.isEmpty()) { - if (!m_searchFolder.isEmpty()) newpath = Render::searchFileRecursively(m_searchFolder, size, hash); - else action = (KMessageBox::ButtonCode)KMessageBox::messageBox(kapp->activeWindow(), KMessageBox::WarningYesNoCancel, i18n("Clip %1
is invalid, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search automatically")), KGuiItem(i18n("Remove from project")), KGuiItem(i18n("Keep as placeholder"))); + if (!m_searchFolder.isEmpty()) newpath = searchFileRecursively(m_searchFolder, size, hash); + else action = (KMessageBox::ButtonCode)KMessageBox::messageBox(kapp->activeWindow(), KMessageBox::WarningYesNo, i18n("Clip %1
is invalid, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search automatically")), /*KGuiItem(i18n("Remove from project")), */KGuiItem(i18n("Keep as placeholder"))); } else { - newpath = KFileDialog::getOpenFileName(KUrl("kfiledialog:///clipfolder"), QString(), kapp->activeWindow(), i18n("Looking for %1", path)); + if (elem.attribute("type").toInt() == SLIDESHOW) { + if (KMessageBox::messageBox(kapp->activeWindow(), KMessageBox::WarningYesNo, i18n("Clip %1
is invalid, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search automatically")), /*KGuiItem(i18n("Remove from project")),*/ KGuiItem(i18n("Keep as placeholder"))) == KMessageBox::Yes) + newpath = KFileDialog::getExistingDirectory(KUrl("kfiledialog:///clipfolder"), kapp->activeWindow(), i18n("Looking for %1", path)); + } else newpath = KFileDialog::getOpenFileName(KUrl("kfiledialog:///clipfolder"), QString(), kapp->activeWindow(), i18n("Looking for %1", path)); } if (action == KMessageBox::Yes) { kDebug() << "// ASKED FOR SRCH CLIP: " << clipId; m_searchFolder = KFileDialog::getExistingDirectory(KUrl("kfiledialog:///clipfolder"), kapp->activeWindow()); if (!m_searchFolder.isEmpty()) { - newpath = Render::searchFileRecursively(QDir(m_searchFolder), size, hash); + newpath = searchFileRecursively(QDir(m_searchFolder), size, hash); } } if (!newpath.isEmpty()) { + if (elem.attribute("type").toInt() == SLIDESHOW) newpath.append('/' + extension); elem.setAttribute("resource", newpath); setNewClipResource(clipId, newpath); } @@ -1052,6 +1063,42 @@ void KdenliveDoc::setNewClipResource(const QString &id, const QString &path) { } } +QString KdenliveDoc::searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash) const { + QString foundFileName; + QByteArray fileData; + QByteArray fileHash; + QStringList filesAndDirs = dir.entryList(QDir::Files | QDir::Readable); + for (int i = 0; i < filesAndDirs.size() && foundFileName.isEmpty(); i++) { + QFile file(dir.absoluteFilePath(filesAndDirs.at(i))); + if (file.open(QIODevice::ReadOnly)) { + if (QString::number(file.size()) == matchSize) { + /* + * 1 MB = 1 second per 450 files (or faster) + * 10 MB = 9 seconds per 450 files (or faster) + */ + if (file.size() > 1000000*2) { + fileData = file.read(1000000); + if (file.seek(file.size() - 1000000)) + fileData.append(file.readAll()); + } else + fileData = file.readAll(); + file.close(); + fileHash = QCryptographicHash::hash(fileData, QCryptographicHash::Md5); + if (QString(fileHash.toHex()) == matchHash) + return file.fileName(); + } + } + kDebug() << filesAndDirs.at(i) << file.size() << fileHash.toHex(); + } + filesAndDirs = dir.entryList(QDir::Dirs | QDir::Readable | QDir::Executable | QDir::NoDotAndDotDot); + for (int i = 0; i < filesAndDirs.size() && foundFileName.isEmpty(); i++) { + foundFileName = searchFileRecursively(dir.absoluteFilePath(filesAndDirs.at(i)), matchSize, matchHash); + if (!foundFileName.isEmpty()) + break; + } + return foundFileName; +} + void KdenliveDoc::addClipInfo(QDomElement elem, QString clipId) { DocClipBase *clip = m_clipManager->getClipById(clipId); if (clip == NULL) { diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index ef918b48..a9288b05 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -135,6 +136,7 @@ private: QString colorToString(const QColor& c); void checkProjectClips(); void setNewClipResource(const QString &id, const QString &path); + QString searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash) const; public slots: void slotCreateTextClip(QString group, const QString &groupId); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index eafc67de..cf5fb043 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -443,33 +443,10 @@ void ProjectList::slotRemoveInvalidClip(const QString &id) { ProjectItem *item = getItemById(id); if (item) { const QString path = item->referencedClip()->fileURL().path(); - //if (!path.isEmpty()) KMessageBox::sorry(this, i18n("Clip %1
is invalid, will be removed from project.", path)); - KMessageBox::ButtonCode action; - if (!path.isEmpty()) { - action = (KMessageBox::ButtonCode)KMessageBox::messageBox(this, KMessageBox::WarningYesNoCancel, i18n("Clip %1
is invalid, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search automatically")), KGuiItem(i18n("Remove from project")), KGuiItem(i18n("Keep as placeholder"))); - } else - action = KMessageBox::No; // then remove - if (action == KMessageBox::Yes) { // search - QString foundFileName; - if (!item->referencedClip()->getProperty("file_size").isEmpty() && !item->referencedClip()->getProperty("file_hash").isEmpty()) { // both hash and file size were registered - QString rootDir = KFileDialog::getExistingDirectory(KUrl("kfiledialog:///clipfolder"), this); - if (!rootDir.isEmpty()) { - foundFileName = Render::searchFileRecursively(QDir(rootDir), item->referencedClip()->getProperty("file_size"), item->referencedClip()->getProperty("file_hash")); - } - } - if (foundFileName.isEmpty()) - KMessageBox::sorry(this, i18n("Cannot find a match for clip
%1,
leaving in project as a placeholder.", path)); - else { - QMap properties; - properties["resource"] = foundFileName; - kDebug() << "CLIP ID:" << item->referencedClip()->getId() << "--- setting 'resource' to" << foundFileName; - slotUpdateClipProperties(item->referencedClip()->getId(), properties); - } - } else if (action == KMessageBox::No) { // remove - QList ids; - ids << id; - m_doc->deleteProjectClip(ids); - } // else keep it (last choice to be automatically bound to ESC) + if (!path.isEmpty()) KMessageBox::sorry(this, i18n("Clip %1
is invalid, will be removed from project.", path)); + QList ids; + ids << id; + m_doc->deleteProjectClip(ids); } if (!m_infoQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); } diff --git a/src/projectlist.h b/src/projectlist.h index b6115798..8f2984dc 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -27,7 +27,7 @@ #include #include #include -#include + #include #include diff --git a/src/renderer.cpp b/src/renderer.cpp index c217bd12..7e7b048b 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -33,8 +33,6 @@ extern "C" { #include #include #include -//#include -#include #include #include @@ -692,44 +690,6 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId) { } -//static - -QString Render::searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash) { - QString foundFileName; - QByteArray fileData; - QByteArray fileHash; - QStringList filesAndDirs = dir.entryList(QDir::Files | QDir::Readable); - for (int i = 0; i < filesAndDirs.size() && foundFileName.isEmpty(); i++) { - QFile file(dir.absoluteFilePath(filesAndDirs.at(i))); - if (file.open(QIODevice::ReadOnly)) { - if (QString::number(file.size()) == matchSize) { - /* - * 1 MB = 1 second per 450 files (or faster) - * 10 MB = 9 seconds per 450 files (or faster) - */ - if (file.size() > 1000000*2) { - fileData = file.read(1000000); - if (file.seek(file.size() - 1000000)) - fileData.append(file.readAll()); - } else - fileData = file.readAll(); - file.close(); - fileHash = QCryptographicHash::hash(fileData, QCryptographicHash::Md5); - if (QString(fileHash.toHex()) == matchHash) - return file.fileName(); - } - } - kDebug() << filesAndDirs.at(i) << file.size() << fileHash.toHex(); - } - filesAndDirs = dir.entryList(QDir::Dirs | QDir::Readable | QDir::Executable | QDir::NoDotAndDotDot); - for (int i = 0; i < filesAndDirs.size() && foundFileName.isEmpty(); i++) { - foundFileName = searchFileRecursively(dir.absoluteFilePath(filesAndDirs.at(i)), matchSize, matchHash); - if (!foundFileName.isEmpty()) - break; - } - return foundFileName; -} - /** Create the producer from the Westley QDomDocument */ #if 0 void Render::initSceneList() { diff --git a/src/renderer.h b/src/renderer.h index 7eb6c5de..7e0b0ac2 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -22,8 +22,6 @@ #include #include #include -#include -//#include #include @@ -180,7 +178,6 @@ Q_OBJECT public: int mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, Mlt::Producer *prod); QList producersList(); - static QString searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash); private: // Private attributes & methods /** The name of this renderer - useful to identify the renderes by what they do - e.g. background rendering, workspace monitor, etc... */