summaryrefslogtreecommitdiffstats
path: root/xbmc/video/VideoDbUrl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/video/VideoDbUrl.cpp')
-rw-r--r--xbmc/video/VideoDbUrl.cpp208
1 files changed, 208 insertions, 0 deletions
diff --git a/xbmc/video/VideoDbUrl.cpp b/xbmc/video/VideoDbUrl.cpp
new file mode 100644
index 0000000..0bb899c
--- /dev/null
+++ b/xbmc/video/VideoDbUrl.cpp
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2016-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 "VideoDbUrl.h"
+
+#include "filesystem/VideoDatabaseDirectory.h"
+#include "playlists/SmartPlayList.h"
+#include "utils/StringUtils.h"
+#include "utils/Variant.h"
+
+using namespace XFILE;
+
+CVideoDbUrl::CVideoDbUrl()
+ : CDbUrl()
+{ }
+
+CVideoDbUrl::~CVideoDbUrl() = default;
+
+bool CVideoDbUrl::parse()
+{
+ // the URL must start with videodb://
+ if (!m_url.IsProtocol("videodb") || m_url.GetFileName().empty())
+ return false;
+
+ std::string path = m_url.Get();
+ VIDEODATABASEDIRECTORY::NODE_TYPE dirType = CVideoDatabaseDirectory::GetDirectoryType(path);
+ VIDEODATABASEDIRECTORY::NODE_TYPE childType = CVideoDatabaseDirectory::GetDirectoryChildType(path);
+
+ switch (dirType)
+ {
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS:
+ m_type = "movies";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_INPROGRESS_TVSHOWS:
+ m_type = "tvshows";
+ break;
+
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_OVERVIEW:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM:
+ m_type = "musicvideos";
+
+ default:
+ break;
+ }
+
+ switch (childType)
+ {
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES:
+ m_type = "movies";
+ m_itemType = "movies";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_INPROGRESS_TVSHOWS:
+ m_type = "tvshows";
+ m_itemType = "tvshows";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS:
+ m_type = "tvshows";
+ m_itemType = "seasons";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES:
+ m_type = "tvshows";
+ m_itemType = "episodes";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_OVERVIEW:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS:
+ m_type = "musicvideos";
+ m_itemType = "musicvideos";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_GENRE:
+ m_itemType = "genres";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_ACTOR:
+ m_itemType = "actors";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_YEAR:
+ m_itemType = "years";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_DIRECTOR:
+ m_itemType = "directors";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_STUDIO:
+ m_itemType = "studios";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_COUNTRY:
+ m_itemType = "countries";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS:
+ m_itemType = "sets";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM:
+ m_type = "musicvideos";
+ m_itemType = "albums";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_TAGS:
+ m_itemType = "tags";
+ break;
+
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_ROOT:
+ case VIDEODATABASEDIRECTORY::NODE_TYPE_OVERVIEW:
+ default:
+ return false;
+ }
+
+ if (m_type.empty() || m_itemType.empty())
+ return false;
+
+ // parse query params
+ VIDEODATABASEDIRECTORY::CQueryParams queryParams;
+ if (!CVideoDatabaseDirectory::GetQueryParams(path, queryParams))
+ return false;
+
+ // retrieve and parse all options
+ AddOptions(m_url.GetOptions());
+
+ // add options based on the QueryParams
+ if (queryParams.GetActorId() != -1)
+ {
+ std::string optionName = "actorid";
+ if (m_type == "musicvideos")
+ optionName = "artistid";
+
+ AddOption(optionName, (int)queryParams.GetActorId());
+ }
+ if (queryParams.GetAlbumId() != -1)
+ AddOption("albumid", (int)queryParams.GetAlbumId());
+ if (queryParams.GetCountryId() != -1)
+ AddOption("countryid", (int)queryParams.GetCountryId());
+ if (queryParams.GetDirectorId() != -1)
+ AddOption("directorid", (int)queryParams.GetDirectorId());
+ if (queryParams.GetEpisodeId() != -1)
+ AddOption("episodeid", (int)queryParams.GetEpisodeId());
+ if (queryParams.GetGenreId() != -1)
+ AddOption("genreid", (int)queryParams.GetGenreId());
+ if (queryParams.GetMovieId() != -1)
+ AddOption("movieid", (int)queryParams.GetMovieId());
+ if (queryParams.GetMVideoId() != -1)
+ AddOption("musicvideoid", (int)queryParams.GetMVideoId());
+ if (queryParams.GetSeason() != -1 && queryParams.GetSeason() >= -2)
+ AddOption("season", (int)queryParams.GetSeason());
+ if (queryParams.GetSetId() != -1)
+ AddOption("setid", (int)queryParams.GetSetId());
+ if (queryParams.GetStudioId() != -1)
+ AddOption("studioid", (int)queryParams.GetStudioId());
+ if (queryParams.GetTvShowId() != -1)
+ AddOption("tvshowid", (int)queryParams.GetTvShowId());
+ if (queryParams.GetYear() != -1)
+ AddOption("year", (int)queryParams.GetYear());
+
+ return true;
+}
+
+bool CVideoDbUrl::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_itemType ||
+ (xspFilter.GetType() == "movies" && m_itemType == "sets"));
+}