R/fetch_player_meta.R

Defines functions get_espn_country fetch_player_meta_individual fetch_player_meta

Documented in fetch_player_meta

#' Fetch Player Meta Data
#'
#' Fetch player meta data from ESPNCricinfo and return a tibble with one line
#' per player. To identify the players, use their Cricinfo player IDs.
#' The simplest way to find this is to look up their Cricinfo Profile page. The number
#' at the end of the URL is the ID. For example, Meg Lanning's profile page is
#' https://www.espncricinfo.com/cricketers/meg-lanning-329336,
#' so her ID is 329336.
#'
#' @param playerid A vector of player IDs as given in Cricinfo profiles. Integer or character.
#'
#' @return A tibble containing meta data on the selected players, with one row for
#' each player.
#' @author Hassan Rafique and Rob J Hyndman
#' @seealso It is usually simpler to just use the saved data set [player_meta]
#' which contains the meta data for all players on ESPNCricinfo as at 24 March 2025.
#' To find a player ID, use [find_player_id()].
#' Use [fetch_player_data()] to download playing statistics for a player.
#' @examples
#' \dontrun{
#' # Download meta data on Meg Lanning and Ellyse Perry
#' aus_women <- fetch_player_meta(c(329336, 275487))
#' }
#' @export
fetch_player_meta <- function(playerid) {
  output <- NULL
  pb <- cli::cli_progress_bar(total = length(playerid))
  for (j in seq_along(playerid)) {
    cli::cli_progress_update()
    output <- rbind(output, fetch_player_meta_individual(playerid[j]))
  }
  cli::cli_progress_done()
  return(output)
}

fetch_player_meta_individual <- function(playerid) {
  # Set up empty output
  output <- data.frame(
    cricinfo_id = playerid,
    name = NA_character_,
    full_name = NA_character_,
    country = NA_character_,
    dob = as.Date(NA),
    batting_style = NA_character_,
    bowling_style = NA_character_
  )
  # Read JSON file with player meta data
  url <- paste0("http://core.espnuk.org/v2/sports/cricket/athletes/", playerid)
  json <- try(jsonlite::read_json(url), silent = TRUE)
  if ("try-error" %in% class(json)) {
    warning(paste(
      "Cannot read player information from ESPNCricinfo for ID",
      playerid
    ))
  } else {
    output$full_name <- json$fullName 
    output$name <- json$name
    output$country <- get_espn_country(json$country)
    if(is.na(output$country)) {
      stop(paste("Country not found. Player",playerid,output$full_name))
    }
    output$dob <- as.Date(json$dateOfBirth)
    if(length(json$style) > 0) {
      output$batting_style <- json$style[[1]]$description
    }
    if(length(json$style) > 1) {
      output$bowling_style <- json$style[[2]]$description
    }
  }
  return(output)
}

# Find country from ESPN team id
get_espn_country <- function(i) {
  if(i %in% espn_countries$id) {
    return(espn_countries$country[espn_countries$id == i])
  }
  json <- try(jsonlite::read_json(paste0("http://core.espnuk.org/v2/sports/cricket/teams/", i)), silent = TRUE)
  if(!("try-error" %in% class(json))) {
    # Update data set to avoid repeated calls
    espn_countries <- rbind(espn_countries, data.frame(id = i, country = json$name)) 
    return(json$name)
  } else {
    return(NA_character_)
  }
}

utils::globalVariables(c(
  "cricinfo_id", "full_name", "country", "dob", "birthplace",
  "batting_style", "bowling_style", "playing_role",
  "title", "values"
))
robjhyndman/cricketdata documentation built on July 3, 2025, 9:57 p.m.