--- title: GraphTV runtime: shiny output: html_document --- ```{r setup, message = F, warning = F, echo = F} library(tidyverse) library(httr) library(rvest) library(plotly) library(jsonlite) library(knitr) opts_chunk$set(message = F, echo = F, warning = F) key <- "?api_key=32e0ed1416c58777f986f3f33751fc22" tmdb_url <- "http://api.themoviedb.org/3/" ``` ```{r input} inputPanel( textInput("show_search", "Search show"), actionButton("button_search", "Search show"), uiOutput("show_choice") ) shows <- eventReactive(input$button_search, { req(input$show_search) serie <- input$show_search %>% url_escape GET(str_c(tmdb_url, "search/tv", key, "&query=", serie)) %>% content(as = "text") %>% fromJSON -> res #res$results$poster_path res$results$id %>% as.list %>% setNames(res$results$original_name) }) output$show_choice <- renderUI({ req(shows()) selectizeInput("show", "Please choose…", shows()) }) ``` ```{r graph} renderPlotly({ req(input$show) show_id <- input$show GET(str_c(tmdb_url, "tv/", show_id, key)) %>% content(as = "text") %>% fromJSON -> res res$backdrop_path 1:res$number_of_seasons -> seasons res$vote_average seasons %>% map(~ GET(str_c(tmdb_url, "tv/", show_id, "/season/", ., key)) %>% content(as = "text") %>% fromJSON) -> res res %>% map("episodes") %>% reduce(bind_rows) %>% select(season_number, episode_number, name, still_path, vote_average) -> episodes episodes %>% by(.$season_number, function(x){ fit <- lm(vote_average ~ episode_number, data = x) x %>% plot_ly(hoverinfo = "text", text = ~str_c("S", season_number, "E", episode_number, " - ", name, "
", "Rating: ", vote_average, "
")) %>% add_trace(data = x, x = ~episode_number, y = ~vote_average, mode = "markers") %>% add_trace(data = x, x = ~episode_number, y = fitted(fit), mode = "lines") %>% layout(xaxis = list(tick0 = 0, dtick = 1), yaxis = list(title = "Rating")) }) %>% subplot(shareY = T, nrows = 1) %>% hide_legend }) ```