2 * Copyright (C) 2005-2010 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 "FileOperations.h"
23 #include "VideoLibrary.h"
24 #include "AudioLibrary.h"
25 #include "settings/Settings.h"
26 #include "MediaSource.h"
27 #include "filesystem/Directory.h"
28 #include "filesystem/File.h"
30 #include "settings/AdvancedSettings.h"
34 using namespace XFILE;
35 using namespace JSONRPC;
37 JSON_STATUS CFileOperations::GetRootDirectory(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
39 CStdString media = parameterObject["media"].asString();
40 media = media.ToLower();
42 VECSOURCES *sources = g_settings.GetSourcesFromType(media);
46 for (unsigned int i = 0; i < (unsigned int)sources->size(); i++)
47 items.Add(CFileItemPtr(new CFileItem(sources->at(i))));
49 for (unsigned int i = 0; i < (unsigned int)items.Size(); i++)
51 if (items[i]->IsSmb())
53 CURL url(items[i]->GetPath());
54 items[i]->SetPath(url.GetWithoutUserDetails());
58 CVariant param(CVariant::VariantTypeObject);
59 param["properties"] = CVariant(CVariant::VariantTypeArray);
60 param["properties"].append("file");
62 HandleFileItemList(NULL, true, "sources", items, param, result);
68 JSON_STATUS CFileOperations::GetDirectory(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
70 CStdString media = parameterObject["media"].asString();
71 media = media.ToLower();
75 CStdString strPath = parameterObject["directory"].asString();
77 CStdStringArray regexps;
78 CStdString extensions = "";
79 if (media.Equals("video"))
81 regexps = g_advancedSettings.m_videoExcludeFromListingRegExps;
82 extensions = g_settings.m_videoExtensions;
84 else if (media.Equals("music"))
86 regexps = g_advancedSettings.m_audioExcludeFromListingRegExps;
87 extensions = g_settings.m_musicExtensions;
89 else if (media.Equals("pictures"))
91 regexps = g_advancedSettings.m_pictureExcludeFromListingRegExps;
92 extensions = g_settings.m_pictureExtensions;
95 if (directory.GetDirectory(strPath, items, extensions))
97 CFileItemList filteredDirectories, filteredFiles;
98 for (unsigned int i = 0; i < (unsigned int)items.Size(); i++)
100 if (CUtil::ExcludeFileOrFolder(items[i]->GetPath(), regexps))
103 if (items[i]->IsSmb())
105 CURL url(items[i]->GetPath());
106 items[i]->SetPath(url.GetWithoutUserDetails());
109 if (items[i]->m_bIsFolder)
110 filteredDirectories.Add(items[i]);
111 else if ((media == "video" && items[i]->HasVideoInfoTag()) ||
112 (media == "music" && items[i]->HasMusicInfoTag()))
113 filteredFiles.Add(items[i]);
117 if (FillFileItem(items[i]->GetPath(), fileItem, media))
118 filteredFiles.Add(CFileItemPtr(new CFileItem(fileItem)));
122 // Check if the "properties" list exists
123 // and make sure it contains the "file"
125 CVariant param = parameterObject;
126 if (!param.isMember("properties"))
127 param["properties"] = CVariant(CVariant::VariantTypeArray);
129 bool hasFileField = false;
130 for (CVariant::const_iterator_array itr = param["properties"].begin_array(); itr != param["properties"].end_array(); itr++)
132 if (*itr == CVariant("file"))
140 param["properties"].append("file");
142 HandleFileItemList(NULL, true, "files", filteredDirectories, param, result);
143 for (unsigned int index = 0; index < result["files"].size(); index++)
145 result["files"][index]["filetype"] = "directory";
147 int count = (int)result["limits"]["total"].asInteger();
149 HandleFileItemList("id", true, "files", filteredFiles, param, result);
150 for (unsigned int index = count; index < result["files"].size(); index++)
152 result["files"][index]["filetype"] = "file";
154 count += (int)result["limits"]["total"].asInteger();
156 result["limits"]["end"] = count;
157 result["limits"]["total"] = count;
162 return InvalidParams;
165 JSON_STATUS CFileOperations::Download(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
167 return transport->Download(parameterObject["path"].asString().c_str(), result) ? OK : InvalidParams;
170 bool CFileOperations::FillFileItem(const CStdString &strFilename, CFileItem &item, CStdString media /* = "" */)
173 if (!strFilename.empty() && !CDirectory::Exists(strFilename) && CFile::Exists(strFilename))
175 if (media.Equals("video"))
176 status |= CVideoLibrary::FillFileItem(strFilename, item);
177 else if (media.Equals("music"))
178 status |= CAudioLibrary::FillFileItem(strFilename, item);
182 item = CFileItem(strFilename, false);
183 if (item.GetLabel().IsEmpty())
184 item.SetLabel(CUtil::GetTitleFromPath(strFilename, false));
193 bool CFileOperations::FillFileItemList(const CVariant ¶meterObject, CFileItemList &list)
195 if (parameterObject.isMember("directory"))
197 CStdString media = parameterObject["media"].asString();
198 media = media.ToLower();
200 CStdString strPath = parameterObject["directory"].asString();
201 if (!strPath.empty())
204 CStdString extensions = "";
205 CStdStringArray regexps;
207 if (media.Equals("video") || media.Equals("music") || media.Equals("pictures"))
209 if (media.Equals("video"))
211 regexps = g_advancedSettings.m_videoExcludeFromListingRegExps;
212 extensions = g_settings.m_videoExtensions;
214 else if (media.Equals("music"))
216 regexps = g_advancedSettings.m_audioExcludeFromListingRegExps;
217 extensions = g_settings.m_musicExtensions;
219 else if (media.Equals("pictures"))
221 regexps = g_advancedSettings.m_pictureExcludeFromListingRegExps;
222 extensions = g_settings.m_pictureExtensions;
226 CDirectory directory;
227 if (directory.GetDirectory(strPath, items, extensions))
229 items.Sort(SORT_METHOD_FILE, SORT_ORDER_ASC);
230 CFileItemList filteredDirectories;
231 for (unsigned int i = 0; i < (unsigned int)items.Size(); i++)
233 if (CUtil::ExcludeFileOrFolder(items[i]->GetPath(), regexps))
236 if (items[i]->m_bIsFolder)
237 filteredDirectories.Add(items[i]);
238 else if ((media == "video" && items[i]->HasVideoInfoTag()) ||
239 (media == "music" && items[i]->HasMusicInfoTag()))
244 if (FillFileItem(items[i]->GetPath(), fileItem, media))
245 list.Add(CFileItemPtr(new CFileItem(fileItem)));
249 if (parameterObject.isMember("recursive") && parameterObject["recursive"].isBoolean())
251 for (int i = 0; i < filteredDirectories.Size(); i++)
253 CVariant val = parameterObject;
254 val["directory"] = filteredDirectories[i]->GetPath();
255 FillFileItemList(val, list);