主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WMPLibを使わずにPure Pythonで音楽ファイルを集める

                
 IronPythonコードをコンパイルする場合、COMコンポーネントをNETアセンブリとしてDLL化したものは現状読み込めないというのは前回あたりの記事。だからWMPLibに用意されている、マイライブラリにあるメディアファイルをタグ情報ごと取得する関数などは使えない。ライブラリのメディアファイル収集をしたければ、自作しなければならない。だから.wmaと.mp3を収集するPythonモジュールを自作した、半分は。

 幸いなことにタグ情報を読み込むにはmutagenというPythonのサードパーティのものが使えた。IronPythonで動かすには数行程度、改変が必要だったけども。あとは再帰を使ってファイル収集とでも思ったが、.NETのドキュメントを読むと、しっかりとGetFilesなるプロパティがDirectoryInfoクラスに用意されていた。おかげで必要なスクリプトが100行にもならなかった。

from mutagen import asf, id3

import System
from System.IO import Directory, DirectoryInfo


WMA_ATTRIBUTES = ["Title", "WM/AlbumTitle", "WM/AlbumArtist"]
MP3_ATTRIBUTES = ["Title", "Album", "Artist"]

def wma_handler(filename):
if filename[-4:] == ".wma":
attr = WMA_ATTRIBUTES
file = asf.ASF(filename)
try:
info = {"Title":file.tags["Title"][0],
"Album":file.tags["WM/AlbumTitle"][0].value,
"Artist":file.tags["WM/AlbumArtist"][0].value,
"Uri":filename,
"AlbumID":file.tags["WM/AlbumTitle"][0].value + file.tags["WM/AlbumArtist"][0].value}
except:
return False
elif filename[-4:] == ".mp3":
attr = MP3_ATTRIBUTES
file = id3.ID3(filename)
try:
info = {"Title":file["TIT2"][0].decode('utf-8'),
"Album":file["TALB"][0].decode('utf-8'),
"Artist":file["TPE1"][0].decode('utf-8'),
"Uri":filename,
"AlbumID":file["TALB"][0] + file["TPE1"][0]}
except:
try:
info = {"Title":file["TIT2"][0].decode('shift-jis'),
"Album":file["TALB"][0].decode('shift-jis'),
"Artist":file["TPE1"][0].decode('shift-jis'),
"Uri":filename,
"AlbumID":file["TALB"][0] + file["TPE1"][0]}
except:
try:
info = {"Title":file["TIT2"][0],
"Album":file["TALB"][0],
"Artist":file["TPE1"][0],
"Uri":filename,
"AlbumID":file["TALB"][0] + file["TPE1"][0]}
except:
return False
else:
return False
return info

def main():
my_music = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyMusic)
wma = DirectoryInfo(my_music).GetFiles("*.wma", System.IO.SearchOption.AllDirectories)
wma_data = [wma_handler(x.FullName) for x in wma]
mp3 = DirectoryInfo(my_music).GetFiles("*.mp3", System.IO.SearchOption.AllDirectories)
mp3_data = [wma_handler(x.FullName) for x in mp3]
return wma_data + mp3_data

if __name__ == "__main__":
print main()
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。