Example #1
0
def browse_radarr_filesystem(path='#'):
    if path == '#':
        path = ''

    if get_radarr_info.is_legacy():
        url_radarr_api_filesystem = url_radarr() + "/api/filesystem?path=" + path + \
                                    "&allowFoldersWithoutTrailingSlashes=true&includeFiles=false&apikey=" + \
                                    settings.radarr.apikey
    else:
        url_radarr_api_filesystem = url_radarr() + "/api/v3/filesystem?path=" + path + \
                                    "&allowFoldersWithoutTrailingSlashes=true&includeFiles=false&apikey=" + \
                                    settings.radarr.apikey
    try:
        r = requests.get(url_radarr_api_filesystem, timeout=60, verify=False, headers=headers)
        r.raise_for_status()
    except requests.exceptions.HTTPError:
        logging.exception("BAZARR Error trying to get series from Radarr. Http error.")
        return
    except requests.exceptions.ConnectionError:
        logging.exception("BAZARR Error trying to get series from Radarr. Connection Error.")
        return
    except requests.exceptions.Timeout:
        logging.exception("BAZARR Error trying to get series from Radarr. Timeout Error.")
        return
    except requests.exceptions.RequestException:
        logging.exception("BAZARR Error trying to get series from Radarr.")
        return

    return r.json()
Example #2
0
def get_profile_list():
    apikey_radarr = settings.radarr.apikey
    radarr_version = get_radarr_version()
    profiles_list = []
    # Get profiles data from radarr
    if radarr_version.startswith('0'):
        url_radarr_api_movies = url_radarr() + "/api/profile?apikey=" + apikey_radarr
    else:
        url_radarr_api_movies = url_radarr() + "/api/v3/qualityprofile?apikey=" + apikey_radarr

    try:
        profiles_json = requests.get(url_radarr_api_movies, timeout=60, verify=False)
    except requests.exceptions.ConnectionError as errc:
        logging.exception("BAZARR Error trying to get profiles from Radarr. Connection Error.")
    except requests.exceptions.Timeout as errt:
        logging.exception("BAZARR Error trying to get profiles from Radarr. Timeout Error.")
    except requests.exceptions.RequestException as err:
        logging.exception("BAZARR Error trying to get profiles from Radarr.")
    else:
        # Parsing data returned from radarr
        if radarr_version.startswith('0'):
            for profile in profiles_json.json():
                profiles_list.append([profile['id'], profile['language'].capitalize()])
        else:
            for profile in profiles_json.json():
                profiles_list.append([profile['id'], profile['language']['name'].capitalize()])

        return profiles_list

    return None
Example #3
0
def movies_images(url):
    apikey = settings.radarr.apikey
    baseUrl = settings.radarr.base_url
    if get_radarr_info.is_legacy():
        url_image = url_radarr() + '/api/' + url.lstrip(baseUrl) + '?apikey=' + apikey
    else:
        url_image = url_radarr() + '/api/v3/' + url.lstrip(baseUrl) + '?apikey=' + apikey
    try:
        req = requests.get(url_image, stream=True, timeout=15, verify=False, headers=headers)
    except:
        return '', 404
    else:
        return Response(stream_with_context(req.iter_content(2048)), content_type=req.headers['content-type'])
Example #4
0
def notify_radarr(radarr_id):
    try:
        url = url_radarr() + "/api/command?apikey=" + settings.radarr.apikey
        data = {'name': 'RescanMovie', 'movieId': int(radarr_id)}
        requests.post(url, json=data, timeout=60, verify=False)
    except Exception as e:
        logging.debug('BAZARR notify Radarr')
Example #5
0
def get_tags():
    apikey_radarr = settings.radarr.apikey
    tagsDict = []

    # Get tags data from Sonarr
    url_sonarr_api_series = url_radarr() + "/api/tag?apikey=" + apikey_radarr

    try:
        tagsDict = requests.get(url_sonarr_api_series,
                                timeout=60,
                                verify=False,
                                headers=headers)
    except requests.exceptions.ConnectionError:
        logging.exception(
            "BAZARR Error trying to get tags from Radarr. Connection Error.")
        return []
    except requests.exceptions.Timeout:
        logging.exception(
            "BAZARR Error trying to get tags from Radarr. Timeout Error.")
        return []
    except requests.exceptions.RequestException:
        logging.exception("BAZARR Error trying to get tags from Radarr.")
        return []
    else:
        return tagsDict.json()
Example #6
0
def notify_radarr(radarr_id):
    try:
        if get_radarr_info.is_legacy():
            url = url_radarr(
            ) + "/api/command?apikey=" + settings.radarr.apikey
        else:
            url = url_radarr(
            ) + "/api/v3/command?apikey=" + settings.radarr.apikey
        data = {'name': 'RescanMovie', 'movieId': int(radarr_id)}
        requests.post(url,
                      json=data,
                      timeout=60,
                      verify=False,
                      headers=headers)
    except Exception:
        logging.exception('BAZARR cannot notify Radarr')
Example #7
0
def get_radarr_version():
    radarr_version = ''
    if settings.general.getboolean('use_radarr'):
        try:
            rv = url_radarr() + "/api/system/status?apikey=" + settings.radarr.apikey
            radarr_version = requests.get(rv, timeout=60, verify=False).json()['version']
        except Exception:
            logging.debug('BAZARR cannot get Radarr version')
    return radarr_version
Example #8
0
def image_proxy_movies(url):
    apikey = settings.radarr.apikey
    url_image = url_radarr() + '/api/' + url + '?apikey=' + apikey
    try:
        req = requests.get(url_image, stream=True, timeout=15, verify=False)
    except:
        return None
    else:
        return Response(stream_with_context(req.iter_content(2048)), content_type=req.headers['content-type'])
Example #9
0
 def version():
     """
     Call system/status API endpoint and get the Radarr version
     @return: str
     """
     radarr_version = region.get(
         "radarr_version",
         expiration_time=datetime.timedelta(seconds=60).total_seconds())
     if radarr_version:
         region.set("radarr_version", radarr_version)
         return radarr_version
     else:
         radarr_version = ''
     if settings.general.getboolean('use_radarr'):
         try:
             rv = url_radarr(
             ) + "/api/system/status?apikey=" + settings.radarr.apikey
             radarr_json = requests.get(rv,
                                        timeout=60,
                                        verify=False,
                                        headers=headers).json()
             if 'version' in radarr_json:
                 radarr_version = radarr_json['version']
             else:
                 raise json.decoder.JSONDecodeError
         except json.decoder.JSONDecodeError:
             try:
                 rv = url_radarr(
                 ) + "/api/v3/system/status?apikey=" + settings.radarr.apikey
                 radarr_version = requests.get(
                     rv, timeout=60, verify=False,
                     headers=headers).json()['version']
             except json.decoder.JSONDecodeError:
                 logging.debug('BAZARR cannot get Radarr version')
                 radarr_version = 'unknown'
         except Exception:
             logging.debug('BAZARR cannot get Radarr version')
             radarr_version = 'unknown'
     logging.debug('BAZARR got this Radarr version from its API: {}'.format(
         radarr_version))
     region.set("radarr_version", radarr_version)
     return radarr_version
Example #10
0
def get_radarr_rootfolder():
    apikey_radarr = settings.radarr.apikey
    radarr_rootfolder = []

    # Get root folder data from Radarr
    if get_radarr_info.is_legacy():
        url_radarr_api_rootfolder = url_radarr() + "/api/rootfolder?apikey=" + apikey_radarr
    else:
        url_radarr_api_rootfolder = url_radarr() + "/api/v3/rootfolder?apikey=" + apikey_radarr

    try:
        rootfolder = requests.get(url_radarr_api_rootfolder, timeout=60, verify=False, headers=headers)
    except requests.exceptions.ConnectionError:
        logging.exception("BAZARR Error trying to get rootfolder from Radarr. Connection Error.")
        return []
    except requests.exceptions.Timeout:
        logging.exception("BAZARR Error trying to get rootfolder from Radarr. Timeout Error.")
        return []
    except requests.exceptions.RequestException:
        logging.exception("BAZARR Error trying to get rootfolder from Radarr.")
        return []
    else:
        radarr_movies_paths = list(TableMovies.select(TableMovies.path).dicts())
        for folder in rootfolder.json():
            if any(item['path'].startswith(folder['path']) for item in radarr_movies_paths):
                radarr_rootfolder.append({'id': folder['id'], 'path': folder['path']})
        db_rootfolder = TableMoviesRootfolder.select(TableMoviesRootfolder.id, TableMoviesRootfolder.path).dicts()
        rootfolder_to_remove = [x for x in db_rootfolder if not
                                next((item for item in radarr_rootfolder if item['id'] == x['id']), False)]
        rootfolder_to_update = [x for x in radarr_rootfolder if
                                next((item for item in db_rootfolder if item['id'] == x['id']), False)]
        rootfolder_to_insert = [x for x in radarr_rootfolder if not
                                next((item for item in db_rootfolder if item['id'] == x['id']), False)]

        for item in rootfolder_to_remove:
            TableMoviesRootfolder.delete().where(TableMoviesRootfolder.id == item['id']).execute()
        for item in rootfolder_to_update:
            TableMoviesRootfolder.update({TableMoviesRootfolder.path: item['path']})\
                .where(TableMoviesRootfolder.id == item['id']).execute()
        for item in rootfolder_to_insert:
            TableMoviesRootfolder.insert({TableMoviesRootfolder.id: item['id'],
                                          TableMoviesRootfolder.path: item['path']}).execute()
Example #11
0
def get_radarr_platform():
    radarr_platform = ''
    if settings.general.getboolean('use_radarr'):
        try:
            rv = url_radarr() + "/api/system/status?apikey=" + settings.radarr.apikey
            response = requests.get(rv, timeout=60, verify=False).json()
            if response['isLinux'] or response['isOsx']:
                radarr_platform = 'posix'
            elif response['isWindows']:
                radarr_platform = 'nt'
        except Exception:
            logging.debug('BAZARR cannot get Radarr platform')
    return radarr_platform
Example #12
0
def get_radarr_platform():
    use_radarr = settings.general.getboolean('use_radarr')
    apikey_radarr = settings.radarr.apikey
    rv = url_radarr() + "/api/system/status?apikey=" + apikey_radarr
    radarr_platform = ''
    if use_radarr:
        try:
            if requests.get(rv, timeout=60,
                            verify=False).json()['isLinux'] or requests.get(
                                rv, timeout=60, verify=False).json()['isOsx']:
                radarr_platform = 'posix'
            elif requests.get(rv, timeout=60,
                              verify=False).json()['isWindows']:
                radarr_platform = 'nt'
        except Exception as e:
            logging.DEBUG('BAZARR cannot get Radarr platform')

    return radarr_platform
Example #13
0
 def configure(self):
     self.apikey_radarr = settings.radarr.apikey
     self.connection = HubConnectionBuilder() \
         .with_url(url_radarr() + "/signalr/messages?access_token={}".format(self.apikey_radarr),
                   options={
                       "verify_ssl": False,
                       "headers": headers
                   }) \
         .with_automatic_reconnect({
             "type": "raw",
             "keep_alive_interval": 5,
             "reconnect_interval": 180,
             "max_attempts": None
         }).build()
     self.connection.on_open(self.on_connect_handler)
     self.connection.on_reconnect(lambda: logging.error(
         'BAZARR SignalR client for Radarr connection as been lost. '
         'Trying to reconnect...'))
     self.connection.on_close(lambda: logging.debug(
         'BAZARR SignalR client for Radarr is disconnected.'))
     self.connection.on_error(self.exception_handler)
     self.connection.on("receiveMessage", dispatcher)
Example #14
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."
                )
Example #15
0
def update_movies(send_event=True):
    check_radarr_rootfolder()
    logging.debug('BAZARR Starting movie sync from Radarr.')
    apikey_radarr = settings.radarr.apikey

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

    if movie_default_enabled is True:
        movie_default_profile = settings.general.movie_default_profile
        if movie_default_profile == '':
            movie_default_profile = None
    else:
        movie_default_profile = None

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

        # Get movies data from radarr
        movies = get_movies_from_radarr_api(url=url_radarr(),
                                            apikey_radarr=apikey_radarr)
        if not movies:
            return
        else:
            # Get current movies in DB
            current_movies_db = TableMovies.select(
                TableMovies.tmdbId, TableMovies.path,
                TableMovies.radarrId).dicts()

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

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

            # Build new and updated movies
            movies_count = len(movies)
            for i, movie in enumerate(movies):
                if send_event:
                    show_progress(id='movies_progress',
                                  header='Syncing movies...',
                                  name=movie['title'],
                                  value=i,
                                  count=movies_count)

                if movie['hasFile'] is True:
                    if 'movieFile' in movie:
                        if movie['movieFile']['size'] > 20480:
                            # 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(
                                    movieParser(movie,
                                                action='update',
                                                tags_dict=tagsDict,
                                                movie_default_profile=
                                                movie_default_profile,
                                                audio_profiles=audio_profiles))
                            else:
                                movies_to_add.append(
                                    movieParser(movie,
                                                action='insert',
                                                tags_dict=tagsDict,
                                                movie_default_profile=
                                                movie_default_profile,
                                                audio_profiles=audio_profiles))

            if send_event:
                hide_progress(id='movies_progress')

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

            for removed_movie in removed_movies:
                try:
                    TableMovies.delete().where(
                        TableMovies.tmdbId == removed_movie).execute()
                except Exception as e:
                    logging.error(
                        f"BAZARR cannot remove movie tmdbId {removed_movie} because of {e}"
                    )
                    continue

            # Update movies in DB
            movies_in_db_list = []
            movies_in_db = TableMovies.select(
                TableMovies.radarrId, TableMovies.title, TableMovies.path,
                TableMovies.tmdbId, TableMovies.overview, TableMovies.poster,
                TableMovies.fanart, TableMovies.audio_language,
                TableMovies.sceneName, TableMovies.monitored,
                TableMovies.sortTitle, TableMovies.year,
                TableMovies.alternativeTitles, TableMovies.format,
                TableMovies.resolution, TableMovies.video_codec,
                TableMovies.audio_codec, TableMovies.imdbId,
                TableMovies.movie_file_id, TableMovies.tags,
                TableMovies.file_size).dicts()

            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:
                try:
                    TableMovies.update(updated_movie).where(
                        TableMovies.tmdbId ==
                        updated_movie['tmdbId']).execute()
                except IntegrityError as e:
                    logging.error(
                        f"BAZARR cannot update movie {updated_movie['path']} because of {e}"
                    )
                    continue
                else:
                    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:
                try:
                    result = TableMovies.insert(added_movie).on_conflict(
                        action='IGNORE').execute()
                except IntegrityError as e:
                    logging.error(
                        f"BAZARR cannot insert movie {added_movie['path']} because of {e}"
                    )
                    continue
                else:
                    if result > 0:
                        altered_movies.append([
                            added_movie['tmdbId'], added_movie['path'],
                            added_movie['radarrId'], added_movie['monitored']
                        ])
                        if send_event:
                            event_stream(type='movie',
                                         action='update',
                                         payload=int(added_movie['radarrId']))
                    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.')
Example #16
0
def update_one_movie(movie_id, action):
    logging.debug(
        'BAZARR syncing this specific movie from Radarr: {}'.format(movie_id))

    # Check if there's a row in database for this movie ID
    existing_movie = TableMovies.select(TableMovies.path)\
        .where(TableMovies.radarrId == movie_id)\
        .dicts()\
        .get_or_none()

    # Remove movie from DB
    if action == 'deleted':
        if existing_movie:
            try:
                TableMovies.delete().where(
                    TableMovies.radarrId == movie_id).execute()
            except Exception as e:
                logging.error(
                    f"BAZARR cannot delete movie {existing_movie['path']} because of {e}"
                )
            else:
                event_stream(type='movie',
                             action='delete',
                             payload=int(movie_id))
                logging.debug(
                    'BAZARR deleted this movie from the database:{}'.format(
                        path_mappings.path_replace_movie(
                            existing_movie['path'])))
        return

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

    if movie_default_enabled is True:
        movie_default_profile = settings.general.movie_default_profile
        if movie_default_profile == '':
            movie_default_profile = None
    else:
        movie_default_profile = None

    audio_profiles = get_profile_list()
    tagsDict = get_tags()

    try:
        # Get movie data from radarr api
        movie = None
        movie_data = get_movies_from_radarr_api(
            url=url_radarr(),
            apikey_radarr=settings.radarr.apikey,
            radarr_id=movie_id)
        if not movie_data:
            return
        else:
            if action == 'updated' and existing_movie:
                movie = movieParser(
                    movie_data,
                    action='update',
                    tags_dict=tagsDict,
                    movie_default_profile=movie_default_profile,
                    audio_profiles=audio_profiles)
            elif action == 'updated' and not existing_movie:
                movie = movieParser(
                    movie_data,
                    action='insert',
                    tags_dict=tagsDict,
                    movie_default_profile=movie_default_profile,
                    audio_profiles=audio_profiles)
    except Exception:
        logging.debug(
            'BAZARR cannot get movie returned by SignalR feed from Radarr API.'
        )
        return

    # Drop useless events
    if not movie and not existing_movie:
        return

    # Remove movie from DB
    if not movie and existing_movie:
        try:
            TableMovies.delete().where(
                TableMovies.radarrId == movie_id).execute()
        except Exception as e:
            logging.error(
                f"BAZARR cannot insert episode {existing_movie['path']} because of {e}"
            )
        else:
            event_stream(type='movie', action='delete', payload=int(movie_id))
            logging.debug(
                'BAZARR deleted this movie from the database:{}'.format(
                    path_mappings.path_replace_movie(existing_movie['path'])))
            return

    # Update existing movie in DB
    elif movie and existing_movie:
        try:
            TableMovies.update(movie).where(
                TableMovies.radarrId == movie['radarrId']).execute()
        except IntegrityError as e:
            logging.error(
                f"BAZARR cannot insert episode {movie['path']} because of {e}")
        else:
            event_stream(type='movie', action='update', payload=int(movie_id))
            logging.debug(
                'BAZARR updated this movie into the database:{}'.format(
                    path_mappings.path_replace_movie(movie['path'])))

    # Insert new movie in DB
    elif movie and not existing_movie:
        try:
            TableMovies.insert(movie).on_conflict(action='IGNORE').execute()
        except IntegrityError as e:
            logging.error(
                f"BAZARR cannot insert movie {movie['path']} because of {e}")
        else:
            event_stream(type='movie', action='update', payload=int(movie_id))
            logging.debug(
                'BAZARR inserted this movie into the database:{}'.format(
                    path_mappings.path_replace_movie(movie['path'])))

    # Storing existing subtitles
    logging.debug('BAZARR storing subtitles for this movie: {}'.format(
        path_mappings.path_replace_movie(movie['path'])))
    store_subtitles_movie(movie['path'],
                          path_mappings.path_replace_movie(movie['path']))

    # Downloading missing subtitles
    logging.debug(
        'BAZARR downloading missing subtitles for this movie: {}'.format(
            path_mappings.path_replace_movie(movie['path'])))
    movies_download_subtitles(movie_id)