LinuxRendererGLES.h: correct path to `DVDVideoCodec.h`
[vuplus_xbmc] / xbmc / filesystem / VideoDatabaseDirectory.cpp
1 /*
2  *      Copyright (C) 2005-2008 Team XBMC
3  *      http://www.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, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 #include "VideoDatabaseDirectory.h"
23 #include "utils/URIUtils.h"
24 #include "VideoDatabaseDirectory/QueryParams.h"
25 #include "video/VideoDatabase.h"
26 #include "guilib/TextureManager.h"
27 #include "File.h"
28 #include "FileItem.h"
29 #include "settings/Settings.h"
30 #include "utils/Crc32.h"
31 #include "guilib/LocalizeStrings.h"
32 #include "utils/log.h"
33
34 using namespace std;
35 using namespace XFILE;
36 using namespace VIDEODATABASEDIRECTORY;
37
38 CVideoDatabaseDirectory::CVideoDatabaseDirectory(void)
39 {
40 }
41
42 CVideoDatabaseDirectory::~CVideoDatabaseDirectory(void)
43 {
44 }
45
46 bool CVideoDatabaseDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items)
47 {
48   auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
49
50   if (!pNode.get())
51     return false;
52
53   bool bResult = pNode->GetChilds(items);
54   for (int i=0;i<items.Size();++i)
55   {
56     CFileItemPtr item = items[i];
57     if (item->m_bIsFolder && !item->HasIcon() && !item->HasThumbnail())
58     {
59       CStdString strImage = GetIcon(item->m_strPath);
60       if (!strImage.IsEmpty() && g_TextureManager.HasTexture(strImage))
61         item->SetIconImage(strImage);
62     }
63   }
64
65   return bResult;
66 }
67
68 NODE_TYPE CVideoDatabaseDirectory::GetDirectoryChildType(const CStdString& strPath)
69 {
70   auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
71
72   if (!pNode.get())
73     return NODE_TYPE_NONE;
74
75   return pNode->GetChildType();
76 }
77
78 NODE_TYPE CVideoDatabaseDirectory::GetDirectoryType(const CStdString& strPath)
79 {
80   auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
81
82   if (!pNode.get())
83     return NODE_TYPE_NONE;
84
85   return pNode->GetType();
86 }
87
88 NODE_TYPE CVideoDatabaseDirectory::GetDirectoryParentType(const CStdString& strPath)
89 {
90   auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
91
92   if (!pNode.get())
93     return NODE_TYPE_NONE;
94
95   CDirectoryNode* pParentNode=pNode->GetParent();
96
97   if (!pParentNode)
98     return NODE_TYPE_NONE;
99
100   return pParentNode->GetChildType();
101 }
102
103 bool CVideoDatabaseDirectory::GetQueryParams(const CStdString& strPath, CQueryParams& params)
104 {
105   auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
106
107   if (!pNode.get())
108     return false;
109
110   CDirectoryNode::GetDatabaseInfo(strPath,params);
111   return true;
112 }
113
114 void CVideoDatabaseDirectory::ClearDirectoryCache(const CStdString& strDirectory)
115 {
116   CFileItem directory(strDirectory, true);
117   URIUtils::RemoveSlashAtEnd(directory.m_strPath);
118
119   Crc32 crc;
120   crc.ComputeFromLowerCase(directory.m_strPath);
121
122   CStdString strFileName;
123   strFileName.Format("special://temp/%08x.fi", (unsigned __int32) crc);
124   CFile::Delete(strFileName);
125 }
126
127 bool CVideoDatabaseDirectory::IsAllItem(const CStdString& strDirectory)
128 {
129   if (strDirectory.Right(4).Equals("/-1/"))
130     return true;
131   return false;
132 }
133
134 bool CVideoDatabaseDirectory::GetLabel(const CStdString& strDirectory, CStdString& strLabel)
135 {
136   strLabel = "";
137
138   auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strDirectory));
139   if (!pNode.get() || strDirectory.IsEmpty())
140     return false;
141
142   // first see if there's any filter criteria
143   CQueryParams params;
144   CDirectoryNode::GetDatabaseInfo(strDirectory, params);
145
146   CVideoDatabase videodatabase;
147   if (!videodatabase.Open())
148     return false;
149
150   // get genre
151   CStdString strTemp;
152   if (params.GetGenreId() != -1)
153   {
154     videodatabase.GetGenreById(params.GetGenreId(), strTemp);
155     strLabel += strTemp;
156   }
157
158   // get country
159   if (params.GetCountryId() != -1)
160   {
161     videodatabase.GetCountryById(params.GetCountryId(), strTemp);
162     strLabel += strTemp;
163   }
164
165   // get set
166   if (params.GetSetId() != -1)
167   {
168     videodatabase.GetSetById(params.GetSetId(), strTemp);
169     strLabel += strTemp;
170   }
171
172   // get year
173   if (params.GetYear() != -1)
174   {
175     strTemp.Format("%i",params.GetYear());
176     if (!strLabel.IsEmpty())
177       strLabel += " / ";
178     strLabel += strTemp;
179   }
180
181   if (strLabel.IsEmpty())
182   {
183     switch (pNode->GetChildType())
184     {
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;
215     default:
216       CLog::Log(LOGWARNING, "%s - Unknown nodetype requested %d", __FUNCTION__, pNode->GetChildType());
217       return false;
218     }
219   }
220
221   return true;
222 }
223
224 CStdString CVideoDatabaseDirectory::GetIcon(const CStdString &strDirectory)
225 {
226   switch (GetDirectoryChildType(strDirectory))
227   {
228   case NODE_TYPE_TITLE_MOVIES:
229     if (strDirectory.Equals("videodb://1/2/"))
230     {
231       if (g_settings.m_bMyVideoNavFlatten)
232         return "DefaultMovies.png";
233       return "DefaultMovieTitle.png";
234     }
235     return "";
236   case NODE_TYPE_TITLE_TVSHOWS:
237     if (strDirectory.Equals("videodb://2/2/"))
238     {
239       if (g_settings.m_bMyVideoNavFlatten)
240         return "DefaultTVShows.png";
241       return "DefaultTVShowTitle.png";
242     }
243     return "";
244   case NODE_TYPE_TITLE_MUSICVIDEOS:
245     if (strDirectory.Equals("videodb://3/2/"))
246     {
247       if (g_settings.m_bMyVideoNavFlatten)
248         return "DefaultMusicVideos.png";
249       return "DefaultMusicVideoTitle.png";
250     }
251     return "";
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";
278   default:
279     CLog::Log(LOGWARNING, "%s - Unknown nodetype requested %s", __FUNCTION__, strDirectory.c_str());
280     break;
281   }
282
283   return "";
284 }
285
286 bool CVideoDatabaseDirectory::ContainsMovies(const CStdString &path)
287 {
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;
290   return false;
291 }
292
293 bool CVideoDatabaseDirectory::Exists(const char* strPath)
294 {
295   auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
296
297   if (!pNode.get())
298     return false;
299
300   if (pNode->GetChildType() == VIDEODATABASEDIRECTORY::NODE_TYPE_NONE)
301     return false;
302
303   return true;
304 }
305
306 bool CVideoDatabaseDirectory::CanCache(const CStdString& strPath)
307 {
308   auto_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(strPath));
309   if (!pNode.get())
310     return false;
311   return pNode->CanCache();
312 }