aboutsummaryrefslogtreecommitdiff
path: root/src/qmmpui
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-06-14 20:24:58 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-06-14 20:24:58 +0000
commitb2576ddc181d3758e3a57d9cac871ee7d7e2ef06 (patch)
tree1dfd6331a91f153d4a693a0aa32a774e2e53e2ea /src/qmmpui
parent9e3bcc8653f5e0500e9d0e4ee0c953e8bbf4ea4c (diff)
downloadqmmp-b2576ddc181d3758e3a57d9cac871ee7d7e2ef06.tar.gz
qmmp-b2576ddc181d3758e3a57d9cac871ee7d7e2ef06.tar.bz2
qmmp-b2576ddc181d3758e3a57d9cac871ee7d7e2ef06.zip
improved playlist formats support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7237 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/qmmpui')
-rw-r--r--src/qmmpui/addurldialog.cpp36
-rw-r--r--src/qmmpui/addurldialog_p.h5
-rw-r--r--src/qmmpui/fileloader.cpp109
-rw-r--r--src/qmmpui/fileloader_p.h8
-rw-r--r--src/qmmpui/playlistdownloader.cpp21
-rw-r--r--src/qmmpui/playlistdownloader.h23
-rw-r--r--src/qmmpui/playlistformat.h8
-rw-r--r--src/qmmpui/playlistmodel.cpp32
-rw-r--r--src/qmmpui/playlistmodel.h2
-rw-r--r--src/qmmpui/playlistparser.cpp73
-rw-r--r--src/qmmpui/playlistparser.h15
-rw-r--r--src/qmmpui/playlisttrack.cpp22
-rw-r--r--src/qmmpui/playlisttrack.h5
13 files changed, 246 insertions, 113 deletions
diff --git a/src/qmmpui/addurldialog.cpp b/src/qmmpui/addurldialog.cpp
index 0bfef038a..9af61b516 100644
--- a/src/qmmpui/addurldialog.cpp
+++ b/src/qmmpui/addurldialog.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2012 by Ilya Kotov *
+ * Copyright (C) 2006-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -43,8 +43,8 @@ AddUrlDialog::AddUrlDialog(QWidget *parent) : QDialog(parent)
m_history = settings.value("URLDialog/history").toStringList();
urlComboBox->addItems(m_history);
m_downloader = new PlayListDownloader(this);
- connect(m_downloader, SIGNAL(done(QStringList)), SLOT(add(QStringList)));
- connect(m_downloader, SIGNAL(error(QString)), SLOT(showError(QString)));
+ connect(m_downloader, SIGNAL(finished(bool,QString)), SLOT(onFinished(bool,QString)));
+
if(QmmpUiSettings::instance()->useClipboard())
{
QUrl url(QApplication::clipboard()->text().trimmed());
@@ -74,6 +74,19 @@ void AddUrlDialog::popup(QWidget* parent, PlayListModel* model)
m_instance->raise();
}
+void AddUrlDialog::onFinished(bool ok, const QString &message)
+{
+ if(ok)
+ {
+ QDialog::accept();
+ }
+ else
+ {
+ QMessageBox::warning(this, tr("Error"), message);
+ addButton->setEnabled(true);
+ }
+}
+
void AddUrlDialog::accept()
{
addButton->setEnabled(false);
@@ -98,9 +111,9 @@ void AddUrlDialog::accept()
m_history.removeAll(s);
m_history.prepend(s);
- if (s.startsWith("http://")) //try to download playlist
+ if (s.startsWith("http://") || s.startsWith("https://")) //try to download playlist
{
- m_downloader->start(QUrl(s));
+ m_downloader->start(QUrl(s), m_model);
return;
}
m_model->add(s);
@@ -111,16 +124,3 @@ void AddUrlDialog::setModel(PlayListModel *m)
{
m_model = m;
}
-
-void AddUrlDialog::add(const QStringList &urls)
-{
- addButton->setEnabled(true);
- m_model->add(urls);
- QDialog::accept();
-}
-
-void AddUrlDialog::showError(const QString &message)
-{
- QMessageBox::warning(this, tr("Error"), message);
- addButton->setEnabled(true);
-}
diff --git a/src/qmmpui/addurldialog_p.h b/src/qmmpui/addurldialog_p.h
index 5835b3fbf..962c7fe38 100644
--- a/src/qmmpui/addurldialog_p.h
+++ b/src/qmmpui/addurldialog_p.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2012 by Ilya Kotov *
+ * Copyright (C) 2006-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -41,8 +41,7 @@ public:
static void popup(QWidget* parent ,PlayListModel*);
private slots:
- void add(const QStringList &urls);
- void showError(const QString &message);
+ void onFinished(bool ok, const QString &message);
private:
AddUrlDialog(QWidget *parent);
diff --git a/src/qmmpui/fileloader.cpp b/src/qmmpui/fileloader.cpp
index 0b0958423..e42226a4d 100644
--- a/src/qmmpui/fileloader.cpp
+++ b/src/qmmpui/fileloader.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2015 by Ilya Kotov *
+ * Copyright (C) 2006-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -26,6 +26,7 @@
#include "fileloader_p.h"
#include "qmmpuisettings.h"
#include "playlistitem.h"
+#include "playlistparser.h"
#include "playlisttrack.h"
FileLoader::FileLoader(QObject *parent) : QThread(parent)
@@ -53,6 +54,62 @@ QList<PlayListTrack *> FileLoader::processFile(const QString &path, QStringList
return tracks;
}
+void FileLoader::insertPlayList(const QString &fmt, const QByteArray &contents, PlayListItem *before)
+{
+ QList<PlayListTrack *> tracks = PlayListParser::loadPlaylist(fmt, contents);
+
+ while (!tracks.isEmpty() && !m_finished)
+ {
+ PlayListTrack *t = tracks.takeFirst();
+ QList <FileInfo *> infoList = MetaDataManager::instance()->createPlayList(t->url(), m_use_meta);
+ if(infoList.count() != 1) //invalid or unsupported track
+ {
+ qDeleteAll(infoList);
+ infoList.clear();
+ delete t;
+ continue;
+ }
+
+ FileInfo *info = infoList.first();
+ if(!info->metaData(Qmmp::ALBUM).isEmpty() && !info->metaData(Qmmp::ARTIST).isEmpty())
+ t->updateMetaData(infoList.first());
+
+ emit newTracksToInsert(before, QList<PlayListTrack *>() << t);
+ delete info;
+ }
+ //clear remaining tracks
+ qDeleteAll(tracks);
+ tracks.clear();
+}
+
+void FileLoader::insertPlayList(const QString &path, PlayListItem *before)
+{
+ QList<PlayListTrack *> tracks = PlayListParser::loadPlaylist(path);
+
+ while (!tracks.isEmpty() && !m_finished)
+ {
+ PlayListTrack *t = tracks.takeFirst();
+ QList <FileInfo *> infoList = MetaDataManager::instance()->createPlayList(t->url(), m_use_meta);
+ if(infoList.count() != 1) //invalid or unsupported track
+ {
+ qDeleteAll(infoList);
+ infoList.clear();
+ delete t;
+ continue;
+ }
+
+ FileInfo *info = infoList.first();
+ if(!info->metaData(Qmmp::ALBUM).isEmpty() && !info->metaData(Qmmp::ARTIST).isEmpty())
+ t->updateMetaData(infoList.first());
+
+ emit newTracksToInsert(before, QList<PlayListTrack *>() << t);
+ delete info;
+ }
+ //clear remaining tracks
+ qDeleteAll(tracks);
+ tracks.clear();
+}
+
void FileLoader::addDirectory(const QString& s, PlayListItem *before)
{
QList<PlayListTrack *> tracks;
@@ -127,20 +184,31 @@ void FileLoader::run()
PlayListItem *before = i.before;
QString path = i.path;
- QFileInfo info(path);
-
- if(info.isDir())
+ if(!path.isEmpty())
{
- addDirectory(path, before);
+ QFileInfo info(path);
- }
- else if(info.isFile() || path.contains("://"))
- {
- QList<PlayListTrack *> tracks = processFile(path);
- if(!tracks.isEmpty())
+ if(info.isDir())
+ {
+ addDirectory(path, before);
+
+ }
+ else if(info.isFile() && PlayListParser::isPlayList(path))
{
- emit newTracksToInsert(before, tracks);
+ insertPlayList(path, before);
}
+ else if(info.isFile() || path.contains("://"))
+ {
+ QList<PlayListTrack *> tracks = processFile(path);
+ if(!tracks.isEmpty())
+ {
+ emit newTracksToInsert(before, tracks);
+ }
+ }
+ }
+ else if(!i.playListContent.isEmpty() && !i.playListFormat.isEmpty())
+ {
+ insertPlayList(i.playListFormat, i.playListContent, before);
}
m_mutex.lock();
@@ -163,6 +231,25 @@ void FileLoader::add(const QStringList &paths)
insert(0, paths);
}
+void FileLoader::addPlayList(const QString &fmt, const QByteArray &data)
+{
+ m_mutex.lock();
+ LoaderTask task;
+ task.before = 0;
+ task.playListFormat = fmt;
+ task.playListContent = data;
+ m_tasks.append(task);
+ m_mutex.unlock();
+ if(!isRunning())
+ {
+ MetaDataManager::instance()->prepareForAnotherThread();
+ PlayListParser::loadFormats();
+ m_filters = MetaDataManager::instance()->nameFilters();
+ m_use_meta = m_settings->useMetadata();
+ }
+ start(QThread::IdlePriority);
+}
+
void FileLoader::insert(PlayListItem *before, const QString &path)
{
insert(before, QStringList() << path);
diff --git a/src/qmmpui/fileloader_p.h b/src/qmmpui/fileloader_p.h
index 1dd0a823b..58f771ff7 100644
--- a/src/qmmpui/fileloader_p.h
+++ b/src/qmmpui/fileloader_p.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2015 by Ilya Kotov *
+ * Copyright (C) 2006-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -61,10 +61,12 @@ public:
* Sets files/directories to load
*/
void add(const QStringList &paths);
+ void addPlayList(const QString &fmt, const QByteArray &data);
void insert(PlayListItem *before, const QString &path);
void insert(PlayListItem *before, const QStringList &paths);
+
public slots:
/*!
* Removes files and directories from queue and waits until thread is finished
@@ -81,6 +83,8 @@ signals:
private:
void run();
QList<PlayListTrack*> processFile(const QString &path, QStringList *ignoredPaths = 0);
+ void insertPlayList(const QString &fmt, const QByteArray &contents, PlayListItem *before);
+ void insertPlayList(const QString &path, PlayListItem *before);
void addDirectory(const QString &s, PlayListItem *before = 0);
bool checkRestrictFilters(const QFileInfo &info);
bool checkExcludeFilters(const QFileInfo &info);
@@ -89,6 +93,8 @@ private:
{
QString path;
PlayListItem *before;
+ QString playListFormat;
+ QByteArray playListContent;
};
QQueue <LoaderTask> m_tasks;
QStringList m_filters;
diff --git a/src/qmmpui/playlistdownloader.cpp b/src/qmmpui/playlistdownloader.cpp
index a88f18460..951877258 100644
--- a/src/qmmpui/playlistdownloader.cpp
+++ b/src/qmmpui/playlistdownloader.cpp
@@ -46,11 +46,13 @@ PlayListDownloader::PlayListDownloader(QObject *parent) : QObject(parent)
}
}
-void PlayListDownloader::start(const QUrl &url)
+void PlayListDownloader::start(const QUrl &url, PlayListModel *model)
{
+ m_model = model;
if(!PlayListParser::findByUrl(url)) //is it playlist?
{
- emit done(QStringList() << QString::fromLatin1(url.toEncoded())); //just send initial URL
+ m_model->add(url.toString());
+ emit finished(true);
return;
}
m_url = url;
@@ -71,7 +73,7 @@ void PlayListDownloader::readResponse(QNetworkReply *reply)
if(reply->error() != QNetworkReply::NoError)
{
- emit error(reply->errorString() + " (" + reply->error() + ")");
+ emit finished(false, reply->errorString() + " (" + reply->error() + ")");
reply->deleteLater();
return;
}
@@ -93,6 +95,13 @@ void PlayListDownloader::readResponse(QNetworkReply *reply)
if(reply == m_getReply)
{
m_getReply = 0;
+
+ if(m_model.isNull())
+ {
+ emit finished(true);
+ return;
+ }
+
QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
qDebug("PlayListDownloader: content type: %s", qPrintable(contentType));
PlayListFormat *fmt = PlayListParser::findByMime(contentType);
@@ -100,12 +109,12 @@ void PlayListDownloader::readResponse(QNetworkReply *reply)
fmt = PlayListParser::findByUrl(m_url);
if(fmt)
{
- QStringList list = fmt->decode(QString::fromUtf8(reply->readAll()));
- emit done(list);
+ m_model->loadPlaylist(fmt->properties().shortName, reply->readAll());
+ emit finished(true);
}
else
{
- emit error(tr("Unsupported playlist format"));
+ emit finished(false, tr("Unsupported playlist format"));
}
}
reply->deleteLater();
diff --git a/src/qmmpui/playlistdownloader.h b/src/qmmpui/playlistdownloader.h
index df0a612db..ef044ab6c 100644
--- a/src/qmmpui/playlistdownloader.h
+++ b/src/qmmpui/playlistdownloader.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2012 by Ilya Kotov *
+ * Copyright (C) 2012-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -23,6 +23,8 @@
#include <QObject>
#include <QUrl>
+#include <QPointer>
+#include "playlistmodel.h"
class QNetworkAccessManager;
class QNetworkReply;
@@ -41,23 +43,19 @@ public:
signals:
/*!
- * Emitted when downloading is finished without errors.
- * @param urls A list of extracted URLs or argument of the \b PlayListDownloader::start()
- * function if remote URL doesn't contain playlist.
- */
- void done(const QStringList &urls);
- /*!
- * Emitted when downloading is finished with error.
+ * Emitted when downloading is finished.
+ * @param ok Result of downloading (if an error occurs, \b ok is set to \b false; otherwise \b ok is set to \b true).
* @param message Error message.
*/
- void error(const QString &message);
+ void finished(bool ok, const QString &message = QString());
public slots:
/*!
- * Starts playlist downloading
- * @param url URL of remote playlist
+ * Starts playlist downloading.
+ * @param url URL of remote playlist.
+ * @param model Destination playlist model.
*/
- void start(const QUrl &url);
+ void start(const QUrl &url, PlayListModel *model);
private slots:
void readResponse(QNetworkReply *reply);
@@ -67,6 +65,7 @@ private:
QUrl m_redirect_url, m_url;
QNetworkReply *m_getReply;
QByteArray m_ua;
+ QPointer<PlayListModel> m_model;
};
#endif // PLAYLISTDOWNLOADER_H
diff --git a/src/qmmpui/playlistformat.h b/src/qmmpui/playlistformat.h
index 06927cfbf..16e23a57d 100644
--- a/src/qmmpui/playlistformat.h
+++ b/src/qmmpui/playlistformat.h
@@ -53,13 +53,13 @@ public:
* Takes raw contents of playlist file, should return string list of
* ready file pathes to fill the playlist.
*/
- virtual QStringList decode(const QString& contents) = 0;
+ virtual QList<PlayListTrack*> decode(const QByteArray &contents) = 0;
/*!
- * Takes the list of AbstractPlaylistItem objects, should return string of
+ * Takes the list of \b PlayListTrack objects, should return content of
* encoded playlist file.
- * @param dir Playlist file path (May be used to adjust playlist content).
+ * @param path Playlist file path (May be used to adjust playlist content).
*/
- virtual QString encode(const QList<PlayListTrack*>& contents, const QString &path) = 0;
+ virtual QByteArray encode(const QList<PlayListTrack*> &contents, const QString &path) = 0;
};
Q_DECLARE_INTERFACE(PlayListFormat,"PlayListFormat/1.0")
diff --git a/src/qmmpui/playlistmodel.cpp b/src/qmmpui/playlistmodel.cpp
index 20e82650e..7fe8daacb 100644
--- a/src/qmmpui/playlistmodel.cpp
+++ b/src/qmmpui/playlistmodel.cpp
@@ -143,26 +143,12 @@ void PlayListModel::add(QList<PlayListTrack *> tracks)
void PlayListModel::add(const QString &path)
{
- QStringList paths = PlayListParser::loadPlaylist(path);
- if(paths.isEmpty())
- m_loader->add(path);
- else
- m_loader->add(paths);
+ m_loader->add(path);
}
void PlayListModel::add(const QStringList &paths)
{
- QStringList urls, pl_urls;
- foreach(QString path, paths)
- {
- pl_urls = PlayListParser::loadPlaylist(path); //is it playlist?
- if(pl_urls.isEmpty())
- urls.append(path);
- else
- urls.append(pl_urls);
-
- }
- m_loader->add(urls);
+ m_loader->add(paths);
}
void PlayListModel::insert(int index, PlayListTrack *track)
@@ -242,11 +228,7 @@ void PlayListModel::insert(int index, const QStringList &paths)
else
{
PlayListItem *before = m_container->item(index);
-
- QStringList list = paths;
- foreach (QString path, paths)
- list.append(PlayListParser::loadPlaylist(path));
- m_loader->insert(before, list);
+ m_loader->insert(before, paths);
}
}
@@ -945,8 +927,12 @@ void PlayListModel::doCurrentVisibleRequest()
void PlayListModel::loadPlaylist(const QString &f_name)
{
- QStringList list = PlayListParser::loadPlaylist(f_name);
- m_loader->add(list);
+ m_loader->add(f_name);
+}
+
+void PlayListModel::loadPlaylist(const QString &fmt, const QByteArray &data)
+{
+ m_loader->addPlayList(fmt, data);
}
void PlayListModel::savePlaylist(const QString &f_name)
diff --git a/src/qmmpui/playlistmodel.h b/src/qmmpui/playlistmodel.h
index f7d393162..37fe5497d 100644
--- a/src/qmmpui/playlistmodel.h
+++ b/src/qmmpui/playlistmodel.h
@@ -287,6 +287,8 @@ public:
* Loads playlist with \b f_name name.
*/
void loadPlaylist(const QString& f_name);
+
+ void loadPlaylist(const QString &fmt, const QByteArray &data);
/*!
* Saves current songs to the playlist with \b f_name name.
*/
diff --git a/src/qmmpui/playlistparser.cpp b/src/qmmpui/playlistparser.cpp
index 70c3c3fe9..736a400cc 100644
--- a/src/qmmpui/playlistparser.cpp
+++ b/src/qmmpui/playlistparser.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008-2014 by Ilya Kotov *
+ * Copyright (C) 2008-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -23,7 +23,6 @@
#include <QList>
#include <QDir>
#include <QApplication>
-#include <QTextStream>
#include <qmmp/qmmp.h>
#include "playlistformat.h"
#include "playlistparser.h"
@@ -32,13 +31,13 @@ QList<PlayListFormat*> *PlayListParser::m_formats = 0;
QList<PlayListFormat *> PlayListParser::formats()
{
- checkFormats();
+ loadFormats();
return *m_formats;
}
QStringList PlayListParser::nameFilters()
{
- checkFormats();
+ loadFormats();
QStringList filters;
foreach(PlayListFormat* format, *m_formats)
{
@@ -47,9 +46,20 @@ QStringList PlayListParser::nameFilters()
return filters;
}
+bool PlayListParser::isPlayList(const QString &url)
+{
+ foreach (QString filter, nameFilters())
+ {
+ QRegExp r(filter, Qt::CaseInsensitive, QRegExp::Wildcard);
+ if(r.exactMatch(url))
+ return true;
+ }
+ return false;
+}
+
PlayListFormat *PlayListParser::findByMime(const QString &mime)
{
- checkFormats();
+ loadFormats();
foreach(PlayListFormat* format, *m_formats)
{
if(format->properties().contentTypes.contains(mime))
@@ -60,7 +70,7 @@ PlayListFormat *PlayListParser::findByMime(const QString &mime)
PlayListFormat *PlayListParser::findByPath(const QString &filePath)
{
- checkFormats();
+ loadFormats();
foreach(PlayListFormat* format, *m_formats)
{
foreach(QString filter, format->properties().filters)
@@ -89,50 +99,65 @@ void PlayListParser::savePlayList(QList<PlayListTrack *> tracks, const QString &
QFile file(f_name);
if (file.open(QIODevice::WriteOnly))
{
- QTextStream ts(&file);
- ts << prs->encode(tracks, QFileInfo(f_name).canonicalFilePath());
+ file.write(prs->encode(tracks, QFileInfo(f_name).canonicalFilePath()));
file.close();
}
else
qWarning("PlayListParser: unable to save playlist, error: %s", qPrintable(file.errorString()));
}
-QStringList PlayListParser::loadPlaylist(const QString &f_name)
+QList<PlayListTrack *> PlayListParser::loadPlaylist(const QString &f_name)
{
- QStringList list;
if(!QFile::exists(f_name))
- return list;
+ return QList<PlayListTrack *>();
PlayListFormat* prs = PlayListParser::findByPath(f_name);
if(!prs)
- return list;
+ return QList<PlayListTrack *>();
QFile file(f_name);
if (!file.open(QIODevice::ReadOnly))
{
qWarning("PlayListParser: unable to open playlist, error: %s", qPrintable(file.errorString()));
- return list;
+ return QList<PlayListTrack *>();
}
- list = prs->decode(QTextStream(&file).readAll());
- if(list.isEmpty())
+ QList <PlayListTrack*> tracks = prs->decode(file.readAll());
+
+ if(tracks.isEmpty())
+ {
qWarning("PlayListParser: error opening %s",qPrintable(f_name));
+ return tracks;
+ }
- for (int i = 0; i < list.size(); ++i)
+ QString url;
+ foreach (PlayListTrack *t, tracks)
{
- if(list.at(i).contains("://"))
+ url = t->value(Qmmp::URL);
+
+ if(url.contains("://"))
continue;
- if (QFileInfo(list.at(i)).isRelative())
- list[i].prepend(QFileInfo(f_name).canonicalPath () + "/");
+ if(QFileInfo(url).isRelative())
+ url.prepend(QFileInfo(f_name).canonicalPath () + "/");
- list[i].replace("\\","/");
- list[i].replace("//","/");
+ url.replace("\\","/");
+ url.replace("//","/");
+ t->insert(Qmmp::URL, url);
+ }
+ return tracks;
+}
+
+QList<PlayListTrack *> PlayListParser::loadPlaylist(const QString &fmt, const QByteArray &contents)
+{
+ foreach (PlayListFormat *p, *m_formats)
+ {
+ if(p->properties().shortName == fmt)
+ return p->decode(contents);
}
- file.close();
- return list;
+ return QList<PlayListTrack *>();
}
-void PlayListParser::checkFormats()
+void PlayListParser::loadFormats()
{
if (m_formats)
return;
diff --git a/src/qmmpui/playlistparser.h b/src/qmmpui/playlistparser.h
index c8e779b84..c171116e0 100644
--- a/src/qmmpui/playlistparser.h
+++ b/src/qmmpui/playlistparser.h
@@ -39,6 +39,9 @@ public:
* Returns a list of the supported files name filters, i.e. "*.m3u *.pls"
*/
static QStringList nameFilters();
+
+ static bool isPlayList(const QString &url);
+
/*!
* Returns PlayListFormat pointer which supports mime type \b mime
* or \b 0 if mime type \b mime is unsupported
@@ -59,17 +62,23 @@ public:
* @param tracks A list of tracks.
* @param f_name File name the playlist.
*/
- static void savePlayList(QList <PlayListTrack *> tracks, const QString &f_name);
+ static void savePlayList(QList<PlayListTrack *> tracks, const QString &f_name);
/*!
* Loads playlist from file \b f_name
* @param f_name File name.
* @return A list of URLs or file paths.
*/
- static QStringList loadPlaylist(const QString &f_name);
+ static QList<PlayListTrack *> loadPlaylist(const QString &f_name);
+
+ static QList<PlayListTrack *> loadPlaylist(const QString &fmt, const QByteArray &contents);
+ /*!
+ * Loads all playlist plugins. Should be called before usage from another thread.
+ */
+ static void loadFormats();
private:
PlayListParser(){}
- static void checkFormats();
+
static QList<PlayListFormat*> *m_formats;
diff --git a/src/qmmpui/playlisttrack.cpp b/src/qmmpui/playlisttrack.cpp
index fc9c139e9..917e95399 100644
--- a/src/qmmpui/playlisttrack.cpp
+++ b/src/qmmpui/playlisttrack.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008-2015 by Ilya Kotov *
+ * Copyright (C) 2008-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -59,7 +59,7 @@ PlayListTrack::PlayListTrack(FileInfo *info) : QMap<Qmmp::MetaData, QString>(in
m_track_index = -1;
m_settings = QmmpUiSettings::instance();
m_helper = MetaDataHelper::instance();
- setLength(m_length = info->length());
+ m_length = info->length();
insert(Qmmp::URL, info->path());
m_refCount = 0;
m_sheduledForDeletion = false;
@@ -78,17 +78,23 @@ void PlayListTrack::updateMetaData(const QMap <Qmmp::MetaData, QString> &metaDat
formatGroup();
}
+void PlayListTrack::updateMetaData(FileInfo *info)
+{
+ m_length = info->length();
+ QMap <Qmmp::MetaData, QString>::operator =(info->metaData());
+ insert(Qmmp::URL, info->path());
+ m_formattedTitles.clear();
+ m_formattedLength.clear();
+ formatGroup();
+}
+
void PlayListTrack::updateMetaData()
{
QList <FileInfo *> list = MetaDataManager::instance()->createPlayList(value(Qmmp::URL));
if(!list.isEmpty() && !list.at(0)->path().contains("://"))
{
FileInfo *info = list.at(0);
- m_length = info->length();
- QMap <Qmmp::MetaData, QString>::operator =(info->metaData());
- insert(Qmmp::URL, info->path());
- m_formattedTitles.clear();
- formatGroup();
+ updateMetaData(info);
}
qDeleteAll(list);
}
@@ -223,7 +229,7 @@ qint64 PlayListTrack::length() const
void PlayListTrack::setLength(qint64 length)
{
- m_length = length;
+ m_length = qMax(length, 0LL);
m_formattedLength.clear();
}
diff --git a/src/qmmpui/playlisttrack.h b/src/qmmpui/playlisttrack.h
index 2c832f616..97674f0fd 100644
--- a/src/qmmpui/playlisttrack.h
+++ b/src/qmmpui/playlisttrack.h
@@ -84,6 +84,11 @@ public:
*/
void updateMetaData(const QMap <Qmmp::MetaData, QString> &metaData);
/*!
+ * Updates current metadata.
+ * @param info Media file information.
+ */
+ void updateMetaData(FileInfo *info);
+ /*!
* Gets new metadata from file (works for local files only).
*/
void updateMetaData();