aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-09-17 10:32:31 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-09-17 10:32:31 -0400
commit37f0e23bf421ba3626d3768c5b59341eac1f540a (patch)
tree685ec061f61bf7ea36b709e208ffcc8acf98ca7f
parent3b41f9cd2387734ef8a8342a33e0612043e9b0ff (diff)
fixes #538 - Support additional artist splitting
-rw-r--r--MediaBrowser.Common/Extensions/BaseExtensions.cs31
-rw-r--r--MediaBrowser.Providers/MediaInfo/FFProbeAudioInfoProvider.cs32
2 files changed, 55 insertions, 8 deletions
diff --git a/MediaBrowser.Common/Extensions/BaseExtensions.cs b/MediaBrowser.Common/Extensions/BaseExtensions.cs
index 6d95cfa57..452c47159 100644
--- a/MediaBrowser.Common/Extensions/BaseExtensions.cs
+++ b/MediaBrowser.Common/Extensions/BaseExtensions.cs
@@ -20,10 +20,41 @@ namespace MediaBrowser.Common.Extensions
{
// http://stackoverflow.com/questions/1349023/how-can-i-strip-html-from-text-in-net
const string pattern = @"<(.|\n)*?>";
+
return Regex.Replace(htmlString, pattern, string.Empty).Trim();
}
/// <summary>
+ /// Replaces the specified STR.
+ /// </summary>
+ /// <param name="str">The STR.</param>
+ /// <param name="oldValue">The old value.</param>
+ /// <param name="newValue">The new value.</param>
+ /// <param name="comparison">The comparison.</param>
+ /// <returns>System.String.</returns>
+ public static string Replace(this string str, string oldValue, string newValue, StringComparison comparison)
+ {
+ var sb = new StringBuilder();
+
+ var previousIndex = 0;
+ var index = str.IndexOf(oldValue, comparison);
+
+ while (index != -1)
+ {
+ sb.Append(str.Substring(previousIndex, index - previousIndex));
+ sb.Append(newValue);
+ index += oldValue.Length;
+
+ previousIndex = index;
+ index = str.IndexOf(oldValue, index, comparison);
+ }
+
+ sb.Append(str.Substring(previousIndex));
+
+ return sb.ToString();
+ }
+
+ /// <summary>
/// Gets the M d5.
/// </summary>
/// <param name="str">The STR.</param>
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfoProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfoProvider.cs
index b9ef39be9..3594c53c5 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfoProvider.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfoProvider.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.MediaInfo;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.MediaInfo;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
@@ -114,7 +115,7 @@ namespace MediaBrowser.Providers.MediaInfo
if (!string.IsNullOrWhiteSpace(composer))
{
- foreach (var person in Split(composer, true))
+ foreach (var person in Split(composer))
{
audio.AddPerson(new PersonInfo { Name = person, Type = PersonType.Composer });
}
@@ -131,7 +132,7 @@ namespace MediaBrowser.Providers.MediaInfo
}
else
{
- audio.Artists = Split(artist, false)
+ audio.Artists = SplitArtists(artist)
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
@@ -181,13 +182,28 @@ namespace MediaBrowser.Providers.MediaInfo
/// Splits the specified val.
/// </summary>
/// <param name="val">The val.</param>
- /// <param name="allowSplitByComma">if set to <c>true</c> [allow split by comma].</param>
/// <returns>System.String[][].</returns>
- private IEnumerable<string> Split(string val, bool allowSplitByComma)
+ private IEnumerable<string> Split(string val)
{
// Only use the comma as a delimeter if there are no slashes or pipes.
// We want to be careful not to split names that have commas in them
- var delimeter = allowSplitByComma ? (_nameDelimiters.Any(i => val.IndexOf(i) != -1) ? _nameDelimiters : new[] { ',' }) : _nameDelimiters;
+ var delimeter = _nameDelimiters.Any(i => val.IndexOf(i) != -1) ? _nameDelimiters : new[] { ',' };
+
+ return val.Split(delimeter, StringSplitOptions.RemoveEmptyEntries)
+ .Where(i => !string.IsNullOrWhiteSpace(i))
+ .Select(i => i.Trim());
+ }
+
+ private const string ArtistReplaceValue = " | ";
+
+ private IEnumerable<string> SplitArtists(string val)
+ {
+ val = val.Replace(" featuring ", ArtistReplaceValue, StringComparison.OrdinalIgnoreCase)
+ .Replace(" feat. ", ArtistReplaceValue, StringComparison.OrdinalIgnoreCase);
+
+ // Only use the comma as a delimeter if there are no slashes or pipes.
+ // We want to be careful not to split names that have commas in them
+ var delimeter = _nameDelimiters;
return val.Split(delimeter, StringSplitOptions.RemoveEmptyEntries)
.Where(i => !string.IsNullOrWhiteSpace(i))
@@ -207,7 +223,7 @@ namespace MediaBrowser.Providers.MediaInfo
if (!string.IsNullOrEmpty(val))
{
// Sometimes the artist name is listed here, account for that
- var studios = Split(val, true).Where(i => !audio.HasArtist(i));
+ var studios = Split(val).Where(i => !audio.HasArtist(i));
foreach (var studio in studios)
{
@@ -229,7 +245,7 @@ namespace MediaBrowser.Providers.MediaInfo
{
audio.Genres.Clear();
- foreach (var genre in Split(val, true))
+ foreach (var genre in Split(val))
{
audio.AddGenre(genre);
}