diff --git a/osu.Game/Beatmaps/BeatmapManager.cs b/osu.Game/Beatmaps/BeatmapManager.cs
index b6fe7f88fa..c4975501ed 100644
--- a/osu.Game/Beatmaps/BeatmapManager.cs
+++ b/osu.Game/Beatmaps/BeatmapManager.cs
@@ -27,7 +27,7 @@ namespace osu.Game.Beatmaps
///
/// Handles the storage and retrieval of Beatmaps/WorkingBeatmaps.
///
- public partial class BeatmapManager : ArchiveModelManager
+ public partial class BeatmapManager : ArchiveDownloadModelManager
{
///
/// Fired when a single difficulty has been hidden.
@@ -39,16 +39,6 @@ namespace osu.Game.Beatmaps
///
public event Action BeatmapRestored;
- ///
- /// Fired when a beatmap download begins.
- ///
- public event Action BeatmapDownloadBegan;
-
- ///
- /// Fired when a beatmap download is interrupted, due to user cancellation or other failures.
- ///
- public event Action BeatmapDownloadFailed;
-
///
/// A default representation of a WorkingBeatmap to use when no beatmap is available.
///
@@ -74,7 +64,7 @@ namespace osu.Game.Beatmaps
public BeatmapManager(Storage storage, IDatabaseContextFactory contextFactory, RulesetStore rulesets, IAPIProvider api, AudioManager audioManager, GameHost host = null,
WorkingBeatmap defaultBeatmap = null)
- : base(storage, contextFactory, new BeatmapStore(contextFactory), host)
+ : base(storage, contextFactory, api, new BeatmapStore(contextFactory), host)
{
this.rulesets = rulesets;
this.api = api;
@@ -88,6 +78,8 @@ namespace osu.Game.Beatmaps
beatmaps.BeatmapRestored += b => BeatmapRestored?.Invoke(b);
}
+ protected override DownloadBeatmapSetRequest CreateDownloadRequest(BeatmapSetInfo set) => new DownloadBeatmapSetRequest(set, false);
+
protected override void Populate(BeatmapSetInfo beatmapSet, ArchiveReader archive)
{
if (archive != null)
@@ -153,87 +145,6 @@ namespace osu.Game.Beatmaps
void resetIds() => beatmapSet.Beatmaps.ForEach(b => b.OnlineBeatmapID = null);
}
- ///
- /// Downloads a beatmap.
- /// This will post notifications tracking progress.
- ///
- /// The to be downloaded.
- /// Whether the beatmap should be downloaded without video. Defaults to false.
- /// Downloading can happen
- public bool Download(BeatmapSetInfo beatmapSetInfo, bool noVideo = false)
- {
- var existing = GetExistingDownload(beatmapSetInfo);
-
- if (existing != null || api == null) return false;
-
- var downloadNotification = new DownloadNotification
- {
- Text = $"Downloading {beatmapSetInfo}",
- };
-
- var request = new DownloadBeatmapSetRequest(beatmapSetInfo, noVideo);
-
- request.DownloadProgressed += progress =>
- {
- downloadNotification.State = ProgressNotificationState.Active;
- downloadNotification.Progress = progress;
- };
-
- request.Success += filename =>
- {
- Task.Factory.StartNew(() =>
- {
- // This gets scheduled back to the update thread, but we want the import to run in the background.
- Import(downloadNotification, filename);
- currentDownloads.Remove(request);
- }, TaskCreationOptions.LongRunning);
- };
-
- request.Failure += error =>
- {
- BeatmapDownloadFailed?.Invoke(request);
-
- if (error is OperationCanceledException) return;
-
- downloadNotification.State = ProgressNotificationState.Cancelled;
- Logger.Error(error, "Beatmap download failed!");
- currentDownloads.Remove(request);
- };
-
- downloadNotification.CancelRequested += () =>
- {
- request.Cancel();
- currentDownloads.Remove(request);
- downloadNotification.State = ProgressNotificationState.Cancelled;
- return true;
- };
-
- currentDownloads.Add(request);
- PostNotification?.Invoke(downloadNotification);
-
- // don't run in the main api queue as this is a long-running task.
- Task.Factory.StartNew(() =>
- {
- try
- {
- request.Perform(api);
- }
- catch
- {
- // no need to handle here as exceptions will filter down to request.Failure above.
- }
- }, TaskCreationOptions.LongRunning);
- BeatmapDownloadBegan?.Invoke(request);
- return true;
- }
-
- ///
- /// Get an existing download request if it exists.
- ///
- /// The whose download request is wanted.
- /// The object if it exists, or null.
- public DownloadBeatmapSetRequest GetExistingDownload(BeatmapSetInfo beatmap) => currentDownloads.Find(d => d.BeatmapSet.OnlineBeatmapSetID == beatmap.OnlineBeatmapSetID);
-
///
/// Delete a beatmap difficulty.
///
@@ -439,21 +350,5 @@ namespace osu.Game.Beatmaps
protected override Texture GetBackground() => null;
protected override Track GetTrack() => null;
}
-
- private class DownloadNotification : ProgressNotification
- {
- public override bool IsImportant => false;
-
- protected override Notification CreateCompletionNotification() => new SilencedProgressCompletionNotification
- {
- Activated = CompletionClickAction,
- Text = CompletionText
- };
-
- private class SilencedProgressCompletionNotification : ProgressCompletionNotification
- {
- public override bool IsImportant => false;
- }
- }
}
}
diff --git a/osu.Game/Database/ArchiveDownloadModelManager.cs b/osu.Game/Database/ArchiveDownloadModelManager.cs
index 8c7a0fba87..6580da0d54 100644
--- a/osu.Game/Database/ArchiveDownloadModelManager.cs
+++ b/osu.Game/Database/ArchiveDownloadModelManager.cs
@@ -31,17 +31,26 @@ namespace osu.Game.Database
public bool Download(TModel model)
{
- var existing = GetExistingDownload(model);
-
- if (existing != null || api == null) return false;
-
- DownloadNotification notification = new DownloadNotification
- {
- Text = $"Downloading {model}",
- };
+ if (!canDownload(model)) return false;
var request = CreateDownloadRequest(model);
+ performDownloadWithRequest(request);
+
+ return true;
+ }
+
+ public TDownloadRequestModel GetExistingDownload(TModel model) => currentDownloads.Find(r => r.Info.Equals(model));
+
+ private bool canDownload(TModel model) => GetExistingDownload(model) == null && api != null;
+
+ private void performDownloadWithRequest(TDownloadRequestModel request)
+ {
+ DownloadNotification notification = new DownloadNotification
+ {
+ Text = $"Downloading {request.Info}",
+ };
+
request.DownloadProgressed += progress =>
{
notification.State = ProgressNotificationState.Active;
@@ -92,12 +101,8 @@ namespace osu.Game.Database
}, TaskCreationOptions.LongRunning);
DownloadBegan?.Invoke(request);
-
- return true;
}
- public TDownloadRequestModel GetExistingDownload(TModel model) => currentDownloads.Find(r => r.Info.Equals(model));
-
private class DownloadNotification : ProgressNotification
{
public override bool IsImportant => false;
diff --git a/osu.Game/Online/API/ArchiveDownloadModelRequest.cs b/osu.Game/Online/API/ArchiveDownloadModelRequest.cs
index 377166e657..862d017228 100644
--- a/osu.Game/Online/API/ArchiveDownloadModelRequest.cs
+++ b/osu.Game/Online/API/ArchiveDownloadModelRequest.cs
@@ -1,6 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Text;
namespace osu.Game.Online.API
{
diff --git a/osu.Game/Online/API/Requests/DownloadBeatmapSetRequest.cs b/osu.Game/Online/API/Requests/DownloadBeatmapSetRequest.cs
index 26e8acc2fc..7d0a8f9f46 100644
--- a/osu.Game/Online/API/Requests/DownloadBeatmapSetRequest.cs
+++ b/osu.Game/Online/API/Requests/DownloadBeatmapSetRequest.cs
@@ -2,26 +2,20 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Game.Beatmaps;
-using System;
namespace osu.Game.Online.API.Requests
{
- public class DownloadBeatmapSetRequest : APIDownloadRequest
+ public class DownloadBeatmapSetRequest : ArchiveDownloadModelRequest
{
public readonly BeatmapSetInfo BeatmapSet;
- public float Progress;
-
- public event Action DownloadProgressed;
-
private readonly bool noVideo;
public DownloadBeatmapSetRequest(BeatmapSetInfo set, bool noVideo)
+ : base(set)
{
this.noVideo = noVideo;
BeatmapSet = set;
-
- Progressed += (current, total) => DownloadProgressed?.Invoke(Progress = (float)current / total);
}
protected override string Target => $@"beatmapsets/{BeatmapSet.OnlineBeatmapSetID}/download{(noVideo ? "?noVideo=1" : "")}";
diff --git a/osu.Game/Overlays/Direct/DownloadTrackingComposite.cs b/osu.Game/Overlays/Direct/DownloadTrackingComposite.cs
index 37f13aefc8..9beedb195f 100644
--- a/osu.Game/Overlays/Direct/DownloadTrackingComposite.cs
+++ b/osu.Game/Overlays/Direct/DownloadTrackingComposite.cs
@@ -47,7 +47,7 @@ namespace osu.Game.Overlays.Direct
attachDownload(beatmaps.GetExistingDownload(setInfo.NewValue));
}, true);
- beatmaps.BeatmapDownloadBegan += download =>
+ beatmaps.DownloadBegan += download =>
{
if (download.BeatmapSet.OnlineBeatmapSetID == BeatmapSet.Value?.OnlineBeatmapSetID)
attachDownload(download);
@@ -65,7 +65,7 @@ namespace osu.Game.Overlays.Direct
if (beatmaps != null)
{
- beatmaps.BeatmapDownloadBegan -= attachDownload;
+ beatmaps.DownloadBegan -= attachDownload;
beatmaps.ItemAdded -= setAdded;
}