private async void AddItem(Uri uri) { System.Diagnostics.Debug.WriteLine("Playlist - adding item: " + uri); PlaylistItem playlistItem = null; lock (playlistItems) { if (!playlistItems.Contains(uri)) { playlistItem = new PlaylistItem { ExternalUri = uri }; playlistItems[uri] = playlistItem; } } if (playlistItem != null) { System.Diagnostics.Debug.WriteLine("Playlist - added item: " + playlistItem.ExternalUri); StreamAnalyser analyser = new StreamAnalyser(uri); await analyser.Process(); analyser.Populate(playlistItem); CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, playlistItem)); } else { System.Diagnostics.Debug.WriteLine("Playlist - item already exists: " + uri); } }
internal static async void Stream(PlaylistItem playlistItem, TcpClient client) { try { Stream dest = client.GetStream(); Uri sourceUrl = playlistItem.InternalUri; if (sourceUrl == null) sourceUrl = playlistItem.ExternalUri; HttpWebRequest requestToSource = WebRequest.CreateHttp(sourceUrl); using (HttpWebResponse sourceResponse = (HttpWebResponse)await requestToSource.GetResponseAsync()) { // forwards headers from the source to dest Encoding encode = Encoding.UTF8; byte[] buffer = encode.GetBytes("HTTP/1.1 200 OK\r\n"); await dest.WriteAsync(buffer, 0, buffer.Length); for (int i = 0; i < sourceResponse.Headers.Count; i++) { buffer = encode.GetBytes(sourceResponse.Headers.Keys[i] + ": " + sourceResponse.Headers[i] + "\r\n"); await dest.WriteAsync(buffer, 0, buffer.Length); } buffer = encode.GetBytes("\r\n"); await dest.WriteAsync(buffer, 0, buffer.Length); // headers sent // begin sending body using (Stream source = sourceResponse.GetResponseStream()) { buffer = new byte[16 * 1024]; int bytesRead = 0; await Task.Factory.StartNew(() => { try { while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0) { dest.Write(buffer, 0, bytesRead); } } catch (Exception e) { System.Diagnostics.Debug.WriteLine(String.Format("{0} while streaming {1} to {2}", e.Message, playlistItem, client.Client)); } }, TaskCreationOptions.LongRunning); } } } catch (Exception e) { System.Diagnostics.Debug.WriteLine(String.Format("{0} while streaming {1} to {2}", e.Message, playlistItem, client.Client)); } finally { Clients.Instance.RemoveHttpClient(client); } }
private void Playlist_ItemAdded(PlaylistItem addedItem) { if (addedItem != null) { lock (fetchers) { // check if a metadatafetcher already exists for the added item MetadataFetcher fetcher; fetchers.TryGetValue(addedItem.ExternalUri, out fetcher); // if it doesn't exist, create one if (fetcher == null) { switch (addedItem.TypeOfStream) { case StreamType.Live365: fetcher = new Live365MetadataFetcher(addedItem); fetchers[addedItem.ExternalUri] = fetcher; fetcher.StartFetching(); break; case StreamType.Shoutcast: fetcher = new ShoutcastMetadataFetcher(addedItem); fetchers[addedItem.ExternalUri] = fetcher; fetcher.StartFetching(); break; case StreamType.StreamTheWorld: fetcher = new StreamTheWorldMetadataFetcher(addedItem); fetchers[addedItem.ExternalUri] = fetcher; fetcher.StartFetching(); break; case StreamType.Icecast: break; case StreamType.Unknown: break; } } } } }
public StreamTheWorldMetadataFetcher(PlaylistItem plItem) { playlistItem = plItem; xmlUri = new Uri("http://playerservices.streamtheworld.com/public/nowplaying?mountName=" + playlistItem.BroadcasterID + "&numberToFetch=1"); }
private string SerializePlaylistItem(PlaylistItem playlistItem) { lock (state) { return @"{""state"":{""partialPlaylist"":[" + JsonConvert.SerializeObject(playlistItem) + "]}}"; } }
private void Playlist_ItemRemoved(PlaylistItem playlistItem) { if (playlistItem != null) { lock (state) { state.playlist.Remove(playlistItem.ExternalUri); } Clients.Instance.BroadcastMessage(SerializePlaylist()); } }
private void Playlist_ItemAdded(PlaylistItem playlistItem) { if (playlistItem != null) { lock (state) { state.playlist[playlistItem.ExternalUri] = playlistItem; } playlistItem.MetadataUpdated += PlaylistItem_MetadataUpdated; Clients.Instance.BroadcastMessage(SerializePlaylist()); } }
private void Playlist_ItemRemoved(PlaylistItem removedItem) { //TODO }
public ShoutcastMetadataFetcher(PlaylistItem plItem) { playlistItem = plItem; metadataUri = new Uri(playlistItem.ExternalUri + "7.html"); }
public Live365MetadataFetcher(PlaylistItem pltItem) { playlistItem = pltItem; xmlUri = new Uri("http://www.live365.com/pls/front?handler=playlist&cmd=view&viewType=xml&handle=" + playlistItem.BroadcasterID + "&maxEntries=1"); }
/// <summary> /// Sends a request to this client to start streaming this PlaylistItem /// Client is expected to use the HTTP GET API to start its stream which /// is handled by the method decodeHttpMessage /// </summary> /// <param name="playlistItem"></param> /// <exception cref="System.IO.IOException" /> /// <exception cref="System.ObjectDisposedException" /> private void RequestStream(PlaylistItem playlistItem) { SendMessage(@"{""streamRequest"":" + JsonConvert.SerializeObject(playlistItem) + "}"); }
internal void Populate(PlaylistItem playlistItem) { playlistItem.ExternalUri = uri; playlistItem.InternalUri = internalUri; playlistItem.BroadcasterID = broadcasterID; playlistItem.BroadcasterName = broadcasterName; playlistItem.Bitrate = bitrate; playlistItem.TypeOfStream = streamType; }