diff -up banshee-2.6.2/src/Libraries/Migo/Migo.Syndication/RssParser.cs.dos2unix banshee-2.6.2/src/Libraries/Migo/Migo.Syndication/RssParser.cs --- banshee-2.6.2/src/Libraries/Migo/Migo.Syndication/RssParser.cs.dos2unix 2014-02-18 15:35:24.000000000 -0500 +++ banshee-2.6.2/src/Libraries/Migo/Migo.Syndication/RssParser.cs 2017-08-31 10:45:49.868223559 -0400 @@ -54,26 +54,49 @@ namespace Migo.Syndication try { doc.LoadXml (xml); } catch (XmlException e) { - bool have_stripped_control = false; - StringBuilder sb = new StringBuilder (); - - foreach (char c in xml) { - if (Char.IsControl (c) && c != '\n') { - have_stripped_control = true; - } else { - sb.Append (c); - } - } - bool loaded = false; - if (have_stripped_control) { + string DosLineBreak = "\r\n"; + var encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: true); + string _byteOrderMarkUtf8 = encoding.GetString(encoding.GetPreamble()); + if (System.Text.RegularExpressions.Regex.IsMatch(xml, DosLineBreak, System.Text.RegularExpressions.RegexOptions.IgnoreCase)) { + Hyena.Log.Warning ("DosLineBreaks detected in xml"); + string result = xml.Replace("\r", ""); + if (result.StartsWith(_byteOrderMarkUtf8, StringComparison.Ordinal)) { + Hyena.Log.Warning ("UTF-8 BOM detected in xml"); + result = result.Remove(0, _byteOrderMarkUtf8.Length); + } + if (result.StartsWith("\uFEFF", StringComparison.Ordinal)) { + Hyena.Log.Warning ("UTF-16 BOM detected in xml"); + result.Trim(new char[]{'\uFEFF','\u200B'}); + } try { - doc.LoadXml (sb.ToString ()); + doc.LoadXml (result); loaded = true; } catch (Exception) { } } + if (!loaded) { + bool have_stripped_control = false; + StringBuilder sb = new StringBuilder (); + + foreach (char c in xml) { + if (Char.IsControl (c) && c != '\n') { + have_stripped_control = true; + } else { + sb.Append (c); + } + } + + if (have_stripped_control) { + try { + doc.LoadXml (sb.ToString ()); + loaded = true; + } catch (Exception) { + } + } + } + if (!loaded) { Hyena.Log.Exception (e); throw new FormatException ("Invalid XML document.");