2 * Copyright (C) 2005-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 "VideoDatabaseDirectory.h"
22 #include "utils/URIUtils.h"
23 #include "VideoDatabaseDirectory/QueryParams.h"
24 #include "video/VideoDatabase.h"
25 #include "guilib/TextureManager.h"
28 #include "settings/Settings.h"
29 #include "utils/Crc32.h"
30 #include "guilib/LocalizeStrings.h"
31 #include "utils/LegacyPathTranslation.h"
32 #include "utils/log.h"
33 #include "utils/StringUtils.h"
36 using namespace XFILE;
37 using namespace VIDEODATABASEDIRECTORY;
39 CVideoDatabaseDirectory::CVideoDatabaseDirectory(void)
43 CVideoDatabaseDirectory::~CVideoDatabaseDirectory(void)
47 bool CVideoDatabaseDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items)
49 CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strPath);
51 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path));
56 bool bResult = pNode->GetChilds(items);
57 for (int i=0;i<items.Size();++i)
59 CFileItemPtr item = items[i];
60 if (item->m_bIsFolder && !item->HasIcon() && !item->HasArt("thumb"))
62 CStdString strImage = GetIcon(item->GetPath());
63 if (!strImage.IsEmpty() && g_TextureManager.HasTexture(strImage))
64 item->SetIconImage(strImage);
67 items.SetLabel(pNode->GetLocalizedName());
72 NODE_TYPE CVideoDatabaseDirectory::GetDirectoryChildType(const CStdString& strPath)
74 CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strPath);
75 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path));
78 return NODE_TYPE_NONE;
80 return pNode->GetChildType();
83 NODE_TYPE CVideoDatabaseDirectory::GetDirectoryType(const CStdString& strPath)
85 CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strPath);
86 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path));
89 return NODE_TYPE_NONE;
91 return pNode->GetType();
94 NODE_TYPE CVideoDatabaseDirectory::GetDirectoryParentType(const CStdString& strPath)
96 CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strPath);
97 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path));
100 return NODE_TYPE_NONE;
102 CDirectoryNode* pParentNode=pNode->GetParent();
105 return NODE_TYPE_NONE;
107 return pParentNode->GetChildType();
110 bool CVideoDatabaseDirectory::GetQueryParams(const CStdString& strPath, CQueryParams& params)
112 CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strPath);
113 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path));
118 CDirectoryNode::GetDatabaseInfo(strPath,params);
122 void CVideoDatabaseDirectory::ClearDirectoryCache(const CStdString& strDirectory)
124 CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strDirectory);
125 URIUtils::RemoveSlashAtEnd(path);
128 crc.ComputeFromLowerCase(path);
130 CStdString strFileName;
131 strFileName.Format("special://temp/%08x.fi", (unsigned __int32) crc);
132 CFile::Delete(strFileName);
135 bool CVideoDatabaseDirectory::IsAllItem(const CStdString& strDirectory)
137 if (StringUtils::EndsWith(strDirectory, "/-1/"))
142 bool CVideoDatabaseDirectory::GetLabel(const CStdString& strDirectory, CStdString& strLabel)
146 CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strDirectory);
147 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path));
148 if (!pNode.get() || path.IsEmpty())
151 // first see if there's any filter criteria
153 CDirectoryNode::GetDatabaseInfo(path, params);
155 CVideoDatabase videodatabase;
156 if (!videodatabase.Open())
160 if (params.GetGenreId() != -1)
161 strLabel += videodatabase.GetGenreById(params.GetGenreId());
164 if (params.GetCountryId() != -1)
165 strLabel += videodatabase.GetCountryById(params.GetCountryId());
168 if (params.GetSetId() != -1)
169 strLabel += videodatabase.GetSetById(params.GetSetId());
172 if (params.GetTagId() != -1)
173 strLabel += videodatabase.GetTagById(params.GetTagId());
176 if (params.GetYear() != -1)
179 strTemp.Format("%i",params.GetYear());
180 if (!strLabel.IsEmpty())
185 if (strLabel.IsEmpty())
187 switch (pNode->GetChildType())
189 case NODE_TYPE_TITLE_MOVIES:
190 case NODE_TYPE_TITLE_TVSHOWS:
191 case NODE_TYPE_TITLE_MUSICVIDEOS:
192 strLabel = g_localizeStrings.Get(369); break;
193 case NODE_TYPE_ACTOR: // Actor
194 strLabel = g_localizeStrings.Get(344); break;
195 case NODE_TYPE_GENRE: // Genres
196 strLabel = g_localizeStrings.Get(135); break;
197 case NODE_TYPE_COUNTRY: // Countries
198 strLabel = g_localizeStrings.Get(20451); break;
199 case NODE_TYPE_YEAR: // Year
200 strLabel = g_localizeStrings.Get(562); break;
201 case NODE_TYPE_DIRECTOR: // Director
202 strLabel = g_localizeStrings.Get(20348); break;
203 case NODE_TYPE_SETS: // Sets
204 strLabel = g_localizeStrings.Get(20434); break;
205 case NODE_TYPE_TAGS: // Tags
206 strLabel = g_localizeStrings.Get(20459); break;
207 case NODE_TYPE_MOVIES_OVERVIEW: // Movies
208 strLabel = g_localizeStrings.Get(342); break;
209 case NODE_TYPE_TVSHOWS_OVERVIEW: // TV Shows
210 strLabel = g_localizeStrings.Get(20343); break;
211 case NODE_TYPE_RECENTLY_ADDED_MOVIES: // Recently Added Movies
212 strLabel = g_localizeStrings.Get(20386); break;
213 case NODE_TYPE_RECENTLY_ADDED_EPISODES: // Recently Added Episodes
214 strLabel = g_localizeStrings.Get(20387); break;
215 case NODE_TYPE_STUDIO: // Studios
216 strLabel = g_localizeStrings.Get(20388); break;
217 case NODE_TYPE_MUSICVIDEOS_OVERVIEW: // Music Videos
218 strLabel = g_localizeStrings.Get(20389); break;
219 case NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS: // Recently Added Music Videos
220 strLabel = g_localizeStrings.Get(20390); break;
221 case NODE_TYPE_SEASONS: // Seasons
222 strLabel = g_localizeStrings.Get(33054); break;
223 case NODE_TYPE_EPISODES: // Episodes
224 strLabel = g_localizeStrings.Get(20360); break;
226 CLog::Log(LOGWARNING, "%s - Unknown nodetype requested %d", __FUNCTION__, pNode->GetChildType());
234 CStdString CVideoDatabaseDirectory::GetIcon(const CStdString &strDirectory)
236 CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strDirectory);
237 switch (GetDirectoryChildType(path))
239 case NODE_TYPE_TITLE_MOVIES:
240 if (path.Equals("videodb://movies/titles/"))
242 if (CSettings::Get().GetBool("myvideos.flatten"))
243 return "DefaultMovies.png";
244 return "DefaultMovieTitle.png";
247 case NODE_TYPE_TITLE_TVSHOWS:
248 if (path.Equals("videodb://tvshows/titles/"))
250 if (CSettings::Get().GetBool("myvideos.flatten"))
251 return "DefaultTVShows.png";
252 return "DefaultTVShowTitle.png";
255 case NODE_TYPE_TITLE_MUSICVIDEOS:
256 if (path.Equals("videodb://musicvideos/titles/"))
258 if (CSettings::Get().GetBool("myvideos.flatten"))
259 return "DefaultMusicVideos.png";
260 return "DefaultMusicVideoTitle.png";
263 case NODE_TYPE_ACTOR: // Actor
264 return "DefaultActor.png";
265 case NODE_TYPE_GENRE: // Genres
266 return "DefaultGenre.png";
267 case NODE_TYPE_COUNTRY: // Countries
268 return "DefaultCountry.png";
269 case NODE_TYPE_SETS: // Sets
270 return "DefaultSets.png";
271 case NODE_TYPE_TAGS: // Tags
272 return "DefaultTags.png";
273 case NODE_TYPE_YEAR: // Year
274 return "DefaultYear.png";
275 case NODE_TYPE_DIRECTOR: // Director
276 return "DefaultDirector.png";
277 case NODE_TYPE_MOVIES_OVERVIEW: // Movies
278 return "DefaultMovies.png";
279 case NODE_TYPE_TVSHOWS_OVERVIEW: // TV Shows
280 return "DefaultTVShows.png";
281 case NODE_TYPE_RECENTLY_ADDED_MOVIES: // Recently Added Movies
282 return "DefaultRecentlyAddedMovies.png";
283 case NODE_TYPE_RECENTLY_ADDED_EPISODES: // Recently Added Episodes
284 return "DefaultRecentlyAddedEpisodes.png";
285 case NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS: // Recently Added Episodes
286 return "DefaultRecentlyAddedMusicVideos.png";
287 case NODE_TYPE_STUDIO: // Studios
288 return "DefaultStudios.png";
289 case NODE_TYPE_MUSICVIDEOS_OVERVIEW: // Music Videos
290 return "DefaultMusicVideos.png";
291 case NODE_TYPE_MUSICVIDEOS_ALBUM: // Music Videos - Albums
292 return "DefaultMusicAlbums.png";
294 CLog::Log(LOGWARNING, "%s - Unknown nodetype requested %s", __FUNCTION__, strDirectory.c_str());
301 bool CVideoDatabaseDirectory::ContainsMovies(const CStdString &path)
303 VIDEODATABASEDIRECTORY::NODE_TYPE type = GetDirectoryChildType(path);
304 if (type == VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES || type == VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES || type == VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS) return true;
308 bool CVideoDatabaseDirectory::Exists(const char* strPath)
310 CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strPath);
311 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path));
316 if (pNode->GetChildType() == VIDEODATABASEDIRECTORY::NODE_TYPE_NONE)
322 bool CVideoDatabaseDirectory::CanCache(const CStdString& strPath)
324 CStdString path = CLegacyPathTranslation::TranslateVideoDbPath(strPath);
325 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path));
328 return pNode->CanCache();