diff --git a/modules/gui/qt/medialibrary/medialib.cpp b/modules/gui/qt/medialibrary/medialib.cpp index 22bca6fd56..173d3ab421 100644 --- a/modules/gui/qt/medialibrary/medialib.cpp +++ b/modules/gui/qt/medialibrary/medialib.cpp @@ -107,6 +107,10 @@ static void convertQVariantListToPlaylistMedias(vlc_medialibrary_t* ml, QVariant } } +MLItemId MediaLib::deserializeMlItemIdFromString(const QString& serialized_id) { + return MLItemId::fromString(serialized_id); +} + void MediaLib::addToPlaylist(const QString& mrl, const QStringList &options) { QVector medias; diff --git a/modules/gui/qt/medialibrary/medialib.hpp b/modules/gui/qt/medialibrary/medialib.hpp index c0de5cd9f8..1a7b30faf7 100644 --- a/modules/gui/qt/medialibrary/medialib.hpp +++ b/modules/gui/qt/medialibrary/medialib.hpp @@ -46,6 +46,8 @@ public: MediaLib(qt_intf_t* _intf, vlc::playlist::PlaylistController* playlistController, QObject* _parent = nullptr ); ~MediaLib(); + Q_INVOKABLE static MLItemId deserializeMlItemIdFromString(const QString& serialized_id); + Q_INVOKABLE void addToPlaylist(const MLItemId &itemId, const QStringList &options = {}); Q_INVOKABLE void addToPlaylist(const QString& mrl, const QStringList &options = {}); Q_INVOKABLE void addToPlaylist(const QUrl& mrl, const QStringList &options = {}); diff --git a/modules/gui/qt/medialibrary/mlqmltypes.hpp b/modules/gui/qt/medialibrary/mlqmltypes.hpp index cbc9a3407c..9a29e67007 100644 --- a/modules/gui/qt/medialibrary/mlqmltypes.hpp +++ b/modules/gui/qt/medialibrary/mlqmltypes.hpp @@ -23,12 +23,23 @@ # include "config.h" #endif +#include #include #include #include static constexpr int64_t INVALID_MLITEMID_ID = 0; +static const QHash ml_parent_map = { + { QStringLiteral("VLC_ML_PARENT_ALBUM"), VLC_ML_PARENT_ALBUM }, + { QStringLiteral("VLC_ML_PARENT_ARTIST"), VLC_ML_PARENT_ARTIST }, + { QStringLiteral("VLC_ML_PARENT_SHOW"), VLC_ML_PARENT_SHOW }, + { QStringLiteral("VLC_ML_PARENT_GENRE"), VLC_ML_PARENT_GENRE }, + { QStringLiteral("VLC_ML_PARENT_GROUP"), VLC_ML_PARENT_GROUP }, + { QStringLiteral("VLC_ML_PARENT_FOLDER"), VLC_ML_PARENT_FOLDER }, + { QStringLiteral("VLC_ML_PARENT_PLAYLIST"), VLC_ML_PARENT_PLAYLIST } +}; + class MLItemId { Q_GADGET @@ -71,6 +82,22 @@ public: } #undef ML_PARENT_TYPE_CASE } + + Q_INVOKABLE static inline MLItemId fromString(const QStringView& serialized_id) { + const QList parts = serialized_id.split('-'); // Type, ID + if (parts.length() != 2) { + return {-1, VLC_ML_PARENT_UNKNOWN}; + } + + const QStringView type = parts[0].trimmed(); + bool conversionSuccessful = false; + std::int64_t item_id = parts[1].trimmed().toLongLong(&conversionSuccessful); + if (!conversionSuccessful) { + return {-1, VLC_ML_PARENT_UNKNOWN}; + } + + return { item_id, ml_parent_map.value(type, VLC_ML_PARENT_UNKNOWN) }; + } };