# Analisador Onebox de link m3u8 e reprodução com videojs

**URL:** https://meta.discourse.org/t/onebox-parser-m3u8-link-and-play-with-videojs/296426
**Category:** Development
**Tags:** onebox
**Created:** [Fevereiro 23, 2024, 4:26am UTC](https://meta.discourse.org/t/onebox-parser-m3u8-link-and-play-with-videojs/296426 "2024-02-23T04:26:20Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![Creatures\_Prehistori](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/creatures_prehistori/32/329607_2.png) [@Creatures\_Prehistori](https://meta.discourse.org/u/Creatures_Prehistori)
#### Post date: [Fevereiro 23, 2024, 4:26am UTC](https://meta.discourse.org/t/onebox-parser-m3u8-link-and-play-with-videojs/296426/1 "2024-02-23T04:26:20Z")

</div>

Editei o arquivo `lib\\onebox\\engine\\video_onebox.rb` para analisar links que terminam em `m3u8`.

No entanto, quando colo um link m3u8 de um site externo, o vídeo não é analisado corretamente.

Se eu faço upload de um arquivo para o site, obtenho um link m3u8 desse site e, em seguida, o colo na caixa de resposta e atualizo a página, o vídeo é reproduzido perfeitamente. No entanto, há alguns problemas de estilo com o onebox.

Aqui está o código que editei.

```plaintext
        if file_extension == '.m3u8'
          m3u8_html_tag(escaped_url)
        else
          # Define o atributo type com base na extensão do arquivo
          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

```

Aqui está um vídeo do meu processo.

---

<div class="post-metadata">

### Author: ![Creatures\_Prehistori](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/creatures_prehistori/32/329607_2.png) [@Creatures\_Prehistori](https://meta.discourse.org/u/Creatures_Prehistori)
#### Post date: [Fevereiro 26, 2024, 1:31am UTC](https://meta.discourse.org/t/onebox-parser-m3u8-link-and-play-with-videojs/296426/2 "2024-02-26T01:31:39Z")

</div>

Consegui utilizar o VideoJS com sucesso para a reprodução de streaming de vídeo. Este tópico está agora encerrado.

---

<div class="post-metadata">

### Author: ![Arkshine](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/arkshine/32/298682_2.png) [@Arkshine](https://meta.discourse.org/u/Arkshine)
#### Post date: [Fevereiro 26, 2024, 1:34am UTC](https://meta.discourse.org/t/onebox-parser-m3u8-link-and-play-with-videojs/296426/3 "2024-02-26T01:34:11Z")

</div>

Ótimo! Você acha que poderia compartilhar a solução aqui, isso seria útil para outros usuários. 👍

---

<div class="post-metadata">

### Author: ![Creatures\_Prehistori](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/creatures_prehistori/32/329607_2.png) [@Creatures\_Prehistori](https://meta.discourse.org/u/Creatures_Prehistori)
#### Post date: [Fevereiro 26, 2024, 5:56am UTC](https://meta.discourse.org/t/onebox-parser-m3u8-link-and-play-with-videojs/296426/4 "2024-02-26T05:56:21Z")

</div>

edite este arquivo `lib/onebox/engine/video_onebox.rb`  
você deve mesclar a alteração no branch `test-passed`.

```plaintext
# frozen_string_literal: true

module Onebox
  module Engine
    class VideoOnebox
      include Engine
      # Adiciona correspondência para arquivos 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
        # Verifica se é um arquivo m3u8, se for, usa o template HTML para Video.js
        if @url.match(%r{\\.m3u8$})
          # Obtém o timestamp e adiciona um número aleatório de oito dígitos
          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
          # O código original para lidar com arquivos não-m3u8 permanece o mesmo
          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

```

* * *

Reconstrua a imagem docker:  
No projeto `discourse_docker`, edite o arquivo `image\\base\\slim.Dockerfile`, procure por `# Discourse specific bits\n` e altere o link do github para o seu projeto editado.

* * *

reconstrua a imagem e envie para o dockerhub. altere a palavra entre colchetes `[]`.

```plaintext
docker build --no-cache -t mydiscourse -f slim.Dockerfile .
docker tag mydiscourse:latest [seu nome de usuário do dockerhub]/[nome da sua imagem]:[sua tag de imagem]
docker push [seu nome de usuário do dockerhub]/[nome da sua imagem]:[sua tag de imagem]

```

* * *

altere a linha 95 do `launcher`:

```plaintext
image="[seu nome de usuário do dockerhub]/[nome da sua imagem]:[sua tag de imagem]"

```

então reconstrua o app

```plaintext
./launcher rebuild app

```

* * *

edite o tema:  
Personalizar → Temas → CSS/HTML Personalizado → Editar CSS/HTML  
(Se você não tiver este botão, terá que exportar seu tema e depois instalá-lo do seu dispositivo.)

adicione videojs no head:

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

```

adicione script no Body:

```plaintext
<script>
    setTimeout(() => {
        const domList = document.querySelectorAll('.video-js');
        console.log(domList,'==domList');
        domList.forEach((ele, i) => {
            const videoElement = domList[i];
            const player = videojs(videoElement); // passa o elemento DOM para videojs()
            player.ready(function() {
                console.log("Player is ready!");
            });
        });
    }, 200);
</script>

```

* * *

se você habilitar CSP, deverá editar a configuração `content security policy script src`.

---

<div class="post-metadata">

### Author: ![Creatures\_Prehistori](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/creatures_prehistori/32/329607_2.png) [@Creatures\_Prehistori](https://meta.discourse.org/u/Creatures_Prehistori)
#### Post date: [Fevereiro 26, 2024, 9:39am UTC](https://meta.discourse.org/t/onebox-parser-m3u8-link-and-play-with-videojs/296426/5 "2024-02-26T09:39:25Z")

</div>

Posso alterar o título para: `Onebox parser m3u8 link and play with videojs`?

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [Março 27, 2024, 9:39am UTC](https://meta.discourse.org/t/onebox-parser-m3u8-link-and-play-with-videojs/296426/6 "2024-03-27T09:39:42Z")

</div>

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