mirror of
https://github.com/Dictionarry-Hub/profilarr.git
synced 2026-01-22 10:51:02 +01:00
Clean slate
This commit is contained in:
1
.github/CODEOWNERS
vendored
1
.github/CODEOWNERS
vendored
@@ -1 +0,0 @@
|
||||
* @santiagosayshey
|
||||
129
.github/workflows/add-issue-to-project.yml
vendored
129
.github/workflows/add-issue-to-project.yml
vendored
@@ -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
|
||||
114
.github/workflows/new-branch-created.yml
vendored
114
.github/workflows/new-branch-created.yml
vendored
@@ -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
167
.gitignore
vendored
@@ -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
21
LICENSE
@@ -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
329
README.md
@@ -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/
|
||||
101
deletarr.py
101
deletarr.py
@@ -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()
|
||||
@@ -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
|
||||
134
exportarr.py
134
exportarr.py
@@ -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()
|
||||
157
helpers.py
157
helpers.py
@@ -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
|
||||
|
||||
211
importarr.py
211
importarr.py
@@ -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()
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
||||
PyYAML==6.0.1
|
||||
Requests==2.31.0
|
||||
25
setup.py
25
setup.py
@@ -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)
|
||||
22
syncarr.py
22
syncarr.py
@@ -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()
|
||||
116
tests/av1.py
116
tests/av1.py
@@ -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
|
||||
@@ -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."
|
||||
@@ -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
|
||||
539
tests/qxr.py
539
tests/qxr.py
@@ -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 Mathematician’s 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
|
||||
@@ -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
|
||||
@@ -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()
|
||||
@@ -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
|
||||
108
tests/sev.py
108
tests/sev.py
@@ -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
|
||||
362
tests/taoe.py
362
tests/taoe.py
@@ -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
|
||||
124
tests/upscale.py
124
tests/upscale.py
@@ -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
|
||||
107
tests/x265web.py
107
tests/x265web.py
@@ -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
|
||||
Reference in New Issue
Block a user