diff --git a/src/Core/AudioFileMeta.cs b/src/Core/AudioFileMeta.cs index 4175ab5..4ffaf2a 100644 --- a/src/Core/AudioFileMeta.cs +++ b/src/Core/AudioFileMeta.cs @@ -54,6 +54,9 @@ public class AudioFileMeta #endregion + ///声道配置 + public string? ChannelLayout { get; set; } + /// 短ID,便于人工识别或显示的简短标识 public string? ShortId { get; set; } @@ -114,10 +117,14 @@ public class AudioFileMeta public string? Manufacturer { get; set; } /// 来源方,原始创建者或来源机构 - public string? Originator { get; set; } + public string? BwfOriginator { get; set; } /// 来源引用,原始来源的参考编号 - public string? OriginatorRef { get; set; } + public string? BwfOriginatorRef { get; set; } + + public DateTime? BwfDate { get; set; } + + public string? BwfDescription { get; set; } /// 项目名称,所属制作项目 public string? ProjectName { get; set; } diff --git a/src/Core/AudioFileMetaValidator.cs b/src/Core/AudioFileMetaValidator.cs index 6285db1..6b556ae 100644 --- a/src/Core/AudioFileMetaValidator.cs +++ b/src/Core/AudioFileMetaValidator.cs @@ -32,7 +32,6 @@ public class AudioFileMetaValidator // 验证数值字段 ValidatePositiveValue(meta.Duration, "Duration", errors); - ValidatePositiveValue(meta.TotalSamples, "TotalSamples", errors); ValidatePositiveValue(meta.BitDepth, "BitDepth", errors); ValidatePositiveValue(meta.Channels, "Channels", errors); ValidatePositiveValue(meta.SampleRate, "SampleRate", errors); diff --git a/src/Core/AudioLibraryService.cs b/src/Core/AudioLibraryService.cs deleted file mode 100644 index 5dfbaf3..0000000 --- a/src/Core/AudioLibraryService.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System.Security.Cryptography; - -namespace OCES.Resonance.Core; - -/// -/// 音频库管理服务,协调扫描、读取和入库的完整流程 -/// -public class AudioLibraryService -{ - readonly AudioFileScanner _scanner = new(); - readonly AudioMetadataReader _metadataReader = new(); - - /// - /// 扫描目录并将结果添加到数据库 - /// - /// 要扫描的目录路径 - /// 数据库名称(不含扩展名) - /// 是否跳过已存在的文件 - /// 扫描结果统计 - public async Task ScanAndImportToLibrary( - string directoryPath, - string databaseName = "default", - bool skipExisting = true) - { - var result = new ScanResult - { - TotalFiles = 0, - SuccessCount = 0, - SkipCount = 0, - ErrorCount = 0, - Errors = [], - }; - - // 初始化数据库 - Database.InitializeDatabase(); - - // 扫描所有音频文件 - List audioFiles = this._scanner.ScanDirectory(directoryPath).ToList(); - result.TotalFiles = audioFiles.Count; - - if (audioFiles.Count == 0) - { - return result; - } - - List metadataList = []; - - // 读取每个文件的元数据 - foreach (string filePath in audioFiles) - { - try - { - // 计算 MD5 用于查重 - string md5 = CalculateMd5ForFile(filePath); - - // 读取元数据 - AudioFileMeta metadata = this._metadataReader.ReadMetadata(filePath); - metadataList.Add(metadata); - result.SuccessCount++; - } - catch (Exception ex) - { - result.ErrorCount++; - result.Errors.Add($"读取失败 {filePath}: {ex.Message}"); - } - } - - // 批量入库 - if (metadataList.Count <= 0) - return await Task.FromResult(result); - { - try - { - Database.AddEntries(metadataList); - } - catch (Exception ex) - { - result.Errors.Add($"批量入库失败:{ex.Message}"); - throw; - } - } - - return await Task.FromResult(result); - } - - /// - /// 计算文件 MD5(用于查重,不创建完整 AudioFileMeta 对象) - /// - private static string CalculateMd5ForFile(string filePath) - { - using MD5 md5 = MD5.Create(); - using FileStream stream = File.OpenRead(filePath); - byte[] hash = md5.ComputeHash(stream); - return Convert.ToHexString(hash); - } -} - -/// -/// 扫描结果统计 -/// -public class ScanResult -{ - /// 扫描到的文件总数 - public int TotalFiles { get; set; } - - /// 成功入库的文件数 - public int SuccessCount { get; set; } - - /// 跳过的文件数(已存在) - public int SkipCount { get; set; } - - /// 读取失败的文件数 - public int ErrorCount { get; set; } - - /// 错误详情列表 - public List Errors { get; set; } = []; - - /// - /// 获取人类可读的统计报告 - /// - public string GetSummary() - { - return $"扫描完成:共 {TotalFiles} 个文件,成功 {SuccessCount} 个,跳过 {SkipCount} 个,失败 {ErrorCount} 个"; - } -} diff --git a/src/Core/AudioMetadataReader.cs b/src/Core/AudioMetadataReader.cs index f56fdaf..e3ba01f 100644 --- a/src/Core/AudioMetadataReader.cs +++ b/src/Core/AudioMetadataReader.cs @@ -62,8 +62,8 @@ public class AudioMetadataReader // BWF 特定字段 (通过附加数据获取) CodingHistory = GetBwfField(track, "CodingHistory"), - Originator = GetBwfField(track, "Originator"), - OriginatorRef = GetBwfField(track, "OriginatorRef"), + BwfOriginator = GetBwfField(track, "BwfOriginator"), + BwfOriginatorRef = GetBwfField(track, "BwfOriginatorRef"), }; return meta; diff --git a/src/Core/Database.cs b/src/Core/Database.cs index d1c00e2..fff52a5 100644 --- a/src/Core/Database.cs +++ b/src/Core/Database.cs @@ -141,7 +141,7 @@ public static class Database @Bpm, @FrameRate, @Timecode, @Description, @Category, @Subcategory, @CatId, @CategoryFull, @Genre, @Style, @Mood, @Keywords, @Rating, @Artist, @Composer, @Designer, @Recordist, @Publisher, @Manufacturer, - @Originator, @OriginatorRef, @ProjectName, @Library, @CdTitle, + @BwfOriginator, @BwfOriginatorRef, @ProjectName, @Library, @CdTitle, @TrackTitle, @Episode, @Scene, @Take, @Tape, @CueNumber, @SyncPoint, @ReleaseDate, @TrackYear, @IsEdited, @IsSplit, @Location, @Group, @Markers, @Comments, @Notes, @Copyright, @CodingHistory, @Microphone, @@ -192,7 +192,7 @@ public static class Database @Bpm, @FrameRate, @Timecode, @Description, @Category, @Subcategory, @CatId, @CategoryFull, @Genre, @Style, @Mood, @Keywords, @Rating, @Artist, @Composer, @Designer, @Recordist, @Publisher, @Manufacturer, - @Originator, @OriginatorRef, @ProjectName, @Library, @CdTitle, + @BwfOriginator, @BwfOriginatorRef, @ProjectName, @Library, @CdTitle, @TrackTitle, @Episode, @Scene, @Take, @Tape, @CueNumber, @SyncPoint, @ReleaseDate, @TrackYear, @IsEdited, @IsSplit, @Location, @Group, @Markers, @Comments, @Notes, @Copyright, @CodingHistory, @Microphone,