11# coding=utf-8
22
33import os
4- import logging
4+ import time
55
66from flask_restx import Resource , Namespace , reqparse
77from subliminal_patch .core import SUBTITLE_EXTENSIONS
88from werkzeug .datastructures import FileStorage
99
10- from app .database import TableShows , TableEpisodes , get_audio_profile_languages , get_profile_id , database , select
10+ from app .database import TableShows , TableEpisodes , get_profile_id , database , select
1111from utilities .path_mappings import path_mappings
1212from subtitles .upload import manual_upload_subtitle
13+ from subtitles .mass_download .series import episode_download_specific_subtitles
1314from subtitles .download import generate_subtitles
1415from subtitles .tools .delete import delete_subtitles
15- from sonarr .history import history_log
16- from app .notifier import send_notifications
17- from subtitles .indexer .series import store_subtitles
18- from app .event_handler import event_stream , show_message
16+ from app .jobs_queue import jobs_queue
17+ from app .event_handler import event_stream
1918from app .config import settings
2019
2120from ..utils import authenticate
@@ -42,64 +41,17 @@ class EpisodesSubtitles(Resource):
4241 def patch (self ):
4342 """Download an episode subtitles"""
4443 args = self .patch_request_parser .parse_args ()
45- sonarrSeriesId = args .get ('seriesid' )
46- sonarrEpisodeId = args .get ('episodeid' )
47- episodeInfo = database .execute (
48- select (TableEpisodes .path ,
49- TableEpisodes .sceneName ,
50- TableEpisodes .audio_language ,
51- TableShows .title )
52- .select_from (TableEpisodes )
53- .join (TableShows )
54- .where (TableEpisodes .sonarrEpisodeId == sonarrEpisodeId )) \
55- .first ()
56-
57- if not episodeInfo :
58- return 'Episode not found' , 404
5944
60- episodePath = path_mappings .path_replace (episodeInfo .path )
45+ job_id = episode_download_specific_subtitles (sonarr_series_id = args .get ('seriesid' ),
46+ sonarr_episode_id = args .get ('episodeid' ),
47+ language = args .get ('language' ), hi = args .get ('hi' ).capitalize (),
48+ forced = args .get ('forced' ).capitalize (), job_id = None )
6149
62- if not os .path .exists (episodePath ):
63- return 'Episode file not found. Path mapping issue?' , 500
50+ # Wait for the job to complete or fail
51+ while jobs_queue .get_job_status (job_id = job_id ) in ['pending' , 'running' ]:
52+ time .sleep (1 )
6453
65- sceneName = episodeInfo .sceneName or "None"
66-
67- title = episodeInfo .title
68-
69- language = args .get ('language' )
70- hi = args .get ('hi' ).capitalize ()
71- forced = args .get ('forced' ).capitalize ()
72- if hi == 'True' :
73- language_str = f'{ language } :hi'
74- elif forced == 'True' :
75- language_str = f'{ language } :forced'
76- else :
77- language_str = language
78-
79- audio_language_list = get_audio_profile_languages (episodeInfo .audio_language )
80- if len (audio_language_list ) > 0 :
81- audio_language = audio_language_list [0 ]['name' ]
82- else :
83- audio_language = None
84-
85- try :
86- result = list (generate_subtitles (episodePath , [(language , hi , forced )], audio_language , sceneName ,
87- title , 'series' , profile_id = get_profile_id (episode_id = sonarrEpisodeId )))
88- if isinstance (result , list ) and len (result ):
89- result = result [0 ]
90- if isinstance (result , tuple ) and len (result ):
91- result = result [0 ]
92- history_log (1 , sonarrSeriesId , sonarrEpisodeId , result )
93- send_notifications (sonarrSeriesId , sonarrEpisodeId , result .message )
94- store_subtitles (result .path , episodePath )
95- else :
96- event_stream (type = 'episode' , payload = sonarrEpisodeId )
97- show_message (f'No { language_str .upper ()} subtitles found' )
98- return '' , 204
99- except OSError :
100- return 'Unable to save subtitles file. Permission or path mapping issue?' , 409
101- else :
102- return '' , 204
54+ return jobs_queue .get_job_returned_value (job_id = job_id )
10355
10456 post_request_parser = reqparse .RequestParser ()
10557 post_request_parser .add_argument ('seriesid' , type = int , required = True , help = 'Series ID' )
@@ -120,6 +72,12 @@ def patch(self):
12072 def post (self ):
12173 """Upload an episode subtitles"""
12274 args = self .post_request_parser .parse_args ()
75+
76+ _ , ext = os .path .splitext (args .get ('file' ).filename )
77+
78+ if not isinstance (ext , str ) or ext .lower () not in SUBTITLE_EXTENSIONS :
79+ raise ValueError ('A subtitle of an invalid format was uploaded.' )
80+
12381 sonarrSeriesId = args .get ('seriesid' )
12482 sonarrEpisodeId = args .get ('episodeid' )
12583 episodeInfo = database .execute (
@@ -136,46 +94,21 @@ def post(self):
13694 if not os .path .exists (episodePath ):
13795 return 'Episode file not found. Path mapping issue?' , 500
13896
139- audio_language = get_audio_profile_languages (episodeInfo .audio_language )
140- if len (audio_language ) and isinstance (audio_language [0 ], dict ):
141- audio_language = audio_language [0 ]
142- else :
143- audio_language = {'name' : '' , 'code2' : '' , 'code3' : '' }
144-
145- language = args .get ('language' )
146- forced = True if args .get ('forced' ) == 'true' else False
147- hi = True if args .get ('hi' ) == 'true' else False
148- subFile = args .get ('file' )
149-
150- _ , ext = os .path .splitext (subFile .filename )
151-
152- if not isinstance (ext , str ) or ext .lower () not in SUBTITLE_EXTENSIONS :
153- raise ValueError ('A subtitle of an invalid format was uploaded.' )
154-
155- try :
156- result = manual_upload_subtitle (path = episodePath ,
157- language = language ,
158- forced = forced ,
159- hi = hi ,
160- media_type = 'series' ,
161- subtitle = subFile ,
162- audio_language = audio_language )
163-
164- if not result :
165- logging .debug (f"BAZARR unable to process subtitles for this episode: { episodePath } " )
166- else :
167- if isinstance (result , tuple ) and len (result ):
168- result = result [0 ]
169- provider = "manual"
170- score = 360
171- history_log (4 , sonarrSeriesId , sonarrEpisodeId , result , fake_provider = provider , fake_score = score )
172- if not settings .general .dont_notify_manual_actions :
173- send_notifications (sonarrSeriesId , sonarrEpisodeId , result .message )
174- store_subtitles (result .path , episodePath )
175- except OSError :
176- return 'Unable to save subtitles file. Permission or path mapping issue?' , 409
177- else :
178- return '' , 204
97+ job_id = manual_upload_subtitle (path = episodePath ,
98+ language = args .get ('language' ),
99+ forced = True if args .get ('forced' ) == 'true' else False ,
100+ hi = True if args .get ('hi' ) == 'true' else False ,
101+ media_type = 'series' ,
102+ subtitle = args .get ('file' ),
103+ audio_language = episodeInfo .audio_language ,
104+ sonarrSeriesId = sonarrSeriesId ,
105+ sonarrEpisodeId = sonarrEpisodeId )
106+
107+ # Wait for the job to complete or fail
108+ while jobs_queue .get_job_status (job_id = job_id ) in ['pending' , 'running' ]:
109+ time .sleep (1 )
110+
111+ return jobs_queue .get_job_returned_value (job_id = job_id )
179112
180113 delete_request_parser = reqparse .RequestParser ()
181114 delete_request_parser .add_argument ('seriesid' , type = int , required = True , help = 'Series ID' )
0 commit comments