diff --git a/scripts/python/amarok.py b/scripts/python/amarok.py new file mode 100644 index 000000000..1b6fc3cf6 --- /dev/null +++ b/scripts/python/amarok.py @@ -0,0 +1,231 @@ +# +# 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') +