Consistent asset structure

This commit is contained in:
James Barnsley
2018-08-29 21:13:54 +12:00
parent 56e975898f
commit 0e32361c7e
9 changed files with 10922 additions and 13912 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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

View File

@ -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) => {

View File

@ -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 (

View File

@ -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;
}

View File

@ -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

View File

@ -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',

View File

@ -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>