2018-03-28 20:24:16 +00:00
import gc
2017-09-16 00:49:46 +00:00
import os
import enzyme
import babelfish
2017-09-19 10:43:14 +00:00
from subliminal import *
2017-09-16 00:49:46 +00:00
import pycountry
import sqlite3
import ast
2018-01-10 16:44:47 +00:00
import langdetect
2018-01-14 04:20:20 +00:00
from bs4 import UnicodeDammit
2018-01-13 17:39:54 +00:00
from itertools import islice
2017-09-16 00:49:46 +00:00
from get_general_settings import *
2018-03-28 20:33:29 +00:00
gc . enable ( )
2017-09-16 00:49:46 +00:00
def store_subtitles ( file ) :
languages = [ ]
2017-09-28 01:55:21 +00:00
actual_subtitles = [ ]
2017-11-28 04:09:24 +00:00
if os . path . exists ( file ) :
2017-11-18 04:12:37 +00:00
if os . path . splitext ( file ) [ 1 ] == ' .mkv ' :
2017-09-16 00:49:46 +00:00
try :
with open ( file , ' rb ' ) as f :
mkv = enzyme . MKV ( f )
for subtitle_track in mkv . subtitle_tracks :
try :
2017-12-31 21:24:52 +00:00
actual_subtitles . append ( [ str ( pycountry . languages . lookup ( subtitle_track . language ) . alpha_2 ) , None ] )
2017-09-16 00:49:46 +00:00
except :
pass
except :
pass
2017-12-31 21:24:52 +00:00
2017-09-19 10:43:14 +00:00
subtitles = core . search_external_subtitles ( file )
2017-09-28 01:55:21 +00:00
2017-09-19 10:43:14 +00:00
for subtitle , language in subtitles . iteritems ( ) :
2018-01-10 16:44:47 +00:00
if str ( language ) != ' und ' :
actual_subtitles . append ( [ str ( language ) , path_replace_reverse ( os . path . join ( os . path . dirname ( file ) , subtitle ) ) ] )
else :
with open ( path_replace ( os . path . join ( os . path . dirname ( file ) , subtitle ) ) , ' r ' ) as f :
2018-01-24 19:38:00 +00:00
text = list ( islice ( f , 100 ) )
2018-01-13 14:21:12 +00:00
text = ' ' . join ( text )
2018-01-14 04:20:20 +00:00
encoding = UnicodeDammit ( text )
2018-01-13 20:45:21 +00:00
try :
2018-01-14 04:20:20 +00:00
text = text . decode ( encoding . original_encoding )
2018-01-13 20:45:21 +00:00
except Exception as e :
2018-01-15 01:50:03 +00:00
logging . exception ( ' Error trying to detect character encoding for this subtitles file: ' + path_replace ( os . path . join ( os . path . dirname ( file ) , subtitle ) ) + ' You should try to delete this subtitles file manually and ask Bazarr to download it again. ' )
2018-01-13 20:45:21 +00:00
else :
detected_language = langdetect . detect ( text )
if len ( detected_language ) > 0 :
actual_subtitles . append ( [ str ( detected_language ) , path_replace_reverse ( os . path . join ( os . path . dirname ( file ) , subtitle ) ) ] )
2017-11-22 00:50:06 +00:00
2017-12-05 00:01:10 +00:00
conn_db = sqlite3 . connect ( os . path . join ( os . path . dirname ( __file__ ) , ' data/db/bazarr.db ' ) , timeout = 30 )
2017-11-22 00:50:06 +00:00
c_db = conn_db . cursor ( )
2017-11-27 20:56:50 +00:00
c_db . execute ( " UPDATE table_episodes SET subtitles = ? WHERE path = ? " , ( str ( actual_subtitles ) , path_replace_reverse ( file ) ) )
2017-11-22 00:50:06 +00:00
conn_db . commit ( )
2017-12-31 21:24:52 +00:00
2017-09-16 00:49:46 +00:00
c_db . close ( )
2017-09-19 10:43:14 +00:00
return actual_subtitles
2017-09-16 00:49:46 +00:00
2017-10-16 23:27:19 +00:00
def list_missing_subtitles ( * no ) :
query_string = ' '
try :
2017-11-21 20:42:18 +00:00
query_string = " WHERE table_shows.sonarrSeriesId = " + str ( no [ 0 ] )
2017-10-16 23:27:19 +00:00
except :
pass
2017-12-05 00:01:10 +00:00
conn_db = sqlite3 . connect ( os . path . join ( os . path . dirname ( __file__ ) , ' data/db/bazarr.db ' ) , timeout = 30 )
2017-09-16 00:49:46 +00:00
c_db = conn_db . cursor ( )
2017-10-16 23:27:19 +00:00
episodes_subtitles = c_db . execute ( " SELECT table_episodes.sonarrEpisodeId, table_episodes.subtitles, table_shows.languages FROM table_episodes INNER JOIN table_shows on table_episodes.sonarrSeriesId = table_shows.sonarrSeriesId " + query_string ) . fetchall ( )
2017-11-30 19:31:31 +00:00
c_db . close ( )
2017-11-16 02:07:21 +00:00
missing_subtitles_global = [ ]
2017-10-03 02:59:45 +00:00
for episode_subtitles in episodes_subtitles :
actual_subtitles = [ ]
desired_subtitles = [ ]
missing_subtitles = [ ]
2017-10-19 11:10:52 +00:00
if episode_subtitles [ 1 ] != None :
actual_subtitles = ast . literal_eval ( episode_subtitles [ 1 ] )
2017-11-16 14:22:55 +00:00
if episode_subtitles [ 2 ] != None :
2017-11-16 03:51:28 +00:00
desired_subtitles = ast . literal_eval ( episode_subtitles [ 2 ] )
actual_subtitles_list = [ ]
if desired_subtitles == None :
missing_subtitles_global . append ( tuple ( [ ' [] ' , episode_subtitles [ 0 ] ] ) )
else :
for item in actual_subtitles :
actual_subtitles_list . append ( item [ 0 ] )
missing_subtitles = list ( set ( desired_subtitles ) - set ( actual_subtitles_list ) )
2017-11-16 14:22:55 +00:00
missing_subtitles_global . append ( tuple ( [ str ( missing_subtitles ) , episode_subtitles [ 0 ] ] ) )
2017-11-16 02:07:21 +00:00
2017-12-05 00:01:10 +00:00
conn_db = sqlite3 . connect ( os . path . join ( os . path . dirname ( __file__ ) , ' data/db/bazarr.db ' ) , timeout = 30 )
2017-11-30 19:31:31 +00:00
c_db = conn_db . cursor ( )
2017-10-03 02:59:45 +00:00
c_db . executemany ( " UPDATE table_episodes SET missing_subtitles = ? WHERE sonarrEpisodeId = ? " , ( missing_subtitles_global ) )
conn_db . commit ( )
c_db . close ( )
2017-09-16 00:49:46 +00:00
def full_scan_subtitles ( ) :
2017-12-05 00:01:10 +00:00
conn_db = sqlite3 . connect ( os . path . join ( os . path . dirname ( __file__ ) , ' data/db/bazarr.db ' ) , timeout = 30 )
2017-09-16 00:49:46 +00:00
c_db = conn_db . cursor ( )
2017-10-03 02:59:45 +00:00
episodes = c_db . execute ( " SELECT path FROM table_episodes " ) . fetchall ( )
2017-09-16 00:49:46 +00:00
c_db . close ( )
2017-10-03 02:59:45 +00:00
for episode in episodes :
2017-11-28 03:06:51 +00:00
store_subtitles ( path_replace ( episode [ 0 ] ) )
2017-10-16 23:27:19 +00:00
2018-03-28 20:24:16 +00:00
gc . collect ( )
2017-10-16 23:27:19 +00:00
def series_scan_subtitles ( no ) :
2017-12-05 00:01:10 +00:00
conn_db = sqlite3 . connect ( os . path . join ( os . path . dirname ( __file__ ) , ' data/db/bazarr.db ' ) , timeout = 30 )
2017-10-16 23:27:19 +00:00
c_db = conn_db . cursor ( )
episodes = c_db . execute ( " SELECT path FROM table_episodes WHERE sonarrSeriesId = ? " , ( no , ) ) . fetchall ( )
c_db . close ( )
for episode in episodes :
2017-11-28 03:06:51 +00:00
store_subtitles ( path_replace ( episode [ 0 ] ) )
2017-10-16 23:27:19 +00:00
list_missing_subtitles ( no )
2017-11-16 14:22:55 +00:00
2017-09-28 01:55:21 +00:00
def new_scan_subtitles ( ) :
2017-12-05 00:01:10 +00:00
conn_db = sqlite3 . connect ( os . path . join ( os . path . dirname ( __file__ ) , ' data/db/bazarr.db ' ) , timeout = 30 )
2017-09-28 01:55:21 +00:00
c_db = conn_db . cursor ( )
2017-10-03 02:59:45 +00:00
episodes = c_db . execute ( " SELECT path FROM table_episodes WHERE subtitles is null " ) . fetchall ( )
2017-09-28 01:55:21 +00:00
c_db . close ( )
2017-09-16 00:49:46 +00:00
2017-10-03 02:59:45 +00:00
for episode in episodes :
2017-11-28 03:06:51 +00:00
store_subtitles ( path_replace ( episode [ 0 ] ) )