Example #1
0
        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);
            }
        }
Example #2
0
        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); }
        }
Example #3
0
        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");
        }
Example #5
0
 private string SerializePlaylistItem(PlaylistItem playlistItem)
 {
     lock (state)
     {
         return @"{""state"":{""partialPlaylist"":[" + JsonConvert.SerializeObject(playlistItem) + "]}}";
     }
 }
Example #6
0
 private void Playlist_ItemRemoved(PlaylistItem playlistItem)
 {
     if (playlistItem != null)
     {
         lock (state)
         {
             state.playlist.Remove(playlistItem.ExternalUri);
         }
         Clients.Instance.BroadcastMessage(SerializePlaylist());
     }
 }
Example #7
0
 private void Playlist_ItemAdded(PlaylistItem playlistItem)
 {
     if (playlistItem != null)
     {
         lock (state)
         {
             state.playlist[playlistItem.ExternalUri] = playlistItem;
         }
         playlistItem.MetadataUpdated += PlaylistItem_MetadataUpdated;
         Clients.Instance.BroadcastMessage(SerializePlaylist());
     }
 }
Example #8
0
 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");
        }
Example #11
0
 /// <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) + "}");
 }
Example #12
0
 internal void Populate(PlaylistItem playlistItem)
 {
     playlistItem.ExternalUri = uri;
     playlistItem.InternalUri = internalUri;
     playlistItem.BroadcasterID = broadcasterID;
     playlistItem.BroadcasterName = broadcasterName;
     playlistItem.Bitrate = bitrate;
     playlistItem.TypeOfStream = streamType;
 }