nightjetter/README.md

107 lines
10 KiB
Markdown

# Nightjetter
A search through all the available prices for a single ÖBB Nightjet route from A to B.
Can be used to continuously monitor prices and notify the user on changes,
or for a single search for all available prices.
Comes with a nice Python CLI, or could be imported as a Python library for programmatic use.
## The CLI
It comes with a `typer`-supported CLI which you can use to craft your search.
Most options should be pretty self-explanatory, but a few notes:
- `monitor-mode` switches between a single search or the app running continuously until you turn it off.
- Any files created by the application are put under the `base-output-directory`, so make sure it has write permissions there.
- I am not sure how important the `birthdate` is, but included it since Nightjet may give discounts for young people or seniors?
- You can use the price snapshots, if you decide to create them with `dump-price-snapshot`, to create pretty time series graphs
- Currently, we _only_ support `ntfy`, as well as the official `ntfy` server as the notification channel
```sh
Usage: nightjet [OPTIONS] COMMAND [ARGS]...
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or customize the installation. │
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ──────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ query Check the (lowest) prices for a single connection. │
│ lastdate Check for the currently latest possible booking date. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```
```sh
Usage: nightjet query [OPTIONS] TRAVEL_DATE
Check the (lowest) prices for a single connection.
Will run repeatedly or one-shot and query the prices for a specific connection. Can be set to output all available
prices or just output the lowest found. Outputs will (curently) always be given as csv files.
╭─ Arguments ─────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * travel_date TEXT Travel day to search from. (YYYY-MM-DD) [default: None] [required]
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --start-station INTEGER Departure station number. (default: Berlin Hbf)
[default: 8096003]
│ --end-station INTEGER Destination station number. (default: Paris Est)
[default: 8796001]
│ --birthdate TEXT Traveller birthdate, may be important for
│ discounts. (YYYY-MM-DD)
[default: 1990-01-01]
│ --notification-channel TEXT ntfy channel to inform user on. │
[default: nightjet-price-notifier]
│ --monitor-mode --no-monitor-mode Run queries repeatedly over time. If False only │
│ runs a single query (oneshot mode). │
[default: monitor-mode]
│ --monitor-frequency INTEGER How often to run price queries if in monitoring │
│ mode, in seconds. │
[default: 3600]
│ --base-output-directory PATH Directory in which to output all result files. │
[default: out]
│ --lowest-prices-filename TEXT Filename for collecting lowest found prices. │
[default: lowest.csv]
│ --price-snapshot-pattern TEXT Filename pattern for saving all prices of each │
│ query. Takes %%DATE%% as pattern to replace with │
│ current unix timestamp. │
[default: all_prices_%%DATE%%.csv]
│ --dump-price-snapshot --no-dump-price-snapshot Dump _all_ queried prices into a timestamped csv │
│ file. │
[default: dump-price-snapshot]
│ --latest-bookable-date --no-latest-bookable-date Check for latest currently possible booking date │
│ only. │
[default: no-latest-bookable-date]
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```
## Future
This tool does (mostly did) what I needed it to do.
That means I don't have a big drive to work on, change and add to the current codebase.
Nevertheless, feel welcome to file an issue if you noticed something, or have a feature request.
PRs are of course also always welcome.
Here are a bunch of things I think should definitely be considered for further work:
1. The code is not very organized, and everything is one big file.
Perhaps this could be extracted into the individual areas of operation a bit better.
2. Additional patterns for the price snapshots. We currently only consider `%%DATE%%` as a valid substitution.
It is substituted into a unix timestamp. More flexibility here could be nice.
Perhaps also allow the substitution in other paths passed to the cli.
3. The stations are only considered as internal numbers (`int` types). This would be a first QoL change,
to automatically look up the correct station number for whatever is passed in.
4. We don't map the trains, stations and journeys as internal objects.
Instead they are all passed around as dicts and JSON objects.
This could definitely be improved for better maintainability.
5. Support more notification channels. This should be self-explanatory, and could probably be pretty
easily be improved with a library like [apprise](https://github.com/caronc/apprise?tab=readme-ov-file#developer-api-usage).
6. Support simple stdout responses. We always dump to csv files for the price queries currently,
this definitely needs to change.