diff --git a/MultiplayerCore/Beatmaps/BeatSaverPreviewMediaData.cs b/MultiplayerCore/Beatmaps/BeatSaverPreviewMediaData.cs index 2535724..4ff4aa8 100644 --- a/MultiplayerCore/Beatmaps/BeatSaverPreviewMediaData.cs +++ b/MultiplayerCore/Beatmaps/BeatSaverPreviewMediaData.cs @@ -29,14 +29,14 @@ public BeatSaverPreviewMediaData(BeatSaver beatsaver, string levelHash) return _beatmap; } - public async Task GetCoverSpriteAsync(CancellationToken cancellationToken) + public async Task GetCoverSpriteAsync() { if (CoverImagesprite != null) return CoverImagesprite; var bm = await GetBeatsaverBeatmap(); if (bm == null) return null!; - byte[]? coverBytes = await bm.LatestVersion.DownloadCoverImage(cancellationToken); + byte[]? coverBytes = await bm.LatestVersion.DownloadCoverImage(); if (coverBytes == null || coverBytes.Length == 0) return null!; Texture2D texture = new Texture2D(2, 2); @@ -45,7 +45,15 @@ public async Task GetCoverSpriteAsync(CancellationToken cancellationToke return CoverImagesprite; } - public Task GetPreviewAudioClip(CancellationToken cancellationToken) + public void UnloadCoverSprite() + { + if (CoverImagesprite == null) return; + Object.Destroy(CoverImagesprite.texture); + Object.Destroy(CoverImagesprite); + CoverImagesprite = null; + } + + public Task GetPreviewAudioClip() { // TODO: something with preview url //var bm = await GetBeatsaverBeatmap(); diff --git a/MultiplayerCore/Beatmaps/LocalBeatmapLevel.cs b/MultiplayerCore/Beatmaps/LocalBeatmapLevel.cs index fe0790d..216d147 100644 --- a/MultiplayerCore/Beatmaps/LocalBeatmapLevel.cs +++ b/MultiplayerCore/Beatmaps/LocalBeatmapLevel.cs @@ -71,6 +71,6 @@ public LocalBeatmapLevel(string hash, BeatmapLevel localBeatmapLevel) } public override Task TryGetCoverSpriteAsync(CancellationToken cancellationToken) - => _localBeatmapLevel.previewMediaData.GetCoverSpriteAsync(cancellationToken); + => _localBeatmapLevel.previewMediaData.GetCoverSpriteAsync(); } } diff --git a/MultiplayerCore/Beatmaps/Providers/MpBeatmapLevelProvider.cs b/MultiplayerCore/Beatmaps/Providers/MpBeatmapLevelProvider.cs index fff0e76..50afce6 100644 --- a/MultiplayerCore/Beatmaps/Providers/MpBeatmapLevelProvider.cs +++ b/MultiplayerCore/Beatmaps/Providers/MpBeatmapLevelProvider.cs @@ -1,10 +1,10 @@ -using System.Collections.Generic; -using System.Diagnostics.Tracing; +using System.Collections.Concurrent; +using System.Collections.Generic; using System.Threading.Tasks; -using System.Windows.Forms; using BeatSaverSharp; using MultiplayerCore.Beatmaps.Abstractions; using MultiplayerCore.Beatmaps.Packets; +using SiraUtil.Logging; using SiraUtil.Zenject; namespace MultiplayerCore.Beatmaps.Providers @@ -12,13 +12,16 @@ namespace MultiplayerCore.Beatmaps.Providers public class MpBeatmapLevelProvider { private readonly BeatSaver _beatsaver; + private readonly SiraLog _logger; private readonly Dictionary _hashToNetworkMaps = new(); - private readonly Dictionary _hashToBeatsaverMaps = new(); + private readonly ConcurrentDictionary> _hashToBeatsaverMaps = new(); internal MpBeatmapLevelProvider( - UBinder beatsaver) + UBinder beatsaver, + SiraLog logger) { _beatsaver = beatsaver.Value; + _logger = logger; } /// @@ -44,23 +47,33 @@ internal MpBeatmapLevelProvider( return new LocalBeatmapLevel(levelHash, localBeatmapLevel); } - /// - /// Gets an for the specified level hash from BeatSaver. - /// - /// The hash of the level to get - /// An with a matching level hash, or null if none was found. - public async Task GetBeatmapFromBeatSaver(string levelHash) + /// + /// Gets an for the specified level hash from BeatSaver. + /// + /// The hash of the level to get + /// An with a matching level hash, or null if none was found. + public async Task GetBeatmapFromBeatSaver(string levelHash) { - if (_hashToBeatsaverMaps.TryGetValue(levelHash, out var map)) return map; - var beatmap = await _beatsaver.BeatmapByHash(levelHash); - if (beatmap != null) + if (!_hashToBeatsaverMaps.TryGetValue(levelHash, out var map)) { - map = new BeatSaverBeatmapLevel(levelHash, beatmap); - _hashToBeatsaverMaps.Add(levelHash, map); - return map; - } + map = Task.Run(async () => + { + var beatmap = await _beatsaver.BeatmapByHash(levelHash); + if (beatmap != null) + { + MpBeatmap bmap = new BeatSaverBeatmapLevel(levelHash, beatmap); + return bmap; + } + + return null; + }); + + _hashToBeatsaverMaps[levelHash] = map; + } - return null; + var bmap = await map; + if (bmap == null) _hashToBeatsaverMaps.TryRemove(levelHash, out _); // Ensure we remove null bmaps + return bmap; } public BeatSaverPreviewMediaData MakeBeatSaverPreviewMediaData(string levelHash) => new BeatSaverPreviewMediaData(_beatsaver, levelHash); diff --git a/MultiplayerCore/MultiplayerCore.csproj b/MultiplayerCore/MultiplayerCore.csproj index abdf745..633a5da 100644 --- a/MultiplayerCore/MultiplayerCore.csproj +++ b/MultiplayerCore/MultiplayerCore.csproj @@ -4,7 +4,7 @@ Library Properties MultiplayerCore - 1.5.2 + 1.5.3 net472 true portable @@ -134,6 +134,11 @@ False False + + $(BeatSaberDir)\Beat Saber_Data\Managed\Networking.NetworkPlayerEntitlementsChecker.dll + False + False + $(BeatSaberDir)\Beat Saber_Data\Managed\SegmentedControl.dll False diff --git a/MultiplayerCore/manifest.json b/MultiplayerCore/manifest.json index 6528153..d2fd3f7 100644 --- a/MultiplayerCore/manifest.json +++ b/MultiplayerCore/manifest.json @@ -3,12 +3,12 @@ "id": "MultiplayerCore", "name": "MultiplayerCore", "author": "Goobwabber", - "version": "1.5.2", + "version": "1.5.3", "description": "Adds custom songs to Beat Saber Multiplayer.", - "gameVersion": "1.37.5", + "gameVersion": "1.38.0", "dependsOn": { "BSIPA": "^4.3.3", - "SongCore": "^3.13.0", + "SongCore": "^3.14.0", "BeatSaverSharp": "^3.4.5", "SiraUtil": "^3.1.12", "BeatSaberMarkupLanguage": "^1.12.0",