view vixm/control.py @ 20:f39963e96ca1

Rework of the help string code Instead of having all the help strings in the command table, we just shove them into the __doc__ for each of the function handlers. This means that no one function can handle two different functionalities as their help string space would collide. This is fine most of the time anyway. However, the considerably cleaner command table is a major plus. The only other "negative" side-effect is the fact that we need to make sure that the first two lines of the function handler are in the right format. First line: the command along with any optional or mandatory arguments Second line: "\t - " followed by a one line description of what the command does. Subsequent lines: All subsequent lines are currently ignored, however it would be nice to display the entire __doc__ string content when something like "h <help string>"-type functionality is implemented.
author Josef "Jeff" Sipek <jeffpc@josefsipek.net>
date Sun, 20 Aug 2006 01:00:29 -0400
parents a3385f616b53
children dfcf1a46fc56
line wrap: on
line source

import os, xmms

import playlist, util

def cmd_quit(ui, start, stop, args):
	"""q[!]
		- quit
	Quits the program. The optional '!' forces the termination
	regardless of any unsaved work"""
	ui.shutdown = True

def cmd_number(ui, start, stop, args):
	"""[range]n [playlistid]
		- print the addressed lines
	The lines are printed along with the line/song numbers. See also: 'l'"""
	do_list(ui, start, stop, True, args)

def cmd_list(ui, start, stop, args):
	"""[range]l [playlistid]
		- print the addressed lines
	See also: 'n'"""
	do_list(ui, start, stop, False, args)

def cmd_enqueue(ui, start, stop, args):
	"""a [songid]
		- appends/enqueues a song
	A song at songid position in LIST_DEFAULT is appended to the end of
	the LIST_PRIO playlist. Duplicates are _NOT_ eliminated."""
	try:
		id = int(args[0])-1

		if (id < 0) or \
		   (id >= len(ui.lists[playlist.LIST_DEFAULT])):
			raise ValueError

	except ValueError:
		print "Invalid song id"
		return

	s = ui.lists[playlist.LIST_DEFAULT][id]
	print "Enqueuing song: %s (%s)" % (s["title"], util.strtime(s["time"]))
	ui.lists[playlist.LIST_PRIO].enqueue(s)

def cmd_dequeue(ui, start, stop, args):
	"""[range]d
		- delete/dequeue addressed songs
	Songs in range are removed from the LIST_PRIO playlist. They still
	remain in the LIST_DEFAULT at their original locations."""
	l = ui.lists[playlist.LIST_PRIO]

	max = len(l)
	if not max:
		return

	start = util.fixupint(start, max)
	stop = util.fixupint(stop, max)

	for i in range(start-1, stop):
		s = l[start-1]
		print "Dequeuing song: %s (%s)" % (s["title"],
				util.strtime(s["time"]))
		l.dequeue(s)

def cmd_help(ui, start, stop, args):
	"""h
		- this help screen"""
	keys = args[0].keys()
	keys.sort()
	for c in keys:
		text = args[0][c][0].__doc__.split("\n")[0:2]
		text = "\n".join(text)
		print "  %s" % (text,)

def do_list(ui, start, stop, number, args):
	# get the list id from the argument or default to
	# LIST_PRIO
	try:
		if args[1]:
			listid = int(args[1])
		else:
			listid = playlist.LIST_PRIO

		if listid < 0 or listid >= len(ui.lists):
			raise ValueError
	except ValueError, e:
		print "Invalid list number"
		raise e

	max = len(ui.lists[listid])
	if not max:
		return

	start = util.fixupint(start, max)
	stop = util.fixupint(stop, max)

	# starting number should be less than the ending
	# number, as well as positive; ending number should
	# be less than or equal to the size of the playlist
	if start > stop or \
	   start < 1 or \
	   stop > max:
		raise ValueError

	i = 1
	pfx = ""
	for s in ui.lists[listid]:
		if i < start or i > stop:
			i += 1
			continue

		if number:
			pfx = "%d. " % (i,)

		print "%s%s (%s)" % (pfx, s["title"],
				util.strtime(s["time"]))
		i += 1

def cmd_play(ui, start, stop, args):
	"""x
		- Direct XMMS control: play"""
	xmms.control.play()

def cmd_pause(ui, start, stop, args):
	"""c
		- Direct XMMS control: pause"""
	xmms.control.pause()

def cmd_stop(ui, start, stop, args):
	"""v
		- Direct XMMS control: stop"""
	xmms.control.stop()

def cmd_prev(ui, start, stop, args):
	"""z
		- Direct XMMS control: previous song"""
	xmms.control.playlist_prev()

def cmd_next(ui, start, stop, args):
	"""b
		- Direct XMMS control: next song"""
	xmms.control.playlist_next()

def cmd_shell(ui, start, stop, args):
	"""![command]
		- Execute a shell command"""
	if args[0]:
		os.system(args[0])
	print "!"