Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions OsuParsers.Tests/Beatmaps.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,29 @@ public void ParseAll()
}
}

public void ParallelParseAll()
{
var timerAll = new Stopwatch();
timerAll.Start();
Parallel.ForEach(RawFiles, file =>
{
var timer = new Stopwatch();
timer.Start();
var beatmap = BeatmapDecoder.Decode(file);
timer.Stop();
Maps.Add(beatmap);
Trace.WriteLine(string.Format(
"Beatmap parsed in {0}ms: {1} - {2} [{3}] created by {4}.",
timer.Elapsed.Milliseconds,
beatmap.MetadataSection.Artist,
beatmap.MetadataSection.Title,
beatmap.MetadataSection.Version,
beatmap.MetadataSection.Creator));
});
timerAll.Stop();
Trace.WriteLine($"All beatmaps parsed in {timerAll.Elapsed.Milliseconds}ms.");
}

private string BaseUrl => @"https://osu.ppy.sh/osu/";

private List<uint> BeatmapIDs = new List<uint>
Expand Down Expand Up @@ -103,6 +126,15 @@ public async Task ParseAllTestingBeatmaps()
ParseAll();
}

[TestMethod]
public async Task ParseAllTestingBeatmapsParallel()
{
RawFiles.Clear();
await GetTestingBeatmaps();
Trace.WriteLine("Parsing beatmaps in parallel...");
ParallelParseAll();
}

[DataTestMethod]
[DataRow(10)]
public async Task ParseRandomBeatmaps(int amount)
Expand Down
48 changes: 28 additions & 20 deletions OsuParsers/Decoders/BeatmapDecoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,6 @@ namespace OsuParsers.Decoders
{
public static class BeatmapDecoder
{
private static Beatmap Beatmap;
private static FileSections currentSection = FileSections.None;
private static List<string> sbLines = new List<string>();

/// <summary>
/// Parses .osu file.
/// </summary>
Expand All @@ -35,12 +31,31 @@ public static Beatmap Decode(string path)
throw new FileNotFoundException();
}

/// <summary>
/// Parses .osu file.
/// </summary>
/// <param name="stream">Stream containing beatmap data.</param>
/// <returns>A usable beatmap.</returns>
public static Beatmap Decode(Stream stream) => Decode(stream.ReadAllLines());

/// <summary>
/// Parses .osu file.
/// </summary>
/// <param name="lines">Array of text lines containing beatmap data.</param>
/// <returns>A usable beatmap.</returns>
public static Beatmap Decode(IEnumerable<string> lines)
{
return new BeatmapDecodeTask().Run(lines);
}
}

internal class BeatmapDecodeTask
{
private Beatmap Beatmap;
private FileSections currentSection = FileSections.None;
private List<string> sbLines = new List<string>();

public Beatmap Run(IEnumerable<string> lines)
{
Beatmap = new Beatmap();
currentSection = FileSections.Format;
Expand Down Expand Up @@ -68,14 +83,7 @@ public static Beatmap Decode(IEnumerable<string> lines)
return Beatmap;
}

/// <summary>
/// Parses .osu file.
/// </summary>
/// <param name="stream">Stream containing beatmap data.</param>
/// <returns>A usable beatmap.</returns>
public static Beatmap Decode(Stream stream) => Decode(stream.ReadAllLines());

private static void ParseLine(string line)
private void ParseLine(string line)
{
switch (currentSection)
{
Expand Down Expand Up @@ -109,7 +117,7 @@ private static void ParseLine(string line)
}
}

private static void ParseGeneral(string line)
private void ParseGeneral(string line)
{
int index = line.IndexOf(':');
string variable = line.Remove(index).Trim();
Expand Down Expand Up @@ -160,7 +168,7 @@ private static void ParseGeneral(string line)
}
}

private static void ParseEditor(string line)
private void ParseEditor(string line)
{
int index = line.IndexOf(':');
string variable = line.Remove(index).Trim();
Expand All @@ -186,7 +194,7 @@ private static void ParseEditor(string line)
}
}

private static void ParseMetadata(string line)
private void ParseMetadata(string line)
{
int index = line.IndexOf(':');
string variable = line.Remove(index).Trim();
Expand Down Expand Up @@ -227,7 +235,7 @@ private static void ParseMetadata(string line)
}
}

private static void ParseDifficulty(string line)
private void ParseDifficulty(string line)
{
int index = line.IndexOf(':');
string variable = line.Remove(index).Trim();
Expand Down Expand Up @@ -256,7 +264,7 @@ private static void ParseDifficulty(string line)
}
}

private static void ParseEvents(string line)
private void ParseEvents(string line)
{
string[] tokens = line.Split(',');

Expand Down Expand Up @@ -290,7 +298,7 @@ private static void ParseEvents(string line)
}
}

private static void ParseTimingPoints(string line)
private void ParseTimingPoints(string line)
{
string[] tokens = line.Split(',');

Expand Down Expand Up @@ -334,7 +342,7 @@ private static void ParseTimingPoints(string line)
});
}

private static void ParseColours(string line)
private void ParseColours(string line)
{
int index = line.IndexOf(':');
string variable = line.Remove(index).Trim();
Expand All @@ -354,7 +362,7 @@ private static void ParseColours(string line)
}
}

private static void ParseHitObjects(string line)
private void ParseHitObjects(string line)
{
string[] tokens = line.Split(',');

Expand Down
36 changes: 22 additions & 14 deletions OsuParsers/Decoders/StoryboardDecoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@ namespace OsuParsers.Decoders
{
public static class StoryboardDecoder
{
private static Storyboard storyboard;
private static IStoryboardObject lastDrawable;
private static CommandGroup commandGroup;

/// <summary>
/// Parses .osb file.
/// </summary>
Expand All @@ -32,12 +28,31 @@ public static Storyboard Decode(string path)
throw new FileNotFoundException();
}

/// <summary>
/// Parses .osb file.
/// </summary>
/// <param name="stream">Stream containing storyboard data.</param>
/// <returns>A usable storyboard.</returns>
public static Storyboard Decode(Stream stream) => Decode(stream.ReadAllLines());

/// <summary>
/// Parses .osb file.
/// </summary>
/// <param name="lines">Array of text lines containing storyboard data.</param>
/// <returns>A usable storyboard.</returns>
public static Storyboard Decode(IEnumerable<string> lines)
{
return new StoryboardDecodeTask().Run(lines);
}
}

internal class StoryboardDecodeTask
{
private Storyboard storyboard;
private IStoryboardObject lastDrawable;
private CommandGroup commandGroup;

public Storyboard Run(IEnumerable<string> lines)
{
storyboard = new Storyboard();
lastDrawable = null;
Expand Down Expand Up @@ -65,14 +80,7 @@ public static Storyboard Decode(IEnumerable<string> lines)
return storyboard;
}

/// <summary>
/// Parses .osb file.
/// </summary>
/// <param name="stream">Stream containing storyboard data.</param>
/// <returns>A usable storyboard.</returns>
public static Storyboard Decode(Stream stream) => Decode(stream.ReadAllLines());

private static string ParseVariables(string line)
private string ParseVariables(string line)
{
if (storyboard.Variables == null || line.IndexOf('$') < 0)
return line;
Expand All @@ -83,7 +91,7 @@ private static string ParseVariables(string line)
return line;
}

private static void ParseSbObject(string line)
private void ParseSbObject(string line)
{
string[] tokens = line.Split(',');

Expand Down Expand Up @@ -129,7 +137,7 @@ private static void ParseSbObject(string line)
}
}

private static void ParseSbCommand(string line)
private void ParseSbCommand(string line)
{
int depth = 0;
while (line.StartsWith(" ") || line.StartsWith("_"))
Expand Down