diff --git a/src/RipSharp.Tests/Core/RipOptionsTests.cs b/src/RipSharp.Tests/Core/RipOptionsTests.cs index 2af2cf1..41d57c6 100644 --- a/src/RipSharp.Tests/Core/RipOptionsTests.cs +++ b/src/RipSharp.Tests/Core/RipOptionsTests.cs @@ -98,7 +98,9 @@ public void ParseArgs_WithoutTemp_DefaultsToOutputDotMakemkv() var result = RipOptions.ParseArgs(args); - result.Temp.Should().Be(Path.Combine("/tmp/movies", ".makemkv")); + result.Temp.Should().StartWith("/tmp/movies/."); + Path.GetFileName(result.Temp).Should().MatchRegex("^\\.[a-z0-9]{8}$"); + result.TempWasAutoGenerated.Should().BeTrue(); } [Fact] @@ -109,6 +111,7 @@ public void ParseArgs_WithTemp_SetsCustomTempDirectory() var result = RipOptions.ParseArgs(args); result.Temp.Should().Be("/mnt/large-disk/temp"); + result.TempWasAutoGenerated.Should().BeFalse(); } [Fact] @@ -516,7 +519,9 @@ public void ParseArgs_MovieScenario_ParsesCorrectly() result.Tv.Should().BeFalse(); result.Title.Should().Be("The Matrix"); result.Year.Should().Be(1999); - result.Temp.Should().Be(Path.Combine("~/Movies", ".makemkv")); + result.Temp.Should().StartWith("~/Movies/."); + Path.GetFileName(result.Temp).Should().MatchRegex("^\\.[a-z0-9]{8}$"); + result.TempWasAutoGenerated.Should().BeTrue(); } [Fact] diff --git a/src/RipSharp/Core/RipOptions.cs b/src/RipSharp/Core/RipOptions.cs index 1490744..bcb71c1 100644 --- a/src/RipSharp/Core/RipOptions.cs +++ b/src/RipSharp/Core/RipOptions.cs @@ -17,6 +17,7 @@ public class RipOptions public bool Debug { get; set; } public string? DiscType { get; set; } // dvd|bd|uhd public bool ShowHelp { get; set; } + public bool TempWasAutoGenerated { get; set; } public static RipOptions ParseArgs(string[] args) { @@ -74,11 +75,17 @@ public static RipOptions ParseArgs(string[] args) } if (string.IsNullOrEmpty(opts.Temp)) { - opts.Temp = Path.Combine(opts.Output, ".makemkv"); + opts.Temp = Path.Combine(opts.Output, GetTempDirectoryName()); + opts.TempWasAutoGenerated = true; } return opts; } + private static string GetTempDirectoryName() + { + return $".{Path.GetFileNameWithoutExtension(Path.GetRandomFileName())}"; + } + public static void DisplayHelp(IConsoleWriter writer) { writer.Plain("ripsharp - DVD/Blu-Ray/UHD disc ripping tool"); @@ -95,7 +102,7 @@ public static void DisplayHelp(IConsoleWriter writer) writer.Plain(" - movie: Treat as single movie"); writer.Plain(" - tv: Treat as TV series"); writer.Plain(" --disc PATH Optical drive path (default: disc:0)"); - writer.Plain(" --temp PATH Temporary ripping directory (default: {output}/.makemkv)"); + writer.Plain(" --temp PATH Temporary ripping directory (default: {output}/)"); writer.Plain(" --title TEXT Custom title for file naming"); writer.Plain(" --year YYYY Release year (movies only)"); writer.Plain(" --season N Season number (TV only, default: 1)"); diff --git a/src/RipSharp/Services/DiscRipper.cs b/src/RipSharp/Services/DiscRipper.cs index b1675cc..ff857e0 100644 --- a/src/RipSharp/Services/DiscRipper.cs +++ b/src/RipSharp/Services/DiscRipper.cs @@ -52,6 +52,16 @@ public async Task> ProcessDiscAsync(RipOptions options) } var finalFiles = await EncodeAndRenameAsync(discInfo, titleIds, rippedFilesMap, metadata, options); + + if (finalFiles.Count > 0) + { + CleanupTempDirectory(options); + } + else if (rippedFilesMap.Count > 0) + { + _notifier.Error($"No files were successfully encoded; temporary files have been left in: {options.Temp}"); + } + _notifier.Success($"Processing complete. Output files: {finalFiles.Count}"); foreach (var f in finalFiles) _notifier.Plain(f); return finalFiles; @@ -262,4 +272,37 @@ private async Task> EncodeAndRenameAsync(DiscInfo discInfo, List