Appearance
kapp.medias
Placement horizontal et vertical
Un média de préférence garde position: {x,y,w,h,portrait?: {x,y,w,h}|null}. playMedia et KMedia résolvent ce placement et déplacent les images/vidéos en cours sans recommencer la lecture. Sans variante, le placement horizontal est réduit et centré. Une écriture omettant portrait conserve la variante ; portrait:null la supprime. Fichier, volume et timeline restent communs. Voir le guide vertical.
Les positions explicites des options de lecture, de playImage/playVideo ou de setPosition utilisent les pixels logiques du cadre courant, sans conversion automatique. Le parent applique déjà le zoom. Ne multipliez pas par kapp.overlay.layout.scale.
Jouer des sons, images et vidéos sur l'overlay. Pluriel : kapp.medias (pas kapp.media).
Service partagé appli + widget : API identique.
Quand l'utiliser (vs alternative)
- Préfère
kapp.medias.*à un<audio>/<video>brut en HTML : c'est routé vers le bon contexte overlay et géré par le moteur. - Pour jouer un média déjà uploadé sur le channel : récupère son chemin (
kapp.medias.get(name).path, ou l'outillist_channel_mediascôté agent widget), puis passe-le àplayAudio/playImage/playVideo.
Méthodes
playAudio(source: string, volume = 50, effects: KAudioEffect[] = []): Promise<KAudio>— joue un son.volume0-100. async.playImage(source: string, position = {}): Promise<KImage>— affiche une image.position:{x?, y?, w?, h?}(px). async.playVideo(source: string, volume = 50, position = {}): Promise<KVideo>— joue une vidéo. async.playMedia(media: MediaData, options = {}): Promise<KMedia>— avancé :media= objetMediaDatacomplet ({file, volume, position, timeline}), pas un simple chemin.get(name: string): Promise<ChannelMediaFileData | null>— métadonnées d'un média du channel par nom ({path, name, type, extension, …}). async.all(): Promise<ChannelMediaFileData[]>— tous les médias du channel. async.library(): Promise<LibraryMediaFileData[]>— tous les assets publiés de la bibliothèque publique Kappapps. async.getLibrary(slug: string): Promise<LibraryMediaFileData | null>— un asset public par son slug (identifiant stable, ex.kapp-ding).nullsi inconnu ou dépublié. async.playLibrary(slug: string, options = {}): Promise<KMedia | null>— joue directement un asset public par slug (son/vidéo/image selon son type).nullsi le slug ne résout pas. async.
Timeline
timeline.startAtettimeline.endAtsont exprimés en millisecondes.- Sans
endAt, un son ou une vidéo va jusqu'à sa fin naturelle ; une image reste affichée jusqu'àstop()ou jusqu'à la fermeture du widget. - Une fin nulle, négative ou antérieure au début est ignorée afin de ne jamais créer un média de durée nulle.
Bibliothèque publique Kappapps
Des assets prêts à l'emploi (soundboards, images, vidéos) fournis par Kappapps, jouables sur n'importe quel channel sans aucun upload — l'asset est servi directement depuis le CDN, il n'est pas copié chez le streamer.
LibraryMediaFileData = ChannelMediaFileData + {slug, category, tags}. Le slug est l'identifiant stable à utiliser dans le code et dans les prefs.
js
// Jouer un son de la bibliothèque publique
await kapp.medias.playLibrary('kapp-ding', { volume: 70 });
// Parcourir le catalogue (assets publiés uniquement)
const sounds = (await kapp.medias.library()).filter(a => a.type === 'sounds');Un item de préférence mediaFile peut aussi avoir un asset public comme valeur par défaut (default: { library: 'kapp-ding' }) — voir preferences.md.
KAudioEffect (tableau d'effets pour playAudio) : radio, echo, slow, fast, left, right, half_speed, double_speed, double_pitch, half_pitch, neighbor, reverb, robot, disto, high, low.
Exemple (V2, exécutable)
js
// Joue un son existant du channel à 70% + un effet radio
const media = await kapp.medias.get('coin');
if (media) {
await kapp.medias.playAudio(media.path, 70, ['radio']);
}Pièges
- C'est
playAudio/playImage/playVideoqui prennent un chemin (string).playMediaprend un objetMediaDatacomplet — ne lui passe pas le résultat brut deget()sans le wrapper. source= lepathrenvoyé parkapp.medias.get(name).path. N'invente pas de chemin.volumeest sur 0-100.- Slug ≠ name :
get(name)cherche dans les médias du channel par nom de fichier ;getLibrary(slug)/playLibrary(slug)cherchent dans la bibliothèque publique par slug. Ne les mélange pas. playLibraryrenvoienull(pas d'exception) si le slug est inconnu ou dépublié — gère ce cas.- Un asset dépublié disparaît de
library()/getLibrary()mais reste jouable via une pref qui le référençait déjà. - V1 mort :
kapp.playMedia(file)/kapp.media.play({url, volume})n'existent plus.