ZTravel/ZTravel.API/DBF/DbfAjaxParser.cs

84 lines
4.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Web;
using System.Xml.Linq;
// ReSharper disable PossibleNullReferenceException
namespace ZTravel.API.DBF {
public class DbfAjaxParser {
public static List<DbfAjaxObject> GetDepartures(string station, string via = "") {
var url = $"https://dbf.finalrewind.org/{HttpUtility.UrlEncode(station)}?via={via}&show_realtime=1&ajax=1";
var result = new List<DbfAjaxObject>();
var raw = new WebClient().DownloadString(url);
var xel = XElement.Parse($"<root>{raw}</root>", LoadOptions.PreserveWhitespace);
foreach (var el in xel.Elements()) {
var connection = new DbfAjaxObject();
if (!string.IsNullOrWhiteSpace(el.Attribute("data-line")?.Value))
connection.Line = el.Attribute("data-line")?.Value.Trim();
if (!string.IsNullOrWhiteSpace(el.Attribute("data-train")?.Value))
connection.TrainName = el.Attribute("data-train")?.Value.Trim();
if (!string.IsNullOrWhiteSpace(el.Attribute("data-from")?.Value))
connection.Origin = el.Attribute("data-from")?.Value.Trim();
if (!string.IsNullOrWhiteSpace(el.Attribute("data-to")?.Value))
connection.Destination = el.Attribute("data-to")?.Value.Trim();
if (!string.IsNullOrWhiteSpace(el.Attribute("data-platform")?.Value))
connection.Platform = el.Attribute("data-platform")?.Value.Trim();
if (!string.IsNullOrWhiteSpace(el.Attribute("data-no")?.Value))
connection.TrainNumber = el.Attribute("data-no")?.Value.Trim();
if (!string.IsNullOrWhiteSpace(el.Attribute("data-linetype")?.Value))
connection.LineType = el.Attribute("data-linetype")?.Value.Trim();
if (!string.IsNullOrWhiteSpace(el.Attribute("data-arrival")?.Value)) {
connection.HasArrivalTime = true;
connection.ArrivalTime = DateTime.ParseExact(el.Attribute("data-arrival")?.Value.Trim(), "HH:mm", CultureInfo.InvariantCulture);
}
if (!string.IsNullOrWhiteSpace(el.Attribute("data-departure")?.Value)) {
connection.HasDepartureTime = true;
connection.DepartureTime = DateTime.ParseExact(el.Attribute("data-departure")?.Value.Trim(), "HH:mm", CultureInfo.InvariantCulture);
}
var route = el.Descendants("span").FirstOrDefault(div => div.Attribute("class").Value.StartsWith("route"))?.Value;
if (!string.IsNullOrWhiteSpace(route))
connection.Route = route.Trim();
var trainClass = el.Descendants("div").FirstOrDefault(div => div.Attribute("class").Value.StartsWith("line"))?.Value;
if (!string.IsNullOrWhiteSpace(trainClass))
connection.TrainClass = trainClass.Trim().Split("\n")[0].Trim();
var trainSubtype = el.Descendants("div")
.FirstOrDefault(div => div.Descendants("span").Any(span => span.Attribute("class").Value.StartsWith("trainsubtype")))
?.Descendants("span")
.FirstOrDefault(span => span.Attribute("class").Value.StartsWith("trainsubtype"))
?.Value;
if (!string.IsNullOrWhiteSpace(trainSubtype))
connection.TrainSubtype = trainSubtype.Trim();
var trainNumber = el.Descendants("div")
.FirstOrDefault(div => div.Descendants("span").Any(span => span.Attribute("class").Value.StartsWith("trainno")))
?.Descendants("span")
.FirstOrDefault(span => span.Attribute("class").Value.StartsWith("trainno"))
?.Value;
if (!string.IsNullOrWhiteSpace(trainNumber))
connection.TrainNumber = trainNumber.Trim();
var platform = el.Descendants("span").FirstOrDefault(div => div.Attribute("class").Value.StartsWith("platform"));
if (platform.Attribute("class")?.Value == "platform changed-platform") {
connection.Platform = platform.Value.Trim();
connection.PlatformChanged = true;
}
var dest = el.Descendants("span").FirstOrDefault(div => div.Attribute("class").Value.StartsWith("dest"));
if (dest.Attribute("class")?.Value == "dest cancelled")
connection.Cancelled = true;
result.Add(connection);
}
return result;
}
}
}