Change Clementine to request the icecast directory from data.clementine-player.org, and to follow redirects

This commit is contained in:
David Sansome 2011-03-22 20:41:31 +00:00
parent d775ef5c4c
commit 92520a911e
2 changed files with 22 additions and 10 deletions

View File

@ -40,7 +40,7 @@ using std::unique;
#include "ui/iconloader.h" #include "ui/iconloader.h"
const char* IcecastService::kServiceName = "Icecast"; const char* IcecastService::kServiceName = "Icecast";
const char* IcecastService::kDirectoryUrl = "http://dir.xiph.org/yp.xml"; const char* IcecastService::kDirectoryUrl = "http://data.clementine-player.org/icecast-directory";
const char* IcecastService::kHomepage = "http://dir.xiph.org/"; const char* IcecastService::kHomepage = "http://dir.xiph.org/";
IcecastService::IcecastService(RadioModel* parent) IcecastService::IcecastService(RadioModel* parent)
@ -86,12 +86,7 @@ void IcecastService::LazyPopulate(QStandardItem* item) {
} }
void IcecastService::LoadDirectory() { void IcecastService::LoadDirectory() {
QNetworkRequest req = QNetworkRequest(QUrl(kDirectoryUrl)); RequestDirectory(QUrl(kDirectoryUrl));
req.setAttribute(QNetworkRequest::CacheLoadControlAttribute,
QNetworkRequest::AlwaysNetwork);
QNetworkReply* reply = network_->get(req);
connect(reply, SIGNAL(finished()), SLOT(DownloadDirectoryFinished()));
if (!load_directory_task_id_) { if (!load_directory_task_id_) {
load_directory_task_id_ = model()->task_manager()->StartTask( load_directory_task_id_ = model()->task_manager()->StartTask(
@ -99,10 +94,26 @@ void IcecastService::LoadDirectory() {
} }
} }
void IcecastService::RequestDirectory(const QUrl& url) {
QNetworkRequest req = QNetworkRequest(url);
req.setAttribute(QNetworkRequest::CacheLoadControlAttribute,
QNetworkRequest::AlwaysNetwork);
QNetworkReply* reply = network_->get(req);
connect(reply, SIGNAL(finished()), SLOT(DownloadDirectoryFinished()));
}
void IcecastService::DownloadDirectoryFinished() { void IcecastService::DownloadDirectoryFinished() {
QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender()); QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
Q_ASSERT(reply); Q_ASSERT(reply);
if (reply->attribute(QNetworkRequest::RedirectionTargetAttribute).isValid()) {
// Discard the old reply and follow the redirect
reply->deleteLater();
RequestDirectory(reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl());
return;
}
QFuture<IcecastBackend::StationList> future = QFuture<IcecastBackend::StationList> future =
QtConcurrent::run(this, &IcecastService::ParseDirectory, reply); QtConcurrent::run(this, &IcecastService::ParseDirectory, reply);
QFutureWatcher<IcecastBackend::StationList>* watcher = QFutureWatcher<IcecastBackend::StationList>* watcher =

View File

@ -60,6 +60,7 @@ protected:
void Homepage(); void Homepage();
private: private:
void RequestDirectory(const QUrl& url);
void EnsureMenuCreated(); void EnsureMenuCreated();
IcecastBackend::StationList ParseDirectory(QIODevice* device) const; IcecastBackend::StationList ParseDirectory(QIODevice* device) const;
IcecastBackend::Station ReadStation(QXmlStreamReader* reader) const; IcecastBackend::Station ReadStation(QXmlStreamReader* reader) const;