download-radio の変更点

TITLE:AMラジオの遠距離受信・番外編
RIGHT:初出 2009-12-01
RIGHT:最終更新 2015-8-2
LEFT:
&color(Blue){&size(15){''ページ開設から2年半、やっと[[&color(Blue){&size(15){''ストリーミング放送のダウンロード機能''};};>#download-streaming]]がまともで使いやすい仕様へと進化しました。本来なら最初に公開する時点で今のレベルに達しているべきでした。''};};
#br
----
&size(17){NASやファイルサーバをラジオサーバにしよう};
&size(15){%%(含:NHK語学講座ストリーミングの自動ダウンロード(2013-6-3更新))%%};
&size(15){&color(Red){(2013-8-8追記)NHK語学講座はこのほどアカマイにホスティングされてしまい、(私には)ダウンロードできなくなりました。};};
&aname(radiodownload-set);
&color(Blue){&size(10){''(%%2011-6-11 2011-8-18 2011-9-5 2011-9-12 2011-9-23 2011-10-24 2012-03-11 2012-03-20 2012-04-02 2012-04-14 2012-05-14 2012-05-26 2012-05-29 2013-04-16 2013-05-28 2013-06-01 2013-06-03 2013-08-08 2013-09-15 2013-11-09 2013-11-30 2013-12-29 2014-3-8 2014-6-23 2014-12-7 2015-5-6%%''};&size(15){'' 2015-7-11更新(対象環境をLinux Mint17.2に変更しました。))このページ掲載のスクリプト群とそのインストーラを一緒にしたセットを作成しました。''};};
&color(Blue){''ダウンロード''}; &ref(radiodownload-set.tar.gz,nolink); &color(Blue){''←これだけダウンロードすればこのページからダウンロードできるもの全てを含んでいます。''};
[[&color(Green){&size(12){荻上チキ・Session-22のポッドキャストをICレコーダーで聴いてる人向けのおまけ};};>#Addition1]]
#br
中のinstall.shを実行するだけで
#br
+ 各放送局のポッドキャストファイルの定期的な自動ダウンロード
+ ビデオニュース(http://www.videonews.com)の無料放送の定期的な自動ダウンロード
+ TBSラジオ・嶌信彦のエネルギッシュトーク・ストリーミング放送の定期的な自動ダウンロード
+ %%NHK語学講座の英語コンテンツの定期的な自動ダウンロード%%
+ Youtube動画の定期的な自動ダウンロード(検索条件もしくは特定のチャンネルあるいは特定のユーザのトップページを指定する)

#br
等が、おこなわれるようになります。もちろんこの項目は実連として挙げてみただけです。実際には好みの処理を実行させて下さい。、
#br
このページをマニュアル代わりにしてご利用下さい。スクリプト群自体はUNIX, Linux汎用的ですが、インストーラはUbuntu、Debian系用になっています。他のプラットフォームの方は従来のように手動で環境構築して下さい。
----
このページはループアンテナを自作して遠隔地のAMラジオを受信しようというページではありません。
#br
ループアンテナを使っての遠隔受信は夜間しか効果がないということはご存知だと思います。
そこでこのページでは他の(いかにも番外編的な)手段をいくつか紹介します。
まとめ聴きの為に自動保存して貯めていく手段の紹介がメインになっていると思います。
#br
#contents
&aname(addition-2010-3-18);
* (2010-3-18追記)その他の遠隔受信手段 [#n2ef4009]
Radikoの試験運用が開始されたこの機会にその他の遠隔受信手段についてごく簡単に触れておくことにします。
#br
有名なその他の手段としては[[Radiko:http://radiko.jp]]と[[WebRADIO@anyPlace:http://emuserv.press9.net/webradioanyplace/]]と[[KeyHoleTV:http://www.v2p.jp/video/]]が挙げられます。
#br
[[WebRADIO@anyPlace:http://emuserv.press9.net/webradioanyplace/]]と[[KeyHoleTV:http://www.v2p.jp/video/]]は放送地域に居住されている親切な方の厚意に頼るソリューションです。このページに来られた方なら既に常用されている方も多いことでしょう。
どちらにもそれぞれ長所短所があります。詳しくはここでは触れません。どちらにも自由度が欠けているという共通点があります。
#br
[[Radiko:http://radiko.jp]]は地方局保護の為に(別の言い方をするとRadikoを成立させる為に)IPアドレスによるエリアチェックが設けられていますが、エリアチェックで許可された方がプロキシサーバを立ち上げてくれれば、全国どこでも[[Radiko:http://radiko.jp]]で放送されている好きな局を聴くことができるでしょう。
IPアドレスによるエリアチェックは完全なものではないので、東京・大阪から遠く離れた地域に居住していても[[Radiko:http://radiko.jp]]を聴ける人はある程度いると思います。最近はIPアドレスで内容を切り替えるWeb広告が多いので、自分がラッキーな立場かどうかを[[Radiko:http://radiko.jp]]を試してみる前にわかっている人もいるでしょう。
#br
ラッキーな立場の方は、「自分が何処に住んでいて、どのISPとどんな契約をしているのか」是非、情報を公開して頂きたいです。
ただし、そんなことをみんながやりだすと、将来は総務省が政策として抜け穴を防ぐ措置を取りかねないと思います。将来とまで言わなくても、手っ取り早くISPに対して総務省が指導をおこなうだけでもかなりの抜け穴は塞がれてしまうと思います。

&aname(family-home-server);
* ラジオ局の地元に受信サーバを立てる方法 [#y2bca232]
最もオーソドックスで強力な方法ですが、実行できる人が非常に限られる方法です。
殆ど実践する人はいない筈なので殆どの人はここは飛ばしてしまって次の[[%%%''記事''%%%>#radio-storage-server]]の方に移って下さい。
#br
構成の一例です。
-聞きたいラジオ局が聞ける範囲にある家(それは多分、実家)に常時稼動のサーバを立てる。OSは何でも。ハードウェアは玄箱のようなカスタマイズができるNASでもいい。
-サーバの近くに家の倉庫に眠っていたラジカセを置く。
-[[%%%''PCから操作できる赤外線学習リモコン''%%%>ir-remocon]]を作成し、ラジカセの操作を記憶させる。[[%%%''参考''%%%>ir-remocon#m4e535fd]]
-サーバ上にwebサーバ等を立て、ネットワーク経由で選局できるようにする。[[%%%''参考''%%%>ir-remocon#cbbb9c37]]
-サーバ上にストリーミングサーバもしくはmp3録音&ファイル(CIFS&FTP)&VPNサーバ等を立てる。
-サーバのグローバルIPアドレスをダイナミックDNSに自動登録するようにする。

(2012-8-2追記)[[%%%''スタアストーンソフト社のRadioサーバー''%%%:http://www.starstonesoft.com/products_jp.htm]]を使えばもっと簡単です。このソフトハウス、かゆいところに手が届くようなソフトばかり作ってます。

#br
実は私自身、遠隔地にこのようなサーバは立てていません。しかし上に羅列した様々な技術や工作のうち、私が最近実践していないのはストリーミングサーバだけです。なのでもし誰かが上記もしくはそれに似た構成の環境を構築する場合、場合によってはアドバイスが出来ると思います。
#br
OSがWindowsに限られると思いますが、PC用のUSB接続のラジオチューナーを使えば[[%%%''これ''%%%>ir-remocon]]を作る必要がないのでより(圧倒的に?)お手軽だと思います。但し選局ソフトがネットワーク経由で操作が可能かどうかは私は知りません。まあいざとなればリモートデスクトップとかVNCがあるので最低保証はあります。
#br
[[%%%''lirc''%%%:http://www.lirc.org/]]のReceiverで学習し、Transmitterで選局命令を送信する方法をとれば、必要なハードウェアは[[%%%''これ''%%%>ir-remocon]]よりずっと簡単になります。ただし私はlircのTransmitterは作ったことがないので私としては薦めることはできません。Receiverなら[[%%%''これ''%%%>lirc-recvr]]とか[[%%%''これ''%%%>igorplug-usb]]で経験がありますけれど。

&aname(radio-storage-server);
* webラジオ(オンデマンドラジオ、インターネットラジオ、ストリーミング放送)やポッドキャストの自動保存サーバを作る [#m1ba335b]
[[%%%''こっち''%%%>#family-home-server]]の替わりになるものではなくて、少しベクトルが違うものですが、お薦めしたい方法です。どういう人にお薦めしたいかと言うと、(1)週末にしか自由な時間がない人、(2)日々長時間運転するけど車内はインターネットに繋がっていないので車内でwebラジオを聞きたくても聞けない人、などです。
#br
基本的にwebラジオ放送は内容がどんどん変わっていくので週末にしか自由な時間がない人はwebラジオを逃さず聞きたいと思ってもどうしてもかなり聞き逃してしまうことになります。自宅サーバが毎日自動でwebラジオのデータをローカルにダウンロードしてくれておまけにmp3にトランスコードしてくれれば便利だと思います。以下に掲載のソフト(スクリプト群)はそういったことを実現するものです。
#br
実行プラットホームは、OSはLinux,FreeBSD,Solaris,Mac等のUNIX系OS全般が基本的に使えます。ただし手軽に構築したいのならLinuxかFreeBSDがお薦めです。ハードウェアは玄箱のようなカスタマイズができるNASでもOKです。
#br
今どきのLinuxを使うのならデフォルトのソフトウェアの他に必要なパッケージはmplayer2, lame, nkfです。

&aname(download-radio);
** download-radio.sh(各局のサイトをクロールしていろいろ落とすスクリプト) [#b8b8f7da]
&color(Blue){[[&color(Blue){%%%下に記載の''download-streaming.sh''%%%};>#download-streaming]]、[[&color(Blue){%%%下に記載の''latest-copy.sh''%%%};>#latest-copy]]、[[&color(Blue){%%%下に記載の''make-playlist.sh''%%%};>#make-playlist]]や、[[&color(Blue){%%%下に記載の''設定手順''%%%};>#on_ins_exec]]等と組み合わせると、ポッドキャストやストリーミング放送の新着ファイルを自動的に携帯プレーヤーに持ち出す為のパッケージとして利用することができます。};
デフォルト状態ではこんなものをダウンロードします。
-文化放送のポッドキャスト(ゴールデンラジオなど)
-TBSラジオのポッドキャスト(デイキャッチなど)
-ニッポン放送のポッドキャスト(ビバリー昼ズなど)
-ラジオ日本のポッドキャスト(ラジカントロプス2.0)
-JFNのポッドキャスト(サードプレイスなど)
-RKB毎日放送のポッドキャスト(インサイト)
-NHKラジオ第一のポッドキャスト


※ストリーミング放送については[[%%%download-streaming%%%>#download-streaming]]でダウンロードできます。
&color(Blue){※このスクリプトを使用する場合は''是非''一緒に、専用に作られた[[&color(Blue){%%%【GUIで新着ファイルをリスト参照・再生できるスクリプト】%%%};>#guiviewcomplete_lst]]を利用して下さい。};

#br
AM, FM各局のサイトに掲載されているmp3ファイル(ポットキャストのファイル)をダウンロードするスクリプトです。

文化放送のポッドキャスト、TBSラジオのポッドキャスト、ニッポン放送のポッドキャスト、RFラジオ日本のポッドキャスト、JFN ONLINE(JAPAN FM NETWORK)のポッドキャスト、RKB毎日放送のポッドキャスト、MBS毎日放送ラジオのポッドキャスト、NHKラジオ第一のポッドキャストを一気にダウンロードします。cronに登録すべきスクリプトです。
#br
既にローカルにダウンロード済みのファイルはダウンロードしませんので、二度目以降の実行ではそんなに時間がかかりません。
#br
このスクリプトはこのページに掲載の他のスクリプトの助けを借りずに単独で実行できます。
&size(9){(wgetが必要ですが、これはどこのディストリでもデフォルトで入っているでしょう)};
#br
もちろん保存ディレクトリの場所やどの番組をダウンロードするか等を好きなようにカスタマイズして下さい。
#br
1ディレクトリ中のファイル数が多くなりすぎたら古いものから削除する機能はコメントアウトしてあります。適宜自分のダウンロード状況に合わせて自分用の削除(メンテナンス)スクリプトを作って頂きたいと思います。lsじゃなくてls -trを使わなければならない人もいるでしょう。
#br
%%(2016-3-3追記)各サイト毎に一度にダウンロードできるファイル数を制限する機能を追加すべきだと数カ月前から考えていますが、まだ手をつけていません。過去の例からすると、課題を公開で書くと、間を置かずに手をつける可能性が高いのでここに書いておくことにします。%%(2016-4-2)その機能は既に実装していました。不完全な実装だと勘違いしていただけでした。この際近日中に細かな修正を施してradiodownload-setを公開したいと思います。
%%(2016-3-3追記)各サイト毎に一度にダウンロードできるファイル数を制限する機能を追加すべきだと数カ月前から考えていますが、まだ手をつけていません。過去の例からすると、課題を公開で書くと、間を置かずに手をつける可能性が高いのでここに書いておくことにします。%%(2016-7-18)新板を公開しないうちにTBSのポッドキャストが終わってしまいました。公開してなかったんですが、実はここ半年程は全面的にUTF-8化してました。download-youtube.sh の修正も付せて近日中に公開したいと思います。 (2016-4-2)その機能は既に実装していました。不完全な実装だと勘違いしていただけでした。この際近日中に細かな修正を施してradiodownload-setを公開したいと思います。
(2013-11-9)''xsltproc、libxml-validate-perl''パッケージが必要となりました。(2011-9-5)今回からこのスクリプトの実行にもnkfコマンドが必要となりました。
''ダウンロード''  &ref(download-radio.sh,nolink); ''2015-7-11更新''(一部のMAXFILESを変更等) 2015-5-6更新(404エラー時のゴミファイル削除処理を追加、ラジカントロプス2.0をコメントアウト) 2014-12-7更新(xml判定を自前化) 2014-6-23更新(JFN OWJ→サードプレイス、RKB 中西一清スタミナラジオ→イインサイト、NHK すっぴん 水道橋博士→川島明) 2013-11-09更新(簡易的な索引htmlファイルを作成する機能を追加、古ファイル削除機能を改良) 2013-09-15更新(デフォルト設定での必要ディスク容量や初回ダウンロード時間は激減させた。詳細はradiodownload-setのChangelogに) 2013-08-08更新(サンデーフリッカーズURL変更対応等) 2013-05-29更新(ニッポン放送・ザ・ボイスを追加) 2013-05-28更新(NHKラジオのポッドキャスト番組群を追加等) 2013-04-16更新(TBSラジオ・Session-22を追加、JFN・学問ノススメの2011,2012年版アーカイブを追加、朝日放送を削除、その他、廃止番組を削除) 2012-05-14更新(ストリーミング放送のダウンロードはdownload-streaming.shが一貫処理するようになったので、asxのダウンロードを記述した部分を全て削除しました) 2012-04-02更新(TBS・たまむすび追加) 2012-03-11更新(ダウンロード元に1行に複数のリンクがぶら下がっている場合に対応、久米宏 ラジオなんですけどを追加、OTWジャーナル・今井すみこを追加) 2011-10-24更新(JFN ラジオ版 学問ノススメを追加、ラジオ日本・ラジカントロプス2.0のURL変更に対応) 2011-9-23更新(mp3の場合に本当にmp3であるかのチェックを削除。2011.09.05 版以降は事実上必要性がなくなっていた上にごく一部のポッドキャストファイルの判別に問題があることが判明したので削除) 2011-9-5更新(ダウンロード先を参照するhtml,xmlから複数行にまたがったコメント部を除外する機能を追加) 2011-8-18更新(8月12日の更新のバグを修正。荒川強啓デイ・キャッチを追加) 2011-8-12更新(リンクがコメントアウトされている場合の対応を追加。OTWジャーナル・今井彰を追加) 2011-5-29更新([[LED>v-usb_powerswitch]]対応の記述を追加したくらいです) 2011-4-19更新(<が一文字抜けていました) 2011-4-18更新([[latest-copy.sh>#latest-copy]]と連携するようにしました。またある程度番組ホームページ改編に対応しました) 2011-4-9更新(繰り返し実行し易いようにwgetにタイムアウトを設定しました) 2011-3-18更新([[ビデオニュース・ドットコム:http://www.videonews.com/]]の無料動画用asxのダウンロードを追加しました) 2011-2-28更新([[RKB毎日放送:http://www.rkb.ne.jp/]]のダウンロードを追加しました。&tip;RKBは内容的になかなかお薦めだと思いますし、ID3タグに日本語できっちり内容説明が書きこんであるので[[%%%MPDの日本語化パッチ%%%>mpd_and_lcd4linux_mpd_plugin]]の活躍のしがいがあります。あと、mp3ファイルダウンロード時にテンポラリファイル名を使用するようにしました。テンポラリーファイル名の利用は[[これ>#download-wma]]では当然実装していたのですが、このdownload-radioについては従来は省略していました。このほど[[%%%この手法%%%>#on_ins_exec]]との兼ね合いで実装の必要が生じたものです) 2011-2-20更新(ON THE WAY JOURNALの保存ディレクトリをパーソナリティ毎に分けました) 2011-2-19更新(JFNのダウンロードを追加しました。JFN分は全くコメントアウトしていないのでそのまま使用すると3.5Gバイト程(私がテストした時点)のディスク容量が必要です。また、二重起動防止機能を加えました。従来よりもっと密に起動してもいいでしょう。あと、コメントアウトしてありますが、削除リストのソート順を名前順から更新日付の降順に変更しました)%%(バグを修正しました。1箇所fiの場所が間違っていて、horioディレクトリにkirakiraの最後のファイルが重複してダウンロードされていました)(TBS digの更新に対応しました)(文化放送,TBS,ニッポン放送の改編に対応しました)(文化放送のいくつかの番組のリンクがなくなったのでコメントアウトしました。コメントアウト中の削除機能を少し変更しました)(文化放送のインターネットラジオのページが大幅に変更されていたのでそれに対応しました。またラジオ日本を追加しました。)%%
&color(Blue){''ちゃんと動くように環境構築するにはcron登録などにそれなりの手間がかかるので、[[&color(Blue){%%%''インストーラ付きのセット''%%%};>#radiodownload-set]]をダウンロードすることをお薦めします。''};
#br
中身を見るなら[[%%%''こちら''%%%>#download-radio_contents]]
''まずDOCUMENTROOTを修正して下さい。''自由にカスタマイズすることが前提のファイルです。
#br
cronに
 15 20 * * * /home/disklessfun/bin/download-radio.sh 実際には改行しない
 > /somewhere/download-radio.sh-`date '+\%Y\%m\%d\%H\%M'`.log 2>&1
こんな感じで登録すべきものです。
#br
67行目(Completeの次の行)の
 			echo "`pwd`/${TARGETFILE}" >> "${FILELST}"
で新着MP3ファイルのパスをテキストのリストに追記していきます。このリストは[[latest-copy.sh>#latest-copy]]から利用します。
この部分では他にもいろいろなことをやっていいでしょう。
私の場合は[[%%%USB接続のLEDインジケーター%%%>v-usb_powerswitch]]を光らせます。画面上にバルーンを出してもいいでしょう。このような場合には何らかのステートを保持する機能を利用すべきべきです。
&aname(Addition1);
おまけ:(2015-8-2新規追加)ダウンロード &ref(id3-tag.sh,nolink); 荻上チキ・Session-22のポッドキャストファイルのID3v2タグにテーマを書き込むスクリプト。download-radio.shに組み込んで使います。これはまだradiodownload-set.tar.gzに含まれていません。(2015-10-10追記)スマホ(LinuxやMacOSも)で聴く場合はタグの文字コードをUTF-8にすべきなので71行目を削除し、79行目も修正して下さい。
おまけ:download-radio.shと連携して[[%%%ダウンロードしたファイルを携帯プレーヤーに持ち出す為のスクリプト%%%>#latest-copy]]

&aname(guiviewcomplete_lst);
''【GUIで新着ファイルをリスト参照・再生できるスクリプト】''
&color(Blue){動的なリストから選択するインターフェースなので、様々に応用が効く筈です。};
&ref(download-radio_1.png,nolink);
&size(8){最初に作ったのが古かったからか、その時manを見逃したからか、--hide-headerを使うべきなのに使ってません。};
''ダウンロード'' &ref(GUIviewComplete.lst.sh,nolink); ''2015-7-11更新''(zenityコマンドのダブルクリック時のバグに対応
) 2013-5-28更新(表示行数に合わせてダイアログの高さを自動調整する機能を追加) 2011-9-12更新(純粋な仕様変更。「新着以外も一緒に表示する」行の処理ルールを変更し、[Ctrl]+[A],[Tab],[Tab],[Enter]だけで全・新着ファイルを順に再生できるようにしました。「新着以外も一緒に表示する」行は単独で選択した場合のみ有効となります。) 2011-9-5更新(再生コマンドをexecするように変更。親プロセスが残ってしまい二重起動防止機能が働いて再生中にチェックがおこなえなかったから) 2011-8-18更新(複数行を選択・再生可能になりました。)
(2011-9-18追記)再生コマンドをVLCに変更するパッチ
''ダウンロード'' &ref(GUIviewComplete.lst.sh_vlc.patch,nolink);  私の個人的なカストマイズ内容
VLC 2.0.8%%1.0.6のヘンテコな仕様%%に合わせたカストマイズです。
簡易的なVLC操作手段としてキーシミュレートを利用しているのでVLC起動時の2秒程は自分勝手にアクティブなウインドウを操作することを控える必要があります。(2012-3-25)キーシュミレート内容を変更しました。プレイリストを表示していない状態での使用形態に合わせました。(2012-4-14)最前面化する命令を大量に追加し、かなりの高負荷下でも正しくキーシュミレートがおこなわれるようにしました。また再生速度を1.3倍にする命令も追加しました。(2013-5-28)オリジナルファイルの更新に対応しました。
(2015-2-6)最近のvlcに対応しました。vlcの仕様が素直なものになったので内容は再生速度を1.5倍にするだけにしました。vlcが起動し終わるまで待つ処理を加えています。
 --- orig/GUIviewComplete.lst.sh
 +++ customized/GUIviewComplete.lst.sh
 @@ -13,7 +13,7 @@
  DOCUMENTROOT=/home/disklessfun/Documents
  FILELST="${DOCUMENTROOT}/Complete.lst" # ダウンロードしたファイル一覧
  DONELST="${DOCUMENTROOT}/Done.lst"     # 既に持ち出したファイル一覧
 -PLAYER="totem" # 好みの再生コマンドを設定する
 +PLAYER="vlc" # 好みの再生コマンドを設定する
  MAXLINES=50 # 最大表示行数
  FIRSTLINEMSG="新着以外も一緒に表示する"
  FLMSG=false
 @@ -185,4 +185,41 @@
  	done
  fi
  
 -eval exec "${PLAYER}" "${str}" &
 +eval "${PLAYER}" "${str}" &
 +for ((i=1;i<=10;i++))
 +do
 +
 +while test `xdotool search --class vlc|wc -l` -le 4
 +do
 +sleep 0.1
 +done
 +
 +xdotool search --class vlc|while read wid
 +do
 +RET=$(xdotool windowactivate ${wid} 2>&1)
 +if (echo "${RET}"|grep -q "failed") then
 +continue
 +fi
 +
 +for ((i=1;i<=15;i++))
 +do
 +sleep 0.2
 +awid=`xdotool getactivewindow`
 +if test "${awid}" = "${wid}"; then
 +	break
 +elif test $i -eq 15; then
 +	killall ${0##*/}
 +fi
 +xdotool windowactivate ${wid}
 +done
 +xdotool key "alt+l"
 +sleep 0.2
 +xdotool windowactivate ${wid}
 +xdotool key "alt+e"
 +sleep 0.3
 +xdotool windowactivate ${wid}
 +xdotool key "alt+f"
 +done
 +
 +killall ${0##*/}
 +done

(2011-5-29追記)''【cron登録用一部のファイル保存スクリプト】''
''ダウンロード'' &ref(keep-podcast.sh,nolink);
(2012-3-20追記)''【WMVファイルに一気にインデックスを付加するスクリプト】''
''ダウンロード'' &ref(add-wmvindex.sh,nolink);
最新のradiodownlaod-setには既にasfbinコマンドを用いる記述が追加されています。このスクリプトは過去にダウンロードしたWMVファイルに一気にインデックスを付加することを目的として作成しました。単機能ですが引数パスは自由に指定できるのでwmvファイルのあるディレクトリで*を引数にしたり、あるいはfindの-execオプションと組み合わせる等の方法で使って下さい。※asfbinの導入はご自身でおこなって下さい。
(2012-3-20追記)''【WMVファイルから一気にWMAファイルを抽出するスクリプト】''
''ダウンロード'' &ref(extract-wma-from-wmv.sh,nolink);
add-wmvindex.shと似たような中身です。

&aname(download-youtube);
** download-youtube.sh(Youtube動画を自動的にダウンロードするスクリプト) [#e8cec406]
(2013-5-28初出)
[[videonews:http://www.videonews.com/]]が徐々にYoutube重視に変化してきて、NコメをYoutubeにしかアップロードしないという週も出たりするようになったので作成しました。ただしvideonewsに特化した機能はなく、汎用的に使用できます。
#br
cron登録して使用する場合は、検索条件もしくは特定のチャンネルあるいは特定のユーザのトップページを指定して使用します。特に検索条件でのダウンロードは、アップロードされた後にすぐ削除されてしまう人気(テレビ番組)動画の“録り逃し対策”ならぬ“落とし逃し対策”として強力なツールとなります。
&color(Blue){検索条件に「search_sort=video_date_uploaded」を含んでいて、且つEオプション(=excludeoldオプション)を指定している場合は、本スクリプト230行目のcontinueをbreakに変更することを強くお薦めします。そうしておけば指定期間外のファイルが1個見つかった時点でスクリプトが終了するので無駄が少なくて済みます。};
Eオプション(=excludeoldオプション)を指定する場合は、下に記述しているダウンロード順を逆にする修正はおこなわないで下さい。
#br
cron登録する場合は
 #   VideoNews
 00 19-23 * * * export PATH=$PATH:/home/disklessfun/bin &&  実際には改行しない
 /home/disklessfun/bin/download-youtube.sh 実際には改行しない
 http://www.youtube.com/user/videonewscom/videos  実際には改行しない
 /home/disklessfun/Documents/VideoNews/videonews  実際には改行しない
 >"/somewhere/download-videonews-youtube-`date '+\%Y\%m\%d\%H\%M'`.log" 2>&1
 #   青山繁晴
 00 19-23 * * * export PATH=$PATH:/home/disklessfun/bin &&  実際には改行しない
 /home/disklessfun/bin/download-youtube.sh -N -E http://www.youtube.com 実際には改行しない
 /results?search_sort=video_date_uploaded\&search_query= 実際には改行しない
 \%E9\%9D\%92\%E5\%B1\%B1\%E7\%B9\%81\%E6\%99\%B4  実際には改行しない
 "/home/disklessfun/Documents/Misc/aoyama"  実際には改行しない
 >"/somewhere/download-aoyama-`date '+\%Y\%m\%d\%H\%M'`.log" 2>&1
 #   勝谷誠彦
 30 19-23 * * * export PATH=$PATH:/home/disklessfun/bin &&  実際には改行しない
 /home/disklessfun/bin/download-youtube.sh -N -E http://www.youtube.com 実際には改行しない
 /results?search_type=videos\&search_query= 実際には改行しない
 \%E5\%8B\%9D\%E8\%B0\%B7\%E8\%AA\%A0\%E5\%BD\%A6+ 実際には改行しない
 -\%E7\%AB\%8B\%E8\%8A\%B1\%E5\%AD\%9D\%E5\%BF\%97 実際には改行しない
 \&search_sort=video_date_uploaded  実際には改行しない
 "/home/disklessfun/Documents/Misc/katsuya"  実際には改行しない
 >"/somewhere/download-katsuya-`date '+\%Y\%m\%d\%H\%M'`.log" 2>&1
 #   MBS1179RADIO(MP3オンリーモード)
 00 13,15,17,19,21 * * * export PATH=$PATH:/home/disklessfun/bin && 実際には改行しない
 /home/disklessfun/bin/download-youtube.sh -M http://www.youtube.com/ 実際には改行しない
 user/MBS1179RADIO/videos?view=0\&sort=dd 実際には改行しない
 /home/disklessfun/Documents/MBS/MBS1179RADIO 実際には改行しない
 >"/somewhere/download-mbs-youtube-`date '+\%Y\%m\%d\%H\%M'`.log" 2>&1

こんな感じで登録します。
crontabでは「%」は「\%」、「&」は「\&」とエスケイプしなければなりません。従って上記例のように検索条件をcrontabに記述する場合は、まずブラウザー上で検索条件を作成し、そのURLをエディタに貼り付け、「%」を「\%」に、「&」を「\&」に一括置換してからcrontabに貼り付けて下さい。
#br
他に、youtubeビデオID(11バイトの文字列)のリストファイルを読みこむLモード、# URLの代わりに一つのyoutubeビデオID(11バイトの文字列)を直接指定する直接指定モードがあります。
#br
このスクリプトの実行には''youtube-dl、nkf、libav-tools(旧ffmpeg)、id3v2の各コマンドが必要です。''
#br
%%Youtubeの仕様はしばしば変更されるので、このスクリプトが動作する為には最新版のyoutube-dlコマンドがインストールされている必要があります。[[%%%radiodownload-set%%%>#radiodownload-set]]のインストーラには、たとえ古いUbuntu環境であっても強制的に最新版のyoutube-dlコマンドをダウンロードしてインストールする機能があります。(2014-3-8追記)最近は各OSリリース標準のyoutube-dlコマンドで大丈夫なようです。(2014-6-23追記)Linux Mint 13標準のyoutube-dlコマンドは正常に動作しません。今回リリースしたradiodownload-setでは、インストーラ内で、動作確認のとれているyoutube-dlコマンドをダウンロード&インストールしています。%%
#br
''ダウンロード''  &ref(download-youtube.sh,nolink);  ''2015-7-11更新''(主に対象環境をMint17.2に変更したことに伴う変更) 2015-5-6更新(タイトル中の特殊な文字コードが使われている濁音・半濁音を一般的なものに置換する処理を追加) 2014-6-23更新(ファイル名無害化関数に%の処理を追加) 2013-12-29更新((動画ID)直接指定モード判定部のバグを修正) 2013-09-15更新(--excludeoldオプションでの削除時にテンポラリーリンクを削除していなかったので修正) 2013-08-08更新(MBS1179RADIOチャンネル用の--mp3onlyモードを追加、他) 2013-06-01更新(216行目がコメントどおりじゃなかったので修正)
''まずDOCUMENTROOTを修正して下さい。''
&color(Red){-Lオプションの使い方が紛らわしいこと(-Lの後にリストファイルを指定するわけじゃないという変態仕様)をご了承下さい。};私も時には[[%%%ここ%%%>grub2_and_grub1#additional_work]]みたいにまともな引数仕様で作るのですが、このスクリプトは簡単に済ませたかったんです。
中身を見るなら[[%%%''こちら''%%%>#download-youtube_contents]]
#br
177行目と178行目の間に(178,179行目として)
 tac<"${TMPFILE3}">"${TMPFILE2}"
 cat<"${TMPFILE2}">"${TMPFILE3}"
を追加するとダウンロード順が逆になります。他にも好みに合わせてカストマイズしてみてください。

&aname(download-streaming);
** download-streaming(%%本ページのメインコンテンツ、%%ストリーミング放送を自動でダウンロードするスクリプト) [#s2918d65]
無料ストリーミング放送のページのURLを引数に与えてやると、そのページからダウンロードできる全ての無料ストリーミング音声データ(wmvやwmaやasf)や無料動画データ(DRMなしのwmvやasf)をダウンロードし、asxファイル内やWindowsMediaヘッダに書き込まれたタイトルやURLに従って適切なローカルファイル名を付け(引数オプションで制御可能)、さらに、引数オプションで指定すればmp3にトランスコード(wmvの場合は音声部分だけ)します。これもcronに登録すべきスクリプトです。
#br
cronに
 00 15 * * 1 /home/disklessfun/bin/download-streaming.sh  実際には改行しない
 -A http://www.tbs.co.jp/radio/format/shima.html 実際には改行しない
 /home/disklessfun/Documents/TBS/shima 実際には改行しない
 >"/somewhere/download-tbs-shima-`date '+\%Y\%m\%d\%H\%M'`.log" 2>&1

こんな感じで登録すべきもの%%です%%(でした。今も残っているのは嶌信彦のエネルギッシュトークぐらいです)。
引数には、オプション、番組ページのURL、保存先ディレクトリを指定します。asxファイルがダウンロードされ、順にストリーミング放送のデータのダウンロードがおこなわれます。
#br
mp3へのトランスコード機能はmp3に対応したカット・編集ソフトが充実していること、mp3しか再生できない携帯プレーヤーが存在するので設けています。-Tオプションをつければ変換がおこなわれます。
WMAが再生できるプレーヤーを使っていてもMP3にトランスコードした方が便利な場合があります。たとえば私が使っている携帯サウンドプレーヤーはWMAも再生できます。しかしMP3なら2倍速で再生できるのにWMAは1.2倍速までなので、私はWMAをWMAのままで聴くことは殆どなく、大抵MP3にトランスコードしてから聴きます。
#br
''「ダウンロードしたデータのローカルファイル名・命名仕様」''
各局の実情に合わせた仕様なので、まずは下記の実際の例を見て下さい。
下記の例について言えば、MBS毎日放送を除けば、asxファイル内のTitleやURLからローカルファイル名が自動で決定されます。MBS毎日放送の場合はコンテンツのWindowsMediaヘッダ内のタイトルをローカルファイル名とします。
#br
''【NHK】''
2013年4月以降、NHK側の大幅な仕様変更により未対応となりました。

''【文化放送】''
2013年3月末をもって同局の無料ストリーミング放送は廃止になりました。

''【TBS】''
※URLで完全に識別できるタイプ=-Aオプションをつける=ダウンロード前に重複チェックが可能
-嶌信彦のエネルギッシュトーク-20120513.wma

''【VideoNews】''
※URLで完全に識別できるタイプ=-Aオプションをつける=ダウンロード前に重複チェックが可能
※wmvから抽出したwmaは携帯プレーヤーとの互換性が低いので-Tオプションをつけてトランスコードをおこなう
-news_578-2-news_578-2_300.wmv
-news_578-2-news_578-2_300.mp3
-marugeki_578_pre-marugeki_578_pre.wmv
-marugeki_578_pre-marugeki_578_pre.mp3

''【ABC朝日放送】''
※URLを使いまわすタイプ=-Aオプションはつけない
※ローカルファイル名にはyyyymmddhhmm形式の時間が付加される
-ABC Webio こころ晴天-seiten1-200911250308.mp3
-ABC Webio こころ晴天-seiten2-200911250308.mp3

''【MBS毎日放送】''
2013年7月中頃、同局のストリーミング放送は廃止になりました。
//※URLを使いまわしたり、そうじゃなかったり=-Aオプションはつけない
//※この局のコンテンツのWindowsMediaヘッダには識別できるタイトルが書き込まれています。-Aオプションをつけない場合、WindowsMediaヘッダにタイトルが書き込まれている場合はそれが優先されてローカルファイル名がつけられます。
//※ローカルファイル名には(念のため)yyyymmddhhmm形式の時間が付加される
//-OSIHIKI ZOUKANGO (05-14)-201205152100.wma
//-KAMEYAMATSUTOMUNO KAMETOMO Sports Man day (05-14)-201205151700.wma
//-YOUNG TOWN SUNDAY(05-13)-201205162000.wma
//-ARIGATO HAMAMURA JUN DESU(05-17)-201205171700.wma
//-TANEMAKI JOURNAL(05-07)-201205141900.wma

#br
''「重複チェックの仕様」''
WEBラジオ(オンデマンド、ストリーミング放送)のダウンロードには重複ダウンロードのチェックが必須です。URLが同じままで内容だけが更新されることがあるからです。
上記の例について言えば、TBSと文化放送とVideoNewsについては放送内容毎にasxファイル内のURLを書き換える運用をおこなっているので、ストリーミングデータのダウンロード前にURLを見るだけで重複チェックがおこなえますが、他社はそうではないので、ダウンロードした後に、過去にダウンロードした末尾の時間以外が同一名のファイルの中で最も新しいものとバイナリ比較をおこなうことによって重複チェックをおこなう必要があります。(htmlに???日放送分とかUpdate ???とか書いてある筈なのでそれを読み取って利用するという方法もありますが、一般化しにくいのでそれは今のところ対応していません。)
#br
このスクリプトをcronで長期間運用すればラジオ音声を録音したファイルがローカルに大量に溜まります。それを持っていて一番役に立つのは、日本語が通じなくてインターネットにも繋がっていない場所で何年か生活しなければならない人でしょう。
#br
ダウンロードには放送を聞くのと同じ時間がかかります。
#br
このスクリプトを運用する為には''&color(Red){このページに掲載の他の2つのスクリプトが必要です};''。
#br
''download-streaming.sh 運用の為に必要な他のスクリプト''の直接ダウンロードリンク
|&ref(download-wma.sh,nolink);|CENTER:説明は[[%%%''こちら''%%%>#download-wma]]|
|&ref(get-wma-info.pl,nolink);|CENTER:説明は[[%%%''こちら''%%%>#get-wma-info]]|
これらを''全てパスの通った場所に置いておく必要''がありますし、''mplayer2, lame, nkfの各コマンドが必要です。さらに[[get-wma-info.pl>utlshell#get-wma-info]]を動作させる為に[[%%%''Audio-WMA Perl拡張モジュールのインストール''%%%>utlshell#get-wma-info]]が必要です。''
&size(9){(他にwgetも必要ですが、これはどこのディストリでもデフォルトで入っているでしょう)};
#br
''ダウンロード''  &ref(download-streaming.sh,nolink); ''2014-12-7更新''(拡張子waxに対応) 2014-6-23更新(ファイル名無害化関数に%の処理を追加) 2013-5-28更新(download-youtube.shで採用したコードとの共通化) 2012-5-29更新(ファイル名にbracketを使わないようにしました) 2012-5-14新規公開
''まずDOCUMENTROOTを修正して下さい。''
&color(Blue){''ちゃんと動くように環境構築するにはここに書いているようにそれなりの手間がかかるので、[[&color(Blue){%%%''インストーラ付きのセット''%%%};>#radiodownload-set]]をダウンロードすることをお薦めします。''};
#br
#br
&color(Olive){以下は前身のall-process-asx.shの更新履歴};
&color(Olive){(2011-9-5)download-radio.shの更新により、VideoNewsのコメントアウト部に記述されている(た)marugeki_941_pre.asxはダウンロードしなくなりました。};
&color(Olive){''ダウンロード''  &ref(all-process-asx.sh,nolink); ''2012-04-02更新''(asx内のTitleにスラッシュが含まれる場合に対応) 2011-5-29更新([[&color(Olive){LED};>v-usb_powerswitch]]が使いやすいようにPATHを追記しただけです) 2011-4-19更新(FILELSTにはmp3ファイル名を追記するように修正)  2011-4-18更新([[&color(Olive){latest-copy.sh};>#latest-copy]]と連携するようにしました) 2011-3-18更新(ビデオニュース・ドットコムの無料動画の一部がダウンロードできなかったので修正しました。) 2010-3-18更新(隠し?オプションを変更し、maxdepthを自由に設定可能としました。)2010-3-22更新(URLのechoはdownload-wma側でおこなうことが好ましい為、本スクリプトからは削除しました。)};
&color(Olive){''(2011-4-18追記)今回追加した変数DOCUMENTROOTは適宜書き換えて下さい。''};


&aname(download-wma);
** download-wma.sh(download-streaming.shの中で呼び出される) [#z56d8e8c]
&color(Red){このスクリプトの実行には[[&color(Red){%%%''get-wma-info''%%%};>#get-wma-info]]が必要です。};他に''mplayer2''と''lame''も必要です。
#br
単独で使用することもできます。
#br
コメントアウトしてある個所は、私の場合は有効にして使用しています。.bashrcに独自PATHが指定してあってそれを使いたいという人は有効にして下さい。
#br
''ダウンロード''  &ref(download-wma.sh,nolink); ''2015-7-11更新''(mplaye2の出力するstream_chunck size is too oldを無視する記述を追加) 2014-6-23更新(内部で使用しているコマンドをmplayerからmplayer2に変更(これに伴い名前付きパイプの使用を廃止)。ファイル名無害化関数に%の処理を追加) 2013-04-16更新(wmaヘッダ内のtitile設定のエラーケースに対応、asxファイルのファイル名が内包関係にある場合に対応、パーミッションが設定できないファイルシステムに対応) 2012-5-29更新(ファイル名にbracketを使わないようにしました) 2012-05-14更新(download-streaming.shから呼び出される場合に対応。重複チェック仕様の更新も含む) 2012-04-02更新(スキップ時にダウンロードファイルが存在しない場合に対応) 2012-03-11更新(asfbinを用いてWMVにインデックスを追加する記述を追加) 2011-5-29更新((1)ファイルのモードを600から644に。(2)id3v2も作成するように。(3)ジャンルSpeechを設定) 2010-3-28更新(WMAヘッダのタイトルに改行が含まれていると、それをファイル名として利用する単独使用する場合に問題になるので、改行コードを除去してから利用するようにしました。)
%%中身を見るならこちら%%((2011-5-29)ページの行数制限の為掲載をやめました。)
#br
単独での使用方法は[[%%%''こちら''%%%>utlshell#download-wma]]にあります。

&aname(lame_remarks);
(2011-2-19追記)デフォルトの状態では、ID3タグに関しては、V1タグのみを作成し、シフトJIS(変数名としては”${cp932title}”)で書きこんでいます。私が使用している国内メーカー製の携帯プレーヤーや日本の環境に完全に適合したソフトだとまずこれでいいんですが、国際的な標準に従うなら、日本語はV2タグにUTF-8(変数名としては”${utf8title}”)で書きこむべきです。またプレーヤーによってはV2タグにシフトJISで書きこんだ方がいい場合もあるかもしれません。このあたりはもし必要であれば適宜、ご自身の環境に合わせてカスタマイズして下さい。
-検討してもいいと思われる項目
-- ${cp932title}を使うか${utf8title}を使うか
-- %%--add-id3v2を追加するか%%(実施済み)
-- --id3v2-onlyを追加するか
-- %%--tg [num]を追加するか。%%(実施済み)(例:num(ジャンル番号)は101だとSpeech、28だとVocal)

&aname(transcode-wma-to-mp3);
** transcode-wma-to-mp3.sh [#c0b8ccda]
download-streaming.shの前身のall-process-asx.shからは呼び出されていましたが、download-streaming.shからは呼び出されないので、単なるおまけユーティリティ的存在になりました。
#br
&color(Red){このスクリプトの実行には[[&color(Red){%%%''get-wma-info''%%%};>#get-wma-info]]が必要です。};他に''mplayer2''と''lame''も必要です。
#br
''使い方''
 $  transcode-wma-to-mp3.sh "JOQR 「超ラジ!火曜日」-tyora091118.wma"
こんな感じです。
実際にはwma専用ではなく、wmvやflv等々、mplayerで音声がデコードできるソースであれば何でもmp3にトランスコードします。

#br
''ダウンロード''  &ref(transcode-wma-to-mp3.sh,nolink); ''2014-6-23更新''(内部で使用しているコマンドをmplayerからmplayer2に変更(これに伴い名前付きパイプの使用を廃止)) 2013-04-16更新(パーミッションが設定できないファイルシステムに対応) 2011-5-29更新(download-wma.shと同様の変更をおこないました。)
#br
(2011-2-19追記)[[%%%ID3タグ辺りのカスタマイズ%%%>#lame_remarks]]

&aname(get-wma-info);
** get-wma-info.pl(ヘルパースクリプト) [#de8dea6c]
ヘルパースクリプトです。
説明およびダウンロードは[[%%%''こちら''%%%>utlshell#get-wma-info]]

&aname(gogakukouza-download-server);
//* NHK語学講座ストリーミングのダウンロード(自動録音) [#wc0e2e51]
//
&aname(download-nhk-gogakukouza);
//** download-nhk-gogakukouza(NHK語学講座のストリーミング放送を自動でダウンロードするスクリプト) [#kd3abd04]
//(2009-12-31初出、2013-4-16最終更新)遠距離受信との関連は薄いですがやはりこの分野も必要かなと思うので作成しました。
//今のところ、基礎英語1, 基礎英語2, 基礎英語3, 英会話タイムトライアル%%英語5分間トレーニング%%, ラジオ英会話, 入門ビジネス英語, 実践ビジネス英語のダウンロードに対応しています。これらの放送は中身が//AAC%%mp3%%でコンテナはflv形式で配信されているのでMP4(拡張子m4a)形式に変換して保存します。
//[[%%%こちら%%%>#radio-storage-server]]と同様に、NASを含む常時稼動サーバに自動ダウンロードタスクを追加することを意図したものです。
//&color(Blue){(2010-10-30追記)10月22日に、3月29日から始まった2010年度放送分のファイルが丁度DVD1枚分溜まったのでDVD-Rに焼きました。(2011-4-6追記)2010年度分は前バージョンで全て無事にダウンロードできました。};
//%%(2011-4-6追記)新年度からNHKのサーバの仕様が変わったようなので一応対応しました。とりあえず新年度第一週分は従来どおりダウンロードできます。しかし次週以降は駄目かも。%%
//&color(Red){(2011-4-12追記)先週の懸念に一応対応しました。その週にならないとわからないURLは他の方のページに行って取ってきています。};
//&color(Red){(2011-4-18追記)先週のバージョンは上記「他の方」からアクセスをブロックされた可能性があります。とりあえず対応しました。もし再度ブロックされた場合はご自身でスクリプト内で使用するUser Agent(変数UAG)を修正するとか「他の方」と交渉するなど適宜対応して下さい。私自身は既に昨年度1年分を全てダウンロード済みですので対応に関して強い動機を持てません。};
//&color(Red){(2011-4-25追記)「他の方」のサーバ側で表記が少変更されたので対応しました。};
//&color(Red){(2011-5-12追記)「他の方」のサーバ側でxmlが用意されたのでそれを利用するように変更しました。};
//#br
//これを使えば、O社のラジオサーバーとかS電子の○ーク○スターとかS電機のラジオ付きのICレコーダーを「''NHKの語学講座を録音したいから''」という理由で購入する必要はなくなると思います。
//このスクリプトの機能はiPhone(無料)アプリとかAndroid(無料)アプリにも向いた分野だと思います。もう誰かが作っているかもしれません。また無線LAN付きの携帯音楽プレーヤーの全てにこの機能が付いていてもいいと思います。ソフトだけの対応なのでやる気さえあれば現行のハードでも大半のプレーヤーで実現可能だと思います。
//#br
//それよりインパクトが大きいのはICレコーダーへの機能搭載です。ただしこれには少し高いハードルがあります。無線LANの追加とNHKへの交渉が必要になります。NHK出版の売上が減少しかねないと協力の代償に補償金を求められるかもしれません。(言わずもがなですが、NHKと交渉せずに勝手に搭載した機能は無保証にならざるをえません。前述のiPhoneアプリとか携帯音楽プレーヤーにおいても然り)
//(2010-7-16追記)関連情報:SIIからNHK「ラジオ英会話」1年分の音声データと対応テキストを収録した電子辞書「[[%%%SR-G6100NH%%%:http://www.sii.co.jp/cp/products/english/srg6100nh/index.html]]」が発売されました。
//#br
//[[%%%LinCaptureStream%%%:http://www42.atwiki.jp/cachestream/pages/21.html]]というのもありますが、GUI専用で自動ダウンロード用に使用できないし、ソースが公開されていないので、自分で独自に作成しました。
//NHK語学講座''専用''なので[[%%%こっち%%%>#download-radio]]と違っていろいろ決め打ちに出来るので簡単な作りになっています。
//#br
//Ubuntu 9.10から標準レポジトリに入ったflvstreamerを利用しています。flvstreamerはあまり環境に依存しないコマンドなので、標準レポジトリに含まれていないディストリやリリースであっても他のディストリやリリースからバイナリをそのまま持ち込めば多分動作すると思います。まあ適宜対応して下さい。
//私がUbuntu 9.04でも動作確認した際は、[[%%%これ%%%:http://ubuntutym.u-toyama.ac.jp/ubuntu/pool/universe/f/flvstreamer/flvstreamer_1.8e-2_i386.deb]]をダウンロードし、dpkg -xで解凍して取り出したflvstreamerを/usr/local/binに置いていました。(←これはコマンド追加の一般的な方法ではありませんが、flvstreamerがいかに環境に依存しないかを示す意味で紹介しました。)
//#br
//cronに
// 38 22 * * * /home/disklessfun/bin/download-nhk-gogakukouza.sh 実際には改行しない
// > /somewhere/download-nhk-gogakukouza-`date '+\%Y\%m\%d\%H\%M'`.log 2>&1
//こんな感じで登録すべきものです。
//1シリーズ分を無人でダウンロードすることを意図しています。
//長期間無人で運用する場合は、ネットワーク不調の場合などを考慮して、たとえコンテンツが週に一度しか更新されなくても週に何度か実行することをお薦めします。例のように毎日実行しても別にかまわないと思います。既にダウンロード済みのファイルは再度ダウンロードしませんのでサーバに負荷がかかることもありません。
//クーロン登録を意図したものではありますが、コンソールで使用することも(いつもと同等に)配慮しています。キャンセルは[Ctl]+[C]です。
//#br
//m4aファイルのファイル名はNHKが作成したxmlの中の記述をそのまま利用して、
//「基礎英語1_12月21日放送分.m4a」といった形式になります。
//#br
//以下の取り消し線部は2012年度対応版以前についての説明
//%%mp3ファイルのファイル名はNHKが作成したxmlの中の記述をそのまま利用して、%%
//%%「基礎英語1_12月21日放送分.mp3」といった形式になります。%%
//%%mp3ファイルのID3タグには、タイトル, アルバム, ジャンルをセットしています。%%
//%%タイトルは「基礎英語1_12月21日放送分」%%
//%%アルバムは「基礎英語1」%%
//%%といった形式になります。%%
//%%ジャンルは「Speech」になります。%%
//%%デフォルトのID3タグの文字コードはシフトJISとしています。%%
//%%ID3v1とID3v2の両方に同じ値をセットしています。%%
//#br
//このスクリプトを使用する為には''flvstreamer, ffmpeg%%, id3v2%%の各コマンドが必要です''。
//&size(9){(他にwgetも必要ですが、これはどこのディストリでもデフォルトで入っているでしょう)};
//#br
//''ダウンロード''  &ref(download-nhk-gogakukouza.sh,nolink); ''2013-6-3更新''(スクランブルコードの長さと引用符の種類の双方の変化に柔軟に対応する仕様に変更(従来は引用符のみ)。すみません、2011-9-5の更新時にこの仕様にしていれば良かったと思います) 2013-5-28更新(一部、コメントどおりの仕様になっていなかった箇所を修正(実質的な変更ではない)) 2013-4-16更新(2013年度対応(音声コーデックがMP3からAACに変更された。コンテナは、ffmpegコマンドの仕様のバラツキを考慮し、汎用のMP4に留めた。拡張子はm4a)) 2012-4-14更新(2012年度対応:英会話タイムトライアル追加、英語5分間トレーニング削除) 2011-9-5更新(スクランブルコード参照用XMLのフォーマットが変更されたことに対応しました。) 2011-6-11更新(実はmp3ファイルのモードを644にする為にchmodを加えただけです。大半の方にとっては何も変わらないでしょう。)
//中身を見るなら[[%%%''こちら''%%%>#download-nhk-gogakukouza_contents]]

&aname(listening-on-linux);
* Linuxでストリーミング放送を直接聴く [#q9c6b983]
あまり本ページの他のコンテンツと関連がありませんが、一応書いておきます。
Firefoxで聞くならプラグインを入れ替える必要があります。
totem-mozillaをアンインストールし、代わりにmozilla-mplayerとかgecko-mediaplayerなどのmplayer系のプラグインをインストールする必要があります。私はmozilla-mplayer派です。
mplayerもrtspクライアント機能をを完全に実装してるわけではないらしく、任意の位置へのジャンプ(シーク)が出来ません。でもBGMとして聞くことが目的なら全く問題ないでしょう。
このような状況はここ何年も変わっていません。

* (主にLinux上で利用する)携帯プレーヤーやICレコーダーの為のユーティリティ類 [#ka3a6a55]

&aname(latest-copy);
** latest-copy.sh (download-radio.sh等と連携して携帯プレーヤーへファイルを持ち出すスクリプト) [#i9d0d8ea]
[[%%%download-radio%%%>#download-radio]]や[[%%%download-streaming%%%>#download-streaming]]でダウンロードしたファイルから新着のものだけを選んで携帯プレーヤーにコピーするスクリプトです。
(私はiTunesやiTunes互換ソフトは使っていません)
データベースの代わりにテキストファイルを用いる簡素なつくりです。
#br
 $ latest-copy.sh [ボリュームラベル]
%%引数なしで実行するだけです。コピー先は自動認識します。%%(2015-7-11差し替え)大抵は引数なしで実行しても正常に稼働しますが、普通は対象ストレージのボリュームラベルを引数として渡します。
#br
(自動認識の場合の)母艦に接続された携帯プレーヤーの検索手順は、(1)/media/ユーザ名直下のマウントポイントで、(2)フラッシュメモリのデバイスで、(3)FATファイルシステムなものを探し、最初に見つかったものとしています。
#br
''ダウンロード''  &ref(latest-copy.sh,nolink);  ''2015-7-11更新''(マウントポイントのパスにユーザ名を追加、引数にボリュームラベルを受け取れる仕様に変更、簡易的な記述が残っていて引数なしで実行した場合はボリュームラベルに半角スペースがあるとうまく動かない、(対応しようと思えば対応できるが別にその必要はないと今まで考えてきた)) 2013-5-28更新(従来のwmvに加えてflvについても持ちだしたことにする処理を加えた) 2012-5-26更新(wmvを特別扱いする仕様を加えました) 2011-5-29更新 [[LED>v-usb_powerswitch]]対応の記述(コメントアウトされている)の追加と無駄削除1箇所です。
中身を見るなら[[%%%''こちら''%%%>#latest-copy_contents]]
''DOCUMENTROOTは修正して下さい。''
三洋のICレコーダー用なので持ち出し先を携帯プレーヤーの''MUSIC''ディレクトリとしています。適宜修正して下さい。
#br
母艦に接続するだけで自動で最新ファイルをコピーし、さらに自動でアンマウントまですることも可能だと思いますが、%%今のところ設定方法を調べていません。誰か調べたら教えて下さい%%。
(2011-2-26追加)[[&tip;''携帯音楽プレーヤーを母艦PCのUSBポートに挿し込むだけであとは自動で最新ファイルをプレーヤーにコピーする(持ち出す)設定''>#on_ins_exec]]を紹介します。[[%%halevt%%:http://www.nongnu.org/halevt/]][[devmon:https://igurublog.wordpress.com/downloads/script-devmon/]](2015-7-11更新)を使う方法です。
#br
あと、携帯プレーヤーに持ち出すのでなく、ダウンロードしたサーバで直接再生してしまうのもありだと思います。私は半々くらいの割合で使い分けています。サーバで再生するなら[[%%%こちらのページ(''Music Player Daemonの日本語化'')%%%>mpd_and_lcd4linux_mpd_plugin]]をどうぞ。
#br
上記を少しカスタマイズして作成した、ソニーのICレコーダー用です。
内蔵メモリ側は無視し、microSD側に対して持ち出し処理をおこなっています。
%%※私は、内蔵メモリのボリュームラベルはデフォルトの「IC RECORDER」から「IC_RECORDER」に変更して使っています。%%
''ダウンロード''  &ref(sony.latest-copy.sh,nolink);  ''2015-7-11更新''(マウントポイントのパスにユーザ名を追加、引数にボリュームラベルを受け取れる仕様に変更、簡易的な記述が残っていて引数なしで実行した場合はボリュームラベルに半角スペースがあるとうまく動かない) 2013-6-13更新 2013-5-14新規公開

&aname(make-playlist);
** 携帯プレーヤーのプレイリストを作成するスクリプト [#h4295071]
プレイリストを自動生成するスクリプトです。
-MYLIST1.M3UはMUSICディレクトリ直下のファイルのみを名前順にソートして作成
-MYLIST2.M3UはMUSICディレクトリ直下のファイルのみを更新日付順にソートして作成
-MYLIST3.M3Uはサブディレクトリ群下のファイルのみをパスの名前順にソートして作成
-MYLIST4.M3UにはMYLIST3.M3Uに収まりきらない分で作成

基本的には自分の使い方に合わせた仕様になっています。日々のポッドキャストのファイルは直下だけに置き、サブディレクトリ群には長期的に聴くものを置いています。1プレイリストは最大99ファイルまでなので、MYLIST3.M3Uに収まりきらない分はMYLIST4.M3Uに振り分けます。
#br
 $ make-playlist.sh
引数なしで実行するだけです。更新対象は自動認識します。
#br
三洋のICレコーダー用です。他のDAPで使用する場合等は適宜修正して下さい。
nkfコマンドが必要です。
#br
''ダウンロード''  &ref(make-playlist.sh,nolink); ''2011-4-19更新''(一部、ポッドキャストファイル前提で半角スペースを含むファイル名を無視する仕様だったのを修正しました)
中身を見るなら[[%%%''こちら''%%%>#make-playlist_contents]]

&aname(ren-ICRECORDER-MP3);
** サンヨー(パナソニック)ICレコーダーの録音ファイルの先頭3文字を録音順にナンバリングし直すスクリプト [#hf6fad32]
こういうのはかなりの人が必要としていると思います。
カレントディレクトリのファイルのみを操作します。
#br
''ダウンロード''  &ref(ren-ICRECORDER-MP3.sh,nolink);
中身を見るなら[[%%%''こちら''%%%>#ren-ICRECORDER-MP3_contents]]

&aname(on_ins_exec);
* &tip;携帯音楽プレーヤーを母艦PCのUSBポートに挿し込むだけであとは自動で最新ファイルをプレーヤーにコピーする(持ち出す)設定 [#i62fecba]
%%(2011-2-26新規に記述)%%
%%従来私はこのような用途にgnome-volume-managerを少し改造したものを使っていたのですが、Ubuntu10.04以降ではgnome-volume-managerは廃止されてしまい、他の方法を使わざるをえなくなりました。方法はいろいろ考えられるんですが、現時点で最もお手軽で且つ汎用的なのが[[halevt:http://www.nongnu.org/halevt/]]を使う方法だと思います。デスクトップシステムの種類に関わらず使えますし、CUI環境でも使うことができます。%%
(2015-7-11)Ubuntu 14.04やLinux Mint 17ではhalevtは廃止されてしまったので替りに[[devmon:https://igurublog.wordpress.com/downloads/script-devmon/]]を使うことにしました。
''以下の3ファイルが設定の肝となるファイルです。''
|''ダウンロード'' &ref(etc_conf.d_devmon.sample,nolink);|''/etc/conf.d/devmonとして使用するファイル''&br;''devmonの動作の殆どを設定するファイル''&br;''私が使用しているもの(サンプルとして扱って下さい)''&br;私の記述の場合/etc/sudoers.d内の設定も必要|
|''ダウンロード'' &ref(etc_init.d_devmon,nolink);|''/etc/init.d/devmonとして使用するファイル''&br;devmonを簡易的なデーモンとして使用する為の起動スクリプト&br;(ユーザ名は書き換える必要がある)|
|''ダウンロード'' &ref(sony.auto-latest-copy.sh,nolink);|''devmonから直接呼び出されるスクリプト''&br;''私がauto-latest-copy.shとして実際に使用しているものとほぼ同じ(サンプルとして扱って下さい)&br;[[LED>v-usb_powerswitch]]対応の記述(コメントアウトされている)を含んでいます''|
-/etc/init.d/devmon(ダウンロード時etc_init.d_devmon)はユーザ名を書き換え、実行権限を付け、sysv-rc-confコマンド等でサービスとして登録して下さい。
-/etc/conf.d/devmon(ダウンロード時etc_conf.d_devmon.sample)は、各自に合った内容に書き換えて下さい。サンプルは私が内蔵メモリとmicroSDスロットを持つソニーのICレコーダーで使用している際のものです。内蔵メモリは普段全く使用していないのでマウントした直後に自動でアンマウントしています。
-auto-latest-copy.shは内部で[[latest-copy.sh>#latest-copy]]を呼び出し、それが正常に終了したらアンマウントして携帯プレーヤーを母艦PCから切り離すのが役割です。もちろん各自好みで実際に実行させたい処理内容に変更して下さい。このような処理をさせる場合は''Nautilus(あるいはcaja)の「ファイル管理の設定->メディア」で「メディアを挿入したら表示する」のチェックを外しておいて下さい。''
-devmon側でボリュームをアンマウントするには/etc/sudoers.dにユーザがパスワードなしで/bin/umountできる設定を記述する必要があります。
-%%auto-latest-copy.shはUbuntu 9.10系以前ではhalevtから当該デバイス名が渡ってこないので使用できません(内部でマウントポイントを取得できません)。%%
-%%2011-6-10現在、Ubuntu 11.04ではhalevtパッケージが正常にインストールできません。%%
-「''USBポートに挿し込むだけで''」自動で処理をおこなうわけです。せっかくここまでやれるなら、さらに進めて、PCの画面をオフにしたままで持ち出し処理の進行状況を把握したいものです。携帯プレーヤー側にUSB接続時のアクセス表示LED等があればいいのですが、ない場合は[[%%%USB接続のLED%%%>v-usb_powerswitch]]等を使いたいところです。因みに私は[[USB接続のLED>v-usb_powerswitch]]を使っていますが、私が使っている携帯プレーヤーの液晶画面には一応持ち出し処理の進行状況が簡易的に表示されます。それらを頼りにしてもいいでしょう。

#br
''追加ダウンロード''
''サンヨー(パナ)ICレコーダ用・ダウンロード''  &ref(auto-latest-copy.sh,nolink);  ''2015-7-11更新''(引数にデバイス名でなくボリュームラベルを受け取る仕様に変更)
※こちらは上記ソニー用と比べて随分複雑です。様々余分な機能を盛り込んでいます。
#br
持ち出し処理以外をおこなう場合はその都度devmonデーモンを停止することで対応しています。個人で使うだけならこれでも十分だと思います。また、私は、

#br
この%%halevt%%devmonを使った「''USBポートに挿しただけで何かの処理がおこなえる''」という手法は非常に広い範囲に応用が可能です。
#br
たとえば「認証用のドングル」としての利用があります。特定の鍵を持ったUSBキーを挿したときだけある特定のアプリケーションが使用できるとか、ログインが可能になる、みたいな使い方です。
#br
私が示したサンプル例に似た使い方としては、USBメモリに画像やpdfファイルを入れてUSBポートに挿すと自動でクラウドにアップロードするとか、添付してメール送信するとか、印刷する、OCRする、等があるでしょう。
#br

* 各スクリプトの中身 [#o4305e3a]
&aname(download-radio_contents);
** download-radio.sh [#x6632ba0]
説明は[[%%%''こちら''%%%>#download-radio]]
ダウンロード &ref(download-radio.sh,nolink); 2015-7-11更新
 #!/bin/bash
 
 VERSION='2015/07/08 23:55:51 UTC'
 
 exitproc1(){ rm -rf "${TMPFILE5}" "${TMPFILE2}" "${TMPFILE7}";}
 exitproc2(){ rm -rf "${TMPFILE6}";}
 
 count_depth()
 {
 	local count=1
 	local src=${1}
 
 	while [ "${src}" != "" ]
 	do
 		testline=${src%%/*}  # 最初の/より前の文字列を取り出す   
 		if test "${testline}" != "${src}"; then
 			src=${src#*/}  # 最初の/より後ろの文字列を取り出す   
 		else
 			echo  ${count}
 			return
 		fi
 		count=$((count+1))
 	done
 }
 
 downfiles()
 {
 # downfiles [-x] [-nr] [targetdir] rest-of-url
 #
 # eg. downfiles     targetdir rest-of-url
 # eg. downfiles -nr targetdir rest-of-url
 # eg. downfiles -x            rest-of-url (similar to wget -x)
 #
 MAKEDIRS=false
 NORMV=false
 
 while test -n "${1}"
 do
 case "${1}" in
 -x)
 MAKEDIRS=true # ダウンロード元のディレクトリ構造を再現する
 NORMV=true # 削除処理をおこなわない
 shift;;
 -nr|--noremove)
 NORMV=true # 削除処理をおこなわない
 shift;;
 *)break;;
 esac
 done
 
 if ${MAKEDIRS}; then
 ADDURL=${1}
 else
 TARGET=${1}
 ADDURL=${2}
 mkdir -p ${TARGET}
 cd ${TARGET} || exit 1
 depth=$(count_depth "${TARGET}")
 fi
 URL=${BASEURL}${ADDURL}
 
 protocol=${URL%%//*}  # 最初の//より前を取り出す
 urlrest=${URL#*//}  # 最初の//より後ろを取り出す
 urltop=${urlrest%%/*}  # 最初の/より前を取り出す
 urltop=${protocol}//${urltop}
 TMPFILE1="`mktemp`"
 TMPFILE2="`mktemp`"
 TMPFILE7="`mktemp`"
 numfiles=0
 ${WGET} -O "${TMPFILE1}" ${URL}
 if test $? -eq 0; then
 trap '
 exitproc2
 exit 1
 ' 2 15
 
 # ダウンロード元のxmlファイルを加工して、
 # ダウンロード済みのファイルやその説明を一覧できるhtmlファイルを作成する
 # xsltproc libxml-validate-perl を使用
 #XMLCHECK=$(validxml ${TMPFILE1} 2>/dev/null|tail -1|cut -b1-2)
 #if test "${XMLCHECK}" == "ok"; then # xmlと確認できた場合
 if (head -1 ${TMPFILE1}|grep -q "xml version") then
 	testline=${URL%*\.xml}  # 拡張子がxmlか確認
 	if test "${URL}" != "${testline}" ; then  # 確認成功の場合
 		outfile=${testline##*/}.html # 元のファイル名を活かす
 	else
 		outfile=index.html # 今のところラジカントロプス専用
 	fi
 	xsltproc -o  "${outfile}" "${DOCUMENTROOT}/rss.xslt" ${TMPFILE1}
 	if ${MAKEDIRS}; then
 	perlcmd='s/http:\/\/[-_.!~*'\''()a-zA-Z0-9;?:@&=+$,%#]+\/([^>]+)\.mp3/$1\.mp3/g'
 	else
 	perlcmd='s/http:\/\/[-_.!~*'\''()a-zA-Z0-9;\/?:@&=+$,%#]+\/([^\/]+)\.mp3/$1\.mp3/g'
 	fi
 	perl -i -pe $perlcmd "${outfile}"
 	perlcmd='s/<img[\s]+src([^<>]+)>//g'
 	perl -i -pe $perlcmd "${outfile}"
 fi
 
 TMPFILE6="`mktemp`"
 cat ${TMPFILE1}|nkf -e -Lu > "${TMPFILE6}"
 perlscript="$(echo "my \$file=\"${TMPFILE6}\";open (SFH, \"<\$file\"); \
 undef $/;my \$Src=<SFH>;close(SFH);\$Src=~s/<!--.*?-->//sg; \
 \$Src=~s/a\ href\=/a\ href\=\\n/isg; \
 \$Src=~s/a\s+.+href\=/a\ href\=\\n/ig; \
 \$Src=~s/a.+\s+href\=/a\ href\=\\n/ig; print \$Src;")"
 perlcmdline="$(echo perl -e \'${perlscript}\')"
 eval ${perlcmdline} > "${TMPFILE1}"
 rm "${TMPFILE6}"
 trap 1 2 15
 grep \.${TARGETEXT} "${TMPFILE1}">"${TMPFILE2}"
 rm "${TMPFILE1}"
 while read -r line
 do
 testline=${line#*url=}  # 最初のurlより後ろの文字列
 if test "${line}" != "${testline}" ; then
 	line=${testline}  # url=が含まれている場合
 else
 	line=${line#*href}  # 最初のhrefより後ろの文字列を取り出す
 fi
 line=${line#*\"}  # 最初の"より後ろの文字列を取り出す
 line=${line%%\"*}  # 最初の"より前の文字列を取り出す   
 testline=${line%*\.${TARGETEXT}}  # 指定拡張子の切取を試みる
 if test "${line}" != "${testline}" ; then  # 切取に成功した場合
 	testline=${line%*//*}  # //が含まれているかチェック
 	if test "${line}" != "${testline}" ; then
 		TARGETURL=${line}  # //が含まれている場合
 	else
 		if test "x${line:0:1}" = "x/"; then
 		# 絶対パスで指定されている場合
 		TARGETURL=${urltop}${line} 
 		else
 		# 相対パスで指定されている場合
 		urlrest=${URL%/*}  # 最後の/より前の文字列を取り出す
 		TARGETURL=${urlrest}/${line}
 		fi
 	fi
 
 	TARGETFILE=${TARGETURL##*/}
 	numfiles=$((numfiles+1))
 	! ${NORMV} && echo "${TARGETFILE}" >> "${TMPFILE7}"
 
 if test ${numfiles} -gt ${MAXFILES}; then
 	break # 最大でもMAXFILESまでしかダウンロードしない
 fi
 
 relativepath=
 
 if $MAKEDIRS; then
 
 	urlrest=${TARGETURL#*//}  # 最初の//より後ろの文字列を取り出す
 	urlrest=${urlrest#*/}  # 最初の/より後ろの文字列を取り出す   
 	testline=${urlrest%/*}  # 最後の/より前の文字列を取り出す   
 
 	if test "$testline}" != "${urlrest}"; then
 	# 中間のパスが含まれることが確認できた場合
 		relativepath=${testline}
 
 		mkdir -p "${relativepath}"
 		TARGETFILE="${relativepath}/${TARGETFILE}"
 		relativepath="${relativepath}/"
 
 	else
 	# 中間のパスが含まれない場合
 		: # 無視(許容)
 	fi
 
 fi
 
 	if !(test -e "${TARGETFILE}") then
 		currentdir="`pwd`"
 		trap '
 		exitproc1
 		exit 1
 		' 2 15
 		TMPFILE5="`mktemp "${currentdir}/${relativepath}tmp.XXXXXXXXXX"`"
 		${WGET} -N -O "${TMPFILE5}" "${TARGETURL}"
 		test $? -ne 0 && test -e "${TMPFILE5}" && rm "${TMPFILE5}"
 		test -e "${TMPFILE5}" && ! test -s "${TMPFILE5}" && rm "${TMPFILE5}"
 		test -e "${TMPFILE5}" && mv "${TMPFILE5}" "${TARGETFILE}"
 		trap 1 2 15
 		if test -e "${TARGETFILE}" && test "${TARGETEXT}" = "mp3"; then
 			chmod go+r "${TARGETFILE}"
 			# Complete.
 #			led-green on
 			echo "`pwd`/${TARGETFILE}" >> "${FILELST}"
 #			DISPLAY=:0.0 zenity --info --title "download_radio" \
 #			--text "Complete:${TARGETFILE}" &
 		fi
 	elif test "${TARGETEXT}" = "mp3"; then
 		echo "${TARGETFILE} already exists"
 	else
 #		${WGET} -N "${TARGETURL}"
 #		test -e "${TARGETFILE}" && ! test -s "${TARGETFILE}" && rm "${TARGETFILE}"
 		echo "Error, can't handle ${TARGETEXT}"
 	fi
 #	if test -e "${TARGETFILE}" && test "${TARGETEXT}" = "asx"; then
 #		size=$(stat -c %s "${TARGETFILE}")
 #		if test ${size} -ge 1000; then
 #			echo "Not an asx file ${TARGETFILE}, removing..."
 #			rm "${TARGETFILE}"
 #		fi
 #	fi
 fi
 done<"${TMPFILE2}"
 else
 rm "${TMPFILE1}"
 fi
 rm "${TMPFILE2}"
 
 if ! $NORMV; then
 # ここには簡易的な、古ファイル削除処理を記述しています。
 #  -xオプションもしくは-nrオプションを指定した場合を除き、ここで削除処理が試みられます。
 # 古いファイルをいつまでも残したい場合は、-nrオプションを指定するか、MAXFILESに大きな値を
 # 設定して下さい。
 #ls -Atr *.${TARGETEXT}|tail -${MAXFILES}>"${TMPLST}" && ls *.${TARGETEXT}| \
 ls -Atr *.${TARGETEXT}|tail -${MAXFILES}>"${TMPLST}"
 cat<"${TMPFILE7}">>"${TMPLST}"
 cat "${TMPLST}"|sort|uniq>"${TMPFILE7}"
 cat "${TMPFILE7}">"${TMPLST}"
 ls *.${TARGETEXT}| \
 while read i
 do
 if !(grep -q "$i"<"${TMPLST}") then
 rm "$i"
 fi
 done
 rm "${TMPLST}"
 fi
 rm "${TMPFILE7}"
 
 if ! $MAKEDIRS; then
 for ((i=$depth;i>0;i--))
 do
 	cd ..
 done
 fi
 }
 
 # 二重起動チェック
 SHELLNAME=${0##*/}  # 最後の/より後ろを取り出す
 SHELLBASE=${SHELLNAME%\.*}
 SHELLEXT=${SHELLNAME##*\.}
 test "${SHELLBASE}" != "${SHELLEXT}" && SHELLEXT=".${SHELLEXT}"
 PROCESSNUM=$(ps aux|grep -v "sh -c "|grep "${SHELLBASE}"|grep "${SHELLEXT}"|wc -l)
 if test ${PROCESSNUM} -ge 3; then
 echo "${SHELLNAME} now running."
 exit
 fi
 
 PATH=${PATH}:/usr/local/bin
 WGET="wget -t 1 -T 15"
 DOCUMENTROOT=/home/disklessfun/Documents
 FILELST="${DOCUMENTROOT}/Complete.lst"
 TMPFILELST="${DOCUMENTROOT}/tmp.Complete.lst"
 #LSTMAX=100
 LSTMAX=150
 LOGDIR="${DOCUMENTROOT}/01_logs"
 mkdir -p "${LOGDIR}"
 
 # 文化放送用
 LANG=C
 BASEDIR="${DOCUMENTROOT}/BunkaHousou" # 必ず絶対パス
 BASEURL="http://www.joqr.co.jp/blog/"
 TARGETEXT=mp3
 MAXFILES=1000
 mkdir -p "${BASEDIR}"
 cd "${BASEDIR}" || exit 1
 TMPLST="/tmp/`basename "${0}" .sh`-maintenance$$.lst"
 
 MAXFILES=10 # 2013.09.13時点の同時公開ファイル数
 downfiles golden-opening "golden-opening/index.xml"
 downfiles main           "main/index.xml"
 downfiles shinshi        "shinshi/index.xml"
 MAXFILES=2 # 2013.09.13時点の同時公開ファイル数
 downfiles kuniryu        "kuniryu/index.xml"
 MAXFILES=14 # 2013.09.13時点の同時公開ファイル数
 downfiles green_pod      "green_pod/index.xml"
 BASEURL="http://www.joqr.co.jp/"
 MAXFILES=2 # 2013.09.13時点の同時公開ファイル数
 downfiles takeda_pod     "takeda_pod/index.xml" # 武田鉄矢・今朝の三枚おろし
 
 
 # TBS用
 LANG=C
 BASEDIR="${DOCUMENTROOT}/TBS" # 必ず絶対パス
 BASEURL="http://www.tbsradio.jp/"
 TARGETEXT=mp3
 MAXFILES=1000
 mkdir -p "${BASEDIR}"
 cd "${BASEDIR}" || exit 1
 TMPLST="/tmp/`basename "${0}" .sh`-maintenance$$.lst"
 
 MAXFILES=13 # 2013.09.13時点の同時公開ファイル数
 downfiles tama954     "tama954/index.xml"
 MAXFILES=25 # 2013.09.13時点の同時公開ファイル数
 downfiles daycatch    "dc/rss.xml"
 MAXFILES=5 # 2013.09.13時点の同時公開ファイル数
 downfiles horio       "horio/index.xml"
 MAXFILES=15 # MAXFILES=37 # 2013.09.13時点の同時公開ファイル数
 downfiles -nr ss954   "ss954/index.xml"
 MAXFILES=5 # 2013.09.13時点の同時公開ファイル数
 downfiles kume954     "kume954/rss.xml"
 # JUNK 山里亮太の不毛な議論
 MAXFILES=1 # 2013.09.13時点の同時公開ファイル数
 downfiles fumou       "fumou/index.xml"
 # 高見沢俊彦のロックばん外伝 高見沢俊彦SPECIAL
 MAXFILES=1 # MAXFILES=5 # 2013.09.13時点の同時公開ファイル数
 downfiles takamizawa  "takamizawa/index.xml"
 
 
 # ニッポン放送用
 LANG=C
 BASEDIR="${DOCUMENTROOT}/NipponHousou" # 必ず絶対パス
 BASEURL="http://podcast.1242.com/"
 TARGETEXT=mp3
 MAXFILES=1000
 mkdir -p "${BASEDIR}"
 cd "${BASEDIR}" || exit 1
 TMPLST="/tmp/`basename "${0}" .sh`-maintenance$$.lst"
 
 # 高田文夫のラジオビバリー昼ズPodcast
 MAXFILES=3 # MAXFILES=554 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles takada      "takada/index.xml"
 # ますおか「裏」ちゃんねる
 MAXFILES=3 # MAXFILES=325 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles masuoka     "masuoka/index.xml"
 # 角田龍平のオールナイトニッポンポッドキャスト
 MAXFILES=3 # MAXFILES=143 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles bengoshi    "bengoshi/index.xml"
 # 上柳昌彦 ごごばん!Podcast
 MAXFILES=3 # MAXFILES=44 # 2013.09.13時点の同時公開ファイル数
 downfiles gogoban     "gogoban/index.xml"
 # がん検診にGO!GO!オトナの健康ラジオ
 MAXFILES=3 # MAXFILES=13 # 2013.09.13時点の同時公開ファイル数
 downfiles otona       "otona/index.xml"
 # 谷村新司・まぁるい日曜日ポッドキャスト
 MAXFILES=3 # MAXFILES=152 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles tanimura    "tanimura/index.xml"
 # ザ・ボイス
 MAXFILES=5 # MAXFILES=361 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles voice       "voice/index.xml"
 
 
 # ラジオ日本用
 LANG=C
 BASEDIR="${DOCUMENTROOT}/RadioNippon" # 必ず絶対パス
 BASEURL="http://feeds.feedburner.com/"
 TARGETEXT=mp3
 MAXFILES=1000
 mkdir -p "${BASEDIR}"
 cd "${BASEDIR}" || exit 1
 TMPLST="/tmp/`basename "${0}" .sh`-maintenance$$.lst"
 
 # ラジカントロプス2.0ポッドキャスト
 #MAXFILES=51 # 2013.09.13時点の同時公開ファイル数、GBクラス
 MAXFILES=3
 #downfiles -nr radicanthropus  "radican?format=xml"
 
 
 # JFN用
 LANG=C
 BASEDIR="${DOCUMENTROOT}/JFN" # 必ず絶対パス
 BASEURL="http://www2.jfn.co.jp/"
 TARGETEXT=mp3
 MAXFILES=1000
 mkdir -p "${BASEDIR}"
 cd "${BASEDIR}" || exit 1
 TMPLST="/tmp/`basename "${0}" .sh`-maintenance$$.lst"
 
 ## ON THE WAY JOURNAL
 # MAXFILES=390 # 2013.09.13時点の同時公開ファイル数、GBクラス
 #downfiles -x                    "owj/podcast_owj.xml"
 MAXFILES=390
 # サードプレイス
 downfiles -x                    "place/podcast_place.xml"
 # SUNDAY FLICKERS
 MAXFILES=150 # MAXFILES=534 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles poddata/sunday        "sunday/podcast_sunday.xml"
 # 日曜日の朝刊・世界を笑え!
 MAXFILES=1 # MAXFILES=9 # 2013.09.13時点の同時公開ファイル数
 downfiles poddata/people/news   "people/news/podcast_news.xml"
 # 編集長!お時間です。
 MAXFILES=1 # MAXFILES=35 # 2013.09.13時点の同時公開ファイル数
 downfiles poddata/people/editor "people/editor/podcast_editor.xml"
 # D.N.A.ロックの殿堂 ~増子直純(怒髪天)~
 MAXFILES=1 # MAXFILES=144 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles poddata/dna/mashiko   "dna/podcast_dna2.xml"
 # D.N.A.ロックの殿堂 ~吉川晃司 Samurai Rock~
 MAXFILES=1 # MAXFILES=41 # 2013.09.13時点の同時公開ファイル数
 downfiles poddata/dna/k2        "dna/podcast_dna4.xml"
 # ニッポン長寿企業
 MAXFILES=1 # MAXFILES=116 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles poddata/com           "company/pod/podcast_com.xml"
 # Sound Library~世界にひとつだけの本~
 MAXFILES=2 # MAXFILES=170 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles poddata/library       "library/pod/podcast_sl.xml"
 # 週刊サッカーリポート J's SPIRIT
 MAXFILES=1 # MAXFILES=15 # 2013.09.13時点の同時公開ファイル数
 downfiles poddata/js            "blog/js/pod/podcast_js.xml"
 
 BASEURL="http://www.jfn.co.jp/"
 # ラジオ版 学問のススメ
 MAXFILES=1 # MAXFILES=200 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles -x "susume/podcast_susume.xml" # 2010年途中以降全部
 MAXFILES=1 # MAXFILES=52 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles -nr poddata/susume "susume/y2010/"
 MAXFILES=1 # MAXFILES=52 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles -nr poddata/susume "susume/y2009/"
 MAXFILES=3 # MAXFILES=105 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles -nr poddata/susume "susume/y2008/"
 MAXFILES=3 # MAXFILES=134 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles -nr poddata/susume "susume/y2007/"
 MAXFILES=3 # MAXFILES=92 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles -nr poddata/susume "susume/y2006/"
 
 BASEURL="http://nakikusu.jfn.co.jp/"
 # 泣きたいときのクスリ 2007
 MAXFILES=1 # MAXFILES=22 # 2013.09.13時点の同時公開ファイル数
 downfiles -nr  nakikusu07 "radio/podcasting/podcast_nakikusu07.xml"
 # 泣きたいときのクスリ 2008
 MAXFILES=1 # MAXFILES=35 # 2013.09.13時点の同時公開ファイル数
 downfiles -nr  nakikusu08 "radio/podcasting/podcast_nakikusu08.xml"
 
 
 # RKB毎日放送用
 LANG=C
 BASEDIR="${DOCUMENTROOT}/RKB" # 必ず絶対パス
 BASEURL="http://rkbr.jp/podcast/"
 TARGETEXT=mp3
 MAXFILES=1000
 mkdir -p "${BASEDIR}"
 cd "${BASEDIR}" || exit 1
 TMPLST="/tmp/`basename "${0}" .sh`-maintenance$$.lst"
 
 MAXFILES=20 # MAXFILES=56
 downfiles -nr insight     "insight.xml"  # インサイト
 
 
 # MBS毎日放送用
 LANG=C
 BASEDIR="${DOCUMENTROOT}/MBS" # 必ず絶対パス
 BASEURL="http://www.mbs1179.com/"
 TARGETEXT=mp3
 MAXFILES=1000
 mkdir -p "${BASEDIR}"
 cd "${BASEDIR}" || exit 1
 TMPLST="/tmp/`basename "${0}" .sh`-maintenance$$.lst"
 
 MAXFILES=3 # MAXFILES=206 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles 117_p       "117_p/rss.xml"
 MAXFILES=3 # MAXFILES=103 # 2013.09.13時点の同時公開ファイル数、GBクラス
 downfiles hog         "hog/rss.xml"
 
 
 # NHK
 LANG=C
 BASEDIR="${DOCUMENTROOT}/NHK" # 必ず絶対パス
 BASEURL="http://www.nhk.or.jp/"
 TARGETEXT=mp3
 MAXFILES=1000
 mkdir -p "${BASEDIR}"
 cd "${BASEDIR}" || exit 1
 TMPLST="/tmp/`basename "${0}" .sh`-maintenance$$.lst"
 
 # すっぴん!
 MAXFILES=1 # 2013.09.13時点の同時公開ファイル数
 downfiles -nr suppin_tsuda    "suppin/podcast/tsuda.xml"    # 津田大介
 downfiles suppin_kosodate "suppin/podcast/kosodate.xml" # ダイヤモンド☆ユカイ
 downfiles suppin_kawashima "suppin/podcast/kawashima.xml"   # 川島明
 downfiles suppin_kokugo   "suppin/podcast/kokugo.xml"   # 高橋源一郎
 #downfiles suppin_kikaku   "suppin/podcast/personality.xml"
 
 MAXFILES=5 # 2013.09.13時点の同時公開ファイル数
 downfiles r-asa_business "r-asa/podcast/business.xml"  # ラジオあさいちばん「ビジネス展望」
 downfiles r-asa_life     "r-asa/podcast/life.xml"      # ラジオあさいちばん「健康ライフ」
 downfiles r-news         "r-news/podcast/nhkradionews.xml" # NHKラジオニュース
 # English News - NHK WORLD RADIO JAPAN
 MAXFILES=1 # 2013.09.13時点の同時公開ファイル数
 downfiles radio-japan    "rj/podcast/rss/english.xml"
 # 怒髪天 増子直純兄ィのロックな労働相談室-相談コーナー
 MAXFILES=5 # 2014.04.20時点の同時公開ファイル数
 #downfiles masuko         "masuko/rock1.xml"
 
 
 test ! -e "${FILELST}" && exit 0
 
 # FILELSTの行数をLSTMAX以下に保つ
 LSTNUM=$(wc -l<"${FILELST}")
 test ${LSTNUM} -le ${LSTMAX} && exit 0
 tail -${LSTMAX} "${FILELST}" > "${TMPFILELST}"
 diff -u "${FILELST}" "${TMPFILELST}"
 set -x
 mv "${TMPFILELST}" "${FILELST}"

&aname(download-youtube_contents);
** download-youtube.sh [#t7e368ae]
説明は[[%%%''こちら''%%%>#download-youtube]]
ダウンロード &ref(download-youtube.sh,nolink); 2015-7-11更新
 #!/bin/bash
 
 VERSION='2015/07/01 22:47:19 UTC'
 
 #
 # youtube動画をローカルにまとめてダウンロードするスクリプト
 #
 # ダウンロード時にmp3ファイルも作成する(トランスコード処理はなし)
 # 今のところmp3を内包する240p専用
 # 当然、動画の画質は劣悪
 # リスニングがメインで、補足として動画を参照する使用方法を想定している
 #
 # 動画ファイル名はタイトル名-youtubeビデオID.flv
 # mp3ファイル名はタイトル名-youtubeビデオID.mp3
 # 
 # デフォルトの使用法はcron(登録しての使用)モード。この場合は二重起動のチェックが働く
 # その他に、URLの代わりにyoutubeビデオID(11バイトの文字列)のリストファイルを読みこむLモード、
 # URLの代わりに一つのyoutubeビデオID(11バイトの文字列)を直接指定する直接指定モードがある
 #
 # 動作に必要なモジュール(radiodownload-setを用いた半自動インストールを推奨)
 # youtube-dl nkf libav-tools id3v2
 #
 [ $# -lt 2 ] && echo "$0 [-L, --idlist] [-N --norelation] [-M --mp3only] [-E --excludeold] \
 (http://program-homepage or video-id-list or video-id) place" && exit 1
 CRONMODE=true
 LISTMODE=false
 DIRECTMODE=false
 NOREL=false
 OMP3=false
 EXO=false
 while test -n "${1}"
 do
 case "${1}" in
 -L|--idlist)
 LISTMODE=true
 CRONMODE=false
 shift;;
 -N|--norelation)
 NOREL=true
 shift;;
 -M|--mp3only)
 OMP3=true
 shift;;
 -E|--excludeold)
 EXO=true
 shift;;
 *)break;;
 esac
 done
 test ! ${CRONMODE} && NOREL=true
 
 URL=$1
 PLACE=$2
 
 length=${#URL}
 set -x
 # URL引数の文字数が11で、
 if test ${length} -eq 11; then
 if ! test -e "${URL}"; then
 # 且つ、ファイル名ではないと確認された場合、(動画ID)直接指定モードとみなす
 DIRECTMODE=true
 LISTMODE=false
 CRONMODE=false
 fi
 fi
 set +x
 
 
 exitproc1(){ rm -rf "${TMPFILE3}" "${TMPFILE1}" "${TMPFILE6}";}
 exitproc2(){ rm -rf "${TMPFILE3}" "${TMPFILE1}" "${TMPFILE2}";}
 exitproc3(){ rm -rf "${TMPFILE3}" "${TMPFILE4}" "${TMPFILE4}.part" "${TMPLNK}";}
 
 sanitize_filename()
 {
 local fname=${1}
 fname=$(echo "${fname}"|sed -e 's/~/~/'g)
 fname=$(echo "${fname}"|sed -e 's/&#187;/-/'g)
 fname=$(echo "${fname}"|sed -e 's/"/”/'g)
 fname=$(echo "${fname}"|sed -e 's/\\///'g)
 fname=$(echo "${fname}"|sed -e 's/?/?/'g)
 fname=$(echo "${fname}"|sed -e 's/</</'g)
 fname=$(echo "${fname}"|sed -e 's/>/>/'g)
 fname=$(echo "${fname}"|sed -e 's/:/:/'g)
 fname=$(echo "${fname}"|sed -e 's/;/;/'g)
 fname=$(echo "${fname}"|sed -e 's/|/|/'g)
 fname=$(echo "${fname}"|sed -e 's/,/,/'g)
 fname=$(echo "${fname}"|sed -e 's/*/-/'g)
 fname=$(echo "${fname}"|sed -e 's/\^/-/'g)
 fname=$(echo "${fname}"|sed -e 's/&#160;/ /'g)
 fname=$(echo "${fname}"|sed -e 's/―/―/'g)
 fname=$(echo "${fname}"|sed -e 's/-/-/'g)
 fname=$(echo "${fname}"|sed -e 's/&#234;/e/'g)
 fname=$(echo "${fname}"|sed -e 's/&#243;/o/'g)
 fname=$(echo "${fname}"|sed -e 's/@/@/'g)
 fname=$(echo "${fname}"|sed -e 's/\//-/'g)
 fname=$(echo "${fname}"|sed -e 's/\[/(/'g)
 fname=$(echo "${fname}"|sed -e 's/\]/)/'g)
 fname=$(echo "${fname}"|sed -e 's/\%/-/'g)
 fname=$(echo "${fname}"|sed -e 's/か&#12441;/が/'g)
 fname=$(echo "${fname}"|sed -e 's/し&#12441;/じ/'g)
 fname=$(echo "${fname}"|sed -e 's/せ&#12441;/ぜ/'g)
 fname=$(echo "${fname}"|sed -e 's/た&#12441;/だ/'g)
 fname=$(echo "${fname}"|sed -e 's/て&#12441;/で/'g)
 fname=$(echo "${fname}"|sed -e 's/と&#12441;/ど/'g)
 fname=$(echo "${fname}"|sed -e 's/カ&#12441;/ガ/'g)
 fname=$(echo "${fname}"|sed -e 's/ク&#12441;/グ/'g)
 fname=$(echo "${fname}"|sed -e 's/サ&#12441;/ザ/'g)
 fname=$(echo "${fname}"|sed -e 's/シ&#12441;/ジ/'g)
 fname=$(echo "${fname}"|sed -e 's/ス&#12441;/ズ/'g)
 fname=$(echo "${fname}"|sed -e 's/タ&#12441;/ダ/'g)
 fname=$(echo "${fname}"|sed -e 's/テ&#12441;/デ/'g)
 fname=$(echo "${fname}"|sed -e 's/ト&#12441;/ド/'g)
 fname=$(echo "${fname}"|sed -e 's/ハ&#12441;/バ/'g)
 fname=$(echo "${fname}"|sed -e 's/ヒ&#12441;/ビ/'g)
 fname=$(echo "${fname}"|sed -e 's/フ&#12441;/ブ/'g)
 fname=$(echo "${fname}"|sed -e 's/へ&#12441;/べ/'g)
 fname=$(echo "${fname}"|sed -e 's/ハ&#12442;/パ/'g)
 fname=$(echo "${fname}"|sed -e 's/ヒ&#12442;/ピ/'g)
 fname=$(echo "${fname}"|sed -e 's/フ&#12442;/プ/'g)
 echo "${fname}"
 }
 
 get_video_id_list()
 {
 protocol=${URL%%//*}  # 最初の//より前を取り出す
 urlrest=${URL#*//}  # 最初の//より後ろを取り出す
 urltop=${urlrest%%/*}  # 最初の/より前を取り出す
 urltop=${protocol}//${urltop}
 trap '
 exitproc1
 exit 1
 ' 2 15
 TMPFILE1="`mktemp`"
 ${WGET} -O "${TMPFILE1}" ${URL}
 if test $? -eq 0; then
 TMPFILE6="`mktemp`"
 cat ${TMPFILE1}|nkf -e -Lu > "${TMPFILE6}"
 perlscript="$(echo "my \$file=\"${TMPFILE6}\";open (SFH, \"<\$file\"); \
 undef $/;my \$Src=<SFH>;close(SFH);\$Src=~s/<!--.*?-->//sg; \
 \$Src=~s/a\ href\=/a\ href\=\\n/isg; \
 \$Src=~s/a\s+.+href\=/a\ href\=\\n/ig; \
 \$Src=~s/a.+\s+href\=/a\ href\=\\n/ig; print \$Src;")"
 perlcmdline="$(echo perl -e \'${perlscript}\')"
 eval ${perlcmdline} > "${TMPFILE1}"
 rm "${TMPFILE6}"
 trap '
 exitproc2
 exit 1
 ' 2 15
 TMPFILE2="`mktemp`"
 grep -e /watch\?v\= "${TMPFILE1}">"${TMPFILE2}"
 if ! test -s "${TMPFILE2}"; then
 grep -e youtu\.be "${TMPFILE1}">"${TMPFILE2}"
 fi
 rm "${TMPFILE1}"
 
 befTARGETID=X0X0X0X0X
 while read -r line
 do
 	TARGETURL=${line#*\"}  # 最初の"より後ろの文字列を取り出す
 	TARGETURL=${TARGETURL%%\"*}  # 最初の"より前の文字列を取り出す
 	test "${TARGETURL}" == "${line}" && continue
 	TARGETID=${TARGETURL##*\/} # 最後の/より後ろの文字列を取り出す
 	TARGETID=${TARGETID%%\&amp\;*}  # 最初の&amp;より前の文字列を取り出す
 	if (echo "${TARGETID}"|grep -qe \=); then
 	TARGETID=${TARGETID##*\=} # 最後の=より後ろの文字列を取り出す
 	fi
 
 if test ${befTARGETID} == ${TARGETID}; then
 continue # sort|uniqueは使いたくないので自前で簡易チェックをおこなっている
 fi
 befTARGETID=${TARGETID}
 
 echo ${TARGETID}
 echo ${TARGETID} >> "${TMPFILE3}"  # 書き出し
 
 done<"${TMPFILE2}"
 fi
 rm "${TMPFILE2}"
 }
 
 
 downfiles()
 {
 trap '
 exitproc3
 exit 1
 ' 2 15
 while read -r line
 do
 TARGETID=$(echo ${line}|tr -d '\n\r')
 TARGETURL="http://www.youtube.com/watch?v=${TARGETID}"
 
 echo "${TARGETURL}"
 #title=$(youtube-dl -e ${TARGETURL}|nkf -w --numchar-input)
 title=$(youtube-dl -e ${TARGETURL})
 
 # タイトルが取得できないファイルはダウンロードを試みない
 if test -z "${title}"; then
 echo "Skipped: ${TARGFETID}"
 continue
 fi
 
 FILENAME=$(sanitize_filename "${title}")
 length=${#FILENAME}
 test ${length} -gt 240 && FILENAME=${VOLNAME:0:240}
 
 if ${OMP3}; then
 	FINEXT=mp3;
 else
 	FINEXT=${TARGETEXT};
 fi
 
 	if test -e "${FILENAME}-${TARGETID}.${FINEXT}"; then
 	echo "${FILENAME}-${TARGETID}.${FINEXT} already exists"
 	continue  # next one
 	fi
 
 echo "${FILENAME}-${TARGETID}.${TARGETEXT}"
 
 utf8title=${title}
 utf8title="`echo ${utf8title}|tr -d '\n\r'`"
 cp932title="`echo "${utf8title}"|iconv -f UTF-8 -t CP932`"
 
 # youtube-dlがマルチバイト文字を使ったパスに対応していない為リンクを使用
 TMPLNK=/tmp/tmp.${TARGETID}
 ln -sf "${PLACE}" ${TMPLNK}
 TMPFILE4=${TMPLNK}/temp.${TARGETID}
 #rm -f ${TMPFILE4} # レジュームに期待して削除しない
 
 youtube-dl -f ${TARGETFORMATID} -o "${TMPFILE4}" "${TARGETURL}"
 
 test $? -ne 0 && test -e "${TMPFILE4}" && rm "${TMPFILE4}"
 test -e "${TMPFILE4}" && ! test -s "${TMPFILE4}" && rm "${TMPFILE4}"
 
 
 if test -e "${TMPFILE4}"; then
 	chmod go+r "${TMPFILE4}"
 	MODTIME=`stat -c %y "${TMPFILE4}"|sed 's/\-/\//g'|cut -b1-19`
 	echo "Modification time ${MODTIME}"
 
 	# 古ファイル除外モードの場合、アップロード後XX日以上経過しているファイルは削除
 	if ${EXO}; then
 		fileUNIXTIME=`date -d "$MODTIME" +%s`
 		if test $fileUNIXTIME -le $targetUNIXTIME; then
 			echo "This file is too  old, deleting.";echo
 			rm "${TMPFILE4}"
 			rm ${TMPLNK}
 			continue
 		fi
 	fi
 
 	mv "${TMPFILE4}" "${FILENAME}-${TARGETID}.${TARGETEXT}"
 
 	avconv -y -i "${FILENAME}-${TARGETID}.${TARGETEXT}" -vn \
     -acodec copy -f mp3 "${TMPFILE4}" </dev/null
 
 	test $? -ne 0 && test -e "${TMPFILE4}" && rm "${TMPFILE4}"
 fi
 
 if test -e "${TMPFILE4}"; then
 	chmod go+r "${TMPFILE4}"
 	# Linux向き
 #		id3v2 -g 101 -A "${utf8Atitle}" -t "${utf8title}" "${TMPFILE4}"
 	# Windows, 携帯プレーヤー向き
 	id3v2 -g 101 -A "${cp932Atitle}" -t "${cp932title}" "${TMPFILE4}"
 	touch -t `date -d "$MODTIME" "+%Y%m%d%H%M.%S"` "${TMPFILE4}"
 	mv "${TMPFILE4}" "${FILENAME}-${TARGETID}.mp3"
 
 	# cronモードで、かつ、Nオプションが指定されていない場合のみ
 	if ! ${NOREL} && ${CRONMODE}; then
 
 		# MP3オンリーモード時は除き..
 		if ! ${OMP3}; then
 			echo "`pwd`/${FILENAME}-${TARGETID}.${TARGETEXT}" >> "${FILELST}"
 		fi
 
 		echo "`pwd`/${FILENAME}-${TARGETID}.mp3" >> "${FILELST}"
 #		led-orange on
 	fi
 
 	# MP3オンリードモードの場合flvは削除
 	if ${OMP3}; then
 		echo "Deleting ${FILENAME}-${TARGETID}.${TARGETEXT}"
 		rm "${FILENAME}-${TARGETID}.${TARGETEXT}"
 	fi
 
 	echo "Complete."
 
 fi
 
 rm ${TMPLNK}
 
 done<"${TMPFILE3}"
 rm "${TMPFILE3}"
 }
 
 
 LANG=ja_JP.UTF-8
 export FILENAME=
 PATH=${PATH}:/usr/local/bin
 WGET="wget -t 1 -T 15"
 DOCUMENTROOT=/home/disklessfun/Documents
 FILELST="${DOCUMENTROOT}/Complete.lst"
 TARGETEXT=flv
 TARGETFORMATID=5
 #DOWNLOADSPANDAYS=6 # 古ファイル除外(exludeold)モードで使用する
 DOWNLOADSPANDAYS=13 # 古ファイル除外(exludeold)モードで使用する
 STARTTIME=`date '+%Y%m%d%H%M'`;export STARTTIME
 STARTDAY=${STARTTIME}|cut -b1-8
 targetUNIXTIME=`date -d "$STARTDAY ${DOWNLOADSPANDAYS} days ago" "+%s"`
 mkdir -p "${PLACE}" || exit 1
 
 TMPFILE3="`mktemp`"
 
 # 動画IDリストモード時のみ
 if ${LISTMODE}; then
 	LIST=$1
 if test -e "${LIST}";then 
 	cat>"${TMPFILE3}"<"${LIST}"
 else
 	echo "${LIST} not found, exiting..."
 	rm "${TMPFILE3}"
 	exit
 fi
 fi
 
 # 直接指定モード時のみ
 if ${DIRECTMODE}; then
 echo "${URL}">"${TMPFILE3}"
 fi
 
 # 全モード共通
 cd "${PLACE}" || exit 1
 PLACE="`pwd`"
 LOGDIR="${DOCUMENTROOT}/01_logs"
 mkdir -p "${LOGDIR}"
 
 # cronモード時のみ
 if ${CRONMODE}; then
 
 # 同一ディレクトリを対象にした二重起動をチェック
 SHELLNAME=${0##*/}  # 最後の/より後ろを取り出す
 PROCESSNUM=$(ps aux|grep -v "sh -c "|grep "${SHELLNAME}"|grep "${PLACE}"|wc -l)
 if test ${PROCESSNUM} -ge 3; then
 echo "Duplicate process, exiting..."
 rm "${TMPFILE3}"
 exit
 fi
 get_video_id_list
 
 fi
 
 
 # 全モード共通
 downfiles

&aname(latest-copy_contents);
** latest-copy.sh [#ef19d075]
説明は[[%%%''こちら''%%%>#latest-copy]]
ダウンロード &ref(latest-copy.sh,nolink); 2015-07-11更新
 #!/bin/bash -e
 # 新しくダウンロードされたファイルを携帯プレーヤーに持ち出すスクリプト
 
 get_flush_mountpoint()
 {
 ls -d * 2>/dev/null|while read -r i
 do
 if test -d "${i}"; then
 if ! test -L "${i}"; then
 if mountpoint "${i}">/dev/null; then
 if mount|grep "${i}"|head -1|grep flush|grep -q vfat 2>/dev/null; then
 echo "${i}"
 return
 else
 continue
 fi
 fi
 fi
 fi
 done
 }
 
 #MEDIAPATH=/media
 MEDIAPATH=/media/disklessfun
 cd "${MEDIAPATH}"|| exit 1
 
 LABEL=$1
 
 if test -n "${LABEL}"; then
 DESTPATH=${LABEL}
 else
 DESTPATH=$(get_flush_mountpoint)
 fi
 
 if test -z "${DESTPATH}"; then
 echo "DAP not connected"
 exit 1
 else
 echo "${DESTPATH}"
 fi
 
 DESTPATH=${MEDIAPATH}/${DESTPATH}
 
 if ! test -d "${DESTPATH}/MUSIC"; then
 echo "MUSIC directory not found"
 exit 1
 fi
 
 cd "${DESTPATH}" || exit 1
 
 PATH=${PATH}:/usr/local/bin
 DOCUMENTROOT=/home/disklessfun/Documents
 FILELST="${DOCUMENTROOT}/Complete.lst"
 DONELST="${DOCUMENTROOT}/Done.lst"
 TMPDONELST="${DOCUMENTROOT}/tmp.Done.lst"
 COMPLMSG="Copying complete, without errors."
 
 test ! -e "${FILELST}" && echo "No files" && exit 0
 
 #led-blink on
 #led-red off
 #led-orange off
 #led-green off
 
 
 EFLG=false
 test -e "${DONELST}" && EFLG=true
 
 while read i
 do
 if $EFLG; then
 if (grep -q "$i"<"${DONELST}") then
 continue
 fi
 fi
 if test -e "${i}"; then
 set -x
 if test "${i##*\.}" == "wmv" || test "${i##*\.}" == "flv"; then
 # WMVもしくはFLVはDAPには持ち出さないが、持ち出したことにする
 echo "${i}" >> "${DONELST}"
 set +x
 continue
 fi
 cp -np "${i}" "${DESTPATH}/MUSIC"
 if test $? -eq 0; then
 echo "${i}" >> "${DONELST}"
 fi
 set +x
 else
 echo "${i} not found"
 fi
 done<"${FILELST}"
 
 
 make-playlist.sh
 
 
 #led-blink off
 echo "${COMPLMSG}"
 
 test ! -e "${DONELST}" && exit 0
 
 # FILELSTに載っていないエントリーをDONELSTから削除する
 grep -f "${FILELST}" "${DONELST}" > "${TMPDONELST}"
 if ! (diff -u "${DONELST}" "${TMPDONELST}") then
 set -x
 mv "${TMPDONELST}" "${DONELST}"
 set +x
 else
 rm "${TMPDONELST}"
 fi

&aname(make-playlist_contents);
** make-playlist.sh [#b16da4c5]
説明は[[%%%''こちら''%%%>#make-playlist]]
ダウンロード [[make-playlist.sh:http://wikiwiki.jp/disklessfun/?plugin=attach&pcmd=open&file=make-playlist.sh&refer=download-radio]] 2011-4-19更新
 #!/bin/bash -e
 # 携帯プレーヤーのプレイリストを作成するスクリプト
 # MYLIST1.M3UはMUSICディレクトリ直下のファイルのみを名前順にソートして作成
 # MYLIST2.M3UはMUSICディレクトリ直下のファイルのみを更新日付順にソートして作成
 # MYLIST3.M3Uはサブディレクトリ群下のファイルのみをパスの名前順にソートして作成
 # MYLIST4.M3UにはMYLIST3.M3Uに収まりきらない分で作成
 
 MEDIAPATH=/media
 cd "${MEDIAPATH}"|| exit
 
 get_flush_mountpoint()
 {
 ls -d * 2>/dev/null|while read -r i
 do
 if test -d "${i}"; then
 if ! test -L "${i}"; then
 if mountpoint "${i}">/dev/null; then
 if mount|grep "${i}"|head -1|grep flush|grep -q vfat 2>/dev/null; then
 echo "${i}"
 return
 fi
 fi
 fi
 fi
 done
 }
 
 DESTPATH=$(get_flush_mountpoint)
 
 if test -z "${DESTPATH}"; then
 echo "any DAP connected"
 exit
 else
 echo "${DESTPATH}"
 fi
 
 DESTPATH="${MEDIAPATH}/${DESTPATH}"
 
 if ! test -d "${DESTPATH}/MUSIC"; then
 echo "MUSIC directory not found"
 exit
 fi
 
 cd "${DESTPATH}" || exit
 set -x
 # MYLIST1.M3UはMUSICディレクトリ直下のファイルのみを名前順にソートして作成
 find ./MUSIC -maxdepth 1 -type f ! -name "*.M3U"|sort|sed -e 's/^/./'| \
 sed -e 's/\//\\/g'|nkf -Ws -c > MUSIC/MYLIST1.M3U
 
 # MYLIST2.M3UはMUSICディレクトリ直下のファイルのみを更新日付順にソートして作成
 eval ls -1Atr "./MUSIC/*.{mp3,MP3,wav,WAV,wma,WMA}"|sed -e 's/^/./'| \
 sed -e 's/\//\\/g'|nkf -Ws -c > MUSIC/MYLIST2.M3U
 
 MUSICNUM="$(find MUSIC -type f|egrep -v "^MUSIC/[^/]+$"|wc -l)"
 # MYLIST3.M3Uはサブディレクトリ群下のファイルのみをパスの名前順にソートして作成
 find ./MUSIC -type f|egrep -v "^\./MUSIC/[^/]+$"|sort|sed -e 's/^/./'| \
 sed -e 's/\//\\/g'|nkf -Ws -c|head -99 > MUSIC/MYLIST3.M3U
 
 # MYLIST4.M3UにはMYLIST3.M3Uに収まりきらない分で作成
 if [ $MUSICNUM -gt 99 ]; then
 find ./MUSIC -type f|egrep -v "^\./MUSIC/[^/]+$"|sort|sed -e 's/^/./'| \
 sed -e 's/\//\\/g'|nkf -Ws -c|tail -n +100 > MUSIC/MYLIST4.M3U
 else
 echo > MUSIC/MYLIST4.M3U
 fi

&aname(ren-ICRECORDER-MP3_contents);
** ren-ICRECORDER-MP3.sh [#s7ac9417]
説明は[[%%%''こちら''%%%>#ren-ICRECORDER-MP3]]
ダウンロード &ref(ren-ICRECORDER-MP3.sh,nolink);
 ページ行数超過の為、内容表示は中止

#br
ページ行数超過の為、書き込みフォームは削除します。掲示板等をご利用下さい。