diff options
author | Louis Vézina <[email protected]> | 2018-10-04 14:16:49 -0400 |
---|---|---|
committer | Louis Vézina <[email protected]> | 2018-10-04 14:16:49 -0400 |
commit | 113709073581563dfda0761b3573caf818b9329a (patch) | |
tree | f0507709b2247549c732658ce5f68815f693b08c | |
parent | 53b52d364e97abbf7849ddecff060e6cf109b7ae (diff) | |
download | bazarr-113709073581563dfda0761b3573caf818b9329a.tar.gz bazarr-113709073581563dfda0761b3573caf818b9329a.zip |
Moving everything else bazarr.py to a bazarr subdirectory.
-rw-r--r-- | ___init__.py | 1 | ||||
-rw-r--r-- | bazarr.py | 56 | ||||
-rw-r--r-- | bazarr/check_update.py (renamed from check_update.py) | 0 | ||||
-rw-r--r-- | bazarr/create_db.sql (renamed from create_db.sql) | 0 | ||||
-rw-r--r-- | bazarr/get_argv.py (renamed from get_argv.py) | 2 | ||||
-rw-r--r-- | bazarr/get_episodes.py (renamed from get_episodes.py) | 210 | ||||
-rw-r--r-- | bazarr/get_languages.py (renamed from get_languages.py) | 182 | ||||
-rw-r--r-- | bazarr/get_movies.py (renamed from get_movies.py) | 0 | ||||
-rw-r--r-- | bazarr/get_providers.py (renamed from get_providers.py) | 0 | ||||
-rw-r--r-- | bazarr/get_series.py (renamed from get_series.py) | 322 | ||||
-rw-r--r-- | bazarr/get_settings.py (renamed from get_settings.py) | 0 | ||||
-rw-r--r-- | bazarr/get_subtitle.py (renamed from get_subtitle.py) | 0 | ||||
-rw-r--r-- | bazarr/init.py (renamed from init.py) | 0 | ||||
-rw-r--r-- | bazarr/list_subtitles.py (renamed from list_subtitles.py) | 526 | ||||
-rw-r--r-- | bazarr/main.py (renamed from main.py) | 8 | ||||
-rw-r--r-- | bazarr/notifier.py (renamed from notifier.py) | 0 | ||||
-rw-r--r-- | bazarr/scheduler.py (renamed from scheduler.py) | 0 | ||||
-rw-r--r-- | bazarr/update_db.py (renamed from update_db.py) | 0 | ||||
-rw-r--r-- | bazarr/utils.py (renamed from utils.py) | 66 |
19 files changed, 713 insertions, 660 deletions
diff --git a/___init__.py b/___init__.py new file mode 100644 index 000000000..cd4683012 --- /dev/null +++ b/___init__.py @@ -0,0 +1 @@ +from bazarr import *
\ No newline at end of file @@ -3,6 +3,7 @@ import threading import time import os import signal +import platform import logging import sys import getopt @@ -17,7 +18,7 @@ arguments = [] try: opts, args = getopt.getopt(sys.argv[1:],"h:",["no-update", "config="]) except getopt.GetoptError: - print 'daemon.py -h --no-update --config <config_directory>' + print 'bazarr.py -h --no-update --config <config_directory>' sys.exit(2) for opt, arg in opts: arguments.append(opt) @@ -26,7 +27,7 @@ for opt, arg in opts: def start_bazarr(): - script = ['python','main.py'] + globals()['arguments'] + script = ['python','bazarr/main.py'] + globals()['arguments'] pidfile = os.path.normcase(os.path.join(os.path.dirname(__file__), 'bazarr.pid')) if os.path.exists(pidfile): @@ -78,6 +79,44 @@ def restart_bazarr(): file.close() +# GetExitCodeProcess uses a special exit code to indicate that the process is +# still running. +_STILL_ACTIVE = 259 + + +def is_pid_running(pid): + return (_is_pid_running_on_windows(pid) if platform.system() == "Windows" + else _is_pid_running_on_unix(pid)) + + +def _is_pid_running_on_unix(pid): + try: + os.kill(pid, 0) + except OSError: + return False + return True + + +def _is_pid_running_on_windows(pid): + import ctypes.wintypes + + kernel32 = ctypes.windll.kernel32 + handle = kernel32.OpenProcess(1, 0, pid) + if handle == 0: + return False + + # If the process exited recently, a pid may still exist for the handle. + # So, check if we can get the exit code. + exit_code = ctypes.wintypes.DWORD() + is_running = ( + kernel32.GetExitCodeProcess(handle, ctypes.byref(exit_code)) == 0) + kernel32.CloseHandle(handle) + + # See if we couldn't get the exit code or the exit code indicates that the + # process is still running. + return is_running or exit_code.value == _STILL_ACTIVE + + if __name__ == '__main__': pidfile = os.path.normcase(os.path.join(os.path.dirname(__file__), 'bazarr.pid')) restartfile = os.path.normcase(os.path.join(os.path.dirname(__file__), 'bazarr.restart')) @@ -110,6 +149,19 @@ if __name__ == '__main__': shutdown_bazarr(True) start_bazarr() + if os.path.exists(pidfile): + try: + file = open(pidfile, 'r') + except: + logging.error("Error trying to read pid file.") + else: + pid = int(file.read()) + file.close() + + if is_pid_running(pid) is False: + logging.warn('Bazarr unexpectedly exited. Starting it back.') + start_bazarr() + daemon() diff --git a/check_update.py b/bazarr/check_update.py index 787c18956..787c18956 100644 --- a/check_update.py +++ b/bazarr/check_update.py diff --git a/create_db.sql b/bazarr/create_db.sql index 786b58a3e..786b58a3e 100644 --- a/create_db.sql +++ b/bazarr/create_db.sql diff --git a/get_argv.py b/bazarr/get_argv.py index b844db207..5a2b27587 100644 --- a/get_argv.py +++ b/bazarr/get_argv.py @@ -2,7 +2,7 @@ import os import sys import getopt -config_dir = os.path.join(os.path.dirname(__file__), 'data/') +config_dir = os.path.join(os.path.dirname(__file__), '../data/') no_update = False try: diff --git a/get_episodes.py b/bazarr/get_episodes.py index c0a1f12e6..03477c039 100644 --- a/get_episodes.py +++ b/bazarr/get_episodes.py @@ -1,106 +1,106 @@ -from get_argv import config_dir
-
-import os
-import sqlite3
-import requests
-import logging
-
-from get_settings import path_replace
-from list_subtitles import list_missing_subtitles, store_subtitles, series_full_scan_subtitles, movies_full_scan_subtitles
-
-def update_all_episodes():
- series_full_scan_subtitles()
- logging.info('All existing episode subtitles indexed from disk.')
- list_missing_subtitles()
- logging.info('All missing episode subtitles updated in database.')
-
-def update_all_movies():
- movies_full_scan_subtitles()
- logging.info('All existing movie subtitles indexed from disk.')
- list_missing_subtitles()
- logging.info('All missing movie subtitles updated in database.')
-
-def sync_episodes():
- logging.debug('Starting episode sync from Sonarr.')
- from get_settings import get_sonarr_settings
- url_sonarr = get_sonarr_settings()[6]
- apikey_sonarr = get_sonarr_settings()[4]
-
- # Open database connection
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
-
- # Get current episodes id in DB
- current_episodes_db = c.execute('SELECT sonarrEpisodeId FROM table_episodes').fetchall()
-
- current_episodes_db_list = [x[0] for x in current_episodes_db]
- current_episodes_sonarr = []
- episodes_to_update = []
- episodes_to_add = []
-
- # Get sonarrId for each series from database
- seriesIdList = c.execute("SELECT sonarrSeriesId FROM table_shows").fetchall()
-
- # Close database connection
- c.close()
-
- for seriesId in seriesIdList:
- # Get episodes data for a series from Sonarr
- url_sonarr_api_episode = url_sonarr + "/api/episode?seriesId=" + str(seriesId[0]) + "&apikey=" + apikey_sonarr
- try:
- r = requests.get(url_sonarr_api_episode, timeout=15, verify=False)
- r.raise_for_status()
- except requests.exceptions.HTTPError as errh:
- logging.exception("Error trying to get episodes from Sonarr. Http error.")
- except requests.exceptions.ConnectionError as errc:
- logging.exception("Error trying to get episodes from Sonarr. Connection Error.")
- except requests.exceptions.Timeout as errt:
- logging.exception("Error trying to get episodes from Sonarr. Timeout Error.")
- except requests.exceptions.RequestException as err:
- logging.exception("Error trying to get episodes from Sonarr.")
- else:
- for episode in r.json():
- if 'hasFile' in episode:
- if episode['hasFile'] is True:
- if 'episodeFile' in episode:
- if episode['episodeFile']['size'] > 20480:
- # Add shows in Sonarr to current shows list
- if 'sceneName' in episode['episodeFile']:
- sceneName = episode['episodeFile']['sceneName']
- else:
- sceneName = None
-
- # Add episodes in sonarr to current episode list
- current_episodes_sonarr.append(episode['id'])
-
- if episode['id'] in current_episodes_db_list:
- episodes_to_update.append((episode['title'], episode['episodeFile']['path'], episode['seasonNumber'], episode['episodeNumber'], sceneName, str(bool(episode['monitored'])), episode['id']))
- else:
- episodes_to_add.append((episode['seriesId'], episode['id'], episode['title'], episode['episodeFile']['path'], episode['seasonNumber'], episode['episodeNumber'], sceneName, str(bool(episode['monitored']))))
-
- removed_episodes = list(set(current_episodes_db_list) - set(current_episodes_sonarr))
-
- # Update or insert movies in DB
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
-
- updated_result = c.executemany('''UPDATE table_episodes SET title = ?, path = ?, season = ?, episode = ?, scene_name = ?, monitored = ? WHERE sonarrEpisodeId = ?''', episodes_to_update)
- db.commit()
-
- added_result = c.executemany('''INSERT OR IGNORE INTO table_episodes(sonarrSeriesId, sonarrEpisodeId, title, path, season, episode, scene_name, monitored) VALUES (?, ?, ?, ?, ?, ?, ?, ?)''', episodes_to_add)
- db.commit()
-
- for removed_episode in removed_episodes:
- c.execute('DELETE FROM table_episodes WHERE sonarrEpisodeId = ?', (removed_episode,))
- db.commit()
-
- # Close database connection
- c.close()
-
- for added_episode in episodes_to_add:
- store_subtitles(path_replace(added_episode[3]))
-
- logging.debug('All episodes synced from Sonarr into database.')
-
- list_missing_subtitles()
+from get_argv import config_dir + +import os +import sqlite3 +import requests +import logging + +from get_settings import path_replace +from list_subtitles import list_missing_subtitles, store_subtitles, series_full_scan_subtitles, movies_full_scan_subtitles + +def update_all_episodes(): + series_full_scan_subtitles() + logging.info('All existing episode subtitles indexed from disk.') + list_missing_subtitles() + logging.info('All missing episode subtitles updated in database.') + +def update_all_movies(): + movies_full_scan_subtitles() + logging.info('All existing movie subtitles indexed from disk.') + list_missing_subtitles() + logging.info('All missing movie subtitles updated in database.') + +def sync_episodes(): + logging.debug('Starting episode sync from Sonarr.') + from get_settings import get_sonarr_settings + url_sonarr = get_sonarr_settings()[6] + apikey_sonarr = get_sonarr_settings()[4] + + # Open database connection + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + + # Get current episodes id in DB + current_episodes_db = c.execute('SELECT sonarrEpisodeId FROM table_episodes').fetchall() + + current_episodes_db_list = [x[0] for x in current_episodes_db] + current_episodes_sonarr = [] + episodes_to_update = [] + episodes_to_add = [] + + # Get sonarrId for each series from database + seriesIdList = c.execute("SELECT sonarrSeriesId FROM table_shows").fetchall() + + # Close database connection + c.close() + + for seriesId in seriesIdList: + # Get episodes data for a series from Sonarr + url_sonarr_api_episode = url_sonarr + "/api/episode?seriesId=" + str(seriesId[0]) + "&apikey=" + apikey_sonarr + try: + r = requests.get(url_sonarr_api_episode, timeout=15, verify=False) + r.raise_for_status() + except requests.exceptions.HTTPError as errh: + logging.exception("Error trying to get episodes from Sonarr. Http error.") + except requests.exceptions.ConnectionError as errc: + logging.exception("Error trying to get episodes from Sonarr. Connection Error.") + except requests.exceptions.Timeout as errt: + logging.exception("Error trying to get episodes from Sonarr. Timeout Error.") + except requests.exceptions.RequestException as err: + logging.exception("Error trying to get episodes from Sonarr.") + else: + for episode in r.json(): + if 'hasFile' in episode: + if episode['hasFile'] is True: + if 'episodeFile' in episode: + if episode['episodeFile']['size'] > 20480: + # Add shows in Sonarr to current shows list + if 'sceneName' in episode['episodeFile']: + sceneName = episode['episodeFile']['sceneName'] + else: + sceneName = None + + # Add episodes in sonarr to current episode list + current_episodes_sonarr.append(episode['id']) + + if episode['id'] in current_episodes_db_list: + episodes_to_update.append((episode['title'], episode['episodeFile']['path'], episode['seasonNumber'], episode['episodeNumber'], sceneName, str(bool(episode['monitored'])), episode['id'])) + else: + episodes_to_add.append((episode['seriesId'], episode['id'], episode['title'], episode['episodeFile']['path'], episode['seasonNumber'], episode['episodeNumber'], sceneName, str(bool(episode['monitored'])))) + + removed_episodes = list(set(current_episodes_db_list) - set(current_episodes_sonarr)) + + # Update or insert movies in DB + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + + updated_result = c.executemany('''UPDATE table_episodes SET title = ?, path = ?, season = ?, episode = ?, scene_name = ?, monitored = ? WHERE sonarrEpisodeId = ?''', episodes_to_update) + db.commit() + + added_result = c.executemany('''INSERT OR IGNORE INTO table_episodes(sonarrSeriesId, sonarrEpisodeId, title, path, season, episode, scene_name, monitored) VALUES (?, ?, ?, ?, ?, ?, ?, ?)''', episodes_to_add) + db.commit() + + for removed_episode in removed_episodes: + c.execute('DELETE FROM table_episodes WHERE sonarrEpisodeId = ?', (removed_episode,)) + db.commit() + + # Close database connection + c.close() + + for added_episode in episodes_to_add: + store_subtitles(path_replace(added_episode[3])) + + logging.debug('All episodes synced from Sonarr into database.') + + list_missing_subtitles() logging.debug('All missing subtitles updated in database.')
\ No newline at end of file diff --git a/get_languages.py b/bazarr/get_languages.py index 74c95e1d8..a9f1c0cad 100644 --- a/get_languages.py +++ b/bazarr/get_languages.py @@ -1,92 +1,92 @@ -from get_argv import config_dir
-
-import sqlite3
-import pycountry
-import os
-
-def load_language_in_db():
- # Get languages list in langs tuple
- langs = [[lang.alpha_3,lang.alpha_2,lang.name]
- for lang in pycountry.languages
- if hasattr(lang, 'alpha_2')]
-
- # Open database connection
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
-
- # Insert languages in database table
- c.executemany('''INSERT OR IGNORE INTO table_settings_languages(code3, code2, name) VALUES(?, ?, ?)''', langs)
- c.execute('''INSERT OR IGNORE INTO table_settings_languages(code3, code2, name) VALUES(?, ?, ?)''', ('pob','pb','Brazilian Portuguese'))
-
- # Commit changes to database table
- db.commit()
-
- # Close database connection
- db.close()
-
-def language_from_alpha2(lang):
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
- try:
- result = c.execute('''SELECT name FROM table_settings_languages WHERE code2 = ?''', (lang,)).fetchone()[0]
- except:
- result = None
- db.close
- return result
-
-def language_from_alpha3(lang):
- if lang == 'fre':
- lang = 'fra'
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
- try:
- result = c.execute('''SELECT name FROM table_settings_languages WHERE code3 = ?''', (lang,)).fetchone()[0]
- except:
- result = None
- db.close
- return result
-
-def alpha2_from_alpha3(lang):
- if lang == 'fre':
- lang = 'fra'
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
- try:
- result = c.execute('''SELECT code2 FROM table_settings_languages WHERE code3 = ?''', (lang,)).fetchone()[0]
- except:
- result = None
- db.close
- return result
-
-def alpha2_from_language(lang):
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
- try:
- result = c.execute('''SELECT code2 FROM table_settings_languages WHERE name = ?''', (lang,)).fetchone()[0]
- except:
- result = None
- db.close
- return result
-
-def alpha3_from_alpha2(lang):
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
- try:
- result = c.execute('''SELECT code3 FROM table_settings_languages WHERE code2 = ?''', (lang,)).fetchone()[0]
- except:
- result = None
- db.close
- return result
-
-def alpha3_from_language(lang):
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
- try:
- result = c.execute('''SELECT code3 FROM table_settings_languages WHERE name = ?''', (lang,)).fetchone()[0]
- except:
- result = None
- db.close
- return result
-
-if __name__ == '__main__':
+from get_argv import config_dir + +import sqlite3 +import pycountry +import os + +def load_language_in_db(): + # Get languages list in langs tuple + langs = [[lang.alpha_3,lang.alpha_2,lang.name] + for lang in pycountry.languages + if hasattr(lang, 'alpha_2')] + + # Open database connection + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + + # Insert languages in database table + c.executemany('''INSERT OR IGNORE INTO table_settings_languages(code3, code2, name) VALUES(?, ?, ?)''', langs) + c.execute('''INSERT OR IGNORE INTO table_settings_languages(code3, code2, name) VALUES(?, ?, ?)''', ('pob','pb','Brazilian Portuguese')) + + # Commit changes to database table + db.commit() + + # Close database connection + db.close() + +def language_from_alpha2(lang): + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + try: + result = c.execute('''SELECT name FROM table_settings_languages WHERE code2 = ?''', (lang,)).fetchone()[0] + except: + result = None + db.close + return result + +def language_from_alpha3(lang): + if lang == 'fre': + lang = 'fra' + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + try: + result = c.execute('''SELECT name FROM table_settings_languages WHERE code3 = ?''', (lang,)).fetchone()[0] + except: + result = None + db.close + return result + +def alpha2_from_alpha3(lang): + if lang == 'fre': + lang = 'fra' + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + try: + result = c.execute('''SELECT code2 FROM table_settings_languages WHERE code3 = ?''', (lang,)).fetchone()[0] + except: + result = None + db.close + return result + +def alpha2_from_language(lang): + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + try: + result = c.execute('''SELECT code2 FROM table_settings_languages WHERE name = ?''', (lang,)).fetchone()[0] + except: + result = None + db.close + return result + +def alpha3_from_alpha2(lang): + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + try: + result = c.execute('''SELECT code3 FROM table_settings_languages WHERE code2 = ?''', (lang,)).fetchone()[0] + except: + result = None + db.close + return result + +def alpha3_from_language(lang): + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + try: + result = c.execute('''SELECT code3 FROM table_settings_languages WHERE name = ?''', (lang,)).fetchone()[0] + except: + result = None + db.close + return result + +if __name__ == '__main__': load_language_in_db()
\ No newline at end of file diff --git a/get_movies.py b/bazarr/get_movies.py index 267a46c33..267a46c33 100644 --- a/get_movies.py +++ b/bazarr/get_movies.py diff --git a/get_providers.py b/bazarr/get_providers.py index 006f129b4..006f129b4 100644 --- a/get_providers.py +++ b/bazarr/get_providers.py diff --git a/get_series.py b/bazarr/get_series.py index 616b5e183..0b9490ff4 100644 --- a/get_series.py +++ b/bazarr/get_series.py @@ -1,161 +1,161 @@ -from get_argv import config_dir
-
-import os
-import sqlite3
-import requests
-import logging
-
-from get_settings import get_general_settings
-from list_subtitles import list_missing_subtitles
-
-def update_series():
- from get_settings import get_sonarr_settings
- url_sonarr = get_sonarr_settings()[6]
- apikey_sonarr = get_sonarr_settings()[4]
- serie_default_enabled = get_general_settings()[15]
- serie_default_language = get_general_settings()[16]
- serie_default_hi = get_general_settings()[17]
-
- if apikey_sonarr == None:
- pass
- else:
- get_profile_list()
-
- # Get shows data from Sonarr
- url_sonarr_api_series = url_sonarr + "/api/series?apikey=" + apikey_sonarr
- try:
- r = requests.get(url_sonarr_api_series, timeout=15, verify=False)
- r.raise_for_status()
- except requests.exceptions.HTTPError as errh:
- logging.exception("Error trying to get series from Sonarr. Http error.")
- except requests.exceptions.ConnectionError as errc:
- logging.exception("Error trying to get series from Sonarr. Connection Error.")
- except requests.exceptions.Timeout as errt:
- logging.exception("Error trying to get series from Sonarr. Timeout Error.")
- except requests.exceptions.RequestException as err:
- logging.exception("Error trying to get series from Sonarr.")
- else:
- # Open database connection
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
-
- # Get current shows in DB
- current_shows_db = c.execute('SELECT tvdbId FROM table_shows').fetchall()
-
- # Close database connection
- db.close()
-
- current_shows_db_list = [x[0] for x in current_shows_db]
- current_shows_sonarr = []
- series_to_update = []
- series_to_add = []
-
- for show in r.json():
- try:
- overview = unicode(show['overview'])
- except:
- overview = ""
- try:
- poster_big = show['images'][2]['url'].split('?')[0]
- poster = os.path.splitext(poster_big)[0] + '-250' + os.path.splitext(poster_big)[1]
- except:
- poster = ""
- try:
- fanart = show['images'][0]['url'].split('?')[0]
- except:
- fanart = ""
-
- # Add shows in Sonarr to current shows list
- current_shows_sonarr.append(show['tvdbId'])
-
- if show['tvdbId'] in current_shows_db_list:
- series_to_update.append((show["title"],show["path"],show["tvdbId"],show["id"],overview,poster,fanart,profile_id_to_language((show['qualityProfileId'] if sonarr_version == 2 else show['languageProfileId'])),show['sortTitle'],show["tvdbId"]))
- else:
- if serie_default_enabled is True:
- series_to_add.append((show["title"], show["path"], show["tvdbId"], serie_default_language, serie_default_hi, show["id"], overview, poster, fanart, profile_id_to_language(show['qualityProfileId']), show['sortTitle']))
- else:
- series_to_add.append((show["title"], show["path"], show["tvdbId"], show["tvdbId"], show["tvdbId"], show["id"], overview, poster, fanart, profile_id_to_language(show['qualityProfileId']), show['sortTitle']))
-
- # Update or insert series in DB
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
-
- updated_result = c.executemany('''UPDATE table_shows SET title = ?, path = ?, tvdbId = ?, sonarrSeriesId = ?, overview = ?, poster = ?, fanart = ?, `audio_language` = ? , sortTitle = ? WHERE tvdbid = ?''', series_to_update)
- db.commit()
-
- if serie_default_enabled is True:
- added_result = c.executemany('''INSERT OR IGNORE INTO table_shows(title, path, tvdbId, languages,`hearing_impaired`, sonarrSeriesId, overview, poster, fanart, `audio_language`, sortTitle) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', series_to_add)
- db.commit()
- else:
- added_result = c.executemany('''INSERT OR IGNORE INTO table_shows(title, path, tvdbId, languages,`hearing_impaired`, sonarrSeriesId, overview, poster, fanart, `audio_language`, sortTitle) VALUES (?,?,?,(SELECT languages FROM table_shows WHERE tvdbId = ?),(SELECT `hearing_impaired` FROM table_shows WHERE tvdbId = ?), ?, ?, ?, ?, ?, ?)''', series_to_add)
- db.commit()
- db.close()
-
- for show in series_to_add:
- list_missing_subtitles(show[5])
-
- # Delete shows not in Sonarr anymore
- deleted_items = []
- for item in current_shows_db_list:
- if item not in current_shows_sonarr:
- deleted_items.append(tuple([item]))
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
- c.executemany('DELETE FROM table_shows WHERE tvdbId = ?',deleted_items)
- db.commit()
- db.close()
-
-def get_profile_list():
- from get_settings import get_sonarr_settings
- url_sonarr = get_sonarr_settings()[6]
- # url_sonarr_short = get_sonarr_settings()[5]
- apikey_sonarr = get_sonarr_settings()[4]
-
- # Get profiles data from Sonarr
- error = False
-
- url_sonarr_api_series = url_sonarr + "/api/profile?apikey=" + apikey_sonarr
- try:
- profiles_json = requests.get(url_sonarr_api_series, timeout=15, verify=False)
- except requests.exceptions.ConnectionError as errc:
- error = True
- logging.exception("Error trying to get profiles from Sonarr. Connection Error.")
- except requests.exceptions.Timeout as errt:
- error = True
- logging.exception("Error trying to get profiles from Sonarr. Timeout Error.")
- except requests.exceptions.RequestException as err:
- error = True
- logging.exception("Error trying to get profiles from Sonarr.")
-
- url_sonarr_api_series_v3 = url_sonarr + "/api/v3/languageprofile?apikey=" + apikey_sonarr
- try:
- profiles_json_v3 = requests.get(url_sonarr_api_series_v3, timeout=15, verify=False)
- except requests.exceptions.ConnectionError as errc:
- error = True
- logging.exception("Error trying to get profiles from Sonarr. Connection Error.")
- except requests.exceptions.Timeout as errt:
- error = True
- logging.exception("Error trying to get profiles from Sonarr. Timeout Error.")
- except requests.exceptions.RequestException as err:
- error = True
- logging.exception("Error trying to get profiles from Sonarr.")
-
- global profiles_list
- profiles_list = []
-
- if error is False:
- # Parsing data returned from Sonarr
- global sonarr_version
- if type(profiles_json_v3.json()) != list:
- sonarr_version = 2
- for profile in profiles_json.json():
- profiles_list.append([profile['id'], profile['language'].capitalize()])
- else:
- sonarr_version = 3
- for profile in profiles_json_v3.json():
- profiles_list.append([profile['id'], profile['name'].capitalize()])
-
-def profile_id_to_language(id):
- for profile in profiles_list:
- if id == profile[0]:
- return profile[1]
+from get_argv import config_dir + +import os +import sqlite3 +import requests +import logging + +from get_settings import get_general_settings +from list_subtitles import list_missing_subtitles + +def update_series(): + from get_settings import get_sonarr_settings + url_sonarr = get_sonarr_settings()[6] + apikey_sonarr = get_sonarr_settings()[4] + serie_default_enabled = get_general_settings()[15] + serie_default_language = get_general_settings()[16] + serie_default_hi = get_general_settings()[17] + + if apikey_sonarr == None: + pass + else: + get_profile_list() + + # Get shows data from Sonarr + url_sonarr_api_series = url_sonarr + "/api/series?apikey=" + apikey_sonarr + try: + r = requests.get(url_sonarr_api_series, timeout=15, verify=False) + r.raise_for_status() + except requests.exceptions.HTTPError as errh: + logging.exception("Error trying to get series from Sonarr. Http error.") + except requests.exceptions.ConnectionError as errc: + logging.exception("Error trying to get series from Sonarr. Connection Error.") + except requests.exceptions.Timeout as errt: + logging.exception("Error trying to get series from Sonarr. Timeout Error.") + except requests.exceptions.RequestException as err: + logging.exception("Error trying to get series from Sonarr.") + else: + # Open database connection + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + + # Get current shows in DB + current_shows_db = c.execute('SELECT tvdbId FROM table_shows').fetchall() + + # Close database connection + db.close() + + current_shows_db_list = [x[0] for x in current_shows_db] + current_shows_sonarr = [] + series_to_update = [] + series_to_add = [] + + for show in r.json(): + try: + overview = unicode(show['overview']) + except: + overview = "" + try: + poster_big = show['images'][2]['url'].split('?')[0] + poster = os.path.splitext(poster_big)[0] + '-250' + os.path.splitext(poster_big)[1] + except: + poster = "" + try: + fanart = show['images'][0]['url'].split('?')[0] + except: + fanart = "" + + # Add shows in Sonarr to current shows list + current_shows_sonarr.append(show['tvdbId']) + + if show['tvdbId'] in current_shows_db_list: + series_to_update.append((show["title"],show["path"],show["tvdbId"],show["id"],overview,poster,fanart,profile_id_to_language((show['qualityProfileId'] if sonarr_version == 2 else show['languageProfileId'])),show['sortTitle'],show["tvdbId"])) + else: + if serie_default_enabled is True: + series_to_add.append((show["title"], show["path"], show["tvdbId"], serie_default_language, serie_default_hi, show["id"], overview, poster, fanart, profile_id_to_language(show['qualityProfileId']), show['sortTitle'])) + else: + series_to_add.append((show["title"], show["path"], show["tvdbId"], show["tvdbId"], show["tvdbId"], show["id"], overview, poster, fanart, profile_id_to_language(show['qualityProfileId']), show['sortTitle'])) + + # Update or insert series in DB + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + + updated_result = c.executemany('''UPDATE table_shows SET title = ?, path = ?, tvdbId = ?, sonarrSeriesId = ?, overview = ?, poster = ?, fanart = ?, `audio_language` = ? , sortTitle = ? WHERE tvdbid = ?''', series_to_update) + db.commit() + + if serie_default_enabled is True: + added_result = c.executemany('''INSERT OR IGNORE INTO table_shows(title, path, tvdbId, languages,`hearing_impaired`, sonarrSeriesId, overview, poster, fanart, `audio_language`, sortTitle) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', series_to_add) + db.commit() + else: + added_result = c.executemany('''INSERT OR IGNORE INTO table_shows(title, path, tvdbId, languages,`hearing_impaired`, sonarrSeriesId, overview, poster, fanart, `audio_language`, sortTitle) VALUES (?,?,?,(SELECT languages FROM table_shows WHERE tvdbId = ?),(SELECT `hearing_impaired` FROM table_shows WHERE tvdbId = ?), ?, ?, ?, ?, ?, ?)''', series_to_add) + db.commit() + db.close() + + for show in series_to_add: + list_missing_subtitles(show[5]) + + # Delete shows not in Sonarr anymore + deleted_items = [] + for item in current_shows_db_list: + if item not in current_shows_sonarr: + deleted_items.append(tuple([item])) + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + c.executemany('DELETE FROM table_shows WHERE tvdbId = ?',deleted_items) + db.commit() + db.close() + +def get_profile_list(): + from get_settings import get_sonarr_settings + url_sonarr = get_sonarr_settings()[6] + # url_sonarr_short = get_sonarr_settings()[5] + apikey_sonarr = get_sonarr_settings()[4] + + # Get profiles data from Sonarr + error = False + + url_sonarr_api_series = url_sonarr + "/api/profile?apikey=" + apikey_sonarr + try: + profiles_json = requests.get(url_sonarr_api_series, timeout=15, verify=False) + except requests.exceptions.ConnectionError as errc: + error = True + logging.exception("Error trying to get profiles from Sonarr. Connection Error.") + except requests.exceptions.Timeout as errt: + error = True + logging.exception("Error trying to get profiles from Sonarr. Timeout Error.") + except requests.exceptions.RequestException as err: + error = True + logging.exception("Error trying to get profiles from Sonarr.") + + url_sonarr_api_series_v3 = url_sonarr + "/api/v3/languageprofile?apikey=" + apikey_sonarr + try: + profiles_json_v3 = requests.get(url_sonarr_api_series_v3, timeout=15, verify=False) + except requests.exceptions.ConnectionError as errc: + error = True + logging.exception("Error trying to get profiles from Sonarr. Connection Error.") + except requests.exceptions.Timeout as errt: + error = True + logging.exception("Error trying to get profiles from Sonarr. Timeout Error.") + except requests.exceptions.RequestException as err: + error = True + logging.exception("Error trying to get profiles from Sonarr.") + + global profiles_list + profiles_list = [] + + if error is False: + # Parsing data returned from Sonarr + global sonarr_version + if type(profiles_json_v3.json()) != list: + sonarr_version = 2 + for profile in profiles_json.json(): + profiles_list.append([profile['id'], profile['language'].capitalize()]) + else: + sonarr_version = 3 + for profile in profiles_json_v3.json(): + profiles_list.append([profile['id'], profile['name'].capitalize()]) + +def profile_id_to_language(id): + for profile in profiles_list: + if id == profile[0]: + return profile[1] diff --git a/get_settings.py b/bazarr/get_settings.py index 6d424d9a0..6d424d9a0 100644 --- a/get_settings.py +++ b/bazarr/get_settings.py diff --git a/get_subtitle.py b/bazarr/get_subtitle.py index b94e32e89..b94e32e89 100644 --- a/get_subtitle.py +++ b/bazarr/get_subtitle.py diff --git a/init.py b/bazarr/init.py index e160c947e..e160c947e 100644 --- a/init.py +++ b/bazarr/init.py diff --git a/list_subtitles.py b/bazarr/list_subtitles.py index 8d809fb82..566d15c94 100644 --- a/list_subtitles.py +++ b/bazarr/list_subtitles.py @@ -1,263 +1,263 @@ -from get_argv import config_dir
-
-import gc
-import os
-import enzyme
-import babelfish
-import logging
-from subliminal import core
-import sqlite3
-import ast
-import langdetect
-from bs4 import UnicodeDammit
-from itertools import islice
-
-from get_settings import path_replace_reverse, path_replace, path_replace_reverse_movie, path_replace_movie, get_general_settings
-from get_languages import alpha2_from_alpha3
-
-gc.enable()
-
-def store_subtitles(file):
- # languages = []
- actual_subtitles = []
- if os.path.exists(file):
- if os.path.splitext(file)[1] == '.mkv':
- try:
- with open(file, 'rb') as f:
- mkv = enzyme.MKV(f)
-
- for subtitle_track in mkv.subtitle_tracks:
- try:
- if alpha2_from_alpha3(subtitle_track.language) != None:
- actual_subtitles.append([str(alpha2_from_alpha3(subtitle_track.language)),None])
- except:
- pass
- except:
- pass
-
-
- brazilian_portuguese = [".pt-br", ".pob", "pb"]
- try:
- subtitles = core.search_external_subtitles(file)
- except:
- pass
- else:
- for subtitle, language in subtitles.iteritems():
- if str(os.path.splitext(subtitle)[0]).lower().endswith(tuple(brazilian_portuguese)) is True:
- actual_subtitles.append([str("pb"), path_replace_reverse(os.path.join(os.path.dirname(file), subtitle))])
- elif 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:
- text = list(islice(f, 100))
- text = ' '.join(text)
- encoding = UnicodeDammit(text)
- try:
- text = text.decode(encoding.original_encoding)
- except Exception as e:
- 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.')
- 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))])
-
- conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c_db = conn_db.cursor()
-
- c_db.execute("UPDATE table_episodes SET subtitles = ? WHERE path = ?", (str(actual_subtitles), path_replace_reverse(file)))
- conn_db.commit()
-
- c_db.close()
-
- return actual_subtitles
-
-
-def store_subtitles_movie(file):
- # languages = []
- actual_subtitles = []
- if os.path.exists(file):
- if os.path.splitext(file)[1] == '.mkv':
- try:
- with open(file, 'rb') as f:
- mkv = enzyme.MKV(f)
-
- for subtitle_track in mkv.subtitle_tracks:
- try:
- if alpha2_from_alpha3(subtitle_track.language) != None:
- actual_subtitles.append([str(alpha2_from_alpha3(subtitle_track.language)), None])
- except:
- pass
- except:
- pass
-
- subtitles = core.search_external_subtitles(file)
- brazilian_portuguese = [".pt-br", ".pob", "pb"]
-
- for subtitle, language in subtitles.iteritems():
- if str(os.path.splitext(subtitle)[0]).lower().endswith(tuple(brazilian_portuguese)) is True:
- actual_subtitles.append([str("pb"), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))])
- elif str(language) != 'und':
- actual_subtitles.append([str(language), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))])
- else:
- if os.path.splitext(subtitle)[1] != ".sub":
- with open(path_replace_movie(os.path.join(os.path.dirname(file), subtitle)), 'r') as f:
- text = list(islice(f, 100))
- text = ' '.join(text)
- encoding = UnicodeDammit(text)
- try:
- text = text.decode(encoding.original_encoding)
- except Exception as e:
- logging.exception('Error trying to detect character encoding for this subtitles file: ' + path_replace_movie(os.path.join(os.path.dirname(file), subtitle)) + ' You should try to delete this subtitles file manually and ask Bazarr to download it again.')
- else:
- detected_language = langdetect.detect(text)
- if len(detected_language) > 0:
- actual_subtitles.append([str(detected_language), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))])
-
- conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c_db = conn_db.cursor()
-
- c_db.execute("UPDATE table_movies SET subtitles = ? WHERE path = ?", (str(actual_subtitles), path_replace_reverse_movie(file)))
- conn_db.commit()
-
- c_db.close()
-
- return actual_subtitles
-
-
-def list_missing_subtitles(*no):
- query_string = ''
- try:
- query_string = " WHERE table_shows.sonarrSeriesId = " + str(no[0])
- except:
- pass
- conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c_db = conn_db.cursor()
- 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()
- c_db.close()
-
- missing_subtitles_global = []
- use_embedded_subs = get_general_settings()[23]
- for episode_subtitles in episodes_subtitles:
- actual_subtitles_temp = []
- actual_subtitles = []
- desired_subtitles = []
- missing_subtitles = []
- if episode_subtitles[1] != None:
- if use_embedded_subs is True:
- actual_subtitles = ast.literal_eval(episode_subtitles[1])
- else:
- actual_subtitles_temp = ast.literal_eval(episode_subtitles[1])
- for subtitle in actual_subtitles_temp:
- if subtitle[1] != None:
- actual_subtitles.append(subtitle)
- if episode_subtitles[2] != None:
- 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:
- if item[0] == "pt-BR":
- actual_subtitles_list.append("pb")
- else:
- actual_subtitles_list.append(item[0])
- missing_subtitles = list(set(desired_subtitles) - set(actual_subtitles_list))
- missing_subtitles_global.append(tuple([str(missing_subtitles), episode_subtitles[0]]))
-
- conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c_db = conn_db.cursor()
- c_db.executemany("UPDATE table_episodes SET missing_subtitles = ? WHERE sonarrEpisodeId = ?", (missing_subtitles_global))
- conn_db.commit()
- c_db.close()
-
-
-def list_missing_subtitles_movies(*no):
- query_string = ''
- try:
- query_string = " WHERE table_movies.radarrId = " + str(no[0])
- except:
- pass
- conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c_db = conn_db.cursor()
- movies_subtitles = c_db.execute("SELECT radarrId, subtitles, languages FROM table_movies" + query_string).fetchall()
- c_db.close()
-
- missing_subtitles_global = []
- use_embedded_subs = get_general_settings()[23]
- for movie_subtitles in movies_subtitles:
- actual_subtitles_temp = []
- actual_subtitles = []
- desired_subtitles = []
- missing_subtitles = []
- if movie_subtitles[1] != None:
- if use_embedded_subs is True:
- actual_subtitles = ast.literal_eval(movie_subtitles[1])
- else:
- actual_subtitles_temp = ast.literal_eval(movie_subtitles[1])
- for subtitle in actual_subtitles_temp:
- if subtitle[1] != None:
- actual_subtitles.append(subtitle)
- if movie_subtitles[2] != None:
- desired_subtitles = ast.literal_eval(movie_subtitles[2])
- actual_subtitles_list = []
- if desired_subtitles == None:
- missing_subtitles_global.append(tuple(['[]', movie_subtitles[0]]))
- else:
- for item in actual_subtitles:
- if item[0] == "pt-BR":
- actual_subtitles_list.append("pb")
- else:
- actual_subtitles_list.append(item[0])
- missing_subtitles = list(set(desired_subtitles) - set(actual_subtitles_list))
- missing_subtitles_global.append(tuple([str(missing_subtitles), movie_subtitles[0]]))
-
- conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c_db = conn_db.cursor()
- c_db.executemany("UPDATE table_movies SET missing_subtitles = ? WHERE radarrId = ?", (missing_subtitles_global))
- conn_db.commit()
- c_db.close()
-
-def series_full_scan_subtitles():
- conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c_db = conn_db.cursor()
- episodes = c_db.execute("SELECT path FROM table_episodes").fetchall()
- c_db.close()
-
- for episode in episodes:
- store_subtitles(path_replace(episode[0]))
-
- gc.collect()
-
-def movies_full_scan_subtitles():
- conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c_db = conn_db.cursor()
- movies = c_db.execute("SELECT path FROM table_movies").fetchall()
- c_db.close()
-
- for movie in movies:
- store_subtitles_movie(path_replace_movie(movie[0]))
-
- gc.collect()
-
-def series_scan_subtitles(no):
- conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- 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:
- store_subtitles(path_replace(episode[0]))
-
- list_missing_subtitles(no)
-
-
-def movies_scan_subtitles(no):
- conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c_db = conn_db.cursor()
- movies = c_db.execute("SELECT path FROM table_movies WHERE radarrId = ?", (no,)).fetchall()
- c_db.close()
-
- for movie in movies:
- store_subtitles_movie(path_replace_movie(movie[0]))
-
- list_missing_subtitles_movies(no)
+from get_argv import config_dir + +import gc +import os +import enzyme +import babelfish +import logging +from subliminal import core +import sqlite3 +import ast +import langdetect +from bs4 import UnicodeDammit +from itertools import islice + +from get_settings import path_replace_reverse, path_replace, path_replace_reverse_movie, path_replace_movie, get_general_settings +from get_languages import alpha2_from_alpha3 + +gc.enable() + +def store_subtitles(file): + # languages = [] + actual_subtitles = [] + if os.path.exists(file): + if os.path.splitext(file)[1] == '.mkv': + try: + with open(file, 'rb') as f: + mkv = enzyme.MKV(f) + + for subtitle_track in mkv.subtitle_tracks: + try: + if alpha2_from_alpha3(subtitle_track.language) != None: + actual_subtitles.append([str(alpha2_from_alpha3(subtitle_track.language)),None]) + except: + pass + except: + pass + + + brazilian_portuguese = [".pt-br", ".pob", "pb"] + try: + subtitles = core.search_external_subtitles(file) + except: + pass + else: + for subtitle, language in subtitles.iteritems(): + if str(os.path.splitext(subtitle)[0]).lower().endswith(tuple(brazilian_portuguese)) is True: + actual_subtitles.append([str("pb"), path_replace_reverse(os.path.join(os.path.dirname(file), subtitle))]) + elif 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: + text = list(islice(f, 100)) + text = ' '.join(text) + encoding = UnicodeDammit(text) + try: + text = text.decode(encoding.original_encoding) + except Exception as e: + 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.') + 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))]) + + conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c_db = conn_db.cursor() + + c_db.execute("UPDATE table_episodes SET subtitles = ? WHERE path = ?", (str(actual_subtitles), path_replace_reverse(file))) + conn_db.commit() + + c_db.close() + + return actual_subtitles + + +def store_subtitles_movie(file): + # languages = [] + actual_subtitles = [] + if os.path.exists(file): + if os.path.splitext(file)[1] == '.mkv': + try: + with open(file, 'rb') as f: + mkv = enzyme.MKV(f) + + for subtitle_track in mkv.subtitle_tracks: + try: + if alpha2_from_alpha3(subtitle_track.language) != None: + actual_subtitles.append([str(alpha2_from_alpha3(subtitle_track.language)), None]) + except: + pass + except: + pass + + subtitles = core.search_external_subtitles(file) + brazilian_portuguese = [".pt-br", ".pob", "pb"] + + for subtitle, language in subtitles.iteritems(): + if str(os.path.splitext(subtitle)[0]).lower().endswith(tuple(brazilian_portuguese)) is True: + actual_subtitles.append([str("pb"), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))]) + elif str(language) != 'und': + actual_subtitles.append([str(language), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))]) + else: + if os.path.splitext(subtitle)[1] != ".sub": + with open(path_replace_movie(os.path.join(os.path.dirname(file), subtitle)), 'r') as f: + text = list(islice(f, 100)) + text = ' '.join(text) + encoding = UnicodeDammit(text) + try: + text = text.decode(encoding.original_encoding) + except Exception as e: + logging.exception('Error trying to detect character encoding for this subtitles file: ' + path_replace_movie(os.path.join(os.path.dirname(file), subtitle)) + ' You should try to delete this subtitles file manually and ask Bazarr to download it again.') + else: + detected_language = langdetect.detect(text) + if len(detected_language) > 0: + actual_subtitles.append([str(detected_language), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))]) + + conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c_db = conn_db.cursor() + + c_db.execute("UPDATE table_movies SET subtitles = ? WHERE path = ?", (str(actual_subtitles), path_replace_reverse_movie(file))) + conn_db.commit() + + c_db.close() + + return actual_subtitles + + +def list_missing_subtitles(*no): + query_string = '' + try: + query_string = " WHERE table_shows.sonarrSeriesId = " + str(no[0]) + except: + pass + conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c_db = conn_db.cursor() + 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() + c_db.close() + + missing_subtitles_global = [] + use_embedded_subs = get_general_settings()[23] + for episode_subtitles in episodes_subtitles: + actual_subtitles_temp = [] + actual_subtitles = [] + desired_subtitles = [] + missing_subtitles = [] + if episode_subtitles[1] != None: + if use_embedded_subs is True: + actual_subtitles = ast.literal_eval(episode_subtitles[1]) + else: + actual_subtitles_temp = ast.literal_eval(episode_subtitles[1]) + for subtitle in actual_subtitles_temp: + if subtitle[1] != None: + actual_subtitles.append(subtitle) + if episode_subtitles[2] != None: + 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: + if item[0] == "pt-BR": + actual_subtitles_list.append("pb") + else: + actual_subtitles_list.append(item[0]) + missing_subtitles = list(set(desired_subtitles) - set(actual_subtitles_list)) + missing_subtitles_global.append(tuple([str(missing_subtitles), episode_subtitles[0]])) + + conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c_db = conn_db.cursor() + c_db.executemany("UPDATE table_episodes SET missing_subtitles = ? WHERE sonarrEpisodeId = ?", (missing_subtitles_global)) + conn_db.commit() + c_db.close() + + +def list_missing_subtitles_movies(*no): + query_string = '' + try: + query_string = " WHERE table_movies.radarrId = " + str(no[0]) + except: + pass + conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c_db = conn_db.cursor() + movies_subtitles = c_db.execute("SELECT radarrId, subtitles, languages FROM table_movies" + query_string).fetchall() + c_db.close() + + missing_subtitles_global = [] + use_embedded_subs = get_general_settings()[23] + for movie_subtitles in movies_subtitles: + actual_subtitles_temp = [] + actual_subtitles = [] + desired_subtitles = [] + missing_subtitles = [] + if movie_subtitles[1] != None: + if use_embedded_subs is True: + actual_subtitles = ast.literal_eval(movie_subtitles[1]) + else: + actual_subtitles_temp = ast.literal_eval(movie_subtitles[1]) + for subtitle in actual_subtitles_temp: + if subtitle[1] != None: + actual_subtitles.append(subtitle) + if movie_subtitles[2] != None: + desired_subtitles = ast.literal_eval(movie_subtitles[2]) + actual_subtitles_list = [] + if desired_subtitles == None: + missing_subtitles_global.append(tuple(['[]', movie_subtitles[0]])) + else: + for item in actual_subtitles: + if item[0] == "pt-BR": + actual_subtitles_list.append("pb") + else: + actual_subtitles_list.append(item[0]) + missing_subtitles = list(set(desired_subtitles) - set(actual_subtitles_list)) + missing_subtitles_global.append(tuple([str(missing_subtitles), movie_subtitles[0]])) + + conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c_db = conn_db.cursor() + c_db.executemany("UPDATE table_movies SET missing_subtitles = ? WHERE radarrId = ?", (missing_subtitles_global)) + conn_db.commit() + c_db.close() + +def series_full_scan_subtitles(): + conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c_db = conn_db.cursor() + episodes = c_db.execute("SELECT path FROM table_episodes").fetchall() + c_db.close() + + for episode in episodes: + store_subtitles(path_replace(episode[0])) + + gc.collect() + +def movies_full_scan_subtitles(): + conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c_db = conn_db.cursor() + movies = c_db.execute("SELECT path FROM table_movies").fetchall() + c_db.close() + + for movie in movies: + store_subtitles_movie(path_replace_movie(movie[0])) + + gc.collect() + +def series_scan_subtitles(no): + conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + 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: + store_subtitles(path_replace(episode[0])) + + list_missing_subtitles(no) + + +def movies_scan_subtitles(no): + conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c_db = conn_db.cursor() + movies = c_db.execute("SELECT path FROM table_movies WHERE radarrId = ?", (no,)).fetchall() + c_db.close() + + for movie in movies: + store_subtitles_movie(path_replace_movie(movie[0])) + + list_missing_subtitles_movies(no) diff --git a/main.py b/bazarr/main.py index 8d88433b9..3f092b18e 100644 --- a/main.py +++ b/bazarr/main.py @@ -1,4 +1,4 @@ -bazarr_version = '0.6.5' +bazarr_version = '0.6.6' import gc gc.enable() @@ -11,7 +11,7 @@ import os import sys reload(sys) sys.setdefaultencoding('utf8') -sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'libs/')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../libs/')) import sqlite3 from init import * @@ -69,7 +69,7 @@ if get_proxy_settings()[0] != 'None': from bottle import route, run, template, static_file, request, redirect, response, HTTPError, app import bottle -bottle.TEMPLATE_PATH.insert(0, os.path.join(os.path.dirname(__file__), 'views/')) +bottle.TEMPLATE_PATH.insert(0, os.path.join(os.path.dirname(__file__), '../views/')) bottle.debug(True) bottle.TEMPLATES.clear() @@ -200,7 +200,7 @@ def restart(): @route(base_url + 'static/:path#.+#', name='static') @custom_auth_basic(check_credentials) def static(path): - return static_file(path, root=os.path.join(os.path.dirname(__file__), 'static')) + return static_file(path, root=os.path.join(os.path.dirname(__file__), '../static')) @route(base_url + 'emptylog') @custom_auth_basic(check_credentials) diff --git a/notifier.py b/bazarr/notifier.py index 6109e1fa7..6109e1fa7 100644 --- a/notifier.py +++ b/bazarr/notifier.py diff --git a/scheduler.py b/bazarr/scheduler.py index 8e894c194..8e894c194 100644 --- a/scheduler.py +++ b/bazarr/scheduler.py diff --git a/update_db.py b/bazarr/update_db.py index 9c77a56f9..9c77a56f9 100644 --- a/update_db.py +++ b/bazarr/update_db.py diff --git a/utils.py b/bazarr/utils.py index dc8929072..10acfebdc 100644 --- a/utils.py +++ b/bazarr/utils.py @@ -1,33 +1,33 @@ -from get_argv import config_dir
-
-import os
-import sqlite3
-import time
-
-def history_log(action, sonarrSeriesId, sonarrEpisodeId, description):
- # Open database connection
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
-
- # Get Sonarr API URL from database config table
- history = c.execute('''INSERT INTO table_history(action, sonarrSeriesId, sonarrEpisodeId, timestamp, description) VALUES (?, ?, ?, ?, ?)''', (action, sonarrSeriesId, sonarrEpisodeId, time.time(), description))
-
- # Commit changes to DB
- db.commit()
-
- # Close database connection
- db.close()
-
-
-def history_log_movie(action, radarrId, description):
- # Open database connection
- db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
- c = db.cursor()
-
- history = c.execute('''INSERT INTO table_history_movie(action, radarrId, timestamp, description) VALUES (?, ?, ?, ?)''', (action, radarrId, time.time(), description))
-
- # Commit changes to DB
- db.commit()
-
- # Close database connection
- db.close()
+from get_argv import config_dir + +import os +import sqlite3 +import time + +def history_log(action, sonarrSeriesId, sonarrEpisodeId, description): + # Open database connection + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + + # Get Sonarr API URL from database config table + history = c.execute('''INSERT INTO table_history(action, sonarrSeriesId, sonarrEpisodeId, timestamp, description) VALUES (?, ?, ?, ?, ?)''', (action, sonarrSeriesId, sonarrEpisodeId, time.time(), description)) + + # Commit changes to DB + db.commit() + + # Close database connection + db.close() + + +def history_log_movie(action, radarrId, description): + # Open database connection + db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) + c = db.cursor() + + history = c.execute('''INSERT INTO table_history_movie(action, radarrId, timestamp, description) VALUES (?, ?, ?, ?)''', (action, radarrId, time.time(), description)) + + # Commit changes to DB + db.commit() + + # Close database connection + db.close() |