Program.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System;
  2. using System.IO;
  3. using CueSplitter.Helpers;
  4. Console.WriteLine("Cue Command-line tool");
  5. if (args.Length != 3) Die(-1, $"Missing args.{Environment.NewLine}Usage: CueSplitter <input_audio_file> <input_cue_file> <output_dir>");
  6. var inputAudioFilePath = args[0];
  7. var inputCueFilePath = args[1];
  8. var outputDir = args[2];
  9. if (File.Exists(inputAudioFilePath) == false) Die(-2, "Input audio file not exist");
  10. var tag = TagLib.File.Create(inputAudioFilePath);
  11. var duration = tag.Properties.Duration;
  12. Console.WriteLine($"Audio file duration: {duration}");
  13. if (File.Exists(inputCueFilePath) == false) Die(-3, "Input cue file not exist");
  14. var cueBytes = File.ReadAllBytes(inputCueFilePath);
  15. var encoding = TextHelper.DetectCodePage(cueBytes);
  16. if (encoding == null) Die(-5, "Can not detect cue file text encoding");
  17. // ReSharper disable once PossibleNullReferenceException
  18. var cueText = encoding.GetString(cueBytes);
  19. var tracks = CueHelper.ParseCue(cueText, duration);
  20. Console.WriteLine($"Cue tracks number: {tracks.Length}");
  21. var numberPaddingFormat = "".PadLeft(tracks.Length.ToString().Length, '0');
  22. foreach (var trackModel in tracks)
  23. {
  24. var d = trackModel.Duration;
  25. Console.WriteLine($" {trackModel.TrackNo.ToString(numberPaddingFormat)}. {d.TotalMinutes:00}:{d.Seconds:00}.{d.Milliseconds:000} {trackModel.Title} - {trackModel.Performer}");
  26. }
  27. if (Directory.Exists(outputDir) == false) Die(-6, "Error: Output dir not exist");
  28. Console.WriteLine();
  29. Console.WriteLine("Start Extracting...");
  30. foreach (var track in tracks)
  31. {
  32. var outputFilePath = Path.Combine(
  33. outputDir,
  34. FilenameHelper.RemoveInvalidCharacters(
  35. $"{track.TrackNo.ToString(numberPaddingFormat)}. {track.Title}{Path.GetExtension(inputAudioFilePath)}"
  36. )
  37. );
  38. Console.WriteLine($"Output: {outputFilePath}");
  39. var ffArgs = FfMpegHelper.CutSegment(inputAudioFilePath, outputFilePath, track.Offset, track.Duration);
  40. FfMpegHelper.Launch(ffArgs).WaitForExit();
  41. }
  42. Console.WriteLine("Finished.");
  43. return 0;
  44. void Die(int exitCode, string errMessage = null)
  45. {
  46. if (errMessage != null) Console.WriteLine($"Error: {errMessage}");
  47. Environment.Exit(exitCode);
  48. }