aboutsummaryrefslogtreecommitdiff
path: root/src/Costasdev.Busurbano.Sources.TranviasCoruna
diff options
context:
space:
mode:
Diffstat (limited to 'src/Costasdev.Busurbano.Sources.TranviasCoruna')
-rw-r--r--src/Costasdev.Busurbano.Sources.TranviasCoruna/CorunaRealtimeEstimatesProvider.cs50
-rw-r--r--src/Costasdev.Busurbano.Sources.TranviasCoruna/Costasdev.Busurbano.Sources.TranviasCoruna.csproj9
-rw-r--r--src/Costasdev.Busurbano.Sources.TranviasCoruna/Response.cs34
3 files changed, 93 insertions, 0 deletions
diff --git a/src/Costasdev.Busurbano.Sources.TranviasCoruna/CorunaRealtimeEstimatesProvider.cs b/src/Costasdev.Busurbano.Sources.TranviasCoruna/CorunaRealtimeEstimatesProvider.cs
new file mode 100644
index 0000000..4bc7ef1
--- /dev/null
+++ b/src/Costasdev.Busurbano.Sources.TranviasCoruna/CorunaRealtimeEstimatesProvider.cs
@@ -0,0 +1,50 @@
+using System.Net.Http.Json;
+
+namespace Costasdev.Busurbano.Sources.TranviasCoruna;
+
+public class CorunaRealtimeEstimatesProvider
+{
+ private HttpClient _http;
+
+ public CorunaRealtimeEstimatesProvider(HttpClient http)
+ {
+ _http = http;
+ }
+
+ public async Task<List<CorunaEstimate>> GetEstimatesForStop(int stopId)
+ {
+ var url = GetRequestUrl(stopId.ToString());
+
+ var response = await _http.GetAsync(url);
+ var queryitrResponse = await response.Content.ReadFromJsonAsync<QueryitrResponse>();
+
+ if (queryitrResponse is null)
+ {
+ var responseString = await response.Content.ReadAsStringAsync();
+ throw new Exception("Error parsing queryitr_v3 response: " + responseString);
+ }
+
+ return queryitrResponse.ArrivalInfo.Routes.SelectMany(r =>
+ {
+ return r.Arrivals.Select(arrival =>
+ {
+ var minutes = arrival.Minutes == "<1" ? 0 : int.Parse(arrival.Minutes);
+
+ return new CorunaEstimate
+ (
+ r.RouteId.ToString(),
+ minutes,
+ int.Parse(arrival.Metres),
+ arrival.VehicleNumber.ToString()
+ );
+ }).ToList();
+ }).OrderBy(a => a.Minutes).ToList();
+ }
+
+ private string GetRequestUrl(string stopId)
+ {
+ return $"https://itranvias.com/queryitr_v3.php?&func=0&dato={stopId}";
+ }
+}
+
+public record CorunaEstimate(string RouteId, int Minutes, int Metres, string VehicleNumber);
diff --git a/src/Costasdev.Busurbano.Sources.TranviasCoruna/Costasdev.Busurbano.Sources.TranviasCoruna.csproj b/src/Costasdev.Busurbano.Sources.TranviasCoruna/Costasdev.Busurbano.Sources.TranviasCoruna.csproj
new file mode 100644
index 0000000..237d661
--- /dev/null
+++ b/src/Costasdev.Busurbano.Sources.TranviasCoruna/Costasdev.Busurbano.Sources.TranviasCoruna.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net10.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+</Project>
diff --git a/src/Costasdev.Busurbano.Sources.TranviasCoruna/Response.cs b/src/Costasdev.Busurbano.Sources.TranviasCoruna/Response.cs
new file mode 100644
index 0000000..fe2a6cf
--- /dev/null
+++ b/src/Costasdev.Busurbano.Sources.TranviasCoruna/Response.cs
@@ -0,0 +1,34 @@
+using System.Text.Json.Serialization;
+
+namespace Costasdev.Busurbano.Sources.TranviasCoruna;
+
+public class QueryitrResponse
+{
+ [JsonPropertyName("buses")] public ArrivalInfo ArrivalInfo { get; set; }
+}
+
+public class ArrivalInfo
+{
+ [JsonPropertyName("parada")]
+ public int StopId { get; set; }
+ [JsonPropertyName("lineas")]
+ public Route[] Routes { get; set; }
+}
+
+public class Route
+{
+ [JsonPropertyName("linea")]
+ public int RouteId { get; set; }
+ [JsonPropertyName("buses")]
+ public Arrival[] Arrivals { get; set; }
+}
+
+public class Arrival
+{
+ [JsonPropertyName("bus")]
+ public int VehicleNumber { get; set; }
+ [JsonPropertyName("tiempo")]
+ public string Minutes { get; set; }
+ [JsonPropertyName("distancia")]
+ public string Metres { get; set; }
+}