protected WorkingBeatmap(BeatmapInfo beatmapInfo) { BeatmapInfo = beatmapInfo; BeatmapSetInfo = beatmapInfo.BeatmapSet; Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo?.Metadata ?? new BeatmapMetadata(); Mods.ValueChanged += mods => applyRateAdjustments(); beatmap = new RecyclableLazy <IBeatmap>(() => { var b = GetBeatmap() ?? new Beatmap(); // use the database-backed info. b.BeatmapInfo = BeatmapInfo; return(b); }); track = new RecyclableLazy <Track>(() => { // we want to ensure that we always have a track, even if it's a fake one. var t = GetTrack() ?? new VirtualBeatmapTrack(Beatmap); applyRateAdjustments(t); return(t); }); background = new RecyclableLazy <Texture>(GetBackground, BackgroundStillValid); waveform = new RecyclableLazy <Waveform>(GetWaveform); storyboard = new RecyclableLazy <Storyboard>(GetStoryboard); skin = new RecyclableLazy <Skin>(GetSkin); }
public WorkingBeatmap CreateNew(RulesetInfo ruleset, User user) { var metadata = new BeatmapMetadata { Artist = "artist", Title = "title", Author = user, }; var set = new BeatmapSetInfo { Metadata = metadata, Beatmaps = new List <BeatmapInfo> { new BeatmapInfo { BaseDifficulty = new BeatmapDifficulty(), Ruleset = ruleset, Metadata = metadata, Version = "difficulty" } } }; var working = Import(set).Result; return(GetWorkingBeatmap(working.Beatmaps.First())); }
protected WorkingBeatmap(BeatmapInfo beatmapInfo) { BeatmapInfo = beatmapInfo; BeatmapSetInfo = beatmapInfo.BeatmapSet; Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo?.Metadata ?? new BeatmapMetadata(); Mods.ValueChanged += _ => applyRateAdjustments(); beatmap = new RecyclableLazy <IBeatmap>(() => { var b = GetBeatmap() ?? new Beatmap(); // The original beatmap version needs to be preserved as the database doesn't contain it BeatmapInfo.BeatmapVersion = b.BeatmapInfo.BeatmapVersion; // Use the database-backed info for more up-to-date values (beatmap id, ranked status, etc) b.BeatmapInfo = BeatmapInfo; return(b); }); track = new RecyclableLazy <Track>(() => { // we want to ensure that we always have a track, even if it's a fake one. var t = GetTrack() ?? new VirtualBeatmapTrack(Beatmap); applyRateAdjustments(t); return(t); }); background = new RecyclableLazy <Texture>(GetBackground, BackgroundStillValid); waveform = new RecyclableLazy <Waveform>(GetWaveform); storyboard = new RecyclableLazy <Storyboard>(GetStoryboard); skin = new RecyclableLazy <Skin>(GetSkin); }
/// <summary> /// Create a new <see cref="WorkingBeatmap"/>. /// </summary> public WorkingBeatmap CreateNew(RulesetInfo ruleset, APIUser user) { var metadata = new BeatmapMetadata { Author = user, }; var set = new BeatmapSetInfo { Metadata = metadata, Beatmaps = { new BeatmapInfo { BaseDifficulty = new BeatmapDifficulty(), Ruleset = ruleset, Metadata = metadata, WidescreenStoryboard = true, SamplesMatchPlaybackRate = true, } } }; var imported = beatmapModelManager.Import(set).Result.Value; return(GetWorkingBeatmap(imported.Beatmaps.First())); }
/// <summary> /// Create a new beatmap set, backed by a <see cref="BeatmapSetInfo"/> model, /// with a single difficulty which is backed by a <see cref="BeatmapInfo"/> model /// and represented by the returned usable <see cref="WorkingBeatmap"/>. /// </summary> public WorkingBeatmap CreateNew(RulesetInfo ruleset, APIUser user) { var metadata = new BeatmapMetadata { Author = new RealmUser { OnlineID = user.OnlineID, Username = user.Username, } }; var beatmapSet = new BeatmapSetInfo { Beatmaps = { new BeatmapInfo(ruleset, new BeatmapDifficulty(), metadata) } }; foreach (BeatmapInfo b in beatmapSet.Beatmaps) { b.BeatmapSet = beatmapSet; } var imported = beatmapImporter.ImportModel(beatmapSet); if (imported == null) { throw new InvalidOperationException("Failed to import new beatmap"); } return(imported.PerformRead(s => GetWorkingBeatmap(s.Beatmaps.First()))); }
public WorkingBeatmap CreateNew(RulesetInfo ruleset, User user) { var metadata = new BeatmapMetadata { Author = user, }; var set = new BeatmapSetInfo { Metadata = metadata, Beatmaps = new List <BeatmapInfo> { new BeatmapInfo { BaseDifficulty = new BeatmapDifficulty(), Ruleset = ruleset, Metadata = metadata, WidescreenStoryboard = true, } } }; var working = Import(set).Result; return(GetWorkingBeatmap(working.Beatmaps.First())); }
protected WorkingBeatmap(BeatmapInfo beatmapInfo) { BeatmapInfo = beatmapInfo; BeatmapSetInfo = beatmapInfo.BeatmapSet; Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo?.Metadata ?? new BeatmapMetadata(); beatmap = new RecyclableLazy <IBeatmap>(() => { var b = GetBeatmap() ?? new Beatmap(); // The original beatmap version needs to be preserved as the database doesn't contain it BeatmapInfo.BeatmapVersion = b.BeatmapInfo.BeatmapVersion; // Use the database-backed info for more up-to-date values (beatmap id, ranked status, etc) b.BeatmapInfo = BeatmapInfo; return(b); }); track = new RecyclableLazy <Track>(() => GetTrack() ?? new VirtualBeatmapTrack(Beatmap)); background = new RecyclableLazy <Texture>(GetBackground, BackgroundStillValid); waveform = new RecyclableLazy <Waveform>(GetWaveform); storyboard = new RecyclableLazy <Storyboard>(GetStoryboard); skin = new RecyclableLazy <Skin>(GetSkin); }
protected WorkingBeatmap(BeatmapInfo beatmapInfo) { BeatmapInfo = beatmapInfo; BeatmapSetInfo = beatmapInfo.BeatmapSet; Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo.Metadata; Mods.ValueChanged += mods => applyRateAdjustments(); }
protected WorkingBeatmap(BeatmapInfo beatmapInfo, bool fullyLoaded = false) { BeatmapInfo = beatmapInfo; BeatmapSetInfo = beatmapInfo.BeatmapSet; Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo.Metadata; FullyLoaded = fullyLoaded; Mods.ValueChanged += mods => applyRateAdjustments(); }
protected WorkingBeatmap(BeatmapInfo beatmapInfo, bool withStoryboard = false) { BeatmapInfo = beatmapInfo; BeatmapSetInfo = beatmapInfo.BeatmapSet; Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo.Metadata; WithStoryboard = withStoryboard; Mods.ValueChanged += mods => applyRateAdjustments(); }
protected WorkingBeatmap(BeatmapInfo beatmapInfo, AudioManager audioManager) { AudioManager = audioManager; BeatmapInfo = beatmapInfo; BeatmapSetInfo = beatmapInfo.BeatmapSet; Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo?.Metadata ?? new BeatmapMetadata(); background = new RecyclableLazy <Texture>(GetBackground, BackgroundStillValid); waveform = new RecyclableLazy <Waveform>(GetWaveform); storyboard = new RecyclableLazy <Storyboard>(GetStoryboard); skin = new RecyclableLazy <ISkin>(GetSkin); }
protected WorkingBeatmap(BeatmapInfo beatmapInfo) { BeatmapInfo = beatmapInfo; BeatmapSetInfo = beatmapInfo.BeatmapSet; Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo?.Metadata ?? new BeatmapMetadata(); Mods.ValueChanged += mods => applyRateAdjustments(); beatmap = new AsyncLazy <Beatmap>(populateBeatmap); background = new AsyncLazy <Texture>(populateBackground); track = new AsyncLazy <Track>(populateTrack); waveform = new AsyncLazy <Waveform>(populateWaveform); }
protected WorkingBeatmap(BeatmapInfo beatmapInfo, AudioManager audioManager) { AudioManager = audioManager; BeatmapInfo = beatmapInfo; BeatmapSetInfo = beatmapInfo.BeatmapSet; Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo?.Metadata ?? new BeatmapMetadata(); track = new RecyclableLazy <Track>(() => GetTrack() ?? GetVirtualTrack(1000)); background = new RecyclableLazy <Texture>(GetBackground, BackgroundStillValid); waveform = new RecyclableLazy <Waveform>(GetWaveform); storyboard = new RecyclableLazy <Storyboard>(GetStoryboard); skin = new RecyclableLazy <ISkin>(GetSkin); total_count.Value++; }
protected WorkingBeatmap(BeatmapInfo beatmapInfo) { BeatmapInfo = beatmapInfo; BeatmapSetInfo = beatmapInfo.BeatmapSet; Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo?.Metadata ?? new BeatmapMetadata(); Mods.ValueChanged += mods => applyRateAdjustments(); beatmap = new AsyncLazy <IBeatmap>(populateBeatmap); background = new AsyncLazy <Texture>(populateBackground, b => b == null || !b.IsDisposed); track = new AsyncLazy <Track>(populateTrack); waveform = new AsyncLazy <Waveform>(populateWaveform); storyboard = new AsyncLazy <Storyboard>(populateStoryboard); skin = new AsyncLazy <Skin>(populateSkin); }
/// <summary> /// Create all required <see cref="BeatmapInfo"/>s for the provided archive. /// </summary> private List <BeatmapInfo> createBeatmapDifficulties(IList <RealmNamedFileUsage> files, Realm realm) { var beatmaps = new List <BeatmapInfo>(); foreach (var file in files.Where(f => f.Filename.EndsWith(".osu", StringComparison.OrdinalIgnoreCase))) { using (var memoryStream = new MemoryStream(Files.Store.Get(file.File.GetStoragePath()))) // we need a memory stream so we can seek { IBeatmap decoded; using (var lineReader = new LineBufferedReader(memoryStream, true)) decoded = Decoder.GetDecoder <Beatmap>(lineReader).Decode(lineReader); string hash = memoryStream.ComputeSHA2Hash(); if (beatmaps.Any(b => b.Hash == hash)) { Logger.Log($"Skipping import of {file.Filename} due to duplicate file content.", LoggingTarget.Database); continue; } var decodedInfo = decoded.BeatmapInfo; var decodedDifficulty = decodedInfo.Difficulty; var ruleset = realm.All <RulesetInfo>().FirstOrDefault(r => r.OnlineID == decodedInfo.Ruleset.OnlineID); if (ruleset?.Available != true) { Logger.Log($"Skipping import of {file.Filename} due to missing local ruleset {decodedInfo.Ruleset.OnlineID}.", LoggingTarget.Database); continue; } var difficulty = new BeatmapDifficulty { DrainRate = decodedDifficulty.DrainRate, CircleSize = decodedDifficulty.CircleSize, OverallDifficulty = decodedDifficulty.OverallDifficulty, ApproachRate = decodedDifficulty.ApproachRate, SliderMultiplier = decodedDifficulty.SliderMultiplier, SliderTickRate = decodedDifficulty.SliderTickRate, }; var metadata = new BeatmapMetadata { Title = decoded.Metadata.Title, TitleUnicode = decoded.Metadata.TitleUnicode, Artist = decoded.Metadata.Artist, ArtistUnicode = decoded.Metadata.ArtistUnicode, Author = { OnlineID = decoded.Metadata.Author.OnlineID, Username = decoded.Metadata.Author.Username }, Source = decoded.Metadata.Source, Tags = decoded.Metadata.Tags, PreviewTime = decoded.Metadata.PreviewTime, AudioFile = decoded.Metadata.AudioFile, BackgroundFile = decoded.Metadata.BackgroundFile, }; var beatmap = new BeatmapInfo(ruleset, difficulty, metadata) { Hash = hash, DifficultyName = decodedInfo.DifficultyName, OnlineID = decodedInfo.OnlineID, AudioLeadIn = decodedInfo.AudioLeadIn, StackLeniency = decodedInfo.StackLeniency, SpecialStyle = decodedInfo.SpecialStyle, LetterboxInBreaks = decodedInfo.LetterboxInBreaks, WidescreenStoryboard = decodedInfo.WidescreenStoryboard, EpilepsyWarning = decodedInfo.EpilepsyWarning, SamplesMatchPlaybackRate = decodedInfo.SamplesMatchPlaybackRate, DistanceSpacing = decodedInfo.DistanceSpacing, BeatDivisor = decodedInfo.BeatDivisor, GridSize = decodedInfo.GridSize, TimelineZoom = decodedInfo.TimelineZoom, MD5Hash = memoryStream.ComputeMD5Hash(), }; updateBeatmapStatistics(beatmap, decoded); beatmaps.Add(beatmap); } } return(beatmaps); }