/// <summary> /// Crate PlayerInfo. should only be call/created from Nhl API /// </summary> /// <param name="playerInfoEntity"></param> /// <returns></returns> public bool Create(PlayerInfoEntity playerInfoEntity) { bool created; try { using (var scope = new TransactionScope()) { playerInfoEntity.C_Code = Guid.NewGuid().ToString(); Mapper.CreateMap <PlayerInfoEntity, PlayerInfo>(); var playerInfo = Mapper.Map <PlayerInfoEntity, PlayerInfo>(playerInfoEntity); _unitOfWork.PlayerInfoRepository.Insert(playerInfo); _unitOfWork.Save(); scope.Complete(); created = true; } } catch (TransactionAbortedException ex) { created = false; LogError.Write(ex, $"TransactionAbortedException in PlayerInfoServices.Create(PlayerInfoEntity playerInfoEntity) for id: {playerInfoEntity.C_Name} and code: {playerInfoEntity.C_Code}"); } catch (ApplicationException ex) { created = false; LogError.Write(ex, $"ApplicationException in PlayerInfoServices.Create(PlayerInfoEntity playerInfoEntity) for id: {playerInfoEntity.C_Name} and code: {playerInfoEntity.C_Code}"); } catch (Exception ex) { created = false; LogError.Write(ex, $"Exception in PlayerInfoServices.Create(PlayerInfoEntity playerInfoEntity) for id: {playerInfoEntity.C_Name} and code: {playerInfoEntity.C_Code}"); } return(created); }
private static List <PlayerInfoEntity> GetNhlApiTeamPlayersInfo(string team) { var url = NhlApi.UrlPrefixSeason + team + NhlApi.UrlSuffix; var rawJsonData = JsonUtility.GetSerializedJsonData(url); if (string.IsNullOrEmpty(rawJsonData)) { LogError.Write(new Exception("Dummy exception"), "NO raw data returned from JsonUtility.GetSerializedJsonData(url)"); return(null); } var nhlApiTeamPlayerInfo = JsonUtility.DeserializedJsonData <NhlTeamPlayerInfoApi>(rawJsonData); if (!nhlApiTeamPlayerInfo.skaterData.Any()) { //LogError.Write(new Exception("No Data for this team"), "Fail to deserialize - DeserializedJsonData<T>(string jsonData) where T : new()"); return(new List <PlayerInfoEntity>()); // retrun empty 0 count } var playerInfoEntities = new List <PlayerInfoEntity>(); try { foreach (Skaterdata skaterdata in nhlApiTeamPlayerInfo.skaterData) { var id = skaterdata.id; var tokens = skaterdata.data.Split(','); // API changes - removed name, pos, and jersey #: length 12. Regualr 15 if (tokens.Length == 12) { var game12 = int.Parse(tokens[0]); var goal12 = int.Parse(tokens[1]); var assist12 = int.Parse(tokens[2]); var point12 = int.Parse(tokens[3]); var toi12 = tokens[7].Trim(); var ppG12 = int.Parse(tokens[8]); var shG12 = int.Parse(tokens[9]); var gwG12 = int.Parse(tokens[10]); var otG12 = int.Parse(tokens[11]); var playerInfo12 = new PlayerInfoEntity(id, team, game12, goal12, assist12, point12, toi12, ppG12, shG12, gwG12, otG12); playerInfoEntities.Add(playerInfo12); continue; } // Regular 15 length api data var pos = tokens[1].Trim(); var name = (tokens[2]).Trim(); var game = int.Parse(tokens[3]); var goal = int.Parse(tokens[4]); var assist = int.Parse(tokens[5]); var point = int.Parse(tokens[6]); var toi = tokens[10].Trim(); var ppG = int.Parse(tokens[11]); var shG = int.Parse(tokens[12]); var gwG = int.Parse(tokens[13]); var otG = int.Parse(tokens[14]); var playerInfo = new PlayerInfoEntity(id, team, pos, name, game, goal, assist, point, toi, ppG, shG, gwG, otG); playerInfoEntities.Add(playerInfo); } } catch (Exception ex) { LogError.Write(ex, $"Fail while parsing deserrialize NHl aPi Data for team: {team}"); return(null); } return(playerInfoEntities); }
public static List <PlayerInfoEntity> GetTeamPlayerData(int teamNo) { if (teamNo < 1) { LogError.Write(new Exception("NhlWebScrapingApiTransactions.GetTeamPlayerData Team # is less than 1"), $"NhlWebScrapingApiTransactions.GetTeamPlayerData Team # is {teamNo}"); } // setup the browser var browser = new ScrapingBrowser { AllowAutoRedirect = true, AllowMetaRedirect = true }; // Browser has many settings you can access in setup //Get the webste - get data by team var pageResult = browser.NavigateToPage( new Uri("http://sportsstats.cbc.ca/hockey/nhl-teams.aspx?page=/data/nhl/teams/stats/stats" + teamNo + ".html")); // get data table var tableTeamPlayerStats = pageResult.Html.CssSelect(".sdi-data-wide").FirstOrDefault(); var playerInfoEntities = new List <PlayerInfoEntity>(); if (tableTeamPlayerStats != null) { var tRows = tableTeamPlayerStats.SelectNodes("tr").Skip(1); // skip first table header foreach (var tRow in tRows) { try { var tData = tRow.ChildNodes.Where(x => x.Name.ToString() == "td").ToList(); var playerInfoEntity = new PlayerInfoEntity(); var name = tData.ElementAt(0).InnerText; name = AdaptNameToApi(CleanString(name)); var pos = AdaptPositionToApi(CleanString(tData.ElementAt(1).InnerHtml)); var team = ""; Constants.Teams.SeasonWebScrappingDict.TryGetValue(teamNo, out team); var game = CleanString(tData.ElementAt(2).InnerHtml); var goal = CleanString(tData.ElementAt(3).InnerHtml); var ass = CleanString(tData.ElementAt(4).InnerHtml); var pts = CleanString(tData.ElementAt(5).InnerHtml); var ppg = CleanString(tData.ElementAt(8).InnerHtml); var shg = CleanString(tData.ElementAt(9).InnerHtml); var toi = CleanString(tData.ElementAt(11).InnerHtml); // TODO: Make constructor playerInfoEntity.C_Name = name; playerInfoEntity.C_Pos = pos; playerInfoEntity.C_Team = team; playerInfoEntity.I_Game = Int32.Parse(game); playerInfoEntity.I_Goal = Int32.Parse(goal); playerInfoEntity.I_Assist = Int32.Parse(ass); playerInfoEntity.I_Point = Int32.Parse(pts); playerInfoEntity.I_PpP = Int32.Parse(ppg); playerInfoEntity.I_ShP = Int32.Parse(shg); playerInfoEntity.C_Toi = toi; playerInfoEntities.Add(playerInfoEntity); } catch (Exception e) { LogError.Write(e, "Exception in NhlWebScrapingApiTransactions.GetTeamPlayerData() at tRow: " + tRow?.InnerHtml); } } } else { LogError.Write(new Exception("Error"), $"No data for team {teamNo}"); } return(playerInfoEntities); }
/// <summary> /// get "cumulative_player_stats.json" from MySportsFeeds NHL API and return it parse into entity list /// </summary> /// <returns></returns> public List <PlayerInfoEntity> GetData() { var playerInfoEntities = new List <PlayerInfoEntity>(); MySportsFeeds apiResults = null; var request = new HttpClient(); request.BaseAddress = new Uri("https://www.mysportsfeeds.com/api/feed/pull/nhl/2016-2017-regular/"); request.DefaultRequestHeaders.Accept.Clear(); request.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "bmlja2dvb2Ryb3c6R29kcm81NQ==" //Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($"{user}:{password}")) ); request.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); try { using ( var response = request.GetAsync("cumulative_player_stats.json?").ContinueWith((taskWithResponse) => { if (taskWithResponse != null) { if (taskWithResponse.Status != TaskStatus.RanToCompletion) { throw new Exception( $"Server error (HTTP {taskWithResponse.Result?.StatusCode}: {taskWithResponse.Exception?.InnerException} : {taskWithResponse.Exception?.Message})."); } if (taskWithResponse.Result.IsSuccessStatusCode) { var jsonString = taskWithResponse.Result.Content.ReadAsStringAsync(); jsonString.Wait(); var data = JsonConvert.DeserializeObject <MySportsFeeds>(jsonString.Result); apiResults = data; } else { var e = new Exception($"{taskWithResponse.Result.StatusCode} : {taskWithResponse.Result.ReasonPhrase}"); LogError.Write(e, "issue while retriving data from MySportsFeed -> GetData()"); throw e; } } })) { response.Wait(); var resultCompleted = apiResults; var listTeam = resultCompleted.cumulativeplayerstats.playerstatsentry; if (listTeam.Length <= 0) { throw new ApiException("No data return from API"); } var id = 0; try { foreach (var playerstatsentry in listTeam) { id = Int32.Parse(playerstatsentry.player.ID); var team = playerstatsentry.team.Abbreviation; var pos = playerstatsentry.player.Position[0].ToString(); // only 1st char of string, e.g. LW => L var name = playerstatsentry.player.FirstName + " " + playerstatsentry.player.LastName; var game = Int32.Parse(playerstatsentry.stats.GamesPlayed.text); var goal = Int32.Parse(playerstatsentry.stats.stats.Goals.text); var assist = Int32.Parse(playerstatsentry.stats.stats.Assists.text); var pts = Int32.Parse(playerstatsentry.stats.stats.Points.text); var ppp = Int32.Parse(playerstatsentry.stats.stats.PowerplayPoints.text); var shp = Int32.Parse(playerstatsentry.stats.stats.ShorthandedPoints.text); var gwg = Int32.Parse(playerstatsentry.stats.stats.GameWinningGoals.text); var isRookie = Boolean.Parse(playerstatsentry.player.IsRookie); var playerInfo = new PlayerInfoEntity(id, team, pos, name, game, goal, assist, pts, ppp, shp, gwg, isRookie); playerInfoEntities.Add(playerInfo); } return(playerInfoEntities.OrderBy(x => x.C_Team).ToList()); } catch (Exception e) { LogError.Write(e, $"Issue at this player id (if id is 0 means it happened on the 1st item.): ID : {id}"); } } } catch (Exception ex) { LogError.Write(ex, "issue while retriving data from MySportsFeed -> GetData()"); } return(playerInfoEntities); }
public bool Exist(PlayerInfoEntity playerInfoEntity) { var playerExist = _unitOfWork.PlayerInfoRepository.Get(x => x.C_Name == playerInfoEntity.C_Name && x.C_Team == playerInfoEntity.C_Team && x.C_Pos == playerInfoEntity.C_Pos); return(playerExist != null); }