123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- package traffic
- import (
- "apiote.xyz/p/szczanieckiej/transformers"
- "encoding/csv"
- "fmt"
- "io"
- "net/http"
- "os"
- "path/filepath"
- "regexp"
- "strings"
- "time"
- "golang.org/x/text/language"
- "golang.org/x/text/transform"
- "git.sr.ht/~sircmpwn/go-bare"
- )
- type HtmlSelector struct {
- tag string
- id string
- class string
- }
- type ZtmPoznan struct {
- client http.Client
- }
- func (z ZtmPoznan) ConvertVehicles(path string) error {
- url := "https://ztm.poznan.pl/en/dla-deweloperow/getGtfsRtFile/?file=vehicle_dictionary.csv"
- response, err := z.client.Get(url)
- if err != nil {
- return fmt.Errorf("ConvertVehicles: cannot GET ‘%s’: %w", url, err)
- }
- result, err := os.Create(filepath.Join(path, "vehicles.bare"))
- if err != nil {
- return fmt.Errorf("ConvertVehicles: cannot create bare file: %w", err)
- }
- defer result.Close()
- r := csv.NewReader(response.Body)
- r.Comma = ','
- header, err := r.Read()
- if err != nil {
- fmt.Println("Header read error")
- return err
- }
- fields := map[string]int{}
- for i, headerField := range header {
- fields[headerField] = i
- }
- for {
- record, err := r.Read()
- if err == io.EOF {
- break
- }
- if err != nil {
- return err
- }
- var capabilites uint16 = 0
- if record[fields["ramp"]] == "1" {
- capabilites |= 0b0001
- }
- if record[fields["hf_lf_le"]] == "1" {
- capabilites |= 0b0010
- }
- if record[fields["hf_lf_le"]] == "2" {
- capabilites |= 0b0001_0000_0000
- }
- if record[fields["air_conditioner"]] == "1" {
- capabilites |= 0b0100
- }
- if record[fields["place_for_transp_bicycles"]] == "1" {
- capabilites |= 0b1000
- }
- if record[fields["voice_announcement_sys"]] == "1" {
- capabilites |= 0b0001_0000
- }
- if record[fields["ticket_machine"]] == "1" {
- capabilites |= 0b0010_0000
- }
- if record[fields["ticket_sales_by_the_driver"]] == "1" {
- capabilites |= 0b0100_0000
- }
- if record[fields["usb_charger"]] == "1" {
- capabilites |= 0b1000_0000
- }
- vehicle := Vehicle{
- Id: ID(record[0]),
- Capabilities: capabilites,
- }
- bytes, err := bare.Marshal(&vehicle)
- if err != nil {
- return err
- }
- _, err = result.Write(bytes)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (z ZtmPoznan) GetVersions(date time.Time) ([]Version, error) {
- url := "https://ztm.poznan.pl/en/dla-deweloperow/gtfsFiles"
- response, err := z.client.Get(url)
- if err != nil {
- return []Version{}, fmt.Errorf("GetVersions: cannot GET ‘%s’: %w", url, err)
- }
- doc, err := io.ReadAll(response.Body)
- if err != nil {
- return []Version{}, fmt.Errorf("GetVersions: cannot read whole html: %w", err)
- }
- regex, err := regexp.Compile("[0-9]{8}_[0-9]{8}\\.zip")
- versionStrings := regex.FindAllString(string(doc), -1)
- versionsSet := map[string]struct{}{}
- for _, v := range versionStrings {
- versionsSet[v] = struct{}{}
- }
- versions := []Version{}
- for v := range versionsSet {
- validityString := strings.Replace(v, ".zip", "", 1)
- version, err := MakeVersion(validityString, z.GetLocation())
- if err != nil {
- return nil, err
- }
- version.Link = "https://ztm.poznan.pl/en/dla-deweloperow/getGTFSFile/?file=" + v
- versions = append(versions, version)
- }
- return versions, nil
- }
- func (z ZtmPoznan) GetLocation() *time.Location {
- l, _ := time.LoadLocation("Europe/Warsaw")
- return l
- }
- func (z ZtmPoznan) String() string {
- return "poznan_ztm"
- }
- func (z ZtmPoznan) RealtimeFeeds() []string {
- return []string{"https://ztm.poznan.pl/en/dla-deweloperow/getGtfsRtFile/?file=feeds.pb"}
- }
- func (z ZtmPoznan) Transformer() transform.Transformer {
- return transformers.TransformerPL
- }
- func (z ZtmPoznan) Name() string {
- return "ZTM Poznań"
- }
- func (z ZtmPoznan) Attribution() map[language.Tag]string {
- return map[language.Tag]string{
- language.Und: "GTFS files downloaded from https://ztm.poznan.pl/pl/dla-deweloperow/gtfsFiles and converted to TRAFFIC",
- language.English: "GTFS files downloaded from https://ztm.poznan.pl/pl/dla-deweloperow/gtfsFiles and converted to TRAFFIC",
- language.Polish: "Pliki GTFS pobrane z https://ztm.poznan.pl/pl/dla-deweloperow/gtfsFiles i przekonwertowane do formatu TRAFFIC",
- }
- }
- func (z ZtmPoznan) Description() map[language.Tag]string {
- return map[language.Tag]string{
- language.Und: "Timetable for Poznań public transport organised by Zarząd Transportu Miejskiego (ZTM)",
- language.English: "Timetable for Poznań public transport organised by Zarząd Transportu Miejskiego (ZTM)",
- language.BritishEnglish: "Timetable for Poznań public transport organised by Zarząd Transportu Miejskiego (ZTM)",
- language.AmericanEnglish: "Timetable for Poznań public transport organized by Zarząd Transportu Miejskiego (ZTM)",
- language.Polish: "Rozkład jazdy poznańskiego transportu publicznego organizowanego przez Zarząd Transportu Miejskiego (ZTM)",
- }
- }
|