Пример #1
0
        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);
        }
Пример #2
0
        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()));
        }
Пример #3
0
        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);
        }
Пример #4
0
        /// <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()));
        }
Пример #5
0
        /// <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())));
        }
Пример #6
0
        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()));
        }
Пример #7
0
        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);
        }
Пример #8
0
        protected WorkingBeatmap(BeatmapInfo beatmapInfo)
        {
            BeatmapInfo    = beatmapInfo;
            BeatmapSetInfo = beatmapInfo.BeatmapSet;
            Metadata       = beatmapInfo.Metadata ?? BeatmapSetInfo.Metadata;

            Mods.ValueChanged += mods => applyRateAdjustments();
        }
Пример #9
0
        protected WorkingBeatmap(BeatmapInfo beatmapInfo, bool fullyLoaded = false)
        {
            BeatmapInfo    = beatmapInfo;
            BeatmapSetInfo = beatmapInfo.BeatmapSet;
            Metadata       = beatmapInfo.Metadata ?? BeatmapSetInfo.Metadata;
            FullyLoaded    = fullyLoaded;

            Mods.ValueChanged += mods => applyRateAdjustments();
        }
Пример #10
0
        protected WorkingBeatmap(BeatmapInfo beatmapInfo, bool withStoryboard = false)
        {
            BeatmapInfo    = beatmapInfo;
            BeatmapSetInfo = beatmapInfo.BeatmapSet;
            Metadata       = beatmapInfo.Metadata ?? BeatmapSetInfo.Metadata;
            WithStoryboard = withStoryboard;

            Mods.ValueChanged += mods => applyRateAdjustments();
        }
Пример #11
0
        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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        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++;
        }
Пример #14
0
        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);
        }
Пример #15
0
        /// <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);
        }