Code changes to make external python work in windows. Changes credit to WiSo
[vuplus_xbmc] / xbmc / interfaces / json-rpc / AudioLibrary.cpp
1 /*
2  *      Copyright (C) 2005-2010 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 "AudioLibrary.h"
23 #include "music/MusicDatabase.h"
24 #include "FileItem.h"
25 #include "Util.h"
26 #include "music/tags/MusicInfoTag.h"
27 #include "music/Song.h"
28 #include "Application.h"
29
30 using namespace MUSIC_INFO;
31 using namespace Json;
32 using namespace JSONRPC;
33
34 JSON_STATUS CAudioLibrary::GetArtists(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
35 {
36   CMusicDatabase musicdatabase;
37   if (!musicdatabase.Open())
38     return InternalError;
39
40   int genreID = parameterObject["genreid"].asInt();
41
42   // Add "artist" to "fields" array by default
43   Value param = parameterObject;
44   if (!param.isMember("fields"))
45     param["fields"] = Value(arrayValue);
46   param["fields"].append("artist");
47
48   CFileItemList items;
49   if (musicdatabase.GetArtistsNav("", items, genreID, false))
50     HandleFileItemList("artistid", false, "artists", items, param, result);
51
52   musicdatabase.Close();
53   return OK;
54 }
55
56 JSON_STATUS CAudioLibrary::GetAlbums(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
57 {
58   CMusicDatabase musicdatabase;
59   if (!musicdatabase.Open())
60     return InternalError;
61
62   int artistID = parameterObject["artistid"].asInt();
63   int genreID  = parameterObject["genreid"].asInt();
64   int start = parameterObject["limits"]["start"].asInt();
65   int end = parameterObject["limits"]["end"].asInt();
66   if (end == 0)
67     end = -1;
68
69   CFileItemList items;
70   if (musicdatabase.GetAlbumsNav("", items, genreID, artistID, start, end))
71     HandleFileItemList("albumid", false, "albums", items, parameterObject, result);
72
73   musicdatabase.Close();
74   return OK;
75 }
76
77 JSON_STATUS CAudioLibrary::GetAlbumDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
78 {
79   int albumID = parameterObject["albumid"].asInt();
80
81   CMusicDatabase musicdatabase;
82   if (!musicdatabase.Open())
83     return InternalError;
84
85   CAlbum album;
86   if (!musicdatabase.GetAlbumInfo(albumID, album, NULL))
87   {
88     musicdatabase.Close();
89     return InvalidParams;
90   }
91
92   Json::Value validFields;
93   MakeFieldsList(parameterObject, validFields);
94
95   CStdString path;
96   musicdatabase.GetAlbumPath(albumID, path);
97
98   CFileItemPtr m_albumItem( new CFileItem(path, album) );
99   m_albumItem->SetLabel(album.strAlbum);
100   CMusicDatabase::SetPropertiesFromAlbum(*m_albumItem, album);
101   m_albumItem->SetMusicThumb();
102   HandleFileItem("albumid", false, "albumdetails", m_albumItem, parameterObject, validFields, result);
103
104   musicdatabase.Close();
105   return OK;
106 }
107
108 JSON_STATUS CAudioLibrary::GetSongs(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
109 {
110   CMusicDatabase musicdatabase;
111   if (!musicdatabase.Open())
112     return InternalError;
113
114   int artistID = parameterObject["artistid"].asInt();
115   int albumID  = parameterObject["albumid"].asInt();
116   int genreID  = parameterObject["genreid"].asInt();
117
118   CFileItemList items;
119   if (musicdatabase.GetSongsNav("", items, genreID, artistID, albumID))
120     HandleFileItemList("songid", true, "songs", items, parameterObject, result);
121
122   musicdatabase.Close();
123   return OK;
124 }
125
126 JSON_STATUS CAudioLibrary::GetSongDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
127 {
128   int idSong = parameterObject["songid"].asInt();
129
130   CMusicDatabase musicdatabase;
131   if (!musicdatabase.Open())
132     return InternalError;
133
134   CSong song;
135   if (!musicdatabase.GetSongById(idSong, song))
136   {
137     musicdatabase.Close();
138     return InvalidParams;
139   }
140
141   Json::Value validFields;
142   MakeFieldsList(parameterObject, validFields);
143   HandleFileItem("songid", false, "songdetails", CFileItemPtr( new CFileItem(song) ), parameterObject, validFields, result);
144
145   musicdatabase.Close();
146   return OK;
147 }
148
149 JSON_STATUS CAudioLibrary::GetGenres(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
150 {
151   CMusicDatabase musicdatabase;
152   if (!musicdatabase.Open())
153     return InternalError;
154
155   // Add "genre" to "fields" array by default
156   Value param = parameterObject;
157   if (!param.isMember("fields"))
158     param["fields"] = Value(arrayValue);
159   param["fields"].append("genre");
160
161   CFileItemList items;
162   if (musicdatabase.GetGenresNav("", items))
163     HandleFileItemList("genreid", false, "genres", items, param, result);
164
165   musicdatabase.Close();
166   return OK;
167 }
168
169 JSON_STATUS CAudioLibrary::ScanForContent(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
170 {
171   g_application.getApplicationMessenger().ExecBuiltIn("updatelibrary(music)");
172   return ACK;
173 }
174
175 bool CAudioLibrary::FillFileItemList(const Value &parameterObject, CFileItemList &list)
176 {
177   CMusicDatabase musicdatabase;
178   bool success = false;
179
180   if (musicdatabase.Open())
181   {
182     if (parameterObject["artistid"].isInt() || parameterObject["albumid"].isInt() || parameterObject["genreid"].isInt())
183     {
184       int artistID = parameterObject.get("artistid", -1).asInt();
185       int albumID  = parameterObject.get("albumid", -1).asInt();
186       int genreID  = parameterObject.get("genreid", -1).asInt();
187
188       success = musicdatabase.GetSongsNav("", list, genreID, artistID, albumID);
189     }
190     if (parameterObject["songid"].isInt())
191     {
192       int songID = parameterObject.get("songid", -1).asInt();
193       if (songID != -1)
194       {
195         CSong song;
196         if (musicdatabase.GetSongById(songID, song))
197         {
198           list.Add(CFileItemPtr(new CFileItem(song)));
199           success = true;
200         }
201       }
202     }
203
204     musicdatabase.Close();
205   }
206
207   return success;
208 }