Cleaning up index modification
This commit is contained in:
@ -68,12 +68,12 @@ class AddSeedField extends React.Component{
|
||||
switch (helpers.uriType(item.uri)){
|
||||
|
||||
case 'artist':
|
||||
this.props.coreActions.artistLoaded(item.uri,item)
|
||||
break
|
||||
this.props.coreActions.artistsLoaded(item);
|
||||
break;
|
||||
|
||||
case 'track':
|
||||
this.props.coreActions.trackLoaded(item.uri,item)
|
||||
break
|
||||
this.props.coreActions.tracksLoaded(item);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -221,11 +221,10 @@ export function getLibraryArtists(){
|
||||
* Assets loaded
|
||||
**/
|
||||
|
||||
export function albumLoaded(key,album){
|
||||
export function tracksLoaded(tracks){
|
||||
return {
|
||||
type: 'ALBUM_LOADED',
|
||||
key: key,
|
||||
album: album
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: tracks
|
||||
}
|
||||
}
|
||||
|
||||
@ -236,14 +235,6 @@ export function albumsLoaded(albums){
|
||||
}
|
||||
}
|
||||
|
||||
export function artistLoaded(key,artist){
|
||||
return {
|
||||
type: 'ARTIST_LOADED',
|
||||
key: key,
|
||||
artist: artist
|
||||
}
|
||||
}
|
||||
|
||||
export function artistsLoaded(artists){
|
||||
return {
|
||||
type: 'ALBUMS_LOADED',
|
||||
@ -251,17 +242,16 @@ export function artistsLoaded(artists){
|
||||
}
|
||||
}
|
||||
|
||||
export function trackLoaded(key,track){
|
||||
export function playlistsLoaded(playlists){
|
||||
return {
|
||||
type: 'TRACK_LOADED',
|
||||
key: key,
|
||||
track: track
|
||||
type: 'PLAYLISTS_LOADED',
|
||||
playlists: playlists
|
||||
}
|
||||
}
|
||||
|
||||
export function tracksLoaded(tracks){
|
||||
export function usersLoaded(users){
|
||||
return {
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: tracks
|
||||
type: 'USERS_LOADED',
|
||||
users: users
|
||||
}
|
||||
}
|
||||
|
||||
@ -98,7 +98,6 @@ const CoreMiddleware = (function(){
|
||||
case 'CORE_START_SERVICES':
|
||||
store.dispatch(mopidyActions.connect());
|
||||
store.dispatch(pusherActions.connect());
|
||||
store.dispatch(lastfmActions.connect());
|
||||
|
||||
next(action)
|
||||
break
|
||||
@ -306,27 +305,69 @@ const CoreMiddleware = (function(){
|
||||
* These modify our asset indexes, which are used globally
|
||||
**/
|
||||
|
||||
// Array wrapper for TRACKS_LOADED
|
||||
case 'TRACK_LOADED':
|
||||
if (action.track.album && action.track.album.images && action.track.album.images.length > 0){
|
||||
action.track.album.images = helpers.digestMopidyImages(store.getState().mopidy, action.track.album.images);
|
||||
}
|
||||
store.dispatch({
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: [action.track]
|
||||
})
|
||||
next(action);
|
||||
break;
|
||||
|
||||
var tracks = Object.assign({}, core.tracks)
|
||||
if (tracks[action.key]){
|
||||
var track = Object.assign(
|
||||
{},
|
||||
tracks[action.key],
|
||||
helpers.formatTracks(action.track)
|
||||
);
|
||||
} else {
|
||||
var track = Object.assign(
|
||||
{},
|
||||
helpers.formatTracks(action.track)
|
||||
);
|
||||
// Array wrapper for ALBUMS_LOADED
|
||||
case 'ALBUM_LOADED':
|
||||
store.dispatch({
|
||||
type: 'ALBUMS_LOADED',
|
||||
albums: [action.album]
|
||||
});
|
||||
next(action);
|
||||
break;
|
||||
|
||||
// Array wrapper for ARTISTS_LOADED
|
||||
case 'ARTIST_LOADED':
|
||||
store.dispatch({
|
||||
type: 'ARTISTS_LOADED',
|
||||
artists: [action.artist]
|
||||
});
|
||||
next(action);
|
||||
break;
|
||||
|
||||
// Array wrapper for PLAYLISTS_LOADED
|
||||
case 'PLAYLIST_LOADED':
|
||||
store.dispatch({
|
||||
type: 'PLAYLISTS_LOADED',
|
||||
playlists: [action.playlist]
|
||||
});
|
||||
next(action);
|
||||
break;
|
||||
|
||||
// Array wrapper for USERS_LOADED
|
||||
case 'USER_LOADED':
|
||||
store.dispatch({
|
||||
type: 'USERS_LOADED',
|
||||
users: [action.user]
|
||||
});
|
||||
next(action);
|
||||
break;
|
||||
|
||||
case 'TRACKS_LOADED':
|
||||
var tracks = Object.assign({}, core.tracks);
|
||||
|
||||
for (var i = 0; i < action.tracks.length; i++){
|
||||
var track = Object.assign({}, helpers.formatTracks(action.tracks[i]));
|
||||
|
||||
if (tracks[track.uri]){
|
||||
track = Object.assign({}, tracks[track.uri], track);
|
||||
}
|
||||
|
||||
if (track.album && track.album.images && track.album.images.length > 0){
|
||||
track.album.images = helpers.digestMopidyImages(store.getState().mopidy, track.album.images);
|
||||
}
|
||||
|
||||
tracks[track.uri] = track;
|
||||
}
|
||||
|
||||
// Update index
|
||||
tracks[action.key] = track;
|
||||
store.dispatch({
|
||||
type: 'UPDATE_TRACKS_INDEX',
|
||||
tracks: tracks
|
||||
@ -335,97 +376,85 @@ const CoreMiddleware = (function(){
|
||||
next(action);
|
||||
break;
|
||||
|
||||
case 'TRACKS_LOADED':
|
||||
for (var i = 0; i < action.tracks.length; i++){
|
||||
store.dispatch({
|
||||
type: 'TRACK_LOADED',
|
||||
key: action.tracks[i].uri,
|
||||
track: action.tracks[i]
|
||||
});
|
||||
}
|
||||
next(action);
|
||||
break;
|
||||
case 'ALBUMS_LOADED':
|
||||
var albums = Object.assign({}, core.albums);
|
||||
var tracks_loaded = [];
|
||||
|
||||
case 'ALBUM_LOADED':
|
||||
var albums = Object.assign({}, core.albums)
|
||||
for (var i = 0; i < action.albums.length; i++){
|
||||
var album = Object.assign({}, action.albums[i]);
|
||||
|
||||
if (albums[action.key]){
|
||||
var album = Object.assign({}, albums[action.key], action.album)
|
||||
} else {
|
||||
var album = Object.assign({}, action.album)
|
||||
if (albums[album.uri]){
|
||||
album = Object.assign({}, albums[album.uri], album);
|
||||
}
|
||||
|
||||
if (album.images && album.images.length > 0){
|
||||
album.images = helpers.digestMopidyImages(store.getState().mopidy, album.images);
|
||||
}
|
||||
|
||||
// Load our tracks
|
||||
if (album.tracks){
|
||||
var tracks = helpers.formatTracks(album.tracks);
|
||||
var tracks_uris = helpers.arrayOf('uri', tracks);
|
||||
album.tracks_uris = tracks_uris;
|
||||
delete album.tracks;
|
||||
tracks_loaded = [...tracks_loaded, ...tracks];
|
||||
}
|
||||
|
||||
albums[album.uri] = album;
|
||||
}
|
||||
|
||||
if (action.album.images && action.album.images.length > 0){
|
||||
action.album.images = helpers.digestMopidyImages(store.getState().mopidy, action.album.images);
|
||||
}
|
||||
|
||||
// Load our tracks
|
||||
if (album.tracks){
|
||||
var tracks = helpers.formatTracks(album.tracks);
|
||||
var tracks_uris = helpers.arrayOf('uri', tracks);
|
||||
album.tracks_uris = tracks_uris;
|
||||
delete album.tracks;
|
||||
|
||||
store.dispatch({
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: tracks
|
||||
});
|
||||
}
|
||||
// Load these new tracks
|
||||
store.dispatch({
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: tracks_loaded
|
||||
});
|
||||
|
||||
// Update index
|
||||
albums[action.key] = album;
|
||||
store.dispatch({
|
||||
type: 'UPDATE_ALBUMS_INDEX',
|
||||
albums: albums
|
||||
});
|
||||
|
||||
next(action);
|
||||
break;
|
||||
|
||||
case 'ALBUMS_LOADED':
|
||||
for (var i = 0; i < action.albums.length; i++){
|
||||
store.dispatch({
|
||||
type: 'ALBUM_LOADED',
|
||||
key: action.albums[i].uri,
|
||||
album: action.albums[i]
|
||||
});
|
||||
}
|
||||
next(action);
|
||||
break
|
||||
|
||||
case 'ARTIST_LOADED':
|
||||
var artists = Object.assign({}, core.artists)
|
||||
case 'ARTISTS_LOADED':
|
||||
var artists = Object.assign({}, core.artists);
|
||||
var tracks_loaded = [];
|
||||
|
||||
if (artists[action.key]){
|
||||
for (var i = 0; i < action.artists.length; i++){
|
||||
var artist = action.artists[i];
|
||||
|
||||
// if we've already got images, remove and add as additional_images
|
||||
// this is to prevent LastFM overwriting Spotify images
|
||||
if (artists[action.key].images){
|
||||
action.artist.images_additional = action.artist.images
|
||||
delete action.artist.images
|
||||
if (artists[artist.uri]){
|
||||
|
||||
// if we've already got images, remove and add as additional_images
|
||||
// this is to prevent LastFM overwriting Spotify images
|
||||
if (artists[artist.uri].images){
|
||||
artist.images_additional = artist.images
|
||||
delete artist.images
|
||||
}
|
||||
|
||||
artist = Object.assign({}, artists[artist.uri], artist);
|
||||
}
|
||||
|
||||
var artist = Object.assign({}, artists[action.key], action.artist)
|
||||
if (artist.tracks){
|
||||
artist.tracks = helpers.formatTracks(artist.tracks);
|
||||
}
|
||||
} else {
|
||||
var artist = Object.assign({}, action.artist)
|
||||
if (artist.tracks){
|
||||
artist.tracks = helpers.formatTracks(artist.tracks);
|
||||
var tracks = helpers.formatTracks(artist.tracks);
|
||||
var tracks_uris = helpers.arrayOf('uri', tracks);
|
||||
artist.tracks_uris = tracks_uris;
|
||||
delete artist.tracks;
|
||||
tracks_loaded = [...tracks_loaded, ...tracks];
|
||||
}
|
||||
|
||||
// Update index
|
||||
artists[artist.uri] = artist;
|
||||
}
|
||||
|
||||
// Load our tracks
|
||||
if (artist.tracks){
|
||||
store.dispatch({
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: artist.tracks
|
||||
});
|
||||
}
|
||||
store.dispatch({
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: tracks_loaded
|
||||
});
|
||||
|
||||
// Update index
|
||||
artists[action.key] = artist;
|
||||
store.dispatch({
|
||||
type: 'UPDATE_ARTISTS_INDEX',
|
||||
artists: artists
|
||||
@ -434,69 +463,61 @@ const CoreMiddleware = (function(){
|
||||
next(action);
|
||||
break;
|
||||
|
||||
case 'ARTISTS_LOADED':
|
||||
for (var i = 0; i < action.artists.length; i++){
|
||||
store.dispatch({
|
||||
type: 'ARTIST_LOADED',
|
||||
key: action.artists[i].uri,
|
||||
artist: action.artists[i]
|
||||
});
|
||||
}
|
||||
next(action);
|
||||
break;
|
||||
|
||||
case 'PLAYLIST_LOADED':
|
||||
var playlist = Object.assign({}, action.playlist);
|
||||
case 'PLAYLISTS_LOADED':
|
||||
var playlists = Object.assign({}, core.playlists);
|
||||
var tracks_loaded = [];
|
||||
|
||||
// Detect editability
|
||||
switch (helpers.uriSource(playlist.uri)){
|
||||
for (var i = 0; i < action.playlists.length; i++){
|
||||
var playlist = Object.assign({}, action.playlists[i]);
|
||||
|
||||
case 'm3u':
|
||||
playlist.can_edit = true
|
||||
break
|
||||
// Detect editability
|
||||
switch (helpers.uriSource(playlist.uri)){
|
||||
|
||||
case 'spotify':
|
||||
if (store.getState().spotify.authorization && store.getState().spotify.me){
|
||||
playlist.can_edit = (helpers.getFromUri('playlistowner',playlist.uri) == store.getState().spotify.me.id)
|
||||
}
|
||||
}
|
||||
case 'm3u':
|
||||
playlist.can_edit = true
|
||||
break
|
||||
|
||||
if (playlists[action.key] !== undefined){
|
||||
var existing_playlist = playlists[action.key];
|
||||
|
||||
if (existing_playlist.tracks && playlist.tracks){
|
||||
var tracks = [...existing_playlist.tracks, ...playlist.tracks];
|
||||
} else if (existing_playlist.tracks){
|
||||
var tracks = existing_playlist.tracks;
|
||||
} else if (action.playlist.tracks){
|
||||
var tracks = playlist.tracks;
|
||||
} else {
|
||||
var tracks = [];
|
||||
case 'spotify':
|
||||
if (store.getState().spotify.authorization && store.getState().spotify.me){
|
||||
playlist.can_edit = (helpers.getFromUri('playlistowner',playlist.uri) == store.getState().spotify.me.id)
|
||||
}
|
||||
}
|
||||
|
||||
playlist = Object.assign(
|
||||
{},
|
||||
existing_playlist,
|
||||
playlist
|
||||
)
|
||||
if (playlists[playlist.uri] !== undefined){
|
||||
var existing_playlist = playlists[playlist.uri];
|
||||
|
||||
if (existing_playlist.tracks && playlist.tracks){
|
||||
var tracks = [...existing_playlist.tracks, ...playlist.tracks];
|
||||
} else if (existing_playlist.tracks){
|
||||
var tracks = existing_playlist.tracks;
|
||||
} else if (action.playlist.tracks){
|
||||
var tracks = playlist.tracks;
|
||||
} else {
|
||||
var tracks = [];
|
||||
}
|
||||
|
||||
playlist = Object.assign({tracks: tracks}, existing_playlist, playlist);
|
||||
}
|
||||
|
||||
// Load our tracks
|
||||
if (playlist.tracks){
|
||||
var tracks = helpers.formatTracks(playlist.tracks);
|
||||
var tracks_uris = helpers.arrayOf('uri', tracks);
|
||||
playlist.tracks_uris = tracks_uris;
|
||||
delete playlist.tracks;
|
||||
tracks_loaded = [...tracks_loaded, ...tracks];
|
||||
}
|
||||
|
||||
// Update index
|
||||
playlists[playlist.uri] = playlist;
|
||||
}
|
||||
|
||||
// Load our tracks
|
||||
if (playlist.tracks){
|
||||
var tracks = helpers.formatTracks(playlist.tracks);
|
||||
var tracks_uris = helpers.arrayOf('uri', tracks);
|
||||
playlist.tracks_uris = tracks_uris;
|
||||
delete playlist.tracks;
|
||||
store.dispatch({
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: tracks_loaded
|
||||
});
|
||||
|
||||
store.dispatch({
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: tracks
|
||||
});
|
||||
}
|
||||
|
||||
// Update index
|
||||
playlists[action.key] = playlist;
|
||||
store.dispatch({
|
||||
type: 'UPDATE_PLAYLISTS_INDEX',
|
||||
playlists: playlists
|
||||
@ -505,17 +526,20 @@ const CoreMiddleware = (function(){
|
||||
next(action);
|
||||
break;
|
||||
|
||||
case 'USER_LOADED':
|
||||
var users = Object.assign([], core.users)
|
||||
case 'USERS_LOADED':
|
||||
var users = Object.assign([], core.users);
|
||||
|
||||
if (users[action.key]){
|
||||
var user = Object.assign({}, users[action.key], action.user)
|
||||
} else {
|
||||
var user = Object.assign({}, action.user)
|
||||
for (var i = 0; i < action.users.length; i++){
|
||||
var user = Object.assign({}, action.users[i]);
|
||||
|
||||
if (users[user.uri]){
|
||||
user = Object.assign({}, users[user.uri], user);
|
||||
}
|
||||
|
||||
users[action.key] = user;
|
||||
}
|
||||
|
||||
// Update index
|
||||
users[action.key] = user;
|
||||
store.dispatch({
|
||||
type: 'UPDATE_USERS_INDEX',
|
||||
users: users
|
||||
|
||||
@ -64,8 +64,8 @@ export function getTrackLyrics(uri, url){
|
||||
|
||||
dispatch({
|
||||
type: 'TRACK_LOADED',
|
||||
key: uri,
|
||||
track: {
|
||||
uri: uri,
|
||||
lyrics: null,
|
||||
lyrics_url: null
|
||||
}
|
||||
@ -89,8 +89,8 @@ export function getTrackLyrics(uri, url){
|
||||
|
||||
dispatch({
|
||||
type: 'TRACK_LOADED',
|
||||
key: uri,
|
||||
track: {
|
||||
uri: uri,
|
||||
lyrics: lyrics_html,
|
||||
lyrics_url: url
|
||||
}
|
||||
@ -131,8 +131,8 @@ export function findTrackLyrics(track){
|
||||
}
|
||||
dispatch({
|
||||
type: 'TRACK_LOADED',
|
||||
key: track.uri,
|
||||
track: {
|
||||
uri: track.uri,
|
||||
lyrics_results: lyrics_results
|
||||
}
|
||||
});
|
||||
|
||||
@ -189,8 +189,8 @@ export function loveTrack(uri, artist, track){
|
||||
response => {
|
||||
dispatch({
|
||||
type: 'TRACK_LOADED',
|
||||
key: uri,
|
||||
track: {
|
||||
uri: uri,
|
||||
userloved: true
|
||||
}
|
||||
});
|
||||
@ -208,8 +208,8 @@ export function unloveTrack(uri, artist, track){
|
||||
response => {
|
||||
dispatch({
|
||||
type: 'TRACK_LOADED',
|
||||
key: uri,
|
||||
track: {
|
||||
uri: uri,
|
||||
userloved: false
|
||||
}
|
||||
});
|
||||
@ -255,8 +255,8 @@ export function getArtist(uri, artist, mbid = false){
|
||||
if (response.artist){
|
||||
dispatch({
|
||||
type: 'ARTIST_LOADED',
|
||||
key: uri,
|
||||
artist: {
|
||||
uri: uri,
|
||||
images: response.artist.image,
|
||||
bio: response.artist.bio,
|
||||
listeners: parseInt(response.artist.stats.listeners),
|
||||
@ -315,12 +315,14 @@ export function getTrack(track, artist_name = null, track_name = null){
|
||||
if (response.track){
|
||||
var merged_track = Object.assign(
|
||||
{},
|
||||
{
|
||||
uri: track.uri
|
||||
},
|
||||
response.track,
|
||||
track
|
||||
);
|
||||
dispatch({
|
||||
type: 'TRACK_LOADED',
|
||||
key: merged_track.uri,
|
||||
track: merged_track
|
||||
});
|
||||
}
|
||||
|
||||
@ -25,9 +25,8 @@ const LastfmMiddleware = (function(){
|
||||
}
|
||||
);
|
||||
store.dispatch({
|
||||
type: "USER_LOADED",
|
||||
key: user.uri,
|
||||
user: user
|
||||
type: "USERS_LOADED",
|
||||
users: [user]
|
||||
});
|
||||
next(action);
|
||||
break;
|
||||
|
||||
@ -1166,9 +1166,8 @@ export function getUser(uri){
|
||||
.then(
|
||||
response => {
|
||||
dispatch({
|
||||
type: 'USER_LOADED',
|
||||
key: response.uri,
|
||||
user: response
|
||||
type: 'USERS_LOADED',
|
||||
users: [response]
|
||||
});
|
||||
},
|
||||
error => {
|
||||
|
||||
@ -413,9 +413,8 @@ const SpotifyMiddleware = (function(){
|
||||
ReactGA.event({category: 'Spotify', action: 'Authorization verified', label: action.data.id});
|
||||
|
||||
store.dispatch({
|
||||
type: 'USER_LOADED',
|
||||
key: action.data.uri,
|
||||
user: action.data
|
||||
type: 'USERS_LOADED',
|
||||
users: [action.data]
|
||||
})
|
||||
|
||||
next(action);
|
||||
|
||||
@ -167,6 +167,16 @@ class Playlist extends React.Component{
|
||||
)
|
||||
}
|
||||
|
||||
var tracks = [];
|
||||
if (this.props.playlist.tracks_uris && this.props.tracks){
|
||||
for (var i = 0; i < this.props.playlist.tracks_uris.length; i++){
|
||||
var uri = this.props.playlist.tracks_uris[i]
|
||||
if (this.props.tracks.hasOwnProperty(uri)){
|
||||
tracks.push(this.props.tracks[uri])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="view playlist-view content-wrapper">
|
||||
<div className="thumbnail-wrapper">
|
||||
@ -183,8 +193,8 @@ class Playlist extends React.Component{
|
||||
{ this.props.playlist.followers ? <li>{this.props.playlist.followers.total.toLocaleString()} followers</li> : null }
|
||||
{ this.props.playlist.last_modified ? <li>Edited <Dater type="ago" data={this.props.playlist.last_modified} /></li> : null }
|
||||
<li>
|
||||
{ this.props.playlist.tracks_total ? this.props.playlist.tracks_total : '0'} tracks,
|
||||
{ this.props.playlist.tracks ? <Dater type="total-time" data={this.props.playlist.tracks} /> : '0 mins' }
|
||||
{ this.props.playlist.tracks_total ? this.props.playlist.tracks_total : tracks.length} tracks,
|
||||
<Dater type="total-time" data={tracks} />
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@ -192,7 +202,7 @@ class Playlist extends React.Component{
|
||||
{ this.renderActions() }
|
||||
|
||||
<section className="list-wrapper">
|
||||
{ this.props.playlist.tracks ? <TrackList uri={this.props.params.uri} className="playlist-track-list" context={context} tracks={this.props.playlist.tracks} removeTracks={ tracks_indexes => this.removeTracks(tracks_indexes) } reorderTracks={ (indexes, index) => this.reorderTracks(indexes, index) } /> : null }
|
||||
<TrackList uri={this.props.params.uri} className="playlist-track-list" context={context} tracks={tracks} removeTracks={ tracks_indexes => this.removeTracks(tracks_indexes) } reorderTracks={ (indexes, index) => this.reorderTracks(indexes, index) } />
|
||||
<LazyLoadListener loading={this.props.playlist.tracks_more} loadMore={ () => this.loadMore() }/>
|
||||
</section>
|
||||
</div>
|
||||
@ -212,6 +222,7 @@ const mapStateToProps = (state, ownProps) => {
|
||||
return {
|
||||
slim_mode: state.ui.slim_mode,
|
||||
load_queue: state.ui.load_queue,
|
||||
tracks: state.core.tracks,
|
||||
playlist: (state.core.playlists && state.core.playlists[uri] !== undefined ? state.core.playlists[uri] : false ),
|
||||
spotify_library_playlists: state.spotify.library_playlists,
|
||||
local_library_playlists: state.mopidy.library_playlists,
|
||||
|
||||
Reference in New Issue
Block a user