void XMPEditWidget::apply() { if (d->modified && !d->isReadOnly) { KPImageInfo info(*d->dlg->currentItem()); if (d->contentPage->syncHOSTCommentIsChecked()) { info.setDescription(d->contentPage->getXMPCaption()); } d->contentPage->applyMetadata(d->exifData, d->xmpData); if (d->originPage->syncHOSTDateIsChecked()) { info.setDate(d->originPage->getXMPCreationDate()); } d->originPage->applyMetadata(d->exifData, d->xmpData); d->subjectsPage->applyMetadata(d->xmpData); d->keywordsPage->applyMetadata(d->xmpData); d->categoriesPage->applyMetadata(d->xmpData); d->creditsPage->applyMetadata(d->xmpData); d->statusPage->applyMetadata(d->xmpData); d->propertiesPage->applyMetadata(d->xmpData); KPMetadata meta; meta.load((*d->dlg->currentItem()).path()); meta.setExif(d->exifData); meta.setIptc(d->iptcData); meta.setXmp(d->xmpData); meta.save((*d->dlg->currentItem()).path()); d->modified = false; } }
bool SwWindow::prepareImageForUpload(const QString& imgPath, bool isRAW, QString& caption) { QImage image; if (isRAW) { qCDebug(KIPIPLUGINS_LOG) << "Get RAW preview " << imgPath; KDcraw::loadRawPreview(image, imgPath); } else { image.load(imgPath); } if (image.isNull()) return false; // get temporary file name m_tmpPath = m_tmpDir + QFileInfo(imgPath).baseName().trimmed() + QString(".jpg"); // rescale image if requested int maxDim = m_widget->m_dimensionSpB->value(); if (m_widget->m_resizeChB->isChecked() && (image.width() > maxDim || image.height() > maxDim)) { qCDebug(KIPIPLUGINS_LOG) << "Resizing to " << maxDim; image = image.scaled(maxDim, maxDim, Qt::KeepAspectRatio, Qt::SmoothTransformation); } qCDebug(KIPIPLUGINS_LOG) << "Saving to temp file: " << m_tmpPath; image.save(m_tmpPath, "JPEG", m_widget->m_imageQualitySpB->value()); // copy meta data to temporary image KPMetadata meta; if (meta.load(imgPath)) { caption = getImageCaption(meta); meta.setImageDimensions(image.size()); meta.setImageProgramId("Kipi-plugins", kipiplugins_version); meta.save(m_tmpPath); } else { caption.clear(); } return true; }
bool WMWindow::prepareImageForUpload(const QString& imgPath, QString& caption) { QImage image; image.load(imgPath); if (image.isNull()) { return false; } // get temporary file name m_tmpPath = m_tmpDir + QFileInfo(imgPath).baseName().trimmed() + ".jpg"; // rescale image if requested int maxDim = m_widget->dimension(); if (image.width() > maxDim || image.height() > maxDim) { kDebug() << "Resizing to " << maxDim; image = image.scaled(maxDim, maxDim, Qt::KeepAspectRatio, Qt::SmoothTransformation); } kDebug() << "Saving to temp file: " << m_tmpPath; image.save(m_tmpPath, "JPEG", m_widget->quality()); // copy meta data to temporary image KPMetadata meta; if (meta.load(imgPath)) { caption = getImageCaption(imgPath); meta.setImageDimensions(image.size()); meta.save(m_tmpPath); } else { caption.clear(); } return true; }
bool PiwigoTalker::addPhoto(int albumId, const QString& photoPath, bool rescale, int maxWidth, int maxHeight, int thumbDim) { KUrl photoUrl = KUrl(photoPath); m_job = 0; m_state = GE_CHECKPHOTOEXIST; m_talker_buffer.resize(0); m_path = photoPath; m_albumId = albumId; m_md5sum = computeMD5Sum(photoPath); if (!rescale) { m_hqpath = photoPath; kDebug() << "Download HQ version: " << m_hqpath; } else { m_hqpath = ""; } kDebug() << photoPath << " " << m_md5sum.toHex(); QImage image; // Check if RAW file. if (KPMetadata::isRawFile(photoPath)) KDcrawIface::KDcraw::loadDcrawPreview(image, photoPath); else image.load(photoPath); if (!image.isNull()) { QFileInfo fi(photoPath); QImage thumbnail = image.scaled(thumbDim, thumbDim, Qt::KeepAspectRatio, Qt::SmoothTransformation); m_thumbpath = KStandardDirs::locateLocal("tmp", "thumb-" + KUrl(photoPath).fileName()); thumbnail.save(m_thumbpath, "JPEG", 95); kDebug() << "Thumbnail to temp file: " << m_thumbpath ; // image file - see if we need to rescale it if (image.width() > maxWidth || image.height() > maxHeight) { image = image.scaled(maxWidth, maxHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation); } m_path = KStandardDirs::locateLocal("tmp", KUrl(photoPath).fileName()); image.save(m_path, "JPEG", 95); kDebug() << "Resizing and saving to temp file: " << m_path ; // Complete name and comment for summary sending m_title = fi.completeBaseName(); m_comment = ""; m_author = ""; m_date = fi.created(); // Look in the Digikam database KPImageInfo info(photoUrl); if (info.hasTitle() && !info.title().isEmpty()) m_title = info.title(); if (info.hasDescription() && !info.description().isEmpty()) m_comment = info.description(); if (info.hasCreators() && !info.creators().isEmpty()) m_author = info.creators().join(" / "); if (info.hasDate()) m_date = info.date(); kDebug() << "Title: " << m_title; kDebug() << "Comment: " << m_comment; kDebug() << "Author: " << m_author; kDebug() << "Date: " << m_date; // Restore all metadata with EXIF // in the resized version KPMetadata meta; if (meta.load(photoPath)) { meta.setImageProgramId(QString("Kipi-plugins"), QString(kipiplugins_version)); meta.setImageDimensions(image.size()); meta.save(m_path); } else { kDebug() << "Image " << photoPath << " has no exif data"; } } else { // Invalid image return false; } QStringList qsl; qsl.append("method=pwg.images.exist"); qsl.append("md5sum_list=" + m_md5sum.toHex()); QString dataParameters = qsl.join("&"); QByteArray buffer; buffer.append(dataParameters.toUtf8()); m_job = KIO::http_post(m_url, buffer, KIO::HideProgressInfo); m_job->addMetaData("content-type", "Content-Type: application/x-www-form-urlencoded" ); m_job->addMetaData("customHTTPHeader", "Authorization: " + s_authToken ); emit signalProgressInfo( i18n("Check if %1 already exists", KUrl(m_path).fileName()) ); connect(m_job, SIGNAL(data(KIO::Job*,QByteArray)), this, SLOT(slotTalkerData(KIO::Job*,QByteArray))); connect(m_job, SIGNAL(result(KJob*)), this, SLOT(slotResult(KJob*))); emit signalBusy(true); return true; }
bool PiwigoTalker::addPhoto(int albumId, const QString& mediaPath, bool rescale, int maxWidth, int maxHeight, int quality) { KUrl mediaUrl = KUrl(mediaPath); m_job = 0; m_state = GE_CHECKPHOTOEXIST; m_talker_buffer.resize(0); m_path = mediaPath; // By default, m_path contains the original file m_tmpPath = ""; // By default, no temporary file (except with rescaling) m_albumId = albumId; m_md5sum = computeMD5Sum(mediaPath); kDebug() << mediaPath << " " << m_md5sum.toHex(); if (mediaPath.endsWith(".mp4") || mediaPath.endsWith(".MP4") || mediaPath.endsWith(".ogg") || mediaPath.endsWith(".OGG") || mediaPath.endsWith(".webm") || mediaPath.endsWith(".WEBM")) { // Video management // Nothing to do } else { // Image management QImage image; // Check if RAW file. if (KPMetadata::isRawFile(mediaPath)) KDcrawIface::KDcraw::loadRawPreview(image, mediaPath); else image.load(mediaPath); if (image.isNull()) { // Invalid image return false; } if (!rescale) { kDebug() << "Upload the original version: " << m_path; } else { // Rescale the image if (image.width() > maxWidth || image.height() > maxHeight) { image = image.scaled(maxWidth, maxHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation); } m_path = m_tmpPath = KStandardDirs::locateLocal("tmp", KUrl(mediaPath).fileName()); image.save(m_path, "JPEG", quality); kDebug() << "Upload a resized version: " << m_path ; // Restore all metadata with EXIF // in the resized version KPMetadata meta; if (meta.load(mediaPath)) { meta.setImageProgramId(QString("Kipi-plugins"), QString(kipiplugins_version)); meta.setImageDimensions(image.size()); meta.save(m_path); } else { kDebug() << "Image " << mediaPath << " has no exif data"; } } } // Metadata management // Complete name and comment for summary sending QFileInfo fi(mediaPath); m_title = fi.completeBaseName(); m_comment = ""; m_author = ""; m_date = fi.created(); // Look in the Digikam database KPImageInfo info(mediaUrl); if (info.hasTitle() && !info.title().isEmpty()) m_title = info.title(); if (info.hasDescription() && !info.description().isEmpty()) m_comment = info.description(); if (info.hasCreators() && !info.creators().isEmpty()) m_author = info.creators().join(" / "); if (info.hasDate()) m_date = info.date(); kDebug() << "Title: " << m_title; kDebug() << "Comment: " << m_comment; kDebug() << "Author: " << m_author; kDebug() << "Date: " << m_date; QStringList qsl; qsl.append("method=pwg.images.exist"); qsl.append("md5sum_list=" + m_md5sum.toHex()); QString dataParameters = qsl.join("&"); QByteArray buffer; buffer.append(dataParameters.toUtf8()); m_job = KIO::http_post(m_url, buffer, KIO::HideProgressInfo); m_job->addMetaData("content-type", "Content-Type: application/x-www-form-urlencoded" ); m_job->addMetaData("customHTTPHeader", "Authorization: " + s_authToken ); emit signalProgressInfo( i18n("Check if %1 already exists", KUrl(mediaPath).fileName()) ); connect(m_job, SIGNAL(data(KIO::Job*,QByteArray)), this, SLOT(slotTalkerData(KIO::Job*,QByteArray))); connect(m_job, SIGNAL(result(KJob*)), this, SLOT(slotResult(KJob*))); emit signalBusy(true); return true; }
void Task::run() { if (d->cancel) return; QDateTime dt = d->itemsMap.value(d->url); if (!dt.isValid()) return; emit signalProcessStarted(d->url); bool metadataChanged = d->settings.updEXIFModDate || d->settings.updEXIFOriDate || d->settings.updEXIFDigDate || d->settings.updEXIFThmDate || d->settings.updIPTCDate || d->settings.updXMPDate; int status = MyImageList::NOPROCESS_ERROR; if (metadataChanged) { bool ret = true; KPMetadata meta; ret &= meta.load(d->url.path()); if (ret) { if (meta.canWriteExif(d->url.path())) { if (d->settings.updEXIFModDate) { ret &= meta.setExifTagString("Exif.Image.DateTime", dt.toString(QString("yyyy:MM:dd hh:mm:ss")).toAscii()); } if (d->settings.updEXIFOriDate) { ret &= meta.setExifTagString("Exif.Photo.DateTimeOriginal", dt.toString(QString("yyyy:MM:dd hh:mm:ss")).toAscii()); } if (d->settings.updEXIFDigDate) { ret &= meta.setExifTagString("Exif.Photo.DateTimeDigitized", dt.toString(QString("yyyy:MM:dd hh:mm:ss")).toAscii()); } if (d->settings.updEXIFThmDate) { ret &= meta.setExifTagString("Exif.Image.PreviewDateTime", dt.toString(QString("yyyy:MM:dd hh:mm:ss")).toAscii()); } } else if (d->settings.updEXIFModDate || d->settings.updEXIFOriDate || d->settings.updEXIFDigDate || d->settings.updEXIFThmDate) { ret = false; } if (d->settings.updIPTCDate) { if (meta.canWriteIptc(d->url.path())) { ret &= meta.setIptcTagString("Iptc.Application2.DateCreated", dt.date().toString(Qt::ISODate)); ret &= meta.setIptcTagString("Iptc.Application2.TimeCreated", dt.time().toString(Qt::ISODate)); } else { ret = false; } } if (d->settings.updXMPDate) { if (meta.supportXmp() && meta.canWriteXmp(d->url.path())) { ret &= meta.setXmpTagString("Xmp.exif.DateTimeOriginal", dt.toString(QString("yyyy:MM:dd hh:mm:ss")).toAscii()); ret &= meta.setXmpTagString("Xmp.photoshop.DateCreated", dt.toString(QString("yyyy:MM:dd hh:mm:ss")).toAscii()); ret &= meta.setXmpTagString("Xmp.tiff.DateTime", dt.toString(QString("yyyy:MM:dd hh:mm:ss")).toAscii()); ret &= meta.setXmpTagString("Xmp.xmp.CreateDate", dt.toString(QString("yyyy:MM:dd hh:mm:ss")).toAscii()); ret &= meta.setXmpTagString("Xmp.xmp.MetadataDate", dt.toString(QString("yyyy:MM:dd hh:mm:ss")).toAscii()); ret &= meta.setXmpTagString("Xmp.xmp.ModifyDate", dt.toString(QString("yyyy:MM:dd hh:mm:ss")).toAscii()); } else { ret = false; } } ret &= meta.save(d->url.path()); if (!ret) { kDebug() << "Failed to update metadata in file " << d->url.fileName(); } } else { kDebug() << "Failed to load metadata from file " << d->url.fileName(); } if (!ret) { status |= MyImageList::META_TIME_ERROR; } } if (d->settings.updFileModDate) { // Since QFileInfo does not support timestamp updates, see Qt suggestion #79427 at // http://www.qtsoftware.com/developer/task-tracker/index_html?id=79427&method=entry // we have to use the utime() system call. utimbuf times; times.actime = QDateTime::currentDateTime().toTime_t(); times.modtime = dt.toTime_t(); if (utime(QFile::encodeName(d->url.toLocalFile()).constData(), ×) != 0) { status |= MyImageList::FILE_TIME_ERROR; } } if (d->settings.updFileName) { bool ret = true; KUrl newUrl = ActionThread::newUrl(d->url, dt); if (KDE_rename(QFile::encodeName(d->url.toLocalFile()), QFile::encodeName(newUrl.toLocalFile())) != 0) ret = false; ret &= KPMetadata::moveSidecar(d->url, newUrl); if (!ret) status |= MyImageList::FILE_NAME_ERROR; } if (d->settings.updAppDate) { KPImageInfo info(d->url); QDateTime dt = d->itemsMap.value(d->url); if (dt.isValid()) info.setDate(dt); } emit signalProcessEnded(d->url, status); }
bool FlickrTalker::addPhoto(const QString& photoPath, const FPhotoInfo& info, bool sendOriginal, bool rescale, int maxDim, int imageQuality) { if (m_job) { m_job->kill(); m_job = 0; } KUrl url(m_uploadUrl); // We dont' want to modify url as such, we just used the KURL object for storing the query items. KUrl url2(""); QString path = photoPath; MPForm form; form.addPair("auth_token", m_token, "text/plain"); url2.addQueryItem("auth_token", m_token); form.addPair("api_key", m_apikey, "text/plain"); url2.addQueryItem("api_key", m_apikey); QString ispublic = (info.is_public == 1) ? "1" : "0"; form.addPair("is_public", ispublic, "text/plain"); url2.addQueryItem("is_public", ispublic); QString isfamily = (info.is_family == 1) ? "1" : "0"; form.addPair("is_family", isfamily, "text/plain"); url2.addQueryItem("is_family", isfamily); QString isfriend = (info.is_friend == 1) ? "1" : "0"; form.addPair("is_friend", isfriend, "text/plain"); url2.addQueryItem("is_friend", isfriend); QString safetyLevel = QString::number(static_cast<int>(info.safety_level)); form.addPair("safety_level", safetyLevel, "text/plain"); url2.addQueryItem("safety_level", safetyLevel); QString contentType = QString::number(static_cast<int>(info.content_type)); form.addPair("content_type", contentType, "text/plain"); url2.addQueryItem("content_type", contentType); QString tags = "\"" + info.tags.join("\" \"") + "\""; if (tags.length() > 0) { form.addPair("tags", tags, "text/plain"); url2.addQueryItem("tags", tags); } if (!info.title.isEmpty()) { form.addPair("title", info.title, "text/plain"); url2.addQueryItem("title", info.title); } if (!info.description.isEmpty()) { form.addPair("description", info.description, "text/plain"); url2.addQueryItem("description", info.description); } QString md5 = getApiSig(m_secret, url2); form.addPair("api_sig", md5, "text/plain"); QImage image; // Check if RAW file. if (KPMetadata::isRawFile(photoPath)) { KDcrawIface::KDcraw::loadDcrawPreview(image, photoPath); } else { image.load(photoPath); } if (!image.isNull()) { path = KStandardDirs::locateLocal("tmp", QFileInfo(photoPath).baseName().trimmed() + ".jpg"); if (sendOriginal) { QFile imgFile(photoPath); imgFile.copy(path); } else { if (rescale && (image.width() > maxDim || image.height() > maxDim)) image = image.scaled(maxDim, maxDim, Qt::KeepAspectRatio, Qt::SmoothTransformation); image.save(path, "JPEG", imageQuality); } // Restore all metadata. KPMetadata meta; if (meta.load(photoPath)) { meta.setImageDimensions(image.size()); // NOTE: see B.K.O #153207: Flickr use IPTC keywords to create Tags in web interface // As IPTC do not support UTF-8, we need to remove it. meta.removeIptcTag("Iptc.Application2.Keywords", false); meta.setImageProgramId(QString("Kipi-plugins"), QString(kipiplugins_version)); meta.save(path); } else { kWarning() << "(flickrExport::Image doesn't have metadata)"; } kDebug() << "Resizing and saving to temp file: " << path; } if (!form.addFile("photo", path)) { return false; } form.finish(); KIO::TransferJob* job = KIO::http_post(url, form.formData(), KIO::HideProgressInfo); job->addMetaData("content-type", form.contentType()); connect(job, SIGNAL(data(KIO::Job*,QByteArray)), this, SLOT(data(KIO::Job*,QByteArray))); connect(job, SIGNAL(result(KJob*)), this, SLOT(slotResult(KJob*))); m_state = FE_ADDPHOTO; m_job = job; m_buffer.resize(0); emit signalBusy(true); return true; }
bool DBTalker::addPhoto(const QString& imgPath, const QString& uploadFolder, bool rescale, int maxDim, int imageQuality) { if(m_job) { m_job->kill(); m_job = 0; } emit signalBusy(true); MPForm form; QString path = imgPath; QImage image; if(KPMetadata::isRawFile(imgPath)) { KDcrawIface::KDcraw::loadRawPreview(image,imgPath); } else { image.load(imgPath); } if(image.isNull()) { return false; } path = KStandardDirs::locateLocal("tmp",QFileInfo(imgPath).baseName().trimmed()+".jpg"); if(rescale && (image.width() > maxDim || image.height() > maxDim)) { image = image.scaled(maxDim,maxDim,Qt::KeepAspectRatio,Qt::SmoothTransformation); } image.save(path,"JPEG",imageQuality); KPMetadata meta; if(meta.load(imgPath)) { meta.setImageDimensions(image.size()); meta.setImageProgramId("Kipi-plugins",kipiplugins_version); meta.save(path); } if(!form.addFile(path)) { emit signalBusy(false); return false; } QString uploadPath = uploadFolder + KUrl(imgPath).fileName(); QString m_url = QString("https://api-content.dropbox.com/1/files_put/dropbox/") + "/" +uploadPath; KUrl url(m_url); url.addQueryItem("oauth_consumer_key",m_oauth_consumer_key); url.addQueryItem("oauth_nonce", nonce); url.addQueryItem("oauth_signature",m_access_oauth_signature); url.addQueryItem("oauth_signature_method",m_oauth_signature_method); url.addQueryItem("oauth_timestamp", QString::number(timestamp)); url.addQueryItem("oauth_version",m_oauth_version); url.addQueryItem("oauth_token",m_oauthToken); url.addQueryItem("overwrite","false"); KIO::TransferJob* const job = KIO::http_post(url,form.formData(),KIO::HideProgressInfo); job->addMetaData("content-type","Content-Type : application/x-www-form-urlencoded"); connect(job,SIGNAL(data(KIO::Job*,QByteArray)), this,SLOT(data(KIO::Job*,QByteArray))); connect(job,SIGNAL(result(KJob*)), this,SLOT(slotResult(KJob*))); m_state = DB_ADDPHOTO; m_job = job; m_buffer.resize(0); emit signalBusy(true); return true; }