Google as new provider (using Mopidy core), starting #266
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -98,7 +98,7 @@
|
||||
|
||||
// Release details
|
||||
// These are automatically injected to built HTML
|
||||
var build = "1539629912";
|
||||
var build = "1539675069";
|
||||
var version = "3.28.1";
|
||||
|
||||
// Construct the script tag
|
||||
|
||||
12
src/js/bootstrap.js
vendored
12
src/js/bootstrap.js
vendored
@ -10,6 +10,7 @@ import mopidy from './services/mopidy/reducer';
|
||||
import lastfm from './services/lastfm/reducer';
|
||||
import spotify from './services/spotify/reducer';
|
||||
import snapcast from './services/snapcast/reducer';
|
||||
import google from './services/google/reducer';
|
||||
import genius from './services/genius/reducer';
|
||||
|
||||
import thunk from 'redux-thunk';
|
||||
@ -20,6 +21,7 @@ import mopidyMiddleware from './services/mopidy/middleware';
|
||||
import lastfmMiddleware from './services/lastfm/middleware';
|
||||
import geniusMiddleware from './services/genius/middleware';
|
||||
import spotifyMiddleware from './services/spotify/middleware';
|
||||
import googleMiddleware from './services/google/middleware';
|
||||
import snapcastMiddleware from './services/snapcast/middleware';
|
||||
import localstorageMiddleware from './services/localstorage/middleware';
|
||||
|
||||
@ -59,8 +61,8 @@ var initialState = {
|
||||
progress: 0,
|
||||
play_state: null,
|
||||
uri_schemes: [],
|
||||
library_albums_uris: 'local:directory?type=album',
|
||||
library_artists_uris: 'local:directory?type=artist'
|
||||
library_albums_uri: 'local:directory?type=album',
|
||||
library_artists_uri: 'local:directory?type=artist'
|
||||
},
|
||||
pusher: {
|
||||
connected: false,
|
||||
@ -84,6 +86,9 @@ var initialState = {
|
||||
autocomplete_results: {},
|
||||
authorization_url: 'https://jamesbarnsley.co.nz/iris/auth_spotify.php'
|
||||
},
|
||||
google: {
|
||||
enabled: false
|
||||
},
|
||||
snapcast: {
|
||||
streams: {},
|
||||
groups: {},
|
||||
@ -101,6 +106,7 @@ initialState.pusher = Object.assign({}, initialState.pusher, helpers.getStorage(
|
||||
initialState.spotify = Object.assign({}, initialState.spotify, helpers.getStorage('spotify'));
|
||||
initialState.lastfm = Object.assign({}, initialState.lastfm, helpers.getStorage('lastfm'));
|
||||
initialState.genius = Object.assign({}, initialState.genius, helpers.getStorage('genius'));
|
||||
initialState.google = Object.assign({}, initialState.google, helpers.getStorage('google'));
|
||||
initialState.snapcast = Object.assign({}, initialState.snapcast, helpers.getStorage('snapcast'));
|
||||
|
||||
console.log('Bootstrapping', initialState);
|
||||
@ -113,6 +119,7 @@ var reducers = combineReducers({
|
||||
lastfm,
|
||||
genius,
|
||||
spotify,
|
||||
google,
|
||||
snapcast
|
||||
});
|
||||
|
||||
@ -129,6 +136,7 @@ export default createStore(
|
||||
spotifyMiddleware,
|
||||
lastfmMiddleware,
|
||||
geniusMiddleware,
|
||||
googleMiddleware,
|
||||
snapcastMiddleware
|
||||
)
|
||||
);
|
||||
|
||||
13
src/js/services/google/actions.js
Executable file
13
src/js/services/google/actions.js
Executable file
@ -0,0 +1,13 @@
|
||||
|
||||
export function set(data){
|
||||
return {
|
||||
type: 'GOOGLE_SET',
|
||||
data: data
|
||||
}
|
||||
}
|
||||
|
||||
export function getLibraryArtists(){
|
||||
return {
|
||||
'type': 'GOOGLE_GET_LIBRARY_ARTISTS'
|
||||
}
|
||||
}
|
||||
38
src/js/services/google/middleware.js
Executable file
38
src/js/services/google/middleware.js
Executable file
@ -0,0 +1,38 @@
|
||||
|
||||
import ReactGA from 'react-ga'
|
||||
|
||||
var helpers = require('../../helpers');
|
||||
var coreActions = require('../core/actions');
|
||||
var mopidyActions = require('../mopidy/actions');
|
||||
var uiActions = require('../ui/actions');
|
||||
|
||||
const GoogleMiddleware = (function(){
|
||||
|
||||
// A snapcast request is an alias of the Pusher request
|
||||
const request = (store, params = null, response_callback = null, error_callback = null) => {
|
||||
store.dispatch(
|
||||
pusherActions.request(
|
||||
'snapcast_instruct',
|
||||
params,
|
||||
response_callback,
|
||||
error_callback
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
return store => next => action => {
|
||||
var google = store.getState().google;
|
||||
|
||||
switch(action.type){
|
||||
|
||||
|
||||
// This action is irrelevant to us, pass it on to the next middleware
|
||||
default:
|
||||
return next(action);
|
||||
}
|
||||
}
|
||||
|
||||
})();
|
||||
|
||||
export default GoogleMiddleware
|
||||
14
src/js/services/google/reducer.js
Executable file
14
src/js/services/google/reducer.js
Executable file
@ -0,0 +1,14 @@
|
||||
|
||||
export default function reducer(google = {}, action){
|
||||
switch (action.type){
|
||||
|
||||
case 'GOOGLE_SET':
|
||||
return Object.assign({}, google, action.data);
|
||||
|
||||
default:
|
||||
return google
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -357,9 +357,10 @@ export function getTrack(uri){
|
||||
}
|
||||
}
|
||||
|
||||
export function getLibraryArtists(){
|
||||
export function getLibraryArtists(uri = null){
|
||||
return {
|
||||
type: 'MOPIDY_GET_LIBRARY_ARTISTS'
|
||||
type: 'MOPIDY_GET_LIBRARY_ARTISTS',
|
||||
uri: uri
|
||||
}
|
||||
}
|
||||
|
||||
@ -399,9 +400,10 @@ export function getAlbums(uris, processor = null){
|
||||
}
|
||||
}
|
||||
|
||||
export function getLibraryAlbums(){
|
||||
export function getLibraryAlbums(uri = null){
|
||||
return {
|
||||
type: 'MOPIDY_GET_LIBRARY_ALBUMS'
|
||||
type: 'MOPIDY_GET_LIBRARY_ALBUMS',
|
||||
uri: uri
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,16 +1,17 @@
|
||||
|
||||
import ReactGA from 'react-ga'
|
||||
import Mopidy from 'mopidy'
|
||||
import ReactGA from 'react-ga';
|
||||
import Mopidy from 'mopidy';
|
||||
import md5 from 'md5';
|
||||
import { hashHistory } from 'react-router'
|
||||
import * as helpers from '../../helpers'
|
||||
import { hashHistory } from 'react-router';
|
||||
import * as helpers from '../../helpers';
|
||||
|
||||
var mopidyActions = require('./actions.js')
|
||||
var coreActions = require('../core/actions.js')
|
||||
var uiActions = require('../ui/actions.js')
|
||||
var spotifyActions = require('../spotify/actions.js')
|
||||
var pusherActions = require('../pusher/actions.js')
|
||||
var lastfmActions = require('../lastfm/actions.js')
|
||||
var mopidyActions = require('./actions.js');
|
||||
var coreActions = require('../core/actions.js');
|
||||
var uiActions = require('../ui/actions.js');
|
||||
var spotifyActions = require('../spotify/actions.js');
|
||||
var pusherActions = require('../pusher/actions.js');
|
||||
var googleActions = require('../google/actions.js');
|
||||
var lastfmActions = require('../lastfm/actions.js');
|
||||
|
||||
const MopidyMiddleware = (function(){
|
||||
|
||||
@ -530,21 +531,8 @@ const MopidyMiddleware = (function(){
|
||||
}
|
||||
|
||||
// Enable Iris providers when the backend is available
|
||||
if (uri_schemes.includes('spotify:')){
|
||||
store.dispatch({
|
||||
type: 'SPOTIFY_SET',
|
||||
data: {
|
||||
enabled: true
|
||||
}
|
||||
});
|
||||
} else {
|
||||
store.dispatch({
|
||||
type: 'SPOTIFY_SET',
|
||||
data: {
|
||||
enabled: false
|
||||
}
|
||||
});
|
||||
}
|
||||
store.dispatch(spotifyActions.set({enabled: uri_schemes.includes('spotify:')}));
|
||||
store.dispatch(googleActions.set({enabled: uri_schemes.includes('gmusic:')}));
|
||||
|
||||
// If we haven't customised our search schemes, add all to search
|
||||
if (store.getState().ui.uri_schemes_search_enabled === undefined){
|
||||
@ -1715,22 +1703,7 @@ const MopidyMiddleware = (function(){
|
||||
var last_run = store.getState().ui.processes.MOPIDY_LIBRARY_ALBUMS_PROCESSOR
|
||||
|
||||
if (!last_run){
|
||||
var uris = store.getState().mopidy.library_albums_uris.split(',');
|
||||
var promises = [];
|
||||
|
||||
// Construct an array of promises
|
||||
for (var uri of uris){
|
||||
promises.push(
|
||||
request(socket, store, 'library.browse', { uri: uri })
|
||||
);
|
||||
}
|
||||
|
||||
// Now run the requests
|
||||
Promise.all(promises).then(responses => {
|
||||
console.log(responses);
|
||||
});
|
||||
|
||||
request(socket, store, 'library.browse', { uri: store.getState().mopidy.library_albums_uris })
|
||||
request(socket, store, 'library.browse', { uri: store.getState().mopidy.library_albums_uri })
|
||||
.then(response => {
|
||||
if (response.length <= 0) return
|
||||
|
||||
|
||||
@ -28,8 +28,8 @@ class Settings extends React.Component {
|
||||
this.state = {
|
||||
mopidy_host: this.props.mopidy.host,
|
||||
mopidy_port: this.props.mopidy.port,
|
||||
mopidy_library_artists_uris: this.props.mopidy.library_artists_uris,
|
||||
mopidy_library_albums_uris: this.props.mopidy.library_albums_uris,
|
||||
mopidy_library_artists_uri: this.props.mopidy.library_artists_uri,
|
||||
mopidy_library_albums_uri: this.props.mopidy.library_albums_uri,
|
||||
pusher_username: this.props.pusher.username,
|
||||
input_in_focus: null
|
||||
}
|
||||
@ -393,12 +393,12 @@ class Settings extends React.Component {
|
||||
<div className="input">
|
||||
<input
|
||||
type="text"
|
||||
value={this.state.mopidy_library_artists_uris}
|
||||
value={this.state.mopidy_library_artists_uri}
|
||||
onChange={e => this.setState({mopidy_library_artists_uri: e.target.value})}
|
||||
onBlur={e => this.handleBlur('mopidy', 'library_artists_uri', e.target.value)}
|
||||
/>
|
||||
<div className="description">
|
||||
URIs used for collecting library artists (comma-separated list)
|
||||
URI used for collecting library artists
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -408,12 +408,12 @@ class Settings extends React.Component {
|
||||
<div className="input">
|
||||
<input
|
||||
type="text"
|
||||
value={this.state.mopidy_library_albums_uris}
|
||||
onChange={e => this.setState({mopidy_library_albums_uris: e.target.value})}
|
||||
onBlur={e => this.handleBlur('mopidy', 'library_albums_uris', e.target.value)}
|
||||
value={this.state.mopidy_library_albums_uri}
|
||||
onChange={e => this.setState({mopidy_library_albums_uri: e.target.value})}
|
||||
onBlur={e => this.handleBlur('mopidy', 'library_albums_uri', e.target.value)}
|
||||
/>
|
||||
<div className="description">
|
||||
URIs used for collecting library albums (comma-separated list)
|
||||
URI used for collecting library albums
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,21 +1,22 @@
|
||||
|
||||
import React, { PropTypes } from 'react'
|
||||
import { connect } from 'react-redux'
|
||||
import { bindActionCreators } from 'redux'
|
||||
import { Link } from 'react-router'
|
||||
import React, { PropTypes } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { bindActionCreators } from 'redux';
|
||||
import { Link } from 'react-router';
|
||||
|
||||
import Header from '../../components/Header'
|
||||
import ArtistGrid from '../../components/ArtistGrid'
|
||||
import List from '../../components/List'
|
||||
import DropdownField from '../../components/Fields/DropdownField'
|
||||
import FilterField from '../../components/Fields/FilterField'
|
||||
import LazyLoadListener from '../../components/LazyLoadListener'
|
||||
import Icon from '../../components/Icon'
|
||||
import Header from '../../components/Header';
|
||||
import ArtistGrid from '../../components/ArtistGrid';
|
||||
import List from '../../components/List';
|
||||
import DropdownField from '../../components/Fields/DropdownField';
|
||||
import FilterField from '../../components/Fields/FilterField';
|
||||
import LazyLoadListener from '../../components/LazyLoadListener';
|
||||
import Icon from '../../components/Icon';
|
||||
|
||||
import * as helpers from '../../helpers'
|
||||
import * as uiActions from '../../services/ui/actions'
|
||||
import * as mopidyActions from '../../services/mopidy/actions'
|
||||
import * as spotifyActions from '../../services/spotify/actions'
|
||||
import * as helpers from '../../helpers';
|
||||
import * as uiActions from '../../services/ui/actions';
|
||||
import * as mopidyActions from '../../services/mopidy/actions';
|
||||
import * as spotifyActions from '../../services/spotify/actions';
|
||||
import * as googleActions from '../../services/google/actions';
|
||||
|
||||
class LibraryArtists extends React.Component{
|
||||
|
||||
@ -36,6 +37,10 @@ class LibraryArtists extends React.Component{
|
||||
this.props.mopidyActions.getLibraryArtists();
|
||||
}
|
||||
|
||||
if (!this.props.gmusic_library_artists && this.props.mopidy_connected && (this.props.source == 'all' || this.props.source == 'google')){
|
||||
this.props.googleActions.getLibraryArtists();
|
||||
}
|
||||
|
||||
if (this.props.spotify_enabled && this.props.spotify_library_artists_status != 'finished' && (this.props.source == 'all' || this.props.source == 'spotify')){
|
||||
this.props.spotifyActions.getLibraryArtists();
|
||||
}
|
||||
@ -55,6 +60,14 @@ class LibraryArtists extends React.Component{
|
||||
}
|
||||
}
|
||||
|
||||
if (newProps.google_enabled && (newProps.source == 'all' || newProps.source == 'google')){
|
||||
|
||||
// Filter changed, but we haven't got this provider's library yet
|
||||
if (newProps.google_library_artists_status != 'finished' && newProps.google_library_artists_status != 'started'){
|
||||
this.props.googleActions.getLibraryArtists();
|
||||
}
|
||||
}
|
||||
|
||||
if (newProps.spotify_enabled && (newProps.source == 'all' || newProps.source == 'spotify')){
|
||||
|
||||
// Filter changed, but we haven't got this provider's library yet
|
||||
@ -201,6 +214,13 @@ class LibraryArtists extends React.Component{
|
||||
});
|
||||
}
|
||||
|
||||
if (this.props.google_enabled){
|
||||
source_options.push({
|
||||
value: 'google',
|
||||
label: 'Google'
|
||||
});
|
||||
}
|
||||
|
||||
var view_options = [
|
||||
{
|
||||
label: 'Thumbnails',
|
||||
@ -284,9 +304,12 @@ const mapStateToProps = (state, ownProps) => {
|
||||
mopidy_uri_schemes: state.mopidy.uri_schemes,
|
||||
mopidy_library_artists: state.mopidy.library_artists,
|
||||
mopidy_library_artists_status: (state.ui.processes.MOPIDY_LIBRARY_ARTISTS_PROCESSOR !== undefined ? state.ui.processes.MOPIDY_LIBRARY_ARTISTS_PROCESSOR.status : null),
|
||||
spotify_enabled: (state.mopidy.uri_schemes && state.mopidy.uri_schemes.includes('spotify:')),
|
||||
spotify_enabled: state.spotify.enabled,
|
||||
spotify_library_artists: state.spotify.library_artists,
|
||||
spotify_library_artists_status: (state.ui.processes.SPOTIFY_GET_LIBRARY_ARTISTS_PROCESSOR !== undefined ? state.ui.processes.SPOTIFY_GET_LIBRARY_ARTISTS_PROCESSOR.status : null),
|
||||
google_enabled: state.google.enabled,
|
||||
google_library_artists: state.google.library_artists,
|
||||
google_library_artists_status: (state.ui.processes.GOOGLE_GET_LIBRARY_ARTISTS_PROCESSOR !== undefined ? state.ui.processes.GOOGLE_GET_LIBRARY_ARTISTS_PROCESSOR.status : null),
|
||||
artists: state.core.artists,
|
||||
source: (state.ui.library_artists_source ? state.ui.library_artists_source : 'all'),
|
||||
sort: (state.ui.library_artists_sort ? state.ui.library_artists_sort : null),
|
||||
@ -299,7 +322,8 @@ const mapDispatchToProps = (dispatch) => {
|
||||
return {
|
||||
uiActions: bindActionCreators(uiActions, dispatch),
|
||||
mopidyActions: bindActionCreators(mopidyActions, dispatch),
|
||||
spotifyActions: bindActionCreators(spotifyActions, dispatch)
|
||||
spotifyActions: bindActionCreators(spotifyActions, dispatch),
|
||||
googleActions: bindActionCreators(googleActions, dispatch)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user