# 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:])