Bugfix: decrypt book with no author
This commit is contained in:
parent
57bc74cd23
commit
5c81441f83
@ -72,8 +72,9 @@ namespace AaxDecrypter
|
|||||||
}
|
}
|
||||||
private AaxToM4bConverter(string inputFile, string decryptKey)
|
private AaxToM4bConverter(string inputFile, string decryptKey)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(inputFile)) throw new ArgumentNullException(nameof(inputFile), "Input file may not be null or whitespace");
|
ArgumentValidator.EnsureNotNullOrWhiteSpace(inputFile, nameof(inputFile));
|
||||||
if (!File.Exists(inputFile)) throw new ArgumentNullException(nameof(inputFile), "File does not exist");
|
if (!File.Exists(inputFile))
|
||||||
|
throw new ArgumentNullException(nameof(inputFile), "File does not exist");
|
||||||
|
|
||||||
steps = new StepSequence
|
steps = new StepSequence
|
||||||
{
|
{
|
||||||
@ -89,20 +90,20 @@ namespace AaxDecrypter
|
|||||||
["End: Create Nfo"] = End_CreateNfo
|
["End: Create Nfo"] = End_CreateNfo
|
||||||
};
|
};
|
||||||
|
|
||||||
this.inputFileName = inputFile;
|
inputFileName = inputFile;
|
||||||
this.decryptKey = decryptKey;
|
this.decryptKey = decryptKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task prelimProcessing()
|
private async Task prelimProcessing()
|
||||||
{
|
{
|
||||||
this.tags = new Tags(this.inputFileName);
|
tags = new Tags(inputFileName);
|
||||||
this.encodingInfo = new EncodingInfo(this.inputFileName);
|
encodingInfo = new EncodingInfo(inputFileName);
|
||||||
this.chapters = new Chapters(this.inputFileName, this.tags.duration.TotalSeconds);
|
chapters = new Chapters(inputFileName, tags.duration.TotalSeconds);
|
||||||
|
|
||||||
var defaultFilename = Path.Combine(
|
var defaultFilename = Path.Combine(
|
||||||
Path.GetDirectoryName(this.inputFileName),
|
Path.GetDirectoryName(inputFileName),
|
||||||
getASCIITag(this.tags.author),
|
getASCIITag(tags.author),
|
||||||
getASCIITag(this.tags.title) + ".m4b"
|
getASCIITag(tags.title) + ".m4b"
|
||||||
);
|
);
|
||||||
SetOutputFilename(defaultFilename);
|
SetOutputFilename(defaultFilename);
|
||||||
|
|
||||||
@ -118,7 +119,7 @@ namespace AaxDecrypter
|
|||||||
private void saveCover(string aaxFile)
|
private void saveCover(string aaxFile)
|
||||||
{
|
{
|
||||||
using var file = TagLib.File.Create(aaxFile, "audio/mp4", TagLib.ReadStyle.Average);
|
using var file = TagLib.File.Create(aaxFile, "audio/mp4", TagLib.ReadStyle.Average);
|
||||||
this.coverBytes = file.Tag.Pictures[0].Data.Data;
|
coverBytes = file.Tag.Pictures[0].Data.Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printPrelim()
|
private void printPrelim()
|
||||||
@ -156,21 +157,21 @@ namespace AaxDecrypter
|
|||||||
|
|
||||||
public void SetOutputFilename(string outFileName)
|
public void SetOutputFilename(string outFileName)
|
||||||
{
|
{
|
||||||
this.outputFileName = outFileName;
|
outputFileName = outFileName;
|
||||||
|
|
||||||
if (Path.GetExtension(this.outputFileName) != ".m4b")
|
if (Path.GetExtension(outputFileName) != ".m4b")
|
||||||
this.outputFileName = outputFileWithNewExt(".m4b");
|
outputFileName = outputFileWithNewExt(".m4b");
|
||||||
|
|
||||||
this.outDir = Path.GetDirectoryName(this.outputFileName);
|
outDir = Path.GetDirectoryName(outputFileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private string outputFileWithNewExt(string extension)
|
private string outputFileWithNewExt(string extension)
|
||||||
=> Path.Combine(this.outDir, Path.GetFileNameWithoutExtension(this.outputFileName) + '.' + extension.Trim('.'));
|
=> Path.Combine(outDir, Path.GetFileNameWithoutExtension(outputFileName) + '.' + extension.Trim('.'));
|
||||||
|
|
||||||
public bool Step1_CreateDir()
|
public bool Step1_CreateDir()
|
||||||
{
|
{
|
||||||
ProcessRunner.WorkingDir = this.outDir;
|
ProcessRunner.WorkingDir = outDir;
|
||||||
Directory.CreateDirectory(this.outDir);
|
Directory.CreateDirectory(outDir);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,7 +179,7 @@ namespace AaxDecrypter
|
|||||||
{
|
{
|
||||||
DecryptProgressUpdate?.Invoke(this, 0);
|
DecryptProgressUpdate?.Invoke(this, 0);
|
||||||
|
|
||||||
var tempRipFile = Path.Combine(this.outDir, "funny.aac");
|
var tempRipFile = Path.Combine(outDir, "funny.aac");
|
||||||
|
|
||||||
var fail = "WARNING-Decrypt failure. ";
|
var fail = "WARNING-Decrypt failure. ";
|
||||||
|
|
||||||
@ -193,7 +194,7 @@ namespace AaxDecrypter
|
|||||||
if (returnCode == -99)
|
if (returnCode == -99)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"{fail}Incorrect decrypt key: {decryptKey}");
|
Console.WriteLine($"{fail}Incorrect decrypt key: {decryptKey}");
|
||||||
this.decryptKey = null;
|
decryptKey = null;
|
||||||
returnCode = getKey_decrypt(tempRipFile);
|
returnCode = getKey_decrypt(tempRipFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -232,7 +233,7 @@ namespace AaxDecrypter
|
|||||||
|
|
||||||
Console.WriteLine("Cracking activation bytes");
|
Console.WriteLine("Cracking activation bytes");
|
||||||
var activation_bytes = BytesCracker.GetActivationBytes(checksum);
|
var activation_bytes = BytesCracker.GetActivationBytes(checksum);
|
||||||
this.decryptKey = activation_bytes;
|
decryptKey = activation_bytes;
|
||||||
Console.WriteLine("Activation bytes cracked. Decrypt key: " + activation_bytes);
|
Console.WriteLine("Activation bytes cracked. Decrypt key: " + activation_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,10 +244,10 @@ namespace AaxDecrypter
|
|||||||
Console.WriteLine("Decrypting with key " + decryptKey);
|
Console.WriteLine("Decrypting with key " + decryptKey);
|
||||||
|
|
||||||
var returnCode = 100;
|
var returnCode = 100;
|
||||||
var thread = new Thread(() => returnCode = this.ngDecrypt());
|
var thread = new Thread(() => returnCode = ngDecrypt());
|
||||||
thread.Start();
|
thread.Start();
|
||||||
|
|
||||||
double fileLen = new FileInfo(this.inputFileName).Length;
|
double fileLen = new FileInfo(inputFileName).Length;
|
||||||
while (thread.IsAlive && returnCode == 100)
|
while (thread.IsAlive && returnCode == 100)
|
||||||
{
|
{
|
||||||
Thread.Sleep(500);
|
Thread.Sleep(500);
|
||||||
@ -266,7 +267,7 @@ namespace AaxDecrypter
|
|||||||
var info = new ProcessStartInfo
|
var info = new ProcessStartInfo
|
||||||
{
|
{
|
||||||
FileName = DecryptSupportLibraries.mp4trackdumpPath,
|
FileName = DecryptSupportLibraries.mp4trackdumpPath,
|
||||||
Arguments = "-c " + this.encodingInfo.channels + " -r " + this.encodingInfo.sampleRate + " \"" + this.inputFileName + "\""
|
Arguments = "-c " + encodingInfo.channels + " -r " + encodingInfo.sampleRate + " \"" + inputFileName + "\""
|
||||||
};
|
};
|
||||||
info.EnvironmentVariables["VARIABLE"] = decryptKey;
|
info.EnvironmentVariables["VARIABLE"] = decryptKey;
|
||||||
|
|
||||||
@ -280,20 +281,20 @@ namespace AaxDecrypter
|
|||||||
}
|
}
|
||||||
|
|
||||||
// temp file names for steps 3, 4, 5
|
// temp file names for steps 3, 4, 5
|
||||||
string tempChapsPath => Path.Combine(this.outDir, "tempChaps.mp4");
|
string tempChapsPath => Path.Combine(outDir, "tempChaps.mp4");
|
||||||
string mp4_file => outputFileWithNewExt(".mp4");
|
string mp4_file => outputFileWithNewExt(".mp4");
|
||||||
string ff_txt_file => mp4_file + ".ff.txt";
|
string ff_txt_file => mp4_file + ".ff.txt";
|
||||||
|
|
||||||
public bool Step3_Chapterize()
|
public bool Step3_Chapterize()
|
||||||
{
|
{
|
||||||
string str1 = "";
|
string str1 = "";
|
||||||
if (this.chapters.FirstChapterStart != 0.0)
|
if (chapters.FirstChapterStart != 0.0)
|
||||||
{
|
{
|
||||||
str1 = " -ss " + this.chapters.FirstChapterStart.ToString("0.000", CultureInfo.InvariantCulture) + " -t " + (this.chapters.LastChapterStart - 1.0).ToString("0.000", CultureInfo.InvariantCulture) + " ";
|
str1 = " -ss " + chapters.FirstChapterStart.ToString("0.000", CultureInfo.InvariantCulture) + " -t " + (chapters.LastChapterStart - 1.0).ToString("0.000", CultureInfo.InvariantCulture) + " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
string ffmpegTags = this.tags.GenerateFfmpegTags();
|
string ffmpegTags = tags.GenerateFfmpegTags();
|
||||||
string ffmpegChapters = this.chapters.GenerateFfmpegChapters();
|
string ffmpegChapters = chapters.GenerateFfmpegChapters();
|
||||||
File.WriteAllText(ff_txt_file, ffmpegTags + ffmpegChapters);
|
File.WriteAllText(ff_txt_file, ffmpegTags + ffmpegChapters);
|
||||||
|
|
||||||
var tagAndChapterInfo = new ProcessStartInfo
|
var tagAndChapterInfo = new ProcessStartInfo
|
||||||
@ -309,8 +310,8 @@ namespace AaxDecrypter
|
|||||||
public bool Step4_InsertCoverArt()
|
public bool Step4_InsertCoverArt()
|
||||||
{
|
{
|
||||||
// save cover image as temp file
|
// save cover image as temp file
|
||||||
var coverPath = Path.Combine(this.outDir, "cover-" + Guid.NewGuid() + ".jpg");
|
var coverPath = Path.Combine(outDir, "cover-" + Guid.NewGuid() + ".jpg");
|
||||||
FileExt.CreateFile(coverPath, this.coverBytes);
|
FileExt.CreateFile(coverPath, coverBytes);
|
||||||
|
|
||||||
var insertCoverArtInfo = new ProcessStartInfo
|
var insertCoverArtInfo = new ProcessStartInfo
|
||||||
{
|
{
|
||||||
@ -329,26 +330,26 @@ namespace AaxDecrypter
|
|||||||
{
|
{
|
||||||
FileExt.SafeDelete(mp4_file);
|
FileExt.SafeDelete(mp4_file);
|
||||||
FileExt.SafeDelete(ff_txt_file);
|
FileExt.SafeDelete(ff_txt_file);
|
||||||
FileExt.SafeMove(tempChapsPath, this.outputFileName);
|
FileExt.SafeMove(tempChapsPath, outputFileName);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Step6_AddTags()
|
public bool Step6_AddTags()
|
||||||
{
|
{
|
||||||
this.tags.AddAppleTags(this.outputFileName);
|
tags.AddAppleTags(outputFileName);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool End_CreateCue()
|
public bool End_CreateCue()
|
||||||
{
|
{
|
||||||
File.WriteAllText(outputFileWithNewExt(".cue"), this.chapters.GetCuefromChapters(Path.GetFileName(this.outputFileName)));
|
File.WriteAllText(outputFileWithNewExt(".cue"), chapters.GetCuefromChapters(Path.GetFileName(outputFileName)));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool End_CreateNfo()
|
public bool End_CreateNfo()
|
||||||
{
|
{
|
||||||
File.WriteAllText(outputFileWithNewExt(".nfo"), NFO.CreateNfoContents(AppName, this.tags, this.encodingInfo, this.chapters));
|
File.WriteAllText(outputFileWithNewExt(".nfo"), NFO.CreateNfoContents(AppName, tags, encodingInfo, chapters));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,7 +28,7 @@ namespace AaxDecrypter
|
|||||||
using TagLib.File tagLibFile = TagLib.File.Create(file, "audio/mp4", ReadStyle.Average);
|
using TagLib.File tagLibFile = TagLib.File.Create(file, "audio/mp4", ReadStyle.Average);
|
||||||
this.title = tagLibFile.Tag.Title.Replace(" (Unabridged)", "");
|
this.title = tagLibFile.Tag.Title.Replace(" (Unabridged)", "");
|
||||||
this.album = tagLibFile.Tag.Album.Replace(" (Unabridged)", "");
|
this.album = tagLibFile.Tag.Album.Replace(" (Unabridged)", "");
|
||||||
this.author = tagLibFile.Tag.FirstPerformer;
|
this.author = tagLibFile.Tag.FirstPerformer ?? "[unknown]";
|
||||||
this.year = tagLibFile.Tag.Year.ToString();
|
this.year = tagLibFile.Tag.Year.ToString();
|
||||||
this.comments = tagLibFile.Tag.Comment;
|
this.comments = tagLibFile.Tag.Comment;
|
||||||
this.duration = tagLibFile.Properties.Duration;
|
this.duration = tagLibFile.Properties.Duration;
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
-- begin VERSIONING ---------------------------------------------------------------------------------------------------------------------
|
-- begin VERSIONING ---------------------------------------------------------------------------------------------------------------------
|
||||||
https://github.com/rmcrackan/Libation/releases
|
https://github.com/rmcrackan/Libation/releases
|
||||||
|
|
||||||
|
v3.1-beta.7 : Bugfix: decrypt book with no author
|
||||||
v3.1-beta.6 : Improved logging
|
v3.1-beta.6 : Improved logging
|
||||||
v3.1-beta.5 : Improved importing
|
v3.1-beta.5 : Improved importing
|
||||||
v3.1-beta.4 : Added beta-specific logging
|
v3.1-beta.4 : Added beta-specific logging
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user