Пример #1
0
        /// <summary>
        /// Read cached scrobbles and submit
        /// </summary>
        public static void SubmitCachedScrobbles()
        {
            var tracks = new List <LastFMScrobbleTrack>();
            var path   = Config.GetFile(Config.Dir.Database, "lastfmcache.txt");

            using (StreamReader sr = File.OpenText(path))
            {
                string s;
                while ((s = sr.ReadLine()) != null)
                {
                    var t = s.Split('\t');
                    var a = new LastFMScrobbleTrack
                    {
                        ArtistName   = t[0],
                        TrackTitle   = t[1],
                        AlbumName    = t[2],
                        UserSelected = t[3] == "true",
                        DatePlayed   = DateTime.UtcNow
                    };
                    tracks.Add(a);
                }
            }

            LastFMLibrary.ScrobbleTracks(tracks);
        }
Пример #2
0
 /// <summary>
 /// Announce now playing details on last.fm website
 /// </summary>
 /// <param name="artist">artist of track being played</param>
 /// <param name="track">name of track being played</param>
 /// <param name="album">album track being played is part of</param>
 /// <param name="duration">duration of track being played</param>
 private static void AnnounceTrack(string artist, string track, string album, string duration)
 {
     try
     {
         LastFMLibrary.UpdateNowPlaying(artist, track, album, duration);
         Log.Info("Submitted last.fm now playing update for: {0} - {1}", artist, track);
     }
     catch (LastFMException ex)
     {
         if (ex.LastFMError != LastFMException.LastFMErrorCode.UnknownError)
         {
             Log.Error("Last.fm error when announcing now playing track: {0} - {1}", artist, track);
             Log.Error(ex.Message);
         }
         else
         {
             Log.Error("Exception when updating now playing track on last.fm");
             Log.Error(ex.InnerException ?? ex);
         }
     }
     catch (Exception ex)
     {
         Log.Error("Last.fm error when announcing now playing track: {0} - {1}", artist, track);
         Log.Error(ex);
     }
 }
Пример #3
0
        /// <summary>
        /// Checks last.fm for top artist tracks and handle any errors that might occur
        /// </summary>
        /// <param name="artist">Artist to search for</param>
        /// <returns>Similar tracks as defined by last.fm or null</returns>
        private static IEnumerable <LastFMSimilarTrack> GetArtistTopTracks(string artist)
        {
            IEnumerable <LastFMSimilarTrack> tracks;

            try
            {
                tracks = LastFMLibrary.GetArtistTopTracks(artist);
            }
            catch (LastFMException ex)
            {
                if (ex.LastFMError == LastFMException.LastFMErrorCode.InvalidParameters &&
                    ex.Message == "The artist you supplied could not be found")
                {
                    Log.Debug("AutoDJ: Last.fm does not recognise artist: {0}", artist);
                }
                else
                {
                    Log.Error("Error in Last.fm AutoDJ - getting artist top tracks");
                    Log.Error(ex);
                }
                return(null);
            }
            catch (Exception ex)
            {
                Log.Error("Error in Last.fm AutoDJ - getting artist top tracks");
                Log.Error(ex);
                return(null);
            }

            return(tracks);
        }
Пример #4
0
        /// <summary>
        /// Checks last.fm for similar tracks and handle any errors that might occur
        /// </summary>
        /// <param name="tag">MusicTag of file to check</param>
        /// <returns>Similar tracks as defined by last.fm or null</returns>
        private static IEnumerable <LastFMSimilarTrack> GetSimilarTracks(MusicTag tag)
        {
            IEnumerable <LastFMSimilarTrack> tracks;

            try
            {
                tracks = LastFMLibrary.GetSimilarTracks(tag.Title, tag.Artist);
            }
            catch (LastFMException ex)
            {
                if (ex.LastFMError == LastFMException.LastFMErrorCode.InvalidParameters)
                {
                    Log.Debug("AutoDJ: Unable to get similar track for : {0} - {1}", tag.Artist, tag.Title);
                    Log.Debug("AutoDJ: {0}", ex.Message);
                }
                else
                {
                    Log.Error("Error in Last.fm AutoDJ - getting similar tracks");
                    Log.Error(ex);
                }
                return(null);
            }
            catch (Exception ex)
            {
                Log.Error("Error in Last.fm AutoDJ - getting similar tracks");
                Log.Error(ex);
                return(null);
            }

            return(tracks);
        }
Пример #5
0
        public void CanLoadLastFMSingle()
        {
            var lib   = new LastFMLibrary();
            var track = lib.GetTrack("Billy Bragg", "To Have and to Have Not");

            Assert.IsNotNull(track);
            Assert.That(track.PlayCount == 50);
        }
Пример #6
0
        private void UpdateSimilarTrackWorker(string filename, MusicTag tag)
        {
            if (tag == null)
            {
                return;
            }

            lstSimilarTracks.Clear();

            List <LastFMSimilarTrack> tracks;

            try
            {
                Log.Debug("GUIMusicPlayingNow: Calling Last.FM to get similar Tracks");
                tracks = LastFMLibrary.GetSimilarTracks(tag.Title, tag.Artist);
            }
            catch (Exception ex)
            {
                Log.Error("Error getting similar tracks in now playing");
                Log.Error(ex);
                return;
            }

            Log.Debug("GUIMusicPlayingNow: Number of similar tracks returned from Last.FM: {0}", tracks.Count);

            var dbTracks = GetSimilarTracksInDatabase(tracks);

            for (var i = 0; i < 3; i++)
            {
                if (dbTracks.Count > 0)
                {
                    var trackNo = Randomizer.Next(0, dbTracks.Count);
                    var song    = dbTracks[trackNo];

                    var t    = song.ToMusicTag();
                    var item = new GUIListItem
                    {
                        AlbumInfoTag = song,
                        MusicTag     = tag,
                        IsFolder     = false,
                        Label        = song.Title,
                        Path         = song.FileName
                    };
                    item.AlbumInfoTag = song;
                    item.MusicTag     = t;

                    GUIMusicBaseWindow.SetTrackLabels(ref item, MusicSort.SortMethod.Album);
                    dbTracks.RemoveAt(trackNo); // remove song after adding to playlist to prevent the same sone being added twice

                    if (g_Player.currentFileName != filename)
                    {
                        return;                             // track has changed since request so ignore
                    }
                    lstSimilarTracks.Add(item);
                }
            }
            Log.Debug("GUIMusicPlayingNow: Tracks returned after matching Last.FM results with database tracks: {0}", lstSimilarTracks.Count);
        }
Пример #7
0
 public void Start()
 {
     Log.Info("LastFMScrobbler: Starting");
     LoadSettings();
     g_Player.PlayBackStarted += OnPlayBackStarted;
     g_Player.PlayBackEnded   += OnPlayBackEnded;
     g_Player.PlayBackChanged += OnPlayBackChanged;
     g_Player.PlayBackStopped += OnPlayBackStopped;
     var mdb         = MusicDatabase.Instance;
     var sessionKey  = mdb.GetLastFMSK();
     var currentUser = mdb.GetLastFMUser();
     var a           = new LastFMLibrary(sessionKey, currentUser); //TODO this is just making _SK get loaded.   No need to actual instansiate
 }
Пример #8
0
        public override bool Init()
        {
            _playlistPlayer           = PlayListPlayer.SingletonPlayer;
            g_Player.PlayBackEnded   += OnPlayBackEnded;
            g_Player.PlayBackChanged += OnPlayBackChanged;
            g_Player.PlayBackStopped += OnPlayBackStopped;
            var mdb         = MusicDatabase.Instance;
            var sessionKey  = mdb.GetLastFMSK();
            var currentUser = mdb.GetLastFMUser();
            var a           = new LastFMLibrary(sessionKey, currentUser); //TODO this is just making _SK get loaded.   No need to actual instansiate

            return(Load(GUIGraphicsContext.GetThemedSkinDirectory(@"\lastFmRadio.xml")));
        }
Пример #9
0
        public async Task CanLoadLastFMMultiple()
        {
            var lib    = new LastFMLibrary();
            var tracks = await lib.GetRecentTracks(Settings.Default.LastFMUser, 1, 10);

            Assert.IsNotNull(tracks);
            var revTracks = tracks as IRevTrack[] ?? tracks.ToArray();

            Assert.AreEqual(10, revTracks.Length);

            foreach (var item in revTracks)
            {
                Assert.That(item.PlayDate.HasValue);
                Assert.That(item.PlayDate.Value < DateTime.UtcNow);
                Assert.That(item.PlayDate.Value > DateTime.UtcNow.AddDays(-1));
            }
        }
Пример #10
0
        private void Submit()
        {
            var userName = txtUserName.Text;
            var password = txtPassword.Text;

            if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password))
            {
                MessageBox.Show("Enter a last.fm Username and password", "Missing username / password", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            string sessionKey;

            try
            {
                sessionKey = LastFMLibrary.AuthGetMobileSession(userName, password);
            }
            catch (LastFMException ex)
            {
                MessageBox.Show("Error adding user.\n" + ex.Message, "Error adding user", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.Close();
                return;
            }

            MusicDatabase.Instance.AddLastFMUser(userName, sessionKey);

            try
            {
                var user = LastFMLibrary.GetUserInfo();
                if (user != null)
                {
                    MessageBox.Show("User: "******" Added", "User Added", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Error adding user.\nUser: "******"Error Adding User", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            this.Close();
        }
Пример #11
0
        private void DoLastFMBan()
        {
            string dlgText = GUILocalizeStrings.Get(34011) + " : " + CurrentTrackTag.Title;

            try
            {
                LastFMLibrary.BanTrack(CurrentTrackTag.Artist, CurrentTrackTag.Title);
            }
            catch (Exception ex)
            {
                Log.Error("Error in DoLastFMBan");
                Log.Error(ex);
                dlgText = GUILocalizeStrings.Get(1025) + "\n" + dlgText; // prepend "An Error has occurred"
            }

            var dlgNotifyLastFM = (GUIDialogNotifyLastFM)GUIWindowManager.GetWindow((int)Window.WINDOW_DIALOG_LASTFM);

            dlgNotifyLastFM.SetHeading(GUILocalizeStrings.Get(34000)); // last.FM
            dlgNotifyLastFM.SetText(dlgText);
            dlgNotifyLastFM.TimeOut = 2;
            dlgNotifyLastFM.DoModal(GetID);
        }
Пример #12
0
        public LastFMConfig()
        {
            InitializeComponent();
            using (var xmlreader = new MPSettings())
            {
                chkAutoDJ.Checked           = xmlreader.GetValueAsBool("lastfm:test", "autoDJ", true);
                numRandomness.Value         = xmlreader.GetValueAsInt("lastfm:test", "randomness", 100);
                chkAnnounce.Checked         = xmlreader.GetValueAsBool("lastfm:test", "announce", true);
                chkScrobble.Checked         = xmlreader.GetValueAsBool("lastfm:test", "scrobble", true);
                chkDiferentVersions.Checked = xmlreader.GetValueAsBool("lastfm:test", "allowDiffVersions", true);
            }

            if (string.IsNullOrEmpty(MusicDatabase.Instance.GetLastFMSK()))
            {
                return;
            }

            LastFMUser user;

            try
            {
                user = LastFMLibrary.GetUserInfo(MusicDatabase.Instance.GetLastFMUser());
            }
            catch (Exception ex)
            {
                Log.Error("Error getting user info for: {0}", MusicDatabase.Instance.GetLastFMUser());
                Log.Error(ex);
                return;
            }

            if (user == null || string.IsNullOrEmpty(user.UserImgURL))
            {
                return;
            }

            pbLastFMUser.ImageLocation = user.UserImgURL;
        }
Пример #13
0
        /// <summary>
        /// Scrobble track to last.fm
        /// </summary>
        /// <param name="tag">tag details of track to scrobble</param>
        /// <param name="stoptime">how long song had played for</param>
        /// <exception cref="ArgumentNullException">Tag must be provided</exception>
        public static void ScrobbleTrack(MusicTag tag, int stoptime)
        {
            if (tag == null)
            {
                throw new ArgumentNullException("tag");
            }

            if (string.IsNullOrEmpty(tag.Title))
            {
                Log.Info("Unable to scrobble: {0}", tag.FileName);
                Log.Info("No title for track");
                return;
            }

            var artist = tag.Artist;

            if (string.IsNullOrEmpty(artist))
            {
                if (string.IsNullOrEmpty(tag.AlbumArtist))
                {
                    Log.Info("Unable to scrobble: {0}", tag.FileName);
                    Log.Info("No artist or album artist found");
                    return;
                }
                artist = tag.AlbumArtist;
            }

            if (tag.Duration < 30)
            { // last.fm say not to scrobble songs that last less than 30 seconds
                return;
            }
            if (stoptime < 120 && stoptime < (tag.Duration / 2))
            { // last.fm say only to scrobble is more than 2 minutes has been listned to or
              // at least hald the duration of the song
                return;
            }

            try
            {
                using (var client = new WebClient())
                    using (var stream = client.OpenRead("http://www.google.com"))
                    {
                        Log.Debug("internet connection detected. to scrobble: {0} - {1}", tag.Title, artist);
                    }
            }
            catch
            {
                CacheScrobble(tag, DateTime.UtcNow);
                Log.Info("No internet connection so unable to scrobble: {0} - {1}", tag.Title, artist);
                Log.Info("Scrobble has been cached");
                return;
            }

            try
            {
                LastFMLibrary.Scrobble(artist, tag.Title, tag.Album);
                Log.Info("Last.fm scrobble: {0} - {1}", tag.Title, artist);
            }
            catch (LastFMException ex)
            {
                if (ex.LastFMError == LastFMException.LastFMErrorCode.ServiceOffline ||
                    ex.LastFMError == LastFMException.LastFMErrorCode.ServiceUnavailable)
                {
                    CacheScrobble(tag, DateTime.UtcNow);
                    Log.Info("Unable to scrobble: {0} - {1}", tag.Title, artist);
                    Log.Info("Scrobble has been cached");
                }
                else
                {
                    Log.Error("Unable to scrobble: {0} - {1}", tag.Title, artist);
                    Log.Error(ex);
                }
            }
        }
Пример #14
0
        /// <summary>
        /// Get more tracks for the current last.fm radio station and add to playlist
        /// </summary>
        private void AddMoreTracks()
        {
            List <LastFMStreamingTrack> tracks;

            try
            {
                tracks = LastFMLibrary.GetRadioPlaylist();
            }
            catch (LastFMException ex)
            {
                Log.Error("Unable to add last.fm tracks to playlist");
                var errMessage = "Unable to add last.fm tracks to playlist\n";
                if (ex.LastFMError == LastFMException.LastFMErrorCode.UnknownError)
                {
                    Log.Error(ex);
                    errMessage += "Please check logs";
                }
                else
                {
                    errMessage += ex.Message;
                }

                var dlgNotify = (GUIDialogNotify)GUIWindowManager.GetWindow((int)Window.WINDOW_DIALOG_NOTIFY);
                if (null != dlgNotify)
                {
                    dlgNotify.SetHeading(GUILocalizeStrings.Get(107890));
                    dlgNotify.SetText(errMessage);
                    dlgNotify.DoModal(GetID);
                }
                return;
            }

            if (tracks != null)
            {
                foreach (var lastFMTrack in tracks)
                {
                    var tag = new MusicTag
                    {
                        AlbumArtist = lastFMTrack.ArtistName,
                        Artist      = lastFMTrack.ArtistName,
                        Title       = lastFMTrack.TrackTitle,
                        FileName    = lastFMTrack.TrackStreamingURL,
                        Duration    = lastFMTrack.Duration,
                        ImageURL    = lastFMTrack.ImageURL
                    };
                    var pli = new PlayListItem
                    {
                        Type              = PlayListItem.PlayListItemType.Audio,
                        FileName          = lastFMTrack.TrackStreamingURL,
                        Description       = lastFMTrack.ArtistName + " - " + lastFMTrack.TrackTitle,
                        Duration          = lastFMTrack.Duration,
                        MusicTag          = tag,
                        Source            = PlayListItem.PlayListItemSource.Recommendation,
                        SourceDescription = "Last.fm Radio"
                    };

                    Log.Info("Last.fm Added - Artist: {0} :Title: {1} :URL: {2}", lastFMTrack.ArtistName, lastFMTrack.TrackTitle,
                             lastFMTrack.TrackStreamingURL);

                    var pl = _playlistPlayer.GetPlaylist(PlayListType.PLAYLIST_LAST_FM);
                    pl.Add(pli);
                }
                LoadPlaylist();
            }
            else
            {
                Log.Debug("Unable to add last.fm tracks to playlist");
            }
        }
Пример #15
0
        /// <summary>
        /// Tune to a new last.fm radio station and add tracks to playlist
        /// </summary>
        /// <param name="strStation">name os station to tune to</param>
        private void TuneToStation(string strStation)
        {
            if (!Win32API.IsConnectedToInternet())
            {
                var dlgNotify = (GUIDialogNotify)GUIWindowManager.GetWindow((int)Window.WINDOW_DIALOG_NOTIFY);
                if (null != dlgNotify)
                {
                    dlgNotify.SetHeading(GUILocalizeStrings.Get(107890));
                    dlgNotify.SetText(GUILocalizeStrings.Get(34064));
                    dlgNotify.DoModal(GetID);
                }
                return;
            }

            Log.Debug("Attempting to Tune to last.fm station: {0}", strStation);

            // Clear playlist and start playback
            var pl = _playlistPlayer.GetPlaylist(PlayListType.PLAYLIST_LAST_FM);

            pl.Clear();
            _playlistPlayer.CurrentPlaylistType = PlayListType.PLAYLIST_LAST_FM;
            _playlistPlayer.Reset();

            try
            {
                LastFMLibrary.TuneRadio(strStation);
            }
            catch (LastFMException ex)
            {
                Log.Error(ex);
                var dlgNotify = (GUIDialogNotify)GUIWindowManager.GetWindow((int)Window.WINDOW_DIALOG_NOTIFY);
                if (null != dlgNotify)
                {
                    dlgNotify.SetHeading(GUILocalizeStrings.Get(107890));
                    dlgNotify.SetText(ex.Message);
                    dlgNotify.DoModal(GetID);
                }
                return;
            }

            Log.Debug("Tuned to last.fm station: {0}", strStation);

            try
            {
                AddMoreTracks();
            }
            catch (LastFMException ex)
            {
                Log.Error("Unable to add last.fm tracks to playlist");
                var errMessage = "Unable to add last.fm tracks to playlist\n";
                if (ex.LastFMError == LastFMException.LastFMErrorCode.UnknownError)
                {
                    Log.Error(ex);
                    errMessage += "Please check logs";
                }
                else
                {
                    errMessage += ex.Message;
                }

                var dlgNotify = (GUIDialogNotify)GUIWindowManager.GetWindow((int)Window.WINDOW_DIALOG_NOTIFY);
                if (null != dlgNotify)
                {
                    dlgNotify.SetHeading(GUILocalizeStrings.Get(107890));
                    dlgNotify.SetText(errMessage);
                    dlgNotify.DoModal(GetID);
                }
                return;
            }
            _playlistPlayer.Play(0);
        }
Пример #16
0
 public void Start()
 {
   Log.Info("LastFMScrobbler: Starting");
   LoadSettings();
   g_Player.PlayBackStarted += OnPlayBackStarted;
   g_Player.PlayBackEnded += OnPlayBackEnded;
   g_Player.PlayBackChanged += OnPlayBackChanged;
   g_Player.PlayBackStopped += OnPlayBackStopped;
   var mdb = MusicDatabase.Instance;
   var sessionKey = mdb.GetLastFMSK();
   var currentUser = mdb.GetLastFMUser();
   var a = new LastFMLibrary(sessionKey, currentUser); //TODO this is just making _SK get loaded.   No need to actual instansiate
 }
Пример #17
0
 public override bool Init()
 {
   _playlistPlayer = PlayListPlayer.SingletonPlayer;
   g_Player.PlayBackEnded += OnPlayBackEnded;
   g_Player.PlayBackChanged += OnPlayBackChanged;
   g_Player.PlayBackStopped += OnPlayBackStopped;
   var mdb = MusicDatabase.Instance;
   var sessionKey = mdb.GetLastFMSK();
   var currentUser = mdb.GetLastFMUser();
   var a = new LastFMLibrary(sessionKey, currentUser); //TODO this is just making _SK get loaded.   No need to actual instansiate
   return Load(GUIGraphicsContext.GetThemedSkinDirectory(@"\lastFmRadio.xml"));
 }