| 663 | |
| 664 | |
| 665 | def build_parser() -> argparse.ArgumentParser: |
| 666 | parser = argparse.ArgumentParser( |
| 667 | description="Validate RSS links, clean OPML files, and sync tiny.opml into CyberSecurityRSS.opml." |
| 668 | ) |
| 669 | parser.add_argument("--mode", choices=["check", "apply"], required=True) |
| 670 | parser.add_argument("--tiny", default="tiny.opml") |
| 671 | parser.add_argument("--full", default="CyberSecurityRSS.opml") |
| 672 | parser.add_argument("--fallback-category", default="Misc") |
| 673 | parser.add_argument("--timeout", type=float, default=10.0) |
| 674 | parser.add_argument("--retries", type=int, default=3) |
| 675 | parser.add_argument("--workers", type=int, default=20) |
| 676 | parser.add_argument("--state-file", default=".github/opml-health-state.json") |
| 677 | parser.add_argument("--delete-threshold", type=int, default=2) |
| 678 | parser.add_argument("--max-probe-bytes", type=int, default=MAX_PROBE_BYTES) |
| 679 | return parser |
| 680 | |
| 681 | |
| 682 | def main(argv: Optional[List[str]] = None) -> int: |