diff --git a/xbmc/interfaces/json-rpc/FileItemHandler.cpp b/xbmc/interfaces/json-rpc/FileItemHandler.cpp index 4ff0166add8ba..f1036f2b93580 100644 --- a/xbmc/interfaces/json-rpc/FileItemHandler.cpp +++ b/xbmc/interfaces/json-rpc/FileItemHandler.cpp @@ -175,7 +175,7 @@ void CFileItemHandler::FillDetails(ISerializable* info, CFileItemPtr item, const } } -void CFileItemHandler::HandleFileItemList(const char *ID, bool allowFile, const char *resultname, CFileItemList &items, const CVariant ¶meterObject, CVariant &result) +void CFileItemHandler::HandleFileItemList(const char *ID, bool allowFile, const char *resultname, CFileItemList &items, const CVariant ¶meterObject, CVariant &result, bool sortLimit /* = true */) { int size = items.Size(); int start = (int)parameterObject["limits"]["start"].asInteger(); @@ -183,12 +183,19 @@ void CFileItemHandler::HandleFileItemList(const char *ID, bool allowFile, const end = (end <= 0 || end > size) ? size : end; start = start > end ? end : start; - Sort(items, parameterObject["sort"]); + if (sortLimit) + Sort(items, parameterObject["sort"]); result["limits"]["start"] = start; result["limits"]["end"] = end; result["limits"]["total"] = size; + if (!sortLimit) + { + start = 0; + end = items.Size(); + } + for (int i = start; i < end; i++) { CVariant object; diff --git a/xbmc/interfaces/json-rpc/FileItemHandler.h b/xbmc/interfaces/json-rpc/FileItemHandler.h index 3ddab51a09c6e..96aadaa594d36 100644 --- a/xbmc/interfaces/json-rpc/FileItemHandler.h +++ b/xbmc/interfaces/json-rpc/FileItemHandler.h @@ -31,7 +31,7 @@ namespace JSONRPC { protected: static void FillDetails(ISerializable* info, CFileItemPtr item, const CVariant& fields, CVariant &result); - static void HandleFileItemList(const char *ID, bool allowFile, const char *resultname, CFileItemList &items, const CVariant ¶meterObject, CVariant &result); + static void HandleFileItemList(const char *ID, bool allowFile, const char *resultname, CFileItemList &items, const CVariant ¶meterObject, CVariant &result, bool sortLimit = true); static void HandleFileItem(const char *ID, bool allowFile, const char *resultname, CFileItemPtr item, const CVariant ¶meterObject, const CVariant &validFields, CVariant &result, bool append = true); static bool FillFileItemList(const CVariant ¶meterObject, CFileItemList &list); diff --git a/xbmc/interfaces/json-rpc/VideoLibrary.cpp b/xbmc/interfaces/json-rpc/VideoLibrary.cpp index c4241b90e9075..ce28dc5ca3f55 100644 --- a/xbmc/interfaces/json-rpc/VideoLibrary.cpp +++ b/xbmc/interfaces/json-rpc/VideoLibrary.cpp @@ -35,7 +35,7 @@ JSONRPC_STATUS CVideoLibrary::GetMovies(const CStdString &method, ITransportLaye CFileItemList items; JSONRPC_STATUS ret = OK; - if (videodatabase.GetMoviesByWhere("videodb://1/", "", items)) + if ((ret = GetVideos(MediaTypeMovie, "videodb://1/", parameterObject, items, result, videodatabase)) == OK) ret = GetAdditionalMovieDetails(parameterObject, items, result, videodatabase); videodatabase.Close(); @@ -114,7 +114,8 @@ JSONRPC_STATUS CVideoLibrary::GetTVShows(const CStdString &method, ITransportLay return InternalError; CFileItemList items; - if (videodatabase.GetTvShowsNav("videodb://2/", items)) + JSONRPC_STATUS ret = OK; + if ((ret = GetVideos(MediaTypeTvShow, "videodb://2/", parameterObject, items, result, videodatabase)) == OK) { bool additionalInfo = false; for (CVariant::const_iterator_array itr = parameterObject["properties"].begin_array(); itr != parameterObject["properties"].end_array(); itr++) @@ -129,7 +130,7 @@ JSONRPC_STATUS CVideoLibrary::GetTVShows(const CStdString &method, ITransportLay for (int index = 0; index < items.Size(); index++) videodatabase.GetTvShowInfo("", *(items[index]->GetVideoInfoTag()), items[index]->GetVideoInfoTag()->m_iDbId); } - HandleFileItemList("tvshowid", true, "tvshows", items, parameterObject, result); + HandleFileItemList("tvshowid", true, "tvshows", items, parameterObject, result, false); } videodatabase.Close(); @@ -188,8 +189,9 @@ JSONRPC_STATUS CVideoLibrary::GetEpisodes(const CStdString &method, ITransportLa CStdString strPath; strPath.Format("videodb://2/2/%i/%i/", tvshowID, season); CFileItemList items; - if (videodatabase.GetEpisodesNav(strPath, items, -1, -1, -1, -1, tvshowID, season)) - GetAdditionalEpisodeDetails(parameterObject, items, result, videodatabase); + JSONRPC_STATUS ret = OK; + if ((ret = GetVideos(MediaTypeEpisode, strPath, parameterObject, items, result, videodatabase)) == OK) + ret = GetAdditionalEpisodeDetails(parameterObject, items, result, videodatabase); videodatabase.Close(); return OK; @@ -622,6 +624,19 @@ bool CVideoLibrary::FillFileItemList(const CVariant ¶meterObject, CFileItemL return false; } +JSONRPC_STATUS CVideoLibrary::GetVideos(MediaType mediaType, const CStdString &strBaseDir, const CVariant ¶meterObject, CFileItemList &items, CVariant &result, CVideoDatabase &videodatabase) +{ + SortDescription sorting; + sorting.limitStart = (int)parameterObject["limits"]["start"].asInteger(); + sorting.limitEnd = (int)parameterObject["limits"]["end"].asInteger(); + + // TODO: parse sort parameters + sorting.sortBy = SortByNone; + sorting.sortOrder = SortOrderAscending; + + return videodatabase.GetSortedVideos(mediaType, strBaseDir, sorting, items) ? OK : InternalError; +} + JSONRPC_STATUS CVideoLibrary::GetAdditionalMovieDetails(const CVariant ¶meterObject, CFileItemList &items, CVariant &result, CVideoDatabase &videodatabase) { if (!videodatabase.Open()) @@ -640,7 +655,7 @@ JSONRPC_STATUS CVideoLibrary::GetAdditionalMovieDetails(const CVariant ¶mete for (int index = 0; index < items.Size(); index++) videodatabase.GetMovieInfo("", *(items[index]->GetVideoInfoTag()), items[index]->GetVideoInfoTag()->m_iDbId); } - HandleFileItemList("movieid", true, "movies", items, parameterObject, result); + HandleFileItemList("movieid", true, "movies", items, parameterObject, result, false); return OK; } @@ -663,7 +678,7 @@ JSONRPC_STATUS CVideoLibrary::GetAdditionalEpisodeDetails(const CVariant ¶me for (int index = 0; index < items.Size(); index++) videodatabase.GetEpisodeInfo("", *(items[index]->GetVideoInfoTag()), items[index]->GetVideoInfoTag()->m_iDbId); } - HandleFileItemList("episodeid", true, "episodes", items, parameterObject, result); + HandleFileItemList("episodeid", true, "episodes", items, parameterObject, result, false); return OK; } diff --git a/xbmc/interfaces/json-rpc/VideoLibrary.h b/xbmc/interfaces/json-rpc/VideoLibrary.h index 044d97a186f11..b39a66adec369 100644 --- a/xbmc/interfaces/json-rpc/VideoLibrary.h +++ b/xbmc/interfaces/json-rpc/VideoLibrary.h @@ -20,6 +20,7 @@ * */ +#include "utils/DatabaseUtils.h" #include "utils/StdString.h" #include "JSONRPC.h" #include "FileItemHandler.h" @@ -69,6 +70,7 @@ namespace JSONRPC static bool FillFileItemList(const CVariant ¶meterObject, CFileItemList &list); private: + static JSONRPC_STATUS GetVideos(MediaType mediaType, const CStdString &strBaseDir, const CVariant ¶meterObject, CFileItemList &items, CVariant &result, CVideoDatabase &videodatabase); static JSONRPC_STATUS GetAdditionalMovieDetails(const CVariant ¶meterObject, CFileItemList &items, CVariant &result, CVideoDatabase &videodatabase); static JSONRPC_STATUS GetAdditionalEpisodeDetails(const CVariant ¶meterObject, CFileItemList &items, CVariant &result, CVideoDatabase &videodatabase); static JSONRPC_STATUS GetAdditionalMusicVideoDetails(const CVariant ¶meterObject, CFileItemList &items, CVariant &result, CVideoDatabase &videodatabase);