Настройка данных фрагмента для загрузки YouTube через REST API с помощью Swift
Я могу успешно загрузить видео на YouTube через API REST, используя следующий код:
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
данные о первоначальной загрузке, а именно title
а также description
,
Я пытался использовать альтернативу Alamofire
метод, который очень похож на приведенный выше, только он также требует NSMutableURLRequest
в качестве параметра. Я создал свой словарь фрагментов и установил его как HTTPBody
свойство изменяемого запроса. Загрузка видео все еще работает, но значения заголовка и описания моего фрагмента по-прежнему не установлены.
Как я могу установить некоторую информацию фрагмента при загрузке видео на YouTube?
2 ответа
Добавьте строку в блок multipartFormData для значений параметров следующим образом (поместите код перед элементом видео):
multipartFormData.appendBodyPart(data:"{'snippet':{'title' : 'TITLE_TEXT', 'description': 'DESCRIPTION_TEXT'}}".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"snippet", mimeType: "application/json")
URL-адрес поста также должен быть изменен на фрагмент = фрагмент
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")
},
Единственный способ, которым я смог загрузить видео с фрагментами данных, был через комбинацию вызовов 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]?#>)
Обратите внимание на параметры: <[String: AnyObject]?> Именно так вы должны определить свой словарь фрагмента:
let dictionarySnippet :Dictionary<String, AnyObject> = [
"title" : "something in the way",
"description" : "is this finally gonna work?",
"tags" : ["whisky","tango","fox"],
"categoryId" : "1"
]
Вам также нужно будет отправить идентификатор загруженного видео (которое вы можете записать из своего POST в другом словаре:
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)
См. https://gist.github.com/forderud/941e1d2014c43a0e3f5f0af1d7972075 для примера кода Qt/C++, показывающего, как загрузить видео на YouTube, включая метаданные фрагмента. C++, конечно, не Swift, но он должен быть похож на реализацию Swift.