public static List <Subtitle> Match(string file, params string[] languages) { try { OpenSubtitlesDownloader sd = new OpenSubtitlesDownloader(); SearchQuery sq = new SearchQuery(@""); sq.LanguageCodes = languages; sq.FileSize = (int)new FileInfo(file).Length; sq.FileHash = FileUtils.HexadecimalHash(file); var found = sd.SearchSubtitles(sq); return(found); } catch { return(new List <Subtitle>()); } }
private void SubtitleDownloadWorker_DoWork(object sender, DoWorkEventArgs e) { // default language is English string languageCode = "eng"; if (_languages.LanguagePairs.ContainsKey(languageText)) { languageCode = _languages.LanguagePairs[languageText]; } this.Invoke((MethodInvoker) delegate() { LogEvent("Starting to search for subtitles."); LogEvent(String.Format("Searching subtitles in {0} ({1})", languageText, languageCode)); }); // search for each file in the list for (int i = 0; i < _filePathsList.Count; i++) { if (_stopDownload) { break; } this.Invoke((MethodInvoker) delegate() { LogEvent(String.Format("Sleeping for {0}", IntervalEdit.Value)); Thread.Sleep(Convert.ToInt32(IntervalEdit.Value)); }); // will be used to update interface string filePath = _filePathsList[i]; ListViewItem listItem = new ListViewItem(); this.Invoke(method : (MethodInvoker) delegate() { LogEvent(String.Format("Searching for {0}", Path.GetFileName(filePath))); _progressMessage = "Searching..."; listItem = FileList.Items[i]; listItem.SubItems[3].Text = _progressMessage; listItem.EnsureVisible(); listItem.Selected = true; }); try { // search for the subtitle using file name and language code var downloader = new OpenSubtitlesDownloader(); SearchQuery searchQuery = new SearchQuery(Path.GetFileName(filePath)) { LanguageCodes = new string[] { languageCode } }; List <Subtitle> results = downloader.SearchSubtitles(searchQuery); // update UI about the found subtitles this.Invoke((MethodInvoker) delegate() { LogEvent(String.Format("Found for {0} subtitles for {1}", results.Count, Path.GetFileName(filePath))); _progressMessage = string.Format("Found {0}", results.Count); listItem.SubItems[3].Text = _progressMessage; listItem.EnsureVisible(); listItem.Selected = true; }); if (results.Count > 0 && !_stopDownload) { this.Invoke((MethodInvoker) delegate() { LogEvent("Downloading subtitle..."); _progressMessage = "Downloading"; listItem.SubItems[3].Text = _progressMessage; }); // download the first subtitle found Subtitle subtitle = results[0]; List <FileInfo> subtitleFiles = downloader.SaveSubtitle(subtitle); FileInfo subtitleFile = subtitleFiles[0]; // save subtitle with the same name as the video file string outputSubtitleFilePath = GenerateSubtitleFileName(filePath, Path.GetExtension(subtitleFile.FullName)); if (AlternateDownloadLocationBtn.Checked) { } else { // if user selects to skip when a subtitle is present // just log it. // otherwise, delete existing subtitle file and replace // it with newly downloaded one. if (SkipExistingSubBtn.Checked) { if (!File.Exists(outputSubtitleFilePath)) { File.Move(subtitleFile.FullName, outputSubtitleFilePath); LogEvent(String.Format("Saved to {0}", outputSubtitleFilePath)); // update interface _successCounter++; this.Invoke((MethodInvoker) delegate() { LogEvent(String.Format("Dowloaded for subtitle for {0}", Path.GetFileName(filePath))); _progressMessage = "Downloaded"; listItem.SubItems[3].Text = _progressMessage; ScoreLabel.Text = String.Format("Success: {0} / Fail: {1} / Processed: {2} / Total: {3}", _successCounter, _failCounter, _failCounter + _successCounter, _filePathsList.Count); TotalProgressBar.Value = i + 1; listItem.Selected = false; }); Thread.Sleep(150); } else { // update interface _failCounter++; this.Invoke((MethodInvoker) delegate() { LogEvent(String.Format("{0} alread exists, skipped.", Path.GetFileName(outputSubtitleFilePath))); _progressMessage = "Skipped"; listItem.SubItems[3].Text = _progressMessage; ScoreLabel.Text = String.Format("Success: {0} / Fail: {1} / Processed: {2} / Total: {3}", _successCounter, _failCounter, _failCounter + _successCounter, _filePathsList.Count); TotalProgressBar.Value = i + 1; listItem.Selected = false; }); Thread.Sleep(150); continue; } } else { if (File.Exists(outputSubtitleFilePath)) { try { File.Delete(outputSubtitleFilePath); } catch (Exception ex) { LogEvent("Error: " + ex.Message); } } File.Move(subtitleFile.FullName, outputSubtitleFilePath); LogEvent(String.Format("Saved to {0}", outputSubtitleFilePath)); } } // update interface _successCounter++; this.Invoke((MethodInvoker) delegate() { LogEvent(String.Format("Dowloaded for subtitle for {0}", Path.GetFileName(filePath))); _progressMessage = "Downloaded"; listItem.SubItems[3].Text = _progressMessage; ScoreLabel.Text = String.Format("Success: {0} / Fail: {1} / Processed: {2} / Total: {3}", _successCounter, _failCounter, _failCounter + _successCounter, _filePathsList.Count); TotalProgressBar.Value = i + 1; listItem.Selected = false; }); Thread.Sleep(150); } else { // update interface _failCounter++; this.Invoke((MethodInvoker) delegate() { LogEvent(String.Format("Could not find any subtitles for {0}", Path.GetFileName(filePath))); _progressMessage = "Could not find"; listItem.SubItems[3].Text = _progressMessage; ScoreLabel.Text = String.Format("Success: {0} / Fail: {1} / Processed: {2} / Total: {3}", _successCounter, _failCounter, _failCounter + _successCounter, _filePathsList.Count); TotalProgressBar.Value = i + 1; listItem.Selected = false; }); Thread.Sleep(150); } } catch (Exception ex) { // update interface _failCounter++; this.Invoke((MethodInvoker) delegate() { LogEvent(String.Format("Error: {0}", ex.Message)); _progressMessage = "Error"; listItem.SubItems[3].Text = _progressMessage; ScoreLabel.Text = String.Format("Success: {0} / Fail: {1} / Processed: {2} / Total: {3}", _successCounter, _failCounter, _failCounter + _successCounter, _filePathsList.Count); TotalProgressBar.Value = i + 1; listItem.Selected = false; }); Thread.Sleep(150); } } // update interface this.Invoke((MethodInvoker) delegate() { ScoreLabel.Text = String.Format("Success: {0} / Fail: {1} / Processed: {2} / Total: {3}", _successCounter, _failCounter, _filePathsList.Count, _filePathsList.Count); EnableUi(); }); Thread.Sleep(200); }