protected virtual void AddNameValueProperty(TrackMetadata trackMetadata, string name, string value) { Debug.WriteLine("ShoutcastMetadataFilter.AddNameValueProperty(): " + name + "=" + value); value = string.IsNullOrWhiteSpace(value) ? null : value.Trim(); switch (name.ToLowerInvariant()) { case "streamtitle": trackMetadata.Title = value; break; case "streamurl": { // Scope Uri url; if (Uri.TryCreate(value, UriKind.Absolute, out url)) trackMetadata.Website = url; } break; } }
protected virtual void ParseByQuotes(string metadata, TrackMetadata trackMetadata) { var index = 0; for (; ; ) { var equalSign = metadata.IndexOf('=', index); if (equalSign <= index) break; var name = metadata.Substring(index, equalSign - index).Trim(); var firstQuote = metadata.IndexOf('\'', equalSign); if (firstQuote < 0 || firstQuote + 1 >= metadata.Length) break; var lastQuote = metadata.IndexOf('\'', firstQuote + 1); if (lastQuote < 0) break; var value = metadata.Substring(firstQuote + 1, lastQuote - firstQuote - 1); AddNameValueProperty(trackMetadata, name, value); var semicolon = metadata.IndexOf(';', lastQuote); if (semicolon < 0) break; index = semicolon + 1; if (index >= metadata.Length) break; } }
protected virtual void ParseByPairs(string metadata, TrackMetadata trackMetadata) { var index = 0; for (; ; ) { var equalQuote = metadata.IndexOf("='", index, StringComparison.Ordinal); if (equalQuote <= index) break; var name = metadata.Substring(index, equalQuote - index).Trim(); var quoteSemi = metadata.IndexOf("';", equalQuote, StringComparison.Ordinal); var isLast = false; if (quoteSemi < 0) { quoteSemi = metadata.LastIndexOf('\''); if (quoteSemi < 0 || quoteSemi <= equalQuote + 1) break; isLast = true; } var valueStart = equalQuote + 2; var value = metadata.Substring(valueStart, quoteSemi - valueStart); AddNameValueProperty(trackMetadata, name, value); if (isLast) break; index = quoteSemi + 2; if (index >= metadata.Length) break; } }
protected virtual void ParseStringMetadata(string metadata) { Debug.WriteLine("ShoutcastMetadataFilter.ParseStringMetadata(): " + metadata); var trackMetadata = new TrackMetadata { TimeStamp = _audioParser.Position }; if (UseParseByPairs) ParseByPairs(metadata, trackMetadata); else ParseByQuotes(metadata, trackMetadata); _reportMetadata(trackMetadata); }