summaryrefslogtreecommitdiff
path: root/script/tfl_monitor
blob: 704f3fc3e9e15f30c4af13a41c5de8de99044742 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env perl 
use strict;
use warnings;
use TFLMonitor::Schema;
use XML::LibXML;
use XML::LibXML::XPathContext;
use Path::Class;
 
my $libdir=file(__FILE__)->parent;
my $dbfile=$libdir->parent->file('monitor.db');
 
my $doc=XML::LibXML->load_xml(location=> 'http://apibeta.london.gov.uk/TrackernetWebServicev3/timetableservice.aspx?Feed=7&linesWithIncidents=false');
 
die "Couldn't fetch status\n" unless $doc;
 
my $schema=TFLMonitor::Schema->connect(
    "dbi:SQLite:dbname=$dbfile",
    '','',
    {
        AutoCommit => 1,
    });
 
my $xpath=XML::LibXML::XPathContext->new($doc);
$xpath->registerNs('ws','http://webservices.lul.co.uk/');
 
my (%lines,%status,@ls);
 
for my $ls ($xpath->findnodes(q{/ws:ArrayOfLineStatus/ws:LineStatus},$doc)) {
    my ($line)=$xpath->findnodes(q{ws:Line},$ls);
    my $line_id=$line->findvalue(q{@ID});
    $lines{$line_id} ||= {
        id => $line_id,
        name => $line->findvalue(q{@Name}),
    };
 
    my ($status)=$xpath->findnodes(q{ws:Status},$ls);
    my $status_code=$status->findvalue(q{@ID});
    my $is_active=$status->findvalue(q{@IsActive});
    $status{$status_code} ||= {
        code => $status_code,
        class => $status->findvalue(q{@CssClass}),
        description => $status->findvalue(q{@Description}),
        is_active => $is_active,
    };
 
    push @ls,{
        'time' => time(),
        line_id => $line_id,
        status_code => $status_code,
        is_active => $is_active,
        details => $ls->findvalue(q{@StatusDetails}),
    };
}
 
$schema->txn_do(
    sub{
        for my $l (values %lines) {
            $schema->resultset('TFLMonitor::Schema::Line')
                ->find_or_create(
                    $l,
                    key => 'primary' },
                );
        }
        for my $s (values %status) {
            $schema->resultset('TFLMonitor::Schema::Status')
                ->find_or_create(
                    $s,
                    key => 'primary' },
                );
        }
        for my $ls (@ls) {
            $schema->resultset('TFLMonitor::Schema::LineStatus')->create($ls);
        }
    }
);