Added option to deeply analyze audio tracks from media files or not to determine languages. Default is to use Sonarr/Radarr provided languages instead. Should prevent API limit ban for cloud user.

pull/2076/head v1.1.5-beta.23
morpheus65535 1 year ago
parent 5b283098f9
commit 5dc4e782ae

@ -81,7 +81,8 @@ defaults = {
'hi_extension': 'hi', 'hi_extension': 'hi',
'embedded_subtitles_parser': 'ffprobe', 'embedded_subtitles_parser': 'ffprobe',
'default_und_audio_lang': '', 'default_und_audio_lang': '',
'default_und_embedded_subtitles_lang': '' 'default_und_embedded_subtitles_lang': '',
'parse_embedded_audio_track': 'False'
}, },
'auth': { 'auth': {
'type': 'None', 'type': 'None',
@ -385,6 +386,7 @@ def save_settings(settings_items):
use_embedded_subs_changed = False use_embedded_subs_changed = False
undefined_audio_track_default_changed = False undefined_audio_track_default_changed = False
undefined_subtitles_track_default_changed = False undefined_subtitles_track_default_changed = False
audio_tracks_parsing_changed = False
# Subzero Mods # Subzero Mods
update_subzero = False update_subzero = False
@ -423,6 +425,9 @@ def save_settings(settings_items):
if key == 'settings-general-default_und_audio_lang': if key == 'settings-general-default_und_audio_lang':
undefined_audio_track_default_changed = True undefined_audio_track_default_changed = True
if key == 'settings-general-parse_embedded_audio_track':
audio_tracks_parsing_changed = True
if key == 'settings-general-default_und_embedded_subtitles_lang': if key == 'settings-general-default_und_embedded_subtitles_lang':
undefined_subtitles_track_default_changed = True undefined_subtitles_track_default_changed = True
@ -565,6 +570,17 @@ def save_settings(settings_items):
if settings.general.getboolean('use_radarr'): if settings.general.getboolean('use_radarr'):
scheduler.add_job(movies_full_scan_subtitles, kwargs={'use_cache': True}) scheduler.add_job(movies_full_scan_subtitles, kwargs={'use_cache': True})
if audio_tracks_parsing_changed:
from .scheduler import scheduler
if settings.general.getboolean('use_sonarr'):
from sonarr.sync.episodes import sync_episodes
from sonarr.sync.series import update_series
scheduler.add_job(update_series, kwargs={'send_event': True}, max_instances=1)
scheduler.add_job(sync_episodes, kwargs={'send_event': True}, max_instances=1)
if settings.general.getboolean('use_radarr'):
from radarr.sync.movies import update_movies
scheduler.add_job(update_movies, kwargs={'send_event': True}, max_instances=1)
if update_subzero: if update_subzero:
settings.set('general', 'subzero_mods', ','.join(subzero_mods)) settings.set('general', 'subzero_mods', ','.join(subzero_mods))

@ -2,6 +2,8 @@
import os import os
from app.config import settings
from languages.get_languages import language_from_alpha2
from radarr.info import get_radarr_info from radarr.info import get_radarr_info
from utilities.video_analyzer import embedded_audio_reader from utilities.video_analyzer import embedded_audio_reader
from utilities.path_mappings import path_mappings from utilities.path_mappings import path_mappings
@ -90,10 +92,31 @@ def movieParser(movie, action, tags_dict, movie_default_profile, audio_profiles)
videoCodec = None videoCodec = None
audioCodec = None audioCodec = None
audio_language = embedded_audio_reader(path_mappings.path_replace_movie(movie['movieFile']['path']), if settings.general.getboolean('parse_embedded_audio_track'):
file_size=movie['movieFile']['size'], audio_language = embedded_audio_reader(path_mappings.path_replace_movie(movie['movieFile']['path']),
movie_file_id=movie['movieFile']['id'], file_size=movie['movieFile']['size'],
use_cache=True) movie_file_id=movie['movieFile']['id'],
use_cache=True)
else:
audio_language = []
if get_radarr_info.is_legacy():
if 'mediaInfo' in movie['movieFile']:
if 'audioLanguages' in movie['movieFile']['mediaInfo']:
audio_languages_list = movie['movieFile']['mediaInfo']['audioLanguages'].split('/')
if len(audio_languages_list):
for audio_language_list in audio_languages_list:
audio_language.append(audio_language_list.strip())
if not audio_language:
audio_language = profile_id_to_language(movie['qualityProfileId'], audio_profiles)
else:
if 'languages' in movie['movieFile'] and len(movie['movieFile']['languages']):
for item in movie['movieFile']['languages']:
if isinstance(item, dict):
if 'name' in item:
language = item['name']
if item['name'] == 'Portuguese (Brazil)':
language = language_from_alpha2('pb')
audio_language.append(language)
tags = [d['label'] for d in tags_dict if d['id'] in movie['tags']] tags = [d['label'] for d in tags_dict if d['id'] in movie['tags']]
@ -146,8 +169,8 @@ def movieParser(movie, action, tags_dict, movie_default_profile, audio_profiles)
def profile_id_to_language(id, profiles): def profile_id_to_language(id, profiles):
profiles_to_return = []
for profile in profiles: for profile in profiles:
profiles_to_return = []
if id == profile[0]: if id == profile[0]:
profiles_to_return.append(profile[1]) profiles_to_return.append(profile[1])
return profiles_to_return return profiles_to_return

@ -2,8 +2,11 @@
import os import os
from app.config import settings
from app.database import TableShows
from utilities.path_mappings import path_mappings from utilities.path_mappings import path_mappings
from utilities.video_analyzer import embedded_audio_reader from utilities.video_analyzer import embedded_audio_reader
from sonarr.info import get_sonarr_info
from .converter import SonarrFormatVideoCodec, SonarrFormatAudioCodec from .converter import SonarrFormatVideoCodec, SonarrFormatAudioCodec
@ -28,6 +31,16 @@ def seriesParser(show, action, tags_dict, serie_default_profile, audio_profiles)
imdbId = show['imdbId'] if 'imdbId' in show else None imdbId = show['imdbId'] if 'imdbId' in show else None
audio_language = []
if not settings.general.getboolean('parse_embedded_audio_track'):
if get_sonarr_info.is_legacy():
audio_language = profile_id_to_language(show['qualityProfileId'], audio_profiles)
else:
if 'languageProfileId' in show:
audio_language = profile_id_to_language(show['languageProfileId'], audio_profiles)
else:
audio_language = []
if action == 'update': if action == 'update':
return {'title': show["title"], return {'title': show["title"],
'path': show["path"], 'path': show["path"],
@ -36,7 +49,7 @@ def seriesParser(show, action, tags_dict, serie_default_profile, audio_profiles)
'overview': overview, 'overview': overview,
'poster': poster, 'poster': poster,
'fanart': fanart, 'fanart': fanart,
'audio_language': str([]), 'audio_language': str(audio_language),
'sortTitle': show['sortTitle'], 'sortTitle': show['sortTitle'],
'year': str(show['year']), 'year': str(show['year']),
'alternativeTitles': alternate_titles, 'alternativeTitles': alternate_titles,
@ -52,7 +65,7 @@ def seriesParser(show, action, tags_dict, serie_default_profile, audio_profiles)
'overview': overview, 'overview': overview,
'poster': poster, 'poster': poster,
'fanart': fanart, 'fanart': fanart,
'audio_language': str([]), 'audio_language': str(audio_language),
'sortTitle': show['sortTitle'], 'sortTitle': show['sortTitle'],
'year': str(show['year']), 'year': str(show['year']),
'alternativeTitles': alternate_titles, 'alternativeTitles': alternate_titles,
@ -85,10 +98,28 @@ def episodeParser(episode):
else: else:
sceneName = None sceneName = None
audio_language = embedded_audio_reader(path_mappings.path_replace(episode['episodeFile']['path']), if settings.general.getboolean('parse_embedded_audio_track'):
file_size=episode['episodeFile']['size'], audio_language = embedded_audio_reader(path_mappings.path_replace(episode['episodeFile']
episode_file_id=episode['episodeFile']['id'], ['path']),
use_cache=True) file_size=episode['episodeFile']['size'],
episode_file_id=episode['episodeFile']['id'],
use_cache=True)
else:
audio_language = []
if 'language' in episode['episodeFile'] and len(episode['episodeFile']['language']):
item = episode['episodeFile']['language']
if isinstance(item, dict):
if 'name' in item:
audio_language.append(item['name'])
elif 'languages' in episode['episodeFile'] and len(episode['episodeFile']['languages']):
items = episode['episodeFile']['languages']
if isinstance(items, list):
for item in items:
if 'name' in item:
audio_language.append(item['name'])
else:
audio_language = TableShows.get(
TableShows.sonarrSeriesId == episode['seriesId']).audio_language
if 'mediaInfo' in episode['episodeFile']: if 'mediaInfo' in episode['episodeFile']:
if 'videoCodec' in episode['episodeFile']['mediaInfo']: if 'videoCodec' in episode['episodeFile']['mediaInfo']:

@ -1,5 +1,6 @@
import { useSeriesModification, useSeriesPagination } from "@/apis/hooks"; import { useSeriesModification, useSeriesPagination } from "@/apis/hooks";
import { Action } from "@/components"; import { Action } from "@/components";
import { AudioList } from "@/components/bazarr";
import LanguageProfileName from "@/components/bazarr/LanguageProfile"; import LanguageProfileName from "@/components/bazarr/LanguageProfile";
import { ItemEditModal } from "@/components/forms/ItemEditForm"; import { ItemEditModal } from "@/components/forms/ItemEditForm";
import { useModals } from "@/modules/modals"; import { useModals } from "@/modules/modals";
@ -43,6 +44,13 @@ const SeriesView: FunctionComponent = () => {
); );
}, },
}, },
{
Header: "Audio",
accessor: "audio_language",
Cell: ({ value }) => {
return <AudioList audios={value}></AudioList>;
},
},
{ {
Header: "Languages Profile", Header: "Languages Profile",
accessor: "profileId", accessor: "profileId",

@ -69,19 +69,28 @@ const SettingsLanguagesView: FunctionComponent = () => {
></LanguageSelector> ></LanguageSelector>
</Section> </Section>
<Section header="Default Unknown Track Language"> <Section header="Embedded Tracks Language">
<Selector <Check
clearable label="Deep analyze media file to get audio tracks language."
settingKey={defaultUndAudioLang} settingKey="settings-general-parse_embedded_audio_track"
label="Treat unknown language audio track as (changing this will trigger missing subtitles calculation)" ></Check>
placeholder="Select languages" <CollapseBox
options={und_audio_languages.map((v) => { indent
return { label: v.name, value: v.code2 }; settingKey="settings-general-parse_embedded_audio_track"
})} >
settingOptions={{ <Selector
onSubmit: (v) => (v === null ? "" : v), clearable
}} settingKey={defaultUndAudioLang}
></Selector> label="Treat unknown language audio track as (changing this will trigger missing subtitles calculation)"
placeholder="Select languages"
options={und_audio_languages.map((v) => {
return { label: v.name, value: v.code2 };
})}
settingOptions={{
onSubmit: (v) => (v === null ? "" : v),
}}
></Selector>
</CollapseBox>
<Selector <Selector
clearable clearable

Loading…
Cancel
Save