示例#1
0
 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>());
     }
 }
示例#2
0
        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);
        }