Cleanup online resource feature

parent 290b7e5f
......@@ -64,7 +64,7 @@
#include "audioscopes/spectrogram.h"
#include "archivewidget.h"
#include "databackup/backupwidget.h"
#include "utils/freesound.h"
#include "utils/resourcewidget.h"
#include <KApplication>
......@@ -4508,7 +4508,7 @@ void MainWindow::slotDownloadResources()
QString currentFolder;
if (m_activeDocument) currentFolder = m_activeDocument->projectFolder().path();
else currentFolder = KdenliveSettings::defaultprojectfolder();
FreeSound *d = new FreeSound(currentFolder);
ResourceWidget *d = new ResourceWidget(currentFolder);
connect(d, SIGNAL(addClip(KUrl, const QString &)), this, SLOT(slotAddProjectClip(KUrl, const QString &)));
d->show();
}
......
set(kdenlive_SRCS
${kdenlive_SRCS}
utils/abstractservice.cpp
utils/freesound.cpp
utils/openclipart.cpp
utils/resourcewidget.cpp
PARENT_SCOPE
)
......
/***************************************************************************
* Copyright (C) 2011 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
* *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
#include "abstractservice.h"
#include <QObject>
AbstractService::AbstractService(QListWidget *listWidget, QObject * parent) :
QObject(parent),
hasPreview(false),
hasMetadata(false),
serviceType(NOSERVICE),
m_listWidget(listWidget)
{
}
AbstractService::~AbstractService()
{
}
void AbstractService::slotStartSearch(const QString , int )
{
}
OnlineItemInfo AbstractService::displayItemDetails(QListWidgetItem */*item*/)
{
OnlineItemInfo info;
return info;
}
bool AbstractService::startItemPreview(QListWidgetItem *)
{
return false;
}
void AbstractService::stopItemPreview(QListWidgetItem *)
{
}
QString AbstractService::getExtension(QListWidgetItem *)
{
return QString();
}
QString AbstractService::getDefaultDownloadName(QListWidgetItem *)
{
return QString();
}
/***************************************************************************
* Copyright (C) 2011 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
* *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
#ifndef ABSTRACTSERVICE_H
#define ABSTRACTSERVICE_H
#include <QListWidget>
const int imageRole = Qt::UserRole;
const int urlRole = Qt::UserRole + 1;
const int downloadRole = Qt::UserRole + 2;
const int durationRole = Qt::UserRole + 3;
const int previewRole = Qt::UserRole + 4;
const int authorRole = Qt::UserRole + 5;
const int authorUrl = Qt::UserRole + 6;
const int infoUrl = Qt::UserRole + 7;
const int infoData = Qt::UserRole + 8;
const int idRole = Qt::UserRole + 9;
const int licenseRole = Qt::UserRole + 10;
const int descriptionRole = Qt::UserRole + 11;
enum SERVICETYPE { NOSERVICE = 0, FREESOUND = 1, OPENCLIPART = 2 };
struct OnlineItemInfo {
QString imagePreview;
QString itemPreview;
QString itemName;
QString itemDownload;
QString itemId;
QString infoUrl;
QString license;
QString author;
QString authorUrl;
QString description;
};
class AbstractService : public QObject
{
Q_OBJECT
public:
AbstractService(QListWidget *listWidget, QObject * parent = 0);
~AbstractService();
/** @brief Get file extension for currently selected item. */
virtual QString getExtension(QListWidgetItem *item);
/** @brief Get recommanded download file name. */
virtual QString getDefaultDownloadName(QListWidgetItem *item);
/** @brief Does this service provide a preview (for example preview a sound. */
bool hasPreview;
/** @brief Does this service provide meta info about the item. */
bool hasMetadata;
/** @brief The type for this service. */
SERVICETYPE serviceType;
public slots:
virtual void slotStartSearch(const QString searchText, int page = 0);
virtual OnlineItemInfo displayItemDetails(QListWidgetItem *item);
virtual bool startItemPreview(QListWidgetItem *item);
virtual void stopItemPreview(QListWidgetItem *item);
protected:
QListWidget *m_listWidget;
signals:
void searchInfo(const QString &);
void maxPages(int);
void gotMetaInfo(QMap <QString, QString> info);
};
#endif
This diff is collapsed.
/***************************************************************************
* Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
* Copyright (C) 2011 by Marco Gittler (marco@gitma.de) *
* Copyright (C) 2011 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
* *
* *
* 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 *
......@@ -23,48 +23,37 @@
#define FREESOUND_H
#include "ui_freesound_ui.h"
#include "abstractservice.h"
#include <QDialog>
#include <QProcess>
#include <kio/jobclasses.h>
enum SERVICETYPE { FREESOUND = 0, OPENCLIPART = 1 };
class FreeSound : public QDialog, public Ui::FreeSound_UI
class FreeSound : public AbstractService
{
Q_OBJECT
public:
FreeSound(const QString & folder, QWidget * parent = 0);
FreeSound(QListWidget *listWidget, QObject * parent = 0);
~FreeSound();
virtual QString getExtension(QListWidgetItem *item);
virtual QString getDefaultDownloadName(QListWidgetItem *item);
public slots:
virtual void slotStartSearch(const QString searchText, int page = 0);
virtual OnlineItemInfo displayItemDetails(QListWidgetItem *item);
virtual bool startItemPreview(QListWidgetItem *item);
virtual void stopItemPreview(QListWidgetItem *item);
private slots:
void slotStartSearch(int page = 0);
void slotShowResults(KJob* job);
void slotParseResults(KJob* job);
void slotUpdateCurrentSound();
void slotPlaySound();
void slotForcePlaySound(bool play);
void slotPreviewStatusChanged(QProcess::ProcessState state);
void slotSaveSound();
void slotOpenUrl(const QString &url);
void slotChangeService();
void slotOnline();
void slotOffline();
void slotNextPage();
void slotPreviousPage();
private:
QString m_folder;
QString m_currentPreview;
QString m_currentUrl;
int m_currentId;
QMap <QString, QString> m_metaInfo;
QProcess *m_previewProcess;
SERVICETYPE m_service;
void parseLicense(const QString &);
signals:
void addClip(KUrl, const QString &);
};
......
/***************************************************************************
* Copyright (C) 2011 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
* *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
#include "openclipart.h"
#include <QListWidget>
#include <QDomDocument>
#include <KDebug>
#include <kio/job.h>
#include <KIO/NetAccess>
OpenClipArt::OpenClipArt(QListWidget *listWidget, QObject *parent) :
AbstractService(listWidget, parent)
{
serviceType = OPENCLIPART;
}
OpenClipArt::~OpenClipArt()
{
}
void OpenClipArt::slotStartSearch(const QString searchText, int page)
{
m_listWidget->clear();
QString uri = "http://openclipart.org/api/search/?query=";
uri.append(searchText);
if (page > 1) uri.append("&page=" + QString::number(page));
KJob* resolveJob = KIO::storedGet( KUrl(uri), KIO::NoReload, KIO::HideProgressInfo );
connect( resolveJob, SIGNAL( result( KJob* ) ), this, SLOT( slotShowResults( KJob* ) ) );
}
void OpenClipArt::slotShowResults(KJob* job)
{
if (job->error() != 0 ) return;
m_listWidget->blockSignals(true);
KIO::StoredTransferJob* storedQueryJob = static_cast<KIO::StoredTransferJob*>( job );
QDomDocument doc;
doc.setContent(storedQueryJob->data());
QDomNodeList items = doc.documentElement().elementsByTagName("item");
for (int i = 0; i < items.count(); i++) {
QDomElement currentClip = items.at(i).toElement();
QDomElement title = currentClip.firstChildElement("title");
QListWidgetItem *item = new QListWidgetItem(title.firstChild().nodeValue(), m_listWidget);
QDomElement thumb = currentClip.firstChildElement("media:thumbnail");
item->setData(imageRole, thumb.attribute("url"));
QDomElement enclosure = currentClip.firstChildElement("enclosure");
item->setData(downloadRole, enclosure.attribute("url"));
QDomElement link = currentClip.firstChildElement("link");
item->setData(infoUrl, link.firstChild().nodeValue());
QDomElement license = currentClip.firstChildElement("cc:license");
item->setData(licenseRole, license.firstChild().nodeValue());
QDomElement desc = currentClip.firstChildElement("description");
item->setData(descriptionRole, desc.firstChild().nodeValue());
QDomElement author = currentClip.firstChildElement("dc:creator");
item->setData(authorRole, author.firstChild().nodeValue());
item->setData(authorUrl, QString("http://openclipart.org/user-detail/") + author.firstChild().nodeValue());
}
m_listWidget->blockSignals(false);
m_listWidget->setCurrentRow(0);
}
OnlineItemInfo OpenClipArt::displayItemDetails(QListWidgetItem *item)
{
OnlineItemInfo info;
if (!item) {
return info;
}
info.itemPreview = item->data(previewRole).toString();
info.itemDownload = item->data(downloadRole).toString();
info.itemId = item->data(idRole).toInt();
info.itemName = item->text();
info.infoUrl = item->data(infoUrl).toString();
info.author = item->data(authorRole).toString();
info.authorUrl = item->data(authorUrl).toString();
info.license = item->data(licenseRole).toString();
info.description = item->data(descriptionRole).toString();
info.imagePreview = item->data(imageRole).toString();
return info;
}
QString OpenClipArt::getExtension(QListWidgetItem *item)
{
if (!item) return QString();
QString url = item->data(downloadRole).toString();
return QString("*.") + url.section('.', -1);
}
QString OpenClipArt::getDefaultDownloadName(QListWidgetItem *item)
{
if (!item) return QString();
QString url = item->data(downloadRole).toString();
QString path = item->text();
path.append("." + url.section('.', -1));
return path;
}
/***************************************************************************
* Copyright (C) 2011 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
* *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
#ifndef OPENCLIPART_H
#define OPENCLIPART_H
#include "abstractservice.h"
#include <QProcess>
#include <kio/jobclasses.h>
class OpenClipArt : public AbstractService
{
Q_OBJECT
public:
OpenClipArt(QListWidget *listWidget, QObject * parent = 0);
~OpenClipArt();
virtual QString getExtension(QListWidgetItem *item);
virtual QString getDefaultDownloadName(QListWidgetItem *item);
public slots:
virtual void slotStartSearch(const QString searchText, int page = 0);
virtual OnlineItemInfo displayItemDetails(QListWidgetItem *item);
private slots:
void slotShowResults(KJob* job);
};
#endif
/***************************************************************************
* Copyright (C) 2011 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
* *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
#include "resourcewidget.h"
#include "freesound.h"
#include "openclipart.h"
#include <QPushButton>
#include <QSpinBox>
#include <QListWidget>
#include <QDomDocument>
#include <KDebug>
#include "kdenlivesettings.h"
#include <KGlobalSettings>
#include <KMessageBox>
#include <KFileDialog>
#include <kio/job.h>
#include <KIO/NetAccess>
#include <Solid/Networking>
#include <KRun>
#ifdef USE_NEPOMUK
#include <Nepomuk/Variant>
#include <Nepomuk/Resource>
#include <Nepomuk/ResourceManager>
#include <Soprano/Vocabulary/NAO>
#include <Nepomuk/Vocabulary/NIE>
#include <Nepomuk/Vocabulary/NDO>
#endif
ResourceWidget::ResourceWidget(const QString & folder, QWidget * parent) :
QDialog(parent),
m_folder(folder),
m_currentService(NULL)
{
setFont(KGlobalSettings::toolBarFont());
setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
#ifdef USE_QJSON
service_list->addItem(i18n("Freesound Audio Library"), FREESOUND);
#endif
service_list->addItem(i18n("Open Clip Art Graphic Library"), OPENCLIPART);
setWindowTitle(i18n("Search Online Resources"));
info_widget->setStyleSheet(QString("QTreeWidget { background-color: transparent;}"));
item_description->setStyleSheet(QString("KTextBrowser { background-color: transparent;}"));
connect(button_search, SIGNAL(clicked()), this, SLOT(slotStartSearch()));
connect(search_results, SIGNAL(currentRowChanged(int)), this, SLOT(slotUpdateCurrentSound()));
connect(button_preview, SIGNAL(clicked()), this, SLOT(slotPlaySound()));
connect(button_import, SIGNAL(clicked()), this, SLOT(slotSaveSound()));
connect(sound_author, SIGNAL(leftClickedUrl(const QString &)), this, SLOT(slotOpenUrl(const QString &)));
connect(item_license, SIGNAL(leftClickedUrl(const QString &)), this, SLOT(slotOpenUrl(const QString &)));
connect(sound_name, SIGNAL(leftClickedUrl(const QString &)), this, SLOT(slotOpenUrl(const QString &)));
connect(service_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChangeService()));
sound_image->setFixedWidth(180);
if (Solid::Networking::status() == Solid::Networking::Unconnected) {
slotOffline();
}
connect(Solid::Networking::notifier(), SIGNAL(shouldConnect()), this, SLOT(slotOnline()));
connect(Solid::Networking::notifier(), SIGNAL(shouldDisconnect()), this, SLOT(slotOffline()));
connect(page_next, SIGNAL(clicked()), this, SLOT(slotNextPage()));
connect(page_prev, SIGNAL(clicked()), this, SLOT(slotPreviousPage()));
connect(page_number, SIGNAL(valueChanged(int)), this, SLOT(slotStartSearch(int)));
sound_box->setEnabled(false);
search_text->setFocus();
Nepomuk::ResourceManager::instance()->init();
slotChangeService();
}
ResourceWidget::~ResourceWidget()
{
if (m_currentService) delete m_currentService;
}
void ResourceWidget::slotStartSearch(int page)
{
/*m_currentPreview.clear();
m_currentUrl.clear();*/
page_number->blockSignals(true);
page_number->setValue(page);
page_number->blockSignals(false);
m_currentService->slotStartSearch(search_text->text(), page);
/*QString uri;
if (m_service == FREESOUND) {
uri = "http://www.freesound.org/api/sounds/search/?q=";
uri.append(search_text->text());
if (page > 1) uri.append("&p=" + QString::number(page));
uri.append("&api_key=a1772c8236e945a4bee30a64058dabf8");
}
else if (m_service == OPENCLIPART) {
uri = "http://openclipart.org/api/search/?query=";
uri.append(search_text->text());
if (page > 1) uri.append("&page=" + QString::number(page));
}*/
}
void ResourceWidget::slotUpdateCurrentSound()
{
if (!sound_autoplay->isChecked()) m_currentService->stopItemPreview(NULL);
info_widget->clear();
item_description->clear();
item_license->clear();
QListWidgetItem *item = search_results->currentItem();
if (!item) {
sound_box->setEnabled(false);
return;
}
m_currentInfo = m_currentService->displayItemDetails(item);
/*m_currentPreview = item->data(previewRole).toString();
m_currentUrl = item->data(downloadRole).toString();
m_currentId = item->data(idRole).toInt();*/
if (sound_autoplay->isChecked()) m_currentService->startItemPreview(item);
sound_box->setEnabled(true);
sound_name->setText(item->text());
sound_name->setUrl(m_currentInfo.infoUrl);
sound_author->setText(m_currentInfo.author);
sound_author->setUrl(m_currentInfo.authorUrl);
item_description->setHtml(m_currentInfo.description);
KUrl img(m_currentInfo.imagePreview);
if (img.isEmpty()) return;
if (KIO::NetAccess::exists(img, KIO::NetAccess::SourceSide, this)) {
QString tmpFile;
if (KIO::NetAccess::download(img, tmpFile, this)) {
QPixmap pix(tmpFile);
int newHeight = pix.height() * sound_image->width() / pix.width();
if (newHeight > 200) {
sound_image->setScaledContents(false);
//sound_image->setFixedHeight(sound_image->width());
}
else {
sound_image->setScaledContents(true);
sound_image->setFixedHeight(newHeight);
}
sound_image->setPixmap(pix);
KIO::NetAccess::removeTempFile(tmpFile);
}
}
}
void ResourceWidget::slotDisplayMetaInfo(QMap <QString, QString> metaInfo)
{
if (metaInfo.contains("description")) {
item_description->setHtml(metaInfo.value("description"));
metaInfo.remove("description");
}
if (metaInfo.contains("license")) {