🛠️ Moonlight Developer Docs
Integruj nasze odtwarzacze muzyczne z własną stroną
🚀 Quick Start Guide
1. Podstawowa integracja
Dodaj nasze pliki do swojej strony i stwórz odtwarzacz w kilku linijkach:
<!-- Dodaj style CSS -->
<link rel="stylesheet" href="https://moonlight.app/css/moonlight-music-player-light.css">
<!-- Kontener dla playera -->
<div id="music-player"></div>
<!-- Dodaj skrypt -->
<script src="https://moonlight.app/js/MoonlightMusicPlayerLight.js"></script>
<script>
// Utwórz odtwarzacz
const player = new MoonlightMusicPlayerLight('#music-player', {
height: 120,
showDownload: true,
showShare: true
});
// Załaduj utwór
player.loadTrack({
id: 123,
title: "Nazwa utworu",
artist: "Nazwa artysty",
audioUrl: "https://moonlight.app/api/music/tracks/123/stream",
waveform: [0.2, 0.5, 0.8, 0.3, 0.7, ...], // opcjonalne
moonlightUrl: "https://moonlight.app/music/tracks/123" // link powrotu
});
</script>
✅ Gotowe! Twoja strona ma teraz pełnofunkcjonalny odtwarzacz muzyczny z Moonlight.
🎵 Moonlight Music Player Light
🎬 Live Demo
⚙️ Opcje konfiguracji
| Opcja | Typ | Domyślna | Opis |
|---|---|---|---|
| height | number | 120 | Wysokość playera w pikselach |
| showDownload | boolean | true | Pokazuj przycisk pobierania |
| showShare | boolean | true | Pokazuj przycisk udostępniania |
| showVolumeControl | boolean | true | Pokazuj kontrolę głośności |
| compactMode | boolean | false | Tryb kompaktowy dla małych przestrzeni |
| autoPlay | boolean | false | Automatyczne odtwaranie po załadowaniu |
📋 Format danych utworu
const trackData = {
id: 123, // ID utworu (wymagane)
title: "Nazwa utworu", // Tytuł (wymagane)
artist: "Nazwa artysty", // Artysta (wymagane)
audioUrl: "https://...", // URL do pliku audio (wymagane)
// Opcjonalne:
waveform: [0.2, 0.5, ...], // Dane waveform (array liczb 0-1)
duration: 180, // Długość w sekundach
coverUrl: "https://...", // URL okładki
moonlightUrl: "https://...", // Link do strony na Moonlight
genre: "Electronic", // Gatunek muzyczny
description: "Opis..." // Opis utworu
};
🔗 System Embedowania
🌍 Cross-Origin Setup
Nasz system embedowania działa z dowolnych domen dzięki prawidłowej konfiguracji CORS:
✅ Dozwolone:
- • Wszystkie domeny i subdomeny
- • HTTP i HTTPS
- • Localhost (development)
- • IP addresses
- • Publiczne treści - bez ograniczeń
- • Prywatne treści - z kluczem dostępu
🔧 Nagłówki CORS:
Access-Control-Allow-Methods: GET
Access-Control-Allow-Headers: *
💡 Tip: Player automatycznie dodaje przycisk "🌙 Visit on Moonlight" który przekierowuje na oryginalną stronę utworu na naszej platformie.
🔒 System Uprawnień Embedowania
- • Publiczne - każdy może embedować bez klucza
- • Prywatne - wymagany klucz dostępu od autora
- • Wyłączone - embedowanie niemożliwe
- • Klucze dostępu są 32-znakowe i widoczne tylko dla autorów
🎯 Generator Kodu Embed
🔌 API Endpoints
GET Pobierz dane utworu
Zwraca wszystkie dane potrzebne do załadowania utworu w playerze.
{
"track": {
"id": 123,
"title": "Nazwa utworu",
"artist": "Nazwa artysty",
"audioUrl": "https://moonlight.app/storage/music/track-123.mp3",
"waveform": [0.2, 0.5, 0.8, ...],
"duration": 180,
"coverUrl": "https://moonlight.app/storage/covers/123.jpg",
"moonlightUrl": "https://moonlight.app/music/tracks/123"
}
}
GET Stream audio
Bezpośredni stream pliku audio z odpowiednimi nagłówkami CORS.
✅ Automatycznie obsługiwane: Range requests, cache headers, CORS, content-type detection
📖 Przykłady użycia
🌐 WordPress Plugin
// functions.php
function moonlight_music_player_shortcode($atts) {
$atts = shortcode_atts([
'track_id' => '',
'height' => '120'
], $atts);
return '
<div id="moonlight-' . $atts['track_id'] . '"></div>
<script>
new MoonlightMusicPlayerLight("#moonlight-' . $atts['track_id'] . '", {
height: ' . $atts['height'] . '
}).loadTrackById(' . $atts['track_id'] . ');
</script>';
}
add_shortcode('moonlight_music', 'moonlight_music_player_shortcode');
Użycie: [moonlight_music track_id="123" height="120"]
⚛️ React Component
import { useEffect, useRef } from 'react';
function MoonlightPlayer({ trackId, height = 120 }) {
const playerRef = useRef();
useEffect(() => {
const player = new MoonlightMusicPlayerLight(
playerRef.current,
{ height }
);
player.loadTrackById(trackId);
return () => player.destroy();
}, [trackId]);
return <div ref={playerRef} />;
}
📚 Książki i Komiksy z Płatnościami
💰 System Płatności dla Embedded Content
Moonlight obsługuje premium rozdziały które wymagają zapłaty w wewnętrznej walucie (monety). Stworzyliśmy dedykowany flow dla embedded content z automatycznym powrotem na Twoją stronę.
🎯 Jak to działa:
- User klika premium rozdział na Twojej stronie
- Przekierowanie na Moonlight z context preservation
- Automatyczny flow: login → kup monety → odblokuj
- Powrót na Twoją stronę z access tokenem
💎 System Monet:
- • 10 monet = 1 PLN
- • Płatności przez Stripe
- • Automatyczne odliczanie z balansu
- • Jednorazowa płatność = dozgonny dostęp
⚡ Streamlined User Experience
Nasz system zachowuje kontekst przez cały proces płatności. User nie gubi się w przekierowaniach i automatycznie wraca na Twoją stronę po zakończeniu transakcji.
🔗 Embedding Premium Content
📖 Rozdział Książki
<!-- Link do premium rozdziału -->
<a href="https://moonlight.app/embed/purchase/book_chapter/123?return_to=https%3A%2F%2Ftwoja-strona.pl%2Fksiazka%2Frozdzia%C5%82-5&embed_key=optional_private_key"
class="premium-chapter-link">
🔐 Przeczytaj Rozdział 5 (Premium)
</a>
<!-- Lub jako button -->
<button onclick="window.location.href='https://moonlight.app/embed/purchase/book_chapter/123?return_to=...'">
Odblokuj za 50 monet
</button>
🎨 Rozdział Komiksu
<!-- Link do premium rozdziału komiksu -->
<a href="https://moonlight.app/embed/purchase/comic_chapter/456?return_to=https%3A%2F%2Ftwoja-strona.pl%2Fkomiks%2Frozdzia%C5%82-10"
class="premium-chapter-link">
🔐 Przeczytaj Rozdział 10 (Premium)
</a>
🔄 Obsługa Powrotu
// JavaScript - obsługa powrotu po zakupie
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.get('access_granted') === '1') {
const chapterId = urlParams.get('chapter_id');
const moonlightToken = urlParams.get('moonlight_token');
// User pomyślnie odblokował rozdział
showChapterContent(chapterId);
// Opcjonalnie: zapisz token dla przyszłych requestów
localStorage.setItem(`chapter_${chapterId}_token`, moonlightToken);
}
Potrzebujesz pomocy? 🤝
Nasz zespół pomoże Ci z integracją i odpowie na wszystkie pytania