git.fiddlerwoaroof.com
Raw Blame History
# Copyright (c) 2011 Edward Langley
# All rights reserved.

from __future__ import print_function
import collections
import itertools
from pprint import pprint
class ResponseDict(collections.Mapping):
    '''A mapping to hold the results of MPD commands'''
    def __init__(self, dat=None):
        self.data = [{}]
        if dat is not None:
            dat = self.__preproc_dat(dat)
            for line in dat:
                self.add_line(line)

    def __preproc_dat(self, dat):
        if hasattr(dat, 'split'):
            dat = dat.split('\n')
        return dat

    def add_line(self, line):
        k,_,v = line.strip().partition(':')

        if k in self.data[-1] and k.lower() == 'file':
            self.data.append({})
        self.data[-1].setdefault(k, []).append(v.strip())
        return (k,self.data[-1][k][-1])

    def __getitem__(self,it):
        return self.data[-1][it]

    def __iter__(self):
        return iter(self.data[-1])

    def __len__(self):
        return len(self.data[-1])

    def as_list(self):
        out = []
        for datum in self.data:
            out.append({})
            for k in datum:
                out[-1].setdefault(k,[]).extend(item for item in datum[k])
        return out

    def as_table(self):
        keys = set()
        out = {}
        for dct in self.data:
            keys.update(dct)
        for dct in self.data:
            for key in keys:
                out.setdefault(key, []).append(dct.get(key,['']))
        return out


def pprint_table(tbl, cols=None):
    keys = tbl.keys()
    if cols is None:
        cols = keys

    print('\t'.join(cols))
    out = []
    for k in cols:
        out.append(tbl[k])
    out = zip(*out)
    print('\n'.join('\t'.join(z) for z in out))




def main(args):
    import sys
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('-c', '--col', action='append', default=None)
    args = parser.parse_args(args)
    rdict = ResponseDict()
    line = sys.stdin.readline().strip()
    while True:
        line = sys.stdin.readline().strip()
        if line == 'OK': break
        rdict.add_line(line)
    pprint_table(rdict.as_table(), cols=args.col)

if __name__ == '__main__':
    import sys
    main(sys.argv[1:])