[release] version bump to 13.0 beta1
[vuplus_xbmc] / xbmc / video / VideoDbUrl.cpp
1 /*
2  *      Copyright (C) 2012-2013 Team XBMC
3  *      http://xbmc.org
4  *
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)
8  *  any later version.
9  *
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.
14  *
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/>.
18  *
19  */
20
21 #include "VideoDbUrl.h"
22 #include "filesystem/VideoDatabaseDirectory.h"
23 #include "playlists/SmartPlayList.h"
24 #include "utils/StringUtils.h"
25 #include "utils/Variant.h"
26
27 using namespace std;
28 using namespace XFILE;
29
30 CVideoDbUrl::CVideoDbUrl()
31   : CDbUrl()
32 { }
33
34 CVideoDbUrl::~CVideoDbUrl()
35 { }
36
37 bool CVideoDbUrl::parse()
38 {
39   // the URL must start with videodb://
40   if (m_url.GetProtocol() != "videodb" || m_url.GetFileName().empty())
41     return false;
42
43   CStdString path = m_url.Get();
44   VIDEODATABASEDIRECTORY::NODE_TYPE dirType = CVideoDatabaseDirectory::GetDirectoryType(path);
45   VIDEODATABASEDIRECTORY::NODE_TYPE childType = CVideoDatabaseDirectory::GetDirectoryChildType(path);
46
47   switch (dirType)
48   {
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:
53       m_type = "movies";
54       break;
55
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:
61       m_type = "tvshows";
62       break;
63
64
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";
70
71     default:
72       break;
73   }
74
75   switch (childType)
76   {
77     case VIDEODATABASEDIRECTORY::NODE_TYPE_MOVIES_OVERVIEW:
78     case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES:
79     case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MOVIES:
80       m_type = "movies";
81       m_itemType = "movies";
82       break;
83
84     case VIDEODATABASEDIRECTORY::NODE_TYPE_TVSHOWS_OVERVIEW:
85     case VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_TVSHOWS:
86       m_type = "tvshows";
87       m_itemType = "tvshows";
88       break;
89
90     case VIDEODATABASEDIRECTORY::NODE_TYPE_SEASONS:
91       m_type = "tvshows";
92       m_itemType = "seasons";
93       break;
94
95     case VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES:
96     case VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_EPISODES:
97       m_type = "tvshows";
98       m_itemType = "episodes";
99       break;
100
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";
106       break;
107
108     case VIDEODATABASEDIRECTORY::NODE_TYPE_GENRE:
109       m_itemType = "genres";
110       break;
111
112     case VIDEODATABASEDIRECTORY::NODE_TYPE_ACTOR:
113       m_itemType = "actors";
114       break;
115
116     case VIDEODATABASEDIRECTORY::NODE_TYPE_YEAR:
117       m_itemType = "years";
118       break;
119
120     case VIDEODATABASEDIRECTORY::NODE_TYPE_DIRECTOR:
121       m_itemType = "directors";
122       break;
123
124     case VIDEODATABASEDIRECTORY::NODE_TYPE_STUDIO:
125       m_itemType = "studios";
126       break;
127
128     case VIDEODATABASEDIRECTORY::NODE_TYPE_COUNTRY:
129       m_itemType = "countries";
130       break;
131
132     case VIDEODATABASEDIRECTORY::NODE_TYPE_SETS:
133       m_itemType = "sets";
134       break;
135
136     case VIDEODATABASEDIRECTORY::NODE_TYPE_MUSICVIDEOS_ALBUM:
137       m_type = "musicvideos";
138       m_itemType = "albums";
139       break;
140
141     case VIDEODATABASEDIRECTORY::NODE_TYPE_TAGS:
142       m_itemType = "tags";
143       break;
144
145     case VIDEODATABASEDIRECTORY::NODE_TYPE_ROOT:
146     case VIDEODATABASEDIRECTORY::NODE_TYPE_OVERVIEW:
147     default:
148       return false;
149   }
150
151   if (m_type.empty() || m_itemType.empty())
152     return false;
153
154   // parse query params
155   VIDEODATABASEDIRECTORY::CQueryParams queryParams;
156   if (!CVideoDatabaseDirectory::GetQueryParams(path, queryParams))
157     return false;
158
159   // retrieve and parse all options
160   AddOptions(m_url.GetOptions());
161
162   // add options based on the QueryParams
163   if (queryParams.GetActorId() != -1)
164     AddOption("actorid", (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
190   return true;
191 }
192
193 bool CVideoDbUrl::validateOption(const std::string &key, const CVariant &value)
194 {
195   if (!CDbUrl::validateOption(key, value))
196     return false;
197
198   // if the value is empty it will remove the option which is ok
199   // otherwise we only care about the "filter" option here
200   if (value.empty() || !StringUtils::EqualsNoCase(key, "filter"))
201     return true;
202
203   if (!value.isString())
204     return false;
205
206   CSmartPlaylist xspFilter;
207   if (!xspFilter.LoadFromJson(value.asString()))
208     return false;
209   
210   // check if the filter playlist matches the item type
211   return (xspFilter.GetType() == m_itemType ||
212          (xspFilter.GetType() == "movies" && m_itemType == "sets"));
213 }