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.

1 „Gefällt mir“

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

1 „Gefällt mir“

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

2 „Gefällt mir“

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.

1 „Gefällt mir“

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

1 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.