diff --git a/lib/stevedore/dispatch.py b/lib/stevedore/dispatch.py index 226d3ae251925a91b799e47e8aa96a63f2f767f7..424d39b69ed2d6109733182eb0ada736e295b97e 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 fedc359bd5dbb7fc84b8e5cd43ad190c13ea4038..a2825aaaf14607aafa6ee78f08e01bf0406f3cbb 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 1c8ca4ca361a7bb19504feaf68089ff7228029fc..ec95424ee177830f025bea92d3410bae651ea6eb 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 afc7789c6e4005a83ad8640a1fc5d4feff85eca4..4289971f9a416ebf0e1a0b941f3e6fde885bc3e5 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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..17fe1300404e4c6ba16809a3deaecc8bb36e49d8 --- /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 0000000000000000000000000000000000000000..10c5cc26bfe864e9e11136af851e38a7cc20cbd1 --- /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 5da97c5d93efe7522fbaa5a28cbfbe9896bf3cfc..d2409885c633ab701c033172ac73160937d23c04 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 524f9c93c8d17cec963e829f8f92c7c302e0bf7d..3c9b6ce7f9fcd46004473370ec0f12d503cbdb7f 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 ff9c3eac05744ca7acd72e72c3e4b055cdf30190..0a919cf76b1980263d067560eae9f54f6b7f2263 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 a3eb39775ea02c0ffb273ecd6cfa6ebfee08593a..86aebf912f0f469d657531b40be4fc71c63cf626 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 b8ef43119f539f6a9a023c16b378d4a060016c56..2558fb7badb3d75dc1439d0536593dd61683cadf 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 b05b377682756efbd8115349d35e6d52a7ad952a..1fe02422e1e70f5b007ab09803767ff748d2e58c 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 4c0631efd474acb08cb4e46c56fc6a4968914597..25355a08ac99bae06b90931da603cea302c036ea 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 3af8809a7d89644a099971b1839dc4bc131f94dd..81cd1e0e5a85b75746269588a25a1d12926e2c43 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 6061319cb0f55c7c8286ceca7bdc173841bb5177..f00273f9579c0a2cc2aa1239fbcef5f8ad5590de 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 888f5cad2c4fbbda4b7acd1e0bc9a69dffd62feb..258e73647f8fb42a888512d51a5649c211dc762b 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 5a06a23b84cdc0f59a175f9e2789b1a1ee06aa28..3bd49e6cc0f1f1038eb7f45dd0aa76fd5132305d 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 f7f1f2451bc5400e4b4b0335c8584ddee1eee4ac..da325aaf9f8ab573597c4836447bac6b54f865c7 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 8c4433fc966bd5b0b54eba9b99dfab2291e6db9b..0b491c39e3f631afd5de98f3094bbb45acd8c5f4 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 b04d535cb60f25ddfb4023837cb9d99ff278a9f1..3384e7b3e3fb8197de318e799078d681e4420ee7 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 7b20b57330223bc0ed47829f0ca785c6e0539bc9..7073f95a5bf3b77e34a75b213cd8b55dc425f36f 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()}