Add Locate Audiobooks function (#485)

This commit is contained in:
Mbucari 2023-02-10 09:35:21 -07:00
parent c4acd5d208
commit bba9c2ba7b
16 changed files with 530 additions and 20 deletions

View file

@ -0,0 +1,60 @@
using AAXClean;
using Dinah.Core;
using FileManager;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace LibationFileManager
{
public static class AudioFileLocator
{
private static EnumerationOptions enumerationOptions { get; } = new()
{
RecurseSubdirectories = true,
IgnoreInaccessible = true,
MatchCasing = MatchCasing.CaseInsensitive
};
public static async IAsyncEnumerable<FilePathCache.CacheEntry> FindAudiobooks(LongPath searchDirectory, [EnumeratorCancellation] CancellationToken cancellationToken)
{
ArgumentValidator.EnsureNotNull(searchDirectory, nameof(searchDirectory));
foreach (LongPath path in Directory.EnumerateFiles(searchDirectory, "*.M4B", enumerationOptions))
{
if (cancellationToken.IsCancellationRequested)
yield break;
int generation = 0;
FilePathCache.CacheEntry audioFile = default;
try
{
using var fileStream = File.OpenRead(path);
var mp4File = await Task.Run(() => new Mp4File(fileStream), cancellationToken);
generation = GC.GetGeneration(mp4File);
if (mp4File?.AppleTags?.Asin is not null)
audioFile = new FilePathCache.CacheEntry(mp4File.AppleTags.Asin, FileType.Audio, path);
}
catch(Exception ex)
{
Serilog.Log.Error(ex, "Error checking for asin in {@file}", path);
}
finally
{
GC.Collect(generation);
}
if (audioFile is not null)
yield return audioFile;
}
}
}
}

View file

@ -86,7 +86,11 @@ namespace LibationFileManager
public static void Insert(string id, string path)
{
var type = FileTypes.GetFileTypeFromPath(path);
var entry = new CacheEntry(id, type, path);
Insert(new CacheEntry(id, type, path));
}
public static void Insert(CacheEntry entry)
{
cache.Add(entry);
Inserted?.Invoke(null, entry);
save();