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 @@ + + + + +