# # Copyright (c) 2006 by Eric Gach # # 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 2 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, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # import weechat import os import popen2 import traceback __desc__ = 'Amarok control and now playing script for Weechat.' __version__ = '1.0.0' __author__ = 'Eric Gach ' dcop = {} debug = {} infobar = {} output = {} ssh = {} class amarokException(Exception): pass def amarokCommand(server, args): try: args = args.split(' ') if args[0] == 'infobar': if infobar['enabled']: infobar['enabled'] = False weechat.set_plugin_config('infobar_enabled', '0') weechat.remove_timer_handler('amarokInfobarUpdate') weechat.remove_infobar(0) weechat.prnt('Infobar disabled') else: infobar['enabled'] = True weechat.set_plugin_config('infobar_enabled', '1') amarokInfobarUpdate() weechat.add_timer_handler(infobar['update'], 'amarokInfobarUpdate') weechat.prnt('Infobar enabled') return weechat.PLUGIN_RC_OK elif args[0] == 'next': __executeCommand('next') weechat.prnt('Amarok: Playing next song.') return weechat.PLUGIN_RC_OK elif args[0] == 'np': return amarokNowPlaying(server) elif args[0] == 'pause': __executeCommand('pause') weechat.prnt('Amarok: Song paused.') return weechat.PLUGIN_RC_OK elif args[0] == 'play': __executeCommand('play') weechat.prnt('Amarok: Started playing.') return weechat.PLUGIN_RC_OK elif args[0] == 'prev': __executeCommand('prev') weechat.prnt('Amarok: Playing previous song.') return weechat.PLUGIN_RC_OK elif args[0] == 'stop': __executeCommand('stop') weechat.prnt('Amarok: Stop playing.') return weechat.PLUGIN_RC_OK elif args[0] == '': return amarokDisplayHelp(server) else: weechat.prnt('Amarok: Unknown command %s' % (args[0]), '', server) return weechat.PLUGIN_RC_OK except amarokException, ex: return weechat.PLUGIN_RC_KO except: file = open(debug['file'], 'w') traceback.print_exc(None, file) weechat.prnt('Unknown Exception encountered. Stack dumped to %s' % (debug['file']), '', server) return weechat.PLUGIN_RC_KO def amarokDisplayHelp(server): weechat.prnt('%s - Version: %s' % (__desc__, __version__), '', server) weechat.prnt('Author: %s' % (__author__), '', server) weechat.prnt('', '', server) weechat.prnt('Commands Available', '', server) weechat.prnt(' /amarok next - Move to the next song in the playlist.', '', server) weechat.prnt(' /amarok np - Display currently playing song.', '', server) weechat.prnt(' /amarok play - Start playing music.', '', server) weechat.prnt(' /amarok pause - Toggle between pause/playing.', '', server) weechat.prnt(' /amarok prev - Move to the previous song in the playlist.', '', server) weechat.prnt(' /amarok stop - Stop playing music.', '', server) weechat.prnt(' /amarok infobar - Toggle the infobar display.', '', server) weechat.prnt('', '', server) weechat.prnt('Formatting', '', server) weechat.prnt(' %artist% - Replaced with the song artist.', '', server) weechat.prnt(' %title% - Replaced with the song title.', '', server) weechat.prnt(' %album% - Replaced with the song album.', '', server) weechat.prnt(' %cTime% - Replaced with how long the song has been playing.', '', server) weechat.prnt(' %tTime% - Replaced with the length of the song.', '', server) weechat.prnt(' %bitrate% - Replaced with the bitrate of the song.', '', server) return weechat.PLUGIN_RC_OK def amarokInfobarUpdate(): __loadSettings() if infobar['enabled'] == False: return weechat.PLUGIN_RC_OK isPlaying = __executeCommands((__dcopCommand('isPlaying'),)) if isPlaying.strip() == 'false': weechat.print_infobar(infobar['update'], 'Amarok is not currently playing') return weechat.PLUGIN_RC_OK else: song = __getSongInfo() format = infobar['format'].replace('%artist%', song['artist']) format = format.replace('%title%', song['title']) format = format.replace('%album%', song['album']) format = format.replace('%cTime%', song['cTime']) format = format.replace('%tTime%', song['tTime']) format = format.replace('%bitrate%', song['bitrate']) weechat.print_infobar(infobar['update'], format) return weechat.PLUGIN_RC_OK def amarokNowPlaying(server): __loadSettings() isPlaying = __executeCommands((__dcopCommand('isPlaying'),)) if isPlaying.strip() == 'false': weechat.prnt('Amarok is not playing.', '', server) return weechat.PLUGIN_RC_KO else: song = __getSongInfo() format = output['format'].replace('%artist%', song['artist']) format = format.replace('%title%', song['title']) format = format.replace('%album%', song['album']) format = format.replace('%cTime%', song['cTime']) format = format.replace('%tTime%', song['tTime']) format = format.replace('%bitrate%', song['bitrate']) weechat.command(format) return weechat.PLUGIN_RC_OK def amarokUnload(): """Unload the plugin from weechat""" if infobar['enabled']: weechat.remove_infobar(0) weechat.remove_timer_handler('amarokInfobarUpdate') return weechat.PLUGIN_RC_OK def __dcopCommand(cmd): if dcop['user'] == '': return 'dcop amarok player %s' % (cmd) else: return 'dcop --user %s amarok player %s' % (dcop['user'], cmd) def __executeCommands(cmds): cmds = " && ".join(cmds) if ssh['enabled']: stdout, stdin, stderr = popen2.popen3('ssh -p %d %s@%s "%s"' % (ssh['port'], ssh['user'], ssh['host'], cmds)) else: stdout, stdin, stderr = popen2.popen3(cmds) error = stderr.read() if error != '': pass output = stdout.read() try: stdout.close() stdin.close() stderr.close() except: pass return output def __getSongInfo(): """Get the song information from amarok""" song = {} songs = __executeCommands( ( __dcopCommand('artist'), __dcopCommand('title'), __dcopCommand('album'), __dcopCommand('currentTime'), __dcopCommand('totalTime'), __dcopCommand('bitrate') ) ) song['artist'], song['title'], song['album'], song['cTime'], song['tTime'], song['bitrate'], empty = songs.split("\n") return song def __loadSettings(): dcop['user'] = __loadSetting('dcop_user', 'user') debug['file'] = os.path.expanduser(__loadSetting('debug_file', '~/amarok_debug.txt')) infobar['enabled'] = __loadSetting('infobar_enabled', '0', 'bool') infobar['format'] = __loadSetting('infobar_format', 'Now Playing: %title% by %artist%') infobar['update'] = __loadSetting('infobar_update', '10', 'int') output['format'] = __loadSetting('output_format', '/me is listening to %C04%title%%C by %C03%artist%%C from %C12%album%%C [%cTime% of %tTime% @ %bitrate%kbps]') ssh['enabled'] = __loadSetting('ssh_enabled', '0', 'bool') ssh['host'] = __loadSetting('ssh_host', 'localhost') ssh['port'] = __loadSetting('ssh_port', '22', 'int') ssh['user'] = __loadSetting('ssh_user', 'user') def __loadSetting(setting, default=None, type=None): value = weechat.get_plugin_config(setting) if value == '' and default != None: weechat.set_plugin_config(setting, default) value = default if type == 'int' or type == 'bool': value = int(value) if type == 'bool': value = bool(value) return value weechat.register('amarok', __version__, 'amarokUnload', __desc__) __loadSettings() if infobar['enabled']: amarokInfobarUpdate() weechat.add_timer_handler(infobar['update'], 'amarokInfobarUpdate') weechat.add_command_handler('amarok', 'amarokCommand', 'Manage amarok or display now playing information.', 'next|np|play|pause|prev|stop|infobar')