autobrr/scripts/update-indexers.py
soup 79d0d6e572
docs: improve freeleech detection in parsing (#1934)
fix(ci): improve freeleech detection in parsing
2025-01-08 08:38:46 +01:00

119 lines
4.7 KiB
Python

#!/usr/bin/env python3
# Copyright (c) 2021-2025, Ludvig Lundgren and the autobrr contributors.
# SPDX-License-Identifier: GPL-2.0-or-later
import os
import re
from typing import Dict
# Paths relative to GitHub Actions workspace
DEFINITIONS_DIR = "../autobrr/internal/indexer/definitions"
INDEXERS_OUTPUT = "../autobrr.com/snippets/indexers.mdx"
FREELEECH_OUTPUT = "../autobrr.com/snippets/freeleech.mdx"
def parse_yaml_file(file_path: str) -> Dict:
"""Parse YAML files"""
result = {}
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# Extract fields using regex
name_match = re.search(r'name:\s*(.*)', content)
desc_match = re.search(r'description:\s*(.*)', content)
supports_match = re.search(r'supports:\s*\n((?:\s*-\s*[^\n]+\n)*)', content)
supports = []
if supports_match:
supports = re.findall(r'-\s*(\w+)', supports_match.group(1))
# Look for freeleech in multiple places:
# 1. In vars section
has_freeleech = bool(re.search(r'vars:.*?-\s*freeleech\s*$', content, re.MULTILINE | re.DOTALL))
has_freeleech_percent = bool(re.search(r'vars:.*?-\s*freeleechPercent\s*$', content, re.MULTILINE | re.DOTALL))
# 2. In mappings section - check what the fields map to
mappings_freeleech = bool(re.search(r'mappings:.*?(?:freeleech|freeleechPercent):\s*(?!.*?percent|.*?\d+%)', content, re.MULTILINE | re.DOTALL))
mappings_freeleech_percent = bool(re.search(r'mappings:.*?(?:freeleech|freeleechPercent):\s*(?:.*?percent|.*?\d+%)', content, re.MULTILINE | re.DOTALL))
has_freeleech = has_freeleech or mappings_freeleech
has_freeleech_percent = has_freeleech_percent or mappings_freeleech_percent
result = {
'name': name_match.group(1).strip() if name_match else '',
'description': desc_match.group(1).strip() if desc_match else '',
'supports': supports,
'freeleech': has_freeleech,
'freeleechPercent': has_freeleech_percent
}
return result
def get_feature_checkmark(value: bool) -> str:
return "" if value else ""
def generate_indexers_markdown(indexers: list) -> str:
"""Generate markdown for indexers table."""
markdown = "<details>\n\n"
markdown += "<summary>Click to view supported indexers</summary>\n\n"
markdown += "| Indexer | Description | IRC | RSS |\n"
markdown += "|---------|-------------|-----|-----|\n"
for indexer in indexers:
name = indexer.get('name', '')
description = indexer.get('description', '')
irc_support = get_feature_checkmark('irc' in [f.lower() for f in indexer.get('supports', [])])
rss_support = get_feature_checkmark('rss' in [f.lower() for f in indexer.get('supports', [])])
markdown += f"| {name} | {description} | {irc_support} | {rss_support} |\n"
markdown += "\n</details>"
return markdown
def generate_freeleech_markdown(indexers: list) -> str:
"""Generate markdown for freeleech table."""
markdown = "| Indexer | Freeleech | Freeleech Percent |\n"
markdown += "|---------|-----------|------------------|\n"
for indexer in indexers:
# Skip if neither freeleech feature is supported
if not (indexer.get('freeleech', False) or indexer.get('freeleechPercent', False)):
continue
name = indexer.get('name', '')
freeleech = get_feature_checkmark(indexer.get('freeleech', False))
freeleech_percent = get_feature_checkmark(indexer.get('freeleechPercent', False))
markdown += f"| {name} | {freeleech} | {freeleech_percent} |\n"
return markdown
def main():
"""Generate markdown documents"""
indexers = []
# Read the YAML files
for filename in os.listdir(DEFINITIONS_DIR):
if filename.endswith('.yaml'):
file_path = os.path.join(DEFINITIONS_DIR, filename)
indexer = parse_yaml_file(file_path)
if indexer:
indexers.append(indexer)
# Sort indexers by name, but put generic ones last
def sort_key(indexer):
name = indexer.get('name', '').lower()
return (name.startswith('generic'), name)
indexers.sort(key=sort_key)
# Generate and write files
for output_file, content in [
(INDEXERS_OUTPUT, generate_indexers_markdown(indexers)),
(FREELEECH_OUTPUT, generate_freeleech_markdown(indexers))
]:
os.makedirs(os.path.dirname(output_file), exist_ok=True)
with open(output_file, 'w', encoding='utf-8') as f:
f.write(content)
if __name__ == "__main__":
main()