示例#1
0
def sync_episodes():
    notifications.write(msg='Episodes sync from Sonarr started...',
                        queue='get_episodes')
    logging.debug('BAZARR Starting episodes sync from Sonarr.')
    apikey_sonarr = settings.sonarr.apikey

    # Get current episodes id in DB
    current_episodes_db = database.execute(
        "SELECT sonarrEpisodeId, path, sonarrSeriesId FROM table_episodes")

    current_episodes_db_list = [
        x['sonarrEpisodeId'] for x in current_episodes_db
    ]

    current_episodes_sonarr = []
    episodes_to_update = []
    episodes_to_add = []
    altered_episodes = []

    # Get sonarrId for each series from database
    seriesIdList = database.execute(
        "SELECT sonarrSeriesId, title FROM table_shows")

    seriesIdListLength = len(seriesIdList)
    for i, seriesId in enumerate(seriesIdList, 1):
        notifications.write(msg='Getting episodes data from Sonarr...',
                            queue='get_episodes',
                            item=i,
                            length=seriesIdListLength)
        # Get episodes data for a series from Sonarr
        url_sonarr_api_episode = url_sonarr() + "/api/episode?seriesId=" + str(
            seriesId['sonarrSeriesId']) + "&apikey=" + apikey_sonarr
        try:
            r = requests.get(url_sonarr_api_episode, timeout=60, verify=False)
            r.raise_for_status()
        except requests.exceptions.HTTPError as errh:
            logging.exception(
                "BAZARR Error trying to get episodes from Sonarr. Http error.")
            return
        except requests.exceptions.ConnectionError as errc:
            logging.exception(
                "BAZARR Error trying to get episodes from Sonarr. Connection Error."
            )
            return
        except requests.exceptions.Timeout as errt:
            logging.exception(
                "BAZARR Error trying to get episodes from Sonarr. Timeout Error."
            )
            return
        except requests.exceptions.RequestException as err:
            logging.exception(
                "BAZARR Error trying to get episodes from Sonarr.")
            return
        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

                                try:
                                    format, resolution = episode[
                                        'episodeFile']['quality']['quality'][
                                            'name'].split('-')
                                except:
                                    format = episode['episodeFile']['quality'][
                                        'quality']['name']
                                    try:
                                        resolution = str(
                                            episode['episodeFile']['quality']
                                            ['quality']['resolution']) + 'p'
                                    except:
                                        resolution = None

                                if 'mediaInfo' in episode['episodeFile']:
                                    if 'videoCodec' in episode['episodeFile'][
                                            'mediaInfo']:
                                        videoCodec = episode['episodeFile'][
                                            'mediaInfo']['videoCodec']
                                        videoCodec = SonarrFormatVideoCodec(
                                            videoCodec)
                                    else:
                                        videoCodec = None

                                    if 'audioCodec' in episode['episodeFile'][
                                            'mediaInfo']:
                                        audioCodec = episode['episodeFile'][
                                            'mediaInfo']['audioCodec']
                                        audioCodec = SonarrFormatAudioCodec(
                                            audioCodec)
                                    else:
                                        audioCodec = None
                                else:
                                    videoCodec = None
                                    audioCodec = 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({
                                        'sonarrSeriesId':
                                        episode['seriesId'],
                                        'sonarrEpisodeId':
                                        episode['id'],
                                        'title':
                                        episode['title'],
                                        'path':
                                        episode['episodeFile']['path'],
                                        'season':
                                        episode['seasonNumber'],
                                        'episode':
                                        episode['episodeNumber'],
                                        'scene_name':
                                        sceneName,
                                        'monitored':
                                        str(bool(episode['monitored'])),
                                        'format':
                                        format,
                                        'resolution':
                                        resolution,
                                        'video_codec':
                                        videoCodec,
                                        'audio_codec':
                                        audioCodec,
                                        'episode_file_id':
                                        episode['episodeFile']['id']
                                    })
                                else:
                                    episodes_to_add.append({
                                        'sonarrSeriesId':
                                        episode['seriesId'],
                                        'sonarrEpisodeId':
                                        episode['id'],
                                        'title':
                                        episode['title'],
                                        'path':
                                        episode['episodeFile']['path'],
                                        'season':
                                        episode['seasonNumber'],
                                        'episode':
                                        episode['episodeNumber'],
                                        'scene_name':
                                        sceneName,
                                        'monitored':
                                        str(bool(episode['monitored'])),
                                        'format':
                                        format,
                                        'resolution':
                                        resolution,
                                        'video_codec':
                                        videoCodec,
                                        'audio_codec':
                                        audioCodec,
                                        'episode_file_id':
                                        episode['episodeFile']['id']
                                    })

    # Remove old episodes from DB
    removed_episodes = list(
        set(current_episodes_db_list) - set(current_episodes_sonarr))

    for removed_episode in removed_episodes:
        database.execute("DELETE FROM table_episodes WHERE sonarrEpisodeId=?",
                         (removed_episode, ))

    # Update existing episodes in DB
    episode_in_db_list = []
    episodes_in_db = database.execute(
        "SELECT sonarrSeriesId, sonarrEpisodeId, title, path, season, episode, "
        "scene_name, monitored, format, resolution, video_codec, audio_codec, "
        "episode_file_id FROM table_episodes")

    for item in episodes_in_db:
        episode_in_db_list.append(item)

    episodes_to_update_list = [
        i for i in episodes_to_update if i not in episode_in_db_list
    ]

    for updated_episode in episodes_to_update_list:
        query = dict_converter.convert(updated_episode)
        database.execute(
            '''UPDATE table_episodes SET ''' + query.keys_update +
            ''' WHERE sonarrEpisodeId = ?''',
            query.values + (updated_episode['sonarrEpisodeId'], ))
        altered_episodes.append([
            updated_episode['sonarrEpisodeId'], updated_episode['path'],
            updated_episode['sonarrSeriesId']
        ])

    # Insert new episodes in DB
    for added_episode in episodes_to_add:
        query = dict_converter.convert(added_episode)
        result = database.execute(
            '''INSERT OR IGNORE INTO table_episodes(''' + query.keys_insert +
            ''') VALUES(''' + query.question_marks + ''')''', query.values)
        if result > 0:
            altered_episodes.append(
                [added_episode['sonarrEpisodeId'], added_episode['path']])
        else:
            logging.debug(
                'BAZARR unable to insert this episode into the database:',
                path_replace(added_episode['path']))

    # Store subtitles for added or modified episodes
    for i, altered_episode in enumerate(altered_episodes, 1):
        notifications.write(msg='Indexing episodes embedded subtitles...',
                            queue='get_episodes',
                            item=i,
                            length=len(altered_episodes))
        store_subtitles(altered_episode[1], path_replace(altered_episode[1]))

    logging.debug('BAZARR All episodes synced from Sonarr into database.')

    # Search for desired subtitles if no more than 5 episodes have been added.
    if len(altered_episodes) <= 5:
        logging.debug(
            "BAZARR No more than 5 episodes were added during this sync then we'll search for subtitles."
        )
        for altered_episode in altered_episodes:
            episode_download_subtitles(altered_episode[0])
    else:
        logging.debug(
            "BAZARR More than 5 episodes were added during this sync then we wont search for subtitles right now."
        )
示例#2
0
def update_movies():
    logging.debug('BAZARR Starting movie sync from Radarr.')
    apikey_radarr = settings.radarr.apikey

    radarr_version = get_radarr_version()
    movie_default_enabled = settings.general.getboolean(
        'movie_default_enabled')

    if movie_default_enabled is True:
        movie_default_language = settings.general.movie_default_language
        movie_default_hi = settings.general.movie_default_hi
        movie_default_forced = settings.general.movie_default_forced
    else:
        movie_default_language = '[]'
        movie_default_hi = 'False'
        movie_default_forced = 'False'

    if apikey_radarr is None:
        pass
    else:
        audio_profiles = get_profile_list()
        tagsDict = get_tags()

        # Get movies data from radarr
        if radarr_version.startswith('0'):
            url_radarr_api_movies = url_radarr(
            ) + "/api/movie?apikey=" + apikey_radarr
        else:
            url_radarr_api_movies = url_radarr(
            ) + "/api/v3/movie?apikey=" + apikey_radarr

        try:
            r = requests.get(url_radarr_api_movies, timeout=60, verify=False)
            r.raise_for_status()
        except requests.exceptions.HTTPError as errh:
            logging.exception(
                "BAZARR Error trying to get movies from Radarr. Http error.")
            return
        except requests.exceptions.ConnectionError as errc:
            logging.exception(
                "BAZARR Error trying to get movies from Radarr. Connection Error."
            )
            return
        except requests.exceptions.Timeout as errt:
            logging.exception(
                "BAZARR Error trying to get movies from Radarr. Timeout Error."
            )
            return
        except requests.exceptions.RequestException as err:
            logging.exception("BAZARR Error trying to get movies from Radarr.")
            return
        else:
            # Get current movies in DB
            current_movies_db = database.execute(
                "SELECT tmdbId, path, radarrId FROM table_movies")

            current_movies_db_list = [x['tmdbId'] for x in current_movies_db]

            current_movies_radarr = []
            movies_to_update = []
            movies_to_add = []
            altered_movies = []

            moviesIdListLength = len(r.json())
            for i, movie in enumerate(r.json(), 1):
                if movie['hasFile'] is True:
                    if 'movieFile' in movie:
                        # Detect file separator
                        if movie['path'][0] == "/":
                            separator = "/"
                        else:
                            separator = "\\"

                        if movie["path"] != None and movie['movieFile'][
                                'relativePath'] != None:
                            try:
                                overview = str(movie['overview'])
                            except:
                                overview = ""
                            try:
                                poster_big = movie['images'][0]['url']
                                poster = os.path.splitext(
                                    poster_big)[0] + '-500' + os.path.splitext(
                                        poster_big)[1]
                            except:
                                poster = ""
                            try:
                                fanart = movie['images'][1]['url']
                            except:
                                fanart = ""

                            if 'sceneName' in movie['movieFile']:
                                sceneName = movie['movieFile']['sceneName']
                            else:
                                sceneName = None

                            alternativeTitles = None
                            if radarr_version.startswith('0'):
                                if 'alternativeTitles' in movie:
                                    alternativeTitles = str([
                                        item['title']
                                        for item in movie['alternativeTitles']
                                    ])
                            else:
                                if 'alternateTitles' in movie:
                                    alternativeTitles = str([
                                        item['title']
                                        for item in movie['alternateTitles']
                                    ])

                            if 'imdbId' in movie: imdbId = movie['imdbId']
                            else: imdbId = None

                            try:
                                format, resolution = movie['movieFile'][
                                    'quality']['quality']['name'].split('-')
                            except:
                                format = movie['movieFile']['quality'][
                                    'quality']['name']
                                try:
                                    resolution = str(
                                        movie['movieFile']['quality']
                                        ['quality']['resolution']) + 'p'
                                except:
                                    resolution = None

                            if 'mediaInfo' in movie['movieFile']:
                                videoFormat = videoCodecID = videoProfile = videoCodecLibrary = None
                                if radarr_version.startswith('0'):
                                    if 'videoFormat' in movie['movieFile'][
                                            'mediaInfo']:
                                        videoFormat = movie['movieFile'][
                                            'mediaInfo']['videoFormat']
                                else:
                                    if 'videoCodec' in movie['movieFile'][
                                            'mediaInfo']:
                                        videoFormat = movie['movieFile'][
                                            'mediaInfo']['videoCodec']
                                if 'videoCodecID' in movie['movieFile'][
                                        'mediaInfo']:
                                    videoCodecID = movie['movieFile'][
                                        'mediaInfo']['videoCodecID']
                                if 'videoProfile' in movie['movieFile'][
                                        'mediaInfo']:
                                    videoProfile = movie['movieFile'][
                                        'mediaInfo']['videoProfile']
                                if 'videoCodecLibrary' in movie['movieFile'][
                                        'mediaInfo']:
                                    videoCodecLibrary = movie['movieFile'][
                                        'mediaInfo']['videoCodecLibrary']
                                videoCodec = RadarrFormatVideoCodec(
                                    videoFormat, videoCodecID,
                                    videoCodecLibrary)

                                audioFormat = audioCodecID = audioProfile = audioAdditionalFeatures = None
                                if radarr_version.startswith('0'):
                                    if 'audioFormat' in movie['movieFile'][
                                            'mediaInfo']:
                                        audioFormat = movie['movieFile'][
                                            'mediaInfo']['audioFormat']
                                else:
                                    if 'audioCodec' in movie['movieFile'][
                                            'mediaInfo']:
                                        audioFormat = movie['movieFile'][
                                            'mediaInfo']['audioCodec']
                                if 'audioCodecID' in movie['movieFile'][
                                        'mediaInfo']:
                                    audioCodecID = movie['movieFile'][
                                        'mediaInfo']['audioCodecID']
                                if 'audioProfile' in movie['movieFile'][
                                        'mediaInfo']:
                                    audioProfile = movie['movieFile'][
                                        'mediaInfo']['audioProfile']
                                if 'audioAdditionalFeatures' in movie[
                                        'movieFile']['mediaInfo']:
                                    audioAdditionalFeatures = movie[
                                        'movieFile']['mediaInfo'][
                                            'audioAdditionalFeatures']
                                audioCodec = RadarrFormatAudioCodec(
                                    audioFormat, audioCodecID, audioProfile,
                                    audioAdditionalFeatures)
                            else:
                                videoCodec = None
                                audioCodec = None

                            audio_language = None
                            if radarr_version.startswith('0'):
                                if 'mediaInfo' in movie['movieFile']:
                                    if 'audioLanguages' in movie['movieFile'][
                                            'mediaInfo']:
                                        audio_language_list = movie[
                                            'movieFile']['mediaInfo'][
                                                'audioLanguages'].split('/')
                                        if len(audio_language_list):
                                            audio_language = audio_language_list[
                                                0].strip()
                                if not audio_language:
                                    audio_language = profile_id_to_language(
                                        movie['qualityProfileId'],
                                        audio_profiles)
                            else:
                                if 'languages' in movie['movieFile'] and len(
                                        movie['movieFile']['languages']):
                                    for item in movie['movieFile'][
                                            'languages']:
                                        if isinstance(item, dict):
                                            if 'name' in item:
                                                audio_language = item['name']
                                                break

                            tags = [
                                d['label'] for d in tagsDict
                                if d['id'] in movie['tags']
                            ]

                            # Add movies in radarr to current movies list
                            current_movies_radarr.append(str(movie['tmdbId']))

                            if str(movie['tmdbId']) in current_movies_db_list:
                                movies_to_update.append({
                                    'radarrId':
                                    int(movie["id"]),
                                    'title':
                                    movie["title"],
                                    'path':
                                    movie["path"] + separator +
                                    movie['movieFile']['relativePath'],
                                    'tmdbId':
                                    str(movie["tmdbId"]),
                                    'poster':
                                    poster,
                                    'fanart':
                                    fanart,
                                    'audio_language':
                                    audio_language,
                                    'sceneName':
                                    sceneName,
                                    'monitored':
                                    str(bool(movie['monitored'])),
                                    'year':
                                    str(movie['year']),
                                    'sortTitle':
                                    movie['sortTitle'],
                                    'alternativeTitles':
                                    alternativeTitles,
                                    'format':
                                    format,
                                    'resolution':
                                    resolution,
                                    'video_codec':
                                    videoCodec,
                                    'audio_codec':
                                    audioCodec,
                                    'overview':
                                    overview,
                                    'imdbId':
                                    imdbId,
                                    'movie_file_id':
                                    int(movie['movieFile']['id']),
                                    'tags':
                                    str(tags)
                                })
                            else:
                                movies_to_add.append({
                                    'radarrId':
                                    int(movie["id"]),
                                    'title':
                                    movie["title"],
                                    'path':
                                    movie["path"] + separator +
                                    movie['movieFile']['relativePath'],
                                    'tmdbId':
                                    str(movie["tmdbId"]),
                                    'languages':
                                    movie_default_language,
                                    'subtitles':
                                    '[]',
                                    'hearing_impaired':
                                    movie_default_hi,
                                    'overview':
                                    overview,
                                    'poster':
                                    poster,
                                    'fanart':
                                    fanart,
                                    'audio_language':
                                    audio_language,
                                    'sceneName':
                                    sceneName,
                                    'monitored':
                                    str(bool(movie['monitored'])),
                                    'sortTitle':
                                    movie['sortTitle'],
                                    'year':
                                    str(movie['year']),
                                    'alternativeTitles':
                                    alternativeTitles,
                                    'format':
                                    format,
                                    'resolution':
                                    resolution,
                                    'video_codec':
                                    videoCodec,
                                    'audio_codec':
                                    audioCodec,
                                    'imdbId':
                                    imdbId,
                                    'forced':
                                    movie_default_forced,
                                    'movie_file_id':
                                    int(movie['movieFile']['id']),
                                    'tags':
                                    str(tags)
                                })
                        else:
                            logging.error(
                                'BAZARR Radarr returned a movie without a file path: '
                                + movie["path"] + separator +
                                movie['movieFile']['relativePath'])

            # Remove old movies from DB
            removed_movies = list(
                set(current_movies_db_list) - set(current_movies_radarr))

            for removed_movie in removed_movies:
                database.execute("DELETE FROM table_movies WHERE tmdbId=?",
                                 (removed_movie, ))

            # Update movies in DB
            movies_in_db_list = []
            movies_in_db = database.execute(
                "SELECT radarrId, title, path, tmdbId, overview, poster, fanart, "
                "audio_language, sceneName, monitored, sortTitle, year, "
                "alternativeTitles, format, resolution, video_codec, audio_codec, imdbId,"
                "movie_file_id, tags FROM table_movies")

            for item in movies_in_db:
                movies_in_db_list.append(item)

            movies_to_update_list = [
                i for i in movies_to_update if i not in movies_in_db_list
            ]

            for updated_movie in movies_to_update_list:
                query = dict_converter.convert(updated_movie)
                database.execute(
                    '''UPDATE table_movies SET ''' + query.keys_update +
                    ''' WHERE tmdbId = ?''',
                    query.values + (updated_movie['tmdbId'], ))
                altered_movies.append([
                    updated_movie['tmdbId'], updated_movie['path'],
                    updated_movie['radarrId'], updated_movie['monitored']
                ])

            # Insert new movies in DB
            for added_movie in movies_to_add:
                query = dict_converter.convert(added_movie)
                result = database.execute(
                    '''INSERT OR IGNORE INTO table_movies(''' +
                    query.keys_insert + ''') VALUES(''' +
                    query.question_marks + ''')''', query.values)
                if result > 0:
                    altered_movies.append([
                        added_movie['tmdbId'], added_movie['path'],
                        added_movie['radarrId'], added_movie['monitored']
                    ])
                else:
                    logging.debug(
                        'BAZARR unable to insert this movie into the database:',
                        path_mappings.path_replace_movie(added_movie['path']))

            # Store subtitles for added or modified movies
            for i, altered_movie in enumerate(altered_movies, 1):
                store_subtitles_movie(
                    altered_movie[1],
                    path_mappings.path_replace_movie(altered_movie[1]))

            logging.debug(
                'BAZARR All movies synced from Radarr into database.')

            # Search for desired subtitles if no more than 5 movies have been added.
            if len(altered_movies) <= 5:
                logging.debug(
                    "BAZARR No more than 5 movies were added during this sync then we'll search for subtitles."
                )
                for altered_movie in altered_movies:
                    data = database.execute(
                        "SELECT * FROM table_movies WHERE radarrId = ?" +
                        get_exclusion_clause('movie'), (altered_movie[2], ),
                        only_one=True)
                    if data:
                        movies_download_subtitles(data['radarrId'])
                    else:
                        logging.debug(
                            "BAZARR skipping download for this movie as it is excluded."
                        )
            else:
                logging.debug(
                    "BAZARR More than 5 movies were added during this sync then we wont search for subtitles."
                )
示例#3
0
def update_series():
    apikey_sonarr = settings.sonarr.apikey
    if apikey_sonarr is None:
        return

    sonarr_version = get_sonarr_version()
    serie_default_enabled = settings.general.getboolean(
        'serie_default_enabled')

    if serie_default_enabled is True:
        serie_default_profile = settings.general.serie_default_profile
        if serie_default_profile == '':
            serie_default_profile = None
    else:
        serie_default_profile = None

    audio_profiles = get_profile_list()
    tagsDict = get_tags()

    # 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=60, verify=False)
        r.raise_for_status()
    except requests.exceptions.HTTPError:
        logging.exception(
            "BAZARR Error trying to get series from Sonarr. Http error.")
        return
    except requests.exceptions.ConnectionError:
        logging.exception(
            "BAZARR Error trying to get series from Sonarr. Connection Error.")
        return
    except requests.exceptions.Timeout:
        logging.exception(
            "BAZARR Error trying to get series from Sonarr. Timeout Error.")
        return
    except requests.exceptions.RequestException:
        logging.exception("BAZARR Error trying to get series from Sonarr.")
        return

    # Get current shows in DB
    current_shows_db = database.execute(
        "SELECT sonarrSeriesId FROM table_shows")

    current_shows_db_list = [x['sonarrSeriesId'] for x in current_shows_db]
    current_shows_sonarr = []
    series_to_update = []
    series_to_add = []

    series_list_length = len(r.json())
    for i, show in enumerate(r.json(), 1):
        overview = show['overview'] if 'overview' in show else ''
        poster = ''
        fanart = ''
        for image in show['images']:
            if image['coverType'] == 'poster':
                poster_big = image['url'].split('?')[0]
                poster = os.path.splitext(
                    poster_big)[0] + '-250' + os.path.splitext(poster_big)[1]

            if image['coverType'] == 'fanart':
                fanart = image['url'].split('?')[0]

        alternate_titles = None
        if show['alternateTitles'] is not None:
            alternate_titles = str(
                [item['title'] for item in show['alternateTitles']])

        audio_language = []
        if sonarr_version.startswith('2'):
            audio_language = profile_id_to_language(show['qualityProfileId'],
                                                    audio_profiles)
        else:
            audio_language = profile_id_to_language(show['languageProfileId'],
                                                    audio_profiles)

        tags = [d['label'] for d in tagsDict if d['id'] in show['tags']]

        imdbId = show['imdbId'] if 'imdbId' in show else None

        # Add shows in Sonarr to current shows list
        current_shows_sonarr.append(show['id'])

        if show['id'] in current_shows_db_list:
            series_to_update.append({
                'title': show["title"],
                'path': show["path"],
                'tvdbId': int(show["tvdbId"]),
                'sonarrSeriesId': int(show["id"]),
                'overview': overview,
                'poster': poster,
                'fanart': fanart,
                'audio_language': str(audio_language),
                'sortTitle': show['sortTitle'],
                'year': str(show['year']),
                'alternateTitles': alternate_titles,
                'tags': str(tags),
                'seriesType': show['seriesType'],
                'imdbId': imdbId
            })
        else:
            series_to_add.append({
                'title': show["title"],
                'path': show["path"],
                'tvdbId': show["tvdbId"],
                'sonarrSeriesId': show["id"],
                'overview': overview,
                'poster': poster,
                'fanart': fanart,
                'audio_language': str(audio_language),
                'sortTitle': show['sortTitle'],
                'year': str(show['year']),
                'alternateTitles': alternate_titles,
                'tags': str(tags),
                'seriesType': show['seriesType'],
                'imdbId': imdbId,
                'profileId': serie_default_profile
            })

    # Remove old series from DB
    removed_series = list(
        set(current_shows_db_list) - set(current_shows_sonarr))

    for series in removed_series:
        database.execute("DELETE FROM table_shows WHERE sonarrSeriesId=?",
                         (series, ))
        event_stream(type='series', action='delete', series=series)

    # Update existing series in DB
    series_in_db_list = []
    series_in_db = database.execute(
        "SELECT title, path, tvdbId, sonarrSeriesId, overview, poster, fanart, "
        "audio_language, sortTitle, year, alternateTitles, tags, seriesType, imdbId FROM table_shows"
    )

    for item in series_in_db:
        series_in_db_list.append(item)

    series_to_update_list = [
        i for i in series_to_update if i not in series_in_db_list
    ]

    for updated_series in series_to_update_list:
        query = dict_converter.convert(updated_series)
        database.execute(
            '''UPDATE table_shows SET ''' + query.keys_update +
            ''' WHERE sonarrSeriesId = ?''',
            query.values + (updated_series['sonarrSeriesId'], ))
        event_stream(type='series',
                     action='update',
                     series=updated_series['sonarrSeriesId'])

    # Insert new series in DB
    for added_series in series_to_add:
        query = dict_converter.convert(added_series)
        result = database.execute(
            '''INSERT OR IGNORE INTO table_shows(''' + query.keys_insert +
            ''') VALUES(''' + query.question_marks + ''')''', query.values)
        if result:
            list_missing_subtitles(no=added_series['sonarrSeriesId'])
        else:
            logging.debug(
                'BAZARR unable to insert this series into the database:',
                path_mappings.path_replace(added_series['path']))

            event_stream(type='series',
                         action='insert',
                         series=added_series['sonarrSeriesId'])

            logging.debug(
                'BAZARR All series synced from Sonarr into database.')
示例#4
0
def update_series():
    notifications.write(msg="Update series list from Sonarr is running...",
                        queue='get_series')
    apikey_sonarr = settings.sonarr.apikey
    sonarr_version = get_sonarr_version()
    serie_default_enabled = settings.general.getboolean(
        'serie_default_enabled')
    serie_default_language = settings.general.serie_default_language
    serie_default_hi = settings.general.serie_default_hi
    serie_default_forced = settings.general.serie_default_forced

    if apikey_sonarr is None:
        pass
    else:
        audio_profiles = 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=60, verify=False)
            r.raise_for_status()
        except requests.exceptions.HTTPError as errh:
            logging.exception(
                "BAZARR Error trying to get series from Sonarr. Http error.")
            return
        except requests.exceptions.ConnectionError as errc:
            logging.exception(
                "BAZARR Error trying to get series from Sonarr. Connection Error."
            )
            return
        except requests.exceptions.Timeout as errt:
            logging.exception(
                "BAZARR Error trying to get series from Sonarr. Timeout Error."
            )
            return
        except requests.exceptions.RequestException as err:
            logging.exception("BAZARR Error trying to get series from Sonarr.")
            return
        else:
            # Get current shows in DB
            current_shows_db = database.execute(
                "SELECT sonarrSeriesId FROM table_shows")

            current_shows_db_list = [
                x['sonarrSeriesId'] for x in current_shows_db
            ]
            current_shows_sonarr = []
            series_to_update = []
            series_to_add = []
            altered_series = []

            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)
                try:
                    overview = six.text_type(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 = ""

                if show['alternateTitles'] != None:
                    alternateTitles = str(
                        [item['title'] for item in show['alternateTitles']])
                else:
                    alternateTitles = None

                # Add shows in Sonarr to current shows list
                current_shows_sonarr.append(show['id'])

                if show['tvdbId'] in current_shows_db_list:
                    series_to_update.append({
                        'title':
                        six.text_type(show["title"]),
                        'path':
                        six.text_type(show["path"]),
                        'tvdbId':
                        int(show["tvdbId"]),
                        'sonarrSeriesId':
                        int(show["id"]),
                        'overview':
                        six.text_type(overview),
                        'poster':
                        six.text_type(poster),
                        'fanart':
                        six.text_type(fanart),
                        'audio_language':
                        six.text_type(
                            profile_id_to_language(
                                (show['qualityProfileId']
                                 if get_sonarr_version().startswith('2') else
                                 show['languageProfileId']), audio_profiles)),
                        'sortTitle':
                        six.text_type(show['sortTitle']),
                        'year':
                        six.text_type(show['year']),
                        'alternateTitles':
                        six.text_type(alternateTitles)
                    })
                else:
                    if serie_default_enabled is True:
                        series_to_add.append({
                            'title':
                            show["title"],
                            'path':
                            show["path"],
                            'tvdbId':
                            show["tvdbId"],
                            'languages':
                            serie_default_language,
                            'hearing_impaired':
                            serie_default_hi,
                            'sonarrSeriesId':
                            show["id"],
                            'overview':
                            overview,
                            'poster':
                            poster,
                            'fanart':
                            fanart,
                            'audio_language':
                            profile_id_to_language(
                                (show['qualityProfileId']
                                 if sonarr_version.startswith('2') else
                                 show['languageProfileId']), audio_profiles),
                            'sortTitle':
                            show['sortTitle'],
                            'year':
                            show['year'],
                            'alternateTitles':
                            alternateTitles,
                            'forced':
                            serie_default_forced
                        })
                    else:
                        series_to_add.append({
                            'title':
                            show["title"],
                            'path':
                            show["path"],
                            'tvdbId':
                            show["tvdbId"],
                            'sonarrSeriesId':
                            show["id"],
                            'overview':
                            overview,
                            'poster':
                            poster,
                            'fanart':
                            fanart,
                            'audio_language':
                            profile_id_to_language(
                                (show['qualityProfileId']
                                 if sonarr_version.startswith('2') else
                                 show['languageProfileId']), audio_profiles),
                            'sortTitle':
                            show['sortTitle'],
                            'year':
                            show['year'],
                            'alternateTitles':
                            alternateTitles
                        })

            # Remove old series from DB
            removed_series = list(
                set(current_shows_db_list) - set(current_shows_sonarr))

            for series in removed_series:
                database.execute(
                    "DELETE FROM table_shows WHERE sonarrSEriesId=?",
                    (series, ))

            # Update existing series in DB
            series_in_db_list = []
            series_in_db = database.execute(
                "SELECT title, path, tvdbId, sonarrSeriesId, overview, poster, fanart, "
                "audio_language, sortTitle, year, alternateTitles FROM table_shows"
            )

            for item in series_in_db:
                series_in_db_list.append(item)

            series_to_update_list = [
                i for i in series_to_update if i not in series_in_db_list
            ]

            for updated_series in series_to_update_list:
                query = dict_converter.convert(updated_series)
                database.execute(
                    '''UPDATE table_shows SET ''' + query.keys_update +
                    ''' WHERE sonarrSeriesId = ?''',
                    query.values + (updated_series['sonarrSeriesId'], ))

            # Insert new series in DB
            for added_series in series_to_add:
                query = dict_converter.convert(added_series)
                result = database.execute(
                    '''INSERT OR IGNORE INTO table_shows(''' +
                    query.keys_insert + ''') VALUES(''' +
                    query.question_marks + ''')''', query.values)
                if result:
                    list_missing_subtitles(no=added_series['sonarrSeriesId'])
                else:
                    logging.debug(
                        'BAZARR unable to insert this series into the database:',
                        path_replace(added_series['path']))

            logging.debug(
                'BAZARR All series synced from Sonarr into database.')