1

ビデオを 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リクエストを行うことになっています。問題は、このチケットが実際に Vimeo へのアップロード要求を行う html フォームに埋め込まれていることです...これを実装しようとしている 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)
        }

    })

言うまでもなく、上記のコードのチャンクは機能しません。どんなガイダンスでも大歓迎です。

4

2 に答える 2

3

公式のVimeo iOS Upload SDKの使用を検討してください。約2週間前に公開しました。Vimeo サーバーへのビデオ ファイルのアップロードを処理する Swift ライブラリです。これは、バックグラウンドで構成された NSURLSession を使用して行われます (したがって、アプリがフォアグラウンドかバックグラウンドかに関係なく、アップロードは続行されます)。ご不明な点がございましたら、お問い合わせください。注: 私はライブラリの作成者の 1 人で、Vimeo で働いています。

VimeoUploadのREADME は非常に堅牢で、知っておく必要のあるすべての情報が記載されています。追加の質問がある場合はお知らせください。または、お気軽にプル リクエストを作成してください。

于 2016-03-28T20:02:19.237 に答える