Jacek Kowalski
2019-02-08 914dc87c49752c602d05e171efe6fd438164ee94
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
<?php
require_once(__DIR__.'/lib/fetch.php');
require_once(__DIR__.'/lib/mapper.php');
 
$logger = new Monolog\Logger('Parse changes');
 
$sources = [
    'buses' => [
        'gtfs' => 'ftp://ztp.krakow.pl/VehiclePositions_A.pb',
        'gtfs_file' => 'VehiclePositions_A.pb',
        'ttss' => 'http://91.223.13.70/internetservice/geoserviceDispatcher/services/vehicleinfo/vehicles',
        'ttss_file' => 'vehicles_A.json',
        'result' => 'mapping_A.json',
    ],
];
 
foreach($sources as $name => $source) {
    $logger = new Monolog\Logger('fetch_'.$name);
    try {
        $logger->info('Fetching '.$name.' position data from FTP...');
        $updated = ftp_fetch_if_newer($source['gtfs'], __DIR__.'/data/'.$source['gtfs_file']);
        if(!$updated) {
            $logger->info('Nothing to do, remote file not newer than local one');
            continue;
        }
        
        $logger->info('Fetching '.$name.' positions from TTSS...');
        fetch($source['ttss'], __DIR__.'/data/'.$source['ttss_file']);
        
        $logger->info('Loading data...');
        $mapper = new Mapper();
        $mapper->loadTTSS(__DIR__.'/data/'.$source['ttss_file']);
        $mapper->loadGTFS(__DIR__.'/data/'.$source['gtfs_file']);
        
        $logger->info('Finding correct offset...');
        $offset = $mapper->findOffset();
        if($offset) {
            $logger->info('Got offset '.$offset.', creating mapping...');
            $mapping = $mapper->getMapping($offset);
            $json = json_encode($mapping);
            if(!file_put_contents(__DIR__.'/data/'.$source['result'].'.tmp', $json)) {
                throw new Exception('Result save failed');
            }
            rename(__DIR__.'/data/'.$source['result'].'.tmp', __DIR__.'/data/'.$source['result']);
        }
        $logger->info('Finished');
    } catch(Throwable $e) {
        $logger->error($e->getMessage(), ['exception' => $e, 'exception_string' => (string)$e]);
    }
}