From d6e809470017253aab9116ae89e7db614369449c Mon Sep 17 00:00:00 2001 From: santiagosayshey Date: Fri, 19 Jan 2024 19:00:59 +1030 Subject: [PATCH] v0.1.3 - improved debugging info for exports - improved user control while exporting - added config file to add paths / api keys - added master setup for radarr / sonarr to sync from (not implemented yet) - adjusted custom format file names to be consistent with qp's - combined import functionality into a single script - improved debugging info for imports (functionality is still the same) - error messages for profile naming conflicts, bad auth and missing app - up to date set of profiles / custom formats as of 19/01/24 --- README.md | 6 +- config.json | 25 + ...mats.json => Custom Formats (Radarr).json} | 0 ...mats.json => Custom Formats (Sonarr).json} | 0 export.py | 216 ++-- import.py | 206 ++++ import_custom_formats.py | 60 - import_quality_profiles.py | 115 -- .../Transparent - HD Fallback (Radarr).json | 1020 +++++++++++++++++ ...Transparent - Remux Fallback (Radarr).json | 1020 +++++++++++++++++ temp_cf.json | 1 - 11 files changed, 2413 insertions(+), 256 deletions(-) create mode 100644 config.json rename custom_formats/{radarr_custom_formats.json => Custom Formats (Radarr).json} (100%) rename custom_formats/{sonarr_custom_formats.json => Custom Formats (Sonarr).json} (100%) create mode 100644 import.py delete mode 100644 import_custom_formats.py delete mode 100644 import_quality_profiles.py create mode 100644 profiles/Transparent - HD Fallback (Radarr).json create mode 100644 profiles/Transparent - Remux Fallback (Radarr).json delete mode 100644 temp_cf.json diff --git a/README.md b/README.md index 81edc7b..a5060f4 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # Profilarr -Profilarr is a Python-based tool that enables seamless synchronization of custom formats and quality profiles in Radarr / Sonarr. It's designed to aid users in sharing / importing custom formats & quality profiles seamlessly. +Profilarr is a Python-based tool that enables synchronization of custom formats and quality profiles in Radarr / Sonarr. It's designed to aid users in exporting / importing custom formats & quality profiles seamlessly. Companion tool to Dictionarry to mass import custom formats / profiles quickly. ## ⚠️ Before Continuing -- **This tool will overwrite any custom formats in your Radarr installation that have the same name.** +- **This tool will overwrite any custom formats in your \*arr installation that have the same name.** - **Custom Formats MUST be imported before syncing any premade profile.** ## 🛠️ Installation @@ -20,7 +20,7 @@ Companion tool to Dictionarry to mass import custom formats / profiles quickly. 1. Download the Profilarr zip file from the release section. 2. Extract its contents into a folder. -3. Open `import.py` in a text editor of your choice. +3. Open either of the `import.py` files in a text editor of your choice. - Add your Radarr / Sonarr API key to the designated section. - Modify the Base URL if needed 4. Save the changes and close the text editor. diff --git a/config.json b/config.json new file mode 100644 index 0000000..7764a64 --- /dev/null +++ b/config.json @@ -0,0 +1,25 @@ +{ + "master": { + "sonarr": { + "base_url": "http://localhost:8989", + "api_key": "API_GOES_HERE" + }, + "radarr": { + "base_url": "http://localhost:7878", + "api_key": "API_GOES_HERE" + } + }, + "extra_installations": [ + { + "name": "example", + "sonarr": { + "base_url": "http://otherhost1:8989", + "api_key": "API_GOES_HERE" + }, + "radarr": { + "base_url": "http://otherhost1:7878", + "api_key": "API_GOES_HERE" + } + } + ] +} diff --git a/custom_formats/radarr_custom_formats.json b/custom_formats/Custom Formats (Radarr).json similarity index 100% rename from custom_formats/radarr_custom_formats.json rename to custom_formats/Custom Formats (Radarr).json diff --git a/custom_formats/sonarr_custom_formats.json b/custom_formats/Custom Formats (Sonarr).json similarity index 100% rename from custom_formats/sonarr_custom_formats.json rename to custom_formats/Custom Formats (Sonarr).json diff --git a/export.py b/export.py index c826b67..727a0bb 100644 --- a/export.py +++ b/export.py @@ -3,93 +3,155 @@ import requests import os import re -# Define constants -base_url = "http://localhost:7878" -api_key = "API_GOES_HERE" +# ANSI escape sequences for colors +class Colors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' -# Define parameters and headers -params = {"apikey": api_key} -headers = {"X-Api-Key": api_key} -files = {'file': ('', '')} # Empty file to force multipart/form-data +# Load configuration for main app +with open('config.json', 'r') as config_file: + config = json.load(config_file)['master'] -# Login -login_url = f"{base_url}/login" -response = requests.get(login_url, params=params, headers=headers, files=files) +def get_user_choice(): + choice = input("Enter an app to export from (radarr/sonarr): ").lower() + while choice not in ["radarr", "sonarr"]: + print(Colors.FAIL + "Invalid input. Please enter either 'radarr' or 'sonarr'." + Colors.ENDC) + choice = input("Enter the source (radarr/sonarr): ").lower() + print() + return choice -if response.status_code != 200: - print(f"Login Failed! (HTTP {response.status_code})") - print("Response Content: ", response.content) - exit() +def get_export_choice(): + print(Colors.HEADER + "Choose what to export:" + Colors.ENDC) + print("1. Custom Formats") + print("2. Quality Profiles") + print("3. Both") + choice = input("Enter your choice (1/2/3): ").strip() + while choice not in ["1", "2", "3"]: + print(Colors.FAIL + "Invalid input. Please enter 1, 2, or 3." + Colors.ENDC) + choice = input("Enter your choice (1/2/3): ").strip() + print() + return choice -def export_cf(): - # Prompt the user to specify the source (Radarr or Sonarr) - source = input("Enter the source (radarr/sonarr): ").lower() - while source not in ["radarr", "sonarr"]: - print("Invalid input. Please enter either 'radarr' or 'sonarr'.") - source = input("Enter the source (radarr/sonarr): ").lower() - - custom_format_url = f"{base_url}/api/v3/customformat" - response = requests.get(custom_format_url, params=params, headers=headers) - - if response.status_code == 200: - data = response.json() - - # Remove 'id' from each custom format - for custom_format in data: - custom_format.pop('id', None) - - # Save to JSON file with adjusted name based on source - file_path = f'./custom_formats/{source}_custom_formats.json' - with open(file_path, 'w') as f: - json.dump(data, f, indent=4) - print(f"Custom Formats have been saved to '{file_path}'") - else: - print(f"Failed to retrieve custom formats! (HTTP {response.status_code})") - print("Response Content: ", response.content) +def get_app_config(source): + app_config = config[source] + return app_config['base_url'], app_config['api_key'] def sanitize_filename(filename): - # Replace any characters not allowed in filenames with _ sanitized_filename = re.sub(r'[\\/*?:"<>|]', '_', filename) return sanitized_filename -def export_qf(): - # Prompt the user to specify the source (Radarr or Sonarr) - source = input("Enter the source (radarr/sonarr): ").lower() - while source not in ["radarr", "sonarr"]: - print("Invalid input. Please enter either 'radarr' or 'sonarr'.") - source = input("Enter the source (radarr/sonarr): ").lower() - - # Capitalize the first letter of the source - source = source.capitalize() - - response = requests.get(f"{base_url}/api/v3/qualityprofile", params=params, headers=headers) - - if response.status_code == 200: - quality_profiles = response.json() - - # Ensure the ./profiles directory exists - if not os.path.exists('./profiles'): - os.makedirs('./profiles') - - # Process each profile separately - for profile in quality_profiles: - profile.pop('id', None) # Remove the 'id' field - - # Use the name of the profile to create a filename and append the source - profile_name = profile.get('name', 'unnamed_profile') # Use a default name if the profile has no name - profile_name = sanitize_filename(profile_name) # Sanitize the filename - profile_filename = f"{profile_name} ({source}).json" - profile_filepath = os.path.join('./profiles', profile_filename) - - # Save the individual profile to a file as a single-element array - with open(profile_filepath, 'w') as file: - json.dump([profile], file, indent=4) # Note the [profile], it will make it an array with a single element - - print("Quality profiles have been successfully saved to the ./profiles directory") +def handle_response_errors(response): + if response.status_code == 401: + print(Colors.FAIL + "Authentication error: Invalid API key." + Colors.ENDC) + elif response.status_code == 403: + print(Colors.FAIL + "Forbidden: Access is denied." + Colors.ENDC) else: - print("Failed to retrieve quality profiles!") + print(Colors.FAIL + f"An error occurred! (HTTP {response.status_code})" + Colors.ENDC) print("Response Content: ", response.content.decode('utf-8')) +def print_saved_items(items, item_type): + if len(items) > 10: + items_to_display = items[:10] + for item in items_to_display: + print(f" - {item}") + print(f"... and {len(items) - 10} more.") + else: + for item in items: + print(f" - {item}") + +def ensure_directory_exists(directory): + if not os.path.exists(directory): + os.makedirs(directory) + print(Colors.OKBLUE + f"Created directory: {directory}" + Colors.ENDC) + +def export_cf(source): + ensure_directory_exists('./custom_formats') # Ensure the directory exists + + base_url, api_key = get_app_config(source) + headers = {"X-Api-Key": api_key} + params = {"apikey": api_key} + + print(Colors.OKBLUE + f"Attempting to access {source.capitalize()} at {base_url}" + Colors.ENDC) + + custom_format_url = f"{base_url}/api/v3/customformat" + + try: + response = requests.get(custom_format_url, params=params, headers=headers) + + if response.status_code == 200: + data = response.json() + print(Colors.OKGREEN + f"Found {len(data)} custom formats." + Colors.ENDC) + + saved_formats = [] + for custom_format in data: + custom_format.pop('id', None) + saved_formats.append(custom_format['name']) + + file_path = f'./custom_formats/Custom Formats ({source.capitalize()}).json' + with open(file_path, 'w') as f: + json.dump(data, f, indent=4) + print_saved_items(saved_formats, "Custom Formats") + print(Colors.OKGREEN + f"Saved to '{file_path}'" + Colors.ENDC) + print() + else: + handle_response_errors(response) + + except requests.exceptions.ConnectionError: + print(Colors.FAIL + f"Failed to connect to {source.capitalize()}! Please check if it's running and accessible." + Colors.ENDC) + + + +def export_qf(source): + ensure_directory_exists('./profiles') # Ensure the directory exists + + base_url, api_key = get_app_config(source) + headers = {"X-Api-Key": api_key} + params = {"apikey": api_key} + + print(Colors.OKBLUE + f"Attempting to access {source.capitalize()} at {base_url}" + Colors.ENDC) + + try: + response = requests.get(f"{base_url}/api/v3/qualityprofile", params=params, headers=headers) + + if response.status_code == 200: + quality_profiles = response.json() + print(Colors.OKGREEN + f"Found {len(quality_profiles)} quality profiles." + Colors.ENDC) + + if not os.path.exists('./profiles'): + os.makedirs('./profiles') + + saved_profiles = [] + for profile in quality_profiles: + profile.pop('id', None) + profile_name = profile.get('name', 'unnamed_profile') + profile_name = sanitize_filename(profile_name) + profile_filename = f"{profile_name} ({source.capitalize()}).json" + profile_filepath = os.path.join('./profiles', profile_filename) + saved_profiles.append(profile_name) + + with open(profile_filepath, 'w') as file: + json.dump([profile], file, indent=4) + print_saved_items(saved_profiles, "Quality Profiles") + print(Colors.OKGREEN + "Saved to the ./profiles directory" + Colors.ENDC) + print() + else: + handle_response_errors(response) + + except requests.exceptions.ConnectionError: + print(Colors.FAIL + f"Failed to connect to {source.capitalize()}! Please check if it's running and accessible." + Colors.ENDC) + + if __name__ == "__main__": - export_cf() - export_qf() \ No newline at end of file + user_choice = get_user_choice() + export_choice = get_export_choice() + + if export_choice in ["1", "3"]: + export_cf(user_choice) + if export_choice in ["2", "3"]: + export_qf(user_choice) diff --git a/import.py b/import.py new file mode 100644 index 0000000..83b0d32 --- /dev/null +++ b/import.py @@ -0,0 +1,206 @@ +import json +import requests +import os + +# ANSI escape sequences for colors +class Colors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + +# Load configuration for main app +with open('config.json', 'r') as config_file: + config = json.load(config_file) + +def print_success(message): + print(Colors.OKGREEN + message + Colors.ENDC) + +def print_error(message): + print(Colors.FAIL + message + Colors.ENDC) + +def print_connection_error(): + print(Colors.FAIL + "Failed to connect to the service! Please check if it's running and accessible." + Colors.ENDC) + +def get_user_choice(): + choice = input("Enter the app you want to import to (radarr/sonarr): ").lower() + while choice not in ["radarr", "sonarr"]: + print_error("Invalid input. Please enter either 'radarr' or 'sonarr'.") + choice = input("Enter the source (radarr/sonarr): ").lower() + return choice + +def get_import_choice(): + print() + print(Colors.HEADER + "Choose what to import:" + Colors.ENDC) + print("1. Custom Formats") + print("2. Quality Profiles") + choice = input("Enter your choice (1/2): ").strip() + while choice not in ["1", "2"]: + print_error("Invalid input. Please enter 1 or 2.") + choice = input("Enter your choice (1/2): ").strip() + return choice + +def get_app_config(source): + return config['master'][source] + +def select_file(directory): + files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))] + print() + print(Colors.OKBLUE + "Available files:" + Colors.ENDC) + for i, file in enumerate(files, 1): + print(f"{i}. {file}") + choice = int(input("Select a file to import: ")) + return files[choice - 1] + +def import_custom_formats(source_config): + headers = {"X-Api-Key": source_config['api_key']} + get_url = f"{source_config['base_url']}/api/v3/customformat" + try: + response = requests.get(get_url, headers=headers) + if response.status_code == 200: + existing_formats = response.json() + existing_names_to_id = {format['name']: format['id'] for format in existing_formats} + + selected_file = select_file('./custom_formats') + added_count, updated_count = 0, 0 + + with open(os.path.join('./custom_formats', selected_file), 'r') as import_file: + import_formats = json.load(import_file) + + print() + + for format in import_formats: + format_name = format['name'] + if format_name in existing_names_to_id: + format_id = existing_names_to_id[format_name] + put_url = f"{source_config['base_url']}/api/v3/customformat/{format_id}" + response = requests.put(put_url, json=format, headers=headers) + if response.status_code in [200, 201, 202]: + print(Colors.WARNING + f"Updating custom format '{format_name}': " + Colors.ENDC, end='') + print_success("SUCCESS") + updated_count += 1 + else: + print_error(f"Updating custom format '{format_name}': FAIL") + print(response.content.decode()) + + else: + post_url = f"{source_config['base_url']}/api/v3/customformat" + response = requests.post(post_url, json=format, headers=headers) + if response.status_code in [200, 201]: + print(Colors.OKBLUE + f"Adding custom format '{format_name}': " + Colors.ENDC, end='') + print_success("SUCCESS") + added_count += 1 + else: + print_error(f"Adding custom format '{format_name}': FAIL") + print(response.content.decode()) + + print() + print_success(f"Successfully added {added_count} custom formats, updated {updated_count} custom formats.") + + else: + print_error(f"Failed to retrieve existing custom formats from {get_url}! (HTTP {response.status_code})") + print(response.content.decode()) + + except requests.exceptions.ConnectionError: + print_connection_error() + +def import_quality_profiles(source_config): + headers = {"X-Api-Key": source_config['api_key']} + try: + cf_import_sync(source_config) + + profile_dir = './profiles' + profiles = [f for f in os.listdir(profile_dir) if f.endswith('.json')] + + print() + print(Colors.HEADER + "Available Profiles:" + Colors.ENDC) + for i, profile in enumerate(profiles, 1): + print(f"{i}. {profile}") + + print() + selection = input("Please enter the number of the profile you want to import: ") + try: + selected_file = profiles[int(selection) - 1] + except (ValueError, IndexError): + print_error("Invalid selection, please enter a valid number.") + return + + with open(os.path.join(profile_dir, selected_file), 'r') as file: + try: + quality_profiles = json.load(file) + except json.JSONDecodeError as e: + print_error(f"Error loading selected profile: {e}") + return + + for profile in quality_profiles: + existing_format_names = set() + if 'formatItems' in profile: + for format_item in profile['formatItems']: + format_name = format_item.get('name') + if format_name: + existing_format_names.add(format_name) + if format_name in source_config['custom_formats']: + format_item['format'] = source_config['custom_formats'][format_name] + + for format_name, format_id in source_config['custom_formats'].items(): + if format_name not in existing_format_names: + profile.setdefault('formatItems', []).append({ + "format": format_id, + "name": format_name, + "score": 0 + }) + + post_url = f"{source_config['base_url']}/api/v3/qualityprofile" + response = requests.post(post_url, json=profile, headers=headers) + + if response.status_code in [200, 201]: + print_success(f"Successfully added Quality Profile {profile['name']}") + elif response.status_code == 409: + print_error(f"Failed to add Quality Profile {profile['name']} due to a naming conflict. Quality profile names must be unique. (HTTP {response.status_code})") + else: + try: + errors = response.json() + message = errors.get("message", "No Message Provided") + print_error(f"Failed to add Quality Profile {profile['name']}! (HTTP {response.status_code})") + print(message) + except json.JSONDecodeError: + print_error("Failed to parse error message:") + print(response.text) + + except requests.exceptions.ConnectionError: + print_connection_error() + +def cf_import_sync(source_config): + headers = {"X-Api-Key": source_config['api_key']} + custom_format_url = f"{source_config['base_url']}/api/v3/customformat" + try: + response = requests.get(custom_format_url, headers=headers) + if response.status_code == 200: + data = response.json() + source_config['custom_formats'] = {format['name']: format['id'] for format in data} + elif response.status_code == 401: + print_error("Authentication error: Invalid API key. Terminating program.") + exit(1) + else: + print_error(f"Failed to retrieve custom formats! (HTTP {response.status_code})") + print(response.content.decode()) + exit(1) + + except requests.exceptions.ConnectionError: + print_connection_error() + exit(1) + + +if __name__ == "__main__": + user_choice = get_user_choice() + source_config = get_app_config(user_choice) + import_choice = get_import_choice() + + if import_choice == "1": + import_custom_formats(source_config) + elif import_choice == "2": + import_quality_profiles(source_config) diff --git a/import_custom_formats.py b/import_custom_formats.py deleted file mode 100644 index 35ec708..0000000 --- a/import_custom_formats.py +++ /dev/null @@ -1,60 +0,0 @@ -import json -import requests - -# Define constants -base_url = "http://localhost:7878" # Update to your Radarr URL -api_key = "API_GOES_HERE" # Update to your Radarr API Key - -# Define headers -headers = {"X-Api-Key": api_key} - -def get_existing_formats(): - get_url = f"{base_url}/api/v3/customformat" - print(f"Getting existing formats from {get_url}") - response = requests.get(get_url, headers=headers) - - if response.status_code == 200: - with open('temp_cf.json', 'w') as temp_file: - json.dump(response.json(), temp_file) - else: - print(f"Failed to retrieve existing custom formats from {get_url}! (HTTP {response.status_code})") - print("Response Content: \n", response.content.decode()) - exit(1) - -def import_custom_formats(): - with open('temp_cf.json', 'r') as temp_file: - existing_formats = json.load(temp_file) - existing_names_to_id = {format['name']: format['id'] for format in existing_formats} - - with open('custom_formats/cf.json', 'r') as import_file: - import_formats = json.load(import_file) - - for format in import_formats: - format_name = format['name'] - if format_name in existing_names_to_id: - format_id = existing_names_to_id[format_name] - put_url = f"{base_url}/api/v3/customformat/{format_id}" - print(f"Updating existing format {format_name} using PUT at {put_url}") - format['id'] = format_id # Include the id in the request body - response = requests.put(put_url, json=format, headers=headers) - - if response.status_code in [200, 201, 202]: - print(f"Successfully updated custom format {format_name}! (HTTP {response.status_code})") - else: - print(f"Failed to update custom format {format_name} at {put_url}! (HTTP {response.status_code})") - print("Response Content: \n", response.content.decode()) - - else: - post_url = f"{base_url}/api/v3/customformat" - print(f"Creating new format {format_name} using POST at {post_url}") - response = requests.post(post_url, json=format, headers=headers) - - if response.status_code in [200, 201]: - print(f"Successfully created custom format {format_name}! (HTTP {response.status_code})") - else: - print(f"Failed to create custom format {format_name} at {post_url}! (HTTP {response.status_code})") - print("Response Content: \n", response.content.decode()) - -if __name__ == "__main__": - get_existing_formats() - import_custom_formats() \ No newline at end of file diff --git a/import_quality_profiles.py b/import_quality_profiles.py deleted file mode 100644 index 543fd1a..0000000 --- a/import_quality_profiles.py +++ /dev/null @@ -1,115 +0,0 @@ -import json -import requests -import os # For deleting the temporary file - -# Define constants -base_url = "http://localhost:7878" # Update to your Radarr URL -api_key = "API_GOES_HERE" # Update to your Radarr API Key - -# Define headers -params = {"apikey": api_key} -headers = {"X-Api-Key": api_key} - -def cf_import_sync(): - custom_format_url = f"{base_url}/api/v3/customformat" - response = requests.get(custom_format_url, headers=headers) - - if response.status_code == 200: - data = response.json() - with open('custom_formats.json', 'w') as file: - json.dump(data, file, indent=4) - print("Custom Formats have been saved to 'custom_formats.json'") - return True - else: - print(f"Failed to retrieve custom formats! (HTTP {response.status_code})") - print("Response Content: ", response.content.decode('utf-8')) - return False - - -def import_qf(): - # Call cf_import_sync first - cf_import_sync() - - profile_dir = './profiles' - profiles = [f for f in os.listdir(profile_dir) if f.endswith('.json')] - - # Prompt user to select a profile - print("Available Profiles:") - for i, profile in enumerate(profiles, 1): - print(f"{i}. {profile}") - - selection = input("Please enter the number of the profile you want to import: ") - - try: - selected_file = profiles[int(selection) - 1] - except (ValueError, IndexError): - print("Invalid selection, please enter a valid number.") - return - - # Load the selected profile - with open(os.path.join(profile_dir, selected_file), 'r') as file: - try: - quality_profiles = json.load(file) - except json.JSONDecodeError as e: - print(f"Error loading selected profile: {e}") - return - - # Load custom formats - try: - with open('custom_formats.json', 'r') as file: - custom_formats_data = json.load(file) - custom_formats = {format['name']: format['id'] for format in custom_formats_data} - except Exception as e: - print(f"Failed to load custom formats! Error: {e}") - return - - # Process each profile and send requests - for profile in quality_profiles: - existing_format_names = set() - if 'formatItems' in profile: - for format_item in profile['formatItems']: - format_name = format_item.get('name') - if format_name: - existing_format_names.add(format_name) - if format_name in custom_formats: - format_item['format'] = custom_formats[format_name] - - for format_name, format_id in custom_formats.items(): - if format_name not in existing_format_names: - profile.setdefault('formatItems', []).append({ - "format": format_id, - "name": format_name, - "score": 0 - }) - - post_url = f"{base_url}/api/v3/qualityprofile" - response = requests.post(post_url, json=profile, params=params, headers=headers) - - if response.status_code in [200, 201]: - print(f"Successfully added Quality Profile {profile['name']}! (HTTP {response.status_code})") - else: - try: - # Assuming the response is JSON, parse it - errors = response.json() - - # Extract relevant information from the error message - message = errors.get("message", "No Message Provided") - description = errors.get("description", "No Description Provided") - - # Format and print the error message - print(f"Failed to add Quality Profile {profile['name']}! (HTTP {response.status_code})") - print(f"Error Message: {message}") - - except json.JSONDecodeError: - # If response is not JSON, print the whole response - print("Failed to parse error message:") - print(response.text) - try: - os.remove('custom_formats.json') - except FileNotFoundError: - pass # File already deleted or does not exist - - - -if __name__ == "__main__": - import_qf() diff --git a/profiles/Transparent - HD Fallback (Radarr).json b/profiles/Transparent - HD Fallback (Radarr).json new file mode 100644 index 0000000..4ebd407 --- /dev/null +++ b/profiles/Transparent - HD Fallback (Radarr).json @@ -0,0 +1,1020 @@ +[ + { + "name": "Transparent - HD Fallback", + "upgradeAllowed": true, + "cutoff": 1002, + "items": [ + { + "quality": { + "id": 24, + "name": "WORKPRINT", + "source": "workprint", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 29, + "name": "REGIONAL", + "source": "dvd", + "resolution": 480, + "modifier": "regional" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 4, + "name": "HDTV-720p", + "source": "tv", + "resolution": 720, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "name": "WEB 720p", + "items": [ + { + "quality": { + "id": 5, + "name": "WEBDL-720p", + "source": "webdl", + "resolution": 720, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 14, + "name": "WEBRip-720p", + "source": "webrip", + "resolution": 720, + "modifier": "none" + }, + "items": [], + "allowed": false + } + ], + "allowed": false, + "id": 1001 + }, + { + "quality": { + "id": 1, + "name": "SDTV", + "source": "tv", + "resolution": 480, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 20, + "name": "Bluray-480p", + "source": "bluray", + "resolution": 480, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 21, + "name": "Bluray-576p", + "source": "bluray", + "resolution": 576, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 23, + "name": "DVD-R", + "source": "dvd", + "resolution": 480, + "modifier": "remux" + }, + "items": [], + "allowed": false + }, + { + "name": "CAM", + "items": [ + { + "quality": { + "id": 25, + "name": "CAM", + "source": "cam", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 26, + "name": "TELESYNC", + "source": "telesync", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 27, + "name": "TELECINE", + "source": "telecine", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": true + } + ], + "allowed": true, + "id": 1004 + }, + { + "quality": { + "id": 0, + "name": "Unknown", + "source": "unknown", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 9, + "name": "HDTV-1080p", + "source": "tv", + "resolution": 1080, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "name": "DVD", + "items": [ + { + "quality": { + "id": 28, + "name": "DVDSCR", + "source": "dvd", + "resolution": 480, + "modifier": "screener" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 12, + "name": "WEBRip-480p", + "source": "webrip", + "resolution": 480, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 2, + "name": "DVD", + "source": "dvd", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 8, + "name": "WEBDL-480p", + "source": "webdl", + "resolution": 480, + "modifier": "none" + }, + "items": [], + "allowed": true + } + ], + "allowed": true, + "id": 1003 + }, + { + "name": "Transparent Capable", + "items": [ + { + "quality": { + "id": 3, + "name": "WEBDL-1080p", + "source": "webdl", + "resolution": 1080, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 6, + "name": "Bluray-720p", + "source": "bluray", + "resolution": 720, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 15, + "name": "WEBRip-1080p", + "source": "webrip", + "resolution": 1080, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 7, + "name": "Bluray-1080p", + "source": "bluray", + "resolution": 1080, + "modifier": "none" + }, + "items": [], + "allowed": true + } + ], + "allowed": true, + "id": 1002 + }, + { + "quality": { + "id": 30, + "name": "Remux-1080p", + "source": "bluray", + "resolution": 1080, + "modifier": "remux" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 16, + "name": "HDTV-2160p", + "source": "tv", + "resolution": 2160, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 18, + "name": "WEBDL-2160p", + "source": "webdl", + "resolution": 2160, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 17, + "name": "WEBRip-2160p", + "source": "webrip", + "resolution": 2160, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 19, + "name": "Bluray-2160p", + "source": "bluray", + "resolution": 2160, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 31, + "name": "Remux-2160p", + "source": "bluray", + "resolution": 2160, + "modifier": "remux" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 22, + "name": "BR-DISK", + "source": "bluray", + "resolution": 1080, + "modifier": "brdisk" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 10, + "name": "Raw-HD", + "source": "tv", + "resolution": 1080, + "modifier": "rawhd" + }, + "items": [], + "allowed": false + } + ], + "minFormatScore": 0, + "cutoffFormatScore": 500, + "formatItems": [ + { + "format": 333, + "name": "h265", + "score": 0 + }, + { + "format": 331, + "name": "Golden Popcorn 720p", + "score": 120 + }, + { + "format": 330, + "name": "LQ", + "score": -9999 + }, + { + "format": 329, + "name": "EPSiLON", + "score": 0 + }, + { + "format": 328, + "name": "playBD", + "score": 0 + }, + { + "format": 327, + "name": "BLURANiUM", + "score": 0 + }, + { + "format": 326, + "name": "PmP", + "score": 0 + }, + { + "format": 325, + "name": "WiLDCAT", + "score": 0 + }, + { + "format": 324, + "name": "TRiToN", + "score": 0 + }, + { + "format": 323, + "name": "3L", + "score": 0 + }, + { + "format": 322, + "name": "Dolby Vision w/out Fallback", + "score": -99999 + }, + { + "format": 321, + "name": "UHDBits", + "score": 0 + }, + { + "format": 318, + "name": "ATMOS (Missing)", + "score": 0 + }, + { + "format": 317, + "name": "TrueHD (Missing)", + "score": -9999 + }, + { + "format": 316, + "name": "HDR10 (Missing)", + "score": -9999 + }, + { + "format": 315, + "name": "HDR10", + "score": -9999 + }, + { + "format": 314, + "name": "Dolby Vision", + "score": -99999 + }, + { + "format": 312, + "name": "HDR10+", + "score": -9999 + }, + { + "format": 308, + "name": "Stream Optimised", + "score": 0 + }, + { + "format": 307, + "name": "LoRD", + "score": 70 + }, + { + "format": 306, + "name": "Scene", + "score": 30 + }, + { + "format": 303, + "name": "mHD", + "score": -999999 + }, + { + "format": 302, + "name": "AV-1", + "score": -9999 + }, + { + "format": 301, + "name": "VVC", + "score": -9999 + }, + { + "format": 300, + "name": "Extras", + "score": -9999 + }, + { + "format": 298, + "name": "480p", + "score": 0 + }, + { + "format": 297, + "name": "Dariush ", + "score": 20 + }, + { + "format": 296, + "name": "TBB SD", + "score": 30 + }, + { + "format": 295, + "name": "Xvid", + "score": 0 + }, + { + "format": 294, + "name": "DVD", + "score": 0 + }, + { + "format": 293, + "name": "DVD REMUX ", + "score": 40 + }, + { + "format": 292, + "name": "HANDJOB SD", + "score": 20 + }, + { + "format": 291, + "name": "iTunes (Missing)", + "score": 20 + }, + { + "format": 290, + "name": "ROKU", + "score": 30 + }, + { + "format": 289, + "name": "BeyondHD", + "score": -10000 + }, + { + "format": 288, + "name": "Disc ", + "score": -9999 + }, + { + "format": 287, + "name": "3D", + "score": -9999 + }, + { + "format": 286, + "name": "Unwanted", + "score": -9999 + }, + { + "format": 285, + "name": "HDBits Internal", + "score": 70 + }, + { + "format": 284, + "name": "RightSIZE", + "score": 70 + }, + { + "format": 283, + "name": "Black and White", + "score": -9999 + }, + { + "format": 281, + "name": "TrueHD", + "score": -9999 + }, + { + "format": 280, + "name": "DTS-X", + "score": -9999 + }, + { + "format": 279, + "name": "FLAC", + "score": 0 + }, + { + "format": 278, + "name": "DTS-HD MA", + "score": -9999 + }, + { + "format": 276, + "name": "x265", + "score": -9999 + }, + { + "format": 275, + "name": "Golden Popcorn SD", + "score": 30 + }, + { + "format": 274, + "name": "Golden Popcorn 1080p", + "score": 120 + }, + { + "format": 273, + "name": "IMAX", + "score": 10 + }, + { + "format": 272, + "name": "ATMOS", + "score": 5 + }, + { + "format": 271, + "name": "DD", + "score": 0 + }, + { + "format": 270, + "name": "DTS", + "score": 0 + }, + { + "format": 269, + "name": "DD+", + "score": 0 + }, + { + "format": 268, + "name": "iTunes", + "score": 20 + }, + { + "format": 267, + "name": "Paramount+", + "score": 30 + }, + { + "format": 266, + "name": "Peacock TV", + "score": 30 + }, + { + "format": 265, + "name": "Hulu", + "score": 30 + }, + { + "format": 264, + "name": "Netflix", + "score": 40 + }, + { + "format": 263, + "name": "HBO Max", + "score": 40 + }, + { + "format": 262, + "name": "Disney+", + "score": 40 + }, + { + "format": 261, + "name": "Apple TV+", + "score": 50 + }, + { + "format": 260, + "name": "Movies Anywhere", + "score": 60 + }, + { + "format": 259, + "name": "Amazon Prime", + "score": 50 + }, + { + "format": 258, + "name": "REMUX", + "score": -9999 + }, + { + "format": 256, + "name": "x264", + "score": 10 + }, + { + "format": 255, + "name": "WEBRip", + "score": 0 + }, + { + "format": 254, + "name": "Blu-Ray", + "score": 0 + }, + { + "format": 253, + "name": "2160p", + "score": -9999 + }, + { + "format": 252, + "name": "720p", + "score": -120 + }, + { + "format": 250, + "name": "1080p", + "score": 60 + }, + { + "format": 249, + "name": "BHDStudio", + "score": 30 + }, + { + "format": 248, + "name": "LEGi0N", + "score": 30 + }, + { + "format": 247, + "name": "FraMeSToR", + "score": 30 + }, + { + "format": 246, + "name": "iFT", + "score": 70 + }, + { + "format": 245, + "name": "MTeam", + "score": -9999 + }, + { + "format": 244, + "name": "EDPH", + "score": 30 + }, + { + "format": 243, + "name": "HANDJOB", + "score": 30 + }, + { + "format": 242, + "name": "c0ke", + "score": 110 + }, + { + "format": 241, + "name": "KASHMiR", + "score": 70 + }, + { + "format": 240, + "name": "WMING", + "score": 70 + }, + { + "format": 239, + "name": "playHD", + "score": 70 + }, + { + "format": 238, + "name": "E.N.D", + "score": 70 + }, + { + "format": 237, + "name": "GutS", + "score": 70 + }, + { + "format": 236, + "name": "BV", + "score": 70 + }, + { + "format": 235, + "name": "SiMPLE", + "score": 70 + }, + { + "format": 234, + "name": "W4NK3R", + "score": 70 + }, + { + "format": 233, + "name": "GS88", + "score": 70 + }, + { + "format": 232, + "name": "HiP", + "score": 80 + }, + { + "format": 231, + "name": "GALAXY", + "score": 70 + }, + { + "format": 230, + "name": "luvBB", + "score": 70 + }, + { + "format": 229, + "name": "NyHD", + "score": 70 + }, + { + "format": 228, + "name": "ZIMBO", + "score": 70 + }, + { + "format": 227, + "name": "ThD", + "score": 70 + }, + { + "format": 226, + "name": "SaNcTi", + "score": 70 + }, + { + "format": 225, + "name": "ORiGEN", + "score": 70 + }, + { + "format": 224, + "name": "Positive", + "score": 70 + }, + { + "format": 223, + "name": "ESiR", + "score": 70 + }, + { + "format": 222, + "name": "Chotab", + "score": 70 + }, + { + "format": 221, + "name": "xander", + "score": 70 + }, + { + "format": 220, + "name": "FTW-HD", + "score": 70 + }, + { + "format": 219, + "name": "Penumbra", + "score": 70 + }, + { + "format": 218, + "name": "TDD", + "score": 70 + }, + { + "format": 217, + "name": "Dariush SD", + "score": 70 + }, + { + "format": 216, + "name": "PTer", + "score": 70 + }, + { + "format": 215, + "name": "SbR", + "score": 70 + }, + { + "format": 214, + "name": "nmd", + "score": 70 + }, + { + "format": 213, + "name": "TBB", + "score": 70 + }, + { + "format": 212, + "name": "EA", + "score": 80 + }, + { + "format": 211, + "name": "BMF", + "score": 80 + }, + { + "format": 210, + "name": "LolHD", + "score": 80 + }, + { + "format": 209, + "name": "HDMaNiAcS", + "score": 80 + }, + { + "format": 208, + "name": "IDE", + "score": 80 + }, + { + "format": 207, + "name": "de[42]", + "score": 90 + }, + { + "format": 206, + "name": "NCmt", + "score": 100 + }, + { + "format": 205, + "name": "decibeL", + "score": 90 + }, + { + "format": 204, + "name": "NTb", + "score": 80 + }, + { + "format": 203, + "name": "CRiSC", + "score": 90 + }, + { + "format": 202, + "name": "SA89", + "score": 100 + }, + { + "format": 201, + "name": "HiDt", + "score": 100 + }, + { + "format": 200, + "name": "FoRM", + "score": 100 + }, + { + "format": 199, + "name": "HiFi", + "score": 100 + }, + { + "format": 198, + "name": "CtrlHD", + "score": 100 + }, + { + "format": 197, + "name": "VietHD", + "score": 110 + }, + { + "format": 196, + "name": "ZQ", + "score": 110 + }, + { + "format": 195, + "name": "TayTo", + "score": 110 + }, + { + "format": 194, + "name": "Geek", + "score": 110 + }, + { + "format": 193, + "name": "EbP", + "score": 120 + }, + { + "format": 192, + "name": "DON", + "score": 120 + }, + { + "format": 191, + "name": "D-Z0N3", + "score": 120 + } + ], + "language": { + "id": -1, + "name": "Any" + } + } +] \ No newline at end of file diff --git a/profiles/Transparent - Remux Fallback (Radarr).json b/profiles/Transparent - Remux Fallback (Radarr).json new file mode 100644 index 0000000..eddba21 --- /dev/null +++ b/profiles/Transparent - Remux Fallback (Radarr).json @@ -0,0 +1,1020 @@ +[ + { + "name": "Transparent - Remux Fallback", + "upgradeAllowed": true, + "cutoff": 1002, + "items": [ + { + "quality": { + "id": 24, + "name": "WORKPRINT", + "source": "workprint", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 29, + "name": "REGIONAL", + "source": "dvd", + "resolution": 480, + "modifier": "regional" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 4, + "name": "HDTV-720p", + "source": "tv", + "resolution": 720, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "name": "WEB 720p", + "items": [ + { + "quality": { + "id": 5, + "name": "WEBDL-720p", + "source": "webdl", + "resolution": 720, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 14, + "name": "WEBRip-720p", + "source": "webrip", + "resolution": 720, + "modifier": "none" + }, + "items": [], + "allowed": false + } + ], + "allowed": false, + "id": 1001 + }, + { + "quality": { + "id": 1, + "name": "SDTV", + "source": "tv", + "resolution": 480, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 20, + "name": "Bluray-480p", + "source": "bluray", + "resolution": 480, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 21, + "name": "Bluray-576p", + "source": "bluray", + "resolution": 576, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 23, + "name": "DVD-R", + "source": "dvd", + "resolution": 480, + "modifier": "remux" + }, + "items": [], + "allowed": false + }, + { + "name": "CAM", + "items": [ + { + "quality": { + "id": 25, + "name": "CAM", + "source": "cam", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 26, + "name": "TELESYNC", + "source": "telesync", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 27, + "name": "TELECINE", + "source": "telecine", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": true + } + ], + "allowed": true, + "id": 1004 + }, + { + "quality": { + "id": 0, + "name": "Unknown", + "source": "unknown", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "name": "DVD", + "items": [ + { + "quality": { + "id": 28, + "name": "DVDSCR", + "source": "dvd", + "resolution": 480, + "modifier": "screener" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 12, + "name": "WEBRip-480p", + "source": "webrip", + "resolution": 480, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 2, + "name": "DVD", + "source": "dvd", + "resolution": 0, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 8, + "name": "WEBDL-480p", + "source": "webdl", + "resolution": 480, + "modifier": "none" + }, + "items": [], + "allowed": true + } + ], + "allowed": true, + "id": 1003 + }, + { + "quality": { + "id": 9, + "name": "HDTV-1080p", + "source": "tv", + "resolution": 1080, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "name": "Transparent Capable", + "items": [ + { + "quality": { + "id": 6, + "name": "Bluray-720p", + "source": "bluray", + "resolution": 720, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 3, + "name": "WEBDL-1080p", + "source": "webdl", + "resolution": 1080, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 30, + "name": "Remux-1080p", + "source": "bluray", + "resolution": 1080, + "modifier": "remux" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 15, + "name": "WEBRip-1080p", + "source": "webrip", + "resolution": 1080, + "modifier": "none" + }, + "items": [], + "allowed": true + }, + { + "quality": { + "id": 7, + "name": "Bluray-1080p", + "source": "bluray", + "resolution": 1080, + "modifier": "none" + }, + "items": [], + "allowed": true + } + ], + "allowed": true, + "id": 1002 + }, + { + "quality": { + "id": 16, + "name": "HDTV-2160p", + "source": "tv", + "resolution": 2160, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 18, + "name": "WEBDL-2160p", + "source": "webdl", + "resolution": 2160, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 17, + "name": "WEBRip-2160p", + "source": "webrip", + "resolution": 2160, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 19, + "name": "Bluray-2160p", + "source": "bluray", + "resolution": 2160, + "modifier": "none" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 31, + "name": "Remux-2160p", + "source": "bluray", + "resolution": 2160, + "modifier": "remux" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 22, + "name": "BR-DISK", + "source": "bluray", + "resolution": 1080, + "modifier": "brdisk" + }, + "items": [], + "allowed": false + }, + { + "quality": { + "id": 10, + "name": "Raw-HD", + "source": "tv", + "resolution": 1080, + "modifier": "rawhd" + }, + "items": [], + "allowed": false + } + ], + "minFormatScore": 0, + "cutoffFormatScore": 500, + "formatItems": [ + { + "format": 333, + "name": "h265", + "score": 0 + }, + { + "format": 331, + "name": "Golden Popcorn 720p", + "score": 120 + }, + { + "format": 330, + "name": "LQ", + "score": -9999 + }, + { + "format": 329, + "name": "EPSiLON", + "score": 0 + }, + { + "format": 328, + "name": "playBD", + "score": 0 + }, + { + "format": 327, + "name": "BLURANiUM", + "score": 0 + }, + { + "format": 326, + "name": "PmP", + "score": 0 + }, + { + "format": 325, + "name": "WiLDCAT", + "score": 0 + }, + { + "format": 324, + "name": "TRiToN", + "score": 0 + }, + { + "format": 323, + "name": "3L", + "score": 0 + }, + { + "format": 322, + "name": "Dolby Vision w/out Fallback", + "score": 0 + }, + { + "format": 321, + "name": "UHDBits", + "score": 0 + }, + { + "format": 318, + "name": "ATMOS (Missing)", + "score": 0 + }, + { + "format": 317, + "name": "TrueHD (Missing)", + "score": 20 + }, + { + "format": 316, + "name": "HDR10 (Missing)", + "score": 0 + }, + { + "format": 315, + "name": "HDR10", + "score": 0 + }, + { + "format": 314, + "name": "Dolby Vision", + "score": 0 + }, + { + "format": 312, + "name": "HDR10+", + "score": 0 + }, + { + "format": 308, + "name": "Stream Optimised", + "score": 0 + }, + { + "format": 307, + "name": "LoRD", + "score": 70 + }, + { + "format": 306, + "name": "Scene", + "score": 30 + }, + { + "format": 303, + "name": "mHD", + "score": -999999 + }, + { + "format": 302, + "name": "AV-1", + "score": -9999 + }, + { + "format": 301, + "name": "VVC", + "score": -9999 + }, + { + "format": 300, + "name": "Extras", + "score": -9999 + }, + { + "format": 298, + "name": "480p", + "score": 0 + }, + { + "format": 297, + "name": "Dariush ", + "score": 20 + }, + { + "format": 296, + "name": "TBB SD", + "score": 30 + }, + { + "format": 295, + "name": "Xvid", + "score": 0 + }, + { + "format": 294, + "name": "DVD", + "score": 0 + }, + { + "format": 293, + "name": "DVD REMUX ", + "score": 40 + }, + { + "format": 292, + "name": "HANDJOB SD", + "score": 20 + }, + { + "format": 291, + "name": "iTunes (Missing)", + "score": 20 + }, + { + "format": 290, + "name": "ROKU", + "score": 30 + }, + { + "format": 289, + "name": "BeyondHD", + "score": -10000 + }, + { + "format": 288, + "name": "Disc ", + "score": -9999 + }, + { + "format": 287, + "name": "3D", + "score": -9999 + }, + { + "format": 286, + "name": "Unwanted", + "score": -9999 + }, + { + "format": 285, + "name": "HDBits Internal", + "score": 70 + }, + { + "format": 284, + "name": "RightSIZE", + "score": 70 + }, + { + "format": 283, + "name": "Black and White", + "score": -9999 + }, + { + "format": 281, + "name": "TrueHD", + "score": 20 + }, + { + "format": 280, + "name": "DTS-X", + "score": 30 + }, + { + "format": 279, + "name": "FLAC", + "score": 0 + }, + { + "format": 278, + "name": "DTS-HD MA", + "score": 10 + }, + { + "format": 276, + "name": "x265", + "score": -9999 + }, + { + "format": 275, + "name": "Golden Popcorn SD", + "score": 30 + }, + { + "format": 274, + "name": "Golden Popcorn 1080p", + "score": 120 + }, + { + "format": 273, + "name": "IMAX", + "score": 10 + }, + { + "format": 272, + "name": "ATMOS", + "score": 5 + }, + { + "format": 271, + "name": "DD", + "score": 0 + }, + { + "format": 270, + "name": "DTS", + "score": 0 + }, + { + "format": 269, + "name": "DD+", + "score": 0 + }, + { + "format": 268, + "name": "iTunes", + "score": 20 + }, + { + "format": 267, + "name": "Paramount+", + "score": 30 + }, + { + "format": 266, + "name": "Peacock TV", + "score": 30 + }, + { + "format": 265, + "name": "Hulu", + "score": 30 + }, + { + "format": 264, + "name": "Netflix", + "score": 40 + }, + { + "format": 263, + "name": "HBO Max", + "score": 40 + }, + { + "format": 262, + "name": "Disney+", + "score": 40 + }, + { + "format": 261, + "name": "Apple TV+", + "score": 50 + }, + { + "format": 260, + "name": "Movies Anywhere", + "score": 60 + }, + { + "format": 259, + "name": "Amazon Prime", + "score": 50 + }, + { + "format": 258, + "name": "REMUX", + "score": 40 + }, + { + "format": 256, + "name": "x264", + "score": 10 + }, + { + "format": 255, + "name": "WEBRip", + "score": 0 + }, + { + "format": 254, + "name": "Blu-Ray", + "score": 0 + }, + { + "format": 253, + "name": "2160p", + "score": -9999 + }, + { + "format": 252, + "name": "720p", + "score": -120 + }, + { + "format": 250, + "name": "1080p", + "score": 60 + }, + { + "format": 249, + "name": "BHDStudio", + "score": 30 + }, + { + "format": 248, + "name": "LEGi0N", + "score": 30 + }, + { + "format": 247, + "name": "FraMeSToR", + "score": 30 + }, + { + "format": 246, + "name": "iFT", + "score": 70 + }, + { + "format": 245, + "name": "MTeam", + "score": -9999 + }, + { + "format": 244, + "name": "EDPH", + "score": 30 + }, + { + "format": 243, + "name": "HANDJOB", + "score": 30 + }, + { + "format": 242, + "name": "c0ke", + "score": 110 + }, + { + "format": 241, + "name": "KASHMiR", + "score": 70 + }, + { + "format": 240, + "name": "WMING", + "score": 70 + }, + { + "format": 239, + "name": "playHD", + "score": 70 + }, + { + "format": 238, + "name": "E.N.D", + "score": 70 + }, + { + "format": 237, + "name": "GutS", + "score": 70 + }, + { + "format": 236, + "name": "BV", + "score": 70 + }, + { + "format": 235, + "name": "SiMPLE", + "score": 70 + }, + { + "format": 234, + "name": "W4NK3R", + "score": 70 + }, + { + "format": 233, + "name": "GS88", + "score": 70 + }, + { + "format": 232, + "name": "HiP", + "score": 80 + }, + { + "format": 231, + "name": "GALAXY", + "score": 70 + }, + { + "format": 230, + "name": "luvBB", + "score": 70 + }, + { + "format": 229, + "name": "NyHD", + "score": 70 + }, + { + "format": 228, + "name": "ZIMBO", + "score": 70 + }, + { + "format": 227, + "name": "ThD", + "score": 70 + }, + { + "format": 226, + "name": "SaNcTi", + "score": 70 + }, + { + "format": 225, + "name": "ORiGEN", + "score": 70 + }, + { + "format": 224, + "name": "Positive", + "score": 70 + }, + { + "format": 223, + "name": "ESiR", + "score": 70 + }, + { + "format": 222, + "name": "Chotab", + "score": 70 + }, + { + "format": 221, + "name": "xander", + "score": 70 + }, + { + "format": 220, + "name": "FTW-HD", + "score": 70 + }, + { + "format": 219, + "name": "Penumbra", + "score": 70 + }, + { + "format": 218, + "name": "TDD", + "score": 70 + }, + { + "format": 217, + "name": "Dariush SD", + "score": 70 + }, + { + "format": 216, + "name": "PTer", + "score": 70 + }, + { + "format": 215, + "name": "SbR", + "score": 70 + }, + { + "format": 214, + "name": "nmd", + "score": 70 + }, + { + "format": 213, + "name": "TBB", + "score": 70 + }, + { + "format": 212, + "name": "EA", + "score": 80 + }, + { + "format": 211, + "name": "BMF", + "score": 80 + }, + { + "format": 210, + "name": "LolHD", + "score": 80 + }, + { + "format": 209, + "name": "HDMaNiAcS", + "score": 80 + }, + { + "format": 208, + "name": "IDE", + "score": 80 + }, + { + "format": 207, + "name": "de[42]", + "score": 90 + }, + { + "format": 206, + "name": "NCmt", + "score": 100 + }, + { + "format": 205, + "name": "decibeL", + "score": 90 + }, + { + "format": 204, + "name": "NTb", + "score": 80 + }, + { + "format": 203, + "name": "CRiSC", + "score": 90 + }, + { + "format": 202, + "name": "SA89", + "score": 100 + }, + { + "format": 201, + "name": "HiDt", + "score": 100 + }, + { + "format": 200, + "name": "FoRM", + "score": 100 + }, + { + "format": 199, + "name": "HiFi", + "score": 100 + }, + { + "format": 198, + "name": "CtrlHD", + "score": 100 + }, + { + "format": 197, + "name": "VietHD", + "score": 110 + }, + { + "format": 196, + "name": "ZQ", + "score": 110 + }, + { + "format": 195, + "name": "TayTo", + "score": 110 + }, + { + "format": 194, + "name": "Geek", + "score": 110 + }, + { + "format": 193, + "name": "EbP", + "score": 120 + }, + { + "format": 192, + "name": "DON", + "score": 120 + }, + { + "format": 191, + "name": "D-Z0N3", + "score": 120 + } + ], + "language": { + "id": -1, + "name": "Any" + } + } +] \ No newline at end of file diff --git a/temp_cf.json b/temp_cf.json deleted file mode 100644 index 0637a08..0000000 --- a/temp_cf.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file