Ir para o conteúdo
星罗
Pesquisar
Alternar idioma
Voltar

Reprodutores de Mídia

3 min de leitura Editar no GitHub

Xingluo integra APlayer (áudio) e DPlayer (vídeo), suportando duas maneiras de criar players em Markdown e MDX, todos com carregamento tardio.

Ativação

Alterne cada player conforme necessário em features.players no xingluo.config.ts:

ts
features: { players: { aplayer: true, // Ativar player de áudio APlayer dplayer: true, // Ativar player de vídeo DPlayer }, }

Os dois são independentes. Quando desativados:

  • O plugin remarkPlayers não é injetado (cercas MD não são analisadas)
  • O script do player cliente não é carregado
  • A saída da build não tem chunks aplayer / dplayer

Dois Modos de Uso

ModoAplicável aSintaxe
MD fence.md e .mdx simples```aplayer / ```dplayer + corpo de configuração JSON
Componente MDXApenas .mdximport { APlayer, DPlayer } from "@/components/mdx"

Ambos os modos produzem a mesma estrutura de div placeholder (<div class="xng-aplayer|xng-dplayer" data-config>), carregada tardiamente e instanciada por src/scripts/players.ts.

Player de Áudio APlayer

MD Fence

markdown
```aplayer { "audio": [ { "name": "Song", "artist": "Artist", "url": "/audio/song.mp3", "cover": "/images/cover.jpg", "lrc": "[00:00.00] First lyric line" } ], "theme": "#b7daff", "loop": "all", "autoplay": false } ```

MDX Component

mdx
import { APlayer } from "@/components/mdx"; <APlayer audio={[ { name: "Song", artist: "Artist", url: "/audio/song.mp3", cover: "/images/cover.jpg", }, ]} theme="#b7daff" loop="all" />

Opções

CampoTipoPadrãoNotas
audioAudio | Audio[]obrigatórioObjeto de áudio ou lista
themestring#b7daffCor do tema do player
loop"all" | "one" | "none"allModo de repetição
order"list" | "random"listOrdem de reprodução
volumenumber0.7Volume inicial (0–1)
autoplaybooleanfalseReprodução automática (sujeita à política do navegador)
listFoldedbooleanfalseLista recolhida
listMaxHeightstring—Altura máxima da lista (valor CSS)
lrcType0 | 1 | 2 | 30Tipo de letra: 0 nenhum / 1 string / 2 URL

Objeto audio

CampoNotas
nameNome da faixa (recorre a title, depois 'Audio name')
artistArtista (recorre a author)
urlURL de áudio (obrigatório)
coverCapa (recorre a pic)
lrcLetra (string ou URL, combinado com lrcType)
themeCor do tema por faixa
typeTipo de áudio: auto | hls | normal

DPlayer Video Player

MD Fence

markdown
```dplayer { "video": { "url": "/videos/demo.mp4", "pic": "/images/video-cover.jpg", "type": "auto" }, "theme": "#b7daff", "autoplay": false, "loop": false } ```

MDX Component

mdx
import { DPlayer } from "@/components/mdx"; <DPlayer video={{ url: "/videos/demo.mp4", pic: "/images/video-cover.jpg" }} theme="#b7daff" subtitle={{ url: "/subtitles.vtt", type: "webvtt" }} />

Opções

CampoTipoPadrãoNotas
videoVideoobrigatórioConfiguração de vídeo
themestring#b7daffCor do tema
autoplaybooleanfalseReprodução automática
loopbooleanfalseReprodução em loop
screenshotbooleanfalseFunção de captura
hotkeybooleantrueAtalhos de teclado
preload"none" | "metadata" | "auto"autoPré-carregamento
volumenumber0.7Volume inicial
playbackSpeednumber[]—Lista de velocidades
subtitleSubtitle—Legendas
danmakuDanmaku—Danmaku (comentários animados)
livebooleanfalseModo ao vivo
mutexbooleantrueMutex (apenas um player por página)

Objeto video

CampoNotas
urlURL do vídeo (obrigatório)
picCapa
thumbnailsURL de miniaturas
typeTipo de vídeo: auto | hls | flv | dash | normal
qualityLista de qualidade + índice defaultQuality

Objeto subtitle

CampoNotas
urlURL da legenda (obrigatório)
typewebvtt | ass
fontSizeTamanho da fonte
bottomDistância do fundo
colorCor

Objeto danmaku

CampoNotas
idID único do pool danmaku (obrigatório)
apiURL da API danmaku (obrigatório)
userIdentificador de usuário
maximumMáximo de danmaku

Lazy Loading Mechanism

Players are lazy-loaded via IntersectionObserver: the placeholder div dynamically imports the player module and styles and instantiates only when within 200px of the viewport.

  • APlayer: dynamic import("aplayer") + import("aplayer/dist/APlayer.min.css")
  • DPlayer: dynamic import("dplayer") (styles are inlined in JS; no separate CSS needed)

Module loading uses a shared Promise cache to avoid repeated dynamic imports. Re-instantiation is prevented via dataset markers (xng-init, xng-observed).

View Transitions Adaptation

The player script listens for astro:page-load and re-scans placeholder divs after each page load. After a View Transitions page switch, the new page’s player placeholders are re-observed and lazy-loaded.

Performance

  • Pacote zero quando os players estão desativados (plugin remark não injetado, script do cliente não carregado)
  • Runtime zero quando ativado mas sem players na página (script carrega mas não instancia)
  • Módulos de player são chunks independentes, carregados sob demanda apenas nas páginas que os usam
  • CSS e JS são importados separadamente para garantir que os estilos estejam prontos antes da instanciação

Declarações de tipo

APlayer e DPlayer não têm tipos TypeScript oficiais; o Xingluo fornece declarações de módulo flexíveis em src/types/aplayer.d.ts e src/types/dplayer.d.ts, com campos de opções definidos como opcionais para compatibilidade com spread. Os componentes MDX têm restrições de tipo completas nas Props.


Artigos relacionados

  • Implantação

    2 min de leitura

    Guia de implantação do Xingluo cobrindo plataformas de hospedagem estática (Netlify/Vercel/GitHub Pages), auto-hospedagem Nginx, Docker e variáveis de ambiente.

  • Busca

    1 min de leitura

    Guia de busca do Xingluo cobrindo integração de busca de texto completo Flexsearch, geração de índices, UI, busca multilíngue e desempenho.