// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using System.IO; using System.Linq; using osu.Framework.Platform; namespace osu.Game.IO { /// /// A storage pointing to an osu-stable installation. /// Provides methods for handling installations with a custom Song folder location. /// public class StableStorage : DesktopStorage { private const string stable_default_songs_path = "Songs"; private readonly DesktopGameHost host; private readonly Lazy songsPath; public StableStorage(string path, DesktopGameHost host) : base(path, host) { this.host = host; songsPath = new Lazy(locateSongsDirectory); } /// /// Returns a pointing to the osu-stable Songs directory. /// public Storage GetSongStorage() => new DesktopStorage(songsPath.Value, host); private string locateSongsDirectory() { var songsDirectoryPath = Path.Combine(BasePath, stable_default_songs_path); var configFile = GetFiles(".", $"osu!.{Environment.UserName}.cfg").SingleOrDefault(); if (configFile == null) return songsDirectoryPath; using (var stream = GetStream(configFile)) using (var textReader = new StreamReader(stream)) { string line; while ((line = textReader.ReadLine()) != null) { if (line.StartsWith("BeatmapDirectory", StringComparison.OrdinalIgnoreCase)) { var directory = line.Split('=')[1].TrimStart(); if (Path.IsPathFullyQualified(directory)) songsDirectoryPath = directory; break; } } } return songsDirectoryPath; } } }