[PVR][Estuary] Timer settings dialog: Show client name in timer type selection dialog...
[xbmc.git] / xbmc / video / VideoDbUrl.cpp
blob0bb899c3c2973165528a2ba9ce54128b623758b5
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 XFILE;
18 CVideoDbUrl::CVideoDbUrl()
19 : CDbUrl()
20 { }
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())
28 return false;
30 std::string path = m_url.Get();
31 VIDEODATABASEDIRECTORY::NODE_TYPE dirType = CVideoDatabaseDirectory::GetDirectoryType(path);
32 VIDEODATABASEDIRECTORY::NODE_TYPE childType = CVideoDatabaseDirectory::GetDirectoryChildType(path);
34 switch (dirType)
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:
40 m_type = "movies";
41 break;
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:
49 m_type = "tvshows";
50 break;
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";
59 default:
60 break;
63 switch (childType)
65 case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW:
66 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES:
67 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES:
68 m_type = "movies";
69 m_itemType = "movies";
70 break;
72 case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW:
73 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS:
74 case VIDEODATABASEDIRECTORY::NODE_TYPE_INPROGRESS_TVSHOWS:
75 m_type = "tvshows";
76 m_itemType = "tvshows";
77 break;
79 case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS:
80 m_type = "tvshows";
81 m_itemType = "seasons";
82 break;
84 case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES:
85 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES:
86 m_type = "tvshows";
87 m_itemType = "episodes";
88 break;
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";
95 break;
97 case VIDEODATABASEDIRECTORY::NODE_TYPE_GENRE:
98 m_itemType = "genres";
99 break;
101 case VIDEODATABASEDIRECTORY::NODE_TYPE_ACTOR:
102 m_itemType = "actors";
103 break;
105 case VIDEODATABASEDIRECTORY::NODE_TYPE_YEAR:
106 m_itemType = "years";
107 break;
109 case VIDEODATABASEDIRECTORY::NODE_TYPE_DIRECTOR:
110 m_itemType = "directors";
111 break;
113 case VIDEODATABASEDIRECTORY::NODE_TYPE_STUDIO:
114 m_itemType = "studios";
115 break;
117 case VIDEODATABASEDIRECTORY::NODE_TYPE_COUNTRY:
118 m_itemType = "countries";
119 break;
121 case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS:
122 m_itemType = "sets";
123 break;
125 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM:
126 m_type = "musicvideos";
127 m_itemType = "albums";
128 break;
130 case VIDEODATABASEDIRECTORY::NODE_TYPE_TAGS:
131 m_itemType = "tags";
132 break;
134 case VIDEODATABASEDIRECTORY::NODE_TYPE_ROOT:
135 case VIDEODATABASEDIRECTORY::NODE_TYPE_OVERVIEW:
136 default:
137 return false;
140 if (m_type.empty() || m_itemType.empty())
141 return false;
143 // parse query params
144 VIDEODATABASEDIRECTORY::CQueryParams queryParams;
145 if (!CVideoDatabaseDirectory::GetQueryParams(path, queryParams))
146 return false;
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());
185 return true;
188 bool CVideoDbUrl::validateOption(const std::string &key, const CVariant &value)
190 if (!CDbUrl::validateOption(key, value))
191 return false;
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"))
196 return true;
198 if (!value.isString())
199 return false;
201 CSmartPlaylist xspFilter;
202 if (!xspFilter.LoadFromJson(value.asString()))
203 return false;
205 // check if the filter playlist matches the item type
206 return (xspFilter.GetType() == m_itemType ||
207 (xspFilter.GetType() == "movies" && m_itemType == "sets"));