Code Monkey home page Code Monkey logo

septa-api's Introduction

SEPTA-API crates.io

This project provides developers with a standard and ergonomic Rust API for calling the various endpoints in SEPTA (Southeastern Pennsylvania Transportation Authority) API. It handles the serialization and deserialization of the requests and responses and allows the developer to use the provided well-defined data types. It also handles some of the messy parts of the API (multiple serializations per stop, quarky endpoint responses, multiple datetime formats, etc).

Example Usage

use septa_api::{requests, types, Client};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create a new client with the default url
    let client = Client::new();

    // Get a list of all active trains
    let train_view_response = client.train_view().await?;
    for train in train_view_response {
        println!("Train {} is heading to {}", train.train_number, train.dest);
    }

    // Make a request to get the next arrivals
    let arrivals_request = requests::ArrivalsRequest {
        station: types::RegionalRailStop::TempleUniversity,
        results: None,
        direction: None,
    };
    let arrivals_response = client.arrivals(arrivals_request).await?;

    println!("Trains coming in southbound:");
    for southbound_arrival in arrivals_response.southbound {
        println!(
            "Train {} is {}",
            southbound_arrival.train_id, southbound_arrival.status
        );
    }

    println!("Trains coming in northbound:");
    for northbound_arrival in arrivals_response.northbound {
        println!(
            "Train {} is {}",
            northbound_arrival.train_id, northbound_arrival.status
        );
    }

    Ok(())
}

Testing

This crate is tested daily during the morning (8:30 AM EST) and evening (5:15 PM EST) rush hour commutes and in the dead of the night (3 AM EST). You may wonder why such a dichotomy, and the reason is to attempt to get data when the network is at its peak and during a lull. SEPTA is not the best in outlining all their API responses so some of this library is reversed engineered. By capturing both these states, we hope to detect any breaking changes in SEPTA's API and can therefore fix them ASAP.

API Implementation and Testing Status

Real Time Data API

Endpoint Implemented Tested
/Arrivals/index.php
/TrainView/index.php
/NextToArrive/index.php
/TransitView/index.php
/TransitViewAll/index.php
/BusDetours/index.php
/Alerts/index.php
/Alerts/get_alert_data.php
/elevator/index.php

Static Data API

Endpoint Implemented Tested
/RRSchedules/index.php
/BusSchedules/index.php
/Stops/index.php
/locations/get_locations.php

Authors

Stefan Bossbaly

License

This project is licensed under the MIT License - see the LICENSE file for details

Acknowledgments

septa-api's People

Contributors

dependabot[bot] avatar stefanbossbaly avatar

Watchers

 avatar  avatar  avatar

septa-api's Issues

Re-enable rush hour test

Re-enable the rush hour test. Data from May 20th is below:

From source:

[{"lat":"39.990750166667","lon":"-75.225662166667","trainno":"1083","service":"LOCAL","dest":"Cynwyd","currentstop":"Wynnefield Avenue","nextstop":"Bala","line":"Cynwyd","consist":"702","heading":"1.3489486830105","late":0,"SOURCE":"Suburban Station","TRACK":"S","TRACK_CHANGE":""},{"lat":"40.033443333333","lon":"-75.234825","trainno":"220","service":"LOCAL","dest":"Norristown","currentstop":"Manayunk","nextstop":"Ivy Ridge","line":"Manayunk\/Norristown","consist":"277,179,180,457,458","heading":"323.9772289135","late":0,"SOURCE":"Wilmington","TRACK":"2N","TRACK_CHANGE":""},{"lat":"39.907524666667","lon":"-75.4116355","trainno":"2321","service":"LOCAL","dest":"Wawa","currentstop":"Elwyn Station","nextstop":"Elwyn Station","line":"Media\/Wawa","consist":"293,146,145,162,161","heading":"224.55223684683","late":11,"SOURCE":"Norristown","TRACK":"1","TRACK_CHANGE":""},{"lat":"39.979432333333","lon":"-75.149822833333","trainno":"2323","service":"LOCAL","dest":"Wawa","currentstop":"Temple University","nextstop":"Jefferson Station","line":"Media\/Wawa","consist":"414,384,385,130,129,288","heading":"185.3249506434","late":3,"SOURCE":"Norristown","TRACK":"4","TRACK_CHANGE":""},{"lat":"39.900494","lon":"-75.279761333333","trainno":"2522","service":"EXP TO FT WASH","dest":"Doylestown","currentstop":"Glenolden","nextstop":"Folcroft","line":"Wilmington\/Newark","consist":"280,123,124,369,368","heading":"65.270856780656","late":0,"SOURCE":"Newark","TRACK":"1","TRACK_CHANGE":""},{"lat":"40.111925166667","lon":"-75.341984333333","trainno":"2553","service":"LOCAL","dest":"Malvern","currentstop":"Norristown T.C.","nextstop":"Conshohocken","line":"Manayunk\/Norristown","consist":"720,818,817,731,872,871","heading":"115.29889187156","late":0,"SOURCE":"Norristown TC","TRACK":"1N","TRACK_CHANGE":""},{"lat":"39.95249614","lon":"-75.15740737","trainno":"306","service":"EXP TO JENKINTOWN","dest":"West Trenton","currentstop":"Suburban Station","nextstop":"Jefferson Station","line":"West Trenton","consist":"330,331,407,429,430","heading":"100.31884436185","late":8,"SOURCE":"Media","TRACK":"2","TRACK_CHANGE":""},{"lat":"39.935151666667","lon":"-75.216639666667","trainno":"3223","service":"LOCAL","dest":"Newark","currentstop":"Penn Medicine Station","nextstop":"Darby","line":"Wilmington\/Newark","consist":"394,395,334,335,405","heading":"225.90234195823","late":10,"SOURCE":"West Trenton","TRACK":"4","TRACK_CHANGE":""},{"lat":"39.956630333333","lon":"-75.183183666667","trainno":"3226","service":"LOCAL","dest":"Norristown","currentstop":"Gray 30th Street","nextstop":"Suburban Station","line":"Manayunk\/Norristown","consist":"856,855,864,863,704","heading":"100.2315991337","late":0,"SOURCE":"Wawa","TRACK":"1","TRACK_CHANGE":""},{"lat":"39.910272833333","lon":"-75.320562666667","trainno":"334","service":"LOCAL","dest":"West Trenton","currentstop":"Morton","nextstop":"Secane","line":"Media\/Wawa","consist":"352,353,386,387,460,459","heading":"62.591730637011","late":0,"SOURCE":"Media","TRACK":"2","TRACK_CHANGE":""},{"lat":"40.245846666667","lon":"-74.8216815","trainno":"3541","service":"EXP TO BRYN MAWR","dest":"Malvern","currentstop":"West Trenton","nextstop":"Yardley","line":"West Trenton","consist":"812,811,721,701","heading":"201.84340772667","late":0,"SOURCE":"West Trenton","TRACK":"S","TRACK_CHANGE":""},{"lat":"40.092101333333","lon":"-75.137255333333","trainno":"3592","service":"EXP TO JENKINTOWN","dest":"Doylestown","currentstop":"Jenkintown Wyncote","nextstop":"Glenside","line":"Lansdale\/Doylestown","consist":"826,825,724,846,845","heading":"342.72310023705","late":11,"SOURCE":"Penn Medicine Station","TRACK":"2","TRACK_CHANGE":""},{"lat":"40.0928785","lon":"-75.137631333333","trainno":"3845","service":"LOCAL","dest":"Chestnut H West","currentstop":"Noble","nextstop":"Jenkintown Wyncote","line":"West Trenton","consist":"126,125,411,184,183","heading":"159.94299337673","late":12,"SOURCE":"West Trenton","TRACK":"1","TRACK_CHANGE":""},{"lat":"40.101419833333","lon":"-75.153902166667","trainno":"444","service":"LOCAL","dest":"Warminster","currentstop":"Elkins Park","nextstop":"Glenside","line":"Warminster","consist":"341,340,417,418","heading":"290.9388069375","late":15,"SOURCE":"Airport","TRACK":"2","TRACK_CHANGE":""},{"lat":"39.896810666667","lon":"-75.2403065","trainno":"448","service":"LOCAL","dest":"Warminster","currentstop":"Airport Terminal E F","nextstop":"Eastwick","line":"Airport","consist":"282,167,168,432,431","heading":"34.71707676198","late":6,"SOURCE":"Airport","TRACK":"2","TRACK_CHANGE":""},{"lat":"39.875881166667","lon":"-75.255888","trainno":"449","service":"LOCAL","dest":"Airport","currentstop":"Eastwick","nextstop":"Airport Terminal A","line":"Airport","consist":"170,169,382,383","heading":"149.06167463766","late":9,"SOURCE":"Warminster","TRACK":"2","TRACK_CHANGE":""},{"lat":"40.103761833333","lon":"-75.1586705","trainno":"453","service":"LOCAL","dest":"Airport","currentstop":"Ardsley","nextstop":"Glenside","line":"Warminster","consist":"718,737,705,810,809","heading":"149.66893086189","late":0,"SOURCE":"Warminster","TRACK":"1","TRACK_CHANGE":""},{"lat":"39.956711835","lon":"-75.153351285","trainno":"4846","service":"LOCAL","dest":"Fox Chase","currentstop":"Jefferson Station","nextstop":"Temple University","line":"Fox Chase","consist":"296,283,399,398","heading":"66.505000282775","late":10,"SOURCE":"Airport","TRACK":"1","TRACK_CHANGE":"2"},{"lat":"40.021806","lon":"-75.315659333333","trainno":"5250","service":"EXP TO EAST FALLS","dest":"Norristown TC","currentstop":"Bryn Mawr","nextstop":"Overbrook","line":"Paoli\/Thorndale","consist":"373,372,403,443,444,303","heading":"121.18178532401","late":7,"SOURCE":"Malvern","TRACK":"1","TRACK_CHANGE":""},{"lat":"40.087954333333","lon":"-75.135512833333","trainno":"5336","service":"LOCAL","dest":"West Trenton","currentstop":"Elkins Park","nextstop":"Jenkintown Wyncote","line":"West Trenton","consist":"807,808,838,837","heading":"344.3059738901","late":5,"SOURCE":"Malvern","TRACK":"2","TRACK_CHANGE":""},{"lat":"39.956864666667","lon":"-75.1854585","trainno":"5347","service":"LOCAL","dest":"Wawa","currentstop":"Gray 30th Street","nextstop":"Penn Medicine Station","line":"Media\/Wawa","consist":"722,719,857,858,833,834","heading":"278.56039428057","late":12,"SOURCE":"Doylestown","TRACK":"6","TRACK_CHANGE":""},{"lat":"39.959595275","lon":"-75.15268331","trainno":"5438","service":"LOCAL","dest":"Glenside","currentstop":"Jefferson Station","nextstop":"Temple University","line":"Warminster","consist":"172,171,436,435","heading":"22.371049408898","late":0,"SOURCE":"Thorndale","TRACK":"1","TRACK_CHANGE":""},{"lat":"40.111083","lon":"-75.093776666667","trainno":"6334","service":"EXP TO JENKINTOWN","dest":"West Trenton","currentstop":"Rydal","nextstop":"Meadowbrook","line":"West Trenton","consist":"2405,2550,2519,2514,2524,910","heading":"73.98772955947","late":19,"SOURCE":"30th St","TRACK":"2N","TRACK_CHANGE":""},{"lat":"40.0170025","lon":"-75.161860833333","trainno":"6480","service":"LTD","dest":"Warminster","currentstop":"Temple University","nextstop":"Fern Rock T C","line":"Warminster","consist":"851,852,827,828","heading":"0.1460785635341","late":7,"SOURCE":"30th St","TRACK":"2","TRACK_CHANGE":""},{"lat":"40.1363535","lon":"-75.213163833333","trainno":"6520","service":"LOCAL","dest":"Lansdale","currentstop":"Fort Washington","nextstop":"Ambler","line":"Lansdale\/Doylestown","consist":"423,424,453,454","heading":"312.81814229477","late":22,"SOURCE":"30th St","TRACK":"2","TRACK_CHANGE":""},{"lat":"40.181642666667","lon":"-75.2542215","trainno":"6525","service":"LOCAL","dest":"30th Street Gray","currentstop":"Gwynedd Valley","nextstop":"Penllyn","line":"Lansdale\/Doylestown","consist":"294,416,366,367,118,117","heading":"146.76852479771","late":2,"SOURCE":"Doylestown","TRACK":"1","TRACK_CHANGE":""},{"lat":"39.953594465","lon":"-75.165515185","trainno":"6594","service":"LOCAL","dest":"Doylestown","currentstop":"Suburban Station","nextstop":"Jefferson Station","line":"Lansdale\/Doylestown","consist":"730,870,869,738,703,713","heading":"107.6127416755","late":0,"SOURCE":"30th St","TRACK":"1","TRACK_CHANGE":""},{"lat":"39.9574785","lon":"-75.186907666667","trainno":"6596","service":"EXP TO JENKINTOWN","dest":"Lansdale","currentstop":"Gray 30th Street","nextstop":"30th Street Station","line":"Lansdale\/Doylestown","consist":"847,848,831,832,716","heading":"151.89401352593","late":1,"SOURCE":"30th Street Station","TRACK":"1","TRACK_CHANGE":""},{"lat":"39.957071166667","lon":"-75.186676666667","trainno":"720","service":"LOCAL","dest":"Chestnut H East","currentstop":"North Philadelphia Amtrak","nextstop":"Gray 30th Street","line":"Chestnut Hill East","consist":"835,836,803,804","heading":"138.77902847667","late":3,"SOURCE":"Trenton","TRACK":"2","TRACK_CHANGE":""},{"lat":"39.955108205","lon":"-75.17402146","trainno":"7537","service":"LOCAL","dest":"Malvern","currentstop":"Suburban Station","nextstop":"Gray 30th Street","line":"Paoli\/Thorndale","consist":"106,105,455,456","heading":"279.1494695633","late":3,"SOURCE":"Chestnut H East","TRACK":"4","TRACK_CHANGE":""},{"lat":"40.074025166667","lon":"-75.083825","trainno":"8451","service":"LOCAL","dest":"Airport","currentstop":"Fox Chase","nextstop":"Fox Chase","line":"Fox Chase","consist":"174,173,428,427,305","heading":"186.20845835254","late":28,"SOURCE":"Fox Chase","TRACK":"S","TRACK_CHANGE":""},{"lat":"40.068712666667","lon":"-75.2097865","trainno":"8750","service":"LOCAL","dest":"Chestnut H East","currentstop":"Chestnut Hill West","nextstop":"Highland","line":"Chestnut Hill West","consist":"729,853,854,728","heading":"136.49823687695","late":3,"SOURCE":"Chestnut H West","TRACK":"2","TRACK_CHANGE":""},{"lat":"39.95271957","lon":"-75.15887","trainno":"9345","service":"EXP TO PRIMOS","dest":"Wawa","currentstop":"Temple University","nextstop":"Jefferson Station","line":"Media\/Wawa","consist":"912,2510,2557,2525,2516,2408","heading":"222.13960990107","late":39,"SOURCE":"Temple U","TRACK":"4","TRACK_CHANGE":"3"},{"lat":"39.994061","lon":"-75.7539925","trainno":"9531","service":"LOCAL","dest":"Thorndale","currentstop":"Downingtown","nextstop":"Thorndale","line":"Paoli\/Thorndale","consist":"422,421,410,287","heading":"260.39451450345","late":5,"SOURCE":"Temple U","TRACK":"1","TRACK_CHANGE":""},{"lat":"40.039986","lon":"-75.502861666667","trainno":"9542","service":"LOCAL","dest":"Temple U","currentstop":"Malvern","nextstop":"Paoli","line":"Paoli\/Thorndale","consist":"862,861,866,865","heading":"69.536130129586","late":0,"SOURCE":"Malvern","TRACK":"1","TRACK_CHANGE":""},{"lat":"39.9538889","lon":"-75.1677778","trainno":"9591","service":"EXP TO BRYN MAWR","dest":"Thorndale","currentstop":"Temple University","nextstop":"Jefferson Station","line":"Paoli\/Thorndale","consist":null,"heading":null,"late":29,"SOURCE":"Temple U","TRACK":"4","TRACK_CHANGE":"3"},{"lat":"40.071245833333","lon":"-74.953280833333","trainno":"9757","service":"LOCAL","dest":"Trenton","currentstop":"Torresdale","nextstop":"Cornwells Heights","line":"Trenton","consist":"714,814,813,712,707","heading":"58.637048754767","late":5,"SOURCE":"Temple U","TRACK":"1","TRACK_CHANGE":""},{"lat":"39.9581445","lon":"-75.187272666667","trainno":"9759","service":"EXP TO HOLMESBURG","dest":"Trenton","currentstop":"Gray 30th Street","nextstop":"Holmesburg Jct","line":"Trenton","consist":"401,292,338,339","heading":"279.1494695633","late":0,"SOURCE":"Temple U","TRACK":"1","TRACK_CHANGE":""},{"lat":"40.014779333333","lon":"-75.162258833333","trainno":"9843","service":"LOCAL","dest":"Chestnut H West","currentstop":"Temple University","nextstop":"Temple University","line":"Chestnut Hill West","consist":"439,440,447,448","heading":"338.02978933442","late":999,"SOURCE":"Temple U","TRACK":"3","TRACK_CHANGE":""}]

Pretty printed

[
  {
    "lat": "39.990750166667",
    "lon": "-75.225662166667",
    "trainno": "1083",
    "service": "LOCAL",
    "dest": "Cynwyd",
    "currentstop": "Wynnefield Avenue",
    "nextstop": "Bala",
    "line": "Cynwyd",
    "consist": "702",
    "heading": "1.3489486830105",
    "late": 0,
    "SOURCE": "Suburban Station",
    "TRACK": "S",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.033443333333",
    "lon": "-75.234825",
    "trainno": "220",
    "service": "LOCAL",
    "dest": "Norristown",
    "currentstop": "Manayunk",
    "nextstop": "Ivy Ridge",
    "line": "Manayunk/Norristown",
    "consist": "277,179,180,457,458",
    "heading": "323.9772289135",
    "late": 0,
    "SOURCE": "Wilmington",
    "TRACK": "2N",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.907524666667",
    "lon": "-75.4116355",
    "trainno": "2321",
    "service": "LOCAL",
    "dest": "Wawa",
    "currentstop": "Elwyn Station",
    "nextstop": "Elwyn Station",
    "line": "Media/Wawa",
    "consist": "293,146,145,162,161",
    "heading": "224.55223684683",
    "late": 11,
    "SOURCE": "Norristown",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.979432333333",
    "lon": "-75.149822833333",
    "trainno": "2323",
    "service": "LOCAL",
    "dest": "Wawa",
    "currentstop": "Temple University",
    "nextstop": "Jefferson Station",
    "line": "Media/Wawa",
    "consist": "414,384,385,130,129,288",
    "heading": "185.3249506434",
    "late": 3,
    "SOURCE": "Norristown",
    "TRACK": "4",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.900494",
    "lon": "-75.279761333333",
    "trainno": "2522",
    "service": "EXP TO FT WASH",
    "dest": "Doylestown",
    "currentstop": "Glenolden",
    "nextstop": "Folcroft",
    "line": "Wilmington/Newark",
    "consist": "280,123,124,369,368",
    "heading": "65.270856780656",
    "late": 0,
    "SOURCE": "Newark",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.111925166667",
    "lon": "-75.341984333333",
    "trainno": "2553",
    "service": "LOCAL",
    "dest": "Malvern",
    "currentstop": "Norristown T.C.",
    "nextstop": "Conshohocken",
    "line": "Manayunk/Norristown",
    "consist": "720,818,817,731,872,871",
    "heading": "115.29889187156",
    "late": 0,
    "SOURCE": "Norristown TC",
    "TRACK": "1N",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.95249614",
    "lon": "-75.15740737",
    "trainno": "306",
    "service": "EXP TO JENKINTOWN",
    "dest": "West Trenton",
    "currentstop": "Suburban Station",
    "nextstop": "Jefferson Station",
    "line": "West Trenton",
    "consist": "330,331,407,429,430",
    "heading": "100.31884436185",
    "late": 8,
    "SOURCE": "Media",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.935151666667",
    "lon": "-75.216639666667",
    "trainno": "3223",
    "service": "LOCAL",
    "dest": "Newark",
    "currentstop": "Penn Medicine Station",
    "nextstop": "Darby",
    "line": "Wilmington/Newark",
    "consist": "394,395,334,335,405",
    "heading": "225.90234195823",
    "late": 10,
    "SOURCE": "West Trenton",
    "TRACK": "4",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.956630333333",
    "lon": "-75.183183666667",
    "trainno": "3226",
    "service": "LOCAL",
    "dest": "Norristown",
    "currentstop": "Gray 30th Street",
    "nextstop": "Suburban Station",
    "line": "Manayunk/Norristown",
    "consist": "856,855,864,863,704",
    "heading": "100.2315991337",
    "late": 0,
    "SOURCE": "Wawa",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.910272833333",
    "lon": "-75.320562666667",
    "trainno": "334",
    "service": "LOCAL",
    "dest": "West Trenton",
    "currentstop": "Morton",
    "nextstop": "Secane",
    "line": "Media/Wawa",
    "consist": "352,353,386,387,460,459",
    "heading": "62.591730637011",
    "late": 0,
    "SOURCE": "Media",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.245846666667",
    "lon": "-74.8216815",
    "trainno": "3541",
    "service": "EXP TO BRYN MAWR",
    "dest": "Malvern",
    "currentstop": "West Trenton",
    "nextstop": "Yardley",
    "line": "West Trenton",
    "consist": "812,811,721,701",
    "heading": "201.84340772667",
    "late": 0,
    "SOURCE": "West Trenton",
    "TRACK": "S",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.092101333333",
    "lon": "-75.137255333333",
    "trainno": "3592",
    "service": "EXP TO JENKINTOWN",
    "dest": "Doylestown",
    "currentstop": "Jenkintown Wyncote",
    "nextstop": "Glenside",
    "line": "Lansdale/Doylestown",
    "consist": "826,825,724,846,845",
    "heading": "342.72310023705",
    "late": 11,
    "SOURCE": "Penn Medicine Station",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.0928785",
    "lon": "-75.137631333333",
    "trainno": "3845",
    "service": "LOCAL",
    "dest": "Chestnut H West",
    "currentstop": "Noble",
    "nextstop": "Jenkintown Wyncote",
    "line": "West Trenton",
    "consist": "126,125,411,184,183",
    "heading": "159.94299337673",
    "late": 12,
    "SOURCE": "West Trenton",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.101419833333",
    "lon": "-75.153902166667",
    "trainno": "444",
    "service": "LOCAL",
    "dest": "Warminster",
    "currentstop": "Elkins Park",
    "nextstop": "Glenside",
    "line": "Warminster",
    "consist": "341,340,417,418",
    "heading": "290.9388069375",
    "late": 15,
    "SOURCE": "Airport",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.896810666667",
    "lon": "-75.2403065",
    "trainno": "448",
    "service": "LOCAL",
    "dest": "Warminster",
    "currentstop": "Airport Terminal E F",
    "nextstop": "Eastwick",
    "line": "Airport",
    "consist": "282,167,168,432,431",
    "heading": "34.71707676198",
    "late": 6,
    "SOURCE": "Airport",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.875881166667",
    "lon": "-75.255888",
    "trainno": "449",
    "service": "LOCAL",
    "dest": "Airport",
    "currentstop": "Eastwick",
    "nextstop": "Airport Terminal A",
    "line": "Airport",
    "consist": "170,169,382,383",
    "heading": "149.06167463766",
    "late": 9,
    "SOURCE": "Warminster",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.103761833333",
    "lon": "-75.1586705",
    "trainno": "453",
    "service": "LOCAL",
    "dest": "Airport",
    "currentstop": "Ardsley",
    "nextstop": "Glenside",
    "line": "Warminster",
    "consist": "718,737,705,810,809",
    "heading": "149.66893086189",
    "late": 0,
    "SOURCE": "Warminster",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.956711835",
    "lon": "-75.153351285",
    "trainno": "4846",
    "service": "LOCAL",
    "dest": "Fox Chase",
    "currentstop": "Jefferson Station",
    "nextstop": "Temple University",
    "line": "Fox Chase",
    "consist": "296,283,399,398",
    "heading": "66.505000282775",
    "late": 10,
    "SOURCE": "Airport",
    "TRACK": "1",
    "TRACK_CHANGE": "2"
  },
  {
    "lat": "40.021806",
    "lon": "-75.315659333333",
    "trainno": "5250",
    "service": "EXP TO EAST FALLS",
    "dest": "Norristown TC",
    "currentstop": "Bryn Mawr",
    "nextstop": "Overbrook",
    "line": "Paoli/Thorndale",
    "consist": "373,372,403,443,444,303",
    "heading": "121.18178532401",
    "late": 7,
    "SOURCE": "Malvern",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.087954333333",
    "lon": "-75.135512833333",
    "trainno": "5336",
    "service": "LOCAL",
    "dest": "West Trenton",
    "currentstop": "Elkins Park",
    "nextstop": "Jenkintown Wyncote",
    "line": "West Trenton",
    "consist": "807,808,838,837",
    "heading": "344.3059738901",
    "late": 5,
    "SOURCE": "Malvern",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.956864666667",
    "lon": "-75.1854585",
    "trainno": "5347",
    "service": "LOCAL",
    "dest": "Wawa",
    "currentstop": "Gray 30th Street",
    "nextstop": "Penn Medicine Station",
    "line": "Media/Wawa",
    "consist": "722,719,857,858,833,834",
    "heading": "278.56039428057",
    "late": 12,
    "SOURCE": "Doylestown",
    "TRACK": "6",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.959595275",
    "lon": "-75.15268331",
    "trainno": "5438",
    "service": "LOCAL",
    "dest": "Glenside",
    "currentstop": "Jefferson Station",
    "nextstop": "Temple University",
    "line": "Warminster",
    "consist": "172,171,436,435",
    "heading": "22.371049408898",
    "late": 0,
    "SOURCE": "Thorndale",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.111083",
    "lon": "-75.093776666667",
    "trainno": "6334",
    "service": "EXP TO JENKINTOWN",
    "dest": "West Trenton",
    "currentstop": "Rydal",
    "nextstop": "Meadowbrook",
    "line": "West Trenton",
    "consist": "2405,2550,2519,2514,2524,910",
    "heading": "73.98772955947",
    "late": 19,
    "SOURCE": "30th St",
    "TRACK": "2N",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.0170025",
    "lon": "-75.161860833333",
    "trainno": "6480",
    "service": "LTD",
    "dest": "Warminster",
    "currentstop": "Temple University",
    "nextstop": "Fern Rock T C",
    "line": "Warminster",
    "consist": "851,852,827,828",
    "heading": "0.1460785635341",
    "late": 7,
    "SOURCE": "30th St",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.1363535",
    "lon": "-75.213163833333",
    "trainno": "6520",
    "service": "LOCAL",
    "dest": "Lansdale",
    "currentstop": "Fort Washington",
    "nextstop": "Ambler",
    "line": "Lansdale/Doylestown",
    "consist": "423,424,453,454",
    "heading": "312.81814229477",
    "late": 22,
    "SOURCE": "30th St",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.181642666667",
    "lon": "-75.2542215",
    "trainno": "6525",
    "service": "LOCAL",
    "dest": "30th Street Gray",
    "currentstop": "Gwynedd Valley",
    "nextstop": "Penllyn",
    "line": "Lansdale/Doylestown",
    "consist": "294,416,366,367,118,117",
    "heading": "146.76852479771",
    "late": 2,
    "SOURCE": "Doylestown",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.953594465",
    "lon": "-75.165515185",
    "trainno": "6594",
    "service": "LOCAL",
    "dest": "Doylestown",
    "currentstop": "Suburban Station",
    "nextstop": "Jefferson Station",
    "line": "Lansdale/Doylestown",
    "consist": "730,870,869,738,703,713",
    "heading": "107.6127416755",
    "late": 0,
    "SOURCE": "30th St",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.9574785",
    "lon": "-75.186907666667",
    "trainno": "6596",
    "service": "EXP TO JENKINTOWN",
    "dest": "Lansdale",
    "currentstop": "Gray 30th Street",
    "nextstop": "30th Street Station",
    "line": "Lansdale/Doylestown",
    "consist": "847,848,831,832,716",
    "heading": "151.89401352593",
    "late": 1,
    "SOURCE": "30th Street Station",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.957071166667",
    "lon": "-75.186676666667",
    "trainno": "720",
    "service": "LOCAL",
    "dest": "Chestnut H East",
    "currentstop": "North Philadelphia Amtrak",
    "nextstop": "Gray 30th Street",
    "line": "Chestnut Hill East",
    "consist": "835,836,803,804",
    "heading": "138.77902847667",
    "late": 3,
    "SOURCE": "Trenton",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.955108205",
    "lon": "-75.17402146",
    "trainno": "7537",
    "service": "LOCAL",
    "dest": "Malvern",
    "currentstop": "Suburban Station",
    "nextstop": "Gray 30th Street",
    "line": "Paoli/Thorndale",
    "consist": "106,105,455,456",
    "heading": "279.1494695633",
    "late": 3,
    "SOURCE": "Chestnut H East",
    "TRACK": "4",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.074025166667",
    "lon": "-75.083825",
    "trainno": "8451",
    "service": "LOCAL",
    "dest": "Airport",
    "currentstop": "Fox Chase",
    "nextstop": "Fox Chase",
    "line": "Fox Chase",
    "consist": "174,173,428,427,305",
    "heading": "186.20845835254",
    "late": 28,
    "SOURCE": "Fox Chase",
    "TRACK": "S",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.068712666667",
    "lon": "-75.2097865",
    "trainno": "8750",
    "service": "LOCAL",
    "dest": "Chestnut H East",
    "currentstop": "Chestnut Hill West",
    "nextstop": "Highland",
    "line": "Chestnut Hill West",
    "consist": "729,853,854,728",
    "heading": "136.49823687695",
    "late": 3,
    "SOURCE": "Chestnut H West",
    "TRACK": "2",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.95271957",
    "lon": "-75.15887",
    "trainno": "9345",
    "service": "EXP TO PRIMOS",
    "dest": "Wawa",
    "currentstop": "Temple University",
    "nextstop": "Jefferson Station",
    "line": "Media/Wawa",
    "consist": "912,2510,2557,2525,2516,2408",
    "heading": "222.13960990107",
    "late": 39,
    "SOURCE": "Temple U",
    "TRACK": "4",
    "TRACK_CHANGE": "3"
  },
  {
    "lat": "39.994061",
    "lon": "-75.7539925",
    "trainno": "9531",
    "service": "LOCAL",
    "dest": "Thorndale",
    "currentstop": "Downingtown",
    "nextstop": "Thorndale",
    "line": "Paoli/Thorndale",
    "consist": "422,421,410,287",
    "heading": "260.39451450345",
    "late": 5,
    "SOURCE": "Temple U",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.039986",
    "lon": "-75.502861666667",
    "trainno": "9542",
    "service": "LOCAL",
    "dest": "Temple U",
    "currentstop": "Malvern",
    "nextstop": "Paoli",
    "line": "Paoli/Thorndale",
    "consist": "862,861,866,865",
    "heading": "69.536130129586",
    "late": 0,
    "SOURCE": "Malvern",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.9538889",
    "lon": "-75.1677778",
    "trainno": "9591",
    "service": "EXP TO BRYN MAWR",
    "dest": "Thorndale",
    "currentstop": "Temple University",
    "nextstop": "Jefferson Station",
    "line": "Paoli/Thorndale",
    "consist": null,
    "heading": null,
    "late": 29,
    "SOURCE": "Temple U",
    "TRACK": "4",
    "TRACK_CHANGE": "3"
  },
  {
    "lat": "40.071245833333",
    "lon": "-74.953280833333",
    "trainno": "9757",
    "service": "LOCAL",
    "dest": "Trenton",
    "currentstop": "Torresdale",
    "nextstop": "Cornwells Heights",
    "line": "Trenton",
    "consist": "714,814,813,712,707",
    "heading": "58.637048754767",
    "late": 5,
    "SOURCE": "Temple U",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "39.9581445",
    "lon": "-75.187272666667",
    "trainno": "9759",
    "service": "EXP TO HOLMESBURG",
    "dest": "Trenton",
    "currentstop": "Gray 30th Street",
    "nextstop": "Holmesburg Jct",
    "line": "Trenton",
    "consist": "401,292,338,339",
    "heading": "279.1494695633",
    "late": 0,
    "SOURCE": "Temple U",
    "TRACK": "1",
    "TRACK_CHANGE": ""
  },
  {
    "lat": "40.014779333333",
    "lon": "-75.162258833333",
    "trainno": "9843",
    "service": "LOCAL",
    "dest": "Chestnut H West",
    "currentstop": "Temple University",
    "nextstop": "Temple University",
    "line": "Chestnut Hill West",
    "consist": "439,440,447,448",
    "heading": "338.02978933442",
    "late": 999,
    "SOURCE": "Temple U",
    "TRACK": "3",
    "TRACK_CHANGE": ""
  }
]

Figure out Bus Implementation

There are a lot more bus routes and even more bus stops. Figure our how to implement them. Leaning towards using GTFS data to do codegen.

Handle empty Arrivals response

The Arrivals endpoint responds differently if there are no pending arrivals. Below is an example:

{"Temple U Departures: April 15, 2023, 1:23 am":[[],[]]}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.