diff --git a/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs b/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs
new file mode 100644
index 0000000000..711607b9df
--- /dev/null
+++ b/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs
@@ -0,0 +1,51 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.Linq;
+using osu.Game.Beatmaps.Formats;
+using osu.Game.Beatmaps.IO;
+using osu.Game.Beatmaps;
+
+namespace osu.Desktop.Beatmaps.IO
+{
+ ///
+ /// Reads an extracted legacy beatmap from disk.
+ ///
+ public class LegacyFilesystemReader : ArchiveReader
+ {
+ static LegacyFilesystemReader()
+ {
+ AddReader((storage, path) => Directory.Exists(path));
+ }
+
+ private string BasePath { get; set; }
+ private Beatmap FirstMap { get; set; }
+
+ public LegacyFilesystemReader(string path)
+ {
+ BasePath = path;
+ var maps = ReadBeatmaps();
+ if (maps.Length == 0)
+ throw new FileNotFoundException("This directory contains no beatmaps");
+ using (var stream = new StreamReader(ReadFile(maps[0])))
+ {
+ var decoder = BeatmapDecoder.GetDecoder(stream);
+ FirstMap = decoder.Decode(stream);
+ }
+ }
+
+ public override string[] ReadBeatmaps()
+ {
+ return Directory.GetFiles(BasePath, "*.osu").Select(f => Path.GetFileName(f)).ToArray();
+ }
+
+ public override Stream ReadFile(string name)
+ {
+ return File.OpenRead(Path.Combine(BasePath, name));
+ }
+
+ public override Metadata ReadMetadata()
+ {
+ return FirstMap.Metadata;
+ }
}
+}
\ No newline at end of file
diff --git a/osu.Desktop/osu.Desktop.csproj b/osu.Desktop/osu.Desktop.csproj
index 5553f12019..d8463dbc35 100644
--- a/osu.Desktop/osu.Desktop.csproj
+++ b/osu.Desktop/osu.Desktop.csproj
@@ -135,8 +135,13 @@
+
+
+
+
+