diff --git a/src/playlistparsers/playlistparser.cpp b/src/playlistparsers/playlistparser.cpp index 37dd2f8b3..a8d20241f 100644 --- a/src/playlistparsers/playlistparser.cpp +++ b/src/playlistparsers/playlistparser.cpp @@ -116,6 +116,17 @@ SongList PlaylistParser::Load(const QString &filename, const QString& playlist_p return parser->Load(&file, playlist_path, info.absolutePath()); } +SongList PlaylistParser::Load(QIODevice* device, const QString& path_hint, + const QDir& dir_hint) const { + // Find a parser that supports this data + ParserBase* parser = MaybeGetParserForMagic(device->peek(kMagicSize)); + if (!parser) { + return SongList(); + } + + return parser->Load(device, path_hint, dir_hint); +} + void PlaylistParser::Save(const SongList &songs, const QString &filename) const { QFileInfo info(filename); diff --git a/src/playlistparsers/playlistparser.h b/src/playlistparsers/playlistparser.h index fc3411a5d..32a9a2156 100644 --- a/src/playlistparsers/playlistparser.h +++ b/src/playlistparsers/playlistparser.h @@ -18,6 +18,7 @@ #ifndef PLAYLISTPARSER_H #define PLAYLISTPARSER_H +#include #include #include "core/song.h" @@ -44,6 +45,7 @@ public: ParserBase* ParserForExtension(const QString& suffix) const; SongList Load(const QString& filename, const QString& playlist_path = "", ParserBase* parser = 0) const; + SongList Load(QIODevice* device, const QString& path_hint = "", const QDir& dir_hint = QDir()) const; void Save(const SongList& songs, const QString& filename) const; private: diff --git a/src/scripting/python/clementine.sip b/src/scripting/python/clementine.sip index 3e3e67131..55b392393 100644 --- a/src/scripting/python/clementine.sip +++ b/src/scripting/python/clementine.sip @@ -11,10 +11,12 @@ %Include libraryquery.sip %Include mergedproxymodel.sip %Include network.sip +%Include parserbase.sip %Include player.sip %Include playlist.sip %Include playlistitem.sip %Include playlistmanager.sip +%Include playlistparser.sip %Include playlistsequence.sip %Include pythonengine.sip %Include radiomodel.sip diff --git a/src/scripting/python/parserbase.sip b/src/scripting/python/parserbase.sip new file mode 100644 index 000000000..3d44a463e --- /dev/null +++ b/src/scripting/python/parserbase.sip @@ -0,0 +1,17 @@ +class ParserBase : QObject { +%TypeHeaderCode + #include "playlistparsers/parserbase.h" +%End + +public: + ParserBase(LibraryBackend* library, QObject* parent /TransferThis/ = 0); + + virtual QString name() const = 0; + virtual QStringList file_extensions() const = 0; + virtual QString mime_type() const; + + virtual bool TryMagic(const QByteArray& data) const = 0; + + virtual SongList Load(QIODevice* device, const QString& playlist_path = "", const QDir& dir = QDir()) const = 0; + virtual void Save(const SongList& songs, QIODevice* device, const QDir& dir = QDir()) const = 0; +}; diff --git a/src/scripting/python/playlistparser.sip b/src/scripting/python/playlistparser.sip new file mode 100644 index 000000000..2688e11fa --- /dev/null +++ b/src/scripting/python/playlistparser.sip @@ -0,0 +1,24 @@ +class PlaylistParser : QObject { +%TypeHeaderCode + #include "playlistparsers/playlistparser.h" +%End + +public: + PlaylistParser(LibraryBackend* library, QObject* parent /TransferThis/ = 0); + + static const int kMagicSize; + + QStringList file_extensions() const; + QString filters() const; + + QString default_extension() const; + QString default_filter() const; + + ParserBase* MaybeGetParserForMagic(const QByteArray& data, + const QString& mime_type = QString()) const; + ParserBase* ParserForExtension(const QString& suffix) const; + + SongList Load(const QString& filename, const QString& playlist_path = "", ParserBase* parser = 0) const; + SongList Load(QIODevice* device, const QString& path_hint = "", const QDir& dir_hint = QDir()) const; + void Save(const SongList& songs, const QString& filename) const; +};