From ffde248b6f375bd000898ad18cd369ea32f97493 Mon Sep 17 00:00:00 2001 From: Sam Chau Date: Thu, 16 Jan 2025 07:35:11 +1030 Subject: [PATCH] create(script): Add tierCreator script for generating group tier custom formats + release group regex patterns --- scripts/tierCreator.py | 154 +++++++++++++++++++++++++++++++++++++ templates/groupTier.yml | 21 +++++ templates/releaseGroup.yml | 6 ++ 3 files changed, 181 insertions(+) create mode 100644 scripts/tierCreator.py create mode 100644 templates/groupTier.yml create mode 100644 templates/releaseGroup.yml diff --git a/scripts/tierCreator.py b/scripts/tierCreator.py new file mode 100644 index 0000000..948f18e --- /dev/null +++ b/scripts/tierCreator.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python3 + +import argparse +import json +import os +import sys +from pathlib import Path +import yaml + + +def load_template(template_path): + """Load a YAML template file.""" + try: + with open(template_path, 'r') as f: + return f.read() + except FileNotFoundError: + print(f"Error: Template file not found: {template_path}") + sys.exit(1) + + +def create_regex_pattern(group_name, template_dir, output_dir, dry_run=False): + """Create a regex pattern file for a release group if it doesn't exist.""" + output_path = output_dir / f"{group_name}.yml" + + # Skip if pattern already exists + if output_path.exists(): + print(f"Skipping existing regex pattern: {output_path}") + return + + print( + f"{'Would create' if dry_run else 'Creating'} regex pattern: {output_path}" + ) + + # Load and fill template + template = load_template(template_dir / "releaseGroup.yml") + pattern = template.replace("", group_name) + + # Create output directory if it doesn't exist + output_dir.mkdir(parents=True, exist_ok=True) + + # Write pattern file if not dry run + if not dry_run: + with open(output_path, 'w') as f: + f.write(pattern) + + +def create_tier_format(tier, + resolution, + type_name, + groups, + template_dir, + output_dir, + dry_run=False): + """Create a custom format file for a specific tier.""" + template = load_template(template_dir / "groupTier.yml") + + # Create release group pattern string + release_groups = [ + group["name"] for group in groups if group["tier"] == tier + ] + if not release_groups: + return + + release_group_pattern = '|'.join(f"(?:{name})" for name in release_groups) + + # Fill in template + format_content = (template.replace("", resolution).replace( + "", + type_name).replace("", + str(tier)).replace("", + release_group_pattern)) + + # Create output directory if it doesn't exist + output_dir.mkdir(parents=True, exist_ok=True) + + # Write custom format file + output_path = output_dir / f"{resolution} {type_name} Tier {tier}.yml" + print( + f"{'Would create' if dry_run else 'Creating'} custom format: {output_path} (includes {len(release_groups)} groups)" + ) + + if not dry_run: + with open(output_path, 'w') as f: + f.write(format_content) + + +def main(): + parser = argparse.ArgumentParser( + description='Create Radarr custom formats for release group tiers') + parser.add_argument('json_file', + help='Input JSON file containing tier data') + parser.add_argument('--resolution', + choices=['SD', '720p', '1080p', '2160p'], + required=True, + help='Resolution for custom formats') + parser.add_argument('--type', + choices=['Quality', 'Balanced'], + required=True, + help='Type of custom format') + parser.add_argument( + '--dry-run', + action='store_true', + help='Show what would be done without making any changes') + + args = parser.parse_args() + + # Setup paths + script_dir = Path(__file__).parent + template_dir = script_dir.parent / "templates" + regex_dir = script_dir.parent / "regex_patterns" + format_dir = script_dir.parent / "custom_formats" + + # Load and parse input JSON + try: + with open(args.json_file, 'r') as f: + data = json.load(f) + except FileNotFoundError: + print(f"Error: Input JSON file not found: {args.json_file}") + sys.exit(1) + except json.JSONDecodeError: + print(f"Error: Invalid JSON file: {args.json_file}") + sys.exit(1) + + # Print summary of what we found + print(f"\nAnalyzing input file: {args.json_file}") + print( + f"Found {len(data['tiered_groups'])} release groups across {len(set(group['tier'] for group in data['tiered_groups']))} tiers" + ) + + if args.dry_run: + print("\nDRY RUN - No files will be created or modified\n") + + # Create regex patterns for all groups + print("\nProcessing regex patterns:") + for group in data["tiered_groups"]: + create_regex_pattern(group["name"], template_dir, regex_dir, + args.dry_run) + + # Create tier formats + print("\nProcessing custom formats:") + unique_tiers = sorted(set(group["tier"] + for group in data["tiered_groups"])) + for tier in unique_tiers: + create_tier_format(tier, args.resolution, args.type, + data["tiered_groups"], template_dir, format_dir, + args.dry_run) + + print( + f"Successfully created custom formats for {args.resolution} {args.type}" + ) + + +if __name__ == "__main__": + main() diff --git a/templates/groupTier.yml b/templates/groupTier.yml new file mode 100644 index 0000000..b2520de --- /dev/null +++ b/templates/groupTier.yml @@ -0,0 +1,21 @@ +name: Tier +description: Matches release groups who fall under 1080p Tier +tags: + - Release Group +conditions: + - name: Not WEB-DL + negate: true + required: true + source: web_dl + type: source + - name: + negate: false + required: true + resolution: + type: resolution + - name: + negate: false + pattern: + required: false + type: release_group +tests: diff --git a/templates/releaseGroup.yml b/templates/releaseGroup.yml new file mode 100644 index 0000000..c2139ab --- /dev/null +++ b/templates/releaseGroup.yml @@ -0,0 +1,6 @@ +name: +pattern: (?<=^|[\s.-])\b +description: "" +tags: + - Release Group +tests: