Add multi-station support, GWR fares API, and Circle line improvements
- Support any station with direct trains to Paddington; station CRS code is now part of the URL (/results/<crs>/<slug>/<date>) - Load station list from data/direct_to_paddington.tsv; show dropdown on index page; 404 for unknown station codes - Fetch live GWR walk-on fares via api.gwr.com for all stations (SSS/SVS/SDS with restrictions already applied per train); cache 30 days - Scrape Paddington arrival platform numbers from RTT - Show unreachable morning Eurostars (before first reachable service only) - Circle line: show actual KX St Pancras arrival times (not check-in estimate) and add a second backup service in the transfer column - Widen page max-width to 1100px for longer station names Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
71be0dd8cf
commit
3c787b33d3
12 changed files with 810 additions and 262 deletions
129
data/direct_to_paddington.tsv
Normal file
129
data/direct_to_paddington.tsv
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
Shenfield SNF
|
||||
Brentwood BRE
|
||||
Harold Wood HRO
|
||||
Gidea Park GDP
|
||||
Romford RMF
|
||||
Chadwell Heath CTH
|
||||
Goodmayes GMY
|
||||
Seven Kings SVK
|
||||
Ilford IFD
|
||||
Manor Park MNP
|
||||
Forest Gate FOG
|
||||
Maryland MYL
|
||||
Stratford (London) SRA
|
||||
Whitechapel ZLW
|
||||
London Liverpool Street LST
|
||||
Farringdon ZFD
|
||||
Tottenham Court Road TCR
|
||||
Bond Street BDS
|
||||
London Paddington PAD
|
||||
Heathrow Airport Terminal 5 HWV
|
||||
Heathrow Central HXX
|
||||
Hayes & Harlington HAY
|
||||
Southall STL
|
||||
Hanwell HAN
|
||||
West Ealing WEA
|
||||
Ealing Broadway EAL
|
||||
Acton Main Line AML
|
||||
Abbey Wood ABW
|
||||
Woolwich WWC
|
||||
Custom House CUS
|
||||
Canary Wharf CWX
|
||||
Reading RDG
|
||||
Twyford TWY
|
||||
Maidenhead MAI
|
||||
Taplow TAP
|
||||
Burnham BNM
|
||||
Slough SLO
|
||||
Langley LNY
|
||||
Iver IVR
|
||||
West Drayton WDT
|
||||
Oxford OXF
|
||||
Didcot Parkway DID
|
||||
Heathrow Airport Terminal 4 HAF
|
||||
Cholsey CHO
|
||||
Goring & Streatley GOR
|
||||
Pangbourne PAN
|
||||
Tilehurst TLH
|
||||
Bristol Temple Meads BRI
|
||||
Bath Spa BTH
|
||||
Chippenham CPM
|
||||
Swindon SWI
|
||||
Hereford HFD
|
||||
Ledbury LED
|
||||
Colwall CWL
|
||||
Great Malvern GMV
|
||||
Malvern Link MVL
|
||||
Worcester Foregate Street WOF
|
||||
Worcester Shrub Hill WOS
|
||||
Worcestershire Parkway WOP
|
||||
Pershore PSH
|
||||
Evesham EVE
|
||||
Honeybourne HYB
|
||||
Moreton-in-Marsh MIM
|
||||
Kingham KGM
|
||||
Charlbury CBY
|
||||
Hanborough HND
|
||||
Penzance PNZ
|
||||
St Erth SER
|
||||
Camborne CBN
|
||||
Redruth RED
|
||||
Truro TRU
|
||||
St Austell SAU
|
||||
Par PAR
|
||||
Bodmin Parkway BOD
|
||||
Liskeard LSK
|
||||
Plymouth PLY
|
||||
Totnes TOT
|
||||
Newton Abbot NTA
|
||||
Exeter St Davids EXD
|
||||
Taunton TAU
|
||||
Bedwyn BDW
|
||||
Hungerford HGD
|
||||
Kintbury KIT
|
||||
Newbury NBY
|
||||
Thatcham THA
|
||||
Theale THE
|
||||
Reading West RDW
|
||||
Swansea SWA
|
||||
Neath NTH
|
||||
Port Talbot Parkway PTA
|
||||
Bridgend BGN
|
||||
Cardiff Central CDF
|
||||
Newport (South Wales) NWP
|
||||
Bristol Parkway BPW
|
||||
Newbury Racecourse NRC
|
||||
Midgham MDG
|
||||
Aldermaston AMT
|
||||
Cheltenham Spa CNM
|
||||
Gloucester GCR
|
||||
Stonehouse SHU
|
||||
Stroud STD
|
||||
Kemble KEM
|
||||
Frome FRO
|
||||
Westbury WSB
|
||||
Pewsey PEW
|
||||
Weston-super-Mare WSM
|
||||
Weston Milton WNM
|
||||
Worle WOR
|
||||
Yatton YAT
|
||||
Nailsea & Backwell NLS
|
||||
Tiverton Parkway TVP
|
||||
Castle Cary CLC
|
||||
Bridgwater BWT
|
||||
Highbridge & Burnham HIG
|
||||
Carmarthen CMN
|
||||
Ferryside FYS
|
||||
Kidwelly KWL
|
||||
Pembrey & Burry Port PBY
|
||||
Llanelli LLE
|
||||
Paignton PGN
|
||||
Torquay TQY
|
||||
Torre TRR
|
||||
Teignmouth TGM
|
||||
Dawlish DWL
|
||||
Banbury BAN
|
||||
Greenford GFD
|
||||
South Greenford SGN
|
||||
Castle Bar Park CBP
|
||||
Drayton Green DRG
|
||||
|
212
data/pad_origins.json
Normal file
212
data/pad_origins.json
Normal file
|
|
@ -0,0 +1,212 @@
|
|||
{
|
||||
"Shenfield": {
|
||||
"name": "Shenfield",
|
||||
"crs": "",
|
||||
"service_id": "G24729",
|
||||
"service_date": "2026-04-20",
|
||||
"processed": true
|
||||
},
|
||||
"Heathrow Airport Terminal 5": {
|
||||
"name": "Heathrow Airport Terminal 5",
|
||||
"crs": "",
|
||||
"service_id": "G24322",
|
||||
"service_date": "2026-04-20",
|
||||
"processed": true
|
||||
},
|
||||
"Abbey Wood": {
|
||||
"name": "Abbey Wood",
|
||||
"crs": "",
|
||||
"service_id": "G24730",
|
||||
"service_date": "2026-04-20",
|
||||
"processed": true
|
||||
},
|
||||
"Reading": {
|
||||
"name": "Reading",
|
||||
"crs": "",
|
||||
"service_id": "G21939",
|
||||
"service_date": "2026-04-20",
|
||||
"processed": true
|
||||
},
|
||||
"Oxford": {
|
||||
"name": "Oxford",
|
||||
"crs": "",
|
||||
"service_id": "P22703",
|
||||
"service_date": "2026-04-20",
|
||||
"processed": true
|
||||
},
|
||||
"Heathrow Airport Terminal 4": {
|
||||
"name": "Heathrow Airport Terminal 4",
|
||||
"crs": "",
|
||||
"service_id": "G21944",
|
||||
"service_date": "2026-04-20",
|
||||
"processed": true
|
||||
},
|
||||
"Didcot Parkway": {
|
||||
"name": "Didcot Parkway",
|
||||
"crs": "",
|
||||
"service_id": "P33203",
|
||||
"service_date": "2026-04-20",
|
||||
"processed": true
|
||||
},
|
||||
"Bristol Temple Meads": {
|
||||
"name": "Bristol Temple Meads",
|
||||
"crs": "",
|
||||
"service_id": "P22595",
|
||||
"service_date": "2026-04-20",
|
||||
"processed": true
|
||||
},
|
||||
"Hereford": {
|
||||
"name": "Hereford",
|
||||
"crs": "",
|
||||
"service_id": "P22860",
|
||||
"service_date": "2026-04-20",
|
||||
"processed": true
|
||||
},
|
||||
"Penzance": {
|
||||
"name": "Penzance",
|
||||
"crs": "",
|
||||
"service_id": "P29703",
|
||||
"service_date": "2026-04-20",
|
||||
"processed": true
|
||||
},
|
||||
"Stratford (London)": {
|
||||
"name": "Stratford (London)",
|
||||
"crs": "",
|
||||
"service_id": "G23396",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Maidenhead": {
|
||||
"name": "Maidenhead",
|
||||
"crs": "",
|
||||
"service_id": "G23904",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Gidea Park": {
|
||||
"name": "Gidea Park",
|
||||
"crs": "",
|
||||
"service_id": "G23407",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Bedwyn": {
|
||||
"name": "Bedwyn",
|
||||
"crs": "",
|
||||
"service_id": "P30238",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Swansea": {
|
||||
"name": "Swansea",
|
||||
"crs": "",
|
||||
"service_id": "P22786",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Worcester Shrub Hill": {
|
||||
"name": "Worcester Shrub Hill",
|
||||
"crs": "",
|
||||
"service_id": "P22841",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Newbury": {
|
||||
"name": "Newbury",
|
||||
"crs": "",
|
||||
"service_id": "P30241",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Cheltenham Spa": {
|
||||
"name": "Cheltenham Spa",
|
||||
"crs": "",
|
||||
"service_id": "P22821",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Frome": {
|
||||
"name": "Frome",
|
||||
"crs": "",
|
||||
"service_id": "P22597",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Weston-super-Mare": {
|
||||
"name": "Weston-super-Mare",
|
||||
"crs": "",
|
||||
"service_id": "P22584",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Plymouth": {
|
||||
"name": "Plymouth",
|
||||
"crs": "",
|
||||
"service_id": "P22598",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Taunton": {
|
||||
"name": "Taunton",
|
||||
"crs": "",
|
||||
"service_id": "P29610",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Great Malvern": {
|
||||
"name": "Great Malvern",
|
||||
"crs": "",
|
||||
"service_id": "P22844",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Carmarthen": {
|
||||
"name": "Carmarthen",
|
||||
"crs": "",
|
||||
"service_id": "P22797",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Cardiff Central": {
|
||||
"name": "Cardiff Central",
|
||||
"crs": "",
|
||||
"service_id": "P22798",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Paignton": {
|
||||
"name": "Paignton",
|
||||
"crs": "",
|
||||
"service_id": "P22603",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Exeter St Davids": {
|
||||
"name": "Exeter St Davids",
|
||||
"crs": "",
|
||||
"service_id": "P22606",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Worcester Foregate Street": {
|
||||
"name": "Worcester Foregate Street",
|
||||
"crs": "",
|
||||
"service_id": "P22852",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Banbury": {
|
||||
"name": "Banbury",
|
||||
"crs": "",
|
||||
"service_id": "P30629",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
},
|
||||
"Greenford": {
|
||||
"name": "Greenford",
|
||||
"crs": "",
|
||||
"service_id": "P31884",
|
||||
"service_date": "2026-04-21",
|
||||
"processed": true
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue