From 1224c3f4df85af1ed975d02768017221325db1a4 Mon Sep 17 00:00:00 2001 From: medariox <dariovizz@hotmail.it> Date: Mon, 4 Jan 2016 17:45:34 +0100 Subject: [PATCH] Updated subliminal to latest version (17cce96), removes the need of monkey-patching it, updated stevedore to 1.10.0 --- lib/stevedore/dispatch.py | 3 +- lib/stevedore/driver.py | 9 +- lib/stevedore/example/base.py | 2 +- lib/stevedore/example/setup.py | 7 +- lib/stevedore/example2/__init__.py | 0 lib/stevedore/{example => example2}/fields.py | 0 lib/stevedore/example2/setup.py | 42 +++++++ lib/stevedore/exception.py | 10 ++ lib/stevedore/extension.py | 3 +- lib/stevedore/sphinxext.py | 13 +- lib/stevedore/tests/test_driver.py | 5 +- lib/stevedore/tests/test_example_fields.py | 4 +- lib/stevedore/tests/test_example_simple.py | 2 +- lib/stevedore/tests/test_extension.py | 3 +- lib/subliminal/__init__.py | 4 +- lib/subliminal/api.py | 117 +++++++++++++----- lib/subliminal/providers/addic7ed.py | 1 + lib/subliminal/providers/legendastv.py | 1 + lib/subliminal/providers/opensubtitles.py | 12 +- lib/subliminal/providers/thesubdb.py | 2 + lib/subliminal/providers/tvsubtitles.py | 1 + lib/subliminal/video.py | 2 +- sickbeard/subtitles.py | 39 ++---- 23 files changed, 191 insertions(+), 91 deletions(-) create mode 100644 lib/stevedore/example2/__init__.py rename lib/stevedore/{example => example2}/fields.py (100%) create mode 100644 lib/stevedore/example2/setup.py create mode 100644 lib/stevedore/exception.py diff --git a/lib/stevedore/dispatch.py b/lib/stevedore/dispatch.py index 226d3ae25..424d39b69 100644 --- a/lib/stevedore/dispatch.py +++ b/lib/stevedore/dispatch.py @@ -1,6 +1,7 @@ import logging from .enabled import EnabledExtensionManager +from .exception import NoMatches LOG = logging.getLogger(__name__) @@ -66,7 +67,7 @@ class DispatchExtensionManager(EnabledExtensionManager): """ if not self.extensions: # FIXME: Use a more specific exception class here. - raise RuntimeError('No %s extensions found' % self.namespace) + raise NoMatches('No %s extensions found' % self.namespace) response = [] for e in self.extensions: if filter_func(e, *args, **kwds): diff --git a/lib/stevedore/driver.py b/lib/stevedore/driver.py index fedc359bd..a2825aaaf 100644 --- a/lib/stevedore/driver.py +++ b/lib/stevedore/driver.py @@ -1,3 +1,4 @@ +from .exception import NoMatches, MultipleMatches from .named import NamedExtensionManager @@ -93,14 +94,14 @@ class DriverManager(NamedExtensionManager): if not self.extensions: name = self._names[0] - raise RuntimeError('No %r driver found, looking for %r' % - (self.namespace, name)) + raise NoMatches('No %r driver found, looking for %r' % + (self.namespace, name)) if len(self.extensions) > 1: discovered_drivers = ','.join(e.entry_point_target for e in self.extensions) - raise RuntimeError('Multiple %r drivers found: %s' % - (self.namespace, discovered_drivers)) + raise MultipleMatches('Multiple %r drivers found: %s' % + (self.namespace, discovered_drivers)) def __call__(self, func, *args, **kwds): """Invokes func() for the single loaded extension. diff --git a/lib/stevedore/example/base.py b/lib/stevedore/example/base.py index 1c8ca4ca3..ec95424ee 100644 --- a/lib/stevedore/example/base.py +++ b/lib/stevedore/example/base.py @@ -5,7 +5,7 @@ import six @six.add_metaclass(abc.ABCMeta) class FormatterBase(object): - """Base class for example plugin used in the tutoral. + """Base class for example plugin used in the tutorial. """ def __init__(self, max_width=60): diff --git a/lib/stevedore/example/setup.py b/lib/stevedore/example/setup.py index afc7789c6..4289971f9 100644 --- a/lib/stevedore/example/setup.py +++ b/lib/stevedore/example/setup.py @@ -7,16 +7,14 @@ setup( description='Demonstration package for stevedore', author='Doug Hellmann', - author_email='doug.hellmann@dreamhost.com', + author_email='doug@doughellmann.com', - url='https://github.com/dreamhost/stevedore', - download_url='https://github.com/dreamhost/stevedore/tarball/master', + url='http://git.openstack.org/cgit/openstack/stevedore', classifiers=['Development Status :: 3 - Alpha', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', @@ -37,7 +35,6 @@ setup( entry_points={ 'stevedore.example.formatter': [ 'simple = stevedore.example.simple:Simple', - 'field = stevedore.example.fields:FieldList', 'plain = stevedore.example.simple:Simple', ], }, diff --git a/lib/stevedore/example2/__init__.py b/lib/stevedore/example2/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/stevedore/example/fields.py b/lib/stevedore/example2/fields.py similarity index 100% rename from lib/stevedore/example/fields.py rename to lib/stevedore/example2/fields.py diff --git a/lib/stevedore/example2/setup.py b/lib/stevedore/example2/setup.py new file mode 100644 index 000000000..17fe13004 --- /dev/null +++ b/lib/stevedore/example2/setup.py @@ -0,0 +1,42 @@ +from setuptools import setup, find_packages + +setup( + name='stevedore-examples2', + version='1.0', + + description='Demonstration package for stevedore', + + author='Doug Hellmann', + author_email='doug@doughellmann.com', + + url='http://git.openstack.org/cgit/openstack/stevedore', + + classifiers=['Development Status :: 3 - Alpha', + 'License :: OSI Approved :: Apache Software License', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Intended Audience :: Developers', + 'Environment :: Console', + ], + + platforms=['Any'], + + scripts=[], + + provides=['stevedore.examples2', + ], + + packages=find_packages(), + include_package_data=True, + + entry_points={ + 'stevedore.example.formatter': [ + 'field = stevedore.example2.fields:FieldList', + ], + }, + + zip_safe=False, +) diff --git a/lib/stevedore/exception.py b/lib/stevedore/exception.py new file mode 100644 index 000000000..10c5cc26b --- /dev/null +++ b/lib/stevedore/exception.py @@ -0,0 +1,10 @@ +class NoUniqueMatch(RuntimeError): + """There was more that one on no extensions matching the query.""" + + +class NoMatches(NoUniqueMatch): + """There were no extensions with the diver name found.""" + + +class MultipleMatches(NoUniqueMatch): + """There were multiple matches for the given name.""" diff --git a/lib/stevedore/extension.py b/lib/stevedore/extension.py index 5da97c5d9..d2409885c 100644 --- a/lib/stevedore/extension.py +++ b/lib/stevedore/extension.py @@ -5,6 +5,7 @@ import pkg_resources import logging +from .exception import NoMatches LOG = logging.getLogger(__name__) @@ -218,7 +219,7 @@ class ExtensionManager(object): """ if not self.extensions: # FIXME: Use a more specific exception class here. - raise RuntimeError('No %s extensions found' % self.namespace) + raise NoMatches('No %s extensions found' % self.namespace) response = [] for e in self.extensions: self._invoke_one_plugin(response.append, func, e, args, kwds) diff --git a/lib/stevedore/sphinxext.py b/lib/stevedore/sphinxext.py index 524f9c93c..3c9b6ce7f 100644 --- a/lib/stevedore/sphinxext.py +++ b/lib/stevedore/sphinxext.py @@ -36,12 +36,15 @@ def _simple_list(mgr): ext.entry_point.module_name) -def _detailed_list(mgr, over='', under='-'): +def _detailed_list(mgr, over='', under='-', titlecase=False): for name in sorted(mgr.names()): ext = mgr[name] if over: yield (over * len(ext.name), ext.entry_point.module_name) - yield (ext.name, ext.entry_point.module_name) + if titlecase: + yield (ext.name.title(), ext.entry_point.module_name) + else: + yield (ext.name, ext.entry_point.module_name) if under: yield (under * len(ext.name), ext.entry_point.module_name) yield ('\n', ext.entry_point.module_name) @@ -61,6 +64,7 @@ class ListPluginsDirective(rst.Directive): option_spec = { 'class': directives.class_option, 'detailed': directives.flag, + 'titlecase': directives.flag, 'overline-style': directives.single_char_or_unicode, 'underline-style': directives.single_char_or_unicode, } @@ -86,9 +90,12 @@ class ListPluginsDirective(rst.Directive): result = ViewList() + titlecase = 'titlecase' in self.options + if 'detailed' in self.options: data = _detailed_list( - mgr, over=overline_style, under=underline_style) + mgr, over=overline_style, under=underline_style, + titlecase=titlecase) else: data = _simple_list(mgr) for text, source in data: diff --git a/lib/stevedore/tests/test_driver.py b/lib/stevedore/tests/test_driver.py index ff9c3eac0..0a919cf76 100644 --- a/lib/stevedore/tests/test_driver.py +++ b/lib/stevedore/tests/test_driver.py @@ -4,6 +4,7 @@ import pkg_resources from stevedore import driver +from stevedore import exception from stevedore import extension from stevedore.tests import test_extension from stevedore.tests import utils @@ -37,7 +38,7 @@ class TestCallback(utils.TestCase): def test_no_drivers(self): try: driver.DriverManager('stevedore.test.extension.none', 't1') - except RuntimeError as err: + except exception.NoMatches as err: self.assertIn("No 'stevedore.test.extension.none' driver found", str(err)) @@ -70,7 +71,7 @@ class TestCallback(utils.TestCase): dm = driver.DriverManager.make_test_instance(extensions[0]) # Call the initialization code that verifies the extension dm._init_plugins(extensions) - except RuntimeError as err: + except exception.MultipleMatches as err: self.assertIn("Multiple", str(err)) else: self.fail('Should have had an error') diff --git a/lib/stevedore/tests/test_example_fields.py b/lib/stevedore/tests/test_example_fields.py index a3eb39775..86aebf912 100644 --- a/lib/stevedore/tests/test_example_fields.py +++ b/lib/stevedore/tests/test_example_fields.py @@ -1,7 +1,7 @@ -"""Tests for stevedore.exmaple.fields +"""Tests for stevedore.example2.fields """ -from stevedore.example import fields +from stevedore.example2 import fields from stevedore.tests import utils diff --git a/lib/stevedore/tests/test_example_simple.py b/lib/stevedore/tests/test_example_simple.py index b8ef43119..2558fb7ba 100644 --- a/lib/stevedore/tests/test_example_simple.py +++ b/lib/stevedore/tests/test_example_simple.py @@ -1,4 +1,4 @@ -"""Tests for stevedore.exmaple.simple +"""Tests for stevedore.example.simple """ from stevedore.example import simple diff --git a/lib/stevedore/tests/test_extension.py b/lib/stevedore/tests/test_extension.py index b05b37768..1fe02422e 100644 --- a/lib/stevedore/tests/test_extension.py +++ b/lib/stevedore/tests/test_extension.py @@ -3,6 +3,7 @@ import mock +from stevedore import exception from stevedore import extension from stevedore.tests import utils @@ -159,7 +160,7 @@ class TestCallback(utils.TestCase): ) try: em.map(mapped, 1, 2, a='A', b='B') - except RuntimeError as err: + except exception.NoMatches as err: self.assertEqual(expected_str, str(err)) def test_map_method(self): diff --git a/lib/subliminal/__init__.py b/lib/subliminal/__init__.py index 4c0631efd..25355a08a 100644 --- a/lib/subliminal/__init__.py +++ b/lib/subliminal/__init__.py @@ -7,8 +7,8 @@ __copyright__ = 'Copyright 2015, Antoine Bertin' import logging -from .api import (ProviderPool, check_video, provider_manager, download_best_subtitles, download_subtitles, - list_subtitles, save_subtitles) +from .api import (ProviderManager, ProviderPool, check_video, provider_manager, download_best_subtitles, + download_subtitles, list_subtitles, save_subtitles) from .cache import region from .exceptions import Error, ProviderError from .providers import Provider diff --git a/lib/subliminal/api.py b/lib/subliminal/api.py index 3af8809a7..81cd1e0e5 100644 --- a/lib/subliminal/api.py +++ b/lib/subliminal/api.py @@ -4,43 +4,102 @@ import io import logging import operator import os.path +from pkg_resources import EntryPoint import socket from babelfish import Language -from pkg_resources import EntryPoint import requests -from stevedore import EnabledExtensionManager, ExtensionManager +from stevedore import ExtensionManager from .subtitle import compute_score, get_subtitle_path logger = logging.getLogger(__name__) -class InternalExtensionManager(ExtensionManager): - """Add support for internal entry points to the :class:`~stevedore.extension.Extensionmanager` - Internal entry points are useful for libraries that ship their own plugins but still keep the entry point open. - All other parameters are passed onwards to the :class:`~stevedore.extension.Extensionmanager` constructor. - :param internal_entry_points: the internal providers - :type internal_entry_points: list of :class:`~pkg_resources.EntryPoint` +class ProviderManager(ExtensionManager): + """Manager for providers based on :class:`~stevedore.extension.ExtensionManager`. + + It allows loading of internal providers without setup and registering/unregistering additional providers. + + Loading is done in this order: + + * Entry point providers + * Internal providers + * Registered providers + """ - def __init__(self, namespace, internal_entry_points, **kwargs): - self.internal_entry_points = list(internal_entry_points) - super(InternalExtensionManager, self).__init__(namespace, **kwargs) + internal_providers = [ + 'addic7ed = subliminal.providers.addic7ed:Addic7edProvider', + 'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider', + 'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider', + 'subscenter = subliminal.providers.subscenter:SubsCenterProvider', + 'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider', + 'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider' + ] + + def __init__(self): + #: Registered providers with entry point syntax + self.registered_providers = [] + + super(ProviderManager, self).__init__('subliminal.providers') def _find_entry_points(self, namespace): - return self.internal_entry_points + super(InternalExtensionManager, self)._find_entry_points(namespace) + # default entry points + eps = super(ProviderManager, self)._find_entry_points(namespace) + + # internal entry points + for iep in self.internal_providers: + ep = EntryPoint.parse(iep) + if ep.name not in [e.name for e in eps]: + eps.append(ep) + + # registered entry points + for rep in self.registered_providers: + ep = EntryPoint.parse(rep) + if ep.name not in [e.name for e in eps]: + eps.append(ep) + + return eps + def register(self, entry_point): + """Register a provider -provider_manager = InternalExtensionManager('subliminal.providers', [EntryPoint.parse(ep) for ep in ( - 'addic7ed = subliminal.providers.addic7ed:Addic7edProvider', - 'legendastv = subliminal.providers.legendastv:LegendasTvProvider', - 'napiprojekt = subliminal.providers.napiprojekt:NapiProjektProvider', - 'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider', - 'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider', - 'subscenter = subliminal.providers.subscenter:SubsCenterProvider', - 'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider', - 'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider' -)]) + :param str entry_point: provider to register (entry point syntax) + :raise: ValueError if already registered + + """ + if entry_point in self.registered_providers: + raise ValueError('Entry point already registered') + + ep = EntryPoint.parse(entry_point) + if ep.name in self.names(): + raise ValueError('A provider with the same name already exist') + + ext = self._load_one_plugin(ep, False, (), {}, False) + self.extensions.append(ext) + if self._extensions_by_name is not None: + self._extensions_by_name[ext.name] = ext + self.registered_providers.insert(0, entry_point) + + def unregister(self, entry_point): + """Unregister a provider + + :param str entry_point: provider to unregister (entry point syntax) + + """ + if entry_point not in self.registered_providers: + raise ValueError('Entry point not registered') + + ep = EntryPoint.parse(entry_point) + self.registered_providers.remove(entry_point) + if self._extensions_by_name is not None: + del self._extensions_by_name[ep.name] + for i, ext in enumerate(self.extensions): + if ext.name == ep.name: + del self.extensions[i] + break + +provider_manager = ProviderManager() class ProviderPool(object): @@ -52,8 +111,7 @@ class ProviderPool(object): the providers on exit. * Automatically discard providers on failure. - :param providers: name of providers to use, if not all. - :type providers: list + :param list providers: name of providers to use, if not all. :param dict provider_configs: provider configuration as keyword arguments per provider name to pass when instanciating the :class:`~subliminal.providers.Provider`. @@ -71,9 +129,6 @@ class ProviderPool(object): #: Discarded providers self.discarded_providers = set() - #: Dedicated :data:`provider_manager` as :class:`~stevedore.enabled.EnabledExtensionManager` - self.manager = EnabledExtensionManager(provider_manager.namespace, lambda e: e.name in self.providers) - def __enter__(self): return self @@ -81,9 +136,11 @@ class ProviderPool(object): self.terminate() def __getitem__(self, name): + if name not in self.providers: + raise KeyError if name not in self.initialized_providers: logger.info('Initializing provider %s', name) - provider = self.manager[name].plugin(**self.provider_configs.get(name, {})) + provider = provider_manager[name].plugin(**self.provider_configs.get(name, {})) provider.initialize() self.initialized_providers[name] = provider @@ -126,12 +183,12 @@ class ProviderPool(object): continue # check video validity - if not self.manager[name].plugin.check(video): + if not provider_manager[name].plugin.check(video): logger.info('Skipping provider %r: not a valid video', name) continue # check supported languages - provider_languages = self.manager[name].plugin.languages & languages + provider_languages = provider_manager[name].plugin.languages & languages if not provider_languages: logger.info('Skipping provider %r: no language to search for', name) continue diff --git a/lib/subliminal/providers/addic7ed.py b/lib/subliminal/providers/addic7ed.py index 6061319cb..f00273f95 100644 --- a/lib/subliminal/providers/addic7ed.py +++ b/lib/subliminal/providers/addic7ed.py @@ -14,6 +14,7 @@ from ..subtitle import (Subtitle, fix_line_ending, guess_matches, guess_properti from ..video import Episode logger = logging.getLogger(__name__) + language_converters.register('addic7ed = subliminal.converters.addic7ed:Addic7edConverter') series_year_re = re.compile('^(?P<series>[ \w\'.:]+)(?: \((?P<year>\d{4})\))?$') diff --git a/lib/subliminal/providers/legendastv.py b/lib/subliminal/providers/legendastv.py index 888f5cad2..258e73647 100644 --- a/lib/subliminal/providers/legendastv.py +++ b/lib/subliminal/providers/legendastv.py @@ -20,6 +20,7 @@ from ..video import Episode, Movie, SUBTITLE_EXTENSIONS TIMEOUT = 10 logger = logging.getLogger(__name__) + language_converters.register('legendastv = subliminal.converters.legendastv:LegendasTvConverter') diff --git a/lib/subliminal/providers/opensubtitles.py b/lib/subliminal/providers/opensubtitles.py index 5a06a23b8..3bd49e6cc 100644 --- a/lib/subliminal/providers/opensubtitles.py +++ b/lib/subliminal/providers/opensubtitles.py @@ -121,13 +121,15 @@ class OpenSubtitlesProvider(Provider): logger.debug('No operation') checked(self.server.NoOperation(self.token)) - def query(self, languages, hash=None, size=None, imdb_id=None, query=None, season=None, episode=None): + def query(self, languages, hash=None, size=None, imdb_id=None, query=None, season=None, episode=None, tag=None): # fill the search criteria criteria = [] if hash and size: criteria.append({'moviehash': hash, 'moviebytesize': str(size)}) if imdb_id: criteria.append({'imdbid': imdb_id}) + if tag: + criteria.append({'tag': tag}) if query and season and episode: criteria.append({'query': query.replace('\'', ''), 'season': season, 'episode': episode}) elif query: @@ -176,16 +178,16 @@ class OpenSubtitlesProvider(Provider): return subtitles def list_subtitles(self, video, languages): - query = season = episode = None + season = episode = None if isinstance(video, Episode): query = video.series season = video.season episode = video.episode - elif ('opensubtitles' not in video.hashes or not video.size) and not video.imdb_id: - query = video.name.split(os.sep)[-1] + else: + query = video.title return self.query(languages, hash=video.hashes.get('opensubtitles'), size=video.size, imdb_id=video.imdb_id, - query=query, season=season, episode=episode) + query=query, season=season, episode=episode, tag=os.path.basename(video.name)) def download_subtitle(self, subtitle): logger.info('Downloading subtitle %r', subtitle) diff --git a/lib/subliminal/providers/thesubdb.py b/lib/subliminal/providers/thesubdb.py index f7f1f2451..da325aaf9 100644 --- a/lib/subliminal/providers/thesubdb.py +++ b/lib/subliminal/providers/thesubdb.py @@ -10,8 +10,10 @@ from ..subtitle import Subtitle, fix_line_ending logger = logging.getLogger(__name__) + language_converters.register('thesubdb = subliminal.converters.thesubdb:TheSubDBConverter') + class TheSubDBSubtitle(Subtitle): provider_name = 'thesubdb' diff --git a/lib/subliminal/providers/tvsubtitles.py b/lib/subliminal/providers/tvsubtitles.py index 8c4433fc9..0b491c39e 100644 --- a/lib/subliminal/providers/tvsubtitles.py +++ b/lib/subliminal/providers/tvsubtitles.py @@ -15,6 +15,7 @@ from ..subtitle import Subtitle, fix_line_ending, guess_matches, guess_propertie from ..video import Episode logger = logging.getLogger(__name__) + language_converters.register('tvsubtitles = subliminal.converters.tvsubtitles:TVsubtitlesConverter') link_re = re.compile('^(?P<series>.+?)(?: \(?\d{4}\)?| \((?:US|UK)\))? \((?P<first_year>\d{4})-\d{4}\)$') diff --git a/lib/subliminal/video.py b/lib/subliminal/video.py index b04d535cb..3384e7b3e 100644 --- a/lib/subliminal/video.py +++ b/lib/subliminal/video.py @@ -7,7 +7,7 @@ import os import struct from babelfish import Error as BabelfishError, Language -from enzyme import Error as EnzymeError, MKV +from enzyme import MKV from guessit import guess_episode_info, guess_file_info, guess_movie_info logger = logging.getLogger(__name__) diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index 7b20b5733..7073f95a5 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -25,10 +25,9 @@ import datetime import traceback import subliminal import subprocess -import pkg_resources import sickbeard -from subliminal.api import provider_manager from babelfish import Language, language_converters +from subliminal import ProviderPool, provider_manager from sickbeard import logger from sickbeard import history from sickbeard import db @@ -40,32 +39,8 @@ from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex from sickrage.show.Show import Show -DISTRIBUTION = pkg_resources.Distribution(location=os.path.dirname(os.path.dirname(__file__)), - project_name='fake_entry_points', version='1.0.0') - -ENTRY_POINTS = { - 'subliminal.providers': [ - 'addic7ed = subliminal.providers.addic7ed:Addic7edProvider', - 'legendastv = subliminal.providers.legendastv:LegendasTvProvider', - 'napiprojekt = subliminal.providers.napiprojekt:NapiProjektProvider', - 'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider', - 'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider', - 'subscenter = subliminal.providers.subscenter:SubsCenterProvider', - 'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider', - 'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider' - ], - 'babelfish.language_converters': [ - 'addic7ed = subliminal.converters.addic7ed:Addic7edConverter', - 'legendastv = subliminal.converters.legendastv:LegendasTvConverter', - 'thesubdb = subliminal.converters.thesubdb:TheSubDBConverter', - 'tvsubtitles = subliminal.converters.tvsubtitles:TVsubtitlesConverter' - ] -} - -DISTRIBUTION._ep_map = pkg_resources.EntryPoint.parse_map(ENTRY_POINTS, DISTRIBUTION) # pylint: disable=protected-access -pkg_resources.working_set.add(DISTRIBUTION) - -provider_manager.ENTRY_POINT_CACHE.pop('subliminal.providers') +provider_manager.register('legendastv = subliminal.providers.legendastv:LegendasTvProvider') +provider_manager.register('napiprojekt = subliminal.providers.napiprojekt:NapiProjektProvider') subliminal.region.configure('dogpile.cache.memory') @@ -87,14 +62,14 @@ def sorted_service_list(): current_index = 0 for current_service in sickbeard.SUBTITLES_SERVICES_LIST: - if current_service in subliminal.provider_manager.names(): + if current_service in provider_manager.names(): new_list.append({'name': current_service, 'url': PROVIDER_URLS[current_service] if current_service in PROVIDER_URLS else lmgtfy % current_service, 'image': current_service + '.png', 'enabled': sickbeard.SUBTITLES_SERVICES_ENABLED[current_index] == 1}) current_index += 1 - for current_service in subliminal.provider_manager.names(): + for current_service in provider_manager.names(): if current_service not in [service['name'] for service in new_list]: new_list.append({'name': current_service, 'url': PROVIDER_URLS[current_service] if current_service in PROVIDER_URLS else lmgtfy % current_service, @@ -187,7 +162,7 @@ def download_subtitles(subtitles_info): # pylint: disable=too-many-locals, too- 'opensubtitles': {'username': sickbeard.OPENSUBTITLES_USER, 'password': sickbeard.OPENSUBTITLES_PASS}} - pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs) + pool = ProviderPool(providers=providers, provider_configs=provider_configs) try: subtitles_list = pool.list_subtitles(video, languages) @@ -333,7 +308,7 @@ class SubtitlesFinder(object): 'opensubtitles': {'username': sickbeard.OPENSUBTITLES_USER, 'password': sickbeard.OPENSUBTITLES_PASS}} - pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs) + pool = ProviderPool(providers=providers, provider_configs=provider_configs) # Search for all wanted languages languages = {from_code(language) for language in wanted_languages()} -- GitLab