using dy.net.model.dto; using System.Text.RegularExpressions; namespace dy.net.utils { /// /// 视频标题模板生成器 /// public static class VideoTitleGenerator { /// /// 根据用户模板和原始数据生成最终标题 /// /// 用户设置的模板(如 "视频_{id}_{VideoTitle}_{ReleaseTime}") /// 标题所需的原始数据 /// 时间字段格式化(默认:yyyy-MM-dd HH:mm:ss) /// 占位符对应数据为空时的替换值(默认:空字符串) /// 生成的最终标题 /// 模板为空时抛出 public static string Generate( string template, VideoTitleDataTemplate data, string timeFormat = "yyyyMMdd", string emptyPlaceholder = "") { // 校验入参 if (string.IsNullOrWhiteSpace(template)) throw new ArgumentNullException(nameof(template), "标题模板不能为空"); data ??= new VideoTitleDataTemplate(); // 避免数据为空 // 1. 定义占位符与数据的映射关系(key:占位符名称,value:格式化后的值) var placeholderMap = new Dictionary(StringComparer.OrdinalIgnoreCase) { // 普通字段 ["Id"] = data.Id.ToString(), ["VideoTitle"] = string.IsNullOrWhiteSpace(DouyinFileNameHelper.KeepChineseLettersAndNumbers(data.VideoTitle)) ? emptyPlaceholder : DouyinFileNameHelper.KeepChineseLettersAndNumbers(data.VideoTitle), ["FileHash"] = string.IsNullOrWhiteSpace(data.FileHash) ? emptyPlaceholder : data.FileHash, ["Resolution"] = string.IsNullOrWhiteSpace(data.Resolution) ? emptyPlaceholder : data.Resolution, ["Author"] = string.IsNullOrWhiteSpace(DouyinFileNameHelper.KeepChineseLettersAndNumbers(data.Author)) ? emptyPlaceholder : DouyinFileNameHelper.KeepChineseLettersAndNumbers(data.Author), // 时间字段(支持空值处理) //["SyncTime"] = data.SyncTime.HasValue ? data.SyncTime.Value.ToString(timeFormat) : emptyPlaceholder, ["ReleaseTime"] = data.ReleaseTime.HasValue ? data.ReleaseTime.Value.ToString(timeFormat) : emptyPlaceholder, // 文件大小(自动格式化:字节→KB/MB/GB,保留1位小数) //["FileSize"] = FormatFileSize(data.FileSize) ?? emptyPlaceholder }; // 2. 正则匹配模板中的占位符({占位符名称}),并替换 var regex = new Regex(@"\{(?[a-zA-Z0-9]+)\}", RegexOptions.Compiled); var finalTitle = regex.Replace(template, match => { var placeholderKey = match.Groups["key"].Value; // 存在对应映射则替换,否则保留原占位符(避免替换错误) return placeholderMap.TryGetValue(placeholderKey, out var value) ? value : match.Value; }); var fullName = finalTitle.Replace("--", "-"); if (fullName.Length > 60) { return fullName.Substring(0, 60); } else { return fullName; } } } }