Add Locate Audiobooks function (#485)
This commit is contained in:
parent
c4acd5d208
commit
bba9c2ba7b
16 changed files with 530 additions and 20 deletions
60
Source/LibationFileManager/AudioFileLocator.cs
Normal file
60
Source/LibationFileManager/AudioFileLocator.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue