switch to mutagenx and upgrade to python 3

mutagenx is about 13 times faster than mutagen!
This commit is contained in:
Connor Olding 2014-11-02 12:30:29 -08:00
parent d4fbd7a829
commit 2bbe301cdc
2 changed files with 18 additions and 24 deletions

View file

@ -1,10 +1,10 @@
from collections import MutableMapping
import mutagen
import mutagen.id3
from mutagen.easyid3 import EasyID3
import mutagenx
import mutagenx.id3
from mutagenx.easyid3 import EasyID3
def popms(id3):
for k, v in id3.iteritems():
for k, v in id3.items():
if k.startswith('POPM'):
yield k, v
@ -29,11 +29,11 @@ def rating_get(id3, key):
rating = id3['TXXX:RATING']
except KeyError:
try:
_, popm = popms(id3).next()
_, popm = next(popms(id3))
except StopIteration:
return []
else:
return [unicode(byte2rating(popm.rating))]
return [str(byte2rating(popm.rating))]
else:
return list(rating.text)
@ -48,7 +48,7 @@ def _canconv(r):
def rating_set(id3, key, val):
rating_delete(id3, key)
if _canconv(val):
popm = mutagen.id3.POPM()
popm = mutagenx.id3.POPM()
popm.email = "Windows Media Player 9 Series"
popm.count = 0
popm.rating = rating2byte(int(val))
@ -56,7 +56,7 @@ def rating_set(id3, key, val):
else:
if 'TXXX:RATING' in id3:
del(id3['TXXX:RATING'])
id3.add(mutagen.id3.TXXX(encoding=3, desc='RATING', text=unicode(val)))
id3.add(mutagenx.id3.TXXX(encoding=3, desc='RATING', text=str(val)))
def rating_delete(id3, key):
for k, v in popms(id3):
@ -81,7 +81,7 @@ class SyncFile(MutableMapping):
and a sense of self-importance"""
def __init__(self, path):
self.md = mutagen.File(path, easy=True)
self.md = mutagenx.File(path, easy=True)
self.path = path
self.seen = False
@ -95,7 +95,7 @@ class SyncFile(MutableMapping):
raise KeyError(key)
def __setitem__(self, key, value):
if type(value) != unicode:
if type(value) != str:
raise ValueError
self.md[key] = [value]

View file

@ -1,7 +1,4 @@
#!/bin/python2
# only using python2 because mutagen
from __future__ import print_function
#!/bin/python
import os
import os.path
@ -32,11 +29,11 @@ lament = lambda *args, **kwargs: print(*args, file=sys.stderr, **kwargs)
walkfiles = lambda w: (os.path.join(r, f) for r, _, fs in w for f in fs)
extof = lambda p: os.path.splitext(p)[1].lower()
filterext = lambda ps, es: (p for p in ps if extof(p) in es)
ansty = lambda u: str(u.decode('ascii', errors='replace').replace(u'\ufffd', '?'))
ansty = lambda u: str(u.decode('ascii', errors='replace').replace('\ufffd', '?'))
def shouldsync(md):
rating = md.get('rating', u'')
sync = md.get('sync', u'')
rating = md.get('rating', '')
sync = md.get('sync', '')
try:
rating = int(rating)
except ValueError:
@ -47,12 +44,12 @@ def shouldsync(md):
return sync == 'yes' or type(rating) == int and rating >= 3 and sync != 'no' and sync != 'space'
def fixmetadata(md):
md['artist'] = md.get('artist', u"Unknown Artist")
md['album'] = md.get('album', u"Unknown Album")
md['artist'] = md.get('artist', "Unknown Artist")
md['album'] = md.get('album', "Unknown Album")
if 'title' not in md:
fn = os.path.basename(md.path)
fn = os.path.splitext(fn)[0]
md['title'] = unicode(fn)
md['title'] = str(fn)
def findmatching(haystack, needle):
matchme = [needle[t].lower() for t in matchtags]
@ -97,8 +94,7 @@ def run(args):
tosync = []
indir = args[1]
_paths = lambda dir: filterext(walkfiles(os.walk(dir)), goodexts)
paths = lambda dir: _paths(unicode(dir).encode('utf-8'))
paths = lambda dir: filterext(walkfiles(os.walk(dir)), goodexts)
for p in paths(indir):
md = SyncFile(p)
@ -124,8 +120,6 @@ def run(args):
elif updatemetadata(md, match):
print("UPD", p)
md.md.save()
else:
print("___", p)
lament("[beginning tosync]")
for md in tosync: