From 62b5bd84b909e8e784cded76899ec653bbc3c071 Mon Sep 17 00:00:00 2001 From: Vitiko Date: Wed, 15 Feb 2023 20:51:55 -0400 Subject: [PATCH] Supersubtitles provider: update matcher and downloader --- .../providers/supersubtitles.py | 63 +++++++++---------- tests/subliminal_patch/test_supersubtitles.py | 4 +- 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/libs/subliminal_patch/providers/supersubtitles.py b/libs/subliminal_patch/providers/supersubtitles.py index cfc6bff00..7f779fedb 100644 --- a/libs/subliminal_patch/providers/supersubtitles.py +++ b/libs/subliminal_patch/providers/supersubtitles.py @@ -1,32 +1,34 @@ # coding=utf-8 -import io import logging +from random import randint import re import time +import urllib.parse from babelfish import language_converters -from subzero.language import Language +from bs4.element import NavigableString +from bs4.element import Tag +from guessit import guessit from requests import Session from requests.exceptions import JSONDecodeError -import urllib.parse -from random import randint - -from subliminal.subtitle import fix_line_ending +from subliminal.providers import ParserBeautifulSoup +from subliminal.score import get_equivalent_release_groups +from subliminal.utils import sanitize +from subliminal.utils import sanitize_release_group +from subliminal.video import Episode +from subliminal.video import Movie +from subliminal_patch.exceptions import APIThrottled from subliminal_patch.providers import Provider from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin -from subliminal.providers import ParserBeautifulSoup -from bs4.element import Tag, NavigableString -from subliminal.score import get_equivalent_release_groups -from subliminal_patch.subtitle import Subtitle, guess_matches -from subliminal_patch.exceptions import APIThrottled -from subliminal.utils import sanitize, sanitize_release_group -from subliminal.video import Episode, Movie -from zipfile import ZipFile, is_zipfile -from rarfile import RarFile, is_rarfile -from subliminal_patch.utils import sanitize, fix_inconsistent_naming -from guessit import guessit -from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST +from subliminal_patch.subtitle import Subtitle +from subliminal_patch.utils import fix_inconsistent_naming +from subliminal_patch.utils import sanitize +from subzero.language import Language +from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST +from .utils import get_archive_from_bytes +from .utils import get_subtitle_from_archive +from .utils import update_matches logger = logging.getLogger(__name__) @@ -78,7 +80,7 @@ class SuperSubtitlesSubtitle(Subtitle): self.season = season self.episode = episode self.version = version - self.releases = releases + self.releases = releases or [] self.year = year self.uploader = uploader if year: @@ -91,7 +93,7 @@ class SuperSubtitlesSubtitle(Subtitle): self.asked_for_episode = asked_for_episode self.imdb_id = imdb_id self.is_pack = True - self.matches = None + self.matches = set() def numeric_id(self): return self.subtitle_id @@ -109,8 +111,8 @@ class SuperSubtitlesSubtitle(Subtitle): return str(self.subtitle_id) def get_matches(self, video): - type_ = "movie" if isinstance(video, Movie) else "episode" - matches = guess_matches(video, guessit(self.release_info, {"type": type_})) + matches = set() + update_matches(matches, video, self.releases) # episode if isinstance(video, Episode): @@ -543,21 +545,12 @@ class SuperSubtitlesProvider(Provider, ProviderSubtitleArchiveMixin): return subtitles def download_subtitle(self, subtitle): - - # download as a zip - logger.info('Downloading subtitle %r', subtitle.subtitle_id) r = self.session.get(subtitle.page_link, timeout=10) r.raise_for_status() - archive_stream = io.BytesIO(r.content) - archive = None + archive = get_archive_from_bytes(r.content) - if is_rarfile(archive_stream): - archive = RarFile(archive_stream) - elif is_zipfile(archive_stream): - archive = ZipFile(archive_stream) - else: - subtitle.content = fix_line_ending(r.content) + if archive is None: + raise APIThrottled(f"Invalid archive from {subtitle.page_link}") - if archive is not None: - subtitle.content = self.get_subtitle_from_archive(subtitle, archive) + subtitle.content = get_subtitle_from_archive(archive, episode=subtitle.episode or None) diff --git a/tests/subliminal_patch/test_supersubtitles.py b/tests/subliminal_patch/test_supersubtitles.py index 6111cabc0..3794a04ca 100644 --- a/tests/subliminal_patch/test_supersubtitles.py +++ b/tests/subliminal_patch/test_supersubtitles.py @@ -44,7 +44,7 @@ def test_list_episode_subtitles(episode): def test_download_episode_subtitle(episode): subtitle = SuperSubtitlesSubtitle( Language.fromalpha2("en"), - "https://www.feliratok.info/index.php?action=letolt&felirat=1643361676", + "https://www.feliratok.eu/index.php?action=letolt&felirat=1643361676", 1643361676, "All of us are dead", 1, @@ -82,7 +82,7 @@ def test_download_movie_subtitle(movies): subtitle = SuperSubtitlesSubtitle( Language.fromalpha2("en"), - "https://www.feliratok.info/index.php?action=letolt&felirat=1634579718", + "https://www.feliratok.eu/index.php?action=letolt&felirat=1634579718", 1634579718, "Dune", 0,