RESTful механизм для загрузки видео (и свойств) в Vimeo
Процедура загрузки видео в Vimeo начинается очень похоже на ту, что была определена для Youtube, но только до определенного момента. Ниже я опишу шаги, которые сработали, и обрисую последний шаг загрузки видео, который не:
Танец Vimeo-upload начинается, когда мы передаем следующие параметры для запуска аутентификации пользователя:
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
Наконец (и это когда все прекращается с визгом), мы должны использовать этот билет, чтобы сделать запрос POST к Vimeo. Проблема в том, что этот тикет встроен в 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)
}
})
Излишне говорить, что фрагмент кода выше не работает. Любое руководство будет наиболее ценно.
2 ответа
Подумайте об использовании официального Vimeo iOS Upload SDK. Мы обнародовали это около 2 недель назад. Это библиотека Swift, которая обрабатывает загрузку видеофайлов на серверы Vimeo. Это делается с использованием NSURLSession, настроенного в фоновом режиме (поэтому загрузка продолжается независимо от того, находится ли ваше приложение на переднем плане или в фоне). Дайте нам знать, если у вас есть какие-либо вопросы. Примечание: я один из авторов библиотеки и работаю в Vimeo.
VimeoUpload README довольно надежен и должен передавать все, что вам нужно знать. Сообщите, если у вас есть дополнительные вопросы, или не стесняйтесь сделать запрос.
Билет никогда не используется вручную при загрузке. Вы всегда должны использовать URL или HTML, предоставляемые API.
Если вы видите HTML, это потому, что вы не предоставляете параметр типа. По умолчанию мы используем простую систему загрузки POST, как описано здесь: https://developer.vimeo.com/api/upload/videos
Если вы предоставляете "type=streaming", Vimeo возвращает "complete_url", который вы должны вызвать после выполнения потоковой загрузки, как описано здесь: https://developer.vimeo.com/api/upload/videos