__module_name__ = "AmarokNP For XChat"
__module_version__ = "1.5"
__module_description__ = "Displays the current song playing in amarok. Has a nice gui for configuring how/what is output"
import xchat
import commands
def amarok_is_playing():
''' Checks if amarok is playing and registered with dcop
If amarok isn't playing or something went wrong, this will return false '''
is_playing = commands.getoutput("dcop amarok player status")
if is_playing == 'call failed' or is_playing == '0':
return False
else:
return True
def get_artist():
''' Will get the artist's name from amarok. '''
if amarok_is_playing():
try:
artist = commands.getoutput("dcop amarok player artist")
except Exception, e:
xchat.prnt( "Problem getting the artist from dcop...%s" % e )
return False
return artist
def get_album():
''' Gets the album name from amarok '''
if amarok_is_playing():
try:
album = commands.getoutput("dcop amarok player album")
except Exception, e:
xchat.prnt( "Problem getting the album from dcop...%s" % e )
return False
return album
def get_title():
''' Gets the title name from amarok '''
if amarok_is_playing():
try:
title = commands.getoutput("dcop amarok player title")
except Exception, e:
xchat.prnt( "Problem getting the title from dcop...%s" % e )
return False
return title
def get_my_nick():
''' Gets your first prefered nickname and assume that is the nickname you're using. '''
try:
my_nick = xchat.get_prefs("irc_nick1")
except Exception, e:
xchat.prnt( "Problem with getting your nickname...%s" % e )
return False
return my_nick
def get_track_playcount():
''' Gets the play count from amarok '''
if amarok_is_playing():
try:
playCount = commands.getoutput("dcop amarok player trackPlayCounter")
except Exception, e:
xchat.prnt( "Problem getting the playcount from dcop...%s" % e )
return False
return int(playCount)
def get_current_playtime():
''' Gets the current play time of the song.
Since the time returned is in seconds, we need to convert it. '''
if amarok_is_playing():
try:
playTime = commands.getoutput("dcop amarok player trackCurrentTime")
playTime = convertSecondstoMinutes(playTime)
except Exception, e:
xchat.prnt( "Problem getting the play time from dcop...%s" % e )
return False
return playTime
def convertSecondstoMinutes(s):
''' I found a function on a mailing list (http://mail.python.org/pipermail/python-list/2003-January/181442.html)
It accepts a seconds arguement and returns minutes '''
minutes, s = divmod(s, 60)
return str(minutes) + ' minutes ' + str(s) + ' seconds'
def now_playing(word, word_eol, userdata):
''' The "main" function. Prints out the information. '''
if amarok_is_playing():
playing =playString()
if conf["echo"]=="0":
xchat.command ( "me %s" % playing )
else:
print playing
return xchat.EAT_ALL
def now_playingc():
''' The "main" function. Prints out the information. '''
if conf["echo"]=="0":
for b in xchat.get_list("channels"):
a =b.channel
if conf.has_key(a) and conf["broadcast"]=="1":
if conf[a]=="1":
playing = playString()
xchat.command("msg "+a+" %s" % playing)
return xchat.EAT_NONE
else:
print playString()
return xchat.EAT_ALL
def anp_param(word, word_eol, userdata):
''' Set conf[word[1]] = word[2]. Used to update the conf dictionary'''
conf[word[1]] = word[2]
writeConfig()
return xchat.EAT_ALL
def writeConfig():
''' Writes all the conf array to a config file. Really simple '''
confFile = open(xchat.get_info("xchatdir") + "/amarok_np.conf","w")
for param in conf:
confFile.write(param+":"+conf[param]+"!")
confFile.close()
return 0
def loadConfig():
''' Loads the dictionary from the config file '''
try:
confFile = open(xchat.get_info("xchatdir") + "/amarok_np.conf","r")
except IOError:
conf = {"global_win":"1","allow_msg":"1","auto_show":"0","artist":"1","title":"1",
"album":"0","play_time":"0","play_count":"1","play_string":"%a%A` - `%t%B` (`%b%B`)`%C`. Played %c times.`","broadcast":"0",
"echo":"0"}
return conf
r = confFile.read()
n = 0
y = 0
conf = {}
while n >= 0:
x = r.find(":",n)
e = r.find("!",n)
name = r[n:x]
value = r[x+1:e]
conf[name] = value
if e == -1:
break
n = e + 1
confFile.close()
del conf['']
return conf
def part_remove(word,word_wol,userdata):
if conf.has_key(word[2]) and word[0].find(":" + xchat.get_info("nick") + "!") >=0:
cc = word[2]
print "Running MENU DEL \"Amarok/"+cc+"\""
xchat.command("MENU DEL \"Amarok/"+cc+"\"")
return xchat.EAT_NONE
def add_join(word,word_eol, userdata):
x = word[0]
if x[x.find(":")+1:x.find("!")] == xchat.get_info("nick"):
cc = word[2]
if conf.has_key(cc):
xchat.command("MENU -t"+conf[cc]+" ADD \"Amarok/"+cc+"\" \"anp_param "+cc+" 1\" \"anp_param "+cc+" 0\"")
else:
xchat.command("MENU -t0 ADD \"Amarok/"+cc+"\" \"anp_param "+cc+" 1\" \"anp_param "+cc+" 0\"")
conf[cc] = "0"
return xchat.EAT_NONE
def unload(userdata):
xchat.unhook(time)
xchat.command("MENU DEL Amarok")
def anp_dump(word, word_eol, userdata):
keys = conf.keys()
keys.sort()
for a in keys:
print a + "."*(19-len(a)) +conf[a]
return xchat.EAT_ALL
def chkEcho(word=None,word_eol=None,userdata=None):
global nowPlaying
if nowPlaying!=get_title():
nowPlaying=get_title()
now_playingc()
return xchat.EAT_ALL
def anpStr(word,word_eol,userdata):
try:
if word_eol[1]!="":
conf["play_string"]=word_eol[1]
writeConfig()
return xchat.EAT_ALL
except IndexError:
print "USAGE: "+word[0]+" <string>\nSets <string> to be echoed with /nowplaying. Replacement is done as follows:\n%a - artist\n%b - album\n%c - play count\n%t - title\n----------------\n%A`` will only show text between the `'s if artist is defined, %B for album etc.."
return xchat.EAT_ALL
def playString():
playing = conf["play_string"]
a = get_artist()
b = get_album()
c = get_track_playcount()
t = get_title()
if a and conf["artist"]=="1":
playing=playing.replace("%a",a)
while playing.find("%A`")>=0:
x=playing.find("%A`")
playing=playing.replace("%A`","",1)
playing=playing[:playing.find("`",x)] + playing[playing.find("`",x)+1:]
else:
playing=playing.replace("%a","")
while playing.find("%A`")>=0:
x=playing.find("%A`")
playing=playing.replace("%A`","",1)
playing=playing[:x]+playing[playing.find("`",x)+1:]
if b and conf["album"]=="1":
playing=playing.replace("%b",b)
while playing.find("%B`")>=0:
x=playing.find("%B`")
playing=playing.replace("%B`","",1)
playing=playing[:playing.find("`",x)] + playing[playing.find("`",x)+1:]
else:
playing=playing.replace("%b","")
while playing.find("%B`")>=0:
x=playing.find("%B`")
playing=playing.replace("%B`","",1)
playing=playing[:x]+playing[playing.find("`",x)+1:]
if c and conf["play_count"]=="1":
playing=playing.replace("%c",str(c))
while playing.find("%C`")>=0:
x=playing.find("%C`")
playing=playing.replace("%C`","",1)
playing=playing[:playing.find("`",x)] + playing[playing.find("`",x)+1:]
else:
playing=playing.replace("%c","")
while playing.find("%C`")>=0:
x=playing.find("%C`")
playing=playing.replace("%C`","",1)
playing=playing[:x]+playing[playing.find("`",x)+1:]
if t and conf["title"]=="1":
playing=playing.replace("%t",t)
while playing.find("%T`")>=0:
x=playing.find("%T`")
playing=playing.replace("%T`","",1)
playing=playing[:playing.find("`",x)] + playing[playing.find("`",x)+1:]
else:
playing=playing.replace("%t","")
while playing.find("%T`")>=0:
x=playing.find("%T`")
playing=playing.replace("%T`","",1)
playing=playing[:x]+playing[playing.find("`",x)+1:]
return playing
def anpReset(word,word_eol,userdata):
commands.getoutput("rm "+xchat.get_info("xchatdir")+"/amarok_np.conf")
#xchat.command("py reload amarok_np.py")
return xchat.EAT_ALL
def msgReply(word,word_eol,userdata):
if word[1] == "!np" and conf["allow_msg"]=="1":
xchat.command ( "me %s" % playString() )
return xchat.EAT_NONE
nowPlaying = get_title()
conf = loadConfig()
lastTitle = get_title()
xchat.hook_unload(unload)
time = xchat.hook_timer(1000,chkEcho)
xchat.hook_command('nowplaying', now_playing)
xchat.hook_command('anp_param', anp_param)
xchat.hook_command('anp_dump',anp_dump)
xchat.hook_command('anp_setstring',anpStr)
xchat.hook_command('anp_reset',anpReset)
xchat.hook_print('Channel Message',msgReply)
xchat.hook_server('JOIN',add_join)
xchat.hook_server('PART',part_remove)
xchat.prnt(__module_name__ + ' version ' + __module_version__ + ' loaded. Use /nowplaying to display the song you\'re playing.')
xchat.command("MENU -p-1 ADD Amarok")
xchat.command("MENU ADD \"Amarok/Global\"")
xchat.command("MENU -t" + conf['title'] + " ADD \"Amarok/Global/Display Title\" \"anp_param title 1\" \"anp_param title 0\"")
xchat.command("MENU -t" + conf['artist'] + " ADD \"Amarok/Global/Display Artist\" \"anp_param artist 1\" \"anp_param artist 0\"")
xchat.command("MENU -t" + conf['album'] + " ADD \"Amarok/Global/Display Album\" \"anp_param album 1\" \"anp_param album 0\"")
xchat.command("MENU -t" + conf['play_count'] + " ADD \"Amarok/Global/Display Play Count\" \"anp_param play_count 1\" \"anp_param play_count 0\"")
xchat.command("MENU -t" + conf['broadcast'] + " ADD \"Amarok/Global/Announce To Checked Channels\" \"anp_param broadcast 1\" \"anp_param broadcast 0\"")
xchat.command("MENU -t" + conf['echo'] + " ADD \"Amarok/Global/Echo Instead Of Say\" \"anp_param echo 1\" \"anp_param echo 0\"")
xchat.command("MENU -t" + conf['allow_msg'] + " ADD \"Amarok/Global/Reply To !np\" \"anp_param allow_msg 1\" \"anp_param allow_msg 0\"")
chans = xchat.get_list("channels")
for c in chans:
if c.type == 2 and conf.has_key(c.channel):
cc = c.channel
xchat.command("MENU -t"+conf[cc]+" ADD \"Amarok/"+cc+"\" \"anp_param "+cc+" 1\" \"anp_param "+cc+" 0\"")
else:
if c.type == 2:
cc = c.channel
xchat.command("MENU -t0 ADD \"Amarok/"+cc+"\" \"anp_param "+cc+" 1\" \"anp_param "+cc+" 0\"")
xchat.command("anp_time")