aboutsummaryrefslogtreecommitdiff
path: root/src/qmmpui/playlistdownloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmmpui/playlistdownloader.cpp')
-rw-r--r--src/qmmpui/playlistdownloader.cpp112
1 files changed, 81 insertions, 31 deletions
diff --git a/src/qmmpui/playlistdownloader.cpp b/src/qmmpui/playlistdownloader.cpp
index 01dbcbcb3..cc71eebd3 100644
--- a/src/qmmpui/playlistdownloader.cpp
+++ b/src/qmmpui/playlistdownloader.cpp
@@ -28,7 +28,6 @@
PlayListDownloader::PlayListDownloader(QObject *parent) : QObject(parent)
{
- m_getReply = nullptr;
m_ua = QString("qmmp/%1").arg(Qmmp::strVersion()).toLatin1();
m_manager = new QNetworkAccessManager(this);
connect(m_manager, SIGNAL(finished (QNetworkReply *)), SLOT(readResponse(QNetworkReply *)));
@@ -51,63 +50,108 @@ PlayListDownloader::PlayListDownloader(QObject *parent) : QObject(parent)
void PlayListDownloader::start(const QUrl &url, PlayListModel *model)
{
m_model = model;
- if(!PlayListParser::findByUrl(url)) //is it playlist?
- {
- m_model->add(url.toString());
- emit finished(true);
- return;
- }
m_url = url;
+ m_redirect_url.clear();
+
QNetworkRequest r;
r.setUrl(url);
r.setRawHeader("User-Agent", m_ua);
- m_getReply = m_manager->get(r);
- m_redirect_url.clear();
+
+ if(PlayListParser::findByUrl(url)) //is it playlist?
+ {
+ m_downloadReply = m_manager->get(r); //download playlist
+ }
+ else
+ {
+ m_checkReply = m_manager->get(r); //check playlist
+ connect(m_checkReply, SIGNAL(downloadProgress(qint64, qint64)), SLOT(onDownloadProgress(qint64, qint64)));
+ }
}
-void PlayListDownloader::readResponse(QNetworkReply *reply)
+void PlayListDownloader::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
- if(reply != m_getReply)
+ Q_UNUSED(bytesTotal);
+ if(bytesReceived > 20480) //20ะบ - maximum playlist size
{
- reply->deleteLater();
- return;
+ QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
+ if(reply)
+ reply->abort();
}
- if(reply->error() != QNetworkReply::NoError)
+}
+
+void PlayListDownloader::readResponse(QNetworkReply *reply)
+{
+ if(!m_model)
{
- emit finished(false, reply->errorString() + " (" + reply->error() + ")");
reply->deleteLater();
return;
}
- QUrl url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
- if(!url.isEmpty() && url != m_redirect_url)
+ if(reply == m_downloadReply)
{
- m_redirect_url = url;
- qDebug("PlayListDownloader: redirect to %s", qPrintable(url.toString()));
- QNetworkRequest request(url);
- request.setRawHeader("User-Agent", m_ua);
- if(reply == m_getReply)
- m_getReply = m_manager->get(request);
+ m_downloadReply = nullptr;
+
+ if(reply->error() != QNetworkReply::NoError)
+ {
+ emit finished(false, reply->errorString() + " (" + reply->error() + ")");
+ reply->deleteLater();
+ return;
+ }
+
+ QUrl url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
+ if(!url.isEmpty() && m_url != url)
+ {
+ reply->deleteLater();
+ qDebug("PlayListDownloader: redirect to %s", qPrintable(url.toString()));
+ start(url, m_model);
+ return;
+ }
+
+ QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
+ qDebug("PlayListDownloader: content type: %s", qPrintable(contentType));
+ PlayListFormat *fmt = PlayListParser::findByMime(contentType);
+ if(!fmt)
+ fmt = PlayListParser::findByUrl(m_url);
+
+ if(fmt)
+ {
+ m_model->loadPlaylist(fmt->properties().shortName, reply->readAll());
+ emit finished(true);
+ }
+ else
+ {
+ emit finished(false, tr("Unsupported playlist format"));
+ }
+
reply->deleteLater();
- return;
}
- m_redirect_url.clear();
-
- if(reply == m_getReply)
+ else if(reply == m_checkReply)
{
- m_getReply = nullptr;
+ m_checkReply = nullptr;
- if(m_model.isNull())
+ if(reply->error() != QNetworkReply::NoError) //playlist is not available, simply add URL
{
+ m_model->add(m_url.toString());
+ reply->deleteLater();
emit finished(true);
return;
}
+ QUrl url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
+ if(!url.isEmpty() && m_url != url)
+ {
+ reply->deleteLater();
+ qDebug("PlayListDownloader: redirect to %s", qPrintable(url.toString()));
+ start(url, m_model);
+ return;
+ }
+
QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
qDebug("PlayListDownloader: content type: %s", qPrintable(contentType));
PlayListFormat *fmt = PlayListParser::findByMime(contentType);
if(!fmt)
fmt = PlayListParser::findByUrl(m_url);
+
if(fmt)
{
m_model->loadPlaylist(fmt->properties().shortName, reply->readAll());
@@ -115,8 +159,14 @@ void PlayListDownloader::readResponse(QNetworkReply *reply)
}
else
{
- emit finished(false, tr("Unsupported playlist format"));
+ m_model->add(m_url.toString());
+ emit finished(true);
}
+
+ reply->deleteLater();
+ }
+ else //unknown request
+ {
+ reply->deleteLater();
}
- reply->deleteLater();
}