public static BeatmapLevelPackObject CreatePlaylist(OpContext context, BeatSaberPlaylist playlist, AssetsFile songsAssetFile) { Log.LogMsg($"Playlist {playlist.PlaylistID} will be created"); var levelPack = new BeatmapLevelPackObject(songsAssetFile) { Enabled = 1, GameObject = null, IsPackAlwaysOwned = true, PackID = playlist.PlaylistID, Name = playlist.PlaylistID + BSConst.NameSuffixes.LevelPack, PackName = playlist.PlaylistName }; songsAssetFile.AddObject(levelPack, true); var col = new BeatmapLevelCollectionObject(songsAssetFile) { Name = playlist.PlaylistID + BSConst.NameSuffixes.LevelCollection }; songsAssetFile.AddObject(col, true); levelPack.BeatmapLevelCollection = col.PtrFrom(levelPack); playlist.LevelPackObject = levelPack; var mainCol = context.Engine.GetMainLevelPack(); var aoPacks = context.Engine.GetAlwaysOwnedModel(); mainCol.BeatmapLevelPacks.Add(levelPack.PtrFrom(mainCol)); aoPacks.AlwaysOwnedPacks.Add(levelPack.PtrFrom(aoPacks)); context.Cache.PlaylistCache.Add(playlist.PlaylistID, new PlaylistAndSongs() { Playlist = levelPack, Order = context.Cache.PlaylistCache.Count }); UpdateCoverImage(playlist, context, songsAssetFile); return(levelPack); }
internal override void PerformOp(OpContext context) { if (string.IsNullOrEmpty(Playlist.PlaylistID)) { throw new Exception("PlaylistID must be provided."); } if (string.IsNullOrEmpty(Playlist.PlaylistName)) { throw new Exception($"PlaylistName must be provided for ID {Playlist.PlaylistName}"); } var songsAssetFile = context.Engine.GetSongsAssetsFile(); BeatmapLevelPackObject levelPack = null; if (context.Cache.PlaylistCache.ContainsKey(Playlist.PlaylistID)) { Log.LogMsg($"Playlist {Playlist.PlaylistID} will be updated"); levelPack = context.Cache.PlaylistCache[Playlist.PlaylistID].Playlist; levelPack.PackName = Playlist.PlaylistName; Playlist.LevelPackObject = levelPack; OpCommon.UpdateCoverImage(Playlist, context, songsAssetFile); } else { levelPack = OpCommon.CreatePlaylist(context, Playlist, songsAssetFile); } }
private void RemoveLevelPackAssets(AssetsManager manager, BeatmapLevelPackObject levelPack) { var songsAssetFile = manager.GetAssetsFile(BSConst.KnownFiles.SongsAssetsFilename); Log.LogMsg($"Removing assets for playlist ID '{ levelPack.PackID}'"); var collection = levelPack.BeatmapLevelCollection.Object; var sprite = levelPack.CoverImage.Object; var texture = sprite.Texture.Object; songsAssetFile.DeleteObject(levelPack); songsAssetFile.DeleteObject(collection); songsAssetFile.DeleteObject(texture); songsAssetFile.DeleteObject(sprite); }
private void RemoveLevelPackAssets(BeatmapLevelPackObject levelPack) { var songsAssetFile = GetSongsAssetsFile(); Log.LogMsg($"Removing assets for playlist ID '{ levelPack.PackID}'"); var collection = levelPack.BeatmapLevelCollection.Object; var sprite = levelPack.CoverImage.Object; var texture = sprite.Texture.Object; songsAssetFile.DeleteObject(levelPack); songsAssetFile.DeleteObject(collection); songsAssetFile.DeleteObject(texture); songsAssetFile.DeleteObject(sprite); }
private void UpdatePlaylistConfig(AssetsManager manager, BeatSaberPlaylist playlist) { Log.LogMsg($"Processing playlist ID {playlist.PlaylistID}..."); var songsAssetFile = manager.GetAssetsFile(BSConst.KnownFiles.SongsAssetsFilename); CustomLevelLoader loader = new CustomLevelLoader(songsAssetFile); BeatmapLevelPackObject levelPack = songsAssetFile.FindAsset <BeatmapLevelPackObject>(x => x.Object.PackID == playlist.PlaylistID)?.Object; //create a new level pack if one waasn't found if (levelPack == null) { Log.LogMsg($"Level pack for playlist '{playlist.PlaylistID}' was not found and will be created"); levelPack = new BeatmapLevelPackObject(songsAssetFile) { Enabled = 1, GameObject = null, IsPackAlwaysOwned = true, PackID = playlist.PlaylistID, Name = playlist.PlaylistID + BSConst.NameSuffixes.LevelPack, PackName = playlist.PlaylistName }; songsAssetFile.AddObject(levelPack, true); var col = new BeatmapLevelCollectionObject(songsAssetFile) { Name = playlist.PlaylistID + BSConst.NameSuffixes.LevelCollection }; songsAssetFile.AddObject(col, true); levelPack.BeatmapLevelCollection = col.PtrFrom(levelPack); } playlist.LevelPackObject = levelPack; levelPack.PackName = playlist.PlaylistName ?? levelPack.PackName; if (playlist.CoverArt != null) { Log.LogMsg($"Loading cover art for playlist ID '{playlist.PlaylistID}'"); playlist.CoverArtSprite = loader.LoadPackCover(playlist.PlaylistID, playlist.CoverArt); playlist.LevelPackObject.CoverImage = playlist.CoverArtSprite.PtrFrom(playlist.LevelPackObject); } else { if (playlist.LevelPackObject.CoverImage != null) { playlist.CoverArtSprite = playlist.LevelPackObject.CoverImage.Object; } else { playlist.CoverArtSprite = loader.LoadPackCover(playlist.PlaylistID, null); } playlist.LevelPackObject.CoverImage = playlist.CoverArtSprite.PtrFrom(playlist.LevelPackObject); } //clear out any levels, we'll add them back var levelCollection = levelPack.BeatmapLevelCollection.Object; levelCollection.BeatmapLevels.ForEach(x => x.Dispose()); levelCollection.BeatmapLevels.Clear(); int songCount = 0; Log.LogMsg($"Processing songs for playlist ID {playlist.PlaylistID}..."); var totalSongs = playlist.SongList.Count(); var songMod = Math.Ceiling((double)totalSongs / (double)10); if (songMod < 1) { songMod = 1; } foreach (var song in playlist.SongList.ToList()) { songCount++; if (songCount % songMod == 0) { Console.WriteLine($"{songCount.ToString().PadLeft(5)} of {totalSongs}..."); } if (UpdateSongConfig(manager, song, loader)) { if (levelCollection.BeatmapLevels.Any(x => x.Object.LevelID == song.LevelData.LevelID)) { Log.LogErr($"Playlist ID '{playlist.PlaylistID}' already contains song ID '{song.SongID}' once, removing the second link"); } else { levelCollection.BeatmapLevels.Add(song.LevelData.PtrFrom(levelCollection)); continue; } } playlist.SongList.Remove(song); } Console.WriteLine($"Proccessed {totalSongs} for playlist ID {playlist.PlaylistID}"); }