Blip.fm

By Ian White Last update Aug 11, 2009 — Installed 284 times.

There are 4 previous versions of this script.

// ==UserScript==
// @name        Blip.fm
// @namespace   http://blip.fm
// @description Implement new blip notification and additional dock shortcuts. This script is meant for use with Fluid (http://fluidapp.com)
// @include     *blip.fm*
// @author      Ian White (ian@blip.fm)
// @version     0.1.2
// ==/UserScript==
// v0.1.2   2009-08-11    Show 'Now Playing' in dock menu
// v0.1.1   2009-08-11    Fix Growl notifications
// v0.1     2009-08-11    First Release

(function () {
    if (window.fluid) {
   
        // TODO: HACK! Only run once
        if(window.blipInit) return;
        window.blipInit = true;
        // ENDHACK
        
        var newBlips = 0;
        var nowPlayingHeadline = '';
        
        // Show 'loading...' in dock menu while page is loading
        window.fluid.addDockMenuItem("Loading...", function () { window.fluid.activate() });        
        
        // Do the magic after the page has completed loading
        $E.on(window, 'load', function () {
            Blip.fluid = {};
            Blip.fluid.drawDockMenu = drawDockMenu;
            
            // Add menu items
            window.fluid.removeDockMenuItem("Loading...");
            window.fluid.addDockMenuItem("Play", function () { Blip.control.play(); });
            window.fluid.addDockMenuItem("Previous", doPrev);
            window.fluid.addDockMenuItem("Next", doNext);
        
            // Change menu options with play state
            // The timeout is a workaround for a bug that crashes the app (0.9.6)
            Blip.control.events.play.subscribe(function () { setTimeout('Blip.fluid.drawDockMenu(true)', 100) });
            Blip.control.events.pause.subscribe(function () { setTimeout('Blip.fluid.drawDockMenu(false)', 100) });
            Blip.control.events.resume.subscribe(function () { setTimeout('Blip.fluid.drawDockMenu(true)', 100) });
            Blip.control.events.stop.subscribe(function () { setTimeout('Blip.fluid.drawDockMenu(false)', 100) });
        
            // Display new blips in the dock
            Blip.control.events.add.subscribe(function () {
                window.fluid.dockBadge = ++newBlips;
            });
            
            Blip.control.events.play.subscribe(function(e, o) {
                var headline = $("nowplaying").innerHTML.replace(/^Loading/, 'Now Playing');
                
                // Show 'Now Playing' in the menu
                // The delayed drawDockMenu (above) will redraw the menu, so don't bother doing it here
                if(nowPlayingHeadline) window.fluid.removeDockMenuItem(nowPlayingHeadline);
                nowPlayingHeadline = headline;
                
                // Enable Growl notifications
                window.fluid.showGrowlNotification({
                    title: "Blip.fm is now playing",
                    description: headline.replace(/^Now Playing: /, ''),
                    identifier: "Blip.fm"
                });
            });
        });
        
        // Clear out the dock badge when use clicks anywhere in the document
        $E.on(window.document, 'click', function () {
            newBlips = 0;
            window.fluid.dockBadge = null;
        });
        
        // Redraw the menu when play/pause is toggled
        // (kinda lame, but can't find a way to replace an item)
        function drawDockMenu(play) {
            var play = !!play;
            
            window.fluid.removeDockMenuItem(nowPlayingHeadline);
            window.fluid.removeDockMenuItem(" ");
            window.fluid.removeDockMenuItem("Play");
            window.fluid.removeDockMenuItem("Pause");
            window.fluid.removeDockMenuItem("Previous");
            window.fluid.removeDockMenuItem("Next");
        
            window.fluid.addDockMenuItem(nowPlayingHeadline, function () { window.fluid.activate() });
            window.fluid.addDockMenuItem(" ");
            
            if(play) {
                window.fluid.addDockMenuItem("Pause", doPause);
            } else {
                window.fluid.addDockMenuItem("Play", doPlay);
            }
                
            window.fluid.addDockMenuItem("Previous", doPrev);
            window.fluid.addDockMenuItem("Next", doNext);
        }
        
        function doPlay () {
            Blip.control.resume();
        }
        
        function doPause () {
            Blip.control.pause();
        }
        
        function doPrev () {
            Blip.control.prev();
        }
        
        function doNext () {
            Blip.control.next();
        }
    }
})();