Clementine-audio-player-Mac.../src/internet/digitally/digitallyimportedurlhandler...

107 lines
3.5 KiB
C++

/* This file is part of Clementine.
Copyright 2011-2012, David Sansome <me@davidsansome.com>
Copyright 2012, Arnaud Bienner <arnaud.bienner@gmail.com>
Copyright 2012, 2014, John Maguire <john.maguire@gmail.com>
Copyright 2014, Krzysztof Sobiecki <sobkas@gmail.com>
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 <http://www.gnu.org/licenses/>.
*/
#include "digitallyimportedurlhandler.h"
#include "core/application.h"
#include "core/logging.h"
#include "core/taskmanager.h"
#include "digitallyimportedservicebase.h"
#include "internet/core/internetmodel.h"
#include "playlistparsers/playlistparser.h"
#include "ui/iconloader.h"
DigitallyImportedUrlHandler::DigitallyImportedUrlHandler(
Application* app, DigitallyImportedServiceBase* service)
: UrlHandler(service), app_(app), service_(service), task_id_(-1) {}
QString DigitallyImportedUrlHandler::scheme() const {
return service_->api_service_name();
}
QIcon DigitallyImportedUrlHandler::icon() const {
if (scheme() == "di") {
return IconLoader::Load("digitallyimported", IconLoader::Provider);
} else if (scheme() == "radiotunes") {
return IconLoader::Load("radiotunes", IconLoader::Provider);
} else if (scheme() == "jazzradio") {
return IconLoader::Load("jazzradio", IconLoader::Provider);
} else if (scheme() == "rockradio") {
return IconLoader::Load("rockradio", IconLoader::Provider);
}
return QIcon();
}
UrlHandler::LoadResult DigitallyImportedUrlHandler::StartLoading(
const QUrl& url) {
if (task_id_ != -1) {
// Already loading.
return LoadResult(url, LoadResult::NoMoreTracks);
}
if (!service_->is_premium_account()) {
emit service_->StreamError(tr("A premium account is required"));
return LoadResult(url, LoadResult::Error);
}
// Start loading the station
const QString key = url.host();
qLog(Info) << "Loading station" << key;
service_->LoadStation(key);
// Save the URL so we can emit it in the finished signal later
last_original_url_ = url;
// Tell the user what's happening
task_id_ = app_->task_manager()->StartTask(tr("Loading stream"));
return LoadResult(url, LoadResult::WillLoadAsynchronously);
}
void DigitallyImportedUrlHandler::LoadPlaylistFinished(QIODevice* device) {
if (task_id_ == -1) {
return;
}
// Stop the spinner in the status bar
CancelTask();
// Try to parse the playlist
PlaylistParser parser(nullptr);
QList<Song> songs = parser.LoadFromDevice(device);
qLog(Info) << "Loading station finished, got" << songs.count() << "songs";
// Failed to get playlist?
if (songs.count() == 0) {
emit service_->StreamError(tr("Error loading di.fm playlist"));
emit AsyncLoadComplete(LoadResult(last_original_url_, LoadResult::Error));
return;
}
emit AsyncLoadComplete(LoadResult(
last_original_url_, LoadResult::TrackAvailable, songs[0].url()));
}
void DigitallyImportedUrlHandler::CancelTask() {
app_->task_manager()->SetTaskFinished(task_id_);
task_id_ = -1;
}