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);
        }
Example #2
0
        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);
        }
Example #3
0
        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));
        }