[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-panel-devel
Subject: Comics + kross
From: Petri =?iso-8859-1?q?Damst=E9n?= <petri.damsten () gmail ! com>
Date: 2008-09-25 11:46:11
Message-ID: 200809251446.18670.petri.damsten () gmail ! com
[Download RAW message or body]
[Attachment #2 (multipart/signed)]
[Attachment #4 (multipart/mixed)]
hi,
This patch enables making comic providers with scripts (supported by kross).
Things to do:
- Get providers from dataengine (and fix script icon paths)
- Make plasma package and add GHNS for comics
- it would be nice to have a 'scale to content size' option
Dilbert with python would look like this:
#!/bin/env python
# -*- coding: utf-8 -*-
import comic
import re
def init():
comic.comicAuthor = 'Scott Adams'
comic.firstStripDate = '1994-01-01'
url = 'http://dilbert.com/fast/%s/' % comic.requestedDate()
infos = {
'User-Agent': 'Mozilla/5.0 (compatible; Konqueror/3.5; Linux)
KHTML/3.5.6 (like Gecko)',
'Accept': 'text/html, image/jpeg, image/png, text/*, image/*, */*',
'Accept-Encoding': 'deflate',
'Accept-Charset': 'iso-8859-15, utf-8;q=0.5, *;q=0.5',
'Accept-Language': 'en',
'Host': 'dilbert.com',
'Connection': 'Keep-Alive'
}
comic.requestPage(url, comic.Page, infos)
def identifierType():
return comic.DateIdentifier
def identifier():
return 'dilbert_x:%s' % comic.requestedDate()
def websiteUrl():
return 'http://dilbert.com/strips/comic/%s/' % comic.requestedDate()
def pageRetrieved(id, data):
if id == comic.Page:
a = re.findall('<img
src="(/dyn/str_strip/[0-9/]+/[0-9]+\.strip\.print\.gif)"', data);
if len(a) > 0:
url = 'http://dilbert.com/%s' % a[0]
else:
url = 'http://dilbert.com/img/v1/404.gif'
comic.requestPage(url, comic.Image)
Should I continue on this road?
Petri
["comic_kross.diff" (text/x-patch)]
Index: comicproviderkross.cpp
===================================================================
--- comicproviderkross.cpp (revision 0)
+++ comicproviderkross.cpp (revision 0)
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2008 Petri Damstén <damu@iki.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library General Public License version 2 as
+ * published by the Free Software Foundation
+ *
+ * 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 Library 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 "comicproviderkross.h"
+
+COMICPROVIDER_EXPORT_PLUGIN(ComicProviderKross, "ComicProviderKross", "")
+
+ComicProviderKross::ComicProviderKross(QObject *parent, const QVariantList &args)
+: ComicProvider(parent, args)
+, m_wrapper(this)
+{
+}
+
+ComicProviderKross::~ComicProviderKross()
+{
+}
+
+ComicProvider::IdentifierType ComicProviderKross::identifierType() const
+{
+ return m_wrapper.identifierType();
+}
+
+KUrl ComicProviderKross::websiteUrl() const
+{
+ return m_wrapper.websiteUrl();
+}
+
+QImage ComicProviderKross::image() const
+{
+ return m_wrapper.image();
+}
+
+QString ComicProviderKross::identifier() const
+{
+ return m_wrapper.identifier();
+}
+
+QString ComicProviderKross::nextIdentifier() const
+{
+ QString result = m_wrapper.nextIdentifier();
+ if (!m_wrapper.functionCalled()) {
+ return ComicProvider::nextIdentifier();
+ }
+ return result;
+}
+
+QString ComicProviderKross::previousIdentifier() const
+{
+ QString result = m_wrapper.previousIdentifier();
+ if (!m_wrapper.functionCalled()) {
+ return ComicProvider::previousIdentifier();
+ }
+ return result;
+}
+
+QString ComicProviderKross::firstStripIdentifier() const
+{
+ QString result = m_wrapper.firstStripIdentifier();
+ if (!m_wrapper.functionCalled()) {
+ return ComicProvider::firstStripIdentifier();
+ }
+ return result;
+}
+
+QString ComicProviderKross::stripTitle() const
+{
+ return m_wrapper.stripTitle();
+}
+
+QString ComicProviderKross::additionalText() const
+{
+ return m_wrapper.additionalText();
+}
+
+void ComicProviderKross::pageRetrieved(int id, const QByteArray &data)
+{
+ m_wrapper.pageRetrieved(id, data);
+}
+
+void ComicProviderKross::pageError(int id, const QString &message)
+{
+ m_wrapper.pageError(id, message);
+}
+
+#include "comicproviderkross.moc"
Index: comicproviderwrapper.cpp
===================================================================
--- comicproviderwrapper.cpp (revision 0)
+++ comicproviderwrapper.cpp (revision 0)
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2008 Petri Damstén <damu@iki.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library General Public License version 2 as
+ * published by the Free Software Foundation
+ *
+ * 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 Library 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 "comicproviderwrapper.h"
+#include "comicproviderkross.h"
+#include "comicprovider.h"
+
+#include <QTimer>
+#include <KDebug>
+#include <KStandardDirs>
+#include <kross/core/action.h>
+
+ComicProviderWrapper::ComicProviderWrapper(ComicProviderKross *parent)
+: QObject(parent)
+, m_action(0)
+, m_provider(parent)
+, m_useDefaultImageHandler(true)
+{
+ QTimer::singleShot(0, this, SLOT(init()));
+}
+
+ComicProviderWrapper::~ComicProviderWrapper()
+{
+}
+
+void ComicProviderWrapper::init()
+{
+ // TODO: get this from comic package?
+ QString mainscript = \
QString("plasma/comics/%1/code/main*").arg(m_provider->comicIdentifier()); + \
QStringList scriptFiles = KGlobal::dirs()->findAllResources("data", mainscript); + \
if (scriptFiles.size() < 1) { + return;
+ }
+ m_action = new Kross::Action(parent(), m_provider->comicIdentifier());
+ if (m_action) {
+ m_action->addObject(this, "comic");
+ m_action->setFile(scriptFiles[0]);
+ m_action->trigger();
+ m_functions = m_action->functionNames();
+
+ callFunction("init");
+ }
+}
+
+ComicProvider::IdentifierType ComicProviderWrapper::identifierType()
+{
+ return (ComicProvider::IdentifierType)callFunction("identifierType").toInt();
+}
+
+KUrl ComicProviderWrapper::websiteUrl()
+{
+ return KUrl(callFunction("websiteUrl").toString());
+}
+
+QImage ComicProviderWrapper::image()
+{
+ if (m_useDefaultImageHandler) {
+ return m_image;
+ }
+ return QImage::fromData(callFunction("image").toByteArray());
+}
+
+QString ComicProviderWrapper::identifier()
+{
+ return callFunction("identifier").toString();
+}
+
+QString ComicProviderWrapper::nextIdentifier()
+{
+ return callFunction("nextIdentifier").toString();
+}
+
+QString ComicProviderWrapper::previousIdentifier()
+{
+ return callFunction("previousIdentifier").toString();
+}
+
+QString ComicProviderWrapper::firstStripIdentifier()
+{
+ return callFunction("firstStripIdentifier").toString();
+}
+
+QString ComicProviderWrapper::stripTitle()
+{
+ return callFunction("stripTitle").toString();
+}
+
+QString ComicProviderWrapper::additionalText()
+{
+ return callFunction("additionalText").toString();
+}
+
+void ComicProviderWrapper::pageRetrieved(int id, const QByteArray &data)
+{
+ if (m_useDefaultImageHandler && id == Image) {
+ m_image = QImage::fromData(data);
+ emit m_provider->finished(m_provider);
+ } else {
+ callFunction("pageRetrieved", QVariantList() << id << data);
+ }
+}
+
+void ComicProviderWrapper::pageError(int id, const QString &message)
+{
+ callFunction("pageError", QVariantList() << id << message);
+ if (!functionCalled()) {
+ emit m_provider->error(m_provider);
+ }
+}
+
+QString ComicProviderWrapper::firstStripDate()
+{
+ return m_provider->firstStripDate().toString(Qt::ISODate);
+}
+
+void ComicProviderWrapper::setFirstStripDate(const QString &date)
+{
+ m_provider->setFirstStripDate(QDate::fromString(date, Qt::ISODate));
+}
+
+int ComicProviderWrapper::firstStripNumber()
+{
+ return m_provider->firstStripNumber();
+}
+
+void ComicProviderWrapper::setFirstStripNumber(int number)
+{
+ m_provider->setFirstStripNumber(number);
+}
+
+QString ComicProviderWrapper::comicAuthor()
+{
+ return m_provider->comicAuthor();
+}
+
+void ComicProviderWrapper::setComicAuthor(const QString &author)
+{
+ m_provider->setComicAuthor(author);
+}
+
+void ComicProviderWrapper::finished()
+{
+ emit m_provider->finished(m_provider);
+}
+
+void ComicProviderWrapper::error()
+{
+ emit m_provider->error(m_provider);
+}
+
+QString ComicProviderWrapper::requestedDate()
+{
+ return m_provider->requestedDate().toString(Qt::ISODate);
+}
+
+int ComicProviderWrapper::requestedNumber()
+{
+ return m_provider->requestedNumber();
+}
+
+QString ComicProviderWrapper::requestedString()
+{
+ return m_provider->requestedString();
+}
+
+void ComicProviderWrapper::requestPage(const QString &url, int id, const QVariantMap \
&infos) +{
+ QMap<QString, QString> map;
+
+ foreach (const QString& key, infos.keys()) {
+ map[key] = infos[key].toString();
+ }
+ m_provider->requestPage(KUrl(url), id, map);
+}
+
+bool ComicProviderWrapper::functionCalled()
+{
+ return m_funcFound;
+}
+
+QVariant ComicProviderWrapper::callFunction(const QString &name, const QVariantList \
&args) +{
+ if (m_action) {
+ m_funcFound = m_functions.contains(name);
+ if (m_funcFound) {
+ return m_action->callFunction(name, args);
+ }
+ }
+ return QVariant();
+}
+
+void ComicProviderWrapper::setUseDefaultImageHandler(bool useDefaultImageHandler)
+{
+ m_useDefaultImageHandler = useDefaultImageHandler;
+}
+
+bool ComicProviderWrapper::useDefaultImageHandler()
+{
+ return m_useDefaultImageHandler;
+}
+
+#include "comicproviderwrapper.moc"
Index: comicprovider.h
===================================================================
--- comicprovider.h (revision 864584)
+++ comicprovider.h (working copy)
@@ -129,6 +129,11 @@
*/
bool isCurrent() const;
+ /**
+ * Returns the identifier for the comic
+ */
+ QString comicIdentifier() const;
+
Q_SIGNALS:
/**
* This signal is emitted whenever a request has been finished
Index: comicprovider.cpp
===================================================================
--- comicprovider.cpp (revision 864584)
+++ comicprovider.cpp (working copy)
@@ -18,16 +18,19 @@
#include "comicprovider.h"
+#include <KDebug>
+#include <KPluginInfo>
#include <KIO/Job>
#include <KIO/StoredTransferJob>
class ComicProvider::Private
{
public:
- Private( ComicProvider *parent )
+ Private( KService::Ptr service, ComicProvider *parent )
: mParent( parent ),
mIsCurrent( false ),
- mFirstStripNumber( 1 )
+ mFirstStripNumber( 1 ),
+ mcomicDescription(service)
{
}
@@ -50,14 +53,15 @@
QDate mFirstStripDate;
int mRequestedNumber;
int mFirstStripNumber;
+ KPluginInfo mcomicDescription;
};
ComicProvider::ComicProvider( QObject *parent, const QVariantList &args )
- : QObject( parent ), d( new Private( this ) )
+ : QObject( parent ), d( new Private( KService::serviceByStorageId(args[ 2 \
].toString()), this ) ) {
- Q_ASSERT( args.count() == 2 );
+ Q_ASSERT( args.count() == 3 );
+ const QString type = args[ 0 ].toString();
- const QString type = args[ 0 ].toString();
if ( type == "Date" )
d->mRequestedDate = args[ 1 ].toDate();
else if ( type == "Number" )
@@ -197,4 +201,12 @@
{
}
+QString ComicProvider::comicIdentifier() const
+{
+ if (!d->mcomicDescription.isValid()) {
+ return QString();
+ }
+ return d->mcomicDescription.property( "X-KDE-PlasmaComicProvider-Identifier" \
).toString(); +}
+
#include "comicprovider.moc"
Index: comicproviderwrapper.h
===================================================================
--- comicproviderwrapper.h (revision 0)
+++ comicproviderwrapper.h (revision 0)
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2008 Petri Damstén <damu@iki.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library General Public License version 2 as
+ * published by the Free Software Foundation
+ *
+ * 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 Library 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 COMICPROVIDERWRAPPER_H
+#define COMICPROVIDERWRAPPER_H
+
+#include "comicprovider.h"
+
+#include <KUrl>
+#include <QImage>
+
+namespace Kross {
+ class Action;
+}
+class ComicProviderKross;
+
+class ComicProviderWrapper : public QObject
+{
+ Q_OBJECT
+ Q_ENUMS(IdentifierType)
+ Q_ENUMS(RequestType)
+ Q_PROPERTY(QString firstStripDate READ firstStripDate WRITE \
setFirstStripDate) + Q_PROPERTY(int firstStripNumber READ firstStripNumber \
WRITE setFirstStripNumber) + Q_PROPERTY(QString comicAuthor READ comicAuthor \
WRITE setComicAuthor) + Q_PROPERTY(bool useDefaultImageHandler READ \
useDefaultImageHandler WRITE setUseDefaultImageHandler) + public:
+ enum RequestType {
+ Page = 0,
+ Image,
+ User
+ };
+ enum IdentifierType {
+ DateIdentifier = ComicProvider::DateIdentifier,
+ NumberIdentifier = ComicProvider::NumberIdentifier,
+ StringIdentifier = ComicProvider::StringIdentifier
+ };
+
+ ComicProviderWrapper(ComicProviderKross *parent);
+ ~ComicProviderWrapper();
+
+ ComicProvider::IdentifierType identifierType();
+ KUrl websiteUrl();
+ QImage image();
+ QString identifier();
+ QString nextIdentifier();
+ QString previousIdentifier();
+ QString firstStripIdentifier();
+ QString stripTitle();
+ QString additionalText();
+ void pageRetrieved(int id, const QByteArray &data);
+ void pageError(int id, const QString &message);
+
+ QString firstStripDate();
+ void setFirstStripDate(const QString &date);
+ int firstStripNumber();
+ void setFirstStripNumber(int number);
+ QString comicAuthor();
+ void setComicAuthor(const QString &author);
+ void setUseDefaultImageHandler(bool useDefaultImageHandler);
+ bool useDefaultImageHandler();
+
+ bool functionCalled();
+
+ public slots:
+ void finished();
+ void error();
+
+ QString requestedDate();
+ int requestedNumber();
+ QString requestedString();
+ void requestPage(const QString &url, int id, const QVariantMap &infos = \
QVariantMap()); +
+ void init();
+
+ protected:
+ QVariant callFunction(const QString &name, const QVariantList &args = \
QVariantList()); +
+ private:
+ Kross::Action *m_action;
+ ComicProviderKross *m_provider;
+ QStringList m_functions;
+ bool m_funcFound;
+ bool m_useDefaultImageHandler;
+ QImage m_image;
+};
+
+#endif
Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt (revision 864584)
+++ CMakeLists.txt (working copy)
@@ -17,8 +17,8 @@
)
kde4_add_library( plasmacomicprovidercore SHARED ${comic_provider_core_SRCS} )
-target_link_libraries( plasmacomicprovidercore ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} )
-set_target_properties(
+target_link_libraries( plasmacomicprovidercore ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} \
${KDE4_KROSSCORE_LIBS} ) +set_target_properties(
plasmacomicprovidercore PROPERTIES VERSION 1.0.0 SOVERSION 1
${KDE4_DISABLE_PROPERTY_}LINK_INTERFACE_LIBRARIES "${KDE4_KDECORE_LIBS}"
)
@@ -26,7 +26,17 @@
install( TARGETS plasmacomicprovidercore ${INSTALL_TARGETS_DEFAULT_ARGS} )
install( FILES plasma_comicprovider.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} \
)
+########### kross ###############
+set( plasma_comic_krossprovider_SRCS
+ comicproviderkross.cpp
+ comicproviderwrapper.cpp
+)
+
+kde4_add_plugin( plasma_comic_krossprovider ${plasma_comic_krossprovider_SRCS} )
+target_link_libraries( plasma_comic_krossprovider plasmacomicprovidercore \
${KDE4_KDECORE_LIBS} ${QT_QTGUI_LIBRARY} ${KDE4_KIO_LIBS} ${KDE4_KROSSCORE_LIBS} ) \
+install( TARGETS plasma_comic_krossprovider DESTINATION ${PLUGIN_INSTALL_DIR} ) +
########### plugins ###############
set( comic_dilbert_provider_SRCS
Index: comic.cpp
===================================================================
--- comic.cpp (revision 864584)
+++ comic.cpp (working copy)
@@ -86,6 +86,7 @@
} else if ( type == "Number" ) {
args << "Number" << parts[ 1 ].toInt();
}
+ args << service->storageId();
provider = service->createInstance<ComicProvider>( this, args );
if ( !provider )
@@ -95,7 +96,6 @@
connect( provider, SIGNAL( finished( ComicProvider* ) ), this, SLOT( finished( \
ComicProvider* ) ) );
connect( provider, SIGNAL( error( ComicProvider* ) ), this, SLOT( error( \
ComicProvider* ) ) );
-
return true;
}
@@ -154,7 +154,6 @@
CachedProvider::storeInCache( provider->identifier(), provider->image(), \
info ); }
-
provider->deleteLater();
}
Index: comicproviderkross.h
===================================================================
--- comicproviderkross.h (revision 0)
+++ comicproviderkross.h (revision 0)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2008 Petri Damstén <damu@iki.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library General Public License version 2 as
+ * published by the Free Software Foundation
+ *
+ * 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 Library 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 COMICPROVIDERKROSS_H
+#define COMICPROVIDERKROSS_H
+
+#include "comicprovider.h"
+#include "comicproviderwrapper.h"
+
+#include <KUrl>
+#include <QImage>
+
+class ComicProviderKross : public ComicProvider
+{
+ friend class ComicProviderWrapper;
+ Q_OBJECT
+ public:
+ ComicProviderKross(QObject *parent, const QVariantList &args);
+ virtual ~ComicProviderKross();
+
+ virtual IdentifierType identifierType() const;
+ virtual KUrl websiteUrl() const;
+ virtual QImage image() const;
+ virtual QString identifier() const;
+ virtual QString nextIdentifier() const;
+ virtual QString previousIdentifier() const;
+ virtual QString firstStripIdentifier() const;
+ virtual QString stripTitle() const;
+ virtual QString additionalText() const;
+
+ protected:
+ virtual void pageRetrieved(int id, const QByteArray &data);
+ virtual void pageError(int id, const QString &message);
+
+ private:
+ mutable ComicProviderWrapper m_wrapper;
+};
+
+#endif
["signature.asc" (application/pgp-signature)]
_______________________________________________
Plasma-devel mailing list
Plasma-devel@kde.org
https://mail.kde.org/mailman/listinfo/plasma-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic