From b3409ef7836af7daa8408ffcff9d7d97052fd107 Mon Sep 17 00:00:00 2001 From: Rasmus Steinke Date: Thu, 3 Aug 2017 17:26:42 +0200 Subject: First draft of perl version --- clerk_helper | 366 ----------------------------------------------------------- 1 file changed, 366 deletions(-) delete mode 100755 clerk_helper (limited to 'clerk_helper') diff --git a/clerk_helper b/clerk_helper deleted file mode 100755 index 4418cb6..0000000 --- a/clerk_helper +++ /dev/null @@ -1,366 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import os -import json -import argparse -from mpd import MPDClient - -client = MPDClient() - -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 track_sort(track_num): - if track_num == '': - return 0 - else: - return int(track_num.split('/')[0]) - - -def loadjson(fname): - with open(fname) as data_file: - data = json.load(data_file) - return data - -def extract_key(entry): - return entry["albumartist"] + entry["album"] + entry["date"] - -def hashdata(jdata): - hashmap = {} - for i in range(len(jdata)): - key = extract_key(jdata[i]) - hashmap[key] = i - return hashmap - -def has_entry(fastlist, albumartist, album, date): - key = albumartist+album+date - if key in fastlist[1]: - return True - else: - return False - -def get_entry(fastlist, albumartist, album, date): - return fastlist[0][fastlist[1][albumartist+album+date]] - -def load_fastlist(fname): - jdata = loadjson(fname) - hdata = hashdata(jdata) - return (jdata, hdata) - -def save_fastlist(fname, fastlist): - with open(fname, "w") as data_file: - json.dump(fastlist[0], data_file, ensure_ascii=False) - -def append_entry(fastlist, entry): - index = len(fastlist[0]) - fastlist[0].append(entry) - fastlist[1][extract_key(entry)] = index - -def prune_fastlist(fastlist, mpdcachefile): - mpdlist = loadjson(mpdcachefile) - data = fastlist[0] - new = [] - for e in mpdlist: - key = (e["albumartist"], e["album"], e["date"]) - if has_entry(fastlist, *key): - entry = get_entry(fastlist, *key) - new.append(entry) - newhdata = hashdata(new) - return (new, newhdata) - -def rateAlbum(args): - try: - fastlist = load_fastlist(os.getenv('db_rate_album')) - entry = get_entry(fastlist, args.artist, args.album, args.date) - entry["rating"] = args.rating - except KeyError: - entry = {'albumartist': args.artist, 'album': args.album, 'date': args.date, 'disc': os.getenv('disc'), 'track': os.getenv('track'), 'rating': args.rating} - append_entry(fastlist, entry) - except FileNotFoundError: - fastlist = ([], {}) - entry = {'albumartist': args.artist, 'album': args.album, 'date': args.date, 'disc': os.getenv('disc'), 'track': os.getenv('track'), 'rating': args.rating} - fastlist[0].append(entry) - finally: - save_fastlist(os.getenv('db_rate_album'), fastlist) - uri = client.find('albumartist', args.artist, 'album', args.album, 'date', args.date, 'track', os.getenv('track'), 'disc', os.getenv('disc')) - for i in uri: - client.sticker_set("song", i['file'], "albumrating", args.rating) - - - -def loadjsonTrack(fname): - with open(fname) as data_file: - data = json.load(data_file) - return data - -def extract_keyTrack(entry): - return entry["artist"] + entry["album"] + entry["track"] + entry["title"] - -def hashdataTrack(jdata): - hashmap = {} - for i in range(len(jdata)): - key = extract_keyTrack(jdata[i]) - hashmap[key] = i - return hashmap - -def has_entryTrack(fastlist, artist, album, track, title): - key = artist+album+track+title - if key in fastlist[1]: - return True - else: - return False - -def get_entryTrack(fastlist, artist, album, track, title): - return fastlist[0][fastlist[1][artist+album+track+title]] - -def load_fastlistTrack(fname): - jdata = loadjsonTrack(fname) - hdata = hashdataTrack(jdata) - return (jdata, hdata) - -def save_fastlistTrack(fname, fastlist): - with open(fname, "w") as data_file: - json.dump(fastlist[0], data_file, ensure_ascii=False) - -def append_entryTrack(fastlist, entry): - index = len(fastlist[0]) - fastlist[0].append(entry) - fastlist[1][extract_keyTrack(entry)] = index - -def prune_fastlistTrack(fastlist, mpdcachefile): - mpdlist = loadjsonTrack(mpdcachefile) - data = fastlist[0] - new = [] - for e in mpdlist: - key = (e["artist"], e["album"], e["track"], e["title"]) - if has_entryTrack(fastlist, *key): - entry = get_entryTrack(fastlist, *key) - new.append(entry) - newhdata = hashdataTrack(new) - return (new, newhdata) - -def rateTrack(args): - """ rate a single track: create/update json track database and update mpd - sticker database - """ - try: - fastlist = load_fastlistTrack(os.getenv('db_rate_track')) - entry = get_entryTrack(fastlist, args.artist, args.album, args.track, args.title) - entry["rating"] = args.rating - except KeyError: - entry = {'artist': args.artist, 'album': args.album, 'track': args.track, 'title': args.title, 'rating': args.rating} - append_entryTrack(fastlist, entry) - except FileNotFoundError: - fastlist = ([], {}) - entry = {'artist': args.artist, 'album': args.album, 'track': args.track, 'title': args.title, 'rating': args.rating} - fastlist[0].append(entry) - finally: - save_fastlistTrack(os.getenv('db_rate_track'), fastlist) - uri = client.find('artist', args.artist, 'album', args.album, 'track', args.track, 'title', args.title) - for i in uri: - client.sticker_set("song", i['file'], "rating", args.rating) - - - -def cleanRatings(args): - fastlist = load_fastlist(os.getenv('db_rate_album')) - prunedlist = prune_fastlist(fastlist, os.getenv('cache_album')+'.json') - save_fastlist(os.getenv('db_rate_album'), prunedlist) - fastlist = load_fastlistTrack(os.getenv('db_rate_track')) - prunedlist = prune_fastlistTrack(fastlist, os.getenv('cache_track')+'.json') - save_fastlistTrack(os.getenv('db_rate_track'), prunedlist) - - -def importTrackRatings(args): - tracklist = client.sticker_find('song', "", 'rating') - rated_tracks = [] - for i in tracklist: - rating_temp = i['sticker'] - rating = rating_temp.split('=')[1] - for x in client.find('file', i['file']): - artist = x['artist'] - title = x['title'] - album = x['album'] - if isinstance(x['track'], list): - track = x['track'][0] - else: - track = x['track'] - entry = {'artist': artist, 'album': album, 'track': track, 'title': title, 'rating': rating} - rated_tracks.append(entry) - with open(os.getenv('db_rate_track'), 'w') as ratingfile: - json.dump(rated_tracks, ratingfile) - -def importAlbumRatings(args): - ratelist = client.sticker_find('song', "", 'albumrating') - rated_tracks = [] - for i in ratelist: - rating_temp = i['sticker'] - rating = rating_temp.split('=')[1] - for x in client.find('file', i['file']): - artist = x['albumartist'] - album = x['album'] - date = x['date'] - if isinstance(x['track'], list): - track = x['track'][0] - else: - track = x['track'] - if 'disc' in x: - if isinstance(x['disc'], list): - disc = x['disc'][0] - else: - disc = x['disc'] - else: - disc = "" - entry = {'albumartist': artist, 'track': track, 'album': album, 'date': date, 'disc': disc, 'rating': rating} - rated_tracks.append(entry) - with open(os.getenv('db_rate_album'), 'w') as ratingfile: - json.dump(rated_tracks, ratingfile) - -def sendStickers(args): - with open(os.getenv('db_rate_track')) as cache_file: - content = json.load(cache_file) - for track in content: - uri = client.find('artist', track['artist'], 'album', track['album'], 'title', track['title'], 'track', track['track']) - rating = track['rating'] - for x in uri: - client.sticker_set('song', x['file'], 'rating', rating) - print("Imported Rating of "+rating+" for file "+x['file']) - - with open(os.getenv('db_rate_album')) as cache_file: - content = json.load(cache_file) - for album in content: - uri = client.find('albumartist', album['albumartist'], 'album', album['album'], 'disc', album['disc'], 'date', album['date'], 'track', album['track']) - rating = album['rating'] - for x in uri: - client.sticker_set('song', x['file'], 'albumrating', rating) - print("Imported Rating of "+rating+" for album "+album['albumartist']+" - "+album['album']) - - -def getAlbumRatings(args): - ratings = client.sticker_find('song', '', 'albumrating') - albumlist = [] - for x in ratings: - rating = x['sticker'] - albums = client.find('file', x['file']) - for album in albums: - entry = {'albumartist': album['albumartist'], 'date': album['date'], 'album': album['album'], 'track': album['track'], 'rating': rating} - print(entry['albumartist']+os.getenv('separator')+entry['date']+os.getenv('separator')+entry['album']+os.getenv('separator')+entry['rating']) - - -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 savetoPlaylist(args): - for line in sys.stdin: - if line.strip(): - line = line.strip() - client.playlistadd("clerk", line) -# print(line, end="") - -def getArtistAlbums(args): - albums=client.find('artist', args.artist) - albumlist=[] - for album in albums: - albumlist.append(album['date']+os.getenv('separator')+album['album']) - uni=set(albumlist) - result = list(uni) - sorted_results = sorted(result) - for x in sorted_results: - print("(Album) "+x) - -def getArtistTracks(args): - tracks=client.find('artist', args.artist) - tracklist=[] - for track in tracks: - entry = {'track': track['track'], 'title': track['title']} - tracklist.append(entry) - for x in tracklist: - print("(Song) "+x['track']+os.getenv('separator')+x['title']) - -# create commandline arguments -parser = argparse.ArgumentParser(prog='clerk_helper', description='Companion script for clerk') -subparsers = parser.add_subparsers() - -parser_prio = subparsers.add_parser('prio', help="prioritize song") -parser_prio.set_defaults(call=prioSong) - -parser_readcomments = subparsers.add_parser('readcomments', help="show all tags of current song") -parser_readcomments.set_defaults(call=readComments) - -parser_saveto = subparsers.add_parser('saveto', help="save stdin to playlist \"clerk\"") -parser_saveto.set_defaults(call=savetoPlaylist) - -parser_ratealbum = subparsers.add_parser('ratealbum', help="rate current Album") -parser_ratealbum.add_argument('artist', action="store") -parser_ratealbum.add_argument('album', action="store") -parser_ratealbum.add_argument('date', action="store") -parser_ratealbum.add_argument('rating', action="store") -parser_ratealbum.set_defaults(call=rateAlbum) - -parser_ratetrack = subparsers.add_parser('ratetrack', help="rate current Track") -parser_ratetrack.add_argument('artist', action="store") -parser_ratetrack.add_argument('album', action="store") -parser_ratetrack.add_argument('track', action="store") -parser_ratetrack.add_argument('title', action="store") -parser_ratetrack.add_argument('rating', action="store") -parser_ratetrack.set_defaults(call=rateTrack) - -parser_cleanratings = subparsers.add_parser('cleanratings', help="Clean up Ratings file.") -parser_cleanratings.set_defaults(call=cleanRatings) - -parser_importtrackratings = subparsers.add_parser('importtrackratings', help="Import track ratings from mpd stickers") -parser_importtrackratings.set_defaults(call=importTrackRatings) - -parser_importalbumratings = subparsers.add_parser('importalbumratings', help="Import album ratings from mpd stickers") -parser_importalbumratings.set_defaults(call=importAlbumRatings) - -parser_sendstickers = subparsers.add_parser('sendstickers', help="Send clerk ratings to mpd") -parser_sendstickers.set_defaults(call=sendStickers) - -parser_getalbumratings = subparsers.add_parser('getalbumratings', help="Print Album Ratings") -parser_getalbumratings.set_defaults(call=getAlbumRatings) - -parser_getartistalbums = subparsers.add_parser('getartistalbums', help="Print all albums by Artist") -parser_getartistalbums.add_argument('artist', action="store") -parser_getartistalbums.set_defaults(call=getArtistAlbums) - -parser_getartisttracks = subparsers.add_parser('getartisttracks', help="Print all tracks by Artist") -parser_getartisttracks.add_argument('artist', action="store") -parser_getartisttracks.set_defaults(call=getArtistTracks) - -# parse arguments (thanks jat) -args = parser.parse_args() - -try: - args.call(args) -except AttributeError: - print("No arguments given. Try clerk_helper -h") -- cgit v1.2.3-24-g4f1b