RESTful механизм для загрузки видео (и свойств) в Vimeo

Процедура загрузки видео в Vimeo начинается очень похоже на ту, что была определена для Youtube, но только до определенного момента. Ниже я опишу шаги, которые сработали, и обрисую последний шаг загрузки видео, который не:

Танец Vimeo-upload начинается, когда мы передаем следующие параметры для запуска аутентификации пользователя:

let authPath:String = "\(url_vauth)?response_type=\(response_type)&client_id=\(client_id)&redirect_uri=\(redirect_uri)&state=\(state)&scope=upload"

if let authURL:NSURL = NSURL(string: authPath) {
  let request = NSURLRequest(URL: authURL)
  webView.loadRequest(request)  // opens a webpage in a webUIView

  // once credentials are entered, google redirects back with the above uri + a temporary code
  // we will exchange later for a token

  // within AppDelegate, we have defined a way to handle this uri, which is to call
  // processOAuthStep1Response(url)

Затем мы обрабатываем возвращенный ответ, чтобы извлечь код авторизации:

let components = NSURLComponents(URL: url, resolvingAgainstBaseURL: false)
var auth_code:String!
// the block below extracts the text that follows "code" in the return url

if let queryItems = components?.queryItems {
  for queryItem in queryItems { // step through each part of url
    if queryItem.name.lowercaseString == "code" {
      auth_code = queryItem.value
      break
    } //  end of if queryItem.name.lowercaseString
  } // end of for
} // if let queryItems

С помощью этого кода авторизации мы затем генерируем токен:

  let getTokenPath:String = url_token
  let grant_type = "authorization_code"
  let header_plain = "\(client_id):\(client_secret)"
  let string_plain = header_plain.dataUsingEncoding(NSUTF8StringEncoding)
  let string_base64 = (string_plain?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)))! as String
  let headers = ["Authorization": "basic \(string_base64)"]  // note that string_base64 really needs to be in base64!
  //print ("...header is: \(string_base64)")
  let tokenParams = ["grant_type": grant_type, "code": receivedCode, "redirect_uri": redirect_uri, "scope": "public"]
  let request = Alamofire.request(.POST, getTokenPath, parameters: tokenParams, encoding: .URL, headers: headers)

Мы используем этот токен для генерации тикета:

request(.POST, url_getticket, parameters: ticketParams , encoding: .URL, headers: headers).responseJSON { response  in
  //print(response)
  switch response.result {
  case .Success(let data):
    let json = JSON(data)
    print (json)
    let myticket = json["ticket_id"].stringValue
    //let usage = json[("upload_quota")].stringValue
    let htmlform = json[("form")].stringValue
    let uploadlink = json[("upload_link_secure")].stringValue
    print("......ticket is \(myticket)")
    print("......form is \(htmlform)")
    print("......upload link is \(uploadlink)")
  case .Failure(let error):
    print("Request failed with error: \(error)")
  } // end of switch

Наконец (и это когда все прекращается с визгом), мы должны использовать этот билет, чтобы сделать запрос POST к Vimeo. Проблема в том, что этот тикет встроен в html-форму, которая фактически делает запрос на загрузку в Vimeo... Не очень полезен для платформы iOS, где я пытаюсь это реализовать. В идеале, я хотел бы реализовать с Alamofire через вызов загрузки следующим образом:

  let headers = ["Authorization": "Bearer \(token)"]
  upload(
      .POST,
      "https://1511923767.cloud.vimeo.com/upload?ticket_id=#######&video_file_id=####&signature=####&v6=1&redirect_url=https%3A%2F%2Fvimeo.com%2Fupload%2Fapi%3Fvideo_file_id%3D498216063%26app_id%3D70020%26ticket_id%####%26signature%######", 
      headers: headers,
      multipartFormData: { multipartFormData in
        multipartFormData.appendBodyPart(data: videodata, name: "video", fileName: "bagsy.m4v", mimeType: "application/octet-stream")
      },
      encodingCompletion: { encodingResult in
        switch encodingResult {
        case .Success(let upload, _, _):
          upload.progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in
            dispatch_async(dispatch_get_main_queue()) {
              let percent = (Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))
              //progress(percent: percent)
              print ("................\(percent)")
            }
          }
          upload.validate()
          upload.responseJSON { response in
            print(response)
            callback(true)
          }
        case .Failure(_):
          callback(false)
        }

    })

Излишне говорить, что фрагмент кода выше не работает. Любое руководство будет наиболее ценно.

2 ответа

Подумайте об использовании официального Vimeo iOS Upload SDK. Мы обнародовали это около 2 недель назад. Это библиотека Swift, которая обрабатывает загрузку видеофайлов на серверы Vimeo. Это делается с использованием NSURLSession, настроенного в фоновом режиме (поэтому загрузка продолжается независимо от того, находится ли ваше приложение на переднем плане или в фоне). Дайте нам знать, если у вас есть какие-либо вопросы. Примечание: я один из авторов библиотеки и работаю в Vimeo.

VimeoUpload README довольно надежен и должен передавать все, что вам нужно знать. Сообщите, если у вас есть дополнительные вопросы, или не стесняйтесь сделать запрос.

Билет никогда не используется вручную при загрузке. Вы всегда должны использовать URL или HTML, предоставляемые API.

Если вы видите HTML, это потому, что вы не предоставляете параметр типа. По умолчанию мы используем простую систему загрузки POST, как описано здесь: https://developer.vimeo.com/api/upload/videos

Если вы предоставляете "type=streaming", Vimeo возвращает "complete_url", который вы должны вызвать после выполнения потоковой загрузки, как описано здесь: https://developer.vimeo.com/api/upload/videos

Другие вопросы по тегам