mirror of https://github.com/morpheus65535/bazarr
Embedded Subtitles provider: add support for unknown language tags
This commit is contained in:
parent
27d792041c
commit
5624ae431e
|
@ -206,6 +206,7 @@ defaults = {
|
||||||
'included_codecs': '[]',
|
'included_codecs': '[]',
|
||||||
'hi_fallback': 'False',
|
'hi_fallback': 'False',
|
||||||
'timeout': '600',
|
'timeout': '600',
|
||||||
|
'unknown_as_english': 'False',
|
||||||
},
|
},
|
||||||
'karagarga': {
|
'karagarga': {
|
||||||
'username': '',
|
'username': '',
|
||||||
|
|
|
@ -232,6 +232,7 @@ def get_providers_auth():
|
||||||
'ffprobe_path': _FFPROBE_BINARY,
|
'ffprobe_path': _FFPROBE_BINARY,
|
||||||
'ffmpeg_path': _FFMPEG_BINARY,
|
'ffmpeg_path': _FFMPEG_BINARY,
|
||||||
'timeout': settings.embeddedsubtitles.timeout,
|
'timeout': settings.embeddedsubtitles.timeout,
|
||||||
|
'unknown_as_english': settings.embeddedsubtitles.getboolean('unknown_as_english'),
|
||||||
},
|
},
|
||||||
'karagarga': {
|
'karagarga': {
|
||||||
'username': settings.karagarga.username,
|
'username': settings.karagarga.username,
|
||||||
|
|
|
@ -103,6 +103,11 @@ export const ProviderList: Readonly<ProviderInfo[]> = [
|
||||||
key: "hi_fallback",
|
key: "hi_fallback",
|
||||||
name: "Use HI subtitles as a fallback (don't enable it if you have a HI language profile)",
|
name: "Use HI subtitles as a fallback (don't enable it if you have a HI language profile)",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: "switch",
|
||||||
|
key: "unknown_as_english",
|
||||||
|
name: "Use subtitles with unknown info/language as english",
|
||||||
|
},
|
||||||
],
|
],
|
||||||
message:
|
message:
|
||||||
"Warning for cloud users: this provider needs to read the entire file in order to extract subtitles.",
|
"Warning for cloud users: this provider needs to read the entire file in order to extract subtitles.",
|
||||||
|
|
|
@ -4,4 +4,4 @@
|
||||||
from .container import FFprobeVideoContainer
|
from .container import FFprobeVideoContainer
|
||||||
from .stream import FFprobeSubtitleStream
|
from .stream import FFprobeSubtitleStream
|
||||||
|
|
||||||
__version__ = "0.2"
|
__version__ = "0.2.2"
|
||||||
|
|
|
@ -8,12 +8,21 @@ from .exceptions import LanguageNotFound
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
LANGUAGE_FALLBACK = None
|
||||||
|
|
||||||
|
|
||||||
class FFprobeGenericSubtitleTags:
|
class FFprobeGenericSubtitleTags:
|
||||||
_DETECTABLE_TAGS = None
|
_DETECTABLE_TAGS = None
|
||||||
|
|
||||||
def __init__(self, data: dict):
|
def __init__(self, data: dict):
|
||||||
self.language = _get_language(data)
|
try:
|
||||||
|
self.language = _get_language(data)
|
||||||
|
except LanguageNotFound:
|
||||||
|
if LANGUAGE_FALLBACK is not None:
|
||||||
|
self.language = Language.fromietf(LANGUAGE_FALLBACK)
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
self._data = data
|
self._data = data
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
@ -79,9 +79,7 @@ class EmbeddedSubtitlesProvider(Provider):
|
||||||
ffmpeg_path=None,
|
ffmpeg_path=None,
|
||||||
hi_fallback=False,
|
hi_fallback=False,
|
||||||
timeout=600,
|
timeout=600,
|
||||||
include_ass=None,
|
unknown_as_english=False,
|
||||||
include_srt=None,
|
|
||||||
mergerfs_mode=None,
|
|
||||||
):
|
):
|
||||||
self._included_codecs = set(included_codecs or _ALLOWED_CODECS)
|
self._included_codecs = set(included_codecs or _ALLOWED_CODECS)
|
||||||
|
|
||||||
|
@ -93,6 +91,7 @@ class EmbeddedSubtitlesProvider(Provider):
|
||||||
cache_dir or tempfile.gettempdir(), self.__class__.__name__.lower()
|
cache_dir or tempfile.gettempdir(), self.__class__.__name__.lower()
|
||||||
)
|
)
|
||||||
self._hi_fallback = hi_fallback
|
self._hi_fallback = hi_fallback
|
||||||
|
self._unknown_as_english = unknown_as_english
|
||||||
self._cached_paths = {}
|
self._cached_paths = {}
|
||||||
self._timeout = int(timeout)
|
self._timeout = int(timeout)
|
||||||
|
|
||||||
|
@ -105,6 +104,9 @@ class EmbeddedSubtitlesProvider(Provider):
|
||||||
# Default is True
|
# Default is True
|
||||||
container.FFMPEG_STATS = False
|
container.FFMPEG_STATS = False
|
||||||
|
|
||||||
|
tags.LANGUAGE_FALLBACK = "en" if self._unknown_as_english else None
|
||||||
|
logger.debug("Language fallback set: %s", tags.LANGUAGE_FALLBACK)
|
||||||
|
|
||||||
def initialize(self):
|
def initialize(self):
|
||||||
os.makedirs(self._cache_dir, exist_ok=True)
|
os.makedirs(self._cache_dir, exist_ok=True)
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ def test_get_providers_auth_embeddedsubtitles():
|
||||||
assert isinstance(item["ffprobe_path"], str)
|
assert isinstance(item["ffprobe_path"], str)
|
||||||
assert isinstance(item["ffmpeg_path"], str)
|
assert isinstance(item["ffmpeg_path"], str)
|
||||||
assert isinstance(item["timeout"], str)
|
assert isinstance(item["timeout"], str)
|
||||||
|
assert isinstance(item["unknown_as_english"], bool)
|
||||||
|
|
||||||
|
|
||||||
def test_get_providers_auth_karagarga():
|
def test_get_providers_auth_karagarga():
|
||||||
|
|
|
@ -4,6 +4,7 @@ import os
|
||||||
from fese import FFprobeSubtitleStream
|
from fese import FFprobeSubtitleStream
|
||||||
from fese import FFprobeVideoContainer
|
from fese import FFprobeVideoContainer
|
||||||
from fese import tags
|
from fese import tags
|
||||||
|
from fese.exceptions import LanguageNotFound
|
||||||
import pytest
|
import pytest
|
||||||
from subliminal_patch.core import Episode
|
from subliminal_patch.core import Episode
|
||||||
from subliminal_patch.core import Movie
|
from subliminal_patch.core import Movie
|
||||||
|
@ -123,13 +124,36 @@ def fake_streams():
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("tags_", [{}, {"language": "und", "title": "Unknown"}])
|
||||||
|
def test_list_subtitles_unknown_as_english(mocker, tags_):
|
||||||
|
with EmbeddedSubtitlesProvider(unknown_as_english=True):
|
||||||
|
fake = FFprobeSubtitleStream(
|
||||||
|
{"index": 3, "codec_name": "subrip", "tags": tags_}
|
||||||
|
)
|
||||||
|
mocker.patch(
|
||||||
|
"subliminal_patch.providers.embeddedsubtitles._MemoizedFFprobeVideoContainer.get_subtitles",
|
||||||
|
return_value=[fake],
|
||||||
|
)
|
||||||
|
streams = _MemoizedFFprobeVideoContainer.get_subtitles("")
|
||||||
|
assert len(streams) == 1
|
||||||
|
assert streams[0].language == Language.fromietf("en")
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("tags_", [{}, {"language": "und", "title": "Unknown"}])
|
||||||
|
def test_list_subtitles_unknown_as_english_disabled(tags_):
|
||||||
|
with EmbeddedSubtitlesProvider(unknown_as_english=False):
|
||||||
|
with pytest.raises(LanguageNotFound):
|
||||||
|
assert FFprobeSubtitleStream(
|
||||||
|
{"index": 3, "codec_name": "subrip", "tags": tags_}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_list_subtitles_hi_fallback_one_stream(
|
def test_list_subtitles_hi_fallback_one_stream(
|
||||||
video_single_language, fake_streams, mocker
|
video_single_language, fake_streams, mocker
|
||||||
):
|
):
|
||||||
with EmbeddedSubtitlesProvider(hi_fallback=True) as provider:
|
with EmbeddedSubtitlesProvider(hi_fallback=True) as provider:
|
||||||
language = Language.fromalpha2("en")
|
language = Language.fromalpha2("en")
|
||||||
mocker.patch(
|
mocker.patch(
|
||||||
# "fese.FFprobeVideoContainer.get_subtitles",
|
|
||||||
"subliminal_patch.providers.embeddedsubtitles._MemoizedFFprobeVideoContainer.get_subtitles",
|
"subliminal_patch.providers.embeddedsubtitles._MemoizedFFprobeVideoContainer.get_subtitles",
|
||||||
return_value=[fake_streams["en_hi"]],
|
return_value=[fake_streams["en_hi"]],
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue