diff --git a/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs b/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs
index 711607b9df..31c7b4c365 100644
--- a/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs
+++ b/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs
@@ -19,15 +19,16 @@ namespace osu.Desktop.Beatmaps.IO
}
private string BasePath { get; set; }
+ private string[] Beatmaps { get; set; }
private Beatmap FirstMap { get; set; }
public LegacyFilesystemReader(string path)
{
BasePath = path;
- var maps = ReadBeatmaps();
- if (maps.Length == 0)
+ Beatmaps = Directory.GetFiles(BasePath, "*.osu").Select(f => Path.GetFileName(f)).ToArray();
+ if (Beatmaps.Length == 0)
throw new FileNotFoundException("This directory contains no beatmaps");
- using (var stream = new StreamReader(ReadFile(maps[0])))
+ using (var stream = new StreamReader(ReadFile(Beatmaps[0])))
{
var decoder = BeatmapDecoder.GetDecoder(stream);
FirstMap = decoder.Decode(stream);
@@ -36,7 +37,7 @@ namespace osu.Desktop.Beatmaps.IO
public override string[] ReadBeatmaps()
{
- return Directory.GetFiles(BasePath, "*.osu").Select(f => Path.GetFileName(f)).ToArray();
+ return Beatmaps;
}
public override Stream ReadFile(string name)
diff --git a/osu.Game/Beatmaps/IO/OszArchiveReader.cs b/osu.Game/Beatmaps/IO/OszArchiveReader.cs
index 13a4db5db5..036ce07128 100644
--- a/osu.Game/Beatmaps/IO/OszArchiveReader.cs
+++ b/osu.Game/Beatmaps/IO/OszArchiveReader.cs
@@ -1,5 +1,8 @@
using System;
using System.IO;
+using System.Linq;
+using Ionic.Zip;
+using osu.Game.Beatmaps.Formats;
namespace osu.Game.Beatmaps.IO
{
@@ -11,32 +14,48 @@ namespace osu.Game.Beatmaps.IO
{
using (var stream = storage.GetStream(path))
{
- // TODO: detect if osz
- return false;
+ if (!ZipFile.IsZipFile(stream, false))
+ return false;
+ using (ZipFile zip = ZipFile.Read(stream))
+ return zip.Entries.Any(e => e.FileName.EndsWith(".osu"));
}
});
}
- private Stream Archive { get; set; }
+ private ZipFile Archive { get; set; }
+ private string[] Beatmaps { get; set; }
+ private Beatmap FirstMap { get; set; }
public OszArchiveReader(Stream archive)
{
- Archive = archive;
+ Archive = ZipFile.Read(archive);
+ Beatmaps = Archive.Entries.Where(e => e.FileName.EndsWith(".osu"))
+ .Select(e => e.FileName).ToArray();
+ if (Beatmaps.Length == 0)
+ throw new FileNotFoundException("This directory contains no beatmaps");
+ using (var stream = new StreamReader(ReadFile(Beatmaps[0])))
+ {
+ var decoder = BeatmapDecoder.GetDecoder(stream);
+ FirstMap = decoder.Decode(stream);
+ }
}
public override string[] ReadBeatmaps()
{
- throw new NotImplementedException();
+ return Beatmaps;
}
public override Stream ReadFile(string name)
{
- throw new NotImplementedException();
+ ZipEntry entry = Archive.Entries.SingleOrDefault(e => e.FileName == name);
+ if (entry == null)
+ throw new FileNotFoundException();
+ return entry.OpenReader();
}
public override Metadata ReadMetadata()
{
- throw new NotImplementedException();
+ return FirstMap.Metadata;
}
}
}
\ No newline at end of file
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index ed8d91d6e7..e50e0847d8 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -55,6 +55,9 @@
..\packages\sqlite-net-pcl.1.2.0\lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLite-net.dll
+
+ ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll
+
diff --git a/osu.Game/packages.config b/osu.Game/packages.config
index d40da68750..1f14b0038d 100644
--- a/osu.Game/packages.config
+++ b/osu.Game/packages.config
@@ -4,6 +4,7 @@ Copyright (c) 2007-2016 ppy Pty Ltd .
Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-->
+