Встраивание/одностраничное отображение видео типа YouTube «Shorts» не работает

Привет!

Встраивание видео с YouTube работает на моём форуме, но короткие видео (с /shorts/ в URL), такие как это:

— не работают. Запрос onebox возвращает ошибку 404.

Обычное встраивание видео с YouTube работает.
Я не сталкиваюсь с этой проблемой на try.discourse или meta.
Думаю, дело в неправильно настроенной настройке сайта.

Есть какие-то идеи?


Однооконный режим для YouTube — это наша собственная разработка. Кто-то должен создать запрос pr-welcome для совместимости с короткими видео. Переносим в #feature.

А пока вы всегда можете добавить ссылку на iframe вручную в настройку сайта «Разрешённые iframe»:

Хотя он довольно высокий :rofl:

3 лайка

Возможно, это из-за расположения сервера, как это было/есть здесь: Youtube embeddings have stopped working for servers in Europe

1 лайк

Спасибо за уточнение!

Не могли бы вы просто сказать, какой URL мне нужно добавить в «разрешённые iframe», чтобы видео отображалось так же, как у вас? Это полностью решит проблему на данный момент, даже если оно действительно высокое.


Что касается высоты видео, её можно уменьшить, задав свойство max-height через CSS для iframe. Проблема в том, что у iframe нет никаких атрибутов, указывающих на то, что это короткое (вертикальное) видео. :confused:

<iframe width="672" height="1194" src="https://www.youtube.com/embed/SWeTMdyv50Q" frameborder="0" allowfullscreen="">

https://www.youtube.com/embed/

Спасибо, Фалько.

Кажется, я почти у цели, но всё ещё немного запутался.

Итак, я добавил этот URL в список разрешённых iframe.

Но что мне нужно сделать дальше, чтобы видео появилось?

Если я вставлю в свой пост https://www.youtube.com/shorts/SWeTMdyv50Q, это не сработает.
Если я напишу <iframe>https://www.youtube.com/shorts/SWeTMdyv50Q</iframe>, это тоже не сработает.
Если я укажу https://www.youtube.com/embed/SWeTMdyv50Q, видео появится, но оно будет отображаться с обычными пропорциями YouTube (это меня устраивает, хотя я предпочёл бы другой формат и не хотел бы вручную добавлять «embed» в URL):

Щёлкните правой кнопкой мыши по видео Shorts и выберите «Копировать код для вставки». Именно это я имел в виду под «ручным кодом для вставки», извините, если я выразился неясно.

2 лайка

Кроме того, замена /shorts/ на watch?v= (стандартный URL видео YouTube) работает.

Таким образом, на YouTube на странице https://www.youtube.com/shorts/SWeTMdyv50Q функция «Копировать URL видео» через контекстное меню работает, так как она возвращает ссылку https://youtu.be/SWeTMdyv50Q, которая корректно отображается в Discourse (хотя и с обычным широким соотношением сторон).

2 лайка

Я не разработчик, но мне кажется, что что-то вроде этого могло бы упростить задачу pr-welcome для тех, кто является разработчиком?

2 лайка

Я это сделал, хотя, возможно, немного накосячил с моим pull request’ом, потому что по какой-то причине я всё ещё не привык к GitHub… Мне действительно нужно прочитать руководство (и, как говорит друг, создавать ветки из моего форка Discourse…). :upside_down_face:

Просто для информации: я только что отредактировал файл lib\onebox\engine\youtube_onebox.rb, чтобы добавить:

# https://www.youtube.com/shorts/wi2jAtpBl0Y
if uri.path["/shorts/"]
  id ||= uri.path[/\/shorts\/([\w\-]+)/, 1]
end
1 лайк

Было бы проще просто изменить shorts на embed?

Не совсем понятно, что вы имеете в виду.Обычно люди копируют ссылку на YouTube из адресной строки.Теперь у YouTube появился новый формат URL с /shorts/. Люди копируют и вставляют эти ссылки, но функция автоматического превращения ссылок YouTube (oneboxing) пока их не поддерживает.Ссылки с /embed/ поддерживаются, но для этого пользователю нужно самостоятельно найти URL для встраивания на YouTube, а этим почти никто не занимается :thinking:

1 лайк

Просто интересно, не было бы проще изменить этот URL? Ведь youtube.com/shorts/something полностью аналогично youtube.com/embed/something, и с /embed/ функция oneboxing/встраивания здесь работает отлично.

https://youtube.com/shorts/aQFdwUeZxkA не работает:

А вот https://youtube.com/embed/aQFdwUeZxkA работает:

Я всё ещё не понимаю. Кто должен менять URL? Автор поста? Но автор не хочет вручную переписывать часть URL (они даже не будут знать, почему видео не встраивается), они просто хотят скопировать и вставить, и всё заработает.


Редакция: или вы имеете в виду, что код Oneboxing в Discourse будет заменять /shorts/ на /embed/?

Да, возможно! Я не совсем код-маг :smile:

Да. И хотя я совсем не умею программировать, мне кажется, что просто заменить это не так уж сложно :wink:

2 лайка

Оба варианта приводят к одному и тому же результату, верно? То есть видео из Shorts будет корректно встроено с функцией воспроизведения?

Хм… не уверен, что правильно понимаю. :sweat_smile:

  1. https://www.youtube.com/embed/SWeTMdyv50Q

  2. https://www.youtube.com/shorts/SWeTMdyv50Q

  3. http://youtu.be/SWeTMdyv50Q ведёт на https://www.youtube.com/watch?v=SWeTMdyv50Q

Эти три разных формата ссылок приводят к разному отображению на YouTube.

Какой бы ни был формат URL, код обращает внимание только на ID видео:

В текущем коде не поддерживается путь /shorts/, и есть несколько способов это исправить.

Как новичок в программировании, я предлагаю продублировать эту часть:

и заменить embed на shorts. Я попробовал это в своей локальной разработке, и всё работает отлично.

Если есть более элегантный способ, буду рад узнать :slight_smile:

2 лайка

Отличная работа, @Canapin :clap:

Хотите ли вы отправить pull request по этому поводу?

Да, я просто никак не могу справиться с файлом тестов на Ruby. Он не работает, и я не понимаю почему. Я никогда раньше не использовал и не создавал модульные тесты, поэтому…

Файл, который нужно изменить: discourse/spec/lib/onebox/engine/youtube_onebox_spec.rb at 493d437e79f88ab9829a36fa000cc6107085e424 · discourse/discourse · GitHub

Я попробовал добавить это в конец файла:

  it "can parse youtube shorts results" do
    preview = expect(Onebox.preview('https://www.youtube.com/watch?v=wi2jAtpBl0Y').placeholder_html)
    preview.to match(/reacts/)
    preview.to match(/hqdefault/)
  end

А также добавил это в начало файла, внутри блока before do:

stub_request(:get, "https://www.youtube.com/shorts/wi2jAtpBl0Y").to_return(status: 200, body: onebox_response("youtube-shorts"))`

Я запустил тесты командой bin/rspec spec/lib/onebox/engine/youtube_onebox_spec.rb, но добавленный тест не проходит.

Сейчас у меня нет сообщения об ошибке, да и ближайшие несколько часов я буду занят.

Теперь работает:

https://www.youtube.com/shorts/kt7jiaGVsto

1 лайк