Files
Iris/src/js/services/lastfm/actions.js

308 lines
9.5 KiB
JavaScript
Raw Normal View History

2016-11-07 21:21:15 +13:00
var coreActions = require('../core/actions')
2017-03-27 14:23:38 +13:00
var uiActions = require('../ui/actions')
var helpers = require('../../helpers')
2016-11-07 21:21:15 +13:00
/**
2017-11-04 14:03:59 +13:00
* Send an ajax request to the LastFM API
2016-11-07 21:21:15 +13:00
*
2017-11-04 14:03:59 +13:00
* @param dispatch = obj
* @param getState = obj
* @param params = string, the url params to send
2017-11-04 22:09:51 +13:00
* @params signed = boolean, whether we've got a signed request with baked-in api_key
2016-11-07 21:21:15 +13:00
**/
2017-11-04 22:09:51 +13:00
const sendRequest = (dispatch, getState, params, signed = false) => {
2017-10-10 13:05:28 +13:00
return new Promise((resolve, reject) => {
2016-11-07 21:21:15 +13:00
2017-11-04 22:09:51 +13:00
var loader_key = helpers.generateGuid();
dispatch(uiActions.startLoading(loader_key, 'lastfm_'+params));
2017-03-27 14:23:38 +13:00
var config = {
method: 'GET',
cache: true,
timeout: 30000,
2017-11-04 22:09:51 +13:00
url: '//ws.audioscrobbler.com/2.0/?format=json&'+params
}
// Signed requests don't need our api_key as the proxy has it's own
if (!signed){
config.url += '&api_key=4320a3ef51c9b3d69de552ac083c55e3';
} else {
config.method = 'POST';
}
2017-10-10 13:05:28 +13:00
$.ajax(config).then(
2017-03-27 14:23:38 +13:00
response => {
dispatch(uiActions.stopLoading(loader_key))
resolve(response)
},
2016-11-07 21:21:15 +13:00
(xhr, status, error) => {
2017-03-27 14:23:38 +13:00
dispatch(uiActions.stopLoading(loader_key))
dispatch(coreActions.handleException(
'LastFM: '+xhr.responseText,
{
config: config,
error: error,
status: status,
xhr: xhr
}
));
2016-11-07 21:21:15 +13:00
reject(error)
}
)
})
}
2017-11-04 22:09:51 +13:00
/**
* Send a SIGNED ajax request to the LastFM API
*
* @param dispatch = obj
* @param getState = obj
* @param params = string, the url params to send
* @param signed = boolean
**/
const sendSignedRequest = (dispatch, getState, params) => {
return new Promise((resolve, reject) => {
var loader_key = helpers.generateGuid()
dispatch(uiActions.startLoading(loader_key, 'lastfm_'+params))
var config = {
method: 'GET',
cache: false,
timeout: 30000,
url: getState().lastfm.authorization_url+"?action=sign_request&"+params
}
$.ajax(config).then(
response => {
var signed_params = "";
for (var key in response){
if (response.hasOwnProperty(key)){
if (signed_params != ""){
signed_params += "&"
}
signed_params += key+'='+response[key];
}
}
dispatch(uiActions.stopLoading(loader_key))
return sendRequest(dispatch, getState, signed_params, true)
},
(xhr, status, error) => {
dispatch(uiActions.stopLoading(loader_key))
dispatch(coreActions.handleException(
'LastFM: '+xhr.responseText,
{
config: config,
error: error,
status: status,
xhr: xhr
}
));
reject(error)
}
);
})
}
2017-11-02 21:20:56 +13:00
export function set(data){
return {
type: 'LASTFM_SET',
data: data
}
}
/**
* Handle authorization process
**/
export function authorizationGranted(data){
data.session.expiry = new Date().getTime() + 3600;
return {
type: 'LASTFM_AUTHORIZATION_GRANTED',
data: data
}
2017-11-02 21:20:56 +13:00
}
export function revokeAuthorization(){
return { type: 'LASTFM_AUTHORIZATION_REVOKED' }
}
export function connect(){
return (dispatch, getState) => {
dispatch({ type: 'LASTFM_CONNECTING' });
2017-11-04 14:03:59 +13:00
// Authorized? Multi-purpose our connection test to get the current user
if (getState().lastfm.session){
dispatch(getMe());
2017-11-04 14:03:59 +13:00
// Not authorized? Just use a generic lookup to test our connection
} else {
sendRequest(dispatch, getState, 'method=artist.getInfo&artist=')
.then(
response => {
dispatch({ type: 'LASTFM_CONNECTED' })
}
)
}
}
}
2017-11-04 14:03:59 +13:00
/**
* Signed requests
* TODO
**/
2017-11-04 22:09:51 +13:00
export function loveTrack(uri, artist, track){
2017-11-04 14:03:59 +13:00
return (dispatch, getState) => {
2017-11-04 22:09:51 +13:00
artist = encodeURIComponent(artist);
var params = 'method=track.love&track='+track+'&artist='+artist;
sendSignedRequest(dispatch, getState, params)
2017-11-04 14:03:59 +13:00
.then(
response => {
2017-11-06 08:00:06 +13:00
console.log(response);
2017-11-04 14:03:59 +13:00
dispatch({
2017-11-04 22:09:51 +13:00
type: 'TRACK_LOADED',
key: uri,
track: {
userloved: true
}
});
}
)
}
}
export function unloveTrack(uri, artist, track){
return (dispatch, getState) => {
artist = encodeURIComponent(artist);
var params = 'method=track.unlove&track='+track+'&artist='+artist;
sendSignedRequest(dispatch, getState, params)
.then(
response => {
dispatch({
type: 'TRACK_LOADED',
key: uri,
track: {
userloved: false
}
2017-11-04 14:03:59 +13:00
});
}
)
}
}
/**
* Non-signed requests
**/
export function getMe(){
return (dispatch, getState) => {
var params = 'method=user.getInfo&user='+getState().lastfm.session.name
sendRequest(dispatch, getState, params)
.then(
response => {
if (response.user){
dispatch({
type: 'LASTFM_USER_LOADED',
user: response.user
});
dispatch({ type: 'LASTFM_CONNECTED' })
}
}
)
}
}
2017-10-10 13:05:28 +13:00
export function getArtist(uri, artist, mbid = false){
2016-11-07 21:21:15 +13:00
return (dispatch, getState) => {
2017-10-10 13:05:28 +13:00
if (mbid){
2016-11-07 21:21:15 +13:00
var params = 'method=artist.getInfo&mbid='+mbid
} else {
2017-10-10 13:05:28 +13:00
artist = encodeURIComponent(artist );
2016-11-07 21:21:15 +13:00
var params = 'method=artist.getInfo&artist='+artist
}
sendRequest(dispatch, getState, params)
.then(
response => {
2017-10-10 13:05:28 +13:00
if (response.artist){
2016-11-07 21:21:15 +13:00
dispatch({
2017-01-15 21:06:24 +13:00
type: 'ARTIST_LOADED',
2017-01-19 16:13:47 +13:00
key: uri,
2017-01-15 21:06:24 +13:00
artist: {
images: response.artist.image,
2017-02-08 20:05:37 +13:00
bio: response.artist.bio,
listeners: parseInt(response.artist.stats.listeners),
play_count: parseInt(response.artist.stats.playcount),
on_tour: response.artist.stats.ontour
2017-01-15 21:06:24 +13:00
}
2016-11-07 21:21:15 +13:00
});
}
}
)
}
}
2017-10-10 13:05:28 +13:00
export function getAlbum(artist, album, mbid = false){
2016-11-07 21:21:15 +13:00
return (dispatch, getState) => {
dispatch({ type: 'LASTFM_ALBUM_LOADED', data: false });
2017-10-10 13:05:28 +13:00
if (mbid){
2016-11-07 21:21:15 +13:00
var params = 'method=album.getInfo&mbid='+mbid
} else {
2017-10-10 13:05:28 +13:00
artist = encodeURIComponent(artist )
album = encodeURIComponent(album )
2016-11-07 21:21:15 +13:00
var params = 'method=album.getInfo&album='+album+'&artist='+artist
}
sendRequest(dispatch, getState, params)
.then(
response => {
2017-10-10 13:05:28 +13:00
if (response.album){
2016-11-07 21:21:15 +13:00
dispatch({
type: 'LASTFM_ALBUM_LOADED',
data: response.album
});
}
}
)
}
}
2017-11-04 22:09:51 +13:00
export function getTrack(track, artist_name = null, track_name = null){
2016-11-07 21:21:15 +13:00
return (dispatch, getState) => {
2017-11-04 22:09:51 +13:00
if (track){
artist_name = track.artist[0].name;
track_name = track.name;
}
artist_name = encodeURIComponent(artist_name);
var params = 'method=track.getInfo&track='+track+'&artist='+artist;
if (getState().lastfm.session){
params += '&username='+getState().lastfm.session.name;
}
sendRequest(dispatch, getState, params)
2016-11-07 21:21:15 +13:00
.then(
response => {
2017-10-10 13:05:28 +13:00
if (response.track){
2017-11-04 22:09:51 +13:00
var merged_track = Object.assign(
{},
response.track,
track
);
2016-11-07 21:21:15 +13:00
dispatch({
2017-11-04 22:09:51 +13:00
type: 'TRACK_LOADED',
key: uri,
track: merged_track
2016-11-07 21:21:15 +13:00
});
}
}
)
}
}