2017-09-17 08:11:47 +08:00
import os
2017-10-17 07:27:19 +08:00
import sqlite3
import ast
2017-12-06 12:07:37 +08:00
import logging
2017-09-17 08:11:47 +08:00
from babelfish import *
from subliminal import *
2017-09-17 21:02:16 +08:00
from pycountry import *
2017-10-17 07:27:19 +08:00
from get_general_settings import *
from list_subtitles import *
from utils import *
2018-01-23 12:25:58 +08:00
from notifier import send_notifications
2017-09-17 08:11:47 +08:00
# configure the cache
2018-01-16 12:30:41 +08:00
region . configure ( ' dogpile.cache.memory ' )
2017-09-17 08:11:47 +08:00
2018-02-22 11:07:40 +08:00
def download_subtitle ( path , language , hi , providers , providers_auth , sceneName ) :
2018-03-15 10:59:07 +08:00
minimum_score = float ( get_general_settings ( ) [ 8 ] ) / 100 * 360
2018-03-15 04:28:42 +08:00
use_scenename = get_general_settings ( ) [ 9 ]
2017-11-17 02:39:47 +08:00
try :
2018-03-15 04:28:42 +08:00
if sceneName is None or use_scenename == " False " :
used_sceneName = False
2018-02-22 11:07:40 +08:00
video = scan_video ( path )
else :
2018-03-15 04:28:42 +08:00
used_sceneName = True
2018-02-22 11:07:40 +08:00
video = Video . fromname ( sceneName )
2018-01-02 03:29:38 +08:00
except Exception as e :
logging . exception ( ' Error trying to extract information from this filename: ' + path )
2017-11-17 02:39:47 +08:00
return None
2018-01-02 03:29:38 +08:00
else :
try :
2018-03-15 04:28:42 +08:00
best_subtitles = download_best_subtitles ( [ video ] , { Language ( language ) } , providers = providers , min_score = minimum_score , hearing_impaired = hi , provider_configs = providers_auth )
2018-01-05 22:58:32 +08:00
except Exception as e :
2018-03-15 04:28:42 +08:00
logging . exception ( ' Error trying to get the best subtitles for this file: ' + path )
2018-01-05 22:58:32 +08:00
return None
else :
2018-01-05 23:37:32 +08:00
try :
2018-01-05 23:41:08 +08:00
best_subtitle = best_subtitles [ video ] [ 0 ]
except :
2018-03-15 04:28:42 +08:00
logging . debug ( ' No subtitles found for ' + path )
2018-01-05 23:41:08 +08:00
return None
2018-01-05 23:37:32 +08:00
else :
2018-01-11 00:44:47 +08:00
single = get_general_settings ( ) [ 7 ]
2018-01-05 23:41:08 +08:00
try :
2018-03-15 10:59:07 +08:00
score = round ( float ( compute_score ( best_subtitle , video ) ) / 360 * 100 , 2 )
2018-03-15 04:28:42 +08:00
if used_sceneName == True :
2018-02-22 11:07:40 +08:00
video = scan_video ( path )
2018-01-11 00:44:47 +08:00
if single == ' True ' :
result = save_subtitles ( video , [ best_subtitle ] , single = True , encoding = ' utf-8 ' )
else :
result = save_subtitles ( video , [ best_subtitle ] , encoding = ' utf-8 ' )
2018-01-05 23:41:08 +08:00
except :
logging . error ( ' Error saving subtitles file to disk. ' )
return None
else :
downloaded_provider = str ( result [ 0 ] ) . strip ( ' <> ' ) . split ( ' ' ) [ 0 ] [ : - 8 ]
downloaded_language = pycountry . languages . lookup ( str ( str ( result [ 0 ] ) . strip ( ' <> ' ) . split ( ' ' ) [ 2 ] . strip ( ' [] ' ) ) ) . name
2018-03-15 04:28:42 +08:00
if used_sceneName == True :
2018-03-15 10:59:07 +08:00
message = downloaded_language + " subtitles downloaded from " + downloaded_provider + " with a score of " + unicode ( score ) + " % u sing this scene name obtained from Sonarr: " + sceneName
2018-02-24 04:46:56 +08:00
else :
2018-03-15 10:59:07 +08:00
message = downloaded_language + " subtitles downloaded from " + downloaded_provider + " with a score of " + unicode ( score ) + " % u sing filename guessing. "
2018-01-23 12:25:58 +08:00
2018-01-05 23:41:08 +08:00
return message
2017-10-17 07:27:19 +08:00
def series_download_subtitles ( no ) :
2017-12-08 09:03:32 +08:00
conn_db = sqlite3 . connect ( os . path . join ( os . path . dirname ( __file__ ) , ' data/db/bazarr.db ' ) , timeout = 30 )
2017-10-17 07:27:19 +08:00
c_db = conn_db . cursor ( )
2018-02-22 11:07:40 +08:00
episodes_details = c_db . execute ( " SELECT path, missing_subtitles, sonarrEpisodeId, scene_name FROM table_episodes WHERE sonarrSeriesId = ? " , ( no , ) ) . fetchall ( )
2017-10-17 07:27:19 +08:00
series_details = c_db . execute ( " SELECT hearing_impaired FROM table_shows WHERE sonarrSeriesId = ? " , ( no , ) ) . fetchone ( )
2017-12-08 09:03:32 +08:00
enabled_providers = c_db . execute ( " SELECT * FROM table_settings_providers WHERE enabled = 1 " ) . fetchall ( )
2017-10-17 07:27:19 +08:00
c_db . close ( )
providers_list = [ ]
2017-12-08 09:03:32 +08:00
providers_auth = { }
if len ( enabled_providers ) > 0 :
for provider in enabled_providers :
providers_list . append ( provider [ 0 ] )
try :
if provider [ 2 ] is not ' ' and provider [ 3 ] is not ' ' :
provider_auth = providers_auth . append ( provider [ 0 ] )
provider_auth . update ( { ' username ' : providers [ 2 ] , ' password ' : providers [ 3 ] } )
else :
providers_auth = None
except :
providers_auth = None
else :
providers_list = None
providers_auth = None
2017-10-17 07:27:19 +08:00
for episode in episodes_details :
for language in ast . literal_eval ( episode [ 1 ] ) :
2018-02-22 11:07:40 +08:00
message = download_subtitle ( path_replace ( episode [ 0 ] ) , str ( pycountry . languages . lookup ( language ) . alpha_3 ) , series_details [ 0 ] , providers_list , providers_auth , episode [ 3 ] )
2017-10-17 07:27:19 +08:00
if message is not None :
store_subtitles ( path_replace ( episode [ 0 ] ) )
history_log ( 1 , no , episode [ 2 ] , message )
2018-01-23 12:25:58 +08:00
send_notifications ( no , episode [ 2 ] , message )
2017-11-17 02:42:23 +08:00
list_missing_subtitles ( no )
2017-10-17 07:27:19 +08:00
def wanted_download_subtitles ( path ) :
2017-12-05 08:01:10 +08:00
conn_db = sqlite3 . connect ( os . path . join ( os . path . dirname ( __file__ ) , ' data/db/bazarr.db ' ) , timeout = 30 )
2017-11-17 03:09:40 +08:00
c_db = conn_db . cursor ( )
2018-02-22 11:07:40 +08:00
episodes_details = c_db . execute ( " SELECT table_episodes.path, table_episodes.missing_subtitles, table_episodes.sonarrEpisodeId, table_episodes.sonarrSeriesId, table_shows.hearing_impaired, table_episodes.scene_name FROM table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE table_episodes.path = ? AND missing_subtitles != ' [] ' " , ( path_replace_reverse ( path ) , ) ) . fetchall ( )
2017-12-08 09:03:32 +08:00
enabled_providers = c_db . execute ( " SELECT * FROM table_settings_providers WHERE enabled = 1 " ) . fetchall ( )
2017-11-17 03:09:40 +08:00
c_db . close ( )
2017-10-17 07:27:19 +08:00
2017-11-17 03:09:40 +08:00
providers_list = [ ]
2017-12-08 09:03:32 +08:00
providers_auth = { }
if len ( enabled_providers ) > 0 :
for provider in enabled_providers :
providers_list . append ( provider [ 0 ] )
try :
if provider [ 2 ] is not ' ' and provider [ 3 ] is not ' ' :
provider_auth = providers_auth . append ( provider [ 0 ] )
provider_auth . update ( { ' username ' : providers [ 2 ] , ' password ' : providers [ 3 ] } )
else :
providers_auth = None
except :
providers_auth = None
else :
providers_list = None
providers_auth = None
2017-10-17 07:27:19 +08:00
2017-11-17 03:09:40 +08:00
for episode in episodes_details :
for language in ast . literal_eval ( episode [ 1 ] ) :
2018-02-22 11:07:40 +08:00
message = download_subtitle ( path_replace ( episode [ 0 ] ) , str ( pycountry . languages . lookup ( language ) . alpha_3 ) , episode [ 4 ] , providers_list , providers_auth , episode [ 5 ] )
2017-11-17 03:09:40 +08:00
if message is not None :
store_subtitles ( path_replace ( episode [ 0 ] ) )
list_missing_subtitles ( episode [ 3 ] )
history_log ( 1 , episode [ 3 ] , episode [ 2 ] , message )
2018-01-23 12:25:58 +08:00
send_notifications ( episode [ 3 ] , episode [ 2 ] , message )
2017-11-17 01:04:20 +08:00
2017-10-23 11:00:11 +08:00
def wanted_search_missing_subtitles ( ) :
2017-12-05 08:01:10 +08:00
db = sqlite3 . connect ( os . path . join ( os . path . dirname ( __file__ ) , ' data/db/bazarr.db ' ) , timeout = 30 )
2017-10-23 11:00:11 +08:00
db . create_function ( " path_substitution " , 1 , path_replace )
c = db . cursor ( )
c . execute ( " SELECT path_substitution(path) FROM table_episodes WHERE table_episodes.missing_subtitles != ' [] ' " )
data = c . fetchall ( )
c . close ( )
for episode in data :
2017-11-22 04:42:18 +08:00
wanted_download_subtitles ( episode [ 0 ] )
2017-12-06 12:07:37 +08:00
2017-12-08 09:03:32 +08:00
logging . info ( ' Finished searching for missing subtitles. Check history for more information. ' )