diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2017-06-14 20:24:58 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2017-06-14 20:24:58 +0000 |
| commit | b2576ddc181d3758e3a57d9cac871ee7d7e2ef06 (patch) | |
| tree | 1dfd6331a91f153d4a693a0aa32a774e2e53e2ea /src/qmmpui | |
| parent | 9e3bcc8653f5e0500e9d0e4ee0c953e8bbf4ea4c (diff) | |
| download | qmmp-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.cpp | 36 | ||||
| -rw-r--r-- | src/qmmpui/addurldialog_p.h | 5 | ||||
| -rw-r--r-- | src/qmmpui/fileloader.cpp | 109 | ||||
| -rw-r--r-- | src/qmmpui/fileloader_p.h | 8 | ||||
| -rw-r--r-- | src/qmmpui/playlistdownloader.cpp | 21 | ||||
| -rw-r--r-- | src/qmmpui/playlistdownloader.h | 23 | ||||
| -rw-r--r-- | src/qmmpui/playlistformat.h | 8 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.cpp | 32 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.h | 2 | ||||
| -rw-r--r-- | src/qmmpui/playlistparser.cpp | 73 | ||||
| -rw-r--r-- | src/qmmpui/playlistparser.h | 15 | ||||
| -rw-r--r-- | src/qmmpui/playlisttrack.cpp | 22 | ||||
| -rw-r--r-- | src/qmmpui/playlisttrack.h | 5 |
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(); |
