playerdo / player_do

#!/usr/bin/env python

# Wrapper for controlling various music players, so that you can define keyboard
# shortcuts that work for whatever player you are using.  Ideally it will still
# work even if multiple players are running if all but one are 'stopped', but
# some music players do not have such a state or it cannot be determined.

from playerdo.main import do_test, do_command, find_players
from playerdo.backends.base import Player
import sys

def usage(players):
    # Print help and list of supported players
    help = """Usage: player_do <command>

  Media players that are currently running will be detected, and the command will
  be passed on to the first, giving priority to players that seem to be active.

<command> is one of:
    max_len = len(sorted(commands, key=lambda c: len(c[0]))[-1][0])
    for name, doc, f in commands:
        help += " " + name +  " "*(max_len - len(name) + 2) + doc + "\n"

    help += """
Not all operations are supported or fully supported by all players.

Currently supported players are:
    for P in players:
        n = getattr(P, 'friendly_name', None)
        if n is not None:
            help += " " + n + "\n"

    return help

def print_usage(players):

# List of commands: (name, docstring, callable)

commands = []

for c in ["play", "pause", "unpause", "togglepause", "playpause", "stop", "next", "prev", "osd"]:
    def mk_command(name):
        def command(players):
            return do_command(name, players)
        return command
                     getattr(Player, c).__doc__.strip().replace("\n", " "),

    ("test", "Tests that all dependencies are available.", do_test),
    ("help", "Prints help.", print_usage),

command_dict = dict((name, f) for name, doc, f in commands)

if __name__ == '__main__':
    players = find_players()
    if len(sys.argv) < 2:

    name = sys.argv[1]
    command = command_dict.get(name, None)
    if command is None:
        sys.stderr.write("Unrecognised command '%s'.\n\n" % name)