皆さん、Raspberry Pi触ってますか? 僕は全然触ってません。でも、毎週時間になると、自動で『天たま』を再生してくれるので、大変助かっています。Raspberry Pi(僕の持ってるのはRaspberry Pi 2 Model Bというそうです)で、radikoの再生や録音をする方法はいろんなサイトに載ってますが、番組のキーワード予約をする方法があんまり載っていないようなので、僕が頑張って書きました。

スポンサーリンク

キーワード予約したい

有志の方々のスクリプトを見ると、どうやら簡単にradikoの番組表を取得できる模様。それなら、その番組表からキーワード検索して、自動で予約してほしい、そう思いますよね。それに、例えば野球中継で延長になったときとか、それに合わせて番組表が更新されれば、またその番組表から自動で予約してくれるわけですから、聞き逃すこともありませんよね。まあ、その点に関しては、半年間運用して、普通に聞き逃しているんですけどね。多分、そういう突発的なときって、番組表更新されてないんだと思います。

そういうわけで、あらかじめ指定したキーワードを使って、radikoからダウンロードした番組表を元に、自動で番組の予約をするスクリプトを書きました。

cat /proc/version
Linux version 3.18.7-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 – Linaro GCC 2014.03) ) #755 SMP PREEMPT Thu Feb 12 17:20:48 GMT 2015
cat /etc/debian_version
7.8

data.dat

とりあえずtabで区切ってリストを作ります。放送局、キーワード、やりたいこと、という感じで。

QRR	竹達彩奈	Play
QRR	堀江由衣	PlayRecord

bookByKeywords.sh

このスクリプトの引数に、さっきのdata.datを渡すと良い感じです。

#!/bin/bash

# sort用に
LANG=en_US.UTF-8
reserv_table=$1

# 今の時刻取得
touch executed_time.dat

# 予約表の一行ごとに処理
cat ${reserv_table} | while read fileline
do
  set -- ${fileline}
  #$1 局
  #$2 検索ワード
  #$3 実行タイプ(Play | Record | PlayRecord)
  
  stationID=$1
  search_word=$2
  runtype=$3
  weektable=weektable\(${stationID}\).xml 
  
  # 一週間分の番組表を取得
  # 複数キーワードで同じ局が指定されていた場合、
  # 何度もダウンロードするのもアレなので
  if [ ! -e ${weektable} -o executed_time.dat -nt ${weektable} ]; then
    curl -s http://radiko.jp/v2/api/program/station/weekly?station_id=${stationID} \
      > ${weektable}
  fi
  
  # 検索する
  search_result=`echo "grep ${search_word}" \
    | xmllint --shell ${weektable} \
    | sed -n -e "s/^.*progs\[\(.*\)\].*prog\[\(.*\)\].*/\1 \2/p" \
    | uniq`
  
  # 検索結果に対して処理する
  echo "${search_result}" | while read resultline
  do
    set -- ${resultline}
    #$1 progs[x]
    #$2 prog[x]

    title=`echo "cat /radiko/stations/station/scd/progs[$1]/prog[$2]/title" \
      | xmllint --shell ${weektable} \
      | sed -n -e "s/^.*>\(.*\)<.*/\1/p" \
      | sed -e "y/ \t\//___/" `

    # ftはyyyymmddhhmmssで記述されているが
    # atコマンドの時刻はhh:mm mmddyyで指定
    ft=`echo "cat /radiko/stations/station/scd/progs[$1]/prog[$2]/@ft" \
      | xmllint --shell ${weektable} \
      | sed -n -e "s/^.*ft=\"..\(..\)\(....\)\(..\)\(..\).*/\3:\4 \2\1/p" `
    dur=`echo "cat /radiko/stations/station/scd/progs[$1]/prog[$2]/@dur" \
      | xmllint --shell ${weektable} \
      | sed -n -e "s/^.*dur=\"\([^\"]*\)\".*/\1/p" `
    
    # atコマンド整形
    at_command="/bin/bash /home/pi/bin/rec_radiko.sh \
      $stationID $(($dur + 60)) /home/pi/radio $title $runtype > /dev/null 2>&1"
    
    # すでに同じ内容がatに登録されていないか
    duplicate_flag=0
    if [ `atq | wc -l` -gt 0 ]; then
      all_jobs=`atq | cut -f1`
      for atqline in ${all_jobs}
      do
        if [ "`at -c ${atqline} \
          | sed -n -e "s%${at_command}%DUPLICATED%p" `" \
          == "DUPLICATED" ]
        then
          duplicate_flag=1
          break
        fi
      done
    fi
    
    # フラグ立たなかったらatに追加
    if [ "${duplicate_flag}" == "0" ]; then
      echo "${at_command}" \
        | at "${ft}" - 1 minute
    fi
  done
done

# 一応けしとく
rm executed_time.dat

使い方

crontab -eで適当な時間に回すようにしましょう。結局、天たま用なので、僕は毎日21:45に実行してます。

45 21 * * * /home/pi/bookByKeywords.sh /home/pi/data.dat > /dev/null 2>&1

いかがでしょう

すでにお分かりかと思いますが、このスクリプトだけではradikoの再生や録音は出来ません。なぜなら、再生・録音するためのスクリプトは、すでにたくさんの方が素晴らしいスクリプトを書いているからです。途中にat_commandという変数がありますが、ここに各人思い思いの再生・録音スクリプトを記載していただければなと思います。おせっかいなことに、1分前に再生・録音スクリプトを開始するように設定してあり(81行目)、それに合わせて再生・録音時間も+60secしてあります(60行目)。

すごくがんばって書いたので、なんかの参考にしていただけると嬉しいです。また、例によって僕はlinux素人ですので、内容に間違いがあった場合は、素人にも分かるように説明していただけると修正できます。難しいことを言われても「はあ……。そうですか……。難しいんですね……」で終わってしまいますので、何卒ご理解とご協力を賜りたく、よろしくお願い申し上げます。

Raspberry Pi 2 Model B (1)
Raspberry Pi 2 Model B (1)

posted with amazlet at 20.03.01
Raspberry Pi
売り上げランキング: 55,078
Posted in 情報技術

2 comments

  1. 見ていてとても参考になりました!びっくりするほど高度なスクリプトだと思います。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください