Radio seeds now showing in 'Added from'

This commit is contained in:
James Barnsley
2019-10-03 09:21:38 +13:00
parent e9ccd8f5f5
commit d1d2ee5ca3
7 changed files with 200 additions and 190 deletions

View File

@ -1022,36 +1022,36 @@ export const uriType = function (uri) {
const exploded = uri.split(':');
if (exploded[0] == 'm3u') {
if (exploded[0] === 'm3u') {
return 'playlist';
}
if (exploded[0] == 'iris') {
switch (exploded[1]) {
case 'search':
case 'discover':
case 'browse':
case 'radio':
return exploded[1];
break;
}
if (exploded[0] === 'iris') {
switch (exploded[1]) {
case 'search':
case 'discover':
case 'browse':
case 'radio':
return exploded[1];
default:
return null;
}
}
switch (exploded[1]) {
case 'track':
case 'artist':
case 'album':
case 'playlist':
case 'genre':
return exploded[1];
break;
case 'user':
if (exploded.length > 3 && exploded[3] == 'playlist') {
return 'playlist';
}
return exploded[1];
break;
case 'track':
case 'artist':
case 'album':
case 'playlist':
case 'genre':
return exploded[1];
case 'user':
if (exploded.length > 3 && exploded[3] == 'playlist') {
return 'playlist';
}
return exploded[1];
default:
return null;
}
};
@ -1094,74 +1094,79 @@ export const getFromUri = function (element, uri = '') {
const namespace = exploded[0];
switch (element) {
case 'mbid':
var index = exploded.indexOf('mbid');
if (index > -1) return exploded[index + 1];
break;
case 'mbid':
var index = exploded.indexOf('mbid');
if (index > -1) return exploded[index + 1];
break;
case 'artistid':
if (exploded[1] == 'artist') {
return exploded[2];
}
break;
case 'albumid':
if (exploded[1] == 'album') {
return exploded[2];
}
break;
case 'playlistid':
if (exploded[1] == 'playlist') {
return exploded[2];
} if (exploded[1] == 'user' && exploded[3] == 'playlist') {
return exploded[4];
}
break;
case 'playlistowner':
if (exploded[1] == 'user' && exploded[3] == 'playlist') {
return exploded[2];
}
break;
case 'trackid':
if (exploded[1] == 'track') {
return exploded[2];
}
break;
case 'userid':
if (exploded[1] == 'user') {
return exploded[2];
}
break;
case 'genreid':
if (exploded[1] == 'genre') {
return exploded[2];
}
break;
case 'seeds':
if (exploded[1] == 'discover') {
return exploded[2];
}
break;
case 'searchtype':
if (exploded[0] == 'search') {
return exploded[1];
}
break;
case 'searchterm':
if (exploded[0] == 'search') {
case 'artistid':
if (exploded[1] == 'artist') {
return exploded[2];
}
break;
}
break;
case 'albumid':
if (exploded[1] == 'album') {
return exploded[2];
}
break;
case 'playlistid':
if (exploded[1] == 'playlist') {
return exploded[2];
} if (exploded[1] == 'user' && exploded[3] == 'playlist') {
return exploded[4];
}
break;
case 'playlistowner':
if (exploded[1] == 'user' && exploded[3] == 'playlist') {
return exploded[2];
}
break;
case 'trackid':
if (exploded[1] == 'track') {
return exploded[2];
}
break;
case 'userid':
if (exploded[1] == 'user') {
return exploded[2];
}
break;
case 'genreid':
if (exploded[1] == 'genre') {
return exploded[2];
}
break;
case 'seeds':
if (exploded[1] == 'discover') {
return exploded[2];
} else if (exploded[1] === 'radio') {
const seeds = exploded[2].split(',');
return seeds.map(seed => seed.replace(/_/gi,':'));
}
break;
case 'searchtype':
if (exploded[0] == 'search') {
return exploded[1];
}
break;
case 'searchterm':
if (exploded[0] == 'search') {
return exploded[2];
}
break;
default:
return null;
}
return null;
};

View File

@ -11,7 +11,7 @@ const geniusActions = require('../genius/actions');
const spotifyActions = require('../spotify/actions');
const snapcastActions = require('../snapcast/actions');
const PusherMiddleware = (function () {
const PusherMiddleware = (function () {
// container for the actual websocket
let socket = null;
@ -19,7 +19,7 @@ const PusherMiddleware = (function () {
const deferredRequests = [];
// handle all manner of socket messages
const handleMessage = (ws, store, message) => {
const handleMessage = (ws, store, message) => {
if (store.getState().ui.log_pusher) {
console.log('Pusher log (incoming)', message);
}
@ -35,9 +35,9 @@ const PusherMiddleware = (function () {
}
// Response with request_id
if (id) {
if (id) {
// Response matches a pending request
if (deferredRequests[id] !== undefined) {
if (deferredRequests[id] !== undefined) {
store.dispatch(uiActions.stopLoading(id));
// Response is an error
@ -58,15 +58,15 @@ const PusherMiddleware = (function () {
}
// General broadcast received
} else {
} else {
// Broadcast of an error
if (message.error !== undefined) {
store.dispatch(coreActions.handleException(
`Pusher: ${message.error.message}`,
message,
(message.error.data !== undefined && message.error.data.description !== undefined ? message.error.data.description : null),
));
} else {
));
} else {
switch (message.method) {
case 'connection_added':
store.dispatch(pusherActions.connectionAdded(message.params.connection));
@ -115,8 +115,8 @@ const PusherMiddleware = (function () {
break;
case 'local_scan_finished':
store.dispatch(uiActions.processFinished('local_scan'));
store.dispatch(uiActions.createNotification({
key: 'local_scan', type: 'info', content: 'Local scan finished', description: message.params.output,
store.dispatch(uiActions.createNotification({
key: 'local_scan', type: 'info', content: 'Local scan finished', description: message.params.output,
}));
break;
case 'local_scan_error':
@ -168,7 +168,7 @@ const PusherMiddleware = (function () {
}
};
const request = (store, method, params = null) => new Promise((resolve, reject) => {
const request = (store, method, params = null) => new Promise((resolve, reject) => {
const id = helpers.generateGuid();
const message = {
jsonrpc: '2.0',
@ -210,7 +210,7 @@ const PusherMiddleware = (function () {
return (store) => (next) => (action) => {
const { pusher } = store.getState();
switch (action.type) {
switch (action.type) {
case 'PUSHER_CONNECT':
if (socket != null) {
socket.close();
@ -542,6 +542,10 @@ const PusherMiddleware = (function () {
type: 'PUSHER_RADIO_LOADED',
radio: response.radio,
});
if (response.radio.enabled) {
store.dispatch(spotifyActions.resolveRadioSeeds(response.radio));
}
},
(error) => {
store.dispatch(coreActions.handleException(
@ -555,8 +559,8 @@ const PusherMiddleware = (function () {
case 'PUSHER_START_RADIO':
case 'PUSHER_UPDATE_RADIO':
if (store.getState().ui.allow_reporting) {
ReactGA.event({ category: 'Pusher', action: 'Start radio', label: action.uris.join() });
}
ReactGA.event({ category: 'Pusher', action: 'Start radio', label: action.uris.join() });
}
// start our UI process notification
if (action.type == 'PUSHER_UPDATE_RADIO') {
@ -776,7 +780,7 @@ const PusherMiddleware = (function () {
default:
return next(action);
}
};
};
}());
export default PusherMiddleware;

View File

@ -64,6 +64,8 @@ class Queue extends React.Component {
case 'playlist':
coreActions.loadPlaylist(next_added_from_uri);
break;
default:
break;
}
}
}
@ -129,28 +131,12 @@ class Queue extends React.Component {
}
renderArtwork(image) {
const {
radio_enabled,
current_track,
} = this.props;
const { current_track } = this.props;
if (!image) {
return (
<div
className={`current-track__artwork ${
radio_enabled
? 'current-track__artwork--radio-enabled'
: ''
}`}
>
{radio_enabled ? (
<img
className="radio-overlay"
src="/iris/assets/radio-overlay.png"
alt=""
/>
) : null}
<Thumbnail glow circle={radio_enabled} />
<div className="current-track__artwork">
<Thumbnail glow />
</div>
);
}
@ -160,22 +146,9 @@ class Queue extends React.Component {
uri = current_track.album.uri;
}
return (
<div
className={`current-track__artwork ${
radio_enabled
? 'current-track__artwork--radio-enabled'
: ''
}`}
>
<div className="current-track__artwork">
<URILink type="album" uri={uri}>
{radio_enabled ? (
<img
className="radio-overlay"
src="/iris/assets/radio-overlay.png"
alt=""
/>
) : null}
<Thumbnail glow image={image} circle={radio_enabled} />
<Thumbnail glow image={image} />
</URILink>
</div>
);
@ -185,11 +158,24 @@ class Queue extends React.Component {
const { added_from_uri } = this.props;
if (!added_from_uri) return null;
const item_type = helpers.uriType(added_from_uri);
const uri_type = helpers.uriType(added_from_uri);
let item_uri = added_from_uri;
let item_type = uri_type;
// Radio nests it's seed URIs in an encoded URI format
if (uri_type === 'radio') {
const radio_seeds = helpers.getFromUri('seeds', added_from_uri);
// For now we only care about the first seed
// TODO: Support for multiple seeds
item_uri = radio_seeds[0];
item_type = helpers.uriType(item_uri);
}
const item_library = this.props[`${item_type}s`];
if (!item_library) return null;
const item = item_library[added_from_uri];
const item = item_library[item_uri];
if (!item) return null;
return (
@ -210,6 +196,7 @@ class Queue extends React.Component {
<URILink type={item_type} uri={item.uri}>
{item.name}
</URILink>
{uri_type === 'radio' && <span> radio</span>}
</div>
</div>
);
@ -372,6 +359,7 @@ const mapStateToProps = (state, ownProps) => {
artists: state.core.artists,
albums: state.core.albums,
playlists: state.core.playlists,
tracks: state.core.tracks,
queue_tracks,
current_track_uri: state.core.current_track_uri,
current_track,

View File

@ -15,7 +15,7 @@ import * as spotifyActions from '../../services/spotify/actions';
import * as pusherActions from '../../services/pusher/actions';
import * as helpers from '../../helpers';
class EditRadio extends React.Component {
class EditRadio extends React.Component {
constructor(props) {
super(props);
this.state = {
@ -43,7 +43,6 @@ class EditRadio extends React.Component {
loadRadio(radio) {
const seeds = [...radio.seed_tracks, ...radio.seed_artists, ...radio.seed_genres];
this.setState({ seeds, enabled: radio.enabled });
this.props.spotifyActions.resolveRadioSeeds(radio);
}
handleStart(e) {
@ -193,15 +192,15 @@ class EditRadio extends React.Component {
seeds.map((seed, index) => (
<div className="list__item" key={seed.uri}>
{seed.unresolved ? <span className="mid_grey-text">{seed.uri}</span> : <span>{seed.name}</span> }
{!seed.unresolved ? (
<span className="mid_grey-text">
&nbsp;(
{helpers.uriType(seed.uri)}
)
</span>
{!seed.unresolved ? (
<span className="mid_grey-text">
&nbsp;(
{helpers.uriType(seed.uri)}
)
</span>
) : null}
<span className="button discrete remove-uri no-hover" onClick={(e) => this.removeSeed(seed.uri)}>
<Icon name="delete" />
<Icon name="delete" />
Remove
</span>
</div>
@ -213,7 +212,7 @@ Remove
}
return (
<div className="no-results">No seeds</div>
);
);
}
render() {
@ -232,10 +231,10 @@ Remove
<input
type="text"
onChange={(e) => this.setState({ uri: e.target.value, error_message: null })}
value={this.state.uri}
value={this.state.uri}
/>
<span className="button discrete add-uri no-hover" onClick={(e) => this.addSeed(e)}>
<Icon name="add" />
<Icon name="add" />
Add
</span>
{this.state.error_message ? <span className="description error">{this.state.error_message}</span> : null}
@ -268,4 +267,4 @@ const mapDispatchToProps = (dispatch) => ({
spotifyActions: bindActionCreators(spotifyActions, dispatch),
});
export default connect(mapStateToProps, mapDispatchToProps)(EditRadio);
export default connect(mapStateToProps, mapDispatchToProps)(EditRadio);