Form1.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. namespace PicSo
  13. {
  14. public partial class Form1 : Form
  15. {
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. ListView.CheckForIllegalCrossThreadCalls = false;
  20. }
  21. private void Form1_Load(object sender, EventArgs e)
  22. {
  23. arzon = new Gets.Arzon(false);
  24. arzon.InitCompleted += arzon_InitCompleted;
  25. arzon.CookiesInit();
  26. var f = AVSORTER.FileProcessor.GetInstance();
  27. this.txt_Dest.Text = f.DestPath;
  28. this.txt_sub.Text = f.SubPath;
  29. }
  30. void arzon_InitCompleted(object sender, EventArgs e)
  31. {
  32. lbl_YouMaStatus.BackColor = Color.Green;
  33. }
  34. Gets.Arzon arzon;
  35. private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
  36. {
  37. }
  38. bool lastSort;
  39. private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
  40. {
  41. try
  42. {
  43. this.listView1.ListViewItemSorter = new ListViewColumnSorter(e.Column, !lastSort);
  44. lastSort = !lastSort;
  45. }
  46. catch (Exception)
  47. {
  48. }
  49. }
  50. private void textBox2_TextChanged(object sender, EventArgs e)
  51. {
  52. }
  53. private void btn_Clear_Click(object sender, EventArgs e)
  54. {
  55. this.listView1.Items.Clear();
  56. this.listView1.ListViewItemSorter = null;
  57. AVSORTER.FileProcessor.GetInstance().Files.Clear();
  58. }
  59. private void btn_removeItem_Click(object sender, EventArgs e)
  60. {
  61. while (this.listView1.SelectedItems.Count > 0)
  62. {
  63. this.listView1.Items.Remove(this.listView1.SelectedItems[0]);
  64. }
  65. }
  66. private void btn_brower_Click(object sender, EventArgs e)
  67. {
  68. FolderBrowserDialog fbd = new FolderBrowserDialog();
  69. if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  70. {
  71. var f = AVSORTER.FileProcessor.GetInstance();
  72. f.AddDirectory(fbd.SelectedPath);
  73. List<ListViewItem> li = new List<ListViewItem>();
  74. for (int i = 0; i < f.Files.Count; i++)
  75. {
  76. li.Add(new ListViewItem(f.Files[i]));
  77. }
  78. this.listView1.Items.AddRange(li.ToArray());
  79. }
  80. for (int i = 0; i < this.listView1.Items.Count; i++)
  81. {
  82. this.listView1.Items[i].SubItems.Add(AVSORTER.Tools.Fcode(Path.GetFileNameWithoutExtension(this.listView1.Items[i].Text)));
  83. this.listView1.Items[i].SubItems.Add("");
  84. }
  85. }
  86. void initFileProcessor()
  87. {
  88. var f = AVSORTER.FileProcessor.GetInstance();
  89. if (f != null)
  90. {
  91. f.DestPath = txt_Dest.Text;
  92. f.SubPath = txt_sub.Text;
  93. f.ShowLog = cb_IsShowlog.Checked;
  94. new AVSORTER.DB.AVDB().SetDestPath(f.DestPath);
  95. new AVSORTER.DB.AVDB().SetSubPath(f.SubPath);
  96. }
  97. }
  98. Semaphore sem1_bmovie = new Semaphore(2, 2);
  99. Semaphore sem2_movie = new Semaphore(2, 2);
  100. private void btn_GO_Click(object sender, EventArgs e)
  101. {
  102. //newGOGOGO();
  103. //return;
  104. foreach (ListViewItem item in listView1.Items)
  105. {
  106. var fi = new AVSORTER.SearchItem(item.SubItems[1].Text, arzon.Clone() as AVSORTER.IGetable);
  107. item.Tag = fi;
  108. fi.OnStatusChange += fi_OnStatusChange;
  109. fi.Tag = item;
  110. fi.IsAutoSelect = cb_AutoSelect.Checked;
  111. fi.IsDownloadCover = cb_isCoverDownload.Checked;
  112. //等一个许可信号
  113. fi.OnAboutToLoadInfo += Fi_OnAboutToLoadInfo;
  114. //释放放一个许可
  115. fi.OnCompletedLoadInfo += Fi_OnCompletedLoadInfo;
  116. fi.OnAboutToLoadImage += Fi_OnAboutToLoadImage;
  117. fi.OnCompletedLoadImage += Fi_OnCompletedLoadImage;
  118. fi.StartQuery();
  119. }
  120. }
  121. private void newGOGOGO()
  122. {
  123. CancellationTokenSource tokenSource = new CancellationTokenSource();
  124. CancellationToken token = tokenSource.Token;
  125. Task<List<AVSORTER.MovieBasic>>[] tasks = new Task<List<AVSORTER.MovieBasic>>[listView1.Items.Count];
  126. int i = -1;
  127. foreach (ListViewItem item in listView1.Items)
  128. {
  129. i++;
  130. AVSORTER.IGetable getor = arzon.Clone() as AVSORTER.IGetable;
  131. tasks[i]= new Task<List<AVSORTER.MovieBasic>>(() => {
  132. return getor.Query(item.SubItems[1].Text);
  133. }, token);
  134. tasks[i].ContinueWith<AVSORTER.Movie>((mbasics) =>
  135. {
  136. if (mbasics.Result.Count == 1)
  137. {
  138. return getor.GetMovie(mbasics.Result[0]);
  139. }
  140. else
  141. {
  142. return null;
  143. }
  144. });
  145. tasks[i].Start();
  146. }
  147. }
  148. private void Fi_OnAboutToLoadImage(object sender, EventArgs e)
  149. {
  150. sem2_movie.WaitOne();
  151. }
  152. private void Fi_OnCompletedLoadImage(object sender, EventArgs e)
  153. {
  154. sem2_movie.Release();
  155. }
  156. private void Fi_OnCompletedLoadInfo(object sender, EventArgs e)
  157. {
  158. sem1_bmovie.Release();
  159. }
  160. private void Fi_OnAboutToLoadInfo(object sender, EventArgs e)
  161. {
  162. sem1_bmovie.WaitOne();
  163. }
  164. void fi_OnStatusChange(object sender, AVSORTER.SearchItem.StatusChangeEventArgs e)
  165. {
  166. ((sender as AVSORTER.SearchItem).Tag as ListViewItem).SubItems[2].Text = e.After.ToString();
  167. }
  168. private void UIParamChange(object sender, EventArgs e)
  169. {
  170. }
  171. private void listView1_SelectedIndexChanged(object sender, EventArgs e)
  172. {
  173. if (listView1.SelectedItems.Count == 1)
  174. {
  175. if (listView1.SelectedItems[0].Tag != null)
  176. {
  177. var si = (listView1.SelectedItems[0].Tag as AVSORTER.SearchItem);
  178. this.bc.ListMovieBasic = si.MovieBasicList;
  179. if (si.IsSelected)
  180. {
  181. this.bc.MovieB = si.SelectedMovieBasic;
  182. }
  183. else if (si.MovieBasicList != null && si.MovieBasicList.Count != 0)
  184. {
  185. this.bc.MovieB = si.MovieBasicList[0];
  186. }
  187. }
  188. }
  189. }
  190. private void btn_select_Click(object sender, EventArgs e)
  191. {
  192. if (listView1.SelectedItems.Count == 1)
  193. {
  194. if (listView1.SelectedItems[0].Tag != null)
  195. {
  196. (listView1.SelectedItems[0].Tag as AVSORTER.SearchItem).Select(this.bc.MovieB);
  197. }
  198. }
  199. }
  200. private void btn_MoveFile_Click(object sender, EventArgs e)
  201. {
  202. this.btn_MoveFile.Enabled = false;
  203. try
  204. {
  205. initFileProcessor();
  206. foreach (ListViewItem item in listView1.Items)
  207. {
  208. if ((item.Tag as AVSORTER.SearchItem).IsSelected == true)
  209. {
  210. if (item.Text != "No File")
  211. {
  212. AVSORTER.FileProcessor.GetInstance().MakeMove((item.Tag as AVSORTER.SearchItem).MovieDetail, item.Text);
  213. item.SubItems[2].Text = "移动成功!";
  214. }
  215. else
  216. {
  217. item.SubItems[2].Text = "未移动";
  218. }
  219. }
  220. else
  221. {
  222. item.SubItems[2].Text = "未指定对应影片信息";
  223. }
  224. }
  225. AVSORTER.FileProcessor.GetInstance().WriteLog();
  226. }
  227. catch (Exception err)
  228. {
  229. MessageBox.Show(err.Message);
  230. }
  231. finally
  232. {
  233. this.btn_MoveFile.Enabled = true;
  234. }
  235. }
  236. private void menu_BrowerFile_Click(object sender, EventArgs e)
  237. {
  238. if (listView1.SelectedItems.Count > 0)
  239. {
  240. System.Diagnostics.Process.Start("Explorer.exe", "/select, " + listView1.SelectedItems[0].Text);
  241. }
  242. }
  243. private void menu_ChangeFcode_Click(object sender, EventArgs e)
  244. {
  245. var inp = new InputBox();
  246. if (listView1.SelectedItems.Count > 0)
  247. {
  248. inp.InputText = listView1.SelectedItems[0].SubItems[1].Text;
  249. }
  250. if (inp.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  251. {
  252. listView1.SelectedItems[0].SubItems[1].Text = inp.InputText;
  253. }
  254. }
  255. private void menu_remove_Click(object sender, EventArgs e)
  256. {
  257. while (this.listView1.SelectedItems.Count > 0)
  258. {
  259. this.listView1.Items.Remove(this.listView1.SelectedItems[0]);
  260. }
  261. }
  262. private void listView1_DragDrop(object sender, DragEventArgs e)
  263. {
  264. if (e.Data.GetDataPresent(DataFormats.FileDrop) && e.Effect == DragDropEffects.Link)
  265. {
  266. var dd = e.Data.GetData(DataFormats.FileDrop);
  267. var f = AVSORTER.FileProcessor.GetInstance();
  268. this.txt_Dest.Text = f.DestPath;
  269. this.txt_sub.Text = f.SubPath;
  270. var arr = dd as string[];
  271. foreach (var item in arr)
  272. {
  273. f.AddDirectory(item);
  274. }
  275. List<ListViewItem> li = new List<ListViewItem>();
  276. for (int i = 0; i < f.Files.Count; i++)
  277. {
  278. var lsvi = new ListViewItem(f.Files[i]);
  279. lsvi.SubItems.Add(AVSORTER.Tools.Fcode(Path.GetFileNameWithoutExtension(f.Files[i])));
  280. lsvi.SubItems.Add("");
  281. li.Add(lsvi);
  282. }
  283. this.listView1.Items.Clear();
  284. this.listView1.Items.AddRange(li.ToArray());
  285. }
  286. }
  287. private void listView1_DragEnter(object sender, DragEventArgs e)
  288. {
  289. e.Effect = DragDropEffects.Link;
  290. }
  291. private void bc_Load(object sender, EventArgs e)
  292. {
  293. }
  294. private void groupBox1_Enter(object sender, EventArgs e)
  295. {
  296. }
  297. private void menu_BigCover_Click(object sender, EventArgs e)
  298. {
  299. if (this.listView1.SelectedItems.Count > 0)
  300. {
  301. var d = (listView1.SelectedItems[0].Tag as AVSORTER.SearchItem).MovieDetail;
  302. if (d != null)
  303. {
  304. System.Diagnostics.Process.Start(d.CoverFile);
  305. }
  306. }
  307. }
  308. private void btn_AddNewEmptyItem_Click(object sender, EventArgs e)
  309. {
  310. var li = new ListViewItem("No File");
  311. li.SubItems.Add(AVSORTER.Tools.Fcode(this.txt_EmptyItemKeyWord.Text));
  312. li.SubItems.Add("");
  313. this.listView1.Items.Add(li);
  314. }
  315. private void btn_paste_new_Click(object sender, EventArgs e)
  316. {
  317. if (Clipboard.ContainsText())
  318. {
  319. txt_EmptyItemKeyWord.Text = Clipboard.GetText();
  320. btn_AddNewEmptyItem_Click(this, new EventArgs());
  321. }
  322. }
  323. private void listView1_DoubleClick(object sender, EventArgs e)
  324. {
  325. if (this.listView1.SelectedItems.Count > 0)
  326. {
  327. var d = (listView1.SelectedItems[0].Tag as AVSORTER.SearchItem);
  328. if (d.MovieDetail != null && d != null && !string.IsNullOrEmpty(d.MovieDetail.CoverFile))
  329. {
  330. System.Diagnostics.Process.Start(d.MovieDetail.CoverFile);
  331. }
  332. }
  333. }
  334. private void btn_rebuild_Click(object sender, EventArgs e)
  335. {
  336. this.btn_MoveFile.Enabled = false;
  337. initFileProcessor();
  338. foreach (ListViewItem item in listView1.Items)
  339. {
  340. if ((item.Tag as AVSORTER.SearchItem).IsSelected == true)
  341. {
  342. if (item.Text != "No File")
  343. {
  344. AVSORTER.FileProcessor.GetInstance().MakeDataBase((item.Tag as AVSORTER.SearchItem).MovieDetail, item.Text);
  345. item.SubItems[2].Text = "成功!";
  346. }
  347. else
  348. {
  349. item.SubItems[2].Text = "未动";
  350. }
  351. }
  352. else
  353. {
  354. item.SubItems[2].Text = "未指定对应影片信息";
  355. }
  356. }
  357. AVSORTER.FileProcessor.GetInstance().WriteLog();
  358. this.btn_MoveFile.Enabled = true;
  359. }
  360. #region Page2
  361. private void btn_LocalSearch_Click(object sender, EventArgs e)
  362. {
  363. string fc = txt_LocalSearchKeyWord.Text;
  364. if (cb_AutoCorrect.Checked)
  365. {
  366. fc = AVSORTER.Tools.Fcode(txt_LocalSearchKeyWord.Text);
  367. txt_LocalSearchKeyWord.Text = fc;
  368. }
  369. var db = new AVSORTER.DB.AVDB();
  370. var l = db.QueryAV(fc);
  371. this.movieContainer1.MovieList = l;
  372. this.listBox1.DataSource = l;
  373. //this.listBox1.DisplayMember = string.Format("{0}:{1}", "AVCode", "Title");
  374. if (l.Count > 0)
  375. {
  376. this.movieContainer1.Movie = l[0];
  377. }
  378. }
  379. private void txt_LocalSearchKeyWord_KeyPress(object sender, KeyPressEventArgs e)
  380. {
  381. if (e.KeyChar == 13)
  382. {
  383. btn_LocalSearch_Click(sender, e);
  384. }
  385. }
  386. private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
  387. {
  388. if (this.listBox1.SelectedItems.Count > 0)
  389. {
  390. this.movieContainer1.Movie = (this.listBox1.SelectedItem as AVSORTER.Movie);
  391. }
  392. }
  393. #endregion
  394. #region Page3
  395. private void btnFind_Click(object sender, EventArgs e)
  396. {
  397. BackgroundWorker worker = new BackgroundWorker();
  398. worker.WorkerReportsProgress = true;
  399. worker.ProgressChanged += worker_ProgressChanged;
  400. worker.DoWork += worker_DoWork;
  401. worker.RunWorkerCompleted += worker_RunWorkerCompleted;
  402. worker.RunWorkerAsync(worker);
  403. }
  404. void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  405. {
  406. //throw new NotImplementedException();
  407. }
  408. void worker_DoWork(object sender, DoWorkEventArgs e)
  409. {
  410. var worker = (e.Argument as BackgroundWorker);
  411. List<AVSORTER.Movie> list = new List<AVSORTER.Movie>();
  412. var mvbs = arzon.FindInURL(txt_url.Text);
  413. worker.ReportProgress(0, "共找到影片:" + mvbs.Count.ToString());
  414. int no = 0;
  415. int totalNo = mvbs.Count;
  416. foreach (var mvb in mvbs)
  417. {
  418. var fi = arzon.Clone() as AVSORTER.IGetable;
  419. var mv = fi.GetMovie(mvb);
  420. no++;
  421. worker.ReportProgress(0, no.ToString() + "/" + totalNo.ToString());
  422. worker.ReportProgress(0, mv.AVCode + "\t" + mv.Title);
  423. if (mv.Actor != null && mv.Actor.Count <= nud_ActorLessThan.Value)
  424. {
  425. Gets.MyWebClient wc = new Gets.MyWebClient();
  426. wc.ReferURL = mvb.ItemURL;
  427. string fn = mvb.Title + ".jpg";
  428. fn = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SmallImageFindInURL", Path.ChangeExtension(fn, "jpg"));
  429. try
  430. {
  431. if (!Directory.Exists(Path.GetDirectoryName(fn)))
  432. {
  433. Directory.CreateDirectory(Path.GetDirectoryName(fn));
  434. }
  435. if (!File.Exists(fn))
  436. {
  437. wc.DownloadFile(mvb.Img_s, fn);
  438. }
  439. else
  440. {
  441. Console.WriteLine("已有封面" + fn);
  442. }
  443. worker.ReportProgress(0, mv.AVCode + "\t封面OK!");
  444. }
  445. catch
  446. { }
  447. mv.CoverFile = fn;
  448. list.Add(mv);
  449. }
  450. else
  451. {
  452. worker.ReportProgress(0, mv.AVCode + "\t演员人数超限制\t" + mv.Title);
  453. }
  454. }
  455. StringBuilder sb = new StringBuilder();
  456. foreach (AVSORTER.Movie item in list)
  457. {
  458. sb.Append("<div id = \"" + item.AVCode + "\" class = \"item\"><img src = \"" + item.CoverFile + "\" /><input type=\"checkbox\" />" + item.AVCode + "</div>");
  459. }
  460. var htmlResult = Properties.Resources.htmlResultStart + sb + Properties.Resources.htmlResultEnd;
  461. System.IO.File.WriteAllText("temp.html", htmlResult);
  462. System.Diagnostics.Process.Start("temp.html");
  463. }
  464. void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  465. {
  466. if (e.ProgressPercentage == 0)
  467. {
  468. txt_FindStatus.AppendText(e.UserState as string + "\r\n");
  469. }
  470. }
  471. #endregion
  472. #region Page4
  473. private void btn_p4_Go1_Click(object sender, EventArgs e)
  474. {
  475. lbl_p4_status.Visible = true;
  476. btn_p4_Go1.Enabled = false;
  477. btn_p4_Go1_paste.Enabled = false;
  478. BackgroundWorker workerP4 = new BackgroundWorker();
  479. workerP4.WorkerReportsProgress = true;
  480. workerP4.ProgressChanged += workerP4_ProgressChanged;
  481. workerP4.DoWork += workerP4_DoWork;
  482. workerP4.RunWorkerCompleted += workerP4_RunWorkerCompleted;
  483. workerP4.RunWorkerAsync();
  484. }
  485. void workerP4_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  486. {
  487. lbl_p4_status.Visible = false;
  488. btn_p4_Go1.Enabled = true;
  489. btn_p4_Go1_paste.Enabled = true;
  490. }
  491. /// <summary>
  492. /// torrentKitty
  493. /// </summary>
  494. /// <param name="sender"></param>
  495. /// <param name="e"></param>
  496. void workerP4_DoWork(object sender, DoWorkEventArgs e)
  497. {
  498. Gets.HttpHelper help = new Gets.HttpHelper(new System.Net.CookieContainer());
  499. var html = help.GetHtml("http://www.torrentkitty.net/search/" + txt_p4_keyword.Text.Trim());
  500. Console.WriteLine(html);
  501. HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
  502. doc.LoadHtml(html);
  503. if (doc.DocumentNode.SelectNodes("//table[@id='archiveResult']/tr") == null)
  504. {
  505. return;
  506. }
  507. int n = doc.DocumentNode.SelectNodes("//table[@id='archiveResult']/tr").Count;
  508. for (int i = 2; i < n; i++)
  509. {
  510. var name = doc.DocumentNode.SelectSingleNode("//table[@id='archiveResult']/tr[" + i + "]/td[@class='name']").InnerText;
  511. ListViewItem li = new ListViewItem(name);
  512. var size = doc.DocumentNode.SelectSingleNode("//table[@id='archiveResult']/tr[" + i + "]/td[@class='size']").InnerText;
  513. li.SubItems.Add(size);
  514. var link = doc.DocumentNode.SelectSingleNode("//table[@id='archiveResult']/tr[" + i + "]/td[@class='action']/a[2]").Attributes["href"].Value;
  515. li.SubItems.Add(link);
  516. lv_p4_result.Items.Add(li);
  517. }
  518. lv_p4_result.Items.Add(new ListViewItem("====="));
  519. }
  520. void workerP4_ProgressChanged(object sender, ProgressChangedEventArgs e)
  521. {
  522. }
  523. private void cmenu_p4_item_copy_Click(object sender, EventArgs e)
  524. {
  525. if (lv_p4_result.SelectedItems.Count==1)
  526. {
  527. var link= lv_p4_result.SelectedItems[0].SubItems[2].Text;
  528. Clipboard.SetText(link);
  529. }
  530. }
  531. private void btn_p4_Clear_Click(object sender, EventArgs e)
  532. {
  533. lv_p4_result.Items.Clear();
  534. }
  535. private void btn_p4_Go1_paste_Click(object sender, EventArgs e)
  536. {
  537. if (Clipboard.ContainsText())
  538. {
  539. txt_p4_keyword.Text = Clipboard.GetText();
  540. btn_p4_Go1_Click(this, new EventArgs());
  541. }
  542. }
  543. #endregion
  544. }
  545. }