Original code by Jonnty http://gbs.fm/bugs
G2 is a web-app to manage a playlist for a Shoutcast (or compatible) streaming media server.
G2 acts as an internet jukebox. Listeners upload and add songs to a shared playlist. You can also vote for and comment on the music that's playing!
If you're a Something Awful forums member, see this thread for the goon-run gbs.fm, powered by G2: http://forums.somethingawful.com/showthread.php?threadid=3337579
If you want to get G2 running for yourself, keep reading!
To install this, it probably helps to know Django well enough to configure and deploy a project. You'll also be needing to dabble in shoutcast or icecast, so that'll also help. Oh, and also mysql.
Install these packages, for they are required for a functioning installation
to build icecast, you'll also need to install (ubuntu packages, other distros may vary):
You can pip-install these, but make sure they're installed somehow
The repository is a django project. It must be in a directory called "pydj", various imports depend on it.
Create a mysql database and user, give that user full access to the database
Create yourself a settings.py file. The easiest way is to copy the template from::
<django root>/conf/project_template/settings.py
Then follow these steps. They are all necessary, optional steps are listed later.
Configure your database parameters
Add a value for SECRET_KEY. Just mash the keyboard for about 50 chars, should be good.
Set ROOT_URLCONF to "pydj.urls"
Add these items to the INSTALLED_APPS list:
Add all of the following directives and set them accordingly
AUTH_PROFILE_MODULE Set this to "playlist.UserProfile"
LOGIN_REDIRECT_URL set to "/playlist" LOGIN_URL set to "/login" TEMPLATE_CONTEXT_PROCESSORS Set this to::
( "django.contrib.auth.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.contrib.messages.context_processors.messages", 'playlist.context.listenersContextProcessor', 'playlist.context.newReportsContextProcessor', 'playlist.context.newEditsContextProcessor', 'playlist.context.positionContextProcessor', 'playlist.context.commentProcessor', 'playlist.context.nowPlayingContextProcessor', 'playlist.context.SQLLogContextProcessor', 'playlist.context.siteContext', )
IMAGES_DIR G2 is configured to serve static content itself out of this directory. Set this setting to the absolute path on the filesystem to the images directory, which is in the playlist directory.
LOGIC_DIR Set this to the absolute path to the logic directory within the playlist directory. This is the ices working directory, and G2 looks in here for the ices.cue file
SHOW_QUERIES Set this to False. You don't want this on.
ICES_CONF Set this to the absolute path to your ices.conf file, which is usually in the logic directory. This settings is passed into "ices -c ICES_CONF", and just used to start ices from the admin panel
STREAMINFO_URL Set this to the url of the shoutcast server. This url is queried and scraped for the listener count. Currently, this only works with icecast servers.
NEXT_PASSWORD Set this to something random and secret. It's used for the ices streaming source to query G2 for the next song to play.
MAX_UPLOAD_SIZE Set this to the maximum allowed upload size, in bytes.
MAX_SONG_LENGTH Set this to the maximum allowed song length, in seconds. Longer songs may still be uploaded, but will be auto-banned.
PLAYLIST_MAX Set this to the maximum number of songs each user can have in playlist at a time
PLAYLIST_SOFT_TIME_LIMIT Set this to the maximum number of minutes a user can occupy on the playlist. This is a soft limit, they can add a song that exceeds this limit, but cannot add more songs after that. In other words, if their time on the playlist exceeds this value, they cannot add more songs.
REPLAY_INTERVAL Set this to the time until a song can be added again, in hours
IS_LIVE Doesn't do anything at the moment, but you still need to define it. Set to false, I guess.
FILE_UPLOAD_MAX_MEMORY_SIZE Set this to 0
SITE_TITLE Set to the site's title, which will be displayed in the page title on every page
LISTEN_URL Set this to the URL that the Listen link should point to.
DEAD_AIR_TRACK
This is an absolute path on the filesysem to an mp3 that will play when
otherwise nothing is playing. bees.mp3
is included in the logic
directory as a default; set this option to its path.
They're not strictly necessary for a working install, but may do something interesting. I haven't gotten around to documenting this yet
Now that your settings.py is nice and configured, run
::
python manage.py syncdb
to populate the database. Create yourself an admin user when propmpted.
Now deploy the site with apache+mod_wsgi, or lighttpd, or the django built in server, or whatever. This is left as an excercise to the reader.
A wsgi file is provided under the apache
directory.
Note: you may need to add some creative path additions to the top of some files. If you have custom paths to add, do so to these files:
Before you can use the site, a couple things need to be added to the database.
Head to the admin site at /admin
Go to the Settingss
model and add a new settings
with key
welcome_message
and whatever value.
Go to the Song dirs
model and add at least one usable song dir so G2 has
somewhere to save the songs. The path should be an absolute path on the local
filesystem to a writable directory to the web server.
Hash letters
is a number. If greater than 0, songs are put into sub
directories named after this many hash letters from the song's hash. If you
don't expect many songs, 0 is fine. Otherwise, 1 or 2 is a good choice. More
just seems unnecessary to me, but be your own judge on that.
Go to the Groups model and add a group for your listeners. At a minimum, this group should contain these permissions so listeners can view a functioning site:
You probably also want these permissions:
Currently, adding users is a manual process. I stripped out the original Something Awful integrated login used at gbs.fm, but haven't added anything in its place.
To add a user, head to the admin page and follow these steps:
Add a user to the Users model
Go to the User profiles
model and add a new profile for that user.
Set up a shotcast or icecast server. On ubuntu, these steps suffice:
icecast2
/etc/icecast2/icecast.xml
and change the passwords./etc/default/icecast2
to enable the servicesudo service icecast2 start
Icecast is now running on port 8000. Remember that, and the password you used for the next step.
The web app is all set up, but you still need to get ices set up
Download, compile, and install ices 0.4 (requires libshout-dev, libxml2-dev, libmp3lame-dev)
Put the provided sample ices.conf and ices.py in the logic dir.
Edit ices.py for the correct paths to the django project and the correct NEXT_URL
Edit ices.conf
python
and ices
1
Go to the g2admin page on the site, and press the start_stream link. This will launch ices.
If all works, things are now streaming! Otherwise, check the ices logs in the logic directory and the shoutcast/icecast logs for clues.
If a user has the "playlist.download_song" permission, they will have a link on
each song page to download the file. This link depends on the webserver
supporting the X-Sendfile
header. For Apache, get the mod_xsendfile
module.
For Ubuntu, you can install the libapache2-mod-xsendfile module. Make sure to
turn it on in the server configuration with XSendFile On
. If you get errors
about the path being above the root, you can bypass the check with
XSendFileAllowAbove On
. (This option was removed in favor of
XSendFilePath
in 1.0, but Ubuntu still ships 0.9. See the documentation on
XSendFile for more info)