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,