Source code for mishmash.commands.info

import sys
from nicfit.console.ansi import Fg, Style
from pyfiglet import figlet_format
from sqlalchemy.exc import ProgrammingError, OperationalError
from .. import version
from ..core import Command
from ..util import safeDbUrl
from ..orm import Track, Artist, Album, Meta, Tag, Library

"""
TODO:
    - command line arg for selecting libary
"""


[docs]class DisplayList: def __init__(self): self._rows = []
[docs] def add(self, key, val): self._rows.append(tuple((key, val)))
[docs] def print(self, _format, clear=False, **kwargs): k_width = max([len(k) for k, v in self._rows if k]) for k, v in self._rows: if k: print(_format.format(k=k.ljust(k_width), v=v, **kwargs)) if clear: self.clear()
[docs] def clear(self): self._rows.clear()
[docs]@Command.register class Info(Command): NAME = "info" HELP = "Show information about the database and configuration." _library_arg_nargs = "*" def _initArgParser(self, parser): super()._initArgParser(parser) parser.add_argument("--artists", dest="show_artists", action="store_true", help="List all artists, per library.")
[docs] def lib_query(self, OrgType, lib): if isinstance(lib, int): lid = lib else: lid = lib.id return self.db_session.query(OrgType).filter_by(lib_id=lid)
def _displayMetaInfo(self): display_list = DisplayList() def mkkey(k): return Style.bright(Fg.blue(str(k))) def mkval(v): return str(v) display_list.add(mkkey("Version"), mkval(version)) display_list.add(mkkey("Database URL"), mkval(safeDbUrl(self.config.db_url))) try: meta = self.db_session.query(Meta).one() except (ProgrammingError, OperationalError) as ex: print("\nError querying metadata. Database may not be " "initialized: %s" % str(ex), file=sys.stderr) return 1 display_list.add(mkkey("Database version"), mkval(meta.version)) display_list.add(mkkey("Last sync"), mkval(meta.last_sync or "Never")) display_list.add(mkkey("Configuration files "), mkval(", ".join(self.args.config.input_filenames))) display_list.print("{k} {delim} {v}", delim=Style.bright(":")) def _displayLibraryInfo(self, lib): def mkkey(k): return Style.bright(str(k)) display_list = DisplayList() for name, orm_type in [("tracks", Track), ("artists", Artist), ("albums", Album), ("tags", Tag), ]: count = self.lib_query(orm_type, lib).count() display_list.add(mkkey(count), name) display_list.print("{k} music {v}", clear=True) def _displayArtists(self, lib): for a in self.lib_query(Artist, lib).order_by(Artist.sort_name).all(): print(a.name) def _run(self): logo = figlet_format("``MishMash``", font="graffiti") print(Fg.green(logo, Style.BRIGHT)) self._displayMetaInfo() for lib in Library.iterall(self.db_session, names=self.args.libs): if self.args.show_artists: print(Fg.green(f"\n=== {lib.name} library artists ===")) self._displayArtists(lib) else: print(Fg.green(f"\n=== {lib.name} library ===")) self._displayLibraryInfo(lib)