aboutsummaryrefslogtreecommitdiff
path: root/src/qmmpui
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2020-04-12 18:47:00 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2020-04-12 18:47:00 +0000
commitb79ef45402ab19327268233e450a12d76305bc69 (patch)
tree08c5fa7340daa74395dc8498e74d70a6bd3dd11a /src/qmmpui
parent8f2d09296e54f464cbb97e9eec572f3c1fb28e36 (diff)
downloadqmmp-b79ef45402ab19327268233e450a12d76305bc69.tar.gz
qmmp-b79ef45402ab19327268233e450a12d76305bc69.tar.bz2
qmmp-b79ef45402ab19327268233e450a12d76305bc69.zip
improved remote playlists support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9334 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/qmmpui')
-rw-r--r--src/qmmpui/addurldialog.cpp42
-rw-r--r--src/qmmpui/addurldialog_p.h1
-rw-r--r--src/qmmpui/playlistdownloader.cpp112
-rw-r--r--src/qmmpui/playlistdownloader.h4
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;
};