使用swift和alamofire将视频(和属性)上传到youtube

Plu*_*man 2 youtube youtube-api swift alamofire

我有兴趣将视频上传到youtube以及标题,说明和关键字.下面的代码将视频上传到youtube而没有任何属性:

func postVideoToYouTube(token: String, callback: Bool -> Void){

let headers = ["Authorization": "Bearer \(token)"]
let urlYoutube = "https://www.googleapis.com/upload/youtube/v3/videos?part=id"

let path = NSBundle.mainBundle().pathForResource("video", ofType: "mp4")
let videodata: NSData = NSData.dataWithContentsOfMappedFile(path!)! as! NSData
upload(
    .POST,
    urlYoutube,
    headers: headers,
    multipartFormData: { multipartFormData in
        multipartFormData.appendBodyPart(data: videodata, name: "video", fileName: "video.mp4", mimeType: "application/octet-stream")
    },
    encodingCompletion: { encodingResult in
        switch encodingResult {
        case .Success(let upload, _, _):
            upload.responseJSON { request, response, error in
                print(response)
                callback(true)
            }
        case .Failure(_):
            callback(false)
        }
    })
Run Code Online (Sandbox Code Playgroud)

}

我一直在尝试修改urlYoutube以包含必要的代码段信息无效:

let snippetTitle = "The Best Video Ever"
let snippetDesc = "first video upload with title"
let snippetTags = "best,video,ever,snoopy,monkey,charlie"
let urlYoutube = "https://www.googleapis.com/upload/youtube/v3/videos?part=id&snippet.title=%@&snippet.description=%@&snippet.keywords=%@", snippetTitle, snippetDesc, snippetTags)"
Run Code Online (Sandbox Code Playgroud)

我尝试的另一种方法(感谢@adjuremods建议)是使用基于Youtube-API的Request Body来编辑之前上传的视频.首先,我定义了一个视频资源:

let parms = [
  "kind": "youtube#video",
  "id" : returnedId,
  "snippet.title" : "summer vacation cali",
  "snippet.description" : "had fun in the sun",
  "snippet.tags" : ["surf","fun","sun"],
  "snippet.categoryId" : "1"
]
Run Code Online (Sandbox Code Playgroud)

并将其作为PUT请求发送,如下所示:

do {
  let parmsJson = try NSJSONSerialization.dataWithJSONObject(parameters, options: .PrettyPrinted)

  let putURL = NSURL(string: "https://www.googleapis.com/upload/youtube/v3/videos")!

  let request = NSMutableURLRequest(URL: putURL)
  request.HTTPMethod = "PUT"
  request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
  request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
  request.HTTPBody = parmsJson

  let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in
    if error != nil{
      print("Error -> \(error)")
      return
    }

    do {
      let result = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:AnyObject]

      print("Result -> \(result)")

    } catch {
      print("Error -> \(error)")
    }
  }

  task.resume()
  //return task


} catch {
  print ("...could not accomplish put request")
}   
Run Code Online (Sandbox Code Playgroud)

不幸的是,无论我如何修改视频资源,我得到的结果总是一样的:

Result -> Optional(["error": {
code = 400;
errors =     (
            {
        domain = global;
        message = "Unsupported content with type: application/json; charset=UTF-8";
        reason = badContent;
    }
);
message = "Unsupported content with type: application/json; charset=UTF-8";
Run Code Online (Sandbox Code Playgroud)

有人可以建议我可能出错吗?我对如何设置API定义的这些参数没有非常清楚的了解:

https://developers.google.com/youtube/v3/docs/videos/insert#parameters

小智 5

在multipartFormData块中为参数值添加一行,如下所示(将代码放在视频项之前 - 并根据隐含结构添加任何其他片段属性值):

multipartFormData.appendBodyPart(data:"{'snippet':{'title' : 'TITLE_TEXT', 'description': 'DESCRIPTION_TEXT'}}".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"snippet", mimeType: "application/json")
Run Code Online (Sandbox Code Playgroud)

邮政网址也应更改为part = snippet

https://www.googleapis.com/upload/youtube/v3/videos?part=snippet
Run Code Online (Sandbox Code Playgroud)

 .POST,
    "https://www.googleapis.com/upload/youtube/v3/videos?part=snippet",
    headers: headers,
    multipartFormData: { multipartFormData in
        multipartFormData.appendBodyPart(data:"{'snippet':{'title' : 'TITLE_TEXT', 'description': 'DESCRIPTION_TEXT'}}".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"snippet", mimeType: "application/json")
        multipartFormData.appendBodyPart(data: videodata, name: "video", fileName: "video.mp4", mimeType: "application/octet-stream")
},
Run Code Online (Sandbox Code Playgroud)