Getting Started
Scripts are plain .js files placed in your scripts folder:
~/Library/Application Support/OrangeMusicPlayer/Scripts/
Open the folder from the menu bar: Scripts → Open Scripts Folder. Orange detects new and changed scripts automatically — no restart needed.
To run an on-demand script, use the Scripts menu or the Scripts panel in the sidebar. Event-driven scripts run automatically when their trigger fires.
Script Metadata
Add a comment block at the top of your script to declare metadata:
// @name My Script // @description What it does // @author Your Name // @event trackChanged
| Tag | Required | Description |
|---|---|---|
@name | No | Display name. Falls back to the filename. |
@description | No | Short description shown in the Scripts panel. |
@author | No | Author name. |
@event | No | Event name to auto-run on. Omit for on-demand scripts. |
Console
Use console.log(), console.warn(), and console.error() to send output to the Script Console. Open it with Scripts → Script Console or Cmd+Shift+J.
console.log('Hello', 'world'); // supports multiple arguments console.warn('Heads up!'); console.error('Something broke');
orange.player
Control playback and read the current player state.
Methods
Start or resume playback.
Pause playback.
Stop playback and reset position.
Skip to the next track in the queue.
Go back to the previous track.
Seek to a position in the current track (in seconds).
Properties
| Property | Type | Description |
|---|---|---|
orange.player.currentTrack | Track | null | The currently playing track object. |
orange.player.position | Number | Current playback position in seconds. |
orange.player.isPlaying | Boolean | true if audio is currently playing. |
orange.player.volume | Number | Volume level (0.0 – 1.0). Read/write. |
var track = orange.player.currentTrack; if (track) { console.log(track.title + ' by ' + track.artist); console.log('Position: ' + orange.player.position + 's'); } // Set volume to 80% orange.player.volume = 0.8;
orange.library
Search and retrieve tracks, albums, and artists from your library.
Search tracks by title, artist, or album. Pass an empty string to get all tracks.
Search albums by title or artist.
Search artists by name.
Get a single track by its ID.
Get a single album by its ID.
orange.playlists
Create, delete, and manage playlists.
Get all playlists.
Create a new playlist with the given name.
Delete a playlist by its ID.
Add a track to a playlist.
Remove a track from a playlist.
Get all tracks in a playlist.
orange.effects
Inspect and control the audio effects chain (EQ, reverb, AU plugins).
Returns an array of effect slots. Each slot has type, name, manufacturer, and isBypassed. Empty slots are null.
Enable or bypass an effect slot.
Set a parameter value on an AU plugin by address.
Get the current value of an AU parameter.
Load a factory preset by number or name. source must be "factory".
var slots = orange.effects.chain(); for (var i = 0; i < slots.length; i++) { if (slots[i]) { console.log(slots[i].name + ' — bypassed: ' + slots[i].isBypassed); } } // Bypass the first effect orange.effects.bypass(0, true); // Load factory preset #0 on slot 1 orange.effects.loadPreset(1, 0, 'factory');
Events
Register callbacks for playback and library events using orange.on().
Register an event handler. Multiple handlers per event are supported.
| Event | Callback Argument | Fires When |
|---|---|---|
trackChanged | Track object | A new track starts playing. |
playbackStarted | — | Playback resumes. |
playbackPaused | — | Playback is paused. |
playbackStopped | — | Playback stops. |
queueChanged | — | The playback queue is modified. |
libraryUpdated | — | The library is rescanned. |
orange.on('trackChanged', function(track) { console.log('Now playing: ' + track.title); }); orange.on('playbackPaused', function() { console.log('Paused'); });
To bind an event-driven script, add @event in the metadata header. The script will automatically run when that event fires, and your orange.on() handlers will be called.
Track Object
Track objects returned by the API have these properties:
| Property | Type | Notes |
|---|---|---|
id | Number | Unique database ID. |
title | String | Track title. |
artist | String | May be absent. |
album | String | May be absent. |
genre | String | May be absent. |
duration | Number | Duration in seconds. |
trackNumber | Number | May be absent. |
year | Number | May be absent. |
playCount | Number | Number of times played. |
rating | Number | 1–5 stars. May be absent. |
isFavorite | Boolean | Whether the track is favorited. |
filePath | String | Absolute file path. |
Album objects have: id, title, artist, year, trackCount.
Artist objects have: id, name, albumCount, trackCount.
Playlist objects have: id, name, trackCount.
Examples
Favorites Playlist Builder
On-Demand// @name Quick Favorites Playlist // @description Collects all favorited tracks into a new playlist // @author Orange Music Player var allTracks = orange.library.searchTracks(''); var favorites = []; for (var i = 0; i < allTracks.length; i++) { if (allTracks[i].isFavorite) { favorites.push(allTracks[i]); } } console.log('Found ' + favorites.length + ' favorite tracks'); if (favorites.length > 0) { orange.playlists.create('My Favorites (Script)'); // Find the newly created playlist var playlists = orange.playlists.list(); var target = null; for (var j = 0; j < playlists.length; j++) { if (playlists[j].name === 'My Favorites (Script)') { target = playlists[j]; } } if (target) { for (var k = 0; k < favorites.length; k++) { orange.playlists.addTrack(target.id, favorites[k].id); } console.log('Added ' + favorites.length + ' tracks to playlist'); } }
Run this from the Scripts menu. It scans your entire library for favorited tracks and creates a playlist containing them all.
Genre Logger
Event-Driven// @name Genre Logger // @description Logs genre info every time the track changes // @author Orange Music Player // @event trackChanged orange.on('trackChanged', function(track) { if (!track) return; var genre = track.genre || 'Unknown'; console.log(track.title + ' [' + genre + '] by ' + (track.artist || 'Unknown')); // Detect jazz and log something fun if (genre.toLowerCase().indexOf('jazz') !== -1) { console.log('Jazz detected! Smooth listening ahead.'); } });
This script runs automatically every time a new track starts playing. It logs the genre to the Script Console, with a special message for jazz tracks. Use Cmd+Shift+J to open the console and watch the output.
Top Played Playlist
On-Demand// @name Top 20 Most Played // @description Creates a playlist from your 20 most-played tracks // @author Orange Music Player var all = orange.library.searchTracks(''); // Sort by play count descending all.sort(function(a, b) { return b.playCount - a.playCount; }); var top = all.slice(0, 20); console.log('Top track: ' + top[0].title + ' (' + top[0].playCount + ' plays)'); orange.playlists.create('Top 20 Most Played'); var playlists = orange.playlists.list(); var target = null; for (var i = 0; i < playlists.length; i++) { if (playlists[i].name === 'Top 20 Most Played') { target = playlists[i]; } } if (target) { for (var i = 0; i < top.length; i++) { orange.playlists.addTrack(target.id, top[i].id); } console.log('Created playlist with ' + top.length + ' tracks'); }
Sorts your entire library by play count and builds a playlist of your 20 most-listened tracks. Run it periodically to keep an up-to-date "heavy rotation" list.