/// <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); }
/// <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); } }
/// <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); }
/// <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); }
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); }
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); }
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 }
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"))); }
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)); } }
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(); }
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); }
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; }
/// <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); } } }
/// <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"); } }
/// <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); }
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")); }