commit b0287d7ef9efe94c4fcb8996f3ffbaf25242a9e4 Author: minco Date: Thu Apr 30 18:18:56 2026 +0900 add skill diff --git a/SKILL.md b/SKILL.md new file mode 100644 index 0000000..e90654b --- /dev/null +++ b/SKILL.md @@ -0,0 +1,75 @@ +--- +name: busan-airport-limousine +description: Answers questions about Gimhae Airport (Busan, Korea) limousine bus schedules. Use this skill whenever the user asks about airport bus times, which limousine line stops at a place, when to catch the airport bus from Haeundae, Gijang, Seomyeon, Bujeon, or any named hotel/landmark stop (e.g. 한화리조트, 벡스코, 파크하얏트, 장산역, 부전역). Also triggers for questions like "공항리무진 시간표", "공항버스 몇 시에", "김해공항 리무진 정류장", or similar Korean phrasing. +--- + +# Busan Airport Limousine Schedule + +Gimhae Airport (김해공항) is served by two limousine bus lines: +- **Line 1** — Haeundae/Gijang (해운대/기장) ↔ Airport +- **Line 2** — Seomyeon/Bujeon (서면/부전) ↔ Airport + +The schedule is bundled in `data/schedule.jsonl` (relative to this skill). It is current as of the last scrape — **do not re-scrape unless the user explicitly asks for a refresh** (the schedule rarely changes and scraping takes time). + +--- + +## Step 1: Identify the line and direction + +Read `references/stops-index.md` to find which line a named stop belongs to. This is faster than searching the JSONL. Key facts: + +- Line 1 to-airport stops include: 반얀트리, 아난티코브, 오시리아, 장산역, 해운대온천사거리, 해운대해수욕장, 동백섬입구, **한화리조트해운대**, 파크하얏트부산, 요트경기장, 벡스코, 신세계센텀시티, 상수도남부사업소 +- Line 2 to-airport stops include: 부전시장, 부전역, 서면/롯데호텔백화점, 동의대역, 주례역 +- From-airport trips don't have per-neighborhood-stop times — only airport departure times + estimated final arrival. + +--- + +## Step 2: Run the query script + +The script is at `scripts/query.js` (inside this skill directory). Run it with `node`: + +```bash +# Show full schedule for a stop (to-airport + from-airport for that line) +node /scripts/query.js 한화리조트 + +# To-airport only +node /scripts/query.js 한화리조트 --to + +# From-airport only +node /scripts/query.js 한화리조트 --from + +# From-airport by line number (no stop name needed) +node /scripts/query.js --from-airport --line 1 +node /scripts/query.js --from-airport --line 2 +``` + +The script does partial Korean substring matching, so "한화리조트" matches "한화리조트해운대". + +**The skill dir** is: `/home/allen/.claude/plugins/cache/local/busan-airport-limousine/1.0.0/skills/busan-airport-limousine` + +--- + +## Step 3: Present the output + +The script prints a compact table. Show it to the user as-is or summarize the key departure/arrival pairs. For estimated arrivals, mention they are estimates (the source site doesn't publish destination arrival times). + +**Arrival time method:** +- To-airport: last published stop + 15 min (Line 1) or 10 min (Line 2) +- From-airport: airport departure + 110 min (Line 1) or 50 min (Line 2), sourced from airportkobus.com + +--- + +## Refreshing the schedule + +If the user says the schedule is outdated or explicitly asks to refresh, run: + +```bash +cd /home/allen/projects/bullish && node scrape.js +``` + +Then copy the updated file into the skill: + +```bash +cp /home/allen/projects/bullish/schedule.jsonl /data/schedule.jsonl +``` + +**Do not do this proactively.** The schedule is stable and scraping requires a network round-trip. diff --git a/data/schedule.jsonl b/data/schedule.jsonl new file mode 100644 index 0000000..16f1dbe --- /dev/null +++ b/data/schedule.jsonl @@ -0,0 +1,99 @@ +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":0,"departure":{"stop":"반얀트리","time":"4:50"},"arrival":{"stop":"Gimhae Airport","time":"6:00"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 5:45 + 15 min","all_stops":[{"stop":"반얀트리","time":"4:50"},{"stop":"아난티코브","time":"4:53"},{"stop":"오시리아","time":"4:56"},{"stop":"장산역","time":"5:12"},{"stop":"해운대온천사거리","time":"5:16"},{"stop":"해운대해수욕장","time":"5:17"},{"stop":"동백섬입구","time":"5:18"},{"stop":"한화리조트해운대","time":"5:24"},{"stop":"파크하얏트부산","time":"5:25"},{"stop":"요트경기장","time":"5:28"},{"stop":"벡스코","time":"5:34"},{"stop":"신세계센텀시티","time":"5:35"},{"stop":"상수도남부사업소","time":"5:45"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":1,"departure":{"stop":"반얀트리","time":"6:00"},"arrival":{"stop":"Gimhae Airport","time":"6:18"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 6:03 + 15 min","all_stops":[{"stop":"반얀트리","time":"6:00"},{"stop":"아난티코브","time":"6:03"},{"stop":"오시리아","time":"6:06"},{"stop":"장산역","time":"5:30"},{"stop":"해운대온천사거리","time":"5:34"},{"stop":"해운대해수욕장","time":"5:35"},{"stop":"동백섬입구","time":"5:36"},{"stop":"한화리조트해운대","time":"5:42"},{"stop":"파크하얏트부산","time":"5:43"},{"stop":"요트경기장","time":"5:46"},{"stop":"벡스코","time":"5:52"},{"stop":"신세계센텀시티","time":"5:53"},{"stop":"상수도남부사업소","time":"6:03"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":2,"departure":{"stop":"반얀트리","time":"6:30"},"arrival":{"stop":"Gimhae Airport","time":"7:10"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 6:55 + 15 min","all_stops":[{"stop":"반얀트리","time":"6:30"},{"stop":"아난티코브","time":"6:33"},{"stop":"오시리아","time":"6:36"},{"stop":"장산역","time":"6:22"},{"stop":"해운대온천사거리","time":"6:26"},{"stop":"해운대해수욕장","time":"6:27"},{"stop":"동백섬입구","time":"6:28"},{"stop":"한화리조트해운대","time":"6:34"},{"stop":"파크하얏트부산","time":"6:35"},{"stop":"요트경기장","time":"6:38"},{"stop":"벡스코","time":"6:44"},{"stop":"신세계센텀시티","time":"6:45"},{"stop":"상수도남부사업소","time":"6:55"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":3,"departure":{"stop":"반얀트리","time":"7:00"},"arrival":{"stop":"Gimhae Airport","time":"7:40"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 7:25 + 15 min","all_stops":[{"stop":"반얀트리","time":"7:00"},{"stop":"아난티코브","time":"7:03"},{"stop":"오시리아","time":"7:06"},{"stop":"장산역","time":"6:52"},{"stop":"해운대온천사거리","time":"6:56"},{"stop":"해운대해수욕장","time":"6:57"},{"stop":"동백섬입구","time":"6:58"},{"stop":"한화리조트해운대","time":"7:04"},{"stop":"파크하얏트부산","time":"7:05"},{"stop":"요트경기장","time":"7:08"},{"stop":"벡스코","time":"7:14"},{"stop":"신세계센텀시티","time":"7:15"},{"stop":"상수도남부사업소","time":"7:25"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":4,"departure":{"stop":"반얀트리","time":"7:30"},"arrival":{"stop":"Gimhae Airport","time":"8:10"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 7:55 + 15 min","all_stops":[{"stop":"반얀트리","time":"7:30"},{"stop":"아난티코브","time":"7:33"},{"stop":"오시리아","time":"7:36"},{"stop":"장산역","time":"7:22"},{"stop":"해운대온천사거리","time":"7:26"},{"stop":"해운대해수욕장","time":"7:27"},{"stop":"동백섬입구","time":"7:28"},{"stop":"한화리조트해운대","time":"7:34"},{"stop":"파크하얏트부산","time":"7:35"},{"stop":"요트경기장","time":"7:38"},{"stop":"벡스코","time":"7:44"},{"stop":"신세계센텀시티","time":"7:45"},{"stop":"상수도남부사업소","time":"7:55"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":5,"departure":{"stop":"반얀트리","time":"8:00"},"arrival":{"stop":"Gimhae Airport","time":"8:40"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 8:25 + 15 min","all_stops":[{"stop":"반얀트리","time":"8:00"},{"stop":"아난티코브","time":"8:03"},{"stop":"오시리아","time":"8:06"},{"stop":"장산역","time":"7:52"},{"stop":"해운대온천사거리","time":"7:56"},{"stop":"해운대해수욕장","time":"7:57"},{"stop":"동백섬입구","time":"7:58"},{"stop":"한화리조트해운대","time":"8:04"},{"stop":"파크하얏트부산","time":"8:05"},{"stop":"요트경기장","time":"8:08"},{"stop":"벡스코","time":"8:14"},{"stop":"신세계센텀시티","time":"8:15"},{"stop":"상수도남부사업소","time":"8:25"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":6,"departure":{"stop":"반얀트리","time":"12:40"},"arrival":{"stop":"Gimhae Airport","time":"9:10"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 8:55 + 15 min","all_stops":[{"stop":"반얀트리","time":"12:40"},{"stop":"아난티코브","time":"12:43"},{"stop":"오시리아","time":"12:46"},{"stop":"장산역","time":"8:22"},{"stop":"해운대온천사거리","time":"8:26"},{"stop":"해운대해수욕장","time":"8:27"},{"stop":"동백섬입구","time":"8:28"},{"stop":"한화리조트해운대","time":"8:34"},{"stop":"파크하얏트부산","time":"8:35"},{"stop":"요트경기장","time":"8:38"},{"stop":"벡스코","time":"8:44"},{"stop":"신세계센텀시티","time":"8:45"},{"stop":"상수도남부사업소","time":"8:55"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":7,"departure":{"stop":"반얀트리","time":"13:20"},"arrival":{"stop":"Gimhae Airport","time":"9:48"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 9:33 + 15 min","all_stops":[{"stop":"반얀트리","time":"13:20"},{"stop":"아난티코브","time":"13:23"},{"stop":"오시리아","time":"13:26"},{"stop":"장산역","time":"9:00"},{"stop":"해운대온천사거리","time":"9:04"},{"stop":"해운대해수욕장","time":"9:05"},{"stop":"동백섬입구","time":"9:06"},{"stop":"한화리조트해운대","time":"9:12"},{"stop":"파크하얏트부산","time":"9:13"},{"stop":"요트경기장","time":"9:16"},{"stop":"벡스코","time":"9:22"},{"stop":"신세계센텀시티","time":"9:23"},{"stop":"상수도남부사업소","time":"9:33"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":8,"departure":{"stop":"반얀트리","time":"14:00"},"arrival":{"stop":"Gimhae Airport","time":"10:28"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 10:13 + 15 min","all_stops":[{"stop":"반얀트리","time":"14:00"},{"stop":"아난티코브","time":"14:03"},{"stop":"오시리아","time":"14:06"},{"stop":"장산역","time":"9:40"},{"stop":"해운대온천사거리","time":"9:44"},{"stop":"해운대해수욕장","time":"9:45"},{"stop":"동백섬입구","time":"9:46"},{"stop":"한화리조트해운대","time":"9:52"},{"stop":"파크하얏트부산","time":"9:53"},{"stop":"요트경기장","time":"9:56"},{"stop":"벡스코","time":"10:02"},{"stop":"신세계센텀시티","time":"10:03"},{"stop":"상수도남부사업소","time":"10:13"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":9,"departure":{"stop":"반얀트리","time":"14:40"},"arrival":{"stop":"Gimhae Airport","time":"11:08"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 10:53 + 15 min","all_stops":[{"stop":"반얀트리","time":"14:40"},{"stop":"아난티코브","time":"14:43"},{"stop":"오시리아","time":"14:46"},{"stop":"장산역","time":"10:20"},{"stop":"해운대온천사거리","time":"10:24"},{"stop":"해운대해수욕장","time":"10:25"},{"stop":"동백섬입구","time":"10:26"},{"stop":"한화리조트해운대","time":"10:32"},{"stop":"파크하얏트부산","time":"10:33"},{"stop":"요트경기장","time":"10:36"},{"stop":"벡스코","time":"10:42"},{"stop":"신세계센텀시티","time":"10:43"},{"stop":"상수도남부사업소","time":"10:53"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":10,"departure":{"stop":"반얀트리","time":"15:00"},"arrival":{"stop":"Gimhae Airport","time":"11:48"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 11:33 + 15 min","all_stops":[{"stop":"반얀트리","time":"15:00"},{"stop":"아난티코브","time":"15:03"},{"stop":"오시리아","time":"15:06"},{"stop":"장산역","time":"11:00"},{"stop":"해운대온천사거리","time":"11:04"},{"stop":"해운대해수욕장","time":"11:05"},{"stop":"동백섬입구","time":"11:06"},{"stop":"한화리조트해운대","time":"11:12"},{"stop":"파크하얏트부산","time":"11:13"},{"stop":"요트경기장","time":"11:16"},{"stop":"벡스코","time":"11:22"},{"stop":"신세계센텀시티","time":"11:23"},{"stop":"상수도남부사업소","time":"11:33"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":11,"departure":{"stop":"반얀트리","time":"15:40"},"arrival":{"stop":"Gimhae Airport","time":"13:50"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 13:35 + 15 min","all_stops":[{"stop":"반얀트리","time":"15:40"},{"stop":"아난티코브","time":"15:43"},{"stop":"오시리아","time":"15:46"},{"stop":"장산역","time":"13:02"},{"stop":"해운대온천사거리","time":"13:06"},{"stop":"해운대해수욕장","time":"13:07"},{"stop":"동백섬입구","time":"13:08"},{"stop":"한화리조트해운대","time":"13:14"},{"stop":"파크하얏트부산","time":"13:15"},{"stop":"요트경기장","time":"13:18"},{"stop":"벡스코","time":"13:24"},{"stop":"신세계센텀시티","time":"13:25"},{"stop":"상수도남부사업소","time":"13:35"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":12,"departure":{"stop":"반얀트리","time":"16:30"},"arrival":{"stop":"Gimhae Airport","time":"14:30"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 14:15 + 15 min","all_stops":[{"stop":"반얀트리","time":"16:30"},{"stop":"아난티코브","time":"16:33"},{"stop":"오시리아","time":"16:36"},{"stop":"장산역","time":"13:42"},{"stop":"해운대온천사거리","time":"13:46"},{"stop":"해운대해수욕장","time":"13:47"},{"stop":"동백섬입구","time":"13:48"},{"stop":"한화리조트해운대","time":"13:54"},{"stop":"파크하얏트부산","time":"13:55"},{"stop":"요트경기장","time":"13:58"},{"stop":"벡스코","time":"14:04"},{"stop":"신세계센텀시티","time":"14:05"},{"stop":"상수도남부사업소","time":"14:15"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":13,"departure":{"stop":"장산역","time":"14:22"},"arrival":{"stop":"Gimhae Airport","time":"15:10"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 14:55 + 15 min","all_stops":[{"stop":"장산역","time":"14:22"},{"stop":"해운대온천사거리","time":"14:26"},{"stop":"해운대해수욕장","time":"14:27"},{"stop":"동백섬입구","time":"14:28"},{"stop":"한화리조트해운대","time":"14:34"},{"stop":"파크하얏트부산","time":"14:35"},{"stop":"요트경기장","time":"14:38"},{"stop":"벡스코","time":"14:44"},{"stop":"신세계센텀시티","time":"14:45"},{"stop":"상수도남부사업소","time":"14:55"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":14,"departure":{"stop":"장산역","time":"15:02"},"arrival":{"stop":"Gimhae Airport","time":"15:50"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 15:35 + 15 min","all_stops":[{"stop":"장산역","time":"15:02"},{"stop":"해운대온천사거리","time":"15:06"},{"stop":"해운대해수욕장","time":"15:07"},{"stop":"동백섬입구","time":"15:08"},{"stop":"한화리조트해운대","time":"15:14"},{"stop":"파크하얏트부산","time":"15:15"},{"stop":"요트경기장","time":"15:18"},{"stop":"벡스코","time":"15:24"},{"stop":"신세계센텀시티","time":"15:25"},{"stop":"상수도남부사업소","time":"15:35"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":15,"departure":{"stop":"장산역","time":"15:22"},"arrival":{"stop":"Gimhae Airport","time":"16:10"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 15:55 + 15 min","all_stops":[{"stop":"장산역","time":"15:22"},{"stop":"해운대온천사거리","time":"15:26"},{"stop":"해운대해수욕장","time":"15:27"},{"stop":"동백섬입구","time":"15:28"},{"stop":"한화리조트해운대","time":"15:34"},{"stop":"파크하얏트부산","time":"15:35"},{"stop":"요트경기장","time":"15:38"},{"stop":"벡스코","time":"15:44"},{"stop":"신세계센텀시티","time":"15:45"},{"stop":"상수도남부사업소","time":"15:55"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":16,"departure":{"stop":"장산역","time":"16:02"},"arrival":{"stop":"Gimhae Airport","time":"16:50"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 16:35 + 15 min","all_stops":[{"stop":"장산역","time":"16:02"},{"stop":"해운대온천사거리","time":"16:06"},{"stop":"해운대해수욕장","time":"16:07"},{"stop":"동백섬입구","time":"16:08"},{"stop":"한화리조트해운대","time":"16:14"},{"stop":"파크하얏트부산","time":"16:15"},{"stop":"요트경기장","time":"16:18"},{"stop":"벡스코","time":"16:24"},{"stop":"신세계센텀시티","time":"16:25"},{"stop":"상수도남부사업소","time":"16:35"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":17,"departure":{"stop":"장산역","time":"16:52"},"arrival":{"stop":"Gimhae Airport","time":"17:40"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 17:25 + 15 min","all_stops":[{"stop":"장산역","time":"16:52"},{"stop":"해운대온천사거리","time":"16:56"},{"stop":"해운대해수욕장","time":"16:57"},{"stop":"동백섬입구","time":"16:58"},{"stop":"한화리조트해운대","time":"17:04"},{"stop":"파크하얏트부산","time":"17:05"},{"stop":"요트경기장","time":"17:08"},{"stop":"벡스코","time":"17:14"},{"stop":"신세계센텀시티","time":"17:15"},{"stop":"상수도남부사업소","time":"17:25"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":18,"departure":{"stop":"장산역","time":"17:20"},"arrival":{"stop":"Gimhae Airport","time":"18:08"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 17:53 + 15 min","all_stops":[{"stop":"장산역","time":"17:20"},{"stop":"해운대온천사거리","time":"17:24"},{"stop":"해운대해수욕장","time":"17:25"},{"stop":"동백섬입구","time":"17:26"},{"stop":"한화리조트해운대","time":"17:32"},{"stop":"파크하얏트부산","time":"17:33"},{"stop":"요트경기장","time":"17:36"},{"stop":"벡스코","time":"17:42"},{"stop":"신세계센텀시티","time":"17:43"},{"stop":"상수도남부사업소","time":"17:53"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":19,"departure":{"stop":"장산역","time":"18:00"},"arrival":{"stop":"Gimhae Airport","time":"18:48"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 18:33 + 15 min","all_stops":[{"stop":"장산역","time":"18:00"},{"stop":"해운대온천사거리","time":"18:04"},{"stop":"해운대해수욕장","time":"18:05"},{"stop":"동백섬입구","time":"18:06"},{"stop":"한화리조트해운대","time":"18:12"},{"stop":"파크하얏트부산","time":"18:13"},{"stop":"요트경기장","time":"18:16"},{"stop":"벡스코","time":"18:22"},{"stop":"신세계센텀시티","time":"18:23"},{"stop":"상수도남부사업소","time":"18:33"}]} +{"route":"Haeundae/Gijang -> Gimhae Airport","page":1,"direction":"to_airport","trip_index":20,"departure":{"stop":"장산역","time":"19:00"},"arrival":{"stop":"Gimhae Airport","time":"19:48"},"arrival_note":"estimated: last published stop \"상수도남부사업소\" @ 19:33 + 15 min","all_stops":[{"stop":"장산역","time":"19:00"},{"stop":"해운대온천사거리","time":"19:04"},{"stop":"해운대해수욕장","time":"19:05"},{"stop":"동백섬입구","time":"19:06"},{"stop":"한화리조트해운대","time":"19:12"},{"stop":"파크하얏트부산","time":"19:13"},{"stop":"요트경기장","time":"19:16"},{"stop":"벡스코","time":"19:22"},{"stop":"신세계센텀시티","time":"19:23"},{"stop":"상수도남부사업소","time":"19:33"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":0,"departure":{"stop":"부전시장","time":"6:00"},"arrival":{"stop":"Gimhae Airport","time":"6:29"},"arrival_note":"estimated: last published stop \"주례역\" @ 6:19 + 10 min","all_stops":[{"stop":"부전시장","time":"6:00"},{"stop":"부전역","time":"6:01"},{"stop":"서면/롯데호텔백화점","time":"6:05"},{"stop":"동의대역","time":"6:12"},{"stop":"주례역","time":"6:19"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":1,"departure":{"stop":"부전시장","time":"7:00"},"arrival":{"stop":"Gimhae Airport","time":"7:29"},"arrival_note":"estimated: last published stop \"주례역\" @ 7:19 + 10 min","all_stops":[{"stop":"부전시장","time":"7:00"},{"stop":"부전역","time":"7:01"},{"stop":"서면/롯데호텔백화점","time":"7:05"},{"stop":"동의대역","time":"7:12"},{"stop":"주례역","time":"7:19"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":2,"departure":{"stop":"부전시장","time":"8:20"},"arrival":{"stop":"Gimhae Airport","time":"8:49"},"arrival_note":"estimated: last published stop \"주례역\" @ 8:39 + 10 min","all_stops":[{"stop":"부전시장","time":"8:20"},{"stop":"부전역","time":"8:21"},{"stop":"서면/롯데호텔백화점","time":"8:25"},{"stop":"동의대역","time":"8:32"},{"stop":"주례역","time":"8:39"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":3,"departure":{"stop":"부전시장","time":"9:40"},"arrival":{"stop":"Gimhae Airport","time":"10:09"},"arrival_note":"estimated: last published stop \"주례역\" @ 9:59 + 10 min","all_stops":[{"stop":"부전시장","time":"9:40"},{"stop":"부전역","time":"9:41"},{"stop":"서면/롯데호텔백화점","time":"9:45"},{"stop":"동의대역","time":"9:52"},{"stop":"주례역","time":"9:59"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":4,"departure":{"stop":"부전시장","time":"11:00"},"arrival":{"stop":"Gimhae Airport","time":"11:29"},"arrival_note":"estimated: last published stop \"주례역\" @ 11:19 + 10 min","all_stops":[{"stop":"부전시장","time":"11:00"},{"stop":"부전역","time":"11:01"},{"stop":"서면/롯데호텔백화점","time":"11:05"},{"stop":"동의대역","time":"11:12"},{"stop":"주례역","time":"11:19"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":5,"departure":{"stop":"부전시장","time":"12:20"},"arrival":{"stop":"Gimhae Airport","time":"12:49"},"arrival_note":"estimated: last published stop \"주례역\" @ 12:39 + 10 min","all_stops":[{"stop":"부전시장","time":"12:20"},{"stop":"부전역","time":"12:21"},{"stop":"서면/롯데호텔백화점","time":"12:25"},{"stop":"동의대역","time":"12:32"},{"stop":"주례역","time":"12:39"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":6,"departure":{"stop":"부전시장","time":"13:40"},"arrival":{"stop":"Gimhae Airport","time":"14:09"},"arrival_note":"estimated: last published stop \"주례역\" @ 13:59 + 10 min","all_stops":[{"stop":"부전시장","time":"13:40"},{"stop":"부전역","time":"13:41"},{"stop":"서면/롯데호텔백화점","time":"13:45"},{"stop":"동의대역","time":"13:52"},{"stop":"주례역","time":"13:59"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":7,"departure":{"stop":"부전시장","time":"15:00"},"arrival":{"stop":"Gimhae Airport","time":"15:29"},"arrival_note":"estimated: last published stop \"주례역\" @ 15:19 + 10 min","all_stops":[{"stop":"부전시장","time":"15:00"},{"stop":"부전역","time":"15:01"},{"stop":"서면/롯데호텔백화점","time":"15:05"},{"stop":"동의대역","time":"15:12"},{"stop":"주례역","time":"15:19"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":8,"departure":{"stop":"부전시장","time":"16:20"},"arrival":{"stop":"Gimhae Airport","time":"16:49"},"arrival_note":"estimated: last published stop \"주례역\" @ 16:39 + 10 min","all_stops":[{"stop":"부전시장","time":"16:20"},{"stop":"부전역","time":"16:21"},{"stop":"서면/롯데호텔백화점","time":"16:25"},{"stop":"동의대역","time":"16:32"},{"stop":"주례역","time":"16:39"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":9,"departure":{"stop":"부전시장","time":"17:40"},"arrival":{"stop":"Gimhae Airport","time":"18:09"},"arrival_note":"estimated: last published stop \"주례역\" @ 17:59 + 10 min","all_stops":[{"stop":"부전시장","time":"17:40"},{"stop":"부전역","time":"17:41"},{"stop":"서면/롯데호텔백화점","time":"17:45"},{"stop":"동의대역","time":"17:52"},{"stop":"주례역","time":"17:59"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":10,"departure":{"stop":"부전시장","time":"18:50"},"arrival":{"stop":"Gimhae Airport","time":"19:19"},"arrival_note":"estimated: last published stop \"주례역\" @ 19:09 + 10 min","all_stops":[{"stop":"부전시장","time":"18:50"},{"stop":"부전역","time":"18:51"},{"stop":"서면/롯데호텔백화점","time":"18:55"},{"stop":"동의대역","time":"19:02"},{"stop":"주례역","time":"19:09"}]} +{"route":"Seomyeon/Bujeon -> Gimhae Airport","page":2,"direction":"to_airport","trip_index":11,"departure":{"stop":"부전시장","time":"20:00"},"arrival":{"stop":"Gimhae Airport","time":"20:29"},"arrival_note":"estimated: last published stop \"주례역\" @ 20:19 + 10 min","all_stops":[{"stop":"부전시장","time":"20:00"},{"stop":"부전역","time":"20:01"},{"stop":"서면/롯데호텔백화점","time":"20:05"},{"stop":"동의대역","time":"20:12"},{"stop":"주례역","time":"20:19"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":0,"departure":{"stop":"Gimhae Airport","time":"7:15"},"arrival":{"stop":"Haeundae/Gijang","time":"9:05"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"7:15"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":1,"departure":{"stop":"Gimhae Airport","time":"7:55"},"arrival":{"stop":"Haeundae/Gijang","time":"9:45"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"7:55"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":2,"departure":{"stop":"Gimhae Airport","time":"8:35"},"arrival":{"stop":"Haeundae/Gijang","time":"10:25"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"8:35"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":3,"departure":{"stop":"Gimhae Airport","time":"9:15"},"arrival":{"stop":"Haeundae/Gijang","time":"11:05"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"9:15"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":4,"departure":{"stop":"Gimhae Airport","time":"10:15"},"arrival":{"stop":"Haeundae/Gijang","time":"12:05"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"10:15"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":5,"departure":{"stop":"Gimhae Airport","time":"10:55"},"arrival":{"stop":"Haeundae/Gijang","time":"12:45"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"10:55"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":6,"departure":{"stop":"Gimhae Airport","time":"11:35"},"arrival":{"stop":"Haeundae/Gijang","time":"13:25"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"11:35"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":7,"departure":{"stop":"Gimhae Airport","time":"12:15"},"arrival":{"stop":"Haeundae/Gijang","time":"14:05"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"12:15"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":8,"departure":{"stop":"Gimhae Airport","time":"12:35"},"arrival":{"stop":"Haeundae/Gijang","time":"14:25"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"12:35"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":9,"departure":{"stop":"Gimhae Airport","time":"13:15"},"arrival":{"stop":"Haeundae/Gijang","time":"15:05"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"13:15"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":10,"departure":{"stop":"Gimhae Airport","time":"14:15"},"arrival":{"stop":"Haeundae/Gijang","time":"16:05"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"14:15"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":11,"departure":{"stop":"Gimhae Airport","time":"15:35"},"arrival":{"stop":"Haeundae/Gijang","time":"17:25"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"15:35"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":12,"departure":{"stop":"Gimhae Airport","time":"16:15"},"arrival":{"stop":"Haeundae/Gijang","time":"18:05"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"16:15"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":13,"departure":{"stop":"Gimhae Airport","time":"16:55"},"arrival":{"stop":"Haeundae/Gijang","time":"18:45"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"16:55"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":14,"departure":{"stop":"Gimhae Airport","time":"17:15"},"arrival":{"stop":"Haeundae/Gijang","time":"19:05"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"17:15"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":15,"departure":{"stop":"Gimhae Airport","time":"17:35"},"arrival":{"stop":"Haeundae/Gijang","time":"19:25"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"17:35"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":16,"departure":{"stop":"Gimhae Airport","time":"18:05"},"arrival":{"stop":"Haeundae/Gijang","time":"19:55"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"18:05"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":17,"departure":{"stop":"Gimhae Airport","time":"18:55"},"arrival":{"stop":"Haeundae/Gijang","time":"20:45"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"18:55"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":18,"departure":{"stop":"Gimhae Airport","time":"19:35"},"arrival":{"stop":"Haeundae/Gijang","time":"21:25"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"19:35"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":19,"departure":{"stop":"Gimhae Airport","time":"20:35"},"arrival":{"stop":"Haeundae/Gijang","time":"22:25"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"20:35"}]} +{"route":"Gimhae Airport (Domestic) -> Haeundae/Gijang","page":3,"direction":"from_airport","trip_index":20,"departure":{"stop":"Gimhae Airport","time":"21:45"},"arrival":{"stop":"Haeundae/Gijang","time":"23:35"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"21:45"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":0,"departure":{"stop":"Gimhae Airport","time":"7:10"},"arrival":{"stop":"Haeundae/Gijang","time":"9:00"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"7:10"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":1,"departure":{"stop":"Gimhae Airport","time":"7:50"},"arrival":{"stop":"Haeundae/Gijang","time":"9:40"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"7:50"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":2,"departure":{"stop":"Gimhae Airport","time":"8:30"},"arrival":{"stop":"Haeundae/Gijang","time":"10:20"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"8:30"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":3,"departure":{"stop":"Gimhae Airport","time":"9:10"},"arrival":{"stop":"Haeundae/Gijang","time":"11:00"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"9:10"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":4,"departure":{"stop":"Gimhae Airport","time":"10:10"},"arrival":{"stop":"Haeundae/Gijang","time":"12:00"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"10:10"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":5,"departure":{"stop":"Gimhae Airport","time":"10:50"},"arrival":{"stop":"Haeundae/Gijang","time":"12:40"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"10:50"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":6,"departure":{"stop":"Gimhae Airport","time":"11:30"},"arrival":{"stop":"Haeundae/Gijang","time":"13:20"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"11:30"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":7,"departure":{"stop":"Gimhae Airport","time":"12:10"},"arrival":{"stop":"Haeundae/Gijang","time":"14:00"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"12:10"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":8,"departure":{"stop":"Gimhae Airport","time":"12:30"},"arrival":{"stop":"Haeundae/Gijang","time":"14:20"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"12:30"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":9,"departure":{"stop":"Gimhae Airport","time":"13:10"},"arrival":{"stop":"Haeundae/Gijang","time":"15:00"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"13:10"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":10,"departure":{"stop":"Gimhae Airport","time":"14:10"},"arrival":{"stop":"Haeundae/Gijang","time":"16:00"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"14:10"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":11,"departure":{"stop":"Gimhae Airport","time":"15:30"},"arrival":{"stop":"Haeundae/Gijang","time":"17:20"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"15:30"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":12,"departure":{"stop":"Gimhae Airport","time":"16:10"},"arrival":{"stop":"Haeundae/Gijang","time":"18:00"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"16:10"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":13,"departure":{"stop":"Gimhae Airport","time":"16:50"},"arrival":{"stop":"Haeundae/Gijang","time":"18:40"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"16:50"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":14,"departure":{"stop":"Gimhae Airport","time":"17:10"},"arrival":{"stop":"Haeundae/Gijang","time":"19:00"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"17:10"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":15,"departure":{"stop":"Gimhae Airport","time":"17:30"},"arrival":{"stop":"Haeundae/Gijang","time":"19:20"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"17:30"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":16,"departure":{"stop":"Gimhae Airport","time":"18:00"},"arrival":{"stop":"Haeundae/Gijang","time":"19:50"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"18:00"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":17,"departure":{"stop":"Gimhae Airport","time":"18:50"},"arrival":{"stop":"Haeundae/Gijang","time":"20:40"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"18:50"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":18,"departure":{"stop":"Gimhae Airport","time":"19:30"},"arrival":{"stop":"Haeundae/Gijang","time":"21:20"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"19:30"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":19,"departure":{"stop":"Gimhae Airport","time":"20:30"},"arrival":{"stop":"Haeundae/Gijang","time":"22:20"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"20:30"}]} +{"route":"Gimhae Airport (International) -> Haeundae/Gijang","page":4,"direction":"from_airport","trip_index":20,"departure":{"stop":"Gimhae Airport","time":"21:40"},"arrival":{"stop":"Haeundae/Gijang","time":"23:30"},"arrival_note":"estimated: departure + 110 min total journey (source: airportkobus.com)","all_stops":[{"stop":"해운대 운행시간(배차 횟수)-하행","time":"21:40"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":0,"departure":{"stop":"Gimhae Airport","time":"7:25"},"arrival":{"stop":"Seomyeon/Bujeon","time":"8:15"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"7:25"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":1,"departure":{"stop":"Gimhae Airport","time":"8:45"},"arrival":{"stop":"Seomyeon/Bujeon","time":"9:35"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"8:45"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":2,"departure":{"stop":"Gimhae Airport","time":"10:05"},"arrival":{"stop":"Seomyeon/Bujeon","time":"10:55"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"10:05"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":3,"departure":{"stop":"Gimhae Airport","time":"11:25"},"arrival":{"stop":"Seomyeon/Bujeon","time":"12:15"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"11:25"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":4,"departure":{"stop":"Gimhae Airport","time":"12:45"},"arrival":{"stop":"Seomyeon/Bujeon","time":"13:35"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"12:45"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":5,"departure":{"stop":"Gimhae Airport","time":"14:05"},"arrival":{"stop":"Seomyeon/Bujeon","time":"14:55"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"14:05"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":6,"departure":{"stop":"Gimhae Airport","time":"15:25"},"arrival":{"stop":"Seomyeon/Bujeon","time":"16:15"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"15:25"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":7,"departure":{"stop":"Gimhae Airport","time":"16:45"},"arrival":{"stop":"Seomyeon/Bujeon","time":"17:35"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"16:45"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":8,"departure":{"stop":"Gimhae Airport","time":"17:55"},"arrival":{"stop":"Seomyeon/Bujeon","time":"18:45"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"17:55"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":9,"departure":{"stop":"Gimhae Airport","time":"19:05"},"arrival":{"stop":"Seomyeon/Bujeon","time":"19:55"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"19:05"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":10,"departure":{"stop":"Gimhae Airport","time":"20:25"},"arrival":{"stop":"Seomyeon/Bujeon","time":"21:15"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"20:25"}]} +{"route":"Gimhae Airport (Domestic) -> Seomyeon/Bujeon","page":5,"direction":"from_airport","trip_index":11,"departure":{"stop":"Gimhae Airport","time":"21:35"},"arrival":{"stop":"Seomyeon/Bujeon","time":"22:25"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"21:35"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":0,"departure":{"stop":"Gimhae Airport","time":"7:20"},"arrival":{"stop":"Seomyeon/Bujeon","time":"8:10"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"7:20"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":1,"departure":{"stop":"Gimhae Airport","time":"8:40"},"arrival":{"stop":"Seomyeon/Bujeon","time":"9:30"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"8:40"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":2,"departure":{"stop":"Gimhae Airport","time":"10:00"},"arrival":{"stop":"Seomyeon/Bujeon","time":"10:50"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"10:00"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":3,"departure":{"stop":"Gimhae Airport","time":"11:20"},"arrival":{"stop":"Seomyeon/Bujeon","time":"12:10"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"11:20"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":4,"departure":{"stop":"Gimhae Airport","time":"12:40"},"arrival":{"stop":"Seomyeon/Bujeon","time":"13:30"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"12:40"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":5,"departure":{"stop":"Gimhae Airport","time":"14:00"},"arrival":{"stop":"Seomyeon/Bujeon","time":"14:50"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"14:00"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":6,"departure":{"stop":"Gimhae Airport","time":"15:20"},"arrival":{"stop":"Seomyeon/Bujeon","time":"16:10"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"15:20"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":7,"departure":{"stop":"Gimhae Airport","time":"16:40"},"arrival":{"stop":"Seomyeon/Bujeon","time":"17:30"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"16:40"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":8,"departure":{"stop":"Gimhae Airport","time":"17:50"},"arrival":{"stop":"Seomyeon/Bujeon","time":"18:40"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"17:50"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":9,"departure":{"stop":"Gimhae Airport","time":"19:00"},"arrival":{"stop":"Seomyeon/Bujeon","time":"19:50"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"19:00"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":10,"departure":{"stop":"Gimhae Airport","time":"20:20"},"arrival":{"stop":"Seomyeon/Bujeon","time":"21:10"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"20:20"}]} +{"route":"Gimhae Airport (International) -> Seomyeon/Bujeon","page":6,"direction":"from_airport","trip_index":11,"departure":{"stop":"Gimhae Airport","time":"21:30"},"arrival":{"stop":"Seomyeon/Bujeon","time":"22:20"},"arrival_note":"estimated: departure + 50 min total journey (source: airportkobus.com)","all_stops":[{"stop":"서면, 부전 운행시간(배차 횟수)-하행","time":"21:30"}]} diff --git a/references/stops-index.md b/references/stops-index.md new file mode 100644 index 0000000..fb5b57b --- /dev/null +++ b/references/stops-index.md @@ -0,0 +1,23 @@ +# Stop Index by Route + +## Line 1 — Haeundae/Gijang (해운대/기장) + +**To Airport (page 1):** 반얀트리, 아난티코브, 오시리아, 장산역, 해운대온천사거리, 해운대해수욕장, 동백섬입구, 한화리조트해운대, 파크하얏트부산, 요트경기장, 벡스코, 신세계센텀시티, 상수도남부사업소 + +**From Airport (pages 3–4):** No per-stop data — only airport departure times. Page 3 = Domestic terminal, Page 4 = International terminal. + +--- + +## Line 2 — Seomyeon/Bujeon (서면/부전) + +**To Airport (page 2):** 부전시장, 부전역, 서면/롯데호텔백화점, 동의대역, 주례역 + +**From Airport (pages 5–6):** No per-stop data — only airport departure times. Page 5 = Domestic terminal, Page 6 = International terminal. + +--- + +## Notes + +- All neighborhood stops (with individual timetables) belong to **to_airport** trips only. +- For **from_airport** queries, identify the line based on the neighborhood the user mentions (Haeundae/Gijang area → Line 1; Seomyeon/Bujeon area → Line 2), then show airport departure times for that line. +- Stop names use Korean. Partial/substring matching works — "한화리조트" matches "한화리조트해운대". diff --git a/scripts/query.js b/scripts/query.js new file mode 100644 index 0000000..812236b --- /dev/null +++ b/scripts/query.js @@ -0,0 +1,149 @@ +#!/usr/bin/env node +/** + * Busan Airport Limousine Schedule Query Tool + * + * Usage: + * node query.js # to-airport + from-airport for that stop's line + * node query.js --to # to-airport only + * node query.js --from # from-airport only + * node query.js --from-airport --line 1 # all from-airport departures, line 1 + * node query.js --from-airport --line 2 # all from-airport departures, line 2 + */ + +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const DATA = join(__dirname, '../data/schedule.jsonl'); + +const trips = readFileSync(DATA, 'utf8') + .trim().split('\n') + .map(l => JSON.parse(l)); + +const args = process.argv.slice(2); +if (args.length === 0) { + console.error('Usage: node query.js '); + console.error(' node query.js --from-airport --line 1|2'); + process.exit(1); +} + +const fromAirportFlag = args.includes('--from-airport'); +const lineFlag = args.includes('--line') ? args[args.indexOf('--line') + 1] : null; +const toOnly = args.includes('--to'); +const fromOnly = args.includes('--from'); +const stopQuery = args.find(a => !a.startsWith('--') && a !== lineFlag) || null; + +// ── Helper ────────────────────────────────────────────────────────────────── + +function pad(s, n) { + return String(s).padEnd(n); +} + +function header(title) { + console.log(`\n${title}`); + console.log('─'.repeat(title.length)); +} + +// ── From-airport by line (--from-airport --line N) ────────────────────────── + +if (fromAirportFlag && lineFlag) { + const line = parseInt(lineFlag); + if (line !== 1 && line !== 2) { + console.error('--line must be 1 or 2'); process.exit(1); + } + // Line 1 = pages 3–4, Line 2 = pages 5–6 + const pages = line === 1 ? [3, 4] : [5, 6]; + const termLabels = { 3: 'Domestic', 4: 'International', 5: 'Domestic', 6: 'International' }; + const dest = line === 1 ? 'Haeundae/Gijang' : 'Seomyeon/Bujeon'; + + header(`[From Airport] Line ${line}: Gimhae Airport → ${dest}`); + console.log(`${'Airport dep'.padEnd(14)} ${'Est. arrival'.padEnd(14)} Terminal`); + console.log(`${'─'.repeat(14)} ${'─'.repeat(14)} ─────────────`); + + for (const page of pages) { + const pageTrips = trips.filter(t => t.page === page).sort((a, b) => { + const [ah, am] = a.departure.time.split(':').map(Number); + const [bh, bm] = b.departure.time.split(':').map(Number); + return (ah * 60 + am) - (bh * 60 + bm); + }); + for (const t of pageTrips) { + console.log(`${pad(t.departure.time, 14)} ${pad(t.arrival.time, 14)} ${termLabels[page]}`); + } + } + console.log('\n(arrival times estimated — see arrival_note in schedule.jsonl)'); + process.exit(0); +} + +// ── Stop lookup ────────────────────────────────────────────────────────────── + +if (!stopQuery) { + console.error('Provide a stop name or use --from-airport --line 1|2'); + process.exit(1); +} + +// Find all to-airport trips where the stop appears (partial match) +const matchedTrips = trips.filter(t => + t.direction === 'to_airport' && + t.all_stops.some(s => s.stop.includes(stopQuery)) +); + +if (matchedTrips.length === 0) { + console.error(`No stops found matching "${stopQuery}"`); + console.error('Line 1 stops: 반얀트리 아난티코브 오시리아 장산역 해운대온천사거리 해운대해수욕장 동백섬입구 한화리조트해운대 파크하얏트부산 요트경기장 벡스코 신세계센텀시티 상수도남부사업소'); + console.error('Line 2 stops: 부전시장 부전역 서면/롯데호텔백화점 동의대역 주례역'); + process.exit(1); +} + +// Determine which line this stop belongs to +const line = matchedTrips[0].page === 1 ? 1 : 2; +const dest = line === 1 ? 'Haeundae/Gijang' : 'Seomyeon/Bujeon'; + +// Find the canonical matched stop name +const matchedStopName = matchedTrips[0].all_stops.find(s => s.stop.includes(stopQuery)).stop; + +// ── To-airport section ─────────────────────────────────────────────────────── + +if (!fromOnly) { + const sorted = [...matchedTrips].sort((a, b) => { + const sa = a.all_stops.find(s => s.stop.includes(stopQuery)); + const sb = b.all_stops.find(s => s.stop.includes(stopQuery)); + const [ah, am] = sa.time.split(':').map(Number); + const [bh, bm] = sb.time.split(':').map(Number); + return (ah * 60 + am) - (bh * 60 + bm); + }); + + header(`[To Airport] Line ${line}: ${matchedStopName} → Gimhae Airport`); + console.log(`${'Dep'.padEnd(10)} ${'Airport arr (est)'.padEnd(18)}`); + console.log(`${'─'.repeat(10)} ${'─'.repeat(18)}`); + + for (const t of sorted) { + const stopEntry = t.all_stops.find(s => s.stop.includes(stopQuery)); + console.log(`${pad(stopEntry.time, 10)} ${t.arrival.time}`); + } +} + +// ── From-airport section ───────────────────────────────────────────────────── + +if (!toOnly) { + const pages = line === 1 ? [3, 4] : [5, 6]; + const termLabels = { 3: 'Dom', 4: 'Int\'l', 5: 'Dom', 6: 'Int\'l' }; + + header(`[From Airport] Line ${line}: Gimhae Airport → ${dest}`); + console.log(`${'Airport dep'.padEnd(14)} ${'Est. arrival'.padEnd(14)} Terminal`); + console.log(`${'─'.repeat(14)} ${'─'.repeat(14)} ────────`); + + const fromTrips = trips + .filter(t => pages.includes(t.page)) + .sort((a, b) => { + const [ah, am] = a.departure.time.split(':').map(Number); + const [bh, bm] = b.departure.time.split(':').map(Number); + return (ah * 60 + am) - (bh * 60 + bm); + }); + + for (const t of fromTrips) { + console.log(`${pad(t.departure.time, 14)} ${pad(t.arrival.time, 14)} ${termLabels[t.page]}`); + } + + console.log('\n(arrival times estimated)'); +}