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

pull/1437/head^2
morpheus65535 3 years ago
commit 19983a0f22

@ -14,7 +14,7 @@ from . import Provider, TimeoutSafeTransport
from .. import __short_version__
from ..exceptions import (AuthenticationError, ConfigurationError, DownloadLimitExceeded, ProviderError,
ServiceUnavailable)
from ..subtitle import Subtitle, fix_line_ending, guess_matches
from ..subtitle import Subtitle, fix_line_ending
from ..utils import sanitize
from ..video import Episode, Movie
@ -56,7 +56,6 @@ class OpenSubtitlesSubtitle(Subtitle):
def get_matches(self, video):
matches = set()
# episode
if isinstance(video, Episode) and self.movie_kind == 'episode':
# tag match, assume series, year, season and episode matches
@ -78,9 +77,7 @@ class OpenSubtitlesSubtitle(Subtitle):
# title
if video.title and sanitize(self.series_title) == sanitize(video.title):
matches.add('title')
# guess
matches |= guess_matches(video, guessit(self.movie_release_name, {'type': 'episode'}))
matches |= guess_matches(video, guessit(self.filename, {'type': 'episode'}))
# hash
if 'opensubtitles' in video.hashes and self.hash == video.hashes['opensubtitles']:
if 'series' in matches and 'season' in matches and 'episode' in matches:
@ -99,9 +96,6 @@ class OpenSubtitlesSubtitle(Subtitle):
# year
if video.year and self.movie_year == video.year:
matches.add('year')
# guess
matches |= guess_matches(video, guessit(self.movie_release_name, {'type': 'movie'}))
matches |= guess_matches(video, guessit(self.filename, {'type': 'movie'}))
# hash
if 'opensubtitles' in video.hashes and self.hash == video.hashes['opensubtitles']:
if 'title' in matches:

@ -4,6 +4,7 @@ import logging
import os
import io
import time
import urllib.parse
from zipfile import ZipFile
from guessit import guessit
@ -30,17 +31,26 @@ class ArgenteamSubtitle(Subtitle):
self.page_link = page_link
self.download_link = download_link
self.found_matches = matches
self.release_info = release_info
self._release_info = release_info
# Original subtitle filename guessed from the URL
self.release_info = urllib.parse.unquote(self.download_link.split("/")[-1])
@property
def id(self):
return self.download_link
def get_matches(self, video):
# Download links always have the srt filename with the release info.
# We combine it with the release info as guessit will return the first key match.
new_file = self.download_link.split("/")[-1] + self.release_info
self.found_matches |= guess_matches(video, guessit(new_file))
type_ = "episode" if isinstance(video, Episode) else "movie"
self.found_matches |= guess_matches(
video,
guessit(self.release_info, {"type": type_}),
)
self.found_matches |= guess_matches(
video,
guessit(self._release_info, {"type": type_}),
)
return self.found_matches

@ -9,9 +9,8 @@ from requests.packages.urllib3.util.retry import Retry
from guessit import guessit
from subliminal_patch.providers import Provider
from subliminal_patch.subtitle import Subtitle
from subliminal_patch.subtitle import Subtitle, guess_matches
from subliminal_patch.exceptions import TooManyRequests
from subliminal.subtitle import guess_matches
from subliminal.video import Episode, Movie
from subzero.language import Language
from subliminal.exceptions import ServiceUnavailable

@ -6,10 +6,11 @@ from random import randint
from subzero.language import Language
from guessit import guessit
from subliminal_patch.http import RetryingCFSession
from subliminal_patch.subtitle import guess_matches
from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST
from subliminal.providers import ParserBeautifulSoup, Provider
from subliminal.subtitle import SUBTITLE_EXTENSIONS, Subtitle, fix_line_ending, guess_matches
from subliminal.subtitle import SUBTITLE_EXTENSIONS, Subtitle, fix_line_ending
from subliminal.video import Episode, Movie
logger = logging.getLogger(__name__)
@ -38,6 +39,8 @@ class GreekSubsSubtitle(Subtitle):
# episode
if isinstance(video, Episode):
# Blatanly match the year
matches.add("year")
# other properties
matches |= guess_matches(video, guessit(self.version, {'type': 'episode'}), partial=True)
# movie

@ -38,6 +38,7 @@ class GreekSubtitlesSubtitle(Subtitle):
# episode
if isinstance(video, Episode):
matches.add("year")
# other properties
matches |= guess_matches(video, guessit(self.version, {'type': 'episode'}), partial=True)
# movie

@ -49,13 +49,11 @@ class HosszupuskaSubtitle(Subtitle):
provider_name = 'hosszupuska'
def __str__(self):
subtit = "Subtitle id: " + str(self.subtitle_id) \
+ " Series: " + self.series \
+ " Season: " + str(self.season) \
+ " Episode: " + str(self.episode) \
+ " Releases: " + str(self.releases)
subtit = (f"Subtitle id: {self.subtitle_id} Series: {self.series} "
f"Season: {self.season} Episode: {self.episode} "
f"Releases: {self.releases}")
if self.year:
subtit = subtit + " Year: " + str(self.year)
subtit = f"{subtit} Year: {self.year}"
if six.PY3:
return subtit
return subtit.encode('utf-8')
@ -104,19 +102,15 @@ class HosszupuskaSubtitle(Subtitle):
video.year and video.year == self.year):
matches.add('year')
logger.debug("Matches: %s", matches)
# release_group
if (video.release_group and self.version and
any(r in sanitize_release_group(self.version)
for r in get_equivalent_release_groups(sanitize_release_group(video.release_group)))):
matches.add('release_group')
# resolution
if video.resolution and self.version and video.resolution in self.version.lower():
matches.add('resolution')
# source
if video.source and self.version and video.source.lower() in self.version.lower():
matches.add('source')
# other properties
matches |= guess_matches(video, guessit(self.release_info))
matches |= guess_matches(video, guessit(self.release_info), {"type": "episode"})
return matches

@ -13,14 +13,14 @@ from guessit import guessit
from subliminal.cache import region
from subliminal.exceptions import ConfigurationError, AuthenticationError, ServiceUnavailable, DownloadLimitExceeded
from subliminal.providers import ParserBeautifulSoup
from subliminal.subtitle import SUBTITLE_EXTENSIONS, fix_line_ending, guess_matches
from subliminal.subtitle import SUBTITLE_EXTENSIONS, fix_line_ending
from subliminal.utils import sanitize, sanitize_release_group
from subliminal.video import Episode, Movie
from subliminal_patch.exceptions import TooManyRequests, IPAddressBlocked
from subliminal_patch.http import RetryingCFSession
from subliminal_patch.providers import Provider
from subliminal_patch.score import get_scores, framerate_equal
from subliminal_patch.subtitle import Subtitle
from subliminal_patch.subtitle import Subtitle, guess_matches
from subzero.language import Language
from dogpile.cache.api import NO_VALUE
@ -90,14 +90,15 @@ class LegendasdivxSubtitle(Subtitle):
if video.year and '{:04d}'.format(video.year) in description:
matches.update(['year'])
type_ = "movie" if isinstance(video, Movie) else "episode"
# match movie title (include alternative movie names)
if isinstance(video, Movie):
if type_ == "movie":
if video.title:
for movie_name in [video.title] + video.alternative_titles:
if sanitize(movie_name) in description:
matches.update(['title'])
if isinstance(video, Episode):
else:
if video.title and sanitize(video.title) in description:
matches.update(['title'])
if video.series:
@ -113,34 +114,7 @@ class LegendasdivxSubtitle(Subtitle):
if video.release_group and sanitize_release_group(video.release_group) in sanitize_release_group(description):
matches.update(['release_group'])
# resolution
if video.resolution and video.resolution.lower() in description:
matches.update(['resolution'])
# source
formats = []
if video.source:
formats = [video.source.lower()]
if formats[0] == "web":
formats.append("webdl")
formats.append("webrip")
formats.append("web")
for frmt in formats:
if frmt in description:
matches.update(['source'])
break
# video_codec
if video.video_codec:
video_codecs = [video.video_codec.lower()]
if video_codecs[0] == "H.264":
video_codecs.append("x264")
elif video_codecs[0] == "H.265":
video_codecs.append("x265")
for vc in video_codecs:
if vc in description:
matches.update(['video_codec'])
break
matches |= guess_matches(video, guessit(description, {"type": type_}))
return matches

@ -6,9 +6,11 @@ import os
from subliminal.exceptions import ConfigurationError
from subliminal.providers.legendastv import LegendasTVSubtitle as _LegendasTVSubtitle, \
LegendasTVProvider as _LegendasTVProvider, Episode, Movie, guess_matches, guessit, sanitize, region, type_map, \
LegendasTVProvider as _LegendasTVProvider, Episode, Movie, guessit, sanitize, region, type_map, \
raise_for_status, json, SHOW_EXPIRATION_TIME, title_re, season_re, datetime, pytz, NO_VALUE, releases_key, \
SUBTITLE_EXTENSIONS, language_converters
from subliminal_patch.subtitle import guess_matches
from subzero.language import Language
logger = logging.getLogger(__name__)
@ -59,7 +61,7 @@ class LegendasTVSubtitle(_LegendasTVSubtitle):
matches.add('imdb_id')
# name
matches |= guess_matches(video, guessit(self.name, {'type': self.type, 'single_value': True}))
matches |= guess_matches(video, guessit(self.name, {'type': self.type}))
return matches

@ -15,11 +15,11 @@ from subzero.language import Language
from subliminal_patch.providers import Provider
from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
from subliminal_patch.subtitle import Subtitle
from subliminal_patch.subtitle import Subtitle, guess_matches
from subliminal_patch.score import framerate_equal
from subliminal.exceptions import ProviderError
from subliminal.providers import ParserBeautifulSoup
from subliminal.subtitle import sanitize, guess_matches
from subliminal.subtitle import sanitize
from subliminal.video import Movie
from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST

@ -11,6 +11,7 @@ import requests
from babelfish import language_converters
from dogpile.cache.api import NO_VALUE
from guessit import guessit
from subliminal.exceptions import ConfigurationError, ServiceUnavailable
from subliminal.providers.opensubtitles import OpenSubtitlesProvider as _OpenSubtitlesProvider,\
OpenSubtitlesSubtitle as _OpenSubtitlesSubtitle, Episode, Movie, ServerProxy, Unauthorized, NoSession, \
@ -21,6 +22,7 @@ from subliminal_patch.http import SubZeroRequestsTransport
from subliminal_patch.utils import sanitize, fix_inconsistent_naming
from subliminal.cache import region
from subliminal_patch.score import framerate_equal
from subliminal_patch.subtitle import guess_matches
from subzero.language import Language
from ..exceptions import TooManyRequests, APIThrottled
@ -72,14 +74,18 @@ class OpenSubtitlesSubtitle(_OpenSubtitlesSubtitle):
def get_matches(self, video, hearing_impaired=False):
matches = super(OpenSubtitlesSubtitle, self).get_matches(video)
type_ = "episode" if isinstance(video, Episode) else "movie"
matches |= guess_matches(video, guessit(self.movie_release_name, {'type': type_}))
matches |= guess_matches(video, guessit(self.filename, {'type': type_}))
# episode
if isinstance(video, Episode) and self.movie_kind == 'episode':
if type_ == "episode" and self.movie_kind == "episode":
# series
if fix_tv_naming(video.series) and (sanitize(self.series_name) in (
sanitize(name) for name in [fix_tv_naming(video.series)] + video.alternative_series)):
matches.add('series')
# movie
elif isinstance(video, Movie) and self.movie_kind == 'movie':
elif type_ == "movie" and self.movie_kind == "movie":
# title
if fix_movie_naming(video.title) and (sanitize(self.movie_name) in (
sanitize(name) for name in [fix_movie_naming(video.title)] + video.alternative_titles)):

@ -14,9 +14,10 @@ from subliminal_patch.exceptions import TooManyRequests
from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError, ConfigurationError, ServiceUnavailable, \
ProviderError
from .mixins import ProviderRetryMixin
from subliminal_patch.subtitle import Subtitle, guess_matches
from subliminal_patch.subtitle import Subtitle
from subliminal.subtitle import fix_line_ending, SUBTITLE_EXTENSIONS
from subliminal_patch.providers import Provider
from subliminal_patch.subtitle import guess_matches
from subliminal_patch.utils import fix_inconsistent_naming
from subliminal.cache import region
from dogpile.cache.api import NO_VALUE
@ -74,9 +75,10 @@ class OpenSubtitlesComSubtitle(Subtitle):
def get_matches(self, video):
matches = set()
type_ = "movie" if isinstance(video, Movie) else "episode"
# handle movies and series separately
if isinstance(video, Episode):
if type_ == "episode":
# series
matches.add('series')
# year
@ -88,8 +90,7 @@ class OpenSubtitlesComSubtitle(Subtitle):
# episode
if video.episode == self.episode:
matches.add('episode')
# movie
elif isinstance(video, Movie):
else:
# title
matches.add('title')
# year
@ -103,17 +104,12 @@ class OpenSubtitlesComSubtitle(Subtitle):
any(r in sanitize_release_group(self.releases)
for r in get_equivalent_release_groups(sanitize_release_group(video.release_group)))):
matches.add('release_group')
# resolution
if video.resolution and self.releases and video.resolution in self.releases.lower():
matches.add('resolution')
# source
if video.source and self.releases and video.source.lower() in self.releases.lower():
matches.add('source')
# hash
if self.hash_matched:
matches.add('hash')
# other properties
matches |= guess_matches(video, guessit(self.releases))
matches |= guess_matches(video, guessit(self.releases, {"type": type_}))
self.matches = matches

@ -8,8 +8,8 @@ import io
from zipfile import ZipFile
from guessit import guessit
from subliminal.subtitle import guess_matches
from subliminal.utils import sanitize
from subliminal_patch.subtitle import guess_matches
from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
try:
@ -84,7 +84,7 @@ class PodnapisiSubtitle(_PodnapisiSubtitle):
matches.add('episode')
# guess
for release in self.releases:
matches |= guess_matches(video, guessit(release, {'type': 'episode', "single_value": True}))
matches |= guess_matches(video, guessit(release, {'type': 'episode'}))
# movie
elif isinstance(video, Movie):
# title
@ -96,7 +96,7 @@ class PodnapisiSubtitle(_PodnapisiSubtitle):
matches.add('year')
# guess
for release in self.releases:
matches |= guess_matches(video, guessit(release, {'type': 'movie', "single_value": True}))
matches |= guess_matches(video, guessit(release, {'type': 'movie'}))
self.matches = matches

@ -7,9 +7,8 @@ import os
from requests import Session
from guessit import guessit
from subliminal_patch.providers import Provider
from subliminal_patch.subtitle import Subtitle
from subliminal_patch.subtitle import Subtitle, guess_matches
from subliminal.subtitle import SUBTITLE_EXTENSIONS, fix_line_ending
from subliminal.subtitle import guess_matches
from subliminal.video import Episode, Movie
from subzero.language import Language
@ -40,18 +39,16 @@ class RegieLiveSubtitle(Subtitle):
return self.filename
def get_matches(self, video):
type_ = "movie" if isinstance(video, Movie) else "episode"
matches = set()
matches |= guess_matches(video, guessit(self.filename))
subtitle_filename = self.filename
# episode
if isinstance(video, Episode):
if type_ == "episode":
# already matched in search query
matches.update(['title', 'series', 'season', 'episode', 'year'])
# movie
elif isinstance(video, Movie):
else:
# already matched in search query
matches.update(['title', 'year'])
@ -59,34 +56,7 @@ class RegieLiveSubtitle(Subtitle):
if video.release_group and video.release_group.lower() in subtitle_filename:
matches.add('release_group')
# resolution
if video.resolution and video.resolution.lower() in subtitle_filename:
matches.add('resolution')
# source
formats = []
if video.source:
formats = [video.source.lower()]
if formats[0] == "web":
formats.append("webdl")
formats.append("webrip")
formats.append("web ")
for frmt in formats:
if frmt.lower() in subtitle_filename:
matches.add('source')
break
# video_codec
if video.video_codec:
video_codecs = [video.video_codec.lower()]
if video_codecs[0] == "H.264":
formats.append("x264")
elif video_codecs[0] == "H.265":
formats.append("x265")
for vc in formats:
if vc.lower() in subtitle_filename:
matches.add('video_codec')
break
matches |= guess_matches(video, guessit(self.filename, {"type": type_}))
return matches

@ -99,14 +99,15 @@ class SuchaProvider(Provider):
result.raise_for_status()
results = result.json()
if isinstance(result, dict):
logger.debug("No subtitles found")
return []
subtitles = []
for item in results:
matches = set()
title = item.get("title", "").lower()
alt_title = item.get("alt_title", title).lower()
if not title:
logger.debug("No subtitles found")
return []
if any(video.title.lower() in item for item in (title, alt_title)):
matches.add("title")
@ -117,7 +118,7 @@ class SuchaProvider(Provider):
if is_episode and any(
q["query"].lower() in item for item in (title, alt_title)
):
matches.update("title", "series", "season", "episode", "year")
matches.update(("title", "series", "season", "episode", "year"))
subtitles.append(
SuchaSubtitle(

Loading…
Cancel
Save