~sebastien-amardeilh/yarock/trunk

« back to all changes in this revision

Viewing changes to src3party/libechonest/Playlist.cpp

  • Committer: sebastien-amardeilh
  • Date: 2014-03-02 08:23:30 UTC
  • Revision ID: sebastien-amardeilh@gmail.com-20140302082330-71utrfssybo3gx11
remove Echonest library

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/****************************************************************************************
2
 
 * Copyright (c) 2010 Leo Franchi <lfranchi@kde.org>                                    *
3
 
 *                                                                                      *
4
 
 * This program is free software; you can redistribute it and/or modify it under        *
5
 
 * the terms of the GNU General Public License as published by the Free Software        *
6
 
 * Foundation; either version 2 of the License, or (at your option) any later           *
7
 
 * version.                                                                             *
8
 
 *                                                                                      *
9
 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY      *
10
 
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A      *
11
 
 * PARTICULAR PURPOSE. See the GNU General Public License for more details.             *
12
 
 *                                                                                      *
13
 
 * You should have received a copy of the GNU General Public License along with         *
14
 
 * this program.  If not, see <http://www.gnu.org/licenses/>.                           *
15
 
 ****************************************************************************************/
16
 
 
17
 
#include "Playlist.h"
18
 
#include "Playlist_p.h"
19
 
#include "Parsing_p.h"
20
 
#include <QtNetwork/QNetworkReply>
21
 
 
22
 
Echonest::DynamicPlaylist::DynamicPlaylist()
23
 
    : d( new DynamicPlaylistData )
24
 
{
25
 
 
26
 
}
27
 
 
28
 
Echonest::DynamicPlaylist::DynamicPlaylist(const Echonest::DynamicPlaylist& other)
29
 
    : d( other.d )
30
 
{
31
 
 
32
 
}
33
 
 
34
 
Echonest::DynamicPlaylist::~DynamicPlaylist()
35
 
{
36
 
 
37
 
}
38
 
 
39
 
 
40
 
Echonest::DynamicPlaylist& Echonest::DynamicPlaylist::operator=(const Echonest::DynamicPlaylist& playlist)
41
 
{
42
 
    d = playlist.d;
43
 
    return *this;
44
 
}
45
 
 
46
 
QNetworkReply* Echonest::DynamicPlaylist::start(const Echonest::DynamicPlaylist::PlaylistParams& params) const
47
 
{
48
 
    // params are the same, if user passes in format parsing will throw, but it should be expected..
49
 
    return generateInternal( params, "dynamic" );
50
 
}
51
 
 
52
 
Echonest::Song Echonest::DynamicPlaylist::parseStart(QNetworkReply* reply) throw( Echonest::ParseError )
53
 
{
54
 
    Echonest::Parser::checkForErrors( reply );
55
 
    QByteArray data = reply->readAll();
56
 
//     qDebug() << data;
57
 
    QXmlStreamReader xml( data );
58
 
 
59
 
    Echonest::Parser::readStatus( xml );
60
 
    d->sessionId = Echonest::Parser::parsePlaylistSessionId( xml );
61
 
    Echonest::SongList songs = Echonest::Parser::parseSongList( xml );
62
 
    if( !songs.size() == 1 )
63
 
        throw Echonest::ParseError( UnknownParseError );
64
 
 
65
 
    d->currentSong = songs.front();
66
 
 
67
 
    reply->deleteLater();
68
 
    return d->currentSong;
69
 
}
70
 
 
71
 
QByteArray Echonest::DynamicPlaylist::sessionId() const
72
 
{
73
 
    return d->sessionId;
74
 
}
75
 
 
76
 
void Echonest::DynamicPlaylist::setSessionId(const QByteArray& id)
77
 
{
78
 
    d->sessionId = id;
79
 
}
80
 
 
81
 
Echonest::Song Echonest::DynamicPlaylist::currentSong() const
82
 
{
83
 
    return d->currentSong;
84
 
}
85
 
 
86
 
void Echonest::DynamicPlaylist::setCurrentSong(const Echonest::Song& song)
87
 
{
88
 
    d->currentSong = song;
89
 
}
90
 
 
91
 
QNetworkReply* Echonest::DynamicPlaylist::fetchNextSong(int rating) const
92
 
{
93
 
    QUrl url = Echonest::baseGetQuery( "playlist", "dynamic" );
94
 
    url.addEncodedQueryItem( "session_id", d->sessionId );
95
 
 
96
 
    if( rating > 0 )
97
 
        url.addEncodedQueryItem( "rating", QByteArray::number( rating ) );
98
 
 
99
 
    return Echonest::Config::instance()->nam()->get( QNetworkRequest( url ) );
100
 
 
101
 
}
102
 
 
103
 
QNetworkReply* Echonest::DynamicPlaylist::fetchNextSong(const DynamicControls& controls) const
104
 
{
105
 
    QUrl url = Echonest::baseGetQuery( "playlist", "dynamic" );
106
 
    url.addEncodedQueryItem( "session_id", d->sessionId );
107
 
 
108
 
    DynamicControls::const_iterator iter = controls.begin();
109
 
    for( ; iter != controls.end(); ++iter ) {
110
 
        QString value = iter->second;
111
 
        url.addEncodedQueryItem( dynamicControlToString( iter->first ), Echonest::escapeSpacesAndPluses( value ) );
112
 
    }
113
 
 
114
 
    return Echonest::Config::instance()->nam()->get( QNetworkRequest( url ) );
115
 
}
116
 
 
117
 
QNetworkReply* Echonest::DynamicPlaylist::fetchSessionInfo() const
118
 
{
119
 
    QUrl url = Echonest::baseGetQuery( "playlist", "session_info" );
120
 
    url.addEncodedQueryItem( "session_id", d->sessionId );
121
 
 
122
 
    return Echonest::Config::instance()->nam()->get( QNetworkRequest( url ) );
123
 
}
124
 
 
125
 
 
126
 
Echonest::Song Echonest::DynamicPlaylist::parseNextSong(QNetworkReply* reply)
127
 
{
128
 
    return parseStart( reply );
129
 
}
130
 
 
131
 
Echonest::SessionInfo Echonest::DynamicPlaylist::parseSessionInfo(QNetworkReply* reply) throw( Echonest::ParseError )
132
 
{
133
 
    Echonest::Parser::checkForErrors( reply );
134
 
 
135
 
    QXmlStreamReader xml( reply->readAll() );
136
 
 
137
 
    Echonest::Parser::readStatus( xml );
138
 
 
139
 
    reply->deleteLater();
140
 
    return Echonest::Parser::parseSessionInfo( xml );
141
 
 
142
 
}
143
 
 
144
 
 
145
 
QNetworkReply* Echonest::DynamicPlaylist::staticPlaylist(const Echonest::DynamicPlaylist::PlaylistParams& params)
146
 
{
147
 
    return Echonest::DynamicPlaylist::generateInternal( params, "static" );
148
 
}
149
 
 
150
 
Echonest::SongList Echonest::DynamicPlaylist::parseStaticPlaylist(QNetworkReply* reply) throw( Echonest::ParseError )
151
 
{
152
 
    Echonest::Parser::checkForErrors( reply );
153
 
 
154
 
    QXmlStreamReader xml( reply->readAll() );
155
 
 
156
 
    Echonest::Parser::readStatus( xml );
157
 
 
158
 
    Echonest::SongList songs = Echonest::Parser::parseSongList( xml );
159
 
    reply->deleteLater();
160
 
    return songs;
161
 
}
162
 
 
163
 
QByteArray Echonest::DynamicPlaylist::parseXSPFPlaylist(QNetworkReply* reply) throw( Echonest::ParseError )
164
 
{
165
 
    QByteArray data = reply->readAll();
166
 
    Echonest::Parser::checkForErrors( reply );
167
 
 
168
 
    reply->deleteLater();
169
 
    return data;
170
 
}
171
 
 
172
 
QNetworkReply* Echonest::DynamicPlaylist::generateInternal(const Echonest::DynamicPlaylist::PlaylistParams& params, const QByteArray& type)
173
 
{
174
 
    QUrl url = Echonest::baseGetQuery( "playlist", type );
175
 
 
176
 
    Echonest::DynamicPlaylist::PlaylistParams::const_iterator iter = params.constBegin();
177
 
    for( ; iter < params.constEnd(); ++iter ) {
178
 
        if( iter->first == Format ) // If it's a format, we have to remove the xml format we automatically specify
179
 
            url.removeEncodedQueryItem( "format" );
180
 
 
181
 
        if( iter->first == Type ) { // convert type enum to string
182
 
            switch( static_cast<Echonest::DynamicPlaylist::ArtistTypeEnum>( iter->second.toInt() ) )
183
 
            {
184
 
            case ArtistType:
185
 
                url.addEncodedQueryItem(  playlistParamToString( iter->first ), "artist" );
186
 
                break;
187
 
            case ArtistRadioType:
188
 
                url.addEncodedQueryItem(  playlistParamToString( iter->first ), "artist-radio" );
189
 
                break;
190
 
            case ArtistDescriptionType:
191
 
                url.addEncodedQueryItem(  playlistParamToString( iter->first ), "artist-description" );
192
 
                break;
193
 
            case CatalogType:
194
 
                url.addEncodedQueryItem(  playlistParamToString( iter->first ), "catalog" );
195
 
                break;
196
 
            case CatalogRadioType:
197
 
                url.addEncodedQueryItem(  playlistParamToString( iter->first ), "catalog-radio" );
198
 
                break;
199
 
            case SongRadioType:
200
 
                url.addEncodedQueryItem(  playlistParamToString( iter->first ), "song-radio" );
201
 
                break;
202
 
            }
203
 
 
204
 
        } else if( iter->first == Sort ) {
205
 
            url.addEncodedQueryItem( playlistParamToString( iter->first ), playlistSortToString( static_cast<Echonest::DynamicPlaylist::SortingType>( iter->second.toInt() ) ) );
206
 
        } else if( iter->first == Pick ) {
207
 
            url.addEncodedQueryItem( playlistParamToString( iter->first ), playlistArtistPickToString( static_cast<Echonest::DynamicPlaylist::ArtistPick>( iter->second.toInt() ) ) );
208
 
        } else if( iter->first == SongInformation ){
209
 
            Echonest::Song::addQueryInformation( url, Echonest::SongInformation( iter->second.value< Echonest::SongInformation >() ) );
210
 
        } else {
211
 
            url.addEncodedQueryItem( playlistParamToString( iter->first ), Echonest::escapeSpacesAndPluses( iter->second.toString() ) );
212
 
        }
213
 
    }
214
 
 
215
 
    qDebug() << "Creating playlist URL" << url;
216
 
    return Echonest::Config::instance()->nam()->get( QNetworkRequest( url ) );
217
 
}
218
 
 
219
 
 
220
 
QByteArray Echonest::DynamicPlaylist::playlistParamToString(Echonest::DynamicPlaylist::PlaylistParam param)
221
 
{
222
 
    switch( param )
223
 
    {
224
 
        case Echonest::DynamicPlaylist::Type :
225
 
            return "type";
226
 
        case Echonest::DynamicPlaylist::Format :
227
 
            return "format";
228
 
        case Echonest::DynamicPlaylist::Pick:
229
 
            return "artist_pick";
230
 
        case Echonest::DynamicPlaylist::Variety :
231
 
            return "variety";
232
 
        case Echonest::DynamicPlaylist::ArtistId :
233
 
            return "artist_id";
234
 
        case Echonest::DynamicPlaylist::Artist :
235
 
            return "artist";
236
 
        case Echonest::DynamicPlaylist::ArtistSeedCatalog :
237
 
            return "artist_seed_catalog";
238
 
        case Echonest::DynamicPlaylist::SourceCatalog :
239
 
            return "seed_catalog";
240
 
        case Echonest::DynamicPlaylist::SongId :
241
 
            return "song_id";
242
 
        case Echonest::DynamicPlaylist::Description :
243
 
            return "description";
244
 
        case Echonest::DynamicPlaylist::Results :
245
 
            return "results";
246
 
        case Echonest::DynamicPlaylist::MaxTempo :
247
 
            return "max_tempo";
248
 
        case Echonest::DynamicPlaylist::MinTempo :
249
 
            return "min_tempo";
250
 
        case Echonest::DynamicPlaylist::MaxDuration :
251
 
            return "max_duration";
252
 
        case Echonest::DynamicPlaylist::MinDuration :
253
 
            return "min_duration";
254
 
        case Echonest::DynamicPlaylist::MaxLoudness :
255
 
            return "max_loudness";
256
 
        case Echonest::DynamicPlaylist::MinLoudness :
257
 
            return "min_loudness";
258
 
        case Echonest::DynamicPlaylist::ArtistMaxFamiliarity :
259
 
            return "artist_max_familiarity";
260
 
        case Echonest::DynamicPlaylist::ArtistMinFamiliarity :
261
 
            return "artist_min_familiarity";
262
 
        case Echonest::DynamicPlaylist::MinDanceability :
263
 
            return "min_danceability";
264
 
        case Echonest::DynamicPlaylist::MaxDanceability :
265
 
            return "max_danceability";
266
 
        case Echonest::DynamicPlaylist::MinEnergy :
267
 
            return "min_energy";
268
 
        case Echonest::DynamicPlaylist::MaxEnergy :
269
 
            return "max_energy";
270
 
        case Echonest::DynamicPlaylist::ArtistMaxHotttnesss :
271
 
            return "artist_max_hotttnesss";
272
 
        case Echonest::DynamicPlaylist::ArtistMinHotttnesss :
273
 
            return "artist_min_hotttnesss";
274
 
        case Echonest::DynamicPlaylist::SongMaxHotttnesss :
275
 
            return "song_max_hotttnesss";
276
 
        case Echonest::DynamicPlaylist::SongMinHotttnesss :
277
 
            return "song_min_hotttnesss";
278
 
        case Echonest::DynamicPlaylist::ArtistMinLongitude :
279
 
            return "min_longitude";
280
 
        case Echonest::DynamicPlaylist::ArtistMaxLongitude :
281
 
            return "max_longitude";
282
 
        case Echonest::DynamicPlaylist::ArtistMinLatitude  :
283
 
            return "min_latitude";
284
 
        case Echonest::DynamicPlaylist::ArtistMaxLatitude :
285
 
            return "max_latitude";
286
 
        case Echonest::DynamicPlaylist::Mode :
287
 
            return "mode";
288
 
        case Echonest::DynamicPlaylist::Key :
289
 
            return "key";
290
 
        case Echonest::DynamicPlaylist::SongInformation:
291
 
            return "bucket";
292
 
        case Echonest::DynamicPlaylist::Sort :
293
 
            return "sort";
294
 
        case Echonest::DynamicPlaylist::Limit :
295
 
            return "limit";
296
 
        case Echonest::DynamicPlaylist::Audio :
297
 
            return "audio";
298
 
        case Echonest::DynamicPlaylist::DMCA :
299
 
            return "dmca";
300
 
        case Echonest::DynamicPlaylist::ChainXSPF :
301
 
            return "chain_xspf";
302
 
        case Echonest::DynamicPlaylist::Mood :
303
 
            return "mood";
304
 
        case Echonest::DynamicPlaylist::Style :
305
 
            return "style";
306
 
        case Echonest::DynamicPlaylist::Adventurousness :
307
 
            return "adventurousness";
308
 
    }
309
 
    return QByteArray();
310
 
}
311
 
 
312
 
QByteArray Echonest::DynamicPlaylist::playlistArtistPickToString(Echonest::DynamicPlaylist::ArtistPick pick)
313
 
{
314
 
    switch( pick )
315
 
    {
316
 
        case PickSongHotttnesssAscending:
317
 
            return "song_hotttnesss-asc";
318
 
        case PickTempoAscending:
319
 
            return "tempo-asc";
320
 
        case PickDurationAscending:
321
 
            return "duration-asc";
322
 
        case PickLoudnessAscending:
323
 
            return "loudness-asc";
324
 
        case PickModeAscending:
325
 
            return "mode-asc";
326
 
        case PickKeyAscending:
327
 
            return "key-asc";
328
 
        case PickSongHotttnesssDescending:
329
 
            return "song_hotttnesss-desc";
330
 
        case PickTempoDescending:
331
 
            return "tempo-desc";
332
 
        case PickDurationDescending:
333
 
            return "duration-desc";
334
 
        case PickLoudnessDescending:
335
 
            return "loudness-desc";
336
 
        case PickModeDescending:
337
 
            return "mode-desc";
338
 
        case PickKeyDescending:
339
 
            return "key-desc";
340
 
    }
341
 
    return QByteArray();
342
 
}
343
 
 
344
 
QByteArray Echonest::DynamicPlaylist::playlistSortToString(Echonest::DynamicPlaylist::SortingType sorting)
345
 
{
346
 
    switch( sorting )
347
 
    {
348
 
        case SortTempoAscending:
349
 
            return "tempo-asc";
350
 
        case SortTempoDescending:
351
 
            return "tempo-desc";
352
 
        case SortDurationAscending:
353
 
            return "duration-asc";
354
 
        case SortDurationDescending:
355
 
            return "duration-desc";
356
 
        case SortLoudnessAscending:
357
 
            return "loudness-asc";
358
 
        case SortLoudnessDescending:
359
 
            return "loudness-desc";
360
 
        case SortArtistFamiliarityAscending:
361
 
            return "artist_familiarity-asc";
362
 
        case SortArtistFamiliarityDescending:
363
 
            return "artist_familiarity-desc";
364
 
        case SortArtistHotttnessAscending:
365
 
            return "artist_hotttnesss-asc";
366
 
        case SortArtistHotttnessDescending:
367
 
            return "artist_hotttnesss-desc";
368
 
        case SortSongHotttnesssAscending:
369
 
            return "song_hotttnesss-asc";
370
 
        case SortSongHotttnesssDescending:
371
 
            return "song_hotttnesss-desc";
372
 
        case SortLatitudeAscending:
373
 
            return "latitude-asc";
374
 
        case SortLatitudeDescending:
375
 
            return "latitude-desc";
376
 
        case SortLongitudeAscending:
377
 
            return "longitude-asc";
378
 
        case SortLongitudeDescending:
379
 
            return "longitude-desc";
380
 
        case SortModeAscending:
381
 
            return "mode-asc";
382
 
        case SortModeDescending:
383
 
            return "mode-desc";
384
 
        case SortKeyAscending:
385
 
            return "key-asc";
386
 
        case SortKeyDescending:
387
 
            return "key-desc";
388
 
        case SortEnergyAscending:
389
 
            return "energy-asc";
390
 
        case SortEnergyDescending:
391
 
            return "energy-desc";
392
 
        case SortDanceabilityAscending:
393
 
            return "danceability-asc";
394
 
        case SortDanceabilityDescending:
395
 
            return "danceability-desc";
396
 
    }
397
 
    return QByteArray();
398
 
}
399
 
 
400
 
QByteArray Echonest::DynamicPlaylist::dynamicControlToString(Echonest::DynamicPlaylist::DynamicControlItem control)
401
 
{
402
 
    switch( control )
403
 
    {
404
 
        case Steer:
405
 
            return "steer";
406
 
        case SteerDescription:
407
 
            return "steer_description";
408
 
        case Rating:
409
 
            return "rating";
410
 
        case Ban:
411
 
            return "ban";
412
 
        default:
413
 
            return "";
414
 
    }
415
 
}
416
 
 
417
 
 
418
 
QDebug Echonest::operator<<(QDebug d, const Echonest::DynamicPlaylist& playlist)
419
 
{
420
 
    d << QString::fromLatin1( "DynamicPlaylist(%1, %2)" ).arg( QLatin1String( playlist.sessionId() ), playlist.currentSong().toString() );
421
 
    return d.maybeSpace();
422
 
}