Exemple #1
0
        protected static RealmBeatmapSet CreateBeatmapSet(RealmRuleset ruleset)
        {
            RealmFile createRealmFile() => new RealmFile
            {
                Hash = Guid.NewGuid().ToString().ComputeSHA2Hash()
            };

            var metadata = new RealmBeatmapMetadata
            {
                Title  = "My Love",
                Artist = "Kuba Oms"
            };

            var beatmapSet = new RealmBeatmapSet
            {
                Beatmaps =
                {
                    new RealmBeatmap(ruleset, new RealmBeatmapDifficulty(), metadata)
                    {
                        DifficultyName = "Easy",
                    },
                    new RealmBeatmap(ruleset, new RealmBeatmapDifficulty(), metadata)
                    {
                        DifficultyName = "Normal",
                    },
                    new RealmBeatmap(ruleset, new RealmBeatmapDifficulty(), metadata)
                    {
                        DifficultyName = "Hard",
                    },
                    new RealmBeatmap(ruleset, new RealmBeatmapDifficulty(), metadata)
                    {
                        DifficultyName = "Insane",
                    }
                },
                Files =
                {
                    new RealmNamedFileUsage(createRealmFile(), "test [easy].osu"),
                    new RealmNamedFileUsage(createRealmFile(), "test [normal].osu"),
                    new RealmNamedFileUsage(createRealmFile(), "test [hard].osu"),
                    new RealmNamedFileUsage(createRealmFile(), "test [insane].osu"),
                }
            };

            for (int i = 0; i < 8; i++)
            {
                beatmapSet.Files.Add(new RealmNamedFileUsage(createRealmFile(), $"hitsound{i}.mp3"));
            }

            foreach (var b in beatmapSet.Beatmaps)
            {
                b.BeatmapSet = beatmapSet;
            }

            return(beatmapSet);
        }
Exemple #2
0
        public void TestImportWithDuplicateBeatmapIDs()
        {
            RunTestWithRealmAsync(async(realmFactory, storage) =>
            {
                using var importer = new BeatmapImporter(realmFactory, storage);
                using var store    = new RealmRulesetStore(realmFactory, storage);

                var metadata = new RealmBeatmapMetadata
                {
                    Artist = "SomeArtist",
                    Author =
                    {
                        Username = "******"
                    }
                };

                var ruleset = realmFactory.Context.All <RealmRuleset>().First();

                var toImport = new RealmBeatmapSet
                {
                    OnlineID = 1,
                    Beatmaps =
                    {
                        new RealmBeatmap(ruleset, new RealmBeatmapDifficulty(), metadata)
                        {
                            OnlineID = 2,
                        },
                        new RealmBeatmap(ruleset, new RealmBeatmapDifficulty(), metadata)
                        {
                            OnlineID = 2,
                            Status   = BeatmapSetOnlineStatus.Loved,
                        }
                    }
                };

                var imported = await importer.Import(toImport);

                Assert.NotNull(imported);
                Debug.Assert(imported != null);

                Assert.AreEqual(-1, imported.PerformRead(s => s.Beatmaps[0].OnlineID));
                Assert.AreEqual(-1, imported.PerformRead(s => s.Beatmaps[1].OnlineID));
            });
        }
Exemple #3
0
        private List <RealmBeatmap> createBeatmapDifficulties(IList <RealmNamedFileUsage> files, Realm realm)
        {
            var beatmaps = new List <RealmBeatmap>();

            foreach (var file in files.Where(f => f.Filename.EndsWith(".osu", StringComparison.OrdinalIgnoreCase)))
            {
                using (var memoryStream = new MemoryStream(Files.Store.Get(file.File.StoragePath))) // 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.BaseDifficulty;

                    var ruleset = realm.All <RealmRuleset>().FirstOrDefault(r => r.OnlineID == decodedInfo.RulesetID);

                    if (ruleset?.Available != true)
                    {
                        Logger.Log($"Skipping import of {file.Filename} due to missing local ruleset {decodedInfo.RulesetID}.", LoggingTarget.Database);
                        continue;
                    }

                    var difficulty = new RealmBeatmapDifficulty
                    {
                        DrainRate         = decodedDifficulty.DrainRate,
                        CircleSize        = decodedDifficulty.CircleSize,
                        OverallDifficulty = decodedDifficulty.OverallDifficulty,
                        ApproachRate      = decodedDifficulty.ApproachRate,
                        SliderMultiplier  = decodedDifficulty.SliderMultiplier,
                        SliderTickRate    = decodedDifficulty.SliderTickRate,
                    };

                    var metadata = new RealmBeatmapMetadata
                    {
                        Title         = decoded.Metadata.Title,
                        TitleUnicode  = decoded.Metadata.TitleUnicode,
                        Artist        = decoded.Metadata.Artist,
                        ArtistUnicode = decoded.Metadata.ArtistUnicode,
                        Author        =
                        {
                            OnlineID = decoded.Metadata.Author.Id,
                            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 RealmBeatmap(ruleset, difficulty, metadata)
                    {
                        Hash                     = hash,
                        DifficultyName           = decodedInfo.Version,
                        OnlineID                 = decodedInfo.OnlineBeatmapID ?? -1,
                        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);
        }