OpenSound allows you to play music synchronized across multiple devices (laptops, computers, smartphones, iPods…), so you can listen to music in multiple rooms: at home, office or anywhere else.
OpenSound works in any device with a modern HTML5 browser (desktop computers, laptops, smartphones, tablets, iPods…). The browser connects to your OpenSound server and then you can control your music from any device. Navigate through your music folder, fill in a playlist and play/pause/skip songs which will be streamed simultaneously to all connected devices.
We love music and considered setting up Sonos but that was a huge investment, thousands of euros we'd rather spend in something else… We have got many speakers around and old iPods/laptops we would need to throw away or sell for nothing. And hey, we are web developers and know HTML5 and current open technologies are able to do that. We can use our existing speakers, plug them into iPods and old laptops and voila! We got Sonos for free :D And it's Web, platform agnostic and open source… Awesome!
It also serves as a great project to learn a lot of cool stuff, feel free to fork the project and help us build it, this is going to be a game-changer!
- Works through your WiFi network and even the Internet (the least latency the best)
- Create playlists and stream MP3 files across all devices
- Works in all modern browsers including iPods and tablets
- Works with all speakers no matter brand, model or age
- Small scalable code
- Responsive design optimized for big screens and mobiles
- Easy-to-use revolutionary interface and UX
- Detects connected devices and allows fine-tunning volume and control
- Can be managed through any device, anywhere
- REST API
We are currently focusing on getting a prototype functioning. These features are not part of the MVP although pretty cool to implement in the future, so we've noted them down:
- Latency detector for perfect sync and gap-less playback (early versions will use HTTP requests and detect the ping, in the future we will move to WebSockets or a higher performance protocol)
- Dark theme and theme selection
- Get computer audio output so OpenSound is not limited to playing music through the browser but can actually stream music from Spotify and any other software (there's solutions for it although we may need to reccur to Flash)
- Integrate OpenSound with Raspberry Pi's, that'd mean super-cheap $50 controllers (instead of the $300+ on the market right now)
- Multiple playlists
- IDE3 tags detection
- Album cover & lyrics
- Password protected access
- Cross-fade songs (using two audio tags)
- P2P (server-less) capability (there's solutions for it although we may need to reccur to Flash)
- iOS, Android, Firefox OS apps
- TideSDK?
- A computer with MP3s and a web server installed (XAMPP, LAMP…)
- Devices with a modern browser that support HTML5
audioand Internet connection
Our main priority is to avoid any setup at all and keep it super simple to start using OpenSound so here's the 5 minute setup:
- Start your web server in a computer with a music library
- Open
config.phpand change the music folder path to where you have some MP3 files - Open the URL of the server in other devices (ie.
http://192.168.1.23/opensound/) - Add songs to the playlist and press Play
- HTML5
- JavaScript/jQuery
- PHP
- JSON API
(No database, it's file-based for simplicity)
Everything is returned as a JSON string (simplified here for readability).
Returns the HTML view (homepage).
Requests JSON status of OpenSound every 5 seconds, a client is considered connected if he sends a status update at least every 10 seconds:
song: 'folder/path/mysong.mp3'
pos: 0 // in seconds
status: 0 (paused) or 1 (playing)
hash: { // hash is an md5 of the JSON string. If the hash changes, the client will request an update
playlist: '9f4e3847f075d1e7e21141658ade4837'
clients: '5f93f983524def3dca464469d2cf9f3e'
}
Requests current playlist, called on page load and when the status.hash.playlist changes.
Returns playlist from the Database file.
Requests connected clients, called on page load and when the status.hash.clients changes.
Clients can be connected or disconnected, when connected, they can be enabled or disabled.
Returns clients from the Database file.
Returns audio file in MP3 format.
Returns list of files and folders in that path.
{
path: '/techno/Marek Hemmann'
files: [
'/folder/'
'/anotherfolder/'
'mysong.mp3'
'othersong.mp3'
]
}
Adds song to playlist.
"status": "1""status": "0", "error": "adderror", "msg": "Could not add the song"
Removes song from playlist.
"status": "1""status": "0", "error": "removeerror", "msg": "Could not remove the song"
Plays song (starts at position 0).
"status": "1""status": "0", "error": "songnotfound", "msg": "Could not find the song"
Pauses song at current position.
"status": "1""status": "0", "error": "pauseerror", "msg": "Can't pause"
Moves current track to position (in seconds).
"status": "1""status": "0", "error": "posinvalid", "msg": "Invalid value for position"
Renames current device.
"status": "1""status": "0", "error": "nameinvalid", "msg": "Invalid name"
Enable client (pass URL encoded client's name).
"status": "1""status": "0", "error": "clientnotfound", "msg": "The client could not be found"
Disable client (pass URL encoded client's name).
"status": "1""status": "0", "error": "clientnotfound", "msg": "The client could not be found"
Change volume for a specific client.
"status": "1""status": "0", "error": "clientnotfound", "msg": "The client could not be found""status": "0", "error": "volinvalid", "msg": "Invalid value for volume"
OpenSound stores information in localStorage of each device, as minimum as possible since we want to keep everything in sync in the opensound.json database file:
{
devicename: 'iMac'
vol: 80
ping: 200
hash: [
playlist: 'a1324603d9b1a22277809229934a36fd'
clients: '0777d5c17d4066b82ab86dff8a46af6f'
]
}
{
url: 'http://192.168.1.62/opensound/'
song: 'folder/path/mysong.mp3'
pos: 23
started: 1368386529.79 // microtime(true), when the song started so we can sync
status: 1
path: /
playlist: [
'folder/path/mysong.mp3'
'folder/path/mysong.mp3'
...
]
clients: [
{
name: 'iMac'
vol: 90
status: 0 (disabled) or 1 (enabled)
lastseen: 1000000 // Unix timestamp
ping: 200 // ms
},
{
name: 'iPhone'
vol: 20
status: 1
lastseen: 1000000
ping: 1400
},
...
]
hash: [
playlist: 'd19544ae709580379cd2523b0e72c86d'
clients: '250413d2982f1f83aa62a3a323cd2a87'
]
}
There are three kind of messages shown in OpenSound:
error(default): Displays an errorsuccess: After a user action, notifies of a successful changeinfo: Informs of something, not necessarily a change or an error
Copyright (c) 2013 Xavi Esteve (http://xaviesteve.com) & Marek Suliga (https://github.com/mark81)
Everyone is permitted to copy and distribute verbatim or modified copies of this, and changing it is allowed as long as the name is changed.
DON'T BE A DICK PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
Do whatever you like with the original work, just don't be a dick.
Being a dick includes - but is not limited to - the following instances:
a. Outright copyright infringement - Don't just copy this and change the name.
b. Selling the unmodified original with no work done what-so-ever, that's REALLY being a dick.
c. Modifying the original work to contain hidden harmful content. That would make you a PROPER dick.
-
If you become rich through modifications, related works/services, or supporting the original work, share the love. Only a dick would make loads off this work and not buy a pint to the original work creator(s).
-
Code is provided with no warranty. Using somebody else's code and bitching when it goes wrong makes you a DONKEY dick. Fix the problem yourself. A non-dick would submit the fix back.
-
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
Icons adapted from Julius Csurgo