1
#include "jamendodynamicplaylist.h"
5
#include <QHttpRequestHeader>
8
#include "core/network.h"
9
#include "library/librarybackend.h"
10
#include "radio/jamendoplaylistitem.h"
11
#include "radio/jamendoservice.h"
13
const char* JamendoDynamicPlaylist::kUrl =
14
"http://api.jamendo.com/get2/id/track/plain/";
16
JamendoDynamicPlaylist::JamendoDynamicPlaylist()
17
: order_by_(OrderBy_Rating),
18
order_direction_(Order_Descending),
23
JamendoDynamicPlaylist::JamendoDynamicPlaylist(const QString& name, OrderBy order_by)
24
: order_by_(order_by),
25
order_direction_(Order_Descending),
31
void JamendoDynamicPlaylist::Load(const QByteArray& data) {
36
void JamendoDynamicPlaylist::Load(OrderBy order_by, OrderDirection order_direction) {
38
order_direction_ = order_direction;
41
QByteArray JamendoDynamicPlaylist::Save() const {
43
QDataStream s(&ret, QIODevice::WriteOnly);
49
PlaylistItemList JamendoDynamicPlaylist::Generate() {
50
return GenerateMore(20);
53
PlaylistItemList JamendoDynamicPlaylist::GenerateMore(int count) {
56
PlaylistItemList items;
57
while (items.size() < count && tries++ < kApiRetryLimit) {
58
// Add items from current list.
59
if (current_index_ < current_items_.size()) {
60
PlaylistItemList more_items = current_items_.mid(current_index_, count);
62
current_index_ += more_items.size();
64
// We need more songs!
72
QString JamendoDynamicPlaylist::OrderSpec(OrderBy by, OrderDirection dir) {
75
case OrderBy_Listened: ret += "listened"; break;
76
case OrderBy_Rating: ret += "rating"; break;
77
case OrderBy_RatingMonth: ret += "ratingmonth"; break;
78
case OrderBy_RatingWeek: ret += "ratingweek"; break;
81
case Order_Ascending: ret += "_asc"; break;
82
case Order_Descending: ret += "_desc"; break;
87
void JamendoDynamicPlaylist::Fetch() {
89
url.addQueryItem("pn", QString::number(current_page_++));
90
url.addQueryItem("n", QString::number(kPageSize));
91
url.addQueryItem("order", OrderSpec(order_by_, order_direction_));
93
// We have to use QHttp here because there's no way to disable Keep-Alive
94
// with QNetworkManager.
95
QHttpRequestHeader header("GET", url.encodedPath() + "?" + url.encodedQuery());
96
header.setValue("Host", url.encodedHost());
98
QHttp http(url.host());
101
// Wait for the reply
103
QEventLoop event_loop;
104
connect(&http, SIGNAL(requestFinished(int,bool)), &event_loop, SLOT(quit()));
108
if (http.error() != QHttp::NoError) {
109
qWarning() << "HTTP error returned from Jamendo:" << http.errorString()
110
<< ", url:" << url.toString();
114
// The reply will contain one track ID per line
115
QStringList lines = QString::fromAscii(http.readAll()).split('\n');
117
// Get the songs from the database
118
SongList songs = backend_->GetSongsByForeignId(
119
lines, JamendoService::kTrackIdsTable, JamendoService::kTrackIdsColumn);
122
qWarning() << "No songs returned from Jamendo:"
127
current_items_.clear();
128
foreach (const Song& song, songs) {
130
current_items_ << PlaylistItemPtr(new JamendoPlaylistItem(song));
135
QDataStream& operator <<(QDataStream& s, const JamendoDynamicPlaylist& p) {
136
s << quint8(p.order_by_) << quint8(p.order_direction_);
140
QDataStream& operator >>(QDataStream& s, JamendoDynamicPlaylist& p) {
141
quint8 order_by, order_direction;
142
s >> order_by >> order_direction;
143
p.order_by_ = JamendoDynamicPlaylist::OrderBy(order_by);
144
p.order_direction_ = JamendoDynamicPlaylist::OrderDirection(order_direction);