private void SetupPlaylistsWithSongs(int playlistCount, int songCount) { BeatSaberQuestomConfig config = null; QuestomAssetsEngine qae = new QuestomAssetsEngine(_apkFile); config = qae.GetCurrentConfig(); for (int p = 0; p < playlistCount; p++) { var playlist = new BeatSaberPlaylist() { PlaylistID = string.Format(PlaylistIDFormat, p), PlaylistName = string.Format(PlaylistNameFormat, p), CoverArt = new System.Drawing.Bitmap(COVER_ART_FILE) }; for (int i = 0; i < songCount; i++) { var song = new BeatSaberSong() { SongID = string.Format(SongIDFormat, p, i), CustomSongFolder = TEST_SONG_FOLDER }; playlist.SongList.Add(song); } config.Playlists.Add(playlist); } qae.UpdateConfig(config); }
public void DoesNotDuplicateSong() { SetupPlaylistsWithSongs(2, 2); BeatSaberQuestomConfig oldConfig = null; QuestomAssetsEngine qae = new QuestomAssetsEngine(_apkFile); oldConfig = qae.GetCurrentConfig(false); var config = CopyIDs(oldConfig); var song = new BeatSaberSong() { SongID = config.Playlists[0].SongList[0].SongID, CustomSongFolder = TEST_SONG_FOLDER }; oldConfig.Playlists[0].SongList.Add(song); qae.UpdateConfig(config); qae = new QuestomAssetsEngine(_apkFile, true); var testConfig = qae.GetCurrentConfig(false); Assert.AreEqual(2, testConfig.Playlists[0].SongList.Count()); Assert.AreEqual(2, testConfig.Playlists[1].SongList.Count()); Assert.Pass(); }
public void AddsPlaylistWithSong() { SetupPlaylistsWithSongs(1, 1); using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { var newConfig = qae.GetCurrentConfig(); Assert.AreEqual(1, newConfig.Playlists.Count, "Playlist count should be 1!"); var playlist = newConfig.Playlists[0]; Assert.AreEqual(string.Format(PlaylistIDFormat, 0), playlist.PlaylistID); Assert.AreEqual(string.Format(PlaylistNameFormat, 0), playlist.PlaylistName); // Assert.IsNotNull(playlist.CoverArtBytes, "Playlist cover art didn't reload!"); //Assert.AreEqual(1024, playlist.CoverArt.Width, "Playlist cover art is not 1024 width!"); //Assert.AreEqual(1024, playlist.CoverArt.Height, "Playlist cover art is not 1024 height!"); Assert.AreEqual(1, playlist.SongList.Count, "Songs count should be 1!"); var song = playlist.SongList[0]; Assert.AreEqual(string.Format(SongIDFormat, 0, 0), song.SongID); Assert.AreEqual(TestSongName, song.SongName); Assert.AreEqual(TestSongSubName, song.SongSubName); Assert.AreEqual(TestSongAuthorName, song.SongAuthorName); // Assert.IsNotNull(song.CoverArtBytes, "Cover art didn't load!"); //Assert.AreEqual(256, song.CoverArt.Width, "Song cover art is not 256 width!"); //Assert.AreEqual(256, song.CoverArt.Height, "Song cover art is not 256 height!"); } } Assert.Pass(); }
private void SetupPlaylistsWithSongs(int playlistCount, int songCount) { BeatSaberQuestomConfig config = null; using (var apk = new ApkAssetsFileProvider(_apkFile, FileCacheMode.Memory)) { QuestomAssetsEngine qae = new QuestomAssetsEngine(apk, "assets/bin/Data/"); config = qae.GetCurrentConfig(); for (int p = 0; p < playlistCount; p++) { var playlist = new BeatSaberPlaylist() { PlaylistID = string.Format(PlaylistIDFormat, p), PlaylistName = string.Format(PlaylistNameFormat, p), CoverArtBytes = File.ReadAllBytes(COVER_ART_FILE) }; for (int i = 0; i < songCount; i++) { var song = new BeatSaberSong() { SongID = string.Format(SongIDFormat, p, i), CustomSongFolder = TEST_SONG_FOLDER }; playlist.SongList.Add(song); } config.Playlists.Add(playlist); } qae.UpdateConfig(config); } }
public void LoadsConfigImages() { SetupPlaylistsWithSongs(1, 1); BeatSaberQuestomConfig config = null; using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { config = qae.GetCurrentConfig(); Assert.IsNotNull(config, "Didn't load current config"); // Assert.IsNotNull(config.Playlists[0].CoverArtBytes); // Assert.IsNotNull(config.Playlists[0].SongList[0].CoverArtBytes); //todo: //Assert.AreEqual(1024, config.Playlists[0].CoverArt.Width); //Assert.AreEqual(1024, config.Playlists[0].CoverArt.Height); //Assert.AreEqual(256, config.Playlists[0].SongList[0].CoverArt.Width); //Assert.AreEqual(256, config.Playlists[0].SongList[0].CoverArt.Height); } } Assert.Pass(); }
public void AddsPlaylistWithSong() { SetupPlaylistsWithSongs(1, 1); using (var apk = new ApkAssetsFileProvider(_apkFile, FileCacheMode.Memory, false)) { QuestomAssetsEngine qae = new QuestomAssetsEngine(apk, "assets/bin/Data/", false); var newConfig = qae.GetCurrentConfig(false); Assert.AreEqual(1, newConfig.Playlists.Count, "Playlist count should be 1!"); var playlist = newConfig.Playlists[0]; Assert.AreEqual(string.Format(PlaylistIDFormat, 0), playlist.PlaylistID); Assert.AreEqual(string.Format(PlaylistNameFormat, 0), playlist.PlaylistName); Assert.IsNotNull(playlist.CoverArtBytes, "Playlist cover art didn't reload!"); //Assert.AreEqual(1024, playlist.CoverArt.Width, "Playlist cover art is not 1024 width!"); //Assert.AreEqual(1024, playlist.CoverArt.Height, "Playlist cover art is not 1024 height!"); Assert.AreEqual(1, playlist.SongList.Count, "Songs count should be 1!"); var song = playlist.SongList[0]; Assert.AreEqual(string.Format(SongIDFormat, 0, 0), song.SongID); Assert.AreEqual(TestSongName, song.SongName); Assert.AreEqual(TestSongSubName, song.SongSubName); Assert.AreEqual(TestSongAuthorName, song.SongAuthorName); Assert.IsNotNull(song.CoverArtBytes, "Cover art didn't load!"); //Assert.AreEqual(256, song.CoverArt.Width, "Song cover art is not 256 width!"); //Assert.AreEqual(256, song.CoverArt.Height, "Song cover art is not 256 height!"); } Assert.Pass(); }
protected void SetupPlaylistsWithSongs(int playlistCount, int songCount) { BeatSaberQuestomConfig config = null; using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { config = qae.GetCurrentConfig(); for (int p = 0; p < playlistCount; p++) { var playlist = new BeatSaberPlaylist() { PlaylistID = string.Format(PlaylistIDFormat, p), PlaylistName = string.Format(PlaylistNameFormat, p) }; for (int i = 0; i < songCount; i++) { var song = new BeatSaberSong() { SongID = string.Format(SongIDFormat, p, i), CustomSongPath = MakeTestSongDir() }; playlist.SongList.Add(song); } config.Playlists.Add(playlist); } qae.UpdateConfig(config); qae.Save(); } } }
public void DoesNotDuplicateSong() { SetupPlaylistsWithSongs(2, 2); BeatSaberQuestomConfig oldConfig = null; using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { oldConfig = qae.GetCurrentConfig(); var config = CopyIDs(oldConfig); var song = new BeatSaberSong() { SongID = config.Playlists[0].SongList[0].SongID, CustomSongPath = MakeTestSongDir() }; oldConfig.Playlists[0].SongList.Add(song); qae.UpdateConfig(config); } } using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { var testConfig = qae.GetCurrentConfig(); Assert.AreEqual(2, testConfig.Playlists[0].SongList.Count()); Assert.AreEqual(2, testConfig.Playlists[1].SongList.Count()); } } Assert.Pass(); }
public void MovesSongToNewPlaylist() { SetupPlaylistsWithSongs(2, 2); BeatSaberQuestomConfig oldConfig = null; using (var apk = new ApkAssetsFileProvider(_apkFile, FileCacheMode.Memory, false)) { QuestomAssetsEngine qae = new QuestomAssetsEngine(apk, "assets/bin/Data/", false); oldConfig = qae.GetCurrentConfig(false); var config = CopyIDs(oldConfig); var song = config.Playlists[0].SongList[0]; config.Playlists[1].SongList.Add(song); config.Playlists[0].SongList.Remove(song); qae.UpdateConfig(config); } using (var apk = new ApkAssetsFileProvider(_apkFile, FileCacheMode.Memory, true)) { QuestomAssetsEngine qae = new QuestomAssetsEngine(apk, "assets/bin/Data/", true); var testConfig = qae.GetCurrentConfig(false); Assert.AreEqual(2, testConfig.Playlists.Count); Assert.AreEqual(1, testConfig.Playlists[0].SongList.Count()); Assert.AreEqual(3, testConfig.Playlists[1].SongList.Count()); Assert.AreEqual(string.Format(SongIDFormat, 0, 1), testConfig.Playlists[0].SongList[0].SongID); Assert.AreEqual(string.Format(SongIDFormat, 1, 0), testConfig.Playlists[1].SongList[0].SongID); Assert.AreEqual(string.Format(SongIDFormat, 1, 1), testConfig.Playlists[1].SongList[1].SongID); Assert.AreEqual(string.Format(SongIDFormat, 0, 0), testConfig.Playlists[1].SongList[2].SongID); Assert.AreEqual(oldConfig.Playlists[0].PlaylistName, testConfig.Playlists[0].PlaylistName); Assert.AreEqual(oldConfig.Playlists[1].PlaylistName, testConfig.Playlists[1].PlaylistName); } Assert.Pass(); }
public void DoesNotDuplicateSong() { SetupPlaylistsWithSongs(2, 2); BeatSaberQuestomConfig oldConfig = null; using (var apk = new ApkAssetsFileProvider(_apkFile, FileCacheMode.Memory, false)) { QuestomAssetsEngine qae = new QuestomAssetsEngine(apk, "assets/bin/Data/", false); oldConfig = qae.GetCurrentConfig(false); var config = CopyIDs(oldConfig); var song = new BeatSaberSong() { SongID = config.Playlists[0].SongList[0].SongID, CustomSongFolder = TEST_SONG_FOLDER }; oldConfig.Playlists[0].SongList.Add(song); qae.UpdateConfig(config); } using (var apk = new ApkAssetsFileProvider(_apkFile, FileCacheMode.Memory, true)) { QuestomAssetsEngine qae = new QuestomAssetsEngine(apk, "assets/bin/Data/", true); var testConfig = qae.GetCurrentConfig(false); Assert.AreEqual(2, testConfig.Playlists[0].SongList.Count()); Assert.AreEqual(2, testConfig.Playlists[1].SongList.Count()); } Assert.Pass(); }
public void MovesSongToNewPlaylist() { SetupPlaylistsWithSongs(2, 2); BeatSaberQuestomConfig oldConfig = null; QuestomAssetsEngine qae = new QuestomAssetsEngine(_apkFile); oldConfig = qae.GetCurrentConfig(false); var config = CopyIDs(oldConfig); var song = config.Playlists[0].SongList[0]; config.Playlists[1].SongList.Add(song); config.Playlists[0].SongList.Remove(song); qae.UpdateConfig(config); qae = new QuestomAssetsEngine(_apkFile, true); var testConfig = qae.GetCurrentConfig(false); Assert.AreEqual(2, testConfig.Playlists.Count); Assert.AreEqual(1, testConfig.Playlists[0].SongList.Count()); Assert.AreEqual(3, testConfig.Playlists[1].SongList.Count()); Assert.AreEqual(string.Format(SongIDFormat, 0, 1), testConfig.Playlists[0].SongList[0].SongID); Assert.AreEqual(string.Format(SongIDFormat, 1, 0), testConfig.Playlists[1].SongList[0].SongID); Assert.AreEqual(string.Format(SongIDFormat, 1, 1), testConfig.Playlists[1].SongList[1].SongID); Assert.AreEqual(string.Format(SongIDFormat, 0, 0), testConfig.Playlists[1].SongList[2].SongID); Assert.AreEqual(oldConfig.Playlists[0].PlaylistName, testConfig.Playlists[0].PlaylistName); Assert.AreEqual(oldConfig.Playlists[1].PlaylistName, testConfig.Playlists[1].PlaylistName); Assert.Pass(); }
static int OutputConfig(OutputConfig args) { if (!string.IsNullOrWhiteSpace(args.OutputFile) || args.ForceLog) { Log.SetLogSink(new ConsoleSink()); } try { Log.LogMsg($"Opening APK at '{args.ApkFile}'"); QuestomAssetsEngine q = new QuestomAssetsEngine(args.ApkFile, true); Log.LogMsg($"Loading configuration..."); var cfg = q.GetCurrentConfig(args.NoImages); Log.LogMsg($"Configuration loaded"); TextWriter outWriter = null; try { string toPlace = string.IsNullOrWhiteSpace(args.OutputFile) ? "stdout" : args.OutputFile; Log.LogMsg($"Writing configuration to {toPlace}..."); if (string.IsNullOrWhiteSpace(args.OutputFile)) { //write to stdout outWriter = Console.Out; outWriter.WriteLine("/* JSON START */"); } else { //write to file outWriter = new StreamWriter(new FileStream(args.OutputFile, FileMode.Create)); } var ser = new JsonSerializer(); ser.Formatting = Formatting.Indented; ser.Serialize(outWriter, cfg); if (string.IsNullOrWhiteSpace(args.OutputFile)) { outWriter.WriteLine(""); outWriter.WriteLine("/* JSON END */"); } } finally { if (outWriter != null) { outWriter.Dispose(); outWriter = null; } } return(0); } catch (Exception ex) { Log.LogErr("Something went horribly wrong", ex); return(-1); } }
public void ThreadSafeImageReadTest() { SetupPlaylistsWithSongs(5, 5); int tnum = 0; object tlock = new object(); ParameterizedThreadStart pts = new ParameterizedThreadStart((x) => { int mynum; lock (tlock) { mynum = tnum++; } var tqae = x as QuestomAssetsEngine; var tcfg = tqae.GetCurrentConfig(); if (mynum % 4 == 0) { for (int i = 0; i < tcfg.Playlists.Count; i++) { var png = tcfg.Playlists[i].TryGetCoverPngBytes(); } } else if (mynum % 3 == 0) { for (int i = tcfg.Playlists.Count - 1; i >= 0; i--) { var png = tcfg.Playlists[i].TryGetCoverPngBytes(); } } else { for (int i = 0; i < 20; i++) { tcfg = tqae.GetCurrentConfig(); } } }); using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { List <Thread> threads = new List <Thread>(); for (int i = 0; i < 16; i++) { Thread t = new Thread(pts); threads.Add(t); } threads.ForEach(x => x.Start(qae)); while (threads.Any(x => x.ThreadState == ThreadState.Running)) { System.Threading.Thread.Sleep(200); } } } Assert.Pass(); }
private void FullEngineReset() { _currentConfig = null; if (_qae != null) { _qae.Dispose(); _qae = null; } }
public void LoadsConfig() { BeatSaberQuestomConfig config = null; QuestomAssetsEngine qae = new QuestomAssetsEngine(_apkFile, true); config = qae.GetCurrentConfig(false); Assert.IsNotNull(config, "Didn't load current config"); Assert.Pass(); }
public void BasicDeleteSongOpWorks() { SetupPlaylistsWithSongs(5, 5); using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { bool calledStatusChangeStarted = false; bool calledStatusChangeComplete = false; var deleteSongOp = new DeleteSongOp(string.Format(SongIDFormat, 2, 2)); qae.OpManager.OpStatusChanged += (sender, op) => { if (op.Status == OpStatus.Started) { calledStatusChangeStarted = true; } if (op.Status == OpStatus.Complete) { calledStatusChangeComplete = true; } }; qae.OpManager.QueueOp(deleteSongOp); while (qae.OpManager.IsProcessing) { System.Threading.Thread.Sleep(100); } Assert.IsTrue(calledStatusChangeStarted, "Did not get OpStatusChanged event for status Started!"); Assert.IsTrue(calledStatusChangeComplete, "Did not get OpStatusChanged event for status Complete!"); qae.Save(); } using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { var cfg = qae.GetCurrentConfig(); Assert.AreEqual(5, cfg.Playlists.Count, "Playlist count is incorrect after song delete"); Assert.AreEqual(5, cfg.Playlists[0].SongList.Count, "Song came out of the wrong playlist"); Assert.AreEqual(5, cfg.Playlists[1].SongList.Count, "Song came out of the wrong playlist"); Assert.AreEqual(4, cfg.Playlists[2].SongList.Count, "Song did not come out of the right playlist"); Assert.AreEqual(5, cfg.Playlists[3].SongList.Count, "Song came out of the wrong playlist"); Assert.AreEqual(5, cfg.Playlists[4].SongList.Count, "Song came out of the wrong playlist"); var pl = cfg.Playlists[2]; Assert.IsFalse(pl.SongList.Any(x => x.SongID == string.Format(SongIDFormat, 2, 2)), "Expected target song to be deleted."); //todo: more tests on this } Assert.Pass(); } }
public void LoadsConfig() { BeatSaberQuestomConfig config = null; using (var apk = new ApkAssetsFileProvider(_apkFile, FileCacheMode.Memory, true)) { QuestomAssetsEngine qae = new QuestomAssetsEngine(apk, "assets/bin/Data/", true); config = qae.GetCurrentConfig(false); } Assert.IsNotNull(config, "Didn't load current config"); Assert.Pass(); }
public void BasicAddNewSongOpWorks() { SetupPlaylistsWithSongs(1, 1); using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { var song = new BeatSaberSong() { SongID = "TESTSONG2", CustomSongPath = MakeTestSongDir() }; bool calledStatusChangeStarted = false; bool calledStatusChangeComplete = false; var newSongOp = new AddNewSongToPlaylistOp(song, "someplaylist0", false); qae.OpManager.OpStatusChanged += (sender, op) => { if (op.Status == OpStatus.Started) { calledStatusChangeStarted = true; } if (op.Status == OpStatus.Complete) { calledStatusChangeComplete = true; } }; qae.OpManager.QueueOp(newSongOp); while (qae.OpManager.IsProcessing) { System.Threading.Thread.Sleep(100); } //give it an extra bit of time to make sure events get fired System.Threading.Thread.Sleep(200); Assert.IsTrue(calledStatusChangeStarted, "Did not get OpStatusChanged event for status Started!"); Assert.IsTrue(calledStatusChangeComplete, "Did not get OpStatusChanged event for status Complete!"); qae.Save(); } using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { var cfg = qae.GetCurrentConfig(); var song = cfg.Playlists.FirstOrDefault(x => x.PlaylistID == "someplaylist0")?.SongList?.FirstOrDefault(x => x.SongID == "TESTSONG2"); Assert.NotNull(song, "Couldn't find the song the op was supposed to add!"); //todo: more tests on this } Assert.Pass(); } }
public void BasicAddPlaylistOpWorks() { using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { var newPlaylist = new BeatSaberPlaylist() { PlaylistID = "TESTPLAYLIST1", PlaylistName = "Test Playlist 1" }; bool calledStatusChangeStarted = false; bool calledStatusChangeComplete = false; var newSongOp = new AddOrUpdatePlaylistOp(newPlaylist); qae.OpManager.OpStatusChanged += (sender, op) => { if (op.Status == OpStatus.Started) { calledStatusChangeStarted = true; } if (op.Status == OpStatus.Complete) { calledStatusChangeComplete = true; } }; qae.OpManager.QueueOp(newSongOp); while (qae.OpManager.IsProcessing) { System.Threading.Thread.Sleep(100); } Assert.IsTrue(calledStatusChangeStarted, "Did not get OpStatusChanged event for status Started!"); Assert.IsTrue(calledStatusChangeComplete, "Did not get OpStatusChanged event for status Complete!"); qae.Save(); } using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { var cfg = qae.GetCurrentConfig(); var playlist = cfg.Playlists.FirstOrDefault(x => x.PlaylistID == "TESTPLAYLIST1"); Assert.NotNull(playlist, "Couldn't find the song the op was supposed to add!"); Assert.AreEqual("Test Playlist 1", playlist.PlaylistName, "Playlist name was not set correctly!"); //todo: more tests on this } Assert.Pass(); } }
public void LoadsConfig() { BeatSaberQuestomConfig config = null; using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { config = qae.GetCurrentConfig(); } } Assert.IsNotNull(config, "Didn't load current config"); Assert.Pass(); }
public void LoadsConfigImages() { SetupPlaylistsWithSongs(1, 1); BeatSaberQuestomConfig config = null; QuestomAssetsEngine qae = new QuestomAssetsEngine(_apkFile, true); config = qae.GetCurrentConfig(); Assert.IsNotNull(config, "Didn't load current config"); Assert.IsNotNull(config.Playlists[0].CoverArt); Assert.IsNotNull(config.Playlists[0].SongList[0].CoverArt); Assert.AreEqual(1024, config.Playlists[0].CoverArt.Width); Assert.AreEqual(1024, config.Playlists[0].CoverArt.Height); Assert.AreEqual(256, config.Playlists[0].SongList[0].CoverArt.Width); Assert.AreEqual(256, config.Playlists[0].SongList[0].CoverArt.Height); Assert.Pass(); }
public void MovesSongToNewPlaylist() { SetupPlaylistsWithSongs(2, 2); BeatSaberQuestomConfig oldConfig = null; using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { oldConfig = qae.GetCurrentConfig(); var config = CopyIDs(oldConfig); var song = config.Playlists[0].SongList[0]; config.Playlists[1].SongList.Add(song); config.Playlists[0].SongList.Remove(song); qae.UpdateConfig(config); qae.Save(); } } using (var fp = GetProvider()) { var q = GetQaeConfig(fp); using (QuestomAssetsEngine qae = new QuestomAssetsEngine(q)) { var testConfig = qae.GetCurrentConfig(); Assert.AreEqual(2, testConfig.Playlists.Count); Assert.AreEqual(1, testConfig.Playlists[0].SongList.Count()); Assert.AreEqual(3, testConfig.Playlists[1].SongList.Count()); Assert.AreEqual(string.Format(SongIDFormat, 0, 1), testConfig.Playlists[0].SongList[0].SongID); Assert.AreEqual(string.Format(SongIDFormat, 1, 0), testConfig.Playlists[1].SongList[0].SongID); Assert.AreEqual(string.Format(SongIDFormat, 1, 1), testConfig.Playlists[1].SongList[1].SongID); Assert.AreEqual(string.Format(SongIDFormat, 0, 0), testConfig.Playlists[1].SongList[2].SongID); Assert.AreEqual(oldConfig.Playlists[0].PlaylistName, testConfig.Playlists[0].PlaylistName); Assert.AreEqual(oldConfig.Playlists[1].PlaylistName, testConfig.Playlists[1].PlaylistName); } } Assert.Pass(); }
public void LoadsConfigImages() { SetupPlaylistsWithSongs(1, 1); BeatSaberQuestomConfig config = null; using (var apk = new ApkAssetsFileProvider(_apkFile, FileCacheMode.Memory, true)) { QuestomAssetsEngine qae = new QuestomAssetsEngine(apk, "assets/bin/Data/", true); config = qae.GetCurrentConfig(); Assert.IsNotNull(config, "Didn't load current config"); Assert.IsNotNull(config.Playlists[0].CoverArtBytes); Assert.IsNotNull(config.Playlists[0].SongList[0].CoverArtBytes); //todo: //Assert.AreEqual(1024, config.Playlists[0].CoverArt.Width); //Assert.AreEqual(1024, config.Playlists[0].CoverArt.Height); //Assert.AreEqual(256, config.Playlists[0].SongList[0].CoverArt.Width); //Assert.AreEqual(256, config.Playlists[0].SongList[0].CoverArt.Height); } Assert.Pass(); }
static int FolderMode(FolderMode args) { QuestomAssets.Log.SetLogSink(new ConsoleSink()); if (!string.IsNullOrWhiteSpace(args.CoverArt) && !File.Exists(args.CoverArt)) { Log.LogErr("Playlist cover art file doesn't exist!"); return(-1); } var customSongsFolders = GetCustomSongsFromPath(args.CustomSongsFolder); if (customSongsFolders.Count < 1) { Log.LogErr("No custom songs found!"); return(-1); } try { Log.LogMsg($"Opening APK at '{args.ApkFile}'"); using (var apkFileProvider = new ApkAssetsFileProvider(args.ApkFile, FileCacheMode.Memory, false)) { QuestomAssetsEngine q = new QuestomAssetsEngine(apkFileProvider, BSConst.KnownFiles.AssetsRootPath); //Log.LogMsg($"Loading configuration..."); //var cfg = q.GetCurrentConfig(apkFileProvider, BSConst.KnownFiles.AssetsRootPath, true); //Log.LogMsg($"Configuration loaded"); //if (!args.NoPatch) //{ // Log.LogMsg($"Applying patches..."); // if (!q.ApplyPatchSettingsFile(apkFileProvider)) // { // Log.LogErr("Failed to apply patches. Cannot continue."); // return -1; // } //} //BeatSaberPlaylist playlist = cfg.Playlists.FirstOrDefault(x => x.PlaylistID == "CustomSongs"); //if (playlist == null) //{ // Log.LogMsg("Playlist doesn't already exist, creating it"); // playlist = new BeatSaberPlaylist() // { // PlaylistID = "CustomSongs", // PlaylistName = "Custom Songs" // }; // cfg.Playlists.Add(playlist); //} //else if (args.DeleteSongs) //{ // Log.LogMsg("Deleting current songs from playlist before reloading"); // playlist.SongList.Clear(); //} //try //{ // playlist.CoverArtBytes = string.IsNullOrWhiteSpace(args.CoverArt) ? null : File.ReadAllBytes(args.CoverArt); //} //catch (Exception ex) //{ // Log.LogErr($"Unable to load playlist cover art from {args.CoverArt}", ex); // playlist.CoverArtBytes = null; //} //Log.LogMsg($"Attempting to load {customSongsFolders.Count} custom songs..."); //foreach (var cs in customSongsFolders) //{ // playlist.SongList.Add(new BeatSaberSong() // { // CustomSongFolder = cs // }); //} Log.LogMsg("Applying new configuration..."); // q.UpdateConfig(cfg, apkFileProvider, BSConst.KnownFiles.AssetsRootPath); Log.LogMsg("Configuration updated"); Log.LogMsg("Signing APK..."); q.SignAPK(); Log.LogMsg("APK signed"); return(0); } } catch (Exception ex) { Log.LogErr("Something went horribly wrong", ex); return(-1); } }
static int UpdateConfig(UpdateConfig args) { QuestomAssets.Log.SetLogSink(new ConsoleSink()); try { Log.LogMsg($"Opening APK at '{args.ApkFile}'"); QuestomAssetsEngine q = new QuestomAssetsEngine(args.ApkFile); if (!args.NoPatch) { Log.LogMsg($"Applying patches..."); if (!q.ApplyPatchSettingsFile()) { Log.LogErr("Failed to apply patches. Cannot continue."); return(-1); } Log.LogMsg("Patches complete"); } else { Log.LogMsg("Skipping patches."); } BeatSaberQuestomConfig config = null; TextReader inReader = null; string from = string.IsNullOrWhiteSpace(args.InputFile) ? "stdin" : args.InputFile; Log.LogMsg($"Reading configuration from {from}..."); try { if (string.IsNullOrWhiteSpace(args.InputFile)) { inReader = Console.In; } else { inReader = new StreamReader(args.InputFile); } using (var jReader = new JsonTextReader(inReader)) config = new JsonSerializer().Deserialize <BeatSaberQuestomConfig>(jReader); } finally { if (inReader != null) { inReader.Dispose(); inReader = null; } } Log.LogMsg($"Config parsed"); Log.LogMsg("Applying new configuration..."); q.UpdateConfig(config); Log.LogMsg("Configuration updated"); Log.LogMsg("Signing APK..."); q.SignAPK(); Log.LogMsg("APK signed."); return(0); } catch (Exception ex) { Log.LogErr("Something went horribly wrong", ex); return(-1); } }
static int FolderMode(FolderMode args) { QuestomAssets.Log.SetLogSink(new ConsoleSink()); if (!string.IsNullOrWhiteSpace(args.CoverArt) && !File.Exists(args.CoverArt)) { Log.LogErr("Playlist cover art file doesn't exist!"); return(-1); } var customSongsFolders = GetCustomSongsFromPath(args.CustomSongsFolder); if (customSongsFolders.Count < 1) { Log.LogErr("No custom songs found!"); return(-1); } try { Log.LogMsg($"Opening APK at '{args.ApkFile}'"); QuestomAssetsEngine q = new QuestomAssetsEngine(args.ApkFile); Log.LogMsg($"Loading configuration..."); var cfg = q.GetCurrentConfig(true); Log.LogMsg($"Configuration loaded"); if (!args.NoPatch) { Log.LogMsg($"Applying patches..."); if (!q.ApplyPatchSettingsFile()) { Log.LogErr("Failed to apply patches. Cannot continue."); return(-1); } } BeatSaberPlaylist playlist = cfg.Playlists.FirstOrDefault(x => x.PlaylistID == "CustomSongs"); if (playlist == null) { Log.LogMsg("Playlist doesn't already exist, creating it"); playlist = new BeatSaberPlaylist() { PlaylistID = "CustomSongs", PlaylistName = "Custom Songs" }; cfg.Playlists.Add(playlist); } else if (args.DeleteSongs) { Log.LogMsg("Deleting current songs from playlist before reloading"); playlist.SongList.Clear(); } try { playlist.CoverArt = string.IsNullOrWhiteSpace(args.CoverArt) ? null : new Bitmap(args.CoverArt); } catch (Exception ex) { Log.LogErr($"Unable to load playlist cover art from {args.CoverArt}", ex); playlist.CoverArt = null; } Log.LogMsg($"Attempting to load {customSongsFolders.Count} custom songs..."); foreach (var cs in customSongsFolders) { playlist.SongList.Add(new BeatSaberSong() { CustomSongFolder = cs }); } Log.LogMsg("Applying new configuration..."); q.UpdateConfig(cfg); Log.LogMsg("Configuration updated"); Log.LogMsg("Signing APK..."); q.SignAPK(); Log.LogMsg("APK signed"); return(0); } catch (Exception ex) { Log.LogErr("Something went horribly wrong", ex); return(-1); } }
public OpContext(QuestomAssetsEngine qae) { Engine = qae; }
public void loadlots() { QuestomAssets.Utils.ImageUtils.Instance = new ImageUtilsWin(); try { QaeConfig cfg2 = new QaeConfig() { AssetsPath = "Data", RootFileProvider = new FolderFileProvider(@"C:\Users\VR\Desktop\platform-tools_r28.0.3-windows\perftest", false), SongsPath = "customsongs", SongFileProvider = new FolderFileProvider(@"C:\Users\VR\Desktop\platform-tools_r28.0.3-windows\perftest", false) }; var qae2 = new QuestomAssetsEngine(cfg2); var config = qae2.GetCurrentConfig(); var folders = GetCustomSongsFromPath(@"C:\Users\VR\Desktop\platform-tools_r28.0.3-windows\perftest\customsongs"); if (folders.Count < 1) { Log.LogErr("Request to reload songs folder, but didn't find any songs!"); //not found probably isn't the right response code for this, but meh return; } Log.LogMsg($"Starting to reload custom songs from folders. Found {folders.Count} folders to evaluate"); //todo: probably don't just grab this one var playlist = config.Playlists.FirstOrDefault(x => x.PlaylistID == "CustomSongs"); if (playlist == null) { playlist = new BeatSaberPlaylist() { PlaylistID = "CustomSongs", PlaylistName = "Custom Songs" }; config.Playlists.Add(playlist); } int addedCtr = 0; foreach (var folder in folders) { string songId = folder.Replace("/", ""); songId = songId.Replace(" ", ""); if (config.Playlists.SelectMany(x => x.SongList).Any(x => x.SongID?.ToLower() == songId.ToLower())) { //SendStatusMessage($"Folder {folder} already loaded"); Log.LogMsg($"Custom song in folder {folder} appears to already be loaded, skipping it."); continue; } //safety check to make sure we aren't importing one with the same ID as a beatsaber song. It could be re-ID'ed, but this is a stopgap if (BSConst.KnownLevelIDs.Contains(songId)) { Log.LogErr($"Song in path {folder} would conflict with a built in songID and will be skipped"); continue; } // SendStatusMessage($"Adding song in {folder}"); Log.LogMsg($"Adding custom song in folder {folder} to playlist ID {playlist.PlaylistID}"); playlist.SongList.Add(new BeatSaberSong() { SongID = songId, CustomSongPath = Path.Combine(cfg2.SongsPath, folder) }); addedCtr++; //maybe limit how many //if (addedCtr > 200) //{ // ShowToast("Too Many Songs", "That's too many at once. After these finish and you 'Sync to Beat Saber', then try 'Reload Songs Folder' again to load more.", ToastType.Warning, 10); // break; //} } if (addedCtr > 0) { Log.LogMsg("Updating config with loaded song folders"); qae2.UpdateConfig(config); } qae2.Save(); } finally { } QaeConfig cfg3 = new QaeConfig() { AssetsPath = "Data", RootFileProvider = new FolderFileProvider(@"C:\Users\VR\Desktop\platform-tools_r28.0.3-windows\perftest\Data", false), SongsPath = "customsongs", SongFileProvider = new FolderFileProvider(@"C:\Users\VR\Desktop\platform-tools_r28.0.3-windows\perftest\Data\customsongs", false) }; var qae3 = new QuestomAssetsEngine(cfg3); Assert.Pass(); }
public override List <AssetOp> GetUninstallOps(ModContext context) { if (UninstallAction == null) { throw new InvalidOperationException("Tried to install AssetsModComponent, but uninstall action is null."); } if (UninstallAction.Actions == null || UninstallAction.Actions.Count < 1) { throw new InvalidOperationException("Uninstall action has no asset actions defined!"); } if (string.IsNullOrEmpty(context.Config.BackupApkFileAbsolutePath)) { throw new InvalidOperationException("Uninstall assets mod can't happen when the backup APK isn't set!"); } string backup = null; if (!File.Exists(context.Config.BackupApkFileAbsolutePath)) { Log.LogErr($"WARNING: primary APK backup doesn't exist at {context.Config.BackupApkFileAbsolutePath}, will attempt to fall back..."); if (!File.Exists(context.Config.ModdedFallbackBackupPath)) { throw new Exception($"Backup APK file does not exist at {context.Config.BackupApkFileAbsolutePath} and even the fallback doesn't exist at {context.Config.ModdedFallbackBackupPath}"); } else { backup = context.Config.ModdedFallbackBackupPath; } } else { backup = context.Config.BackupApkFileAbsolutePath; } using (new LogTiming("preloading asset files for uninstall assets mod")) { if (UninstallAction.PreloadFiles != null) { UninstallAction.PreloadFiles.ForEach(x => context.GetEngine().Manager.GetAssetsFile(x)); } } Log.LogMsg($"Opening backup APK..."); List <AssetOp> ops = new List <AssetOp>(); using (var apk = new ZipFileProvider(backup, FileCacheMode.Memory, true, FileUtils.GetTempDirectory())) { var backupCfg = new QaeConfig() { AssetsPath = BeatSaber.BSConst.KnownFiles.AssetsRootPath, SongsPath = "", ModsSourcePath = "", PlaylistArtPath = "", RootFileProvider = apk }; using (var backupQae = new QuestomAssetsEngine(backupCfg)) { using (new LogTiming("preloading asset files for uninstall assets mod on BACKUP apk/qae")) { if (UninstallAction.PreloadFiles != null) { UninstallAction.PreloadFiles.ForEach(x => backupQae.Manager.GetAssetsFile(x)); } } using (new LogTiming("preloading asset files that are loaded in the main engine")) { context.GetEngine().Manager.OpenFiles.ForEach(x => backupQae.Manager.GetAssetsFile(x.AssetsFilename)); } context.BackupEngine = backupQae; foreach (var action in UninstallAction.Actions.OrderBy(x => x.StepNumber)) { using (new LogTiming($"getting operations for asset mod uninstall action step {action.StepNumber}")) { ops.AddRange(action.GetOps(context)); } } } context.BackupEngine = null; } Log.LogMsg($"Returning {ops.Count} for assets mod component uninstall..."); return(ops); }