private static async Task FetchCanyons(CanyonInfoConfig config) { if (File.Exists(config.JsonPath)) { return; } Directory.CreateDirectory(config.RootDirectory); await CanyonFetcher.FetchCanyons(config.DescentecanyonJson, config.CsvPath); var canyonCsvs = CanyonCsvLoader.ReadCanyons(config.CsvPath); var canyonInfos = CanyonInfoFetcher.FetchCanyonInfo(canyonCsvs, config); CanyoninInfoJsonLoader.Save(canyonInfos, config.JsonPath); var canyonInfosLight = canyonInfos.Select(x => new CanyonInfoLight(x)).ToList(); CanyoninInfoJsonLoader.Save(canyonInfosLight, config.JsonPathLight); }
public static List <CanyonInfo> FetchCanyonInfo(List <CanyonCsvLoader.CanyonCsvInfo> canyons, CanyonInfoConfig config) { var canyonInfos = canyons .Select(canyon => new CanyonInfo { Id = canyon.Id, Name = canyon.Name, CoordX = canyon.CoordX, CoordY = canyon.CoordY, Distance = GetDistance(canyon.CoordX, canyon.CoordY, config.CenterX, config.CenterY) }) //.OrderBy(x => x.Distance) .Take(config.Amount) .ToList(); Parallel.ForEach(canyonInfos, canyon => { canyon.Points = CanyonPointsFetcher.FetchCanyonPoints(canyon, config.DescentecanyonMapTemplate, config.PointPathTemplate).Result.Select(x => new CanyonInfo.CanyonPointInfo { Type = x.Type, CoordX = x.CoordX, CoordY = x.CoordY }).ToList(); //canyon.RouteInfo = CanyonRouteFetcher.FetchCanyonRoute(canyon, config, config.GoogleMapsDistanceApiTemplate, config.RoutePathTemplate).Result; canyon.Description = CanyonDescriptionFetcher.FetchCanyonDescription(canyon, config.DescentecanyonDescriptionTemplate, config.ResumePathTemplate).Result; canyon.Books = CanyonBooksFetcher.FetchCanyonBooks(canyon, config, config.DescentecanyonBibliographieTemplate, config.BooksPathTemplate).Result; }); return(canyonInfos); }
public static async Task <CanyonBooksInfo> FetchCanyonBooks(CanyonInfo canyon, CanyonInfoConfig config, string urlFormat, string csvLocationFormat) { var csvPath = string.Format(csvLocationFormat, canyon.Id); if (File.Exists(csvPath)) { return(JsonConvert.DeserializeObject <CanyonBooksInfo>(await File.ReadAllTextAsync(csvPath))); } var url = string.Format(urlFormat, canyon.Id); var content = await HttpFetcher.FetchContent(url); var data = Regex.Match(content, "Livres? \\/ Topoguides?<\\/h2><\\/div>([\\S\\s]*)<div class=\"list-group-item\"><h2><span class=\"ic glyphicon-random\"><\\/span> Carte<\\/h2>").Groups[1].Value; var matches = Regex.Matches(data, "<a href=\"([/A-z0-9.-]*)\"><h5>"); var bookUrls = new List <string>(); foreach (Match match in matches) { bookUrls.Add(match.Groups[1].Value); } var books = new CanyonBooksInfo { Url = url, BookUrls = bookUrls, ABookIsOwned = config.OwnedBooks.Any(x => bookUrls.Contains(x)) }; await File.WriteAllTextAsync(csvPath, JsonConvert.SerializeObject(books)); return(books); }
public static async Task <CanyonRouteInfo> FetchCanyonRoute(CanyonInfo canyon, CanyonInfoConfig config, string urlFormat, string csvLocationFormat) { var csvPath = string.Format(csvLocationFormat, canyon.Id); if (File.Exists(csvPath)) { return(JsonConvert.DeserializeObject <CanyonRouteInfo>(await File.ReadAllTextAsync(csvPath))); } var url = string.Format(urlFormat, config.CenterX, config.CenterY, canyon.CoordX, canyon.CoordY); var content = await HttpFetcher.FetchContent(url); var matrix = JsonConvert.DeserializeObject <RouteMatrix>(content); var routeInfo = new CanyonRouteInfo { Url = url, Distance = matrix.Rows[0].Elements[0].Distance?.Value ?? 0, Duration = TimeSpan.FromSeconds(matrix.Rows[0].Elements[0].Duration?.Value ?? 0) }; await File.WriteAllTextAsync(csvPath, JsonConvert.SerializeObject(routeInfo)); return(routeInfo); }
public static async Task <List <CanyonInfo> > Load(CanyonInfoConfig config) { await FetchCanyons(config); return(CanyoninInfoJsonLoader.Load(config.JsonPath)); }