Author: Adam Evyčędo <git@apiote.xyz>
add STIB-MIVB Brussels (static schedule only)
CHANGELOG.adoc | 11 ++- go.mod | 1 go.sum | 1 traffic/brussels_stib_mivb.go | 108 +++++++++++++++++++++++++++++++++++++ traffic/feeds.go | 7 +- transformers/fr.go | 1
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index b88b1c10648d5ecf472df7546e9e75570b2936b6..84a7cef0e6662da9f0553b57d17ee84206045ae0 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -52,7 +52,6 @@ == v0.3 === todo -* brussels (schedule and rt, rt in go) * REUSE, credits, feeds providers * [bug] sort nearby stops * go1.21 refactor (e.g. https://www.sethvargo.com/things-im-excited-for-in-go-1-21/#slies-and-maps-packages) @@ -61,16 +60,18 @@ * [w/czwek] gtfs-rt feed with bimba anouncements in all feeds === in progress -* remove prevNodes from traffic::LineGraph, -* add -1:i to LineGraph.nextNodes (where i is starting node) -* make traffic::Line.headsigns [][]string -* make traffic::Line.graphs []LineGraph +* brussels (schedule and rt, rt in go) === testing * BAF25: single latest feed – get its validity from calendar/calendar_dates; move to /var/lib based on validity === done + +* remove prevNodes from traffic::LineGraph, +* add -1:i to LineGraph.nextNodes (where i is starting node) +* make traffic::Line.headsigns [][]string +* make traffic::Line.graphs []LineGraph == v0.2 diff --git a/go.mod b/go.mod index 3426c98b6aaa810bb84857fd8ab1fccc6d9ebdaf..a99a65fb076ba60a94b001b3b96889f582444eb2 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ github.com/golang/protobuf v1.5.2 github.com/sahilm/fuzzy v0.1.0 github.com/ulikunitz/xz v0.5.10 golang.org/x/text v0.3.6 + golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e google.golang.org/protobuf v1.26.0 notabug.org/apiote/gott v1.1.2 ) diff --git a/go.sum b/go.sum index 4a85ee2f654ba45ff3e8438a4bf86e887b100079..8b15fc35a5b914735ada513311b7d2a03eff529c 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,7 @@ github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e h1:FDhOuMEY4JVRztM/gsbk+IKUQ8kj74bxZrgw87eMMVc= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/traffic/brussels_stib_mivb.go b/traffic/brussels_stib_mivb.go new file mode 100644 index 0000000000000000000000000000000000000000..57ac89ac5446d129a9872f29f0051301d45304d9 --- /dev/null +++ b/traffic/brussels_stib_mivb.go @@ -0,0 +1,108 @@ +package traffic + +import ( + "encoding/xml" + + "apiote.xyz/p/szczanieckiej/transformers" + + "fmt" + "net/http" + "os" + "path/filepath" + "time" + + "golang.org/x/text/language" + "golang.org/x/text/transform" + "golang.org/x/tools/blog/atom" +) + +type StibMivbBrussels struct { + client http.Client +} + +func (z StibMivbBrussels) ConvertVehicles(path string) error { + 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() + return nil +} + +func (z StibMivbBrussels) GetVersions(date time.Time) ([]Version, error) { + url := "https://stibmivb.opendatasoft.com/explore/dataset/gtfs-files-production/atom/" + response, err := z.client.Get(url) + if err != nil { + return []Version{}, fmt.Errorf("GetVersions: cannot GET ‘%s’: %w", url, err) + } + + decoder := xml.NewDecoder(response.Body) + versionsFeed := atom.Feed{} + decoder.Decode(&versionsFeed) + updated, _ := time.Parse(string(versionsFeed.Entry[0].Updated), "2006-01-02T15:04:05-07:00") + validityString := updated.Format("20060102") + "_99991231" + + version, err := MakeVersion(validityString, z.GetLocation()) + if err != nil { + return nil, err + } + version.Link = "https://stibmivb.opendatasoft.com/api/explore/v2.1/catalog/datasets/gtfs-files-production/alternative_exports/gtfszip/" + versions := []Version{version} + return versions, nil +} + +func (z StibMivbBrussels) GetLocation() *time.Location { + l, _ := time.LoadLocation("Europe/Brussels") + return l +} + +func (z StibMivbBrussels) String() string { + return "brussels_stib_mivb" +} + +func (z StibMivbBrussels) RealtimeFeeds() []string { + return []string{} +} + +func (z StibMivbBrussels) Transformer() transform.Transformer { + return transform.Chain(transformers.TransformerFR) // TODO add transformerNL +} + +func (z StibMivbBrussels) Name() string { + return "STIB-MIVB Brussels" +} + +func (z StibMivbBrussels) Attribution() map[language.Tag]string { + return map[language.Tag]string{ + language.Und: "GTFS files downloaded from https://stibmivb.opendatasoft.com and converted to TRAFFIC", + language.English: "GTFS files downloaded from https://stibmivb.opendatasoft.com and converted to TRAFFIC", + language.Polish: "Pliki GTFS pobrane z https://stibmivb.opendatasoft.com i przekonwertowane do formatu TRAFFIC", + } +} + +func (z StibMivbBrussels) Description() map[language.Tag]string { + return map[language.Tag]string{ + language.Und: "Timetable for Brussels public transport organised by STIB-MIVB", + language.English: "Timetable for Brussels public transport organised by STIB-MIVB", + language.BritishEnglish: "Timetable for Brussels public transport organised by STIB-MIVB", + language.AmericanEnglish: "Timetable for Brussels public transport organised by STIB-MIVB", + language.Polish: "Rozkład jazdy brukselskiego transportu publicznego organizowanego przez STIB-MIVB", + } +} + +func (z StibMivbBrussels) Flags() FeedFlags { + return FeedFlags{ + Headsign: HeadsignTripHeadsing, + StopIdFormat: "{{stop_id}}", + StopName: "{{stop_name}} [{{stop_id}}]", + LineName: "{{route_short_name}}", + } +} + +func (z StibMivbBrussels) FeedPrepareZip(path string) error { + return nil +} + +func (z StibMivbBrussels) QRInfo() (string, QRLocation, string) { + return "", QRLocationNone, "" +} diff --git a/traffic/feeds.go b/traffic/feeds.go index 2a7381f6e91aa3557cb1156d8828262b3de9f34d..1d47fe2f6aabbf6c3f542427f091ea1a6a38e3fe 100644 --- a/traffic/feeds.go +++ b/traffic/feeds.go @@ -54,9 +54,10 @@ client: http.Client{ Timeout: 30 * time.Second, }, }, - "krakow_ztp": ZtpKrakow{}, - "gzm_ztm": GzmZtm{}, - "berlin_vbb": VbbBerlin{}, + "krakow_ztp": ZtpKrakow{}, + "gzm_ztm": GzmZtm{}, + "berlin_vbb": VbbBerlin{}, + "brussels_stib_mivb": StibMivbBrussels{}, } } diff --git a/transformers/fr.go b/transformers/fr.go index abfad31a9abd6c132b9d6dbbfb421c16732d2b05..47277dccde0e5497dc0818cf2a37f99712cfc188 100644 --- a/transformers/fr.go +++ b/transformers/fr.go @@ -15,6 +15,7 @@ case 'é': return []rune{'e'} case 'É': return []rune{'E'} + // TODO add runes from STIB-MIVB default: return []rune{r} }