mirror of
https://github.com/clangen/musikcube.git
synced 2025-03-29 19:20:28 +00:00
Added "ListCatgories" functionality to ISimpleDataProvider,
LocalSimpleDataProvider, WebSocketServer, and the Android IDataProvider.
This commit is contained in:
parent
654f26f9b6
commit
016de4fed4
@ -38,6 +38,7 @@
|
||||
#include <core/debug.h>
|
||||
#include <core/db/ScopedTransaction.h>
|
||||
#include <core/library/query/local/AlbumListQuery.h>
|
||||
#include <core/library/query/local/AllCategoriesQuery.h>
|
||||
#include <core/library/query/local/AppendPlaylistQuery.h>
|
||||
#include <core/library/query/local/CategoryListQuery.h>
|
||||
#include <core/library/query/local/CategoryTrackListQuery.h>
|
||||
@ -371,6 +372,23 @@ IValueList* LocalSimpleDataProvider::QueryCategory(const char* type, const char*
|
||||
return QueryCategoryWithPredicate(type, "", -1LL, filter);
|
||||
}
|
||||
|
||||
IValueList* LocalSimpleDataProvider::ListCategories() {
|
||||
try {
|
||||
auto query = std::make_shared<AllCategoriesQuery>();
|
||||
this->library->Enqueue(query, ILibrary::QuerySynchronous);
|
||||
|
||||
if (query->GetStatus() == IQuery::Finished) {
|
||||
return query->GetSdkResult();
|
||||
}
|
||||
}
|
||||
catch (...) {
|
||||
musik::debug::err(TAG, "ListCategories failed");
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
IValueList* LocalSimpleDataProvider::QueryCategoryWithPredicate(
|
||||
const char* type, const char* predicateType, int64_t predicateId, const char* filter)
|
||||
{
|
||||
|
@ -68,6 +68,8 @@ namespace musik { namespace core { namespace db { namespace local {
|
||||
virtual musik::core::sdk::ITrackList* QueryTracksByExternalId(
|
||||
const char** externalIds, size_t externalIdCount) override;
|
||||
|
||||
virtual musik::core::sdk::IValueList* ListCategories() override;
|
||||
|
||||
virtual musik::core::sdk::IValueList*
|
||||
QueryCategory(
|
||||
const char* type,
|
||||
|
@ -62,6 +62,8 @@ namespace musik { namespace core { namespace sdk {
|
||||
virtual ITrackList* QueryTracksByExternalId(
|
||||
const char** externalIds, size_t externalIdCount) = 0;
|
||||
|
||||
virtual IValueList* ListCategories() = 0;
|
||||
|
||||
virtual IValueList* QueryCategory(
|
||||
const char* type,
|
||||
const char* filter = "") = 0;
|
||||
|
@ -21,6 +21,7 @@ class Messages {
|
||||
PlayTracks("play_tracks"),
|
||||
PlayTracksByCategory("play_tracks_by_category"),
|
||||
QueryTracks("query_tracks"),
|
||||
ListCategories("list_categories"),
|
||||
QueryTracksByCategory("query_tracks_by_category"),
|
||||
QueryTracksByExternalIds("query_tracks_by_external_ids"),
|
||||
QueryCategory("query_category"),
|
||||
|
@ -21,6 +21,8 @@ interface IDataProvider {
|
||||
fun getTracks(limit: Int, offset: Int, filter: String = ""): Observable<List<ITrack>>
|
||||
fun getTracks(externalIds: Set<String>): Observable<Map<String, ITrack>>
|
||||
|
||||
fun listCategories(): Observable<List<String>>
|
||||
|
||||
fun getTrackCountByCategory(category: String, id: Long, filter: String = ""): Observable<Int>
|
||||
fun getTrackIdsByCategory(category: String, id: Long, filter: String = ""): Observable<List<String>>
|
||||
fun getTracksByCategory(category: String, id: Long, filter: String = ""): Observable<List<ITrack>>
|
||||
|
@ -99,6 +99,17 @@ class RemoteDataProvider(private val service: WebSocketService) : IDataProvider
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
}
|
||||
|
||||
override fun listCategories(): Observable<List<String>> {
|
||||
val message = SocketMessage.Builder
|
||||
.request(Messages.Request.ListCategories)
|
||||
.build()
|
||||
|
||||
return service.observe(message, client)
|
||||
.observeOn(Schedulers.computation())
|
||||
.flatMap<List<String>> { socketMessage -> toStringList(socketMessage) }
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
}
|
||||
|
||||
override fun getTracks(filter: String): Observable<List<ITrack>> =
|
||||
getTracks(-1, -1, filter)
|
||||
|
||||
|
@ -39,6 +39,7 @@ import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
||||
import io.casey.musikcube.remote.ui.shared.util.Duration
|
||||
import io.casey.musikcube.remote.ui.shared.util.UpdateCheck
|
||||
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
|
||||
import io.reactivex.rxkotlin.subscribeBy
|
||||
|
||||
class MainActivity : BaseActivity() {
|
||||
private val handler = Handler()
|
||||
|
@ -158,6 +158,7 @@ namespace request {
|
||||
static const std::string toggle_mute = "toggle_mute";
|
||||
static const std::string get_playback_overview = "get_playback_overview";
|
||||
static const std::string get_current_time = "get_current_time";
|
||||
static const std::string list_categories = "list_categories";
|
||||
static const std::string query_category = "query_category";
|
||||
static const std::string query_tracks = "query_tracks";
|
||||
static const std::string query_tracks_by_external_ids = "query_tracks_by_external_ids";
|
||||
|
@ -352,6 +352,10 @@ void WebSocketServer::HandleRequest(connection_hdl connection, json& request) {
|
||||
RespondWithPlaybackOverview(connection, request);
|
||||
return;
|
||||
}
|
||||
else if (name == request::list_categories) {
|
||||
RespondWithListCategories(connection, request);
|
||||
return;
|
||||
}
|
||||
else if (name == request::query_category) {
|
||||
RespondWithQueryCategory(connection, request);
|
||||
return;
|
||||
@ -812,6 +816,25 @@ void WebSocketServer::RespondWithQueryTracksByCategory(connection_hdl connection
|
||||
this->RespondWithInvalidRequest(connection, request[message::name], value::invalid);
|
||||
}
|
||||
|
||||
void WebSocketServer::RespondWithListCategories(connection_hdl connection, json& request) {
|
||||
IValueList* result = context.dataProvider->ListCategories();
|
||||
|
||||
if (result != nullptr) {
|
||||
json list = json::array();
|
||||
|
||||
for (size_t i = 0; i < result->Count(); i++) {
|
||||
list[i] = GetValueString(result->GetAt(i));
|
||||
}
|
||||
|
||||
result->Release();
|
||||
|
||||
this->RespondWithOptions(connection, request, { { key::data, list } });
|
||||
}
|
||||
else {
|
||||
this->RespondWithInvalidRequest(connection, request[message::name], value::invalid);
|
||||
}
|
||||
}
|
||||
|
||||
void WebSocketServer::RespondWithQueryCategory(connection_hdl connection, json& request) {
|
||||
if (request.find(message::options) != request.end()) {
|
||||
auto& options = request[message::options];
|
||||
|
@ -142,6 +142,7 @@ class WebSocketServer {
|
||||
void RespondWithQueryAlbums(connection_hdl connection, json& request);
|
||||
void RespondWithPlayTracks(connection_hdl connection, json& request);
|
||||
void RespondWithQueryTracksByCategory(connection_hdl connection, json& request);
|
||||
void RespondWithListCategories(connection_hdl connection, json& request);
|
||||
void RespondWithQueryCategory(connection_hdl connection, json& request);
|
||||
void RespondWithPlayAllTracks(connection_hdl connection, json& request);
|
||||
void RespondWithPlayTracksByCategory(connection_hdl connection, json& request);
|
||||
|
Loading…
x
Reference in New Issue
Block a user