Consistent asset structure
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 = "1535401808";
|
||||
var build = "1535532041";
|
||||
var version = "3.25.1";
|
||||
|
||||
// Construct the script tag
|
||||
|
||||
@ -34,7 +34,8 @@ class AlbumGrid extends React.Component{
|
||||
return (
|
||||
<div className={className}>
|
||||
{
|
||||
this.props.albums.map(album => {
|
||||
this.props.albums.map(item => {
|
||||
var album = helpers.collateObject(item, {artists: this.props.artists});
|
||||
return (
|
||||
<GridItem
|
||||
key={album.uri}
|
||||
@ -55,7 +56,9 @@ class AlbumGrid extends React.Component{
|
||||
}
|
||||
|
||||
const mapStateToProps = (state, ownProps) => {
|
||||
return {}
|
||||
return {
|
||||
artists: state.core.artists
|
||||
}
|
||||
}
|
||||
|
||||
const mapDispatchToProps = (dispatch) => {
|
||||
|
||||
@ -42,7 +42,7 @@ export default class GridItem extends React.Component{
|
||||
renderSecondary(item){
|
||||
var output = ''
|
||||
|
||||
switch (item.type){
|
||||
switch (helpers.uriType(item.uri)){
|
||||
|
||||
case 'playlist':
|
||||
return (
|
||||
|
||||
@ -310,14 +310,118 @@ export let getTrackIcon = function(current_track = false, core = false){
|
||||
* @param album obj
|
||||
* @return album obj
|
||||
**/
|
||||
export let formatAlbum = function(album){
|
||||
if (album.release_date !== undefined){
|
||||
album.date = album.release_date;
|
||||
export let formatAlbum = function(data){
|
||||
var album = {
|
||||
uri: null,
|
||||
name: null,
|
||||
type: null,
|
||||
artists_uris: null,
|
||||
tracks_uris: null,
|
||||
release_date: null,
|
||||
popularity: null,
|
||||
images: null
|
||||
};
|
||||
|
||||
// Loop fields and import from data
|
||||
for (var key in album){
|
||||
if (album.hasOwnProperty(key) && data.hasOwnProperty(key)){
|
||||
album[key] = data[key];
|
||||
}
|
||||
}
|
||||
|
||||
if (data.date) album.release_date = data.date;
|
||||
|
||||
return album;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Collate an object with external references into a fully self-contained object
|
||||
* We merge *_uris references (ie tracks_uris) into the main object
|
||||
*
|
||||
* @param object Obj
|
||||
* @param indexes Obj (the relevant core indexes)
|
||||
* @return object Obj
|
||||
**/
|
||||
export let collateObject = function(object, indexes = {}){
|
||||
|
||||
// Setup empty arrays for the appropriate reference objects
|
||||
// This helps create a consistent object structure
|
||||
if (object.artists_uris !== undefined) object.artists = [];
|
||||
if (object.albums_uris !== undefined) object.albums = [];
|
||||
if (object.tracks_uris !== undefined) object.tracks = [];
|
||||
if (object.users_uris !== undefined) object.users = [];
|
||||
|
||||
if (indexes.artists){
|
||||
|
||||
if (object.artists_uris){
|
||||
for (var uri of object.artists_uris){
|
||||
if (indexes.artists[uri]){
|
||||
object.artists.push(indexes.artists[uri]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (object.artist_uri){
|
||||
if (indexes.artists[object.artist_uri]){
|
||||
object.artist = indexes.artists[object.artist_uri];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (indexes.albums){
|
||||
if (object.albums_uris){
|
||||
for (var uri of object.albums_uris){
|
||||
if (indexes.albums[uri]){
|
||||
object.albums.push(indexes.albums[uri]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (object.album_uri){
|
||||
if (indexes.albums[object.album_uri]){
|
||||
object.album = indexes.albums[object.album_uri];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (indexes.tracks){
|
||||
|
||||
if (object.tracks_uris){
|
||||
for (var uri of object.tracks_uris){
|
||||
if (indexes.tracks[uri]){
|
||||
object.tracks.push(indexes.tracks[uri]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (object.track_uri){
|
||||
if (indexes.tracks[object.track_uri]){
|
||||
object.track = indexes.tracks[object.track_uri];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (indexes.users){
|
||||
if (object.users_uris){
|
||||
for (var uri of object.users_uris){
|
||||
if (indexes.users[uri]){
|
||||
object.users.push(indexes.users[uri]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (object.user_uri){
|
||||
if (indexes.users[object.user_uri]){
|
||||
object.user = indexes.users[object.user_uri];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Format tracks into our universal format
|
||||
*
|
||||
@ -523,10 +627,13 @@ export let getFromUri = function(element, uri = ""){
|
||||
|
||||
/**
|
||||
* Identify what kind of asset a URI is (playlist, album, etc)
|
||||
*
|
||||
* @param uri = string
|
||||
* @return string
|
||||
**/
|
||||
export let uriType = function(uri){
|
||||
if (!uri) return null;
|
||||
|
||||
var exploded = uri.split(':')
|
||||
|
||||
if (exploded[0] == 'm3u'){
|
||||
@ -559,8 +666,6 @@ export let uriType = function(uri){
|
||||
return exploded[1]
|
||||
break
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -457,26 +457,28 @@ const CoreMiddleware = (function(){
|
||||
case 'ALBUMS_LOADED':
|
||||
var albums_index = Object.assign({}, core.albums);
|
||||
var albums_loaded = [];
|
||||
var artists_loaded = [];
|
||||
var tracks_loaded = [];
|
||||
|
||||
action.albums.forEach(album => {
|
||||
helpers.formatAlbum(album)
|
||||
action.albums.forEach(raw_album => {
|
||||
var album = helpers.formatAlbum(raw_album);
|
||||
|
||||
if (albums_index[album.uri]){
|
||||
album = Object.assign({}, albums_index[album.uri], album);
|
||||
}
|
||||
|
||||
if (album.images && album.images.length > 0){
|
||||
album.images = helpers.digestMopidyImages(store.getState().mopidy, album.images);
|
||||
if (raw_album.images && raw_album.images.length > 0){
|
||||
album.images = helpers.digestMopidyImages(store.getState().mopidy, raw_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];
|
||||
if (raw_album.tracks){
|
||||
album.tracks_uris = helpers.arrayOf('uri', raw_album.tracks);
|
||||
tracks_loaded = [...tracks_loaded, ...raw_album.tracks];
|
||||
}
|
||||
|
||||
if (raw_album.artists){
|
||||
album.artists_uris = helpers.arrayOf('uri', raw_album.artists);
|
||||
artists_loaded = [...artists_loaded, ...raw_album.artists];
|
||||
}
|
||||
|
||||
albums_loaded.push(album);
|
||||
@ -484,7 +486,11 @@ const CoreMiddleware = (function(){
|
||||
|
||||
action.albums = albums_loaded;
|
||||
|
||||
// Trigger the tracks load action
|
||||
store.dispatch({
|
||||
type: 'ARTISTS_LOADED',
|
||||
artists: artists_loaded
|
||||
});
|
||||
|
||||
store.dispatch({
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: tracks_loaded
|
||||
|
||||
@ -115,7 +115,6 @@ const SpotifyMiddleware = (function(){
|
||||
break
|
||||
|
||||
case 'SPOTIFY_ARTIST_ALBUMS_LOADED':
|
||||
console.log(action)
|
||||
store.dispatch(coreActions.albumsLoaded(action.data.items));
|
||||
store.dispatch({
|
||||
type: 'ARTIST_ALBUMS_LOADED',
|
||||
|
||||
@ -59,11 +59,16 @@ class Album extends React.Component{
|
||||
setWindowTitle(album = this.props.album){
|
||||
if (album){
|
||||
var artists = "";
|
||||
for (var i = 0; i < album.artists.length; i++){
|
||||
if (artists != ""){
|
||||
artists += ", ";
|
||||
if (album.artists_uris && this.props.artists){
|
||||
for (var i = 0; i < album.artists_uris.length; i++){
|
||||
var uri = album.artists_uris[i]
|
||||
if (this.props.artists.hasOwnProperty(uri)){
|
||||
if (artists != ""){
|
||||
artists += ", ";
|
||||
}
|
||||
artists += this.props.artists[uri].name;
|
||||
}
|
||||
}
|
||||
artists += album.artists[i].name;
|
||||
}
|
||||
this.props.uiActions.setWindowTitle(album.name+" by "+artists+" (album)");
|
||||
} else{
|
||||
@ -114,27 +119,9 @@ class Album extends React.Component{
|
||||
}
|
||||
}
|
||||
|
||||
var artists = []
|
||||
if (this.props.album.artists_uris && this.props.artists){
|
||||
for (var i = 0; i < this.props.album.artists_uris.length; i++){
|
||||
var uri = this.props.album.artists_uris[i]
|
||||
if (this.props.artists.hasOwnProperty(uri)){
|
||||
artists.push(this.props.artists[uri])
|
||||
}
|
||||
}
|
||||
}
|
||||
var album = helpers.collateObject(this.props.album, {tracks: this.props.tracks, artists: this.props.artists});
|
||||
|
||||
var tracks = [];
|
||||
if (this.props.album.tracks_uris && this.props.tracks){
|
||||
for (var i = 0; i < this.props.album.tracks_uris.length; i++){
|
||||
var uri = this.props.album.tracks_uris[i]
|
||||
if (this.props.tracks.hasOwnProperty(uri)){
|
||||
tracks.push(this.props.tracks[uri])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tracks.length <= 0 && helpers.isLoading(this.props.load_queue,['spotify_albums/'+helpers.getFromUri('albumid',this.props.params.uri)])){
|
||||
if (album.tracks && album.tracks.length <= 0 && helpers.isLoading(this.props.load_queue,['spotify_albums/'+helpers.getFromUri('albumid',this.props.params.uri)])){
|
||||
var is_loading_tracks = true;
|
||||
} else {
|
||||
var is_loading_tracks = false;
|
||||
@ -143,19 +130,19 @@ class Album extends React.Component{
|
||||
return (
|
||||
<div className="view album-view content-wrapper">
|
||||
<div className="thumbnail-wrapper">
|
||||
<Thumbnail size="large" canZoom images={this.props.album.images} />
|
||||
<Thumbnail size="large" canZoom images={album.images} />
|
||||
</div>
|
||||
|
||||
<div className="title">
|
||||
|
||||
<h1>{ this.props.album.name }</h1>
|
||||
<h1>{album.name}</h1>
|
||||
|
||||
<ul className="details">
|
||||
{ !this.props.slim_mode ? <li className="has-tooltip"><Icon type="fontawesome" name={helpers.sourceIcon(this.props.params.uri )} /><span className="tooltip">{helpers.uriSource(this.props.params.uri )} {this.props.album.album_type ? this.props.album.album_type : 'album'}</span></li> : null }
|
||||
{ !this.props.slim_mode && artists.length > 0 ? <li><ArtistSentence artists={artists} /></li> : null }
|
||||
{ this.props.album.date ? <li><Dater type="date" data={ this.props.album.date } /></li> : null }
|
||||
{!this.props.slim_mode ? <li className="has-tooltip"><Icon type="fontawesome" name={helpers.sourceIcon(this.props.params.uri )} /><span className="tooltip">{helpers.uriSource(this.props.params.uri )} {album.type ? album.type : 'album'}</span></li> : null}
|
||||
{!this.props.slim_mode && album.artists.length > 0 ? <li><ArtistSentence artists={album.artists} /></li> : null}
|
||||
{album.release_date ? <li><Dater type="date" data={album.release_date} /></li> : null}
|
||||
<li>
|
||||
{tracks ? <span>{tracks.length} tracks, <Dater type="total-time" data={tracks} /></span> : '0 tracks, 0 mins' }
|
||||
{album.tracks ? <span>{album.tracks.length} tracks, <Dater type="total-time" data={album.tracks} /></span> : '0 tracks, 0 mins' }
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@ -167,8 +154,8 @@ class Album extends React.Component{
|
||||
</div>
|
||||
|
||||
<section className="list-wrapper">
|
||||
<TrackList className="album-track-list" tracks={tracks} uri={this.props.params.uri} />
|
||||
<LazyLoadListener loading={this.props.album.tracks_more} forceLoader={is_loading_tracks} loadMore={() => this.loadMore()}/>
|
||||
<TrackList className="album-track-list" tracks={album.tracks} uri={this.props.params.uri} />
|
||||
<LazyLoadListener loading={album.tracks_more} forceLoader={is_loading_tracks} loadMore={() => this.loadMore()}/>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user