reduce XMLRPC requests to opensubtitles server

- use cached token instead of logging in every time when search for subtitles
- delete authentication token in case of account modification
pull/1014/head
josdion 5 years ago
parent 4bc21e645a
commit 32bd30e3e7

@ -65,7 +65,7 @@ from notifier import send_notifications, send_notifications_movie
from check_update import check_and_apply_update from check_update import check_and_apply_update
from subliminal_patch.extensions import provider_registry as provider_manager from subliminal_patch.extensions import provider_registry as provider_manager
from subliminal_patch.core import SUBTITLE_EXTENSIONS from subliminal_patch.core import SUBTITLE_EXTENSIONS
from subliminal.cache import region
scheduler = Scheduler() scheduler = Scheduler()
@ -1536,7 +1536,13 @@ def save_settings():
settings_opensubtitles_skip_wrong_fps = 'False' settings_opensubtitles_skip_wrong_fps = 'False'
else: else:
settings_opensubtitles_skip_wrong_fps = 'True' settings_opensubtitles_skip_wrong_fps = 'True'
if (settings.opensubtitles.username != request.forms.get('settings_opensubtitles_username') or
settings.opensubtitles.password != request.forms.get('settings_opensubtitles_password') or
settings.opensubtitles.vip != text_type(settings_opensubtitles_vip)):
region.delete("os_token")
region.delete("os_server_url")
settings.addic7ed.username = request.forms.get('settings_addic7ed_username') settings.addic7ed.username = request.forms.get('settings_addic7ed_username')
settings.addic7ed.password = request.forms.get('settings_addic7ed_password') settings.addic7ed.password = request.forms.get('settings_addic7ed_password')
settings.addic7ed.random_agents = text_type(settings_addic7ed_random_agents) settings.addic7ed.random_agents = text_type(settings_addic7ed_random_agents)

@ -144,11 +144,9 @@ class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider):
return ServerProxy(url, SubZeroRequestsTransport(use_https=self.use_ssl, timeout=timeout or self.timeout, return ServerProxy(url, SubZeroRequestsTransport(use_https=self.use_ssl, timeout=timeout or self.timeout,
user_agent=os.environ.get("SZ_USER_AGENT", "Sub-Zero/2"))) user_agent=os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")))
def log_in(self, server_url=None): def log_in_url(self, server_url):
if server_url: self.token = None
self.terminate() self.server = self.get_server_proxy(server_url)
self.server = self.get_server_proxy(server_url)
response = self.retry( response = self.retry(
lambda: checked( lambda: checked(
@ -161,6 +159,25 @@ class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider):
logger.debug('Logged in with token %r', self.token[:10]+"X"*(len(self.token)-10)) logger.debug('Logged in with token %r', self.token[:10]+"X"*(len(self.token)-10))
region.set("os_token", bytearray(self.token, encoding='utf-8')) region.set("os_token", bytearray(self.token, encoding='utf-8'))
region.set("os_server_url", bytearray(server_url, encoding='utf-8'))
def log_in(self):
logger.info('Logging in')
try:
self.log_in_url(self.vip_url if self.is_vip else self.default_url)
except Unauthorized:
if self.is_vip:
logger.info("VIP server login failed, falling back")
try:
self.log_in_url(self.default_url)
except Unauthorized:
pass
if not self.token:
logger.error("Login failed, please check your credentials")
raise Unauthorized
def use_token_or_login(self, func): def use_token_or_login(self, func):
if not self.token: if not self.token:
@ -173,46 +190,18 @@ class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider):
return func() return func()
def initialize(self): def initialize(self):
if self.is_vip:
self.server = self.get_server_proxy(self.vip_url)
logger.info("Using VIP server")
else:
self.server = self.get_server_proxy(self.default_url)
logger.info('Logging in')
token_cache = region.get("os_token") token_cache = region.get("os_token")
if token_cache is not NO_VALUE: url_cache = region.get("os_server_url")
try:
token = token_cache.decode("utf-8")
logger.debug('Trying previous token: %r', token[:10]+"X"*(len(token)-10))
checked(lambda: self.server.NoOperation(token))
self.token = token
logger.debug("Using previous login token: %r", token[:10]+"X"*(len(token)-10))
return
except (NoSession, Unauthorized):
logger.debug('Token not valid.')
pass
try:
self.log_in()
except Unauthorized: if token_cache is not NO_VALUE and url_cache is not NO_VALUE:
if self.is_vip: self.token = token_cache.decode("utf-8")
logger.info("VIP server login failed, falling back") self.server = self.get_server_proxy(url_cache.decode("utf-8"))
self.log_in(self.default_url) logger.debug("Using previous login token: %r", self.token[:10] + "X" * (len(self.token) - 10))
if self.token: else:
return self.server = None
self.token = None
logger.error("Login failed, please check your credentials")
def terminate(self): def terminate(self):
if self.token:
try:
checked(lambda: self.server.LogOut(self.token))
except:
logger.error("Logout failed: %s", traceback.format_exc())
self.server = None self.server = None
self.token = None self.token = None

Loading…
Cancel
Save