Win10 Pro: WSL で、ラジコタイマー録音を行ってみる

このページの情報はすでに古くなっています。rtmpdumpでは、ラジコ録音は出来なくなりました。

先週はラジコ タイムフリー聴取機能の実験に伴うラジコの仕様変更で、時間を取られてしまいました。
フリーウェアの Radika は開発・メンテナンスとも終わっている模様で、現在は利用者間でパッチを当てながら延命させている状態。すでにNHK には対応できなくなったものの、2番組同時録音可能で、録音ファイルのサイズも小さく記録できるため、なかなか他のアプリケーションに乗り換える気になりません。

ラジコが仕様変更を行う度に、問題がパッチングされて収束するまで録音できない状況が発生するのが難点で、今回のトラブルも複数の録音手段を持っておくことは有効だと実感できました。私の場合は、Radiko 以外に Unix シェルスクリプトによるバックアップ録音を行っていますので、幸いにも今回 Radika はエラーになったものの、バックアップ録音のおかげで番組録音できました。この Radika 録音スクリプトを Windows標準環境で行えないものか?というのが今回のテーマ。録音して残すことが不要であれば、Radiko.jp のタイムフリー機能で十分だと思いますが、私は iPod で屋外に持ち出したいもので。

長期間継続利用する環境なら、いろんなツールをWindowsに入れるのではなく、限定的ではありますが 64bit Windows 10 Pro 標準(ただしβ版)の Windows Subsystem for Linux (WSL) を使用してどこまでラジコ録音を行えるか試してみたいところです。

結果は・・・・・・ラジコ録音は可能なものの、(ffmpeg をバイナリーインストールできないため)標準では WSL 内では FLVファイルフォーマットで保存されたまま、 mp3 へのフォーマット変換は Windows側での別アプリケーションが必要。そしてWSL側のcronが動かないためタイマー機能が使えず、Windows OS側のタスクスケジューラを利用することで、ようやくタイマー録音可能と、道のりは非常に複雑です。
複雑さを乗り越えれば、Radika のバックアップにはなります。通常はRadika のタイマー録音が成功するという前提で使い、万が一 Radikaが録音に失敗した時だけ、WSL から FLV ファイルを取り出して聴くというような使い方を想定。

  1. OSの準備。OS は Windows10 Pro 64bit 版が必要です。32bit Windows10 では利用できません。
  2. WSL を使うためには、1) 開発者モードにして、2) 「Windowsの機能の有効化または無効化」で、Windows Subsystem for Linux(beta) にチェックを入れて有効化する。
  3. Bash を起動して、apt-get で swftools, rtmpdump, ruby をインストール。
  4. 録音スクリプト をコピー。
  5. テスト
  6. バッチファイルをつくる
  7. Windows10 タスクスケジューラにタイマー録音を登録
  8. タスクの動作テスト
  9. 本番

となりました。

WSL を有効にする

下図、画面中央のように、OSを開発者モードにする。

設定ウィンドウから、開発者モードにする

WSLをアクティブにする。

Windows Subsystem for Linux にチェックを入れる

以上で、Windows10 上で Linux のコマンドを使えるようになりました。これは私の覚え書きなので、詳しく知りたい人は、Nikkeibp の記事が役に立ちます。

cmd.exe から bash を起動すればWSL準備完了。

これで、git の rec_radiko.sh や、私が以前から利用している FreeBSD 用に編集した radiko.sh が使えるはずです。実際にスクリプトを使用する前に、スクリプトが必要とするプログラムを入れる必要があります。

ユーティリティのインストール

ラジコ録音に必要なユーティリティは、rtmpdump, base64, swfextract, ffmpeg, ruby, wget あたりです。
幸い、base64, wget はWSLに標準で入っていました。ffmpeg はまだビルド済みバイナリーが見つかりませんのでインストールできません。rtmpdump, swfextract, ruby を入れることにします。

sudo apt-get install rtmpdump swftools ruby

管理者パスワードを入力してインストールを完了させます。

全てのユーティリティのインストールに成功したら、radiko.sh をインストールするディレクトリの作成。

cd
mkdir bin

これで、自分のホームディレクトリに bin というディレクトリが作成されました。

ちなみに、WSL がどこにインストールされているかというと、

C:\Users\<ユーザー名>\AppData\Local\lxss\

というややこしい場所。デフォルトでは非表示なので、システムファイルを見えるようにするか、ディレクトリを決め撃ちしないとたどり着けません。lxss 以下の rootfs がルートになります。

録音スクリプト

radiko2016oct_sh.txt を準備しました。元は、FreeBSD でラジコを録音しているスクリプトを2016 Oct版にアレンジしたもの。
このスクリプトでは、/tmp をラジコ録音ワーキングディレクトリとして使い、/tmp/radiko_out に録音ファイルを保存します。スクリプトを修正して別のディレクトリをワーキングディレクトリとして使う事は自由です。このメモでは、誰からも共通のディレクトリとなるように /tmp を使用しています。

radiko2016oct_sh.txt を radiko.sh に名前変更し、上の項目で作成したホームディレクトリ$HOMEの bin に保存します。

エクスプローラでマウスを使って $HOME/bin に radiko2016oct_sh.txt をコピーした後、
コマンドプロンプトのbashから、
cd
cd bin
mv radiko2016_sh.txt radiko.sh
chmod 755 radiko.sh

という感じ。

WSL向けスクリプトカスタマイズ

そうそう、このスクリプトは FreeBSD 用なので、WSL 用に小修正が必要です。スクリプト前方に、「date」コマンドがあるのですが、FreeBSD date には存在する -v オプションが Linux date には存在しません。「-v +1M」の文字を削除する必要があります。この -v オプションは、録音時刻を00秒に調整するためのもの。date -v オプションがない Linux では録音終了時刻を番組終了パターンに合わせて調整する必要があります。

編集前)outputdateline=$( date -v +1M +%Y%m%d%H%M )
編集後)outputdateline=$( date +%Y%m%d%H%M )

最初のテスト録音

まず、このテストスクリプトが動くかどうかのテスト。
書式は、「radiko.sh <放送局> <終了時刻>」です。コマンドを発行した時刻から、終了時刻1分前まで録音されるはずです。
例) 2016/10/22 13:55 にテストを開始したとして、

cd bin
./radiko.sh TBS 14:01

13:55 から 14:00 まで録音できているはず。

保存ファイルは、

/tmp/radiko_out/TBS_201610221355_1.flv

となります。録音ファイルは、

C:\Users\<ユーザー名>\AppData\Local\lxss\rootfs\tmp\radiko_out

を確認します。

ffmpeg をインストールすれば、mpeg にフォーマット変換できますが、ソースからビルドする必要がありますので、この時点では諦めます。

バッチファイル作成

テストが成功したなら、Windows の .bat ファイルを作成します。
例えば、TBS 平日昼間 13:00 – 15:29 までの「たまむすび」を録音したい場合は、

<tama954.bat>
bash --login -i -c "/home/user_name/bin/radiko.sh TBS 15:30"

と、ファイル名 tama954.bat、中身が bash からの一行のファイルです。user_name の部分は自分のアカウントに合わせて修正のこと。

Windows10 タスクスケジューラにバッチファイルを登録する

この作業がわかりにくい!

まず、タスクスケジューラWindows管理ツールコンピュータの管理 の中にあります。

タスクスケジューラを開いたら、「基本タスクの作成」を選択肢、タスク追加のウィザードを起動。

タスク作成ウィザード

タスクに名前を付けます。

タスクに名前を付ける

タスクの繰り返しパターンを決定。

繰り返し期間を選択

残念ながら「平日」という選択肢がないので、毎日を選択します。または、毎週を選択して、月〜金 毎に5つのスケジュールを作るという手もあります。後者の方が優れていますが、これは紹介例なので毎日ということで作成します。

次に、録音開始時刻を入力します。

録音開始時刻を入力

次はタスクのタイプを指定。ここでは、プログラムを開始 を選択

プログラム実行を指定

作成したバッチファイルを指定し、プログラムをどこで実行するかを「開始」フィールドに入力します。
この「開始」という表現、おかしくありません?この開始フィールドを空にしていると、バッチファイルを実行できません。私は、tbs.bat を置いているディレクトリを指定しました。書き込みできるならどこでも良いようです。

bat ファイルと実行ディレクトリを登録

このあとで、設定内容を確認してスケジュールを保存して設定完了。

タスクスケジューラへの登録完了

新しいタスクが追加されました。

タスクスケジューラからの起動テスト

続いて、タスクスケジューラから起動できることを確認します。マウスで、タスクを選択してコンテクストメニューを出し、実行。

タスクスケジューラのテスト実行

次のようなDOS窓が出て来て、録音が開始されればテスト完了。

タスクスケジューラから radiko.sh の起動テスト

本番

続いて本番録音です。
タスクスケジューラは、スリープ解除して自動的にタスクを開始することも可能なようですが、WSL はユーザーがWSLを使用している時だけ有効な環境のため、DOS窓にWSLを開いたままにしておくのが無難です。

指定した日、以降、毎時 13:00 になると バッチファイルから WSL がキックされ、FLVファイルとして録音できています。

先日、録音失敗に見えていたのは、繰り返し実行指定日より前に確認した為でした。Windowsタスクスケジューラを使って、.bat バッチファイルから WSL をキックして Unixスクリプトでラジコを録音するという手は成功です。

Windows Subsystem for Linux の現時点の問題点

ベータ版に文句を言っても仕方ないのですが、WSL で radiko.sh を使うには現時点では無理があります。

  1. WSL は 64bit Windows Pro でしか利用できず、Radika 録音のように本来 Homeバージョン向きの用途に利用するには無理があるかも知れない。それでも、標準環境で Linux シェルスクリプトが利用できることはありがたい。32bit Windows10 Home でも使えて、ようやく MacOSに一歩近づけます。
  2. Debian には存在する ffmpeg をバイナリーインストールできない。録音ファイルを再生するには FLVに対応しているプレイヤーを使うか、flvをmp3に変換可能な別ユーティリティを使う必要がある。
  3. WSL が crontab をサポートしていない。
    このことを知らず、検索してようやく WSL ではcronが使えないことを知りました。これはタイマー録音したいユーザーにとっては致命的です。Linux で cron が使えないって!?
    回避するために、Windows のバッチファイル .bat から、WSL の Bash を呼ぶことを思いついたのですが、コマンド書式にひと苦労。これも .bat から cygwin を呼ぶ方法を記述したページのおかげで解決。
    最後に、Windows タスクスケジューラの設定方法を検索して、ようやくタイマーによる、radika 録音が可能になりました。これは、システム管理の知識がない人にはハードルが高いと言えます。

radika.sh に関する補足

FreeBSD で ラジコを録音するためのスクリプトを使用していますが、このスクリプトは現在も動くことは動いているのですが、今回のラジコ仕様変更で調べてみたところ、問題が見つかりました。
radika の AYTHKeyGet.exe がエラーになっていた原因である、ラジコプレーヤーのURL、ヘッダーのパラメータが古いままだったということ。

git の rec_radiko.sh を参照して、これを反映させました。

> diff radiko_2013.sh radiko_2016oct.sh 
5c5
< playerurl=http://radiko.jp/player/swf/player_3.0.0.01.swf
---
> playerurl=http://radiko.jp/apps/js/flash/myplayer-release.swf
34c34
< swfextract -b 14 ${playerfile} -o ${keyfile}
---
> swfextract -b 12 ${playerfile} -o ${keyfile}
50,51c50,51
< --header="X-Radiko-App: pc_1" \
< --header="X-Radiko-App-Version: 2.0.1" \
---
> --header="X-Radiko-App: pc_ts" \
> --header="X-Radiko-App-Version: 4.0.0" \
85,86c85,86
< --header="X-Radiko-App: pc_1" \
< --header="X-Radiko-App-Version: 2.0.1" \
---
> --header="X-Radiko-App: pc_ts" \
> --header="X-Radiko-App-Version: 4.0.0" \

よくこういう細かい違いを把握できるものだと感心します。swf ファイルは HTTP で通信しているので、HTTP Proxy のログを見れば簡単にわかりますが、他の箇所って https 通信じゃないのだろうか?

今まで、get した player.swf を消していなかったから、たまたま authkey.png を取り出せていたけど、新規のマシンで radiko.sh を使って録音しようとすると、古いURLからダウンロードしようとしてエラーになって録音できないことに気が付きました。

コメントを残す