玩式草子─ソフトウェアとたわむれる日々

第58回 「らじる★らじる」をもう一度(その3)

この記事を読むのに必要な時間:およそ 7 分

今回作成したスクリプトの全体は本稿の末尾に添付しておきます。手元では,このスクリプトをradiru_id3.pyという名前で/usr/local/bin/に保存しておき,MP3ファイルの録音が無事終了した際に起動して,録音ファイルに番組情報を書き込むようにしています。たとえば,atコマンドで5/31の20:30に実行する予定の録音用シェルスクリプトはこんな感じになっています。

  1  #!/bin/sh
  2  sleep 10
  3  mkfifo /home/kojima/radiru_scripts/fifo/1619
  4  file=/home/kojima/MP3/2014-05-31-20-30_漢詩をよむ「中国のこころのうた」_009.mp3
  5  (mplayer -prefer-ipv4 -ipv4-only-proxy -slave -input file=/home/kojima/radiru_scripts/fifo/1619 -playlist http://mfile.akamai.com/129932/live/reflector:46056.asx -af format=s16le -ao pcm:file=/dev/stdout -vc null -really-quiet -quiet | lame -r --quiet -q 4 - $file 2> /dev/null) &
  6  sleep 1m
  7  radiru_noa.py r2 2014-05-31-20-30_漢詩をよむ「中国のこころのうた」_009.mp3
  8  sleep 29m
  9  echo 'quit' > /home/kojima/radiru_scripts/fifo/1619
 10  radiru_id3.py /home/kojima/MP3/2014-05-31-20-30_漢詩をよむ「中国のこころのうた」_009.mp3
 11  rm -f /home/kojima/radiru_scripts/fifo/1619 /home/kojima/radiru_scripts/1619

録音作業自体は5行目の mplayer と lame が行ない,それらをバックグラウンドで動かしておいて,録音開始から1分後にradiru_noa.pyスクリプトで番組情報を取ってきてデータベースに記録します(7行目⁠⁠。そして30分の番組が終了するまで再度sleepして,9行目でmplayerを停止させた後,今回紹介したradiru_id3.pyスクリプトで録音が完了したMP3ファイルにID3タグを書き込みます(10行目⁠⁠。

radiru_id3.py スクリプトから書き込んだID3タグは,amarok等のメディアプレイヤーから確認することができます。

図3 Amarokから見たID3タグ

図3 Amarokから見たID3タグ

本シリーズで紹介してきた各スクリプトや,それに合わせて改造した「らじる★らじる」予約録音用スクリプト一式は,筆者のホームページで公開しているので,興味ある人は試してみてください。

なお,ここで公開しているスクリプトはPlamo Linuxを前提にしているので,他のディストリビューションでは文字コードの操作回りを変更する必要があります。もっとも,EUC-JP向けの処理を削ればいいだけなので,そう難しいことではないでしょう。

また,今回紹介したスクリプトでは,書き込むID3タグのバージョンは指定していないので,最新の「ID3v2.4」形式で記録されることになります。このバージョンのID3タグを正しく処理できないメディアプレイヤーで利用するの場合は,set_id3tag()関数あたりで使用するID3タグのバージョンを指定する必要があります。


先に切り抜いたFM情報誌をラベルにしたカセットテープの写真を紹介したように,⁠エア・チェック」マニアは,楽曲だけではなく,そのデータも残したいと考えます。その意味で,今回紹介してきたNOA情報を取り込むスクリプトまで揃えて,ようやく満足のいく録音環境が整った,という気がします。

もっとも最近では,加齢のせいか,音楽番組を聞きながらコードや原稿を書く「ながら作業」がしづらくなってきたので,どんどん未聴のMP3ファイルが溜ってきています。各ファイルにはID3タグを書き込んでいるので,後からでも整理はできるだろう,と放置しているものの,このままでは困ったことになりそうです。

かってのように,カセットテープ代や整理場所の工面に頭を悩ませる必要が無くなったのに,今度はどんどんたまっていくMP3ファイルをどう消化していくかが悩みのタネになるというのは,マニアの性(さが)は年を取っても変わらないということでしょうか(苦笑⁠⁠。

リスト radiru_id3.py

 1  #! /usr/bin/python
 2  # -*- coding: utf-8 -*-;
 3  
 4  import sqlite3, os, sys, eyed3
 5  from eyed3 import id3
 6  
 7  # global variables which show each directries
 8  config_path = "~/.radiru_confs"
 9  config = {'script_dir':'~/radiru_scripts', 'MP3_dir':'~/MP3','DB_dir':'~/MP3'}
10  
11  def init():
12      global config
13      conf_path = os.path.expanduser(config_path)
14      if os.path.isfile(conf_path):
15          f = open(conf_path,'r')
16          lines = f.readlines()
17          for i in lines:
18              (it, dt) = i.rstrip().split(':')
19              config[it] = dt
20          for key in config:
21              config[key] = os.path.expanduser(config[key])
22  
23  def query_db(query):
24      dbdir = config['DB_dir']
25      dbname = dbdir + '/radiru_titles.sql3'
26      if os.access(dbname, os.R_OK) == False:
27          print("cannot find title DB({})".format(dbname))
28          sys.exit(1)
29  
30      connection = sqlite3.connect(dbname)
31      cursor = connection.cursor()
32      c = cursor.execute(query)
33      res = c.fetchall()
34      if len(res) == 0:
35          print("DB doesn't have entry for id: {} ".format(query))
36          print("please check title DB:{}".format(dbname))
37          sys.exit(1)
38      else:
39          return(res)
40  
41  def query_contents(oid):
42      query = u"select * from contents where id={}".format(oid)
43      t = query_db(query)
44      return t
45  
46  def set_id3tag(file, tag):
47      mp3file = file
48  
49      new_tag = eyed3.id3.Tag()
50      new_tag.file_info = eyed3.id3.FileInfo(mp3file)
51      new_tag.title = tag['title']
52      new_tag.album = tag['album']
53      new_tag.artist = tag['act']
54      new_tag.release_date = tag['date']
55      if len(tag['contents']) > 0:
56          new_tag.comments.set(tag['contents'])
57  
58      new_tag.save()
59  
60  def main():
61      init()
62      filepath = sys.argv[1]
63      file = os.path.basename(filepath)
64      ufile = file.decode('euc-jp')
65  
66      query = u"select oid,title,date,ch,act from titles where filename='{}';".format(ufile)
67      (oid, title, date, channel, act) = query_db(query)[0]
68  
69      res = query_contents(oid)
70      contents = ''
71      for i in res:
72          (id, l) = i
73          contents = contents + l
74  
75      album_parts = ufile.rstrip('.mp3').split('_')
76      album = album_parts[1]
77      tag = {'title':title, 'album':album, 'act':act, 'date':date, 'ch':channel, 'contents':contents}
78      set_id3tag(filepath, tag)
79  
80  if __name__ == "__main__":
81      main()

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html