diff options
Diffstat (limited to 'src/qmmpui/playlistdownloader.cpp')
| -rw-r--r-- | src/qmmpui/playlistdownloader.cpp | 112 |
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(); } |
