Preliminary lastfm

This commit is contained in:
James Barnsley
2016-11-07 21:21:15 +13:00
parent 757f11a6dd
commit 0a13eeaec1
19 changed files with 680 additions and 198 deletions

View File

@ -3799,6 +3799,24 @@
sizes.small = images[i].url;
}
// lastfm-styled images
} else if (typeof images[i].size !== 'undefined') {
switch (images[i].size) {
case 'mega':
case 'extralarge':
sizes.huge = images[i]['#text'];
break;
case 'large':
sizes.large = images[i]['#text'];
break;
case 'medium':
sizes.medium = images[i]['#text'];
break;
case 'small':
sizes.small = images[i]['#text'];
break;
}
// Mopidy-Images styled images
} else if (typeof images[i] == 'string') {
sizes.small = images[i];
@ -3860,8 +3878,12 @@
var getFromUri = exports.getFromUri = function getFromUri(element, uri) {
var exploded = uri.split(':');
if (exploded[0] == 'spotify') {
if (element == 'mbid') {
var index = exploded.indexOf('mbid');
return exploded[index + 1];
}
if (exploded[0] == 'spotify') {
if (element == 'userid' && exploded[1] == 'user') return exploded[2];
if (element == 'playlistid' && exploded[3] == 'playlist') return exploded[4];
if (element == 'artistid' && exploded[1] == 'artist') return exploded[2];
@ -4859,7 +4881,7 @@
/* 39 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
@ -4871,6 +4893,10 @@
var _react2 = _interopRequireDefault(_react);
var _reactFontawesome = __webpack_require__(15);
var _reactFontawesome2 = _interopRequireDefault(_reactFontawesome);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@ -4893,17 +4919,17 @@
}
_createClass(LazyLoadListener, [{
key: "componentWillMount",
key: 'componentWillMount',
value: function componentWillMount() {
window.addEventListener("scroll", this.handleScroll, false);
}
}, {
key: "componentWillUnmount",
key: 'componentWillUnmount',
value: function componentWillUnmount() {
window.removeEventListener("scroll", this.handleScroll, false);
}
}, {
key: "handleScroll",
key: 'handleScroll',
value: function handleScroll(e) {
if (window.innerHeight + window.scrollY >= document.body.offsetHeight) {
if (!this.state.loading) {
@ -4915,21 +4941,9 @@
}
}
}, {
key: "render",
key: 'render',
value: function render() {
if (this.loading) {
return _react2.default.createElement(
"div",
{ className: "lazy-loader loading" },
_react2.default.createElement(
"div",
{ className: "content" },
"LOADING"
)
);
} else {
return _react2.default.createElement("div", { className: "lazy-loader" });
}
return _react2.default.createElement('div', { className: 'lazy-loader' });
}
}]);
@ -17755,10 +17769,14 @@
var _reducer6 = _interopRequireDefault(_reducer5);
var _reducer7 = __webpack_require__(176);
var _reducer7 = __webpack_require__(388);
var _reducer8 = _interopRequireDefault(_reducer7);
var _reducer9 = __webpack_require__(176);
var _reducer10 = _interopRequireDefault(_reducer9);
var _reduxThunk = __webpack_require__(343);
var _reduxThunk2 = _interopRequireDefault(_reduxThunk);
@ -17785,7 +17803,8 @@
ui: _reducer2.default,
pusher: _reducer4.default,
mopidy: _reducer6.default,
spotify: _reducer8.default
lastfm: _reducer8.default,
spotify: _reducer10.default
});
// set application defaults
@ -17807,6 +17826,11 @@
current: '0.0.0'
}
},
lastfm: {
album: {},
artist: {},
track: {}
},
spotify: {
connected: false,
country: 'NZ',
@ -19686,7 +19710,9 @@
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var actions = __webpack_require__(11);
var helpers = __webpack_require__(29);
var mopidyActions = __webpack_require__(11);
var lastfmActions = __webpack_require__(387);
var MopidyMiddleware = function () {
@ -19855,7 +19881,7 @@
instruct(socket, store, 'tracklist.add', { uri: action.uris[0], at_position: 0 }).then(function (response) {
// play it
store.dispatch(actions.changeTrack(response[0].tlid));
store.dispatch(mopidyActions.changeTrack(response[0].tlid));
// TODO: perhaps force update of currentTlTrack before we proceed?
// this will make the UI feel snappier...
@ -19863,7 +19889,7 @@
// add the rest of our uris (if any)
action.uris.shift();
if (action.uris.length > 0) {
store.dispatch(actions.enqueueTracks(action.uris, 1));
store.dispatch(mopidyActions.enqueueTracks(action.uris, 1));
}
});
break;
@ -19919,6 +19945,7 @@
instruct(socket, store, 'library.lookup', action.data).then(function (response) {
var album = response[0].album;
album.artists = response[0].artists;
if (!album.images) album.images = [];
album.tracks = {
items: response,
total: response.length
@ -19929,6 +19956,17 @@
uris.push(album.tracks.items[i].uri);
}
// load artwork from LastFM
if (album.images.length <= 0) {
var mbid = helpers.getFromUri('mbid', album.uri);
if (mbid) {
store.dispatch(lastfmActions.getAlbum(false, false, mbid));
} else {
store.dispatch(lastfmActions.getAlbum(album.artists[0].name, album.name));
}
}
instruct(socket, store, 'library.lookup', { uris: uris }).then(function (response) {
for (var uri in response) {
@ -19959,8 +19997,8 @@
store.dispatch({ type: 'MOPIDY_ARTIST_LOADED', data: false });
instruct(socket, store, 'library.lookup', action.data).then(function (response) {
var artist = response[0].artists[0];
artist.images = [];
artist.albums = [];
if (!artist.images) artist.images = [];
if (!artist.albums) artist.albums = [];
artist.tracks = response.slice(0, 10);
var _loop = function _loop() {
@ -19984,6 +20022,15 @@
_loop();
}
// load artwork from LastFM
if (artist.images.length <= 0) {
if (artist.musicbrainz_id) {
store.dispatch(lastfmActions.getArtist(false, artist.musicbrainz_id));
} else {
store.dispatch(lastfmActions.getArtist(artist.name));
}
}
store.dispatch({ type: 'MOPIDY_ARTIST_LOADED', data: artist });
});
break;
@ -20728,13 +20775,21 @@
var _Dater2 = _interopRequireDefault(_Dater);
var _actions = __webpack_require__(10);
var _LazyLoadListener = __webpack_require__(39);
var spotifyActions = _interopRequireWildcard(_actions);
var _LazyLoadListener2 = _interopRequireDefault(_LazyLoadListener);
var _actions2 = __webpack_require__(11);
var _actions = __webpack_require__(11);
var mopidyActions = _interopRequireWildcard(_actions2);
var mopidyActions = _interopRequireWildcard(_actions);
var _actions2 = __webpack_require__(387);
var lastfmActions = _interopRequireWildcard(_actions2);
var _actions3 = __webpack_require__(10);
var spotifyActions = _interopRequireWildcard(_actions3);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
@ -20779,24 +20834,52 @@
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props;
var source = helpers.uriSource(props.params.uri);
if (source == 'spotify') {
this.props.spotifyActions.getAlbum(props.params.uri);
} else if (source == 'local' && props.mopidy.connected) {
this.props.mopidyActions.getAlbum(props.params.uri);
}
}
}, {
key: 'loadMore',
value: function loadMore() {
if (!this.props.spotify.album || !this.props.spotify.album.tracks.next) return;
this.props.spotifyActions.getURL(this.props.spotify.album.tracks.next, 'SPOTIFY_ALBUM_LOADED_MORE');
}
}, {
key: 'album',
value: function album() {
var album = {
name: false,
tracks: {
items: []
},
artists: [],
images: []
};
switch (helpers.uriSource(this.props.params.uri)) {
case 'spotify':
Object.assign(album, this.props.spotify.album);
album.artists = this.props.spotify.artists;
break;
case 'local':
Object.assign(album, this.props.mopidy.album);
if (this.props.lastfm.album.image) album.images = this.props.lastfm.album.image;
break;
}
return album;
}
}, {
key: 'render',
value: function render() {
var source = helpers.uriSource(this.props.params.uri);
if (source == 'spotify') {
var album = this.props.spotify.album;
var artists = this.props.spotify.artists;
} else if (source == 'local') {
var album = this.props.mopidy.album;
var artists = [];
}
if (!album) return null;
var _this2 = this;
var album = this.album();
return _react2.default.createElement(
'div',
@ -20804,8 +20887,8 @@
_react2.default.createElement(
'div',
{ className: 'intro' },
_react2.default.createElement(_Thumbnail2.default, { size: 'large', images: album.images ? album.images : [] }),
_react2.default.createElement(_ArtistGrid2.default, { artists: artists }),
_react2.default.createElement(_Thumbnail2.default, { size: 'large', images: album.images }),
_react2.default.createElement(_ArtistGrid2.default, { artists: album.artists }),
_react2.default.createElement(
'ul',
{ className: 'details' },
@ -20822,18 +20905,14 @@
'Released ',
_react2.default.createElement(_Dater2.default, { type: 'date', data: album.release_date })
) : null,
source == 'spotify' ? _react2.default.createElement(
_react2.default.createElement(
'li',
null,
_react2.default.createElement(_reactFontawesome2.default, { name: source }),
' Spotify playlist'
) : null,
source == 'local' ? _react2.default.createElement(
'li',
null,
_react2.default.createElement(_reactFontawesome2.default, { name: 'folder' }),
' Local playlist'
) : null
_react2.default.createElement(_reactFontawesome2.default, { name: helpers.sourceIcon(this.props.params.uri) }),
' ',
helpers.uriSource(this.props.params.uri),
' playlist'
)
)
),
_react2.default.createElement(
@ -20853,7 +20932,14 @@
_react2.default.createElement(_ArtistSentence2.default, { artists: album.artists })
)
),
_react2.default.createElement(_TrackList2.default, { tracks: album.tracks.items })
_react2.default.createElement(
'section',
{ className: 'list-wrapper' },
_react2.default.createElement(_TrackList2.default, { tracks: album.tracks.items }),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore();
} })
)
)
);
}
@ -20875,6 +20961,7 @@
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
return {
mopidyActions: (0, _redux.bindActionCreators)(mopidyActions, dispatch),
lastfmActions: (0, _redux.bindActionCreators)(lastfmActions, dispatch),
spotifyActions: (0, _redux.bindActionCreators)(spotifyActions, dispatch)
};
};
@ -21071,6 +21158,10 @@
var _redux = __webpack_require__(6);
var _reactFontawesome = __webpack_require__(15);
var _reactFontawesome2 = _interopRequireDefault(_reactFontawesome);
var _LazyLoadListener = __webpack_require__(39);
var _LazyLoadListener2 = _interopRequireDefault(_LazyLoadListener);
@ -21103,9 +21194,13 @@
var mopidyActions = _interopRequireWildcard(_actions);
var _actions2 = __webpack_require__(10);
var _actions2 = __webpack_require__(387);
var spotifyActions = _interopRequireWildcard(_actions2);
var lastfmActions = _interopRequireWildcard(_actions2);
var _actions3 = __webpack_require__(10);
var spotifyActions = _interopRequireWildcard(_actions3);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
@ -21163,8 +21258,8 @@
this.props.spotifyActions.getURL(this.props.spotify.artist_albums.next, 'SPOTIFY_ARTIST_ALBUMS_LOADED_MORE');
}
}, {
key: 'renderSpotifyAlbum',
value: function renderSpotifyAlbum() {
key: 'renderSpotifyArtist',
value: function renderSpotifyArtist() {
var _this2 = this;
if (!this.props.spotify.artist) return null;
@ -21198,7 +21293,13 @@
null,
artist.popularity,
'% popularity'
) : null
) : null,
_react2.default.createElement(
'li',
null,
_react2.default.createElement(_reactFontawesome2.default, { name: 'spotify' }),
' Spotify artist'
)
)
),
_react2.default.createElement(
@ -21228,18 +21329,24 @@
{ className: 'left-padding' },
'Albums'
),
albums ? _react2.default.createElement(_AlbumGrid2.default, { className: 'no-top-padding', albums: albums.items }) : null,
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore();
} })
_react2.default.createElement(
'section',
{ className: 'grid-wrapper no-top-padding' },
albums ? _react2.default.createElement(_AlbumGrid2.default, { albums: albums.items }) : null,
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore();
} })
)
);
}
}, {
key: 'renderMopidyAlbum',
value: function renderMopidyAlbum() {
key: 'renderMopidyArtist',
value: function renderMopidyArtist() {
if (!this.props.mopidy.artist) return null;
var artist = this.props.mopidy.artist;
if (this.props.lastfm.artist.image && this.props.lastfm.artist.name == artist.name) artist.images = this.props.lastfm.artist.image;
return _react2.default.createElement(
'div',
{ className: 'view artist-view' },
@ -21252,6 +21359,22 @@
'h1',
null,
artist.name
),
_react2.default.createElement(
'ul',
{ className: 'details' },
_react2.default.createElement(
'li',
null,
artist.albums.length.toLocaleString(),
' albums'
),
_react2.default.createElement(
'li',
null,
_react2.default.createElement(_reactFontawesome2.default, { name: 'folder' }),
' Local artist'
)
)
),
_react2.default.createElement(
@ -21265,15 +21388,19 @@
{ className: 'left-padding' },
'Albums'
),
artist.albums ? _react2.default.createElement(_AlbumGrid2.default, { className: 'no-top-padding', albums: artist.albums }) : null
_react2.default.createElement(
'section',
{ className: 'grid-wrapper no-top-padding' },
artist.albums ? _react2.default.createElement(_AlbumGrid2.default, { albums: artist.albums }) : null
)
);
}
}, {
key: 'render',
value: function render() {
var source = helpers.uriSource(this.props.params.uri);
if (source == 'spotify') return this.renderSpotifyAlbum();
if (source == 'local') return this.renderMopidyAlbum();
if (source == 'spotify') return this.renderSpotifyArtist();
if (source == 'local') return this.renderMopidyArtist();
}
}]);
@ -21293,6 +21420,7 @@
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
return {
mopidyActions: (0, _redux.bindActionCreators)(mopidyActions, dispatch),
lastfmActions: (0, _redux.bindActionCreators)(lastfmActions, dispatch),
spotifyActions: (0, _redux.bindActionCreators)(spotifyActions, dispatch)
};
};
@ -21408,8 +21536,13 @@
var _this2 = this;
var source = helpers.uriSource(this.props.params.uri);
if (source == 'spotify') var playlist = this.props.spotify.playlist;
if (source == 'm3u') var playlist = this.props.mopidy.playlist;
var source_name = source;
if (source == 'spotify') {
var playlist = this.props.spotify.playlist;
} else if (source == 'm3u') {
var playlist = this.props.mopidy.playlist;
source_name = 'local';
}
if (!playlist) return null;
return _react2.default.createElement(
@ -21436,18 +21569,14 @@
_react2.default.createElement(_Dater2.default, { type: 'ago', data: playlist.last_modified }),
' ago'
) : null,
source == 'spotify' ? _react2.default.createElement(
_react2.default.createElement(
'li',
null,
_react2.default.createElement(_reactFontawesome2.default, { name: source }),
' Spotify playlist'
) : null,
source == 'm3u' ? _react2.default.createElement(
'li',
null,
_react2.default.createElement(_reactFontawesome2.default, { name: 'folder' }),
' Local playlist'
) : null
_react2.default.createElement(_reactFontawesome2.default, { name: helpers.sourceIcon(this.props.params.uri) }),
' ',
source_name,
' playlist'
)
)
),
_react2.default.createElement(
@ -21462,11 +21591,15 @@
playlist.name
)
),
_react2.default.createElement(_TrackList2.default, { tracks: playlist.tracks.items })
),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore();
} })
_react2.default.createElement(
'section',
{ className: 'list-wrapper' },
_react2.default.createElement(_TrackList2.default, { tracks: playlist.tracks.items }),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore();
} })
)
)
);
}
}]);
@ -21798,11 +21931,11 @@
_react2.default.createElement(
'section',
{ className: 'grid-wrapper' },
_react2.default.createElement(_ArtistGrid2.default, { artists: this.compiledResults('artists') })
),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore('artists');
} })
_react2.default.createElement(_ArtistGrid2.default, { artists: this.compiledResults('artists') }),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore('artists');
} })
)
);
break;
@ -21813,11 +21946,11 @@
_react2.default.createElement(
'section',
{ className: 'grid-wrapper' },
_react2.default.createElement(_AlbumGrid2.default, { albums: this.compiledResults('albums') })
),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore('albums');
} })
_react2.default.createElement(_AlbumGrid2.default, { albums: this.compiledResults('albums') }),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore('albums');
} })
)
);
break;
@ -21828,11 +21961,11 @@
_react2.default.createElement(
'section',
{ className: 'grid-wrapper' },
_react2.default.createElement(_PlaylistGrid2.default, { playlists: this.compiledResults('playlists') })
),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore('playlists');
} })
_react2.default.createElement(_PlaylistGrid2.default, { playlists: this.compiledResults('playlists') }),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore('playlists');
} })
)
);
break;
@ -21843,11 +21976,11 @@
_react2.default.createElement(
'section',
{ className: 'list-wrapper' },
_react2.default.createElement(_TrackList2.default, { show_source_icon: true, tracks: this.compiledResults('tracks') })
),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore('tracks');
} })
_react2.default.createElement(_TrackList2.default, { show_source_icon: true, tracks: this.compiledResults('tracks') }),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore('tracks');
} })
)
);
break;
@ -21925,11 +22058,11 @@
'Tracks'
)
),
_react2.default.createElement(_TrackList2.default, { show_source_icon: true, tracks: this.compiledResults('tracks') })
),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore('tracks');
} })
_react2.default.createElement(_TrackList2.default, { show_source_icon: true, tracks: this.compiledResults('tracks') }),
_react2.default.createElement(_LazyLoadListener2.default, { loadMore: function loadMore() {
return _this2.loadMore('tracks');
} })
)
);
}
}
@ -50974,6 +51107,150 @@
module.exports = isPlainObject;
/***/ },
/* 380 */,
/* 381 */,
/* 382 */,
/* 383 */,
/* 384 */,
/* 385 */,
/* 386 */,
/* 387 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function($) {'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getArtist = getArtist;
exports.getAlbum = getAlbum;
exports.getTrack = getTrack;
var helpers = __webpack_require__(29);
/**
* Send an ajax request to the Spotify API
*
* @param dispatch obj
* @param getState obj
* @param endpoint params = the url params to send
**/
var sendRequest = function sendRequest(dispatch, getState, params) {
return new Promise(function (resolve, reject) {
var url = '//ws.audioscrobbler.com/2.0/?format=json&api_key=4320a3ef51c9b3d69de552ac083c55e3&' + params;
$.ajax({
method: 'GET',
cache: true,
url: url
}).then(function (response) {
return resolve(response);
}, function (xhr, status, error) {
console.error(params + ' failed', xhr.responseText);
reject(error);
});
});
};
function getArtist(artist) {
var mbid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
return function (dispatch, getState) {
dispatch({ type: 'LASTFM_ARTIST_LOADED', data: false });
if (mbid) {
var params = 'method=artist.getInfo&mbid=' + mbid;
} else {
artist = encodeURIComponent(artist);
var params = 'method=artist.getInfo&artist=' + artist;
}
sendRequest(dispatch, getState, params).then(function (response) {
if (response.artist) {
dispatch({
type: 'LASTFM_ARTIST_LOADED',
data: response.artist
});
}
});
};
}
function getAlbum(artist, album) {
var mbid = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
return function (dispatch, getState) {
dispatch({ type: 'LASTFM_ALBUM_LOADED', data: false });
if (mbid) {
var params = 'method=album.getInfo&mbid=' + mbid;
} else {
artist = encodeURIComponent(artist);
album = encodeURIComponent(album);
var params = 'method=album.getInfo&album=' + album + '&artist=' + artist;
}
sendRequest(dispatch, getState, params).then(function (response) {
if (response.album) {
dispatch({
type: 'LASTFM_ALBUM_LOADED',
data: response.album
});
}
});
};
}
function getTrack(artist, track) {
return function (dispatch, getState) {
dispatch({ type: 'LASTFM_TRACK_LOADED', data: false });
artist = encodeURIComponent(artist);
sendRequest(dispatch, getState, 'method=track.getInfo&track=' + track + '&artist=' + artist).then(function (response) {
if (response.track) {
dispatch({
type: 'LASTFM_TRACK_LOADED',
data: response.track
});
}
});
};
}
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(70)))
/***/ },
/* 388 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = reducer;
function reducer() {
var lastfm = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var action = arguments[1];
switch (action.type) {
case 'LASTFM_ARTIST_LOADED':
return Object.assign({}, lastfm, { artist: action.data });
case 'LASTFM_ALBUM_LOADED':
return Object.assign({}, lastfm, { album: action.data });
case 'LASTFM_TRACK_LOADED':
return Object.assign({}, lastfm, { track: action.data });
default:
return lastfm;
}
}
/***/ }
/******/ ])));
//# sourceMappingURL=app.js.map