summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2011-06-21 15:41:03 +0200
committerDaniel Friesel <derf@finalrewind.org>2011-06-21 15:41:03 +0200
commit12b8919088d7f4b03c14f7981296de463ab0d105 (patch)
treec05a3bdc1554f7850027df6589abef02b9f90f75
parent74a34fa9e5f716fd7471c16e86e609b667e49b60 (diff)
Switch to full DB interface
-rwxr-xr-xbin/mris112
1 files changed, 81 insertions, 31 deletions
diff --git a/bin/mris b/bin/mris
index fa78145..06b6483 100755
--- a/bin/mris
+++ b/bin/mris
@@ -28,7 +28,7 @@ my $post = {
};
my $ua = LWP::UserAgent->new();
-my $reply = $ua->post('http://mobile.bahn.de/bin/mobil/bhftafel.exe/dox?rt=1&use_realtime_filter=1', $post)->content();
+my $reply = $ua->post('http://mobile.bahn.de/bin/mobil/bhftafel.exe/dn?rt=1', $post)->content();
my $tree = XML::LibXML->load_html(
string => $reply,
@@ -37,44 +37,94 @@ my $tree = XML::LibXML->load_html(
suppress_warnings => 1,
);
-my $xp_element = XML::LibXML::XPathExpression->new('//div[@class="sqdetailsDep trow"]');
-my $xp_late = XML::LibXML::XPathExpression->new('./span[@class="red"]');
-my $xp_on_time = XML::LibXML::XPathExpression->new('./span[@class="green bold"]');
-my $xp_bold = XML::LibXML::XPathExpression->new('.//span[@class="bold"]');
-my $re_platform = qr{
- Gl\. \s (\d+) $
-}msx;
-my $re_dest = qr{
- >> \n ([^\n]+) \n
-}msx;
-
-for my $div (@{$tree->findnodes($xp_element)}) {
-
- my ($n_line, $n_time) = $div->findnodes($xp_bold);
- my ($n_late) = $div->findnodes($xp_late);
- my $text = $div->textContent();
-
- my ($platform) = ($text =~ $re_platform);
- my ($destination) = ($text =~ $re_dest);
- my $line = $n_line->textContent();
+my $xp_element = XML::LibXML::XPathExpression->new('//table[@class="result stboard dep"]/tr');
+my $xp_time = XML::LibXML::XPathExpression->new('./td[@class="time"]');
+my $xp_train = XML::LibXML::XPathExpression->new('./td[@class="train"]');
+my $xp_route = XML::LibXML::XPathExpression->new('./td[@class="route"]');
+my $xp_dest = XML::LibXML::XPathExpression->new('./td[@class="route"]//a');
+my $xp_platform = XML::LibXML::XPathExpression->new('./td[@class="platform"]');
+my $xp_info = XML::LibXML::XPathExpression->new('./td[@class="ris"]');
+
+my $re_via = qr{
+ ^ (.+) \n
+ \d{1,2}:\d{1,2}
+}mx;
+
+for my $tr (@{$tree->findnodes($xp_element)}) {
+
+ my ($n_time) = $tr->findnodes($xp_time);
+ my (undef, $n_train) = $tr->findnodes($xp_train);
+ my ($n_route) = $tr->findnodes($xp_route);
+ my ($n_dest) = $tr->findnodes($xp_dest);
+ my ($n_platform)= $tr->findnodes($xp_platform);
+ my ($n_info) = $tr->findnodes($xp_info);
+ my $first = 1;
+
+ if (not ($n_time and $n_dest))
+ {
+ next;
+ }
+
my $time = $n_time->textContent();
+ my $train = $n_train->textContent();
+ my $route = $n_route->textContent();
+ my $dest = $n_dest->textContent();
+ my $platform = $n_platform->textContent();
+ my $info = $n_info->textContent();
+ my $via_str;
+ my (@via, @via_main, @via_show);
+
+ for my $str ($time, $train, $dest, $platform, $info) {
+ $str =~ s/\n//mg;
+ $str =~ tr/ //s;
+ }
+
+ $info =~ s/,Grund//;
+
+ while ($route =~ m{$re_via}g) {
+ if ($first) {
+ $first = 0;
+ next;
+ }
+ my $stop = $1;
+ push(@via, $stop);
+ if ($stop =~ /Hbf$/) {
+ push(@via_main, $stop);
+ }
+ }
+ pop(@via);
+
+ if (@via_main and @via and $via[0] eq $via_main[0]) {
+ shift(@via_main);
+ }
+
+ if (@via < 3) {
+ @via_show = @via;
+ }
+ else {
+ @via_show = splice(@via, 0, (@via_main > 2 ? 1 : 3 - @via_main));
+
+ while (@via_show < 3 and @via_main) {
+ my $stop = shift(@via_main);
+ if ($stop ~~ \@via_show) {
+ next;
+ }
+ push(@via_show, $stop);
+ }
+ }
- my $late = (
- $n_late
- ? $n_late->textContent()
- : q{}
- );
- $line =~ tr/ //s;
printf(
- "%s %-10s %-30s %-2d %s\n",
+ "%5s %-10s %-80s %-20s %-2d %s\n",
$time,
- $line,
- $destination,
+ $train,
+ join(' ', @via_show),
+ $dest,
$platform,
- $late
+ $info,
);
+
}
__END__