Searching artists/playlists/etc

This commit is contained in:
James Barnsley
2017-03-24 16:06:49 +13:00
parent 6bf4a71bf2
commit ca91bb019a
7 changed files with 97 additions and 14 deletions

View File

@ -50,7 +50,7 @@ export default class SearchSettingsModal extends React.Component{
return ( return (
<div> <div>
<h4 className="no-bottom-padding">Advanced search settings</h4> <h4 className="no-bottom-padding">Advanced search settings</h4>
<h3 className="grey-text bottom-padding">Customise the providers used when searching</h3> <h3 className="grey-text bottom-padding">Customise the providers used when searching. Only Spotify and local backends support searching by artist, album or playlist.</h3>
<form onSubmit={e => this.handleSubmit(e)}> <form onSubmit={e => this.handleSubmit(e)}>
<div className="field checkbox white"> <div className="field checkbox white">

View File

@ -226,6 +226,13 @@ export function getSearchResults(query, uris = null, fields = ['any']){
} }
} }
export function getArtistSearchResults(query){
return {
type: 'MOPIDY_GET_ARTIST_SEARCH_RESULTS',
query: query
}
}
export function getQueueHistory(){ export function getQueueHistory(){
return { return {
type: 'MOPIDY_INSTRUCT', type: 'MOPIDY_INSTRUCT',

View File

@ -306,15 +306,26 @@ const MopidyMiddleware = (function(){
}) })
break; break;
/**
* =============================================================== SEARCHING ============
* ======================================================================================
**/
case 'MOPIDY_GET_SEARCH_RESULTS': case 'MOPIDY_GET_SEARCH_RESULTS':
var queryObject = {}; var queryObject = {};
for( var i = 0; i < action.fields.length; i++ ){ for( var i = 0; i < action.fields.length; i++ ){
queryObject[action.fields[i]] = [action.query]; queryObject[action.fields[i]] = [action.query];
} }
console.log({query: queryObject, uris: action.uris})
instruct( socket, store, 'library.search', {query: queryObject, uris: action.uris}) instruct( socket, store, 'library.search', {query: queryObject, uris: action.uris})
.then( response => { .then( response => {
console.log(response)
// collate all our different sources into one array // collate all our different sources into one array
var tracks = [] var tracks = []
for( var i = 0; i < response.length; i++ ){ for( var i = 0; i < response.length; i++ ){
@ -325,6 +336,38 @@ const MopidyMiddleware = (function(){
}) })
break; break;
case 'MOPIDY_GET_ARTIST_SEARCH_RESULTS':
instruct( socket, store, 'library.search', {query: {artist: [action.query]}, uris: ['local:','file:','m3u:']})
.then( response => {
// collate all our different sources into one array
var artists_uris = []
for (var i = 0; i < response.length; i++){
if (response[i].tracks){
for (var j = 0; j < response[i].tracks.length; j++){
if (response[i].tracks[j].artists){
for (var k = 0; k < response[i].tracks[j].artists.length; k++){
var artist = response[i].tracks[j].artists[k]
if (artist.uri){
artists_uris.push(artist.uri)
}
}
}
}
}
}
artists_uris = helpers.removeDuplicates(artists_uris)
// load each artist
for (var i = 0; i < artists_uris.length; i++){
store.dispatch(mopidyActions.getArtist(artists_uris[i]))
}
// and plug in their URIs
store.dispatch({ type: 'SEARCH_RESULTS_LOADED', artists_uris: artists_uris })
})
break;
/** /**
* =============================================================== PLAYLIST(S) ========== * =============================================================== PLAYLIST(S) ==========
@ -715,10 +758,11 @@ const MopidyMiddleware = (function(){
} }
} }
if (albums){ if (albums){
store.dispatch({ console.log(albums)
/*store.dispatch({
type: 'ALBUMS_LOADED', type: 'ALBUMS_LOADED',
albums: albums albums: albums
}) })*/
} }
var artist = Object.assign( var artist = Object.assign(
@ -734,7 +778,7 @@ const MopidyMiddleware = (function(){
type: 'ARTIST_LOADED', type: 'ARTIST_LOADED',
key: artist.uri, key: artist.uri,
artist: artist artist: artist
}); })
// load artwork from LastFM // load artwork from LastFM
if( !artist.images || artist.images.length <= 0 ){ if( !artist.images || artist.images.length <= 0 ){

View File

@ -129,7 +129,39 @@ const UIMiddleware = (function(){
} else { } else {
var uri_schemes = state.mopidy.uri_schemes var uri_schemes = state.mopidy.uri_schemes
} }
store.dispatch(mopidyActions.getSearchResults(action.query, uri_schemes))
uri_schemes.sort()
// put local backends first as they'll always be fastest
var local_backends = ['local:','m3u:','file:']
for (var i = 0; i < local_backends.length; i++){
var index = uri_schemes.indexOf(local_backends[i])
if (index > -1){
uri_schemes.splice(index,1)
uri_schemes.unshift(local_backends[i])
}
}
switch (action.search_type){
case 'playlists':
store.dispatch(mopidyActions.getPlaylistSearchResults(action.query))
break
case 'artists':
store.dispatch(mopidyActions.getArtistSearchResults(action.query))
break
case 'albums':
store.dispatch(mopidyActions.getAlbumSearchResults(action.query))
break
default:
// wrap each uri scheme in it's own search request
// this means slow backends won't hold up the whole request
for (var i = 0; i < uri_schemes.length; i++){
store.dispatch(mopidyActions.getSearchResults(action.query, [uri_schemes[i]], ['any']))
}
}
} }
next(action) next(action)

View File

@ -683,11 +683,11 @@ export default function reducer(ui = {}, action){
return Object.assign({}, ui, { return Object.assign({}, ui, {
search_results: { search_results: {
artists_more: artists_more, artists_more: artists_more,
artists_uris: artists_uris, artists_uris: helpers.removeDuplicates(artists_uris),
albums_more: albums_more, albums_more: albums_more,
albums_uris: albums_uris, albums_uris: helpers.removeDuplicates(albums_uris),
playlists_more: playlists_more, playlists_more: playlists_more,
playlists_uris: playlists_uris, playlists_uris: helpers.removeDuplicates(playlists_uris),
tracks: tracks, tracks: tracks,
tracks_more: tracks_more tracks_more: tracks_more
} }

View File

@ -265,9 +265,9 @@ class Artist extends React.Component{
const mapStateToProps = (state, ownProps) => { const mapStateToProps = (state, ownProps) => {
return { return {
artist: (state.ui.artists && typeof(state.ui.artists[ownProps.params.uri]) !== 'undefined' ? state.ui.artists[ownProps.params.uri] : false ), artist: (state.ui.artists && typeof(state.ui.artists[ownProps.params.uri]) !== 'undefined' ? state.ui.artists[ownProps.params.uri] : false ),
artists: state.ui.artists, artists: (state.ui.artists ? state.ui.artists : []),
library_artists: state.ui.library_artists, library_artists: (state.ui.library_artists ? state.ui.library_artists : []),
albums: state.ui.albums, albums: (state.ui.albums ? state.ui.albums : []),
spotify_authorized: state.spotify.authorized, spotify_authorized: state.spotify.authorized,
mopidy_connected: state.mopidy.connected mopidy_connected: state.mopidy.connected
} }

View File

@ -221,13 +221,13 @@ const mapStateToProps = (state, ownProps) => {
search_settings: (state.ui.search_settings ? state.ui.search_settings : null), search_settings: (state.ui.search_settings ? state.ui.search_settings : null),
tracks: (state.ui.search_results ? state.ui.search_results.tracks : []), tracks: (state.ui.search_results ? state.ui.search_results.tracks : []),
tracks_more: (state.ui.search_results && state.ui.search_results.tracks_more ? state.ui.search_results.tracks_more : null), tracks_more: (state.ui.search_results && state.ui.search_results.tracks_more ? state.ui.search_results.tracks_more : null),
artists: state.ui.artists, artists: (state.ui.artists ? state.ui.artists : []),
artists_uris: (state.ui.search_results ? state.ui.search_results.artists_uris : []), artists_uris: (state.ui.search_results ? state.ui.search_results.artists_uris : []),
artists_more: (state.ui.search_results ? state.ui.search_results.artists_more : null), artists_more: (state.ui.search_results ? state.ui.search_results.artists_more : null),
albums: state.ui.albums, albums: (state.ui.albums ? state.ui.albums : []),
albums_uris: (state.ui.search_results ? state.ui.search_results.albums_uris : []), albums_uris: (state.ui.search_results ? state.ui.search_results.albums_uris : []),
albums_more: (state.ui.search_results ? state.ui.search_results.albums_more : null), albums_more: (state.ui.search_results ? state.ui.search_results.albums_more : null),
playlists: state.ui.playlists, playlists: (state.ui.playlists ? state.ui.playlists : []),
playlists_uris: (state.ui.search_results ? state.ui.search_results.playlists_uris : []), playlists_uris: (state.ui.search_results ? state.ui.search_results.playlists_uris : []),
playlists_more: (state.ui.search_results ? state.ui.search_results.playlists_more : null) playlists_more: (state.ui.search_results ? state.ui.search_results.playlists_more : null)
} }