using System; using System.IO; using CueSplitter.Helpers; Console.WriteLine("Cue Command-line tool"); if (args.Length != 3) Die(-1, $"Missing args.{Environment.NewLine}Usage: CueSplitter "); var inputAudioFilePath = args[0]; var inputCueFilePath = args[1]; var outputDir = args[2]; if (File.Exists(inputAudioFilePath) == false) Die(-2, "Input audio file not exist"); var tag = TagLib.File.Create(inputAudioFilePath); var duration = tag.Properties.Duration; Console.WriteLine($"Audio file duration: {duration}"); if (File.Exists(inputCueFilePath) == false) Die(-3, "Input cue file not exist"); var cueBytes = File.ReadAllBytes(inputCueFilePath); var encoding = TextHelper.DetectCodePage(cueBytes); if (encoding == null) Die(-5, "Can not detect cue file text encoding"); // ReSharper disable once PossibleNullReferenceException var cueText = encoding.GetString(cueBytes); var tracks = CueHelper.ParseCue(cueText, duration); Console.WriteLine($"Cue tracks number: {tracks.Length}"); var numberPaddingFormat = "".PadLeft(tracks.Length.ToString().Length, '0'); foreach (var trackModel in tracks) { var d = trackModel.Duration; Console.WriteLine($" {trackModel.TrackNo.ToString(numberPaddingFormat)}. {d.TotalMinutes:00}:{d.Seconds:00}.{d.Milliseconds:000} {trackModel.Title} - {trackModel.Performer}"); } if (Directory.Exists(outputDir) == false) Die(-6, "Error: Output dir not exist"); Console.WriteLine(); Console.WriteLine("Start Extracting..."); foreach (var track in tracks) { var outputFilePath = Path.Combine( outputDir, FilenameHelper.RemoveInvalidCharacters( $"{track.TrackNo.ToString(numberPaddingFormat)}. {track.Title}{Path.GetExtension(inputAudioFilePath)}" ) ); Console.WriteLine($"Output: {outputFilePath}"); var ffArgs = FfMpegHelper.CutSegment(inputAudioFilePath, outputFilePath, track.Offset, track.Duration); FfMpegHelper.Launch(ffArgs).WaitForExit(); } Console.WriteLine("Finished."); return 0; void Die(int exitCode, string errMessage = null) { if (errMessage != null) Console.WriteLine($"Error: {errMessage}"); Environment.Exit(exitCode); }