Youtube-API: Загрузить файл бинарных титров (ebu-stl)
Youtube поддерживает некоторые форматы файлов с титрами, например, ebu-stl.
У меня есть файл *.stl, который отлично загружается и обрабатывается, когда я загружаю его через веб-интерфейс. Но когда я пытаюсь загрузить его через API v2 с помощью запроса POST, он, похоже, не распознает формат файла должным образом. Запрос POST выглядит так:
POST /feeds/api/videos/VIDEO_ID/captions HTTP/1.1
Host: gdata.youtube.com
Content-Type: application/vnd.youtube.timedtext; charset=UTF-8
Content-Language: en
Slug: Title of caption track
Authorization: Bearer ACCESS_TOKEN
GData-Version: 2
X-GData-Key: key=DEVELOPER_KEY
<Caption File Data>
Так выглядит файл *.stl, загруженный через API, на веб-сайте. Там должно быть несколько строк с читаемым текстом.
Все работает нормально, когда я загружаю файл субтитров с открытым текстом utf8 (например, *.vtt) с тем же кодом. Кроме того, если я загружаю файл stl один раз через веб-интерфейс и один раз через API, а затем извлекаю оба файла через API, они идентичны байту.
Похоже, что проблема с кодировкой для me-youtube правильно принимает файл, но, вероятно, анализирует весь двоичный файл как UTF-8. Тем не менее, YouTube отвечает с ошибкой 4xx, когда я опускаю либо charset= или Content-Language.
Можно ли загрузить двоичные файлы титров? Буду также признателен за подтверждение, если это невозможно.
Минималистичный файл stl, если вы хотите попробовать его самостоятельно (hex dump). Прочитайте это как (ruby):
stl = hex.chars.each_slice(2).map{|x|x.join.to_i(16)}.pack('C*')
1 ответ
API v2 официально объявлен устаревшим. По состоянию на 2 апреля API v3 теперь официально поддерживает подписи. Также поддерживаются двоичные файлы титров.
В документации отсутствуют некоторые детали относительно необработанных HTTP-запросов. Вы можете попробовать использовать одну из их библиотек.
Я использовал их скрипт на python и посмотрел на сделанный им запрос. Для справки вот минимальный рабочий HTTP-запрос для загрузки двоичного файла субтитров / титров.
Документы не упоминают этот параметр, но настройки uploadType=multipart
В противном случае API возвращает ошибку.
POST /upload/youtube/v3/captions?uploadType=multipart&part=id,snippet&sync=false HTTP/1.1
Host: www.googleapis.com
Accept: */*
Authorization: Bearer {AUTH_TOKEN}
X-GData-Key: key={YOUR_KEY}
Content-Type: multipart/related; boundary================83250640405719953005==
Content-Length: 7147
Expect: 100-continue
--===============83250640405719953005==
Content-Type: application/json
MIME-Version: 1.0
{"snippet":{"videoId":"Agn_uesF248","language":"en","name":"Subtitle Test 2","isDraft":false}}
--===============83250640405719953005==
MIME-Version: 1.0
Content-Type: application/sla
Content-Transfer-Encoding: binary
{BINARY_CAPTION_FILE_DATA}
--===============83250640405719953005==--
application/sla
файлы заголовков ebu-stl использование text/plain
для текстовых субтитров (.srt, .vtt, .ass и т. д.).
замещать {AUTH_TOKEN}
а также {YOUR_KEY}
с надлежащими учетными данными для авторизации https://www.googleapis.com/auth/youtube.force-ssl
; а также {BINARY_CAPTION_FILE_DATA}
с файлом, который вы хотите загрузить.