#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (c) 2009 Efrim {{{ # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # }}} """ DOC: heavily borrowed from perl script mpdtoys and converted to python. mpdtoys © 2007 Joey Hess http://kitenet.net/~joey/code/mpdtoys """ import sys from time import sleep from lib.mpdutils import mconnect USAGE = """Usage: mfade [time [min|max]] * time in seconds * min|max in percentag when MPD is: - not palying: fade in from 0% to max over time default 10 minutes / 50% - playing: fade out from current volume to min over time default 10 minutes / 1/10 of current vol Manual or any external volume change will abort the script. """ class Sleep(object): """ """ def __init__(self): """""" self.tempo = int(10) self.volum = None self._consume_sopt() self.cli = mconnect() self._run() self.cli.disconnect() def _consume_sopt(self): """""" # TODO: use optparse? options = sys.argv if len(sys.argv) > 1 and sys.argv[1] in ['-h', '--help']: sys.stderr.write(USAGE) sys.exit(1) try: self.tempo = int(options.pop(1)) self.volum = int(options.pop(1)) except IndexError: pass except ValueError, err: sys.stderr.write('Error: wrong option passed: %s' % err) sys.stdout.write(USAGE) sys.exit(1) def _run(self): """""" self.mpd_state = str(self.cli.status().get('state')) self.mpd_vol = int(self.cli.status().get('volume')) if self.mpd_state == 'play': if not self.volum: self.volum = self.mpd_vol / 10 if self.volum > self.mpd_vol: sys.stderr.write('Error: specified min volume (%d%%) > to current volume (%d%%)' % (self.volum, self.mpd_vol)) sys.exit(1) print >> sys.stdout, 'fading down from %d%% to %d%% over %smin' % (self.mpd_vol, self.volum, self.tempo) if self.fade(): self.cli.stop() if self.mpd_state in ['stop', 'pause']: if not self.volum: self.volum = int(50) print >> sys.stdout, 'fading up from 0%% to %d%% over %smin' % (self.volum, self.tempo) self.cli.setvol(0) self.mpd_vol = 0 self.cli.play() self.fade() sleep(1) def fade(self): """""" # TODO: handle possible lost connections span = float(self.volum - self.mpd_vol) step = span / float(60 * self.tempo) vol = self.mpd_vol while 42: if int(vol) != int(self.cli.status().get('volume')): sys.stderr.write('Warning: external volume change, aborting!\n') return False vol += step self.cli.setvol(int(vol)) if abs(vol - self.volum) < 1: self.cli.setvol(self.volum) return True sleep(1) # Script starts here if __name__ == '__main__': try: Sleep() except KeyboardInterrupt: sys.stdout.write('exit') # VIM MODLINE # vim: ai ts=4 sw=4 sts=4 expandtab