Program.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using CueCli;
  2. using CueCli.Helpers;
  3. using System;
  4. using System.IO;
  5. Console.WriteLine("Cue Command-line tool");
  6. if (args.Length != 3) Die(-1, $"Missing args.{Environment.NewLine}Usage: CueCli <input_audio_file> <input_cue_file> <output_dir>");
  7. var inputAudioFilePath = args[0];
  8. var inputCueFilePath = args[1];
  9. var outputDir = args[2];
  10. if (File.Exists(inputAudioFilePath) == false) Die(-2, "Input audio file not exist");
  11. var tag = TagLib.File.Create(inputAudioFilePath);
  12. var duration = tag.Properties.Duration;
  13. Console.WriteLine($"Audio file duration: {duration}");
  14. if (File.Exists(inputCueFilePath) == false) Die(-3, "Input cue file not exist");
  15. var cueBytes = File.ReadAllBytes(inputCueFilePath);
  16. var encoding = TextHelper.DetectCodePage(cueBytes);
  17. if (encoding == null) Die(-5, "Can not detect cue file text encoding");
  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. }