2 * Copyright (C) 2012-2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
21 #include "VideoDbUrl.h"
22 #include "filesystem/VideoDatabaseDirectory.h"
23 #include "playlists/SmartPlayList.h"
24 #include "utils/StringUtils.h"
25 #include "utils/Variant.h"
28 using namespace XFILE;
30 CVideoDbUrl::CVideoDbUrl()
34 CVideoDbUrl::~CVideoDbUrl()
37 bool CVideoDbUrl::parse()
39 // the URL must start with videodb://
40 if (m_url.GetProtocol() != "videodb" || m_url.GetFileName().empty())
43 CStdString path = m_url.Get();
44 VIDEODATABASEDIRECTORY::NODE_TYPE dirType = CVideoDatabaseDirectory::GetDirectoryType(path);
45 VIDEODATABASEDIRECTORY::NODE_TYPE childType = CVideoDatabaseDirectory::GetDirectoryChildType(path);
49 case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW:
50 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES:
51 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES:
52 case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS:
56 case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW:
57 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS:
58 case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS:
59 case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES:
60 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES:
65 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_OVERVIEW:
66 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS:
67 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS:
68 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM:
69 m_type = "musicvideos";
77 case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW:
78 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES:
79 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES:
81 m_itemType = "movies";
84 case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW:
85 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS:
87 m_itemType = "tvshows";
90 case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS:
92 m_itemType = "seasons";
95 case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES:
96 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES:
98 m_itemType = "episodes";
101 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_OVERVIEW:
102 case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS:
103 case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS:
104 m_type = "musicvideos";
105 m_itemType = "musicvideos";
108 case VIDEODATABASEDIRECTORY::NODE_TYPE_GENRE:
109 m_itemType = "genres";
112 case VIDEODATABASEDIRECTORY::NODE_TYPE_ACTOR:
113 m_itemType = "actors";
116 case VIDEODATABASEDIRECTORY::NODE_TYPE_YEAR:
117 m_itemType = "years";
120 case VIDEODATABASEDIRECTORY::NODE_TYPE_DIRECTOR:
121 m_itemType = "directors";
124 case VIDEODATABASEDIRECTORY::NODE_TYPE_STUDIO:
125 m_itemType = "studios";
128 case VIDEODATABASEDIRECTORY::NODE_TYPE_COUNTRY:
129 m_itemType = "countries";
132 case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS:
136 case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM:
137 m_type = "musicvideos";
138 m_itemType = "albums";
141 case VIDEODATABASEDIRECTORY::NODE_TYPE_TAGS:
145 case VIDEODATABASEDIRECTORY::NODE_TYPE_ROOT:
146 case VIDEODATABASEDIRECTORY::NODE_TYPE_OVERVIEW:
151 if (m_type.empty() || m_itemType.empty())
154 // parse query params
155 VIDEODATABASEDIRECTORY::CQueryParams queryParams;
156 if (!CVideoDatabaseDirectory::GetQueryParams(path, queryParams))
159 // retrieve and parse all options
160 AddOptions(m_url.GetOptions());
162 // add options based on the QueryParams
163 if (queryParams.GetActorId() != -1)
165 std::string optionName = "actorid";
166 if (m_type == "musicvideos")
167 optionName = "artistid";
169 AddOption(optionName, (int)queryParams.GetActorId());
171 if (queryParams.GetAlbumId() != -1)
172 AddOption("albumid", (int)queryParams.GetAlbumId());
173 if (queryParams.GetCountryId() != -1)
174 AddOption("countryid", (int)queryParams.GetCountryId());
175 if (queryParams.GetDirectorId() != -1)
176 AddOption("directorid", (int)queryParams.GetDirectorId());
177 if (queryParams.GetEpisodeId() != -1)
178 AddOption("episodeid", (int)queryParams.GetEpisodeId());
179 if (queryParams.GetGenreId() != -1)
180 AddOption("genreid", (int)queryParams.GetGenreId());
181 if (queryParams.GetMovieId() != -1)
182 AddOption("movieid", (int)queryParams.GetMovieId());
183 if (queryParams.GetMVideoId() != -1)
184 AddOption("musicvideoid", (int)queryParams.GetMVideoId());
185 if (queryParams.GetSeason() != -1 && queryParams.GetSeason() >= -2)
186 AddOption("season", (int)queryParams.GetSeason());
187 if (queryParams.GetSetId() != -1)
188 AddOption("setid", (int)queryParams.GetSetId());
189 if (queryParams.GetStudioId() != -1)
190 AddOption("studioid", (int)queryParams.GetStudioId());
191 if (queryParams.GetTvShowId() != -1)
192 AddOption("tvshowid", (int)queryParams.GetTvShowId());
193 if (queryParams.GetYear() != -1)
194 AddOption("year", (int)queryParams.GetYear());
199 bool CVideoDbUrl::validateOption(const std::string &key, const CVariant &value)
201 if (!CDbUrl::validateOption(key, value))
204 // if the value is empty it will remove the option which is ok
205 // otherwise we only care about the "filter" option here
206 if (value.empty() || !StringUtils::EqualsNoCase(key, "filter"))
209 if (!value.isString())
212 CSmartPlaylist xspFilter;
213 if (!xspFilter.LoadFromJson(value.asString()))
216 // check if the filter playlist matches the item type
217 return (xspFilter.GetType() == m_itemType ||
218 (xspFilter.GetType() == "movies" && m_itemType == "sets"));