Настройка данных фрагмента для загрузки 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.

Другие вопросы по тегам