internal override bool Process(TrackInfo info, ref int startIndex, ref int endIndex, ref string piece, StringComparison comparisonType) { if (endIndex - check.Length >= 0 && string.Equals(piece.Substring(endIndex - check.Length, check.Length), check, comparisonType)) { var remixersText = piece.Substring(startIndex + 1, endIndex - startIndex - check.Length - 1) .Trim(); info.Remixers.AddRange(ArtistUtils.SplitArtists(remixersText)); piece = piece.Remove(startIndex, endIndex - startIndex + 1) .Trim(); return(true); } return(false); }
//TODO make this less bad public static TrackInfo GetTrackInfo(string artists, string title, string albumArtists, string album, DateTime date) { var key = (artists + title + albumArtists + album).GetHashCode(); if (cache.TryGetValue(key, out var cached)) { return(cached); } var info = new TrackInfo { Artists = ArtistUtils.SplitArtists(artists), Features = new List <string>(), Remixers = new List <string>(), OriginalTitle = title, Album = album, AlbumArtists = ArtistUtils.SplitArtists(albumArtists), ScrobbledDate = date }; var track = spotifyBad.Replace(title, "$1 ($3 Remix)"); //todo: slow, make this work like it does with brackets const StringComparison COMPARISON_TYPE = StringComparison.OrdinalIgnoreCase; try { var startIndex = 0; while (startIndex < track.Length /*&& startIndex >= 0 */ && (startIndex = track.IndexOf("(", startIndex, COMPARISON_TYPE)) >= 0) { var endIndex = track.IndexOf(")", startIndex, COMPARISON_TYPE); if (endIndex < startIndex) { Console.WriteLine($"error parsing '{info.OriginalTitle}': malformed brackets"); startIndex += 1; } var noMatch = true; foreach (var part in parts) { var found = part.Process(info, ref startIndex, ref endIndex, ref track, COMPARISON_TYPE); if (found) { noMatch = false; break; } } if (noMatch) { Console.WriteLine($"info parsing '{info.OriginalTitle}': unknown pattern"); startIndex = endIndex; } } startIndex = 0; while (startIndex < track.Length && (startIndex = track.IndexOf("[", startIndex, COMPARISON_TYPE)) >= 0) { var endIndex = track.IndexOf("]", startIndex, COMPARISON_TYPE); if (endIndex < startIndex) { Console.WriteLine($"error parsing '{info.OriginalTitle}': malformed brackets"); startIndex += 1; } var noMatch = true; foreach (var part in parts) { var found = part.Process(info, ref startIndex, ref endIndex, ref track, COMPARISON_TYPE); if (found) { noMatch = false; break; } } if (noMatch) { Console.WriteLine($"info parsing '{info.OriginalTitle}': unknown pattern"); startIndex = endIndex; } } } catch (Exception e) { Console.WriteLine($"error parsing '{info.OriginalTitle}': {e}"); } info.ProcessedTitle = track.Trim(); cache.Add(key, info); return(info); }