【问题标题】:Setting snippet data for youtube upload via REST API using Swift使用 Swift 通过 REST API 为 youtube 上传设置片段数据
【发布时间】:2016-07-11 11:10:33
【问题描述】:

我可以使用以下代码通过他们的 REST API 成功地将视频上传到 youtube:

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

let headers = ["Authorization": "Bearer \(token)"]

let path = NSBundle.mainBundle().pathForResource("video", ofType: "mp4")
let videodata: NSData = NSData.dataWithContentsOfMappedFile(path!)! as! NSData
upload(
    .POST,
    "https://www.googleapis.com/upload/youtube/v3/videos?part=id",
    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)
        }
    })
}

我现在想编辑上面的代码,以便在初始上传时设置一些snippet 数据,特别是titledescription

我尝试使用与上述方法非常相似的另一种Alamofire 方法,只是它还采用NSMutableURLRequest 作为参数。我制作了我的 sn-p 字典并将其设置为可变请求的 HTTPBody 属性。视频上传仍然有效,但我的 sn-p 的标题和描述值仍未设置。

上传视频到 youtube 时如何设置一些 sn-p 信息?

【问题讨论】:

    标签: swift rest video youtube alamofire


    【解决方案1】:

    在 multipartFormData 块中添加一行参数值如下(将代码放在视频项之前):

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

    post url也应该改为part=sn-p

    https://www.googleapis.com/upload/youtube/v3/videos?part=snippet
    

    .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")
    },
    

    【讨论】:

    • 这确实有效,但前提是您将“&uploadType=multipart”指定为查询参数
    • 此外,Google 对多部分请求的支持具有非常特定的格式:developers.google.com/drive/api/v3/multipart-upload(如果您希望包含元数据)。似乎在大多数情况下,如果多部分请求中包含的元数据格式不正确,Google 会简单地忽略它
    • @Kalle 得到错误 ["error": { code = 403; errors = ( { domain = global; message = "Insufficient Permission: Request has enough authentication scopes."; reason = enoughPermissions; } ); message = "权限不足:请求的身份验证范围不足。"; }] 我该如何解决这个问题?
    【解决方案2】:

    我能够上传带有 sn-p 数据的视频的唯一方法是结合使用 POST 和 PUT 调用。 POST 上传没有元数据的视频,PUT 编辑视频的元数据。这样做需要做几件事:

    1. Enable the necessary scopes
        -https://www.googleapis.com/auth/youtube.upload for POST
        -https://www.googleapis.com/auth/youtube for PUT
    2. Be mindful of the URL's you use for each request
        -https://www.googleapis.com/upload/youtube/v3/videos?part=snippet for POST
        -https://www.googleapis.com/youtube/v3/videos?part=snippet&key=\(ios_key) for PUT
    

    现在,如果您使用 Alamofire,您在问题中包含的 POST 可以保持原样。对于 PUT 部分,您必须注意 Alamofire 希望如何传递参数:

    request(<#T##method: Method##Method#>, <#T##URLString: URLStringConvertible##URLStringConvertible#>, parameters: <#T##[String : AnyObject]?#>, encoding: <#T##ParameterEncoding#>, headers: <#T##[String : String]?#>)
    

    注意参数:正是你必须如何定义你的 sn-p 字典:

    let dictionarySnippet :Dictionary<String, AnyObject>  = [
      "title" : "something in the way",
      "description" : "is this finally gonna work?",
      "tags" : ["whisky","tango","fox"],
      "categoryId" : "1"
    ]
    

    您还必须发送已上传视频的 ID(您可以从另一个字典中的 POST 中获取该 ID:

    let dictionaryParameters :Dictionary<String, AnyObject> = [
                "id" : "\(returnedId)",
                "snippet" : dictionarySnippet,
              ]
    

    最后,您现在可以发送一个 PUT 请求来更新您的视频元数据:

    let putRequest = request(.PUT, "https://www.googleapis.com/youtube/v3/videos?part=snippet&key=\(ios_key)", parameters: dictionaryParameters, encoding: .JSON , headers: headers)
    

    【讨论】:

    • 很高兴您终于想通了,感谢您的发帖!
    • @user3344977 得到错误 ["error": { code = 403; errors = ( { domain = global; message = "Insufficient Permission: Request has enough authentication scopes."; reason = enoughPermissions; } ); message = "权限不足:请求的身份验证范围不足。"; }] 我该如何解决这个问题?
    【解决方案3】:

    请参阅 https://gist.github.com/forderud/941e1d2014c43a0e3f5f0af1d7972075 获取 Qt/C++ 示例代码,该代码展示了如何将视频上传到 YouTube,包括 sn-p 元数据。 C++ 当然不是 Swift,但它应该类似于 Swift 实现。

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 1970-01-01
      • 2021-12-24
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多