Пример #1
0
    /// <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("任务完成!");
            }
        }
    }
Пример #2
0
    /// <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;
                        }
                    }
                }
            }
        }
    }
Пример #3
0
    /// <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);
            }
        }
    }