First semi-working implementation in c++ of remote Danbooru calls
This commit is contained in:
		
					parent
					
						
							
								c0cf369b92
							
						
					
				
			
			
				commit
				
					
						fc691a9301
					
				
			
		
					 9 changed files with 1341 additions and 0 deletions
				
			
		
							
								
								
									
										20
									
								
								src/libdanbooru/CMakeLists.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/libdanbooru/CMakeLists.txt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					project(libdanbooru)
 | 
				
			||||||
 | 
					include (KDE4Defaults)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set (libdanbooru_VERSION_MAJOR 0)
 | 
				
			||||||
 | 
					set (libdanbooru_VERSION_MINOR 0)
 | 
				
			||||||
 | 
					set (libdanbooru_VERSION_PATCH 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set (libdanbooru_SRCS
 | 
				
			||||||
 | 
					     danboorupool.cpp
 | 
				
			||||||
 | 
					     danbooruservice.cpp
 | 
				
			||||||
 | 
					     danboorupost.cpp
 | 
				
			||||||
 | 
					     utils.cpp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include_directories( ${CMAKE_CURRENT_BINARY_DIR}/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kde4_add_library(danbooru STATIC ${libdanbooru_SRCS})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target_link_libraries(danbooru ${KDE4_KIO_LIBS})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install(TARGETS danbooru ${INSTALL_TARGETS_DEFAULT_ARGS})
 | 
				
			||||||
							
								
								
									
										79
									
								
								src/libdanbooru/danboorupool.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								src/libdanbooru/danboorupool.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,79 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This file is part of libdanbooru.
 | 
				
			||||||
 | 
					 * Copyright 2013  Luca Beltrame <lbeltrame@kde.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) version 3 or any later version
 | 
				
			||||||
 | 
					 * accepted by the membership of KDE e.V. (or its successor approved
 | 
				
			||||||
 | 
					 * by the membership of KDE e.V.), which shall act as a proxy
 | 
				
			||||||
 | 
					 * defined in Section 14 of version 3 of the license.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "danboorupool.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Danbooru {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DanbooruPool::DanbooruPool(const QVariantMap& postData, QObject* parent):
 | 
				
			||||||
 | 
					                           QObject(parent), m_posts(QList<int>())
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_id = postData.value("id").toInt();
 | 
				
			||||||
 | 
					    m_name = postData.value("name").toString();
 | 
				
			||||||
 | 
					    m_postCount = postData.value("post_count").toInt();
 | 
				
			||||||
 | 
					    m_description = postData.value("description").toString();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int DanbooruPool::id() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_id;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString DanbooruPool::name() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_name;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString DanbooruPool::description() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_description;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int DanbooruPool::postCount() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_postCount;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QList< int > DanbooruPool::posts() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_posts;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DanbooruPool::addPost(int post)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_posts.append(post);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DanbooruPool::addPosts(QList< int > posts)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_posts.append(posts);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DanbooruPool::addPosts(QStringList posts)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    foreach (QString post, posts) {
 | 
				
			||||||
 | 
					        m_posts.append(post.toInt());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace Danbooru
 | 
				
			||||||
							
								
								
									
										108
									
								
								src/libdanbooru/danboorupool.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								src/libdanbooru/danboorupool.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,108 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This file is part of libdanbooru.
 | 
				
			||||||
 | 
					 * Copyright 2013  Luca Beltrame <lbeltrame@kde.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) version 3 or any later version
 | 
				
			||||||
 | 
					 * accepted by the membership of KDE e.V. (or its successor approved
 | 
				
			||||||
 | 
					 * by the membership of KDE e.V.), which shall act as a proxy
 | 
				
			||||||
 | 
					 * defined in Section 14 of version 3 of the license.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef DANBOORUPOOL_H
 | 
				
			||||||
 | 
					#define DANBOORUPOOL_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief This file includes classes which models Danbooru pools.
 | 
				
			||||||
 | 
					 * @file danboorupool.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 **/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QtCore/QObject>
 | 
				
			||||||
 | 
					#include <QtCore/QVariant>
 | 
				
			||||||
 | 
					#include <QtCore/QList>
 | 
				
			||||||
 | 
					#include <QtCore/QStringList>
 | 
				
			||||||
 | 
					#include <QtXml/QXmlStreamAttributes>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Danbooru {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief Class representing a Danbooru pool.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * Pools are organized groups of images, often by a common theme, for
 | 
				
			||||||
 | 
					     * example taken from the same artbook. They are identified by unique IDs
 | 
				
			||||||
 | 
					     * and are represented by a name, a description, and the posts they
 | 
				
			||||||
 | 
					     * contain.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @author Luca Beltrame (lbeltrame@kde.org)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * **/
 | 
				
			||||||
 | 
					    class DanbooruPool : public QObject
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private:
 | 
				
			||||||
 | 
					        int m_id;
 | 
				
			||||||
 | 
					        int m_postCount;
 | 
				
			||||||
 | 
					        QString m_name;
 | 
				
			||||||
 | 
					        QString m_description;
 | 
				
			||||||
 | 
					        QList<int> m_posts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Construct a Danbooru pool from a QVariantMap.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * This form is the easiest to use and should be used when dealing with
 | 
				
			||||||
 | 
					         * responses in JSON format. Unfortunately most Danbooru
 | 
				
			||||||
 | 
					         * implementations produce broken JSON for some responses.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param postData A QVariantMap from parsed JSON representing the
 | 
				
			||||||
 | 
					         *      data from a single pool.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        DanbooruPool(const QVariantMap& postData, QObject* parent = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Construct a Danbooru pool from a QVariantMap.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * This form is the easiest to use and should be used when dealing with
 | 
				
			||||||
 | 
					         * responses in JSON format. Unfortunately most Danbooru
 | 
				
			||||||
 | 
					         * implementations produce broken JSON for some responses.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param postData A QXmlStreamAttributes instance holding the
 | 
				
			||||||
 | 
					         *      attributes for the given pool.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        DanbooruPool(const QXmlStreamAttributes& postData, QObject* parent=0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int id() const;
 | 
				
			||||||
 | 
					        int postCount() const;
 | 
				
			||||||
 | 
					        QString name() const;
 | 
				
			||||||
 | 
					        QString description() const;
 | 
				
			||||||
 | 
					        QList<int> posts() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void addPost(int post);
 | 
				
			||||||
 | 
					        void addPosts(QList<int> posts);
 | 
				
			||||||
 | 
					        void addPosts(QStringList posts);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}; // namespace Danbooru
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Q_DECLARE_METATYPE(Danbooru::DanbooruPool*)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // DANBOORUPOOL_H
 | 
				
			||||||
							
								
								
									
										132
									
								
								src/libdanbooru/danboorupost.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								src/libdanbooru/danboorupost.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,132 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This file is part of libdanbooru.
 | 
				
			||||||
 | 
					 * Copyright 2013  Luca Beltrame <lbeltrame@kde.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) version 3 or any later version
 | 
				
			||||||
 | 
					 * accepted by the membership of KDE e.V. (or its successor approved
 | 
				
			||||||
 | 
					 * by the membership of KDE e.V.), which shall act as a proxy
 | 
				
			||||||
 | 
					 * defined in Section 14 of version 3 of the license.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Qt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QtCore/QString>
 | 
				
			||||||
 | 
					#include <QtGui/QPixmap>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// KDE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <kurl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Own
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "danboorupost.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Danbooru {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DanbooruPost::DanbooruPost(QVariantMap postData, QPixmap* pixmap,
 | 
				
			||||||
 | 
					                               QObject* parent):
 | 
				
			||||||
 | 
					                               QObject(parent),
 | 
				
			||||||
 | 
					                               m_pixmap(pixmap)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_tags = postData.value("tags").toString().split(' ');
 | 
				
			||||||
 | 
					        m_id = postData.value("id").toString().toInt();
 | 
				
			||||||
 | 
					        m_height = postData.value("height").toString().toInt();
 | 
				
			||||||
 | 
					        m_width = postData.value("width").toString().toInt();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_url = KUrl(postData.value("file_url").toUrl() );
 | 
				
			||||||
 | 
					        m_thumbnailUrl = KUrl(postData.value("preview_url").toUrl());
 | 
				
			||||||
 | 
					        m_size = postData.value("file_size").toInt();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DanbooruPost::DanbooruPost(QXmlStreamAttributes& postData,
 | 
				
			||||||
 | 
					                               QPixmap* pixmap,
 | 
				
			||||||
 | 
					                               QObject* parent):
 | 
				
			||||||
 | 
					                               QObject(parent),
 | 
				
			||||||
 | 
					                               m_pixmap(pixmap)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    Q_UNUSED(postData)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DanbooruPost::~DanbooruPost()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        delete m_pixmap;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool DanbooruPost::operator==(const Danbooru::DanbooruPost& other)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_url == other.m_url && m_id == other.m_id;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruPost::setPixmap(QPixmap* pixmap)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        m_pixmap = pixmap;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const QString DanbooruPost::toString()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        QString display = QString("Danbooru Post with ID %1 and URL %2, width %3 height %4 ");
 | 
				
			||||||
 | 
					        display = display.arg(id()).arg(fileUrl().url()).arg(width()).arg(height());
 | 
				
			||||||
 | 
					        return display;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int DanbooruPost::id() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_id;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int DanbooruPost::height() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_height;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int DanbooruPost::width() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_width;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QStringList DanbooruPost::tags() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_tags;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const KUrl DanbooruPost::thumbnailUrl() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_thumbnailUrl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QPixmap* DanbooruPost::pixmap() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_pixmap;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int DanbooruPost::size() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_size;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const KUrl DanbooruPost::fileUrl() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_url;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace Danbooru
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										188
									
								
								src/libdanbooru/danboorupost.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								src/libdanbooru/danboorupost.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,188 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * <one line to give the library's name and an idea of what it does.>
 | 
				
			||||||
 | 
					 * Copyright 2013  Luca Beltrame <lbeltrame@kde.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) version 3 or any later version
 | 
				
			||||||
 | 
					 * accepted by the membership of KDE e.V. (or its successor approved
 | 
				
			||||||
 | 
					 * by the membership of KDE e.V.), which shall act as a proxy
 | 
				
			||||||
 | 
					 * defined in Section 14 of version 3 of the license.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef DANBOORUPOST_H
 | 
				
			||||||
 | 
					#define DANBOORUPOST_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief File containing classes to represent Danbooru posts.
 | 
				
			||||||
 | 
					 * @file danboorupost.h
 | 
				
			||||||
 | 
					 **/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Qt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QtCore/QObject>
 | 
				
			||||||
 | 
					#include <QtCore/QVariant>
 | 
				
			||||||
 | 
					#include <QtCore/QStringList>
 | 
				
			||||||
 | 
					#include <QtXml/QXmlStreamAttributes>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// KDE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <KUrl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class QPixmap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Danbooru {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief A class representing a Danbooru post.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * A Danbooru post is an object that models the posts present in a
 | 
				
			||||||
 | 
					     * Danbooru board, that is an image with associated information.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * In particular, posts contain information on the id, size and dimensions
 | 
				
			||||||
 | 
					     * of the image, its tags, "preview url" (URL to the thumbnail) and
 | 
				
			||||||
 | 
					     * file URL.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * This is used directly by the DanbooruService class.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @author Luca Beltrame (lbeltrame@kde.org)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @see DanbooruService, DanbooruPool
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     **/
 | 
				
			||||||
 | 
					    class DanbooruPost : public QObject
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Q_PROPERTY(QPixmap* pixmap READ pixmap WRITE setPixmap)
 | 
				
			||||||
 | 
					    Q_PROPERTY(int id READ id)
 | 
				
			||||||
 | 
					    Q_PROPERTY(KUrl fileUrl READ fileUrl)
 | 
				
			||||||
 | 
					    Q_PROPERTY(QStringList tags READ tags)
 | 
				
			||||||
 | 
					    Q_PROPERTY(KUrl thumbnailUrl READ thumbnailUrl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QPixmap* m_pixmap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // basic features of a post
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int m_id;
 | 
				
			||||||
 | 
					        int m_height;
 | 
				
			||||||
 | 
					        int m_width;
 | 
				
			||||||
 | 
					        int m_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        KUrl m_url;
 | 
				
			||||||
 | 
					        KUrl m_thumbnailUrl;
 | 
				
			||||||
 | 
					        QStringList m_tags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Construct a Danbooru post from a QVariantMap.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * This form is the easiest to use and should be used when dealing with
 | 
				
			||||||
 | 
					         * responses in JSON format. Unfortunately most Danbooru
 | 
				
			||||||
 | 
					         * implementations produce broken JSON for some responses.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param postData A QVariantMap from parsed JSON representing the
 | 
				
			||||||
 | 
					         *      data from a single post.
 | 
				
			||||||
 | 
					         * @param pixmap A QPixmap pointer to the post thumbnail.
 | 
				
			||||||
 | 
					         * @param parent A pointer to the parent QObject.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        explicit DanbooruPost(QVariantMap postData, QPixmap* pixmap = 0,
 | 
				
			||||||
 | 
					                              QObject* parent = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Construct a Danbooru post from XML attributes
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * This is an overloaded function which uses XML attributes rather
 | 
				
			||||||
 | 
					         * than JSON. It should be used in case the JSON responses aren't
 | 
				
			||||||
 | 
					         * complete or broken (for example pools' posts in most Danbooru
 | 
				
			||||||
 | 
					         * instances).
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param postData A QXmlStreamAttributes instance holding the
 | 
				
			||||||
 | 
					         *      attributes for the given post.
 | 
				
			||||||
 | 
					         * @param pixmap A QPixmap pointer to the post thumbnail.
 | 
				
			||||||
 | 
					         * @param parent A pointer to the parent QObject.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        explicit DanbooruPost(QXmlStreamAttributes& postData,
 | 
				
			||||||
 | 
					                              QPixmap* pixmap = 0,  QObject* parent=0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        bool operator==(const DanbooruPost&);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ~DanbooruPost();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Post attributes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return The ID of the post.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        int id() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return The height in pixels of the post's image.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        int height() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return The width in pixels of the post's image.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        int width() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return The size in bytes of the post's image.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        int size() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return The URL to the post's image.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        const KUrl fileUrl() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return The tags associated to the post.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        QStringList tags() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return The URL to the post's thumbnail.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        const KUrl thumbnailUrl() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return A pointer to the thumbnail's pixmap.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        QPixmap* pixmap() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Set the post's pixmap to a specific QPixmap instance's pointer.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void setPixmap(QPixmap* pixmap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return A string representation of the post.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * **/
 | 
				
			||||||
 | 
					        const QString toString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}; // namespace Danbooru
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Q_DECLARE_METATYPE(Danbooru::DanbooruPost*)
 | 
				
			||||||
 | 
					#endif // DANBOORUPOST_H
 | 
				
			||||||
							
								
								
									
										340
									
								
								src/libdanbooru/danbooruservice.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								src/libdanbooru/danbooruservice.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,340 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * <one line to give the library's name and an idea of what it does.>
 | 
				
			||||||
 | 
					 * Copyright 2013  Luca Beltrame <lbeltrame@kde.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) version 3 or any later version
 | 
				
			||||||
 | 
					 * accepted by the membership of KDE e.V. (or its successor approved
 | 
				
			||||||
 | 
					 * by the membership of KDE e.V.), which shall act as a proxy
 | 
				
			||||||
 | 
					 * defined in Section 14 of version 3 of the license.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QtCore/QDebug>
 | 
				
			||||||
 | 
					#include <qjson/parser.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <KIO/Job>
 | 
				
			||||||
 | 
					#include <KIO/Scheduler>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "danbooruservice.h"
 | 
				
			||||||
 | 
					#include "danboorupost.h"
 | 
				
			||||||
 | 
					#include "danboorupool.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Danbooru {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    using KIO::StoredTransferJob;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const QString DanbooruService::POST_URL ="post/index.json" ;
 | 
				
			||||||
 | 
					    const QString DanbooruService::TAG_URL = "tag/index.json";
 | 
				
			||||||
 | 
					    const QString DanbooruService::POOL_URL = "pool/index.json";
 | 
				
			||||||
 | 
					    const QString DanbooruService::ARTIST_URL = "artist/index.json";
 | 
				
			||||||
 | 
					    const QString DanbooruService::POOL_DATA_URL = "pool/show.xml";
 | 
				
			||||||
 | 
					    const QString DanbooruService::RELATED_TAG_URL = "tag/related.json";
 | 
				
			||||||
 | 
					    const QMap<QString, QStringList> DanbooruService::RATINGS = initRatings();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DanbooruService::DanbooruService(KUrl& boardUrl, QString username,
 | 
				
			||||||
 | 
					                                     QString password,
 | 
				
			||||||
 | 
					                                     QObject* parent):
 | 
				
			||||||
 | 
					                                     QObject(parent),
 | 
				
			||||||
 | 
					                                     m_url(boardUrl),
 | 
				
			||||||
 | 
					                                     m_username(username),
 | 
				
			||||||
 | 
					                                     m_password(password),
 | 
				
			||||||
 | 
					                                     m_maxRating("Safe"),
 | 
				
			||||||
 | 
					                                     m_currentPosts(0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DanbooruService::~DanbooruService()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const QMap< QString, QStringList > DanbooruService::initRatings()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        QMap<QString, QStringList> map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QStringList safeRatings;
 | 
				
			||||||
 | 
					        safeRatings.append(QString("Safe"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QStringList questionableRatings = QStringList(safeRatings);
 | 
				
			||||||
 | 
					        questionableRatings.append(QString("Questionable"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QStringList explicitRatings = QStringList(questionableRatings);
 | 
				
			||||||
 | 
					        explicitRatings.append(QString("Explicit"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        map.insert("Safe", safeRatings);
 | 
				
			||||||
 | 
					        map.insert("Questionable", questionableRatings);
 | 
				
			||||||
 | 
					        map.insert("Explicit", explicitRatings);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::getPostList(int page, QStringList tags, int limit)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // We can't fetch more than 100 items, API limitation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        limit = limit > 100 ? 100: limit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QMap<QString, QString> map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        map.insert("limit", QString::number(limit));
 | 
				
			||||||
 | 
					        map.insert("page", QString::number(page));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        KUrl danbooruUrl = requestUrl(m_url, POST_URL, m_username,
 | 
				
			||||||
 | 
					                                     m_password, map, tags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        qDebug() << "Final constructed URL" << danbooruUrl.url();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        KIO::StoredTransferJob* job = KIO::storedGet(danbooruUrl, KIO::NoReload,
 | 
				
			||||||
 | 
					                                                     KIO::HideProgressInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        connect(job, SIGNAL(result(KJob*)), this,
 | 
				
			||||||
 | 
					                SLOT(processPostList(KJob*)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::getTagList(int limit, QString name)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::getPool(int poolId, int page)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::getPoolList(int page)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        KUrl danbooruUrl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (page == 0) {
 | 
				
			||||||
 | 
					           danbooruUrl = requestUrl(m_url, POOL_URL, m_username, m_password);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            QMap<QString, QString> map;
 | 
				
			||||||
 | 
					            map.insert("page", QString::number(page));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            danbooruUrl = requestUrl(m_url, POOL_URL, m_username,
 | 
				
			||||||
 | 
					                                          m_password, map);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        qDebug() << "Final constructed URL" << danbooruUrl.url();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        KIO::StoredTransferJob* job = KIO::storedGet(danbooruUrl, KIO::NoReload,
 | 
				
			||||||
 | 
					                                                     KIO::HideProgressInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        connect(job, SIGNAL(result(KJob*)), this,
 | 
				
			||||||
 | 
					                SLOT(processPoolList(KJob*)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::getRelatedTags(QStringList tags,
 | 
				
			||||||
 | 
					                                         Danbooru::TagType tagType)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Getters / setters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QStringList DanbooruService::blacklist() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_blacklist;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const QStringList DanbooruService::allowedRatings() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return RATINGS.value(m_maxRating);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::setMaximumAllowedRating(QString rating)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (RATINGS.contains(rating)) {
 | 
				
			||||||
 | 
					            m_maxRating = rating;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const QString DanbooruService::maximumAllowedRating() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_maxRating;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Slots
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::processPostList(KJob* job)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        qDebug() << "Got post data OK";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (job->error()) {
 | 
				
			||||||
 | 
					            Q_EMIT(downloadError(job->errorString()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        StoredTransferJob* jobResult = qobject_cast<StoredTransferJob*>(job);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (jobResult == 0) {
 | 
				
			||||||
 | 
					            Q_EMIT(downloadError(QString("Internal error")));
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QByteArray data = jobResult->data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QJson::Parser parser;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        bool ok;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QVariant result = parser.parse(data, &ok);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!ok) {
 | 
				
			||||||
 | 
					            Q_EMIT(downloadError(QString("Unable to decode data")));
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QList<QVariant> postList = result.toList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // How many posts do we have to fetch?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_currentPosts = postList.length();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Q_FOREACH(QVariant element, postList) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QVariantMap map = element.toMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            DanbooruPost* post = new DanbooruPost(map);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            StoredTransferJob* pixmapJob = KIO::storedGet(post->thumbnailUrl(),
 | 
				
			||||||
 | 
					                KIO::NoReload, KIO::HideProgressInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // We don't want to overload the servers, so set some rational
 | 
				
			||||||
 | 
					            // priority
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            KIO::Scheduler::setJobPriority(static_cast<KIO::SimpleJob*>(job),
 | 
				
			||||||
 | 
					                                           1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QVariant variant;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            variant.setValue(post);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            pixmapJob->setProperty("danbooruPost", variant);
 | 
				
			||||||
 | 
					            connect(pixmapJob, SIGNAL(result(KJob*)), this,
 | 
				
			||||||
 | 
					                    SLOT(downloadThumbnail(KJob*)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::processRelatedTagList(KJob* job)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Q_UNUSED(job)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::processPoolList(KJob* job)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        qDebug() << "Got pool data OK";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (job->error()) {
 | 
				
			||||||
 | 
					            Q_EMIT(downloadError(job->errorString()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        StoredTransferJob* jobResult = qobject_cast<StoredTransferJob*>(job);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (jobResult == 0) {
 | 
				
			||||||
 | 
					            Q_EMIT(downloadError(QString("Internal error")));
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QByteArray data = jobResult->data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QJson::Parser parser;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        bool ok;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QVariant result = parser.parse(data, &ok);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!ok) {
 | 
				
			||||||
 | 
					            Q_EMIT(downloadError(QString("Unable to decode data")));
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QList<QVariant> poolList = result.toList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int currentPools = poolList.length();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Q_FOREACH(QVariant element, poolList) {
 | 
				
			||||||
 | 
					            QVariantMap map = element.toMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            DanbooruPool* pool = new DanbooruPool(map);
 | 
				
			||||||
 | 
					            Q_EMIT(poolDownloaded(pool));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        qDebug() << "Pool download finished!";
 | 
				
			||||||
 | 
					        Q_EMIT(poolDownloadFinished());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::downloadAllTags(KJob* job)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Q_UNUSED(job)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void DanbooruService::downloadThumbnail(KJob* job)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (job->error()) {
 | 
				
			||||||
 | 
					            Q_EMIT(downloadError(job->errorString()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QVariant postData = job->property("danbooruPost");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        DanbooruPost* post = postData.value<DanbooruPost*>();
 | 
				
			||||||
 | 
					        QPixmap* pix = new QPixmap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        StoredTransferJob* jobResult = qobject_cast<StoredTransferJob*>(job);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (jobResult == 0) {
 | 
				
			||||||
 | 
					            Q_EMIT(downloadError(QString("Internal error")));
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        bool ok = pix->loadFromData(jobResult->data());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!ok) {
 | 
				
			||||||
 | 
					            Q_EMIT(downloadError(QString("Pixmap data could not be loaded")));
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        post->setPixmap(pix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_currentPosts--; // One less post to do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        qDebug() << "Current posts remaining" << m_currentPosts;
 | 
				
			||||||
 | 
					        Q_EMIT(postDownloaded(post));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (m_currentPosts == 0) {
 | 
				
			||||||
 | 
					            qDebug() << "Post download finished";
 | 
				
			||||||
 | 
					            Q_EMIT(postDownloadFinished());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace Danbooru
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										265
									
								
								src/libdanbooru/danbooruservice.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										265
									
								
								src/libdanbooru/danbooruservice.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,265 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This file is part of libdanbooru.
 | 
				
			||||||
 | 
					 * Copyright 2013  Luca Beltrame <lbeltrame@kde.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) version 3 or any later version
 | 
				
			||||||
 | 
					 * accepted by the membership of KDE e.V. (or its successor approved
 | 
				
			||||||
 | 
					 * by the membership of KDE e.V.), which shall act as a proxy
 | 
				
			||||||
 | 
					 * defined in Section 14 of version 3 of the license.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef DANBOORUSERVICE_H
 | 
				
			||||||
 | 
					#define DANBOORUSERVICE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Classes to interact with Danbooru boards
 | 
				
			||||||
 | 
					 * @file danbooruservice.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QtCore/QObject>
 | 
				
			||||||
 | 
					#include <QtCore/QString>
 | 
				
			||||||
 | 
					#include <QtCore/QStringList>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <KUrl>
 | 
				
			||||||
 | 
					#include <KIO/JobClasses>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class QPixmap;
 | 
				
			||||||
 | 
					class KUrl;
 | 
				
			||||||
 | 
					class KJob;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief The Danbooru namespace.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 **/
 | 
				
			||||||
 | 
					namespace Danbooru {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief Types of tags
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * A Danbooru tag is not simply a string, but carries some (limited)
 | 
				
			||||||
 | 
					     * semantic information. In particular, tags are organized in what they
 | 
				
			||||||
 | 
					     * refer to, either something related to the image itself, or to the
 | 
				
			||||||
 | 
					     * artist that drew it, or the copyrights associated to the image, or even
 | 
				
			||||||
 | 
					     * the characters that are represented in it.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     **/
 | 
				
			||||||
 | 
					    enum TagType {
 | 
				
			||||||
 | 
					        General, /**< Generic tags **/
 | 
				
			||||||
 | 
					        Artist, /**< Tags related to artists **/
 | 
				
			||||||
 | 
					        Copyright, /**<Tags related to copyrights **/
 | 
				
			||||||
 | 
					        Character /**<Tags related to characters **/
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class DanbooruPost;
 | 
				
			||||||
 | 
					    class DanbooruPool;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    using KIO::StoredTransferJob;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief A class which provides a wrapper around Danbooru's RESTful API.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * This class provides access to Danbooru-based image boards
 | 
				
			||||||
 | 
					     * by making the appropriate RESTful calls to the service and then
 | 
				
			||||||
 | 
					     * retrieving and parsing the reuslts.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @author Luca Beltrame (lbeltrame@kde.org)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     **/
 | 
				
			||||||
 | 
					    class DanbooruService : public QObject
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // URL fragments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static const QString POST_URL;
 | 
				
			||||||
 | 
					        static const QString TAG_URL;
 | 
				
			||||||
 | 
					        static const QString POOL_URL;
 | 
				
			||||||
 | 
					        static const QString ARTIST_URL;
 | 
				
			||||||
 | 
					        static const QString POOL_DATA_URL;
 | 
				
			||||||
 | 
					        static const QString RELATED_TAG_URL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Ratings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static const QMap<QString, QStringList> RATINGS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // member variables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        KUrl m_url;
 | 
				
			||||||
 | 
					        QString m_username;
 | 
				
			||||||
 | 
					        QString m_password;
 | 
				
			||||||
 | 
					        QStringList m_blacklist;
 | 
				
			||||||
 | 
					        QString m_maxRating;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        unsigned int m_currentPosts; // To tell when to quit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // private functions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @internal
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        static const QMap< QString, QStringList > initRatings();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Construct a default instance of the service.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param boardUrl The URL to connect to.
 | 
				
			||||||
 | 
					         * @param username Username to use (optional)
 | 
				
			||||||
 | 
					         * @param password Password to use (optional)
 | 
				
			||||||
 | 
					         * @param parent The parent QObject
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        DanbooruService(KUrl& boardUrl, QString username = QString(),
 | 
				
			||||||
 | 
					                        QString password = QString(), QObject* parent = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Default destructor.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        ~DanbooruService();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         *@brief Get posts from a the board.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param page The page containing posts (default: 1)
 | 
				
			||||||
 | 
					         * @param tags The specific tags to query for (default: all tags)
 | 
				
			||||||
 | 
					         * @param limit The number of posts to fetch (maximum 100)
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void getPostList(int page=1, QStringList tags=QStringList(),
 | 
				
			||||||
 | 
					                         int limit=100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Get a list of pools from the board.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param page The page to get pools from (default: 1)
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void getPoolList(int page = 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Get the posts associated with a specific pool ID.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param poolId The ID of the pool to fetch posts from.
 | 
				
			||||||
 | 
					         * @param page The page of the pool posts (if > 100)
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void getPool(int poolId, int page=1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Get a list of tags from the board
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * The tagDownloaded signal is emitted every time a tag has been
 | 
				
			||||||
 | 
					         * retrieved.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param limit The number of tags to get.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void getTagList(int limit=10, QString name="");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Get tags related to a specific, user supplied list.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param tags The tags to query for related terms
 | 
				
			||||||
 | 
					         * @param tagType The type of tag to query for
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void getRelatedTags(QStringList tags=QStringList(),
 | 
				
			||||||
 | 
					                            TagType tagType=General);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return The currently allowed ratings when downloading posts.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        const QStringList allowedRatings() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return The maximum allowed rating for a post.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        const QString maximumAllowedRating() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return The currently blacklisted tags.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        QStringList blacklist() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Set the maximum allowed rating for the board.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * Posts whose rating is higher than the maximuk allowed will not be
 | 
				
			||||||
 | 
					         * downloaded.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void setMaximumAllowedRating(QString rating);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @brief Set the tag blacklist.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * If a tag is in the blacklist, posts tagged with it will not be downloaded.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void setBlackList(QStringList blacklist);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private Q_SLOTS:
 | 
				
			||||||
 | 
					        void processPostList(KJob* job);
 | 
				
			||||||
 | 
					        void processPoolList(KJob* job);
 | 
				
			||||||
 | 
					        void processRelatedTagList(KJob* job);
 | 
				
			||||||
 | 
					        void downloadThumbnail(KJob* job);
 | 
				
			||||||
 | 
					        void downloadAllTags(KJob* job);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Q_SIGNALS:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Emitted when there are no more posts to download.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * Connect to this signal to know when downloading is complete.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void postDownloadFinished();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Emitted when there are no more pools to download.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void poolDownloadFinished();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Emitted when a download error occurred.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * The parameter contains the error string.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void downloadError(QString error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Emitted when a post has been downloaded.
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * The parameter contains a pointer to the post that has been
 | 
				
			||||||
 | 
					         * downloaded.
 | 
				
			||||||
 | 
					         **/
 | 
				
			||||||
 | 
					        void postDownloaded(Danbooru::DanbooruPost* post);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void poolDownloaded(Danbooru::DanbooruPool* pool);
 | 
				
			||||||
 | 
					        // TODO: Tags and similar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif // DANBOORUSERVICE_H
 | 
				
			||||||
							
								
								
									
										105
									
								
								src/libdanbooru/utils.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								src/libdanbooru/utils.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,105 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * <one line to give the library's name and an idea of what it does.>
 | 
				
			||||||
 | 
					 * Copyright 2013  Luca Beltrame <lbeltrame@kde.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) version 3 or any later version
 | 
				
			||||||
 | 
					 * accepted by the membership of KDE e.V. (or its successor approved
 | 
				
			||||||
 | 
					 * by the membership of KDE e.V.), which shall act as a proxy
 | 
				
			||||||
 | 
					 * defined in Section 14 of version 3 of the license.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Danbooru {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    KUrl requestUrl(KUrl& url, const QString& path,
 | 
				
			||||||
 | 
					                    const QString& username, const QString& password,
 | 
				
			||||||
 | 
					                    const dictMap& parameters, const QStringList& tags)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        KUrl danbooruUrl = KUrl(url);
 | 
				
			||||||
 | 
					        danbooruUrl.addPath(path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If we have parameters, add them
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!parameters.isEmpty()) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QMap<QString, QString>::const_iterator iter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (iter = parameters.constBegin(); iter!= parameters.constEnd();
 | 
				
			||||||
 | 
					                 ++iter) {
 | 
				
			||||||
 | 
					                danbooruUrl.addQueryItem(iter.key(), iter.value());
 | 
				
			||||||
 | 
					             }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					         // Now, let's add tags should we have them
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         if (!tags.isEmpty()) {
 | 
				
			||||||
 | 
					             QByteArray encoded_tags = QUrl::toPercentEncoding(tags.join(" "));
 | 
				
			||||||
 | 
					             danbooruUrl.addEncodedQueryItem("tags", encoded_tags);
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!username.isEmpty() && !password.isEmpty()) {
 | 
				
			||||||
 | 
					            danbooruUrl.setUserName(username);
 | 
				
			||||||
 | 
					            danbooruUrl.setPassword(password);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return danbooruUrl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    KUrl requestUrl(KUrl& url, const QString& path, const QString& username,
 | 
				
			||||||
 | 
					                    const QString& password, const dictMap& parameters)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        KUrl danbooruUrl = KUrl(url);
 | 
				
			||||||
 | 
					        danbooruUrl.addPath(path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If we have parameters, add them
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!parameters.isEmpty()) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QMap<QString, QString>::const_iterator iter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (iter = parameters.constBegin(); iter!= parameters.constEnd();
 | 
				
			||||||
 | 
					                 ++iter) {
 | 
				
			||||||
 | 
					                danbooruUrl.addQueryItem(iter.key(), iter.value());
 | 
				
			||||||
 | 
					             }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!username.isEmpty() && !password.isEmpty()) {
 | 
				
			||||||
 | 
					            danbooruUrl.setUserName(username);
 | 
				
			||||||
 | 
					            danbooruUrl.setPassword(password);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return danbooruUrl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    KUrl requestUrl(KUrl& url, const QString& path, const QString& username,
 | 
				
			||||||
 | 
					                    const QString& password)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KUrl danbooruUrl = KUrl(url);
 | 
				
			||||||
 | 
					        danbooruUrl.addPath(path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!username.isEmpty() && !password.isEmpty()) {
 | 
				
			||||||
 | 
					            danbooruUrl.setUserName(username);
 | 
				
			||||||
 | 
					            danbooruUrl.setPassword(password);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return danbooruUrl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace Danbooru
 | 
				
			||||||
							
								
								
									
										104
									
								
								src/libdanbooru/utils.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								src/libdanbooru/utils.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,104 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This file is part of libdanbooru.
 | 
				
			||||||
 | 
					 * Copyright 2013  Luca Beltrame <lbeltrame@kde.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) version 3 or any later version
 | 
				
			||||||
 | 
					 * accepted by the membership of KDE e.V. (or its successor approved
 | 
				
			||||||
 | 
					 * by the membership of KDE e.V.), which shall act as a proxy
 | 
				
			||||||
 | 
					 * defined in Section 14 of version 3 of the license.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef UTILS_H
 | 
				
			||||||
 | 
					#define UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QtCore/QStringList>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <kurl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Commmon utilities for Danbooru classes.
 | 
				
			||||||
 | 
					 * @file utils.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 **/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Danbooru {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    typedef QMap<QString,QString> dictMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @brief Generate a request URL for a Danbooru board.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * Given an URL and an API path, this function builds a
 | 
				
			||||||
 | 
					     * proper URL which is used for the specific API operation.
 | 
				
			||||||
 | 
					     * The processing follows the "normal" way of encoding URLs.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param url The board URL.
 | 
				
			||||||
 | 
					     * @param path The API path of the call to use
 | 
				
			||||||
 | 
					     * @param username The username to supply (optional)
 | 
				
			||||||
 | 
					     * @param password The password to use (optional)
 | 
				
			||||||
 | 
					     * @param parameters A map of key,values representing the parameters
 | 
				
			||||||
 | 
					     *                   to use.
 | 
				
			||||||
 | 
					     * @param tags The tags to supply (optional).
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return A constructed URL to be used for a Danbooru API call.
 | 
				
			||||||
 | 
					     * @author Luca Beltrame (lbeltrame@kde.org)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     **/
 | 
				
			||||||
 | 
					    KUrl requestUrl(KUrl& url, const QString& path, const QString& username,
 | 
				
			||||||
 | 
					                    const QString& password, const dictMap& parameters,
 | 
				
			||||||
 | 
					                    const QStringList& tags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @brief Generate a request URL for a Danbooru board.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * This is an overloaded function provided for convenience.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param url The board URL.
 | 
				
			||||||
 | 
					     * @param path The API path of the call to use
 | 
				
			||||||
 | 
					     * @param username The username to supply (optional)
 | 
				
			||||||
 | 
					     * @param password The password to use (optional)
 | 
				
			||||||
 | 
					     * @param parameters A map of key,values representing the parameters
 | 
				
			||||||
 | 
					     *                   to use.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return A constructed URL to be used for a Danbooru API call.
 | 
				
			||||||
 | 
					     * @author Luca Beltrame (lbeltrame@kde.org)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     **/
 | 
				
			||||||
 | 
					    KUrl requestUrl(KUrl& url, const QString& path, const QString& username,
 | 
				
			||||||
 | 
					                    const QString& password, const dictMap& parameters);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @brief Generate a request URL for a Danbooru board.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * This is an overloaded function provided for convenience.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param url The board URL.
 | 
				
			||||||
 | 
					     * @param path The API path of the call to use
 | 
				
			||||||
 | 
					     * @param username The username to supply (optional)
 | 
				
			||||||
 | 
					     * @param password The password to use (optional)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return A constructed URL to be used for a Danbooru API call.
 | 
				
			||||||
 | 
					     * @author Luca Beltrame (lbeltrame@kde.org)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     **/
 | 
				
			||||||
 | 
					    KUrl requestUrl(KUrl& url, const QString& path, const QString& username,
 | 
				
			||||||
 | 
					                    const QString& password);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif // UTILS_H
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue