2 * Copyright (C) 2005-2008 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, write to
17 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18 * http://www.gnu.org/copyleft/gpl.html
22 #include "VideoDatabaseDirectory.h"
23 #include "utils/URIUtils.h"
24 #include "VideoDatabaseDirectory/QueryParams.h"
25 #include "video/VideoDatabase.h"
26 #include "guilib/TextureManager.h"
29 #include "settings/Settings.h"
30 #include "utils/Crc32.h"
31 #include "guilib/LocalizeStrings.h"
32 #include "utils/log.h"
35 using namespace XFILE;
36 using namespace VIDEODATABASEDIRECTORY;
38 CVideoDatabaseDirectory::CVideoDatabaseDirectory(void)
42 CVideoDatabaseDirectory::~CVideoDatabaseDirectory(void)
46 bool CVideoDatabaseDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items)
48 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
53 bool bResult = pNode->GetChilds(items);
54 for (int i=0;i<items.Size();++i)
56 CFileItemPtr item = items[i];
57 if (item->m_bIsFolder && !item->HasIcon() && !item->HasThumbnail())
59 CStdString strImage = GetIcon(item->m_strPath);
60 if (!strImage.IsEmpty() && g_TextureManager.HasTexture(strImage))
61 item->SetIconImage(strImage);
68 NODE_TYPE CVideoDatabaseDirectory::GetDirectoryChildType(const CStdString& strPath)
70 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
73 return NODE_TYPE_NONE;
75 return pNode->GetChildType();
78 NODE_TYPE CVideoDatabaseDirectory::GetDirectoryType(const CStdString& strPath)
80 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
83 return NODE_TYPE_NONE;
85 return pNode->GetType();
88 NODE_TYPE CVideoDatabaseDirectory::GetDirectoryParentType(const CStdString& strPath)
90 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
93 return NODE_TYPE_NONE;
95 CDirectoryNode* pParentNode=pNode->GetParent();
98 return NODE_TYPE_NONE;
100 return pParentNode->GetChildType();
103 bool CVideoDatabaseDirectory::GetQueryParams(const CStdString& strPath, CQueryParams& params)
105 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
110 CDirectoryNode::GetDatabaseInfo(strPath,params);
114 void CVideoDatabaseDirectory::ClearDirectoryCache(const CStdString& strDirectory)
116 CFileItem directory(strDirectory, true);
117 URIUtils::RemoveSlashAtEnd(directory.m_strPath);
120 crc.ComputeFromLowerCase(directory.m_strPath);
122 CStdString strFileName;
123 strFileName.Format("special://temp/%08x.fi", (unsigned __int32) crc);
124 CFile::Delete(strFileName);
127 bool CVideoDatabaseDirectory::IsAllItem(const CStdString& strDirectory)
129 if (strDirectory.Right(4).Equals("/-1/"))
134 bool CVideoDatabaseDirectory::GetLabel(const CStdString& strDirectory, CStdString& strLabel)
138 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strDirectory));
139 if (!pNode.get() || strDirectory.IsEmpty())
142 // first see if there's any filter criteria
144 CDirectoryNode::GetDatabaseInfo(strDirectory, params);
146 CVideoDatabase videodatabase;
147 if (!videodatabase.Open())
152 if (params.GetGenreId() != -1)
154 videodatabase.GetGenreById(params.GetGenreId(), strTemp);
159 if (params.GetCountryId() != -1)
161 videodatabase.GetCountryById(params.GetCountryId(), strTemp);
166 if (params.GetSetId() != -1)
168 videodatabase.GetSetById(params.GetSetId(), strTemp);
173 if (params.GetYear() != -1)
175 strTemp.Format("%i",params.GetYear());
176 if (!strLabel.IsEmpty())
181 if (strLabel.IsEmpty())
183 switch (pNode->GetChildType())
185 case NODE_TYPE_TITLE_MOVIES:
186 case NODE_TYPE_TITLE_TVSHOWS:
187 case NODE_TYPE_TITLE_MUSICVIDEOS:
188 strLabel = g_localizeStrings.Get(369); break;
189 case NODE_TYPE_ACTOR: // Actor
190 strLabel = g_localizeStrings.Get(344); break;
191 case NODE_TYPE_GENRE: // Genres
192 strLabel = g_localizeStrings.Get(135); break;
193 case NODE_TYPE_COUNTRY: // Countries
194 strLabel = g_localizeStrings.Get(20451); break;
195 case NODE_TYPE_YEAR: // Year
196 strLabel = g_localizeStrings.Get(562); break;
197 case NODE_TYPE_DIRECTOR: // Director
198 strLabel = g_localizeStrings.Get(20348); break;
199 case NODE_TYPE_SETS: // Sets
200 strLabel = g_localizeStrings.Get(20434); break;
201 case NODE_TYPE_MOVIES_OVERVIEW: // Movies
202 strLabel = g_localizeStrings.Get(342); break;
203 case NODE_TYPE_TVSHOWS_OVERVIEW: // TV Shows
204 strLabel = g_localizeStrings.Get(20343); break;
205 case NODE_TYPE_RECENTLY_ADDED_MOVIES: // Recently Added Movies
206 strLabel = g_localizeStrings.Get(20386); break;
207 case NODE_TYPE_RECENTLY_ADDED_EPISODES: // Recently Added Episodes
208 strLabel = g_localizeStrings.Get(20387); break;
209 case NODE_TYPE_STUDIO: // Studios
210 strLabel = g_localizeStrings.Get(20388); break;
211 case NODE_TYPE_MUSICVIDEOS_OVERVIEW: // Music Videos
212 strLabel = g_localizeStrings.Get(20389); break;
213 case NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS: // Recently Added Music Videos
214 strLabel = g_localizeStrings.Get(20390); break;
216 CLog::Log(LOGWARNING, "%s - Unknown nodetype requested %d", __FUNCTION__, pNode->GetChildType());
224 CStdString CVideoDatabaseDirectory::GetIcon(const CStdString &strDirectory)
226 switch (GetDirectoryChildType(strDirectory))
228 case NODE_TYPE_TITLE_MOVIES:
229 if (strDirectory.Equals("videodb://1/2/"))
231 if (g_settings.m_bMyVideoNavFlatten)
232 return "DefaultMovies.png";
233 return "DefaultMovieTitle.png";
236 case NODE_TYPE_TITLE_TVSHOWS:
237 if (strDirectory.Equals("videodb://2/2/"))
239 if (g_settings.m_bMyVideoNavFlatten)
240 return "DefaultTVShows.png";
241 return "DefaultTVShowTitle.png";
244 case NODE_TYPE_TITLE_MUSICVIDEOS:
245 if (strDirectory.Equals("videodb://3/2/"))
247 if (g_settings.m_bMyVideoNavFlatten)
248 return "DefaultMusicVideos.png";
249 return "DefaultMusicVideoTitle.png";
252 case NODE_TYPE_ACTOR: // Actor
253 return "DefaultActor.png";
254 case NODE_TYPE_GENRE: // Genres
255 return "DefaultGenre.png";
256 case NODE_TYPE_COUNTRY: // Countries
257 return "DefaultCountry.png";
258 case NODE_TYPE_SETS: // Sets
259 return "DefaultSets.png";
260 case NODE_TYPE_YEAR: // Year
261 return "DefaultYear.png";
262 case NODE_TYPE_DIRECTOR: // Director
263 return "DefaultDirector.png";
264 case NODE_TYPE_MOVIES_OVERVIEW: // Movies
265 return "DefaultMovies.png";
266 case NODE_TYPE_TVSHOWS_OVERVIEW: // TV Shows
267 return "DefaultTVShows.png";
268 case NODE_TYPE_RECENTLY_ADDED_MOVIES: // Recently Added Movies
269 return "DefaultRecentlyAddedMovies.png";
270 case NODE_TYPE_RECENTLY_ADDED_EPISODES: // Recently Added Episodes
271 return "DefaultRecentlyAddedEpisodes.png";
272 case NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS: // Recently Added Episodes
273 return "DefaultRecentlyAddedMusicVideos.png";
274 case NODE_TYPE_STUDIO: // Studios
275 return "DefaultStudios.png";
276 case NODE_TYPE_MUSICVIDEOS_OVERVIEW: // Music Videos
277 return "DefaultMusicVideos.png";
279 CLog::Log(LOGWARNING, "%s - Unknown nodetype requested %s", __FUNCTION__, strDirectory.c_str());
286 bool CVideoDatabaseDirectory::ContainsMovies(const CStdString &path)
288 VIDEODATABASEDIRECTORY::NODE_TYPE type = GetDirectoryChildType(path);
289 if (type == VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES || type == VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES || type == VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS) return true;
293 bool CVideoDatabaseDirectory::Exists(const char* strPath)
295 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
300 if (pNode->GetChildType() == VIDEODATABASEDIRECTORY::NODE_TYPE_NONE)
306 bool CVideoDatabaseDirectory::CanCache(const CStdString& strPath)
308 auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
311 return pNode->CanCache();