diff --git a/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs b/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs index 34eedfb474..e15de7ec02 100644 --- a/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs +++ b/osu.Game/Beatmaps/APIBeatmapMetadataSource.cs @@ -63,7 +63,9 @@ namespace osu.Game.Beatmaps DateRanked = res.BeatmapSet?.Ranked, DateSubmitted = res.BeatmapSet?.Submitted, MD5Hash = res.MD5Hash, - LastUpdated = res.LastUpdated + LastUpdated = res.LastUpdated, + // Tags are not populated because the response does not contain tag data. + // TODO: consider web change to include the tag data? or a second web request for the set to retrieve tags? }; return true; } diff --git a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs index 364a0f9b4b..7547abdf28 100644 --- a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs +++ b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using osu.Framework.Platform; +using osu.Game.Extensions; using osu.Game.Online.API; namespace osu.Game.Beatmaps @@ -76,6 +77,7 @@ namespace osu.Game.Beatmaps { beatmapInfo.Status = res.BeatmapStatus; beatmapInfo.Metadata.Author.OnlineID = res.AuthorID; + beatmapInfo.Metadata.UserTags.AddRange(res.UserTags); } } diff --git a/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs b/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs index d876ba55b2..d9c96403ba 100644 --- a/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs +++ b/osu.Game/Beatmaps/LocalCachedBeatmapMetadataSource.cs @@ -105,7 +105,11 @@ namespace osu.Game.Beatmaps switch (getCacheVersion(db)) { case 2: + // can be removed 20260123 return queryCacheVersion2(db, beatmapInfo, out onlineMetadata); + + case 3: + return queryCacheVersion3(db, beatmapInfo, out onlineMetadata); } } @@ -311,6 +315,63 @@ namespace osu.Game.Beatmaps return false; } + private bool queryCacheVersion3(SqliteConnection db, BeatmapInfo beatmapInfo, out OnlineBeatmapMetadata? onlineMetadata) + { + Debug.Assert(beatmapInfo.BeatmapSet != null); + + using (var cmd = db.CreateCommand()) + { + cmd.CommandText = + """ + SELECT `b`.`beatmapset_id`, `b`.`beatmap_id`, `b`.`approved`, `b`.`user_id`, `b`.`checksum`, `b`.`last_update`, `s`.`submit_date`, `s`.`approved_date` + FROM `osu_beatmaps` AS `b` + JOIN `osu_beatmapsets` AS `s` ON `s`.`beatmapset_id` = `b`.`beatmapset_id` + WHERE (`b`.`checksum` = @MD5Hash OR `b`.`filename` = @Path) + """; + + cmd.Parameters.Add(new SqliteParameter(@"@MD5Hash", beatmapInfo.MD5Hash)); + cmd.Parameters.Add(new SqliteParameter(@"@Path", beatmapInfo.Path)); + + using (var reader = cmd.ExecuteReader()) + { + if (!reader.Read()) + { + onlineMetadata = null; + return false; + } + + logForModel(beatmapInfo.BeatmapSet, $@"Cached local retrieval for {beatmapInfo} (cache version 3)."); + + onlineMetadata = new OnlineBeatmapMetadata + { + BeatmapSetID = reader.GetInt32(0), + BeatmapID = reader.GetInt32(1), + BeatmapStatus = (BeatmapOnlineStatus)reader.GetByte(2), + BeatmapSetStatus = (BeatmapOnlineStatus)reader.GetByte(2), + AuthorID = reader.GetInt32(3), + MD5Hash = reader.GetString(4), + LastUpdated = reader.GetDateTimeOffset(5), + DateSubmitted = reader.GetDateTimeOffset(6), + DateRanked = reader.GetDateTimeOffset(7), + }; + } + } + + using (var tagsCommand = db.CreateCommand()) + { + tagsCommand.CommandText = "SELECT `name` FROM `tags` WHERE `id` IN (SELECT `tag_id` FROM `beatmap_tags` WHERE `beatmap_id` = @BeatmapID)"; + tagsCommand.Parameters.Add(new SqliteParameter(@"@BeatmapID", onlineMetadata.BeatmapID)); + + using (var tagsReader = tagsCommand.ExecuteReader()) + { + while (tagsReader.Read()) + onlineMetadata.UserTags.Add(tagsReader.GetString(0)); + } + } + + return true; + } + private static void log(string message) => Logger.Log($@"[{nameof(LocalCachedBeatmapMetadataSource)}] {message}", LoggingTarget.Database); diff --git a/osu.Game/Beatmaps/OnlineBeatmapMetadata.cs b/osu.Game/Beatmaps/OnlineBeatmapMetadata.cs index 8640883ca1..2acadde352 100644 --- a/osu.Game/Beatmaps/OnlineBeatmapMetadata.cs +++ b/osu.Game/Beatmaps/OnlineBeatmapMetadata.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Collections.Generic; namespace osu.Game.Beatmaps { @@ -57,5 +58,10 @@ namespace osu.Game.Beatmaps /// The date when this metadata was last updated. /// public DateTimeOffset LastUpdated { get; init; } + + /// + /// The list of tags that users have assigned to this beatmap. + /// + public List UserTags { get; } = []; } }