@nomadamas/k-skill 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/skills/komsa-ferry-info/instruction.md +54 -0
- package/skills/komsa-ferry-info/scripts/komsa_ferry_info.py +76 -0
- package/skills/komsa-ferry-info/skill.json +6 -0
- package/skills/railway-timetable/instruction.md +40 -0
- package/skills/railway-timetable/references/AUTOMATION-LEGAL-STATEMENT.md +5 -0
- package/skills/railway-timetable/references/DISCLAIMER.md +7 -0
- package/skills/railway-timetable/references/TRADEMARK-LEGAL-STATEMENT.md +3 -0
- package/skills/{ktx-booking/scripts/ktx_booking.py → railway-timetable/scripts/ktx_backend.py} +0 -0
- package/skills/{ktx-booking → railway-timetable}/scripts/ktx_timetable.py +0 -2
- package/skills/railway-timetable/scripts/railway_timetable.py +95 -0
- package/skills/railway-timetable/scripts/railway_timetable.py.lock +27 -0
- package/skills/railway-timetable/skill.json +8 -0
- package/skills/store-longevity-radar/scripts/__pycache__/store_longevity_download.cpython-312.pyc +0 -0
- package/skills/ktx-booking/instruction.md +0 -61
- package/skills/ktx-booking/references/AUTOMATION-LEGAL-STATEMENT.md +0 -10
- package/skills/ktx-booking/references/DISCLAIMER.md +0 -14
- package/skills/ktx-booking/references/TRADEMARK-LEGAL-STATEMENT.md +0 -9
- package/skills/ktx-booking/skill.json +0 -8
- package/skills/srt-booking/instruction.md +0 -75
- package/skills/srt-booking/references/AUTOMATION-LEGAL-STATEMENT.md +0 -25
- package/skills/srt-booking/references/DISCLAIMER.md +0 -13
- package/skills/srt-booking/references/TRADEMARK-LEGAL-STATEMENT.md +0 -9
- package/skills/srt-booking/scripts/srt_booking.py +0 -171
- package/skills/srt-booking/scripts/srt_booking.py.lock +0 -207
- package/skills/srt-booking/skill.json +0 -8
- /package/skills/{ktx-booking/scripts/ktx_booking.py.lock → railway-timetable/scripts/ktx_backend.py.lock} +0 -0
package/package.json
CHANGED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# KOMSA 연안여객선 정보 조회
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
한국해양교통안전공단(KOMSA) MTIS Open API를 통해 연안여객선 운항 일정, 선박 제원, 기항지, 면허항로, 운항항로, 운항상태를 조회한다. 예매·결제·로그인 자동화는 하지 않는다.
|
|
6
|
+
|
|
7
|
+
## Public access path
|
|
8
|
+
|
|
9
|
+
기본 경로는 hosted/self-host `k-skill-proxy`의 좁은 read-only route다.
|
|
10
|
+
|
|
11
|
+
- 공식 포털: <https://mtisopenapi.komsa.or.kr/>
|
|
12
|
+
- 운항 일정: `https://mtisopenapi.komsa.or.kr/eopt/api/oprt-schd-info`
|
|
13
|
+
- 운항노선: `https://mtisopenapi.komsa.or.kr/eopt/api/oprt-line-info`
|
|
14
|
+
- 선박 제원: `https://mtisopenapi.komsa.or.kr/eopt/api/psnshp-spec`
|
|
15
|
+
- 프록시: `GET /v1/komsa/ferry/{dataset}`
|
|
16
|
+
|
|
17
|
+
지원 dataset은 `schedules`, `vessels`, `ports`, `license-routes`, `operation-routes`, `status`다. upstream `serviceKey`는 프록시 서버의 `KOMSA_MTIS_API_KEY` 또는 `KSKILL_KOMSA_MTIS_API_KEY`로만 주입한다.
|
|
18
|
+
|
|
19
|
+
## Workflow
|
|
20
|
+
|
|
21
|
+
Helper 실행:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx -y @nomadamas/k-skill@0 exec komsa-ferry-info scripts/komsa_ferry_info.py -- \
|
|
25
|
+
schedules --date 20260824 --vessel 섬사랑12호 --limit 10
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
프록시를 직접 확인하려면:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
BASE="${KSKILL_PROXY_BASE_URL:-https://k-skill-proxy.nomadamas.org}"
|
|
32
|
+
curl -fsS --get "$BASE/v1/komsa/ferry/schedules" \
|
|
33
|
+
--data-urlencode "date=20260824" \
|
|
34
|
+
--data-urlencode "vessel=섬사랑12호" \
|
|
35
|
+
--data-urlencode "limit=10"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
입력은 날짜(`YYYYMMDD` 또는 `YYYY-MM-DD`), 선박명, 항로명, 기항지명, 페이지와 결과 수를 사용한다. 공식 MTIS 조회 파라미터는 명칭 필터이며, 매핑되지 않은 코드 필터는 `400`이다. 응답의 `items`는 공식 원문 필드를 보존하며, 일정 응답에는 출항일자·시각·출발지·도착지·항로·운항상태가 포함될 수 있다.
|
|
39
|
+
|
|
40
|
+
## Done when
|
|
41
|
+
|
|
42
|
+
- 공식 MTIS route를 통해 선택한 dataset을 조회했다.
|
|
43
|
+
- 결과에 조회 dataset, 페이지, 결과 수와 공식 upstream 출처를 함께 표시했다.
|
|
44
|
+
- 데이터가 5분 주기로 갱신될 수 있음을 밝히고, 운항정보를 예매 가능 좌석이나 결제 결과로 해석하지 않았다.
|
|
45
|
+
|
|
46
|
+
## Failure modes
|
|
47
|
+
|
|
48
|
+
- `400 bad_request`: 허용되지 않은 dataset, 매핑되지 않은 필터, 잘못된 날짜, 페이지 또는 결과 수.
|
|
49
|
+
- `503 upstream_not_configured`: 프록시 운영자에게 `KOMSA_MTIS_API_KEY` 설정이 필요하다.
|
|
50
|
+
- `502 upstream_error` / `502 upstream_invalid_response`: MTIS 인증 오류, quota 초과, upstream 장애 또는 응답 형식 변경.
|
|
51
|
+
- `504 upstream_timeout`: 공식 API가 시간 내 응답하지 않음.
|
|
52
|
+
- `total_count = 0`: 날짜·항로·선박 조건에 맞는 결과 없음.
|
|
53
|
+
|
|
54
|
+
MTIS OpenAPI 이용신청/키 발급은 공식 포털 회원가입·로그인 후 진행한다. 키를 채팅, 저장소, GitHub Actions에 넣지 않는다.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Query KOMSA MTIS ferry information through k-skill-proxy."""
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
import sys
|
|
7
|
+
import urllib.error
|
|
8
|
+
import urllib.parse
|
|
9
|
+
import urllib.request
|
|
10
|
+
|
|
11
|
+
DEFAULT_PROXY = "https://k-skill-proxy.nomadamas.org"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def proxy_base_url(value=None, env=None):
|
|
15
|
+
env = os.environ if env is None else env
|
|
16
|
+
candidate = (value or env.get("KSKILL_PROXY_BASE_URL") or DEFAULT_PROXY).strip()
|
|
17
|
+
if candidate.casefold() in {"off", "false", "0", "none"}:
|
|
18
|
+
raise ValueError("KSKILL_PROXY_BASE_URL is disabled.")
|
|
19
|
+
return candidate.rstrip("/")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def query(dataset, params, *, base_url=None, read_json=None):
|
|
23
|
+
url = f"{proxy_base_url(base_url)}/v1/komsa/ferry/{urllib.parse.quote(dataset, safe='')}"
|
|
24
|
+
query_string = urllib.parse.urlencode({k: v for k, v in params.items() if v is not None})
|
|
25
|
+
request = urllib.request.Request(
|
|
26
|
+
f"{url}?{query_string}",
|
|
27
|
+
headers={"Accept": "application/json", "User-Agent": "k-skill-komsa-ferry-info/1.0"},
|
|
28
|
+
method="GET",
|
|
29
|
+
)
|
|
30
|
+
if read_json:
|
|
31
|
+
return read_json(request)
|
|
32
|
+
try:
|
|
33
|
+
with urllib.request.urlopen(request, timeout=30) as response:
|
|
34
|
+
return json.loads(response.read().decode("utf-8"))
|
|
35
|
+
except urllib.error.HTTPError as error:
|
|
36
|
+
body = error.read().decode("utf-8", errors="replace")
|
|
37
|
+
try:
|
|
38
|
+
payload = json.loads(body)
|
|
39
|
+
except json.JSONDecodeError:
|
|
40
|
+
payload = {"error": f"HTTP {error.code}", "message": body}
|
|
41
|
+
raise RuntimeError(json.dumps(payload, ensure_ascii=False)) from error
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def parser():
|
|
45
|
+
result = argparse.ArgumentParser(description="KOMSA MTIS 연안여객선 정보 조회")
|
|
46
|
+
result.add_argument("dataset", choices=["schedules", "vessels", "ports", "license-routes", "operation-routes", "status"])
|
|
47
|
+
result.add_argument("--date")
|
|
48
|
+
result.add_argument("--vessel")
|
|
49
|
+
result.add_argument("--route")
|
|
50
|
+
result.add_argument("--port")
|
|
51
|
+
result.add_argument("--page", default="1")
|
|
52
|
+
result.add_argument("--limit", default="10")
|
|
53
|
+
result.add_argument("--proxy-base-url")
|
|
54
|
+
return result
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def main(argv=None):
|
|
58
|
+
args = parser().parse_args(argv)
|
|
59
|
+
params = {
|
|
60
|
+
"date": args.date,
|
|
61
|
+
"vessel": args.vessel,
|
|
62
|
+
"route": args.route,
|
|
63
|
+
"port": args.port,
|
|
64
|
+
"page": args.page,
|
|
65
|
+
"limit": args.limit,
|
|
66
|
+
}
|
|
67
|
+
try:
|
|
68
|
+
print(json.dumps(query(args.dataset, params, base_url=args.proxy_base_url), ensure_ascii=False, indent=2))
|
|
69
|
+
return 0
|
|
70
|
+
except (ValueError, RuntimeError) as error:
|
|
71
|
+
print(json.dumps({"error": str(error)}, ensure_ascii=False), file=sys.stderr)
|
|
72
|
+
return 1
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
if __name__ == "__main__":
|
|
76
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "komsa-ferry-info",
|
|
3
|
+
"description": "한국해양교통안전공단 KOMSA MTIS 공식 API로 연안여객선 운항 일정과 선박·항로 정보를 조회한다.",
|
|
4
|
+
"profiles": ["proxy", "lookup"],
|
|
5
|
+
"frontmatter": "name: komsa-ferry-info\ndescription: 한국해양교통안전공단 KOMSA MTIS 공식 API로 연안여객선 운항 일정과 선박·항로 정보를 조회한다.\nlicense: MIT\nmetadata:\n category: transport\n locale: ko-KR\n phase: v1"
|
|
6
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Unified Railway Timetable Lookup
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
`railway-timetable`은 코레일 공식 통합 시간표에서 KTX 계열 고속철도 운행 정보를 조회한다.
|
|
6
|
+
|
|
7
|
+
- KTX: 한국철도공사 공식 공개 XLSX 통합 계획 시간표
|
|
8
|
+
|
|
9
|
+
모든 경로는 조회 전용이다. 로그인·credential, 예약·예약대기·좌석 선점·결제·취소·자동 재조회는 실행하지 않는다.
|
|
10
|
+
|
|
11
|
+
## Commands
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx -y @nomadamas/k-skill@0 exec railway-timetable scripts/railway_timetable.py -- \
|
|
15
|
+
search --dep 서울 --arr 부산 --date 20260904 \
|
|
16
|
+
--time 0600 --time-limit 1200 --limit 5
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npx -y @nomadamas/k-skill@0 exec railway-timetable scripts/railway_timetable.py -- source
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Output
|
|
24
|
+
|
|
25
|
+
- `count`, `trains[]`, `date`
|
|
26
|
+
- 각 열차의 `operator`, `train_no`, `train_type`, `dep`, `arr`, `dep_time`, `arr_time`
|
|
27
|
+
- 공식 `source`와 예약 진입 URL
|
|
28
|
+
|
|
29
|
+
결과는 코레일 통합 공개 계획 시간표이며 실제 운휴·지연, 예약 성공, 좌석 선점을 보장하지 않는다.
|
|
30
|
+
|
|
31
|
+
## Sources and failure modes
|
|
32
|
+
|
|
33
|
+
- 코레일: 공개 게시판의 XLSX를 읽는다. 게시판·파일 장애, 적용 시간표 없음, 형식 변경, 구간 결과 없음이 발생할 수 있다.
|
|
34
|
+
- CAPTCHA·인증·접근 차단은 우회하지 않고 코레일 공식 페이지를 안내한다.
|
|
35
|
+
|
|
36
|
+
## Hard boundaries
|
|
37
|
+
|
|
38
|
+
- 회원 로그인·credential 요청 금지
|
|
39
|
+
- 예약·결제·취소·정확한 좌석 선택·자동 polling 금지
|
|
40
|
+
- 내부 모바일 API, anti-bot, CAPTCHA, 인증 통제 우회 금지
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# DISCLAIMER — `railway-timetable`
|
|
2
|
+
|
|
3
|
+
이 스킬은 한국철도공사·코레일 또는 다른 철도 운영사의 공식 기능이나 공식 지원 도구가 아니며, 제휴·후원·승인·인증 또는 협업한 사실이 없습니다. 명칭과 상표는 조회 대상 서비스를 식별하기 위해서만 사용합니다.
|
|
4
|
+
|
|
5
|
+
공개 정보의 개인적 조회는 비조직적 용도로 제한한다. 체계적·대량 수집, 데이터베이스 구축, 접근통제·차단 우회, 서비스 운영을 방해하는 행위에 사용하지 않는다.
|
|
6
|
+
|
|
7
|
+
관련 기준으로 대법원 2005도1637 및 2021도1533 판결, 정보통신망법 제48조와 저작권법 제93조를 참고한다. 이 문서는 개별 사실관계에 대한 법률 자문이나 위법성 판단이 아니다.
|
package/skills/{ktx-booking/scripts/ktx_booking.py → railway-timetable/scripts/ktx_backend.py}
RENAMED
|
File without changes
|
|
@@ -120,8 +120,6 @@ def parse_timetable_rows(
|
|
|
120
120
|
if section.type_index >= 0
|
|
121
121
|
else "KTX"
|
|
122
122
|
)
|
|
123
|
-
if "KTX" not in train_type:
|
|
124
|
-
continue
|
|
125
123
|
if section.note_index >= 0 and not runs_on_date(row[section.note_index], requested_date):
|
|
126
124
|
continue
|
|
127
125
|
dep_time = normalize_time(row[section.dep_index])
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/usr/bin/env -S uv run --locked --script
|
|
2
|
+
# /// script
|
|
3
|
+
# requires-python = ">=3.11"
|
|
4
|
+
# dependencies = ["openpyxl==3.1.5"]
|
|
5
|
+
# ///
|
|
6
|
+
"""Read-only Korail integrated railway timetable lookup."""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import argparse
|
|
11
|
+
import json
|
|
12
|
+
import sys
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
import ktx_backend
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def source_info() -> dict[str, Any]:
|
|
19
|
+
return {
|
|
20
|
+
"mode": "plan",
|
|
21
|
+
"transport": "Korail integrated timetable",
|
|
22
|
+
"operator": "한국철도공사",
|
|
23
|
+
"endpoint": ktx_backend.BOARD_URL,
|
|
24
|
+
"authentication": "none",
|
|
25
|
+
"mutation": "none; timetable lookup only",
|
|
26
|
+
"booking_url": ktx_backend.BOOKING_URL,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def search(
|
|
31
|
+
*,
|
|
32
|
+
dep: str,
|
|
33
|
+
arr: str,
|
|
34
|
+
date: str,
|
|
35
|
+
earliest: str,
|
|
36
|
+
latest: str,
|
|
37
|
+
limit: int,
|
|
38
|
+
) -> dict[str, Any]:
|
|
39
|
+
result = ktx_backend.search_public_timetable(
|
|
40
|
+
dep=dep,
|
|
41
|
+
arr=arr,
|
|
42
|
+
date=date,
|
|
43
|
+
earliest=earliest,
|
|
44
|
+
latest=latest,
|
|
45
|
+
limit=limit,
|
|
46
|
+
)
|
|
47
|
+
return {
|
|
48
|
+
**result,
|
|
49
|
+
"schedule_note": "코레일 통합 공개 운행계획 기준이며 실시간 운휴·지연·잔여석 정보가 아닙니다.",
|
|
50
|
+
"source": {**result["source"], "transport": "Korail integrated timetable"},
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
55
|
+
parser = argparse.ArgumentParser(
|
|
56
|
+
description="Korail integrated read-only railway timetable lookup",
|
|
57
|
+
)
|
|
58
|
+
commands = parser.add_subparsers(dest="command", required=True)
|
|
59
|
+
search_parser = commands.add_parser("search", help="search railway timetables")
|
|
60
|
+
search_parser.add_argument("--dep", required=True)
|
|
61
|
+
search_parser.add_argument("--arr", required=True)
|
|
62
|
+
search_parser.add_argument("--date", required=True, help="YYYYMMDD")
|
|
63
|
+
search_parser.add_argument("--time", default="0000", help="earliest departure, HHMM")
|
|
64
|
+
search_parser.add_argument("--time-limit", default="2359", help="latest departure, HHMM")
|
|
65
|
+
search_parser.add_argument("--limit", type=int, default=10)
|
|
66
|
+
commands.add_parser("source", help="show read-only timetable sources")
|
|
67
|
+
return parser
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def main(argv: list[str] | None = None) -> int:
|
|
71
|
+
parser = build_parser()
|
|
72
|
+
args = parser.parse_args(argv)
|
|
73
|
+
try:
|
|
74
|
+
if args.command == "source":
|
|
75
|
+
print(json.dumps(source_info(), ensure_ascii=False, indent=2))
|
|
76
|
+
return 0
|
|
77
|
+
if args.limit < 1 or args.limit > 50:
|
|
78
|
+
raise ValueError("--limit must be between 1 and 50")
|
|
79
|
+
result = search(
|
|
80
|
+
dep=args.dep,
|
|
81
|
+
arr=args.arr,
|
|
82
|
+
date=args.date,
|
|
83
|
+
earliest=args.time,
|
|
84
|
+
latest=args.time_limit,
|
|
85
|
+
limit=args.limit,
|
|
86
|
+
)
|
|
87
|
+
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
88
|
+
return 0
|
|
89
|
+
except (RuntimeError, ValueError) as exc:
|
|
90
|
+
parser.error(str(exc))
|
|
91
|
+
return 2
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
if __name__ == "__main__":
|
|
95
|
+
sys.exit(main())
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
version = 1
|
|
2
|
+
revision = 1
|
|
3
|
+
requires-python = ">=3.11"
|
|
4
|
+
|
|
5
|
+
[manifest]
|
|
6
|
+
requirements = [{ name = "openpyxl", specifier = "==3.1.5" }]
|
|
7
|
+
|
|
8
|
+
[[package]]
|
|
9
|
+
name = "et-xmlfile"
|
|
10
|
+
version = "2.0.0"
|
|
11
|
+
source = { registry = "https://pypi.org/simple" }
|
|
12
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234 }
|
|
13
|
+
wheels = [
|
|
14
|
+
{ url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059 },
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
[[package]]
|
|
18
|
+
name = "openpyxl"
|
|
19
|
+
version = "3.1.5"
|
|
20
|
+
source = { registry = "https://pypi.org/simple" }
|
|
21
|
+
dependencies = [
|
|
22
|
+
{ name = "et-xmlfile" },
|
|
23
|
+
]
|
|
24
|
+
sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464 }
|
|
25
|
+
wheels = [
|
|
26
|
+
{ url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910 },
|
|
27
|
+
]
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "railway-timetable",
|
|
3
|
+
"description": "Read-only Korail integrated railway timetable lookup covering KTX-family trains. No reservation, payment, cancellation, or seat holding.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"lookup"
|
|
6
|
+
],
|
|
7
|
+
"frontmatter": "name: railway-timetable\ndescription: Read-only Korail integrated railway timetable lookup covering KTX-family trains. No reservation, payment, cancellation, or seat holding.\nlicense: MIT\nmetadata:\n category: travel\n locale: ko-KR\n phase: v1"
|
|
8
|
+
}
|
package/skills/store-longevity-radar/scripts/__pycache__/store_longevity_download.cpython-312.pyc
CHANGED
|
Binary file
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# KTX Official Timetable Lookup
|
|
2
|
-
|
|
3
|
-
## What this skill does
|
|
4
|
-
|
|
5
|
-
한국철도공사가 로그인 없이 공개하는 최신 KTX 운행시간표 XLSX를 내려받아 출발역·도착역·출발시간 조건에 맞는 열차를 찾는다.
|
|
6
|
-
|
|
7
|
-
이 스킬은 **공식 계획 시간표 조회 전용**이다.
|
|
8
|
-
|
|
9
|
-
- 회원 로그인, credential, Korail 앱 내부 API를 사용하지 않는다.
|
|
10
|
-
- Dynapath 또는 anti-bot token을 생성·재현·우회하지 않는다.
|
|
11
|
-
- 실시간 잔여석, 실제 운휴·지연, 호차·좌석번호는 조회하지 않는다.
|
|
12
|
-
- 예약, 예약대기, 좌석 선점, 결제, 취소, 자동 재조회는 실행하지 않는다.
|
|
13
|
-
- 구매와 실시간 운행 확인은 공식 코레일 페이지에서 사용자가 직접 진행한다.
|
|
14
|
-
|
|
15
|
-
실행 환경에는 Python 3.11 이상과 `uv`가 필요하다. `uv`가 helper에 고정된 `openpyxl` 환경을 자동 설치한다.
|
|
16
|
-
|
|
17
|
-
## Commands
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
npx -y @nomadamas/k-skill@0 exec ktx-booking scripts/ktx_booking.py -- \
|
|
21
|
-
search --dep 서울 --arr 부산 --date 20260819 --time 0600 --time-limit 1200 --limit 5
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npx -y @nomadamas/k-skill@0 exec ktx-booking scripts/ktx_booking.py -- source
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Inputs
|
|
29
|
-
|
|
30
|
-
- `--dep`: 출발역명. `서울`과 `서울역` 모두 허용한다.
|
|
31
|
-
- `--arr`: 도착역명.
|
|
32
|
-
- `--date`: `YYYYMMDD`.
|
|
33
|
-
- `--time`: 가장 이른 출발시각 `HHMM`, 기본 `0000`.
|
|
34
|
-
- `--time-limit`: 가장 늦은 출발시각 `HHMM`, 기본 `2359`.
|
|
35
|
-
- `--limit`: 최대 결과 수, 1~50.
|
|
36
|
-
|
|
37
|
-
## Output
|
|
38
|
-
|
|
39
|
-
- `count`
|
|
40
|
-
- `trains[]`: `train_no`, `train_type`, `dep`, `arr`, `dep_time`, `arr_time`
|
|
41
|
-
- `date`
|
|
42
|
-
- `schedule_note`
|
|
43
|
-
- `source`: 공식 게시물 제목·게시일·XLSX URL·게시판 URL
|
|
44
|
-
- `booking_url`
|
|
45
|
-
|
|
46
|
-
항상 이 결과는 **공개 운행계획 시간표**이며 실시간 잔여석·운휴·지연 정보가 아니라는 점을 명시한다.
|
|
47
|
-
|
|
48
|
-
## Failure modes
|
|
49
|
-
|
|
50
|
-
- 공식 시간표 게시판 또는 XLSX 다운로드 실패
|
|
51
|
-
- 요청일에 적용되는 KTX 시간표 없음
|
|
52
|
-
- XLSX 형식 변경으로 header를 찾지 못함
|
|
53
|
-
- 요청 구간·시간대 결과 없음: 오류가 아니라 `count: 0`
|
|
54
|
-
- 잘못된 날짜·시간·limit: 실행 전 오류
|
|
55
|
-
|
|
56
|
-
## Hard boundaries
|
|
57
|
-
|
|
58
|
-
- 로그인·credential 요청 금지
|
|
59
|
-
- `ScheduleView`, `korail2`, Dynapath 등 앱 내부 경로 사용 금지
|
|
60
|
-
- 예약·결제·취소·좌석 선점 금지
|
|
61
|
-
- CAPTCHA·인증·anti-bot 통제 우회 금지
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# KTX 공식 시간표 조회 관련 고지
|
|
2
|
-
|
|
3
|
-
이 스킬은 한국철도공사가 공개한 시간표 게시판과 XLSX 첨부파일만 읽는다.
|
|
4
|
-
|
|
5
|
-
- 회원 로그인과 credential을 사용하지 않는다.
|
|
6
|
-
- Korail 앱 내부 API, `ScheduleView`, Dynapath token을 호출·생성·재현하지 않는다.
|
|
7
|
-
- CAPTCHA, anti-bot 또는 접근통제를 우회하지 않는다.
|
|
8
|
-
- 실시간 잔여석, 예약, 좌석 선점, 결제, 취소를 실행하지 않는다.
|
|
9
|
-
|
|
10
|
-
결과는 공개 운행계획 시간표이며 실제 운휴·지연·잔여석 정보가 아니다. 실제 이용 전에는 공식 코레일 예매 페이지에서 다시 확인해야 한다.
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# DISCLAIMER — `ktx-booking`
|
|
2
|
-
|
|
3
|
-
이 스킬은 한국철도공사·코레일·KTX의 공식 기능 또는 공식 지원 도구가 아니며, 공식 제휴·후원·승인·인증 또는 협업한 사실이 전혀 없습니다. 상표와 서비스명은 열차 조회·호환 대상을 설명하기 위해서만 사용합니다.
|
|
4
|
-
|
|
5
|
-
대법원 2005. 6. 10. 선고 [2005도1637 판결](https://www.law.go.kr/LSW/precInfoP.do?precSeq=83920)(소니용 리모컨 사건)은 기능 설명용 표장과 출처표시를 구별했습니다. [상표법 제2조](https://www.law.go.kr/법령/상표법/제2조), [제89조](https://www.law.go.kr/법령/상표법/제89조), [제90조](https://www.law.go.kr/법령/상표법/제90조), [제108조](https://www.law.go.kr/법령/상표법/제108조)에 따른 출처 혼동 판단은 별도입니다.
|
|
6
|
-
|
|
7
|
-
대법원 2022. 5. 12. 선고 [2021도1533 판결](https://www.law.go.kr/LSW/precInfoP.do?precSeq=221765)은 공개정보 수집만으로 곧바로 [정보통신망법 제48조](https://www.law.go.kr/법령/정보통신망이용촉진및정보보호등에관한법률/제48조) 위반이 되는 것은 아닌 사정을 제시했지만, 철도 예매 자동화·접근통제 우회·반복 선점을 허용하지 않습니다. [저작권법 제93조](https://www.law.go.kr/법령/저작권법/제93조)와 [형법 제314조 제2항](https://www.law.go.kr/법령/형법/제314조)도 별도입니다.
|
|
8
|
-
|
|
9
|
-
- 공개 운행정보 자동 수집은 반드시 개인의 정보 조회용으로만 사용합니다.
|
|
10
|
-
- 매진 감시, 조직적·대량 크롤링, 반복 선점·예약·취소, 공격적 polling을 하지 않습니다.
|
|
11
|
-
- CAPTCHA·anti-bot·로그인·접근통제·rate limit·IP 차단을 우회하거나 차단 회피를 하지 않습니다.
|
|
12
|
-
- `MACRO ERROR`나 접근 거부가 나타나면 즉시 중단하며 정상 예매 영업을 방해하지 않습니다.
|
|
13
|
-
|
|
14
|
-
이 문서는 적법성을 보증하는 법률 자문이 아닙니다.
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
# 상표 사용 법적 고지 — `ktx-booking`
|
|
2
|
-
|
|
3
|
-
이 스킬에서 `KTX`, `코레일`, `Korail` 명칭은 열차 조회·예약·취소의 **대상 철도 서비스와 운영기관**을 식별하기 위해 사용한다. k-skill의 출처나 운영주체를 코레일로 표시하려는 사용이 아니다.
|
|
4
|
-
|
|
5
|
-
대법원 2005. 6. 10. 선고 [2005도1637 판결](https://www.law.go.kr/LSW/precInfoP.do?precSeq=83920)은 타인의 표장을 출처표시가 아니라 상품 기능 또는 적용 기종을 밝히기 위해 사용하고 상표 사용으로 인식될 수 없는 경우 침해가 아니라고 판시했다. [상표법 제2조](https://www.law.go.kr/법령/상표법/제2조), [제89조](https://www.law.go.kr/법령/상표법/제89조), [제90조](https://www.law.go.kr/법령/상표법/제90조), [제108조](https://www.law.go.kr/법령/상표법/제108조)와 대법원 [2011다18802](https://www.law.go.kr/LSW/precInfoP.do?precSeq=167457), [2019후10418](https://law.go.kr/LSW/precInfoP.do?mode=0&precSeq=230725) 판결에 따라 실제 거래계에서 출처표시로 기능하는지는 표시 태양과 사용 경위 등을 종합해 판단해야 한다.
|
|
6
|
-
|
|
7
|
-
따라서 이 명칭은 필요한 범위의 평문으로만 사용하고, 별도 근거 없이 로고, 공식·제휴·후원·인증·파트너 표현을 사용하지 않는다. 각 상표의 권리는 해당 권리자에게 있다. 이 문서는 운송계약, API·서비스 약관, 개인정보 또는 예약·결제 흐름의 적법성을 판단하지 않는다.
|
|
8
|
-
|
|
9
|
-
전체 검토: [제3자 상표의 기능 설명·호환 대상 표시 검토](https://github.com/NomaDamas/k-skill/blob/dev/docs/legal/trademark-use-review.md)
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "ktx-booking",
|
|
3
|
-
"description": "Read-only KTX operating-timetable lookup from official Korail public XLSX attachments. No login, internal mobile API, anti-bot bypass, live seat availability, reservation, or payment.",
|
|
4
|
-
"profiles": [
|
|
5
|
-
"lookup"
|
|
6
|
-
],
|
|
7
|
-
"frontmatter": "name: ktx-booking\ndescription: Read-only KTX operating-timetable lookup from official Korail public XLSX attachments. No login, internal mobile API, anti-bot bypass, live seat availability, reservation, or payment.\nlicense: MIT\nmetadata:\n category: travel\n locale: ko-KR\n phase: v1"
|
|
8
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
# SRT Live Timetable Lookup
|
|
2
|
-
|
|
3
|
-
## What this skill does
|
|
4
|
-
|
|
5
|
-
`SRTrain`의 시간표 검색 경로를 이용해 현재 SRT 운행 후보와 일반실·특실 예약 가능 여부를 조회한다.
|
|
6
|
-
|
|
7
|
-
이 스킬은 회원 로그인 불필요한 **라이브 조회 전용**이다.
|
|
8
|
-
|
|
9
|
-
- `auto_login=False` 익명 client를 사용한다.
|
|
10
|
-
- NetFunnel 대기열과 시간표 검색 요청만 실행한다.
|
|
11
|
-
- 예약, 예약대기, 좌석 선점, 결제, 취소, 자동 재조회는 실행하지 않는다.
|
|
12
|
-
- 정확한 호차·좌석번호를 조회하지 않는다.
|
|
13
|
-
- 구매는 공식 SRT 페이지에서 사용자가 직접 진행한다.
|
|
14
|
-
|
|
15
|
-
실행 환경에는 Python 3.11 이상과 `uv`가 필요하다. `uv`가 없으면 공식 설치 문서를 안내하고 조회를 실행하지 않는다.
|
|
16
|
-
|
|
17
|
-
## Commands
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
npx -y @nomadamas/k-skill@0 exec srt-booking scripts/srt_booking.py -- \
|
|
21
|
-
search \
|
|
22
|
-
--dep 수서 \
|
|
23
|
-
--arr 부산 \
|
|
24
|
-
--date 20260819 \
|
|
25
|
-
--time 0600 \
|
|
26
|
-
--time-limit 1200 \
|
|
27
|
-
--limit 5
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
현재 라이브 조회 endpoint와 안전 경계:
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
npx -y @nomadamas/k-skill@0 exec srt-booking scripts/srt_booking.py -- source
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
출력:
|
|
37
|
-
|
|
38
|
-
- 열차번호·열차종류
|
|
39
|
-
- 출발역·도착역
|
|
40
|
-
- 현재 출발·도착 시각
|
|
41
|
-
- 일반실·특실 예약 가능 여부
|
|
42
|
-
- 사용한 라이브 search endpoint
|
|
43
|
-
- 공식 SRT 페이지
|
|
44
|
-
|
|
45
|
-
## Workflow
|
|
46
|
-
|
|
47
|
-
1. 출발역, 도착역, 날짜, 시간대를 확인한다.
|
|
48
|
-
2. `search`를 한 번 실행한다. `수서역`처럼 `역`이 붙은 입력은 helper가 표준 역명으로 정규화한다.
|
|
49
|
-
3. 현재 운행 후보를 제시한다.
|
|
50
|
-
4. 좌석 구매가 필요하면 `booking_url`을 제공하고 종료한다.
|
|
51
|
-
5. 사용자가 다시 요청하지 않는 한 polling·매진 감시를 시작하지 않는다.
|
|
52
|
-
|
|
53
|
-
## Hard boundaries
|
|
54
|
-
|
|
55
|
-
- `KSKILL_SRT_ID`, `KSKILL_SRT_PASSWORD` 또는 회원 로그인을 요구하지 않는다.
|
|
56
|
-
- helper에 `reserve`, `reservations`, `cancel`, `payment`, waiting-list 명령을 추가하지 않는다.
|
|
57
|
-
- 예약 endpoint, 결제 endpoint 또는 계정 endpoint를 호출하지 않는다.
|
|
58
|
-
- NetFunnel key를 예약·선점 자동화에 사용하지 않는다.
|
|
59
|
-
- CAPTCHA·접근 거부·계정 제한이 발생하면 즉시 중단한다.
|
|
60
|
-
- 사용자 요청 한 번을 반복 수집이나 장기 실행으로 확장하지 않는다.
|
|
61
|
-
|
|
62
|
-
## Failure modes
|
|
63
|
-
|
|
64
|
-
- NetFunnel 대기 또는 SRT 접근 제한
|
|
65
|
-
- `SRTrain` 설치·호환성 문제
|
|
66
|
-
- 날짜·시간 또는 역명 오류
|
|
67
|
-
- 조건에 맞는 열차 없음
|
|
68
|
-
|
|
69
|
-
이 경우 차단을 우회하지 않고 [SRT 공식 조회 페이지](https://etk.srail.kr/hpg/hra/01/selectScheduleList.do?pageId=TK0101010000)를 안내한다.
|
|
70
|
-
|
|
71
|
-
## Legal notice
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
npx -y @nomadamas/k-skill@0 read srt-booking references/AUTOMATION-LEGAL-STATEMENT.md
|
|
75
|
-
```
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# SRT 라이브 자동조회 관련 고지
|
|
2
|
-
|
|
3
|
-
> 2026-08-12에 확인한 공개 자료를 바탕으로 한 일반적인 위험 안내이며 법률자문이나 주식회사 에스알의 유권해석이 아니다.
|
|
4
|
-
|
|
5
|
-
## 결론
|
|
6
|
-
|
|
7
|
-
이 스킬은 로그인 없이 `SRTrain`의 시간표 검색 endpoint만 호출하고 예약·결제·취소·좌석 선점을 제공하지 않는다. 따라서 기존 자동예매보다 위험은 낮다.
|
|
8
|
-
|
|
9
|
-
그러나 에스알은 공식 공지에서 매크로 프로그램을 이용한 **승차권 예매**를 금지한다. 조회 전용이라는 사실이 자동 접근에 대한 에스알의 허가를 뜻하지는 않는다.
|
|
10
|
-
|
|
11
|
-
## 기술적 경계
|
|
12
|
-
|
|
13
|
-
- `SRT("", "", auto_login=False)` 익명 client
|
|
14
|
-
- NetFunnel 대기열과 `selectListAra10007_n.do` 시간표 검색만 실행
|
|
15
|
-
- 일반실·특실 가능 여부만 조회
|
|
16
|
-
- 예약·예약대기·결제·취소·계정 endpoint 없음
|
|
17
|
-
- 한 사용자 요청에 한 번만 실행하고 polling 없음
|
|
18
|
-
|
|
19
|
-
## 공식 근거
|
|
20
|
-
|
|
21
|
-
[매크로 프로그램을 이용한 승차권 예매 금지 안내](https://etk.srail.kr/cms/article/view.do?pageId=TK0502000000&postNo=793)는 매크로를 이용한 예매가 시스템 과부하와 다른 고객의 예매 기회 방해를 초래할 수 있고 적발 시 회원 탈퇴 처리될 수 있다고 안내한다.
|
|
22
|
-
|
|
23
|
-
[에스알 회원가입 및 이용에 관한 약관](https://etk.srail.kr/cms/archive.do?pageId=TK0503010000) 제10조는 다량 예약 후 임박 취소, 타인 계정 도용과 건전한 서비스 이용 저해를 탈퇴 사유로 규정한다.
|
|
24
|
-
|
|
25
|
-
NetFunnel 오류, 접근 거부, CAPTCHA 또는 정책 변경이 발생하면 우회하지 않고 즉시 중단한다.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# DISCLAIMER — `srt-booking`
|
|
2
|
-
|
|
3
|
-
이 스킬은 에스알·SRT 또는 철도 운영사의 공식 기능 또는 공식 지원 도구가 아니며, 공식 제휴·후원·승인·인증 또는 협업한 사실이 전혀 없습니다. 상표와 서비스명은 열차·좌석 조회 기능과 대상을 설명하기 위해서만 사용합니다.
|
|
4
|
-
|
|
5
|
-
대법원 2005. 6. 10. 선고 [2005도1637 판결](https://www.law.go.kr/LSW/precInfoP.do?precSeq=83920)(소니용 리모컨 사건)은 기능 설명용 표장과 출처표시를 구별했습니다. [상표법 제2조](https://www.law.go.kr/법령/상표법/제2조), [제89조](https://www.law.go.kr/법령/상표법/제89조), [제90조](https://www.law.go.kr/법령/상표법/제90조), [제108조](https://www.law.go.kr/법령/상표법/제108조)에 따른 출처 혼동 판단은 별도입니다.
|
|
6
|
-
|
|
7
|
-
대법원 2022. 5. 12. 선고 [2021도1533 판결](https://www.law.go.kr/LSW/precInfoP.do?precSeq=221765)은 공개정보 수집만으로 곧바로 [정보통신망법 제48조](https://www.law.go.kr/법령/정보통신망이용촉진및정보보호등에관한법률/제48조) 위반이 되는 것은 아닌 사정을 제시했지만, 철도 예매 자동화·접근통제 우회·반복 선점을 허용하지 않습니다. [저작권법 제93조](https://www.law.go.kr/법령/저작권법/제93조)과 [형법 제314조 제2항](https://www.law.go.kr/법령/형법/제314조)은 별도입니다.
|
|
8
|
-
|
|
9
|
-
- 공개 운행·좌석정보 자동 수집은 반드시 개인의 정보 조회용으로만 사용합니다.
|
|
10
|
-
- 매진 감시, 조직적·대량 크롤링, 반복 선점·예약·취소, 공격적 polling을 하지 않습니다.
|
|
11
|
-
- CAPTCHA·anti-bot·로그인·접근통제·rate limit·IP 차단을 우회하거나 정상 예매 영업을 방해하지 않습니다.
|
|
12
|
-
|
|
13
|
-
이 문서는 적법성을 보증하는 법률 자문이 아닙니다.
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
# 상표 사용 법적 고지 — `srt-booking`
|
|
2
|
-
|
|
3
|
-
이 스킬에서 `SRT` 및 `SR` 명칭은 열차 조회·예약·취소의 **대상 철도 서비스와 운영기관**을 식별하기 위해 사용한다. k-skill의 출처나 운영주체를 SR로 표시하려는 사용이 아니다.
|
|
4
|
-
|
|
5
|
-
대법원 2005. 6. 10. 선고 [2005도1637 판결](https://www.law.go.kr/LSW/precInfoP.do?precSeq=83920)은 타인의 표장을 출처표시가 아니라 상품 기능 또는 적용 기종을 밝히기 위해 사용하고 상표 사용으로 인식될 수 없는 경우 침해가 아니라고 판시했다. [상표법 제2조](https://www.law.go.kr/법령/상표법/제2조), [제89조](https://www.law.go.kr/법령/상표법/제89조), [제90조](https://www.law.go.kr/법령/상표법/제90조), [제108조](https://www.law.go.kr/법령/상표법/제108조)와 대법원 [2011다18802](https://www.law.go.kr/LSW/precInfoP.do?precSeq=167457), [2019후10418](https://law.go.kr/LSW/precInfoP.do?mode=0&precSeq=230725) 판결에 따라 실제 거래계에서 출처표시로 기능하는지는 표시 태양과 사용 경위 등을 종합해 판단해야 한다.
|
|
6
|
-
|
|
7
|
-
따라서 이 명칭은 필요한 범위의 평문으로만 사용하고, 별도 근거 없이 로고, 공식·제휴·후원·인증·파트너 표현을 사용하지 않는다. 각 상표의 권리는 해당 권리자에게 있다. 이 문서는 운송계약, API·서비스 약관, 개인정보 또는 예약·결제 흐름의 적법성을 판단하지 않는다.
|
|
8
|
-
|
|
9
|
-
전체 검토: [제3자 상표의 기능 설명·호환 대상 표시 검토](https://github.com/NomaDamas/k-skill/blob/dev/docs/legal/trademark-use-review.md)
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env -S uv run --locked --script
|
|
2
|
-
# /// script
|
|
3
|
-
# requires-python = ">=3.11"
|
|
4
|
-
# dependencies = ["SRTrain==2.6.7"]
|
|
5
|
-
# ///
|
|
6
|
-
"""Live, anonymous, read-only SRT timetable lookup through SRTrain."""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import argparse
|
|
11
|
-
import json
|
|
12
|
-
import re
|
|
13
|
-
import sys
|
|
14
|
-
from contextlib import redirect_stdout
|
|
15
|
-
from datetime import date as calendar_date
|
|
16
|
-
from datetime import time
|
|
17
|
-
from typing import Any
|
|
18
|
-
|
|
19
|
-
from requests import RequestException
|
|
20
|
-
from SRT import SRT
|
|
21
|
-
from SRT.constants import API_ENDPOINTS, STATION_CODE
|
|
22
|
-
from SRT.errors import SRTError, SRTNetFunnelError
|
|
23
|
-
from SRT.netfunnel import NetFunnelHelper
|
|
24
|
-
|
|
25
|
-
BOOKING_URL = "https://etk.srail.kr/hpg/hra/01/selectScheduleList.do?pageId=TK0101010000"
|
|
26
|
-
NETFUNNEL_URL = "https://nf.letskorail.com/ts.wseq"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def build_client() -> SRT:
|
|
30
|
-
NetFunnelHelper.NETFUNNEL_URL = NETFUNNEL_URL
|
|
31
|
-
return SRT("", "", auto_login=False)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def source_info() -> dict[str, str]:
|
|
35
|
-
return {
|
|
36
|
-
"mode": "live",
|
|
37
|
-
"transport": "SRTrain",
|
|
38
|
-
"operator": "주식회사 에스알",
|
|
39
|
-
"endpoint": API_ENDPOINTS["search_schedule"],
|
|
40
|
-
"queue_endpoint": NETFUNNEL_URL,
|
|
41
|
-
"authentication": "anonymous",
|
|
42
|
-
"mutation": "none; timetable search only",
|
|
43
|
-
"booking_url": BOOKING_URL,
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def format_time(value: str) -> str:
|
|
48
|
-
return f"{value[:2]}:{value[2:4]}"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def normalize_station(value: str) -> str:
|
|
52
|
-
"""Accept common "...역" input for a canonical SRT station name."""
|
|
53
|
-
name = value.strip()
|
|
54
|
-
if name in STATION_CODE:
|
|
55
|
-
return name
|
|
56
|
-
if name.endswith("역") and name[:-1] in STATION_CODE:
|
|
57
|
-
return name[:-1]
|
|
58
|
-
return name
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def normalize_train(train: Any) -> dict[str, Any]:
|
|
62
|
-
return {
|
|
63
|
-
"train_no": str(train.train_number),
|
|
64
|
-
"train_type": str(train.train_name),
|
|
65
|
-
"dep": str(train.dep_station_name),
|
|
66
|
-
"arr": str(train.arr_station_name),
|
|
67
|
-
"dep_date": str(train.dep_date),
|
|
68
|
-
"dep_time": format_time(str(train.dep_time)),
|
|
69
|
-
"arr_time": format_time(str(train.arr_time)),
|
|
70
|
-
"general_seat_available": bool(train.general_seat_available()),
|
|
71
|
-
"special_seat_available": bool(train.special_seat_available()),
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def search_live_timetable(
|
|
76
|
-
*,
|
|
77
|
-
dep: str,
|
|
78
|
-
arr: str,
|
|
79
|
-
date: str,
|
|
80
|
-
earliest: str,
|
|
81
|
-
latest: str,
|
|
82
|
-
limit: int,
|
|
83
|
-
) -> dict[str, Any]:
|
|
84
|
-
validate_date(date)
|
|
85
|
-
start = validate_time(earliest)
|
|
86
|
-
end = validate_time(latest)
|
|
87
|
-
if start > end:
|
|
88
|
-
raise ValueError("--time must not be later than --time-limit")
|
|
89
|
-
client = build_client()
|
|
90
|
-
with redirect_stdout(sys.stderr):
|
|
91
|
-
trains = client.search_train(
|
|
92
|
-
dep=normalize_station(dep),
|
|
93
|
-
arr=normalize_station(arr),
|
|
94
|
-
date=date,
|
|
95
|
-
time=start,
|
|
96
|
-
time_limit=end,
|
|
97
|
-
available_only=False,
|
|
98
|
-
)
|
|
99
|
-
return {
|
|
100
|
-
"count": min(len(trains), limit),
|
|
101
|
-
"trains": [normalize_train(train) for train in trains[:limit]],
|
|
102
|
-
"date": date,
|
|
103
|
-
"source": source_info(),
|
|
104
|
-
"schedule_note": "실시간 시간표·좌석 가능 여부 조회이며 예약·좌석 선점은 실행하지 않습니다.",
|
|
105
|
-
"booking_url": BOOKING_URL,
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
def validate_date(value: str) -> str:
|
|
110
|
-
if not re.fullmatch(r"\d{8}", value):
|
|
111
|
-
raise ValueError("date must use YYYYMMDD")
|
|
112
|
-
try:
|
|
113
|
-
calendar_date(int(value[:4]), int(value[4:6]), int(value[6:]))
|
|
114
|
-
except ValueError as exc:
|
|
115
|
-
raise ValueError("date must use a valid YYYYMMDD value") from exc
|
|
116
|
-
return value
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
def validate_time(value: str) -> str:
|
|
120
|
-
if not re.fullmatch(r"\d{4}", value):
|
|
121
|
-
raise ValueError("time must use HHMM")
|
|
122
|
-
try:
|
|
123
|
-
time.fromisoformat(f"{value[:2]}:{value[2:]}")
|
|
124
|
-
except ValueError as exc:
|
|
125
|
-
raise ValueError("time must use a valid HHMM value") from exc
|
|
126
|
-
return value + "00"
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
def build_parser() -> argparse.ArgumentParser:
|
|
130
|
-
parser = argparse.ArgumentParser(description="SRT live timetable lookup through SRTrain (read-only)")
|
|
131
|
-
commands = parser.add_subparsers(dest="command", required=True)
|
|
132
|
-
search = commands.add_parser("search", help="query the current SRT timetable")
|
|
133
|
-
search.add_argument("--dep", required=True)
|
|
134
|
-
search.add_argument("--arr", required=True)
|
|
135
|
-
search.add_argument("--date", required=True, help="YYYYMMDD")
|
|
136
|
-
search.add_argument("--time", default="0000", help="earliest departure, HHMM")
|
|
137
|
-
search.add_argument("--time-limit", default="2359", help="latest departure, HHMM")
|
|
138
|
-
search.add_argument("--limit", type=int, default=10)
|
|
139
|
-
commands.add_parser("source", help="show the read-only live query endpoint")
|
|
140
|
-
return parser
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
def main(argv: list[str] | None = None) -> int:
|
|
144
|
-
parser = build_parser()
|
|
145
|
-
args = parser.parse_args(argv)
|
|
146
|
-
try:
|
|
147
|
-
if args.command == "source":
|
|
148
|
-
print(json.dumps(source_info(), ensure_ascii=False, indent=2))
|
|
149
|
-
return 0
|
|
150
|
-
if args.limit < 1 or args.limit > 50:
|
|
151
|
-
raise ValueError("--limit must be between 1 and 50")
|
|
152
|
-
result = search_live_timetable(
|
|
153
|
-
dep=args.dep,
|
|
154
|
-
arr=args.arr,
|
|
155
|
-
date=args.date,
|
|
156
|
-
earliest=args.time,
|
|
157
|
-
latest=args.time_limit,
|
|
158
|
-
limit=args.limit,
|
|
159
|
-
)
|
|
160
|
-
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
161
|
-
return 0
|
|
162
|
-
except (SRTNetFunnelError, RequestException):
|
|
163
|
-
parser.error(f"SRT timetable lookup unavailable; use the official page: {BOOKING_URL}")
|
|
164
|
-
return 2
|
|
165
|
-
except (SRTError, ValueError) as exc:
|
|
166
|
-
parser.error(str(exc))
|
|
167
|
-
return 2
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
if __name__ == "__main__":
|
|
171
|
-
sys.exit(main())
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
version = 1
|
|
2
|
-
revision = 1
|
|
3
|
-
requires-python = ">=3.11"
|
|
4
|
-
|
|
5
|
-
[manifest]
|
|
6
|
-
requirements = [{ name = "srtrain", specifier = "==2.6.7" }]
|
|
7
|
-
|
|
8
|
-
[[package]]
|
|
9
|
-
name = "certifi"
|
|
10
|
-
version = "2026.7.22"
|
|
11
|
-
source = { registry = "https://pypi.org/simple" }
|
|
12
|
-
sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112 }
|
|
13
|
-
wheels = [
|
|
14
|
-
{ url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983 },
|
|
15
|
-
]
|
|
16
|
-
|
|
17
|
-
[[package]]
|
|
18
|
-
name = "charset-normalizer"
|
|
19
|
-
version = "3.5.0"
|
|
20
|
-
source = { registry = "https://pypi.org/simple" }
|
|
21
|
-
sdist = { url = "https://files.pythonhosted.org/packages/cb/31/4971872b3ed8715346231fb6eb4da8fcba65a4143c189db151ee28a2812b/charset_normalizer-3.5.0.tar.gz", hash = "sha256:49bd5feb59b0bf3cbf6ebcf4352e371c95b9da9bacd4449f8b64d0ad2c10a26e", size = 169295 }
|
|
22
|
-
wheels = [
|
|
23
|
-
{ url = "https://files.pythonhosted.org/packages/50/42/71e4e3bfe59202feef062c68487f54c6adf501cfbe087ecd93e3cd597fea/charset_normalizer-3.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e46a37ea7fcf9ae01d71b2e5ece19f1565987f3e308394b829197cbefc061f92", size = 349110 },
|
|
24
|
-
{ url = "https://files.pythonhosted.org/packages/0f/dd/fd3386d0fbd358d3b5c7a2fa5bf312afe6159b04fafeb67d39fa971d7448/charset_normalizer-3.5.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cdfed4d7a59333c8220c67dd3be4e7a6c887b67453a64394022dcc919570add", size = 250773 },
|
|
25
|
-
{ url = "https://files.pythonhosted.org/packages/17/ad/4901a66d6d3b17f1096725d7e50266132c16555aa6a70047fe1cf262b4b2/charset_normalizer-3.5.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9491f594859b68052edebd69e05fb045055a713b57a67974e6c1553b4e503c39", size = 240229 },
|
|
26
|
-
{ url = "https://files.pythonhosted.org/packages/43/b7/1d790e0425e0f4c99e9b89a3956a94a6d2d0c6f01b2a5eca93d8f082d5ac/charset_normalizer-3.5.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:420b19411959eec115063229536788e6b32d0a7fa907d6b940317919120d702d", size = 280757 },
|
|
27
|
-
{ url = "https://files.pythonhosted.org/packages/44/bb/4b8c8086c67636e52d6354ad17697f54a00b40041ca53dc765737e21709b/charset_normalizer-3.5.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a565303d118ea3b94a4b6c076bf568069726be414e43b06d58f7070b076ce11d", size = 276174 },
|
|
28
|
-
{ url = "https://files.pythonhosted.org/packages/25/fa/690a11924c40c766d258d2b74d817cc5efe7bbcfceeedc5c0f35256d7524/charset_normalizer-3.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:815f143a91983ba3041bba066e492ae3c42de523fb1c699685a1abf3313b7d1b", size = 261808 },
|
|
29
|
-
{ url = "https://files.pythonhosted.org/packages/53/2d/4a6945eff0c8f684e3f5b7b978644ab18ba9198da060dbaa1d9206bc6cc9/charset_normalizer-3.5.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c5e981a5ac8641381efe6f0029467500661616a530d27bc6eedfe45f840599f8", size = 259922 },
|
|
30
|
-
{ url = "https://files.pythonhosted.org/packages/60/4d/10ac7e07bbf7ea569effeb9524e32f345f7e643800b20d538fb4706eab4e/charset_normalizer-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1a573e1e428f93908e79e04b349717f400e720f2f82285f0aaaf3ee0ff7f4c79", size = 252315 },
|
|
31
|
-
{ url = "https://files.pythonhosted.org/packages/13/bf/1ddacf7aa7da12097f229a6a4e71a70200937a621b3617f6dc819fb99a66/charset_normalizer-3.5.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:32e6d56dd825205f81e5c45bcebb4df6a11fb2bbf4969a01ef156d6ced90c224", size = 240600 },
|
|
32
|
-
{ url = "https://files.pythonhosted.org/packages/c2/88/293444d48c8d86fe51552262117134a9fc666d68cbbbc9b8c1b2b35a29be/charset_normalizer-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:30ae26a1adcd943690dcbbc47f28be762bae9e08ad7442b78c86b1c0dd5a626c", size = 280788 },
|
|
33
|
-
{ url = "https://files.pythonhosted.org/packages/12/ed/0e34e40584f51eda38d4a5daf25fd8586366347efd4b2470dbf64710e778/charset_normalizer-3.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5f51a19dc52197a20218b05ec5336d0c6b3b09935f838724722032c8d45dc91a", size = 258425 },
|
|
34
|
-
{ url = "https://files.pythonhosted.org/packages/72/b2/c1b1c27f6f0ef35b21a8bdb592854bbf7f219629db3477f74c0b1380e0ed/charset_normalizer-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6e44bc2780516b3df986d6fe33103c7080cd9dcd5576fe3cb4b0f64309c8f22b", size = 277437 },
|
|
35
|
-
{ url = "https://files.pythonhosted.org/packages/b2/bd/a1b7d959a37847675adb2f5978f81703306dd78df4fefb82ee5a1cc5e37f/charset_normalizer-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7faa47b56070b3dd6f4898ed28528843ab130d53266cb9948d9b1f3bb1a5c5e8", size = 262947 },
|
|
36
|
-
{ url = "https://files.pythonhosted.org/packages/c1/fd/a76a2d7e639bfc6a9c869371e34f28231eaca7d7126ec19895aa38eedb51/charset_normalizer-3.5.0-cp311-cp311-win32.whl", hash = "sha256:830c04a49998b5ed58c8b642c65b7b26419397f52392a64121ba9fd0e95e7f9f", size = 181313 },
|
|
37
|
-
{ url = "https://files.pythonhosted.org/packages/97/84/6fc03e802578df41a2ab9b6a1f26657fb92e32285a603ad5852a4a4f68c1/charset_normalizer-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:8cb9b6892b53bd6d11fa4cde3dbee020b1f0b6656be1fbaa1ec0d4324a7839db", size = 206197 },
|
|
38
|
-
{ url = "https://files.pythonhosted.org/packages/0a/27/7208360ff1901607359869fcc45ca0989d597f3e30777ba30c7254170587/charset_normalizer-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:2403b489c103e9a18c835863fc6dd54361355c8291d4cafdb37492b683440b9b", size = 184925 },
|
|
39
|
-
{ url = "https://files.pythonhosted.org/packages/6d/3c/045ea64ea5a550870dd8ab60b2242870328d53f17d2be593b4f9f3121474/charset_normalizer-3.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:98820e1ceb25c6df7a80c4fd8efa59cb121f99bc7c4c1693ad94a2caff5b311d", size = 343861 },
|
|
40
|
-
{ url = "https://files.pythonhosted.org/packages/fc/1b/7502be709db899d5b4801509829188b3a5a10969411da9c846115a5f1b70/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:608553f476fca509537e804c4a71f5eb166ce63b75141f89c2c686ce1aa36956", size = 237550 },
|
|
41
|
-
{ url = "https://files.pythonhosted.org/packages/ca/ce/66392661375148d9455c17bee25509a54e28c39969e34befa48ec8777936/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6753de11eef42f1c321b26d682957d92c7f7bbce6530f34bbe0f9291dd37cc6f", size = 229673 },
|
|
42
|
-
{ url = "https://files.pythonhosted.org/packages/6a/64/f58c32a8d4ecf55b82ee61ee9aa6a664d4afcd36c72feb4c926fd6fe9af8/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f76dc0a47f94cb9b69d86f01e477f4b0371ca70208b9ccea7e063c41eed9046", size = 260768 },
|
|
43
|
-
{ url = "https://files.pythonhosted.org/packages/b1/ea/36c90e59a96386174377e855479ec154221ef001e96637e0b23be92489c4/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c387c6bf91b4774e359a48a179e2872b8e8bf741e4fde06ba8d1665eb9a4760a", size = 257880 },
|
|
44
|
-
{ url = "https://files.pythonhosted.org/packages/23/35/5b85772eb82528ef22ba29487ad544a7049dfd27f35b1a5a55dbc0843048/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14f6904a3cf870abf044df3a8c4924ac6c8ef77e9896586fd37e73ae96cff2af", size = 247547 },
|
|
45
|
-
{ url = "https://files.pythonhosted.org/packages/b6/14/ba11a99c2a22ab04c2d5383a700b378cb463a78ab15f36444cabc10cd671/charset_normalizer-3.5.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cce46dd29d73e135e8087b96eb62a4aca6d69391b7f97808c6588ebed3178f3", size = 243326 },
|
|
46
|
-
{ url = "https://files.pythonhosted.org/packages/4c/4a/cadba3f2400b45aa1d62a4ae0298bf58a3b30b1158baf15c338c7ce5b601/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b476cdb63df22da2b91837593380be3ddbe406f36c506c1c91d80e7196b66288", size = 238820 },
|
|
47
|
-
{ url = "https://files.pythonhosted.org/packages/47/41/d5188b9342d75b72c2b05d3ee373f01a691397e770f001ee05e3b37925f5/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1f56ce84b317ef2a59d7d3461891c7597c79247d2192bb8114c68a1a1debfcc0", size = 231661 },
|
|
48
|
-
{ url = "https://files.pythonhosted.org/packages/13/5f/df38fa972c4e945c3d8cee2bc4e610613af522fd359c7dc7a74c419f0278/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9ce0f885239357379d92fd9a5fddbe20f0e30e0527c29ba69f8e99eeb1304a76", size = 261459 },
|
|
49
|
-
{ url = "https://files.pythonhosted.org/packages/a5/d7/043ff7720067a3beee05523465ac9c1c846c68b7884930dd483f72ee5ab6/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:96ae7ab5d8155fde927aa0864fbc8ba3cc4fde6d41ab0c7cea9d6012b4978603", size = 242300 },
|
|
50
|
-
{ url = "https://files.pythonhosted.org/packages/19/f6/33980b7b802a048e546a6d9ad2ea783a6cf6b10a86aaccd10db462d8b913/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bf91921009025e96ce57a03ced6d14604fc3baf0530351638e9504a55da6fa3b", size = 259101 },
|
|
51
|
-
{ url = "https://files.pythonhosted.org/packages/a6/b7/0d19bde844bff9165377c1da9ef3c4792a4c24bd49b5b7094d9e6f6ab58b/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0b2e44e6d42d1a4ff78ccc219a93c5449105d10b16198d1aea581080df8073f9", size = 249246 },
|
|
52
|
-
{ url = "https://files.pythonhosted.org/packages/1c/cc/2c34fdfaacdf0e96e880ef562cbf80a9b5f8ea97e0dd9e57ba348a9c65cf/charset_normalizer-3.5.0-cp312-cp312-win32.whl", hash = "sha256:deb99535e9bf0bea8e274c6413eb939a21be35a3f492678dba4d5b1f4d70f142", size = 178025 },
|
|
53
|
-
{ url = "https://files.pythonhosted.org/packages/76/d0/c34dbd1df23bcbdc1b5d2f48256340d72fa747f1eb03924a9d2fa35ed85b/charset_normalizer-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:e54dd1a66fa4bce0ccaf0db9dde336e49b3eec646dc4c1c0991279369d373a14", size = 200143 },
|
|
54
|
-
{ url = "https://files.pythonhosted.org/packages/c0/ea/4e6bf1465d60c3d8f488d5bde140d0cb91cd23ccab0dc2895cc6c6982047/charset_normalizer-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:b8ea208b304587d47931b36481342d20336e0d338ab052f8b4305926482598d6", size = 180046 },
|
|
55
|
-
{ url = "https://files.pythonhosted.org/packages/1d/be/cc7b7b6fc41984902c0d31b06f5d9297e67705c1dae9352608e5540fad09/charset_normalizer-3.5.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:5c23fa4f6eccdd601949cb00f3988c01d64e671d8faba356397971077022e144", size = 211050 },
|
|
56
|
-
{ url = "https://files.pythonhosted.org/packages/d3/ae/e3ec8f17313609f43f7b323012fdb1ee37b83432277ca4eceba83e00366c/charset_normalizer-3.5.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:07f6f42b5a6325df35b458004fb5f9f29bf502d89287a33c7cdef3590e31de0f", size = 222768 },
|
|
57
|
-
{ url = "https://files.pythonhosted.org/packages/c5/50/9f9c0d7ccc1512d49e27a0e7c12c58ec71dfe91698fa4326f058c33e1f1b/charset_normalizer-3.5.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8efc3f1563ed431882dd0dc0411b5f8ace1b1b89074981deaf6bd8af77dbe1bc", size = 193907 },
|
|
58
|
-
{ url = "https://files.pythonhosted.org/packages/fd/1d/cfe7b745ef7f4c3b7214581955b5a0869ba2ac551a58fc11036281ae167c/charset_normalizer-3.5.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:368eb2fc9482158b3a3386e8f01fa61f479c968e9a19ceab8f0188b86b312991", size = 197135 },
|
|
59
|
-
{ url = "https://files.pythonhosted.org/packages/28/55/30fafdcfca9ba616bc394240545e4cd52f4f66dea43ded81b7d2d5274fde/charset_normalizer-3.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:826a295a039178479a325be1ae60eded1f0b10f7dda749df59e2440de8f61d64", size = 339892 },
|
|
60
|
-
{ url = "https://files.pythonhosted.org/packages/f4/08/bdca5fc2bdc36ee443673dc7d12b23885a5a7b282bef85a1a4c3b325b40e/charset_normalizer-3.5.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70ff1c16eb0eb5ee6bb12739292347f981a5ba764cc4df1bc2e69b0405d4ac3b", size = 239439 },
|
|
61
|
-
{ url = "https://files.pythonhosted.org/packages/d1/9e/506c8d7a7722bba7c8cdd78c1b5ef23bda92bfbe0b3e28ea84673d519a0f/charset_normalizer-3.5.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cfdab178a4add5483e26a9bb1c16d8018ccf39b4be7a3aea6c3979e6828f2ee", size = 227896 },
|
|
62
|
-
{ url = "https://files.pythonhosted.org/packages/0d/1a/dd828f2b1d6f4bf10821b9a74d866be05ffcdbfcddfc501d6fe6428762a7/charset_normalizer-3.5.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6083d10a846218502d664375b9448508d9fa580bd834567423156c6abfbe899d", size = 262548 },
|
|
63
|
-
{ url = "https://files.pythonhosted.org/packages/be/81/196d26f6bd78b93e0d451b69082a71027ceeddd4b0be9170b81bb038f824/charset_normalizer-3.5.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0f211c21aa316cb6e2662e54a1194633a79d98a50a876addacfce7ba5b34b09f", size = 259986 },
|
|
64
|
-
{ url = "https://files.pythonhosted.org/packages/3a/6a/5b964a1eb0f9075ecd45083eeb21aaec215334f98bac3d400302ea73875d/charset_normalizer-3.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b08ebf9488c7ff5eff038e48e6ea938178dfd9dcc8598b5ca941e4ae27b20be", size = 249853 },
|
|
65
|
-
{ url = "https://files.pythonhosted.org/packages/c8/b4/aee3a9d82edd0e931091ef3e9f03e46491ae3590e96e998d0975dadbe17c/charset_normalizer-3.5.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c95450fce59f00c6d08eff6572ec2e736e5054c9450253afd5748f8416f2eb9", size = 244217 },
|
|
66
|
-
{ url = "https://files.pythonhosted.org/packages/22/3e/33f72ca11c1b619b220fd9f35905ebd171cbd0e0470f2357e467b9e861ee/charset_normalizer-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5780a29823e1d2bec69b7a104ead4195a43f3e97782efaedbf1f79a0157af715", size = 241307 },
|
|
67
|
-
{ url = "https://files.pythonhosted.org/packages/78/27/6029dccba958621c7f3a65136f87c5512d712aef9e890f09512cc171bd03/charset_normalizer-3.5.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:054420b5db984971d886e5e4e2c37c760ae6682aedbd066687ff0949d9ed5f08", size = 233305 },
|
|
68
|
-
{ url = "https://files.pythonhosted.org/packages/18/d7/691c967be459153fe9faf49bf78bc95639ef8bf6dd008f38cc6389a349eb/charset_normalizer-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d016dc857136c726958102c3b8a3986acdc65ace6fbf12cfdc09cc4bfa2935b2", size = 263465 },
|
|
69
|
-
{ url = "https://files.pythonhosted.org/packages/7c/2d/9202221be5c90b2a835924191e362690ed8dc8c7d6606100c2bd03fe0f8c/charset_normalizer-3.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f2ce3d39fb4a9d674e6639dd5d3146b2e273475d2260f10163228d66fc04433d", size = 245060 },
|
|
70
|
-
{ url = "https://files.pythonhosted.org/packages/b3/9a/298772fd0a0cbccadf36451a1cd7eef4b66a11e99b4a7f6fafc47cc62c75/charset_normalizer-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a5613a3a82c974227bde18f03409e30c467f8065cb56d822e3eb83708a5f223d", size = 261091 },
|
|
71
|
-
{ url = "https://files.pythonhosted.org/packages/82/3b/1a11fe66e555dbe2f5714ade6ba74fa29edc9155d9cf1001d4d6ed096aa7/charset_normalizer-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fded2e82ff082e5d8e017e2ddcc1411bd8cb83b8585097fc401ef574f756b888", size = 251857 },
|
|
72
|
-
{ url = "https://files.pythonhosted.org/packages/17/fc/73b817e8af3f1d25ec5cf458d405abba5a144cf9812238a61530f5eac186/charset_normalizer-3.5.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:8f006866047c6ec4b627ec144b1e0bbc7427cb31fd7c08d19897d0ac9032af3d", size = 139745 },
|
|
73
|
-
{ url = "https://files.pythonhosted.org/packages/b3/fb/ddb66303c86f7dc5043a457dad9fa82b4d6d0cb97094f9bcdde21693fd58/charset_normalizer-3.5.0-cp313-cp313-win32.whl", hash = "sha256:196e270c4e80827b5072eed7d6aa661d133afada94fe366669f9609e718d305e", size = 177217 },
|
|
74
|
-
{ url = "https://files.pythonhosted.org/packages/fb/88/6018cc8d76ea2b7cb02918f37e23e86c261d1a102713d7e88d2cfb8b211c/charset_normalizer-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:72982d9958a42f8132bf2d6b90214ed66477295ef1188731f98ae3511c6eeb5a", size = 198896 },
|
|
75
|
-
{ url = "https://files.pythonhosted.org/packages/20/2e/04c0bbfc8d9abf91959f7a3d207d45cbf63a8116984caae2381890019bb5/charset_normalizer-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:0b373bab0b867b68b8eb249da9478cab9181a42993437cd2f5dba5fb0b4fbd1b", size = 179193 },
|
|
76
|
-
{ url = "https://files.pythonhosted.org/packages/43/14/d098868dac5ff27e0258f548b1c74c6484be528384965d8fcf8fc6a4011d/charset_normalizer-3.5.0-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:d95244906ed69d0f79f190893c65e336c15959003e21449256dc05c001b52ea2", size = 211664 },
|
|
77
|
-
{ url = "https://files.pythonhosted.org/packages/e7/da/a944b32a46601ae5a4c3499e8d64ecd14fe82313f00da74dcdf00273a0b4/charset_normalizer-3.5.0-cp314-cp314-android_24_x86_64.whl", hash = "sha256:d788e2ded0c4c47efa4d73cfe59eaf975ee32f425219873d2cb3e3fbaa00f636", size = 224375 },
|
|
78
|
-
{ url = "https://files.pythonhosted.org/packages/f7/db/eabb5996be2f529744755e7b2fc9396eff4a64961f034e7fd49d54b9afb2/charset_normalizer-3.5.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:f9f91d3e8382900f3a68fa0ce94294479de9cd2de6bc0c70acd0f0dfd511836b", size = 194364 },
|
|
79
|
-
{ url = "https://files.pythonhosted.org/packages/78/65/4ad3c5be108930310d8003f5602861d5b89f728293b9f09c3a4837f7ba10/charset_normalizer-3.5.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d54625cbf4e6b60bf0639728cb8b4cb541e340f6d7cafae5806051a40ddf4c45", size = 197643 },
|
|
80
|
-
{ url = "https://files.pythonhosted.org/packages/3d/39/8fee3201b98d52289be60a775797d69be05a04fb6cfb48c1587dad33e649/charset_normalizer-3.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:1f99a8c3a1da5d955edbad18208b3d627bdd54c48a6e739fa877bdca98c686d6", size = 341384 },
|
|
81
|
-
{ url = "https://files.pythonhosted.org/packages/a7/dd/9e757101d1f76c35c0643684ba499ac3a181fb2b264c68174bf727d627e8/charset_normalizer-3.5.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf1e75dc07a3850b53d1e5f75e04d3ae12afe56284be7821771eaa2466350c73", size = 241637 },
|
|
82
|
-
{ url = "https://files.pythonhosted.org/packages/eb/e4/7857023015400bc4aa0a82fbcca29fa2dc7ec25f971a130764cb2dc7a589/charset_normalizer-3.5.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ac5a9cc079c67d75f4ddf343276031879eadbb333d1bb231cce297b8d7b9aae8", size = 226170 },
|
|
83
|
-
{ url = "https://files.pythonhosted.org/packages/7d/ae/8b52935b304f7b6bbf33151ed2b75266b09aa4b6f8f04230d948885b2577/charset_normalizer-3.5.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0dfe83c1b4d00abbf433998117a14f56a5c2bc68226c0d331709eed0d1ce539b", size = 265093 },
|
|
84
|
-
{ url = "https://files.pythonhosted.org/packages/dc/78/6e838f6bb059f2c0afc60a4e7f294252f043c254656ad4114c50302cae4d/charset_normalizer-3.5.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e4e8fa586df2208ef040684751345f10f503834a757c9a74ecd19c1a2f9b1ccd", size = 262789 },
|
|
85
|
-
{ url = "https://files.pythonhosted.org/packages/c2/08/189b27e51fddc9d6b3695331da0e31792c1d88b953ad854e57f06e9b2cc8/charset_normalizer-3.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:82cc5835997ec78afe293a192e385099355770a7db94b2fb1239d36b32796f1c", size = 250580 },
|
|
86
|
-
{ url = "https://files.pythonhosted.org/packages/ac/55/64854e99b25841f83e8e37d9df2f3d1f96f693439f80e5fabd542a7e47ab/charset_normalizer-3.5.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:19e52bda45086df8a4be4bb5910af6f5d9d3b538c78712c8ae09ef10b85bf458", size = 245008 },
|
|
87
|
-
{ url = "https://files.pythonhosted.org/packages/4f/01/7720c904fa635d4260b4dced6029cf3d298c57b26741365d5a8d28c54043/charset_normalizer-3.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3418edd0ecb72a0a3861cf72f31be0ad9b7fe338ce2b58fb5cc80b9aeb792700", size = 243892 },
|
|
88
|
-
{ url = "https://files.pythonhosted.org/packages/70/50/7bfcb327631d4870c720872b548745f6ec8baa044d51c21b5d1d32ac4e3a/charset_normalizer-3.5.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:125ee619611019471b177c70bc3e9d4cda9fad7e01d93523501d3b188df0193a", size = 230996 },
|
|
89
|
-
{ url = "https://files.pythonhosted.org/packages/24/51/40c45d6d940c04005ed721aa54bdebf1ebb2930f8a2ae537e8d60484fb27/charset_normalizer-3.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a3ad0e3da22852533858663848608f3f24c0d35e5cde415a4903476f2b4c88ec", size = 265834 },
|
|
90
|
-
{ url = "https://files.pythonhosted.org/packages/eb/d4/ef7a227ef89d215b47f9df79c3966610b17faa13bb2f236989207a631622/charset_normalizer-3.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:4ebebb410bc517e1d284c52a123e82704b21e4e7e26a21ebecf7439d0647b8a3", size = 245544 },
|
|
91
|
-
{ url = "https://files.pythonhosted.org/packages/37/a9/a4ca9156964ded61c7718eba410ce11be2fd2b263fda4bcf08367b6578cd/charset_normalizer-3.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:91f9f7c151e772acebe489eaec96e96a2877202d7dd144e3f96b8676881715a0", size = 264110 },
|
|
92
|
-
{ url = "https://files.pythonhosted.org/packages/38/6a/838364bb8702229c6e5f8b23f80ff0f052a12dfaf3113a12fd6acbe92a44/charset_normalizer-3.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:401ea6e7af9e7852ed818f64714b579c1935482049670847ca3bd7ba45dc63fb", size = 252303 },
|
|
93
|
-
{ url = "https://files.pythonhosted.org/packages/9c/5f/d88032edce951f499a2321cf7ae0d35a043c74be12bc22d81084cc7afbcc/charset_normalizer-3.5.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f7496aed56b06325a1ad419c5bf23c6dd042558e874f71dd1b958f3e255f3053", size = 139964 },
|
|
94
|
-
{ url = "https://files.pythonhosted.org/packages/37/ae/1c4a46b6b00d1c34d2ee355ef99ad6173674166800d1af0f05f85028d513/charset_normalizer-3.5.0-cp314-cp314-win32.whl", hash = "sha256:606a86c1c3196f3738de39a67a7490bbd61cb31c0e0436070bd0c6a48170b38e", size = 179790 },
|
|
95
|
-
{ url = "https://files.pythonhosted.org/packages/01/51/f94dcf34fa8eba48c1fb89b6490a5f1426e19488fe5f38aac6c648c99057/charset_normalizer-3.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:ec6c464cf45867f66a2273e2214d9199a8fbad5cb95ca0fd45f6a2fe1d9d2cf4", size = 203723 },
|
|
96
|
-
{ url = "https://files.pythonhosted.org/packages/9f/ba/91d386870b5d9e4b0d8c4034f63877cc2e47b99c81ef05f3e6d42bf9a53f/charset_normalizer-3.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:dc28949de1bb5f7f30a46f15d74ce7ac5aaa63e03c5de04d68f571c7423af834", size = 183423 },
|
|
97
|
-
{ url = "https://files.pythonhosted.org/packages/f1/c9/534ecb17b7fb95f9052c4a44cf316316a27d4a8f73e8475ff55e778dcdd7/charset_normalizer-3.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:68b7e84ae8239a94f8d2c8f3f3a3a81bcde54805ec8f42a34de927d155688ec6", size = 368967 },
|
|
98
|
-
{ url = "https://files.pythonhosted.org/packages/3c/b2/ad7c3242d7fe55cd55126c22c65cb1b49779782cdf8932fd01d12232d86a/charset_normalizer-3.5.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:58ca5dc0a0ef99f2801ec0574214c978e9574055bc783830bbb6e7433218609f", size = 239478 },
|
|
99
|
-
{ url = "https://files.pythonhosted.org/packages/7e/62/77f0b850048e430fc350ec58876b0c020f5c8d0d3956fd1a4d6ae2fa292f/charset_normalizer-3.5.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6c57af4084c10cb3286688d65e4c654190ff5edcbc2411d08cdca0a8a44c59a1", size = 227036 },
|
|
100
|
-
{ url = "https://files.pythonhosted.org/packages/f0/ba/47d951e1a51dddbaad0a1410baf49fb1d897ceb00281568f1183b79bce9a/charset_normalizer-3.5.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1619a3cc174a7e3963dd34348e6fceb6e50db0ddeb0031bd7c73a58286454fa", size = 260772 },
|
|
101
|
-
{ url = "https://files.pythonhosted.org/packages/b0/61/8c7ff4c81b2a88271126acf4b83ab3e31f6d63868b0f01d331eaa0f9cb67/charset_normalizer-3.5.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1328cc57dd4372be1265f68232cee890e087416e3e6e93e6ffb32c2bad4d36a4", size = 259273 },
|
|
102
|
-
{ url = "https://files.pythonhosted.org/packages/e1/fd/36129689be08dc287b951306946657ff70d76e287dd57018861f86d0e474/charset_normalizer-3.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06f4fb62a9139bef056b8b2da6773c94c2f259f90e4b8e53b166f3d0372d7cf6", size = 248086 },
|
|
103
|
-
{ url = "https://files.pythonhosted.org/packages/cf/f8/bcae67f994c8fd31dda445e5ebf84045823c31443fe46f0e9ee6aca99aa0/charset_normalizer-3.5.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:478650a70a750d75d5add401606c77f77069c32e4ba2c9131dc6cee566962ca0", size = 242671 },
|
|
104
|
-
{ url = "https://files.pythonhosted.org/packages/61/92/0472cdad1061c2f0e4d3aee29973eb6e81bb8fe256ff2860cf115b15f1c9/charset_normalizer-3.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:48920bf6fe83eb2226756ac623fa54940487154eb18f80889d5735cf234965c0", size = 241311 },
|
|
105
|
-
{ url = "https://files.pythonhosted.org/packages/f2/89/04a03de5d27c77c624d9fcf6287073754bd438df1b58cb7d030c57c2824d/charset_normalizer-3.5.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:168a0cb536b5123a77bc42ecf5e0bf6f923d0d9ae43c42a14eb0677c19ac6c19", size = 229898 },
|
|
106
|
-
{ url = "https://files.pythonhosted.org/packages/42/a2/639c4278adcb7ed1f4db608dd9ac19b6774fa2285a96b1c0bdb9c124ccbd/charset_normalizer-3.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f278e131afa96a3622cef9211c406ea2ad1b68eb06f8837cd443684a40e0ae50", size = 262852 },
|
|
107
|
-
{ url = "https://files.pythonhosted.org/packages/9d/95/02e34c97bedfd0c5574efb9179c850591acc7f967ba039ed8dd29d332b73/charset_normalizer-3.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d6100f877d2ed95f0856a3fde25334153add94bf2224c43f45f88e7039262aaa", size = 242913 },
|
|
108
|
-
{ url = "https://files.pythonhosted.org/packages/a3/64/0946aeab6462dad9f160a50dfb4704d3f58a5ee708f085abc2105fbbff0c/charset_normalizer-3.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:4c440122e1ea68b1f8b44a631ebf49c39180f6869b1da22d76e8a724208ec6e9", size = 257938 },
|
|
109
|
-
{ url = "https://files.pythonhosted.org/packages/79/77/36787d41ead124746506a4425c729f4f17c68280af8a6a5baa0a598cae86/charset_normalizer-3.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e5f834965c2fe589837bac1002e07e25734ff70381903ccd95b3d649e22bfa40", size = 249467 },
|
|
110
|
-
{ url = "https://files.pythonhosted.org/packages/65/10/d9f6c5589cd24198d4ce6cd2948191c18e657272f433e5a00d258d9f5c22/charset_normalizer-3.5.0-cp314-cp314t-win32.whl", hash = "sha256:076cf9d3f3c7e410295c09d96355cf3b1bcae74990034d80e4371e20fe1ba4c6", size = 190624 },
|
|
111
|
-
{ url = "https://files.pythonhosted.org/packages/6c/81/43e0584a802051a22c725795ebe1df78263abc7de858eef6cdc9b36637e9/charset_normalizer-3.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:3288a560dc3114d5d2ebe309b1ef43f8af355eafe25856832415c2a8196c9db3", size = 215902 },
|
|
112
|
-
{ url = "https://files.pythonhosted.org/packages/30/f3/af6a1160fef0eac4510d035241e11eccf78e5350e4cd4de79e79fe02a5e5/charset_normalizer-3.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:a284c36b9c6616bf0a8aa4aabba668a0c75ba65ccf40a79868aeaa69ad996897", size = 193452 },
|
|
113
|
-
{ url = "https://files.pythonhosted.org/packages/42/a4/dee470afb7a55c4f78b6fef37306c51fed17ebf94dbe530798c91d394350/charset_normalizer-3.5.0-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:c38d1e9bc2073b0984d2099ea647fd7f6c0d8f83a1e14e0cd32926f16e4c44ce", size = 341595 },
|
|
114
|
-
{ url = "https://files.pythonhosted.org/packages/6a/32/9c3126dc429c6d9d7f79c52681a7c4453ed20a26267c9a8275d7ab620aba/charset_normalizer-3.5.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9f45186390aee4d1f26f723c615b67df346766c3b16df000d84d6e374f06757", size = 242177 },
|
|
115
|
-
{ url = "https://files.pythonhosted.org/packages/4b/9d/5b616a887301ff4cc0916b39ba44257390d3da80deeed6e8b6f2f26b14a8/charset_normalizer-3.5.0-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f0fde5e5100c735b2274ab898f0742a5dcde492796296cfbe7e0ad6a4cd1a396", size = 236730 },
|
|
116
|
-
{ url = "https://files.pythonhosted.org/packages/be/b4/d6d3e70be93ebe5fabef65e4c7ac113e1d1705cbaeb5fb72467e713aca17/charset_normalizer-3.5.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3d00e18e7bbf47e332ab63903d18bae31efc701b1d8cca0382b97784a621fc44", size = 265158 },
|
|
117
|
-
{ url = "https://files.pythonhosted.org/packages/30/e7/3f1fafa87e2643257474f9c4eec609f2193a61d907dce7dd4f3f2390ebd5/charset_normalizer-3.5.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b81980668800dd1c69faad8aea6e85a8cee0e13bcd3bba7671695ff16260293", size = 262931 },
|
|
118
|
-
{ url = "https://files.pythonhosted.org/packages/0a/df/ebeb224a949d91829e5e114c6b64372a3c792b00762a9e951ce416f3a32d/charset_normalizer-3.5.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bb3e0d1345b9c0fe73673ea656375f38a78ec679c2edeae0c24800f04798a85", size = 251388 },
|
|
119
|
-
{ url = "https://files.pythonhosted.org/packages/a0/64/9a6ce2e7acc5cf1b4636f78f82e89ff581e06a0216a40678b28bd4d832c4/charset_normalizer-3.5.0-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2401f7671242e921e604f609d429f6b282ea4ca787a6ffd22ed7372011ddb9d1", size = 251821 },
|
|
120
|
-
{ url = "https://files.pythonhosted.org/packages/f1/b1/6e69b8056f615e5ccff6b91ca16db2d47922251f016821a300c115267fef/charset_normalizer-3.5.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:96720f2aeed3434bc48f4d52fbad64ecc820cfed88915d664780ed9ba09ede78", size = 244507 },
|
|
121
|
-
{ url = "https://files.pythonhosted.org/packages/0f/34/02c15d6a0aa6b934dcdc136b111da63ae857b9fd51cf5505b0736337c2eb/charset_normalizer-3.5.0-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:c455829625df983f716cbaecbba77f2d1dc2e0e0ed1638c059cece15a279344b", size = 240951 },
|
|
122
|
-
{ url = "https://files.pythonhosted.org/packages/ae/15/0fe893d3e1c7d111280bd6c4bd4c1e431487a1124a1bcbce78dfeda3a3a8/charset_normalizer-3.5.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:c41b067eddcfa5ee6b1169c287605be7fb6b0ea22bba6474c5bb978a668def4f", size = 266162 },
|
|
123
|
-
{ url = "https://files.pythonhosted.org/packages/55/ea/eca03527307670f5d102c295671a800c404ca958cf94fefd10fc963a72f0/charset_normalizer-3.5.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:e31786a947b136329bfdc458c82c06d4ec539b4a4436b7da4df4aafc9902ee80", size = 251835 },
|
|
124
|
-
{ url = "https://files.pythonhosted.org/packages/03/a8/fee5633081e595fe9e191df6f215106c791ad596eddf5e41e39b8ea0f2e2/charset_normalizer-3.5.0-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:c5c6d47a865147e0ae3322ce92e7fb52ba3169d94b447deda56897ea2aa6fac9", size = 264314 },
|
|
125
|
-
{ url = "https://files.pythonhosted.org/packages/cf/fb/17f47ae6ca35b562fb6e6f4b05f7aec6034217353eb4a23aaa3566dc7340/charset_normalizer-3.5.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:c75191e3c8052045179646cb40e280800a4e0bdfda34d9c949c2f268d44e80e4", size = 253194 },
|
|
126
|
-
{ url = "https://files.pythonhosted.org/packages/59/88/f2b0f7ebb92493e925889ff29239b3b0073ffafd91230dbfc69e5cf9389c/charset_normalizer-3.5.0-cp315-cp315-win32.whl", hash = "sha256:83b62410bd36bb1178a7d563e2ee0cf21eb1c980c912ab99c2c78f06227f1731", size = 179800 },
|
|
127
|
-
{ url = "https://files.pythonhosted.org/packages/e2/f0/afb5bfdea52fd943b1960403847a276b8e900c6e4cd6a38752321b4eda64/charset_normalizer-3.5.0-cp315-cp315-win_amd64.whl", hash = "sha256:e3b9eaa99a6d8c9ace4cd303915947ef55088d4cd87c6676874f98c5c03aa040", size = 203726 },
|
|
128
|
-
{ url = "https://files.pythonhosted.org/packages/fc/71/219783eb691aa2ec879c0e521afdfe2b826f9678eed51b9c039d03e0db2b/charset_normalizer-3.5.0-cp315-cp315-win_arm64.whl", hash = "sha256:fec352b793cdc183cc9e7e0b6c10fd7bff38ec54ba44cc43599b9b56f7f3db2e", size = 183428 },
|
|
129
|
-
{ url = "https://files.pythonhosted.org/packages/d1/d0/14aef3b9f80f2593c039d897e89034635b9eb0eb44b6ce5173bbd79ff338/charset_normalizer-3.5.0-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:c9bde7a960720c8b8e1b5ef7afaa0c9a2f3b55c44abd635b2b29dd066b298e3a", size = 368728 },
|
|
130
|
-
{ url = "https://files.pythonhosted.org/packages/10/fc/b249466ddbbeffa448b6597631e9091d1f01b5132ff8e7a0e21a6eb72b63/charset_normalizer-3.5.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8cd1283a9fe6c2065c807e9d5da81afe5e1e004caef39adc0d8ae86dd883698", size = 240925 },
|
|
131
|
-
{ url = "https://files.pythonhosted.org/packages/2b/b9/c17e72aaa1b3e1ca6c184e8025cf138ed492d01a54f85286ff7d31253a4b/charset_normalizer-3.5.0-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1c010dd86d3f4c4433c9634d33ce8147393b270dfa54f217f965540b8ae8e075", size = 234932 },
|
|
132
|
-
{ url = "https://files.pythonhosted.org/packages/18/d7/f84ef0966bbe216f71029e34e7fa425a16b1682e2a40265e679dedf2b655/charset_normalizer-3.5.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5e68229977b2dea28e7061c0c0630a23f2f9f6e9c6fb38d77d3d6dbfe3768b74", size = 261733 },
|
|
133
|
-
{ url = "https://files.pythonhosted.org/packages/3b/73/3e887fa0781a395339355ed934ab6561ceb5bb52574160f070224039c630/charset_normalizer-3.5.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a60773eb5fda796e6e6f76b9c152d270fe59f9788a51a6ff8ba44082d8548ae4", size = 258460 },
|
|
134
|
-
{ url = "https://files.pythonhosted.org/packages/b3/81/52ebd9849bf9e35d0b21fff115cb6543162a8e1f2f564e8f87121a336b8c/charset_normalizer-3.5.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9419f44e568f7fafcdc0b3b5c766a2364e705a9b34fb8a56b431e0d1f3f4258", size = 249894 },
|
|
135
|
-
{ url = "https://files.pythonhosted.org/packages/85/f3/9366492b8a5fe0187de282e001d61345740cf79eb4a5f20181d769be02b5/charset_normalizer-3.5.0-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75e243abbb528c1a774390ed71e3f868a9f37b1373442e4bbadd401cfc505ff4", size = 249540 },
|
|
136
|
-
{ url = "https://files.pythonhosted.org/packages/0b/af/28bb5e5dbd3e67cb9196a62781ac2b6d79492f4fc7a069b6ca7d6d6c8d58/charset_normalizer-3.5.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:54c963ce6404e52255b737e8a06d356fc762d59096ae566203a67cf2b7d050f2", size = 242734 },
|
|
137
|
-
{ url = "https://files.pythonhosted.org/packages/26/d6/7ccfa62b53b40fc06b2d3504825aa400764740bd10cf248fdc4272441b93/charset_normalizer-3.5.0-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:63ea0cc840c66670183578c2630d138c0e944aeadfc33f25173ee240f5db780d", size = 239580 },
|
|
138
|
-
{ url = "https://files.pythonhosted.org/packages/0b/82/71c0c9b046697b8da66b3acefa8d5f92d00a9ef433ad7c3522b971d0369a/charset_normalizer-3.5.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6c06875a1d4a7537bef70f659b55c6b55b9a47ec3ba8f2db610350c2d9915e6e", size = 263281 },
|
|
139
|
-
{ url = "https://files.pythonhosted.org/packages/d6/01/d027583c869f40ba980c1c76994adbd522c360a6327e72beb44d7c267385/charset_normalizer-3.5.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:4253da1b4456b633651a8d59eb1dc7a8a8fa38241014dd7c217b353e547ae394", size = 250027 },
|
|
140
|
-
{ url = "https://files.pythonhosted.org/packages/2a/e9/6475d739e0ec8bb1236e06263dc3affaffdf947d8114ad27024932f325da/charset_normalizer-3.5.0-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:f044cb1cf44012184715f46584658993b5fee9344d71c4b0c455a17a299730c0", size = 257547 },
|
|
141
|
-
{ url = "https://files.pythonhosted.org/packages/a5/60/d1f502fcaa048a2aca3ab80bfef8407659c131e4f1792fa805fec14b4960/charset_normalizer-3.5.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:a17864853f7c518ae7d4b368af98f427f9396805476af40af8698560f09d7d97", size = 251718 },
|
|
142
|
-
{ url = "https://files.pythonhosted.org/packages/c3/69/76343dcf4381a698807ff8a20d89f66bbdd9f6222b0b17740f77ab764335/charset_normalizer-3.5.0-cp315-cp315t-win32.whl", hash = "sha256:9e726478d7a213847860219d74665a6892a643ac93b8f76580f6cf9ed39996b7", size = 190757 },
|
|
143
|
-
{ url = "https://files.pythonhosted.org/packages/e1/ea/d18147626a1667cc773c42104ab155a4ca5d6d4d174b7a35e01062213ea5/charset_normalizer-3.5.0-cp315-cp315t-win_amd64.whl", hash = "sha256:d7229a99120c6c2792d96f4857c2648ce5530e93667a2c2388c5ef69a6b84775", size = 215431 },
|
|
144
|
-
{ url = "https://files.pythonhosted.org/packages/47/21/4869598aae0872d94faa5933918a4fe37ab2c5af9d095786e241f9506fed/charset_normalizer-3.5.0-cp315-cp315t-win_arm64.whl", hash = "sha256:527e28a5e751d9e11369b9c5f9ab35c748eb9c109101920c7deb40d6eadf8d03", size = 193205 },
|
|
145
|
-
{ url = "https://files.pythonhosted.org/packages/5b/f3/7b523d807cb5e73562ef8acf21d39cdb9d704955327362c781bc3478a73d/charset_normalizer-3.5.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:5a4ee37248dfac25107c758bda99d545ce73e60b44d2dd39e4a2bb9f2831e9f5", size = 330840 },
|
|
146
|
-
{ url = "https://files.pythonhosted.org/packages/f0/de/fc68978fe78ca97063c96d764e41ff92ca639948f319271e0ff450e577a2/charset_normalizer-3.5.0-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a864bdcacd8bff58bb4845304e031f821a3ec64b2b7259f2d409cd49c9e59ca3", size = 251862 },
|
|
147
|
-
{ url = "https://files.pythonhosted.org/packages/a9/cb/82b41a0ab7fb1a88065f1d78ad32696ad88ea3fe8e25b8189d08833938de/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:84b736e3b391601bc47b86da381c749c0f894e9191aaca9f31f30c2632206df3", size = 239484 },
|
|
148
|
-
{ url = "https://files.pythonhosted.org/packages/e8/0c/19608b631f4538f908098d4a2d56a8f79a665e27cc58e9d90479761a9227/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6abb1f356fb865baeb6ebc3fadd843e9a96fbf49b9adcca55037f3cceccb7438", size = 230602 },
|
|
149
|
-
{ url = "https://files.pythonhosted.org/packages/29/db/f648eb30e14eba301aed61e11672156f137905c1bdbb530151abe8065943/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d366548d2ee28a8cfdcc4296363978cc644a728333be9824d2de4652e83df0a", size = 259208 },
|
|
150
|
-
{ url = "https://files.pythonhosted.org/packages/d3/e0/ed2c8bdbac484d69614d6993143aeb6cb0f4dd1561c883402517b623c8ef/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d672f329ae504ee240eb39b6effb3318aa8e7e8924c0ce8eee5760b3fad98539", size = 253659 },
|
|
151
|
-
{ url = "https://files.pythonhosted.org/packages/32/08/b4907cb9ec5b521d9d024ced13611240b86ef065c2eb15b3ad2334dc9940/charset_normalizer-3.5.0-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c54036a518748b6c02e666f6d46c3817561998fb904c3be25b56fb4fe3dc5706", size = 248821 },
|
|
152
|
-
{ url = "https://files.pythonhosted.org/packages/12/b2/e2d1abcfbc05822f0030869efb4e9f8a3658e13b4821796d4b62da917327/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:22a1889f1c9b752c63c36758a0c2145458e3cadb20fced7a0790002e9dd12b26", size = 240271 },
|
|
153
|
-
{ url = "https://files.pythonhosted.org/packages/dc/f9/4ba127ad610542fa3eabfa41c45bf12d357860a815b3566374ec0188e213/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b7eb3eab5c646d3de7dcb14a7c9caebace5249c5767da39e1761cb1576e521a3", size = 232155 },
|
|
154
|
-
{ url = "https://files.pythonhosted.org/packages/01/68/40613182366d00bd6dbd5f6c84a926cbd120960e038a8269e9ae7d782762/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:2080aa129a28267984cdc902898993d788c995c384e285d0d19199f56760d52e", size = 259674 },
|
|
155
|
-
{ url = "https://files.pythonhosted.org/packages/0a/53/4574a14fa4c9de4a6c9f31725354bfa40b67f653e6d594ce1654f9a41b32/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:fd68c825548a611158230e2f9222e210ceb2e3391995c0aa5865cbdf3ab4bd49", size = 246122 },
|
|
156
|
-
{ url = "https://files.pythonhosted.org/packages/5a/02/bd8030d13d92c058ca7b2b9615bbb3169569e144db64d65c149cd45abf5e/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:d8a9316f4da85e937242642b537c6d55d7e9287dd38e5634732f8233932aff45", size = 255221 },
|
|
157
|
-
{ url = "https://files.pythonhosted.org/packages/77/9d/10ecd3bcbe2666b3d4d4026c97b48f73990682815db516052a1e8f4a31c5/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d90254c8f609338c53ec180fcd4c4f9c16502e238e3fc88ca7fd4c2f38d445b8", size = 253450 },
|
|
158
|
-
{ url = "https://files.pythonhosted.org/packages/e4/0f/d044c4872c0938a84f87b5027a698c0e61bacfc5c3551a4e749ca9b7bc5c/charset_normalizer-3.5.0-cp37-abi3-win32.whl", hash = "sha256:8b3e9e29b8b07cc461b9ce7768db7693a93979d0dadf22046f6f3555ded2f516", size = 173594 },
|
|
159
|
-
{ url = "https://files.pythonhosted.org/packages/10/6b/6046773901f1944b9a89436351529811ee958afc7b774563be9d74a6f0c3/charset_normalizer-3.5.0-cp37-abi3-win_amd64.whl", hash = "sha256:0c8953d9d1617794cfc40d81179571c9ba3805dd029623a15c93f1fb70e60a74", size = 198959 },
|
|
160
|
-
{ url = "https://files.pythonhosted.org/packages/ab/a6/b57708ac92aefc8e8389d51d5178129b81f03196da61ee2c23e687b8178a/charset_normalizer-3.5.0-cp37-abi3-win_arm64.whl", hash = "sha256:562d24ca7797c1af8852994950c2e623a907b201fc4b0ed29e92af173d3828ca", size = 267055 },
|
|
161
|
-
{ url = "https://files.pythonhosted.org/packages/22/c7/754d09943a616937df61e4ba367c409ded2a987e872972098d51a6fcf73b/charset_normalizer-3.5.0-py3-none-any.whl", hash = "sha256:993dfcbe75a85a3784abb5084f2c41b915767c90546fcc92803cffa28611baea", size = 67943 },
|
|
162
|
-
]
|
|
163
|
-
|
|
164
|
-
[[package]]
|
|
165
|
-
name = "idna"
|
|
166
|
-
version = "3.18"
|
|
167
|
-
source = { registry = "https://pypi.org/simple" }
|
|
168
|
-
sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711 }
|
|
169
|
-
wheels = [
|
|
170
|
-
{ url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455 },
|
|
171
|
-
]
|
|
172
|
-
|
|
173
|
-
[[package]]
|
|
174
|
-
name = "requests"
|
|
175
|
-
version = "2.34.2"
|
|
176
|
-
source = { registry = "https://pypi.org/simple" }
|
|
177
|
-
dependencies = [
|
|
178
|
-
{ name = "certifi" },
|
|
179
|
-
{ name = "charset-normalizer" },
|
|
180
|
-
{ name = "idna" },
|
|
181
|
-
{ name = "urllib3" },
|
|
182
|
-
]
|
|
183
|
-
sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856 }
|
|
184
|
-
wheels = [
|
|
185
|
-
{ url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075 },
|
|
186
|
-
]
|
|
187
|
-
|
|
188
|
-
[[package]]
|
|
189
|
-
name = "srtrain"
|
|
190
|
-
version = "2.6.7"
|
|
191
|
-
source = { registry = "https://pypi.org/simple" }
|
|
192
|
-
dependencies = [
|
|
193
|
-
{ name = "requests" },
|
|
194
|
-
]
|
|
195
|
-
sdist = { url = "https://files.pythonhosted.org/packages/f3/2b/44bbf0e2cb829831a987c65ba6f4f8ac5972f655711f32d100262865b337/srtrain-2.6.7.tar.gz", hash = "sha256:b5ab9ceb4a1eb8eb813bde81cdaf582b5d406c08da6b4f916c1027199ec1b405", size = 30645 }
|
|
196
|
-
wheels = [
|
|
197
|
-
{ url = "https://files.pythonhosted.org/packages/f5/67/ad8279399a20aeb7d01fe32f38a98bd4c6af818e1f55fa40e0565396f43d/srtrain-2.6.7-py3-none-any.whl", hash = "sha256:f85e5a271e382a8df41484c001885f2257f08c9e6117cdb2b173f1e043c1ef7a", size = 19025 },
|
|
198
|
-
]
|
|
199
|
-
|
|
200
|
-
[[package]]
|
|
201
|
-
name = "urllib3"
|
|
202
|
-
version = "2.7.0"
|
|
203
|
-
source = { registry = "https://pypi.org/simple" }
|
|
204
|
-
sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602 }
|
|
205
|
-
wheels = [
|
|
206
|
-
{ url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087 },
|
|
207
|
-
]
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "srt-booking",
|
|
3
|
-
"description": "Read-only live SRT timetable and seat-availability lookup through the SRTrain search path. No login, reservation, payment, cancellation, exact seat selection, or automated monitoring.",
|
|
4
|
-
"profiles": [
|
|
5
|
-
"lookup"
|
|
6
|
-
],
|
|
7
|
-
"frontmatter": "name: srt-booking\ndescription: Read-only live SRT timetable and seat-availability lookup through the SRTrain search path. No login, reservation, payment, cancellation, exact seat selection, or automated monitoring.\nlicense: MIT\nmetadata:\n category: travel\n locale: ko-KR\n phase: v1"
|
|
8
|
-
}
|
|
File without changes
|