2 * Copyright (C) 2016-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "VideoDbUrl.h"
11 #include "filesystem/VideoDatabaseDirectory.h"
12 #include "playlists/SmartPlayList.h"
13 #include "utils/StringUtils.h"
14 #include "utils/Variant.h"
17 using namespace XFILE
;
19 CVideoDbUrl::CVideoDbUrl()
23 CVideoDbUrl::~CVideoDbUrl() = default;
25 bool CVideoDbUrl::parse()
27 // the URL must start with videodb://
28 if (!m_url
.IsProtocol("videodb") || m_url
.GetFileName().empty())
31 std::string path
= m_url
.Get();
32 VIDEODATABASEDIRECTORY::NODE_TYPE dirType
= CVideoDatabaseDirectory::GetDirectoryType(path
);
33 VIDEODATABASEDIRECTORY::NODE_TYPE childType
= CVideoDatabaseDirectory::GetDirectoryChildType(path
);
37 case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW
:
38 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES
:
39 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES
:
40 case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS
:
44 case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW
:
45 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS
:
46 case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS
:
47 case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES
:
48 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES
:
49 case VIDEODATABASEDIRECTORY::NODE_TYPE_INPROGRESS_TVSHOWS
:
54 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_OVERVIEW
:
55 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS
:
56 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS
:
57 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM
:
58 m_type
= "musicvideos";
66 case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW
:
67 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES
:
68 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES
:
70 m_itemType
= "movies";
73 case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW
:
74 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS
:
75 case VIDEODATABASEDIRECTORY::NODE_TYPE_INPROGRESS_TVSHOWS
:
77 m_itemType
= "tvshows";
80 case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS
:
82 m_itemType
= "seasons";
85 case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES
:
86 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES
:
88 m_itemType
= "episodes";
91 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_OVERVIEW
:
92 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS
:
93 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS
:
94 m_type
= "musicvideos";
95 m_itemType
= "musicvideos";
98 case VIDEODATABASEDIRECTORY::NODE_TYPE_GENRE
:
99 m_itemType
= "genres";
102 case VIDEODATABASEDIRECTORY::NODE_TYPE_ACTOR
:
103 m_itemType
= "actors";
106 case VIDEODATABASEDIRECTORY::NODE_TYPE_YEAR
:
107 m_itemType
= "years";
110 case VIDEODATABASEDIRECTORY::NODE_TYPE_DIRECTOR
:
111 m_itemType
= "directors";
114 case VIDEODATABASEDIRECTORY::NODE_TYPE_STUDIO
:
115 m_itemType
= "studios";
118 case VIDEODATABASEDIRECTORY::NODE_TYPE_COUNTRY
:
119 m_itemType
= "countries";
122 case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS
:
126 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM
:
127 m_type
= "musicvideos";
128 m_itemType
= "albums";
131 case VIDEODATABASEDIRECTORY::NODE_TYPE_TAGS
:
135 case VIDEODATABASEDIRECTORY::NODE_TYPE_VIDEOVERSIONS
:
136 m_itemType
= "videoversions";
139 case VIDEODATABASEDIRECTORY::NODE_TYPE_ROOT
:
140 case VIDEODATABASEDIRECTORY::NODE_TYPE_OVERVIEW
:
145 if (m_type
.empty() || m_itemType
.empty())
148 // parse query params
149 VIDEODATABASEDIRECTORY::CQueryParams queryParams
;
150 if (!CVideoDatabaseDirectory::GetQueryParams(path
, queryParams
))
153 // retrieve and parse all options
154 AddOptions(m_url
.GetOptions());
156 // add options based on the QueryParams
157 if (queryParams
.GetActorId() != -1)
159 std::string optionName
= "actorid";
160 if (m_type
== "musicvideos")
161 optionName
= "artistid";
163 AddOption(optionName
, (int)queryParams
.GetActorId());
165 if (queryParams
.GetAlbumId() != -1)
166 AddOption("albumid", (int)queryParams
.GetAlbumId());
167 if (queryParams
.GetCountryId() != -1)
168 AddOption("countryid", (int)queryParams
.GetCountryId());
169 if (queryParams
.GetDirectorId() != -1)
170 AddOption("directorid", (int)queryParams
.GetDirectorId());
171 if (queryParams
.GetEpisodeId() != -1)
172 AddOption("episodeid", (int)queryParams
.GetEpisodeId());
173 if (queryParams
.GetGenreId() != -1)
174 AddOption("genreid", (int)queryParams
.GetGenreId());
175 if (queryParams
.GetMovieId() != -1)
176 AddOption("movieid", (int)queryParams
.GetMovieId());
177 if (queryParams
.GetMVideoId() != -1)
178 AddOption("musicvideoid", (int)queryParams
.GetMVideoId());
179 if (queryParams
.GetSeason() != -1 && queryParams
.GetSeason() >= -2)
180 AddOption("season", (int)queryParams
.GetSeason());
181 if (queryParams
.GetSetId() != -1)
182 AddOption("setid", (int)queryParams
.GetSetId());
183 if (queryParams
.GetStudioId() != -1)
184 AddOption("studioid", (int)queryParams
.GetStudioId());
185 if (queryParams
.GetTvShowId() != -1)
186 AddOption("tvshowid", (int)queryParams
.GetTvShowId());
187 if (queryParams
.GetYear() != -1)
188 AddOption("year", (int)queryParams
.GetYear());
189 if (queryParams
.GetVideoVersionId() != -1)
190 AddOption("videoversionid", (int)queryParams
.GetVideoVersionId());
195 bool CVideoDbUrl::validateOption(const std::string
&key
, const CVariant
&value
)
197 if (!CDbUrl::validateOption(key
, value
))
200 // if the value is empty it will remove the option which is ok
201 // otherwise we only care about the "filter" option here
202 if (value
.empty() || !StringUtils::EqualsNoCase(key
, "filter"))
205 if (!value
.isString())
208 PLAYLIST::CSmartPlaylist xspFilter
;
209 if (!xspFilter
.LoadFromJson(value
.asString()))
212 // check if the filter playlist matches the item type
213 return (xspFilter
.GetType() == m_itemType
||
214 (xspFilter
.GetType() == "movies" && m_itemType
== "sets"));