Ejemplo n.º 1
0
def update_one_series(series_id, action):
    logging.debug('BAZARR syncing this specific series from Sonarr: {}'.format(series_id))

    # Check if there's a row in database for this series ID
    existing_series = TableShows.select(TableShows.path)\
        .where(TableShows.sonarrSeriesId == series_id)\
        .dicts()\
        .get_or_none()

    # Delete series from DB
    if action == 'deleted' and existing_series:
        try:
            TableShows.delete().where(TableShows.sonarrSeriesId == int(series_id)).execute()
        except Exception as e:
            logging.error(f"BAZARR cannot delete series with sonarrSeriesId {series_id} because of {e}")
        else:
            TableEpisodes.delete().where(TableEpisodes.sonarrSeriesId == int(series_id)).execute()
            event_stream(type='series', action='delete', payload=int(series_id))
            return

    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()

    try:
        # Get series data from sonarr api
        series = None

        series_data = get_series_from_sonarr_api(url=url_sonarr(), apikey_sonarr=settings.sonarr.apikey,
                                                 sonarr_series_id=int(series_id))

        if not series_data:
            return
        else:
            if action == 'updated' and existing_series:
                series = seriesParser(series_data, action='update', tags_dict=tagsDict,
                                      serie_default_profile=serie_default_profile,
                                      audio_profiles=audio_profiles)
            elif action == 'updated' and not existing_series:
                series = seriesParser(series_data, action='insert', tags_dict=tagsDict,
                                      serie_default_profile=serie_default_profile,
                                      audio_profiles=audio_profiles)
    except Exception:
        logging.debug('BAZARR cannot parse series returned by SignalR feed.')
        return

    # Update existing series in DB
    if action == 'updated' and existing_series:
        try:
            TableShows.update(series).where(TableShows.sonarrSeriesId == series['sonarrSeriesId']).execute()
        except IntegrityError as e:
            logging.error(f"BAZARR cannot update series {series['path']} because of {e}")
        else:
            sync_episodes(series_id=int(series_id), send_event=True)
            event_stream(type='series', action='update', payload=int(series_id))
            logging.debug('BAZARR updated this series into the database:{}'.format(path_mappings.path_replace(
                series['path'])))

    # Insert new series in DB
    elif action == 'updated' and not existing_series:
        try:
            TableShows.insert(series).on_conflict(action='IGNORE').execute()
        except IntegrityError as e:
            logging.error(f"BAZARR cannot insert series {series['path']} because of {e}")
        else:
            event_stream(type='series', action='update', payload=int(series_id))
            logging.debug('BAZARR inserted this series into the database:{}'.format(path_mappings.path_replace(
                series['path'])))
Ejemplo n.º 2
0
def update_series(send_event=True):
    check_sonarr_rootfolder()
    apikey_sonarr = settings.sonarr.apikey
    if apikey_sonarr is None:
        return

    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
    series = get_series_from_sonarr_api(url=url_sonarr(), apikey_sonarr=apikey_sonarr)
    if not series:
        return
    else:
        # Get current shows in DB
        current_shows_db = TableShows.select(TableShows.sonarrSeriesId).dicts()

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

        series_count = len(series)
        for i, show in enumerate(series):
            if send_event:
                show_progress(id='series_progress',
                              header='Syncing series...',
                              name=show['title'],
                              value=i,
                              count=series_count)

            # 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(seriesParser(show, action='update', tags_dict=tagsDict,
                                                     serie_default_profile=serie_default_profile,
                                                     audio_profiles=audio_profiles))
            else:
                series_to_add.append(seriesParser(show, action='insert', tags_dict=tagsDict,
                                                  serie_default_profile=serie_default_profile,
                                                  audio_profiles=audio_profiles))

        if send_event:
            hide_progress(id='series_progress')

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

        for series in removed_series:
            try:
                TableShows.delete().where(TableShows.sonarrSeriesId == series).execute()
            except Exception as e:
                logging.error(f"BAZARR cannot delete series with sonarrSeriesId {series} because of {e}")
                continue
            else:
                if send_event:
                    event_stream(type='series', action='delete', payload=series)

        # Update existing series in DB
        series_in_db_list = []
        series_in_db = TableShows.select(TableShows.title,
                                         TableShows.path,
                                         TableShows.tvdbId,
                                         TableShows.sonarrSeriesId,
                                         TableShows.overview,
                                         TableShows.poster,
                                         TableShows.fanart,
                                         TableShows.audio_language,
                                         TableShows.sortTitle,
                                         TableShows.year,
                                         TableShows.alternateTitles,
                                         TableShows.tags,
                                         TableShows.seriesType,
                                         TableShows.imdbId).dicts()

        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:
            try:
                TableShows.update(updated_series).where(TableShows.sonarrSeriesId ==
                                                        updated_series['sonarrSeriesId']).execute()
            except IntegrityError as e:
                logging.error(f"BAZARR cannot update series {updated_series['path']} because of {e}")
                continue
            else:
                if send_event:
                    event_stream(type='series', payload=updated_series['sonarrSeriesId'])

        # Insert new series in DB
        for added_series in series_to_add:
            try:
                result = TableShows.insert(added_series).on_conflict(action='IGNORE').execute()
            except IntegrityError as e:
                logging.error(f"BAZARR cannot insert series {added_series['path']} because of {e}")
                continue
            else:
                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']))

                if send_event:
                    event_stream(type='series', action='update', payload=added_series['sonarrSeriesId'])

        logging.debug('BAZARR All series synced from Sonarr into database.')
Ejemplo n.º 3
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 = TableShows.select(
                TableShows.tvdb_id
            )
            
            current_shows_db_list = [x.tvdb_id 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 = 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 = ""

                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['tvdbId'])
                
                if show['tvdbId'] in current_shows_db_list:
                    series_to_update.append({'title': unicode(show["title"]),
                                             'path': unicode(show["path"]),
                                             'tvdb_id': int(show["tvdbId"]),
                                             'sonarr_series_id': int(show["id"]),
                                             'overview': unicode(overview),
                                             'poster': unicode(poster),
                                             'fanart': unicode(fanart),
                                             'audio_language': unicode(profile_id_to_language((show['qualityProfileId'] if sonarr_version.startswith('2') else show['languageProfileId']), audio_profiles)),
                                             'sort_title': unicode(show['sortTitle']),
                                             'year': unicode(show['year']),
                                             'alternate_titles': unicode(alternateTitles)})
                else:
                    if serie_default_enabled is True:
                        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'] if sonarr_version.startswith('2') else show['languageProfileId']), audio_profiles),
                                              'sort_title': show['sortTitle'],
                                              'year': show['year'],
                                              'alternate_titles': alternateTitles,
                                              'forced': serie_default_forced})
                    else:
                        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'] if sonarr_version.startswith('2') else show['languageProfileId']), audio_profiles),
                                              'sort_title': show['sortTitle'],
                                              'year': show['year'],
                                              'alternate_titles': alternateTitles})
            
            # Update existing series in DB
            series_in_db_list = []
            series_in_db = TableShows.select(
                TableShows.title,
                TableShows.path,
                TableShows.tvdb_id,
                TableShows.sonarr_series_id,
                TableShows.overview,
                TableShows.poster,
                TableShows.fanart,
                TableShows.audio_language,
                TableShows.sort_title,
                TableShows.year,
                TableShows.alternate_titles
            ).dicts()

            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:
                TableShows.update(
                    updated_series
                ).where(
                    TableShows.sonarr_series_id == updated_series['sonarr_series_id']
                ).execute()

            # Insert new series in DB
            for added_series in series_to_add:
                TableShows.insert(
                    added_series
                ).on_conflict_ignore().execute()
                list_missing_subtitles(added_series['sonarr_series_id'])

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

            for series in removed_series:
                TableShows.delete().where(
                    TableShows.tvdb_id == series
                ).execute()

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