public static void SongInfoAnalysis(string file, List <string> SongLangKeyWordList, List <string> SingerTypeKeyWordList, List <string> SongTrackKeyWordList) { string SongAddStatus = ""; string SongID = ""; string SongLang = ""; string SongSingerType = ""; string SongSinger = ""; string SongSongName = ""; string SongTrack = ""; string SongSongType = ""; string SongVolume = ""; string SongWordCount = ""; string SongPlayCount = ""; float SongMB = 0; DateTime SongCreatDate = new DateTime(); string SongSpell = ""; string SongSpellNum = ""; string SongSongStroke = ""; string SongPenStyle = ""; string SongPlayState = ""; string SongSrcPath = Path.GetFullPath(file); string SongSortIndex = ""; string SongLangStr = ""; string SongSingerTypeStr = ""; string SongTrackStr = ""; string SongSongTypeStr = ""; List <string> list = new List <string>(); // 從檔案名稱查找歌曲資訊 string FileStr = Path.GetFileNameWithoutExtension(file); if (Global.SongAddEnableConvToTC == "True") { FileStr = CommonFunc.ConvToTraditionalChinese(FileStr); } // 特殊歌手及歌曲名稱處理 list = new List <string>(Regex.Split(Global.SongAddSpecialStr, @"\|", RegexOptions.IgnoreCase)); foreach (string str in list) { FileStr = Regex.Replace(FileStr, str, "%%" + str + "%%", RegexOptions.IgnoreCase); } list.Clear(); // 去除檔案開頭的編號 FileStr = Regex.Replace(FileStr, @"^(\d{2}|\d{1})\.", "", RegexOptions.IgnoreCase); // 歌手-歌名(語系-類別-聲道) 名稱處理 MatchCollection BracketMatches = Regex.Matches(FileStr, @"[\{\(\[{([【].+?[】])}\]\)\}]", RegexOptions.IgnoreCase); if (BracketMatches.Count > 0) { foreach (Match m in BracketMatches) { if (m.Value.ContainsAny("-", "_")) { FileStr = FileStr.Replace(m.Value, "%%" + m.Value + "%%"); } } } List <string> SongSongTypeList = new List <string>(Global.SongMgrSongType.Split(',')); List <string> SongSongTypeLowCaseList = SongSongTypeList.ConvertAll(str => str.ToLower()); List <string> FileNameRemoveList = new List <string>(); string SeparateStr = "[-_](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"; list = new List <string>(Regex.Split(FileStr, SeparateStr, RegexOptions.None)); foreach (string str in list) { if (SongSingerType != "" && SongSinger != "" && SongLang != "" && SongTrack != "" && SongSongType != "") { break; } string splitstr = Regex.Replace(str, @"%%|^\s*|\s*$", ""); // 查看檔案名稱中有無歌手 if (SongSinger == "") { if (SingerDataLowCaseList.IndexOf(splitstr.ToLower()) >= 0) { SongSinger = SingerDataList[SingerDataLowCaseList.IndexOf(splitstr.ToLower())]; if (SongSingerType == "") { SongSingerType = SingerDataTypeList[SingerDataLowCaseList.IndexOf(splitstr.ToLower())]; } } else { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(splitstr.ToLower())) { string[] singers = Regex.Split(splitstr.ToLower(), "[&+]", RegexOptions.None); foreach (string singer in singers) { string SingerName = Regex.Replace(singer, @"^\s*|\s*$", ""); //去除頭尾空白 if (SingerDataLowCaseList.IndexOf(SingerName.ToLower()) >= 0) { SongSinger = splitstr; if (SongSingerType == "") { SongSingerType = "3"; } break; } } } } } // 查看檔案名稱中有無歌手類別 if (SingerTypeKeyWordList.IndexOf(splitstr) >= 0) { SongSingerType = GetSongInfo("SongSingerType", splitstr); SongSingerTypeStr = splitstr; } // 括號字串處理 MatchCollection matches = Regex.Matches(splitstr, @"[\{\(\[{([【].+?[】])}\]\)\}]", RegexOptions.IgnoreCase); if (matches.Count > 0) { foreach (Match match in matches) // 比對括號內字串 { string MatchStr = Regex.Replace(match.Value, @"^[\{\(\[{([【]|[】])}\]\)\}]$", "", RegexOptions.IgnoreCase); if (MatchStr.ContainsAny("_", "-")) // 括號字串有分隔符號 { List <string> BracketStrlist = new List <string>(Regex.Split(MatchStr, SeparateStr, RegexOptions.None)); string FileNameRemoveStr = ""; string BracketSeparateStr = (MatchStr.Contains("_")) ? "_" : "-"; foreach (string BracketStr in BracketStrlist) { if (SongLangKeyWordList.IndexOf(BracketStr) >= 0) { SongLang = GetSongInfo("SongLang", BracketStr); FileNameRemoveStr += ((BracketStrlist.IndexOf(BracketStr) == 0) ? BracketStr : BracketSeparateStr + BracketStr); } else if (SongTrackKeyWordList.IndexOf(BracketStr.ToLower()) >= 0 || BracketStr.ToLower() == "l" || BracketStr.ToLower() == "r") { SongTrack = GetSongInfo("SongTrack", BracketStr.ToLower()); FileNameRemoveStr += ((BracketStrlist.IndexOf(BracketStr) == 0) ? BracketStr : BracketSeparateStr + BracketStr); } else if (SongSongTypeLowCaseList.IndexOf(BracketStr.ToLower()) >= 0) { SongSongType = SongSongTypeList[SongSongTypeLowCaseList.IndexOf(BracketStr.ToLower())]; FileNameRemoveStr += ((BracketStrlist.IndexOf(BracketStr) == 0) ? BracketStr : BracketSeparateStr + BracketStr); } else if (BracketStr.ContainsAny("合唱", "對唱")) { SongSingerType = "3"; } } if (FileNameRemoveStr != "") { FileNameRemoveList.Add(FileNameRemoveStr); } } else // 括號字串無分隔符號 { if (SongLangKeyWordList.IndexOf(MatchStr) >= 0) { SongLang = GetSongInfo("SongLang", MatchStr); FileNameRemoveList.Add(MatchStr); } else if (SongTrackKeyWordList.IndexOf(MatchStr.ToLower()) >= 0 || MatchStr.ToLower() == "l" || MatchStr.ToLower() == "r") { SongTrack = GetSongInfo("SongTrack", MatchStr.ToLower()); FileNameRemoveList.Add(MatchStr); } else if (SongSongTypeLowCaseList.IndexOf(MatchStr.ToLower()) >= 0) { SongSongType = SongSongTypeList[SongSongTypeLowCaseList.IndexOf(MatchStr.ToLower())]; FileNameRemoveList.Add(MatchStr); } else if (MatchStr.ContainsAny("合唱", "對唱")) { SongSingerType = "3"; } } } } // 查看檔案名稱中有無語系類別 if (SongLang == "") { if (SongLangKeyWordList.IndexOf(splitstr) >= 0) { SongLang = GetSongInfo("SongLang", splitstr); SongLangStr = splitstr; } } // 查看檔案名稱中有無歌曲聲道 if (SongTrack == "") { if (SongTrackKeyWordList.IndexOf(splitstr.ToLower()) >= 0) { SongTrack = GetSongInfo("SongTrack", splitstr.ToLower()); SongTrackStr = splitstr; } } // 查看檔案名稱中有無歌曲類別 if (SongSongType == "") { if (SongSongTypeLowCaseList.IndexOf(splitstr.ToLower()) >= 0) { SongSongType = SongSongTypeList[SongSongTypeLowCaseList.IndexOf(splitstr.ToLower())]; SongSongTypeStr = splitstr; } } } SongSongTypeList.Clear(); SongSongTypeLowCaseList.Clear(); list.Clear(); string DirStr = Path.GetDirectoryName(file); List <string> DirStrRemoveList = new List <string>(); if (SongSingerType == "" || SongSinger == "" || SongLang == "") { list = new List <string>(Regex.Split(DirStr, @"\\", RegexOptions.None)); foreach (string str in list) { if (SongSingerType != "" && SongSinger != "" && SongLang != "") { break; } string splitstr = Regex.Replace(str, @"%%|^\s*|\s*$", ""); // 查看資料夾名稱中有無歌手 if (SongSinger == "") { if (SingerDataLowCaseList.IndexOf(splitstr.ToLower()) >= 0 && Global.SongAddSongIdentificationMode == "1") { SongSinger = SingerDataList[SingerDataLowCaseList.IndexOf(splitstr.ToLower())]; if (SongSingerType == "") { SongSingerType = SingerDataTypeList[SingerDataLowCaseList.IndexOf(splitstr.ToLower())]; } } else { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(splitstr.ToLower())) { string[] singers = Regex.Split(splitstr.ToLower(), "[&+]", RegexOptions.None); foreach (string singer in singers) { string SingerName = Regex.Replace(singer, @"^\s*|\s*$", ""); //去除頭尾空白 if (SingerDataLowCaseList.IndexOf(SingerName.ToLower()) >= 0) { SongSinger = splitstr; if (SongSingerType == "") { SongSingerType = "3"; } break; } } } } } // 查看資料夾名稱中有無歌手類別 if (SingerTypeKeyWordList.IndexOf(splitstr) >= 0) { if (SongSingerType == "") { SongSingerType = GetSongInfo("SongSingerType", splitstr); } DirStrRemoveList.Add(str); } // 查看資料夾名稱中有無語系類別 if (SongLangKeyWordList.IndexOf(splitstr) >= 0) { if (SongLang == "") { SongLang = GetSongInfo("SongLang", splitstr); } DirStrRemoveList.Add(str); } } list.Clear(); } if (DirStrRemoveList.Count > 0) { foreach (string RemoveStr in DirStrRemoveList) { DirStr = Regex.Replace(DirStr, @"\\?" + RemoveStr, ""); } } // 套用預設歌曲聲道 if (SongTrack == "") { if (Global.SongAddDefaultSongTrack == "6") { var task = Task.Factory.StartNew(() => CommonFunc.AutoDetectSongTrack(SongSrcPath)); SongTrack = task.Result; } else { SongTrack = Global.SongAddDefaultSongTrack; } } // 套用預設歌曲類別 if (SongSongType == "") { string str = ""; if (Global.SongMgrSongType != "") { str = "無類別," + Global.SongMgrSongType; } else { str = "無類別"; } list = new List <string>(str.Split(',')); if (list[int.Parse(Global.SongAddDefaultSongType) - 1] == "無類別") { SongSongType = ""; } else { SongSongType = list[int.Parse(Global.SongAddDefaultSongType) - 1]; } list.Clear(); } // 套用預設歌曲音量 if (SongVolume == "") { SongVolume = Global.SongAddDefaultSongVolume; } // 判斷歌手及歌曲名稱 if (SongSongName == "") { list = new List <string>() { SongLangStr, SongSingerTypeStr, SongTrackStr, SongSongTypeStr }; string str = FileStr; foreach (string s in list) { str = Regex.Replace(str, "^" + s + "[_-]|[_-]" + s + "[_-]|[_-]" + s + "$", "_", RegexOptions.IgnoreCase); str = Regex.Replace(str, "^[_-]|[_-]$", "", RegexOptions.IgnoreCase); } list.Clear(); // 去除括號內要移除的字串 if (FileNameRemoveList.Count > 0) { foreach (string RemoveStr in FileNameRemoveList) { str = Regex.Replace(str, @"([\{\(\[{([【](.+)?)" + RemoveStr + @"([】])}\]\)\}])", "$1$3", RegexOptions.IgnoreCase); str = Regex.Replace(str, @"[\{\(\[{([【]" + @"[】])}\]\)\}]", "", RegexOptions.IgnoreCase); } } FileNameRemoveList.Clear(); list = new List <string>(Regex.Split(str, SeparateStr, RegexOptions.None)); switch (Global.SongAddSongIdentificationMode) { case "1": switch (list.Count) // 智能辨識模式 { case 1: if (SongSinger == "") { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(Path.GetFileName(DirStr))) { SongSingerType = "3"; } SongSinger = Regex.Replace(Path.GetFileName(DirStr), @"%%|^\s*|\s*$", ""); } SongSongName = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); break; case 2: if (SongSinger == "") // 未找到歌手 { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(list[0])) { SongSingerType = "3"; } SongSinger = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); SongSongName = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); } else // 已找到歌手 { if (SongSinger.ToLower() == Regex.Replace(list[0], @"%%|^\s*|\s*$", "").ToLower()) { SongSongName = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); } else { SongSongName = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); } } break; default: if (SongSinger == "") // 未找到歌手 { if (CommonFunc.IsSongId(list[0])) { SongID = list[0]; Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(list[1])) { SongSingerType = "3"; } SongSinger = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); SongSongName = Regex.Replace(list[2], @"%%|^\s*|\s*$", ""); } else { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(list[0])) { SongSingerType = "3"; } SongSinger = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); SongSongName = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); } } else // 已找到歌手 { if (CommonFunc.IsSongId(list[0])) { SongID = list[0]; if (SongSinger.ToLower() == Regex.Replace(list[1], @"%%|^\s*|\s*$", "").ToLower()) { SongSongName = Regex.Replace(list[2], @"%%|^\s*|\s*$", ""); } else { SongSongName = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); } } else // List[0] 不是歌曲編號 { if (SongSinger.ToLower() == Regex.Replace(list[0], @"%%|^\s*|\s*$", "").ToLower()) { SongSongName = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); } else { SongSongName = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); } } } break; } break; case "2": case "3": switch (list.Count) // 歌手_歌名 & 歌名_歌手 { case 1: if (SongSinger == "") { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(Path.GetFileName(DirStr))) { SongSingerType = "3"; } SongSinger = Regex.Replace(Path.GetFileName(DirStr), @"%%|^\s*|\s*$", ""); } SongSongName = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); break; default: if (SongSinger == "") // 未找到歌手 { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); switch (Global.SongAddSongIdentificationMode) { case "2": if (r.IsMatch(list[0])) { SongSingerType = "3"; } SongSinger = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); SongSongName = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); break; case "3": if (r.IsMatch(list[1])) { SongSingerType = "3"; } SongSinger = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); SongSongName = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); break; } } else // 已找到歌手 { if (SongSinger.ToLower() == Regex.Replace(list[0], @"%%|^\s*|\s*$", "").ToLower()) { SongSongName = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); } else { SongSongName = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); } } break; } break; case "4": switch (list.Count) { case 1: if (SongSinger == "") { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(Path.GetFileName(DirStr))) { SongSingerType = "3"; } SongSinger = Regex.Replace(Path.GetFileName(DirStr), @"%%|^\s*|\s*$", ""); } SongSongName = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); break; case 2: if (SongSinger == "") { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(list[0])) { SongSingerType = "3"; } SongSinger = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); SongSongName = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); } else { if (SongSinger.ToLower() == Regex.Replace(list[0], @"%%|^\s*|\s*$", "").ToLower()) { SongSongName = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); } else { SongSongName = Regex.Replace(list[0], @"%%|^\s*|\s*$", ""); } } break; default: if (CommonFunc.IsSongId(list[0])) { SongID = list[0]; } if (SongSinger == "") { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(list[1])) { SongSingerType = "3"; } SongSinger = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); SongSongName = Regex.Replace(list[2], @"%%|^\s*|\s*$", ""); } else { if (SongSinger.ToLower() == Regex.Replace(list[1], @"%%|^\s*|\s*$", "").ToLower()) { SongSongName = Regex.Replace(list[2], @"%%|^\s*|\s*$", ""); } else { SongSongName = Regex.Replace(list[1], @"%%|^\s*|\s*$", ""); } } break; } break; } list.Clear(); } // 問題歌曲處理 if (Global.SongAnalysisExceptionSingerList.IndexOf(SongSinger) >= 0) { int i = Global.SongAnalysisExceptionSingerList.IndexOf(SongSinger); switch (SongSinger) { case "台灣女孩": if (SongSongName == "羅百吉&寶貝") { if (FileStr.ContainsAll(Global.SongAnalysisExceptionSongList[i].Split('|'))) { SongLang = "國語"; SongSinger = "羅百吉&寶貝"; SongSongName = "台灣女孩"; SongSingerType = "3"; } } break; case "梁靜茹": case "張懸": if (SongLang == "兒歌") { if (FileStr.ContainsAll(Global.SongAnalysisExceptionSongList[i].Split('|'))) { SongLang = "國語"; SongSongName = "兒歌"; } } break; case "莫文蔚": if (SongLang == "台語") { if (FileStr.ContainsAll(Global.SongAnalysisExceptionSongList[i].Split('|'))) { SongLang = "國語"; SongSongName = "台"; } } break; } } // 套用預設歌手類別 if (SongSingerType == "") { string str = CommonFunc.GetSingerTypeStr(int.Parse(Global.SongAddDefaultSingerType) - 1, 3, "null"); SongSingerType = CommonFunc.GetSingerTypeStr(0, 1, str); } // 統一資料庫中合唱歌手分隔符號 if (SongSingerType == "3") { Regex r = new Regex("[&+](?=(?:[^%]*%%[^%]*%%)*(?![^%]*%%))"); if (r.IsMatch(SongSinger)) { SongSinger = Regex.Replace(SongSinger, "[&+]", "&", RegexOptions.IgnoreCase); } } // 套用預設語系類別 if (SongLang == "") { SongLang = CommonFunc.GetSongLangStr(int.Parse(Global.SongAddDefaultSongLang) - 1, 0, "null"); int SongDataIndex = CommonFunc.MatchCashboxSongLang(SongSinger, SongSongName, SongSingerType); if (SongDataIndex >= 0) { string CashboxSongDataLang = Global.CashboxSongDataLangList[SongDataIndex]; if (Global.CrazyktvSongLangList.IndexOf(CashboxSongDataLang) >= 0) { SongLang = Global.CrazyktvSongLangList[Global.CrazyktvSongLangList.IndexOf(CashboxSongDataLang)]; } } } // 計算歌曲字數 List <string> SongWordCountList = new List <string>(); SongWordCountList = CommonFunc.GetSongWordCount(SongSongName); SongWordCount = SongWordCountList[0]; if (Global.SongAddEngSongNameFormat == "True") { if (SongWordCountList[1] == "True") { TextInfo ti = new CultureInfo("en-US", false).TextInfo; SongSongName = ti.ToTitleCase(SongSongName.ToLower()); } } // 點播次數初始值 SongPlayCount = "0"; // 計算歌曲大小 FileInfo f = new FileInfo(file); SongMB = float.Parse(((f.Length / 1024f) / 1024f).ToString("F2")); // 取得加歌日期 SongCreatDate = DateTime.Now; // 取得歌曲拼音 List <string> SongSpellList = new List <string>(); SongSpellList = CommonFunc.GetSongNameSpell(SongSongName); SongSpell = SongSpellList[0]; SongSpellNum = SongSpellList[1]; if (SongSpellList[2] == "") { SongSpellList[2] = "0"; } SongSongStroke = SongSpellList[2]; SongPenStyle = SongSpellList[3]; // 播放狀態初始值 SongPlayState = "0"; // 排序索引 if (SongLang == "未知") { SongSortIndex = "1"; } if (SongSortIndex == "") { if (SongSingerType == "10") { SongSortIndex = "2"; } } if (SongSortIndex == "") { if (SongID != "") { SongSortIndex = "3"; } } if (SongSortIndex == "") { SongSortIndex = "4"; } // 加歌狀態 if (SongLang == "未知") { SongAddStatus = "語系類別必須有值才能加歌!"; } if (SongAddStatus == "") { if (SongSingerType == "10") { SongAddStatus = "此歌手尚未設定歌手資料!"; } } // 歌庫監視 if (Global.SongMgrSongAddMode == "4") { if (SongLang == "未知") { Global.SongLogDT.Rows.Add(Global.SongLogDT.NewRow()); Global.SongLogDT.Rows[Global.SongLogDT.Rows.Count - 1][0] = "【歌庫監視】檔案結構中須有語系類別資訊才能加歌: " + SongSrcPath; Global.SongLogDT.Rows[Global.SongLogDT.Rows.Count - 1][1] = Global.SongLogDT.Rows.Count; } else { CreateDataRow(SongAddStatus, SongID, SongLang, SongSingerType, SongSinger, SongSongName, SongTrack, SongSongType, SongVolume, SongWordCount, SongPlayCount, SongMB, SongCreatDate, SongSpell, SongSpellNum, SongSongStroke, SongPenStyle, SongPlayState, SongSrcPath, SongSortIndex); } } else { CreateDataRow(SongAddStatus, SongID, SongLang, SongSingerType, SongSinger, SongSongName, SongTrack, SongSongType, SongVolume, SongWordCount, SongPlayCount, SongMB, SongCreatDate, SongSpell, SongSpellNum, SongSongStroke, SongPenStyle, SongPlayState, SongSrcPath, SongSortIndex); } }