diff --git a/NEWS.md b/NEWS.md index f0139e2..a9c1750 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,6 +6,7 @@ * [#121](https://github.com/eblondel/zen4R/issues/121) Get Zenodo record views/downloads statistics * [#122](https://github.com/eblondel/zen4R/issues/122) Support `get_zenodo` shortcut method to get a Zenodo Record +* [#123](https://github.com/eblondel/zen4R/issues/123) Support curl fetch for Zenodo records to inherit stats directly **Enhancements** diff --git a/R/ZenodoManager.R b/R/ZenodoManager.R index 388d67c..c85c087 100644 --- a/R/ZenodoManager.R +++ b/R/ZenodoManager.R @@ -979,7 +979,7 @@ ZenodoManager <- R6Class("ZenodoManager", page <- 1 req <- sprintf("records/?q=%s&size=%s&page=%s", URLencode(q), size, page) if(all_versions) req <- paste0(req, "&all_versions=1") - zenReq <- ZenodoRequest$new(private$url, "GET", req, + zenReq <- ZenodoRequest$new(private$url, "GET_WITH_CURL", req, token = self$getToken(), logger = self$loggerType) zenReq$execute() @@ -998,7 +998,7 @@ ZenodoManager <- R6Class("ZenodoManager", page <- page+1 nextreq <- sprintf("records/?q=%s&size=%s&page=%s", URLencode(q), size, page) if(all_versions) nextreq <- paste0(nextreq, "&all_versions=1") - zenReq <- ZenodoRequest$new(private$url, "GET", nextreq, + zenReq <- ZenodoRequest$new(private$url, "GET_WITH_CURL", nextreq, token = self$getToken(), logger = self$loggerType) zenReq$execute() diff --git a/R/ZenodoRecord.R b/R/ZenodoRecord.R index e1874a6..a992693 100644 --- a/R/ZenodoRecord.R +++ b/R/ZenodoRecord.R @@ -52,7 +52,7 @@ ZenodoRecord <- R6Class("ZenodoRecord", self$submitted = obj$submitted self$title = obj$title self$version = obj$version - self$stats = data.frame(jsonlite::read_json(obj$links$self)$stats) + self$stats = data.frame(obj$stats) } ), public = list( diff --git a/R/ZenodoRequest.R b/R/ZenodoRequest.R index 13647b2..af84ba1 100644 --- a/R/ZenodoRequest.R +++ b/R/ZenodoRequest.R @@ -56,7 +56,7 @@ ZenodoRequest <- R6Class("ZenodoRequest", return(data) }, - GET = function(url, request, progress){ + GET = function(url, request, progress, use_curl = FALSE){ req <- paste(url, request, sep="/") self$INFO(sprintf("Fetching %s", req)) headers <- c( @@ -64,15 +64,26 @@ ZenodoRequest <- R6Class("ZenodoRequest", "Authorization" = paste("Bearer",private$token) ) - r <- NULL - if(self$verbose.debug){ - r <- with_verbose(GET(req, add_headers(headers), if(progress) httr::progress(type = "up"))) + responseContent <- NULL + response <- NULL + if(use_curl){ + response <- curl::curl_fetch_memory(req) + responseContent = jsonlite::parse_json(rawToChar(response$content)) + response <- list( + request = request, requestHeaders = rawToChar(response$headers), + status = response$status_code, response = responseContent$hits[[1]] + ) }else{ - r <- GET(req, add_headers(headers), if(progress) httr::progress(type = "up")) + r <- NULL + if(self$verbose.debug){ + r <- with_verbose(GET(req, add_headers(headers), if(progress) httr::progress(type = "up"))) + }else{ + r <- GET(req, add_headers(headers), if(progress) httr::progress(type = "up")) + } + responseContent <- content(r, type = "application/json", encoding = "UTF-8") + response <- list(request = request, requestHeaders = headers(r), + status = status_code(r), response = responseContent) } - responseContent <- content(r, type = "application/json", encoding = "UTF-8") - response <- list(request = request, requestHeaders = headers(r), - status = status_code(r), response = responseContent) return(response) }, @@ -208,6 +219,7 @@ ZenodoRequest <- R6Class("ZenodoRequest", req <- switch(private$type, "GET" = private$GET(private$url, private$request, private$progress), + "GET_WITH_CURL" = private$GET(private$url, private$request, private$progress, use_curl = TRUE), "POST" = private$POST(private$url, private$request, private$data, private$file, private$progress), "PUT" = private$PUT(private$url, private$request, private$data, private$progress), "DELETE" = private$DELETE(private$url, private$request, private$data)