PageRenderTime 60ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/Network.Bonjour.DACP/DacpClient.cs

#
C# | 215 lines | 192 code | 23 blank | 0 comment | 21 complexity | fec4f450d125fa15a616e82b39442e35 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Network.ZeroConf;
  5. using Network.Dns;
  6. namespace Network.Bonjour.DACP
  7. {
  8. public class Client : Client<DacpRequest, DacpResponse>
  9. {
  10. public static void Main()
  11. {
  12. Client client = new Client(new EndPoint() { Port = 3689, Addresses = { System.Net.IPAddress.Parse("192.168.1.15") } });
  13. client.Login();
  14. Console.WriteLine(client.SessionId);
  15. DaapMessage speakers = client.GetSpeakers();
  16. byte[] speakerId = null;
  17. foreach (DaapMessage speaker in speakers.Messages["mdcl"])
  18. {
  19. if (speaker["caia"] != null)
  20. Console.Write("[X] ");
  21. else
  22. {
  23. Console.Write("[ ] ");
  24. speakerId = speaker["msma"][0].Value;
  25. }
  26. Console.Write(speaker["minm"][0].ToString() + " ");
  27. Console.WriteLine("(" + speaker["msma"][0].ToInt64() + ")");
  28. }
  29. client.SetSpeakers(new byte[1] { 0 }, speakerId);
  30. speakers = client.GetSpeakers();
  31. foreach (DaapMessage speaker in speakers.Messages["mdcl"])
  32. {
  33. if (speaker["caia"] != null)
  34. Console.Write("[X] ");
  35. else
  36. {
  37. Console.Write("[ ] ");
  38. }
  39. Console.Write(speaker["minm"][0].ToString() + " ");
  40. Console.WriteLine("(" + speaker["msma"][0].ToInt64() + ")");
  41. }
  42. Console.ReadLine();
  43. }
  44. public Client(IService service)
  45. : this(service.Addresses[0])
  46. {
  47. }
  48. public Client(EndPoint ep)
  49. : base(true)
  50. {
  51. this.Host = new System.Net.IPEndPoint(ep.Addresses[0], ep.Port);
  52. StartTcp();
  53. }
  54. protected override ClientEventArgs<DacpRequest, DacpResponse> GetEventArgs(DacpResponse response)
  55. {
  56. return new DacpEventArgs(response);
  57. }
  58. private int? sessionId;
  59. public int SessionId
  60. {
  61. get
  62. {
  63. if (!sessionId.HasValue)
  64. Login();
  65. return sessionId.Value;
  66. }
  67. set { sessionId = value; }
  68. }
  69. public void Login()
  70. {
  71. DacpRequest request = new DacpRequest();
  72. request.Uri = "/login?hasFP=1&hsgid=00000000-066d-31e9-ed58-2b1c969b49c1";
  73. DacpResponse response = Send(request);
  74. if (response.Content.Name == "mlog")
  75. {
  76. SessionId = response.Content["mlid"][0].ToInt32();
  77. request = new DacpRequest();
  78. request.Uri = "/ctrl-int";
  79. response = Send(request);
  80. }
  81. else
  82. throw new NotSupportedException();
  83. }
  84. public DaapMessage GetStatus()
  85. {
  86. return GetStatusForRevision(1);
  87. }
  88. int notificationRevisionNumber = 1;
  89. public DaapMessage GetNewStatus()
  90. {
  91. DaapMessage result = GetStatusForRevision(notificationRevisionNumber);
  92. if (result.Name == "cmst")
  93. notificationRevisionNumber = result["cmsr"][0].ToInt32();
  94. return result;
  95. }
  96. private DaapMessage GetStatusForRevision(int revisionNumber)
  97. {
  98. DacpRequest request = new DacpRequest();
  99. request.Uri = "/ctrl-int/1/playstatusupdate?revision-number=" + revisionNumber + "&session-id=" + SessionId;
  100. DacpResponse response = Send(request);
  101. return response.Content;
  102. }
  103. public void PlayPause()
  104. {
  105. DacpRequest request = new DacpRequest();
  106. request.Uri = "/ctrl-int/1/playpause?session-id=" + SessionId;
  107. Send(request);
  108. }
  109. public void Next()
  110. {
  111. DacpRequest request = new DacpRequest();
  112. request.Uri = "/ctrl-int/1/nextitem?session-id=" + SessionId;
  113. Send(request);
  114. }
  115. public void Previous()
  116. {
  117. DacpRequest request = new DacpRequest();
  118. request.Uri = "/ctrl-int/1/previtem?session-id=" + SessionId;
  119. Send(request);
  120. }
  121. public int GetVolume()
  122. {
  123. return GetProperty("dmcp.volume")["cmvo"][0].ToInt32();
  124. }
  125. public DaapMessage GetProperty(string property)
  126. {
  127. DacpRequest request = new DacpRequest();
  128. request.Uri = "/ctrl-int/1/getproperty?properties=" + property + "&session-id=" + SessionId;
  129. var response = Send(request);
  130. if (response.Content["mstt"][0].ToInt32() == 200)
  131. return response.Content;
  132. return null;
  133. }
  134. public DaapMessage SetProperty(string property, string value)
  135. {
  136. DacpRequest request = new DacpRequest();
  137. request.Uri = "/ctrl-int/1/setproperty?" + property + "=" + value + "&session-id=" + SessionId;
  138. return Send(request).Content;
  139. }
  140. public DaapMessage GetDatabases()
  141. {
  142. DacpRequest request = new DacpRequest();
  143. request.Uri = "/databases?revision-id=1&session-id=" + SessionId;
  144. return Send(request).Content;
  145. }
  146. public DaapMessage GetPlaylists(int dbId)
  147. {
  148. DacpRequest request = new DacpRequest();
  149. request.Uri = "/databases/" + dbId + "containers?meta=dmap.itemid,dmap.itemname,dma.persistentid,com.apple.itunes.smart-playlist&revision-id=1&session-id=" + SessionId;
  150. return Send(request).Content;
  151. }
  152. public DaapMessage GetPlaylist(int dbId, int plid)
  153. {
  154. DacpRequest request = new DacpRequest();
  155. request.Uri = "/databases/" + dbId + "/containers/" + plid + "/items?type=music&meta=dmap.itemkind,dmap.itemid,dmap.containeritemid&revision-id=1&session-id=" + SessionId;
  156. return Send(request).Content;
  157. }
  158. public DaapMessage GetSpeakers()
  159. {
  160. if (SessionId == 0)
  161. Login();
  162. DacpRequest request = new DacpRequest();
  163. request.Uri = "/ctrl-int/1/getspeakers?session-id=" + SessionId + "&hsgid=00000000-066d-31e9-ed58-2b1c969b49c1";
  164. DacpResponse response = Send(request);
  165. if (response.Content.Name == "casp")
  166. {
  167. return response.Content;
  168. }
  169. else
  170. throw new NotSupportedException();
  171. }
  172. public void SetSpeakers(params byte[][] ids)
  173. {
  174. DacpRequest request = new DacpRequest();
  175. StringBuilder uriBuilder = new StringBuilder("/ctrl-int/1/setspeakers?speaker-id=");
  176. for (int i = 0; i < ids.Length; i++)
  177. {
  178. if (ids[i].Length == 1 && ids[i][0] == 0)
  179. uriBuilder.Append("0");
  180. else
  181. uriBuilder.AppendFormat("0x{0}", DaapMessage.ToHexString(ids[i]));
  182. if (i < ids.Length - 1)
  183. uriBuilder.Append(",");
  184. }
  185. uriBuilder.Append("&session-id=");
  186. uriBuilder.Append(SessionId);
  187. uriBuilder.Append("&hsgid=00000000-066d-31e9-ed58-2b1c969b49c1");
  188. request.Uri = uriBuilder.ToString();
  189. Send(request);
  190. }
  191. }
  192. }