Master every advanced feature, gesture, and tool available in the PHP Music platform.
@Username to tag them, and vote on track popularity.
[mm:ss.xx] LRC format strings into the Lyrics box. The player engine will automatically parse these timestamps and scroll the lyrics perfectly to the audio track during playback!
?action=get_songs). You can copy these endpoints to write python scripts, discord bots, or external UI interfaces that tap directly into your PHP Music database.
Copyright Responsibility: Users are solely responsible for the audio files they upload. Ensure you have the explicit right, license, or explicit permission from the original artist to use, stream, and distribute the content on this instance.
Personal Use Only: Advanced scraping utilities, including the Playlist Downloader, Open API, and high-quality streaming engines, are intended strictly for personal, private, and entirely non-commercial listening curation.
Content Moderation: Instance administrators reserve the unconditional right to instantly terminate sessions, indefinitely ban accounts, remove files, or delete altered metadata that violates copyright laws or general community guidelines without any prior notice.
0:00 if the current song has played for more than 3 seconds. Navigates to the previously played queue item if the song has played for less than 3 seconds.5 seeks to 50%). Ideal for rapid indexing of long mixes and podcasts.0:00. This is an absolute reset action and preserves your current loop, volume, and EQ settings.Artist Name
Artist Name
You can use special formatting in your text!
phpmusic.rf.gd or https://example.com will automatically become clickable links.
[url] yourlink.com [/url] to explicitly create a clickable link.
[img] yourimage.jpg [/img] to embed images safely without immediate bandwidth drain.
@Username (without spaces) to link directly to a user's profile.
[video] youtube_or_mp4_link [/video] to securely embed playable videos.
Use these markdown formats to style your personal notes. Toggle the button in the editor to see the preview!
| Element | Syntax | Example Preview | ||||
|---|---|---|---|---|---|---|
| Headings | # H1 |
H1 H2 |
||||
| Bold | **bold text** |
bold text | ||||
| Italic | *italicized text* |
italicized text | ||||
| Strikethrough | ~~strikethrough~~ |
|||||
| Blockquote | > blockquote |
blockquote |
||||
| Ordered List | 1. First item |
|
||||
| Unordered List | - First item |
|
||||
| Task List | - [ ] To do |
|
||||
| Code | `code` |
code |
||||
| Code Block | ``` |
code block |
||||
| Link | [title](https://url.com) |
title | ||||
| Image |  |
image | ||||
| Table | | Col | Col | | --- | --- | | Val | Val | |
|
||||
| Align Left | <div style="text-align: left;">Left</div> |
Left |
||||
| Align Center | <div style="text-align: center;">Center</div> |
Center |
||||
| Align Right | <div style="text-align: right;">Right</div> |
Right |
||||
| Resize Image | <img src="url" width="50%" height="auto"> |
Resized Image | ||||
| Video / YouTube | <video src="..."> or <iframe> |
Embedded Video | ||||
| Horizontal Rule | --- |
Sign in to continue your streaming experience
Having trouble with your account?
Sign in to continue
Sign up to create playlists and explore music
Need help getting started? User Guide
Sign up to explore & create playlists
Are you sure you want to permanently delete this message? This action cannot be undone.
Enable OS-level push notifications to receive alerts for new messages and activity even when the app is minimized.
If you are locked out of the Rhythm Game due to false anti-cheat flags, you can appeal the restriction here.
Export or import your account data (Followings, Notes, Tasks, Blogs, Rhythm Favorites, and Playlists) as a structured JSON file.
Once you delete your account, there is no going back. Please be certain.
Your session has expired or you are not logged in. Please log in or create an account to access this page.
Please notify the admin to verify your account so you can upload your own songs and share them with the community.
You have been invited to collaborate on the song by .
You have been invited to collaborate on the playlist by .
Description
Share to Apps
Copy Link
Copy the HTML snippet below to embed this song onto your website or blog.
Choose how you want to re-scan your library. Forced rescans will ignore file modification times and update the database directly from the ID3 tags. Useful for fixing corrupted metadata or missing artists.
Your music database is completely empty. Please run the Full Library Scan to analyze your files and build the database so the site can function.
Learn the core mechanics, note types, and scoring system to climb the leaderboards.
Select an endpoint below to immediately generate the secure URL string and test the live JSON response returned straight from your SQLite database. The iframe below executes the generated query using your locally cached Admin Key.
Welcome to the comprehensive reference documentation. This manual details the endpoints for querying database entities, streaming byte ranges, extracting binary blobs, and manipulating state via the RESTful JSON interface. All endpoints are protected by CORS firewalls and require strict Master Key authentication to access externally.
GET /?access=api&action=get_songs&api_key=YOUR_ADMIN_KEY
This is the primary pipeline for fetching your music library. It retrieves a highly optimized, paginated array of song entities from the SQLite database. The backend automatically enforces strict privacy checks, entirely omitting tracks marked as is_private=1 unless the filter_user_id specifically matches the track owner, or the global api_key bypass is initiated. Furthermore, it dynamically computes and attaches the play_count integer by executing a fast subquery against the play_counts relationship table.
| Parameter | Type | Required | Description |
|---|---|---|---|
access | string | Yes | Must be exactly api to bypass the HTML renderer and trigger the JSON header response. |
action | string | Yes | Must be exactly get_songs. |
api_key | string | Yes | The master Admin Password established in index.php. Requests without this will drop a 401 Unauthorized block. |
page | integer | No | Pagination multiplier. Defaults to 1. Multiplies against the global PAGE_SIZE constant (25). |
sort | string | No | Determines the ORDER BY clause. Options: id_desc, id_asc, artist_asc, title_asc, album_asc, year_desc. Defaults to id_desc. |
artist | string | No | URL Encoded artist name. Filters the database using the internal match_artist() custom SQLite function for precise collision detection. |
filter_user_id | integer | No | Limits results strictly to tracks uploaded by this specific integer User ID. |
const fetchLibrary = async () => {
const endpoint = 'https://yourdomain.com/?access=api&action=get_songs&api_key=YOUR_API_KEY&page=1&sort=title_asc';
try {
const response = await fetch(endpoint, {
method: 'GET',
headers: { 'Accept': 'application/json' }
});
if (!response.ok) {
throw new Error(`HTTP Error: ${response.status}`);
}
const songs = await response.json();
console.log(`Successfully fetched ${songs.length} tracks.`);
// Map over the results
songs.forEach(song => {
console.log(`[${song.id}] ${song.title} - ${song.artist} (${song.duration}s)`);
});
} catch (error) {
console.error('API Pipeline failed:', error);
}
};
fetchLibrary();
import requests
import json
def get_all_songs():
url = "https://yourdomain.com/"
payload = {
"access": "api",
"action": "get_songs",
"api_key": "YOUR_API_KEY", # Replace with actual key
"page": 1,
"sort": "title_asc"
}
try:
response = requests.get(url, params=payload, timeout=10)
response.raise_for_status() # Trigger exception for 4xx/5xx errors
data = response.json()
print(f"Acquired {len(data)} music objects.")
print(json.dumps(data[0], indent=2)) # Print first object beautifully
except requests.exceptions.RequestException as e:
print(f"Fatal System Error: {e}")
get_all_songs()
<?php
$url = "https://yourdomain.com/?access=api&action=get_songs&api_key=YOUR_API_KEY&page=1";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Ignore if self-signed cert
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
echo "cURL Error: " . curl_error($ch);
} elseif ($httpCode !== 200) {
echo "HTTP Blocked: " . $httpCode;
} else {
$songs = json_decode($response, true);
print_r($songs);
}
curl_close($ch);
?>
Returns an array of JSON objects. If the query yields no results, it strictly returns an empty array [], never null.
[
{
"id": 1042,
"title": "Stairway to Heaven",
"artist": "Led Zeppelin",
"album": "Led Zeppelin IV",
"genre": "Classic Rock",
"duration": 482,
"user_id": 1,
"is_private": 0,
"last_modified": 1698765432,
"is_favorite": 1,
"play_count": 8750
},
{
"id": 1043,
"title": "Hotel California",
"artist": "Eagles",
"album": "Hotel California",
"genre": "Rock",
"duration": 390,
"user_id": 2,
"is_private": 0,
"last_modified": 1698765999,
"is_favorite": 0,
"play_count": 6420
}
]
HTTP 401 Unauthorized: Thrown if the api_key parameter is entirely missing, blank, or cryptographically invalid against the server's Master Password.
{
"status": "error",
"message": "API access denied. Valid api_key (Admin Password) required."
}
HTTP 429 Too Many Requests: Thrown if your script requests the endpoint more than 150 times within a 60-second rolling window.
Pagination Empty: If you pass page=9999 and it exceeds the database bounds, it safely returns [] without throwing a 404 exception.
GET /?access=api&action=get_artists&api_key=YOUR_ADMIN_KEY
An extremely advanced aggregation endpoint that crawls the entire SQLite database to extract unique artist strings from embedded ID3 tags. It intelligently executes regex delimiter parsing against strings containing formats like "Daft Punk feat. Pharrell Williams" or "Justice & Kavinsky" to dynamically split them into individual, distinct identities. It then returns a structurally mapped array providing a canonical id pointer, which is crucial for fetching the correct cover art image for that artist via the image endpoint.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be get_artists. |
page | integer | No | Array slice offset. Defaults to 1 (25 items). |
sort | string | No | Options: name_asc, name_desc. Defaults to alphabetical name_asc. |
curl -X GET "https://yourdomain.com/?access=api&action=get_artists&api_key=admin&sort=name_asc" \
-H "Accept: application/json" \
-H "User-Agent: API-Client/1.0"
[
{
"name": "Daft Punk",
"id": 84,
"has_img": 1
},
{
"name": "David Bowie",
"id": 92,
"has_img": 1
},
{
"name": "Dire Straits",
"id": 105,
"has_img": 0
}
]
Architecture Note: The id field points to the absolute highest integer song ID uploaded by this artist that contains a valid has_img=1 flag in the database. You must append this integer to the get_image endpoint to retrieve the visual artist avatar.
GET /?access=api&action=get_albums&api_key=YOUR_ADMIN_KEY
Aggregates all music records grouped strictly by the album database field. The server processor automatically scrubs and excludes blank variables or corrupted "Unknown Album" entries to maintain UI integrity. The backend natively computes the song_count length and executes a heavy join to output the total_plays property for the entire album.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be get_albums. |
sort | string | No | Options: album_asc, album_desc, year_desc, artist_asc. Defaults to album_asc. |
[
{
"album": "Dark Side of the Moon",
"artist": "Pink Floyd",
"user_id": 1,
"id": 340,
"year": 1973,
"song_count": 10,
"total_plays": 54200
},
{
"album": "Discovery",
"artist": "Daft Punk",
"user_id": 2,
"id": 412,
"year": 2001,
"song_count": 14,
"total_plays": 88030
}
]
Tip: The id attribute returned here points to the absolute highest song ID associated with this album. Using this ID in the get_image route guarantees you receive the album's unified cover artwork.
GET /?access=api&action=get_genres
Provides a clean, distinct array of all unique string properties recorded inside the genre column across the entire music library table. Highly optimized via GROUP BY COLLATE NOCASE algorithms.
[
{ "name": "Alternative Rock", "id": 55 },
{ "name": "Electronic Dance", "id": 89 }
]
GET /?access=api&action=get_years
Groups the database entirely by the numeric year ID3 tag field. Automatically filters out 0 or null integer fallbacks and sorts chronologically descending.
[
{ "name": "2024", "id": 904 },
{ "name": "2023", "id": 822 }
]
GET /?access=api&action=search&q=QUERY&api_key=YOUR_KEY
The core intelligence of the library discovery engine. It performs a massive, multi-table cross-referenced LIKE operation against Titles, Artists, Albums, Playlists, and internal Users. Instead of returning a flat array, it structures the response into beautifully nested UI "Shelves", allowing you to render categorical blocks identical to modern streaming platforms immediately upon receipt.
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | Yes | The URL-encoded search keyword or phrase. |
f_date | string | No | Time boundary limits. Options: today, week, month, year. |
f_dur | string | No | Length limits. Options: short (under 4 mins), long (over 20 mins). |
f_sort | string | No | Advanced sorting matrix. Options: relevance, date, views, likes. |
{
"shelves": [
{
"title": "Top Result",
"type": "top_result",
"items": [
{ "id": 401, "title": "Random Access Memories", "artist": "Daft Punk" }
]
},
{
"title": "Artists",
"type": "artists",
"items": [
{ "name": "Daft Punk", "id": 401, "is_user": false }
]
},
{
"title": "Songs",
"type": "songs_list",
"items": [
{ "id": 402, "title": "Get Lucky", "artist": "Daft Punk", "duration": 369 }
]
}
]
}
GET /?access=api&action=get_song_data&id=SONG_ID&api_key=YOUR_ADMIN_KEY
Provides absolute, hyper-detailed JSON structures regarding a singular specific audio track. It exposes system-level technical details including explicitly generated stream_url overrides, internally embedded raw lyrics text blocks (capable of feeding LRC synchronized UI elements), physical file bitrates, ReplayGain offsets, and critically, the per-user custom eq_bands matrix alterations tied to the user_song_settings relationship table.
{
"id": 1042,
"file": "/var/www/html/music/uploads/le/led_zeppelin/m_a4b9x.mp3",
"title": "Stairway to Heaven",
"artist": "Led Zeppelin",
"album": "Led Zeppelin IV",
"genre": "Classic Rock",
"year": 1971,
"duration": 482,
"bitrate": 320000,
"lyrics": "[00:15.30] There's a lady who's sure...\n[00:22.10] All that glitters is gold...",
"user_id": 1,
"is_private": 0,
"last_modified": 1698765432,
"replaygain": -4.2,
"is_favorite": 1,
"volume_multiplier": 1.2,
"eq_bands": [2, 0, -1, 3, 5],
"stream_url": "?action=get_stream&id=1042",
"image_url": "?action=get_image&id=1042&v=1698765432"
}
GET /?access=api&action=get_playlist_songs&public_id=PLAYLIST_ID&api_key=YOUR_KEY
Extracts all song objects associated via the playlist_songs junction table, pointing explicitly to a specific public_id cryptographic token. It enforces extremely tight architectural security rules, outright rejecting query attempts on is_private=1 collections unless directly authenticated by the owner's session token or globally overridden via the api_key.
| Parameter | Type | Required | Description |
|---|---|---|---|
public_id | string | Yes | The 16-character hexadecimal token assigned to the playlist entity. |
sort | string | No | Order definitions. Options: manual_order, added_newest, added_oldest. |
all | integer | No | Boolean state 1 or 0. If 1, it entirely bypasses the 25-item chunking constraints and dumps the entire list array simultaneously. |
GET /?action=get_stream&id=SONG_ID
The highest priority internal API route. Operates completely outside the JSON formatter to return heavy binary payloads. Native support for HTTP/1.1 206 Partial Content allows HTML5 <audio> tags to seamlessly transmit Range: bytes= requests, enabling instant timeline scrubbing without transferring gigabytes of unneeded buffer chunks.
GET /?action=get_image&id=SONG_ID&v=TIMESTAMP
Transmits the ultra-compressed WebP base64 blob embedded in the SQLite music architecture. If no image physically exists in the database for the given ID, the server intercepts the null pointer and dynamically builds an immense SVG vector mathematical graphic bounded to the hexadecimal seed derived from the song's title string!
&v= param explicitly fractures strict HTTP caching laws to force UI updates.
GET /?action=get_profile_picture&id=USER_ID
Translates the user integer pointer into a image/webp output stream. If the account lacks a custom profile picture, it initiates a complex fallback algorithm: searching the DB for the newest music row uploaded by them that contains cover art, and if that fails, builds an SVG geometric shape.
GET /?action=download_song&id=SONG_ID
Overrides normal streaming directives to enforce a hard physical system download operation. Injects Content-Disposition: attachment headers while intelligently formatting the filename to "Title - Artist.mp3" based securely on the database tags, ignoring the random alphanumeric disk hash.
GET /?access=api&action=get_explore&api_key=YOUR_ADMIN_KEY
A tremendously heavy computational endpoint containing massive multi-table JOIN subqueries designed to construct randomized algorithm-driven "Shelves" for the Explore tab. It pulls deep track recommendations, aggregates distinct album groupings randomly, parses global play statistics to surface trending records, and identifies prolific artists across the server. Due to execution load, this endpoint automatically serializes its output to a hardware sys_get_temp_dir() cache file governed by a strict 5-minute invalidation clock.
{
"shelves": [
{
"title": "Discover Songs",
"type": "songs",
"items": [
{ "id": 401, "title": "Random Access Memories", "artist": "Daft Punk" }, ...
]
},
{
"title": "Discover Albums",
"type": "albums",
"items": [
{ "album": "Discovery", "artist": "Daft Punk", "id": 84, "song_count": 14 }
]
}
]
}
GET /?access=api&action=get_recommendations
Identical to the Explore layout engine but intensely localized against the authenticated API Session parameters. Re-calculates mathematical boundaries based exclusively on user history logs, followed relationships, and favorite flags. Requires severe backend processing load.
GET /?access=api&action=get_history
Targets the history database mapping. Executes a complex grouping schema to safely collapse tracks played multiple times into a singular row driven by a MAX(played_at) ISO string resolver. Appends fully functional UI objects to build timeline interfaces.
GET /?access=api&action=get_favorites
Outputs the array of tracks securely bound to the user's favorites cross-reference table. Enforces a sort_order directional flag to allow for drag-and-drop structural preservation. Core foundation for the internal offline-caching loop capabilities.
GET /?access=api&action=get_user_playlists
Aggregates the total array of playlist constructs exclusively tied to the master authentication identifier. Employs heavy aggregation logic to dynamically formulate the internal song_count and the highly complex image_id thumbnail pointing parameter.
These specialized endpoints are explicitly designed to mutate database states securely. They completely ignore URL parameters for data manipulation, strictly demanding rigorous JSON payloads deployed within the body stream. All requests mandate Content-Type: application/json.
POST /?access=api&action=toggle_favorite
{
"id": 1042 // The integer ID of the target song
}
Functionality: Scans the favorites binding logic. If the integer ID already exists in the matrix, it physically destroys the row. If absent, it injects a new row calculating the MAX(sort_order) + 1. Responds with the new calculated boolean state {"status":"added", "is_favorite":true}.
POST /?access=api&action=log_play
{
"id": 1042,
"played_at": "2026-06-28T14:27:00.000Z" // Standard ISO string
}
Functionality: Highly volatile transaction handler. Executes a deep ON CONFLICT DO UPDATE SQL sequence against both the history mapping (to update the chronological timeline) and the play_counts mapping (incrementing the algorithm scalar). It is intensely protected by a looping Retry matrix to mitigate localized SQLite busy-lock scenarios under massive concurrent traffic.
POST /?access=api&action=create_playlist
{
"name": "Midnight Drive Array",
"is_private": 0 // Integer boolean (0 = Public, 1 = Private)
}
Functionality: Dynamically validates and executes the generation of a new global playlist construct. Generates an exceptionally secure, random 16-character hexadecimal token bound to the public_id column to bypass easily-guessable standard integer indexing methodologies.
You have been invited to collaborate on a private project workspace.
Configure and connect to your PHP Music API in the sidebar.
Subscribe to this server using any standard RSS reader (Feedly, NetNewsWire, Apple Podcasts, etc.) to stream tracks and receive real-time upload updates.
<!-- Fetching XML payload... -->