0 pythonでfoobarのalternativeを作る 7

  • 190514 の開発

Mutagen の使い方 DB作成(第二段階)

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()
  • これは列挙ファイルから拡張子で音楽ファイルをフィルタしてmutagenに投げてタグ取得、それをDBに追加していくだけ。mutagenへの投げ方を簡単にしたもの
  • DB更新のルーチンはないので前に作ったものと合わせる必要がある。その際に二段階にする方向性だったのでその二段階目のコードがこれになる
  • m = mutagen.File(p, easy=True) とするとmに辞書でタグが入ってくる。そこからアルバムタグを取得するためにm['album'][0]とすると、あれば良いけど無いとエラーで返される。無いときはNULLを返して欲しいので、そのためにtry文としている。こういうtryの使い方はどうなんだろう?
  • 取得したいタグをあらかじめ辞書で作っておいて、そのkeyでfor文を回した。forのイテレータの作り方としては結構スマートなつもり( ´∀`)。なにより取得したいタグがあとで増えてもforを書き換えなくても良いので便利。ただしちょっと問題もあってそれは以下

新たな問題

  • タグの種類だけど、トラックナンバーについて、ファイルによってtrackとしてるものとtracknumberとしているものがある。こういう微妙な違いって、プログラム上は明確な違いなので処理が難しい。人間の目で見れば同じものってわかるんだけど。こういう違いがこれだけなら対応は簡単だが、それぞれの項目で微妙な方言があるようだと難しくなってくる。foobarの偉大さを改めて感じます
  • DBをいじってるとやはりどう書き込まれたかをすぐ見たくなる。当然だと思うが。しかし一気に千項目以上を書き込んでいるので気軽に列挙も出来ない。そうなるとGUIのDBビューアが必須だ。まずこれを作ろうと改めて考えた
  • DDでテーブルとカラム取得して、データ総数、カラム毎のデータ数とNULLの数、これらを一覧する。できれば自由にselect文を発行して結果も表示したいけどこれは難しいかな
  • ちょっと調べたらDBのビューアはフリーのものがありますね。でも落としてみたけどうまく動かなかった(・∀・)ノ。需要はあるんだよなあ、意外とビューアの方が需要あったりして。考えよう。

ビューア

  • 一度selectを発行して結果を表示するものを作ったんだけど0からの方が良いかもだなあ
  • DBからテーブルやカラム名を取得するのは意外と難しいんだな。難しいと言うよりは簡単じゃないというか。そういう使い方を想定していないんだな、多分。セキュリティを考えるとむしろわからないようにした方が良いしね
  • ここ使えますね、職場からも行ける(^_^;)
    https://www.tutorialspoint.com/execute_python3_online.php
0

メモを他の人に見せる

このメモを見せたい人に、このURL(今開いているページのURLです)を教えてあげてください

コメント(0)

  • someone

  • someone