/// <summary> /// 做重命名动作 /// </summary> private void DoRaname() { if (this.assetMatchList.Count < 1) { Console.WriteLine("没有找到匹配项"); } else { //输出匹配信息 this.PrintMatchList(); Console.Write("请确认上方的文件映射关系,确认无误输入Y确定重命名,其他字符取消本次操作,您的选择是?:"); ConsoleKeyInfo keyInfo = Console.ReadKey(); Console.WriteLine("\n");//输出一下空白行 if (keyInfo.KeyChar != 'y' && keyInfo.KeyChar != 'Y') { Console.WriteLine("用户放弃本次操作!"); } else { for (int i = 0; i < this.assetMatchList.Count; i++) { AssetMatch matchAsset = this.assetMatchList[i]; AssetFile videoAssetFile = matchAsset.video; AssetFile subtitleAssetFile = matchAsset.subtitle; //字幕文件扩展名 string subtitleExtFileName = Path.GetExtension(subtitleAssetFile.fileName); //获取没有扩展名的视频文件名 string targetFileName = Path.GetFileNameWithoutExtension(videoAssetFile.fileName); targetFileName += subtitleExtFileName; //原始文件路径 string originFilePath = Path.Combine(this.targetDirectory, subtitleAssetFile.fileName); //目标文件路径 string targetFilePath = Path.Combine(this.targetDirectory, targetFileName); //重命名字幕文件 if (!originFilePath.Equals(targetFilePath, StringComparison.OrdinalIgnoreCase))//如果确实发生了改变 { if (!File.Exists(originFilePath)) { Console.WriteLine("文件未重命名就已经不存在了:\n视频:{0}\n字幕:{1}\n", videoAssetFile.fileName, subtitleAssetFile.fileName); } else { File.Move(originFilePath, targetFilePath); } } } Console.WriteLine("任务完成!"); } } }
/// <summary> /// 处理重复引用字幕的情况 /// </summary> private void DoRepeatReferenceSubtitle() { //收集重复引用了相同字幕文件的视频 Dictionary <string, List <AssetMatch> > map = new Dictionary <string, List <AssetMatch> >(); for (int i = 0; i < assetMatchList.Count - 1; i++) { AssetMatch match1 = assetMatchList[i]; List <AssetMatch> list = null; string displayNameSimplified = match1.subtitle.displayNameSimplified; if (map.ContainsKey(displayNameSimplified)) { list = map[displayNameSimplified]; if (list.Contains(match1)) //如果当前文件已经被排除掉了 { continue; //那么直接开始下一个文件 } } for (int j = i + 1; j < assetMatchList.Count; j++) { AssetMatch match2 = assetMatchList[j]; if (displayNameSimplified.Equals(match2.subtitle.displayNameSimplified)) { if (!map.ContainsKey(displayNameSimplified)) { list = new List <AssetMatch>(); list.Add(match1); map[displayNameSimplified] = list; } list.Add(match2); } } } //完全匹配处理 if (config.perfectMatch.enabled) //如果启用了完全匹配 { if (map.Count > 0) //如果确实出现重复引用的情况了 { List <string> removeKeyList = new List <string>(); //开始处理 foreach (KeyValuePair <string, List <AssetMatch> > entry in map) { List <AssetMatch> matchList = entry.Value; List <AssetFile> matchAssetFileList = matchList.ConvertAll(x => x.video); this.DoPerfectMatch(entry.Key, matchAssetFileList); //排除掉不要的东西 for (int i = 0; i < matchList.Count; i++) { AssetMatch assetMatch = matchList[i]; if (!matchAssetFileList.Contains(assetMatch.video))//如果这个匹配已经不存在了 { assetMatchList.Remove(assetMatch); matchList.RemoveAt(i); } } if (matchList.Count == 1)//如只剩下一个匹配了 { removeKeyList.Add(entry.Key); } } //移除掉只剩下一个匹配的项 for (int i = 0; i < removeKeyList.Count; i++) { map.Remove(removeKeyList[i]); } } } //单匹配 和 多匹配处理 if (map.Count > 0)//如果确实出现重复引用的情况了 //通知用户进入处理程序 { for (;;) { Console.WriteLine("重复引用了字幕文件,即将进入处理程序,请按 y 键进入该程序!"); ConsoleKeyInfo keyInfo = Console.ReadKey(); Console.WriteLine("\n");//输出一下空白行 if (keyInfo.KeyChar == 'y' || keyInfo.KeyChar == 'Y') { break; } } //开始处理 foreach (KeyValuePair <string, List <AssetMatch> > entry in map) { int index; for (;;) { Console.WriteLine("重复引用了字幕文件,请选择字幕匹配的视频文件编号。"); Console.WriteLine("当前字幕文件:{0}", entry.Key); List <AssetMatch> matchList = entry.Value; //显示排序 matchList.Sort((x, y) => x.video.displayName.CompareTo(y.video.displayName)); for (int i = 0; i < matchList.Count; i++) { AssetMatch match = matchList[i]; Console.WriteLine("编号:{0} -> 字幕:{1}", i, match.video.displayName); } Console.Write("请输入您的选择,并按回车键确认,您的选择:"); string line = Console.ReadLine(); Console.WriteLine(); if (int.TryParse(line, out index)) { if (index < 0 || index > matchList.Count) { Console.WriteLine("输出错误,请输入正确的编号!"); } else { AssetMatch match = matchList[index]; //待移除的列表中排除用户要保留的设置 matchList.Remove(match); //移除掉不要的 for (int i = 0; i < matchList.Count; i++) { assetMatchList.Remove(matchList[i]); } break; } } } } } }
/// <summary> /// 匹配资源 /// </summary> private void DoMatchAsset() { assetMatchList.Clear(); for (int i = 0; i < this.videoFileList.Count; i++) { AssetFile videoAssetFile = this.videoFileList[i]; //先按照数字匹配 List <AssetFile> subtitleAssetFileList = null; int?numPtr = videoAssetFile.targetRangeTextNumber; //先按照数字匹配 if (numPtr.HasValue) { int num = numPtr.Value; subtitleAssetFileList = this.subtitleFileList.FindAll(x => x.targetRangeTextNumber == num); } if (subtitleAssetFileList == null || subtitleAssetFileList.Count == 0)//如果数字没有匹配项 { subtitleAssetFileList = new List <AssetFile>(); AssetFile templateAssetFile = this.videoFileList.Find(x => x.targetRangeTextNumber == 1); //至少有一个 1 吧,用它作为参照 if (templateAssetFile != null) //如果找到模板了 { int videoWeightRangeIndex = this.getMaxWeightRangeIndex(this.videoFileRangeWeightList); int subtitleWeightRangeIndex = this.getMaxWeightRangeIndex(this.subtitleFileRangeWeightList); Ranage videoRange = templateAssetFile.numberRanageList[videoWeightRangeIndex]; string str1 = videoAssetFile.fileName.Substring(videoRange.start, videoRange.length); for (int j = 0; j < this.subtitleFileList.Count; j++) { AssetFile subtitle = this.subtitleFileList[j]; Ranage subtitleRange = templateAssetFile.numberRanageList[videoWeightRangeIndex]; string str2 = subtitle.fileName.Substring(subtitleRange.start, subtitleRange.length); if (str2.Contains(str1)) { subtitleAssetFileList.Add(subtitle); } } } } //如果匹配成功才记录匹配数据 if (subtitleAssetFileList.Count > 0)//如果找到匹配项了 { AssetMatch assetMatch = new AssetMatch(); assetMatch.video = videoAssetFile; assetMatch.subtitleList = subtitleAssetFileList; //处理完全匹配 if (config.perfectMatch.enabled) //如果启用了完全匹配 { if (subtitleAssetFileList.Count > 1) //如果有多个匹配项 { this.DoPerfectMatch(assetMatch.video.displayNameSimplified, subtitleAssetFileList); } } //单匹配 和 多匹配处理 if (subtitleAssetFileList.Count == 1) //单匹配 { assetMatch.subtitle = subtitleAssetFileList[0]; //直接取得就行了 } else //多匹配 { int index; for (;;) { Console.WriteLine("视频:" + videoAssetFile.displayName); //排序 subtitleAssetFileList.Sort((x, y) => x.displayName.CompareTo(y.displayName)); //输出选项 for (int j = 0; j < subtitleAssetFileList.Count; j++) { Console.WriteLine("编号:{0} -> 字幕:{1}", j, subtitleAssetFileList[j].displayName); } Console.Write("视频出现同时多个字幕匹配,请选择目标字幕文件的编号:"); Console.Write("请输入您的选择,并按回车键确认,您的选择:"); string line = Console.ReadLine(); Console.WriteLine(); if (int.TryParse(line, out index)) { if (index < 0 || index > subtitleAssetFileList.Count) { Console.WriteLine("输出错误,请输入正确的编号!"); } else { assetMatch.subtitle = subtitleAssetFileList[index]; break; } } } } assetMatchList.Add(assetMatch); } } }