diff --git a/src/js/components/ArtistGrid.js b/src/js/components/ArtistGrid.js
index a5cea616..593a0d21 100755
--- a/src/js/components/ArtistGrid.js
+++ b/src/js/components/ArtistGrid.js
@@ -43,7 +43,8 @@ class ArtistGrid extends React.Component{
{ artist.name }
- {artist.followers ? artist.followers.total.toLocaleString()+' followers' : 0 followers}
+ {artist.followers ? artist.followers.total.toLocaleString()+' followers' : null}
+ {artist.albums_uris ? artist.albums_uris.length+' albums' : null}
)
diff --git a/src/js/components/GridItem.js b/src/js/components/GridItem.js
index addbd4f2..2cfe84ca 100755
--- a/src/js/components/GridItem.js
+++ b/src/js/components/GridItem.js
@@ -38,6 +38,14 @@ export default class GridItem extends React.Component{
)
break
+ case 'artist':
+ return (
+
+ { item.followers ? item.followers.total.toLocaleString()+' followers' : item.albums_uris.length+' albums' }
+
+ )
+ break
+
default:
return (
diff --git a/src/js/services/mopidy/actions.js b/src/js/services/mopidy/actions.js
index 812f7564..7c1d534b 100755
--- a/src/js/services/mopidy/actions.js
+++ b/src/js/services/mopidy/actions.js
@@ -214,25 +214,47 @@ export function getLibraryAlbums(){
/**
- * Other general actions
+ * Searching
**/
-export function getSearchResults(query, uris = null, fields = ['any']){
+export function getTrackSearchResults(query, limit = 100, uri_schemes){
return {
- type: 'MOPIDY_GET_SEARCH_RESULTS',
- query: query,
- uris: uris,
- fields: fields
+ type: 'MOPIDY_GET_TRACK_SEARCH_RESULTS',
+ query: query,
+ limit: limit,
+ uri_schemes: uri_schemes
}
}
-export function getArtistSearchResults(query){
+export function getArtistSearchResults(query, limit = 100){
return {
type: 'MOPIDY_GET_ARTIST_SEARCH_RESULTS',
- query: query
+ query: query,
+ limit: limit
}
}
+export function getAlbumSearchResults(query, limit = 100){
+ return {
+ type: 'MOPIDY_GET_ALBUM_SEARCH_RESULTS',
+ query: query,
+ limit: limit
+ }
+}
+
+export function getPlaylistSearchResults(query, limit = 100){
+ return {
+ type: 'MOPIDY_GET_PLAYLIST_SEARCH_RESULTS',
+ query: query,
+ limit: limit
+ }
+}
+
+
+/**
+ * Other general actions
+ **/
+
export function getQueueHistory(){
return {
type: 'MOPIDY_INSTRUCT',
diff --git a/src/js/services/mopidy/middleware.js b/src/js/services/mopidy/middleware.js
index 956b8a30..a716576f 100755
--- a/src/js/services/mopidy/middleware.js
+++ b/src/js/services/mopidy/middleware.js
@@ -313,23 +313,13 @@ const MopidyMiddleware = (function(){
**/
- case 'MOPIDY_GET_SEARCH_RESULTS':
- var queryObject = {};
- for( var i = 0; i < action.fields.length; i++ ){
- queryObject[action.fields[i]] = [action.query];
- }
-
- console.log({query: queryObject, uris: action.uris})
-
- instruct( socket, store, 'library.search', {query: queryObject, uris: action.uris})
- .then( response => {
-
- console.log(response)
-
+ case 'MOPIDY_GET_TRACK_SEARCH_RESULTS':
+ instruct( socket, store, 'library.search', {query: {any: [action.query]}, uris: action.uri_schemes})
+ .then( response => {
// collate all our different sources into one array
var tracks = []
for( var i = 0; i < response.length; i++ ){
- if( response[i].tracks ) tracks = [...tracks, ...response[i].tracks]
+ if( response[i].tracks ) tracks = [...tracks, ...response[i].tracks.splice(0,action.limit)]
}
store.dispatch({ type: 'SEARCH_RESULTS_LOADED', tracks: tracks });
@@ -337,7 +327,11 @@ const MopidyMiddleware = (function(){
break;
case 'MOPIDY_GET_ARTIST_SEARCH_RESULTS':
- instruct( socket, store, 'library.search', {query: {artist: [action.query]}, uris: ['local:','file:','m3u:']})
+
+ // backends that provide artist data
+ var uri_schemes = ['local:','file:','m3u:']
+
+ instruct( socket, store, 'library.search', {query: {artist: [action.query]}, uris: uri_schemes})
.then( response => {
// collate all our different sources into one array
@@ -356,7 +350,9 @@ const MopidyMiddleware = (function(){
}
}
}
- artists_uris = helpers.removeDuplicates(artists_uris)
+
+ // TODO: limit uris at the loop, rather than post loop for performance
+ artists_uris = helpers.removeDuplicates(artists_uris).splice(0, action.limit)
// load each artist
for (var i = 0; i < artists_uris.length; i++){
@@ -368,6 +364,74 @@ const MopidyMiddleware = (function(){
})
break;
+ case 'MOPIDY_GET_ALBUM_SEARCH_RESULTS':
+
+ // backends that provide artist data
+ var uri_schemes = ['local:','file:','m3u:']
+
+ instruct( socket, store, 'library.search', {query: {album: [action.query]}, uris: uri_schemes})
+ .then( response => {
+
+ // collate all our different sources into one array
+ var albums_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].album){
+ var album = response[i].tracks[j].album
+ if (album.uri){
+ albums_uris.push(album.uri)
+ }
+ }
+ }
+ }
+ }
+
+ // TODO: limit uris at the loop, rather than post loop for performance
+ albums_uris = helpers.removeDuplicates(albums_uris).splice(0, action.limit)
+
+ // load each album
+ for (var i = 0; i < albums_uris.length; i++){
+ store.dispatch(mopidyActions.getAlbum(albums_uris[i]))
+ }
+
+ // and plug in their URIs
+ store.dispatch({ type: 'SEARCH_RESULTS_LOADED', albums_uris: albums_uris })
+ })
+ break;
+
+ case 'MOPIDY_GET_PLAYLIST_SEARCH_RESULTS':
+
+ var state = store.getState()
+ if (state.ui.search_settings){
+ var uri_schemes = state.ui.search_settings.uri_schemes
+ } else {
+ var uri_schemes = state.mopidy.uri_schemes
+ }
+
+ instruct( socket, store, 'playlists.asList')
+ .then( response => {
+
+ var playlists_uris = []
+ for (var i = 0; i < response.length; i++){
+ var playlist = response[i]
+ if (playlist.name.includes(action.query) && uri_schemes.indexOf(helpers.uriSource(playlist.uri)+':') > -1){
+ playlists_uris.push(playlist.uri)
+ }
+ }
+
+ playlists_uris = playlists_uris.splice(0, action.limit)
+
+ // load each playlist
+ for (var i = 0; i < playlists_uris.length; i++){
+ store.dispatch(mopidyActions.getPlaylist(playlists_uris[i]))
+ }
+
+ // and plug in their URIs
+ store.dispatch({ type: 'SEARCH_RESULTS_LOADED', playlists_uris: playlists_uris })
+ })
+ break;
+
/**
* =============================================================== PLAYLIST(S) ==========
@@ -758,11 +822,10 @@ const MopidyMiddleware = (function(){
}
}
if (albums){
- console.log(albums)
- /*store.dispatch({
+ store.dispatch({
type: 'ALBUMS_LOADED',
albums: albums
- })*/
+ })
}
var artist = Object.assign(
diff --git a/src/js/services/ui/middleware.js b/src/js/services/ui/middleware.js
index 18506f99..572c45e0 100755
--- a/src/js/services/ui/middleware.js
+++ b/src/js/services/ui/middleware.js
@@ -113,7 +113,13 @@ const UIMiddleware = (function(){
case 'SEARCH_STARTED':
ReactGA.event({ category: 'Search', action: 'Started', label: action.type+': '+action.query })
+
var state = store.getState()
+ if (state.ui.search_settings){
+ var uri_schemes = state.ui.search_settings.uri_schemes
+ } else {
+ var uri_schemes = state.mopidy.uri_schemes
+ }
// initiate spotify searching
if (!action.only_mopidy){
@@ -124,24 +130,6 @@ const UIMiddleware = (function(){
// backend searching (mopidy)
if (state.mopidy.connected){
- if (state.ui.search_settings){
- var uri_schemes = state.ui.search_settings.uri_schemes
- } else {
- var uri_schemes = state.mopidy.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))
@@ -155,11 +143,21 @@ const UIMiddleware = (function(){
store.dispatch(mopidyActions.getAlbumSearchResults(action.query))
break
+ case 'tracks':
+ for (var i = 0; i < uri_schemes.length; i++){
+ store.dispatch(mopidyActions.getTrackSearchResults(action.query,100,[uri_schemes[i]]))
+ }
+ break
+
default:
+ store.dispatch(mopidyActions.getPlaylistSearchResults(action.query,6))
+ store.dispatch(mopidyActions.getArtistSearchResults(action.query,6))
+ store.dispatch(mopidyActions.getAlbumSearchResults(action.query,6))
+
// 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']))
+ store.dispatch(mopidyActions.getTrackSearchResults(action.query,100,[uri_schemes[i]]))
}
}
}
diff --git a/src/js/views/Search.js b/src/js/views/Search.js
index bbd828e5..b1eeb588 100755
--- a/src/js/views/Search.js
+++ b/src/js/views/Search.js
@@ -31,13 +31,12 @@ class Search extends React.Component{
componentWillReceiveProps(newProps){
- // new query
- if( this.props.params.query != newProps.params.query ){
+ if (this.props.params.query != newProps.params.query || this.props.params.type != newProps.params.type){
this.props.uiActions.startSearch(newProps.params.type, newProps.params.query)
}
// mopidy comes online
- if( !this.props.mopidy_connected && newProps.mopidy_connected ){
+ if (!this.props.mopidy_connected && newProps.mopidy_connected){
this.props.uiActions.startSearch(newProps.params.type, newProps.params.query, true)
}
}
@@ -47,6 +46,8 @@ class Search extends React.Component{
}
renderResults(){
+ var spotify_search_enabled = (this.props.search_settings && this.props.search_settings.spotify)
+
var artists = []
if (this.props.artists_uris){
for (var i = 0; i < this.props.artists_uris.length; i++){
@@ -93,7 +94,7 @@ class Search extends React.Component{
- this.loadMore('artists') }/>
+ this.loadMore('artists') }/>
)
@@ -104,7 +105,7 @@ class Search extends React.Component{
- this.loadMore('albums') }/>
+ this.loadMore('albums') }/>
)
@@ -115,7 +116,7 @@ class Search extends React.Component{
- this.loadMore('playlists') }/>
+ this.loadMore('playlists') }/>
)
@@ -126,7 +127,7 @@ class Search extends React.Component{
- this.loadMore('tracks') }/>
+ this.loadMore('tracks') }/>
)
@@ -159,7 +160,7 @@ class Search extends React.Component{
Tracks
- this.loadMore('tracks') }/>
+ this.loadMore('tracks') }/>
diff --git a/src/scss/components/_lists.scss b/src/scss/components/_lists.scss
index d123b793..c8828c43 100755
--- a/src/scss/components/_lists.scss
+++ b/src/scss/components/_lists.scss
@@ -129,6 +129,18 @@
}
}
+ &.library-local-album-list .list-item{
+ .col {
+ &.name,
+ &.artists {
+ width: 45%;
+ }
+ &.tracks_total {
+ width: 10%;
+ }
+ }
+ }
+
&.artist-list .list-item {
.col {
&.name {