using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Collections.Generic;
using System.Threading;
using System.IO;
using Spotify;
namespace SharpTest
{
class MainClass
{
private static Session session = null;
private static ManualResetEvent allDone
= new ManualResetEvent
(false);
public static void Main(string[] args)
{
#region key
// Paste your key here
{
0x01, 0x67, 0xC0, 0x43, 0xA1, 0x8C, 0xD7, 0x9A, 0x8C, 0x8C, 0x06, 0xD5, 0x51, 0x90, 0x3D, 0x00,
.....
0x39, 0xEA, 0xED, 0xCE, 0xB5, 0x00, 0xAE, 0xD0, 0x4D, 0x9E, 0x56, 0x78, 0x02, 0xF3, 0xEA, 0x84,
0xCE
};
#endregion
AppDomain.CurrentDomain.UnhandledException += HandleUnhandledException;
// Set cache dir etc. here. Clear these folders to force resync of all playlists
Session s = Session.CreateInstance(key, "/tmp/libspotify", "/tmp/libspotify", "libspotify-sharp-dev");
s.
OnConnectionError += new SessionEventHandler
(HandleOnConnectionError
);
s.OnLoggedOut += HandleOnLoggedOut;
s.OnLoginComplete += HandleOnLoginComplete;
s.OnLogMessage += HandleOnLogMessage;
s.OnMessageToUser += HandleOnMessageToUser;
s.OnMetaDataUpdated += HandleOnMetaDataUpdated;
Console.WriteLine("Logging in...");
// Put your credentials here
s.LogIn("user", "pass");
// Ugly way to terminate this little test app
allDone.WaitOne(30 * 1000, false);
Console.WriteLine("Logging out..");
s.LogOut();
}
static void HandleOnMessageToUser(Session sender, SessionEventArgs e)
{
Console.WriteLine("Message: " + e.Message);
}
static void HandleOnLogMessage(Session sender, SessionEventArgs e)
{
Console.WriteLine("Log: " + e.Message);
}
static void HandleOnLoginComplete(Session sender, SessionEventArgs e)
{
if(e.Status != sp_error.OK)
{
Console.WriteLine("Error logging in");
allDone.Set();
return;
}
// Add listener for new playlists (playlist moved and deleted events are also there but are equally untested)
if(sender != null)
sender.PlaylistContainer.OnPlaylistAdded += HandleOnPlaylistAdded;
Console.WriteLine("Login: {0} Playlists: {1} ", e.Status,
sender != null && sender.PlaylistContainer != null ? sender.PlaylistContainer.PlaylistCount.ToString() : "null");
if(sender != null && sender.PlaylistContainer != null)
{
Playlist[] current = sender.PlaylistContainer.CurrentLists;
for (int i = 0; i < current.Length; i++)
{
Console.WriteLine("Playlist w index {0}: {1}", i, current[i].IsLoaded ? current[i].ToString() : "data not loaded");
// Add change listeners to lists already in container
current[i].OnMetadataUpdated += HandleOnMetadataUpdated;
current[i].OnStateChanged += HandleOnStateChanged;
current[i].OnUpdateInProgress += HandleOnUpdateInProgress;
// Remember to set event listeners (tracks added, moved etc.) on each playlist here!
}
}
session = sender;
}
// Dump strings to console so one can see the event flow
static void HandleOnMetaDataUpdated(Session sender, SessionEventArgs e)
{
Console.WriteLine("Session MetaDataUpdated");
}
static void HandleOnPlaylistAdded(PlaylistContainer sender, PlaylistContainerEventArgs e)
{
if(session == null)
return;
// All current lists are in both sender.CurrentLists and e.CurrentLists (silly me...)
// Remember to set event listeners (tracks added, moved etc.) on each playlist here!
Console.WriteLine("Playlist w index {0} added: {1}", e.Position, e.Playlist.IsLoaded ? e.Playlist.ToString() : "data is loading");
e.Playlist.OnMetadataUpdated += HandleOnMetadataUpdated;
e.Playlist.OnStateChanged += HandleOnStateChanged;
e.Playlist.OnUpdateInProgress += HandleOnUpdateInProgress;
}
static void HandleOnUpdateInProgress(Playlist sender, PlaylistEventArgs e)
{
Console.WriteLine("Playlist UpdateInProgress: Done {0} {1}", e.Done, sender.IsLoaded ? sender.ToString() : "data is loading");
}
static void HandleOnStateChanged(Playlist sender, PlaylistEventArgs e)
{
Console.WriteLine("Playlist OnStateChanged: {0}", sender.IsLoaded ? sender.ToString() : "data is loading");
}
static void HandleOnMetadataUpdated(Playlist sender, PlaylistEventArgs e)
{
Console.WriteLine("Playlist MetadataUpdated: {0}", sender.IsLoaded ? sender.ToString() : "data is loading");
}
static void HandleOnLoggedOut(Session sender, SessionEventArgs e)
{
Console.WriteLine("Logged out");
System.Diagnostics.Process.GetCurrentProcess().Kill();
}
static void HandleOnConnectionError(Session sender, SessionEventArgs e)
{
Console.WriteLine("Connection error: " + e.Status);
allDone.Set();
}
static void HandleUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine(e.ExceptionObject.ToString());
allDone.Set();
}
}
}