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

スポンサーサイト

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

音楽ファイル(.wma)のタイトルやアーティスト名変更 with python

                
tags:
先日発売されたB'zのアルバム『C'mon』を買ったのだけど、WMPでは楽曲情報がアップロードされていない。なのでPCに取り込んでも曲名が'トラック01'とかのまま。
さて、手入力はめんどい。そいやジャンル名をJ-popでなく日韓流行音楽としたり、曲名にタイアップ名まで表記されていたり、アルファベットは全角だったりで、自動情報取得は便利ながらも若干気に入らなかった。というわけで.wmaファイルの楽曲情報をほぼ自動更新するものを書いた、pythonで。

1.どうやって.wmaファイルの楽曲情報をいじるのか
ググったらpythonで使えるものでは'mutagen'というのが出てきた。easy_installで入れたあと、試してみたらすんなりと使えた。
mutagen

2.楽曲情報はどうするのか
Amazon Advertising APIで曲名やらなんやら色々取ってこられる。EANかASINさえあればいいので手軽。
110728.jpg

# -*- coding: utf-8 -*-

import glob
import os
import urllib
import hashlib, hmac
import base64
import datetime
import re

from mutagen.asf import ASF

def amazon_req(id):
id_num=len(id)
xmlfile2=''

#リクエスト項目列挙1
service='Service=AWSECommerceService'
key1='xxxxxxxxxxxxxxxxxxxxxxx'
key2='xxxxxxxxxxxxxxxxxxxxxxx'
operation='Operation=ItemLookup'
version='Version=2010-06-01'
response='ResponseGroup=Large'
searchindex='SearchIndex=All'
associate='xxxxxxxxxxxxxx'
if len(id)==13:
idtype='IdType=EAN'
elif len(id)==10:
idtype='IdType=ASIN'

id_quo=urllib.quote(id)
itemid='ItemId=%s' % id_quo
ymd=datetime.datetime.utcnow().strftime("Timestamp=%Y-%m-%d")
hms=datetime.datetime.utcnow().strftime("T%H:%M:%SZ")
hms=urllib.quote(hms)
timestamp=ymd+hms
if idtype=='IdType=EAN':
request=[timestamp, service, operation, version, response, idtype,\
itemid, searchindex, associate]
elif idtype=='IdType=ASIN':
request=[timestamp, service, operation, version, response, idtype,\
itemid, associate]
req_sorted =sorted(request)
req_joined=key1+'&'+'&'.join(req_sorted)
sign_head='GET\necs.amazonaws.jp\n/onca/xml\n'
req_joined2=sign_head+req_joined

#署名作成
hmac_digest = hmac.new(key2, req_joined2, hashlib.sha256).digest()
base64_encoded = base64.b64encode(hmac_digest)
result = urllib.quote(base64_encoded)

#リクエスト
fin_req='http://ecs.amazonaws.jp/onca/xml?'+req_joined+'&Signature='+result
##print fin_req
xmlfile=urllib.urlopen(fin_req)
xml_join=xmlfile.read()
xmlfile2 = xmlfile2 + xml_join

xmlfile2 = re.sub('\n','',xmlfile2)
return xmlfile2

def searchtitles(xmldata):
titles=[]
tracknum=1
while 1:
catchtitle = '<Track Number="%s">(.*?)</Track>' % tracknum
try:
title = re.findall(catchtitle, xmldata)[0]
except:
return titles
titles.append(title)
tracknum += 1

def main():
## id='4582283794358'
## albumdir=u"c:\Users\h\Music\B'z\C'mon"
id = raw_input('Input CD EAN code:')
albumdir = raw_input('Input album directry:')
xmldata=amazon_req(id)

songtitles = searchtitles(xmldata)
if not songtitles:
sys.exit()

artist=re.findall('<Artist>(.*?)</Artist>', xmldata)[0]
albumtitle=re.findall('</Studio><Title>(.*?)</Title>', xmldata)[0]
year=re.findall('<ReleaseDate>(.*?)</ReleaseDate>', xmldata)[0][0:4]

os.chdir(albumdir)
files = glob.glob('*.wma')

tracknum=1
for songtitle in songtitles:
str = '%02d' % tracknum

#ファイル名頭二文字がトラックナンバーと合致したファイルを更新
if [elem for elem in files if elem[0:2] == str]:
file=[elem for elem in files if elem[0:2] == str][0]
audio = ASF(file)
audio["Title"] = songtitle.decode('utf-8')
audio["Author"] = artist.decode('utf-8')
audio["WM/AlbumTitle"] = albumtitle.decode('utf-8')
audio["WM/AlbumArtist"] = artist.decode('utf-8')
audio["WM/TrackNumber"] = tracknum
audio["WM/Year"] = year

#print ASF.pprint(audio)
#print ASF.keys(audio)
ASF.save(audio)
tracknum += 1
else:
tracknum += 1

if __name__ == '__main__':
main()



とりあえず手軽に楽曲情報が取得できるようになったし、全角アルファベットやタイアップ情報も消えたので満足。
このスクリプトを使うには、mutagenを入れて、スクリプト中の変数key1,key2(両方ともamazonアソシエイトのキー)を設定して、あとはスクリプトを走らせてアルバムの入ったフォルダとCDのEANコードを入力する。
無料でもっといいCDデータベースがあればEXEファイルにするんだけど、見つからないのでpythonスクリプトのままで。


110728_2.jpg
スポンサーサイト
プロフィール

Matoba

Author:Matoba

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

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