335 lines
9.9 KiB
C++
335 lines
9.9 KiB
C++
|
/****************************************************************************************
|
||
|
* Copyright (c) 2010 Leo Franchi <lfranchi@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) any later *
|
||
|
* version. *
|
||
|
* *
|
||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY *
|
||
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
|
||
|
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
|
||
|
* *
|
||
|
* You should have received a copy of the GNU General Public License along with *
|
||
|
* this program. If not, see <http://www.gnu.org/licenses/>. *
|
||
|
****************************************************************************************/
|
||
|
|
||
|
#include "Catalog.h"
|
||
|
|
||
|
#include "Catalog_p.h"
|
||
|
#include "Parsing_p.h"
|
||
|
#include "Generator_p.h"
|
||
|
#include "Track_p.h"
|
||
|
|
||
|
Echonest::Catalog::Catalog()
|
||
|
: d( new CatalogData )
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
Echonest::Catalog::Catalog( const QByteArray& id )
|
||
|
: d( new CatalogData )
|
||
|
{
|
||
|
d->id = id;
|
||
|
}
|
||
|
|
||
|
|
||
|
Echonest::Catalog::Catalog( const Echonest::Catalog& catalog )
|
||
|
: d( catalog.d )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
Echonest::Catalog& Echonest::Catalog::operator=( const Echonest::Catalog& other )
|
||
|
{
|
||
|
d = other.d;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
Echonest::Catalog::~Catalog()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
Echonest::CatalogArtists Echonest::Catalog::artists() const
|
||
|
{
|
||
|
return d->artists;
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::setArtists(const Echonest::CatalogArtists& artists)
|
||
|
{
|
||
|
d->artists = artists;
|
||
|
}
|
||
|
|
||
|
QByteArray Echonest::Catalog::id() const
|
||
|
{
|
||
|
return d->id;
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::setId(const QByteArray& id)
|
||
|
{
|
||
|
d->id = id;
|
||
|
}
|
||
|
|
||
|
QString Echonest::Catalog::name() const
|
||
|
{
|
||
|
return d->name;
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::setName(const QString& name)
|
||
|
{
|
||
|
d->name = name;
|
||
|
}
|
||
|
|
||
|
int Echonest::Catalog::resolved() const
|
||
|
{
|
||
|
return d->resolved;
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::setResolved(int resolved)
|
||
|
{
|
||
|
d->resolved = resolved;
|
||
|
}
|
||
|
|
||
|
int Echonest::Catalog::pendingTickets() const
|
||
|
{
|
||
|
// return d->pending_tickets;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::setPendingTickets(int pending)
|
||
|
{
|
||
|
// d->pending_tickets = pending;
|
||
|
}
|
||
|
|
||
|
Echonest::CatalogSongs Echonest::Catalog::songs() const
|
||
|
{
|
||
|
return d->songs;
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::setSongs(const Echonest::CatalogSongs& songs)
|
||
|
{
|
||
|
d->songs = songs;
|
||
|
}
|
||
|
|
||
|
int Echonest::Catalog::total() const
|
||
|
{
|
||
|
return d->total;
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::setTotal(int total)
|
||
|
{
|
||
|
d->total = total;
|
||
|
}
|
||
|
|
||
|
Echonest::CatalogTypes::Type Echonest::Catalog::type() const
|
||
|
{
|
||
|
return d->type;
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::setType(Echonest::CatalogTypes::Type type)
|
||
|
{
|
||
|
d->type = type;
|
||
|
}
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::create(const QString& name, Echonest::CatalogTypes::Type type)
|
||
|
{
|
||
|
QUrl url = Echonest::baseGetQuery( "catalog", "create" );
|
||
|
url.addQueryItem( QLatin1String( "name" ), name );
|
||
|
url.addEncodedQueryItem( "type", Echonest::catalogTypeToLiteral( type ) );
|
||
|
|
||
|
QNetworkRequest request = QNetworkRequest( url );
|
||
|
request.setHeader( QNetworkRequest::ContentTypeHeader, QLatin1String( "multipart/form-data" ) );
|
||
|
qDebug() << "Sending create url:" << url.toString();
|
||
|
return Echonest::Config::instance()->nam()->post( request, QByteArray() );
|
||
|
}
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::deleteCatalog() const
|
||
|
{
|
||
|
QUrl url = Echonest::baseGetQuery( "catalog", "delete" );
|
||
|
Q_ASSERT( !d->id.isEmpty() );
|
||
|
url.addEncodedQueryItem( "id", d->id );
|
||
|
|
||
|
return Echonest::doPost( url );
|
||
|
}
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::list(int results, int start)
|
||
|
{
|
||
|
QUrl url = Echonest::baseGetQuery( "catalog", "list" );
|
||
|
addLimits( url, results, start );
|
||
|
|
||
|
return Echonest::Config::instance()->nam()->get( QNetworkRequest( url ) );
|
||
|
}
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::profile() const
|
||
|
{
|
||
|
QUrl url = Echonest::baseGetQuery( "catalog", "profile" );
|
||
|
if( !d->id.isEmpty() )
|
||
|
url.addEncodedQueryItem( "id", d->id );
|
||
|
else if( !d->name.isEmpty() )
|
||
|
url.addQueryItem( QLatin1String( "name" ), d->name );
|
||
|
else
|
||
|
Q_ASSERT_X( false, "Catalog", "Not enough information!" );
|
||
|
|
||
|
return Echonest::Config::instance()->nam()->get( QNetworkRequest( url ) );
|
||
|
}
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::status(const QByteArray& ticket)
|
||
|
{
|
||
|
QUrl url = Echonest::baseGetQuery( "catalog", "status" );
|
||
|
url.addEncodedQueryItem( "ticket", ticket );
|
||
|
|
||
|
return Echonest::Config::instance()->nam()->get( QNetworkRequest( url ) );
|
||
|
}
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::update(const Echonest::CatalogUpdateEntries& entries) const
|
||
|
{
|
||
|
QUrl url = Echonest::baseGetQuery( "catalog", "update" );
|
||
|
Q_ASSERT( !d->id.isEmpty() );
|
||
|
url.addEncodedQueryItem( "id", d->id );
|
||
|
return Echonest::Catalog::updatePrivate( url, entries );
|
||
|
}
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::updateAndCreate(const Echonest::CatalogUpdateEntries& entries)
|
||
|
{
|
||
|
QUrl url = Echonest::baseGetQuery( "catalog", "update" );
|
||
|
return Echonest::Catalog::updatePrivate( url, entries );
|
||
|
}
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::readArtistCatalog(Echonest::ArtistInformation info, int results, int start) const
|
||
|
{
|
||
|
QUrl url = Echonest::baseGetQuery( "catalog", "read" );
|
||
|
Artist::addQueryInformation( url, info );
|
||
|
|
||
|
return readPrivate( url, results, start );
|
||
|
}
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::readSongCatalog(Echonest::SongInformation info, int results, int start) const
|
||
|
{
|
||
|
QUrl url = Echonest::baseGetQuery( "catalog", "read" );
|
||
|
Song::addQueryInformation( url, info );
|
||
|
|
||
|
return readPrivate( url, results, start );
|
||
|
}
|
||
|
|
||
|
QPair< QString, QByteArray > Echonest::Catalog::parseDelete( QNetworkReply* reply ) throw( Echonest::ParseError )
|
||
|
{
|
||
|
QByteArray data = reply->readAll();
|
||
|
// qDebug() << "DATA:" << data;
|
||
|
QPair< QString, QByteArray > asd;
|
||
|
Echonest::Parser::checkForErrors( reply );
|
||
|
|
||
|
QXmlStreamReader xml( data );
|
||
|
|
||
|
Echonest::Parser::readStatus( xml );
|
||
|
|
||
|
// TODO, after create works :)
|
||
|
reply->deleteLater();
|
||
|
return asd;
|
||
|
}
|
||
|
|
||
|
Echonest::Catalogs Echonest::Catalog::parseList(QNetworkReply* reply) throw( Echonest::ParseError )
|
||
|
{
|
||
|
Echonest::Parser::checkForErrors( reply );
|
||
|
QXmlStreamReader xml( reply->readAll() );
|
||
|
Echonest::Parser::readStatus( xml );
|
||
|
|
||
|
Echonest::Catalogs catalogs = Echonest::Parser::parseCatalogList( xml );
|
||
|
|
||
|
reply->deleteLater();
|
||
|
return catalogs;
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::parseProfile(QNetworkReply* reply) throw( Echonest::ParseError )
|
||
|
{
|
||
|
Echonest::Parser::checkForErrors( reply );
|
||
|
QXmlStreamReader xml( reply->readAll() );
|
||
|
Echonest::Parser::readStatus( xml );
|
||
|
|
||
|
Echonest::Catalog catalog = Echonest::Parser::parseCatalog( xml, true );
|
||
|
d = catalog.d;
|
||
|
reply->deleteLater();
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::parseRead(QNetworkReply* reply) throw( Echonest::ParseError )
|
||
|
{
|
||
|
Echonest::Parser::checkForErrors( reply );
|
||
|
QXmlStreamReader xml( reply->readAll() );
|
||
|
Echonest::Parser::readStatus( xml );
|
||
|
|
||
|
Echonest::Catalog catalog = Echonest::Parser::parseCatalog( xml, true );
|
||
|
d = catalog.d;
|
||
|
reply->deleteLater();
|
||
|
}
|
||
|
|
||
|
Echonest::CatalogStatus Echonest::Catalog::parseStatus(QNetworkReply* reply) throw( Echonest::ParseError )
|
||
|
{
|
||
|
Echonest::Parser::checkForErrors( reply );
|
||
|
QByteArray data = reply->readAll();
|
||
|
// qDebug() << data;
|
||
|
QXmlStreamReader xml( data );
|
||
|
Echonest::Parser::readStatus( xml );
|
||
|
|
||
|
Echonest::CatalogStatus status = Echonest::Parser::parseCatalogStatus( xml );
|
||
|
reply->deleteLater();
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
QByteArray Echonest::Catalog::parseTicket(QNetworkReply* reply) throw( Echonest::ParseError )
|
||
|
{
|
||
|
Echonest::Parser::checkForErrors( reply );
|
||
|
QByteArray data = reply->readAll();
|
||
|
// qDebug() << data;
|
||
|
QXmlStreamReader xml( data );
|
||
|
Echonest::Parser::readStatus( xml );
|
||
|
|
||
|
QByteArray ticket = Echonest::Parser::parseCatalogTicket( xml );
|
||
|
reply->deleteLater();
|
||
|
return ticket;
|
||
|
}
|
||
|
|
||
|
Echonest::Catalog Echonest::Catalog::parseCreate(QNetworkReply* reply) throw( Echonest::ParseError )
|
||
|
{
|
||
|
QByteArray data = reply->readAll();
|
||
|
// qDebug() << data;
|
||
|
Echonest::Parser::checkForErrors( reply );
|
||
|
QXmlStreamReader xml( data );
|
||
|
Echonest::Parser::readStatus( xml );
|
||
|
|
||
|
Catalog c = Echonest::Parser::parseNewCatalog( xml );
|
||
|
reply->deleteLater();
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::updatePrivate( QUrl& url, const Echonest::CatalogUpdateEntries& entries)
|
||
|
{
|
||
|
url.addEncodedQueryItem( "data_type", "json" );
|
||
|
|
||
|
QByteArray payload = Generator::catalogEntriesToJson( entries );
|
||
|
url.addEncodedQueryItem( "data", payload );
|
||
|
|
||
|
return Echonest::doPost( url );
|
||
|
}
|
||
|
|
||
|
void Echonest::Catalog::addLimits(QUrl& url, int results, int start)
|
||
|
{
|
||
|
if( results != 30 )
|
||
|
url.addEncodedQueryItem( "results", QString::number( results ).toLatin1() );
|
||
|
if( start > -1 )
|
||
|
url.addEncodedQueryItem( "start", QString::number( start ).toLatin1() );
|
||
|
}
|
||
|
|
||
|
QNetworkReply* Echonest::Catalog::readPrivate(QUrl& url, int results, int start) const
|
||
|
{
|
||
|
Q_ASSERT( !d->id.isEmpty() );
|
||
|
url.addEncodedQueryItem( "id", d->id );
|
||
|
addLimits( url, results, start );
|
||
|
|
||
|
return Echonest::Config::instance()->nam()->get( QNetworkRequest( url ) );
|
||
|
}
|
||
|
|
||
|
QDebug Echonest::operator<<(QDebug d, const Echonest::Catalog& catalog)
|
||
|
{
|
||
|
return d.maybeSpace() << QString::fromLatin1( "Catalog(%1, %2, %3, %4)" ).arg( catalog.name() ).arg( QLatin1String( catalog.id() ) )
|
||
|
.arg( QString::fromLatin1( Echonest::catalogTypeToLiteral( catalog.type() ) ) ).arg( catalog.total() ) << catalog.artists() << catalog.songs();
|
||
|
}
|