mirror of https://github.com/morpheus65535/bazarr
188 lines
7.3 KiB
Python
188 lines
7.3 KiB
Python
# coding=utf-8
|
|
|
|
import os
|
|
import logging
|
|
|
|
from flask import request
|
|
from flask_restful import Resource
|
|
from subliminal_patch.core import SUBTITLE_EXTENSIONS
|
|
|
|
from app.database import TableShows, TableEpisodes, get_audio_profile_languages, get_profile_id
|
|
from utilities.path_mappings import path_mappings
|
|
from subtitles.upload import manual_upload_subtitle
|
|
from subtitles.download import generate_subtitles
|
|
from subtitles.tools.delete import delete_subtitles
|
|
from sonarr.history import history_log
|
|
from app.notifier import send_notifications
|
|
from subtitles.indexer.series import store_subtitles
|
|
from app.event_handler import event_stream
|
|
from app.config import settings
|
|
|
|
from ..utils import authenticate
|
|
|
|
|
|
# PATCH: Download Subtitles
|
|
# POST: Upload Subtitles
|
|
# DELETE: Delete Subtitles
|
|
class EpisodesSubtitles(Resource):
|
|
@authenticate
|
|
def patch(self):
|
|
sonarrSeriesId = request.args.get('seriesid')
|
|
sonarrEpisodeId = request.args.get('episodeid')
|
|
episodeInfo = TableEpisodes.select(TableEpisodes.path,
|
|
TableEpisodes.scene_name,
|
|
TableEpisodes.audio_language,
|
|
TableShows.title) \
|
|
.join(TableShows, on=(TableEpisodes.sonarrSeriesId == TableShows.sonarrSeriesId)) \
|
|
.where(TableEpisodes.sonarrEpisodeId == sonarrEpisodeId)\
|
|
.dicts()\
|
|
.get_or_none()
|
|
|
|
if not episodeInfo:
|
|
return 'Episode not found', 404
|
|
|
|
title = episodeInfo['title']
|
|
episodePath = path_mappings.path_replace(episodeInfo['path'])
|
|
sceneName = episodeInfo['scene_name'] or "None"
|
|
|
|
language = request.form.get('language')
|
|
hi = request.form.get('hi').capitalize()
|
|
forced = request.form.get('forced').capitalize()
|
|
|
|
audio_language_list = get_audio_profile_languages(episode_id=sonarrEpisodeId)
|
|
if len(audio_language_list) > 0:
|
|
audio_language = audio_language_list[0]['name']
|
|
else:
|
|
audio_language = None
|
|
|
|
try:
|
|
result = list(generate_subtitles(episodePath, [(language, hi, forced)], audio_language, sceneName,
|
|
title, 'series', profile_id=get_profile_id(episode_id=sonarrEpisodeId)))
|
|
if result:
|
|
result = result[0]
|
|
message = result[0]
|
|
path = result[1]
|
|
forced = result[5]
|
|
if result[8]:
|
|
language_code = result[2] + ":hi"
|
|
elif forced:
|
|
language_code = result[2] + ":forced"
|
|
else:
|
|
language_code = result[2]
|
|
provider = result[3]
|
|
score = result[4]
|
|
subs_id = result[6]
|
|
subs_path = result[7]
|
|
history_log(1, sonarrSeriesId, sonarrEpisodeId, message, path, language_code, provider, score, subs_id,
|
|
subs_path)
|
|
send_notifications(sonarrSeriesId, sonarrEpisodeId, message)
|
|
store_subtitles(path, episodePath)
|
|
else:
|
|
event_stream(type='episode', payload=sonarrEpisodeId)
|
|
|
|
except OSError:
|
|
pass
|
|
|
|
return '', 204
|
|
|
|
@authenticate
|
|
def post(self):
|
|
sonarrSeriesId = request.args.get('seriesid')
|
|
sonarrEpisodeId = request.args.get('episodeid')
|
|
episodeInfo = TableEpisodes.select(TableEpisodes.title,
|
|
TableEpisodes.path,
|
|
TableEpisodes.scene_name,
|
|
TableEpisodes.audio_language)\
|
|
.where(TableEpisodes.sonarrEpisodeId == sonarrEpisodeId)\
|
|
.dicts()\
|
|
.get_or_none()
|
|
|
|
if not episodeInfo:
|
|
return 'Episode not found', 404
|
|
|
|
title = episodeInfo['title']
|
|
episodePath = path_mappings.path_replace(episodeInfo['path'])
|
|
sceneName = episodeInfo['scene_name'] or "None"
|
|
audio_language = episodeInfo['audio_language']
|
|
|
|
language = request.form.get('language')
|
|
forced = True if request.form.get('forced') == 'true' else False
|
|
hi = True if request.form.get('hi') == 'true' else False
|
|
subFile = request.files.get('file')
|
|
|
|
_, ext = os.path.splitext(subFile.filename)
|
|
|
|
if ext not in SUBTITLE_EXTENSIONS:
|
|
raise ValueError('A subtitle of an invalid format was uploaded.')
|
|
|
|
try:
|
|
result = manual_upload_subtitle(path=episodePath,
|
|
language=language,
|
|
forced=forced,
|
|
hi=hi,
|
|
title=title,
|
|
scene_name=sceneName,
|
|
media_type='series',
|
|
subtitle=subFile,
|
|
audio_language=audio_language)
|
|
|
|
if not result:
|
|
logging.debug(f"BAZARR unable to process subtitles for this episode: {episodePath}")
|
|
else:
|
|
message = result[0]
|
|
path = result[1]
|
|
subs_path = result[2]
|
|
if hi:
|
|
language_code = language + ":hi"
|
|
elif forced:
|
|
language_code = language + ":forced"
|
|
else:
|
|
language_code = language
|
|
provider = "manual"
|
|
score = 360
|
|
history_log(4, sonarrSeriesId, sonarrEpisodeId, message, path, language_code, provider, score,
|
|
subtitles_path=subs_path)
|
|
if not settings.general.getboolean('dont_notify_manual_actions'):
|
|
send_notifications(sonarrSeriesId, sonarrEpisodeId, message)
|
|
store_subtitles(path, episodePath)
|
|
|
|
except OSError:
|
|
pass
|
|
|
|
return '', 204
|
|
|
|
@authenticate
|
|
def delete(self):
|
|
sonarrSeriesId = request.args.get('seriesid')
|
|
sonarrEpisodeId = request.args.get('episodeid')
|
|
episodeInfo = TableEpisodes.select(TableEpisodes.title,
|
|
TableEpisodes.path,
|
|
TableEpisodes.scene_name,
|
|
TableEpisodes.audio_language)\
|
|
.where(TableEpisodes.sonarrEpisodeId == sonarrEpisodeId)\
|
|
.dicts()\
|
|
.get_or_none()
|
|
|
|
if not episodeInfo:
|
|
return 'Episode not found', 404
|
|
|
|
episodePath = path_mappings.path_replace(episodeInfo['path'])
|
|
|
|
language = request.form.get('language')
|
|
forced = request.form.get('forced')
|
|
hi = request.form.get('hi')
|
|
subtitlesPath = request.form.get('path')
|
|
|
|
subtitlesPath = path_mappings.path_replace_reverse(subtitlesPath)
|
|
|
|
delete_subtitles(media_type='series',
|
|
language=language,
|
|
forced=forced,
|
|
hi=hi,
|
|
media_path=episodePath,
|
|
subtitles_path=subtitlesPath,
|
|
sonarr_series_id=sonarrSeriesId,
|
|
sonarr_episode_id=sonarrEpisodeId)
|
|
|
|
return '', 204
|