aboutsummaryrefslogtreecommitdiff
path: root/src/qmmpui
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-01-14 21:23:55 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-01-14 21:23:55 +0000
commitda6b743dd621668de3f7679ed3356a38bd47d7ef (patch)
tree595d14ffe703357a5b3ac3858bbd11bb479492e8 /src/qmmpui
parent257f15600dd619d2854046a4a483831c9e99e414 (diff)
downloadqmmp-da6b743dd621668de3f7679ed3356a38bd47d7ef.tar.gz
qmmp-da6b743dd621668de3f7679ed3356a38bd47d7ef.tar.bz2
qmmp-da6b743dd621668de3f7679ed3356a38bd47d7ef.zip
added internal playlist serializer
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9633 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/qmmpui')
-rw-r--r--src/qmmpui/playlistparser.cpp97
-rw-r--r--src/qmmpui/playlistparser.h6
2 files changed, 103 insertions, 0 deletions
diff --git a/src/qmmpui/playlistparser.cpp b/src/qmmpui/playlistparser.cpp
index b22d0eeb0..9948de498 100644
--- a/src/qmmpui/playlistparser.cpp
+++ b/src/qmmpui/playlistparser.cpp
@@ -22,6 +22,9 @@
#include <QList>
#include <QDir>
#include <QApplication>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonArray>
#include <algorithm>
#include <qmmp/qmmp.h>
#include "playlistformat.h"
@@ -29,6 +32,30 @@
QList<PlayListFormat*> *PlayListParser::m_formats = nullptr;
+//key names
+const QHash<QString, Qmmp::MetaData> PlayListParser::m_metaKeys = {
+ { "title", Qmmp::TITLE },
+ { "artist", Qmmp::ARTIST },
+ { "albumArtist", Qmmp::ALBUMARTIST },
+ { "album", Qmmp::ALBUM },
+ { "comment", Qmmp::COMMENT },
+ { "genre", Qmmp::GENRE },
+ { "composer", Qmmp::COMPOSER },
+ { "year", Qmmp::YEAR },
+ { "track", Qmmp::TRACK },
+ { "disk", Qmmp::DISCNUMBER }
+};
+
+const QHash<QString, Qmmp::TrackProperty> PlayListParser::m_propKeys = {
+ { "bitrate", Qmmp::BITRATE },
+ { "samplerate", Qmmp::SAMPLERATE },
+ { "channels", Qmmp::CHANNELS },
+ { "bitsPerSample", Qmmp::BITS_PER_SAMPLE },
+ { "formatName", Qmmp::FORMAT_NAME },
+ { "decoder", Qmmp::DECODER },
+ { "fileSize", Qmmp::FILE_SIZE }
+};
+
QList<PlayListFormat *> PlayListParser::formats()
{
loadFormats();
@@ -176,3 +203,73 @@ void PlayListParser::loadFormats()
m_formats->append(fmt);
}
}
+
+QByteArray PlayListParser::serialize(const QList<PlayListTrack *> &tracks)
+{
+ QJsonArray array;
+ for(const PlayListTrack *t : qAsConst(tracks))
+ {
+ QJsonObject obj;
+ QString value;
+ for(QHash<QString, Qmmp::MetaData>::const_iterator it = m_metaKeys.constBegin(); it != m_metaKeys.constEnd(); ++it)
+ {
+ if(!(value = t->value(it.value())).isEmpty())
+ obj.insert(it.key(), value);
+ }
+
+ for(QHash<QString, Qmmp::TrackProperty>::const_iterator it = m_propKeys.constBegin(); it != m_propKeys.constEnd(); ++it)
+ {
+ if(!(value = t->value(it.value())).isEmpty())
+ obj.insert(it.key(), value);
+ }
+
+ obj.insert("path", t->path());
+ obj.insert("duration", t->duration());
+ array.append(obj);
+ }
+
+ return QJsonDocument(array).toJson(QJsonDocument::Compact);
+}
+
+QList<PlayListTrack *> PlayListParser::deserialize(const QByteArray &json)
+{
+ QList<PlayListTrack *> out;
+
+ QJsonDocument document = QJsonDocument::fromJson(json);
+ if(!document.isArray())
+ {
+ qWarning("PlayListParser: invalid JSON array");
+ return out;
+ }
+
+ QJsonArray array = document.array();
+ for(QJsonArray::const_iterator it = array.cbegin(); it != array.cend(); ++it)
+ {
+ if(!(*it).isObject())
+ continue;
+
+ QJsonObject obj = (*it).toObject();
+
+ if(obj.value("path").isNull())
+ continue;
+
+ PlayListTrack *t = new PlayListTrack();
+ t->setPath(obj.value("path").toString());
+ t->setDuration(obj.value("duration").toDouble());
+
+ Qmmp::MetaData metaKey;
+ Qmmp::TrackProperty propKey;
+
+ for(QJsonObject::const_iterator i = obj.constBegin(); i != obj.constEnd(); ++i)
+ {
+ if((metaKey = m_metaKeys.value(i.key(), Qmmp::UNKNOWN)) != Qmmp::UNKNOWN)
+ t->setValue(metaKey, i.value().toString());
+ else if((propKey = m_propKeys.value(i.key(), Qmmp::UNKNOWN_PROPERTY)) != Qmmp::UNKNOWN_PROPERTY)
+ t->setValue(propKey, i.value().toString());
+ }
+
+ out << t;
+ }
+
+ return out;
+}
diff --git a/src/qmmpui/playlistparser.h b/src/qmmpui/playlistparser.h
index 70317ec6c..0778a6ff0 100644
--- a/src/qmmpui/playlistparser.h
+++ b/src/qmmpui/playlistparser.h
@@ -22,6 +22,7 @@
#include <QStringList>
#include <QUrl>
+#include <QHash>
#include "playlisttrack.h"
#include "playlistformat.h"
#include "qmmpui_export.h"
@@ -88,10 +89,15 @@ public:
*/
static void loadFormats();
+ static QByteArray serialize(const QList<PlayListTrack *> &tracks);
+ static QList<PlayListTrack *> deserialize(const QByteArray &json);
+
private:
PlayListParser(){}
static QList<PlayListFormat*> *m_formats;
+ static const QHash<QString, Qmmp::MetaData> m_metaKeys;
+ static const QHash<QString, Qmmp::TrackProperty> m_propKeys;
};