#!/usr/bin/python # vim: ts=4 sw=4 et: # # Use fmio with gqradio or other presets # Written by Andy Shevchenko # Check for new version at http://smile.org.ua/~andy/prj/patch/fmio-gq-wrapper.py # import sys import os import getopt import re FALSE = 0 TRUE = 1 # # Options # # version version = "0.4.1" # default fmio path fmio = "/usr/bin/fmio" # default fmio driver driver = "v4l" # default volume volume = 10 # user's home directory homedir = os.environ["HOME"] # possible configurations cfgs = { # program : ['basedir', 'presets'] 'gqradio' : ['.gqradio', 'presets.gqmpeg'], 'kradio' : ['.kde/share/config', '.kradiorc'], 'radio' : ['', '.radio'], 'wmfmiorc' : ['', '.wmfmiorc'], } cfgsRE = { 'gqradio' : '^radio:(?P\d+\.?\d*)(:(?P.*))?$', 'kradio' : '^(?P\d{8,9})(=(?P.*))?$', 'radio' : '^(?P\d{8,9})(=(?P.*))?$', 'wmfmiorc' : '^\s*(?P\d{1,3}\.?\d{,3})\s*(#\s*(?P[^\s].*))?$', } # use configuration from given program cfgprogram = "gqradio" # verbosity verbosity = 0 quiet = FALSE # # internal variable(s) # preset = 0 frequency = '87.5' list = FALSE # # Program # def debug(level, msg): if level <= verbosity: print msg def fatal(msg): if quiet == FALSE: print "FATAL: %s" % msg def usage(): print \ """Usage: %s [... options ...] [-- fmio options ...] -c, --config=PROGRAM use configuration of the PROGRAM -l, --list list available presets -p, --preset=PRESET get data from PRESET (PRESET = 1, 2, ...) -d, --driver=DRIVER use DRIVER -v, --volume=VOLUME set VOLUME of card (0 will mute card) -h, --help this help -x increase verbosity --quiet be quiet -b, --build get version""" % os.path.basename(sys.argv[0]) def readfile(filename): if not os.access(filename, os.R_OK): return f = open(filename, "r") lines = f.readlines() f.close() return lines def parse(program, lines): if not lines: return records = [] reCfg = re.compile(cfgsRE[program], re.UNICODE) for s in lines: check = reCfg.match(s) if check: frequency = check.group('frequency') # Hack for radio or kradio syntax if len(frequency) == 8 or len(frequency) == 9: frequency = str(intConv(frequency) / 1000000.0) name = check.group('name') debug(2, "Push preset: %s %s" % (frequency, name)) records.append({'frequency': frequency, 'name' : name}) return records def intConv(s): try: integer = int(s) except ValueError: debug(1, "expecting integer, got " + s) integer = 0 return integer def printStation(records, preset): if quiet == FALSE: print "% 3d: (%-7s) %s" % (preset, records[preset - 1]['frequency'], records[preset - 1]['name']) # # MAIN # try: (opts, rest) = getopt.getopt(sys.argv[1:], "bc:d:hlp:v:x", ["build", "config", "driver=", "help", "list", "preset=", "quiet", "volume="]) except (getopt.GetoptError), e: fatal(e) usage() sys.exit(1) for (opt, value) in opts: if opt == "-b" or opt == "--build": print "%s version %s" % (os.path.basename(sys.argv[0]), version) sys.exit(0) if opt == "-c" or opt == "--cfg": cfgprogram = value if opt == "-h" or opt == "--help": usage() sys.exit(0) if opt == "-d" or opt == "--driver": driver = value if opt == "-l" or opt == "--list": list = TRUE if opt == "-p" or opt == "--preset": preset = intConv(value) if opt == "--quiet": quiet = TRUE if opt == "-v" or opt == "--volume": volume = intConv(value) if opt == "-x": verbosity += 1 # check for proper fmio path if not os.access(fmio, os.X_OK): fatal("fmio doesn't present at %s!" % fmio) sys.exit(1) if not cfgs.get(cfgprogram, None): fatal("%s isn't allowed!" % cfgprogram) sys.exit(1) # read and parse file presetsFile = homedir + "/" + cfgs[cfgprogram][0] + "/" + cfgs[cfgprogram][1] lines = readfile(presetsFile) if not lines: fatal("can't read file %s!" % presetsFile) sys.exit(1) records = parse(cfgprogram, lines) # --list if list == TRUE: count = 0 while count < len(records): printStation(records, count + 1) count += 1 sys.exit(0) # Fix preset parameter if preset < 1 or preset > len(records): preset = 0 # Setup default frequency if len(records) > 0: if preset == 0: preset = 1 frequency = records[0]['frequency'] debug(2, "default frequency: %s " % frequency) if preset > 1: frequency = records[preset - 1]['frequency'] debug(2, "work frequency: %s" % frequency) cmdline = [fmio, "-d", driver, "-v", str(volume), "-f", frequency] + rest debug(1, cmdline) printStation(records, preset) os.execvp(cmdline[0], cmdline)