+ QString resource;
+ int max;
+ QDomNodeList documentProducers = m_doc.elementsByTagName("producer");
+ QList <QDomElement> wrongDurationClips;
+ // List clips whose proxy is missing
+ QList <QDomElement> missingProxies;
+ // List clips who have a working proxy but no source clip
+ QList <QDomElement> missingSources;
+ m_safeImages.clear();
+ m_safeFonts.clear();
+ max = m_info.count();
+ for (int i = 0; i < max; ++i) {
+ e = m_info.item(i).toElement();
+ clipType = e.attribute("type").toInt();
+ if (clipType == Color) continue;
+ if (clipType != Text && clipType != Image && clipType != SlideShow) {
+ QString id = e.attribute("id");
+ int duration = e.attribute("duration").toInt();
+ int mltDuration = -1;
+ QDomElement mltProd;
+ QString prodId;
+ // Check that the duration is in sync between Kdenlive's info and MLT's playlist
+ int prodsCount = documentProducers.count();
+ for (int j = 0; j < prodsCount; j++) {
+ mltProd = documentProducers.at(j).toElement();
+ prodId = mltProd.attribute("id");
+ // Don't check slowmotion clips for now... (TODO?)
+ if (prodId.startsWith("slowmotion")) continue;
+ if (prodId.contains('_')) prodId = prodId.section('_', 0, 0);
+ if (prodId != id) continue;
+ if (mltDuration > 0 ) {
+ // We have several MLT producers for the same clip (probably track producers)
+ int newLength = EffectsList::property(mltProd, "length").toInt();
+ if (newLength != mltDuration) {
+ // we have a different duration for the same clip, that is not safe
+ e.setAttribute("_resetDuration", 1);
+ }
+ }
+ mltDuration = EffectsList::property(mltProd, "length").toInt();
+ if (mltDuration != duration) {
+ // Duration mismatch
+ e.setAttribute("_mismatch", mltDuration);
+ if (mltDuration == 15000) {
+ // a length of 15000 might indicate a wrong clip length since it is a default length
+ e.setAttribute("_resetDuration", 1);
+ }
+ if (!wrongDurationClips.contains(e)) wrongDurationClips.append(e);
+ }
+ }
+ }
+
+ if (clipType == Text) {
+ //TODO: Check is clip template is missing (xmltemplate) or hash changed
+ QStringList images = TitleWidget::extractImageList(e.attribute("xmldata"));
+ QStringList fonts = TitleWidget::extractFontList(e.attribute("xmldata"));
+ checkMissingImagesAndFonts(images, fonts, e.attribute("id"), e.attribute("name"));
+ continue;
+ }
+ resource = e.attribute("resource");
+ if (e.hasAttribute("proxy")) {
+ QString proxyresource = e.attribute("proxy");
+ if (!proxyresource.isEmpty() && proxyresource != "-") {
+ // clip has a proxy
+ if (!KIO::NetAccess::exists(KUrl(proxyresource), KIO::NetAccess::SourceSide, 0)) {
+ // Missing clip found
+ missingProxies.append(e);
+ }
+ else if (!KIO::NetAccess::exists(KUrl(resource), KIO::NetAccess::SourceSide, 0)) {
+ // clip has proxy but original clip is missing
+ missingSources.append(e);
+ continue;
+ }
+ }
+ }
+ if (clipType == SlideShow) resource = KUrl(resource).directory();
+ if (!KIO::NetAccess::exists(KUrl(resource), KIO::NetAccess::SourceSide, 0)) {
+ // Missing clip found
+ m_missingClips.append(e);
+ } else {
+ // Check if the clip has changed
+ if (clipType != SlideShow && e.hasAttribute("file_hash")) {
+ if (e.attribute("file_hash") != DocClipBase::getHash(e.attribute("resource")))
+ e.removeAttribute("file_hash");
+ }
+ }
+ }
+
+ // Get list of used Luma files
+ QStringList missingLumas;
+ QStringList filesToCheck;
+ QString filePath;
+ QString root = m_doc.documentElement().attribute("root");
+ if (!root.isEmpty()) root = KUrl(root).path(KUrl::AddTrailingSlash);
+ QDomNodeList trans = m_doc.elementsByTagName("transition");
+ max = trans.count();
+ for (int i = 0; i < max; ++i) {
+ QString luma = getProperty(trans.at(i).toElement(), "luma");
+ if (!luma.isEmpty() && !filesToCheck.contains(luma))
+ filesToCheck.append(luma);
+ }
+ // Check existence of luma files
+ foreach (const QString &lumafile, filesToCheck) {
+ filePath = lumafile;
+ if (!filePath.startsWith('/')) filePath.prepend(root);
+ if (!QFile::exists(filePath)) {
+ missingLumas.append(lumafile);
+ }
+ }
+
+
+
+ if (m_missingClips.isEmpty() && missingLumas.isEmpty() && wrongDurationClips.isEmpty() && missingProxies.isEmpty() && missingSources.isEmpty())
+ return false;
+
+ m_dialog = new QDialog();
+ m_dialog->setFont(KGlobalSettings::toolBarFont());
+ m_ui.setupUi(m_dialog);