public async Task TrackNowPlaying(Audio item, LfmUser user) { var request = new TrackUpdateNowPlayingRequest { track = item.Name, album = item.Album, artist = item.Artists.First(), mbid = Helpers.GetMusicBrainzTrackId(item), method = PluginConst.Methods.Track.UpdateNowPlaying, sk = user.SessionKey }; //Add duration if (item.RunTimeTicks != null) { request.duration = Convert.ToInt32(TimeSpan.FromTicks((long)item.RunTimeTicks).TotalSeconds); } var response = await Post <TrackUpdateNowPlayingRequest, TrackScrobbleResponse>(request); if (response != null && !response.IsError()) { Plugin.Logger.Info("{0} is now playing '{1}' - '{2}' - '{3}' - '{4}'", user.Username, request.track, request.album, request.artist, request.mbid); return; } Plugin.Logger.Error("Failed to send now playing for track: {0} - messagge {1}", item.Name, response?.message); }
private async Task <List <LfmLovedTrack> > UserGetLovedTracks(LfmUser lfmUser, IProgress <double> progress, CancellationToken cancellationToken, double maxProgress, double progressOffset) { var tracks = new List <LfmLovedTrack>(); var page = 1; bool hasMorePage; do { cancellationToken.ThrowIfCancellationRequested(); var response = await _lastfmApi.UserGetLovedTracks(lfmUser, page ++).ConfigureAwait(false); if (response?.lovedTracks?.track == null || !response.lovedTracks.track.Any()) { break; } tracks.AddRange(response.lovedTracks.track); hasMorePage = !response.lovedTracks.attr.IsLastPage(); //Only report progress in download because it will be 90% of the time taken var currentProgress = (double)response.lovedTracks.attr.page / response.lovedTracks.attr.totalPages * (maxProgress - progressOffset) + progressOffset; Plugin.Logger.Debug("Progress: " + currentProgress * 100); progress.Report(currentProgress * 100); } while(hasMorePage); return(tracks); }
private async Task <List <LfmArtist> > GetLibraryGetArtistTracks(LfmUser lfmUser, IProgress <double> progress, CancellationToken cancellationToken, double maxProgress, double progressOffset) { var artists = new List <LfmArtist>(); var page = 1; bool moreTracks; do { cancellationToken.ThrowIfCancellationRequested(); var response = await _lastfmApi.LibraryGetArtistTracks(lfmUser, page ++).ConfigureAwait(false); if (response?.artists?.artist == null || !response.artists.artist.Any()) { break; } artists.AddRange(response.artists.artist); moreTracks = !response.artists.attr.IsLastPage(); //Only report progress in download because it will be 90% of the time taken var currentProgress = (double)response.artists.attr.page / response.artists.attr.totalPages * (maxProgress - progressOffset) + progressOffset; Plugin.Logger.Debug("Progress: " + currentProgress * 100); progress.Report(currentProgress * 100); } while(moreTracks); return(artists); }
private async Task <List <LfmTrack> > GetLastfmUsersLibrary(LfmUser lfmUser, IProgress <double> progress, CancellationToken cancellationToken, double maxProgress, double progressOffset) { // To get all scrobbled tracks from a user // library.getArtists --> user.getArtistTracks --> track.getInfo var allTracks = new List <LfmTrack>(); var artists = await GetLibraryGetArtistTracks(lfmUser, progress, cancellationToken, maxProgress, progressOffset); foreach (var artist in artists) { var tracks = await GetUserGetArtistTracks(lfmUser, artist, progress, cancellationToken, maxProgress, progressOffset); foreach (var track in tracks) { var lfmTrack = await GetTrackGetInfo(lfmUser, track, cancellationToken); if (lfmTrack == null) { break; } allTracks.Add(lfmTrack); } } return(allTracks); }
private async Task <LfmTrack> GetTrackGetInfo(LfmUser lfmUser, LfmTrack lfmTrack, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var response = await _lastfmApi.TrackGetInfo(lfmUser, lfmTrack, cancellationToken).ConfigureAwait(false); return(response?.track); }
public async Task <LibraryGetArtistTracksResponse> LibraryGetArtistTracks(LfmUser user, int page = 0, int limit = 200) { var request = new LibraryGetArtistTracksRequest { user = user.Username, page = page, limit = limit, method = PluginConst.Methods.User.GetLovedTracks }; return(await Get <LibraryGetArtistTracksRequest, LibraryGetArtistTracksResponse>(request)); }
public async Task <TrackGetInfoResponse> TrackGetInfo(LfmUser user, LfmTrack track, CancellationToken cancellationToken) { var request = new TrackGetInfoRequest { mbid = track.mbid, username = user.Username, track = track.name, artist = track.artist?.name, method = PluginConst.Methods.Track.GetInfo }; return(await Get <TrackGetInfoRequest, TrackGetInfoResponse>(request, cancellationToken)); }
public async Task <UserGetArtistTracksRespose> UserGetArtistTracks(LfmUser user, LfmArtist artist, int page = 0) { var request = new UserGetArtistTracksRequest { user = user.Username, artist = artist.name, page = page, limit = 0, method = PluginConst.Methods.User.GetArtistTracks }; return(await Get <UserGetArtistTracksRequest, UserGetArtistTracksRespose>(request)); }
/// <summary> /// Loves or unloves a track /// </summary> /// <param name="item">The track</param> /// <param name="user">The Lastfm User</param> /// <param name="love">If the track is loved or not</param> /// <returns></returns> public async Task <bool> TrackLove(Audio item, LfmUser user, bool love = true) { var request = new TrackLoveRequest { artist = item.Artists.First(), track = item.Name, method = love ? PluginConst.Methods.Track.Love : PluginConst.Methods.Track.Unlove, sk = user.SessionKey }; //Send the request var response = await Post <TrackLoveRequest, BaseResponse>(request); if (response != null && !response.IsError()) { Plugin.Logger.Info("{0} {2}loved track '{1}'", user.Username, item.Name, love ? "" : "un"); return(true); } Plugin.Logger.Error("{0} Failed to love = {3} track '{1}' - {2}", user.Username, item.Name, response?.message, love); return(false); }
public async Task Scrobble(Audio item, LfmUser user) { var request = new TrackScrobbleRequest { track = item.Name, album = item.Album, artist = item.Artists.First(), timestamp = Helpers.CurrentTimestamp(), mbid = Helpers.GetMusicBrainzTrackId(item), // TODO //trackNumber = item.get method = PluginConst.Methods.Track.Scrobble, sk = user.SessionKey }; var response = await Post <TrackScrobbleRequest, TrackScrobbleResponse>(request); if (response != null && !response.IsError()) { Plugin.Logger.Info("{0} played '{1}' - {2} - {3} - {4}", user.Username, request.track, request.album, request.artist, request.mbid); return; } Plugin.Logger.Error("Failed to Scrobble track: {0} - messagge {1}", item.Name, response?.message); }
/// <summary> /// Unlove a track. This is the same as LoveTrack with love as false /// </summary> /// <param name="item">The track</param> /// <param name="user">The Lastfm User</param> /// <returns></returns> public async Task <bool> TrackUnlove(Audio item, LfmUser user) { return(await TrackLove(item, user, false)); }
/// <summary> /// Initializes a new instance of the <see cref="PluginConfiguration" /> class. /// </summary> public PluginConfiguration() { LfmUsers = new LfmUser[] { }; }