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"
16 using namespace XFILE
;
18 CVideoDbUrl::CVideoDbUrl()
22 CVideoDbUrl::~CVideoDbUrl() = default;
24 bool CVideoDbUrl::parse()
26 // the URL must start with videodb://
27 if (!m_url
.IsProtocol("videodb") || m_url
.GetFileName().empty())
30 std::string path
= m_url
.Get();
31 VIDEODATABASEDIRECTORY::NODE_TYPE dirType
= CVideoDatabaseDirectory::GetDirectoryType(path
);
32 VIDEODATABASEDIRECTORY::NODE_TYPE childType
= CVideoDatabaseDirectory::GetDirectoryChildType(path
);
36 case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW
:
37 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES
:
38 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES
:
39 case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS
:
43 case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW
:
44 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS
:
45 case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS
:
46 case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES
:
47 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES
:
48 case VIDEODATABASEDIRECTORY::NODE_TYPE_INPROGRESS_TVSHOWS
:
53 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_OVERVIEW
:
54 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS
:
55 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS
:
56 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM
:
57 m_type
= "musicvideos";
65 case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW
:
66 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES
:
67 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES
:
69 m_itemType
= "movies";
72 case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW
:
73 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS
:
74 case VIDEODATABASEDIRECTORY::NODE_TYPE_INPROGRESS_TVSHOWS
:
76 m_itemType
= "tvshows";
79 case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS
:
81 m_itemType
= "seasons";
84 case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES
:
85 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES
:
87 m_itemType
= "episodes";
90 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_OVERVIEW
:
91 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS
:
92 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS
:
93 m_type
= "musicvideos";
94 m_itemType
= "musicvideos";
97 case VIDEODATABASEDIRECTORY::NODE_TYPE_GENRE
:
98 m_itemType
= "genres";
101 case VIDEODATABASEDIRECTORY::NODE_TYPE_ACTOR
:
102 m_itemType
= "actors";
105 case VIDEODATABASEDIRECTORY::NODE_TYPE_YEAR
:
106 m_itemType
= "years";
109 case VIDEODATABASEDIRECTORY::NODE_TYPE_DIRECTOR
:
110 m_itemType
= "directors";
113 case VIDEODATABASEDIRECTORY::NODE_TYPE_STUDIO
:
114 m_itemType
= "studios";
117 case VIDEODATABASEDIRECTORY::NODE_TYPE_COUNTRY
:
118 m_itemType
= "countries";
121 case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS
:
125 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM
:
126 m_type
= "musicvideos";
127 m_itemType
= "albums";
130 case VIDEODATABASEDIRECTORY::NODE_TYPE_TAGS
:
134 case VIDEODATABASEDIRECTORY::NODE_TYPE_ROOT
:
135 case VIDEODATABASEDIRECTORY::NODE_TYPE_OVERVIEW
:
140 if (m_type
.empty() || m_itemType
.empty())
143 // parse query params
144 VIDEODATABASEDIRECTORY::CQueryParams queryParams
;
145 if (!CVideoDatabaseDirectory::GetQueryParams(path
, queryParams
))
148 // retrieve and parse all options
149 AddOptions(m_url
.GetOptions());
151 // add options based on the QueryParams
152 if (queryParams
.GetActorId() != -1)
154 std::string optionName
= "actorid";
155 if (m_type
== "musicvideos")
156 optionName
= "artistid";
158 AddOption(optionName
, (int)queryParams
.GetActorId());
160 if (queryParams
.GetAlbumId() != -1)
161 AddOption("albumid", (int)queryParams
.GetAlbumId());
162 if (queryParams
.GetCountryId() != -1)
163 AddOption("countryid", (int)queryParams
.GetCountryId());
164 if (queryParams
.GetDirectorId() != -1)
165 AddOption("directorid", (int)queryParams
.GetDirectorId());
166 if (queryParams
.GetEpisodeId() != -1)
167 AddOption("episodeid", (int)queryParams
.GetEpisodeId());
168 if (queryParams
.GetGenreId() != -1)
169 AddOption("genreid", (int)queryParams
.GetGenreId());
170 if (queryParams
.GetMovieId() != -1)
171 AddOption("movieid", (int)queryParams
.GetMovieId());
172 if (queryParams
.GetMVideoId() != -1)
173 AddOption("musicvideoid", (int)queryParams
.GetMVideoId());
174 if (queryParams
.GetSeason() != -1 && queryParams
.GetSeason() >= -2)
175 AddOption("season", (int)queryParams
.GetSeason());
176 if (queryParams
.GetSetId() != -1)
177 AddOption("setid", (int)queryParams
.GetSetId());
178 if (queryParams
.GetStudioId() != -1)
179 AddOption("studioid", (int)queryParams
.GetStudioId());
180 if (queryParams
.GetTvShowId() != -1)
181 AddOption("tvshowid", (int)queryParams
.GetTvShowId());
182 if (queryParams
.GetYear() != -1)
183 AddOption("year", (int)queryParams
.GetYear());
188 bool CVideoDbUrl::validateOption(const std::string
&key
, const CVariant
&value
)
190 if (!CDbUrl::validateOption(key
, value
))
193 // if the value is empty it will remove the option which is ok
194 // otherwise we only care about the "filter" option here
195 if (value
.empty() || !StringUtils::EqualsNoCase(key
, "filter"))
198 if (!value
.isString())
201 CSmartPlaylist xspFilter
;
202 if (!xspFilter
.LoadFromJson(value
.asString()))
205 // check if the filter playlist matches the item type
206 return (xspFilter
.GetType() == m_itemType
||
207 (xspFilter
.GetType() == "movies" && m_itemType
== "sets"));