Awesome
slovenske-zeleznice
JavaScript client for the Slovenian 🇸🇮 Slovenske železnice (SŽ) railway API. Inofficial, using SŽ endpoints. Ask them for permission before using this module in production.
Installation
npm install --save slovenske-zeleznice
Usage
const sz = require('slovenske-zeleznice')
The slovenske-zeleznice
module conforms to the FPTI-JS 0.3.2
standard for JavaScript public transportation modules and exposes the following methods:
Method | Feature description | FPTI-JS 0.3.2 |
---|---|---|
stations.all([opt]) | All stations of the SŽ network, such as Ljubljana or Maribor | ✅ yes |
journeys(origin, destination, [opt]) | Journeys between stations | ✅ yes |
legStopovers(legId) | All stopovers for a leg (all stations the train passes on that leg) | ❌ no |
stations.all([opt])
Get all stations of the SŽ network, such as Ljubljana
or Maribor
. See this method in the FPTI-JS 0.3.2
spec.
Supported Options
There currently aren't any supported options for this method, but this might change in a future release.
Example
const sz = require('slovenske-zeleznice')
const stationStream = sz.stations.all()
stationStream.on('data', item => {
// item is an FPTF station object
console.log(item)
})
{
type: "station",
id: "42357",
name: "Ljubljana Brinje"
}
journeys(origin, destination, [opt])
Find journeys between stations. See this method in the FPTI-JS 0.3.2
spec.
Supported Options
Attribute | Description | FPTI-spec | Value type | Default |
---|---|---|---|---|
when | Journey date, synonym to departureAfter | ✅ | Date | new Date() |
departureAfter | List journeys with a departure (first leg) after this date | ✅ | Date | new Date() |
results | Max. number of results returned | ✅ | Number | null |
interval | Results for how many minutes after when /departureAfter | ✅ | Number | null |
transfers | Max. number of transfers | ✅ | Number | null |
Note that, unless opt.interval
is specified, the module will return journeys that start after when
/departureAfter
, but before the beginning of the following calendar day in Europe/Ljubljana
time zone.
Example
const ljubljana = '42300'
const maribor = { // FPTF station
type: 'station',
id: '43400'
// …
}
sz.journeys(ljubljana, maribor, { when: new Date('2019-06-27T05:00:00+0200'), transfers: 0 }).then(…)
{
type: "journey",
id: "2004###2019-06-27###42300###43400",
info: "Timetable valid from 9. Dec. 2018 do 14. Dec. 2019.",
legs: [
{
origin: {
type: "station",
id: "42300",
name: "Ljubljana"
},
destination: {
type: "station",
id: "43400",
name: "Maribor"
},
departure: "2019-06-27T10:50:00.000+02:00",
arrival: "2019-06-27T13:35:00.000+02:00",
mode: "train",
public: true,
line: {
type: "line",
id: "2004",
name: "LPV 2004",
number: "2004",
product: "LPV",
mode: "train",
public: true,
operator: {
type: "operator",
id: "sž",
name: "Slovenske železnice",
url: "http://www.slo-zeleznice.si"
}
},
operator: {
type: "operator",
id: "sž",
name: "Slovenske železnice",
url: "http://www.slo-zeleznice.si"
},
bicycle: true,
wifi: false,
id: "2004###2019-06-27###42300###43400"
}
],
price: {
amount: 9.56,
currency: "EUR"
}
}
legStopovers(legId)
All stopovers for a given leg (all stations the train passes on that leg). Obtain a legId
using the journeys(origin, destination, [opt])
method. Returns a Promise
that resolves in a list of stopovers.
Example
const legId = '2004###2019-06-27###42300###43400' // taken from the journeys example above
sz.legStopovers(legId).then(…)
[
{
type: "stopover",
stop: {
type: "station",
id: "42300",
name: "Ljubljana"
},
departure: "2019-06-27T10:50:00.000+02:00",
arrival: null
},
{
type: "stopover",
stop: {
type: "station",
id: "42212",
name: "Ljubljana Polje"
},
departure: "2019-06-27T10:56:00.000+02:00",
arrival: "2019-06-27T10:55:00.000+02:00"
},
// …
{
type: "stopover",
stop: {
type: "station",
id: "43304",
name: "Maribor Tezno"
},
departure: "2019-06-27T13:32:00.000+02:00",
arrival: "2019-06-27T13:31:00.000+02:00"
},
{
type: "stopover",
stop: {
type: "station",
id: "43400",
name: "Maribor"
},
departure: null,
arrival: "2019-06-27T13:35:00.000+02:00"
}
]
Contributing
If you found a bug or want to propose a feature, feel free to visit the issues page.