NASやファイルサーバをラジオサーバにしよう
(含:NHK語学講座ストリーミングの自動ダウンロード(2013-6-3更新))
(2013-8-8追記)NHK語学講座はこのほどアカマイにホスティングされてしまい、(私には)ダウンロードできなくなりました。
(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 2015-7-11更新(対象環境をLinux Mint17.2に変更しました。))このページ掲載のスクリプト群とそのインストーラを一緒にしたセットを作成しました。
ダウンロード radiodownload-set.tar.gz ←これだけダウンロードすればこのページからダウンロードできるもの全てを含んでいます。
荻上チキ・Session-22のポッドキャストをICレコーダーで聴いてる人向けのおまけ
中のinstall.shを実行するだけで
- 各放送局のポッドキャストファイルの定期的な自動ダウンロード
- ビデオニュース(http://www.videonews.com)の無料放送の定期的な自動ダウンロード
- TBSラジオ・嶌信彦のエネルギッシュトーク・ストリーミング放送の定期的な自動ダウンロード
NHK語学講座の英語コンテンツの定期的な自動ダウンロード- Youtube動画の定期的な自動ダウンロード(検索条件もしくは特定のチャンネルあるいは特定のユーザのトップページを指定する)
等が、おこなわれるようになります。もちろんこの項目は実連として挙げてみただけです。実際には好みの処理を実行させて下さい。、
このページをマニュアル代わりにしてご利用下さい。スクリプト群自体はUNIX, Linux汎用的ですが、インストーラはUbuntu、Debian系用になっています。他のプラットフォームの方は従来のように手動で環境構築して下さい。
このページはループアンテナを自作して遠隔地のAMラジオを受信しようというページではありません。
ループアンテナを使っての遠隔受信は夜間しか効果がないということはご存知だと思います。
そこでこのページでは他の(いかにも番外編的な)手段をいくつか紹介します。
まとめ聴きの為に自動保存して貯めていく手段の紹介がメインになっていると思います。
(2010-3-18追記)その他の遠隔受信手段
Radikoの試験運用が開始されたこの機会にその他の遠隔受信手段についてごく簡単に触れておくことにします。
有名なその他の手段としてはRadikoとWebRADIO@anyPlaceとKeyHoleTVが挙げられます。
WebRADIO@anyPlaceとKeyHoleTVは放送地域に居住されている親切な方の厚意に頼るソリューションです。このページに来られた方なら既に常用されている方も多いことでしょう。
どちらにもそれぞれ長所短所があります。詳しくはここでは触れません。どちらにも自由度が欠けているという共通点があります。
Radikoは地方局保護の為に(別の言い方をするとRadikoを成立させる為に)IPアドレスによるエリアチェックが設けられていますが、エリアチェックで許可された方がプロキシサーバを立ち上げてくれれば、全国どこでもRadikoで放送されている好きな局を聴くことができるでしょう。
IPアドレスによるエリアチェックは完全なものではないので、東京・大阪から遠く離れた地域に居住していてもRadikoを聴ける人はある程度いると思います。最近はIPアドレスで内容を切り替えるWeb広告が多いので、自分がラッキーな立場かどうかをRadikoを試してみる前にわかっている人もいるでしょう。
ラッキーな立場の方は、「自分が何処に住んでいて、どのISPとどんな契約をしているのか」是非、情報を公開して頂きたいです。
ただし、そんなことをみんながやりだすと、将来は総務省が政策として抜け穴を防ぐ措置を取りかねないと思います。将来とまで言わなくても、手っ取り早くISPに対して総務省が指導をおこなうだけでもかなりの抜け穴は塞がれてしまうと思います。
ラジオ局の地元に受信サーバを立てる方法
最もオーソドックスで強力な方法ですが、実行できる人が非常に限られる方法です。
殆ど実践する人はいない筈なので殆どの人はここは飛ばしてしまって次の記事の方に移って下さい。
構成の一例です。
- 聞きたいラジオ局が聞ける範囲にある家(それは多分、実家)に常時稼動のサーバを立てる。OSは何でも。ハードウェアは玄箱のようなカスタマイズができるNASでもいい。
- サーバの近くに家の倉庫に眠っていたラジカセを置く。
- PCから操作できる赤外線学習リモコンを作成し、ラジカセの操作を記憶させる。参考
- サーバ上にwebサーバ等を立て、ネットワーク経由で選局できるようにする。参考
- サーバ上にストリーミングサーバもしくはmp3録音&ファイル(CIFS&FTP)&VPNサーバ等を立てる。
- サーバのグローバルIPアドレスをダイナミックDNSに自動登録するようにする。
(2012-8-2追記)スタアストーンソフト社のRadioサーバーを使えばもっと簡単です。このソフトハウス、かゆいところに手が届くようなソフトばかり作ってます。
実は私自身、遠隔地にこのようなサーバは立てていません。しかし上に羅列した様々な技術や工作のうち、私が最近実践していないのはストリーミングサーバだけです。なのでもし誰かが上記もしくはそれに似た構成の環境を構築する場合、場合によってはアドバイスが出来ると思います。
OSがWindowsに限られると思いますが、PC用のUSB接続のラジオチューナーを使えばこれを作る必要がないのでより(圧倒的に?)お手軽だと思います。但し選局ソフトがネットワーク経由で操作が可能かどうかは私は知りません。まあいざとなればリモートデスクトップとかVNCがあるので最低保証はあります。
lircのReceiverで学習し、Transmitterで選局命令を送信する方法をとれば、必要なハードウェアはこれよりずっと簡単になります。ただし私はlircのTransmitterは作ったことがないので私としては薦めることはできません。Receiverならこれとかこれで経験がありますけれど。
webラジオ(オンデマンドラジオ、インターネットラジオ、ストリーミング放送)やポッドキャストの自動保存サーバを作る
こっちの替わりになるものではなくて、少しベクトルが違うものですが、お薦めしたい方法です。どういう人にお薦めしたいかと言うと、(1)週末にしか自由な時間がない人、(2)日々長時間運転するけど車内はインターネットに繋がっていないので車内でwebラジオを聞きたくても聞けない人、などです。
基本的にwebラジオ放送は内容がどんどん変わっていくので週末にしか自由な時間がない人はwebラジオを逃さず聞きたいと思ってもどうしてもかなり聞き逃してしまうことになります。自宅サーバが毎日自動でwebラジオのデータをローカルにダウンロードしてくれておまけにmp3にトランスコードしてくれれば便利だと思います。以下に掲載のソフト(スクリプト群)はそういったことを実現するものです。
実行プラットホームは、OSはLinux,FreeBSD,Solaris,Mac等のUNIX系OS全般が基本的に使えます。ただし手軽に構築したいのならLinuxかFreeBSDがお薦めです。ハードウェアは玄箱のようなカスタマイズができるNASでもOKです。
今どきのLinuxを使うのならデフォルトのソフトウェアの他に必要なパッケージはmplayer2, lame, nkfです。
download-radio.sh(各局のサイトをクロールしていろいろ落とすスクリプト)
下に記載のdownload-streaming.sh、下に記載のlatest-copy.sh、下に記載のmake-playlist.shや、下に記載の設定手順等と組み合わせると、ポッドキャストやストリーミング放送の新着ファイルを自動的に携帯プレーヤーに持ち出す為のパッケージとして利用することができます。
デフォルト状態ではこんなものをダウンロードします。
- 文化放送のポッドキャスト(ゴールデンラジオなど)
- TBSラジオのポッドキャスト(デイキャッチなど)
- ニッポン放送のポッドキャスト(ビバリー昼ズなど)
- ラジオ日本のポッドキャスト(ラジカントロプス2.0)
- JFNのポッドキャスト(サードプレイスなど)
- RKB毎日放送のポッドキャスト(インサイト)
- NHKラジオ第一のポッドキャスト
※ストリーミング放送についてはdownload-streamingでダウンロードできます。
※このスクリプトを使用する場合は是非一緒に、専用に作られた【GUIで新着ファイルをリスト参照・再生できるスクリプト】を利用して下さい。
AM, FM各局のサイトに掲載されているmp3ファイル(ポットキャストのファイル)をダウンロードするスクリプトです。
文化放送のポッドキャスト、TBSラジオのポッドキャスト、ニッポン放送のポッドキャスト、RFラジオ日本のポッドキャスト、JFN ONLINE(JAPAN FM NETWORK)のポッドキャスト、RKB毎日放送のポッドキャスト、MBS毎日放送ラジオのポッドキャスト、NHKラジオ第一のポッドキャストを一気にダウンロードします。cronに登録すべきスクリプトです。
既にローカルにダウンロード済みのファイルはダウンロードしませんので、二度目以降の実行ではそんなに時間がかかりません。
このスクリプトはこのページに掲載の他のスクリプトの助けを借りずに単独で実行できます。
(wgetが必要ですが、これはどこのディストリでもデフォルトで入っているでしょう)
もちろん保存ディレクトリの場所やどの番組をダウンロードするか等を好きなようにカスタマイズして下さい。
1ディレクトリ中のファイル数が多くなりすぎたら古いものから削除する機能はコメントアウトしてあります。適宜自分のダウンロード状況に合わせて自分用の削除(メンテナンス)スクリプトを作って頂きたいと思います。lsじゃなくてls -trを使わなければならない人もいるでしょう。
(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コマンドが必要となりました。
ダウンロード download-radio.sh 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対応の記述を追加したくらいです) 2011-4-19更新(<が一文字抜けていました) 2011-4-18更新(latest-copy.shと連携するようにしました。またある程度番組ホームページ改編に対応しました) 2011-4-9更新(繰り返し実行し易いようにwgetにタイムアウトを設定しました) 2011-3-18更新(ビデオニュース・ドットコムの無料動画用asxのダウンロードを追加しました) 2011-2-28更新(RKB毎日放送のダウンロードを追加しました。 RKBは内容的になかなかお薦めだと思いますし、ID3タグに日本語できっちり内容説明が書きこんであるのでMPDの日本語化パッチの活躍のしがいがあります。あと、mp3ファイルダウンロード時にテンポラリファイル名を使用するようにしました。テンポラリーファイル名の利用はこれでは当然実装していたのですが、このdownload-radioについては従来は省略していました。このほどこの手法との兼ね合いで実装の必要が生じたものです) 2011-2-20更新(ON THE WAY JOURNALの保存ディレクトリをパーソナリティ毎に分けました) 2011-2-19更新(JFNのダウンロードを追加しました。JFN分は全くコメントアウトしていないのでそのまま使用すると3.5Gバイト程(私がテストした時点)のディスク容量が必要です。また、二重起動防止機能を加えました。従来よりもっと密に起動してもいいでしょう。あと、コメントアウトしてありますが、削除リストのソート順を名前順から更新日付の降順に変更しました)(バグを修正しました。1箇所fiの場所が間違っていて、horioディレクトリにkirakiraの最後のファイルが重複してダウンロードされていました)(TBS digの更新に対応しました)(文化放送,TBS,ニッポン放送の改編に対応しました)(文化放送のいくつかの番組のリンクがなくなったのでコメントアウトしました。コメントアウト中の削除機能を少し変更しました)(文化放送のインターネットラジオのページが大幅に変更されていたのでそれに対応しました。またラジオ日本を追加しました。)
ちゃんと動くように環境構築するにはcron登録などにそれなりの手間がかかるので、インストーラ付きのセットをダウンロードすることをお薦めします。
中身を見るならこちら
まずDOCUMENTROOTを修正して下さい。自由にカスタマイズすることが前提のファイルです。
cronに
15 20 * * * /home/disklessfun/bin/download-radio.sh 実際には改行しない > /somewhere/download-radio.sh-`date '+\%Y\%m\%d\%H\%M'`.log 2>&1
こんな感じで登録すべきものです。
67行目(Completeの次の行)の
echo "`pwd`/${TARGETFILE}" >> "${FILELST}"
で新着MP3ファイルのパスをテキストのリストに追記していきます。このリストはlatest-copy.shから利用します。
この部分では他にもいろいろなことをやっていいでしょう。
私の場合はUSB接続のLEDインジケーターを光らせます。画面上にバルーンを出してもいいでしょう。このような場合には何らかのステートを保持する機能を利用すべきべきです。
おまけ:(2015-8-2新規追加)ダウンロード id3-tag.sh 荻上チキ・Session-22のポッドキャストファイルのID3v2タグにテーマを書き込むスクリプト。download-radio.shに組み込んで使います。これはまだradiodownload-set.tar.gzに含まれていません。(2015-10-10追記)スマホ(LinuxやMacOSも)で聴く場合はタグの文字コードをUTF-8にすべきなので71行目を削除し、79行目も修正して下さい。
おまけ:download-radio.shと連携してダウンロードしたファイルを携帯プレーヤーに持ち出す為のスクリプト
【GUIで新着ファイルをリスト参照・再生できるスクリプト】
動的なリストから選択するインターフェースなので、様々に応用が効く筈です。
最初に作ったのが古かったからか、その時manを見逃したからか、--hide-headerを使うべきなのに使ってません。
ダウンロード GUIviewComplete.lst.sh 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に変更するパッチ
ダウンロード GUIviewComplete.lst.sh_vlc.patch 私の個人的なカストマイズ内容
VLC 2.0.81.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登録用一部のファイル保存スクリプト】
ダウンロード keep-podcast.sh
(2012-3-20追記)【WMVファイルに一気にインデックスを付加するスクリプト】
ダウンロード add-wmvindex.sh
最新のradiodownlaod-setには既にasfbinコマンドを用いる記述が追加されています。このスクリプトは過去にダウンロードしたWMVファイルに一気にインデックスを付加することを目的として作成しました。単機能ですが引数パスは自由に指定できるのでwmvファイルのあるディレクトリで*を引数にしたり、あるいはfindの-execオプションと組み合わせる等の方法で使って下さい。※asfbinの導入はご自身でおこなって下さい。
(2012-3-20追記)【WMVファイルから一気にWMAファイルを抽出するスクリプト】
ダウンロード extract-wma-from-wmv.sh
add-wmvindex.shと似たような中身です。
download-youtube.sh(Youtube動画を自動的にダウンロードするスクリプト)
(2013-5-28初出)
videonewsが徐々にYoutube重視に変化してきて、NコメをYoutubeにしかアップロードしないという週も出たりするようになったので作成しました。ただしvideonewsに特化した機能はなく、汎用的に使用できます。
cron登録して使用する場合は、検索条件もしくは特定のチャンネルあるいは特定のユーザのトップページを指定して使用します。特に検索条件でのダウンロードは、アップロードされた後にすぐ削除されてしまう人気(テレビ番組)動画の“録り逃し対策”ならぬ“落とし逃し対策”として強力なツールとなります。
検索条件に「search_sort=video_date_uploaded」を含んでいて、且つEオプション(=excludeoldオプション)を指定している場合は、本スクリプト230行目のcontinueをbreakに変更することを強くお薦めします。そうしておけば指定期間外のファイルが1個見つかった時点でスクリプトが終了するので無駄が少なくて済みます。
Eオプション(=excludeoldオプション)を指定する場合は、下に記述しているダウンロード順を逆にする修正はおこなわないで下さい。
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に貼り付けて下さい。
他に、youtubeビデオID(11バイトの文字列)のリストファイルを読みこむLモード、# URLの代わりに一つのyoutubeビデオID(11バイトの文字列)を直接指定する直接指定モードがあります。
このスクリプトの実行にはyoutube-dl、nkf、libav-tools(旧ffmpeg)、id3v2の各コマンドが必要です。
Youtubeの仕様はしばしば変更されるので、このスクリプトが動作する為には最新版のyoutube-dlコマンドがインストールされている必要があります。radiodownload-setのインストーラには、たとえ古いUbuntu環境であっても強制的に最新版のyoutube-dlコマンドをダウンロードしてインストールする機能があります。(2014-3-8追記)最近は各OSリリース標準のyoutube-dlコマンドで大丈夫なようです。(2014-6-23追記)Linux Mint 13標準のyoutube-dlコマンドは正常に動作しません。今回リリースしたradiodownload-setでは、インストーラ内で、動作確認のとれているyoutube-dlコマンドをダウンロード&インストールしています。
ダウンロード download-youtube.sh 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を修正して下さい。
-Lオプションの使い方が紛らわしいこと(-Lの後にリストファイルを指定するわけじゃないという変態仕様)をご了承下さい。私も時にはここみたいにまともな引数仕様で作るのですが、このスクリプトは簡単に済ませたかったんです。
中身を見るならこちら
177行目と178行目の間に(178,179行目として)
tac<"${TMPFILE3}">"${TMPFILE2}" cat<"${TMPFILE2}">"${TMPFILE3}"
を追加するとダウンロード順が逆になります。他にも好みに合わせてカストマイズしてみてください。
download-streaming(本ページのメインコンテンツ、ストリーミング放送を自動でダウンロードするスクリプト)
無料ストリーミング放送のページのURLを引数に与えてやると、そのページからダウンロードできる全ての無料ストリーミング音声データ(wmvやwmaやasf)や無料動画データ(DRMなしのwmvやasf)をダウンロードし、asxファイル内やWindowsMediaヘッダに書き込まれたタイトルやURLに従って適切なローカルファイル名を付け(引数オプションで制御可能)、さらに、引数オプションで指定すればmp3にトランスコード(wmvの場合は音声部分だけ)します。これもcronに登録すべきスクリプトです。
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ファイルがダウンロードされ、順にストリーミング放送のデータのダウンロードがおこなわれます。
mp3へのトランスコード機能はmp3に対応したカット・編集ソフトが充実していること、mp3しか再生できない携帯プレーヤーが存在するので設けています。-Tオプションをつければ変換がおこなわれます。
WMAが再生できるプレーヤーを使っていてもMP3にトランスコードした方が便利な場合があります。たとえば私が使っている携帯サウンドプレーヤーはWMAも再生できます。しかしMP3なら2倍速で再生できるのにWMAは1.2倍速までなので、私はWMAをWMAのままで聴くことは殆どなく、大抵MP3にトランスコードしてから聴きます。
「ダウンロードしたデータのローカルファイル名・命名仕様」
各局の実情に合わせた仕様なので、まずは下記の実際の例を見て下さい。
下記の例について言えば、MBS毎日放送を除けば、asxファイル内のTitleやURLからローカルファイル名が自動で決定されます。MBS毎日放送の場合はコンテンツのWindowsMediaヘッダ内のタイトルをローカルファイル名とします。
【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月中頃、同局のストリーミング放送は廃止になりました。
「重複チェックの仕様」
WEBラジオ(オンデマンド、ストリーミング放送)のダウンロードには重複ダウンロードのチェックが必須です。URLが同じままで内容だけが更新されることがあるからです。
上記の例について言えば、TBSと文化放送とVideoNewsについては放送内容毎にasxファイル内のURLを書き換える運用をおこなっているので、ストリーミングデータのダウンロード前にURLを見るだけで重複チェックがおこなえますが、他社はそうではないので、ダウンロードした後に、過去にダウンロードした末尾の時間以外が同一名のファイルの中で最も新しいものとバイナリ比較をおこなうことによって重複チェックをおこなう必要があります。(htmlに???日放送分とかUpdate ???とか書いてある筈なのでそれを読み取って利用するという方法もありますが、一般化しにくいのでそれは今のところ対応していません。)
このスクリプトをcronで長期間運用すればラジオ音声を録音したファイルがローカルに大量に溜まります。それを持っていて一番役に立つのは、日本語が通じなくてインターネットにも繋がっていない場所で何年か生活しなければならない人でしょう。
ダウンロードには放送を聞くのと同じ時間がかかります。
このスクリプトを運用する為にはこのページに掲載の他の2つのスクリプトが必要です。
download-streaming.sh 運用の為に必要な他のスクリプトの直接ダウンロードリンク
これらを全てパスの通った場所に置いておく必要がありますし、mplayer2, lame, nkfの各コマンドが必要です。さらにget-wma-info.plを動作させる為にAudio-WMA Perl拡張モジュールのインストールが必要です。
(他にwgetも必要ですが、これはどこのディストリでもデフォルトで入っているでしょう)
ダウンロード download-streaming.sh 2014-12-7更新(拡張子waxに対応) 2014-6-23更新(ファイル名無害化関数に%の処理を追加) 2013-5-28更新(download-youtube.shで採用したコードとの共通化) 2012-5-29更新(ファイル名にbracketを使わないようにしました) 2012-5-14新規公開
まずDOCUMENTROOTを修正して下さい。
ちゃんと動くように環境構築するにはここに書いているようにそれなりの手間がかかるので、インストーラ付きのセットをダウンロードすることをお薦めします。
以下は前身のall-process-asx.shの更新履歴
(2011-9-5)download-radio.shの更新により、VideoNewsのコメントアウト部に記述されている(た)marugeki_941_pre.asxはダウンロードしなくなりました。
ダウンロード all-process-asx.sh 2012-04-02更新(asx内のTitleにスラッシュが含まれる場合に対応) 2011-5-29更新(LEDが使いやすいようにPATHを追記しただけです) 2011-4-19更新(FILELSTにはmp3ファイル名を追記するように修正) 2011-4-18更新(latest-copy.shと連携するようにしました) 2011-3-18更新(ビデオニュース・ドットコムの無料動画の一部がダウンロードできなかったので修正しました。) 2010-3-18更新(隠し?オプションを変更し、maxdepthを自由に設定可能としました。)2010-3-22更新(URLのechoはdownload-wma側でおこなうことが好ましい為、本スクリプトからは削除しました。)
(2011-4-18追記)今回追加した変数DOCUMENTROOTは適宜書き換えて下さい。
download-wma.sh(download-streaming.shの中で呼び出される)
このスクリプトの実行にはget-wma-infoが必要です。他にmplayer2とlameも必要です。
単独で使用することもできます。
コメントアウトしてある個所は、私の場合は有効にして使用しています。.bashrcに独自PATHが指定してあってそれを使いたいという人は有効にして下さい。
ダウンロード download-wma.sh 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)ページの行数制限の為掲載をやめました。)
単独での使用方法はこちらにあります。
(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)
transcode-wma-to-mp3.sh
download-streaming.shの前身のall-process-asx.shからは呼び出されていましたが、download-streaming.shからは呼び出されないので、単なるおまけユーティリティ的存在になりました。
このスクリプトの実行にはget-wma-infoが必要です。他にmplayer2とlameも必要です。
使い方
$ transcode-wma-to-mp3.sh "JOQR 「超ラジ!火曜日」-tyora091118.wma"
こんな感じです。
実際にはwma専用ではなく、wmvやflv等々、mplayerで音声がデコードできるソースであれば何でもmp3にトランスコードします。
ダウンロード transcode-wma-to-mp3.sh 2014-6-23更新(内部で使用しているコマンドをmplayerからmplayer2に変更(これに伴い名前付きパイプの使用を廃止)) 2013-04-16更新(パーミッションが設定できないファイルシステムに対応) 2011-5-29更新(download-wma.shと同様の変更をおこないました。)
(2011-2-19追記)ID3タグ辺りのカスタマイズ
get-wma-info.pl(ヘルパースクリプト)
ヘルパースクリプトです。
説明およびダウンロードはこちら
Linuxでストリーミング放送を直接聴く
あまり本ページの他のコンテンツと関連がありませんが、一応書いておきます。
Firefoxで聞くならプラグインを入れ替える必要があります。
totem-mozillaをアンインストールし、代わりにmozilla-mplayerとかgecko-mediaplayerなどのmplayer系のプラグインをインストールする必要があります。私はmozilla-mplayer派です。
mplayerもrtspクライアント機能をを完全に実装してるわけではないらしく、任意の位置へのジャンプ(シーク)が出来ません。でもBGMとして聞くことが目的なら全く問題ないでしょう。
このような状況はここ何年も変わっていません。
(主にLinux上で利用する)携帯プレーヤーやICレコーダーの為のユーティリティ類
latest-copy.sh (download-radio.sh等と連携して携帯プレーヤーへファイルを持ち出すスクリプト)
download-radioやdownload-streamingでダウンロードしたファイルから新着のものだけを選んで携帯プレーヤーにコピーするスクリプトです。
(私はiTunesやiTunes互換ソフトは使っていません)
データベースの代わりにテキストファイルを用いる簡素なつくりです。
$ latest-copy.sh [ボリュームラベル]
引数なしで実行するだけです。コピー先は自動認識します。(2015-7-11差し替え)大抵は引数なしで実行しても正常に稼働しますが、普通は対象ストレージのボリュームラベルを引数として渡します。
(自動認識の場合の)母艦に接続された携帯プレーヤーの検索手順は、(1)/media/ユーザ名直下のマウントポイントで、(2)フラッシュメモリのデバイスで、(3)FATファイルシステムなものを探し、最初に見つかったものとしています。
ダウンロード latest-copy.sh 2015-7-11更新(マウントポイントのパスにユーザ名を追加、引数にボリュームラベルを受け取れる仕様に変更、簡易的な記述が残っていて引数なしで実行した場合はボリュームラベルに半角スペースがあるとうまく動かない、(対応しようと思えば対応できるが別にその必要はないと今まで考えてきた)) 2013-5-28更新(従来のwmvに加えてflvについても持ちだしたことにする処理を加えた) 2012-5-26更新(wmvを特別扱いする仕様を加えました) 2011-5-29更新 LED対応の記述(コメントアウトされている)の追加と無駄削除1箇所です。
中身を見るならこちら
DOCUMENTROOTは修正して下さい。
三洋のICレコーダー用なので持ち出し先を携帯プレーヤーのMUSICディレクトリとしています。適宜修正して下さい。
母艦に接続するだけで自動で最新ファイルをコピーし、さらに自動でアンマウントまですることも可能だと思いますが、今のところ設定方法を調べていません。誰か調べたら教えて下さい。
(2011-2-26追加) 携帯音楽プレーヤーを母艦PCのUSBポートに挿し込むだけであとは自動で最新ファイルをプレーヤーにコピーする(持ち出す)設定を紹介します。halevtdevmon(2015-7-11更新)を使う方法です。
あと、携帯プレーヤーに持ち出すのでなく、ダウンロードしたサーバで直接再生してしまうのもありだと思います。私は半々くらいの割合で使い分けています。サーバで再生するならこちらのページ(Music Player Daemonの日本語化)をどうぞ。
上記を少しカスタマイズして作成した、ソニーのICレコーダー用です。
内蔵メモリ側は無視し、microSD側に対して持ち出し処理をおこなっています。
※私は、内蔵メモリのボリュームラベルはデフォルトの「IC RECORDER」から「IC_RECORDER」に変更して使っています。
ダウンロード sony.latest-copy.sh 2015-7-11更新(マウントポイントのパスにユーザ名を追加、引数にボリュームラベルを受け取れる仕様に変更、簡易的な記述が残っていて引数なしで実行した場合はボリュームラベルに半角スペースがあるとうまく動かない) 2013-6-13更新 2013-5-14新規公開
携帯プレーヤーのプレイリストを作成するスクリプト
プレイリストを自動生成するスクリプトです。
- MYLIST1.M3UはMUSICディレクトリ直下のファイルのみを名前順にソートして作成
- MYLIST2.M3UはMUSICディレクトリ直下のファイルのみを更新日付順にソートして作成
- MYLIST3.M3Uはサブディレクトリ群下のファイルのみをパスの名前順にソートして作成
- MYLIST4.M3UにはMYLIST3.M3Uに収まりきらない分で作成
基本的には自分の使い方に合わせた仕様になっています。日々のポッドキャストのファイルは直下だけに置き、サブディレクトリ群には長期的に聴くものを置いています。1プレイリストは最大99ファイルまでなので、MYLIST3.M3Uに収まりきらない分はMYLIST4.M3Uに振り分けます。
$ make-playlist.sh
引数なしで実行するだけです。更新対象は自動認識します。
三洋のICレコーダー用です。他のDAPで使用する場合等は適宜修正して下さい。
nkfコマンドが必要です。
ダウンロード make-playlist.sh 2011-4-19更新(一部、ポッドキャストファイル前提で半角スペースを含むファイル名を無視する仕様だったのを修正しました)
中身を見るならこちら
サンヨー(パナソニック)ICレコーダーの録音ファイルの先頭3文字を録音順にナンバリングし直すスクリプト
こういうのはかなりの人が必要としていると思います。
カレントディレクトリのファイルのみを操作します。
ダウンロード ren-ICRECORDER-MP3.sh
中身を見るならこちら
携帯音楽プレーヤーを母艦PCのUSBポートに挿し込むだけであとは自動で最新ファイルをプレーヤーにコピーする(持ち出す)設定
(2011-2-26新規に記述)
従来私はこのような用途にgnome-volume-managerを少し改造したものを使っていたのですが、Ubuntu10.04以降ではgnome-volume-managerは廃止されてしまい、他の方法を使わざるをえなくなりました。方法はいろいろ考えられるんですが、現時点で最もお手軽で且つ汎用的なのがhalevtを使う方法だと思います。デスクトップシステムの種類に関わらず使えますし、CUI環境でも使うことができます。
(2015-7-11)Ubuntu 14.04やLinux Mint 17ではhalevtは廃止されてしまったので替りにdevmonを使うことにしました。
以下の3ファイルが設定の肝となるファイルです。
ダウンロード etc_conf.d_devmon.sample | /etc/conf.d/devmonとして使用するファイル devmonの動作の殆どを設定するファイル 私が使用しているもの(サンプルとして扱って下さい) 私の記述の場合/etc/sudoers.d内の設定も必要 |
ダウンロード etc_init.d_devmon | /etc/init.d/devmonとして使用するファイル devmonを簡易的なデーモンとして使用する為の起動スクリプト (ユーザ名は書き換える必要がある) |
ダウンロード sony.auto-latest-copy.sh | devmonから直接呼び出されるスクリプト 私がauto-latest-copy.shとして実際に使用しているものとほぼ同じ(サンプルとして扱って下さい) LED対応の記述(コメントアウトされている)を含んでいます |
- /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を呼び出し、それが正常に終了したらアンマウントして携帯プレーヤーを母艦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等を使いたいところです。因みに私はUSB接続のLEDを使っていますが、私が使っている携帯プレーヤーの液晶画面には一応持ち出し処理の進行状況が簡易的に表示されます。それらを頼りにしてもいいでしょう。
追加ダウンロード
サンヨー(パナ)ICレコーダ用・ダウンロード auto-latest-copy.sh 2015-7-11更新(引数にデバイス名でなくボリュームラベルを受け取る仕様に変更)
※こちらは上記ソニー用と比べて随分複雑です。様々余分な機能を盛り込んでいます。
持ち出し処理以外をおこなう場合はその都度devmonデーモンを停止することで対応しています。個人で使うだけならこれでも十分だと思います。また、私は、
このhalevtdevmonを使った「USBポートに挿しただけで何かの処理がおこなえる」という手法は非常に広い範囲に応用が可能です。
たとえば「認証用のドングル」としての利用があります。特定の鍵を持ったUSBキーを挿したときだけある特定のアプリケーションが使用できるとか、ログインが可能になる、みたいな使い方です。
私が示したサンプル例に似た使い方としては、USBメモリに画像やpdfファイルを入れてUSBポートに挿すと自動でクラウドにアップロードするとか、添付してメール送信するとか、印刷する、OCRする、等があるでしょう。
各スクリプトの中身
download-radio.sh
説明はこちら
ダウンロード download-radio.sh 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}"
download-youtube.sh
説明はこちら
ダウンロード download-youtube.sh 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/»/-/'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/ / /'g) fname=$(echo "${fname}"|sed -e 's/―/―/'g) fname=$(echo "${fname}"|sed -e 's/-/-/'g) fname=$(echo "${fname}"|sed -e 's/ê/e/'g) fname=$(echo "${fname}"|sed -e 's/ó/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/が/が/'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/デ/デ/'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) 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%%\&\;*} # 最初の&より前の文字列を取り出す 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
latest-copy.sh
説明はこちら
ダウンロード latest-copy.sh 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
make-playlist.sh
説明はこちら
ダウンロード make-playlist.sh 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
ren-ICRECORDER-MP3.sh
説明はこちら
ダウンロード ren-ICRECORDER-MP3.sh
ページ行数超過の為、内容表示は中止
ページ行数超過の為、書き込みフォームは削除します。掲示板等をご利用下さい。