using System; using System.IO; using System.Linq; using osu.Framework.Audio.Track; using osu.Framework.Graphics.Textures; using osu.Framework.IO.Stores; using osu.Game.Beatmaps.Formats; using osu.Game.Graphics.Textures; using osu.Game.Storyboards; namespace osu.Game.Beatmaps { public partial class BeatmapManager { protected class BeatmapManagerWorkingBeatmap : WorkingBeatmap { private readonly IResourceStore store; public BeatmapManagerWorkingBeatmap(IResourceStore store, BeatmapInfo beatmapInfo) : base(beatmapInfo) { this.store = store; } protected override Beatmap GetBeatmap() { try { using (var stream = new StreamReader(store.GetStream(getPathForFile(BeatmapInfo.Path)))) { Decoder decoder = Decoder.GetDecoder(stream); return decoder.DecodeBeatmap(stream); } } catch { return null; } } private string getPathForFile(string filename) => BeatmapSetInfo.Files.First(f => string.Equals(f.Filename, filename, StringComparison.InvariantCultureIgnoreCase)).FileInfo.StoragePath; protected override Texture GetBackground() { if (Metadata?.BackgroundFile == null) return null; try { return new LargeTextureStore(new RawTextureLoaderStore(store)).Get(getPathForFile(Metadata.BackgroundFile)); } catch { return null; } } protected override Track GetTrack() { try { var trackData = store.GetStream(getPathForFile(Metadata.AudioFile)); return trackData == null ? null : new TrackBass(trackData); } catch { return new TrackVirtual(); } } protected override Waveform GetWaveform() => new Waveform(store.GetStream(getPathForFile(Metadata.AudioFile))); protected override Storyboard GetStoryboard() { try { using (var beatmap = new StreamReader(store.GetStream(getPathForFile(BeatmapInfo.Path)))) { Decoder decoder = Decoder.GetDecoder(beatmap); if (BeatmapSetInfo?.StoryboardFile == null) return decoder.GetStoryboardDecoder().DecodeStoryboard(beatmap); using (var storyboard = new StreamReader(store.GetStream(getPathForFile(BeatmapSetInfo.StoryboardFile)))) return decoder.GetStoryboardDecoder().DecodeStoryboard(beatmap, storyboard); } } catch { return new Storyboard(); } } } } }