Spotify.NET/SpotifyAPI/SpoitfyLocalAPI/RemoteHandler.cs

141 lines
4.4 KiB
C#
Raw Normal View History

2014-01-07 15:26:03 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Threading.Tasks;
using System.Threading;
2014-01-07 15:26:03 +00:00
using Newtonsoft.Json;
namespace SpotifyAPI.SpotifyLocalAPI
2014-01-07 15:26:03 +00:00
{
class RemoteHandler
{
private static RemoteHandler instance = new RemoteHandler();
public String oauthKey {get;private set;}
public String cfidKey {get;private set;}
public String host = "127.0.0.1";
ExtendedWebClient wc;
2014-01-08 22:22:54 +00:00
internal static RemoteHandler GetInstance()
2014-01-07 15:26:03 +00:00
{
return instance;
}
2014-01-10 07:09:14 +00:00
internal RemoteHandler()
2014-01-07 15:26:03 +00:00
{
wc = new ExtendedWebClient();
wc.Timeout = 2000;
2014-01-10 07:09:14 +00:00
wc.Proxy = null;
2014-01-07 15:26:03 +00:00
wc.Headers.Add("Origin", "https://embed.spotify.com");
wc.Headers.Add("Referer", "https://embed.spotify.com/?uri=spotify:track:5Zp4SWOpbuOdnsxLqwgutt");
}
2014-02-14 12:04:45 +00:00
internal Boolean Init()
2014-01-07 15:26:03 +00:00
{
oauthKey = GetOAuthKey();
cfidKey = GetCFID();
2014-02-14 12:04:45 +00:00
if (cfidKey == "")
return false;
return true;
2014-01-07 15:26:03 +00:00
}
2014-01-10 07:09:14 +00:00
internal void SendPauseRequest()
{
2014-02-01 12:52:33 +00:00
query("remote/pause.json?pause=true", true, true, -1);
2014-01-10 07:09:14 +00:00
}
2014-02-01 12:52:33 +00:00
internal void SendPlayRequest()
2014-01-10 07:09:14 +00:00
{
2014-02-01 12:52:33 +00:00
query("remote/pause.json?pause=false", true, true, -1);
2014-01-10 07:09:14 +00:00
}
2014-02-01 12:52:33 +00:00
internal void SendPlayRequest(String url)
{
query("remote/play.json?uri=" + url, true, true, -1);
}
internal void SendQueueRequest(String url)
{
query("remote/play.json?uri=" + url + "?action=queue", true, true, -1);
}
2014-01-08 22:22:54 +00:00
internal StatusResponse Update()
{
2014-02-01 12:52:33 +00:00
String response = query("remote/status.json", true, true, -1);
2014-01-08 22:22:54 +00:00
if(response == "")
{
2014-02-13 13:23:52 +00:00
return null;
2014-01-08 22:22:54 +00:00
}
response = response.Replace("\\n", "");
2014-02-01 12:52:33 +00:00
byte[] bytes = Encoding.Default.GetBytes(response);
response = Encoding.UTF8.GetString(bytes);
2014-01-08 22:22:54 +00:00
List<StatusResponse> raw = (List<StatusResponse>)JsonConvert.DeserializeObject(response,typeof(List<StatusResponse>));
return raw[0];
}
2014-02-13 13:23:52 +00:00
internal String GetOAuthKey()
2014-01-07 15:26:03 +00:00
{
String raw = "";
2014-01-10 07:09:14 +00:00
using(WebClient wc = new WebClient())
2014-01-07 15:26:03 +00:00
{
2014-01-10 07:09:14 +00:00
wc.Proxy = null;
raw = wc.DownloadString("http://open.spotify.com/token");
2014-01-07 15:26:03 +00:00
}
2014-01-10 07:09:14 +00:00
Dictionary<String, object> lol = (Dictionary<String, object>)JsonConvert.DeserializeObject<Dictionary<String, object>>(raw);
return (String)lol["t"];
2014-01-07 15:26:03 +00:00
}
2014-02-13 13:23:52 +00:00
internal String GetCFID()
2014-01-07 15:26:03 +00:00
{
2014-02-01 12:52:33 +00:00
string a = query("simplecsrf/token.json", false, false, -1);
a = a.Replace(@"\", "");
2014-01-07 15:26:03 +00:00
List<CFID> d = (List<CFID>)JsonConvert.DeserializeObject(a, typeof(List<CFID>));
if (d == null)
return "";
2014-01-07 15:26:03 +00:00
if (d.Count != 1)
2014-02-01 12:52:33 +00:00
throw new Exception("CFID couldn't be loaded");
if (d[0].error != null)
2014-02-14 12:04:45 +00:00
return "";
2014-01-07 15:26:03 +00:00
return d[0].token;
}
internal String query(string request, bool oauth, bool cfid, int wait)
2014-01-07 15:26:03 +00:00
{
2014-02-01 12:52:33 +00:00
string parameters = "?&ref=&cors=&_=" + GetTimestamp();
2014-01-07 15:26:03 +00:00
if (request.Contains("?"))
{
parameters = parameters.Substring(1);
}
if (oauth)
{
parameters += "&oauth=" + oauthKey;
}
if (cfid)
{
parameters += "&csrf=" + cfidKey;
}
if (wait != -1)
{
parameters += "&returnafter=" + wait;
parameters += "&returnon=login%2Clogout%2Cplay%2Cpause%2Cerror%2Cap";
}
string a = "http://" + host + ":4380/" + request + parameters;
2014-02-13 13:23:52 +00:00
string response = "";
2014-01-07 15:26:03 +00:00
try
{
//Need to find a better solution
if (SpotifyLocalAPIClass.IsSpotifyRunning())
2014-02-14 12:04:45 +00:00
response = "[ " + wc.DownloadString(a) + " ]";
2014-01-07 15:26:03 +00:00
}
catch (Exception z)
{
return "";
2014-01-07 15:26:03 +00:00
}
2014-02-13 13:23:52 +00:00
return response;
2014-01-07 15:26:03 +00:00
}
2014-02-13 13:23:52 +00:00
internal int GetTimestamp()
2014-01-10 07:09:14 +00:00
{
2014-02-01 12:52:33 +00:00
return Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds);
2014-01-10 07:09:14 +00:00
}
2014-01-07 15:26:03 +00:00
}
}