[Windows] Remove redundant DirectSound error codes
[xbmc.git] / xbmc / video / VideoDbUrl.cpp
blob99db0db0b9a24a99e19aa5e49b9038c0a31cb104
1 /*
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.
7 */
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 KODI;
17 using namespace XFILE;
19 CVideoDbUrl::CVideoDbUrl()
20 : CDbUrl()
21 { }
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())
29 return false;
31 std::string path = m_url.Get();
32 VIDEODATABASEDIRECTORY::NODE_TYPE dirType = CVideoDatabaseDirectory::GetDirectoryType(path);
33 VIDEODATABASEDIRECTORY::NODE_TYPE childType = CVideoDatabaseDirectory::GetDirectoryChildType(path);
35 switch (dirType)
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:
41 m_type = "movies";
42 break;
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:
50 m_type = "tvshows";
51 break;
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";
60 default:
61 break;
64 switch (childType)
66 case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW:
67 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES:
68 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES:
69 m_type = "movies";
70 m_itemType = "movies";
71 break;
73 case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW:
74 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS:
75 case VIDEODATABASEDIRECTORY::NODE_TYPE_INPROGRESS_TVSHOWS:
76 m_type = "tvshows";
77 m_itemType = "tvshows";
78 break;
80 case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS:
81 m_type = "tvshows";
82 m_itemType = "seasons";
83 break;
85 case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES:
86 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES:
87 m_type = "tvshows";
88 m_itemType = "episodes";
89 break;
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";
96 break;
98 case VIDEODATABASEDIRECTORY::NODE_TYPE_GENRE:
99 m_itemType = "genres";
100 break;
102 case VIDEODATABASEDIRECTORY::NODE_TYPE_ACTOR:
103 m_itemType = "actors";
104 break;
106 case VIDEODATABASEDIRECTORY::NODE_TYPE_YEAR:
107 m_itemType = "years";
108 break;
110 case VIDEODATABASEDIRECTORY::NODE_TYPE_DIRECTOR:
111 m_itemType = "directors";
112 break;
114 case VIDEODATABASEDIRECTORY::NODE_TYPE_STUDIO:
115 m_itemType = "studios";
116 break;
118 case VIDEODATABASEDIRECTORY::NODE_TYPE_COUNTRY:
119 m_itemType = "countries";
120 break;
122 case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS:
123 m_itemType = "sets";
124 break;
126 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM:
127 m_type = "musicvideos";
128 m_itemType = "albums";
129 break;
131 case VIDEODATABASEDIRECTORY::NODE_TYPE_TAGS:
132 m_itemType = "tags";
133 break;
135 case VIDEODATABASEDIRECTORY::NODE_TYPE_VIDEOVERSIONS:
136 m_itemType = "videoversions";
137 break;
139 case VIDEODATABASEDIRECTORY::NODE_TYPE_ROOT:
140 case VIDEODATABASEDIRECTORY::NODE_TYPE_OVERVIEW:
141 default:
142 return false;
145 if (m_type.empty() || m_itemType.empty())
146 return false;
148 // parse query params
149 VIDEODATABASEDIRECTORY::CQueryParams queryParams;
150 if (!CVideoDatabaseDirectory::GetQueryParams(path, queryParams))
151 return false;
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());
192 return true;
195 bool CVideoDbUrl::validateOption(const std::string &key, const CVariant &value)
197 if (!CDbUrl::validateOption(key, value))
198 return false;
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"))
203 return true;
205 if (!value.isString())
206 return false;
208 PLAYLIST::CSmartPlaylist xspFilter;
209 if (!xspFilter.LoadFromJson(value.asString()))
210 return false;
212 // check if the filter playlist matches the item type
213 return (xspFilter.GetType() == m_itemType ||
214 (xspFilter.GetType() == "movies" && m_itemType == "sets"));