/*============================================================== * 根据条件查找数据 *==============================================================*/ internal void do_search() { DATA.m_s_lock.EnterReadLock(); if (DATA.m_s_all_subs.Count == 0) { DATA.m_s_lock.ExitReadLock(); if (!m_UpdateDatabase.m_is_updating_database) { if (MessageBox.Show(LANGUAGES.txt(26), // 本地没有任何数据,是否要下载最新的字幕索引? $"{COMMON.m_k_PROGRAM_NAME} {COMMON.m_k_VERSION}", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { FORMS.active_form(m_UpdateDatabase); m_UpdateDatabase.radioButton_UseRemoteData.Checked = true; m_UpdateDatabase.PictureBox_Start_Click(null, null); } } return; } if (textBox_Filter.TextLength == 0) { m_DataGridView_event_enable = false; dataGridView_Main.DataSource = DATA.m_s_dt; update_columns_style(); m_DataGridView_event_enable = true; } else { string filter_string; if (radioButton_SearchByName.Checked) { StringBuilder sb = new StringBuilder(); string fix_Name_chs = SQL.fix_string(ChineseConverter.Convert(textBox_Filter.Text, ChineseConversionDirection.TraditionalToSimplified)); string fix_Name_cht = SQL.fix_string(ChineseConverter.Convert(textBox_Filter.Text, ChineseConversionDirection.SimplifiedToTraditional)); sb.Append($"[name_chs] like '%{fix_Name_chs}%' or [name_chs] like '%{fix_Name_cht}%' or "); sb.Append($"[name_cht] like '%{fix_Name_chs}%' or [name_cht] like '%{fix_Name_cht}%' or "); sb.Append($"[name_jp] like '%{fix_Name_chs}%' or [name_jp] like '%{fix_Name_cht}%' or "); sb.Append($"[name_en] like '%{fix_Name_chs}%' or "); sb.Append($"[name_rome] like '%{fix_Name_chs}%'"); filter_string = sb.ToString(); } else { filter_string = textBox_Filter.Text; } try { DataRow[] dr_list = DATA.m_s_dt.Select(filter_string); DATA.m_s_dt_search.Rows.Clear(); foreach (DataRow dr in dr_list) { DataRow dr_tmp = DATA.m_s_dt_search.NewRow(); for (int i = 0; i < DATA.m_s_dt_search.Columns.Count; ++i) { dr_tmp[i] = dr[i]; } DATA.m_s_dt_search.Rows.Add(dr_tmp); } m_DataGridView_event_enable = false; dataGridView_Main.DataSource = DATA.m_s_dt_search; update_columns_style(); m_DataGridView_event_enable = true; } catch (Exception ex) { MessageBox.Show(ex.Message); } } DATA.m_s_lock.ExitReadLock(); update_status(); }
/*============================================================== * 关于 *==============================================================*/ private void ToolStripButton_About_Click(object sender, EventArgs e) { FORMS.active_form(m_About); }
/*============================================================== * 更新数据库 *==============================================================*/ private void ToolStripButton_UpdateDB_Click(object sender, EventArgs e) { FORMS.active_form(m_UpdateDatabase); }
/*============================================================== * 设置 *==============================================================*/ private void ToolStripButton_Settings_Click(object sender, EventArgs e) { FORMS.active_form(m_Setting); }
/*============================================================== * 执行更新数据库的线程 *==============================================================*/ void update_db_thread() { if (!Directory.Exists(CONFIG.m_s_subs_path)) { FORMS.invoke(() => { append_log($"{LANGUAGES.txt(56)} {CONFIG.m_s_subs_path}", // 找不到本地字幕路径 Color.Red); lock_controls(true); }); m_is_updating_database = false; return; } m_sw.Restart(); long can_refresh_UI_tick = 0; DATA.m_s_lock.EnterWriteLock(); DATA.m_s_all_subs.Clear(); SortedSet <string> source_list = new SortedSet <string>(); FORMS.invoke(() => { frm_Mainform.m_s_mainform.m_Search.comboBox_Type.Items.Clear(); frm_Mainform.m_s_mainform.m_Search.comboBox_Type.Items.Add(""); frm_Mainform.m_s_mainform.m_Search.comboBox_Source.Items.Clear(); COMMON.SetProgressValue(0); }); string[] dirs_type = Directory.GetDirectories(CONFIG.m_s_subs_path, "*.*", SearchOption.TopDirectoryOnly); foreach (string dir_type in dirs_type) { FORMS.invoke(() => { frm_Mainform.m_s_mainform.m_Search.comboBox_Type.Items.Add(Path.GetFileName(dir_type)); }); string[] dirs_year = Directory.GetDirectories(dir_type, "*.*", SearchOption.TopDirectoryOnly); for (int i_year = 0; i_year < dirs_year.Length; ++i_year) { string dir_year = dirs_year[i_year]; string[] dirs_video = Directory.GetDirectories(dir_year, "*.*", SearchOption.TopDirectoryOnly); for (int i_video = 0; i_video < dirs_video.Length; ++i_video) { string dir_video = dirs_video[i_video]; // 路径 string path = dir_video.Substring(CONFIG.m_s_subs_path.Length + 1).Replace("\\", "/"); FORMS.invoke(() => { label_Log.Text = dir_video; }); // 日期 string name_tmp = Path.GetFileName(dir_video); int idx = name_tmp.IndexOf(")"); string[] date_vals = name_tmp.Substring(1, idx - 1).Split('.'); int year = int.Parse(date_vals[0]); int month = (date_vals.Length >= 2) ? int.Parse(date_vals[1]) : 1; int day = (date_vals.Length >= 3) ? int.Parse(date_vals[2]) : 1; DateTime date = new DateTime(year, month, day); // 番名 //string name_chs = name_tmp.Substring(idx + 1); string name_chs = ""; string name_cht = ""; string name_jp = ""; string name_en = ""; string name_rome = ""; // 读取 info.txt string info_filename = Path.Combine(dir_video, "info.txt"); if (File.Exists(info_filename)) { string[] lines = File.ReadAllLines(info_filename, Encoding.UTF8); foreach (string line in lines) { if (line.Length < 2) { continue; } if (line[0] == '/' && line[1] == '/') { continue; } idx = line.IndexOf(":"); if (idx < 0) { continue; } string w1 = line.Substring(0, idx).Trim().ToLower(); string w2 = line.Substring(idx + 1).Trim(); if (w1 == "chs") { name_chs = w2.Trim(); continue; } if (w1 == "cht") { name_cht = w2.Trim(); continue; } if (w1 == "jp") { name_jp = w2.Trim(); continue; } if (w1 == "en") { name_en = w2.Trim(); continue; } if (w1 == "rome") { name_rome = w2.Trim(); continue; } } // for } string[] dirs_source = Directory.GetDirectories(dir_video, "*.*", SearchOption.TopDirectoryOnly); foreach (string dir_source in dirs_source) { source_list.Add(Path.GetFileName(dir_source)); string[] dirs_sub_name = Directory.GetDirectories(dir_source, "*.*", SearchOption.TopDirectoryOnly); foreach (string dir_sub_name in dirs_sub_name) { if (m_is_stopping) { return; } string providers = ""; // 字幕组/提供者 string desc = ""; // 字幕说明 // 后缀名 SortedSet <string> extension_list = new SortedSet <string>(); string[] files = Directory.GetFiles(dir_sub_name, "*.*", SearchOption.TopDirectoryOnly); foreach (string file in files) { string extension = Path.GetExtension(file).ToLower(); extension_list.Add(extension); } // for files // xxx.txt string desc_filename = dir_sub_name + ".txt"; if (File.Exists(desc_filename)) { string file_txt = File.ReadAllText(desc_filename, Encoding.UTF8); idx = file_txt.IndexOf("desc:", StringComparison.CurrentCultureIgnoreCase); if (idx > 0) { desc = file_txt.Substring(idx + 5).Trim(); } string[] lines = File.ReadAllLines(desc_filename, Encoding.UTF8); foreach (string line in lines) { if (line.Length < 2) { continue; } if (line[0] == '/' && line[1] == '/') { continue; } idx = line.IndexOf(":"); if (idx < 0) { continue; } string w1 = line.Substring(0, idx).Trim().ToLower(); string w2 = line.Substring(idx + 1).Trim(); if (w1 == "providers") { providers = w2.Trim(); break; } } // for } DATA.c_SubInfo sub_info = new DATA.c_SubInfo(); DATA.m_s_all_subs.Add(sub_info); sub_info.m_name_chs = name_chs; sub_info.m_name_cht = name_cht; sub_info.m_name_jp = name_jp; sub_info.m_name_en = name_en; sub_info.m_name_rome = name_rome; sub_info.m_time = date; sub_info.m_type = Path.GetFileName(dir_type); sub_info.m_source = Path.GetFileName(dir_source); sub_info.m_sub_name = Path.GetFileName(dir_sub_name); foreach (string extension in extension_list) { if (sub_info.m_extension.Length > 0) { sub_info.m_extension += ";"; } sub_info.m_extension += extension; } sub_info.m_providers = providers; sub_info.m_desc = desc; sub_info.m_path = path; } // for dirs_sub_name } // for dirs_source // 进度条 int progress_value = COMMON.m_k_MAX_PROGRESS_VALUE * i_year / dirs_year.Length + COMMON.m_k_MAX_PROGRESS_VALUE * (i_video + 1) / (dirs_year.Length * dirs_video.Length); COMMON.SetProgressValue(progress_value); } // for dirs_video if (can_refresh_UI_tick <= m_sw.ElapsedMilliseconds) { can_refresh_UI_tick = m_sw.ElapsedMilliseconds + 50; // 50ms 刷新一次界面 Application.DoEvents(); } } // for dirs_year } // for dirs_type FORMS.invoke(() => { foreach (string source in source_list) { frm_Mainform.m_s_mainform.m_Search.comboBox_Source.Items.Add(source); } COMMON.SetProgressValue(0); }); DATA.m_s_lock.ExitWriteLock(); FORMS.invoke(() => { m_sw.Stop(); CONFIG.m_s_last_updata_db_time = DateTime.Now; CONFIG.write_config(); lock_controls(true); DATA.data2dt(); append_log(string.Format(LANGUAGES.txt(61), // 正在把数据写入到文件 {0:s} ... PATH.m_k_DB_FILENAME)); DATA.m_s_dt.WriteXml(PATH.m_k_DB_FILENAME); if (m_is_stopping) { append_log(string.Format(LANGUAGES.txt(57) + LANGUAGES.txt(60), // 用户停止更新数据库(合计 {0:d} 条数据,耗时 {1:s}) DATA.m_s_all_subs.Count, m_sw.Elapsed.ToString()), Color.Blue); } else { append_log(string.Format(LANGUAGES.txt(58) + LANGUAGES.txt(60), // 更新数据库完成(合计 {0:d} 条数据,耗时 {1:s}) DATA.m_s_all_subs.Count, m_sw.Elapsed.ToString()), Color.Green); } frm_Mainform.m_s_mainform.m_DataGridView_event_enable = false; frm_Mainform.m_s_mainform.dataGridView_Main.DataSource = DATA.m_s_dt; frm_Mainform.m_s_mainform.update_columns_style(); frm_Mainform.m_s_mainform.m_DataGridView_event_enable = true; frm_Mainform.m_s_mainform.update_status(); m_is_stopping = false; }); m_is_updating_database = false; }