예제 #1
0
        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);
        }
예제 #2
0
        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();
        }
예제 #4
0
        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();
        }
예제 #6
0
        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();
        }
예제 #9
0
        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();
        }
예제 #10
0
        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();
        }
예제 #11
0
        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();
        }
예제 #12
0
        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();
        }
예제 #14
0
 private void FullEngineReset()
 {
     _currentConfig = null;
     if (_qae != null)
     {
         _qae.Dispose();
         _qae = null;
     }
 }
예제 #15
0
        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();
            }
        }
예제 #17
0
        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();
        }
예제 #21
0
        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();
        }
예제 #23
0
        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();
        }
예제 #24
0
        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);
            }
        }
예제 #25
0
        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);
            }
        }
예제 #26
0
        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);
            }
        }
예제 #27
0
 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();
        }
예제 #29
0
        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);
        }