LastFM love/unlove track update; Link to privacy policy in settings #229
This commit is contained in:
@ -57,9 +57,8 @@ class ContextMenu extends React.Component{
|
||||
|
||||
// if we're able to be in the LastFM library, run a check
|
||||
if (nextProps.lastfm_authorized && context.is_track && context.items_count == 1){
|
||||
if (nextProps.menu.items[0].uri && this.props.tracks[nextProps.menu.items[0].uri] !== undefined){
|
||||
var track = this.props.tracks[nextProps.menu.items[0].uri];
|
||||
this.props.lastfmActions.getTrack(track);
|
||||
if (nextProps.menu.items[0].uri && this.props.tracks[nextProps.menu.items[0].uri] !== undefined && this.props.tracks[nextProps.menu.items[0].uri].userloved === undefined){
|
||||
this.props.lastfmActions.getTrack(nextProps.menu.items[0].uri);
|
||||
}
|
||||
}
|
||||
|
||||
@ -222,9 +221,9 @@ class ContextMenu extends React.Component{
|
||||
toggleLoved(e, is_loved){
|
||||
this.props.uiActions.hideContextMenu()
|
||||
if (is_loved){
|
||||
this.props.lastfmActions.unloveTrack(this.props.menu.items[0])
|
||||
this.props.lastfmActions.unloveTrack(this.props.menu.items[0].uri)
|
||||
} else {
|
||||
this.props.lastfmActions.loveTrack(this.props.menu.items[0])
|
||||
this.props.lastfmActions.loveTrack(this.props.menu.items[0].uri)
|
||||
}
|
||||
}
|
||||
|
||||
@ -488,8 +487,9 @@ class ContextMenu extends React.Component{
|
||||
</span>
|
||||
)
|
||||
|
||||
|
||||
if (helpers.isLoading(this.props.load_queue,['lastfm_track.getInfo'])){
|
||||
if (!this.props.lastfm_authorized){
|
||||
var toggle_loved = null;
|
||||
} else if (helpers.isLoading(this.props.load_queue,['lastfm_track.getInfo'])){
|
||||
var toggle_loved = (
|
||||
<span className="menu-item-wrapper">
|
||||
<a className="menu-item">
|
||||
|
||||
@ -54,7 +54,7 @@ class ProgressSlider extends React.Component{
|
||||
|
||||
const mapStateToProps = (state, ownProps) => {
|
||||
return {
|
||||
current_track: (state.core.current_track !== undefined && state.core.tracks !== undefined && state.core.tracks[state.core.current_track] !== undefined ? state.core.tracks[state.core.current_track] : null),
|
||||
current_track: (state.core.tracks[state.core.current_track_uri] !== undefined ? state.core.tracks[state.core.current_track_uri] : null),
|
||||
connected: state.mopidy.connected,
|
||||
time_position: state.mopidy.time_position,
|
||||
play_state: state.mopidy.play_state
|
||||
|
||||
@ -570,7 +570,6 @@ const CoreMiddleware = (function(){
|
||||
**/
|
||||
|
||||
case 'LOADED_MORE':
|
||||
console.log(action);
|
||||
var parent_type_plural = action.parent_type+'s';
|
||||
var parent_index = Object.assign({}, core[action.parent_type+'s']);
|
||||
var parent = Object.assign({}, parent_index[action.parent_key]);
|
||||
|
||||
@ -151,77 +151,6 @@ export function revokeAuthorization(){
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Signed requests
|
||||
**/
|
||||
|
||||
export function loveTrack(uri, artist, track){
|
||||
return (dispatch, getState) => {
|
||||
artist = encodeURIComponent(artist);
|
||||
var params = 'method=track.love&track='+track+'&artist='+artist;
|
||||
sendSignedRequest(dispatch, getState, params)
|
||||
.then(
|
||||
response => {
|
||||
dispatch({
|
||||
type: 'TRACK_LOADED',
|
||||
track: {
|
||||
uri: uri,
|
||||
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',
|
||||
track: {
|
||||
uri: uri,
|
||||
userloved: false
|
||||
}
|
||||
});
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export function scrobble(track){
|
||||
return (dispatch, getState) => {
|
||||
var track_name = track.name;
|
||||
var artist_name = "Unknown";
|
||||
if (track.artists){
|
||||
artist_name = track.artists[0].name;
|
||||
}
|
||||
var artist_name = encodeURIComponent(artist_name);
|
||||
|
||||
var params = 'method=track.scrobble';
|
||||
params += '&track='+track_name+'&artist='+artist_name;
|
||||
params += '×tamp='+Math.floor(Date.now() / 1000);
|
||||
|
||||
sendSignedRequest(dispatch, getState, params)
|
||||
.then(
|
||||
response => {
|
||||
console.log("Scrobbled", response);
|
||||
},
|
||||
error => {
|
||||
dispatch(coreActions.handleException(
|
||||
'Could not scrobble track',
|
||||
error,
|
||||
(error.description ? error.description : null)
|
||||
));
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Non-signed requests
|
||||
@ -245,6 +174,55 @@ export function getMe(){
|
||||
}
|
||||
}
|
||||
|
||||
export function getTrack(uri){
|
||||
return (dispatch, getState) => {
|
||||
if (getState().core.tracks[uri] !== undefined){
|
||||
var track = getState().core.tracks[uri];
|
||||
if (!track.artists){
|
||||
dispatch(coreActions.handleException(
|
||||
"Could not get track",
|
||||
{},
|
||||
"Track has no artists"
|
||||
));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
dispatch(coreActions.handleException(
|
||||
"Could not get track",
|
||||
{},
|
||||
"Could not find track in index"
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
var track_name = track.name;
|
||||
var artist_name = encodeURIComponent(track.artists[0].name);
|
||||
var params = 'method=track.getInfo&track='+track_name+'&artist='+artist_name;
|
||||
if (getState().lastfm.session){
|
||||
params += '&username='+getState().lastfm.session.name;
|
||||
}
|
||||
sendRequest(dispatch, getState, params)
|
||||
.then(
|
||||
response => {
|
||||
if (response.track){
|
||||
var merged_track = Object.assign(
|
||||
{},
|
||||
{
|
||||
uri: track.uri
|
||||
},
|
||||
response.track,
|
||||
track
|
||||
);
|
||||
dispatch({
|
||||
type: 'TRACK_LOADED',
|
||||
track: merged_track
|
||||
});
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export function getArtist(uri, artist, mbid = false){
|
||||
return (dispatch, getState) => {
|
||||
if (mbid){
|
||||
@ -300,38 +278,122 @@ export function getAlbum(artist, album, mbid = false){
|
||||
}
|
||||
}
|
||||
|
||||
export function getTrack(track, artist_name = null, track_name = null){
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Signed requests
|
||||
**/
|
||||
|
||||
export function loveTrack(uri){
|
||||
return (dispatch, getState) => {
|
||||
if (track){
|
||||
track_name = track.name;
|
||||
if (track.artists){
|
||||
artist_name = track.artists[0].name;
|
||||
if (getState().core.tracks[uri] !== undefined){
|
||||
var track = getState().core.tracks[uri];
|
||||
if (!track.artists){
|
||||
dispatch(coreActions.handleException(
|
||||
"Could not love track",
|
||||
track,
|
||||
"Track has no artists"
|
||||
));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
dispatch(coreActions.handleException(
|
||||
"Could not love track",
|
||||
track,
|
||||
"Could not find track in index"
|
||||
));
|
||||
return;
|
||||
}
|
||||
artist_name = encodeURIComponent(artist_name);
|
||||
var params = 'method=track.getInfo&track='+track_name+'&artist='+artist_name;
|
||||
if (getState().lastfm.session){
|
||||
params += '&username='+getState().lastfm.session.name;
|
||||
}
|
||||
sendRequest(dispatch, getState, params)
|
||||
|
||||
var artist = encodeURIComponent(track.artists[0].name);
|
||||
var params = 'method=track.love&track='+track.name+'&artist='+artist;
|
||||
sendSignedRequest(dispatch, getState, params)
|
||||
.then(
|
||||
response => {
|
||||
if (response.track){
|
||||
var merged_track = Object.assign(
|
||||
{},
|
||||
{
|
||||
uri: track.uri
|
||||
},
|
||||
response.track,
|
||||
track
|
||||
);
|
||||
dispatch({
|
||||
type: 'TRACK_LOADED',
|
||||
track: merged_track
|
||||
});
|
||||
}
|
||||
track = Object.assign(
|
||||
{},
|
||||
track,
|
||||
{
|
||||
userloved: true
|
||||
}
|
||||
);
|
||||
dispatch({
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: [track]
|
||||
});
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function unloveTrack(uri){
|
||||
return (dispatch, getState) => {
|
||||
if (getState().core.tracks[uri] !== undefined){
|
||||
var track = getState().core.tracks[uri];
|
||||
if (!track.artists){
|
||||
dispatch(coreActions.handleException(
|
||||
"Could not unlove track",
|
||||
track,
|
||||
"Track has no artists"
|
||||
));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
dispatch(coreActions.handleException(
|
||||
"Could not unlove track",
|
||||
track,
|
||||
"Could not find track in index"
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
var artist = encodeURIComponent(track.artists[0].name);
|
||||
var params = 'method=track.unlove&track='+track.name+'&artist='+artist;
|
||||
sendSignedRequest(dispatch, getState, params)
|
||||
.then(
|
||||
response => {
|
||||
track = Object.assign(
|
||||
{},
|
||||
track,
|
||||
{
|
||||
userloved: false
|
||||
}
|
||||
);
|
||||
dispatch({
|
||||
type: 'TRACKS_LOADED',
|
||||
tracks: [track]
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function scrobble(track){
|
||||
return (dispatch, getState) => {
|
||||
var track_name = track.name;
|
||||
var artist_name = "Unknown";
|
||||
if (track.artists){
|
||||
artist_name = track.artists[0].name;
|
||||
}
|
||||
var artist_name = encodeURIComponent(artist_name);
|
||||
|
||||
var params = 'method=track.scrobble';
|
||||
params += '&track='+track_name+'&artist='+artist_name;
|
||||
params += '×tamp='+Math.floor(Date.now() / 1000);
|
||||
|
||||
sendSignedRequest(dispatch, getState, params)
|
||||
.then(
|
||||
response => {
|
||||
console.log("Scrobbled", response);
|
||||
},
|
||||
error => {
|
||||
dispatch(coreActions.handleException(
|
||||
'Could not scrobble track',
|
||||
error,
|
||||
(error.description ? error.description : null)
|
||||
));
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -439,7 +439,7 @@ class Settings extends React.Component {
|
||||
<em><a href="https://github.com/jaedb/Iris" target="_blank">Iris</a></em> is an open-source project by <a href="https://github.com/jaedb" target="_blank">James Barnsley</a>. It is provided free and with absolutely no warranty. If you paid someone for this software, please let me know.
|
||||
<br />
|
||||
<br />
|
||||
Google Analytics is used to help trace issues and provide valuable insight into how we can continue to make improvements.
|
||||
Google Analytics is used to help trace issues and provide valuable insight into how we can continue to make improvements. This may include personal information (eg Spotify Username). For more information, see <a href="https://github.com/jaedb/Iris/wiki/Terms-of-use" target="_blank">terms and conditions</a>.
|
||||
<br />
|
||||
</div>
|
||||
<br /><br />
|
||||
|
||||
@ -57,7 +57,7 @@ class Track extends React.Component{
|
||||
|
||||
// Ready to load LastFM
|
||||
if (nextProps.lastfm_authorized){
|
||||
this.props.lastfmActions.getTrack(nextProps.track);
|
||||
this.props.lastfmActions.getTrack(nextProps.track.uri);
|
||||
}
|
||||
|
||||
// Ready to load lyrics
|
||||
@ -77,6 +77,10 @@ class Track extends React.Component{
|
||||
this.props.uiActions.showContextMenu(data)
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: Identify why images being loaded breaks the thumbnail. Is there a new image array format
|
||||
* we need to accommodate?
|
||||
**/
|
||||
loadTrack(props = this.props){
|
||||
switch (helpers.uriSource(props.params.uri)){
|
||||
|
||||
@ -105,7 +109,7 @@ class Track extends React.Component{
|
||||
|
||||
// Get the LastFM version of this track (provided we have artist info)
|
||||
if (props.lastfm_authorized){
|
||||
this.props.lastfmActions.getTrack(props.track);
|
||||
this.props.lastfmActions.getTrack(props.track.uri);
|
||||
}
|
||||
|
||||
// Ready for lyrics
|
||||
|
||||
Reference in New Issue
Block a user