lib\onebox\engine\video_onebox.rb ファイルを編集して、末尾が m3u8 のリンクを解析できるようにしました。
しかし、外部サイトから m3u8 リンクを貼り付けると、動画が正しく解析されません。
ウェブサイトにファイルをアップロードし、そのサイトから m3u8 リンクを取得して返信ボックスに貼り付け、ページを更新すると、動画は完璧に再生されます。ただし、onebox にはいくつかのスタイリングの問題があります。
編集したコードは次のとおりです。
if file_extension == '.m3u8'
m3u8_html_tag(escaped_url)
else
# Set type attribute based on file extension
type_attribute = case file_extension
when '.mov'
'video/quicktime'
when '.mp4'
'video/mp4'
when '.webm'
'video/webm'
when '.ogv'
'video/ogg'
else
''
end
source_tag = "<source src='#{escaped_url}'"
source_tag += " type='#{type_attribute}'" unless type_attribute.empty?
source_tag += '>'
<<-HTML
<div class="onebox video-onebox">
<video class="video-js" controls #{@options[:disable_media_download_controls] ? 'controlslist="nodownload"' : ""}>
#{source_tag}
<a href='#{escaped_url}'>#{@url}</a>
</video>
</div>
HTML
end
end
def m3u8_html_tag(url)
<<-HTML
<div>
<script src="https://hezheng-fmm.obs.cn-north-4.myhuaweicloud.com/jsdeliver/videojs/video.min.js"></script>
<link href="https://hezheng-fmm.obs.cn-north-4.myhuaweicloud.com/jsdeliver/videojs/video-js.css" rel="stylesheet">
<video class="video-js" controls>
<source src='#{url}' type='application/x-mpegURL'>
</video>
</div>
HTML
end
私のプロセスをビデオで示します。
「いいね!」 1
VideoJS を使用してストリーミングビデオの再生に成功しました。このスレッドはこれで終了します。
「いいね!」 1
素晴らしい!他のユーザーのためにも、ここに解決策を共有していただけますか?
「いいね!」 2
ファイルを編集します lib/onebox/engine/video_onebox.rb
変更を test-passed ブランチにマージする必要があります。
# frozen_string_literal: true
module Onebox
module Engine
class VideoOnebox
include Engine
# m3u8ファイルへのマッチングを追加
matches_regexp(%r{^(https?:)?//.*\\.(mov|mp4|webm|ogv|m3u8)(\\?.*)?$}i)
def always_https?
AllowlistedGenericOnebox.host_matches(uri, AllowlistedGenericOnebox.https_hosts)
end
def to_html
# m3u8ファイルかどうかを判断し、もしそうならVideo.js用のHTMLテンプレートを使用する
if @url.match(%r{\\.m3u8$})
# タイムスタンプを取得し、8桁のランダムな数字を追加する
randomId = Time.now.to_i.to_s + rand(100000000).to_s
video_tag_html = <<-'HTML'
<div class="onebox video-onebox videoWrap">
<video id='#{randomId}' class="video-js vjs-default-skin vjs-16-9" controls preload="auto" width="100%" data-setup='{"fluid": true}'>
<source src="#{@url}" type="application/x-mpegURL">
</video>
</div>
HTML
else
# m3u8ファイル以外の処理に関する元のコードは変更しない
escaped_url = ::Onebox::Helpers.normalize_url_for_output(@url)
video_tag_html = <<-'HTML'
<div class="onebox video-onebox">
<video width='100%' height='100%' controls #{@options[:disable_media_download_controls] ? 'controlslist="nodownload"' : ""}>
<source src='#{escaped_url}'>
<a href='#{escaped_url}'>#{@url}</a>
</video>
</div>
HTML
end
video_tag_html
end
def placeholder_html
SiteSetting.enable_diffhtml_preview ? to_html : ::Onebox::Helpers.video_placeholder_html
end
end
end
end
Dockerイメージを再構築します。
プロジェクト discourse_docker で image\base\slim.Dockerfile ファイルを編集し、# Discourse specific bits を検索して、GitHubリンクを編集したプロジェクトに変更します。
イメージを再構築し、dockerhubにプッシュします。[] 内の単語を変更します。
docker build --no-cache -t mydiscourse -f slim.Dockerfile .
docker tag mydiscourse:latest [your dockerhub name]/[your image name]:[your image tag]
docker push [your dockerhub name]/[your image name]:[your image tag]
launcher の95行目を変更します。
image="[your dockerhub name]/[your image name]:[your image tag]"
その後、アプリを再構築します。
./launcher rebuild app
テーマを編集します。
カスタマイズ → テーマ → カスタムCSS/HTML → CSS/HTMLの編集
(このボタンがない場合は、テーマをエクスポートしてからデバイスからインストールする必要があります。)
ヘッドにvideojsを追加します。
<link href="https://vjs.zencdn.net/8.10.0/video-js.css" rel="stylesheet" />
<script src="https://vjs.zencdn.net/8.10.0/video.min.js"></script></script>
ボディにスクリプトを追加します。
<script>
setTimeout(() => {
const domList = document.querySelectorAll('.video-js');
console.log(domList,'==domList');
domList.forEach((ele, i) => {
const videoElement = domList[i];
const player = videojs(videoElement); // DOM要素をvideojs()に渡す
player.ready(function() {
console.log("Player is ready!");
});
});
}, 200);
</script>
CSPを有効にしている場合は、content security policy script src 設定を編集する必要があります。
「いいね!」 1
タイトルを「Onebox parser m3u8 link and play with videojs」に変更してもよろしいでしょうか?
「いいね!」 1
system
(system)
クローズされました:
6
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.