#!/usr/bin/env python3 from __future__ import print_function import sys import re import os import notify2 import argparse import types import fnmatch from mpd import MPDClient import time import configparser client = MPDClient() config = configparser.ConfigParser() config.sections() config.read(os.getenv('HOME')+'/.config/clerk/helper_config') change_db=(config['updater']['change_db']) separator=(config['global']['separator']) os.environ['separator'] = str(" "+separator+" ") mpd_host = 'localhost' mpd_port = '6600' mpd_pass = '' if 'MPD_HOST' in os.environ: mpd_connection = os.environ['MPD_HOST'].split('@') if len(mpd_connection) == 1: mpd_host = mpd_connection[0] elif len(mpd_connection) == 2: mpd_host = mpd_connection[1] mpd_pass = mpd_connection[0] else: print('Unable to parse MPD_HOST, using defaults') if 'MPD_PORT' in os.environ: mpd_port = os.environ['MPD_PORT'] client.connect(mpd_host, mpd_port) if mpd_pass: client.password(mpd_pass) def update(args): db=(client.stats()) new_db=db.get('db_update') if change_db == new_db: if (os.path.isfile(os.getenv('HOME')+'/.config/clerk/tracks.cache')): quit() else: notify2.init('Clerk') n = notify2.Notification("Clerk", "Updating Cache Files") n.show() albumCache(args) trackCache(args) lastCache(args) else: notify2.init('Clerk') n = notify2.Notification("Clerk", "Updating Cache Files") n.show() albumCache(args) trackCache(args) lastCache(args) config['updater']['change_db'] = str(new_db) with open(os.getenv('HOME')+'/.config/clerk/helper_config', 'w') as configfile: config.write(configfile) def lookup(key, fields): artistlist = client.list(key) content = set() for artist in artistlist: for element in client.find(key, artist): elementvalues = [] for field in fields: if field in element: fieldvalue = element[field] else: fieldvalue = '' if isinstance(fieldvalue, list): elementvalues.append(fieldvalue[0]) else: elementvalues.append(fieldvalue) content.add(tuple(elementvalues)) return content def trackCache(args): key = 'artist' fields = ('artist', 'track', 'title', 'album') content = lookup(key, fields) fh = open(os.getenv('HOME')+'/.config/clerk/tracks.cache', "w") entries = [os.getenv('separator').join(entry) for entry in content] for entry in sorted(entries, key=str.lower): fh.write(entry+"\n") fh.close() def albumCache(args): key = 'albumartist' fields = ('albumartist', 'date', 'album') content = lookup(key, fields) fh = open(os.getenv('HOME')+'/.config/clerk/album.cache', "w") entries = [os.getenv('separator').join(entry) for entry in content] for entry in sorted(entries, key=str.lower): fh.write(entry+"\n") fh.close() def lastCache(args): key = 'albumartist' fields = ('last-modified', 'date', 'albumartist', 'album') content = lookup(key, fields) seen = set() fh = open(os.getenv('HOME')+'/.config/clerk/last.cache', "w") for element in sorted(content, key=lambda elem: elem[0], reverse=True): if element[1:] not in seen: line = element[1:] fh.write(os.getenv('separator').join(line)+"\n") seen.add(line) fh.close() def readComments(args): args=vars(args) comments = (client.readcomments(sys.stdin.read()[:-1])) for key, value in sorted(comments.items()): print('%s : %s' % (key, value)) def prioSong(args): for line in sys.stdin.read().splitlines(): client.prio(255, line) def restoreTrackRating(args): client.clear() matches = [] for root, dirnames, filenames in os.walk(config['global']['music_path']): for filename in fnmatch.filter(filenames, 'track.ratings'): matches.append(os.path.join(root, filename)) for song in matches: ratingfile = open(song, 'r') for line in ratingfile: tags = line.split(" "+config['global']['separator']+" ") album = tags[5].rstrip('\n') client.searchadd('artist', tags[1], 'album', album, 'track', tags[2], 'title', tags[3], 'date', tags[4]) for song in client.playlistinfo(): ratingfile = open(config['global']['music_path']+"/"+os.path.dirname(song['file'])+'/track.ratings', 'r') for line in ratingfile: columns = line.split(" "+config['global']['separator']+" ") if song['title'] in line and song['date'] in line and song['album'] in line and song['track'] in line: client.sticker_set('song', song['file'], 'rating', columns[0]) print("Imported song "+song['title']+" with rating of "+columns[0]) #create commandline arguments parser = argparse.ArgumentParser(prog='mppc', description='A mpc clone in python') subparsers = parser.add_subparsers() parser_prio = subparsers.add_parser('prio', help="prioritize song") parser_prio.set_defaults(call=prioSong) parser_update = subparsers.add_parser('update', help="update cache files") parser_update.set_defaults(call=update) parser_readcomments = subparsers.add_parser('readcomments', help="show all tags of current song") parser_readcomments.set_defaults(call=readComments) parser_albumcache = subparsers.add_parser('albumcache', help="create album cache for clerk") parser_albumcache.set_defaults(call=albumCache) parser_trackcache = subparsers.add_parser('trackcache', help="create track cache for clerk") parser_trackcache.set_defaults(call=trackCache) parser_lastcache = subparsers.add_parser('lastcache', help="create album cache sorted by addition for clerk") parser_lastcache.set_defaults(call=lastCache) parser_restoretracks = subparsers.add_parser('restoretracks', help="restore sticker database from rating files") parser_restoretracks.set_defaults(call=restoreTrackRating) #parse arguments (thanks jat) args = parser.parse_args() try: args.call(args) except AttributeError: print("No arguments given. Try clerk_helper -h")