--- Title: pythonでfoobarのalternativeを作る 2 Author: yamasyuh68 Web: https://mimemo.io/m/MpVzxoDKErGvZLb --- 2019/5/9 # 早速昨日やってみた ファイル列挙はすんなりいった - しかしタグ取得がうまくいかない mp3だとイケルんだけど、fflacは取得できない m4aはどうなんだろう? このままじゃ使い物にならない┐('д')┌ - 気づいたんだが、foobarはcueも読み込んでライブラリに追加してくれてた これはどうしよう? pythonに タグなんてヘッダの構造さえわかれば簡単だろうから自作した方が速いかな??調べてみるか・・・ - SQLの書き込みは結構戸惑った 簡単と言えば簡単なんだが。手間取るのは最初だけかな。コマンドを文字列で与えて設定値は変数にする辺りが。pythonで書くが故の面倒さなのかもしれない # SQLのこと - 最初の書き方、if not exist は重要だよな 一度しか使わないデータベースなんてあり得ないから、解説サイトは全てこれで統一して欲しいものだ - 値の設定についても、変数で与える場合をデフォルトで解説してほしい 解説的には 'tarou' みたいのが簡単だとは思うけど、実際にこんな書き方をすることはまず無いだろう プログラムの中で何らかのデータを取得してそれをinsertなりupdateなりする場合しか考えられないから、変数で与えることにしかならない conn.execute('insert to hogetta values(?,?)' , (p,q)) が基本形ですよね - しかし、作成されたデータファイルを見るとtxtはそのまんまテキスト。これなら自分で書けそうな? SQLの仕組みを使わなくてもって意味です SQLをpythonにバインディングするだけである程度ロスというか、遅くなるよね データ件数が増えたときに真価を発揮するんだろうか? # mutagen - 出来たみたい(・∀・)ノ 本家 https://mutagen.readthedocs.io/en/latest/ PythonでFLACファイルのタグを扱う方法 http://tranphonic.hatenablog.com/entry/2014/11/09/225201 使い方知らないだけだった もともとifで分岐させてるからflacだけ抜いてelifするしかないな m4aとかは大丈夫なんかな? データベース件数は1069だった このなかでtitleが空白のデータを抜き出すにはどうしたら良いんだろう? こういうときこそSQLの出番だよなあ . . <家に帰ってからのコード> ``` import glob ,re , os from mutagen.easyid3 import EasyID3 from mutagen.flac import FLAC from mutagen.mp4 import MP4 from mutagen.aac import AAC import sqlite3 import time conn = sqlite3.connect(r'\database.db') c = conn.cursor() c.execute('create table IF NOT EXISTS musics(fullpath text, title text)') q='' fo=r'i:\Music\Jazz\**' count=0 count1=0 def perror(p): global count count+=1 print('error-->'+p) start = time.time() for p in glob.iglob(fo , recursive=True): count1 += 1 if os.path.isfile(p): if re.search('\.(mp3|ape|ogg)$', p): try : tags = EasyID3(p) q=tags['title'][0] except: perror(p) q='' elif re.search('\.flac$', p): try : tags = FLAC(p) q=tags['title'][0] except: perror(p) q='' elif re.search('\.(mp4|m4a)$', p): try : tags = MP4(p) q=tags['\xa9nam'][0] except: perror(p) q='' elif re.search('\.aac$', p): try : tags = AAC(p) q=tags['title'][0] except: perror(p) q='' else: continue c.execute( "INSERT INTO musics (fullpath, title) VALUES (?,?)" , ( p , q )) 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('files--{0}'.format(count1)) print('error--{0}'.format(count)) conn.commit() conn.close() ```