radikoを録音して後で聞くためのプログラムを作ってみた

radikoを録音して、iPhoneなどで聞くためのプログラムを書いてみました。
といっても、rtmpdumpで録音、ffmpegエンコードし、gmailで送信するだけのプログラムです。
僕はこれを使って、朝のラジオ番組を仕事終わりの電車の中で聞いています。

ただし、プログラムを使うには、radikoが受信できてcronが使えるサーバーが必要です。
なので、かなり使えないプログラムであることは間違いありません。
もしこのプログラムを使う場合は、録画するチャンネル、録画時間、Gmailのアカウント情報などを適宜変更してください。

import os
import tempfile
import smtplib
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.MIMEAudio import MIMEAudio
from email.Header import Header
from email.Utils import formatdate

GMailAccount = 'your_account@gmail.com'
GMailPasswd  = "your_password"

CHANNEL  = "ABC"
TIME     = 1800
RTMPDUMP = "/usr/local/bin/rtmpdump"
FFMPEG   = "/usr/bin/ffmpeg"
SUBJECT  = 'radiko'

def make_message(sender, to, subject, body, mp3file):
    encoding = 'utf-8'    
    msg = MIMEMultipart()
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = sender
    msg['To']   = to
    msg['Date'] = formatdate()
    
    content = MIMEText(body.encode(encoding), 'plain', encoding)
    msg.attach(content)

    if mp3file:
      with open(mp3file) as io:
        attachment = MIMEAudio(io.read(), "mpeg", name=os.path.basename(mp3file))
      msg.attach(attachment)
    
    return msg

def send_mail(mp3file, sender=GMailAccount, to=GMailAccount, subject=SUBJECT, body=""):
  host = 'smtp.gmail.com'
  msg = make_message(sender, to, subject, body, mp3file)
  smtp = smtplib.SMTP(host, 587)
  try:
    smtp.ehlo()
    smtp.starttls()
    smtp.ehlo()
    smtp.login(GMailAccount, GMailPasswd)
    smtp.sendmail(sender, to, msg.as_string())
  finally:
    smtp.quit()

def main():
  flvfile = tempfile.NamedTemporaryFile(delete=False, suffix=".flv")
  mp3file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3")
  flvfile.close()
  mp3file.close()

  rtmpdump_options = {
    "rtmp" : 'rtmpe://radiko.smartstream.ne.jp',
    "port" : "1935",
    "app" : '%s/_defInst_' % CHANNEL,
    "playpath" : 'simul-stream',
    "swfUrl" : 'http://radiko-dl.ssdl1.smartstream.ne.jp/radiko-dl/1.1/player/player_0.1.2.swf',
    "pageUrl" : 'http://radiko.jp/player/player.html#%s' % CHANNEL,
    "flashVer" : '"LNX 10,0,45,2"',
    "live" : "",
    "stop": str(TIME),
    "flv" : flvfile.name
    }
  ffmpeg_options = {
    "y" : "",
    "i" : flvfile.name,
    "ac" : "1",
    "ab" : "32",
    }

  rtmpdump_cmd = "%s %s" % (RTMPDUMP, " ".join(("--%s %s" % (k, v) for k, v in rtmpdump_options.iteritems())))  
  ffmpeg_cmd   = "%s %s %s" % (FFMPEG, " ".join(("-%s %s" % (k, v) for k, v in ffmpeg_options.iteritems())), mp3file.name)
  try:
    print rtmpdump_cmd
    os.system(rtmpdump_cmd)
    print ffmpeg_cmd
    os.system(ffmpeg_cmd)
    send_mail(mp3file=mp3file.name)
  finally:
    os.unlink(flvfile.name)
    os.unlink(mp3file.name)

if __name__ == '__main__':
  main()