Zum Inhalt springen
星罗
Suche
Sprache wechseln
Zurück

Medienplayer

3 Min. Lesezeit Auf GitHub bearbeiten

Xingluo integriert APlayer (Audio) und DPlayer (Video) und unterstützt zwei Möglichkeiten, Player in Markdown und MDX zu erstellen, alle lazy-geladen.

Aktivierung

Schalten Sie jeden Player nach Bedarf in features.players in xingluo.config.ts um:

ts
features: { players: { aplayer: true, // APlayer-Audioplayer aktivieren dplayer: true, // DPlayer-Videoplayer aktivieren }, }

Die beiden sind unabhängig. Bei Deaktivierung:

  • Das remarkPlayers-Plugin wird nicht injiziert (MD-Fences werden nicht geparst)
  • Das Player-Client-Skript wird nicht geladen
  • Die Build-Ausgabe enthält keine APlayer-/DPlayer-Chunks

Zwei Verwendungsmodi

ModusAnwendbar aufSyntax
MD-FenceReine .md und .mdx```aplayer / ```dplayer + JSON-Konfiguration
MDX-KomponenteNur .mdximport { APlayer, DPlayer } from "@/components/mdx"

Beide Modi geben letztendlich dieselbe Platzhalter-div-Struktur aus (<div class="xng-aplayer|xng-dplayer" data-config>), lazy-geladen und instanziiert von src/scripts/players.ts.

APlayer-Audioplayer

MD-Fence

markdown
```aplayer { "audio": [ { "name": "Titel", "artist": "Künstler", "url": "/audio/song.mp3", "cover": "/images/cover.jpg", "lrc": "[00:00.00] Erste Textzeile" } ], "theme": "#b7daff", "loop": "all", "autoplay": false } ```

MDX-Komponente

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

Optionen

FeldTypStandardHinweise
audioAudio | Audio[]erforderl.Audio-Objekt oder -Liste
themestring#b7daffPlayer-Designfarbe
loop"all" | "one" | "none"allWiederholungsmodus
order"list" | "random"listWiedergabereihenfolge
volumenumber0.7Startlautstärke (0–1)
autoplaybooleanfalseAutom. Wiedergabe (Browser-Richtlinie)
listFoldedbooleanfalseListe eingeklappt
listMaxHeightstring—Maximale Listen-Höhe (CSS-Wert)
lrcType0 | 1 | 2 | 30Liedtext-Typ: 0 kein / 1 String / 2 URL

audio-Objekt

FeldHinweise
nameTitel (Fallback auf title, dann 'Audio name')
artistKünstler (Fallback auf author)
urlAudio-URL (erforderlich)
coverCover (Fallback auf pic)
lrcLiedtext (String oder URL, mit lrcType)
themeTitel-spezifische Designfarbe
typeAudio-Typ: auto | hls | normal

DPlayer-Videoplayer

MD-Fence

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

MDX-Komponente

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" }} />

Optionen

FeldTypStandardHinweise
videoVideoerforderl.Video-Konfiguration
themestring#b7daffDesignfarbe
autoplaybooleanfalseAutom. Wiedergabe
loopbooleanfalseWiederholung
screenshotbooleanfalseScreenshot-Funktion
hotkeybooleantrueTastenkürzel
preload"none" | "metadata" | "auto"autoVorladen
volumenumber0.7Startlautstärke
playbackSpeednumber[]—Geschwindigkeitsliste
subtitleSubtitle—Untertitel
danmakuDanmaku—Danmaku (Bullet-Kommentare)
livebooleanfalseLive-Modus
mutexbooleantrueMutex (nur ein Player pro Seite)

video-Objekt

FeldHinweise
urlVideo-URL (erforderlich)
picCover
thumbnailsThumbnail-URL
typeVideo-Typ: auto | hls | flv | dash | normal
qualityQualitätsliste + defaultQuality-Index

subtitle-Objekt

FeldHinweise
urlUntertitel-URL (erforderl.)
typewebvtt | ass
fontSizeSchriftgröße
bottomAbstand von unten
colorFarbe

danmaku-Objekt

FeldHinweise
idEindeutige Danmaku-Pool-ID (erford.)
apiDanmaku-API-URL (erforderlich)
userBenutzerkennung
maximumMaximale Danmaku-Anzahl

Lazy-Loading-Mechanismus

Player werden über IntersectionObserver lazy-geladen: Die Platzhalter-div importiert dynamisch das Player-Modul und die Styles und instanziiert nur, wenn sie innerhalb von 200px des Viewports ist.

  • APlayer: dynamisch import("aplayer") + import("aplayer/dist/APlayer.min.css")
  • DPlayer: dynamisch import("dplayer") (Styles sind in JS eingebettet; kein separates CSS erforderlich)

Das Modulladen verwendet einen gemeinsamen Promise-Cache, um wiederholte dynamische Importe zu vermeiden. Eine erneute Instanziierung wird über dataset-Marker (xng-init, xng-observed) verhindert.

View Transitions-Anpassung

Das Player-Skript lauscht auf astro:page-load und scannt Platzhalter-divs nach jedem Seitenladen erneut. Nach einem View-Transitions-Seitenwechsel werden die Player-Platzhalter der neuen Seite erneut beobachtet und lazy-geladen.

Leistung

  • Kein Bundle bei deaktivierten Playern (remark-Plugin nicht injiziert, Client-Skript nicht geladen)
  • Keine Laufzeit bei aktivierten, aber keinen Playern auf einer Seite (Skript wird geladen, aber nicht instanziiert)
  • Player-Module sind eigenständige Chunks, die nur bei Bedarf auf Seiten geladen werden, die sie verwenden
  • CSS und JS werden getrennt importiert, um sicherzustellen, dass Styles vor der Instanziierung bereit sind

Typdeklarationen

APlayer und DPlayer haben keine offiziellen TypeScript-Typen; Xingluo bietet lockere Moduldeklarationen in src/types/aplayer.d.ts und src/types/dplayer.d.ts, Optionsfelder sind als optional für Spread-Kompatibilität gesetzt. MDX-Komponenten-Props haben vollständige Typbeschränkungen.


Verwandte Beiträge

  • Bereitstellung

    2 Min. Lesezeit

    Bereitstellungsleitfaden für Xingluo mit statischen Hosting-Plattformen (Netlify/Vercel/GitHub Pages), Nginx-Self-Hosting, Docker und Umgebungsvariablen.

  • Suche

    1 Min. Lesezeit

    Suchleitfaden für Xingluo mit Flexsearch-Volltextsuche-Integration, Indexgenerierung, UI, mehrsprachiger Suche und Leistung.