## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----setup--------------------------------------------------------------------
library(R2camtrapdp)

## -----------------------------------------------------------------------------
data("Adep")   # deployment field-notebook (one row per device deployment)
data("Aobs")   # observation field-notebook (one row per observation; has `filename`)
str(Adep, vec.len = 2)
str(Aobs, vec.len = 2)

## ----eval = FALSE-------------------------------------------------------------
# ba <- "https://raw.githubusercontent.com/camera-traps/bioacoustics/main/camtrap-dp/1.0.2/%s"
# 
# dp <- R6_CamtrapDP$new(version = "1.0.2",
#   title = "Acoustic survey example", description = "AudioMoth recordings",
#   id = "https://example.org/dataset/acoustic-1")
# 
# dp$set_properties(
#   version     = "1.0.2",
#   profile     = sprintf(ba, "camtrap-dp-profile-acoustic.json"),
#   schema_urls = list(
#     deployments  = sprintf(ba, "deployments-table-schema-acoustic.json"),
#     media        = sprintf(ba, "media-table-schema-acoustic.json"),
#     observations = sprintf(ba, "observations-table-schema-acoustic.json")))

## -----------------------------------------------------------------------------
deployments <- data.frame(
  deploymentID    = Adep$deploymentID,
  latitude        = Adep$latitude,
  longitude       = Adep$longitude,
  locationID      = Adep$locationID,
  deploymentStart = as.POSIXct(paste(Adep$startDate, Adep$startTime), tz = "Asia/Tokyo"),
  deploymentEnd   = as.POSIXct(paste(Adep$endDate,   Adep$endTime),   tz = "Asia/Tokyo"),
  deviceID        = Adep$deviceID,
  deviceModel     = Adep$deviceModel,
  setupBy         = Adep$setupBy,
  stringsAsFactors = FALSE)

## ----eval = FALSE-------------------------------------------------------------
# dp$set_deployments(deployments)

## -----------------------------------------------------------------------------
files <- Aobs[!duplicated(Aobs$filename), ]   # one row per audio file

media <- data.frame(
  mediaID       = files$filename,             # the file name is the media identifier
  deploymentID  = files$deploymentID,
  timestamp     = as.POSIXct(paste(files$date, files$time), tz = "Asia/Tokyo"),
  filePath      = file.path("audio", files$filename),
  filePublic    = TRUE,
  fileMediatype = paste0("audio/", tolower(tools::file_ext(files$filename))),  # "audio/wav"
  duration      = files$duration,
  stringsAsFactors = FALSE)

# add device recording settings (samplingFrequency / bitDepth / channels) from Adep
media <- merge(media, Adep[, c("deploymentID", "samplingFrequency", "bitDepth", "channels")],
               by = "deploymentID", all.x = TRUE)
head(media)

## ----eval = FALSE-------------------------------------------------------------
# dp$set_media(media)

## -----------------------------------------------------------------------------
observations <- data.frame(
  observationID    = paste(Aobs$deploymentID, Aobs$eventID, Aobs$obsID, sep = "_"),
  deploymentID     = Aobs$deploymentID,
  mediaID          = Aobs$filename,           # link to media (mediaID = filename)
  eventStart       = as.POSIXct(Aobs$eventStart, tz = "Asia/Tokyo"),
  eventEnd         = as.POSIXct(Aobs$eventEnd,   tz = "Asia/Tokyo"),
  observationLevel = "media",
  observationType  = ifelse(Aobs$object == "none", "blank",
                     ifelse(Aobs$object == "hito", "human", "animal")),
  scientificName   = ifelse(is.na(Aobs$genus), Aobs$class, paste(Aobs$genus, Aobs$species)),
  count            = Aobs$individualCount,    # NA here (not counted from audio)
  frequencyLow     = Aobs$frequencyLow,
  frequencyHigh    = Aobs$frequencyHigh,
  stringsAsFactors = FALSE)

## ----eval = FALSE-------------------------------------------------------------
# dp$set_observations(observations)

## ----eval = FALSE-------------------------------------------------------------
# dp$add_contributors(data.frame(title = "Jane Doe", role = "contact",
#                                organization = "NIES", stringsAsFactors = FALSE))
# dp$add_license(name = "CC0-1.0",   scope = "data")
# dp$add_license(name = "CC-BY-4.0", scope = "media")
# dp$set_project(title = "Acoustic survey", samplingDesign = "systematicRandom",
#                captureMethod = "recordingSchedule", individualAnimals = FALSE,
#                observationLevel = "media")
# dp$set_st()
# # dp$set_taxon()   # taxonID from GBIF/ITIS/NCBI; requires the taxadb package + internet
# 
# dp$check_relations()   # PK/FK; warns and points at datapackage$data$... if a key is missing
# 
# path <- file.path(tempdir(), "acoustic-package")
# dp$out_camtrapdp(write = TRUE, directory = path)
# 
# issues <- dp$validate_frictionless(directory = path, python = "python")  # pip install frictionless
# ctdp_is_valid(issues)

## ----eval = FALSE-------------------------------------------------------------
# ctdp_validate_frictionless("path/to/existing/acoustic-package", python = "python")

## ----eval = FALSE-------------------------------------------------------------
# ba <- "https://raw.githubusercontent.com/camera-traps/bioacoustics/main/camtrap-dp/1.0.2/%s"
# acoustic_media <- TableSchema$new(
#   "media", version = "1.0.2",
#   url_template = sprintf(ba, "media-table-schema-acoustic.json"))
# 
# acoustic_media$field_names()
# acoustic_media$requirements()                 # type / format / required / enum per field
# acoustic_media$field("timestamp")$format      # "%Y-%m-%dT%H:%M:%S.%f%z"

