if (!musicdatabase.GetAlbumsNav(musicUrl.ToString(), items, genreID, artistID, CDatabase::Filter(), sorting))
return InternalError;
+ JSONRPC_STATUS ret = GetAdditionalAlbumDetails(parameterObject, items, musicdatabase);
+ if (ret != OK)
+ return ret;
+
int size = items.Size();
if (items.HasProperty("total") && items.GetProperty("total").asInteger() > size)
size = (int)items.GetProperty("total").asInteger();
if (!musicdatabase.GetAlbumPath(albumID, path))
return InternalError;
- CFileItemPtr m_albumItem;
- FillAlbumItem(album, path, m_albumItem);
- HandleFileItem("albumid", false, "albumdetails", m_albumItem, parameterObject, parameterObject["properties"], result, false);
+ CFileItemPtr albumItem;
+ FillAlbumItem(album, path, albumItem);
+
+ CFileItemList items;
+ items.Add(albumItem);
+ JSONRPC_STATUS ret = GetAdditionalAlbumDetails(parameterObject, items, musicdatabase);
+ if (ret != OK)
+ return ret;
+
+ HandleFileItem("albumid", false, "albumdetails", items[0], parameterObject, parameterObject["properties"], result, false);
return OK;
}
if (!musicdatabase.GetSongsNav(musicUrl.ToString(), items, genreID, artistID, albumID, sorting))
return InternalError;
+ JSONRPC_STATUS ret = GetAdditionalSongDetails(parameterObject, items, musicdatabase);
+ if (ret != OK)
+ return ret;
+
int size = items.Size();
if (items.HasProperty("total") && items.GetProperty("total").asInteger() > size)
size = (int)items.GetProperty("total").asInteger();
if (!musicdatabase.GetSongById(idSong, song))
return InvalidParams;
- HandleFileItem("songid", false, "songdetails", CFileItemPtr( new CFileItem(song) ), parameterObject, parameterObject["properties"], result, false);
+ CFileItemList items;
+ items.Add(CFileItemPtr(new CFileItem(song)));
+ JSONRPC_STATUS ret = GetAdditionalSongDetails(parameterObject, items, musicdatabase);
+ if (ret != OK)
+ return ret;
+
+ HandleFileItem("songid", false, "songdetails", items[0], parameterObject, parameterObject["properties"], result, false);
return OK;
}
items.Add(item);
}
+ JSONRPC_STATUS ret = GetAdditionalAlbumDetails(parameterObject, items, musicdatabase);
+ if (ret != OK)
+ return ret;
+
HandleFileItemList("albumid", false, "albums", items, parameterObject, result);
return OK;
}
if (!musicdatabase.GetRecentlyAddedAlbumSongs("musicdb://", items, (unsigned int)amount))
return InternalError;
+ JSONRPC_STATUS ret = GetAdditionalSongDetails(parameterObject, items, musicdatabase);
+ if (ret != OK)
+ return ret;
+
HandleFileItemList("songid", true, "songs", items, parameterObject, result);
return OK;
}
items.Add(item);
}
+ JSONRPC_STATUS ret = GetAdditionalAlbumDetails(parameterObject, items, musicdatabase);
+ if (ret != OK)
+ return ret;
+
HandleFileItemList("albumid", false, "albums", items, parameterObject, result);
return OK;
}
if (!musicdatabase.GetRecentlyPlayedAlbumSongs("musicdb://", items))
return InternalError;
+ JSONRPC_STATUS ret = GetAdditionalSongDetails(parameterObject, items, musicdatabase);
+ if (ret != OK)
+ return ret;
+
HandleFileItemList("songid", true, "songs", items, parameterObject, result);
return OK;
}
return ACK;
}
-bool CAudioLibrary::FillFileItem(const CStdString &strFilename, CFileItem &item)
+bool CAudioLibrary::FillFileItem(const CStdString &strFilename, CFileItem &item, const CVariant ¶meterObject /* = CVariant(CVariant::VariantTypeArray) */)
{
CMusicDatabase musicdatabase;
if (strFilename.empty() || !musicdatabase.Open())
return false;
item.SetFromAlbum(album);
+
+ CFileItemList items;
+ items.Add(CFileItemPtr(&item));
+ if (GetAdditionalAlbumDetails(parameterObject, items, musicdatabase) != OK)
+ return false;
}
else
{
return false;
item.SetFromSong(song);
+
+ CFileItemList items;
+ items.Add(CFileItemPtr(&item));
+ if (GetAdditionalSongDetails(parameterObject, items, musicdatabase) != OK)
+ return false;
}
return true;
bool success = false;
CFileItem fileItem;
- if (FillFileItem(file, fileItem))
+ if (FillFileItem(file, fileItem, parameterObject))
{
success = true;
list.Add(CFileItemPtr(new CFileItem(fileItem)));
{
item = CFileItemPtr(new CFileItem(path, album));
}
+
+JSONRPC_STATUS CAudioLibrary::GetAdditionalAlbumDetails(const CVariant ¶meterObject, CFileItemList &items, CMusicDatabase &musicdatabase)
+{
+ if (!musicdatabase.Open())
+ return InternalError;
+
+ std::set<std::string> checkProperties;
+ checkProperties.insert("genreid");
+ std::set<std::string> additionalProperties;
+ if (!CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties))
+ return OK;
+
+ for (int i = 0; i < items.Size(); i++)
+ {
+ CFileItemPtr item = items[i];
+ if (additionalProperties.find("genreid") != additionalProperties.end())
+ {
+ std::vector<int> genreids;
+ if (musicdatabase.GetGenresByAlbum(item->GetMusicInfoTag()->GetDatabaseId(), genreids))
+ {
+ CVariant genreidObj(CVariant::VariantTypeArray);
+ for (std::vector<int>::const_iterator genreid = genreids.begin(); genreid != genreids.end(); genreid++)
+ genreidObj.push_back(*genreid);
+
+ item->SetProperty("genreid", genreidObj);
+ }
+ }
+ }
+
+ return OK;
+}
+
+JSONRPC_STATUS CAudioLibrary::GetAdditionalSongDetails(const CVariant ¶meterObject, CFileItemList &items, CMusicDatabase &musicdatabase)
+{
+ if (!musicdatabase.Open())
+ return InternalError;
+
+ std::set<std::string> checkProperties;
+ checkProperties.insert("genreid");
+ std::set<std::string> additionalProperties;
+ if (!CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties))
+ return OK;
+
+ for (int i = 0; i < items.Size(); i++)
+ {
+ CFileItemPtr item = items[i];
+ if (additionalProperties.find("genreid") != additionalProperties.end())
+ {
+ std::vector<int> genreids;
+ if (musicdatabase.GetGenresBySong(item->GetMusicInfoTag()->GetDatabaseId(), genreids))
+ {
+ CVariant genreidObj(CVariant::VariantTypeArray);
+ for (std::vector<int>::const_iterator genreid = genreids.begin(); genreid != genreids.end(); genreid++)
+ genreidObj.push_back(*genreid);
+
+ item->SetProperty("genreid", genreidObj);
+ }
+ }
+ }
+
+ return OK;
+}
+
+bool CAudioLibrary::CheckForAdditionalProperties(const CVariant &properties, const std::set<std::string> &checkProperties, std::set<std::string> &foundProperties)
+{
+ if (!properties.isArray() || properties.empty())
+ return false;
+
+ std::set<std::string> checkingProperties = checkProperties;
+ for (CVariant::const_iterator_array itr = properties.begin_array(); itr != properties.end_array() && !checkingProperties.empty(); itr++)
+ {
+ if (!itr->isString())
+ continue;
+
+ std::string property = itr->asString();
+ if (checkingProperties.find(property) != checkingProperties.end())
+ {
+ checkingProperties.erase(property);
+ foundProperties.insert(property);
+ }
+ }
+
+ return !foundProperties.empty();
+}
*
*/
+#include <set>
+
#include "utils/StdString.h"
#include "JSONRPC.h"
#include "FileItemHandler.h"
+class CMusicDatabase;
+
namespace JSONRPC
{
class CAudioLibrary : public CFileItemHandler
static JSONRPC_STATUS Export(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS Clean(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
- static bool FillFileItem(const CStdString &strFilename, CFileItem &item);
+ static bool FillFileItem(const CStdString &strFilename, CFileItem &item, const CVariant ¶meterObject = CVariant(CVariant::VariantTypeArray));
static bool FillFileItemList(const CVariant ¶meterObject, CFileItemList &list);
+ static JSONRPC_STATUS GetAdditionalAlbumDetails(const CVariant ¶meterObject, CFileItemList &items, CMusicDatabase &musicdatabase);
+ static JSONRPC_STATUS GetAdditionalSongDetails(const CVariant ¶meterObject, CFileItemList &items, CMusicDatabase &musicdatabase);
+
private:
static void FillAlbumItem(const CAlbum &album, const CStdString &path, CFileItemPtr &item);
+
+ static bool CheckForAdditionalProperties(const CVariant &properties, const std::set<std::string> &checkProperties, std::set<std::string> &foundProperties);
};
}
result[field] = item->m_dateTime.GetAsLocalizedDateTime();
return true;
}
+
+ if (item->HasProperty(field))
+ {
+ result[field] = item->GetProperty(field);
+ return true;
+ }
}
return false;
else
{
CFileItem fileItem;
- if (FillFileItem(items[i], fileItem, media))
+ if (FillFileItem(items[i], fileItem, media, parameterObject))
{
if (items[i]->m_bIsFolder)
filteredDirectories.Add(CFileItemPtr(new CFileItem(fileItem)));
CFileItemPtr item = items.Get(file);
if (!URIUtils::IsUPnP(file))
- FillFileItem(item, *item.get(), parameterObject["media"].asString());
+ FillFileItem(item, *item.get(), parameterObject["media"].asString(), parameterObject);
// Check if the "properties" list exists
// and make sure it contains the "file"
return transport->Download(parameterObject["path"].asString().c_str(), result) ? OK : InvalidParams;
}
-bool CFileOperations::FillFileItem(const CFileItemPtr &originalItem, CFileItem &item, CStdString media /* = "" */)
+bool CFileOperations::FillFileItem(const CFileItemPtr &originalItem, CFileItem &item, CStdString media /* = "" */, const CVariant ¶meterObject /* = CVariant(CVariant::VariantTypeArray) */)
{
if (originalItem.get() == NULL)
return false;
if (media.Equals("video"))
status = CVideoLibrary::FillFileItem(strFilename, item);
else if (media.Equals("music"))
- status = CAudioLibrary::FillFileItem(strFilename, item);
+ status = CAudioLibrary::FillFileItem(strFilename, item, parameterObject);
if (status && item.GetLabel().empty())
{
else
{
CFileItem fileItem;
- if (FillFileItem(items[i], fileItem, media))
+ if (FillFileItem(items[i], fileItem, media, parameterObject))
list.Add(CFileItemPtr(new CFileItem(fileItem)));
else if (media == "files")
list.Add(items[i]);
static JSONRPC_STATUS PrepareDownload(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS Download(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
- static bool FillFileItem(const CFileItemPtr &originalItem, CFileItem &item, CStdString media = "");
+ static bool FillFileItem(const CFileItemPtr &originalItem, CFileItem &item, CStdString media = "", const CVariant ¶meterObject = CVariant(CVariant::VariantTypeArray));
static bool FillFileItemList(const CVariant ¶meterObject, CFileItemList &list);
};
}
#include "filesystem/File.h"
#include "PartyModeManager.h"
#include "epg/EpgInfoTag.h"
+#include "music/MusicDatabase.h"
#include "pvr/PVRManager.h"
#include "pvr/channels/PVRChannel.h"
#include "pvr/channels/PVRChannelGroupsContainer.h"
}
else
{
- if (!CAudioLibrary::FillFileItem(g_application.CurrentFile(), tmpItem))
+ if (!CAudioLibrary::FillFileItem(g_application.CurrentFile(), tmpItem, parameterObject))
{
tmpItem = CFileItem(*g_infoManager.GetCurrentSongTag());
tmpItem.SetPath(g_application.CurrentFileItem().GetPath());
else
fileItem = CFileItemPtr(new CFileItem(g_application.CurrentFileItem()));
- if (player == Video && !IsPVRChannel())
+ if (IsPVRChannel())
+ break;
+
+ if (player == Video)
{
bool additionalInfo = false;
for (CVariant::const_iterator_array itr = parameterObject["properties"].begin_array(); itr != parameterObject["properties"].end_array(); itr++)
}
}
}
+ else if (player == Audio)
+ {
+ if (fileItem->IsMusicDb())
+ {
+ CMusicDatabase musicdb;
+ CFileItemList items;
+ items.Add(fileItem);
+ CAudioLibrary::GetAdditionalSongDetails(parameterObject, items, musicdb);
+ }
+ }
break;
}
"\"theme\", \"mood\", \"style\", \"type\", \"albumlabel\","
"\"rating\", \"year\", \"musicbrainzalbumid\","
"\"musicbrainzalbumartistid\", \"fanart\", \"thumbnail\","
- "\"playcount\" ]"
+ "\"playcount\", \"genreid\" ]"
"}"
"}",
"\"Audio.Fields.Song\": {"
"\"lyrics\", \"musicbrainztrackid\", \"musicbrainzartistid\","
"\"musicbrainzalbumid\", \"musicbrainzalbumartistid\","
"\"playcount\", \"fanart\", \"thumbnail\", \"file\","
- "\"albumid\", \"lastplayed\", \"disc\" ]"
+ "\"albumid\", \"lastplayed\", \"disc\", \"genreid\" ]"
"}"
"}",
"\"Audio.Details.Base\": {"
"\"year\": { \"type\": \"integer\" },"
"\"rating\": { \"type\": \"integer\" },"
"\"musicbrainzalbumid\": { \"type\": \"string\" },"
- "\"musicbrainzalbumartistid\": { \"type\": \"string\" }"
+ "\"musicbrainzalbumartistid\": { \"type\": \"string\" },"
+ "\"genreid\": { \"$ref\": \"Array.Integer\" }"
"}"
"}",
"\"Audio.Details.Artist\": {"
"\"firstaired\", \"season\", \"episode\", \"showtitle\", \"thumbnail\", \"file\","
"\"resume\", \"artistid\", \"albumid\", \"tvshowid\", \"setid\", \"watchedepisodes\","
"\"disc\", \"tag\", \"art\", \"channel\", \"channeltype\", \"hidden\", \"locked\","
- "\"channelnumber\", \"starttime\", \"endtime\" ]"
+ "\"channelnumber\", \"starttime\", \"endtime\", \"genreid\" ]"
"}"
"}",
"\"List.Item.All\": {"
"\"runtime\", \"set\", \"showlink\", \"streamdetails\", \"top250\", \"votes\","
"\"firstaired\", \"season\", \"episode\", \"showtitle\", \"thumbnail\", \"file\","
"\"resume\", \"artistid\", \"albumid\", \"tvshowid\", \"setid\", \"watchedepisodes\","
- "\"disc\", \"tag\", \"art\", \"size\", \"lastmodified\", \"mimetype\" ]"
+ "\"disc\", \"tag\", \"art\", \"size\", \"lastmodified\", \"mimetype\", \"genreid\" ]"
"}"
"}",
"\"List.Item.File\": {"
"theme", "mood", "style", "type", "albumlabel",
"rating", "year", "musicbrainzalbumid",
"musicbrainzalbumartistid", "fanart", "thumbnail",
- "playcount" ]
+ "playcount", "genreid" ]
}
},
"Audio.Fields.Song": {
"lyrics", "musicbrainztrackid", "musicbrainzartistid",
"musicbrainzalbumid", "musicbrainzalbumartistid",
"playcount", "fanart", "thumbnail", "file",
- "albumid", "lastplayed", "disc" ]
+ "albumid", "lastplayed", "disc", "genreid" ]
}
},
"Audio.Details.Base": {
"year": { "type": "integer" },
"rating": { "type": "integer" },
"musicbrainzalbumid": { "type": "string" },
- "musicbrainzalbumartistid": { "type": "string" }
+ "musicbrainzalbumartistid": { "type": "string" },
+ "genreid": { "$ref": "Array.Integer" }
}
},
"Audio.Details.Artist": {
"firstaired", "season", "episode", "showtitle", "thumbnail", "file",
"resume", "artistid", "albumid", "tvshowid", "setid", "watchedepisodes",
"disc", "tag", "art", "channel", "channeltype", "hidden", "locked",
- "channelnumber", "starttime", "endtime" ]
+ "channelnumber", "starttime", "endtime", "genreid" ]
}
},
"List.Item.All": {
"runtime", "set", "showlink", "streamdetails", "top250", "votes",
"firstaired", "season", "episode", "showtitle", "thumbnail", "file",
"resume", "artistid", "albumid", "tvshowid", "setid", "watchedepisodes",
- "disc", "tag", "art", "size", "lastmodified", "mimetype" ]
+ "disc", "tag", "art", "size", "lastmodified", "mimetype", "genreid" ]
}
},
"List.Item.File": {
CLog::Log(LOGERROR, "%s(%i) failed", __FUNCTION__, idSong);
}
return false;
-};
+}
+
+bool CMusicDatabase::GetGenresByAlbum(int idAlbum, std::vector<int>& genres)
+{
+ try
+ {
+ CStdString strSQL = PrepareSQL("select idGenre from album_genre where idAlbum = %i ORDER BY iOrder ASC", idAlbum);
+ if (!m_pDS->query(strSQL.c_str()))
+ return false;
+ if (m_pDS->num_rows() == 0)
+ {
+ m_pDS->close();
+ return true;
+ }
+
+ while (!m_pDS->eof())
+ {
+ genres.push_back(m_pDS->fv("idGenre").get_asInt());
+ m_pDS->next();
+ }
+ m_pDS->close();
+
+ return true;
+ }
+ catch (...)
+ {
+ CLog::Log(LOGERROR, "%s(%i) failed", __FUNCTION__, idAlbum);
+ }
+ return false;
+}
+
+bool CMusicDatabase::GetGenresBySong(int idSong, std::vector<int>& genres)
+{
+ try
+ {
+ CStdString strSQL = PrepareSQL("select idGenre from song_genre where idSong = %i ORDER BY iOrder ASC", idSong);
+ if (!m_pDS->query(strSQL.c_str()))
+ return false;
+ if (m_pDS->num_rows() == 0)
+ {
+ m_pDS->close();
+ return true;
+ }
+
+ while (!m_pDS->eof())
+ {
+ genres.push_back(m_pDS->fv("idGenre").get_asInt());
+ m_pDS->next();
+ }
+ m_pDS->close();
+
+ return true;
+ }
+ catch (...)
+ {
+ CLog::Log(LOGERROR, "%s(%i) failed", __FUNCTION__, idSong);
+ }
+ return false;
+}
int CMusicDatabase::AddPath(const CStdString& strPath1)
{
bool GetSongsByArtist(int idArtist, bool includeFeatured, std::vector<long>& songs);
bool GetArtistsBySong(int idSong, bool includeFeatured, std::vector<long>& artists);
+ bool GetGenresByAlbum(int idAlbum, std::vector<int>& genres);
+ bool GetGenresBySong(int idSong, std::vector<int>& genres);
+
bool GetTop100(const CStdString& strBaseDir, CFileItemList& items);
bool GetTop100Albums(VECALBUMS& albums);
bool GetTop100AlbumSongs(const CStdString& strBaseDir, CFileItemList& item);