Onebox Parser m3u8 Link und Wiedergabe mit videojs

Ich bearbeite die Datei lib\\onebox\\engine\\video_onebox.rb, um Links zu parsen, die auf m3u8 enden.

Wenn ich jedoch den m3u8-Link von einer externen Website einfüge, wird das Video nicht korrekt geparst.

Wenn ich eine Datei auf die Website hochlade, einen m3u8-Link von dieser Website abrufe und ihn dann in das Antwortfeld einfüge und die Seite aktualisiere, wird das Video perfekt abgespielt. Es gibt jedoch einige Styling-Probleme mit der Onebox.

Hier ist der Code, den ich bearbeitet habe.

        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

Hier ist ein Video meines Prozesses.

Ich habe VideoJS erfolgreich für die Videowiedergabe genutzt. Dieser Thread ist nun geschlossen.

Großartig! Glauben Sie, Sie könnten die Lösung hier teilen, das wäre hilfreich für andere Benutzer. :+1:

Bearbeiten Sie diese Datei lib/onebox/engine/video_onebox.rb
Sie sollten die Änderung in den test-passed-Branch integrieren.

# frozen_string_literal: true

module Onebox
  module Engine
    class VideoOnebox
      include Engine
      # Fügt eine Übereinstimmung für m3u8-Dateien hinzu
      matches_regexp(%r{^(https?:)?//.*\\.(mov|mp4|webm|ogv|m3u8)(\\?.*)?$}i)
      def always_https?
        AllowlistedGenericOnebox.host_matches(uri, AllowlistedGenericOnebox.https_hosts)
      end
      def to_html
        # Prüft, ob es sich um eine m3u8-Datei handelt. Wenn ja, wird die HTML-Vorlage für Video.js verwendet.
        if @url.match(%r{\\.m3u8$})
          # Ruft den Zeitstempel ab und fügt eine achtstellige Zufallszahl hinzu
          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
          # Der ursprüngliche Code zur Verarbeitung von Nicht-m3u8-Dateien bleibt unverändert
          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-Image neu erstellen:
Bearbeiten Sie in Ihrem Projekt discourse_docker die Datei image\base\slim.Dockerfile, suchen Sie nach # Discourse specific bits und ändern Sie den GitHub-Link zu Ihrem bearbeiteten Projekt.


Image neu erstellen und nach Dockerhub pushen. Ändern Sie die Wörter in den [].

docker build --no-cache -t mydiscourse -f slim.Dockerfile .
docker tag mydiscourse:latest [Ihr Dockerhub-Name]/[Ihr Image-Name]:[Ihr Image-Tag]
docker push [Ihr Dockerhub-Name]/[Ihr Image-Name]:[Ihr Image-Tag]

Ändern Sie Zeile 95 in launcher:

image="[Ihr Dockerhub-Name]/[Ihr Image-Name]:[Ihr Image-Tag]"

Bauen Sie dann die App neu auf

./launcher rebuild app

Theme bearbeiten:
Anpassen → Themes → Benutzerdefiniertes CSS/HTML → CSS/HTML bearbeiten
(Wenn Sie diese Schaltfläche nicht haben, müssen Sie Ihr Theme exportieren und es dann von Ihrem Gerät aus installieren.)

Fügen Sie Video.js in den Kopfbereich ein:

<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>

Fügen Sie Skript in den Body ein:

<script>
    setTimeout(() => {
        const domList =  document.querySelectorAll('.video-js');
        console.log(domList,'==domList');
        domList.forEach((ele, i) => {
            const videoElement = domList[i];
            const player = videojs(videoElement); // Übergeben Sie das DOM-Element an videojs()
            player.ready(function() {
                console.log("Player is ready!");
            });
        });
    }, 200);
</script>

Wenn Sie CSP aktivieren, sollten Sie die Einstellung content security policy script src bearbeiten.

Kann ich den Titel ändern in: Onebox-Parser m3u8-Link und Wiedergabe mit videojs?