Example #1
0
        public ConvertOsuCommand(string[] args) : base(args)
        {
            OutputPath = args[2];
            Beatmap    = new OsuBeatmap(args[1]);

            Beatmap.ToQua().Save(args[2]);
        }
Example #2
0
        public void CheckObjectCount()
        {
            var converter = new OsuBeatmap(BeatmapFilename);
            var qua       = converter.ToQua();

            Assert.Equal(2041 + 270, qua.HitObjects.Count);
        }
Example #3
0
        public void CheckCommonBPM()
        {
            // This map had incorrect common BPM.
            var converter = new OsuBeatmap("./Osu/Resources/Camellia feat. Nanahira - ChoChoKouSokuDeMaeSaiSoku!!! SpeedStarKanade (jakads) [Tsukahara's MAXIMUM].osu");
            var qua       = converter.ToQua();

            Assert.Equal(500, qua.GetCommonBpm());
        }
Example #4
0
        public void CheckObjectCountWithHitsounds()
        {
            // This map had missing objects due to an error in the parsing logic.
            var converter = new OsuBeatmap("./Osu/Resources/xi - Blue Zenith (Jepetski) [Zen's Black Another].osu");
            var qua       = converter.ToQua();

            Assert.Equal(4084 + 49, qua.HitObjects.Count);
        }
Example #5
0
        public void KeySoundZeroVolume()
        {
            var converter      = new OsuBeatmap("./Osu/Resources/keysound-zero-volume.osu");
            var qua            = converter.ToQua();
            var groundTruthQua = Qua.Parse("./Osu/Resources/keysound-zero-volume.qua");

            Assert.Equal(groundTruthQua.HitObjects, qua.HitObjects, HitObjectInfo.ByValueComparer);
        }
Example #6
0
        public void HitSoundTypeConversionCheck()
        {
            var converter = new OsuBeatmap("./Osu/Resources/hitsounds.osu");
            var qua       = converter.ToQua();

            var groundTruthQua = Qua.Parse("./Osu/Resources/hitsounds.qua");

            Assert.True(qua.EqualByValue(groundTruthQua));
        }
Example #7
0
        public void FullConversionCheck()
        {
            var converter = new OsuBeatmap(BeatmapFilename);
            var qua       = converter.ToQua();

            var groundTruthQua = Qua.Parse(Path.ChangeExtension(BeatmapFilename, "qua"));

            Assert.True(qua.EqualByValue(groundTruthQua));
        }
Example #8
0
        public void FullConversionWithKeysoundsCheck()
        {
            var converter = new OsuBeatmap("./Osu/Resources/megalovania.osu");
            var qua       = converter.ToQua();

            var groundTruthQua = Qua.Parse("./Osu/Resources/megalovania.qua");

            Assert.True(qua.EqualByValue(groundTruthQua));
        }
Example #9
0
        public void SoundEffectsFromO2JamConvert()
        {
            var converter      = new OsuBeatmap("./Osu/Resources/Glide.osu");
            var qua            = converter.ToQua();
            var groundTruthQua = Qua.Parse("./Osu/Resources/Glide-sound-effects.qua");

            Assert.Equal(groundTruthQua.CustomAudioSamples, qua.CustomAudioSamples, CustomAudioSampleInfo.ByValueComparer);
            Assert.Equal(groundTruthQua.SoundEffects, qua.SoundEffects, SoundEffectInfo.ByValueComparer);
        }
Example #10
0
        public void ConvertToQuaFile()
        {
            var dir = "./tests/osu";

            Directory.CreateDirectory(dir);

            var converter = new OsuBeatmap(BeatmapFilename);
            var qua       = converter.ToQua();

            qua.Save($"{dir}/output.qua");
        }
Example #11
0
File: Map.cs Project: AiAe/Quaver-1
        /// <summary>
        ///     Loads the .qua, .osu or .sm file for a map.
        ///
        /// </summary>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public Qua LoadQua(bool checkValidity = true)
        {
            // Reference to the parsed .qua file
            Qua qua;

            // Handle osu! maps as well
            switch (Game)
            {
            case MapGame.Quaver:
                var quaPath = $"{ConfigManager.SongDirectory}/{Directory}/{Path}";
                qua = Qua.Parse(quaPath, checkValidity);
                break;

            case MapGame.Osu:
                var osu = new OsuBeatmap(MapManager.OsuSongsFolder + Directory + "/" + Path);
                qua = osu.ToQua();
                break;

            default:
                throw new InvalidEnumArgumentException();
            }

            return(qua);
        }
Example #12
0
        /// <summary>
        ///     Exports the entire mapset to a zip (.qp) file.
        /// </summary>
        public void ExportToZip()
        {
            var exportsDir = $"{ConfigManager.DataDirectory}/Exports/";

            System.IO.Directory.CreateDirectory(exportsDir);

            var tempFolder = $"{ConfigManager.DataDirectory}/temp/{GameBase.Game.TimeRunning}/";

            System.IO.Directory.CreateDirectory(tempFolder);

            using (var archive = ZipArchive.Create())
            {
                foreach (var map in Maps)
                {
                    try
                    {
                        switch (map.Game)
                        {
                        case MapGame.Quaver:
                            var path = $"{ConfigManager.SongDirectory.Value}/{map.Directory}/{map.Path}";
                            File.Copy(path, $"{tempFolder}/{map.Path}");
                            break;

                        // Map is from osu!, so we need to convert it to .qua format
                        case MapGame.Osu:
                            var osuPath = $"{MapManager.OsuSongsFolder}{map.Directory}/{map.Path}";

                            var osu = new OsuBeatmap(osuPath);
                            map.BackgroundPath = osu.Background;

                            var name     = StringHelper.FileNameSafeString($"{map.Artist} - {map.Title} [{map.DifficultyName}].qua");
                            var savePath = $"{tempFolder}/{name}";

                            osu.ToQua().Save(savePath);

                            Logger.Debug($"Successfully converted osu beatmap: {osuPath}", LogType.Runtime);
                            break;
                        }

                        // Copy over audio file if necessary
                        if (File.Exists(MapManager.GetAudioPath(map)) && !File.Exists($"{tempFolder}/{map.AudioPath}"))
                        {
                            File.Copy(MapManager.GetAudioPath(map), $"{tempFolder}/{map.AudioPath}");
                        }

                        // Copy over background file if necessary
                        if (File.Exists(MapManager.GetBackgroundPath(map)) && !File.Exists($"{tempFolder}/{map.BackgroundPath}"))
                        {
                            File.Copy(MapManager.GetBackgroundPath(map), $"{tempFolder}/{map.BackgroundPath}");
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Error(e, LogType.Runtime);
                    }
                }

                archive.AddAllFromDirectory(tempFolder);

                var outputPath = exportsDir +
                                 $"{StringHelper.FileNameSafeString(Artist + " - " + Title + " - " + GameBase.Game.TimeRunning)}.qp";

                archive.SaveTo(outputPath, CompressionType.Deflate);

                Utils.NativeUtils.HighlightInFileManager(outputPath);
            }

            System.IO.Directory.Delete(tempFolder, true);
        }
Example #13
0
        /// <summary>
        ///     Converts a .osz archive file to .qua format. M
        ///     (Makes it available to play in Quaver)
        /// </summary>
        public static void ConvertOsz(string file, string extractDirectory)
        {
            var time       = (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Milliseconds;
            var tempFolder = $@"{ConfigManager.DataDirectory}/Temp/{Path.GetFileNameWithoutExtension(file)} - {time}";

            if (Directory.Exists(tempFolder))
            {
                Directory.Delete(tempFolder, true);
            }

            Directory.CreateDirectory(tempFolder);

            try
            {
                // Extract the .osz archive to the temporary folder
                using (var archive = ArchiveFactory.Open(file))
                {
                    foreach (var entry in archive.Entries)
                    {
                        if (!entry.IsDirectory)
                        {
                            entry.WriteToDirectory(tempFolder, new ExtractionOptions()
                            {
                                ExtractFullPath = true, Overwrite = true
                            });
                        }
                    }
                }

                // Convert all .osu files in the temp folder to .qua
                foreach (var osuFile in Directory.GetFiles(tempFolder, "*.osu", SearchOption.AllDirectories))
                {
                    try
                    {
                        var map = new OsuBeatmap(osuFile);

                        if (!map.IsValid)
                        {
                            continue;
                        }

                        // Convert the map to .qua
                        map.ToQua().Save(map.OriginalFileName.Replace(".osu", ".qua"));
                    }
                    catch (Exception e)
                    {
                        Logger.Error(e, LogType.Runtime);
                    }
                }

                Directory.CreateDirectory(extractDirectory);

                // Go through each file in the temp folder and add it to the target directory
                foreach (var tempFile in Directory.GetFiles(tempFolder))
                {
                    var fileName = $"{extractDirectory}/{Path.GetFileName(tempFile)}";

                    // Make sure the path to the file is less than 200 characters
                    while (fileName.Length > 200)
                    {
                        fileName = fileName.Remove(fileName.Length - 1);
                    }

                    // Go through each file and move it.
                    switch (Path.GetExtension(tempFile).ToLower())
                    {
                    case ".qua":
                    case ".mp3":
                    case ".jpg":
                    case ".png":
                    case ".jpeg":
                    case ".ogg":
                        File.Move(tempFile, fileName);
                        break;

                    default:
                        continue;
                    }
                }
            }
            catch (Exception e)
            {
                Logger.Error(e, LogType.Runtime);
            }
        }