def startUpload()

in common/src/main/scala/com/gu/media/youtube/YouTubeUploader.scala [20:55]


  def startUpload(title: String, channel: String, id: String, size: Long): String = {
    val contentOwnerParams = s"onBehalfOfContentOwner=${youTube.contentOwner}&onBehalfOfContentOwnerChannel=$channel"
    val params = s"uploadType=resumable&part=snippet,statistics,status&$contentOwnerParams"
    val endpoint = s"https://www.googleapis.com/upload/youtube/v3/videos?$params"

    val videoTitle = s"$title-$id".take(70) // YouTube character limit

    val json = JsObject(Seq(
      "snippet" -> JsObject(Seq(
        "title" -> JsString(videoTitle)
      )),
      "status" -> JsObject(Seq(
        "privacyStatus" -> JsString("unlisted")
      )),
      "onBehalfOfContentOwner" -> JsString(youTube.contentOwner),
      "onBehalfOnContentOwnerChannel" -> JsString(channel)
    ))

    val body = RequestBody.create(JSON, Json.stringify(json))
    val request = new Request.Builder()
      .url(endpoint)
      .addHeader("Authorization", "Bearer " + youTube.accessToken())
      .addHeader("X-Upload-Content-Length", size.toString)
      .addHeader("X-Upload-Content-Type", "video/*")
      .post(body)
      .build()

    YoutubeRequestLogger.logRequest(YoutubeApiType.UploadApi, YoutubeRequestType.StartVideoUpload)
    val response = http.newCall(request).execute()

    if(response.code() == 200) {
      response.header("Location")
    } else {
      throw new IllegalStateException(s"${response.code()} when starting YouTube upload: ${response.body().string()}")
    }
  }