Я использую клиентскую библиотеку API данных YouTube v3/Google API для Ruby уже более года для автоматической загрузки, обновления и удаления видео. Я часто получаю ошибки от API при попытке установить миниатюру для видео сразу после его загрузки (что-то о превышении ограничения скорости и необходимости проверки некоторой квоты), но я всегда нахожусь значительно ниже квот сервиса, там в документации нет упоминания об ошибке, и повторная отправка миниатюры всегда происходит, поэтому я просто отправляю ее повторно по мере необходимости. Большую часть времени все работает так, как ожидалось.
Однако сегодня каждый раз, когда загружалось видео и отправлялась миниатюра, я получал новую ошибку: failedPrecondition: Precondition check failed
На этот раз ошибка возникает каждый раз, и повторная отправка вообще не помогает. В моем коде за последнее время ничего не менялось, а все остальное (загрузка видео и описания) работает как обычно, так что проблем с аутентификацией или плохим запросом не похоже. Изображения небольшие (менее 100К).
В документации для разработчиков Google нет упоминания об этом исключении, поэтому невозможно узнать, что может быть не так.
Код просто выполняет service.set_thumbnail(vid, upload_source: file)
, где vid
— идентификатор видео на YouTube, а file
— путь к файлу изображения. Опять же, это работало пару дней назад.
Возвращенное исключение:
failedPrecondition: Precondition check failed.
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-core-0.11.1/lib/google/apis/core/http_command.rb:239:in `check_status'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-core-0.11.1/lib/google/apis/core/api_command.rb:135:in `check_status'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-core-0.11.1/lib/google/apis/core/http_command.rb:202:in `process_response'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-core-0.11.1/lib/google/apis/core/upload.rb:174:in `process_response'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-core-0.11.1/lib/google/apis/core/upload.rb:259:in `execute_once'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-core-0.11.1/lib/google/apis/core/http_command.rb:126:in `block (2 levels) in do_retry'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/retriable-3.1.2/lib/retriable.rb:61:in `block in retriable'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/retriable-3.1.2/lib/retriable.rb:56:in `times'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/retriable-3.1.2/lib/retriable.rb:56:in `retriable'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-core-0.11.1/lib/google/apis/core/http_command.rb:123:in `block in do_retry'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/retriable-3.1.2/lib/retriable.rb:61:in `block in retriable'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/retriable-3.1.2/lib/retriable.rb:56:in `times'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/retriable-3.1.2/lib/retriable.rb:56:in `retriable'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-core-0.11.1/lib/google/apis/core/http_command.rb:113:in `do_retry'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-core-0.11.1/lib/google/apis/core/http_command.rb:104:in `execute'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-core-0.11.1/lib/google/apis/core/base_service.rb:418:in `execute_or_queue_command'
/home/uploader/local/ruby-3.2.1/lib/ruby/gems/3.2.0/gems/google-apis-youtube_v3-0.6.0/lib/google/apis/youtube_v3/service.rb:3262:in `set_thumbnail'
/home/uploader/rails/app/controllers/concerns/youtube_handler.rb:63:in `block in set_thumbnail'
/home/uploader/rails/app/controllers/concerns/youtube_handler.rb:62:in `open'
/home/uploader/rails/app/controllers/concerns/youtube_handler.rb:62:in `set_thumbnail'
Похоже, код библиотеки трижды пытается загрузить изображение и сдается.
Кто-нибудь сталкивался с этой ошибкой?
ОБНОВЛЕНИЕ: я не упоминал, что на самом деле я загружаю видео с одним и тем же клиентским кодом API Google на два разных канала YouTube. Публикация миниатюр до сих пор работала на обоих каналах, и я предполагал, что загрузка миниатюр перестала работать на обоих каналах. Однако оказывается, что клиентский код без проблем продолжает публиковать миниатюры в один канал. Другими словами, перестал работать только один канал. Так что, возможно, исключение «Проверка предварительных условий не удалась» как-то связано со статусом канала. Однако на веб-портале студии YouTube оба канала выглядят одинаково (насколько я вижу, никаких предупреждений или каких-либо других ограничений).
🤔 А знаете ли вы, что...
Ruby имеет богатую стандартную библиотеку, которая упрощает разработку приложений.
Тот факт, что один канал продолжал работать, а другой остановился, заставил меня задуматься, не связано ли это как-то с процессом авторизации. Это казалось маловероятным, поскольку создание видеороликов и загрузка видеофайлов продолжали работать в обычном режиме на обоих каналах; только на одном канале не удалась загрузка миниатюр.
Я решил, что не помешает обновить токен доступа для проблемного канала, и вуаля! миниатюры начали работать, как только я это сделал. Должно быть, где-то что-то было повреждено, и создание нового токена должно было его очистить.
Я оставляю это на случай, если это поможет кому-то еще.