示例#1
0
    def test_language(self):
        with create_temporary_file() as f:
            f.file.close()
            s1 = Settings(f.name)
            s1.set_language(('section3', 'langprop'), Language.from_xxx('dut'))
            s1.write()
            del s1

            s2 = Settings(f.name)
            s2.reload()
            self.assertEqual(Language.from_xxx('dut'),
                             s2.get_language(('section3', 'langprop')))

            self.assertEqual(None, s2.get_language(('s', 'k')))
示例#2
0
    def do_languages(self, arg):
        if arg:
            try:
                if int(arg) == 0:
                    self.state.set_download_languages([])
                self.echo(_('Filter languages cleared'))
                return
            except ValueError:
                pass

            try:
                langs = [Language.from_unknown(l_str, xx=True, xxx=True, name=True, locale=True)
                         for l_str in self.shlex_parse_argstr(arg)]
            except NotALanguageException as e:
                self.echo(_('"{}" is not a valid language').format(e.value))
                return
            self.state.set_download_languages(langs)
            self.echo(ngettext('New filter language:', 'New filter languages:',
                                len(self.state.get_download_languages())))
            for language in self.state.get_download_languages():
                self.echo('- {}'.format(language.name()))
            return
        else:
            self.echo(ngettext('Current filter language:', 'Current filter languages:',
                       len(self.state.get_download_languages())))
            if self.state.get_download_languages():
                for language in self.state.get_download_languages():
                    self.echo('- {}'.format(language.name()))
            else:
                self.echo(_('(None)'))
    def setup_ui(self):
        self.ui.setupUi(self)

        self.ui.buttonSearchByName.clicked.connect(self.onButtonSearchByTitle)
        self.ui.movieNameText.returnPressed.connect(self.onButtonSearchByTitle)
        self.ui.buttonDownloadByTitle.clicked.connect(self.onButtonDownloadByTitle)

        self.ui.buttonIMDBByTitle.clicked.connect(self.onViewOnlineInfo)
        self.ui.buttonIMDBByTitle.setEnabled(False)

        self.moviesModel = VideoTreeModel(self)
        self.moviesModel.connect_treeview(self.ui.moviesView)
        self.moviesModel.node_clicked.connect(self.on_item_clicked)
        self.moviesModel.dataChanged.connect(self.subtitlesMovieCheckedChanged)

        # FIXME: load settings from general place
        upload_language = Language.from_xxx(
            QSettings().value('options/uploadLanguage', UnknownLanguage.create_generic()))
        self.ui.filterLanguage.selected_language_changed.connect(self.on_language_combobox_filter_change)

        self.language_filter_change.connect(self.moviesModel.on_filter_languages_change)

        self.ui.moviesView.setContextMenuPolicy(Qt.CustomContextMenu)
        self.ui.moviesView.customContextMenuRequested.connect(self.onContext)

        self.retranslate()
示例#4
0
 def get_language(self, key, default=None):
     # FIXME: test parsing language settings (+invalid)
     try:
         xxx = self._load_str(key)
         return Language.from_xxx(xxx)
     except KeyError:
         return default
示例#5
0
    def get_permanent_language_filter(self):
        settings = QSettings()

        languages_str = settings.value('options/filterSearchLang', '')
        if languages_str:
            languages = [Language.from_xxx(lang_str) for lang_str in languages_str.split(',')]
            return languages
        else:
            return []
示例#6
0
 def get_system_language():
     locale = i18n_system_locale()
     for lc_fallback in i18n_locale_fallbacks_calculate(locale):
         try:
             language = Language.from_unknown(lc_fallback, locale=True)
             return language
         except NotALanguageException:
             continue
     return UnknownLanguage.create_generic()
示例#7
0
 def get_languages(self, key, default=None):
     try:
         xxxs = self._load_str(key)
         return [
             Language.from_xxx(lang_str) for lang_str in xxxs.split(',')
             if lang_str
         ]
     except KeyError:
         return default
示例#8
0
    def test_languages(self):
        with create_temporary_file() as f:
            f.file.close()
            s1 = Settings(f.name)
            s1.set_languages(
                ('section4', 'langsprop'),
                [Language.from_xxx('spa'),
                 Language.from_xxx('eng')])
            s1.write()
            del s1

            s2 = Settings(f.name)
            s2.reload()
            self.assertListEqual(
                [Language.from_xxx('spa'),
                 Language.from_xxx('eng')],
                s2.get_languages(('section4', 'langsprop')))

            self.assertEqual(None, s2.get_languages(('s', 'k')))
示例#9
0
 def __call__(self, parser, namespace, values, option_string=None):
     try:
         languages = [
             Language.from_unknown(value,
                                   xx=True,
                                   xxx=True,
                                   locale=True,
                                   name=True) for value in values
         ]
         setattr(namespace, self.dest, languages)
     except NotALanguageException as e:
         parser.error(
             _('{lang_str} is an unknown language.').format(
                 lang_str=e.value))
示例#10
0
    def matches_video_filename(self, video):
        """
        Detect whether the filename of videofile matches with this SubtitleFile.
        :param video: VideoFile instance
        :return: True if match
        """

        vid_fn = video.get_filename()
        vid_stem, _ = os.path.splitext(vid_fn)
        vid_stem = vid_stem.lower()

        sub_fn = self.get_filename()
        sub_stem, _ = os.path.splitext(sub_fn)
        sub_stem = sub_stem.lower()

        log.debug(
            'matches_filename(subtitle="{sub_filename}", video="{vid_filename}") ...'
            .format(sub_filename=sub_fn, vid_filename=vid_fn))
        matches = sub_stem == vid_stem

        lang = None
        if not matches:
            if sub_stem.startswith(vid_stem):
                sub_rest = sub_stem[len(vid_stem):]
                rests = sub_rest.split('.')
                rest_matches = True
                for rest in rests:
                    if not rest:
                        continue
                    try:
                        int(rest)
                        continue
                    except ValueError:
                        pass
                    try:
                        lang = Language.from_unknown(rest, xx=True, xxx=True)
                        continue
                    except NotALanguageException:
                        pass
                    rest_matches = False
                    break

                matches = rest_matches

        if matches:
            log.debug(
                '... matches (language={language})'.format(language=lang))
        else:
            log.debug('... does not match')
        return matches
示例#11
0
    def do_upload_set_language(self, arg):
        args = self.shlex_parse_argstr(arg)

        if len(args) == 0:
            self._upload_movie.set_language(UnknownLanguage.create_generic())
            return

        if len(args) != 1:
            self.echo('Need 1 argument')
            return
        try:
            lang = Language.from_unknown(args[0], xx=True, xxx=True, name=True, locale=True)
            self.echo(_('Upload language set to {}.').format(lang.name()))
            self._upload_movie.set_language(lang)
        except NotALanguageException:
            self.echo(_('Unknown language'))
            return
示例#12
0
    def matches_videofile_filename(self, videofile):
        """
        Detect whether the filename of videofile matches with this SubtitleFile.
        :param videofile: VideoFile instance
        :return: True if match
        """

        vid_fn = videofile.get_filename()
        vid_base, _ = os.path.splitext(vid_fn)
        vid_base = vid_base.lower()

        sub_fn = self.get_filename()
        sub_base, _ = os.path.splitext(sub_fn)
        sub_base = sub_base.lower()

        log.debug(
            'matches_filename(subtitle="{sub_filename}", video="{vid_filename}") ...'
            .format(sub_filename=sub_fn, vid_filename=vid_fn))

        matches = sub_base == vid_base

        lang = None
        if not matches:
            if sub_base.startswith(vid_base):
                sub_rest = sub_base[len(vid_base):]
                while len(sub_rest) > 0:
                    if sub_rest[0].isalnum():
                        break
                    sub_rest = sub_rest[1:]
                try:
                    lang = Language.from_unknown(sub_rest,
                                                 locale=False,
                                                 name=False)
                    matches = True
                except NotALanguageException:
                    matches = False

        if matches:
            log.debug(
                '... matches (language={language})'.format(language=lang))
        else:
            log.debug('... does not match')
        return matches
示例#13
0
 def detect_language_filename(cls, filename):
     """
     Detect the language of a subtitle filename
     :param filename: filename of a subtitle
     :return: Language object, None if language could not be detected.
     """
     log.debug('detect_language(filename="{}") ...'.format(filename))
     root, _ = os.path.splitext(filename)
     fn_lang = cls.DETECT_LANGUAGE_REGEX.findall(root)
     if fn_lang:
         language_part = fn_lang[0]
         try:
             lang = Language.from_unknown(language_part, xx=True, xxx=True)
             log.debug('... SUCCESS: detected from filename: {lang}'.format(
                 lang=lang))
             return lang
         except NotALanguageException:
             pass
     else:
         log.debug('... FAIL: could not detect from filename')
     return UnknownLanguage.create_generic()
示例#14
0
 def do_languages(self, arg):
     if arg:
         langs = None
         if langs is None:
             try:
                 if int(arg) == 0:
                     langs = []
             except ValueError:
                 pass
         if langs is None:
             try:
                 langs = [
                     Language.from_unknown(l_str,
                                           xx=True,
                                           xxx=True,
                                           name=True,
                                           locale=True)
                     for l_str in shlex.split(arg)
                 ]
             except NotALanguageException as e:
                 self.print(
                     _('"{}" is not a valid language').format(e.value))
                 return
         self.state.set_download_languages(langs)
     if arg:
         self.print(
             ngettext('New filter language:', 'New filter languages:',
                      len(self.state.get_download_languages())))
     else:
         self.print(
             ngettext('Current filter language:',
                      'Current filter languages:',
                      len(self.state.get_download_languages())))
     if self.state.get_download_languages():
         for language in self.state.get_download_languages():
             self.print('- {}'.format(language.name()))
     else:
         self.print(_('(None)'))
示例#15
0
    def readSettings(self):
        log.debug('readSettings: start')
        self.settings.sync()

        # 1. Search tab
        checked_languages_str = self.settings.value('options/filterSearchLang',
                                                    [])
        if checked_languages_str:
            for lang_xxx in checked_languages_str.split(','):
                lang = Language.from_xxx(lang_xxx)
                if isinstance(lang, UnknownLanguage):
                    continue
                self._filterLanguageComboBoxes[lang].setChecked(True)

        # 2. Download tab

        # - Download Destination

        optionWhereToDownload = self.settings.value(
            'options/whereToDownload', self.DLDESTINATIONTYPE_SAMEFOLDER)
        if optionWhereToDownload == self.DLDESTINATIONTYPE_ASKUSER:
            self.ui.optionDlDestinationAsk.setChecked(True)
        elif optionWhereToDownload == self.DLDESTINATIONTYPE_SAMEFOLDER:
            self.ui.optionDlDestinationSame.setChecked(True)
        elif optionWhereToDownload == self.DLDESTINATIONTYPE_PREDEFINEDFOLDER:
            self.ui.optionDlDestinationUser.setChecked(True)

        dlDestination = self.settings.value('options/whereToDownloadFolder',
                                            '')
        #self._dlDestinationPredefined = dlDestination if os.path.isdir(dlDestination) else ''
        self.ui.inputDlDestinationUser.setText(dlDestination)
        self.ui.inputDlDestinationUser.editingFinished.emit()

        # - Subtitle Filename

        optionSubtitleName = self.settings.value('options/subtitleName',
                                                 self.DLSUBFN_SAME)
        if optionSubtitleName == self.DLSUBFN_SAME:
            self.ui.optionSubFnSame.setChecked(True)
        elif optionSubtitleName == self.DLSUBFN_SAMELANG:
            self.ui.optionSubFnSameLang.setChecked(True)
        elif optionSubtitleName == self.DLSUBFN_SAMELANGUPLOADER:
            self.ui.optionSubFnSameLangUploader.setChecked(True)
        elif optionSubtitleName == self.DLSUBFN_ONLINE:
            self.ui.optionSubFnOnline.setChecked(True)

        # 3. Upload tab

        # - Default Subtitle Language

        optionUploadLanguage = self.settings.value('options/uploadLanguage',
                                                   self.DEFAULT_UL_LANG.xxx())
        self._uploadLanguage = Language.from_xxx(optionUploadLanguage)

        self.ui.optionUlDefaultLanguage.set_selected_language(
            self._uploadLanguage)

        # 4. Network tab

        self.ui.inputProxyHost.setText(
            self.settings.value("options/ProxyHost", ""))
        self.ui.inputProxyPort.setValue(
            int(self.settings.value("options/ProxyPort", 8080)))

        # 5. Others tab

        # - Interface Language

        optionInterfaceLanguage = self.settings.value(
            'options/interfaceLang', self.DEFAULT_INTERFACE_LANG.locale())
        self._original_interface_language = Language.from_locale(
            optionInterfaceLanguage)
        self.ui.optionInterfaceLanguage.set_selected_language(
            self._original_interface_language)

        optionIntegrationExplorer = self.settings.value(
            "options/IntegrationExplorer", False)
        self.ui.optionIntegrationExplorer.setChecked(optionIntegrationExplorer)

        programPath = self.settings.value("options/VideoPlayerPath", "")
        parameters = self.settings.value("options/VideoPlayerParameters", "")
        self.ui.inputVideoAppLocation.setText(programPath)
        self.ui.inputVideoAppParams.setText(parameters)

        # Context menu for Explorer
        if platform.system() == "Linux":
            self.ui.optionIntegrationExplorer.setText(
                _("Enable in your Konqueror/Dolphin/Nautilus"))
            self.ui.optionIntegrationExplorer.setEnabled(False)
        elif platform.system() == "Windows":
            self.ui.optionIntegrationExplorer.setText(
                _("Enable in your Windows Explorer"))
            self.ui.optionIntegrationExplorer.setEnabled(False)
        else:
            self.ui.optionIntegrationExplorer.setText(
                _("Enable in your File Manager"))
            self.ui.optionIntegrationExplorer.setEnabled(False)

        log.debug('readSettings: finish')
示例#16
0
    def parse_results(self, raw_xml):
        """Parse the xml and return a list of dictionaries like:
            [   {'IDSubtitle': 'foo',
                    'LinkUseNext': 'foo',
                    'MovieName': 'foo_movie',
                    ...
                },
                {'IDSubtitle': 'foo',
                    'LinkUseNext': 'foo',
                    'MovieName': 'foo_movie',
                    ...
                },
                ...]
        """

        dom = minidom.parseString(raw_xml)  # Make the dom from raw xml
        entries = dom.getElementsByTagName(
            'opensubtitles')  # Pull out all entry's
        result_entries = []  # Make an empty container to fill up and return
        data = None
        # fetch the wanted result xml node
        for entry in entries:
            if len(entry.getElementsByTagName('results')) > 0:
                for result in entry.getElementsByTagName('results'):
                    if len(result.getElementsByTagName('subtitle')) > 0:
                        data = result.getElementsByTagName('subtitle')
                        break
                break
        # print "data=", data
        if not data:
            return []
        # catch all subtitles information
        for entry in data:
            try:
                sub_obj = subtitlefile.SubtitleFile(online=True)
                sub = {}

                if entry.getElementsByTagName('EpisodeName'):
                    return
                if entry.getElementsByTagName('IDSubtitle'):
                    sub['IDSubtitle'] = {'IDSubtitle': entry.getElementsByTagName('IDSubtitle')[0].firstChild.data,
                                         'Link': entry.getElementsByTagName('IDSubtitle')[0].getAttribute('Link'),
                                         'LinkImdb': entry.getElementsByTagName('IDSubtitle')[0].getAttribute('LinkImdb'),
                                         'DownloadLink': entry.getElementsByTagName('IDSubtitle')[0].getAttribute('DownloadLink'),
                                         'uuid': entry.getElementsByTagName('IDSubtitle')[0].getAttribute('uuid'),
                                         }
                    sub_obj.setIdOnline(sub['IDSubtitle']['IDSubtitle'])
                if entry.getElementsByTagName('IDSubtitleFile'):
                    sub['IDSubtitleFile'] = {'IDSubtitleFile': entry.getElementsByTagName('IDSubtitleFile')[0].firstChild.data,
                    }
                    sub_obj.setIdFileOnline(sub['IDSubtitleFile']['IDSubtitleFile'])
                if entry.getElementsByTagName('UserID'):
                    sub['UserID'] = {'UserID': entry.getElementsByTagName('UserID')[0].firstChild.data,
                                     'Link': entry.getElementsByTagName('UserID')[0].getAttribute('Link'),
                                     }
                if entry.getElementsByTagName('UserNickName') and entry.getElementsByTagName('UserNickName')[0].firstChild:
                    sub['UserNickName'] = entry.getElementsByTagName(
                        'UserNickName')[0].firstChild.data
                    sub_obj._uploader = sub['UserNickName']
                if entry.getElementsByTagName('MovieID'):
                    #sub['MovieID'] = entry.getElementsByTagName('MovieID')[0].firstChild.data
                    sub['MovieID'] = {'MovieID': entry.getElementsByTagName('MovieID')[0].firstChild.data,
                                      'Link': entry.getElementsByTagName('MovieID')[0].getAttribute('Link'),
                                      'LinkImdb': entry.getElementsByTagName('MovieID')[0].getAttribute('LinkImdb'),
                                      }
                if entry.getElementsByTagName('MovieThumb') and entry.getElementsByTagName('MovieThumb')[0].firstChild:
                    sub['MovieThumb'] = entry.getElementsByTagName(
                        'MovieThumb')[0].firstChild.data
                if entry.getElementsByTagName('LinkUseNext') and entry.getElementsByTagName('LinkUseNext')[0].firstChild:
                    sub['LinkUseNext'] = entry.getElementsByTagName(
                        'LinkUseNext')[0].firstChild.data
                if entry.getElementsByTagName('LinkZoozle') and entry.getElementsByTagName('LinkZoozle')[0].firstChild:
                    sub['LinkZoozle'] = entry.getElementsByTagName(
                        'LinkZoozle')[0].firstChild.data
                if entry.getElementsByTagName('LinkTorrentbar') and entry.getElementsByTagName('LinkTorrentbar')[0].firstChild:
                    sub['LinkTorrentbar'] = entry.getElementsByTagName(
                        'LinkTorrentbar')[0].firstChild.data
                if entry.getElementsByTagName('LinkBoardreader') and entry.getElementsByTagName('LinkBoardreader')[0].firstChild:
                    sub['LinkBoardreader'] = entry.getElementsByTagName(
                        'LinkBoardreader')[0].firstChild.data
                if entry.getElementsByTagName('MovieName') and entry.getElementsByTagName('MovieName')[0].firstChild:
                    sub['MovieName'] = entry.getElementsByTagName(
                        'MovieName')[0].firstChild.data
                if entry.getElementsByTagName('MovieYear') and entry.getElementsByTagName('MovieYear')[0].firstChild:
                    sub['MovieYear'] = entry.getElementsByTagName(
                        'MovieYear')[0].firstChild.data
                if entry.getElementsByTagName('MovieImdbRating') and entry.getElementsByTagName('MovieImdbRating')[0].firstChild:
                    sub['MovieImdbRating'] = entry.getElementsByTagName(
                        'MovieImdbRating')[0].firstChild.data
                elif not entry.getElementsByTagName('MovieImdbRating')[0].firstChild:
                    sub['MovieImdbRating'] = 0
                if entry.getElementsByTagName('MovieImdbID') and entry.getElementsByTagName('MovieImdbID')[0].firstChild:
                    sub['MovieImdbID'] = entry.getElementsByTagName(
                        'MovieImdbID')[0].firstChild.data
                if entry.getElementsByTagName('SubAuthorComment'):
                    try:
                        sub['SubAuthorComment'] = entry.getElementsByTagName(
                            'SubAuthorComment')[0].firstChild.data
                    except AttributeError:
                        sub['SubAuthorComment'] = entry.getElementsByTagName(
                            'SubAuthorComment')[0].firstChild
                if entry.getElementsByTagName('ISO639'):
                    sub['ISO639'] = {'ISO639': entry.getElementsByTagName('ISO639')[0].firstChild.data,
                                     'LinkSearch': entry.getElementsByTagName('ISO639')[0].getAttribute('LinkSearch'),
                                     'flag': entry.getElementsByTagName('ISO639')[0].getAttribute('flag'),
                                     }
                    sub_obj.setLanguage(Language.from_xx(sub['ISO639']['ISO639']))
                    #sub_obj._onlineId = sub['IDSubtitle']['IDSubtitle']
                    # It does require the Subtitle ID to downlad, not the
                    # Subtitle File Id
                    sub_obj.setExtraInfo(
                        'downloadLink', "http://www.opensubtitles.org/download/sub/%s" % sub_obj.getIdOnline())
                if entry.getElementsByTagName('LanguageName') and entry.getElementsByTagName('LanguageName')[0].firstChild:
                    sub['LanguageName'] = entry.getElementsByTagName(
                        'LanguageName')[0].firstChild.data
                if entry.getElementsByTagName('SubFormat') and entry.getElementsByTagName('SubFormat')[0].firstChild:
                    sub['SubFormat'] = entry.getElementsByTagName(
                        'SubFormat')[0].firstChild.data
                    sub_obj.setExtraInfo('format', sub['SubFormat'])
                if entry.getElementsByTagName('SubSumCD') and entry.getElementsByTagName('SubSumCD')[0].firstChild:
                    sub['SubSumCD'] = entry.getElementsByTagName(
                        'SubSumCD')[0].firstChild.data
                    sub_obj.setExtraInfo('totalCDs', sub['SubSumCD'])
                if entry.getElementsByTagName('SubAddDate') and entry.getElementsByTagName('SubAddDate')[0].firstChild:
                    sub['SubAddDate'] = entry.getElementsByTagName(
                        'SubAddDate')[0].firstChild.data
                if entry.getElementsByTagName('SubBad') and entry.getElementsByTagName('SubBad')[0].firstChild:
                    sub['SubBad'] = entry.getElementsByTagName(
                        'SubBad')[0].firstChild.data
                if entry.getElementsByTagName('SubRating') and entry.getElementsByTagName('SubRating')[0].firstChild:
                    sub['SubRating'] = entry.getElementsByTagName(
                        'SubRating')[0].firstChild.data
                    sub_obj.setRating(sub['SubRating'])
                if entry.getElementsByTagName('SubDownloadsCnt') and entry.getElementsByTagName('SubDownloadsCnt')[0].firstChild:
                    sub['SubDownloadsCnt'] = entry.getElementsByTagName(
                        'SubDownloadsCnt')[0].firstChild.data
                    sub_obj.setExtraInfo(
                        'totalDownloads', sub['SubDownloadsCnt'])
                if entry.getElementsByTagName('SubMovieAka') and entry.getElementsByTagName('SubMovieAka')[0].firstChild:
                    sub['SubMovieAka'] = entry.getElementsByTagName(
                        'SubMovieAka')[0].firstChild.data
                if entry.getElementsByTagName('SubDate') and entry.getElementsByTagName('SubDate')[0].firstChild:
                    sub['SubDate'] = entry.getElementsByTagName(
                        'SubDate')[0].firstChild.data
                if entry.getElementsByTagName('SubComments') and entry.getElementsByTagName('SubComments')[0].firstChild:
                    sub['SubComments'] = entry.getElementsByTagName(
                        'SubComments')[0].firstChild.data
                if entry.getElementsByTagName('TotalSubs') and entry.getElementsByTagName('TotalSubs')[0].firstChild:
                    sub['TotalSubs'] = entry.getElementsByTagName(
                        'TotalSubs')[0].firstChild.data
                if entry.getElementsByTagName('Newest') and entry.getElementsByTagName('Newest')[0].firstChild:
                    sub['Newest'] = entry.getElementsByTagName(
                        'Newest')[0].firstChild.data
                if sub:
                    # result_entries.append(sub)
                    temp_movie = Movie(sub)
                    movie_exists = False
                    for movie in result_entries:
                        if movie.MovieId == temp_movie.MovieId:
                            movie_exists = True
                            if hasattr(sub_obj, "_extraInfo") and sub_obj._extraInfo:
                                movie.subtitles.append(sub_obj)
#                            already_movie = result_entries.pop(result_entries.index(movie))
#                            temp_movie.subtitles = already_movie.subtitles
                    if not movie_exists:
                        if hasattr(sub_obj, "_extraInfo") and sub_obj._extraInfo:
                            temp_movie.subtitles.append(sub_obj)
                        result_entries.append(temp_movie)

            except IndexError as e:
                pass
        return result_entries
示例#17
0
    def subtitle_info(self, raw_xml):
        dom = minidom.parseString(raw_xml)  # Make the dom from raw xml
        entries = dom.getElementsByTagName(
            'opensubtitles')  # Pull out all entry's
        subtitle_entries = []  # Make an empty container to fill up and return
        data = None
        for entry in entries:
            if entry.getElementsByTagName('SubBrowse'):
                for result in entry.getElementsByTagName('SubBrowse'):
                    if result.getElementsByTagName('Subtitle'):
                        data = result.getElementsByTagName('Subtitle')
                        break
                break
        # print "data=", data
        if not data:
            return []
        # catch subtitle information

        for entry in data:
            sub_obj = subtitlefile.SubtitleFile(online=True)
            sub = {}
            if entry.getElementsByTagName('LinkDetails') and entry.getElementsByTagName('LinkDetails')[0].firstChild:
                sub['LinkDetails'] = entry.getElementsByTagName(
                    'LinkDetails')[0].firstChild.data
            if entry.getElementsByTagName('IDSubtitle'):
                sub['IDSubtitle'] = {'IDSubtitle': entry.getElementsByTagName('IDSubtitle')[0].firstChild.data,
                                     'Link': entry.getElementsByTagName('IDSubtitle')[0].getAttribute('Link'),
                                     }
                sub_obj._onlineId = sub['IDSubtitle']['IDSubtitle']
            if entry.getElementsByTagName('MovieReleaseName') and entry.getElementsByTagName('MovieReleaseName')[0].firstChild:
                sub['MovieReleaseName'] = entry.getElementsByTagName(
                    'MovieReleaseName')[0].firstChild.data
            if entry.getElementsByTagName('SubFormat') and entry.getElementsByTagName('SubFormat')[0].firstChild:
                sub['SubFormat'] = entry.getElementsByTagName(
                    'SubFormat')[0].firstChild.data
                sub_obj.setExtraInfo('format', sub['SubFormat'])
            if entry.getElementsByTagName('SubSumCD') and entry.getElementsByTagName('SubSumCD')[0].firstChild:
                sub['SubSumCD'] = entry.getElementsByTagName(
                    'SubSumCD')[0].firstChild.data
                sub_obj.setExtraInfo('totalCDs', sub['SubSumCD'])
            if entry.getElementsByTagName('SubAuthorComment') and entry.getElementsByTagName('SubAuthorComment')[0].firstChild:
                sub['SubAuthorComment'] = entry.getElementsByTagName(
                    'SubAuthorComment')[0].firstChild.data
            if entry.getElementsByTagName('SubAddDate') and entry.getElementsByTagName('SubAddDate')[0].firstChild:
                sub['SubAddDate'] = entry.getElementsByTagName(
                    'SubAddDate')[0].firstChild.data
            if entry.getElementsByTagName('SubSumVotes') and entry.getElementsByTagName('SubSumVotes')[0].firstChild:
                sub['SubSumVotes'] = entry.getElementsByTagName(
                    'SubSumVotes')[0].firstChild.data
            if entry.getElementsByTagName('SubRating') and entry.getElementsByTagName('SubRating')[0].firstChild:
                sub['SubRating'] = entry.getElementsByTagName(
                    'SubRating')[0].firstChild.data
                sub_obj.setRating(sub['SubRating'])
            if entry.getElementsByTagName('SubDownloadsCnt') and entry.getElementsByTagName('SubDownloadsCnt')[0].firstChild:
                sub['SubDownloadsCnt'] = entry.getElementsByTagName(
                    'SubDownloadsCnt')[0].firstChild.data
                sub_obj.setExtraInfo('totalDownloads', sub['SubDownloadsCnt'])
            if entry.getElementsByTagName('UserNickName') and entry.getElementsByTagName('UserNickName')[0].firstChild:
                sub['UserNickName'] = entry.getElementsByTagName(
                    'UserNickName')[0].firstChild.data
                sub_obj._uploader = sub['UserNickName']
            if entry.getElementsByTagName('LanguageName') and entry.getElementsByTagName('LanguageName')[0].firstChild:
                sub['LanguageName'] = entry.getElementsByTagName(
                    'LanguageName')[0].firstChild.data
                sub_obj.setLanguage(Language.from_xx(
                    entry.getElementsByTagName('LanguageName')[0].getAttribute('ISO639')))
            if entry.getElementsByTagName('SubtitleFile'):
                SubtitleFile = {}
                _SubtitleFile = entry.getElementsByTagName('SubtitleFile')[0]

                _File = _SubtitleFile.getElementsByTagName('File')[0]
                SubtitleFile['File'] = {'ID': _SubtitleFile.getElementsByTagName('File')[0].getAttribute('ID'),
                                        'SubActualCD': {'SubActualCD': _File.getElementsByTagName('SubActualCD')[0].firstChild.data,
                                                        'SubSize': _File.getElementsByTagName('SubActualCD')[0].getAttribute('Link'),
                                                        'MD5': _File.getElementsByTagName('SubActualCD')[0].getAttribute('MD5'),
                                                        'SubFileName': _File.getElementsByTagName('SubActualCD')[0].getAttribute('SubFileName'),
                                                        'DownloadLink': _File.getElementsByTagName('SubActualCD')[0].getAttribute('DownloadLink'),
                                                        }
                                        }

                SubtitleFile['Download'] = {'Download': _SubtitleFile.getElementsByTagName('Download')[0].firstChild.data,
                                            'DownloadLink': _SubtitleFile.getElementsByTagName('Download')[0].getAttribute('LinkDownloadBundle'),
                                            }
                sub['SubtitleFile'] = SubtitleFile
                global OnlyLink
                OnlyLink = _SubtitleFile.getElementsByTagName(
                    'Download')[0].getAttribute('LinkDownloadBundle')
                OnlyLink = ((OnlyLink.replace('dl', 'www')).replace(
                    'org/en', 'com')).replace('subb', 'sub')
            if entry.getElementsByTagName('Movie'):
                _Movie = entry.getElementsByTagName('Movie')[0]
                #sub['MovieName'] = _Movie.getElementsByTagName('MovieName')[0].firstChild.data
                sub['MovieID'] = {'MovieID': _Movie.getElementsByTagName('MovieName')[0].getAttribute('MovieID'),
                                  'Link': _Movie.getElementsByTagName('MovieName')[0].getAttribute('Link'),
                                  }
                for section in _Movie.getElementsByTagName('section'):
                    if section.getAttribute('type') == u"about":
                        for info in section.getElementsByTagName("info"):
                            if info.getElementsByTagName("web_url")[0].firstChild.data == u"http://www.imdb.com":
                                sub['MovieID']['LinkImdb'] = info.getElementsByTagName(
                                    "link_detail")[0].firstChild.data

            if entry.getElementsByTagName('FullName') and entry.getElementsByTagName('FullName')[0].firstChild:
                sub['FullName'] = entry.getElementsByTagName(
                    'FullName')[0].firstChild.data
            if entry.getElementsByTagName('ReportLink') and entry.getElementsByTagName('ReportLink')[0].firstChild:
                sub['ReportLink'] = entry.getElementsByTagName(
                    'ReportLink')[0].firstChild.data
            # just a shortcut
            sub['DownloadLink'] = sub['SubtitleFile']['File']['SubActualCD']['DownloadLink']
            Link().OneLink(OnlyLink)
            if sub:
                subtitle_entries.append(sub)
        return (subtitle_entries, sub_obj)
示例#18
0
                if entry.getElementsByTagName('Newest') and entry.getElementsByTagName('Newest')[0].firstChild:
                    sub['Newest'] = entry.getElementsByTagName(
                        'Newest')[0].firstChild.data
                if sub:
                    # result_entries.append(sub)
                    temp_movie = Movie(sub)
                    movie_exists = False
                    for movie in result_entries:
                        if movie.MovieId == temp_movie.MovieId:
                            movie_exists = True
                            if hasattr(sub_obj, "_extraInfo") and sub_obj._extraInfo:
                                movie.subtitles.append(sub_obj)
#                            already_movie = result_entries.pop(result_entries.index(movie))
#                            temp_movie.subtitles = already_movie.subtitles
                    if not movie_exists:
                        if hasattr(sub_obj, "_extraInfo") and sub_obj._extraInfo:
                            temp_movie.subtitles.append(sub_obj)
                        result_entries.append(temp_movie)

            except IndexError as e:
                pass
        return result_entries

# For testing purposes
if __name__ == "__main__":
    s = SearchByName()
    res = s.search_movie(languages=[Language.from_xxx("por"), Language.from_xxx("pob")], moviename="anamorph")
    for movie in res:
        print(movie)
        print(len(movie.subtitles))
示例#19
0
 def legal_languages(self):
     return [
         Language.from_locale(locale)
         for locale in i18n_get_supported_locales()
     ]
示例#20
0
    def search_videos(self, videos, callback, languages=None):
        log.debug('search_videos(#videos={})'.format(len(videos)))
        if not self.logged_in():
            raise ProviderNotConnectedError()

        lang_str = self._languages_to_str(languages)

        window_size = 5
        callback.set_range(0, (len(videos) + (window_size - 1)) // window_size)

        remote_subtitles = []
        for window_i, video_window in enumerate(
                window_iterator(videos, window_size)):
            callback.update(window_i)
            if callback.canceled():
                break

            queries = []
            hash_video = {}
            for video in video_window:
                query = {
                    'sublanguageid': lang_str,
                    'moviehash': video.get_osdb_hash(),
                    'moviebytesize': str(video.get_size()),
                }
                queries.append(query)
                hash_video[video.get_osdb_hash()] = video

            def run_query():
                return self._xmlrpc.SearchSubtitles(
                    self._token, queries, {'limit': self.SEARCH_LIMIT})

            result = self._safe_exec(run_query, None)
            self.check_result(result)
            if result is None:
                continue

            for rsub_raw in result['data']:
                try:
                    remote_filename = rsub_raw['SubFileName']
                    remote_file_size = int(rsub_raw['SubSize'])
                    remote_id = rsub_raw['IDSubtitleFile']
                    remote_md5_hash = rsub_raw['SubHash']
                    remote_download_link = rsub_raw['SubDownloadLink']
                    remote_link = rsub_raw['SubtitlesLink']
                    remote_uploader = rsub_raw['UserNickName'].strip()
                    remote_language_raw = rsub_raw['SubLanguageID']
                    try:
                        remote_language = Language.from_unknown(
                            remote_language_raw, xx=True, xxx=True)
                    except NotALanguageException:
                        remote_language = UnknownLanguage(remote_language_raw)
                    remote_rating = float(rsub_raw['SubRating'])
                    remote_date = datetime.datetime.strptime(
                        rsub_raw['SubAddDate'], '%Y-%m-%d %H:%M:%S')
                    remote_subtitle = OpenSubtitlesSubtitleFile(
                        filename=remote_filename,
                        file_size=remote_file_size,
                        md5_hash=remote_md5_hash,
                        id_online=remote_id,
                        download_link=remote_download_link,
                        link=remote_link,
                        uploader=remote_uploader,
                        language=remote_language,
                        rating=remote_rating,
                        age=remote_date,
                    )
                    movie_hash = '{:>016}'.format(rsub_raw['MovieHash'])
                    video = hash_video[movie_hash]

                    imdb_id = rsub_raw['IDMovieImdb']
                    imdb_identity = ImdbIdentity(imdb_id=imdb_id,
                                                 imdb_rating=None)
                    identity = ProviderIdentities(imdb_identity=imdb_identity,
                                                  provider=self)

                    video.add_subtitle(remote_subtitle)
                    video.add_identity(identity)

                    remote_subtitles.append(remote_subtitle)
                except (KeyError, ValueError):
                    log.exception(
                        'Error parsing result of SearchSubtitles(...)')
                    log.error('Offending query is: {queries}'.format(
                        queries=queries))
                    log.error('Offending result is: {remote_sub}'.format(
                        remote_sub=rsub_raw))

        callback.finish()
        return remote_subtitles
示例#21
0
 def get_language(self, section, option):
     xxx = self.get_str(section, option, UnknownLanguage.create_generic())
     return Language.from_xxx(xxx)
示例#22
0
 def get_languages(self, section, option):
     xxxs = self.get_str(section, option, None)
     if xxxs is None:
         return []
     return [Language.from_xxx(lang_str) for lang_str in xxxs.split(',') if lang_str]
示例#23
0
    def _xml_to_subtitles(self, xml):
        subtitle_entries, nb_so_far, nb_provider = self._extract_subtitle_entries(
            xml)
        if subtitle_entries is None:
            return None, None, None

        subtitles = []
        for subtitle_entry in subtitle_entries:
            try:
                ads_entries = subtitle_entry.getElementsByTagName(
                    'ads1') or subtitle_entry.getElementsByTagName('ads2')
                if ads_entries:
                    continue

                def try_get_first_child_data(key, default):
                    try:
                        return subtitle_entry.getElementsByTagName(
                            key)[0].firstChild.data
                    except (AttributeError, IndexError):
                        return default

                subtitle_id_entry = subtitle_entry.getElementsByTagName(
                    'IDSubtitle')[0]
                subtitle_id = subtitle_id_entry.firstChild.data
                subtitle_link = 'http://www.opensubtitles.org' + subtitle_id_entry.getAttribute(
                    'Link')
                subtitle_uuid = subtitle_id_entry.getAttribute('uuid')

                subtitlefile_id = subtitle_entry.getElementsByTagName(
                    'IDSubtitleFile')[0].firstChild.data

                user_entry = subtitle_entry.getElementsByTagName('UserID')[0]
                user_id = int(user_entry.firstChild.data)
                # user_link = 'http://www.opensubtitles.org' + user_entry.getAttribute('Link')
                user_nickname = try_get_first_child_data('UserNickName', None)

                # comment = try_get_first_child_data(''SubAuthorComment', None)

                language_entry = subtitle_entry.getElementsByTagName(
                    'ISO639')[0]
                language_iso639 = language_entry.firstChild.data
                # language_link_search = 'http://www.opensubtitles.org' + language_entry.getAttribute('LinkSearch')
                # language_flag = 'http:' + language_entry.getAttribute('flag')

                # language_name = try_get_first_child_data('LanguageName', None)

                subtitle_format = try_get_first_child_data('SubFormat', 'srt')
                # subtitle_nbcds = int(try_get_first_child_data('SubSumCD', -1))
                subtitle_add_date_locale = subtitle_entry.getElementsByTagName(
                    'SubAddDate')[0].getAttribute('locale')
                subtitle_add_date = datetime.datetime.strptime(
                    subtitle_add_date_locale, '%d/%m/%Y %H:%M:%S')
                # subtitle_bad = int(subtitle_entry.getElementsByTagName('SubBad')[0].firstChild.data)
                subtitle_rating = float(
                    subtitle_entry.getElementsByTagName('SubRating')
                    [0].firstChild.data)

                # download_count = int(try_get_first_child_data('SubDownloadsCnt', -1))
                # subtitle_movie_aka = try_get_first_child_data('SubMovieAka', None)

                # subtitle_comments = int(try_get_first_child_data('SubComments', -1))
                # subtitle_total = int(try_get_first_child_data('TotalSubs', -1)) #PRESENT?
                # subtitle_newest = try_get_first_child_data('Newest', None) #PRESENT?

                language = Language.from_xx(language_iso639)

                movie_release_name = subtitle_entry.getElementsByTagName(
                    'MovieReleaseName')[0].firstChild.data
                filename = '{}.{}'.format(movie_release_name, subtitle_format)

                download_link = 'http://www.opensubtitles.org/download/sub/{}'.format(
                    subtitle_id)
                if user_nickname:
                    uploader = user_nickname
                elif user_id != 0:
                    uploader = str(user_id)
                else:
                    uploader = None
                subtitle = OpenSubtitlesSubtitleFile(
                    filename=filename,
                    file_size=None,
                    md5_hash=subtitle_uuid,
                    id_online=subtitlefile_id,
                    download_link=download_link,
                    link=subtitle_link,
                    uploader=uploader,
                    language=language,
                    rating=subtitle_rating,
                    age=subtitle_add_date)
                subtitles.append(subtitle)
            except (AttributeError, IndexError, ValueError):
                log.warning('subtitle_entry={}'.format(subtitle_entry.toxml()))
                log.warning('XML entry has invalid format.',
                            exc_info=sys.exc_info())

        return subtitles, nb_so_far, nb_provider
示例#24
0
    def search_videos(self, videos, callback, languages=None):
        limit = 500
        if languages:
            lang_str = ','.join([language.xxx() for language in languages])
        else:
            lang_str = 'all'

        window_size = 5
        callback.set_range(0, (len(videos) + (window_size - 1)) // window_size)

        remote_subtitles = []
        for window_i, video_window in enumerate(window_iterator(videos, window_size)):
            callback.update(window_i)
            if callback.canceled():
                break

            queries = []
            hash_video = {}
            for video in video_window:
                query = {
                    'sublanguageid': lang_str,
                    'moviehash': video.get_osdb_hash(),
                    'moviebytesize': str(video.get_size()),
                }
                queries.append(query)
                hash_video[video.get_osdb_hash()] = video

            def run_query():
                return self._xmlrpc_server.SearchSubtitles(self._token, queries, {'limit': limit})
            result = self._safe_exec(run_query, None)
            if result is None:
                return remote_subtitles
            self.check_result(result)
            for rsub_raw in result['data']:
                try:
                    remote_filename = rsub_raw['SubFileName']
                    remote_file_size = int(rsub_raw['SubSize'])
                    remote_id = rsub_raw['IDSubtitleFile']
                    remote_md5_hash = rsub_raw['SubHash']
                    remote_download_link = rsub_raw['SubDownloadLink']
                    remote_link = rsub_raw['SubtitlesLink']
                    remote_uploader = rsub_raw['UserNickName']
                    remote_language_raw = rsub_raw['SubLanguageID']
                    try:
                        remote_language = Language.from_unknown(remote_language_raw,
                                                                locale=False, name=False)
                    except NotALanguageException:
                        remote_language = UnknownLanguage(remote_language_raw)
                    remote_rating = float(rsub_raw['SubRating'])
                    remote_subtitle = OpenSubtitles_SubtitleFile(
                        filename=remote_filename,
                        file_size=remote_file_size ,
                        md5_hash=remote_md5_hash,
                        id_online=remote_id,
                        download_link=remote_download_link,
                        link=remote_link,
                        uploader=remote_uploader,
                        language=remote_language,
                        rating=remote_rating,
                    )
                    movie_hash = '{:>016}'.format(rsub_raw['MovieHash'])
                    hash_video[movie_hash].add_subtitle(remote_subtitle)

                    remote_subtitles.append(remote_subtitle)
                except (KeyError, ValueError):
                    log.exception('Error parsing result of SearchSubtitles(...)')
                    log.error('Offending query is: {queries}'.format(queries=queries))
                    log.error('Offending result is: {remote_sub}'.format(remote_sub=rsub_raw))

        callback.finish()
        return remote_subtitles
示例#25
0
    def _SearchSubtitles(self, language="all", videos=None, imdb_ids=None):
        """
        Search subtitles for the given video(s).

        @language: language code - string
        @videos: video objects - list
        @imdb_id: IMDB movie id's - list
        Note:Max results is 250. When nothing is found, 'data' is empty.
        """
        self.log.debug("----------------")
        self.log.debug("SearchSubtitles RPC method starting...")
        search_array = []
        if videos:
            self.log.debug("Building search array with video objects info")
            for video in videos:
                array = {'sublanguageid': language, 'moviehash':
                         video.get_hash(), 'moviebytesize': str(video.get_size())}
                self.log.debug(" - adding: %s" % array)
                search_array.append(array)
        elif imdb_ids:
            self.log.debug("Building search array with IMDB id's")
            for id in imdb_ids:
                array = {'sublanguageid': language, 'imdbid': id}
                self.log.debug(" - adding: %s" % array)
                search_array.append(array)

        self.log.debug("Communicating with server...")
        result = self._xmlrpc_server.SearchSubtitles(
            self._token, search_array)

        if result is not None and result['data'] != False:
            self.log.debug("Collecting downloaded data")
            moviehashes = {}
            for i in result['data']:
                moviehash = i['MovieHash']
                if moviehash not in moviehashes:
                    moviehashes[moviehash] = []
                moviehashes[moviehash].append(i)
            self.log.debug("Movie hashes: %i" % len(moviehashes.keys()))

            if videos:
                videos_result = []
                for video in videos:
                    if video.get_hash() in moviehashes:
                        osdb_info = moviehashes[video.get_hash()]
                        subtitles = []
                        self.log.debug("- %s (%s)" %
                                       (video.get_filepath(), video.get_hash()))
                        for i in osdb_info:
                            sub = subtitlefile.SubtitleFile(
                                online=True, id=i["IDSubtitle"])
                            sub.setHash(i["SubHash"])
                            sub.setIdFileOnline(i["IDSubtitleFile"])
                            sub.setFileName(i["SubFileName"])
                            # This method will autogenerate the XX and the
                            # LanguageName
                            sub.setLanguage(Language.from_xxx(i["SubLanguageID"]))
                            # sub.setLanguageXX(i["ISO639"])
                            # sub.setLanguageName(i["LanguageName"])
                            sub.setRating(i["SubRating"])
                            sub.setUploader(i["UserNickName"])
                            sub.setDownloadLink(i["SubDownloadLink"])
                            sub.setVideo(video)

                            self.log.debug(
                                "  [%s] - %s" % (sub.getLanguage().xxx(), sub.get_filepath()))
                            subtitles.append(sub)

                        # Let's get the IMDB info which is majority in the
                        # subtitles
                        video.setMovieInfo(self.getBestImdbInfo(osdb_info))
                        video.setOsdbInfo(osdb_info)
                        video.setSubtitles(subtitles)
                    videos_result.append(video)

                return videos_result

            elif imdb_ids:
                # TODO: search with IMDB id's
                pass
        else:
            self.log.info("No subtitles were found on Opensubtitles.org")
            return []
示例#26
0
 def detect_language_contents(self):
     return Language.from_file(self._filepath)
示例#27
0
    def upload_subtitles(self, local_movie):
        log.debug('upload_subtitles()')
        if not self.logged_in():
            raise ProviderNotConnectedError()
        video_subtitles = list(local_movie.iter_video_subtitles())
        if not video_subtitles:
            return UploadResult(
                type=UploadResult.Type.MISSINGDATA,
                reason=_('Need at least one subtitle to upload'))

        query_try = dict()
        for sub_i, (video, subtitle) in enumerate(video_subtitles):
            if not video:
                return UploadResult(
                    type=UploadResult.Type.MISSINGDATA,
                    reason=_('Each subtitle needs an accompanying video'))
            query_try['cd{}'.format(sub_i + 1)] = {
                'subhash':
                subtitle.get_md5_hash(),
                'subfilename':
                subtitle.get_filename(),
                'moviehash':
                video.get_osdb_hash(),
                'moviebytesize':
                str(video.get_size()),
                'moviefps':
                str(video.get_fps()) if video.get_fps() else None,
                'movieframes':
                str(video.get_framecount())
                if video.get_framecount() else None,
                'moviefilename':
                video.get_filename(),
            }

        def run_query_try_upload():
            return self._xmlrpc.TryUploadSubtitles(self._token, query_try)

        try_result = self._safe_exec(run_query_try_upload, None)
        self.check_result(try_result)

        if int(try_result['alreadyindb']):
            return UploadResult(type=UploadResult.Type.DUPLICATE,
                                reason=_('Subtitle is already in database'))

        if local_movie.get_imdb_id() is None:
            return UploadResult(type=UploadResult.Type.MISSINGDATA,
                                reason=_('Need IMDb id'))
        upload_base_info = {
            'idmovieimdb': local_movie.get_imdb_id(),
        }

        if local_movie.get_comments() is not None:
            upload_base_info['subauthorcomment'] = local_movie.get_comments()
        if not local_movie.get_language().is_generic():
            upload_base_info['sublanguageid'] = local_movie.get_language().xxx(
            )
        if local_movie.get_release_name() is not None:
            upload_base_info[
                'moviereleasename'] = local_movie.get_release_name()
        if local_movie.get_movie_name() is not None:
            upload_base_info['movieaka'] = local_movie.get_movie_name()
        if local_movie.is_hearing_impaired() is not None:
            upload_base_info[
                'hearingimpaired'] = local_movie.is_hearing_impaired()
        if local_movie.is_high_definition() is not None:
            upload_base_info[
                'highdefinition'] = local_movie.is_high_definition()
        if local_movie.is_automatic_translation() is not None:
            upload_base_info[
                'automatictranslation'] = local_movie.is_automatic_translation(
                )
        if local_movie.get_author() is not None:
            upload_base_info['subtranslator'] = local_movie.get_author()
        if local_movie.is_foreign_only() is not None:
            upload_base_info['foreignpartsonly'] = local_movie.is_foreign_only(
            )

        query_upload = {
            'baseinfo': upload_base_info,
        }
        for sub_i, (video, subtitle) in enumerate(video_subtitles):
            sub_bytes = subtitle.get_filepath().open(mode='rb').read()
            sub_tx_data = base64.b64encode(zlib.compress(sub_bytes)).decode()

            query_upload['cd{}'.format(sub_i + 1)] = {
                'subhash':
                subtitle.get_md5_hash(),
                'subfilename':
                subtitle.get_filename(),
                'moviehash':
                video.get_osdb_hash(),
                'moviebytesize':
                str(video.get_size()),
                'movietimems':
                str(video.get_time_ms()) if video.get_time_ms() else None,
                'moviefps':
                str(video.get_fps()) if video.get_fps() else None,
                'movieframes':
                str(video.get_framecount())
                if video.get_framecount() else None,
                'moviefilename':
                video.get_filename(),
                'subcontent':
                sub_tx_data,
            }

        def run_query_upload():
            return self._xmlrpc.UploadSubtitles(self._token, query_upload)

        result = self._safe_exec(run_query_upload, None)
        self.check_result(result)

        rsubs = []

        for sub_data in result['data']:
            filename = sub_data['SubFileName']
            file_size = sub_data['SubSize']
            md5_hash = sub_data['SubHash']
            id_online = sub_data['IDSubMOvieFile']
            download_link = sub_data['SubDownloadLink']
            link = None
            uploader = sub_data['UserNickName']
            language = Language.from_xxx(sub_data['SubLanguageID'])
            rating = float(sub_data['SubRating'])
            add_date = datetime.datetime.strptime(sub_data['SubAddDate'],
                                                  '%Y-%m-%d %H:%M:%S')
            sub = OpenSubtitlesSubtitleFile(filename=filename,
                                            file_size=file_size,
                                            md5_hash=md5_hash,
                                            id_online=id_online,
                                            download_link=download_link,
                                            link=link,
                                            uploader=uploader,
                                            language=language,
                                            rating=rating,
                                            date=add_date)
            rsubs.append(sub)

        return UploadResult(type=UploadResult.Type.OK, rsubs=rsubs)
示例#28
0
def translators_get():
    from subdownloader.languages.language import Language
    return (Translator('Sylvestre Ledru', '*****@*****.**',
                       (Language.from_xx('fr'), )), )