響 Radio Stationの番組(iPhone向け)を録音する

 いつもはWindows Media Player向けを録音していたのですが、「神様と運命覚醒のクロステーゼ × 日本一RADIO」の2014年6月4日更新分は番組紹介ページ内のリンクが壊れているので録音出来ませんでした。

そこで、同じ番組紹介ページにあるiPhone版をどうにかして保存できないか試してみました。

取り敢えず番組紹介ページの該当部分のリンクを見てみる。

$ wget -q -O - http://hibiki-radio.jp/description/nippon1 | grep iphone | ruby -ruri -e 'puts URI.extract(ARGF.read, "http")'
http://www2.uliza.jp/IF/iphone/iPhonePlaylist.m3u8?d=910&p=2807&v=140604_nippon1-ip

そしてそのリンク先の内容は

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=110000
http://aka-hibiki-hls-vod.uliza.jp/910/140604_nippon1_140604_nippon1-ip-00000562.m3u8

m3u8プレイリストのURLでした。じゃあこのプレイリストの中身はと言うと

$ head 140604_nippon1_140604_nippon1-ip-00000562.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:10,
140604_nippon1_140604_nippon1-ip-00000562/23889-1.ts
#EXTINF:10,
140604_nippon1_140604_nippon1-ip-00000562/23889-2.ts
#EXTINF:10,
140604_nippon1_140604_nippon1-ip-00000562/23889-3.ts
#EXTINF:10,
140604_nippon1_140604_nippon1-ip-00000562/23889-4.ts

339個のtsファイルに分割されてるっぽい!

しょうがないから全部wgetする。連番ダウンロードはcURLの方が向いてるのですが、まああんまりサーバーに負担を掛けたくないので間隔を空けてます。

$ for i in {1..339}; do
> wget http://aka-hibiki-hls-vod.uliza.jp/910/140604_nippon1_140604_nippon1-ip-00000562/23889-${i}.ts && sleep 1
> done

ファイルが全部揃ったら、連結してみる。

$ cat 23889-{1..339}.ts >140604_nippon1_140604_nippon1-ip-00000562.ts

連結したファイルはVLC.appで再生できました。あ、wgetの “–output-document” オプションで連結したほうがスマートだったかも。

広告

そういえば音泉の録音用にスクリプト書いたけど

公開してませんでした。

追記:スクリプト修正しました。

いやー、我ながら気合い入ったスクリプトですね。rubyの部分は適当ですけど。あ、opensslとwgetとrubyが必要なのでご注意を。

引数なしで実行すると本日更新分を順に録音するか聞いてきます。”q” と打ってエンターキーを押すと終了、”n” だと次の番組。

a オプション
最新更新分じゃなくても録音。
y オプション
昨日更新分を録音。
v オプション
verbose モード。wgetの様子が見えたり一時ファイルを消すか聞いてきます。
w オプション
週番号指定して録音。0から6までで0が日曜日。
#!/bin/bash -e
# onsen.sh Ver. 0.8.4 (2013.02.02)
# recording tool for onsen.ag
# require openssl, wget and ruby

# target date
GOTDATE=`date +%y%m%d`
# precode of POST data
PRECODE=onsen`date +%w%d%H`
# POST data
PDATA="code=`echo $PRECODE | openssl dgst -md5 | sed -e 's/(stdin)= //'`\&file%5Fname=regular%5F"
# week number
REGXMLNUM=`date +%w`
# onsen URL
URL="http://onsen.ag/getXML.php?`date +%s`000"
# tmp file
TMPFILE="/var/tmp/tmp.$$"

AFLAG=FALSE
WGETOPTION=-q
RMOPTION=
OPT=
while getopts ayvw: OPT
do
  case $OPT in
    a) AFLAG=TRUE
       ;; # with all programs on GOTDATE
    y) GOTDATE=`TZ=JST+15 date +%y%m%d`
       REGXMLNUM=`TZ=JST+15 date +%w`
       ;; # yesterday
    v) WGETOPTION=
       RMOPTION=-i
       ;; # verbose mode
    w) REGXMLNUM=$OPTARG
       ;; # indicate week number
    \?) echo "Usage: `basename $0` [-avy] [-w weeknumber]" 1>&2
        exit 1
        ;;
  esac
done
shift `expr $OPTIND - 1`

# download regular XML file
wget ${WGETOPTION} --post-data="${PDATA}${REGXMLNUM}" ${URL} -O ${TMPFILE}

# number of program
PROGNUM=`grep -c '<title>' ${TMPFILE} | cut -d ":" -f2`
#echo "番組数: $PROGNUM"
# index number
i=1
while test ${PROGNUM} -gt 0
do
  PROGNUM=`expr ${PROGNUM} - 1`
  ISNEW=`cat ${TMPFILE} | ruby -rrexml/document -e "puts REXML::Document.new(ARGF).elements[\"data/regular/program/isNew[${i}]\"].text"`
  if test ${AFLAG} = TRUE -a ${ISNEW} = 0 ; then
    ISNEW=1
  fi
  TITLE=`cat ${TMPFILE} | ruby -rrexml/document -e "puts REXML::Document.new(ARGF).elements[\"data/regular/program/title[${i}]\"].text"`
  NUM=`cat ${TMPFILE} | ruby -rrexml/document -e "puts REXML::Document.new(ARGF).elements[\"data/regular/program/number[${i}]\"].text"`
  UPDATE=`cat ${TMPFILE} | ruby -rrexml/document -e "puts REXML::Document.new(ARGF).elements[\"data/regular/program/update[${i}]\"].text" | tr '/' '月' | sed -e 's/$/日配信/'`
  MP3FILE=`cat ${TMPFILE} | ruby -rrexml/document -e "puts REXML::Document.new(ARGF).elements[\"data/regular/program/fileUrlIphone[${i}]\"].text"`
  i=`expr ${i} + 1`
  if test ${ISNEW} != 1 ; then
    continue
  fi
  # Question
  echo -n "Record \"${TITLE} 第${NUM}回(${UPDATE}).mp3\"?[Yes/no/quit] "
  read ANSWER
  case `echo "$ANSWER" | tr [A-Z] [a-z]` in
  no | n ) ANSWER=no
           continue
           ;;
  quit | q ) break
             ;;
  * ) ANSWER=yes
      ;;
  esac

  wget ${WGETOPTION} -O "${TITLE} 第${NUM}回(${UPDATE}).mp3" ${MP3FILE}
done

rm ${RMOPTION} ${TMPFILE}
exit 0

参考

Webラジオ 質問掲示板 兼 ハヤテのごとく!応援同盟 雑談掲示板

radikoの仕様が変わってた

ことに、2回も録音失敗してから気付きました。

上記リンク先で

237 :まちがって名前消しちゃいました。:2012/10/24(水) 16:49:48.22 ID:???
player_2.0.1.00.swf

player_3.0.0.01.swf

swfextract -b 5

swfextract -b 14

radiko.smartstream.ne.jp

w-radiko.smartstream.ne.jp

simul-stream

simul-stream.stream

_defInst_

_definst_

これでイケた。

とあったのでちまちまスクリプトを修正してたら、下のGistでエレガントに解決してました。

wget -q "http://radiko.jp/v2/station/stream/${channel}.xml"
stream_url=`echo "cat /url/item[1]/text()" | xmllint --shell ${channel}.xml | tail -2 | head -1`
url_parts=(`echo ${stream_url} | perl -pe 's!^(.*)://(.*?)/(.*)/(.*?)$/!$1://$2 $3 $4!'`)
rm -f ${channel}.xml
#
# rtmpdump
#
rtmpdump -v \
    -r ${url_parts[0]} \
    --app ${url_parts[1]} \
    --playpath ${url_parts[2]} \
    -W $playerurl \
    -C S:"" -C S:"" -C S:"" -C S:$authtoken \
    --live \
    --flv $output

このままだとcronで予約録音できないので少々手を入れて使ってます。

妹(上)が家を出て行きました

町田市民になるそうな。勤め先は神奈川だそうです。寂しくなるなあ。

ところでその妹の iPod nano は吾の iMac で曲を追加していたのですが、独り暮らしを機にノートPCを購入してそれで iPod nano を管理できるようにセットアップしました。

…… iPod nano の中の曲が消えました。だって、「Windows用にフォーマットしてください」って言われるんですもの!
妹よ、後は頑張って自分で何とかするんだぞー。

悪化しました

電気毛布を強めに設定したまま寝落ちしたら、喉が酷いことになりました。どう考えても自業自得です。何だか耳までおかしいです。中耳の浸透圧がおかしくなっているような。

 

こんな状態でカラオケに。音が安定しません。自棄になって「プリップリン体操」とか歌いました。2、3番の歌詞知らないよっていうかヤバイヨこの歌詞!妹は相変わらず椎名林檎とかCoccoとかYUKIとか大好きですな。吾は持ち歌が少ないので最後には中学生の頃に流行っていたのとかに挑戦しました。藤井フミヤのソロデビュー曲とか懐かし過ぎるよ!

濃霧とイヤホンと飲み会

いやー、今朝の霧は凄かった。そりゃ電車も遅れるわ。
思わず撮影しました。

送信者 風景
送信者 風景

Apple In-Ear Headphones with Remote and Mic が注文可能になっていたので、注文しました。マイクも付いてるのかー。しかし届くのは来年……。

週の中日に飲み会でした。さくら水産というところで。少々狭いのですが、居酒屋とは思えないくらいに食べ物の量が多かった。

イヤホンが断線しました

カナル型の、ちょっと高級感のある MicroSolution 社製イヤホンです。暫く前に皮膜が破れて、テープで補修したのですが遂に音が途切れてしまいました。サービスで直してくれるのかも知れませんが、もう大分に薄汚れてきたので(メンテナンスしていない><)、今は iPod touch 2G に付属のものを使用しています。しかしカナル型に慣れてしまったので耳に違和感が。

送信者 その他

という訳で Apple In-Ear Headphones with Remote and Mic の発売を心待ちにしています。「近日発売」って何時なんですか Apple さん!

iPod の仕様なので仕方ないんですが

「このMP3を聴いてみたい」と思ったときに iPod に直接そのファイルを送信することが出来ないのです(ノーマルでは)。というかそもそもシステムが「ファイル」というのを意識させない造りになっています。今も併用しているオーディオプレーヤー iriver T20 では頻繁にそういうことをしていたので、ちょっと欲求不満を感じていました。

iPod touch 2G を Jailbreak すればシステムの中身を覗くことができるのですが、出荷間もないためか生憎とその方法は公になっていません。

というわけで MobileFinder なるアプリを購入いたしました。 iPod touch を FTP サーバにすることができます。 Jailbreak 版では OS に重要なファイルまで操作できるそうな。

もっと早く探し始めていれば、 Air Sharing の無料化キャンペーンに間に合ったんですが。