#' Get game meta data from Yahoo! Fantasy API
#'
#' Returns meta data from the GAME resource of the Yahoo API.
#'
#' @param sport Fantasy sport as a lowercase string. Accepted sports are "mlb", "nba", "nhl", "nfl".
#' @param token_name Name used for assignment when creating token object with y_create_token().
#' @param debug Returns a list of data such as uri call and content. Useful for debugging.
#' @param quiet Print function activity.
#'
#' @return Tibble
#'
#' @examples
#' # Not run
#' # y_game_codes(c("nfl", "mlb"), my_token)
#' @export
y_game_codes <- function(sport = NULL, token_name = NULL, debug = FALSE, quiet = TRUE) {
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## TOKEN ----
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Standardize token name
api_token <- token_name
.token_check(token_name, api_token, name = .GlobalEnv)
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## ARGUMENTS ----
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
resource <- "games"
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## CHECKS ----
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
stopifnot(!is.null(sport))
stopifnot(is.character(sport))
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## URI ----
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Check provided sport names are in valid sports and take unique sports so redundant requests are not sent.
sport <- sport[sport %in% c("mlb", "nba", "nhl", "nfl")] %>%
vctrs::vec_unique()
if(!quiet){
cat(crayon::cyan("Sports included in uri:\n"))
cat(crayon::cyan(sport), sep = "\n")}
if(vctrs::vec_size(sport) > 0) {
sport <- glue::glue_collapse(sport, sep = ",")
} else{
stop(message(crayon::cyan("No valid sports provided.")), call. = FALSE)
}
uri <-
glue::glue("https://fantasysports.yahooapis.com/fantasy/v2/games;game_codes={sport}?format=json")
if(!quiet){print(uri)}
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## GET RESPONSE ----
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
r <- purrr::map(uri, .y_get_response, api_token)
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## CHECK RESPONSE FOR ERRORS ----
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if(sum(!purrr::map_lgl(r, httr::http_error)) <= 0){
stop(message(crayon::cyan("All requests returned errors. You may need a token refresh.")), call. = FALSE)
}
r <- r[!purrr::map_lgl(r, httr::http_error)]
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## PARSE CONTENT ----
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
r_parsed <- purrr::map(r, .y_parse_response, "fantasy_content", "games")
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## DF ----
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if(!debug) {
preprocess <-
r_parsed %>%
purrr::flatten() %>%
list_pre_process_fn()
df <-
tryCatch(
expr =
preprocess %>%
purrr::map_df(.game_resource_parse_fn),
error = function(e) {
message(crayon::cyan(
"Function failed while parsing games resource with .game_resource_parse_fn. Returning debug list."))
}
)
if(tibble::is_tibble(df)){return(df)}
}
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## DEBUG RETURN ----
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
data_list <-
structure(
list(
uri = uri,
resource = resource,
response = r,
r_parsed = r_parsed
),
class = "yahoo_fantasy_api"
)
return(data_list)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.