Youtube "短"视频类型嵌入/oneboxing不起作用

您好!

YouTube 视频嵌入在我的论坛上有效,但短视频(URL 中带有 /shorts/ 的视频)无效,例如这个:

onebox 请求返回 404 错误。

常规 YouTube 视频嵌入有效。
我在 try.discourse 或 meta 上没有遇到此问题。
我猜是某个站点设置配置不当。

有什么线索吗?


Youtube oneboxing是我们创建的自定义功能。有人需要提交一个 pr-welcome 来兼容 shorts。暂时移至 Feature

在此期间,您可以随时将手动 iframe URL 添加到 allowed iframes 站点设置中:

不过这确实是个高个子 :rofl:

3 个赞

也许是因为服务器的位置,就像这里一样 Youtube embeddings have stopped working for servers in Europe

1 个赞

感谢您的澄清!

您能否告诉我应该在允许的 iframe 中添加哪个 URL 才能像您一样显示视频?即使它确实很高,目前也能完美地完成工作。


至于视频高度,可以通过在 iframe 上设置 CSS max-height 来减小其高度。问题是 iframe 没有任何属性可以指定它是短(垂直)视频。 :confused:

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

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

谢谢你,Falco。

我想我明白了,但我还是有点困惑。

所以,我已将此 URL 添加到允许的 iframe 中。

然后,我该怎么做才能让视频显示出来?

如果我在帖子中写 https://www.youtube.com/shorts/SWeTMdyv50Q,它将不起作用。
如果我写 <iframe>https://www.youtube.com/shorts/SWeTMdyv50Q</iframe>,它将不起作用。
如果我写 https://www.youtube.com/embed/SWeTMdyv50Q,它将起作用,但会以标准的 YouTube 视频宽高比显示短视频(这对我来说没问题,尽管我更希望有另一个宽高比,而不必手动在 URL 中写“embed”):

右键单击一个 Shorts 视频,然后选择“复制嵌入代码”。这就是我所说的“手动嵌入代码”,抱歉我没有说清楚。

2 个赞

另外,将 /shorts/ 替换为 watch?v=,也就是 YouTube 视频的默认 URL,也可以。

因此,在 YouTube 上,对于 https://www.youtube.com/shorts/SWeTMdyv50Q,右键单击 → 复制视频 URL 将会起作用,因为它会返回 https://youtu.be/SWeTMdyv50Q,这在 Discourse 上可以正确显示(但比例是常规的宽比例)。

2 个赞

我不是开发者,但我猜想类似这样的东西可能会让 pr-welcome 对开发者来说更容易?

2 个赞

我虽然做完了,但我可能在我的拉取请求(pull request)中搞砸了一些东西,因为不知何故,我还不习惯 GitHub……我真的需要阅读手册(而且,一位朋友告诉我,需要从我的 Discourse 分叉(fork)创建分支……)::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 有了新的 /shorts/ URL,人们会复制粘贴这些 /shorts/ 链接,而 Youtube 的 oneboxing 还不支持它们。

/embed/ 链接是支持的,但它们需要用户实际在 Youtube 中查找 embed URL,而几乎没有人会这样做 :thinking:

1 个赞

我只是想知道,直接更改网址是否会更容易?因为 youtube.com/shorts/somethingyoutube.com/embed/something 完全相同,而且使用 /embed/ 可以正常进行 oneboxing/embedding。

https://youtube.com/shorts/aQFdwUeZxkA 不起作用:

但是 https://youtube.com/embed/aQFdwUeZxkA 可以工作:

我还是不明白你的意思。谁会更改网址?发帖人?但发帖人不想手动重写网址的一部分(他们甚至不知道为什么视频无法嵌入),他们只想复制粘贴,然后就可以了。


编辑:或者你的意思是 Discourse 的 Oneboxing 代码会将 /shorts/ 替换为 /embed/

是的,也许吧!我不是一个代码大师 :smile:

是的。我一点代码都不会写,但我可以想象这并不难 :wink:

2 个赞

这两种方式的最终结果相同,对吗?这样短视频就可以很好地嵌入并具有播放功能了?

嗯……我不确定我是否理解。 :sweat_smile:

  1. http://youtu.be/SWeTMdyv50Q 会导向

这三种不同的链接格式在 YouTube 上会显示不同的内容。

无论 URL 格式如何,代码只关心视频 ID:

代码目前不支持 /shorts/,并且有多种方法可以实现。

我作为一个编程新手,建议复制这部分:

并将 embed 替换为 shorts。我在我的开发环境中试过了,效果完美。

如果有什么更优雅的方法,我很乐意知道 :slight_smile:

2 个赞

干得漂亮 @Canapin :clap:

你想为此提交一个拉取请求吗?

是的,我只是在为 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 个赞