diff --git a/osu.Game/Beatmaps/BeatmapUpdater.cs b/osu.Game/Beatmaps/BeatmapUpdater.cs
index a86aab4ac1..d7b1fac7b3 100644
--- a/osu.Game/Beatmaps/BeatmapUpdater.cs
+++ b/osu.Game/Beatmaps/BeatmapUpdater.cs
@@ -41,21 +41,25 @@ namespace osu.Game.Beatmaps
///
/// Queue a beatmap for background processing.
///
- public void Queue(Live beatmap, bool forceOnlineFetch = false)
+ /// The managed beatmap set to update. A transaction will be opened to apply changes.
+ /// Whether metadata from an online source should be preferred. If true, the local cache will be skipped to ensure the freshest data state possible.
+ public void Queue(Live beatmapSet, bool preferOnlineFetch = false)
{
- Logger.Log($"Queueing change for local beatmap {beatmap}");
- Task.Factory.StartNew(() => beatmap.PerformRead(b => Process(b, forceOnlineFetch)), default, TaskCreationOptions.HideScheduler | TaskCreationOptions.RunContinuationsAsynchronously, updateScheduler);
+ Logger.Log($"Queueing change for local beatmap {beatmapSet}");
+ Task.Factory.StartNew(() => beatmapSet.PerformRead(b => Process(b, preferOnlineFetch)), default, TaskCreationOptions.HideScheduler | TaskCreationOptions.RunContinuationsAsynchronously, updateScheduler);
}
///
/// Run all processing on a beatmap immediately.
///
- public void Process(BeatmapSetInfo beatmapSet, bool forceOnlineFetch = false) => beatmapSet.Realm.Write(r =>
+ /// The managed beatmap set to update. A transaction will be opened to apply changes.
+ /// Whether metadata from an online source should be preferred. If true, the local cache will be skipped to ensure the freshest data state possible.
+ public void Process(BeatmapSetInfo beatmapSet, bool preferOnlineFetch = false) => beatmapSet.Realm.Write(r =>
{
// Before we use below, we want to invalidate.
workingBeatmapCache.Invalidate(beatmapSet);
- metadataLookup.Update(beatmapSet, forceOnlineFetch);
+ metadataLookup.Update(beatmapSet, preferOnlineFetch);
foreach (var beatmap in beatmapSet.Beatmaps)
{
diff --git a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs
index c7c8f0ceb0..02fb69b8f5 100644
--- a/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs
+++ b/osu.Game/Beatmaps/BeatmapUpdaterMetadataLookup.cs
@@ -48,18 +48,27 @@ namespace osu.Game.Beatmaps
prepareLocalCache();
}
- public void Update(BeatmapSetInfo beatmapSet, bool forceOnlineFetch)
+ ///
+ /// Queue an update for a beatmap set.
+ ///
+ /// The beatmap set to update. Updates will be applied directly (so a transaction should be started if this instance is managed).
+ /// Whether metadata from an online source should be preferred. If true, the local cache will be skipped to ensure the freshest data state possible.
+ public void Update(BeatmapSetInfo beatmapSet, bool preferOnlineFetch)
{
foreach (var b in beatmapSet.Beatmaps)
- lookup(beatmapSet, b, forceOnlineFetch);
+ lookup(beatmapSet, b, preferOnlineFetch);
}
- private void lookup(BeatmapSetInfo set, BeatmapInfo beatmapInfo, bool forceOnlineFetch)
+ private void lookup(BeatmapSetInfo set, BeatmapInfo beatmapInfo, bool preferOnlineFetch)
{
- if (!forceOnlineFetch && checkLocalCache(set, beatmapInfo))
+ bool apiAvailable = api?.State.Value == APIState.Online;
+
+ bool useLocalCache = !apiAvailable || !preferOnlineFetch;
+
+ if (useLocalCache && checkLocalCache(set, beatmapInfo))
return;
- if (api?.State.Value != APIState.Online)
+ if (!apiAvailable)
return;
var req = new GetBeatmapRequest(beatmapInfo);
diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs
index 6514fc6aee..41eeece76d 100644
--- a/osu.Game/OsuGameBase.cs
+++ b/osu.Game/OsuGameBase.cs
@@ -287,7 +287,7 @@ namespace osu.Game
AddInternal(new BeatmapOnlineChangeIngest(beatmapUpdater, realm, metadataClient));
- BeatmapManager.ProcessBeatmap = (set, isBatch) => beatmapUpdater.Process(set, forceOnlineFetch: !isBatch);
+ BeatmapManager.ProcessBeatmap = (set, isBatch) => beatmapUpdater.Process(set, preferOnlineFetch: !isBatch);
dependencies.Cache(userCache = new UserLookupCache());
AddInternal(userCache);