Backend API untuk aplikasi pemutar musik Android LightMusic, dibangun di atas ytmusicapi — unofficial API untuk YouTube Music.
- Tentang
- Stack
- Instalasi
- Autentikasi ytmusicapi
- Menjalankan Lokal
- API Endpoints
- Deploy ke Railway
- Struktur Folder
LightMusic API adalah REST API yang membungkus ytmusicapi dan yt-dlp untuk menyediakan:
- 🔍 Pencarian lagu, artis, album dari YouTube Music
- 🎵 Metadata detail lagu
- 📡 Stream URL audio langsung
- 📥 Download file audio (.m4a)
- 🎤 Lirik lagu
- 📊 Chart musik per negara
Catatan: ytmusicapi adalah library tidak resmi yang mengemulasi request browser YouTube Music. Tidak berafiliasi dengan Google atau YouTube.
| Komponen | Teknologi |
|---|---|
| Framework | Flask |
| Music API | ytmusicapi |
| Audio Extract | yt-dlp |
| Deploy | Railway |
| Runtime | Python 3.10+ |
- Python 3.10 atau lebih baru
- pip
- Git
# Clone repository
git clone https://github.com/username/lightmusic-api.git
cd lightmusic-api
# Buat virtual environment
python -m venv venv
# Aktifkan virtual environment
# Windows:
venv\Scripts\activate
# Mac/Linux:
source venv/bin/activate
# Install dependencies
pip install -r requirements.txtflask
ytmusicapi
yt-dlp
flask-caching
python-dotenv
gunicorn
requests
ytmusicapi mendukung dua mode: publik (tanpa login) dan autentikasi (dengan akun YouTube).
Cukup untuk search, chart, metadata, dan stream. Tidak perlu setup apapun:
from ytmusicapi import YTMusic
ytm = YTMusic() # langsung bisa dipakaiDiperlukan untuk akses library pribadi, playlist, dan histori.
- Buka https://music.youtube.com dan pastikan sudah login
- Tekan
Ctrl+Shift+I→ tab Network - Filter request dengan kata
/browse - Klik salah satu request → tab Headers → copy semua Request Headers
- Jalankan perintah ini:
import ytmusicapi
ytmusicapi.setup(filepath="browser.json", headers_raw="<PASTE HEADERS DI SINI>")- File
browser.jsonakan dibuat. Gunakan saat inisialisasi:
from ytmusicapi import YTMusic
ytm = YTMusic("browser.json")Kredensial ini valid selama sesi browser YouTube Music aktif (sekitar 2 tahun selama tidak logout).
Direkomendasikan untuk penggunaan jangka panjang. Memerlukan Google Cloud Console.
# Mulai flow OAuth dari terminal
ytmusicapi oauthfrom ytmusicapi import YTMusic, OAuthCredentials
ytm = YTMusic(
'oauth.json',
oauth_credentials=OAuthCredentials(
client_id="CLIENT_ID_KAMU",
client_secret="CLIENT_SECRET_KAMU"
)
)Lihat panduan lengkap: OAuth authentication
# Pastikan virtual environment aktif
python app.pyServer berjalan di: http://localhost:5000
Test endpoint:
http://localhost:5000/
http://localhost:5000/search?q=dewa19
http://localhost:5000/charts?country=ID
Base URL lokal: http://localhost:5000
Base URL production: https://lightmusic.up.railway.app
Info API dan daftar endpoint.
Response:
{
"Sumber": "https://ytmusicapi.readthedocs.io/en/stable/index.html",
"app": "LightMusic API",
"dev": "natgul",
"endpoints": [
"GET /search?q=query&type=songs",
"GET /song/\u003Cvideo_id\u003E",
"GET /stream/\u003Cvideo_id\u003E",
"GET /lyrics/\u003Cvideo_id\u003E",
"GET /charts?country=ID"
],
"version": "1.0"
}Cari lagu, artis, atau album dari YouTube Music.
Query Parameters:
| Parameter | Tipe | Wajib | Default | Keterangan |
|---|---|---|---|---|
q |
string | ✅ | - | Kata kunci pencarian |
type |
string | ❌ | songs |
songs / artists / albums / playlists |
limit |
integer | ❌ | 20 |
Jumlah hasil (max 40) |
Contoh Request:
GET /search?q=dewa19&type=songs&limit=10
Contoh Response:
{
"status": "success",
"message": "Ditemukan 10 hasil",
"data": [
{
"id": "kXQRVbRfF4s",
"title": "Separuh Nafas",
"artist": "Dewa 19",
"album": "Bintang Lima",
"duration": "4:32",
"thumbnail": "https://lh3.googleusercontent.com/..."
}
]
}Ambil detail metadata sebuah lagu.
Contoh Request:
GET /song/kXQRVbRfF4s
Contoh Response:
{
"status": "success",
"data": {
"id": "kXQRVbRfF4s",
"title": "Separuh Nafas",
"artist": "Dewa 19",
"duration": 272,
"thumbnail": "https://...",
"description": "..."
}
}Ambil URL stream audio. URL ini expire dalam beberapa jam.
Contoh Request:
GET /stream/kXQRVbRfF4s
Contoh Response:
{
"status": "success",
"data": {
"stream_url": "https://rr1---sn-...googlevideo.com/videoplayback?...",
"mimeType": "opus",
"bitrate": 131526,
"ext": "webm",
"duration": 272,
"title": "Separuh Nafas"
}
}Proxy audio stream langsung. Cocok dipakai di Flutter just_audio — tidak perlu extract URL di sisi client.
GET /play/kXQRVbRfF4s
Penggunaan di Flutter:
await audioPlayer.setUrl('https://lightmusic.up.railway.app/play/kXQRVbRfF4s');Ambil lirik lagu.
Contoh Request:
GET /lyrics/kXQRVbRfF4s
Contoh Response:
{
"status": "success",
"data": {
"lyrics": "Masih seperti dulu...",
"source": "YouTube Music"
}
}Top chart lagu per negara.
Query Parameters:
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
country |
string | ID |
Kode negara ISO 3166-1 alpha-2 |
Contoh Request:
GET /charts?country=ID
Contoh Response:
{
"status": "success",
"data": {
"country": "ID",
"top_songs": [
{
"id": "abc123",
"title": "Judul Lagu",
"artist": "Nama Artis",
"thumbnail": "https://...",
"rank": 1
}
]
}
}web: gunicorn app:app
git init
git add .
git commit -m "initial commit"
git remote add origin https://github.com/username/lightmusic-api.git
git push -u origin main- Buka railway.app → login dengan GitHub
- New Project → Deploy from GitHub repo
- Pilih repo
lightmusic-api - Tunggu build selesai
- Settings → Networking → Generate Domain
Jika menggunakan cookies untuk autentikasi yt-dlp, tambahkan di Railway:
YT_COOKIES = <isi file cookies.txt>
lightmusic-api/
├── app.py ← Entry point Flask
├── Procfile ← Konfigurasi Railway
├── requirements.txt
├── .env ← Environment variables (tidak di-commit)
├── cookies.txt ← YouTube cookies (tidak di-commit)
│
├── routes/
│ ├── search.py ← GET /search
│ ├── song.py ← GET /song/:id
│ ├── stream.py ← GET /stream/:id & /play/:id
│ ├── lyrics.py ← GET /lyrics/:id
│ └── charts.py ← GET /charts
│
├── services/
│ └── ytmusic.py ← Wrapper ytmusicapi
│
└── utils/
└── response.py ← Format response JSON standar
MIT License — bebas digunakan untuk keperluan pribadi maupun komersial.