VLCPlayerControlWebSocket.m 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /*****************************************************************************
  2. * VLCPlayerControlWebSocket.m
  3. * VLC for iOS
  4. *****************************************************************************
  5. * Copyright (c) 2015 VideoLAN. All rights reserved.
  6. * $Id$
  7. *
  8. * Authors: Felix Paul Kühne <fkuehne # videolan.org>
  9. *
  10. * Refer to the COPYING file of the official project for license.
  11. *****************************************************************************/
  12. #import "VLCPlayerControlWebSocket.h"
  13. @implementation VLCPlayerControlWebSocket
  14. - (void)dealloc
  15. {
  16. [[NSNotificationCenter defaultCenter] removeObserver:self];
  17. }
  18. - (void)didOpen
  19. {
  20. NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
  21. [notificationCenter addObserver:self
  22. selector:@selector(playbackStarted)
  23. name:VLCPlaybackControllerPlaybackDidStart
  24. object:nil];
  25. [notificationCenter addObserver:self
  26. selector:@selector(playbackStarted)
  27. name:VLCPlaybackControllerPlaybackDidResume
  28. object:nil];
  29. [notificationCenter addObserver:self
  30. selector:@selector(_respondToPlaying)
  31. name:VLCPlaybackControllerPlaybackMetadataDidChange
  32. object:nil];
  33. [notificationCenter addObserver:self
  34. selector:@selector(playbackPaused)
  35. name:VLCPlaybackControllerPlaybackDidPause
  36. object:nil];
  37. [notificationCenter addObserver:self
  38. selector:@selector(playbackEnded)
  39. name:VLCPlaybackControllerPlaybackDidStop
  40. object:nil];
  41. [notificationCenter addObserver:self
  42. selector:@selector(playbackEnded)
  43. name:VLCPlaybackControllerPlaybackDidFail
  44. object:nil];
  45. [notificationCenter addObserver:self
  46. selector:@selector(playbackSeekTo)
  47. name:VLCPlaybackControllerPlaybackPositionUpdated
  48. object:nil];
  49. APLog(@"web socket did open");
  50. [super didOpen];
  51. }
  52. - (void)didReceiveMessage:(NSString *)msg
  53. {
  54. APLog(@"web socket received message: '%@'", msg);
  55. if ([msg isEqualToString:@"playing"]) {
  56. [self _respondToPlaying];
  57. } else if ([msg isEqualToString:@"play"]) {
  58. [self _respondToPlay];
  59. } else if ([msg isEqualToString:@"pause"]) {
  60. [self _respondToPause];
  61. } else if ([msg isEqualToString:@"ended"]) {
  62. [self _respondToEnded];
  63. } else if ([msg isEqualToString:@"seekTo"]) {
  64. [self _respondToSeek];
  65. } else if ([msg isEqualToString:@"volume"]) {
  66. [self sendMessage:@"VOLUME CONTROL NOT SUPPORTED ON THIS DEVICE"];
  67. } else
  68. [self sendMessage:@"INVALID REQUEST!"];
  69. }
  70. #ifndef NDEBUG
  71. - (void)didClose
  72. {
  73. APLog(@"web socket did close");
  74. [super didClose];
  75. }
  76. #endif
  77. - (void)_respondToPlaying
  78. {
  79. /* JSON response
  80. {
  81. "type": "playing",
  82. "currentTime": 42,
  83. "media": {
  84. "id": "some id",
  85. "title": "some title",
  86. "duration": 120000
  87. }
  88. }
  89. */
  90. VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
  91. NSDictionary *returnDict;
  92. if (vpc.activePlaybackSession) {
  93. VLCMediaPlayer *player = vpc.mediaPlayer;
  94. if (player) {
  95. VLCMedia *media = player.media;
  96. if (media) {
  97. NSString *mediaTitle = vpc.mediaTitle;
  98. if (!mediaTitle)
  99. mediaTitle = @"";
  100. NSDictionary *mediaDict = @{ @"id" : media.url.absoluteString,
  101. @"title" : mediaTitle,
  102. @"duration" : @(media.length.intValue)};
  103. returnDict = @{ @"currentTime" : @(player.time.intValue),
  104. @"type" : @"playing",
  105. @"media" : mediaDict };
  106. }
  107. }
  108. }
  109. if (!returnDict) {
  110. returnDict = [NSDictionary dictionary];
  111. }
  112. NSError *error;
  113. NSData *returnData = [NSJSONSerialization dataWithJSONObject:returnDict options:0 error:&error];
  114. if (error != nil) {
  115. APLog(@"%s: JSON serialization failed %@", __PRETTY_FUNCTION__, error);
  116. }
  117. [self sendData:returnData];
  118. }
  119. #pragma mark - play
  120. - (void)_respondToPlay
  121. {
  122. VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
  123. VLCMediaListPlayer *listPlayer = vpc.listPlayer;
  124. if (listPlayer) {
  125. [listPlayer play];
  126. }
  127. }
  128. - (void)playbackStarted
  129. {
  130. /*
  131. {
  132. "type": "play",
  133. "currentTime": 42,
  134. "media": {
  135. "id": 42
  136. }
  137. }
  138. */
  139. VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
  140. VLCMediaPlayer *player = vpc.mediaPlayer;
  141. if (player) {
  142. VLCMedia *media = player.media;
  143. if (media) {
  144. NSDictionary *mediaDict = @{ @"id" : media.url.absoluteString};
  145. NSDictionary *returnDict = @{ @"currentTime" : @(player.time.intValue),
  146. @"type" : @"play",
  147. @"media" : mediaDict };
  148. NSError *error;
  149. NSData *returnData = [NSJSONSerialization dataWithJSONObject:returnDict options:0 error:&error];
  150. if (error != nil) {
  151. APLog(@"%s: JSON serialization failed %@", __PRETTY_FUNCTION__, error);
  152. }
  153. [self sendData:returnData];
  154. }
  155. }
  156. }
  157. #pragma mark - pause
  158. - (void)_respondToPause
  159. {
  160. VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
  161. VLCMediaListPlayer *listPlayer = vpc.listPlayer;
  162. if (listPlayer) {
  163. [listPlayer pause];
  164. }
  165. }
  166. - (void)playbackPaused
  167. {
  168. /*
  169. {
  170. "type": "pause",
  171. "currentTime": 42,
  172. "media": {
  173. "id": 42
  174. }
  175. }
  176. */
  177. VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
  178. VLCMediaPlayer *player = vpc.mediaPlayer;
  179. if (player) {
  180. VLCMedia *media = player.media;
  181. if (media) {
  182. NSDictionary *mediaDict = @{ @"id" : media.url.absoluteString};
  183. NSDictionary *returnDict = @{ @"currentTime" : @(player.time.intValue),
  184. @"type" : @"pause",
  185. @"media" : mediaDict };
  186. NSError *error;
  187. NSData *returnData = [NSJSONSerialization dataWithJSONObject:returnDict options:0 error:&error];
  188. if (error != nil) {
  189. APLog(@"%s: JSON serialization failed %@", __PRETTY_FUNCTION__, error);
  190. }
  191. [self sendData:returnData];
  192. }
  193. }
  194. }
  195. #pragma mark - ended
  196. - (void)_respondToEnded
  197. {
  198. VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
  199. [vpc stopPlayback];
  200. }
  201. - (void)playbackEnded
  202. {
  203. /*
  204. {
  205. "type": "ended",
  206. "media": {
  207. "id": 42
  208. }
  209. }
  210. */
  211. VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
  212. VLCMediaPlayer *player = vpc.mediaPlayer;
  213. if (player) {
  214. VLCMedia *media = player.media;
  215. if (media) {
  216. NSDictionary *mediaDict = @{ @"id" : media.url.absoluteString};
  217. NSDictionary *returnDict = @{ @"type" : @"ended",
  218. @"media" : mediaDict };
  219. NSError *error;
  220. NSData *returnData = [NSJSONSerialization dataWithJSONObject:returnDict options:0 error:&error];
  221. if (error != nil) {
  222. APLog(@"%s: JSON serialization failed %@", __PRETTY_FUNCTION__, error);
  223. }
  224. [self sendData:returnData];
  225. }
  226. }
  227. }
  228. #pragma mark - seek
  229. - (void)_respondToSeek
  230. {
  231. [self sendMessage:@"VOLUME CONTROL NOT SUPPORTED ON THIS DEVICE"];
  232. }
  233. - (void)playbackSeekTo
  234. {
  235. /*
  236. {
  237. "type": "seekTo",
  238. "currentTime": 42,
  239. "media": {
  240. "id": 42
  241. }
  242. }
  243. */
  244. VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
  245. VLCMediaPlayer *player = vpc.mediaPlayer;
  246. if (player) {
  247. VLCMedia *media = player.media;
  248. if (media) {
  249. NSDictionary *mediaDict = @{ @"id" : media.url.absoluteString};
  250. NSDictionary *returnDict = @{ @"currentTime" : @(player.time.intValue),
  251. @"type" : @"seekTo",
  252. @"media" : mediaDict };
  253. NSError *error;
  254. NSData *returnData = [NSJSONSerialization dataWithJSONObject:returnDict options:0 error:&error];
  255. if (error != nil) {
  256. APLog(@"%s: JSON serialization failed %@", __PRETTY_FUNCTION__, error);
  257. }
  258. [self sendData:returnData];
  259. }
  260. }
  261. }
  262. @end