#!/usr/bin/env perl use strict; use warnings; use 5.010; use File::ShareDir qw(dist_file); use Getopt::Long qw(:config no_ignore_case); use HTML::Template; use List::Util qw(first); use Travel::Status::DE::DeutscheBahn; our $VERSION = '0.00'; my @params; my ( $station, @platforms ); my $mode = 'single'; my $template_file; my $template; GetOptions( 'h|help' => sub { show_help(0) }, 'm|mode=s' => \$mode, 't|template=s' => \&handle_template, 'V|version' => sub { say "db-fakedisplay version ${VERSION}"; exit 0 }, ) or show_help(1); if ( $mode eq 'single' and not $template_file ) { $template_file = dist_file( 'db-fakedisplay', 'single-lcd.html' ); } ( $station, @platforms ) = @ARGV; $template_file //= dist_file( 'db-fakedisplay', 'multi-lcd.html' ); $template = HTML::Template->new( filename => $template_file, loop_context_vars => 1 ); if ( not defined $station ) { show_help(1); } my $status = Travel::Status::DE::DeutscheBahn->new( station => $station ); sub handle_template { my ( undef, $template_name ) = @_; if ( -e $template_name ) { $template_file = $template_name; } else { $template_file = dist_file( 'db-fakedisplay', $template_name ); } return; } sub show_help { my ($exit_status) = @_; say 'Usage: db-fakedisplay [-t template] [platforms ...]'; say 'See also: man db-fakedisplay'; exit $exit_status; } sub add_result { my ($result) = @_; push( @params, { time => $result->time, train => $result->train, via => [ map { { stop => $_ } } $result->route_interesting(3) ], destination => $result->destination, platform => ( split( / /, $result->platform ) )[0], info => $result->info, } ); return; } if ( $mode eq 'single' ) { if ( not @platforms ) { for my $result ( $status->results ) { if ( $result->platform ~~ \@platforms ) { next; } push( @platforms, $result->platform ); } @platforms = sort { $a <=> $b } @platforms; } for my $platform (@platforms) { my $result = first { $_->platform =~ m{ ^ $platform (?: \s | $ )}x } $status->results; if ( not defined $result ) { push( @params, { platform => $platform } ); } else { add_result($result); } } } else { for my $result ( $status->results ) { add_result($result); } } $template->param( departures => \@params, ); say $template->output; __END__ =head1 NAME db-fakedisplay - Show train departures, as seen on the displays on most main stations =head1 SYNOPSIS B [-t I