private void SetupStream(out IceCastStream radioStream, string url) { radioStream = new IceCastStream(url, false); radioStream.Start(); radioStream.OnStreamUpdate += new StreamUpdate(IceCastStreamUpdate); dtLastEvent = DateTime.Now; }
public Stream StartStreaming(string host, string password, string mountPoint, string mimeType, bool isPublic, string name, string description, string url, string genre, int port = 8000) { IceCastStream iceCastStream = new IceCastStream(host, port); byte[] byteArray = Encoding.ASCII.GetBytes($"source:{password}"); string basicAuth = Convert.ToBase64String(byteArray); StreamWriter streamWriter = new StreamWriter(iceCastStream, Encoding.ASCII); StreamReader streamReader = new StreamReader(iceCastStream, Encoding.ASCII); streamWriter.WriteLine($"PUT /{mountPoint} HTTP/1.1"); streamWriter.WriteLine($"Host: {host}:{port}"); streamWriter.WriteLine($"Authorization: Basic {basicAuth}"); streamWriter.WriteLine("User-Agent: icecaster"); streamWriter.WriteLine("Accept: */*"); streamWriter.WriteLine("Transfer-Encoding: chunked"); streamWriter.WriteLine($"Content-Type: {mimeType}"); streamWriter.WriteLine($"Ice-Public: {(isPublic ? 1 : 0)}"); streamWriter.WriteLine($"Ice-Name: {name}"); streamWriter.WriteLine($"Ice-Description: {description}"); streamWriter.WriteLine($"Ice-URL: {url}"); streamWriter.WriteLine($"Ice-Genre: {genre}"); streamWriter.WriteLine("Expect: 100-continue"); streamWriter.WriteLine(); streamWriter.Flush(); string response = streamReader.ReadLine(); if (response == null) { throw new IceCastException("Server didn't respond"); } string responseCode = Regex.Replace(response, @"^HTTP/\d\.\d\s+(\d+ .*?)\s*$", "$1"); switch (responseCode) { case "100 Continue": break; default: throw new IceCastException(responseCode); } return(iceCastStream); }
public void RunChannel(string radioChannelCode) { DataRow row; if (!Exec_MySQL_RADIOCHANNEL_S(radioChannelCode, out row)) { Console.WriteLine("No radiochannel available. Please set correct 'RadioCode' in ini file"); return; } dict = new ConcurrentDictionary <string, DetectSong>(); radioName = row["RADIONAME"].ToString(); radioCode = row["NAMECODE"].ToString(); radioChannel = Convert.ToInt32(row["RADIOCHANNEL_ID"]); GetSettings(); SetWindowTitle(); try { CDR.Ini.IniFile ini = new CDR.Ini.IniFile(CDR.DB_Helper.FingerprintIniFile); wsAPICDRNL_User = ini.IniReadValue("Muziekweb", "wsAPICDRNL_User", wsAPICDRNL_User); } catch { } // Are we using the muziekweb dataset, Yes than metadata can be requested // other datasets can not be used, because ID's do not match retrieveMetadataFromMuziekweb = (Exec_MySQL_TITELNUMMERTRACK_ID_COUNT() > 1000000); // this is probally the muziekweb dataset Console.WriteLine(string.Format("Listing to '{0}'.", radioName)); // Kies een tijd uit waarbij de minuut in het uur ('s nachts 2 uur) random is gekozen // (zodat ze niet allemaal tegelijktijd stoppen met werken) Random random = new Random(); DateTime dtStopListening = DateTime.Now.Date.Add(new TimeSpan(1, 2, random.Next(0, 59), 0, 0)); SetupStream(out radioStream, row["URL"].ToString()); try { bool stop = false; do { if (Console.KeyAvailable) { ConsoleKeyInfo key = Console.ReadKey(true); if (key.KeyChar == '\r') { stop = true; break; } else if (char.ToUpper(key.KeyChar) == 'W') { doWriteChunksToWAVFile = !doWriteChunksToWAVFile; SetWindowTitle(); } else if (char.ToUpper(key.KeyChar) == 'A') { doAudioOn = !doAudioOn; SetWindowTitle(); radioStream.Listen = doAudioOn; } } Thread.Sleep(100); if ((DateTime.Now - dtLastEvent).TotalSeconds > 30) { // Het is telang geleden dat we enig leven van de icestream class hebben gekregen // Kill het en maak een nieuwe aan. dtLastEvent = DateTime.MaxValue; Console.WriteLine(); Console.WriteLine(radioName + ": Killing app and restarting it"); Program.StoreConsoleWindowPosition(radioChannelCode); // terminate this process and restart it (to avoid block/lock problems) System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location, GetCommandParameters()); stop = true; break; } if ((DateTime.Now - dtStopListening).TotalSeconds > 0) { // we stoppen zonder stop te zetten! System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location, GetCommandParameters()); break; } } while (!stop); CleanUpDict(true); } finally { if (radioStream != null) { radioStream.Stop(); // close is the same radioStream = null; } } }