2018-10-31 19:34:40 +00:00
|
|
|
# coding=utf-8
|
2018-10-04 18:16:49 +00:00
|
|
|
|
|
|
|
import os
|
|
|
|
import sqlite3
|
|
|
|
import requests
|
|
|
|
import logging
|
2019-02-21 04:30:25 +00:00
|
|
|
from queueconfig import notifications
|
2019-01-01 20:15:12 +00:00
|
|
|
import datetime
|
2018-10-04 18:16:49 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
from get_args import args
|
2018-12-15 00:36:28 +00:00
|
|
|
from config import settings, url_sonarr
|
2018-10-04 18:16:49 +00:00
|
|
|
from list_subtitles import list_missing_subtitles
|
2019-08-14 15:38:00 +00:00
|
|
|
from database import TableShows
|
2018-10-04 18:16:49 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
def update_series():
|
2019-02-24 03:58:13 +00:00
|
|
|
notifications.write(msg="Update series list from Sonarr is running...", queue='get_series')
|
2018-12-15 00:36:28 +00:00
|
|
|
apikey_sonarr = settings.sonarr.apikey
|
2018-12-27 19:19:59 +00:00
|
|
|
serie_default_enabled = settings.general.getboolean('serie_default_enabled')
|
2018-12-15 00:36:28 +00:00
|
|
|
serie_default_language = settings.general.serie_default_language
|
|
|
|
serie_default_hi = settings.general.serie_default_hi
|
2019-05-24 17:42:54 +00:00
|
|
|
serie_default_forced = settings.general.serie_default_forced
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-12-15 00:36:28 +00:00
|
|
|
if apikey_sonarr is None:
|
2018-10-04 18:16:49 +00:00
|
|
|
pass
|
|
|
|
else:
|
|
|
|
get_profile_list()
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
# Get shows data from Sonarr
|
|
|
|
url_sonarr_api_series = url_sonarr + "/api/series?apikey=" + apikey_sonarr
|
|
|
|
try:
|
2019-04-14 13:11:46 +00:00
|
|
|
r = requests.get(url_sonarr_api_series, timeout=60, verify=False)
|
2018-10-04 18:16:49 +00:00
|
|
|
r.raise_for_status()
|
|
|
|
except requests.exceptions.HTTPError as errh:
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.exception("BAZARR Error trying to get series from Sonarr. Http error.")
|
2018-10-04 18:16:49 +00:00
|
|
|
except requests.exceptions.ConnectionError as errc:
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.exception("BAZARR Error trying to get series from Sonarr. Connection Error.")
|
2018-10-04 18:16:49 +00:00
|
|
|
except requests.exceptions.Timeout as errt:
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.exception("BAZARR Error trying to get series from Sonarr. Timeout Error.")
|
2018-10-04 18:16:49 +00:00
|
|
|
except requests.exceptions.RequestException as err:
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.exception("BAZARR Error trying to get series from Sonarr.")
|
2018-10-04 18:16:49 +00:00
|
|
|
else:
|
|
|
|
# Get current shows in DB
|
2019-08-14 15:38:00 +00:00
|
|
|
current_shows_db = TableShows.select(
|
|
|
|
TableShows.tvdb_id
|
|
|
|
)
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2019-08-14 15:38:00 +00:00
|
|
|
current_shows_db_list = [x.tvdb_id for x in current_shows_db]
|
2018-10-04 18:16:49 +00:00
|
|
|
current_shows_sonarr = []
|
|
|
|
series_to_update = []
|
|
|
|
series_to_add = []
|
2019-04-23 01:08:26 +00:00
|
|
|
|
|
|
|
seriesListLength = len(r.json())
|
|
|
|
for i, show in enumerate(r.json(), 1):
|
|
|
|
notifications.write(msg="Getting series data from Sonarr...", queue='get_series', item=i, length=seriesListLength)
|
2018-10-04 18:16:49 +00:00
|
|
|
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 = ""
|
2019-02-05 03:57:15 +00:00
|
|
|
|
|
|
|
if show['alternateTitles'] != None:
|
|
|
|
alternateTitles = str([item['title'] for item in show['alternateTitles']])
|
2019-08-14 15:38:00 +00:00
|
|
|
else:
|
|
|
|
alternateTitles = None
|
2019-02-05 03:57:15 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
# Add shows in Sonarr to current shows list
|
|
|
|
current_shows_sonarr.append(show['tvdbId'])
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
if show['tvdbId'] in current_shows_db_list:
|
2019-08-14 15:38:00 +00:00
|
|
|
series_to_update.append({'title': show["title"],
|
|
|
|
'path': show["path"],
|
|
|
|
'tvdb_id': show["tvdbId"],
|
|
|
|
'sonarr_series_id': show["id"],
|
|
|
|
'overview': overview,
|
|
|
|
'poster': poster,
|
|
|
|
'fanart': fanart,
|
|
|
|
'audio_language': profile_id_to_language((show['qualityProfileId'] if sonarr_version == 2 else show['languageProfileId'])),
|
|
|
|
'sort_title': show['sortTitle'],
|
|
|
|
'year': show['year'],
|
|
|
|
'alternate_titles': alternateTitles})
|
2018-10-04 18:16:49 +00:00
|
|
|
else:
|
|
|
|
if serie_default_enabled is True:
|
2019-08-14 15:38:00 +00:00
|
|
|
series_to_add.append({'title': show["title"],
|
|
|
|
'path': show["path"],
|
|
|
|
'tvdb_id': show["tvdbId"],
|
|
|
|
'languages': serie_default_language,
|
|
|
|
'hearing_impaired': serie_default_hi,
|
|
|
|
'sonarr_series_id': show["id"],
|
|
|
|
'overview': overview,
|
|
|
|
'poster': poster,
|
|
|
|
'fanart': fanart,
|
|
|
|
'audio_language': profile_id_to_language(show['qualityProfileId']),
|
|
|
|
'sort_title': show['sortTitle'],
|
|
|
|
'year': show['year'],
|
|
|
|
'alternate_titles': alternateTitles,
|
|
|
|
'forced': serie_default_forced})
|
2018-10-04 18:16:49 +00:00
|
|
|
else:
|
2019-08-14 15:38:00 +00:00
|
|
|
series_to_add.append({'title': show["title"],
|
|
|
|
'path': show["path"],
|
|
|
|
'tvdb_id': show["tvdbId"],
|
|
|
|
'sonarr_series_id': show["id"],
|
|
|
|
'overview': overview,
|
|
|
|
'poster': poster,
|
|
|
|
'fanart': fanart,
|
|
|
|
'audio_language': profile_id_to_language(show['qualityProfileId']),
|
|
|
|
'sort_title': show['sortTitle'],
|
|
|
|
'year': show['year'],
|
|
|
|
'alternate_title': alternateTitles})
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
# Update or insert series in DB
|
2018-10-31 19:34:40 +00:00
|
|
|
db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
|
2018-10-04 18:16:49 +00:00
|
|
|
c = db.cursor()
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
updated_result = c.executemany(
|
2019-02-05 03:57:15 +00:00
|
|
|
'''UPDATE table_shows SET title = ?, path = ?, tvdbId = ?, sonarrSeriesId = ?, overview = ?, poster = ?, fanart = ?, `audio_language` = ? , sortTitle = ?, year = ?, alternateTitles = ? WHERE tvdbid = ?''',
|
2018-10-31 19:34:40 +00:00
|
|
|
series_to_update)
|
2018-10-04 18:16:49 +00:00
|
|
|
db.commit()
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
if serie_default_enabled is True:
|
2018-10-31 19:34:40 +00:00
|
|
|
added_result = c.executemany(
|
2019-05-24 17:42:54 +00:00
|
|
|
'''INSERT OR IGNORE INTO table_shows(title, path, tvdbId, languages,`hearing_impaired`, sonarrSeriesId, overview, poster, fanart, `audio_language`, sortTitle, year, alternateTitles, forced) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''',
|
2018-10-31 19:34:40 +00:00
|
|
|
series_to_add)
|
2018-10-04 18:16:49 +00:00
|
|
|
db.commit()
|
|
|
|
else:
|
2018-10-31 19:34:40 +00:00
|
|
|
added_result = c.executemany(
|
2019-05-24 17:42:54 +00:00
|
|
|
'''INSERT OR IGNORE INTO table_shows(title, path, tvdbId, languages,`hearing_impaired`, sonarrSeriesId, overview, poster, fanart, `audio_language`, sortTitle, year, alternateTitles, forced) VALUES (?,?,?,(SELECT languages FROM table_shows WHERE tvdbId = ?),(SELECT `hearing_impaired` FROM table_shows WHERE tvdbId = ?), ?, ?, ?, ?, ?, ?, ?, ?, (SELECT `forced` FROM table_shows WHERE tvdbId = ?))''',
|
2018-10-31 19:34:40 +00:00
|
|
|
series_to_add)
|
2018-10-04 18:16:49 +00:00
|
|
|
db.commit()
|
|
|
|
db.close()
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
for show in series_to_add:
|
|
|
|
list_missing_subtitles(show[5])
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
# 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]))
|
2018-10-31 19:34:40 +00:00
|
|
|
db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
|
2018-10-04 18:16:49 +00:00
|
|
|
c = db.cursor()
|
2018-10-31 19:34:40 +00:00
|
|
|
c.executemany('DELETE FROM table_shows WHERE tvdbId = ?', deleted_items)
|
2018-10-04 18:16:49 +00:00
|
|
|
db.commit()
|
|
|
|
db.close()
|
2018-12-13 02:50:05 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
def get_profile_list():
|
2018-12-15 00:36:28 +00:00
|
|
|
apikey_sonarr = settings.sonarr.apikey
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
# Get profiles data from Sonarr
|
|
|
|
error = False
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
url_sonarr_api_series = url_sonarr + "/api/profile?apikey=" + apikey_sonarr
|
|
|
|
try:
|
2019-04-14 13:11:46 +00:00
|
|
|
profiles_json = requests.get(url_sonarr_api_series, timeout=60, verify=False)
|
2018-10-04 18:16:49 +00:00
|
|
|
except requests.exceptions.ConnectionError as errc:
|
|
|
|
error = True
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.exception("BAZARR Error trying to get profiles from Sonarr. Connection Error.")
|
2018-10-04 18:16:49 +00:00
|
|
|
except requests.exceptions.Timeout as errt:
|
|
|
|
error = True
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.exception("BAZARR Error trying to get profiles from Sonarr. Timeout Error.")
|
2018-10-04 18:16:49 +00:00
|
|
|
except requests.exceptions.RequestException as err:
|
|
|
|
error = True
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.exception("BAZARR Error trying to get profiles from Sonarr.")
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
url_sonarr_api_series_v3 = url_sonarr + "/api/v3/languageprofile?apikey=" + apikey_sonarr
|
|
|
|
try:
|
2019-04-14 13:11:46 +00:00
|
|
|
profiles_json_v3 = requests.get(url_sonarr_api_series_v3, timeout=60, verify=False)
|
2018-10-04 18:16:49 +00:00
|
|
|
except requests.exceptions.ConnectionError as errc:
|
|
|
|
error = True
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.exception("BAZARR Error trying to get profiles from Sonarr. Connection Error.")
|
2018-10-04 18:16:49 +00:00
|
|
|
except requests.exceptions.Timeout as errt:
|
|
|
|
error = True
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.exception("BAZARR Error trying to get profiles from Sonarr. Timeout Error.")
|
2018-10-04 18:16:49 +00:00
|
|
|
except requests.exceptions.RequestException as err:
|
|
|
|
error = True
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.exception("BAZARR Error trying to get profiles from Sonarr.")
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
global profiles_list
|
|
|
|
profiles_list = []
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
if not error:
|
2018-10-04 18:16:49 +00:00
|
|
|
# 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()])
|
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2018-10-04 18:16:49 +00:00
|
|
|
def profile_id_to_language(id):
|
|
|
|
for profile in profiles_list:
|
|
|
|
if id == profile[0]:
|
|
|
|
return profile[1]
|