将视频(和属性)上传到vimeo的RESTful机制



将视频上传到Vimeo的过程与为Youtube定义的过程非常相似,但只是在一定程度上。下面我描述了有效的步骤,并概述了没有的最后一个视频上传步骤:

当我们通过以下参数来触发用户身份验证时,Vimeo上传之舞就开始了:

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

最后(这就是事情戛然而止的地方),我们应该使用这个票证向Vimeo发出POST请求。问题是,这个票证嵌入在一个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)
        }
    })

不用说,上面的代码块不起作用。任何指导都将不胜感激。

考虑使用官方的Vimeo iOS Upload SDK。我们大约两周前就公开了。这是一个Swift库,用于处理视频文件到Vimeo服务器的上传。它使用后台配置的NSURLSession(因此,无论您的应用程序是在前台还是后台,上传都会继续)。如果您有任何问题,请告诉我们。注:我是该图书馆的作者之一,在Vimeo工作。

VimeoUpload自述文件非常健壮,应该能够传达您需要了解的所有信息。生菜知道你是否还有其他问题,或者随时提出拉货请求。

在上传过程中从不手动使用票证。您应该始终使用API提供的url或html。

如果您看到HTML,那是因为您没有提供"type"参数。我们默认使用一个简单的POST上传系统,如下所述:https://developer.vimeo.com/api/upload/videos#simple-http张贴上传

如果您提供"type=streaming",Vimeo会返回一个"complete_url",您必须在执行流式上传后调用它,如下所述:https://developer.vimeo.com/api/upload/videos#resumable-http put上传

最新更新