I waited for years for a Homebrew formula for MOC. I finally found one today, but it didn't work for me. So I decided to try to compile it from source.
Here is a list of requirements, taken directly from the MOC README:
- UNIX system with POSIX threads (e.g., Linux or FreeBSD)
- ncurses (probably already installed in your system)
- C and C++ compilers (MOC is written in C, but libtool and some decoder plugins require a C++ compiler)
- libdb version 4 or later (unless configured with --disable-cache)
To support audio formats you need:
- Ogg Vorbis - libvorbis (http://www.xiph.org/ogg/vorbis/download/), or libvorbisidec (http://svn.xiph.org/trunk/Tremor).
- mp3 - libmad with libid3tag (ftp://ftp.mars.org/pub/mpeg/)
- FLAC - (http://flac.sourceforge.net/)
- WAVE, AU, AIFF, SVX, SPH, IRC, VOC - libsndfile (http://www.mega-nerd.com/libsndfile/)
- Speex - libspeex (http://www.speex.org/)
- Musepack (mpc) - libmpcdec and taglib (http://www.musepack.net/) (http://developer.kde.org/~wheeler/taglib.html)
- WMA, RealAudio (.ra), MP4 - FFmpeg version 0.5 or later (http://www.ffmpeg.org/), or LibAV 0.6.3 or later (http://www.libav.org/)
- modplug - libmodplug (http://modplug-xmms.sourceforge.net)
- MIDI - libtimidity (http://timidity.sourceforge.net/)
- SID - sidplay2 (sidplay2.sourceforge.net/)
- wavpack - libwavpack (http://www.wavpack.com/)
- AAC - libfaad2 version 2.7 or later (http://www.audiocoding.com/), and libid3tag (http://www.underbit.com/products/mad/)
For network streams:
- libcurl 7.12.2 or later (http://curl.haxx.se)
For resampling (playing files with sample rate not supported by your hardware):
- libresamplerate 0.1.2 or newer (http://www.mega-nerd.com/SRC/index.html)
For JACK (low-latency audio server):
For librcc (fixes encoding in broken mp3 tags):
So first you need to install Xcode and Homebrew if you don't already have them installed; I'll let you Google on how to do that. You also need to install a dependency that is not listed above: BerkeleyDB. Luckily there is a Homebrew package for it:
% brew install berkeley-db
Edit: The BerkeleyDB dependency is actually listed above, as libdb
. Thanks to John Fitzgerald, MOC's Maintainer, for the note.
NOTE: %
is my prompt, don't copy it, copy just the brew command!
Then you need to install JACK, because it's the audio server that will be used by MOC:
% brew install jack
Finally you need to install the required library to play MP3s, and other audio formats. All my music is in MP3 so I just had to install two libraries:
% brew install libmad
% brew install libid3tag
First you need to download MOC from here. I downloaded the Development release (2.5.0-beta1). Next you need to go extract the archive you just downloaded:
% cd ~/Downloads
% tar xvjf moc-2.5.0-beta1.tar.bz2
% cd moc-2.5.0-beta1
Next you need to configure, compile and install MOC:
% ./configure --prefix=/usr/local/Cellar/moc/2.5.0-beta1 --with-jack --enable-debug --without-ffmpeg
% make
% make install
NOTE: I haven't compiled MOC with the --without-ffmpeg
option myself, but it should work. If it
doesn't, uninstall ffmpeg using brew uninstall ffmpeg
. A big Thank you to jcf for the tip!
Now that you installed MOC, you need to configure it. The first thing I needed to do, is add the bin
directory to my $PATH
:
- If you are using ZSH, add this line to your
.zshrc
:
path=( /usr/local/Cellar/moc/2.5.0-beta1/bin $path )
- If you're using Bash, add this line to your
.bashrc
:
PATH=/usr/local/Cellar/moc/2.5.0-beta1/bin:$PATH
Next, you need to create a directory for MOC, in your home directory:
% mkdir ~/.moc
Let's skip the config file step for a minute and let's create a custom theme. First, create the
themes
directory:
% mkdir ~/.moc/themes
I use a theme I found on the CrunchBang forums. All you need to do is to create a new file for the theme with the following content:
% vim ~/.moc/themes/rhowaldt_theme
background = default default
frame = default default
window_title = default default
directory = blue default
selected_directory = blue default reverse
playlist = default default
selected_playlist = default default reverse
file = default default
selected_file = default default reverse
marked_file = blue default bold
marked_selected_file = blue default reverse
info = default default
selected_info = default default
marked_info = blue default bold
marked_selected_info = blue default bold
status = default default
title = blue default bold
state = default default
current_time = default default
time_left = default default
total_time = default default
time_total_frames = default default
sound_parameters = default default
legend = default default
disabled = default default
enabled = blue default bold
empty_mixer_bar = default default
filled_mixer_bar = default default reverse
empty_time_bar = default default
filled_time_bar = default default reverse
entry = default default
entry_title = default default
error = default default bold
message = default default bold
plist_time = default default
NOTE: I removed the documentation comments from the theme, but you can find the whole theme file here
Now you need a config file. Let's copy the example config file that came with MOC:
% cp /usr/local/Cellar/moc/2.5.0-beta1/share/doc/moc/config.example ~/.moc/config
Next, edit it with the following config:
% vim ~/.moc/config
NOTE: This configuration assumes that you are using iTerm2. Feel free to fiddle with it.
ReadTags = yes
MusicDir = /Users/aziz/Music
StartInMusicDir = yes
SoundDriver = JACK
XTerms = xterm-256color
Theme = rhowaldt_theme
MOCDir = ~/.moc
UseRCC = no
And...you're done configuring MOC!
Before you run MOC, you need to run JACK, otherwise it won't work! You can run it manually using this command:
% jackd -d coreaudio
But that's tedious to do! So let's create a launch agent:
% vim ~/Library/LaunchAgents/org.jackaudio.jackd.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.jackaudio.jackd</string>
<key>WorkingDirectory</key>
<string>/Users/aziz/</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/Cellar/jack/1.9.7/bin/jackd</string>
<string>-d</string>
<string>coreaudio</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
And load that launch agent:
% launchctl load ~/Library/LaunchAgents/org.jackaudio.jackd.plist
Now you are finally ready to use MOC!!!
% mocp
To see the list of available commands, type ?
once in MOC. The cool thing about this is that you
can run MOC in the background: just type q
(lowercase not upercast).
I found a Gist that I created a while ago. It's a bash script to enable Growl notifications for MOC! I doubt I wrote it myself, but I can't find its origins so I can't really give credit where credit is due; if you wrote this little script, post a comment and I'll update the Gist. Here it is:
#!/bin/bash
while out=$(/usr/local/Cellar/moc/2.5.0-beta1/bin/mocp -i); do
# Parse mocp output.
while IFS=: read -r field value; do
case $field in
Artist) artist=$value;;
Album) album=$value;;
SongTitle) title=$value;;
esac
done <<< "$out"
# Don't do anything if we're still on the same song.
[[ "$artist-$album-$title" = "$current" ]] && { sleep 1; continue; }
# Growl notify this information
if [[ $album && $artist && $title ]]; then
/usr/local/bin/growlnotify -t "moc: $title" -n "mocp" -m "by $artist"$'\n'"(album: $album)"
fi
# Remember the current song.
current="$artist-$album-$title"
done
Put that anywhere you want, it really doesn't matter. I've put it the bin
directory in my Home
directory. Make sure you make the script executable with chmod a+x moc-growl.sh
. Again, you can
run the script manually, but it's tedious, so I created a launch agent:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>me.azizlight.mocgrowl</string>
<key>WorkingDirectory</key>
<string>/Users/aziz/</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>/Users/aziz/bin/moc-growl.sh</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
And don't forget to load the launch agent:
% launchctl load ~/Library/LaunchAgents/me.azizlight.mocgrowl.plist
Yes there is YET ONE MORE THING! I managed to map the function keys F7
, F8
and F9
to moc
actions using applescript! Here is how to do it:
- Open Automator
- Create a new Service
- Choose "Run AppleScript" from the list of actions
- Insert the script below in the mini AppleScript editor
- Save
- Go in the Keyboard Shortcuts System Preferences
- Locate your new service
- Assign it a shortcut
I chose those function keys because they match the media keys. Do this for every script show below (three times in total):
-- This is the script to Play/Pause
do shell script "/usr/local/Cellar/moc/2.5.0-beta1/bin/mocp -G"
-- This is the script to go to the Next Song
do shell script "/usr/local/Cellar/moc/2.5.0-beta1/bin/mocp -f"
-- This is the script to go to the Previous Song
do shell script "/usr/local/Cellar/moc/2.5.0-beta1/bin/mocp -r"
I also created an Alfred Workflow to show the current playing song and triggering the play/pause/next/previous functionality. The Workflow can be downloaded here. Once downloaded, just double-click on the file and it should install it.
Voila! A full headless command-line alternative to iTunes!
Enjoy!
I created a Homebrew formula, it's a pull request right now, but it works. (I finished it before I saw this)
I'll reference this gist in the caveats as it seems really useful.
Homebrew/legacy-homebrew#22044