mirror of
https://github.com/osukey/osukey.git
synced 2025-07-01 16:29:58 +09:00
Use new API endpoint to do batch lookups
This commit is contained in:
@ -85,7 +85,7 @@ namespace osu.Game.Database
|
|||||||
// Grab at most 50 unique beatmap IDs from the queue.
|
// Grab at most 50 unique beatmap IDs from the queue.
|
||||||
lock (taskAssignmentLock)
|
lock (taskAssignmentLock)
|
||||||
{
|
{
|
||||||
while (pendingBeatmapTasks.Count > 0 && beatmapTasks.Count < 1)
|
while (pendingBeatmapTasks.Count > 0 && beatmapTasks.Count < 50)
|
||||||
{
|
{
|
||||||
(int id, TaskCompletionSource<APIBeatmap> task) next = pendingBeatmapTasks.Dequeue();
|
(int id, TaskCompletionSource<APIBeatmap> task) next = pendingBeatmapTasks.Dequeue();
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ namespace osu.Game.Database
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Query the beatmaps.
|
// Query the beatmaps.
|
||||||
var request = new GetBeatmapRequest(new APIBeatmap { OnlineID = beatmapTasks.Keys.First() });
|
var request = new GetBeatmapsRequest(beatmapTasks.Keys.ToArray());
|
||||||
|
|
||||||
// rather than queueing, we maintain our own single-threaded request stream.
|
// rather than queueing, we maintain our own single-threaded request stream.
|
||||||
// todo: we probably want retry logic here.
|
// todo: we probably want retry logic here.
|
||||||
@ -117,16 +117,19 @@ namespace osu.Game.Database
|
|||||||
createNewTask();
|
createNewTask();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<APIBeatmap> foundBeatmaps = new List<APIBeatmap> { request.Response };
|
List<APIBeatmap> foundBeatmaps = request.Response?.Beatmaps;
|
||||||
|
|
||||||
foreach (var beatmap in foundBeatmaps)
|
if (foundBeatmaps != null)
|
||||||
{
|
{
|
||||||
if (beatmapTasks.TryGetValue(beatmap.OnlineID, out var tasks))
|
foreach (var beatmap in foundBeatmaps)
|
||||||
{
|
{
|
||||||
foreach (var task in tasks)
|
if (beatmapTasks.TryGetValue(beatmap.OnlineID, out var tasks))
|
||||||
task.SetResult(beatmap);
|
{
|
||||||
|
foreach (var task in tasks)
|
||||||
|
task.SetResult(beatmap);
|
||||||
|
|
||||||
beatmapTasks.Remove(beatmap.OnlineID);
|
beatmapTasks.Remove(beatmap.OnlineID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
24
osu.Game/Online/API/Requests/GetBeatmapsRequest.cs
Normal file
24
osu.Game/Online/API/Requests/GetBeatmapsRequest.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests
|
||||||
|
{
|
||||||
|
public class GetBeatmapsRequest : APIRequest<GetBeatmapsResponse>
|
||||||
|
{
|
||||||
|
private readonly int[] beatmapIds;
|
||||||
|
|
||||||
|
private const int max_ids_per_request = 50;
|
||||||
|
|
||||||
|
public GetBeatmapsRequest(int[] beatmapIds)
|
||||||
|
{
|
||||||
|
if (beatmapIds.Length > max_ids_per_request)
|
||||||
|
throw new ArgumentException($"{nameof(GetBeatmapsRequest)} calls only support up to {max_ids_per_request} IDs at once");
|
||||||
|
|
||||||
|
this.beatmapIds = beatmapIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string Target => "beatmaps/?ids[]=" + string.Join("&ids[]=", beatmapIds);
|
||||||
|
}
|
||||||
|
}
|
15
osu.Game/Online/API/Requests/GetBeatmapsResponse.cs
Normal file
15
osu.Game/Online/API/Requests/GetBeatmapsResponse.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests
|
||||||
|
{
|
||||||
|
public class GetBeatmapsResponse : ResponseWithCursor
|
||||||
|
{
|
||||||
|
[JsonProperty("beatmaps")]
|
||||||
|
public List<APIBeatmap> Beatmaps;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user