Clean slate

This commit is contained in:
Sam Chau
2025-02-05 16:09:33 +10:30
parent 932bcc9c05
commit 28e0cad4a1
40 changed files with 0 additions and 46355 deletions

1
.github/CODEOWNERS vendored
View File

@@ -1 +0,0 @@
* @santiagosayshey

View File

@@ -1,129 +0,0 @@
name: Add Issue to Project
on:
issues:
types: [opened]
jobs:
add-to-project:
name: Add issue to project
runs-on: ubuntu-latest
steps:
- name: Add to Project
id: add-to-project
uses: actions/add-to-project@v0.5.0
with:
project-url: https://github.com/orgs/Dictionarry-Hub/projects/1
github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
- name: Get project item ID
id: get-project-item-id
env:
GITHUB_TOKEN: ${{ secrets.ADD_TO_PROJECT_PAT }}
PROJECT_ID: "PVT_kwDOCjbMFM4AjuUh"
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: |
echo "Fetching project item ID for issue number: $ISSUE_NUMBER"
item_id=$(gh api graphql -f query='
query($project:ID!) {
node(id: $project) {
... on ProjectV2 {
items(first: 100) {
nodes {
id
content {
... on Issue {
number
}
}
}
}
}
}
}' -f project=$PROJECT_ID --jq ".data.node.items.nodes[] | select(.content.number == $ISSUE_NUMBER) | .id" -F number=$ISSUE_NUMBER)
if [ -z "$item_id" ]; then
echo "Error: Project item ID not found for issue number $ISSUE_NUMBER"
exit 1
else
echo "Project item ID found: $item_id"
echo "PROJECT_ITEM_ID=$item_id" >> $GITHUB_OUTPUT
fi
- name: Set component, type, and status
env:
GITHUB_TOKEN: ${{ secrets.ADD_TO_PROJECT_PAT }}
PROJECT_ITEM_ID: ${{ steps.get-project-item-id.outputs.PROJECT_ITEM_ID }}
run: |
echo "Setting fields for Project Item ID: ${PROJECT_ITEM_ID}"
# Set component to "Profilarr"
result=$(gh api graphql -f query='
mutation($project:ID!, $item:ID!, $fieldId:ID!, $value:String!) {
updateProjectV2ItemFieldValue(input: {
projectId: $project
itemId: $item
fieldId: $fieldId
value: {
singleSelectOptionId: $value
}
}) {
projectV2Item {
id
}
}
}' -f project="PVT_kwDOCjbMFM4AjuUh" -f item="${PROJECT_ITEM_ID}" -f fieldId="PVTSSF_lADOCjbMFM4AjuUhzgcCr_E" -f value="48fc49c7")
echo "Set component result: $result"
# Set status to "Backlog"
result=$(gh api graphql -f query='
mutation($project:ID!, $item:ID!, $fieldId:ID!, $value:String!) {
updateProjectV2ItemFieldValue(input: {
projectId: $project
itemId: $item
fieldId: $fieldId
value: {
singleSelectOptionId: $value
}
}) {
projectV2Item {
id
}
}
}' -f project="PVT_kwDOCjbMFM4AjuUh" -f item="${PROJECT_ITEM_ID}" -f fieldId="PVTSSF_lADOCjbMFM4AjuUhzgcCn8s" -f value="f75ad846")
echo "Set status result: $result"
# Get the label of the issue
LABEL=$(gh api repos/Dictionarry-Hub/website/issues/${{ github.event.issue.number }} --jq '.labels[0].name')
echo "Issue label: $LABEL"
# Convert label to lowercase for comparison
LABEL_LOWER=$(echo "$LABEL" | tr '[:upper:]' '[:lower:]')
# Set issue type based on label
ISSUE_TYPE_ID=$(case $LABEL_LOWER in
"bug") echo "b760225f" ;;
"improvement") echo "269885d0" ;;
*) echo "" ;;
esac)
if [ -z "$ISSUE_TYPE_ID" ]; then
echo "No matching issue type for label: $LABEL"
else
echo "Setting issue type to ID: $ISSUE_TYPE_ID"
result=$(gh api graphql -f query='
mutation($project:ID!, $item:ID!, $fieldId:ID!, $value:String!) {
updateProjectV2ItemFieldValue(input: {
projectId: $project
itemId: $item
fieldId: $fieldId
value: {
singleSelectOptionId: $value
}
}) {
projectV2Item {
id
}
}
}' -f project="PVT_kwDOCjbMFM4AjuUh" -f item="${PROJECT_ITEM_ID}" -f fieldId="PVTSSF_lADOCjbMFM4AjuUhzgcCswQ" -f value="$ISSUE_TYPE_ID")
echo "Set issue type result: $result"
fi

View File

@@ -1,114 +0,0 @@
name: Update Issue Status to In Development
on:
create:
branches:
- '*-*'
jobs:
update-status:
runs-on: ubuntu-latest
steps:
- name: Extract Issue Number from Branch Name
id: extract-issue-number
run: |
ISSUE_NUMBER=$(echo $GITHUB_REF_NAME | cut -d'-' -f1)
echo "Issue Number extracted: $ISSUE_NUMBER"
echo "ISSUE_NUMBER=$ISSUE_NUMBER" >> $GITHUB_ENV
- name: Get project item ID
id: get-project-item-id
env:
GITHUB_TOKEN: ${{ secrets.ADD_TO_PROJECT_PAT }}
PROJECT_ID: "PVT_kwDOCjbMFM4AjuUh"
run: |
echo "Fetching project item ID for issue number: $ISSUE_NUMBER"
QUERY='
query fetchProjectItem($project: ID!) {
node(id: $project) {
... on ProjectV2 {
items(first: 100) {
nodes {
id
content {
... on Issue {
number
}
}
}
}
}
}
}'
item_id=$(gh api graphql -f query="$QUERY" -f project=$PROJECT_ID --jq '.data.node.items.nodes[] | select(.content.number == '"$ISSUE_NUMBER"') | .id')
if [ -z "$item_id" ]; then
echo "Error: Project item ID not found for issue number $ISSUE_NUMBER"
exit 1
else
echo "Project item ID found: $item_id"
echo "PROJECT_ITEM_ID=$item_id" >> $GITHUB_ENV
fi
- name: Get single select field ID and options
id: get-field-options
env:
GITHUB_TOKEN: ${{ secrets.ADD_TO_PROJECT_PAT }}
PROJECT_ID: "PVT_kwDOCjbMFM4AjuUh"
run: |
echo "Fetching field ID and options for status"
QUERY='
query($project:ID!) {
node(id: $project) {
... on ProjectV2 {
fields(first: 100) {
nodes {
... on ProjectV2SingleSelectField {
id
name
options {
id
name
}
}
}
}
}
}
}'
field_data=$(gh api graphql -f query="$QUERY" -f project=$PROJECT_ID --jq '.data.node.fields.nodes[] | select(.name == "Status")')
field_id=$(echo $field_data | jq -r '.id')
in_development_option_id=$(echo $field_data | jq -r '.options[] | select(.name == "In Development") | .id')
if [ -z "$field_id" ] || [ -z "$in_development_option_id" ]; then
echo "Error: Field ID or In Development option ID not found"
exit 1
else
echo "Field ID: $field_id"
echo "In Development option ID: $in_development_option_id"
echo "FIELD_ID=$field_id" >> $GITHUB_ENV
echo "IN_DEVELOPMENT_OPTION_ID=$in_development_option_id" >> $GITHUB_ENV
fi
- name: Set status to In Development
env:
GITHUB_TOKEN: ${{ secrets.ADD_TO_PROJECT_PAT }}
PROJECT_ITEM_ID: ${{ env.PROJECT_ITEM_ID }}
FIELD_ID: ${{ env.FIELD_ID }}
IN_DEVELOPMENT_OPTION_ID: ${{ env.IN_DEVELOPMENT_OPTION_ID }}
run: |
echo "Setting status for Project Item ID: ${PROJECT_ITEM_ID}"
result=$(gh api graphql -f query='
mutation($project:ID!, $item:ID!, $fieldId:ID!, $value:String!) {
updateProjectV2ItemFieldValue(input: {
projectId: $project
itemId: $item
fieldId: $fieldId
value: {
singleSelectOptionId: $value
}
}) {
projectV2Item {
id
}
}
}' -f project="PVT_kwDOCjbMFM4AjuUh" -f item="${PROJECT_ITEM_ID}" -f fieldId="${FIELD_ID}" -f value="${IN_DEVELOPMENT_OPTION_ID}")
echo "Set status result: $result"

167
.gitignore vendored
View File

@@ -1,167 +0,0 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
config.yml
exports/
config/
data/

21
LICENSE
View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2023 santiagosayshey
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

329
README.md
View File

@@ -1,329 +0,0 @@
# Profilarr
Profilarr is a Python-based tool designed to add import/export/sync/delete functionality to the \*arr suite. It offers a user-friendly way to:
- Export existing custom formats / profiles
- Import new custom formats / profiles
- Sync a master instance of Radarr / Sonarr with other instances
- Delete existing custom formats / quality profiles
## Discord
Come join us at https://discord.gg/ZxywYBGRB9 if you need any help or want to talk!
## ⚠️ Before Continuing
- **This tool will overwrite any custom formats in your \*arr installation that have the same name.**
- **Always back up your Radarr and Sonarr configurations before using Profilarr to avoid unintended data loss.** (Seriously, do it. Even I've lost data to this tool because I forgot to back up my configs.)
## 🛠️ Installation
### Prerequisites
- Python 3.x installed. You can download it from [python.org](https://www.python.org/downloads/).
- Radarr / Sonarr [Latest Stable]
### Initial Setup
#### Step 1: Download Profilarr
1. **Get Profilarr:**
- Option 1: Clone repository (latest changes)
```
git clone https://github.com/santiagosayshey/Profilarr.git
```
- Option 2: Download latest release (most stable)
- Go to [Releases](https://github.com/santiagosayshey/Profilarr/releases)
- Download the latest `Profilarr-vX.X.X.zip`
- Extract the zip file to your preferred location.
#### Step 2: Install Profilarr
1. **Open Your Terminal:**
- **Windows:** Search for `Command Prompt` or `PowerShell` in your start menu.
- **MacOS:** Search for `Terminal`.
- **Linux:** Use your desktop environment's application launcher to find `Terminal`, or press `Ctrl+Alt+T` if that's a shortcut in your Linux distro.
2. **Navigate to Profilarr Folder:**
- Type `cd path/to/your/folder` and press Enter. Replace `path/to/your/folder` with the actual path to where you extracted Profilarr. This command works the same on Windows, MacOS, and Linux.
3. **Install Dependencies:**
- Type `pip install -r requirements.txt` and press Enter. This command tells Python to install the necessary software components Profilarr needs to run. The command is the same across all platforms.
4. **Setup Configuration:**
- Type `python setup.py` and press Enter. This will run a setup script that prepares Profilarr for use by generating a `config.yml` file, essentially Profilarr's settings book.
#### Step 3: Configure Profilarr
1. **Edit `config.yml`:**
- Open the `config.yml` file in a text editor. Windows users might use Notepad, MacOS users might use TextEdit, and Linux users can use any text editor like Gedit, Nano, or Vim.
- This file contains different settings that you can adjust to tell Profilarr how to operate.
2. **Add Master Instance Details:**
- Look for the section related to Radarr/Sonarr.
- Here, enter the URL and API key for your Radarr/Sonarr instances to link Profilarr with your movie/TV series managers.
3. **Configure Syncing or Exporting (if needed):**
- **Syncing:** For syncing additional Radarr/Sonarr instances, add their URL, API key, and a name for each.
- **Exporting:** To set where Profilarr saves files it creates, adjust the `export_path`.
- **Importing:** If you have settings or lists from other sources, set `import_path` to their location.
4. **Configure ANSI Color Support (Optional):**
- Profilarr can show colorful text in the terminal. If it's not displaying correctly (like showing `←[94m` instead of colors), you can fix this:
- In the `settings` section, find `ansi_colors: true`.
- Change it to `ansi_colors: false`. This disables colorful output for better compatibility with your terminal's capabilities.
5. **Save Your Changes:**
- After adjusting these settings, save and close the `config.yml` file.
#### You're All Set!
## 🚀 Usage
- If using Windows, use `python <script>` or `py <script>`. If on Linux, use `python3 <script>`.
### Importing
Note: For users who start using Profilarr before v0.3, you no longer need to manually import custom formats. They will be imported automatically. Quality Profiles still require manual selection.
1. If importing Dictionarry files, make sure the import path is `./imports` (This is the default path).
2. If importing non Dictionarry files, make sure the import path is set to your desired import location.
3. Run `python importarr.py` in your command line interface.
4. Follow the on-screen prompts to select your desired app and which instance(s) to import to.
5. Choose your desired quality profile(s) to import.
#### Example: Importing 1080p Transparent and 2160p Optimal Quality Profiles
```
Select your app of choice
1. Radarr
2. Sonarr
Enter your choice:
1
Select your Radarr instance
1. Radarr (Master)
2. Radarr (4k-radarr)
Choose an instance by number, multiple numbers separated by commas or type 'all' for all instances:
2
Importing custom formats to Radarr : 4k-radarr
Adding custom format 'D-Z0N3' : SUCCESS
Adding custom format 'DON' : SUCCESS
Adding custom format 'EbP' : SUCCESS
Adding custom format 'Geek' : SUCCESS
Adding custom format 'TayTo' : SUCCESS
... and 129 more.
Successfully added 0 custom formats, updated 134 custom formats.
Available profiles:
1. 1080p Balanced (Radarr).json
2. 1080p Balanced (Single Grab) (Radarr).json
3. 1080p h265 Balanced (Radarr).json
4. 1080p h265 Balanced (Single Grab) (Radarr).json
5. 1080p Optimal (Radarr).json
6. 1080p Optimal (Single Grab) (Radarr).json
7. 1080p Transparent (Double Grab) (Radarr).json
8. 1080p Transparent (Radarr).json
9. 1080p Transparent (Single Grab) (Radarr).json
10. 2160p Optimal (Radarr).json
11. 2160p Optimal (Single Grab) (Radarr).json
Enter the numbers of the profiles you want to import separated by commas, or type 'all' to import all profiles:
8,10
Importing Quality Profiles to Radarr : 4k-radarr
Adding '1080p Transparent' quality profile : SUCCESS
Adding '2160p Optimal' quality profile : SUCCESS
```
### Exporting
1. Make sure the export path is set to your desired export location. The default is `./exports`.
2. Run `python exportarr.py` in your command line interface.
3. Follow the on-screen prompts to select your desired app and which instance(s) to export from.
4. Choose the data you want to export.
5. The data will be exported to `exports/{data_type}/{app}/`.
#### Example
```bash
Select your app of choice
1. Radarr
2. Sonarr
Enter your choice:
1
Select your Radarr instance
1. Radarr (Master)
2. Radarr (4k-radarr)
Choose an instance by number, multiple numbers separated by commas or type 'all' for all instances:
2
Exporting Custom Formats for Radarr : 4k-radarr
Exported 134 custom formats to ./exports/custom_formats/Radarr for 4k-radarr
Exporting Quality Profiles for Radarr : 4k-radarr...
Exported 2 quality profiles to ./exports/quality_profiles/Radarr for 4k-radarr
```
### Syncing
1. Make sure the import path is set to whatever your export path is. This is important, as the script will look for the exported files in this location.
1. Run `python syncarr.py` in your command line interface.
1. The script will automatically export data from the master instance and import it to all other instances specified in `config.json`.
#### Example
```bash
PS Z:\Profilarr> py syncarr.py
Select your app of choice
1. Radarr
2. Sonarr
Enter your choice:
1
Exporting Custom Formats for radarr : Master
Exported 134 custom formats to ./exports\custom_formats\radarr for Master
Exporting Quality Profiles for radarr : Master...
Exported 14 quality profiles to ./exports\quality_profiles\radarr for Master
Importing custom formats to radarr : 4k-radarr
...
Updating custom format 'Blu-Ray (Remux)' : SUCCESS
Updating custom format 'MAX' : SUCCESS
Updating custom format 'h265 (4k)' : SUCCESS
Updating custom format 'TEST FLAC' : SUCCESS
Successfully added 134 custom formats, updated 0 custom formats.
Available profiles:
1. 1080p Balanced (Radarr).json
2. 1080p Balanced (Single Grab) (Radarr).json
3. 1080p h265 Balanced (Radarr).json
4. 1080p h265 Balanced (Single Grab) (Radarr).json
5. 1080p Optimal (Radarr).json
6. 1080p Optimal (Single Grab) (Radarr).json
7. 1080p Transparent (Double Grab) (Radarr).json
8. 1080p Transparent (Radarr).json
9. 1080p Transparent (Single Grab) (Radarr).json
10. 2160p Optimal (Radarr).json
11. 2160p Optimal (Single Grab) (Radarr).json
Enter the numbers of the profiles you want to import separated by commas, or type 'all' to import all profiles:
all
Importing Quality Profiles to radarr : 4k-radarr
Adding '1080p Balanced' quality profile : SUCCESS
Adding '1080p Balanced (Single Grab)' quality profile : SUCCESS
Adding '1080p h265 Balanced' quality profile : SUCCESS
Adding '1080p h265 Balanced (Single Grab)' quality profile : SUCCESS
Adding '1080p Optimal' quality profile : SUCCESS
Adding '1080p Optimal (Single Grab)' quality profile : SUCCESS
Adding '1080p Transparent (Double Grab)' quality profile : SUCCESS
Updating '1080p Transparent' quality profile : SUCCESS
Adding '1080p Transparent (Single Grab)' quality profile : SUCCESS
Updating '2160p Optimal' quality profile : SUCCESS
Adding '2160p Optimal (Single Grab)' quality profile : SUCCESS
```
### Deleting
1. Run `python deletarr.py` in your command line interface.
2. Select the instance(s) from which you wish to delete data.
3. Choose between deleting Custom Formats, Quality Profiles or both
4. Select specific items by typing their numbers separated by commas, or type 'all' to delete everything.
#### Example
```plaintext
Select your app of choice
1. Radarr
2. Sonarr
Enter your choice:
1
Select your Radarr instance
1. Radarr (Master)
2. Radarr (4k-radarr)
Choose an instance by number, multiple numbers separated by commas or type 'all' for all instances:
2
Please select what you want to delete:
1. Custom Formats
2. Quality Profiles
3. Both
Enter your choice: 3
Available items to delete:
1. D-Z0N3
2. DON
3. EbP
4. Geek
5. TayTo
6. ZQ
...
Enter the number(s) of the items you wish to delete, separated by commas, or type 'all' for all:
Your choice: all
Deleting Custom Format (D-Z0N3) : SUCCESS
Deleting Custom Format (DON) : SUCCESS
Deleting Custom Format (EbP) : SUCCESS
Deleting Custom Format (Geek) : SUCCESS
Deleting Custom Format (TayTo) : SUCCESS
Deleting Custom Format (ZQ) : SUCCESS
Available items to delete:
1. 1080p Transparent
2. 2160p Optimal
3. 1080p Balanced
4. 1080p Balanced (Single Grab)
5. 1080p h265 Balanced
6. 1080p h265 Balanced (Single Grab)
7. 1080p Optimal
8. 1080p Optimal (Single Grab)
9. 1080p Transparent (Double Grab)
10. 1080p Transparent (Single Grab)
11. 2160p Optimal (Single Grab)
Enter the number(s) of the items you wish to delete, separated by commas, or type 'all' for all:
Your choice: all
Deleting Quality Profile (1080p Transparent) : SUCCESS
Deleting Quality Profile (2160p Optimal) : SUCCESS
Deleting Quality Profile (1080p Balanced) : SUCCESS
Deleting Quality Profile (1080p Balanced (Single Grab)) : SUCCESS
Deleting Quality Profile (1080p h265 Balanced) : SUCCESS
Deleting Quality Profile (1080p h265 Balanced (Single Grab)) : SUCCESS
Deleting Quality Profile (1080p Optimal) : SUCCESS
Deleting Quality Profile (1080p Optimal (Single Grab)) : SUCCESS
Deleting Quality Profile (1080p Transparent (Double Grab)) : SUCCESS
Deleting Quality Profile (1080p Transparent (Single Grab)) : SUCCESS
Deleting Quality Profile (2160p Optimal (Single Grab)) : SUCCESS
PS Z:\Profilarr>
```
### Radarr and Sonarr Compatibility
- You are only able to import / sync files to the app that is included in the file name (e.g. `Radarr` or `Sonarr`).
- It is possible to manually rename the files to import them to the other app, but this is not recommended.
- Custom Formats will succesfully import, but will require manual editing to work with the other app, i.e. you must adjust the quality sources to match the other app's naming scheme.
- Quality Profiles will not import at all, as they are not compatible with the other app. It is possible to import them manually by editing the json directly, but this is not recommended.
- In future, I may add a feature to automatically convert profiles between the two apps, but this is not currently a priority.
## 🌟 Upcoming Features
- **Lidarr Support:** Expand functionality to include Lidarr, allowing users to manage music quality profiles and custom formats.
- **User Interface (UI):** Development of a graphical user interface (GUI) for easier and more intuitive interaction with Profilarr. This UI will cater to users who prefer graphical over command-line interactions.
- **Automatic Updates:** Implement an auto-update mechanism for Profilarr, ensuring users always have access to the latest features, improvements, and bug fixes without manual intervention.
## Known Issues
- You may encounter a `JSON Encode Error`. This occurs when the base_url is entered incorrectly. Measures have been taken to prevent this, but if you encounter this error, please check your base_url in the config.yml file.
## Contributing
- I've added a docker compose file for testing custom formats / quality profiles. Run `docker-compose up -d` to start the Radarr/ Sonarr test containers. Add your API keys to the `config.yml` file and begin testing!
# TRaSH Guides
Some custom formats found here have been interated on from the trash guides. Credit for these goes entirely to trash, and can be found on their site here. It is not my intention to steal their work, but rather to build on it and make it more accessible to the average user through my quality profiles. Please check out their site for more information on their work.
https://trash-guides.info/

View File

@@ -1,101 +0,0 @@
from helpers import *
def user_select_items_to_delete(items):
"""
Prompts the user to select items to delete from a given list of items.
Each item in the list is expected to be a dictionary with at least an 'id' and 'name' key.
"""
print_message("Available items to delete:", "purple")
for index, item in enumerate(items, start=1):
print_message(f"{index}. {item['name']}", "green")
print_message("Enter the number(s) of the items you wish to delete, separated by commas, or type 'all' for all:", "yellow")
user_input = input("Your choice: ").strip().lower()
selected_items = []
if user_input == 'all':
return items
else:
indices = user_input.split(',')
for index in indices:
try:
index = int(index.strip()) - 1
if 0 <= index < len(items):
selected_items.append(items[index])
else:
print_message("Invalid selection, ignoring.", "red")
except ValueError:
print_message("Invalid input, please enter numbers only.", "red")
return selected_items
def prompt_export_choice():
"""
Prompt user to choose between exporting Custom Formats, Quality Profiles, or both.
Returns a list of choices.
"""
print_message("Please select what you want to delete:", "blue")
options = {"1": "Custom Formats", "2": "Quality Profiles", "3": "Both"}
for key, value in options.items():
print_message(f"{key}. {value}", "green")
choice = input("Enter your choice: ").strip()
# Validate choice
while choice not in options:
print_message("Invalid choice, please select a valid option:", "red")
choice = input("Enter your choice: ").strip()
if choice == "3":
return ["Custom Formats", "Quality Profiles"]
else:
return [options[choice]]
def delete_custom_formats_or_profiles(app, instance, item_type, config):
"""
Deletes either custom formats or quality profiles based on the item_type.
"""
api_key = instance['api_key']
base_url = get_url(instance)
resource_type = item_type # 'customformat' or 'qualityprofile'
if item_type == 'customformat':
type = 'Custom Format'
elif item_type == 'qualityprofile':
type = 'Quality Profile'
# Fetch items to delete
items = make_request('get', base_url, api_key, resource_type)
if items is None or not isinstance(items, list):
return
# Assuming a function to select items to delete. It could list items and ask the user which to delete.
items_to_delete = user_select_items_to_delete(items) # This needs to be implemented or adapted
# Proceed to delete selected items
for item in items_to_delete:
item_id = item['id']
item_name = item['name']
print_message(f"Deleting {type} ({item_name})", "blue", newline=False)
response = make_request('delete', base_url, api_key, f"{resource_type}/{item_id}")
if response in [200, 202, 204]:
print_message(" : SUCCESS", "green")
else:
print_message(" : FAIL", "red")
def main():
app = get_app_choice()
instances = get_instance_choice(app)
config = load_config()
choices = prompt_export_choice()
for instance in instances:
for choice in choices:
if choice == "Custom Formats":
delete_custom_formats_or_profiles(app, instance, 'customformat', config)
elif choice == "Quality Profiles":
delete_custom_formats_or_profiles(app, instance, 'qualityprofile', config)
if __name__ == "__main__":
main()

View File

@@ -1,30 +0,0 @@
version: "3.8"
services:
radarr-dev:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr-dev
environment:
- PUID=0
- PGID=0
- TZ=Etc/UTC
volumes:
- ./config/radarr-dev:/config
- ./data/dummy_radarr-dev:/downloads # Dummy path for downloads
ports:
- "7887:7878" # Unique port for Radarr development instance
restart: unless-stopped
sonarr-dev:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr-dev
environment:
- PUID=0
- PGID=0
- TZ=Etc/UTC
volumes:
- ./config/sonarr-dev:/config
- ./data/dummy_sonarr-dev:/downloads # Dummy path for downloads
ports:
- "8998:8989" # Unique port for Sonarr development instance
restart: unless-stopped

View File

@@ -1,134 +0,0 @@
from helpers import *
import os
import re
def prompt_export_choice():
options = { "1": "Custom Formats", "2": "Quality Profiles" }
print_message("Please select what you want to export:", "blue")
for number, option in options.items():
print_message(f"{number}. {option}", "green")
print_message("Enter the number(s) of your choice, multiple separated by commas, or type 'all' for all options", "yellow")
user_choice = input("Your choice: ")
if user_choice.lower() == 'all':
return list(options.values())
else:
return [options[choice] for choice in user_choice.split(',') if choice in options]
def create_export_path(export_path, app):
# Convert app to lowercase
app = app.lower() # Ensure app is in lowercase
# Create a directory path for the export in lowercase
dir_path = os.path.join(export_path, 'custom_formats', app).lower() # Convert entire path to lowercase
# Create the directory if it doesn't exist
os.makedirs(dir_path, exist_ok=True)
return dir_path
def export_custom_formats(app, instances, config):
for instance in instances:
print_message(f"Exporting Custom Formats for {app.capitalize()} : {instance['name']}", 'blue')
url = get_url(instance)
api_key = instance['api_key']
# Get the export path from the config
export_path = config['settings']['export_path']
# Create the export directory
dir_path = create_export_path(export_path, app)
# Assuming 'export' is a valid resource_type for the API
response = make_request('get', url, api_key, 'customformat')
successful_exports = 0 # Counter for successful exports
# Scrub the JSON data and save each custom format in its own file
all_custom_formats = []
for custom_format in response:
# Remove the 'id' field
custom_format.pop('id', None)
all_custom_formats.append(custom_format)
successful_exports += 1 # Increment the counter if the export was successful
file_name = f"custom formats ({app.lower()} - {instance['name'].lower()}).json"
# Save all custom formats to a single file in the export directory
try:
with open(os.path.join(dir_path, file_name), 'w') as f:
json.dump(all_custom_formats, f, indent=4)
status = 'SUCCESS'
status_color = 'green'
except Exception as e:
status = 'FAILED'
status_color = 'red'
print_message(f"Exported {successful_exports} custom formats to {dir_path} for {instance['name']}", 'yellow')
print()
def create_quality_profiles_export_path(app, config):
# Get the export path from the config
export_path = config['settings']['export_path']
# Create a directory path for the export
dir_path = os.path.join(export_path, 'quality_profiles', app)
# Create the directory if it doesn't exist
os.makedirs(dir_path, exist_ok=True)
return dir_path
def export_quality_profiles(app, instances, config):
for instance in instances:
print_message(f"Exporting Quality Profiles for {app.capitalize()} : {instance['name']}", 'blue')
url = get_url(instance)
api_key = instance['api_key']
# Create the export directory
dir_path = create_quality_profiles_export_path(app, config)
# Assuming 'qualityprofile' is the valid resource_type for the API
response = make_request('get', url, api_key, 'qualityprofile')
successful_exports = 0 # Counter for successful exports
# Scrub the JSON data and save each quality profile in its own file
for quality_profile in response:
# Remove the 'id' field
quality_profile.pop('id', None)
# Create a file name from the quality profile name and app
file_name = f"{quality_profile['name']} ({app.lower()} - {instance['name'].lower()}).json"
file_name = re.sub(r'[\\/*?:"<>|]', '', file_name) # Remove invalid characters
# Save the quality profile to a file in the export directory
try:
with open(os.path.join(dir_path, file_name), 'w') as f:
json.dump([quality_profile], f, indent=4) # Wrap quality_profile in a list
status = 'SUCCESS'
status_color = 'green'
except Exception as e:
status = 'FAILED'
status_color = 'red'
if status == 'SUCCESS':
successful_exports += 1 # Increment the counter if the export was successful
print_message(f"Exported {successful_exports} quality profiles to {dir_path} for {instance['name']}", 'yellow')
print()
def main():
app = get_app_choice()
instances = get_instance_choice(app)
config = load_config()
export_custom_formats(app, instances, config)
export_quality_profiles(app, instances, config)
if __name__ == "__main__":
main()

View File

@@ -1,157 +0,0 @@
import yaml
import json
import requests
from requests.exceptions import ConnectionError, Timeout, TooManyRedirects
import json
import sys
import re
class Colors:
GREEN = '\033[92m'
RED = '\033[91m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
PURPLE = '\033[95m'
ENDC = '\033[0m'
class Apps:
APP_CHOICES = {
"1": "radarr",
"2": "sonarr",
# Add more apps here as needed
}
def get_url(instance):
url = instance['base_url']
normalized_url = re.sub(r'/$', '', url)
return normalized_url
def print_message(message, message_type='', newline=True):
config = load_config()
ansi_colors = config['settings']['ansi_colors']
if ansi_colors:
# Initialize color as default.
color = Colors.ENDC
message_type = message_type.lower()
# Assign color based on message type.
if message_type == 'green':
color = Colors.GREEN
elif message_type == 'red':
color = Colors.RED
elif message_type == 'yellow':
color = Colors.YELLOW
elif message_type == 'blue':
color = Colors.BLUE
elif message_type == 'purple':
color = Colors.PURPLE
# Prepare the end color reset code.
end_color = Colors.ENDC
# Print the colored message.
if newline:
print(color + message + end_color)
else:
print(color + message + end_color, end='')
else:
# Print the message without color if ANSI colors are disabled.
if newline:
print(message)
else:
print(message, end='')
def load_config():
with open('config.yml', 'r') as config_file:
config = yaml.safe_load(config_file)
return config
def get_app_choice():
print_message("Select your app of choice", "blue")
# Dynamically generate the app selection menu
app_menu = "\n".join([f"{key}. {value}" for key, value in Apps.APP_CHOICES.items()])
print_message(app_menu)
print_message("Enter your choice: ", "blue")
app_choice = input().strip()
while app_choice not in Apps.APP_CHOICES.keys():
print_message("Invalid input. Please enter a valid choice.", "red")
app_choice = input().strip()
app = Apps.APP_CHOICES[app_choice]
return app
def get_instance_choice(app):
config = load_config()
app_instances = config['instances'].get(app.lower(), [])
print_message(f"Select your {app.capitalize()} instance", "blue")
# Display instances and prompt for choice
for i, instance in enumerate(app_instances, start=1):
print_message(f"{i}. {app.capitalize()} ({instance['name']})")
print_message("Choose an instance by number, multiple numbers separated by commas or type 'all' for all instances: ", "blue")
choice = input().strip()
print()
selected_instances = []
if choice.lower() == 'all':
selected_instances = app_instances
else:
choices = choice.split(',')
for choice in choices:
choice = choice.strip() # remove any leading/trailing whitespace
while not choice.isdigit() or int(choice) < 1 or int(choice) > len(app_instances):
print_message("Invalid input. Please select a valid number.", "warning")
choice = input().strip()
selected_instance = app_instances[int(choice) - 1]
selected_instances.append(selected_instance)
return selected_instances
def make_request(request_type, url, api_key, resource_type, json_payload=None):
full_url = f"{url}/api/v3/{resource_type}"
headers = {"X-Api-Key": api_key}
try:
# Make the appropriate request based on the request_type
if request_type.lower() == 'get':
response = requests.get(full_url, headers=headers, json=json_payload)
elif request_type.lower() == 'post':
response = requests.post(full_url, headers=headers, json=json_payload)
elif request_type.lower() == 'put':
response = requests.put(full_url, headers=headers, json=json_payload)
elif request_type.lower() == 'delete':
response = requests.delete(full_url, headers=headers)
return response.status_code
elif request_type.lower() == 'patch':
response = requests.patch(full_url, headers=headers, json=json_payload)
else:
raise ValueError("Unsupported request type provided.")
# Process response
if response.status_code in [200, 201, 202]:
try:
return response.json()
except json.JSONDecodeError:
print_message("Failed to decode JSON response.", "red")
return None
elif response.status_code == 401:
print_message("Unauthorized. Check your API key.", "red")
sys.exit()
elif response.status_code == 409:
print_message("Conflict detected. The requested action could not be completed.", "red")
else:
print_message(f"HTTP Error {response.status_code}.", "red")
except (ConnectionError, Timeout, TooManyRedirects) as e:
# Update the message here to suggest checking the application's accessibility
print_message("Network error. Make sure the application is running and accessible.", "red")
sys.exit()
return None

View File

@@ -1,211 +0,0 @@
from helpers import *
import os
import fnmatch
import json
def get_custom_formats(app):
config = load_config()
import_path = f"{config['settings']['import_path']}/custom_formats/{app.lower()}" # Adjusted path
for file in os.listdir(import_path):
if fnmatch.fnmatch(file, f'*{app}*'):
return file
return None
def process_format(format, existing_names_to_id, base_url, api_key):
format_name = format['name']
if format_name in existing_names_to_id:
format_id = existing_names_to_id[format_name]
response = make_request('put', base_url, api_key, f'customformat/{format_id}', format)
if response is not None:
print_message(f"Updating custom format '{format_name}'", "yellow", newline=False)
print_message(" : SUCCESS", "green")
return 0, 1
else:
print_message(f"Updating custom format '{format_name}'", "yellow", newline=False)
print_message(" : FAIL", "red", newline=False)
else:
response = make_request('post', base_url, api_key, 'customformat', format)
if response is not None:
print_message(f"Adding custom format '{format_name}'", "blue", newline=False)
print_message(" : SUCCESS", "green")
return 1, 0
else:
print_message(f"Adding custom format '{format_name}'", "blue", newline=False)
print_message(" : FAIL", "red", newline=False)
return 0, 0
def import_custom_formats(app, instances):
config = load_config()
for instance in instances:
api_key = instance['api_key']
base_url = get_url(instance)
existing_formats = make_request('get', base_url, api_key, 'customformat')
existing_names_to_id = {format['name']: format['id'] for format in existing_formats}
app_file = get_custom_formats(app)
if app_file is None:
print_message(f"No file found for app: {app}", "red")
continue
added_count, updated_count = 0, 0
with open(f"{config['settings']['import_path']}/custom_formats/{app.lower()}/{app_file}", 'r') as import_file:
import_formats = json.load(import_file)
print_message(f"Importing custom formats to {app.capitalize()} : {instance['name']}", "purple")
print()
for format in import_formats:
added, updated = process_format(format, existing_names_to_id, base_url, api_key)
added_count += added
updated_count += updated
print()
print_message(
f"Successfully added {added_count} custom formats, "
f"updated {updated_count} custom formats.",
"purple"
)
print()
def get_profiles(app):
config = load_config()
import_path = f"{config['settings']['import_path']}/quality_profiles/{app.lower()}" # Adjusted path
matching_files = [] # Create an empty list to hold matching files
for file in os.listdir(import_path):
if fnmatch.fnmatch(file, f'*{app}*'):
matching_files.append(file) # Add matching file to the list
return matching_files # Return the list of matching files
def get_existing_profiles(base_url, api_key):
resource_type = 'qualityprofile'
existing_profiles = make_request('get', base_url, api_key, resource_type)
return {profile['name']: profile for profile in existing_profiles} if existing_profiles else {}
def cf_import_sync(instances):
for instance in instances:
api_key = instance['api_key']
base_url = get_url(instance)
resource_type = 'customformat'
response = make_request('get', base_url, api_key, resource_type)
if response:
instance['custom_formats'] = {format['name']: format['id'] for format in response}
else:
print_message("No custom formats found for this instance.", "purple")
print()
def user_select_profiles(profiles):
print_message("Available profiles:", "purple")
for idx, profile in enumerate(profiles, start=1):
print(f"{idx}. {profile}")
print()
while True:
# Display prompt message
print_message("Enter the numbers of the profiles you want to import separated by commas, or type 'all' to import all profiles: ", "blue", newline=False)
print()
user_input = input().strip()
if user_input.lower() == 'all':
return profiles # Return all profiles if 'all' is selected
selected_profiles = []
try:
selected_indices = [int(index.strip()) for index in user_input.split(',')]
for index in selected_indices:
if 1 <= index <= len(profiles):
selected_profiles.append(profiles[index - 1])
else:
raise ValueError(f"Invalid selection: {index}. Please enter valid numbers.") # Raise an error to trigger except block
return selected_profiles # Return the selected profiles if all inputs are valid
except ValueError as e:
print_message(str(e), "red") # Display error message in red
def process_profile(profile, base_url, api_key, custom_formats, existing_profiles):
profile_name = profile.get('name')
existing_profile = existing_profiles.get(profile_name)
# Update or add custom format items as needed
if 'formatItems' in profile:
for format_item in profile['formatItems']:
format_name = format_item.get('name')
if format_name and 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 {item.get('name') for item in profile.get('formatItems', [])}:
profile.setdefault('formatItems', []).append({
"format": format_id,
"name": format_name,
"score": 0
})
if existing_profile:
profile['id'] = existing_profile['id']
action = "Updating"
action_color = "yellow"
resource_type = f"qualityprofile/{profile['id']}"
else:
action = "Adding"
action_color = "blue"
resource_type = "qualityprofile"
response = make_request('put' if existing_profile else 'post', base_url, api_key, resource_type, profile)
# Print the action statement in blue for Adding and yellow for Updating
print_message(f"{action} '{profile_name}' quality profile", action_color, newline=False)
# Determine the status and print the status in green (OK) or red (FAIL)
if response:
print_message(" : SUCCESS", "green")
else:
print_message(" : FAIL", "red")
def import_quality_profiles(app, instances):
config = load_config()
cf_import_sync(instances)
all_profiles = get_profiles(app)
selected_profiles_names = user_select_profiles(all_profiles)
for instance in instances:
base_url = get_url(instance)
api_key = instance['api_key']
custom_formats = instance.get('custom_formats', {})
existing_profiles = get_existing_profiles(base_url, api_key) # Retrieve existing profiles
print_message(f"Importing Quality Profiles to {app} : {instance['name']}", "purple")
print()
for profile_file in selected_profiles_names:
with open(f"{config['settings']['import_path']}/quality_profiles/{app.lower()}/{profile_file}", 'r') as file:
try:
quality_profiles = json.load(file)
except json.JSONDecodeError as e:
print_message(f"Error loading selected profile: {e}", "red")
continue
for profile in quality_profiles:
process_profile(profile, base_url, api_key, custom_formats, existing_profiles)
print()
def main():
app = get_app_choice()
instances = get_instance_choice(app)
import_custom_formats(app, instances)
import_quality_profiles(app, instances)
if __name__ == "__main__":
main()

View File

@@ -1,2 +0,0 @@
PyYAML==6.0.1
Requests==2.31.0

View File

@@ -1,25 +0,0 @@
config_content = """
instances:
radarr:
- name: "Master"
base_url: "http://localhost:7878"
api_key: "API_KEY"
- name: "DEV"
base_url: "http://localhost:7887"
api_key: "API_KEY"
sonarr:
- name: "Master"
base_url: "http://localhost:8989"
api_key: "API_KEY"
- name: "DEV"
base_url: "http://localhost:8998"
api_key: "API_KEY"
settings:
export_path: "./exports"
import_path: "./imports"
ansi_colors: true
"""
with open('config.yml', 'w') as file:
file.write(config_content)

View File

@@ -1,22 +0,0 @@
from exportarr import export_custom_formats, export_quality_profiles
from importarr import import_custom_formats, import_quality_profiles
from helpers import load_config, get_app_choice
def main():
app = get_app_choice().lower() # Convert to lowercase
config = load_config() # Load the entire configuration
# Now app will be 'radarr' or 'sonarr', matching the keys in the config dictionary
master_instance = next((inst for inst in config['instances'][app] if inst['name'] == 'Master'), None)
extra_instances = [inst for inst in config['instances'][app] if inst['name'] != 'Master']
if master_instance:
export_custom_formats(app, [master_instance], config)
export_quality_profiles(app, [master_instance], config)
if extra_instances:
import_custom_formats(app, extra_instances)
import_quality_profiles(app, extra_instances)
if __name__ == "__main__":
main()

View File

@@ -1,116 +0,0 @@
from extract import get_custom_format, get_regex
import re
import sys
# ANSI escape codes for colors
GREEN = '\033[92m'
RED = '\033[91m'
BLUE = '\033[94m'
ORANGE = '\033[38;5;208m'
RESET = '\033[0m'
good_matches = [
"HobyBuchanon.Rebecca.Vanguard.Sailor.Luna.Extreme.Sloppy.Gagging.Throat.Fuck.and.Throat.Pie.2019.12.20.1080p.AV1",
"TushyRaw.Emma.Rosie.Petite.Tight.Emma.Gets.Her.Tiny.Ass.Stretched.Out.TushyRaw.Emma.Rosie.Petite.Tight.Emma.Gets.Her.Tiny.Ass.Stretched.Out.2023.12.06.2160p.AV1.mp4",
"MILFY 24 05 15 Nikki Benz Ultimate MILF Nikki Cums Hard while Riding His Cock XXX 720p AV1 XLeech.mkv",
"MILFY 24 05 08 Medusa Fit Yoga MILF Medusa Rides Young Studs Cock All Day XXX 720p AV1 XLeech.mkv",
"Vixen 24 05 17 Blake Blossom Giselle Blanco Double Take XXX 720p AV1 XLeech.mkv",
"TouchMyWife 24 05 17 Addison Vodka Wife Wants the Younger Version XXX 720p AV1 XLeech.mkv",
"LoveHerAss 24 05 08 Clea Gaultier Big Tits Hot Ass Absolute Babe XXX 720p AV1 XLeech.mkv",
"Deeper 24 05 09 Lulu Chu Cop Shop XXX 720p AV1 XLeech.mkv",
"BreedMe 24 05 14 Payton Preslee Busty Brunette Payton Preslee XXX 720p AV1 XLeech.mkv",
"Freeze 24 05 03 Lia Lin When Shaman Calls XXX 720p AV1 XLeech.mkv",
"Oppenheimer 2023 BluRay 2160p UHD AV1 HDR10 DTS-HD MA 5.1 - PRL Waldek",
"Casino.Royale.2006.1080p.Bluray.OPUS.5.1.AV1-WhiskeyJack.mkv",
"Interstellar 2014 BluRay 2160p DTS HDMA5 1 AV1 10bit-CHD",
"Dune.Part.Two.2024.REPACK.1080p.BluRay.AV1.Opus.7.1.MULTi4-dAV1nci",
"Oppenheimer 2023 BluRay 2160p UHD AV1 HDR10 DTS-HD MA 5.1 - PRL Waldek",
"Guardians of the Galaxy Vol 3 2023 BluRay 2160p UHD AV1 HDR10 TrueHD 7.1 Atmos - PRL Waldek",
"Dune.Part.Two.2024.2160p.DV.HDR.BluRay.AV1.Opus.7.1.MULTi4-dAV1nci",
"AVATAR: THE WAY OF WATER [2022]1080p WEB DL[AV1][10 BIT][Atmos/E-AC3][RoB]",
"Godzilla.X.Kong.The.New.Empire.2024.Web-Dl.2160P.AV1",
"GREEN LANTERN EXTENDED CUT [2011]1080p BDRRip[10 BIT AV1][DTS-HD MA][RoB]",
"Resident Evil Death Island 2023 1080p English AAC AV1",
"Bird Box (2018) 1080p DS4K NF WEBRip AV1 Opus 5.1 [Retr0]",
"The Banshees of Inisherin (2022) 1080p DS4K MA WEBRip AV1 Opus 5.1 [Retr0]",
"Once Upon a Studio (2023) DS4K 1080p DSNP WEBRip AV1 Opus 5.1 [RAV1NE]",
"24 Jam Bersama Gaspar (2024) INDONESIAN DS4K 1080p NF WEBRip AV1 Opus 5.1 [RAV1NE]",
"THE HUNGER GAMES QUADRILOGY [4K UHD BDRip][10 BIT AV1][HDR][ATMOS/TrueHD][RoB]",
"AVATAR: THE WAY OF WATER [2022]1080p WEB DL[AV1][10 BIT][Atmos/E-AC3][RoB]",
"Rebel Moon Part One-A Child of Fire 2023 720p AV1-Zero00",
"[Copernicus] Chainsaw Man - S01E02 [BDRip][1080p][AV1-10bit]",
"Scavengers.Reign.S01e05.The.Demeter.Opus.AV1"
]
bad_matches = [
]
def AV1(debug_level=0):
# Get the custom formats for "AV1" from both Radarr and Sonarr
AV1_radarr = get_custom_format("AV1", "radarr", debug_level)
AV1_sonarr = get_custom_format("AV1", "sonarr", debug_level)
# Extract the regex values for both Radarr and Sonarr using get_regex
AV1_value_radarr = get_regex(AV1_radarr, "AV1", debug_level)
AV1_value_sonarr = get_regex(AV1_sonarr, "AV1", debug_level)
# Replace the negative lookbehind with a negative lookahead
AV1_value_radarr = AV1_value_radarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
AV1_value_sonarr = AV1_value_sonarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
if debug_level > 0:
print(f"Testing with regex: {ORANGE}{AV1_value_radarr}{RESET}\n")
# Compare Radarr and Sonarr AV1 regex values
if AV1_value_radarr != AV1_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {AV1_value_radarr}")
print(f"Sonarr regex: {AV1_value_sonarr}")
good_matches_passed = []
good_matches_failed = []
bad_matches_passed = []
bad_matches_failed = []
print("Checking good matches:")
# Test good matches
for release in good_matches:
if re.search(AV1_value_radarr, release, re.IGNORECASE):
good_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
else:
good_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
print("\nChecking bad matches:")
# Test bad matches
for release in bad_matches:
if re.search(AV1_value_radarr, release, re.IGNORECASE):
bad_matches_passed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
else:
bad_matches_failed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
print("\nFailed matches:")
if good_matches_failed or bad_matches_passed:
for release in good_matches_failed + bad_matches_passed:
print(f" - {release}")
else:
print(f"{GREEN}None, Great Job! :){RESET}")
total_matches = len(good_matches) + len(bad_matches)
passed_matches = len(good_matches_passed) + len(bad_matches_failed)
success_rate = (passed_matches / total_matches) * 100
print("\nStats:")
print(f"Total: {total_matches}")
print(f"Bad: {len(bad_matches_passed) + len(good_matches_failed)}")
print(f"Rate: {success_rate:.2f}%")
if success_rate >= 99.8:
return True
else:
return False

View File

@@ -1,54 +0,0 @@
import json
def get_custom_format(format_name, arr_type, debug_level=0):
# Convert the format_name to lowercase for case-insensitive comparison
format_name = format_name.lower()
# Determine the file path based on arr_type
if arr_type.lower() == "sonarr":
file_path = 'imports/custom_formats/sonarr/custom formats (sonarr - master).json'
elif arr_type.lower() == "radarr":
file_path = 'imports/custom_formats/radarr/custom formats (radarr - master).json'
else:
raise ValueError("Unsupported arr type: choose 'sonarr' or 'radarr'")
try:
with open(file_path, 'r') as f:
custom_formats = json.load(f)
# Search for the custom format by name, case-insensitively
for custom_format in custom_formats:
if custom_format['name'].lower() == format_name:
# Debugging output if level is set to 1
if debug_level > 1:
print("Found custom format:", json.dumps(custom_format, indent=4))
return custom_format
if debug_level > 1:
print(f"{format_name} not found in {arr_type}!")
except FileNotFoundError:
if debug_level > 1:
print(f"Warning: File {file_path} not found.")
return None
# Return None if the format is not found
return None
def get_regex(custom_format, specification_name, debug_level=0):
if not custom_format:
if debug_level > 1:
print("Custom format not found.")
return "Custom format not found."
# Convert the specification_name to lowercase for case-insensitive comparison
specification_name = specification_name.lower()
for spec in custom_format.get("specifications", []):
if spec.get("name").lower() == specification_name:
for field in spec.get("fields", []):
if field.get("name").lower() == "value":
if debug_level > 1:
print(f"Found value for specification '{specification_name}': {field.get('value')}")
return field.get("value")
if debug_level > 1:
print(f"Specification '{specification_name}' found, but 'value' field not found.")
if debug_level > 1:
print(f"Specification '{specification_name}' not found.")
return "Specification or value field not found."

View File

@@ -1,122 +0,0 @@
from extract import get_custom_format, get_regex
import re
import sys
# ANSI escape codes for colors
GREEN = '\033[92m'
RED = '\033[91m'
RESET = '\033[0m'
def h265(debug_level=0):
# Get the custom formats for "h265" from both Radarr and Sonarr
h265_radarr = get_custom_format("h265", "radarr", debug_level)
h265_sonarr = get_custom_format("h265", "sonarr", debug_level)
# Extract the regex values for verified groups
h265_value_radarr = get_regex(h265_radarr, "verified groups", debug_level)
h265_value_sonarr = get_regex(h265_sonarr, "verified groups", debug_level)
# Replace the negative lookbehind with a negative lookahead
h265_value_radarr = h265_value_radarr.replace("(?<=^|[\\s.-])", "(?:^|[\\s.-])")
h265_value_sonarr = h265_value_sonarr.replace("(?<=^|[\\s.-])", "(?:^|[\\s.-])")
if debug_level > 0:
print(f"Testing with regex: {h265_value_radarr}")
# Compare Radarr and Sonarr h265 regex values
if h265_value_radarr != h265_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {h265_value_radarr}")
print(f"Sonarr regex: {h265_value_sonarr}")
sys.exit(1)
radarr_good_matches = [
"The Batman (2022) (1080p HMAX WEB-DL H265 SDR DDP Atmos 5.1 English - HONE)",
"King Richard (2021) (1080p HMAX WEB-DL H265 SDR DDP Atmos 5.1 English - HONE)",
"The Survivor (2021) (1080p HMAX WEB-DL H265 SDR DD 5.1 English - HONE)",
"Transformers (2007) (1080p HMAX WEB-DL H265 SDR DD 5.1 English - BLAZE)",
"Significant Other (2022) (1080p AMZN WEB-DL H265 SDR DDP 5.1 English - Yoyo)",
"The NeverEnding Story (1984) (1080p HMAX WEB-DL H265 SDR DD 5.1 English - SiGLA)",
"Monster-in-Law (2005) (1080p HMAX WEB-DL H265 SDR DD 5.1 English - SiGLA)",
"Rocky III (1982) (1080p AMZN WEB-DL H265 SDR DDP 5.1 English - AnoZu)",
"Samaritan (2022) (1080p AMZN WEB-DL H265 SDR DDP 5.1 English - GRiMM)",
"The Old Guard (2020) (1080p NF WEB-DL H265 SDR DDP Atmos 5.1 English - GRiMM)"
]
radarr_bad_matches = [
"The Tinder Swindler (2022) (1080p NF WEB-DL H265 SDR DDP Atmos 5.1 English - TEPES)",
"The Greatest Lie Ever Sold: George Floyd and the Rise of BLM (2022) (1080p WEB-DL H265 SDR AAC 2.0 English - NOGROUP)",
"Baccano! (2007) S01 (1080p BluRay H265 SDR OPUS 2.0 English - NOGROUP)",
"Bhool Bhulaiyaa 2 (2022) (1080p NF WEB-DL H265 SDR DDP 5.1 Hindi - ElecTr0n)",
"Ek Villain Returns (2022) (1080p NF WEB-DL H265 SDR DDP 5.1 Hindi - SKUI)"
]
sonarr_good_matches = [
"Minx (2022) S01 (1080p HMAX WEB-DL H265 SDR DD 5.1 English - HONE)",
"We Own This City (2022) S01E01 (1080p HMAX WEB-DL H265 SDR DD 5.1 English - HONE)",
"My Brilliant Friend (2018) S01 (1080p HMAX WEB-DL H265 SDR DD 5.1 Italian - HONE)",
"The Goldbergs (2013) S09 (1080p HULU WEB-DL H265 SDR DDP 5.1 English - BLAZE)",
"Atlanta (2016) S01 (1080p HULU WEB-DL H265 SDR DDP 5.1 English - Yoyo)",
"Friday Night Lights (2006) S01 (1080p AMZN WEB-DL H265 SDR DDP 5.1 English - SiGMA)",
"Defiance (2013) S03 (1080p AMZN WEB-DL H265 SDR DDP 5.1 English - SiGMA)",
"Happy Valley (2014) S01 (1080p iP WEB-DL H265 SDR AAC 2.0 English - HECATE)",
"Shaun the Sheep (2007) S05 (1080p iP WEB-DL H265 SDR AAC 2.0 English - HECATE)",
"Skins (2007) S01 (1080p AMZN WEB-DL H265 SDR DDP 2.0 English - DarQ)",
"Wheeler Dealers (2003) S17 (1080p AMZN WEB-DL H265 SDR DDP 2.0 English - DarQ)",
"Supernatural (2005) S04 (1080p AMZN WEB-DL H265 SDR DDP 5.1 English - AnoZu)",
"DC's Stargirl (2020) S01 (1080p AMZN WEB-DL H265 SDR DDP 5.1 English - YELLO)",
"American Horror Story (2011) S12E01 (1080p HULU WEB-DL H265 SDR DDP 5.1 English - YELLO)"
]
sonarr_bad_matches = [
"House of the Dragon (2022) S00E24 (1080p HMAX WEB-DL H265 SDR DD 2.0 English - PbP)",
"Daybreak (2019) S01 (1080p NF WEB-DL x265 SDR H265 DDP Atmos 5.1 English - t3nzin)",
"Superjail! (2008) S03 (1080p AMZN WEB-DL H265 SDR DD 5.1 English - DiNGUS)"
]
failed_good_matches = []
failed_bad_matches = []
# Print Radarr Good Matches
print("\nRadarr Releases:")
print("----------------")
print("Should Match:")
for term in radarr_good_matches:
if re.search(h265_value_radarr, term, re.IGNORECASE):
print(f" - {term}: {GREEN}Passed{RESET}")
else:
failed_good_matches.append(("Radarr", term))
print(f" - {term}: {RED}Failed{RESET}")
# Print Radarr Bad Matches
print("\nShould NOT Match:")
for term in radarr_bad_matches:
if not re.search(h265_value_radarr, term, re.IGNORECASE):
print(f" - {term}: {GREEN}Passed{RESET}")
else:
failed_bad_matches.append(("Radarr", term))
print(f" - {term}: {RED}Failed{RESET}")
# Print Sonarr Good Matches
print("\nSonarr Releases:")
print("----------------")
print("Should Match:")
for term in sonarr_good_matches:
if re.search(h265_value_sonarr, term, re.IGNORECASE):
print(f" - {term}: {GREEN}Passed{RESET}")
else:
failed_good_matches.append(("Sonarr", term))
print(f" - {term}: {RED}Failed{RESET}")
# Print Sonarr Bad Matches
print("\nShould NOT Match:")
for term in sonarr_bad_matches:
if not re.search(h265_value_sonarr, term, re.IGNORECASE):
print(f" - {term}: {GREEN}Passed{RESET}")
else:
failed_bad_matches.append(("Sonarr", term))
print(f" - {term}: {RED}Failed{RESET}")
# Determine and print overall test result
if not failed_good_matches and not failed_bad_matches:
return True
else:
return False

View File

@@ -1,539 +0,0 @@
from extract import get_custom_format, get_regex
import re
import sys
# ANSI escape codes for colors
GREEN = '\033[92m'
RED = '\033[91m'
ORANGE = '\033[93m'
RESET = '\033[0m'
good_matches = [
"About Dry Grasses (2023) (1080p BluRay x265 HEVC 10bit AAC 5.1 Turkish Tigole) [QxR]",
"1408 (2007) DC (1080p BluRay x265 10bit Tigole).mkv",
"Desperado (1995) (1080p BluRay x265 10bit Tigole).mkv",
"Nineteen Eighty-Four 1984 Criterion 1080p BluRay 10bit AAC 1.0 x265-Tigole",
"2010.1984.1080p.BluRay.x265.10bit.Tigole",
"Gran Turismo (2023) (2160p BluRay x265 10bit HDR Tigole).mkv",
"Pirates of the Caribbean - The Curse of the Black Pearl 2003 REPACK 1080p BluRay x265 HEVC 10bit AAC 5.1-Tigole QxR",
"Hot Tub Time Machine 2010 Unrated 1080p Bluray x265 HEVC 10bit AAC 5 1 Tigole",
"Corsage 2022 1080p BluRay AAC 5.1 x265-Tigole QxR",
"Everything Everywhere All at Once (2022) 2160p BluRay x265 HEVC 10bit HDR AAC 7 1 Tigole-QxR",
"Argo (2012) Extended (1080p BluRay x265 SDR AAC 5.1 English - Tigole QxR)",
"The Holdovers (2023) (1080p BluRay x265 SDR AAC 5.1 English - Tigole QxR)",
"Mission - Impossible - Fallout (2018) IMAX (1080p BluRay x265 SDR AAC 7.1 English - Tigole QxR)",
"Aguirre the Wrath of God (1972) WHC Edition 1080p BluRay x265 10bit AAC 1.0 ENG+GER Tigole QxR",
"Y Tu Mam Tambi n (2001) Criterion (1080p x265 10bit Tigole)",
"A Bug's Life (1998) (2160p UHD BluRay x265 HDR AAC 7.1 English - Tigole QxR)",
"1408 (2007) Director's Cut (1080p BluRay x265 SDR AAC 5.1 English - Tigole QxR)",
"A Fistful of Dollars (1964) (1080p BluRay x265 SDR AAC 5.1 English - Tigole QxR)",
"A Taxi Driver (2017) (1080p BluRay x265 SDR AAC 5.1 Korean - Tigole QxR)",
"A Ghost Story (2017) (1080p BluRay x265 SDR AAC 5.1 English - Tigole QxR)",
"Around the World in 80 Days (2004) (1080p BluRay x265 SDR AAC 6.1 English - Tigole QxR)",
"A Good Marriage (1982) (1080p BluRay x265 SDR AAC 1.0 French - Tigole QxR)",
"A Prophet (2009) (1080p BluRay x265 SDR AAC 5.1 French - Tigole QxR)",
"A Pigeon Sat on a Branch Reflecting on Existence (2014) (1080p BluRay x265 SDR AAC 5.1 Swedish - Tigole QxR)",
"A Man for All Seasons (1966) (1080p BluRay x265 SDR AAC 5.1 English - Tigole QxR)",
"Bill & Ted's Excellent Adventure (1989) (1080p RM4K BluRay x265 SDR AAC 2.0 English - Tigole QxR)",
"Nick and Norah's Infinite Playlist (2008) (1080p BluRay x265 SDR AAC 5.1 English - Tigole QxR)",
"Iron Sky (2012) Director's Cut (1080p BluRay x265 SDR AAC 5.1 English - Tigole QxR)",
"Aladdin 1992 Diamond Edition 1080p BluRay x265 HEVC 10bit AAC 7 1 English French Spanish FreetheFish-QxR",
"Jersey Girl (1992) (1080p BluRay x265 HEVC 10bit AAC 5.1 FreetheFish) [QxR]",
"American History X (1998) (1080p BluRay x265 FreetheFish).mkv",
"That '70s Show S01-S08 COMPLETE + Extras 1080p BluRay AAC 5.1 x265-FreetheFish [QxR]",
"Annie (1982) (1080p BluRay x265 FreetheFish)",
"Apollo.13.1995.1080p.BluRay.x265.FreetheFish",
"Game of Thrones (2010) S00E01 (1080p HDTV x265 SDR DD 2.0 English - FreetheFish QxR)",
"Flubber (1997) (1080p WEBRip x265 SDR DDP 5.1 English - FreetheFish QxR)",
"The Breakfast Club (1985) Criterion (1080p BluRay x265 SDR AAC 5.1 English - FreetheFish QxR)",
"A Christmas Story (1983) (1080p BluRay x265 SDR AAC 1.0 English - FreetheFish QxR)",
"How the Grinch Stole Christmas! (1966) (1080p BluRay x265 SDR AAC 2.0 English - FreetheFish QxR)",
"The Nightmare Before Christmas (1993) (1080p BluRay x265 SDR AAC 7.1 English - FreetheFish QxR)",
"American History X (1998) (1080p BluRay x265 SDR AAC 7.1 English - FreetheFish QxR)",
"The Hunchback of Notre Dame (1996) (1080p BluRay x265 SDR AAC 5.1 English - FreetheFish QxR)",
"Bodied (2018) (1080p DS4K RED WEB-DL x265 SDR AAC 5.1 English - FreetheFish QxR)",
"Arthur and the Invisibles (2006) (1080p BluRay x265 SDR AAC 5.1 English - FreetheFish QxR)",
"The Adventures of Tintin (2011) (1080p BluRay x265 HEVC 10bit EAC3 7.1 SAMPA) [QxR]",
"Heat 1995 2160p BluRay HDR DTS 7.1 x265-SAMPA",
"Dragon Ball Z Broly - The Legendary Super Saiyan 1993 1080p BluRay x265 HEVC 10bit MLPFBA 5.1-SAMPA",
"The.Accountant.2016.1080p.BluRay.x265.SAMPA",
"Casino Royale (2006) (2160p BluRay x265 HEVC 10bit HDR DTS 5.1 SAMPA).mkv",
"Fast.X.2023.1080p.MA.WEB-DL.x265.HEVC.10bit.EAC3.5.1.SAMPA",
"Captain America - Civil War (2016) IMAX (1080p BluRay x265 SDR DDP 7.1 English - SAMPA QxR)",
"Ad Astra (2019) (2160p UHD BluRay x265 HDR TrueHD Atmos 7.1 English - SAMPA QxR)",
"Alita - Battle Angel (2019) Open Matte (1080p WEB-DL Hybrid x265 SDR DDP 7.1 English - SAMPA QxR)",
"The Adventures of Tintin (2011) (1080p BluRay x265 SDR DDP 7.1 English - SAMPA QxR)",
"The Killer (1989) (1080p BluRay x265 SDR DDP 5.1 DUAL - SAMPA QxR)",
"The Assassin (2015) (1080p BluRay x265 SDR DD 5.1 Mandarin - SAMPA QxR)",
"The Incredible Hulk (2008) (1080p BluRay x265 SDR DDP 7.1 English - SAMPA QxR)",
"The Living Daylights (1987) (1080p BluRay x265 SDR DTS 5.1 English - SAMPA QxR)",
"Bumblebee (2018) (2160p UHD BluRay x265 HDR TrueHD Atmos 7.1 English - SAMPA QxR)",
"The Edge of Heaven (2007) (1080p AMZN WEB-DL x265 afm72)",
"The Big Shave (1967) Criterion (1080p BluRay x265 SDR AAC 1.0 English - afm72 QxR)",
"Billy's Balloon (1998) 1080p BluRay x265 SDR AAC 2.0 English-afm72",
"Broken Embraces AKA Los abrazos rotos 2009 1080p BluRay x265 HEVC 10bit AAC 5 1 Spanish-afm72",
"The Borgias (2011) Season 2 S02 + Extras (1080p BluRay x265 HEVC 10bit AAC 5 1 afm72)",
"Blade Runner 1982 The Final Cut + Extras (1080p BluRay HDR x265 HEVC 10bit AAC 7.1 afm72)",
"TPB.AFK.The.Pirate.Bay.Away.from.Keyboard.2013.1080p.WEB-DL.x265.HEVC.10bit.AAC.2.0.afm72",
"Submarine (2010) (1080p BluRay x265 HEVC 10bit AAC 5.1 afm72) [QxR].mkv",
"World of Tomorrow The First Three Episodes 2015 1080p BluRay x265 HEVC 10bit AAC 2 0 afm72-QxR",
"3:10 to Yuma (2007) (1080p BluRay x265 SDR AAC 7.1 English - afm72 QxR)",
"Premium Rush (2012) (1080p BluRay x265 SDR AAC 5.1 English - afm72 QxR)",
"Forrest Gump (1994) (1080p BluRay x265 SDR AAC 7.1 English - afm72 QxR)",
"21 Grams (2003) (1080p BluRay x265 SDR AAC 5.1 English - afm72 QxR)",
"Dog Day Afternoon (1975) (1080p BluRay x265 SDR AAC 1.0 English - afm72 QxR)",
"Bicycle Thieves (1948) Arrow (1080p BluRay x265 SDR AAC 1.0 Italian - afm72 QxR)",
"Bringing Up Baby (1938) Criterion (1080p BluRay x265 SDR AAC 1.0 English - afm72 QxR)",
"Definitely, Maybe (2008) (1080p BluRay x265 SDR AAC 5.1 English - afm72 QxR)",
"La Strada (1954) Criterion (1080p BluRay x265 SDR AAC 1.0 DUAL - afm72 QxR)",
"Ikiru (1952) Criterion (1080p BluRay x265 SDR AAC 1.0 Japanese - afm72 QxR)",
"Kes (1970) (1080p BluRay x265 SDR AAC 1.0 English - afm72 QxR)",
"Where Is My Friend's House? (1987) Criterion (1080p BluRay x265 SDR AAC 1.0 Persian - afm72 QxR)",
"Stalker (1979) (1080p BluRay x265 SDR AAC 2.0 Russian - afm72 QxR)",
"This.Is.Us.2016-S04E05-Storybook.Love.1080p.AMZN.WEB-DL.x265.Silence",
"Parks and Recreation (2009) S00E04 (1080p BluRay x265 SDR AAC 2.0 English - Silence QxR)",
"Columbo S01-13 1080p BluRay AC3 2 0 x265-Silence",
"A Discovery of Witches (2018) S02 (1080p x265 HEVC 10bit AAC 5 1 Silence)",
"3 Body Problem (2024) Season 1 S01 (1080p NF WEB-DL x265 HEVC 10bit EAC3 5.1 Silence) [QxR]",
"Loki (2023) S02 Season 2 COMPLETE 1080p 10bit DSNP WEBRip x265 HEVC Hindi DDP 5.1 English DDP 5.1 MSubs TheAvi Silence QxR",
"Anatomy of a Fall (2023) (1080p BluRay x265 SDR DDP 5.1 French - Silence QxR)",
"Brooklyn Nine-Nine (2013) S01-S08 (1080p BluRay x265 HEVC 10bit AAC 5 1 Silence) REPACK [QxR]",
"Cosmos A Spacetime Odyssey (2014) Season 1 S01 + Extras (1080p BluRay x265 HEVC 10bit AAC 5 1 Silence) QxR",
"You Can Count on Me 2000 1080p AMZN WEB-DL x265 HEVC 10bit AAC 5 1 Silence-QxR",
"The World at War (1973) Season 1 S01 (1080p BluRay x265 HEVC 10bit AAC 2.0 Silence) (QxR)",
"Stranger Things 2016 Season 2 S02 1080p BluRay x265 HEVC 10bit AAC 5.1 - Silence",
"Superstore (2015) S06 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - Silence QxR)",
"Sharp Objects (2018) S01 (1080p BluRay x265 SDR AAC 5.1 English - Silence QxR)",
"21 Up (1977) 1080p BluRay x265 SDR AAC 2.0 English -Silence",
"Parasite (2019) B&W Version (1080p BluRay x265 SDR AAC 5.1 Korean - Silence QxR)",
"She Said (2022) (1080p MA WEB-DL x265 SDR DDP 5.1 English - Silence QxR)",
"The Office (2005) S01 (1080p BluRay x265 SDR AAC 5.1 English - Silence QxR)",
"The Office (2005) S02 (1080p BluRay x265 SDR AAC 5.1 English - Silence QxR)",
"The Office (2005) S03 (1080p BluRay x265 SDR AAC 5.1 English - Silence QxR)",
"The Office (2005) S04 (1080p BluRay x265 SDR AAC 5.1 English - Silence QxR)",
"The Office (2005) S05 (1080p BluRay x265 SDR AAC 5.1 English - Silence QxR)",
"The Office (2005) S06 (1080p BluRay x265 SDR AAC 5.1 English - Silence QxR)",
"The Office (2005) S07 (1080p BluRay x265 SDR AAC 5.1 English - Silence QxR)",
"The Office (2005) S08 (1080p BluRay x265 SDR AAC 5.1 English - Silence QxR)",
"Badlands (1973) Criterion (1080p BluRay x265 r00t)",
"13 Assassins (2010) 1080p BluRay x265 SDR AAC 5.1 Japanese-r00t",
"The 400 Blows (1959) Criterion (1080p BluRay x265 SDR AAC 1.0 French - r00t QxR)",
"Good Night, and Good Luck. (2005) 1080p BluRay x265 SDR AAC 5.1 English-r00t",
"99 Homes (2014) + Extras (1080p BluRay x265 HEVC 10bit AAC 5 1 r00t)",
"Channel Zero 2016 S02 1080p AMZN WEB-DL x265 HEVC 10bit EAC3 6 0 r00t-QxR",
"Umbre (2014) Season 2 S02 (1080p HBO WEB-DL x265 HEVC 10bit AC3 5.1 Romanian r00t) [QxR]",
"A Face in the Crowd (1957) (1080p BluRay x265 SDR AAC 1.0 English - r00t QxR)",
"Anatomy of a Murder (1959) Criterion (1080p BluRay x265 SDR AAC 1.0 English - r00t QxR)",
"BASEketball (1998) (1080p BluRay x265 SDR AAC 5.1 English - r00t QxR)",
"Belle de Jour (1967) Criterion (1080p BluRay x265 SDR AAC 1.0 French - r00t QxR)",
"Blow-Up (1966) Criterion (1080p BluRay x265 SDR AAC 1.0 English - r00t QxR)",
"Chimes at Midnight (1965) Criterion (1080p BluRay x265 SDR AAC 1.0 English - r00t QxR)",
"High and Low (1963) Criterion (1080p BluRay x265 SDR AAC 4.0 Japanese - r00t QxR)",
"House (1977) Criterion (1080p BluRay x265 SDR AAC 1.0 Japanese - r00t QxR)",
"The Lady from Shanghai (1947) (1080p BluRay x265 SDR AAC 1.0 English - r00t QxR)",
"The 400 Blows (1959) Criterion (1080p BluRay x265 SDR AAC 1.0 French - r00t QxR)",
"Crash Landing on You (2019) S01 (1080p NF WEB-DL x265 SDR DDP 2.0 Korean - MONOLITH QxR)",
"3Below Tales of Arcadia (2018) Season 1-2 S01-S02 (1080p NF WEB-DL x265 HEVC 10bit AAC 5 1 MONOLITH)",
"Mr D (2012) S01-S08 Complete Series (1080p NF WEB-DL x265 HEVC 10bit AAC 5 1 MONOLITH) [QxR]",
"Sue.Thomas.F.B.Eye.2002-S03E13-False.Profit.480p.AMZN.WEB-DL.x265.MONOLITH",
"ER 1994 S12 1080p AMZN WEB-DL H.265 H.265 10bit DD+ 2.0-MONOLITH",
"3% (2011) Season 4 S04 (1080p NF WEBRip x265 HEVC 10bit EAC3 5.1 Portuguese MONOLITH) [QxR]",
"Sue Thomas F B Eye 2002 Season 1 3 S01 S03 480p AMZN WEB-DL x265 HEVC 10bit EAC3 2.0 MONOLITH-QxR",
"Last Week Tonight with John Oliver (2014) S01 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - MONOLITH QxR)",
"Last Week Tonight with John Oliver (2014) S02 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - MONOLITH QxR)",
"Last Week Tonight with John Oliver (2014) S03 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - MONOLITH QxR)",
"Last Week Tonight with John Oliver (2014) S04 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - MONOLITH QxR)",
"Last Week Tonight with John Oliver (2014) S05 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - MONOLITH QxR)",
"Last Week Tonight with John Oliver (2014) S06 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - MONOLITH QxR)",
"Last Week Tonight with John Oliver (2014) S07 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - MONOLITH QxR)",
"Last Week Tonight with John Oliver (2014) S08 (1080p HMAX WEB-DL x265 SDR DD 2.0 English - MONOLITH QxR)",
"How It's Made (2001) S24 (1080p WEB-DL x265 SDR AAC 2.0 English - MONOLITH QxR)",
"How It's Made (2001) S28 (1080p WEB-DL x265 SDR AAC 2.0 English - MONOLITH QxR)",
"The Birdcage (1996) 1080p BluRay x265 SDR AAC 5.1 English-Panda",
"Black Mirror (2011) S03 (1080p BluRay x265 SDR AAC 5.1 English - Panda QxR)",
"Dead Man's Shoes (2004) (1080p BluRay x265 HEVC 10bit AAC 5.1 Panda) [QxR]",
"What We Do in the Shadows (2014) (1080p BluRay x265 SDR AAC 5.1 English - Silence QxR)",
"Black Mirror (2011) S03 (1080p BluRay x265 SDR AAC 5.1 English - Panda QxR)",
"Black Mirror (2011) S04 (1080p BluRay x265 SDR AAC 5.1 English - Panda QxR)",
"Threads (1984) (1080p BluRay x265 SDR AAC 2.0 English - Panda QxR)",
"Bicentennial Man (1999) (1080p AMZN WEB-DL x265 SDR AAC 5.1 English - Panda QxR)",
"Blue Mountain State (2010) S01 (1080p BluRay x265 SDR AAC 5.1 English - Panda QxR)",
"Blue Mountain State (2010) S02 (1080p WEB-DL x265 SDR AAC 2.0 English - Panda QxR)",
"Blue Mountain State (2010) S03 (1080p WEB-DL x265 SDR AAC 2.0 English - Panda QxR)",
"Blue Mountain State - The Rise of Thadland (2016) (1080p BluRay x265 SDR AAC 5.1 English - Panda QxR)",
"Children of Men (2006) (1080p BluRay x265 SDR AAC 5.1 English - Panda QxR)",
"El embarcadero (2019) - S02E03 - Episodio 3 (1080p BluRay x265 Kappa)",
"Californication (2007) S01 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Alias Grace (2017) S01 (1080p NF WEBRip x265 HEVC 10bit AC3 5 1 Kappa)",
"Marvels Agents of S H I E L D (2013) S01-S07 (1080p BluRay x265 HEVC 10bit AAC 5 1 Ghost Kappa) [QxR]",
"Bloodlands.2021-S01E01-Episode.1.1080p.BluRay.x265.Kappa",
"Ballers 2015 S01 1080p BluRay x265 HEVC 10bit AAC 5.1-Kappa",
"Eastbound & Down (2009) Season 1 S01 + Extras (1080p BluRay x265 HEVC 10bit AAC 5.1 Kappa) [QxR]",
"ZeroZeroZero (2020) Season 1 S01 (1080p BluRay x265 HEVC 10bit AAC 5.1 Kappa)",
"Californication (2007) S01 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Californication (2007) S02 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Californication (2007) S03 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Californication (2007) S04 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Californication (2007) S05 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Californication (2007) S06 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Californication (2007) S07 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Chuck (2007) S01 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Chuck (2007) S02 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Chuck (2007) S03 (1080p BluRay x265 SDR AAC 5.1 English - Kappa QxR)",
"Over the Garden Wall (2014) S01 (1080p BluRay x265 SDR AAC 2.0 English - QxR)"
"His Dark Materials (2019) - S03E01 - The Enchanted Sleeper (1080p HMAX WEB-DL x265 t3nzin)",
"Tulsa.King.2022.S01E01.1080p.BluRay.x265.t3nzin",
"Acapulco (2021) S01 (1080p ATVP WEB-DL x265 SDR DDP Atmos 5.1 English - t3nzin QxR)",
"Euphoria (2019) S01 + Extras (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 5 1 t3nzin) [QxR]",
"The Problem With Jon Stewart 2021 Season 2 S02 1080p ATVP WEB-DL x265 HEVC 10bit AC3 5.1 t3nzin REPACK-QxR",
"Euphoria (2019) S00E01 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - t3nzin QxR)",
"Euphoria (2019) S00E02 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - t3nzin QxR)",
"Euphoria (2019) S01 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - t3nzin QxR)",
"Euphoria (2019) S02 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - t3nzin QxR)",
"House of the Dragon (2022) S01 (1080p BluRay x265 SDR DDP Atmos 5.1 English - t3nzin QxR)",
"Only Murders in the Building (2021) S02 (1080p DSNP WEB-DL x265 SDR DDP 5.1 English - t3nzin QxR)",
"Ted Lasso (2020) S02 (1080p ATVP WEB-DL x265 SDR DDP Atmos 5.1 English - t3nzin QxR)",
"Ted Lasso (2020) S00E07 (1080p ATVP WEB-DL x265 SDR DDP Atmos 5.1 English - t3nzin QxR)",
"Tiger King (2020) S01 (1080p NF WEB-DL x265 SDR DDP Atmos 5.1 English - t3nzin QxR)",
"Tiger King (2020) S02 (1080p NF WEB-DL x265 SDR DDP 5.1 English - t3nzin QxR)",
"Avatar.The.Last.Airbender.2005-S01E01-The.Boy.in.the.Iceberg.1080p.WEB-DL.x265.RCVR",
"Desperate Housewives (2004) S01 (1080p WEB-DL x265 SDR AAC 5.1 English - RCVR QxR)",
"Heartland S10 1080p NF WEB-DL DDP5 1 x264 1-RCVR",
"1000.Ways.To.Die-S04e06-Crying.Over.Spilled.Blood-[Amzn.Webdl-1080P.8Bit.X264][Eac3.2.0]-Rcvr",
"Mr Robot 2015 S01 + Extras 1080p BluRay x265 HEVC 10bit AAC 5.1 RCVR QxR",
"The Widow (2019) Season 1 S01 (1080p BluRay x265 HEVC 10bit AAC 5.1 RCVR) [QxR]",
"Gavin & Stacey (2007) S01 (1080p BluRay x265 SDR AAC 2.0 English - RCVR QxR)",
"Gavin & Stacey (2007) S02 (1080p BluRay x265 SDR AAC 2.0 English - RCVR QxR)",
"Gavin & Stacey (2007) S03 (1080p BluRay x265 SDR AAC 2.0 English - RCVR QxR)",
"South Park (1997) S01 (1080p BluRay x265 SDR AAC 5.1 English - RCVR QxR)",
"South Park (1997) S02 (1080p BluRay x265 SDR AAC 5.1 English - RCVR QxR)",
"South Park (1997) S03 (1080p BluRay x265 SDR AAC 5.1 English - RCVR QxR)",
"South Park (1997) S04 (1080p BluRay x265 SDR AAC 5.1 English - RCVR QxR)",
"South Park (1997) S05 (1080p BluRay x265 SDR AAC 5.1 English - RCVR QxR)",
"South Park (1997) S06 (1080p BluRay x265 SDR AAC 5.1 English - RCVR QxR)",
"South Park (1997) S07 (1080p BluRay x265 SDR AAC 5.1 English - RCVR QxR)"
"The Big Short (2015) (1080p BluRay x265 Natty)",
"Apur Sansar - The World of Apu (1959) Criterion (1080p BluRay x265 SDR AAC 2.0 Bengali - Natty QxR)",
"Gangs of Wasseypur 2012 Part 1 1080p BluRay x265 HEVC 10bit AAC 5.1 Hindi - Natty",
"Pitch Black (2000) (1080p BluRay x265 SDR AAC 5.1 English - Natty QxR)",
"Queen (2014) (1080p BluRay x265 SDR AAC 7.1 Hindi - Natty QxR)"
"Swades (2004) (1080p BluRay x265 SDR AAC 5.1 Hindi - Natty QxR)",
"You Dont Mess with the Zohan (2008) UNRATED (1080p BluRay x265 SDR AAC 5.1 English - Natty QxR)",
"Khakee (2004) (1080p BluRay x265 SDR AAC 2.0 Hindi - Natty QxR)",
"The Message (1976) (1080p BluRay x265 SDR AAC 5.1 English - Natty QxR)",
"The.Blacklist.2013.S01E01.Pilot.1080p.BluRay.x265-RZeroX",
"Tom.Clancys.Jack.Ryan.(2018)-S02E06-Persona.Non.Grata.(1080p.AMZN.WEB-DL.x265.RZeroX)",
"Battlestar Galactica (2003) S00 (Mixed Mixed x265 SDR AAC 5.1 English - RZeroX QxR)",
"Crazy.Ex-Girlfriend.2015-S01E01-Josh.Just.Happens.to.Live.Here.1080p.AMZN.WEB-DL.x265.RZeroX[Theft]",
"The Boys (2019) Season 1 S01 (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 5.1 RZeroX) [QxR]",
"Brooklyn Nine Nine (2013) Season 1 S01 (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 5.1 RZeroX)",
"Young Justice (2010) Season 3 S03 (1080p DCU WEB-DL x265 HEVC 10bit Mixed Mixed RZeroX) [QxR]",
"Monk (2002) S01 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - RZeroX QxR)",
"Monk (2002) S02 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - RZeroX QxR)",
"Monk (2002) S03 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - RZeroX QxR)",
"Monk (2002) S08 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - RZeroX QxR)",
"Monk (2002) S04 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - RZeroX QxR)",
"Monk (2002) S05 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - RZeroX QxR)",
"Monk (2002) S06 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - RZeroX QxR)",
"Monk (2002) S07 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - RZeroX QxR)",
"Wallace & Gromit - The Curse of the Were-Rabbit (2005) (1080p BluRay x265 SDR AAC 5.1 English - RZeroX QxR)",
"Gifted (2017) (1080p BluRay x265 SDR AAC 5.1 English - RZeroX QxR)",
"Before the Devil Knows You're Dead (2007) 1080p BluRay x265 SDR DDP 5.1 English-Bandi",
"Blue Is the Warmest Color (2013) (1080p BluRay x265 SDR AAC 5.1 French - Bandi QxR)",
"A Christmas Carol (2009) (1080p BluRay x265 SDR AAC 5.1 English - Bandi QxR)",
"Ricky Gervais Live 4: Science (2010) (1080p BluRay x265 SDR AAC 2.0 English - Bandi QxR)",
"City of God (2002) (1080p BluRay x265 SDR DDP 5.1 Portuguese - Bandi QxR)",
"The Platform (2019) (1080p BluRay x265 SDR DDP 5.1 DUAL - Bandi QxR)",
"Amores Perros (2000) (1080p BluRay x265 SDR DDP 5.1 Spanish - Bandi QxR)",
"Day of the Woman (1978) Uncut (1080p BluRay x265 SDR AAC 2.0 English - Bandi QxR)",
"Frida (2002) (1080p BluRay x265 SDR AAC 5.1 English - Bandi QxR)",
"Blue Is the Warmest Color (2013) (1080p BluRay x265 SDR AAC 5.1 French - Bandi QxR)",
"CODA (2021) (1080p DS4K ATVP WEB-DL x265 SDR DDP Atmos 5.1 English - Bandi QxR)",
"Liz and the Blue Bird (2018) (1080p BluRay x265 SDR AAC 5.1 DUAL - Bandi QxR)",
"Anne with an E (2017) - S01E01 - Your Will Shall Decide Your Destiny (1080p BluRay x265 Garshasp)",
"Grand Designs (1999) S04 576p DVD x265 SDR AAC 2.0 English-Garshasp",
"Planet of the Apes (1968) (1080p BluRay x265 SDR DDP 5.1 English - Garshasp QxR)",
"Grave of the Fireflies (1988) (1080p BluRay x265 HEVC 10bit EAC3 2 0 Japanese Garshasp) QxR",
"How It's Made (2001) S01-S32 (Mixed AMZN WEB-DL x265 HEVC 10bit EAC3 2 0 Garshasp) [QxR]",
"Louie (2010) S03 (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 5 1 Garshasp)",
"Bluey.2018-S02E02-Hammerbarn.1080p.DSNP.WEB-DL.x265.Garshasp",
"Titanic (1997) (1080p BluRay x265 SDR AAC 5.1 English - Garshasp QxR)",
"The Red Turtle (2016) (1080p BluRay x265 SDR DDP 5.1 English - Garshasp QxR)",
"Howl's Moving Castle (2004) (1080p BluRay x265 SDR DDP 5.1 DUAL - Garshasp QxR)",
"While You Were Sleeping (1995) (1080p BluRay x265 SDR DDP 5.1 English - Garshasp QxR)",
"From Up on Poppy Hill (2011) (1080p BluRay x265 SDR DDP 5.1 DUAL - Garshasp QxR)",
"The Wind Rises (2013) (1080p BluRay x265 SDR DDP 2.0 DUAL - Garshasp QxR)",
"Adventures of Tintin (1991) S01 (1080p BluRay x265 SDR DDP 5.1 DUAL - Garshasp QxR)",
"Adventures of Tintin (1991) S02 (1080p BluRay x265 SDR DDP 5.1 DUAL - Garshasp QxR)",
"Adventures of Tintin (1991) S03 (1080p BluRay x265 SDR DDP 5.1 DUAL - Garshasp QxR)",
"Planet of the Apes (1968) (1080p BluRay x265 SDR DDP 5.1 English - Garshasp QxR)",
"Gentleman Jack (2019) S01 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - Ghost QxR)",
"Gentleman Jack (2019) S02 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - Ghost QxR)",
"Tuca & Bertie (2019) S01 (1080p NF WEB-DL x265 SDR DDP 5.1 English - Ghost QxR)",
"Tuca & Bertie (2019) S02 (1080p HULU WEB-DL x265 SDR AAC 2.0 English - Ghost QxR)",
"Barry (2018) S01 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - Ghost QxR)",
"Barry (2018) S02 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - Ghost QxR)",
"Barry (2018) S03 (1080p HMAX WEB-DL x265 SDR DD 5.1 English - Ghost QxR)",
"Scooby-Doo, Where Are You! (1969) S01-S02 (1080p BluRay x265 SDR DD 2.0 English - Ghost QxR)",
"The Scooby-Doo Show (1976) S01-S03 (1080p Mixed x265 SDR Mixed 2.0 English - Ghost QxR)",
"What's New, Scooby-Doo? (2002) S01-S03 + Specials (1080p HMAX WEB-DL x265 SDR DD 2.0 English - Ghost QxR)",
"Peep Show (2003) S06 1080p AMZN WEB-DL x265 SDR AAC 2.0 English-Ghost",
"Godzilla x Kong The New Empire 2024 1080p AMZN WEB-DL x265 HEVC 10bit EAC3 Atmos 5 1 Ghost-QxR",
"X Men '97 (2024) Season 1 S01 (1080p DSNP WEB-DL x265 HEVC 10bit EAC3 Atmos 5.1 Ghost) [QxR]",
"The Twilight Zone (1959) S01 (1080p BluRay x265 SDR AAC 2.0 English - ImE QxR)",
"The Twilight Zone (1959) S02 (1080p BluRay x265 SDR AAC 2.0 English - ImE QxR)",
"The Twilight Zone (1959) S03 (1080p BluRay x265 SDR AAC 2.0 English - ImE QxR)",
"The Twilight Zone (1959) S04 (1080p BluRay x265 SDR AAC 2.0 English - ImE QxR)",
"The Twilight Zone (1959) S05 (1080p BluRay x265 SDR AAC 2.0 English - ImE QxR)",
"The West Wing (1999) S00 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - ImE QxR)",
"The West Wing (1999) S01 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - ImE QxR)",
"The West Wing (1999) S02 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - ImE QxR)",
"The West Wing (1999) S03 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - ImE QxR)",
"The West Wing (1999) S04 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - ImE QxR)",
"Static Shock (2000) Season 1 S01 (1080p HMAX WEB-DL x265 HEVC 10bit AC3 2.0 ImE) [QxR]",
"The.Sopranos.1999.S02E02.Do.Not.Resuscitate.1080p.BluRay.x265.ImE",
"Lilo & Stitch The Series (2003) - S02E17 - Morpholomew (1080p DSNP WEB-DL x265 ImE)",
"Law & Order Criminal Intent (2001) Season 5 S05 (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 5.1 ImE)",
"Law and Order Special Victims Unit (1999) - S20E19 - Dearly Beloved (1080p AMZN WEB-DL x265 ImE)"
"The Boondocks (2005) S01 (1080p HMAX WEB-DL x265 SDR DD 2.0 English - YOGI QxR)",
"The Boondocks (2005) S02 (1080p HMAX WEB-DL x265 SDR DD 2.0 English - YOGI QxR)",
"The Boondocks (2005) S03 (1080p HMAX WEB-DL x265 SDR DD 5.1 English - YOGI QxR)",
"The Boondocks (2005) S04 (1080p HMAX WEB-DL x265 SDR DD 5.1 English - YOGI QxR)",
"Star Wars - The Clone Wars (2008) S07 (1080p DSNP WEB-DL x265 SDR DDP 5.1 English - YOGI QxR)",
"A Goofy Movie (1995) (1080p BluRay x265 SDR DD 2.0 English - YOGI QxR)",
"Rush Hour (1998) (1080p BluRay x265 SDR DDP 7.1 English - YOGI QxR)",
"Rush Hour 3 (2007) (1080p BluRay x265 SDR DDP 7.1 English - YOGI QxR)",
"Rush Hour 2 (2001) (1080p BluRay x265 SDR DDP 5.1 English - YOGI QxR)",
"Rush Hour (2016) S01 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - YOGI QxR)",
"The VelociPastor (2018) (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - YOGI QxR)",
"Millennium (2010) S01 (1080p BluRay x265 SDR AAC 5.1 Swedish - LION QxR)",
"Constantine (2014) S01 (1080p BluRay x265 SDR AAC 5.1 English - Langbard QxR)"
]
bad_matches = [
"Futurama (1999) S06E18 The Silence of the Clamps (1080p BDRip x265 10bit AC3 5.1 - Goki)[TAoE]",
"Futurama (1999) S06E16 Ghost in the Machines (1080p BDRip x265 10bit AC3 5.1 - Goki)[TAoE]",
"Foundation (2021) S01E03 The Mathematicians Ghost (1080p ATVP Webrip x265 10bit EAC3 5 1 Atmos - Goki)[TAoE]",
"The.Silence.of.the.Lambs.1991.2160p.UHD.BluRay.DTS-HD.MA.5.1.DV.x265-W4NK3R",
"Blast of Silence (1961) 1080p CRIT WEB-DL H264 SDR AAC 1.0 English-KUCHU",
"Anal Brasil 19 (Fernando Marques, Sampasex) 2017 WEB-DL 720p",
"Silence.2016.720p.BluRay.x264.DD5.1-playHD",
"Total.War.WARHAMMER.II.The.Silence.and.The.Fury-EMPRESS",
"Dead.Silence.2007.BDRip.DD5.1.x264.RoSubbed-playSD",
"Quiet.on.Set.The.Dark.Side.of.Kids.TV.S01E05.Breaking.the.Silence.1080p.AMZN.WEB-DL.DDP2.0.H.264-FLUX",
"When.Calls.the.Heart.S01E03.A.Telling.Silence.1080p.AMZN.WEBRip.DDP.5.1.H.265.-iVy",
"Cone of Silence 1960 1080p BluRay REMUX AVC FLAC 2 0-EPSiLON",
"r00t-Frakmend-(KR006)-SiNGLE-WEB-FLAC-2022-HRDT",
"Ruthless (2023) 1080p AMZN WEB-DL H264 SDR DDP 5.1 English-chr00t",
"he Yogi Bear Show (1958) S01 (1080p HMAX Webrip x265 10bit AC3 2 0 - Goki)[TAoE]",
"Hey.There.It's.Yogi.Bear.1964.1080p.BluRay.FLAC2.0.x264-ShAnKs.mkv",
"The Yogi Bear Show S03 1080p HMAX WEB-DL DD2.0 H.264-PHOENiX",
"Yogi the Easter Bear (1994) DVD Rip",
"Acen-Monolith_Volume_One-(KF170PT1)-WEB-2023-BABAS",
"Cleora_Shephard-Swim-(HR161)-SINGLE-16BIT-WEB-FLAC-2020-MonolithsNitid",
"Monolith.2022.1080p.BluRay.Remux.AVC.DTS-HD.MA.5.1-CiNEPHiLES",
"Albatross.1996.1080p.AMZN.WEB-DL.DDP2.0.H.264-PandaMoon",
"Mister.Rogers.Neighborhood.S12E10.Pets.A.Visit.with.Real.Pandas.and.a.Birthday.Parade.AAC2.0.1080p.x264-PoF",
"Here.Is.Your.Life.1966.1080p.BluRay.FLAC1.0.x264-SADPANDA.mkv",
"Achile-Kappa-(G0100042797863)-SINGLE-16BIT-WEB-FLAC-2020-PacificatedLittleness",
"Kappa no ku to natsu yasumi [2007] 720p x264 Blu-Ray -CtrlHD",
"Big_Youth-Natty_Cultural_Dread-(TRLS123)-LP-1976-Gully",
"Der.Fluch.der.Natty.Knocks.2023.German.AC3.WEBRip.x264-ZeroTwo",
"natty.knocks.2023.1080p.bluray.x264-pignus.mkv",
"Black.Death.2010.1080p.Blu-ray.AVC.DTS-HD.MA.5.1-taterzero",
"Baby Bandito S01 WEBRip EAC3 5 1 1080p x265-iVy",
"Chronicles.of.The.Ghostly.tribe.2015.1080p.BluRay.x265.10bit.DTS-ADE",
"The.Ghost.And.Molly.McGee.S01E07.Mamas.Gotta.Hustle.AAC5.1.1080p.WEBRip.x265-PoF",
"Ghosts (2021) S03E10 1080p AMZN WEB-DL x265 SDR DDP 5.1 English-YELLO",
"PervCity Krissy Lynn Mariah Madisynn Krissy Lynn and Mariah Madisynn In A Thick Ass Threesome XXX 2013 1080p HEVC-GhostFreakXX",
"Time.2021.S01.DVDRip.AAC2.0.H.264-TABULARiA",
"Eden.Log.2007.1080p.BluRay.REMUX.AVC.DTS-HD.MA.5.1-ImenSane"
]
utr_good_matches = [
"The Spectacular Spider-Man - S01E06 - The Invisible Hand (1080p BDRip x265 HEVC 10bit AAC 5.1 RCVR) UTR",
"The.Spectacular.Spider-Man-S01E09-The.Uncertainty.Principle.1080p.BDRip.x265.HEVC.10bit.AAC.5.1.RCVR.[UTR]",
"Brigsby Bear (2017) (1080p BluRay x265 SDR AAC 5.1 English - Tigole UTR)",
"Risky Business (1983) (1080p BluRay x265 SDR AAC 5.1 English - FreetheFish UTR)",
"Labyrinth (1986) 30th Anniversary (1080p BluRay x265 SDR AAC 7.1 English - Tigole UTR)",
"Love Actually (2003) (1080p BluRay x265 SDR AAC 5.1 English - Tigole UTR)",
"The Simpsons (1989) S07 (480p DVD x265 SDR AAC 5.1 English - ImE UTR)",
"The Simpsons (1989) S14 (1080p BluRay x265 SDR AAC 5.1 English - ImE UTR)"
]
utr_bad_matches = [
"The.Outreau.Case.A.French.Nightmare.S01E01.The.Renard.Block.1080p.NF.WEB-DL.DDP5.1.H.264-NTb.mkv",
"The.Outreau.Case.A.French.Nightmare.S01.1080p.NF.WEB-DL.DDP5.1.H.264-NTb",
"Eva.Soda.Utroskab.med.den.første.kvinde.i.bilen.Sex.i.bilen.6462a7a8a5d9e.",
"Outrage.1950.1080p.BluRay.Flac.2.0.x265.HEVC-Nb8.mkv",
"Utro 1966 DANiSH 720p WEB-DL H 264 AAC2 0-TWA"
]
hone_good_matches = [
"Criminal.Minds-Suspect.Behavior.2011.S01E01.1080p.AMZN.WEB-DL.x265.SDR.DDP5.1.English-Yogi.HONE",
"The Bourne Supremacy (2004) Open Matte (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - Yogi HONE)",
"American Wedding (2003) Unrated (1080p BluRay x265 SDR DDP 5.1 English - Yogi HONE)"
]
hone_bad_matches = [
"ASIAN KUNG-FU GENERATION - BEST HIT AKG Official Bootleg “HONE” (2018) [Anthology] [FLAC 24bit Lossless / WEB]"
]
def qxr(debug_level=0):
# Get the custom formats for "QxR" from both Radarr and Sonarr
QxR_radarr = get_custom_format("QxR", "radarr", debug_level)
QxR_sonarr = get_custom_format("QxR", "sonarr", debug_level)
# Extract the regex values for both Radarr and Sonarr using get_regex
QxR_value_radarr = get_regex(QxR_radarr, "QxR", debug_level)
QxR_value_sonarr = get_regex(QxR_sonarr, "QxR", debug_level)
UTR_value_radarr = get_regex(QxR_radarr, "UTR (Title)", debug_level)
UTR_value_sonarr = get_regex(QxR_sonarr, "UTR (Title)", debug_level)
HONE_value_radarr = get_regex(QxR_radarr, "HONE", debug_level)
HONE_value_sonarr = get_regex(QxR_sonarr, "HONE", debug_level)
# Compare Radarr and Sonarr QxR regex values
if QxR_value_radarr != QxR_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {QxR_value_radarr}")
print(f"Sonarr regex: {QxR_value_sonarr}")
sys.exit(1)
if UTR_value_radarr != UTR_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {UTR_value_radarr}")
print(f"Sonarr regex: {UTR_value_sonarr}")
sys.exit(1)
if HONE_value_radarr != HONE_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {HONE_value_radarr}")
print(f"Sonarr regex: {HONE_value_sonarr}")
sys.exit(1)
if debug_level > 0:
print(f"\n{ORANGE}Testing with regex: {QxR_value_radarr}{RESET}")
print(f"{ORANGE}Testing with regex: {UTR_value_radarr}{RESET}")
print(f"{ORANGE}Testing with regex: {HONE_value_radarr}{RESET}\n")
# Replace the negative lookbehind with a negative lookahead
QxR_value_radarr = QxR_value_radarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
QxR_value_sonarr = QxR_value_sonarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
UTR_value_radarr = UTR_value_radarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
UTR_value_sonarr = UTR_value_sonarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
HONE_value_radarr = HONE_value_radarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
HONE_value_sonarr = HONE_value_sonarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
good_matches_passed = []
good_matches_failed = []
bad_matches_passed = []
bad_matches_failed = []
print("Checking good matches for release groups:")
# Test good matches
for release in good_matches:
if re.search(QxR_value_radarr, release, re.IGNORECASE):
good_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
else:
good_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
print("\nChecking bad matches for release groups:")
# Test bad matches
for release in bad_matches:
if re.search(QxR_value_radarr, release, re.IGNORECASE):
bad_matches_passed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
else:
bad_matches_failed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
print("\nChecking good matches for UTR release groups:")
# Test good matches
for release in utr_good_matches:
if re.search(UTR_value_radarr, release, re.IGNORECASE):
good_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
else:
good_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
print("\nChecking bad matches for UTR release groups:")
# Test bad matches
for release in utr_bad_matches:
if re.search(UTR_value_radarr, release, re.IGNORECASE):
bad_matches_passed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
else:
bad_matches_failed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
print("\nChecking good matches for HONE release groups:")
# Test good matches
for release in hone_good_matches:
if re.search(HONE_value_radarr, release, re.IGNORECASE):
good_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
else:
good_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
print("\nChecking bad matches for HONE release groups:")
# Test bad matches
for release in hone_bad_matches:
if re.search(HONE_value_radarr, release, re.IGNORECASE):
bad_matches_passed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
else:
bad_matches_failed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
print("\nFailed matches:")
for release in good_matches_failed + bad_matches_passed:
print(f" - {release}")
# Calculate stats
total_releases = len(good_matches) + len(bad_matches) + len(utr_good_matches) + len(utr_bad_matches) + len(hone_good_matches) + len(hone_bad_matches)
total_fails = len(good_matches_failed) + len(bad_matches_passed)
required_pass_rate = 99.8
actual_pass_rate = ((total_releases - total_fails) / total_releases) * 100
print("\nStats:")
print(f"Total releases: {total_releases}")
print(f"Total fails: {total_fails}")
print(f"Required pass rate: {required_pass_rate}%")
print(f"Actual pass rate: {actual_pass_rate:.2f}%")
if actual_pass_rate >= required_pass_rate:
return True
else:
return False

View File

@@ -1,88 +0,0 @@
from extract import get_custom_format, get_regex
import re
import sys
# ANSI escape codes for colors
GREEN = '\033[92m'
RED = '\033[91m'
RESET = '\033[0m'
good_matches = [
"Click.and.Collect.2018.1080p.AMZN.WEB-DL.DD+.2.0.H.264-Ralphy.mkv",
"While.We.Watched.2023.1080p.AMZN.WEB-DL.DD+.5.1.H.265-Ralphy.mkv",
"The.Office.US.S04E01E02.1080P.BluRay.DD.5.1.X265-RalphyP.mkv",
"Spotlight.2015.1080P.BluRay.DD.5.1.X265-Ralphy",
"The.Bourne.Supremacy.2004.1080p.BluRay.DD+.5.1.X265-Ralphy.mkv"
]
bad_matches = [
"None :)"
]
def Ralphy(debug_level=0):
# Get the custom formats for "Ralphy" from both Radarr and Sonarr
Ralphy_radarr = get_custom_format("Ralphy", "radarr", debug_level)
Ralphy_sonarr = get_custom_format("Ralphy", "sonarr", debug_level)
# Extract the regex values for both Radarr and Sonarr using get_regex
Ralphy_value_radarr = get_regex(Ralphy_radarr, "Ralphy", debug_level)
Ralphy_value_sonarr = get_regex(Ralphy_sonarr, "Ralphy", debug_level)
# Replace the negative lookbehind with a negative lookahead
Ralphy_value_radarr = Ralphy_value_radarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
Ralphy_value_sonarr = Ralphy_value_sonarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
if debug_level > 0:
print(f"Testing with regex: {Ralphy_value_radarr}")
# Compare Radarr and Sonarr Ralphy regex values
if Ralphy_value_radarr != Ralphy_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {Ralphy_value_radarr}")
print(f"Sonarr regex: {Ralphy_value_sonarr}")
sys.exit(1)
good_matches_passed = []
good_matches_failed = []
bad_matches_passed = []
bad_matches_failed = []
print("Checking good matches:")
# Test good matches
for release in good_matches:
if re.search(Ralphy_value_radarr, release, re.IGNORECASE):
good_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
else:
good_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
print("\nChecking bad matches:")
# Test bad matches
for release in bad_matches:
if re.search(Ralphy_value_radarr, release, re.IGNORECASE):
bad_matches_passed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
else:
bad_matches_failed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
print("\nFailed matches:")
for release in good_matches_failed + bad_matches_passed:
print(f" - {release}")
total_matches = len(good_matches) + len(bad_matches)
passed_matches = len(good_matches_passed) + len(bad_matches_failed)
success_rate = (passed_matches / total_matches) * 100
print("\nStats:")
print(f"Total: {total_matches}")
print(f"Bad: {len(bad_matches_passed) + len(good_matches_failed)}")
print(f"Rate: {success_rate:.2f}%")
if success_rate >= 99.8:
print("Test Passed")
return True
else:
print("Test Failed")
return False

View File

@@ -1,57 +0,0 @@
import sys
from roku import roku
from h265verify import h265
from qxr import qxr
from x265web import x265WEB
from taoe import taoe
from ralphy import Ralphy
from av1 import AV1
from sev import sev
from upscale import Upscaled
# ... import other test functions
# ANSI escape codes for colors
BLUE = '\033[94m'
GREEN = '\033[92m'
RED = '\033[91m'
YELLOW = '\033[93m'
RESET = '\033[0m'
def run_tests():
tests = [
("ROKU", roku),
("h265 Verified Groups", h265),
("QxR Groups", qxr),
("x265 (Web)", x265WEB),
("TAoE Groups", taoe),
("Ralphy", Ralphy),
("AV1", AV1),
("SEV", sev),
("Upscaled", Upscaled),
# ... add other test functions
]
for test_name, test_func in tests:
print(f"{BLUE}=============================================={RESET}")
print(f"{BLUE}Running test: {test_name}{RESET}")
print(f"{BLUE}=============================================={RESET}\n")
test_result = test_func(debug_level=1)
if test_result:
print()
print(f"{GREEN}=============================================={RESET}")
print(f"{GREEN}Passed Test: {test_name}{RESET}")
print(f"{GREEN}=============================================={RESET}\n")
continue
else:
print()
print(f"{RED}=============================================={RESET}")
print(f"{RED}Failed Test: {test_name}{RESET}")
print(f"{RED}=============================================={RESET}\n")
sys.exit(1)
if __name__ == "__main__":
run_tests()

View File

@@ -1,97 +0,0 @@
from extract import get_custom_format, get_regex
import re
import sys
# ANSI escape codes for colors
GREEN = '\033[92m'
RED = '\033[91m'
RESET = '\033[0m'
def roku(debug_level=0):
# Get the custom formats for "roku" from both Radarr and Sonarr
roku_radarr = get_custom_format("roku", "radarr", debug_level)
roku_sonarr = get_custom_format("roku", "sonarr", debug_level)
# Extract the regex values for both Radarr and Sonarr using get_regex
roku_value_radarr = get_regex(roku_radarr, "roku", debug_level)
roku_value_sonarr = get_regex(roku_sonarr, "roku", debug_level)
if debug_level > 0:
print(f"Testing with regex: {roku_value_radarr}")
# Compare Radarr and Sonarr Roku regex values
if roku_value_radarr != roku_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {roku_value_radarr}")
print(f"Sonarr regex: {roku_value_sonarr}")
sys.exit(1)
radarr_good_matches = [
"Weird The Al Yankovic Story 2022 1080p ROKU WEB-DL DD5.1 H.264-SMURF",
"The.Spiderwick.Chronicles.2024.S01E06.1028.Teeth.1080p.ROKU.WEB-DL.DD5.1.H.264-playWEB",
"The Imitation Game 2014 1080p ROKU WEB-DL AAC 2 0 H 264-PiRaTeS"
]
radarr_bad_matches = [
"Ikimono no kiroku 1955 720p BluRay FLAC x264-EA.mkv"
]
sonarr_good_matches = [
"The Now S01 1080p ROKU WEB-DL DD5 1 H 264-WELP",
"The Rockford Files S01 1080p ROKU WEB-DL HE-AAC 2 0 H 264-PiRaTeS",
"50.States.of.Fright.S02E05.13.Steps.to.Hell.Washington.Part.2.1080p.ROKU.WEB-DL.DD5.1.H.264-NTb"
]
sonarr_bad_matches = [
"Avatar.The.Last.Airbender.S01E08.Avatar.Roku.Winter.Solstice.2.1080p.AMZN.WEB-DL.DD+2.0.H.264-CtrlHD",
"[HorribleSubs] Rokujouma no Shinryakusha - 01 [480p]"
]
failed_good_matches = []
failed_bad_matches = []
# Print Radarr Good Matches
print("\nRadarr Releases:")
print("----------------")
print("Should Match:")
for term in radarr_good_matches:
if re.search(roku_value_radarr, term, re.IGNORECASE):
print(f" - {term}: {GREEN}Passed{RESET}")
else:
failed_good_matches.append(("Radarr", term))
print(f" - {term}: {RED}Failed{RESET}")
# Print Radarr Bad Matches
print("\nShould NOT Match:")
for term in radarr_bad_matches:
if not re.search(roku_value_radarr, term, re.IGNORECASE):
print(f" - {term}: {GREEN}Passed{RESET}")
else:
failed_bad_matches.append(("Radarr", term))
print(f" - {term}: {RED}Failed{RESET}")
# Print Sonarr Good Matches
print("\nSonarr Releases:")
print("----------------")
print("Should Match:")
for term in sonarr_good_matches:
if re.search(roku_value_sonarr, term, re.IGNORECASE):
print(f" - {term}: {GREEN}Passed{RESET}")
else:
failed_good_matches.append(("Sonarr", term))
print(f" - {term}: {RED}Failed{RESET}")
# Print Sonarr Bad Matches
print("\nShould NOT Match:")
for term in sonarr_bad_matches:
if not re.search(roku_value_sonarr, term, re.IGNORECASE):
print(f" - {term}: {GREEN}Passed{RESET}")
else:
failed_bad_matches.append(("Sonarr", term))
print(f" - {term}: {RED}Failed{RESET}")
# Determine and print overall test result
if not failed_good_matches and not failed_bad_matches:
return True
else:
return False

View File

@@ -1,108 +0,0 @@
from extract import get_custom_format, get_regex
import re
import sys
# ANSI escape codes for colors
GREEN = '\033[92m'
RED = '\033[91m'
BLUE = '\033[94m'
ORANGE = '\033[38;5;208m'
RESET = '\033[0m'
good_matches = [
"Narcos - S03.E02 - The Cali KGB 1080p BDRip x265 DTS-HD MA 5.1 Kira [SEV]",
"Invincible - Season - 02 [2023-2024] 1080p AMZN WebRip x265 DD+ 5.1 Kira [SEV]",
"The Hangover Part III 2013 1080p BluRay DTS-HD MA 5.1 x265-Kira",
"Aliens (1986) Special Edition Open Matte (1080p BluRay x265 SDR DTS-HD MA 5.1 English - Kira SEV)",
"Convicting A Murderer [2023] S01 1080p DW+ WebRip x265 AAC 2.0 Kira [SEV]",
"Titans S04 1080p BluRay AAC 5.1 x265-Kira SEV",
"Captain America : The First Avenger 2011 1080p BluRay TrueHD 7.1 Atmos x265-D0ct0rLew",
"Moon Knight S01 1080p UHD BluRay x265 10bit TrueHD Atmos 7.1 - D0ct0rLew SEV"
]
bad_matches = [
"Asp-Heavens_Seven-(AVCD-61385)-JP-CD-2024-DARKAUDiO",
"Sevana-Keep Going Chosen-Single-WEB-2024-PaB",
"Spencer.Ellsworth-Starfire.Shadow.Sun.Seven.The.Starfire.Trilogy.2.2017.RETAIL.EPUB.eBook-CTO"
]
def sev(debug_level=0):
# Get the custom formats for "sev" from both Radarr and Sonarr
sev_radarr = get_custom_format("sev", "radarr", debug_level)
sev_sonarr = get_custom_format("sev", "sonarr", debug_level)
# Extract the regex values for both Radarr and Sonarr using get_regex
sev_value_radarr = get_regex(sev_radarr, "sev", debug_level)
sev_value_sonarr = get_regex(sev_sonarr, "sev", debug_level)
# Extract the regex values for both Radarr and Sonarr using get_regex
UTR_value_radarr = get_regex(sev_radarr, "UTR", debug_level)
UTR_value_sonarr = get_regex(sev_sonarr, "UTR", debug_level)
# Replace the negative lookbehind with a negative lookahead
sev_value_radarr = sev_value_radarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
sev_value_sonarr = sev_value_sonarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
if debug_level > 0:
print(f"Testing with SEV regex: {ORANGE}{sev_value_radarr}{RESET}\n")
print(f"Testing with UTR regex: {ORANGE}{UTR_value_radarr}{RESET}\n")
# Compare Radarr and Sonarr sev regex values
if sev_value_radarr != sev_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {sev_value_radarr}")
print(f"Sonarr regex: {sev_value_sonarr}")
# Compare Radarr and Sonarr UTR regex values
if UTR_value_radarr != UTR_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {UTR_value_radarr}")
print(f"Sonarr regex: {UTR_value_sonarr}")
good_matches_passed = []
good_matches_failed = []
bad_matches_passed = []
bad_matches_failed = []
print("Checking good matches:")
# Test good matches
for release in good_matches:
if re.search(sev_value_radarr, release, re.IGNORECASE):
good_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
else:
good_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
print("\nChecking bad matches:")
# Test bad matches
for release in bad_matches:
if re.search(sev_value_radarr, release, re.IGNORECASE):
bad_matches_passed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
else:
bad_matches_failed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
print("\nFailed matches:")
if good_matches_failed or bad_matches_passed:
for release in good_matches_failed + bad_matches_passed:
print(f" - {release}")
else:
print(f"{GREEN}None, Great Job! :){RESET}")
total_matches = len(good_matches) + len(bad_matches)
passed_matches = len(good_matches_passed) + len(bad_matches_failed)
success_rate = (passed_matches / total_matches) * 100
print("\nStats:")
print(f"Total: {total_matches}")
print(f"Bad: {len(bad_matches_passed) + len(good_matches_failed)}")
print(f"Rate: {success_rate:.2f}%")
if success_rate >= 99.8:
return True
else:
return False

View File

@@ -1,362 +0,0 @@
from extract import get_custom_format, get_regex
import re
import sys
# ANSI escape codes for colors
GREEN = '\033[92m'
RED = '\033[91m'
BLUE = '\033[94m'
ORANGE = '\033[38;5;208m'
RESET = '\033[0m'
good_matches = [
"Black Sails 2014 S02 1080p BluRay x265 10bit DTS-HD MA 5.1 + DD 5.1-Goki TAoE",
"The.Orville.2017.S03E04.Gently.Falling.Rain.1080p.HULU.Webrip.x265.10bit.EAC3.5.1-Goki[TAoE]",
"Futurama S08E01 The Impossible Stream 1080p HULU WEBRip 10bit EAC3 5 1 x265 - Goki",
"Star Trek-Strange New Worlds-2022-S02-1080p BDRip x265 10bit DTS-HD MA 5.1-Goki-T",
"X-Men.97.2024.S01E03.Fire.Made.Flesh.REPACK.1080p.DSNP.Webrip.x265.10bit.EAC3.5.1.Atmos.GokiTAoE",
"Primal (2019) S02E03 (1080p HMAX WEB-DL x265 SDR DD 5.1 English - Goki TAoE)",
"Passengers.2016.2160p.HDR.BDRip.x265.10bit.AC3.5.1.Goki.TAoE",
"Rick and Morty S04 Extras 1080p BluRay DD2.0 x265-Goki",
"Gladiator.2000.Extended.2160p.HDR.BDRip.x265.10bit.AC3.5.1.Goki.TAoE",
"Monsters.at.Work.2021.S02E04.Opening.Doors.1080p.HULU.Webrip.x265.10bit.EAC3.5.1.GokiTAoE",
"American Dad (2005) S20E12 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - Goki TAoE)",
"The Big Bang Theory S12E01 The Conjugal Configuration 1080p Webrip x265 EAC3 5.1 Goki [SEV]",
"Star.Trek.Discovery.2017.S05E08.Labyrinths.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.GokiTAoE",
"The.Great.North.2021.S02E01.Brace.Off.Adventure.1080p.HULU.Webrip.x265.10bit.EAC3.5.1-Goki[TAoE]",
"Kung.Fu.Panda.4.2024.2160p.HDR10.DV.Hybrid.AMZN.Webrip.x265.10bit.EAC3.5.1.Atmos.Goki.TAoE",
"Family.Guy.S19E13.PeTerminator.1080p.HULU.Webrip.x265.10bit.EAC3.5.1-Goki",
"Koyaanisqatsi (1983) (1080p BDRip x265 10bit AC3 5 1 - Goki)[TAoE]",
"The Simpsons (1989) S35E17 The Tipping Point (1080p HULU Webrip x265 10bit EAC3 5 1 - Goki)[TAoE]",
"Bobs.Burgers.S03E01.Ear-Sy.Rider.1080p.AMZN.Webrip.x265.10bit.AC3.5.1.-.Goki",
"SpongeBob.SquarePants.1999.S14E01.Single.Celled.Defense.1080p.AMZN.Webrip.x265.10bit.EAC3.2.0.Frys.TAoE",
"SpongeBob.SquarePants.1999.S02E35-E36.Procrastination.and.Im.With.Stupid.1080p.AMZN.Webrip.x265.10bit.EAC3.2.0-Frys.[TAoE]",
"The New Scooby-Doo Movies S01-S02 1080p BluRay AAC x265 10bit-Frys",
"The Secret Squirrel Show (1966) S01-02+Specials (1080p DVDRip AI Upscale x265 10bit AC3 2 0 - Frys) [TAoE]",
"SpongeBob.SquarePants.1999.S00E04.Ugh.1080p.AMZN.Webrip.x265.10bit.EAC3.2.0-Frys.[TAoE]",
"Are You Afraid of the Dark (2019) S02 (1080p AMZN Webrip x265 10bit EAC3 2 0 - Frys) [TAoE]",
"The Grinch Grinches the Cat in the Hat (1982) (1080p AMZN Webrip x265 10bit EAC3 2 0 - Frys) [TAoE] mkv",
"SpongeBob SquarePants (1999) S14E06 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - Frys TAoE)",
"Atom.Ant.(1965).S01.(1080p.AMZN.Webrip.x265.10bit.EAC3.2.0.-.Frys).[TAoE]",
"The Dogfather (1974) S01 (1080p BluRay x265 SDR DD 2.0 English - Frys TAoE)",
"Scooby-Doo.Shaggys.Showdown.2017.1080p.AMZN.WEBRip.x265.10bit.EAC3.5.1-Frys.TAoE",
"Atom Ant (1965) S01E17 Bully For Atom Ant (1080p AMZN Webrip X265 10bit EAC3 2.0 - Frys) [TAoE]",
"Misterjaw (1976) S01 (1080p BluRay x265 SDR DTS-HD MA 2.0 English - Frys TAoE)",
"Roland and Rattfink (1968) S01 (1080p BluRay x265 SDR DTS-HD MA 2.0 English - Frys TAoE)",
"Curb.Your.Enthusiasm.2000.S06E05.The.Freak.Book.1080p.AMZN.Webrip.x265.10bit.EAC3.2.0-JBENT[TAoE]",
"For.All.Mankind.2019.S04E06.Leningrad.1080p.ATVP.Webrip.x265.10bit.EAC3.5.1.Atmos.English.JBENTTAoE",
"For.All.Mankind.2019.S04E07.Crossing.the.Line.1080p.ATVP.Webrip.x265.10bit.EAC3.5.1.Atmos.English.JBENTTAoE",
"Guardians.of.the.Galaxy.Vol.3.2023.1080p.BDRip.x265.10bit.TrueHD.7.1.Atmos.English.JBENT.TAoE",
"Mayans.M.C..(2018).S05.(1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.English.-.JBENT)[TAoE]",
"Meg.2.The.Trench.2023.1080p.MA.Webrip.x265.10bit.EAC3.5.1.Atmos.English.JBENT.TAoE",
"God.Is.a.Bullet.2023.Uncut.1080p.Webrip.x265.10bit.EAC3.5.1.English.JBENT.TAoE",
"Young.Sheldon.2017.S07E03.A.Strudel.and.a.Hot.American.Boy.Toy.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.English.JBENTTAoE",
"Young Sheldon (2017) S07E07 A Proper Wedding and Skeletons in the Closet (1080p AMZN Webrip x265 10bit EAC3 5 1 English - JBENT)[TAoE]",
"Sound.of.Freedom.2023.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.English.JBENT.TAoE",
"Young Sheldon-2017-S07E06 Baptists, Catholics and an Attempted Drowning-1080p AMZN Webrip x265 10bit EAC3 5.1 English-JBENT-TAoE",
"Scrubs (2001) S06 (1080p AIUS DVDRip x265 10bit AC3 5 1 English - JBENT)[TAoE]",
"Love.2016.S01E08.Closing.Title.Song.1080p.NF.Webrip.x265.10bit.AC3.5.1-JBENT[TAoE]",
"M3GAN.2022.Unrated.1080p.BDRip.x265.10bit.EAC3.7.1.English.JBENT.TAoE",
"For.All.Mankind.(2019).S02.(1080p.BDRip.x265.10bit.DTS-HD.MA.5.1.English.-.JBENT)[TAoE]",
"Curb Your Enthusiasm (2000) S06 (1080p AMZN WEB-DL x265 SDR DDP 2.0 English - JBENT TAoE)",
"Reno.911!.(2003).S03.REPACK.(1080p.AIUS.DVDRip.x265.10bit.AC3.2.0.English.-.JBENT)[TAoE]",
"Mayans.M.C.(2018).S03E01.Pap.Struggles.with.the.Death.Angel.REPACK.(1080p.AMZN.Webrip.x265.10bit.EAC3.5.1-JBENT) TAoE",
"Highlander (1986) Director's Cut REPACK (1080p BDRip x265 10bit AC3 5.1 - JBENT)[TAoE].mkv",
"Workaholics 2011 S03 1080p BluRay x265 10bit AC3 5.1 - JBENT TAoE",
"Younger 2015 S06 1080p AMZN Webrip x265 10bit EAC3 5.1 - JBENT TAoE",
"Shogun (2024) S01E03 Tomorrow is Tomorrow (1080p DSNP Webrip x265 10bit EAC3 5 1 - DNU)[TAoE]",
"Wonka.2023.1080p.DS4K.Webrip.x265.10bit.EAC3.5.1.Atmos.DNU.TAoE",
"Sexy.Beast.2024.S01E04.Always.Wanted.to.See.That.Place....1080p.DS4K.AMZN.Webrip.x265.10bit.EAC3.5.1.DNUTAoE",
"Halo.2022.S02E07.Thermopylae.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.DNUTAoE",
"Masters.of.the.Air.2024.S01E02.Part.Two.1080p.DS4K.ATVP.Webrip.x265.10bit.EAC3.5.1.Atmos.DNUTAoE",
"The Completely Made-Up Adventures of Dick Turpin (2024) S01 (1080p ATVP Webrip x265 10bit EAC3 5 1 Atmos - DNU)[TAoE]",
"Wish.2023.1080p.DS4K.Webrip.x265.10bit.EAC3.5.1.Atmos.DNU.TAoE",
"MotoGP S2024E94 Round 04 Gran Premio de España MotoGP Sprint Race 1080p Webrip x265 10bit AAC 2 0 - DNU",
"MotoGP S2024E111 Round 05 Grand Prix de France MotoGP Qualifying Nr. 2 1080p Webrip x265 10bit AAC 2 0 - DNU",
"The.Crown.2016.S06E03.Dis-Moi.Oui.1080p.NF.WEBRip.x265.10bit.EAC3.5.1-DNU.TAoE",
"Rebel Moon - Part Two The Scargiver (2024) (1080p NF Webrip x265 10bit EAC3 5.1 Atmos - DNU)[TAoE].mkv",
"Red.Eye.(2024).S01.(1080p.ITV.Webrip.x265.10bit.AAC.2.0.-.DNU)[TAoE]",
"MotoGP.S01E01.Grand.Prix.of.Qatar.Qualifying.1.1080p.Webrip.x265.10bit.AAC.2.0.DNU",
"The Completely Made-Up Adventures of Dick Turpin (2024) S01 (1080p ATVP WEB-DL x265 SDR DDP Atmos 5.1 English - DNU TAoE)",
"Aquaman.and.the.Lost.Kingdom.2023.1080p.DS4K.AMZN.Webrip.x265.10bit.EAC3.5.1.Atmos-DNU[TAoE].mkv",
"BMF (2021) S03E08 Code Red (1080p AMZN Webrip x265 10bit EAC3 5.1 - DNU)[TAoE].mkv",
"Trigger Point 2022 S02 1080p STAN WEBRip DD+ 5.1 x265-DNU TAoE",
"Fast X (2023) (1080p AMZN Webrip x265 10bit EAC3 5 1 English - Ainz)[TAoE]",
"Silo (2023) S01E02 (1080p Webrip x265 EAC3 5 1 English - Ainz)[TAoE]",
"Silo (2023) S01E05 (1080p Webrip x265 EAC3 5 1 English - Ainz)[TAoE]",
"Silo.2023.S01E07.1080p.ATVP.Webrip.x265.10bit.EAC3.5.1.English.AinzTAoE",
"Silo.2023.S01E08.1080p.ATVP.Webrip.x265.10bit.EAC3.5.1.English.AinzTAoE",
"Doctor.Strange.in.the.Multiverse.of.Madness.(2022).(1080p.Webrip.x265.10.bit.EAC3.5.1.-.Ainz)[TAoE]",
"The Outsider (2020) S01E02 Roanoke 1080p AMZN Webrip x265 10bit EAC3 5.1 - Ainz",
"Invasion.2021.S01E07.Hope.1080p.Webrip.x265.10bit.EAC3.5.1.Ainz.TAoE",
"Westworld (2016) S04E07 Metanoia (1080p HMAX Webrip x265 10 bit AC3 5 1 - Ainz)[TAoE]",
"The Outsider (2020) S01E04 A Wide Place in the Road 1080p AMZN Webrip x265 10bit EAC3 5.1 - Ainz",
"Invasion.2021.S01E08.Contact.1080p.Webrip.x265.10bit.EAC3.5.1.Ainz.TAoE",
"Clarksons.Farm.2021.S02E02.1080p.AMZN.Webrip.x265.10.bit.EAC3.5.1.English.AinzTAoE",
"The Winchesters (2022) S01E08 Hang on to Your Life (1080p AMZN Webrip x265 10bit EAC3 5 1 - Ainz) [TAoE]",
"The Legend of Vox Machina (2022) S02E04 Those Who Walk Away (1080p AMZN Webrip x265 10bit EAC3 5 1 - Ainz)[TAoE]",
"The.Legend.of.Vox.Machina.2019.S02E02.The.Trials.of.Vasselheim.1080p.Webrip.x265.10bit.EAC3.5.1.Ainz.TAoE",
"Reacher (2022) S01 (1080p ANZM Webrip x265 10bit EAC3 5 1 - TheSickle)[TAoE]",
"Encanto.2021.1080p.BDRip.x265.10bit.AC3.5.1.TheSickle.TAoE",
"The Hobbit - The Battle of the Five Armies (2014) EE (1080p BDRip x265 10bit AC3 5 1 - TheSickle)[TAoE] mkv",
"Vikings.2013.S03E01.Mercenary.1080p.BDRip.x265.10bit.AC3.5.1.TheSickleTAoE",
"Luca.2021.1080p.BDRip.x265.10bit.AC3.5.1.TheSickle.TAoE",
"Truth Seekers (2020) S01 (1080p AMZN WEB-DL x265 SDR DDP 5.1 English - TheSickle TAoE)",
"Lara Croft - Tomb Raider (2001) (1080p BluRay x265 SDR DD 5.1 English - TheSickle TAoE)",
"Lost in Space (2018) S03 (1080p NF WEB-DL x265 SDR DDP 5.1 English - TheSickle TAoE)",
"Lost in Space (2018) S02 (1080p NF WEB-DL x265 SDR DDP 5.1 English - TheSickle TAoE)",
"Tomb Raider (2018) (1080p BluRay x265 SDR DD 5.0 English - TheSickle TAoE)",
"The Flash (2023) (1080p DS4K MA Webrip x265 10bit EAC3 5 1 Atmos English - ANONAZ)[TAoE]",
"The.Boogeyman.2023.1080p.DS4K.MA.Webrip.x265.10bit.EAC3.5.1.Atmos.English.ANONAZ.TAoE",
"Ant-Man.and.the.Wasp.Quantumania.2023.4Kto1080p.MA.Webrip.x265.10bit.EAC3.5.1.Atmos.ANONAZ.TAoE",
"Jawan (2023) (1080p DS4K NF Webrip x265 10bit EAC3 5 1 Hindi - ANONAZ)[TAoE]",
"Retribution (2023) (1080p DS4K AMZN WEB-DL x265 SDR DDP Atmos 5.1 English - ANONAZ TAoE)",
"Aar Ya Paar (2022) S01E04 1080p WEB-DL x265 SDR DDP Atmos 5.1 Hindi-ANONAZ",
"Kohrra.2023.S01E02.Episode.2.1080p.NF.Webrip.x265.10bit.EAC3.5.1.Atmos.Multi.ANONAZTAoE",
"Jehanabad - Of Love & War (2023) S01E04 1080p DS4K WEB-DL x265 SDR DDP Atmos 5.1 Hindi-ANONAZ",
"The Night Manager (2023) S01 (1080p DS4K DSNP WEB-DL x265 SDR DDP Atmos 5.1 Multi - ANONAZ TAoE)",
"The Abyss (1989) Special Edition (1080p DS4K AMZN Webrip x265 10bit EAC3 5.1 Atmos English - ANONAZ)[TAoE].mkv",
"Police Academy The Complete Collection (1984) (1080p BDRip x265 10bit EAC3 1 0 - Species180) [TAoE]",
"Lexx (1997) S01 (1080p DVDRip x265 10bit AIUS PCM 2 0 - Species180) [TAoE]",
"X-Men Collection (1080p BDRip x265 10bit DTS 7 1 - Species180) [TAoE]",
"Superman - The Animated Series (1996) S01-S04 (1080p BDRip x265 10bit DTS-HD MA 2 0 - Species180) [TAoE]",
"Goodnight.Sweetheart.1993.S03E01.Between.The.Devil.And.The.Deep.Blue.Sea.1080p.AIUS.DVDRip.x265.10bit.AC3.2.0.Species180.TAoE",
"Lucifer (2015) S06 (1080p BDRip x265 10bit DTS 5 1 - Species180) [TAoE]",
"Lucifer (2015) S01 (1080p BDRip x265 10bit DTS 5 1 - Species180) [TAoE]",
"seaQuest.DSV.1993.S03E11.Brainlock.1080p.BDRip.x265.10bit.PCM.2.0.Species180.TAoE",
"Dark Matter (2015) S01 (1080p BluRay x265 SDR DDP 5.1 English - Species180 TAoE)",
"The Big Bang Theory (2007) S11 (1080p BluRay x265 SDR DTS-HD MA 5.1 English - Species180 TAoE)",
"The.Lord.of.the.Rings.The.Two.Towers.2002.Extended.1080p.BDRip.x265.10bit.EAC3.5.1-r0b0t.[TAoE]",
"The Lord of the Rings The Fellowship of the Ring (2001) Extended (1080p BDRip x265 10bit EAC3 5 1 - r0b0t) [TAoE]",
"The Lord of the Rings The Return of the King (2003) Extended (1080p BDRip x265 10bit EAC3 5 1 - r0b0t) [TAoE]",
"Jackass.3D.2010.Unrated.1080p.BDRip.x265.10bit.EAC3.5.1.r0b0t.TAoE",
"Megamind.2010.1080p.BDRip.x265.10bit.TrueHD.7.1.r0b0t",
"The.Man.with.the.Iron.Fists.2.2015.Unrated.1080p.BDRip.x265.10bit.DTS-HD.MA.5.1-r0b0t.[TAoE]",
"Promising Young Woman (2020) (1080p BDRip x265 10bit AC3 5 1 - r0b0t) [TAoE] mkv",
"Soul (2020) (1080p BDRip x265 10bit AC3 5 1 - r0b0t) [TAoE] mkv",
"Hocus.Pocus..1993...2160p.HDR.BDRip.x265.10bit.DTS-HD.MA.5.1.+.AC3.5.1.r0b0t...TAoE.",
"Skylines (2020) (1080p BDRip x265 10bit AC3 5 1 - r0b0t) [TAoE] mkv",
"Robot.Chicken.S00E26.720p.AMZN.WEB-DL.DDP2.0.H.264-R0B0T",
"Child's Play 2 (1990) (1080p BluRay x265 SDR DD 2.0 English - r0b0t TAoE)",
"Game.of.Thrones.2011.S05E05.2160p.HDR.BDRip.x265.10bit.AC3.5.1-xtrem3x.[TAoE]",
"House of 1000 Corpses 2003 1080p BDRip x265 10bit DTS-HD HRA 7.1 xtrem3x TAoE",
"Home Alone 2 Lost in New York (1992) (1080p BDRip x265 10bit EAC3 5 1 - xtrem3x) [TAoE]",
"Gamer (2009) Extended Cut (1080p BDRip x265 10bit EAC3 5 1 - xtrem3x) [TAoE]",
"Tenet (2020) IMAX (2160p HDR BDRip x265 10bit AC3 5 1 - xtrem3x) [TAoE]",
"Game.Of.Thrones.2011.S05e02.2160P.Hdr.Bdrip.X265.10Bit.Truehd.7.1.Atmos-Xtrem3x.[Taoe]",
"The Recruit (2003) (1080p BDRip x265 10bit DTS-HD MA 5 1 - xtrem3x) [TAoE]",
"Game.Of.Thrones.2011.S02e03.2160P.Hdr.Bdrip.X265.10Bit.Truehd.7.1.Atmos-Xtrem3x.[Taoe]",
"Jay And Silent Bob Strike Back (2001) (1080p BluRay x265 SDR DDP 5.1 English - xtrem3x TAoE)",
"Spartacus Blood And Sand (2010) S01 (1080p BluRay x265 SDR TrueHD 5.1 English - xtrem3x TAoE)",
"Bad Santa (2003) UNRATED (1080p BDRip x265 10bit EAC3 5.1 - xtrem3x) [TAoE].mkv",
"REQ at NZBSRUS.com - xtrem3x",
"Marvels Ant-Man (2017) S01 (1080p DSNP Webrip x265 10bit EAC3 5 1 - HxD) [TAoE]",
"Dynasty.2017.S01E01.I.Hardly.Recognized.You.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.HxD.TAoE",
"Memorist - 1x01 (1080p WEBRip HEVC HxD)",
"50 States of Fright (2020) S01 (1080p QUIBI WEB-DL x265 SDR AAC 2.0 English - HxD TAoE)",
"365 - Repeat the Year (2020) S01 (1080p Webrip KOREAN x265 10bit AAC 2 0 - HxD) [TAoE]",
"After Life (2019) S01 (1080p NF Webrip x265 10bit EAC3 5 1 - HxD) [TAoE]",
"Buffaloed (2020) (1080p BDRip x265 10bit TrueHD 5 1 - HxD) [TAoE] mkv",
"Pixar In Real Life (2019) S01E10 WALL·E - BnL Pop-up Shop (1080p DSNYP Webrip x265 10bit AAC 2 0 - HxD) [TAoE] mkv",
"The.Tom.and.Jerry.Show.2014.S02E05.Squeaky.Clean.1080p.VRV.WEB-DL.x265.10bit.AAC.2.0-HxD.[TAoE]",
"The Tom and Jerry Show (2014) S02E10 Cheesy Ball Run (1080p VRV WEB-DL x265 10bit AAC 2.0 - HxD) [TAoE]",
"Alex Rider 2020 S01 1080p AMZN Webrip x265 10bit EAC3 5.1 - HxD TAoE",
"Mr Sunshine S01 1080p AMZN WEBRip DD+ 5.1 x265-HxD",
"365.Repeat.the.Year.2020.S01E01.I.Just.Want.to.Go.Back.to.How.Things.Were.Before.1080p.Webrip.x265.10bit.AAC.2.0.HxD.TAoE",
"Breeders.2020.S01E01.No.Sleep.1080p.AMZN.WEB-DL.x265.HEVC.10bit.EAC3.5.1.HxD",
"Miracle.Workers.2019.S01E05.3.Days.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.HxDTAoE",
"Ip.Man.Kung.Fu.Master.2019.1080p.BluRay.REMUX.AVC.DTS-HD.MA.5.1-HxD.mkv",
"Total Drama 2007 S01E27 Total Drama Drama Drama Drama Island PAL DVD DD2.0 MPEG-2 REMUX-HxD",
"Snowden.2016.1080p.BDRip.x265.10bit.AC-3.5.1-ArcX.TAoE",
"Blonde (2022) (1080p NF WEB-DL x265 SDR DDP Atmos 5.1 English ArcX TAoE)",
"Spirited (2022) 1080p WED-DL x265 SDR DDP 5.1 English ArcX-TAoE",
"Batwoman (2019) S03E01 Mad As a Hatter (1080p AMZN Webrip x265 10bit EAC3 5 1 - ArcX)[TAoE]",
"The Boys (2019) S01 (1080p BDRip x265 10bit AC3 5 1 - ArcX)[TAoE]",
"Batwoman.2019.S02E14.And.Justice.For.All.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1-ArcX[TAoE]",
"Dickie.Roberts.Former.Child.Star.2003.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.ArcX.TAoE",
"Austin.Powers.The.Spy.Who.Shagged.Me.1999.1080p.BDRip.x265.10bit.TrueHD.5.1.ArcX.TAoE",
"Things Heard And Seen (2021) (1080p Webrip x265 10bit EAC3 5.1 - ArcX)[TAoE]",
"Batwoman.2019.S03E06.How.Does.Your.Garden.Grow.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.ArcXTAoE",
"The.Woman.King.2022.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.ArcX.TAoE",
"Chernobyl (2019) S01E04 The Happiness of All Mankind (1080p BDRip x265 10bit DTS-HD MA 5.1 - WEM) TAoE",
"Deadmau5_and_Billy_Newton_Davis-Outta_My_Life_(PD4003)-WEB-2007-WEM",
"3000 Miles to Graceland (2001) (1080p x265 SDR DDP 5.1 English - WEM TAoE)",
"Chivalry (2022) S01 1080p ALL4 WEB-DL H264 AAC 2.0 English-WEM",
"The Split (2018) S01 1080p BBC WEB-DL H264 AAC 2.0 English-WEM",
"Agatha Christie's Poirot (1989) S01 - S13 (1080p BDRip x265 10bit Mixed - WEM)[TAoE]",
"Shameless (2004) S11 (1080p NF Webrip x265 10bit EAC3 2 0 - WEM)[TAoE]",
"Charmed (1998) S01 (1080p BDRip x265 10bit FLAC 2.0 - WEM)[TAoE]",
"Chernobyl (2019) S01E01 1 - 23 - 45 (1080p BDRip x265 10bit DTS-HD MA 5.1 - WEM)[TAoE]",
"Alcatraz (2012) S01 (1080p BDRip x265 10bit AC3 5 1 - Nostradamus)[TAoE]",
"Supergirl (2015) S02 (1080p BDRip x265 10bit DTS-HD MA 5 1 - Nostradamus)[TAoE]",
"Strange Days (1995) 20th Anniversary Edition (1080p BDRip x265 10bit DTS-HD MA 5 1 - Nostradamus)[TAoE]",
"Aeon Flux (1991) S01-S03 (1080p AI Upscale x265 10bit EAC3 5 1 - Erie)[TAoE]",
"Bill & Ted's Bogus Journey (1991) (1080p BDRip x265 10bit DTS-HD MA 5 1 - Erie) [TAoE]",
"The Boys (2019) S02E02 Proper Preparation and Planning (1080p AMZN Webrip x265 10bit EAC3 5 1 - Erie) [TAoE] mkv",
"The New Mutants (2020) (1080p BDRip x265 10bit AC3 5 1 - Erie) [TAoE]",
"Wrath of the Titans (2012) (1080p BDRip x265 10bit EAC3 5 1 - DUHiT)[TAoE]",
"Emma (2020) (1080p BDRip x265 10bit EAC3 5 1 - DUHiT)[TAoE]",
"'71 (2014) (1080p BDRip x265 10bit EAC3 5 1 - DUHiT)[TAoE]",
"1408 (2007) (1080p BDRip x265 10bit EAC3 5 1 - DUHiT)[TAoE]",
"True Lies (1994) (1080p D-Theater Rip x265 10bit AC3 5 1 - jb2049) [TAoE]",
"A Fish Called Wanda (1988) Arrow 4K Remaster (1080p BDRip x265 10bit AC3 5 1 + DTS-HD MA 5 1 - jb2049) [TAoE]",
"Children of Dune (2003) S01 (1080p BDRip x265 10bit AC3 5 1 - jb2049) [TAoE]",
"Angels in the Outfield (1994) (1080p AMZN Webrip x265 10bit EAC3 5.1 - DrainedDay)[TAoE].mkv",
"Cabin Fever (2003) (1080p BluRay x265 SDR DD 5.1 English - DrainedDay TAoE)",
"Veronica Mars S04 1080p Bluray DD 5.1 H.265-DrainedDay[TAoE]",
"How.to.Get.Away.with.Murder.2014.S04E02.Im.Not.Her.1080p.AMZN.Webrip.x265.10bit.EAC3.5.1.DrainedDayTAoE",
"Life S01 1080p AMZN WEBRiP DD+ 5.1 H265-DrainedDay TAoE",
"DodgeBall A True Underdog Story (2004) (1080p BDRip x265 10bit AC3 5 1 - DrainedDay)[TAoE]",
"Veronica.Mars.(2004).S02E19.Nevermind.the.Buttocks.(1080p.AMZN.Webrip.x265.10bit.EAC3.2.0-DrainedDay) TAoE",
"Clean.with.Passion.for.Now.2018.S01E02.1080p.NF.Webrip.x265.10bit.EAC3.2.0.AJJMIN.TAoE",
"Fight.For.My.Way.2017.S01E01.1080p.BDRip.x265.10bit.AC3.2.0-AJJMIN.[TAoE]",
"Angel's Last Mission - Love (2019) S01 (1080p Webrip x265 10bit AAC 2 0 - AJJMIN) [TAoE]",
"Euphoria (2019) S02E04 You Who Cannot See, Think of Those Who Can (1080p HMAX Webrip x265 10bit AC3 5 1 - AJJMIN) [TAoE]",
"While You Were Sleeping (2017) S01 (1080p BDRip x265 10bit AC3 2 0 - AJJMIN) [TAoE]",
"Moonshine.2021.S01E16.1080p.Webrip.x265.10bit.AAC.2.0.AJJMIN.TAoE"
]
bad_matches = [
"ManyVids.2023.Mvngokitty.Homework.With.Stepmommy.XXX.720p.HEVC.x265.PRT[XvX]",
"ご近所物語 第01-07巻 [Gokinjo Monogatari vol 01-07]",
r"[Mazui]\_Gokicha!!\_Cockroach\_Girls\_-\_01\_[99E656EA]",
"[Nerieru-Scans] Gokiburi Buster [Translated (Nerieru-Scans)]",
"[Yuurisan-Subs] GokiMono S01 [DVD][MKV][h264][640x480][Vorbis 2.0][Softsubs (Yuurisan-Subs)]",
"Guru Guru Gokil (2020) [720p] [WEBRip] [YTS] [YIFY]",
"Gokicha.Cockroach.Girls.S01.WEBRip.AAC2.0.H.264-Mazui",
"frys.planet.word.720p.hdtv.x264-ftp",
"Fried Barry [2020] 1080p x264 Blu-Ray -TayTO",
"Small Fry [2011] 720p x264 Blu-Ray -VietHD",
"Stephen Frys 21st Century Firsts 2020 1080p HDTV H264-DARKFLiX",
"Cycling.2022.03.03.Bloeizone.Fryslan.Tour-Stage.1.720p.WEB-DL.AAC2.0.H.264-VCNTRSH",
"ried Green Tomatoes [1991] 1080p x264 Blu-Ray -decibeL",
"Full.Frys.S01.DVDRip.AAC2.0.x264-iFLiX",
"Magic.Numbers.Hannah.Frys.Mysterious.World.Of.Maths.S01E02.720p.iP.WEB-DL.AAC2.0.H.264-RTN",
"Timo_de_Frys_-_Ministry_of_Beats_(Decibel)-CABLE-06-27-2014-TALiON",
"Magic.Numbers.Hannah.Frys.Mysterious.World.of.Mathematics.S01E03.Weirder.and.Weirder.WEBRip.x264-ION10",
"Timo_de_Frys_-_Ministry_of_Beats_(Decibel)-CABLE-07-06-2012-TALiON",
"Kirsti Sparboe - Ikke Stå Og Frys - 46 Høydepunkter (1995) [Anthology] [FLAC Lossless / CD / Log (100%) / Cue]",
"@sendnudesx.OnlyFans.Siterip.PPV.540p.720p.1080p.WEB-DL.AAC2.0.H.264",
"Odnu-My.Own.Island-AB127-WEB-FLAC-2022-BABAS",
"DFN5l3 GeoolML8Q143dnU5ig",
"Lars Bedsted Gommesen - Endnu Levende-AUDiOBOOK-WEB-DK-2022-CRAViNGS iNT",
"Die.goettliche.Ordnung.2017.DUAL.COMPLETE.BLURAY-iFPD",
"Petr Muk - V Bludišti Dnů (2010) [Album] [FLAC Lossless / WEB]",
"Helena Vondráčková & Jiří Korn - Těch Pár Dnů (2007) [Compilation] [FLAC Lossless / WEB]",
"[REQ] Trainz.Railroad.Simulator.2006.Limited.Edition.DVD-RELOADED",
"Trainz.A.New.Era-SKIDROW",
"2 Chainz-Pretty Girls Like Trap Music-24BIT-WEB-FLAC-2017-TiMES",
"[Ainz Ooal Gown] Overlord II - 02 VOSTFR (1280x720 8bit AAC) [877B3BD8]",
"B.Traits_-_BBC_Radio1_(Guest_HXDB)-SAT-03-04-2013-TALiON",
"BRAGKEN_and_HXDI_Stross-Mzansi-(SNA104)-WEB-2022-PTC",
"[HxDOU] 魁拔之大战元泱界 / 魁拔2 / Kuiba 2 [1080p][无水印高画质下载版本首发,内详 / High quality / ENG SUB included]",
"3qrCzoNqHV5ugNH4eEArcxXGVYeJIi9AIe0M5NOFpki",
"Beyonce.Live.At.Wembley.2004.DVDRip.FLAC.x264-HANDJOB",
"Black.Box.Wem.kannst.du.vertrauen.2023.German.AC3.WEBRip.x264-ZeroTwo",
"Bring Me the Horizon: Live at Wembley 2015 BluRay 1080p DTS-HD MA 5.1 AVC REMUX-NOGROUP",
"WOR 2023 10 05: Dynamite and NXT, TBS issues, Wembley, Title Tuesday battle",
"Alberto_Ruiz-Nostradamus-(HEART050)-WEB-FLAC-2020-HRDT",
"Friends_Of_Nostradamus_-_Die_Macht_Des_Boesen-Vinyl-1999-NBD",
"Tosz.x.Alel-Life.Is.Just.A.Matter.Of.Time.(Alel.Remix)-(HTSLCTNS006)-SINGLE-16BIT-WEB-FLAC-2023-NostradamusCastable",
"Nostradamus Effect S01E02 Da Vincis Armageddon iNTERNAL 720p HDTV x264-SUiCiDAL",
"The.Lake.Erie.Murders.S02E04.720p.WEB.x264-57CHAN",
"Carpool Karaoke - The Series (2017) S01 (1080p ATVP WEB-DL H265 SDR DD 5.1 English - HONE)",
"A Series of Unfortunate Events (2017) S01 (1080p DS4K NF WEB-DL x265 SDR DDP 5.1 English - Ghost QxR)",
"The Daughters of Erietown by Connie Schultz EPUB"
]
def taoe(debug_level=0):
# Get the custom formats for "taoe" from both Radarr and Sonarr
taoe_radarr = get_custom_format("taoe", "radarr", debug_level)
taoe_sonarr = get_custom_format("taoe", "sonarr", debug_level)
# Extract the regex values for both Radarr and Sonarr using get_regex
taoe_value_radarr = get_regex(taoe_radarr, "taoe", debug_level)
taoe_value_sonarr = get_regex(taoe_sonarr, "taoe", debug_level)
# Replace the negative lookbehind with a negative lookahead
taoe_value_radarr = taoe_value_radarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
taoe_value_sonarr = taoe_value_sonarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
if debug_level > 0:
print(f"Testing with regex: {ORANGE}{taoe_value_radarr}{RESET}\n")
# Compare Radarr and Sonarr taoe regex values
if taoe_value_radarr != taoe_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {taoe_value_radarr}")
print(f"Sonarr regex: {taoe_value_sonarr}")
good_matches_passed = []
good_matches_failed = []
bad_matches_passed = []
bad_matches_failed = []
print("Checking good matches:")
# Test good matches
for release in good_matches:
if re.search(taoe_value_radarr, release, re.IGNORECASE):
good_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
else:
good_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
print("\nChecking bad matches:")
# Test bad matches
for release in bad_matches:
if re.search(taoe_value_radarr, release, re.IGNORECASE):
bad_matches_passed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
else:
bad_matches_failed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
print("\nFailed matches:")
if good_matches_failed or bad_matches_passed:
for release in good_matches_failed + bad_matches_passed:
print(f" - {release}")
else:
print(f"{GREEN}None, Great Job! :){RESET}")
total_matches = len(good_matches) + len(bad_matches)
passed_matches = len(good_matches_passed) + len(bad_matches_failed)
success_rate = (passed_matches / total_matches) * 100
print("\nStats:")
print(f"Total: {total_matches}")
print(f"Bad: {len(bad_matches_passed) + len(good_matches_failed)}")
print(f"Rate: {success_rate:.2f}%")
if success_rate >= 99.8:
return True
else:
return False

View File

@@ -1,124 +0,0 @@
from extract import get_custom_format, get_regex
import re
import sys
# ANSI escape codes for colors
GREEN = '\033[92m'
RED = '\033[91m'
ORANGE = '\033[38;5;208m'
RESET = '\033[0m'
good_matches = [
"The.Dukes.Of.Hazzard.Unrated.2005.2160p.Ai-Upscaled.10Bit.H265.DDP.5.1.RIFE.4.15-60fps-DirtyHippie",
"Scrubs.S05E09.My.Half-Acre.Upscale.Hybrid.1080p.WEBRip.DD5.1.H.264-DEADBADUGLY",
"[EG]Mobile Suit Gundam SEED 21 BD[HEVC DualAudio AI-Upscale]",
"Death.Proof.2007.2160p.Ai-Upscaled.10Bit.H265.TrueHD.5.1-DirtyHippie RIFE.4.14v2-60fps.mkv",
"Oi.Aparadektoi.S02E03.[FullHDAIUpscaled][Upload-Ft4U]",
"Cash.Out-I.maghi.del.furto.2024.UpScaled.2160p.H265.10.bit.DV.HDR10+.ita.eng.AC3.5.1.sub.ita.eng.Licdom",
"2012 (2009) UHD 4K Upscaled x264 AC3 Soup mkv",
"The Martian 2015 4K UHD UPSCALED-ETRG",
"WWE Smackdown 1999 S04 1080p (Upscaled) PEACOCK WEB-DL H 264 AAC 2 0",
"Venom 023 (2023) (Digital) (Li'l-Empire) (HD-Upscaled)",
"Natashas.Bondage.Sex.Vol.2.Upscaled",
"Star Trek: Deep Space Nine S01 AI Upscale 2160p DVD AAC 2.0 H.263",
"Star.Trek.Raumschiff.Voyager.S05E13.Schwere.German.AC3D.DL.1080p.DVD.AI.REGRADED.x264-HQC",
"The.Marvels.(2023).[HDR.ReGrade].1080p.4K-WEBRip.[Hin-Eng].DDP.5.1.Atmos.—.PeruGuy",
"Terminator 3 Rise of the Machines 2003 2160p HDR UpsUHD x265 REGRADED REPACK-QfG",
"The Departed (2006) Regrade (2160p x265 HEVC 10bit HDR BluRay DTS-HD MA 6.1 Prof).mkv",
"The Matrix (1999) 1080p BluRay Regraded x264 TrueHD Atmos 7.1 [lvl99]",
"The.Last.Samurai.2003.2160p.x265.10bit.TrueHD.DTS.5.1[TheUpscaler].mkv",
"New.Jack.City.1991.2160p.x265.10bit.DTS HD.MA.5.1[TheUpscaler]",
"Bank Chor (2017) 720p UP SCALED DVDRip x264 AC3 ESub [DDR]",
"Transformers.2007.2160p.DV.HDR10Plus.Ai-Enhanced.H265.TrueHD.7.1.Atmos.MULTI.RIFE.4.15-60fps-DirtyHippie",
"Karakter (1997) - AI enhanced 4K",
"The.Farm-Angola,.USA.1998.480p.DVDRip.AI.Enhanced",
"Ugramm.2014.[Kannada+Hindi].1080p.Ai.Enhanced.[1",
"Soldiers Sortie 2006 AIEnhanced 1080p 50fps x265 10bit MP2-Enichi",
"No.Country.For.Old.Men.2007.2160P.Ai-Upscaled.10Bit.H265.DTS-HD.MA.5.1.RIFE.4.15-60fps-DirtyHippie",
"Oi.Aparadektoi.S01E10.91.[FullHDAIUpscaled][Upload-Ft4U]",
"Avatar.2009.Extended.UHD.Re-Grade.4000nit.2160p.HEVC.HDR.IVACHS.ENG.ExKinoRay",
"It's Always Sunny in Philadelphia (2005) S05 (1080p AIUS DVD Hybrid x265 SDR DD 5.1 English - JBENT TAoE) [REPACK] ",
"It's Always Sunny in Philadelphia (2005) S05E01 The Gang Exploits the Mortgage Crisis REPACK (1080p DVDRip AI Upscale x265 10bit AC3 5.1 - JBENT)[TAoE].mkv"
]
bad_matches = [
"The Scales of Providence [2008] KO Complete eng subs",
"Scales Mermaids Are Real 2017 WEBRip X264",
"Barrie Cassidys One Plus One S01E03 Sally Scales 720p HDTV x264-CBFM",
"The Aggression Scale 2012 10bit hevc-d3g",
"Family.by.the.Ton.S01E02.Stepping.on.the.Scale.HDTV.x264-CRiMSON",
"Upgrade.2018.1080p.Bluray.DD5.1.x264-playHD",
"The Brave S01E05 Enhanced Protection 720p AMZN WEBRip DDP5 1 X264-NTb",
"Star.Trek.The.Original.Series.Remastered.And.Enhanced.DVDRip.XviD.ROSub.FL",
"Guns N' Roses - 2016-04-08 Las Vegas, NV 1st NIGHT ENHANCED BLU RAY 1080i+LPCM AUDIO [fanfzero]",
"Enhanced.2020.1080p.Bluray.DTS-HD.MA.5.1.X264-EVO"
]
def Upscaled(debug_level=0):
# Get the custom formats for "Upscaled" from both Radarr and Sonarr
Upscaled_radarr = get_custom_format("Upscaled", "radarr", debug_level)
Upscaled_sonarr = get_custom_format("Upscaled", "sonarr", debug_level)
# Extract the regex values for both Radarr and Sonarr using get_regex
Upscaled_value_radarr = get_regex(Upscaled_radarr, "Upscaled", debug_level)
Upscaled_value_sonarr = get_regex(Upscaled_sonarr, "Upscaled", debug_level)
if debug_level > 0:
print(f"Testing with regex: {ORANGE}{Upscaled_value_radarr}{RESET}\n")
# Compare Radarr and Sonarr Upscaled regex values
if Upscaled_value_radarr != Upscaled_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {Upscaled_value_radarr}")
print(f"Sonarr regex: {Upscaled_value_sonarr}")
good_matches_passed = []
good_matches_failed = []
bad_matches_passed = []
bad_matches_failed = []
print("Checking good matches:")
# Test good matches
for release in good_matches:
if re.search(Upscaled_value_radarr, release, re.IGNORECASE):
good_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
else:
good_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
print("\nChecking bad matches:")
# Test bad matches
for release in bad_matches:
if re.search(Upscaled_value_radarr, release, re.IGNORECASE):
bad_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
else:
bad_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
# Reporting failed matches
print("\nFailed matches:")
if good_matches_failed or bad_matches_passed:
for release in good_matches_failed + bad_matches_failed:
print(f" - {release}")
else:
print(f"{GREEN}None, Great Job! :){RESET}")
total_matches = len(good_matches) + len(bad_matches)
passed_matches = len(good_matches_passed) + len(bad_matches_passed)
success_rate = (passed_matches / total_matches) * 100
print("\nStats:")
print(f"Total: {total_matches}")
print(f"Bad: {len(bad_matches_failed) + len(good_matches_failed)}")
print(f"Rate: {success_rate:.2f}%")
if success_rate >= 99.8:
print("Test Passed")
return True
else:
print("Test Failed")
return False

View File

@@ -1,107 +0,0 @@
from extract import get_custom_format, get_regex
import re
import sys
# ANSI escape codes for colors
GREEN = '\033[92m'
RED = '\033[91m'
RESET = '\033[0m'
good_matches = [
"Silo (2023) S01 1080p DS4K ATVP WEB-DL DDP 5 1 Atmos English - YELLO",
"Yuva (2024) Kannada (1080p DS4K WEBRip AMZN x265 HEVC 10bit DDP5.1 ESub M3GAN) [MCX]",
"Mrs. Davis 2023 S01 1080p DS4K PCOK WEB-DL DDP 5.1 x265 - YELLO",
"The New Look (2024) S01E01 Just You Wait and See (1080p DS4K ATVP WEBRip x265 10-bit SDR DDP Atmos 5 1 English - DarQ)",
"Baghead (2024) 1080p DS4K WEB-DL x265 DV HDR10+ DDP 5.1 English-SM737",
"Bosch.Legacy.2022.S02E03.1080p.DS4K.AMZN.WEB-DL.10bit.DDP5.1.x265-YELLO"
]
bad_matches = [
"Bird Box (2018) 1080p DS4K NF WEBRip AV1 Opus 5.1 [Retr0]",
"The Banshees of Inisherin (2022) 1080p DS4K MA WEBRip AV1 Opus 5.1 [Retr0]",
"Once Upon a Studio (2023) DS4K 1080p DSNP WEBRip AV1 Opus 5.1 [RAV1NE]",
"24 Jam Bersama Gaspar (2024) INDONESIAN DS4K 1080p NF WEBRip AV1 Opus 5.1 [RAV1NE]",
]
def x265WEB(debug_level=0):
# Get the custom formats for "x265WEB" from both Radarr and Sonarr
x265WEB_radarr = get_custom_format("x265 (Web)", "radarr", debug_level)
x265WEB_sonarr = get_custom_format("x265 (Web)", "sonarr", debug_level)
# Get the custom formats for "AV1" from both Radarr and Sonarr
AV1_radarr = get_custom_format("AV1", "radarr", debug_level)
AV1_sonarr = get_custom_format("AV1", "sonarr", debug_level)
# Extract the regex values for both Radarr and Sonarr using get_regex
x265WEB_value_radarr = get_regex(x265WEB_radarr, "x265", debug_level)
x265WEB_value_sonarr = get_regex(x265WEB_sonarr, "x265", debug_level)
# Extract the regex values for both Radarr and Sonarr using get_regex
AV1_value_radarr = get_regex(AV1_radarr, "AV1", debug_level)
AV1_value_sonarr = get_regex(AV1_sonarr, "AV1", debug_level)
# Replace the negative lookbehind with a negative lookahead
x265WEB_value_radarr = x265WEB_value_radarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
x265WEB_value_sonarr = x265WEB_value_sonarr.replace(r"(?<=^|[\s.-])", r"(?:^|[\s.-])")
if debug_level > 0:
print(f"Testing with x265 regex: {x265WEB_value_radarr}")
print(f"Testing with AV1 regex: {AV1_value_radarr}")
# Compare Radarr and Sonarr x265WEB regex values
if x265WEB_value_radarr != x265WEB_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {x265WEB_value_radarr}")
print(f"Sonarr regex: {x265WEB_value_sonarr}")
# Compare Radarr and Sonarr AV1 regex values
if AV1_value_radarr != AV1_value_sonarr:
print("Test Failed: regex value not same.")
print(f"Radarr regex: {AV1_value_radarr}")
print(f"Sonarr regex: {AV1_value_sonarr}")
good_matches_passed = []
good_matches_failed = []
bad_matches_passed = []
bad_matches_failed = []
print("Checking good matches:")
# Test good matches
for release in good_matches:
if re.search(x265WEB_value_radarr, release, re.IGNORECASE):
good_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
else:
good_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
print("\nChecking bad matches:")
# Test bad matches
for release in bad_matches:
if re.search(AV1_value_radarr, release, re.IGNORECASE):
bad_matches_passed.append(release)
print(f" - {release}: {GREEN}Passed{RESET}")
else:
bad_matches_failed.append(release)
print(f" - {release}: {RED}Failed{RESET}")
# Reporting failed matches
print("\nFailed matches:")
for release in good_matches_failed + bad_matches_failed:
print(f" - {release}")
total_matches = len(good_matches) + len(bad_matches)
passed_matches = len(good_matches_passed) + len(bad_matches_passed)
success_rate = (passed_matches / total_matches) * 100
print("\nStats:")
print(f"Total: {total_matches}")
print(f"Bad: {len(bad_matches_failed) + len(good_matches_failed)}")
print(f"Rate: {success_rate:.2f}%")
if success_rate >= 99.8:
print("Test Passed")
return True
else:
print("Test Failed")
return False