Merge remote-tracking branch 'origin/development' into development

pull/2064/head v1.1.5-beta.17
morpheus65535 2 years ago
commit 2ae4738a14

@ -1,32 +1,34 @@
# coding=utf-8 # coding=utf-8
import io
import logging import logging
from random import randint
import re import re
import time import time
import urllib.parse
from babelfish import language_converters 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 import Session
from requests.exceptions import JSONDecodeError from requests.exceptions import JSONDecodeError
import urllib.parse
from random import randint
from subliminal.subtitle import fix_line_ending
from subliminal_patch.providers import Provider
from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
from subliminal.providers import ParserBeautifulSoup from subliminal.providers import ParserBeautifulSoup
from bs4.element import Tag, NavigableString
from subliminal.score import get_equivalent_release_groups from subliminal.score import get_equivalent_release_groups
from subliminal_patch.subtitle import Subtitle, guess_matches 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.exceptions import APIThrottled
from subliminal.utils import sanitize, sanitize_release_group from subliminal_patch.providers import Provider
from subliminal.video import Episode, Movie from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
from zipfile import ZipFile, is_zipfile from subliminal_patch.subtitle import Subtitle
from rarfile import RarFile, is_rarfile from subliminal_patch.utils import fix_inconsistent_naming
from subliminal_patch.utils import sanitize, fix_inconsistent_naming from subliminal_patch.utils import sanitize
from guessit import guessit from subzero.language import Language
from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST
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__) logger = logging.getLogger(__name__)
@ -78,7 +80,7 @@ class SuperSubtitlesSubtitle(Subtitle):
self.season = season self.season = season
self.episode = episode self.episode = episode
self.version = version self.version = version
self.releases = releases self.releases = releases or []
self.year = year self.year = year
self.uploader = uploader self.uploader = uploader
if year: if year:
@ -91,7 +93,7 @@ class SuperSubtitlesSubtitle(Subtitle):
self.asked_for_episode = asked_for_episode self.asked_for_episode = asked_for_episode
self.imdb_id = imdb_id self.imdb_id = imdb_id
self.is_pack = True self.is_pack = True
self.matches = None self.matches = set()
def numeric_id(self): def numeric_id(self):
return self.subtitle_id return self.subtitle_id
@ -109,8 +111,8 @@ class SuperSubtitlesSubtitle(Subtitle):
return str(self.subtitle_id) return str(self.subtitle_id)
def get_matches(self, video): def get_matches(self, video):
type_ = "movie" if isinstance(video, Movie) else "episode" matches = set()
matches = guess_matches(video, guessit(self.release_info, {"type": type_})) update_matches(matches, video, self.releases)
# episode # episode
if isinstance(video, Episode): if isinstance(video, Episode):
@ -543,21 +545,12 @@ class SuperSubtitlesProvider(Provider, ProviderSubtitleArchiveMixin):
return subtitles return subtitles
def download_subtitle(self, subtitle): 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 = self.session.get(subtitle.page_link, timeout=10)
r.raise_for_status() r.raise_for_status()
archive_stream = io.BytesIO(r.content) archive = get_archive_from_bytes(r.content)
archive = None
if is_rarfile(archive_stream): if archive is None:
archive = RarFile(archive_stream) raise APIThrottled(f"Invalid archive from {subtitle.page_link}")
elif is_zipfile(archive_stream):
archive = ZipFile(archive_stream)
else:
subtitle.content = fix_line_ending(r.content)
if archive is not None: subtitle.content = get_subtitle_from_archive(archive, episode=subtitle.episode or None)
subtitle.content = self.get_subtitle_from_archive(subtitle, archive)

@ -4,9 +4,12 @@ import io
import logging import logging
import os import os
import re import re
import tempfile
from typing import Iterable, Union
import zipfile import zipfile
from guessit import guessit from guessit import guessit
import pysubs2
import rarfile import rarfile
from subliminal.subtitle import fix_line_ending from subliminal.subtitle import fix_line_ending
from subliminal_patch.core import Episode from subliminal_patch.core import Episode
@ -119,10 +122,10 @@ def is_episode(content):
def get_archive_from_bytes(content: bytes): def get_archive_from_bytes(content: bytes):
"""Get RarFile/ZipFile object from bytes. Return None is something else """Get RarFile/ZipFile object from bytes. A ZipFile instance will be returned
is found.""" if a subtitle-like stream is found. Return None if something else is found."""
# open the archive
archive_stream = io.BytesIO(content) archive_stream = io.BytesIO(content)
if rarfile.is_rarfile(archive_stream): if rarfile.is_rarfile(archive_stream):
logger.debug("Identified rar archive") logger.debug("Identified rar archive")
return rarfile.RarFile(archive_stream) return rarfile.RarFile(archive_stream)
@ -130,18 +133,50 @@ def get_archive_from_bytes(content: bytes):
logger.debug("Identified zip archive") logger.debug("Identified zip archive")
return zipfile.ZipFile(archive_stream) return zipfile.ZipFile(archive_stream)
logger.debug("Unknown compression format") logger.debug("No compression format found. Trying with subtitle-like files")
# If the file is a subtitle-like file
with tempfile.NamedTemporaryFile(prefix="spsub", suffix=".srt") as tmp_f:
try:
tmp_f.write(content)
sub = pysubs2.load(tmp_f.name)
except Exception as error:
logger.debug("Couldn't load file: '%s'", error)
else:
if sub is not None:
logger.debug("Identified subtitle file: %s", sub)
zip_obj = zipfile.ZipFile(io.BytesIO(), mode="x")
zip_obj.write(tmp_f.name, os.path.basename(tmp_f.name))
return zip_obj
logger.debug("Nothing found")
return None return None
def update_matches(matches, video, release_info: str, **guessit_options): def update_matches(
"Update matches set from release info string. New lines are iterated." matches,
video,
release_info: Union[str, Iterable[str]],
split="\n",
**guessit_options
):
"""Update matches set from release info string or Iterable.
Use the split parameter to iterate over the set delimiter; set None to avoid split."""
guessit_options["type"] = "episode" if isinstance(video, Episode) else "movie" guessit_options["type"] = "episode" if isinstance(video, Episode) else "movie"
logger.debug("Guessit options to update matches: %s", guessit_options) logger.debug("Guessit options to update matches: %s", guessit_options)
for release in release_info.split("\n"): if isinstance(release_info, str):
logger.debug("Updating matches from release info: %s", release) release_info = release_info.split(split)
matches |= guess_matches(video, guessit(release.strip(), guessit_options))
logger.debug("New matches: %s", matches) for release in release_info:
for release_split in release.split(split):
logger.debug("Updating matches from release info: %s", release)
matches |= guess_matches(
video, guessit(release_split.strip(), guessit_options)
)
logger.debug("New matches: %s", matches)
return matches return matches

@ -44,7 +44,7 @@ def test_list_episode_subtitles(episode):
def test_download_episode_subtitle(episode): def test_download_episode_subtitle(episode):
subtitle = SuperSubtitlesSubtitle( subtitle = SuperSubtitlesSubtitle(
Language.fromalpha2("en"), Language.fromalpha2("en"),
"https://www.feliratok.info/index.php?action=letolt&felirat=1643361676", "https://www.feliratok.eu/index.php?action=letolt&felirat=1643361676",
1643361676, 1643361676,
"All of us are dead", "All of us are dead",
1, 1,
@ -82,7 +82,7 @@ def test_download_movie_subtitle(movies):
subtitle = SuperSubtitlesSubtitle( subtitle = SuperSubtitlesSubtitle(
Language.fromalpha2("en"), Language.fromalpha2("en"),
"https://www.feliratok.info/index.php?action=letolt&felirat=1634579718", "https://www.feliratok.eu/index.php?action=letolt&felirat=1634579718",
1634579718, 1634579718,
"Dune", "Dune",
0, 0,

@ -122,6 +122,14 @@ def test_update_matches(movies):
assert "source" in matches assert "source" in matches
def test_update_matches_iterable(movies):
matches = set()
utils.update_matches(
matches, movies["dune"], ["Subs for dune 2021 bluray x264", "Dune webrip x264"]
)
assert "source" in matches
@pytest.mark.parametrize( @pytest.mark.parametrize(
"content,expected", [("the.wire.s01e01", True), ("taxi driver 1976", False)] "content,expected", [("the.wire.s01e01", True), ("taxi driver 1976", False)]
) )

Loading…
Cancel
Save