/* This file is part of Clementine. Clementine 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 3 of the License, or (at your option) any later version. Clementine 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 Clementine. If not, see . */ #include "magnatuneservice.h" #include "song.h" #include #include #include #include #include #include const char* MagnatuneService::kServiceName = "Magnatune"; const char* MagnatuneService::kDatabaseUrl = "http://magnatune.com/info/song_info2_xml.gz"; MagnatuneService::MagnatuneService(QObject* parent) : RadioService(kServiceName, parent), root_(NULL), network_(new QNetworkAccessManager(this)) { } RadioItem* MagnatuneService::CreateRootItem(RadioItem *parent) { root_ = new RadioItem(this, RadioItem::Type_Service, kServiceName, parent); root_->icon = QIcon(":magnatune.png"); return root_; } void MagnatuneService::LazyPopulate(RadioItem *item) { switch (item->type) { case RadioItem::Type_Service: ReloadDatabase(); break; default: break; } item->lazy_loaded = true; } void MagnatuneService::StartLoading(const QUrl& url) { emit StreamReady(url, url); } void MagnatuneService::ReloadDatabase() { QNetworkRequest request = QNetworkRequest(QUrl(kDatabaseUrl)); request.setRawHeader("User-Agent", QString("%1 %2").arg( QCoreApplication::applicationName(), QCoreApplication::applicationVersion()).toUtf8()); QNetworkReply* reply = network_->get(request); connect(reply, SIGNAL(finished()), SLOT(ReloadDatabaseFinished())); emit TaskStarted(MultiLoadingIndicator::LoadingMagnatune); } void MagnatuneService::ReloadDatabaseFinished() { QNetworkReply* reply = qobject_cast(sender()); emit TaskFinished(MultiLoadingIndicator::LoadingMagnatune); root_->lazy_loaded = true; if (reply->error() != QNetworkReply::NoError) { // TODO: Error handling qDebug() << reply->errorString(); return; } root_->ClearNotify(); QtIOCompressor gzip(reply); gzip.setStreamFormat(QtIOCompressor::GzipFormat); if (!gzip.open(QIODevice::ReadOnly)) { qWarning() << "Error opening gzip stream"; return; } QXmlStreamReader reader(&gzip); while (!reader.atEnd()) { reader.readNext(); if (reader.tokenType() == QXmlStreamReader::StartElement && reader.name() == "Track") { ReadTrack(reader); } } } void MagnatuneService::ReadTrack(QXmlStreamReader& reader) { QXmlStreamAttributes attributes = reader.attributes(); Song song; song.Init(attributes.value("title").toString(), attributes.value("artist").toString(), attributes.value("album").toString(), attributes.value("seconds").toString().toInt()); song.set_track(attributes.value("track").toString().toInt()); song.set_year(attributes.value("year").toString().toInt()); song.set_filename(attributes.value("url").toString()); qDebug() << song.artist() << song.album() << song.title(); }