From c57da01fac22e1853f2c4fd2d37d8d39439bafcb Mon Sep 17 00:00:00 2001 From: icedream Date: Wed, 7 May 2014 09:16:16 +0200 Subject: [PATCH] Use TagLib# to keep MP3 data separate from AAC. --- src/sc_bridge/ShoutcastBridge.csproj | 6 ++++ src/sc_bridge/ShoutcastBridgeServer.cs | 48 ++++++++++++++++++++----- src/sc_bridge/ShoutcastReadingStream.cs | 2 +- src/sc_bridge/packages.config | 1 + 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/sc_bridge/ShoutcastBridge.csproj b/src/sc_bridge/ShoutcastBridge.csproj index fb2ad9a..7f609fe 100644 --- a/src/sc_bridge/ShoutcastBridge.csproj +++ b/src/sc_bridge/ShoutcastBridge.csproj @@ -48,11 +48,17 @@ ..\..\packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\taglib.2.1.0.0\lib\policy.2.0.taglib-sharp.dll + + + ..\..\packages\taglib.2.1.0.0\lib\taglib-sharp.dll + ..\..\packages\uHttpSharp.0.1.4.7\lib\net40\uhttpsharp.dll diff --git a/src/sc_bridge/ShoutcastBridgeServer.cs b/src/sc_bridge/ShoutcastBridgeServer.cs index 141b438..536b759 100644 --- a/src/sc_bridge/ShoutcastBridgeServer.cs +++ b/src/sc_bridge/ShoutcastBridgeServer.cs @@ -1,12 +1,16 @@ -using log4net; +using System.IO; +using log4net; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; +using TagLib; +using TagLib.Aac; using uhttpsharp; using uhttpsharp.Listeners; using uhttpsharp.RequestProviders; +using File = System.IO.File; namespace AFR.ShoutcastBridge { @@ -164,21 +168,49 @@ namespace AFR.ShoutcastBridge icecast.Url = shoutcast.StreamUrl; icecast.Public = shoutcast.StreamPublic; if (icecast.ContentType == "undefined") - switch (BitConverter.ToString(data.Take(2).ToArray()).Replace("-", "").ToLower()) + { + var fmtcode = BitConverter.ToString(data.Take(2).ToArray()).Replace("-", "").ToLower(); + switch (fmtcode) { case "4f67": // OGG container _sourcelog.DebugFormat("[{0}] Detected OGG audio container", srs.ClientEndPoint); icecast.ContentType = "audio/ogg"; break; - case "fff9": // AAC - _sourcelog.DebugFormat("[{0}] Detected AAC-LC data", srs.ClientEndPoint); - icecast.ContentType = "audio/aac"; - break; default: - _sourcelog.DebugFormat("[{0}] Assuming MP3 codec", srs.ClientEndPoint); - icecast.ContentType = "audio/mpeg"; + + var testpath = Path.GetTempFileName() + ".mp3"; // Will make TagLib try to parse the file as MP3 + try + { + using (var fs = File.Open(testpath, FileMode.OpenOrCreate)) + { + fs.Write(data, 0, data.Length); + fs.Flush(); + } + } + catch (Exception err) + { + _sourcelog.ErrorFormat("[{0}] Failed writing temporary data for analysis: {1}", srs.ClientEndPoint, err); + throw; + } + + try + { + var f = TagLib.File.Create(testpath); + if (f.PossiblyCorrupt) + throw new Exception(); + + _sourcelog.DebugFormat("[{0}] Detected MP3 codec", srs.ClientEndPoint); + icecast.ContentType = f.MimeType; + File.Delete(testpath); + } + catch + { + _sourcelog.DebugFormat("[{0}] Assuming AAC codec", srs.ClientEndPoint); + icecast.ContentType = "audio/aac"; + } break; } + } if (!icecast.Open()) { _sourcelog.ErrorFormat("[{0}] Could not connect with Icecast, retrying on next packet", srs.ClientEndPoint); diff --git a/src/sc_bridge/ShoutcastReadingStream.cs b/src/sc_bridge/ShoutcastReadingStream.cs index e689733..546b8da 100644 --- a/src/sc_bridge/ShoutcastReadingStream.cs +++ b/src/sc_bridge/ShoutcastReadingStream.cs @@ -109,7 +109,7 @@ namespace AFR.ShoutcastBridge } // Content - var data = new byte[2048]; + var data = new byte[16 * 1024]; try { int length; diff --git a/src/sc_bridge/packages.config b/src/sc_bridge/packages.config index 75f51cf..a4ba03f 100644 --- a/src/sc_bridge/packages.config +++ b/src/sc_bridge/packages.config @@ -2,5 +2,6 @@ + \ No newline at end of file