ラジコの番組表を検索するスクリプト、おれも作ってみた……。

2018年11月14日

 前回の記事ザリガニが見ていた…。さんのスクリプトを紹介し、そのさいに、ラジコの番組表を検索する「find_radiko.sh」がうまく動かない、みたいなことを書いた。
(たぶん、ラジコの仕様の変更で)。

 ということで低い水準ながら自分で作ってみた。すげー大変で勉強になりました。


スポンサード リンク

🦎 findrajiko.sh

#!/bin/bash

# ラジオの番組表をダウンロードして、timer コマンドに対応するコマンドを生成するスクリプト。
# 「findrajiko.sh 検索文字」
# みたいに使う。
#
# 最初に住んでいるの県の都道府県コードみたいなのを調べる。
#「findrajiko.sh -a 県名」
# でエリアコードが出力される。「-a 群馬」だったら 10 。「-a 東京」だったら 13。
# デフォルトのエリアは東京になっているので、これを書き直して保存する。
# area=’13’ → area=’10’ (群馬県民の場合)半角数字
#
# オプションは、
# 「-a 県名」でエリアコードの表示。例「findrajiko.sh -a 北海道 → 結果:1」
# 「-A 県名」でその回に限り他県を検索。「findrajiko.sh -A 広島 検索文字」
# 「-s 放送局ID」で、その局だけの検索。例「findrajiko.sh -s TBS 検索文字」
#—————————–

# この数字をお住まいの県のコードに書き直してください。
area=’13’

function getArea() {
local kenCode=curl -s http://nlftp.mlit.go.jp/ksj/gml/codelist/PrefCd.html | iconv -f SHIFT-JIS -t UTF8 | grep "${1}" | sed -e 's/ //g' | cut -c5,6
if test -z “$kenCode”; then
echo ‘県名が正しくないかもしれません。’
exit 1
fi
if test “$kenCode” -lt 10; then
kenCode=echo $kenCode | cut -c2
fi
echo $kenCode
}

function areaSearch() {
if [ -z “${1}” ]; then
read -p ‘お住いの県名:’ ken
if [ -z “${ken}” ]; then
echo ‘県名を入力してください(-a 東京都、など)。’
exit 1
fi
else
ken=$1
fi

local kenCode=`getArea $ken`
echo 'エリアコード('$ken'):'$kenCode
echo '------------------------------'
showStID $kenCode
exit 0

}

function stationID() {
local areaAddress=echo 'http://radiko.jp/v2/station/list/JP'${1}'.xml'
local stList=curl -s $areaAddress | grep -E '<\/id>' | sed -e 's/^ *//g' | perl -pe 's/<\/id>//g' | sed -e 's/<id>//g'
echo “${stList}”
}

function showStID() {
local areaAddress=echo 'http://radiko.jp/v2/station/list/JP'${1}'.xml'
curl -s $areaAddress | grep -E ‘<\/id>|<\/name>’ | sed -e ‘s/ //g’ | perl -pe ‘s/<\/id>\n/ /g’ | sed -e ‘s///g’ | perl -pe ‘s///g’ | perl -pe ‘s/<\/name>\n/\n/g’
}

function getList() {
local progList=curl -s http://radiko.jp/v2/api/program/station/weekly?station_id=$1 | grep -E 'prog ft|</title>|<pfm>' | perl -pe 's/<\/pfm>/\n\n/g' | grep -A 1 -B 2 "${keyword}" | tr '"' '\n' | sed -e 's/^ *//g' | grep -v '^\s*$'
echo “${progList}”
}

function idCheck() {
local han=’NG’
local list1=stationID $area
IFS=$’\n’
for line in echo "$list1"
do
if test $line = $1; then
han=’OK’
break
fi
done
echo $han
}

function jweek() {
if [ $1 = ‘0’ ]; then
echo ‘日曜日’
elif [ $1 = ‘1’ ]; then
echo ‘月曜日’
elif [ $1 = ‘2’ ]; then
echo ‘火曜日’
elif [ $1 = ‘3’ ]; then
echo ‘水曜日’
elif [ $1 = ‘4’ ]; then
echo ‘木曜日’
elif [ $1 = ‘5’ ]; then
echo ‘金曜日’
elif [ $1 = ‘6’ ]; then
echo ‘土曜日’
else
echo ‘不明’
fi
}

progswich=off
durswich=off
prog=0
dur=0
bangumi=’notYet’
pfm=’notYet’

function showProg() {
(IFS=$’\n’
for line in echo "${1}"
do
if test $progswich = ‘on’ ; then
prog=$line
progswich=off
fi

    if test $durswich = 'on' ; then
        dur=$line
        durswich=off
    fi

    if echo $line | grep -sq 'prog ft='; then
        progswich=on
    fi

    if echo $line | grep -sq 'dur='; then
        durswich=on
    fi

    if echo $line | grep -sq '<title>' ; then
        bangumi=`echo $line | sed -e "s/<title>//g" | sed -e "s/<\/title>//g"`
    fi
    if echo $line | grep -sq '<pfm>' ; then
        pfm=`echo $line | sed -e 's/<pfm>/出演:/g'`
    fi
    if ! echo $pfm | grep -sq 'notYet' ; then
        echo '-------------------------------------'
        echo $2
        echo $bangumi
        echo $pfm
        ryear=`echo $prog | cut -c1-4`
        rmonth=`echo $prog | cut -c5-6`
        rday=`echo $prog | cut -c7,8`
        rhour=`echo $prog | cut -c9,10`
        rminits=`echo $prog | cut -c11,12`
        durHour=`expr $dur / 3600`
        durMin=`expr $dur % 3600 / 60`

        yobi1=`echo $prog | cut -c1-8`
        yobi2=`date -j -f "%Y%m%d" "${yobi1}" +%s`
        yobi3=`date -r ${yobi2} +%w`
        yobi4=`jweek $yobi3`

        echo '【'$yobi4'】'$ryear '年' $rmonth '月' $rday '日' $rhour '時' $rminits '分から'
        echo $dur '秒間('  $durHour '時間' $durMin '分)'
        echo ' '
        echo '【単発予約】timer -e '$rmonth'/'$rday' '$rhour$rminits' /usr/local/bin/rec_radikoru.sh -o radikoru/ -t '$dur $2
        echo '【週間予約】timer -e '$yobi3 $rhour$rminits' /usr/local/bin/rec_radikoru.sh -o radikoru/ -t '$dur $2
        echo '-------------------------------------'
        bangumi='notYet'
        pfm='notYet'
    fi
done)

}

keyword=’notYet’
station=’notYet’

while [ $# -gt 0 ]
do
case $1 in
-a)
kenmei=$2
areaSearch $kenmei
shift
;;
-A)
if test -z $2; then
echo ‘県名を入れてください(例:-A 東京)。’
exit 1
else
area=getArea $2
fi
if test “$area” = ‘県名が正しくないかもしれません。’; then
echo $area
exit 1
fi
shift
;;
-s)
if test -z $2; then
result=’NG’
else
result=idCheck $2
fi
if test “${result}” = ‘NG’; then
echo ‘放送局のIDを入れてください(例:-s TBS)。’
echo ‘ID 放送局’
echo ‘————‘
showStID $area
exit 1
else
station=$2
fi
shift
;;
*)
keyword=$1
;;
esac
shift
done

if test $keyword = ‘notYet’ ; then
read -p ‘検索文字を入力:’ kensaku
if [ -z “${kensaku}” ]; then
exit 1
fi
keyword=$kensaku
fi

if test $station != ‘notYet’; then
stlist=getList $station
showProg “${stlist}” $station
exit 0
fi

idlists=stationID $area

echo “${idlists}” | while read line
do
List=getList $line
showProg “${List}” $line
done

exit 0

 阿呆みたいに長くなっちゃった。

  • 最初にエリアコードを記入する必要がある。「findrajiko.sh -a」と実行すると、エリアコードの数字が出てくるので、それをスクリプト内の「area=’xx’」の xx に記入して保存する(デフォルトは東京のコード 13 になっている)。
  • 検索するのは番組名と出演者だけ。なので、例えばキノコが大好きなひとが、キノコを特集する番組を探すべく「きのこ」と検索しても、期待される結果は返ってこない。
  • どちらかというと、未知の番組を探すとかではなく、timer コマンドに入力するための文字列を出力させるために使う。

使い方

  • 基本は「sh findrajiko.sh 検索文字」
  • 「-s 放送局ID」をつけるとその局だけ検索する。例えば「sh findrajiko.sh -s TBS 爆笑問題」とやれば、TBS の番組だけを検索する。
  • 「-A 県名」とやれば、他県の番組を検索できる。例えば「sh findrajiko.sh -A 広島 ごぜん様さま」など。
  • うまく動かなかったらすみません。

$ sh findrajiko.sh 和牛
-------------------------------------
LFR
和牛のオールナイトニッポンR
出演:和牛
【日曜日】2018 年 01 月 07 日 03 時 00 分から
 秒間( 1 時間 30 分)

【単発予約】timer -e 01/07 0300 /usr/local/bin/rec_radikoru.sh -o radikoru/ -t 5400 LFR
【週間予約】timer -e 0 0300 /usr/local/bin/rec_radikoru.sh -o radikoru/ -t 5400 LFR
-------------------------------------

 こんな感じで出力される(はず)。単発の予約なら【単発予約】の、


timer -e 01/03 0100 /usr/local/bin/rec_radikoru.sh -o radikoru/ -t 7200 TBS

 これをコピペして timer コマンドを実行すると、番組が予約できる、はず。
 毎週の予約にするなら、【週間予約】のほうを実行する。
 保存場所はダウンロードフォルダに作られる「radikoru」フォルダ。これを変更する場合は「-o radikoru/」を書き換える。デスクトップに Radio フォルダを作るとしたら、「-o ../Desktop/Radio/」でいけるはず。ただし、パスに日本語フォルダは入らないほうがいい、ような気がする。

 🍪 この項、間違いを見つけ次第、修正する予定です。
 01/10 曜日がうまく表示されなかったのを直した。

スポンサードリンク