Вопрос по rest, alamofire, video, youtube, swift – Настройка данных фрагмента для загрузки YouTube через REST API с помощью Swift

0

Я могу успешно загрузить видео на 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   ответа
2

Единственный способ, которым я смог загрузить видео с фрагментами данных, был через комбинацию вызовов 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)
Рад, что ты наконец понял это и спасибо за публикацию! user3344977
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")
},
Это работает, но только если вы указываете "& uploadType = multipart" в качестве параметра запроса Kalle
Плюс поддержка Google для многочастных запросов имеет очень специфический формат:developers.google.com/drive/api/v3/multipart-upload (если вы хотите, чтобы метаданные были включены). Похоже, что в большинстве случаев Google просто игнорирует включенные метаданные, если они в неправильном формате в многочастных запросах Kalle

Похожие вопросы