114 lines
2.8 KiB
C#
114 lines
2.8 KiB
C#
using Harmonia.Core.Tags;
|
|
|
|
namespace Harmonia.Core.Imaging;
|
|
|
|
public class AudioImageExtractor : IAudioImageExtractor
|
|
{
|
|
private readonly ITagResolver _tagResolver;
|
|
private readonly string[] _searchPatterns;
|
|
private readonly string[] _imageExtensions;
|
|
|
|
public AudioImageExtractor(ITagResolver tagResolver)
|
|
{
|
|
_tagResolver = tagResolver;
|
|
_searchPatterns = GetSearchPatterns();
|
|
_imageExtensions = GetImageExtensions();
|
|
}
|
|
|
|
protected virtual string[] GetSearchPatterns()
|
|
{
|
|
return
|
|
[
|
|
@"*%filename%*",
|
|
@"*folder*",
|
|
@"*front*",
|
|
@"*cover*",
|
|
@"Cover\*folder*",
|
|
@"Cover\*front*",
|
|
@"Cover\*cover*",
|
|
@"Cover\*",
|
|
@"Scans\*folder*",
|
|
@"Scans\*front*",
|
|
@"Scans\*cover*",
|
|
@"Scans\*",
|
|
@"*"
|
|
];
|
|
}
|
|
|
|
|
|
protected virtual string[] GetImageExtensions()
|
|
{
|
|
return
|
|
[
|
|
"jpg",
|
|
"jpeg",
|
|
"png"
|
|
];
|
|
}
|
|
|
|
public SongPictureInfo? ExtractImage(string path)
|
|
{
|
|
SongTagInfo songTagInfo = _tagResolver.GetSongTagInfo(path);
|
|
|
|
return ExtractImage(path, songTagInfo);
|
|
}
|
|
|
|
public SongPictureInfo? ExtractImage(string path, SongTagInfo songTagInfo)
|
|
{
|
|
if (songTagInfo.FrontCover != null)
|
|
{
|
|
using MemoryStream memoryStream = new(songTagInfo.FrontCover.Data);
|
|
|
|
return SongPictureInfo.FromStream(memoryStream);
|
|
}
|
|
else
|
|
{
|
|
string? imagePath = GetImagePath(path);
|
|
|
|
if (string.IsNullOrWhiteSpace(imagePath))
|
|
return null;
|
|
|
|
return SongPictureInfo.FromFile(path);
|
|
}
|
|
}
|
|
|
|
private string? GetImagePath(string path)
|
|
{
|
|
string? directoryName = Path.GetDirectoryName(path);
|
|
|
|
if (string.IsNullOrWhiteSpace(directoryName))
|
|
return null;
|
|
|
|
string[] fileNames;
|
|
string extension;
|
|
|
|
foreach (string searchPattern in _searchPatterns)
|
|
{
|
|
fileNames = GetFilesFromDirectory(directoryName, searchPattern);
|
|
|
|
foreach (string fileName in fileNames)
|
|
{
|
|
extension = Path.GetExtension(fileName)?.Replace(".", "") ?? string.Empty;
|
|
|
|
if (_imageExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase) == false)
|
|
continue;
|
|
|
|
return fileName;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private static string[] GetFilesFromDirectory(string path, string searchPattern)
|
|
{
|
|
try
|
|
{
|
|
return Directory.GetFiles(path, searchPattern);
|
|
}
|
|
catch (DirectoryNotFoundException)
|
|
{
|
|
return [];
|
|
}
|
|
}
|
|
} |