diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/music/MusicDbUrl.cpp | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/music/MusicDbUrl.cpp')
-rw-r--r-- | xbmc/music/MusicDbUrl.cpp | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/xbmc/music/MusicDbUrl.cpp b/xbmc/music/MusicDbUrl.cpp new file mode 100644 index 0000000..3b4893b --- /dev/null +++ b/xbmc/music/MusicDbUrl.cpp @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2012-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "MusicDbUrl.h" + +#include "filesystem/MusicDatabaseDirectory.h" +#include "playlists/SmartPlayList.h" +#include "utils/StringUtils.h" +#include "utils/Variant.h" + +using namespace XFILE; +using namespace XFILE::MUSICDATABASEDIRECTORY; + +CMusicDbUrl::CMusicDbUrl() + : CDbUrl() +{ } + +CMusicDbUrl::~CMusicDbUrl() = default; + +bool CMusicDbUrl::parse() +{ + // the URL must start with musicdb:// + if (!m_url.IsProtocol("musicdb") || m_url.GetFileName().empty()) + return false; + + std::string path = m_url.Get(); + + // Parse path for directory node types and query params + NODE_TYPE dirType; + NODE_TYPE childType; + CQueryParams queryParams; + if (!CMusicDatabaseDirectory::GetDirectoryNodeInfo(path, dirType, childType, queryParams)) + return false; + + switch (dirType) + { + case NODE_TYPE_ARTIST: + m_type = "artists"; + break; + + case NODE_TYPE_ALBUM: + case NODE_TYPE_ALBUM_RECENTLY_ADDED: + case NODE_TYPE_ALBUM_RECENTLY_PLAYED: + case NODE_TYPE_ALBUM_TOP100: + m_type = "albums"; + break; + + case NODE_TYPE_DISC: + m_type = "discs"; + break; + + case NODE_TYPE_ALBUM_RECENTLY_ADDED_SONGS: + case NODE_TYPE_ALBUM_RECENTLY_PLAYED_SONGS: + case NODE_TYPE_ALBUM_TOP100_SONGS: + case NODE_TYPE_SONG: + case NODE_TYPE_SONG_TOP100: + case NODE_TYPE_SINGLES: + m_type = "songs"; + break; + + default: + break; + } + + switch (childType) + { + case NODE_TYPE_ARTIST: + m_type = "artists"; + break; + + case NODE_TYPE_ALBUM: + case NODE_TYPE_ALBUM_RECENTLY_ADDED: + case NODE_TYPE_ALBUM_RECENTLY_PLAYED: + case NODE_TYPE_ALBUM_TOP100: + m_type = "albums"; + break; + + case NODE_TYPE_DISC: + m_type = "discs"; + break; + + case NODE_TYPE_SONG: + case NODE_TYPE_ALBUM_RECENTLY_ADDED_SONGS: + case NODE_TYPE_ALBUM_RECENTLY_PLAYED_SONGS: + case NODE_TYPE_ALBUM_TOP100_SONGS: + case NODE_TYPE_SONG_TOP100: + case NODE_TYPE_SINGLES: + m_type = "songs"; + break; + + case NODE_TYPE_GENRE: + m_type = "genres"; + break; + + case NODE_TYPE_SOURCE: + m_type = "sources"; + break; + + case NODE_TYPE_ROLE: + m_type = "roles"; + break; + + case NODE_TYPE_YEAR: + m_type = "years"; + break; + + case NODE_TYPE_TOP100: + m_type = "top100"; + break; + + case NODE_TYPE_ROOT: + case NODE_TYPE_OVERVIEW: + default: + return false; + } + + if (m_type.empty()) + return false; + + // retrieve and parse all options + AddOptions(m_url.GetOptions()); + + // add options based on the node type + if (dirType == NODE_TYPE_SINGLES || childType == NODE_TYPE_SINGLES) + AddOption("singles", true); + + // add options based on the QueryParams + if (queryParams.GetArtistId() != -1) + AddOption("artistid", (int)queryParams.GetArtistId()); + if (queryParams.GetAlbumId() != -1) + AddOption("albumid", (int)queryParams.GetAlbumId()); + if (queryParams.GetGenreId() != -1) + AddOption("genreid", (int)queryParams.GetGenreId()); + if (queryParams.GetSongId() != -1) + AddOption("songid", (int)queryParams.GetSongId()); + if (queryParams.GetYear() != -1) + AddOption("year", (int)queryParams.GetYear()); + + // Decode legacy use of "musicdb://compilations/" path for filtered albums + if (m_url.GetFileName() == "compilations/") + AddOption("compilation", true); + + return true; +} + +bool CMusicDbUrl::validateOption(const std::string &key, const CVariant &value) +{ + if (!CDbUrl::validateOption(key, value)) + return false; + + // if the value is empty it will remove the option which is ok + // otherwise we only care about the "filter" option here + if (value.empty() || !StringUtils::EqualsNoCase(key, "filter")) + return true; + + if (!value.isString()) + return false; + + CSmartPlaylist xspFilter; + if (!xspFilter.LoadFromJson(value.asString())) + return false; + + // check if the filter playlist matches the item type + return xspFilter.GetType() == m_type; +} |