-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
77 lines (63 loc) · 2.19 KB
/
Copy pathmain.py
File metadata and controls
77 lines (63 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import argparse
import asyncio
from loguru import logger
from config.config import DEFAULT_FORMATS, DEFAULT_ITEMS_LIMIT, DEFAULT_POLL_SECONDS, load_config
from src.workflow import RunRequest, run_scrape_workflow
from utils.pipeline_io import load_urls
def setup_logger(log_level: str) -> None:
logger.remove()
logger.add(
sink=lambda msg: print(msg, end=""),
level=log_level.upper(),
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}",
)
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
description="Minimal PDF scraper using Olostep (single -> scrapes, multi -> batches)."
)
parser.add_argument("--url", action="append", help="PDF URL (repeatable).")
parser.add_argument("--urls-file", help="Text file with 1 URL per line.")
parser.add_argument(
"--out",
help="Output JSON filename (saved inside output folder). If omitted, auto-generated.",
)
parser.add_argument(
"--formats",
default=DEFAULT_FORMATS,
help="Comma-separated formats, e.g. markdown,text,html",
)
parser.add_argument(
"--poll-seconds",
type=int,
default=DEFAULT_POLL_SECONDS,
help="Batch polling interval in seconds.",
)
parser.add_argument(
"--items-limit",
type=int,
default=DEFAULT_ITEMS_LIMIT,
help="Batch items page size.",
)
return parser
async def main_async() -> None:
args = build_parser().parse_args()
cfg = load_config()
setup_logger(cfg.log_level)
logger.info("Configuration loaded. API base: {}", cfg.api_base)
urls = load_urls(args)
if not urls:
raise SystemExit("Provide --url and/or --urls-file.")
formats = [value.strip() for value in args.formats.split(",") if value.strip()]
request = RunRequest(
urls=urls,
formats=formats,
out_filename=args.out,
poll_seconds=args.poll_seconds,
items_limit=args.items_limit,
)
result = await run_scrape_workflow(request, cfg=cfg)
logger.info("Wrote output JSON to {}", result.output_json)
def main() -> None:
asyncio.run(main_async())
if __name__ == "__main__":
main()