Bimba.git

commit 330044728810ccf09ea305ee77e57f7391117f8b

Author: Adam Pioterek <adam.pioterek@protonmail.ch>

removed scrapper

 .idea/misc.xml | 2 
 app/src/main/java/ml/adamsprogs/bimba/activities/NoDbActivity.kt | 1 
 database/bundle.pem | 83 
 database/cron | 48 
 database/db.schema | 30 
 database/scraper.py | 305 --


diff --git a/.idea/misc.xml b/.idea/misc.xml
index 635999df1e86791ad3787e455b4524e4d8879b93..ba7052b8197ddf8ba8756022d905d03055c7ad60 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -24,7 +24,7 @@         
       </value>
     </option>
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   <component name="ProjectType">




diff --git a/app/src/main/java/ml/adamsprogs/bimba/activities/NoDbActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/activities/NoDbActivity.kt
index 1108febb0d070c2a7bf6af3a11e75250c77f17ee..c266917efff4a9403be80eb110224bda659ae1f4 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/activities/NoDbActivity.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/activities/NoDbActivity.kt
@@ -9,7 +9,6 @@ import kotlinx.android.synthetic.main.activity_nodb.*
 import ml.adamsprogs.bimba.datasources.TimetableDownloader
 import ml.adamsprogs.bimba.models.Timetable
 
-//todo onResume check again // check
 class NoDbActivity : AppCompatActivity(), NetworkStateReceiver.OnConnectivityChangeListener, MessageReceiver.OnTimetableDownloadListener {
     private val networkStateReceiver = NetworkStateReceiver()
     private val timetableDownloadReceiver = MessageReceiver.getMessageReceiver()




diff --git a/database/bundle.pem b/database/bundle.pem
deleted file mode 100644
index 12585890132ce18cf3ebf0ac2819017cba1e3123..0000000000000000000000000000000000000000
--- a/database/bundle.pem
+++ /dev/null
@@ -1,83 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
-YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
-R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
-9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
-fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
-iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
-1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
-bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
-MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
-ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
-uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
-Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
-tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
-PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
-hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
-5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIETTCCAzWgAwIBAgIDAjpxMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
-YWwgQ0EwHhcNMTMxMjExMjM0NTUxWhcNMjIwNTIwMjM0NTUxWjBCMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSUmFwaWRTU0wg
-U0hBMjU2IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1jBEgEu
-l9h9GKrIwuWF4hdsYC7JjTEFORoGmFbdVNcRjFlbPbFUrkshhTIWX1SG5tmx2GCJ
-a1i+ctqgAEJ2sSdZTM3jutRc2aZ/uyt11UZEvexAXFm33Vmf8Wr3BvzWLxmKlRK6
-msrVMNI4/Bk7WxU7NtBDTdFlodSLwWBBs9ZwF8w5wJwMoD23ESJOztmpetIqYpyg
-C04q18NhWoXdXBC5VD0tA/hJ8LySt7ecMcfpuKqCCwW5Mc0IW7siC/acjopVHHZD
-dvDibvDfqCl158ikh4tq8bsIyTYYZe5QQ7hdctUoOeFTPiUs2itP3YqeUFDgb5rE
-1RkmiQF1cwmbOwIDAQABo4IBSjCCAUYwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwR
-fap9ZbjKzE4wHQYDVR0OBBYEFJfCJ1CewsnsDIgyyHyt4qYBT9pvMBIGA1UdEwEB
-/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDYGA1UdHwQvMC0wK6ApoCeGJWh0
-dHA6Ly9nMS5zeW1jYi5jb20vY3Jscy9ndGdsb2JhbC5jcmwwLwYIKwYBBQUHAQEE
-IzAhMB8GCCsGAQUFBzABhhNodHRwOi8vZzIuc3ltY2IuY29tMEwGA1UdIARFMEMw
-QQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3RydXN0
-LmNvbS9yZXNvdXJjZXMvY3BzMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTeW1h
-bnRlY1BLSS0xLTU2OTANBgkqhkiG9w0BAQsFAAOCAQEANevhiyBWlLp6vXmp9uP+
-bji0MsGj21hWID59xzqxZ2nVeRQb9vrsYPJ5zQoMYIp0TKOTKqDwUX/N6fmS/Zar
-RfViPT9gRlATPSATGC6URq7VIf5Dockj/lPEvxrYrDrK3maXI67T30pNcx9vMaJR
-BBZqAOv5jUOB8FChH6bKOvMoPF9RrNcKRXdLDlJiG9g4UaCSLT+Qbsh+QJ8gRhVd
-4FB84XavXu0R0y8TubglpK9YCa81tGJUheNI3rzSkHp6pIQNo0LyUcDUrVNlXWz4
-Px8G8k/Ll6BKWcZ40egDuYVtLLrhX7atKz4lecWLVtXjCYDqwSfC2Q7sRwrp0Mr8
-2A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-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
-MKlNUKhgoBO4
------END CERTIFICATE-----




diff --git a/database/cron b/database/cron
deleted file mode 100644
index 36b7f43366ebdccab4f9f4e6d8221507fca495de..0000000000000000000000000000000000000000
--- a/database/cron
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/bash
-
-d=$(date -Iminutes)
-
-cd /home/qeebmisk
-
-set +e
-/usr/bin/python3.6 scraper.py >new_meta 2> "scraper_$d.log"
-result=$?
-if [ $result -eq 0 ]
-then
-    /usr/bin/sqlite3 timetable.db 'pragma integrity_check;'
-    if [ $? -eq 0 ]
-    then
-        trap except ERR
-
-        echo 'making metadata' >> "scraper_$d.log"
-        mv new_meta timetable.db.meta
-        sha512sum timetable.db | cut -d ' ' -f 1 >>timetable.db.meta
-        ls -l timetable.db | cut -d ' ' -f 5 >>timetable.db.meta
-        echo '1.1.0' >>timetable.db.meta
-        echo 'timetable.db.xz' >>timetable.db.meta
-        
-        xz -z -k timetable.db
-
-        echo 'moving' >> "scraper_$d.log"
-        mv timetable.db.xz public_html/w/data/media/programmes/bimba/timetable.db.xz
-        mv timetable.db.meta public_html/w/data/media/programmes/bimba/timetable.db.meta
-
-        echo 'success' >> "scraper_$d.log"
-    else
-        echo 'db integrity check failed' >> "scraper_$d.log"
-        rm timetable.db
-        rm new_meta
-    fi
-elif [ $result -eq 48 ]
-then
-    echo 'db is still valid' >> "scraper_$d.log"
-    rm new_meta
-else
-    echo 'scraper failed' >> "scraper_$d.log"
-    rm timetable.db
-    rm new_meta
-fi
-
-function except {
-    (rm /home/qeebmisk/timetable.db; rm /home/qeebmisk/new_meta) || :
-}




diff --git a/database/db.schema b/database/db.schema
deleted file mode 100644
index 2f7de0bddd67bb1dfb80e9e8504c1b1dcf385eb6..0000000000000000000000000000000000000000
--- a/database/db.schema
+++ /dev/null
@@ -1,30 +0,0 @@
-metadata
---------
-#key
-value
-
-nodes             stops
--------           ---------
-#symbol <____     #id <_________
-name         |___ symbol        |
-                  number        |
-                  lat           |
-                  lon           |
-                  headsigns     |
-                                |
-lines             timetables    |
-------            ----------    |
-#id <______       #id <________/|\__
-number     |      stop_id ______|   |
-           |_____ line_id           |
-                  headsign          |
-                                    |
-                  departures        |
-                  ----------        |
-                  #id               |
-                  timetable_id _____|
-                  hour
-                  minute
-                  mode
-                  lowFloor
-                  modification




diff --git a/database/scraper.py b/database/scraper.py
deleted file mode 100755
index c94b49f40429e6b8759cb084b10a90696fdfbef4..0000000000000000000000000000000000000000
--- a/database/scraper.py
+++ /dev/null
@@ -1,305 +0,0 @@
-#!/bin/python
-"""
-js interface: http://www.ztm.poznan.pl/themes/ztm/dist/js/app.js
-nodes: http://www.ztm.poznan.pl/goeuropa-api/all-nodes
-stops in node: http://www.ztm.poznan.pl/goeuropa-api/node_stops/{node:symbol}
-stops: http://www.ztm.poznan.pl/goeuropa-api/stops-nodes
-bike stations: http://www.ztm.poznan.pl/goeuropa-api/bike-stations
-
-alerts: goeuropa-api/alerts/' + lineId;
-
-"""
-import json
-import os
-import re
-import sqlite3
-import sys
-import requests
-from bs4 import BeautifulSoup
-
-class TimetableDownloader:
-    """
-    downloader class
-    """
-    def __init__(self, verbose):
-        self.session = requests.session()
-        self.verbose = verbose
-
-
-    def __get_validity(self):
-        """
-        get timetable validity
-        """
-        index = self.__get('https://www.ztm.poznan.pl/goeuropa-api/index')
-        option = re.search('<option value="[0-9]{8}" selected', index.text).group()
-        return option.split('"')[1]
-
-
-    def __get_nodes(self):
-        """
-        get nodes
-        """
-        index = self.__get('https://www.ztm.poznan.pl/goeuropa-api/all-nodes')
-        return [(stop['symbol'], stop['name']) for stop in json.loads(index.text)]
-
-
-    def __get_stops(self, node):
-        """
-        get stops
-        """
-        index = self.__get('https://www.ztm.poznan.pl/goeuropa-api/node_stops/{}'.format(node))
-        stops = []
-        for stop in json.loads(index.text):
-            name = stop['stop']['name']
-            stop_id = stop['stop']['id']
-            number = re.findall("\\d+", stop['stop']['symbol'])[0]
-            lat = stop['stop']['lat']
-            lon = stop['stop']['lon']
-            # todo test
-            directions = ', '.join(['{} → {}'.format(transfer['name'], transfer['headsign'])
-                                    for transfer in stop['transfers']
-                                    if transfer['headsign'] != name])
-            if directions == '':
-                continue
-            stops.append((stop_id, node, number, lat, lon, directions))
-        return stops
-
-
-    def __get_lines(self):
-        """
-        get lines
-        """
-        index = self.__get('https://www.ztm.poznan.pl/goeuropa-api/index')
-        soup = BeautifulSoup(index.text, 'html.parser')
-
-        lines = {line['data-lineid']: line.text for line in
-                 soup.findAll(attrs={'class': re.compile(r'.*\blineNo-bt\b.*')})}
-
-        return lines
-
-
-    def __get_route(self, line_id):
-        """
-        get routes
-        """
-        index = self.__get('https://www.ztm.poznan.pl/goeuropa-api/line-info/{}'.format(line_id))
-        soup = BeautifulSoup(index.text, 'html.parser')
-        directions = soup.findAll(attrs={'class': re.compile(r'.*\baccordion-item\b.*')})
-        routes = {}
-        for direction in directions:
-            direction_id = direction['data-directionid']
-
-            route = [{'id': stop.find('a')['data-stopid'], 'name': stop['data-name'],
-                      'onDemand': re.search('stop-onDemand', str(stop['class'])) != None,
-                      'variant_type': re.search('variant-type-(in|out)', str(stop['class'])).groups()[0]\
-                              if re.search('variant-type-(in|out)', str(stop['class'])) is not None else None,
-                      'variant_first': re.search('first-variant', str(stop['class'])) is not None,
-                      'variant_last': re.search('last-variant', str(stop['class'])) is not None}
-                     for stop in direction.findAll(attrs={'class': re.compile(r'.*\bstop-itm\b.*')})]
-            routes[direction_id] = route
-        return routes
-
-
-    def __get_stop_times(self, stop_id, line_id, direction_id):
-        index = self.__post('https://www.ztm.poznan.pl/goeuropa-api/stop-info/{}/{}'.
-                                  format(stop_id, line_id), {'directionId': direction_id})
-        soup = BeautifulSoup(index.text, 'html.parser')
-        legends = {}
-        for row in soup.find(attrs={'class': re.compile(r'.*\blegend-box\b.*')}).findAll('li'):
-            row = row.text.split('-')
-            row[0] = row[0].rstrip()
-            row[1] = row[1].lstrip()
-            if row[0] != '_':
-                legends[row[0]] = '-'.join(row[1:])
-        schedules = {}
-        for mode in soup.findAll(attrs={'class': re.compile(r'.*\bmode-tab\b.*')}):
-            mode_name = mode['data-mode']
-            schedule = {row.find('th').text: [
-                {'time': minute.text, 'lowFloor': re.search('n-line', str(minute['class'])) != None}
-                for minute in row.findAll('a')]
-                        for row in mode.find(attrs={'class': re.compile(r'.*\bscheduler-hours\b.*')}).
-                        findAll('tr')}
-            schedule_2 = {hour: times for hour, times in schedule.items() if times != []}
-            schedule = []
-            for hour, deps in schedule_2.items():
-                for dep in deps:
-                    schedule.append((hour, *self.__describe(dep['time'], legends), dep['lowFloor']))
-            schedules[mode_name] = schedule
-
-        return schedules
-
-
-    @staticmethod
-    def __describe(dep_time, legend):
-        """
-        describe departure
-        """
-        desc = []
-        while re.match('^\\d+$', dep_time) is None:
-            try:
-                if dep_time[-1] != ',':
-                    desc.append(legend[dep_time[-1]])
-            except KeyError:
-                pass
-            dep_time = dep_time[:-1]
-        return (int(dep_time), '; '.join(desc))
-
-
-    def __get(self, url):
-        try:
-            return self.session.get(url, verify='bundle.pem')
-        except:
-            self.session = requests.session()
-            return self.session.get(url, verify='bundle.pem')
-
-
-    def __post(self, url, data):
-        try:
-            return self.session.post(url, data=data, verify='bundle.pem')
-        except:
-            self.session = requests.session()
-            return self.session.post(url, data=data, verify='bundle.pem')
-
-
-    # todo take into account parent (and for variant stops it needs synced departure times)
-    @staticmethod
-    def __calculate_time_to_next_stop(times, last_time_of_arrival):
-        times.sort()
-        earliest_departure = times[0]
-        if last_time_of_arrival == "":
-            return None, earliest_departure
-
-        hour = int(earliest_departure[:2])
-        minute = int(earliest_departure[3:])
-        minute = minute + (60 * hour)
-
-        last_hour = int(last_time_of_arrival[:2])
-        last_minute = int(last_time_of_arrival[3:])
-        last_minute = last_minute + (60 * last_hour)
-
-        time_to_next_stop = minute - last_minute
-        return time_to_next_stop, earliest_departure
-
-    def download(self):
-        """
-        main function
-        """
-        if os.path.exists('timetable.db'):
-            connection = sqlite3.connect('timetable.db')
-            cursor = connection.cursor()
-            cursor.execute("select value from metadata where key = 'validFrom'")
-            current_valid_from = cursor.fetchone()[0]
-            cursor.close()
-            connection.close()
-            if self.__get_validity() <= current_valid_from:
-                return 304
-            else:
-                os.remove('timetable.db')
-
-        with sqlite3.connect('timetable.db') as connection:
-            try:
-                cursor = connection.cursor()
-                cursor.execute('create table metadata(key TEXT PRIMARY KEY, value TEXT)')
-                cursor.execute('create table nodes(symbol TEXT PRIMARY KEY, name TEXT)')
-                cursor.execute('create table stops(id TEXT PRIMARY KEY, symbol TEXT \
-                                references node(symbol), number TEXT, lat REAL, lon REAL, \
-                                headsigns TEXT)')
-                cursor.execute('create table lines(id TEXT PRIMARY KEY, number TEXT)')
-                cursor.execute('create table timetables(id TEXT PRIMARY KEY, stop_id TEXT \
-                                references stop(id), line_id TEXT references line(id), \
-                                headsign TEXT, parent TEXT references id, \
-                                parent_variant TEXT references id)')
-                cursor.execute('create table departures(id INTEGER PRIMARY KEY, \
-                                timetable_id TEXT references timetable(id), \
-                                hour INTEGER, minute INTEGER, mode TEXT, \
-                                lowFloor INTEGER, modification TEXT)')
-
-                validity = self.__get_validity()
-                print(validity)
-                sys.stdout.flush()
-                cursor.execute("insert into metadata values('validFrom', ?)", (validity,))
-                nodes = self.__get_nodes()
-                cursor.executemany('insert into nodes values(?, ?)', nodes)
-                node_i = 1
-                for symbol, _ in nodes:
-                    if self.verbose:
-                        print('node {}'.format(node_i))
-                    stops = self.__get_stops(symbol)
-                    cursor.executemany('insert into stops values(?, ?, ?, ?, ?, ?)', stops)
-                    node_i += 1
-                lines = self.__get_lines()
-                cursor.executemany('insert into lines values(?, ?)', lines.items())
-
-                timetable_id = 1
-                line_i = 1
-                for line_id, _ in lines.items():
-                    route = self.__get_route(line_id)
-                    route_i = 1
-                    for direction, stops in route.items():
-                        stop_i = 1
-                        parent_stop = None
-                        parent_stop_variant = None
-                        for stop in stops[:-1]:
-                            if self.verbose:
-                                print("stop {} in route {} in line {}".format(stop_i, route_i, line_i))
-                            timetables = self.__get_stop_times(stop['id'], line_id, direction)
-                            
-                            if stop_i == 1 and stop['variant_type'] is None:
-                                if self.verbose:
-                                    print('stop1 & main')
-                                parent = None
-                                parent_variant = None
-                                parent_stop = stop['id']
-                            elif stop['variant_type'] == 'in' and stop['variant_first']:
-                                if self.verbose:
-                                    print('in & first')
-                                parent = None
-                                parent_variant = None
-                                parent_stop_variant = stop['id']
-                            elif stop_i > 1 and stop['variant_type'] is None:
-                                if self.verbose:
-                                    print('stop>1 & main')
-                                parent = parent_stop
-                                parent_variant = parent_stop_variant
-                                parent_stop = stop['id']
-                                parent_stop_variant = None
-                            elif stop['variant_type'] is not None and not stop['variant_first']:
-                                if self.verbose:
-                                    print('variant & not first')
-                                parent = None
-                                parent_variant = parent_stop_variant
-                                parent_stop_variant = stop['id']
-                            elif stop['variant_type'] == 'out' and stop['variant_first']:
-                                if self.verbose:
-                                    print('out & first')
-                                parent = None
-                                parent_variant = parent_stop
-                                parent_stop_variant = stop['id']
-                            if stop['variant_type'] == 'out' and stop['variant_last']:
-                                parent_stop_variant = None
-
-                            cursor.execute('insert into timetables values(?, ?, ?, ?, ?, ?)',
-                                           (timetable_id, stop['id'], line_id, stops[-1]['name'], parent, parent_variant))
-                            for mode, times in timetables.items():
-                                cursor.executemany('insert into departures values(null, ?, ?, ?, ?, ?, \
-                                                    ?)', [(timetable_id, hour, minute, mode, lowfloor, desc)
-                                                          for hour, minute, desc, lowfloor in times])
-                            stop_i += 1
-                            timetable_id += 1
-
-                        route_i += 1
-                    line_i += 1
-            except KeyboardInterrupt:
-                return 404
-        return 0
-
-
-if __name__ == '__main__':
-    verbose = False
-    try:
-        if sys.argv[1] == '-v':
-            verbose = True
-    except IndexError:
-        pass
-    downloader = TimetableDownloader(verbose)
-    exit(downloader.download())