mutagen の関数がファイル毎になっていて面倒でどうにかならんかなあと思って調べたらmutagen.File
がオールマイティみたいだったので試したらいけた
import glob ,re , os ,mutagen
import sqlite3
import time
# mutagen.File 利用
count={'all':0 , 'mfile':0 , 'nonemusic':0 , 'file':0}
tags={'title':'','album':'','artist':'','track':''}
fo=r'i:\Music\Jazz\**'
conn = sqlite3.connect(<<db-pass>>)
c = conn.cursor()
c.execute('create table IF NOT EXISTS musics(fullpath text, mdata,title,track,album ,artist)')
start = time.time()
for p in glob.iglob(fo , recursive=True):
count['all']+=1
if os.path.isfile(p):
count['file']+=1
if re.search('\.(mp3|ape|ogg|flac|aac|mp4|m4a)$', p):
count['mfile']+=1
m = mutagen.File(p, easy=True)
for tag in tags.keys():
try :
tags[tag]=m[tag][0]
except:
tags[tag]=None
c.execute( "INSERT INTO musics (fullpath, title,track,album ,artist) VALUES (?,?,?,?,?)" ,
( p , tags['title'],tags['track'],tags['album'],tags['artist'] ))
for tag in tags.keys():
tags[tag]=None
else:
count['nonemusic']+=1
continue
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
c.execute('select count (*) from musics')
print('data--{0}'.format(c.fetchall()))
print(count)
conn.commit()
conn.close()
m['album'][0]
とすると、あれば良いけど無いとエラーで返される。無いときはNULLを返して欲しいので、そのためにtry
文としている。こういうtryの使い方はどうなんだろう?track
としてるものとtracknumber
としているものがある。こういう微妙な違いって、プログラム上は明確な違いなので処理が難しい。人間の目で見れば同じものってわかるんだけど。こういう違いがこれだけなら対応は簡単だが、それぞれの項目で微妙な方言があるようだと難しくなってくる。foobarの偉大さを改めて感じます