diff options
| -rw-r--r-- | src/qmmpui/addurldialog.cpp | 42 | ||||
| -rw-r--r-- | src/qmmpui/addurldialog_p.h | 1 | ||||
| -rw-r--r-- | src/qmmpui/playlistdownloader.cpp | 112 | ||||
| -rw-r--r-- | src/qmmpui/playlistdownloader.h | 4 |
4 files changed, 117 insertions, 42 deletions
diff --git a/src/qmmpui/addurldialog.cpp b/src/qmmpui/addurldialog.cpp index 1b89e5aee..c1f06b39b 100644 --- a/src/qmmpui/addurldialog.cpp +++ b/src/qmmpui/addurldialog.cpp @@ -99,27 +99,43 @@ void AddUrlDialog::accept() return; } - QString s = urlComboBox->currentText().trimmed(); + QString path = urlComboBox->currentText().trimmed(); - if(!s.startsWith("http://") && !s.contains("://")) - s.prepend("http://"); + if(QFile::exists(path)) //is local file + { + m_model->add(path); + addToHistory(path); + QDialog::accept(); + return; + } - if(!MetaDataManager::instance()->protocols().contains(QUrl(s).scheme())) + if(!path.startsWith("http://") && !path.contains("://")) + path.prepend("http://"); + + if(MetaDataManager::hasMatch(MetaDataManager::instance()->regExps(), path)) { - qWarning("AddUrlDialog: unsupported protocol"); + addToHistory(path); + m_model->add(path); QDialog::accept(); return; } - m_history.removeAll(s); - m_history.prepend(s); + if (path.startsWith("http://") || path.startsWith("https://")) //try to download playlist + { + m_downloader->start(QUrl(path), m_model); + addToHistory(path); + return; + } - if (s.startsWith("http://") || s.startsWith("https://")) //try to download playlist + if(!MetaDataManager::instance()->protocols().contains(QUrl(path).scheme())) { - m_downloader->start(QUrl(s), m_model); + qWarning("AddUrlDialog: unsupported protocol"); + QDialog::reject(); return; } - m_model->add(s); + + addToHistory(path); + m_model->add(path); QDialog::accept(); } @@ -127,3 +143,9 @@ void AddUrlDialog::setModel(PlayListModel *m) { m_model = m; } + +void AddUrlDialog::addToHistory(const QString &path) +{ + m_history.removeAll(path); + m_history.prepend(path); +} diff --git a/src/qmmpui/addurldialog_p.h b/src/qmmpui/addurldialog_p.h index 5e4d478a5..d9d4a3d78 100644 --- a/src/qmmpui/addurldialog_p.h +++ b/src/qmmpui/addurldialog_p.h @@ -48,6 +48,7 @@ private: ~AddUrlDialog(); void accept() override; void setModel(PlayListModel*); + void addToHistory(const QString &path); static QPointer<AddUrlDialog> m_instance; PlayListModel *m_model; PlayListDownloader *m_downloader; 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(); } diff --git a/src/qmmpui/playlistdownloader.h b/src/qmmpui/playlistdownloader.h index ee848b4bb..95d645d6a 100644 --- a/src/qmmpui/playlistdownloader.h +++ b/src/qmmpui/playlistdownloader.h @@ -59,12 +59,14 @@ public slots: void start(const QUrl &url, PlayListModel *model); private slots: + void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal); void readResponse(QNetworkReply *reply); private: QNetworkAccessManager *m_manager; QUrl m_redirect_url, m_url; - QNetworkReply *m_getReply; + QNetworkReply *m_downloadReply = nullptr; + QNetworkReply *m_checkReply = nullptr; QByteArray m_ua; QPointer<PlayListModel> m_model; }; |
