Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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));
        }
Beispiel #7
0
        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));
        }
Beispiel #8
0
        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));
        }
Beispiel #9
0
        /// <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);
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
 /// <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[] { };
 }