Skip to content

Instantly share code, notes, and snippets.

@booska
Last active December 31, 2023 05:11
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save booska/ce06605ccb9d7ba9f1cfc2184935a0bb to your computer and use it in GitHub Desktop.
Save booska/ce06605ccb9d7ba9f1cfc2184935a0bb to your computer and use it in GitHub Desktop.
らじる★らじるを録音するWSHです。 おまけでOTTAVA,Suono Dolce,超!A&G+,JCBA各局,CSRA各局(一部不可),AFNも録音できます。
※重要 お知らせ
このスクリプトは各サイマルラジオの仕様変更に追従しておりません。
時間が有る時に、動くコードに変更します。
らじる★らじるを録音するWSHです。おまけでOTTAVA,Suono Dolce,超!A&G+,JCBA各局,CSRA各局(一部不可),AFNも録音できます。
 録音はFFmpeg(A&GのみRTMPDump)で行います。当該RajiruRec.vbsはそれをキックするランチャーです。
 コマンドプロンプトで利用する形態で、超軽量級ですのでパソコン作業の邪魔にはほとんどなりません。
 落書き人はこれをタスクスケジューラに仕込んで留守録を行っています。タスクスケジューラの使い方と覚えると色々と便利です。
 録音途中で通信が途切れるなどで中断した場合には、自動的に再接続を試みる様になっています。
 配信URL設定の確認の為に簡易聴取もできます。
※重要:GitHUBからダウンロードしたらShift-JISに変換して下さい。
 Windowsで利用するWSHの文字コードはShift-JISです。GitHUBデフォルトはUTF-8みたいです。
 文字コードの変換は、変換機能をもった適当なテキスト エディタで行えば簡単です。
1.導入・・・という程じゃないですが
適当なフォルダを作成して以下のようにサブフォルダとファイルを配置してください。
├ RajiruRec.vbs ※当該スクリプトファイルです。
├ bin ※binフォルダを作成して、以下のプログラムをこのフォルダに置いてください。
│ ├ rtmpdump.exe ※入手先 *1 ※超A&G!を録音しないなら不要
│ ├ ffmpeg.exe ※入手先 *2
│ └ ffplay.exe ※入手先 *2 ※簡易聴取しないなら不要
└ rec 録音ファイルを収めるフォルダ、録音の引数で任意に変えられる。
*1:RTMPDumpの入手先
 RTMPDump公式サイト http://rtmpdump.mplayerhq.hu/
*2:FFmpeg,FFplayの最新版の入手先
 FFMpeg公式サイト http://ffmpeg.org/
2.動かし方
(1). 動作環境
 作成はWindows 7 Pro環境で行っています。Windows 10 Home環境でも動作しています。
 この落書き人は上記以外の環境で当該RajiruRec.vbsを動かすことは有りません。よって他の環境での動作可否は感知できません。
(2). コマンドラインの仕様
 例 cscript RadikoRec.vbs JOAK 1:00:00 rec\ テスト no
 例 cscript RadikoRec.vbs /i:JOAK /t:1:00:00 /d:rec\ /o:テスト /s:no
 例 cscript RadikoRec.vbs /i:JOAK /t:1:00:00 /d:rec\ /o:テスト /s:no /mail:yes /sendto:hogehoge@hogehoge.jp /smtp:hogehoge.jp
 例 cscript RadikoRec.vbs /i:JOAK /t:1:00:00 /d:rec\ /o:テスト /s:no /mail:att /sendto:hogehoge@hogehoge.jp /smtp:hogehoge.jp
  NHKラジオ第一を、1時間、recというサブフォルダに、テストというファイル名で録音するという意味です。
  なお、ファイル名の接頭辞に録音日時が自動的に付加されます。リトライが発生すると接尾辞にリトライ回数が付加されます。
  3番目は録音完了をメールで通知している。4番目は録音完了したファイルをメールに添付して通知している。
  詳細はRajiruRec.vbsのソースコードを読んで下さい。
 例 cscript RadikoRec.vbs JOAK /p:yes
  NHKラジオ第一をFFplayで聴くことができます。
3.ライセンス
 コピーレフトです。フォークは自由です。
4.サポート
 このスクリプトは参考として公開しているもので、落書き人が想定していない環境での動作や要望など、いかなるサポートも行えません。
 なお録音失敗等の如何なる損害が発生しても、このスクリプトの落書き人は苦情などを一切受け付けません。
5.変遷
・2011-吉日 らじる★らじるの録音スクリプトを公開
・2012-08-吉日 超!A&G+の録音に対応
・2012-09-吉日 超!A&G+の録音を調整
・2012-09-吉日 Suono Dolceの録音に対応
・2012-10-吉日 超!A&G+の録音を調整
・2013-06-吉日 超!A&G+の録音を調整(配信が安定した)
・2013-07-吉日 JCBA各局の録音に対応
・2013-07-吉日 OTTAVAとCSRA(局設定はサンプルとして数局のみ*4)の録音に対応
・2013-08-03 録音ファイルをメール通知機能を実装 *5
・2013-08-05 radiko.jpのHLS配信の録音を試作したが非公開、陽の目を見る事ができる日が来ますように m(゚- ゚ )
・2013-09-16 GPLで非公開は矛盾するとの指摘を受け、上記のradiko.jp対応部分は抹消しました。
・2014-02-02 AFNの録音に対応
・2014-02-07 AFNの録音に対応の記述ミスを訂正
・2014-12-11 超!A&G+の配信変更に対応
・2015-01-01 OTTAVA新プレイヤーの録音に対応 ※旧プレイヤーは停止するらしい
・2015-01-12 OTTAVA新プレイヤーの録音の間違いを訂正
・2015-01-12 AFNの配信URLを訂正 ※時々変更になります
・2015-02-18 超!A&G+の配信変更に対応
・2016-11-xx 配信URL変更で不具合が出ていたが多忙で放置なので非公開へ *6
・2017-09-03 らじる等の配信方法が変更された為に改修
・2017-09-03 設定URL確認の為に簡易聴取機能を追加(プレイヤーとしては不満足)
・2017-09-09 改修にて不具合解消(検証は落書き人が使う範囲のみ)した事から再公開
・2017-09-19 らじるのURLが一部旧のままでしたので訂正
・2017-09-19 CSRAの本日調べた局を追加(FFplayで再生できない局とwma以外の局は除外)
・2017-10-14 FM++とListenRadioを追加 ※CSRAやJCBAと重複する場合は「/type:FMPLUS」もしくは「/type:LISR」を指定する
・2017-11-07 FM++とListenRadioに追加された3局を加える
・2017-11-07 らじるがm4aコンテナでは再生できない場合があり*7、mp4コンテナに変更
・2018-03-20 FM++を除外(WSHでは対応出来なくなっていた為)
・2018-03-20 CSRAから配信停止している局を除外
・2018-03-20 ※今後の放送局リスト保守は落書き人が録音する局のみで基本放置!!
*4:CSRAなどの録音URLの調べ方
 6-(1).録音URLの調べ方を参照
*5:メール通知について
 この機能は自分が欲しかった機能ですが、以下の理由により万人向けではありません。
 メール送信できるかは環境依存です。例えばOSがHome EditionなどではOSライセンスの制限により使えません。
 録音したファイルを添付して送信することも可能ですが、SMTPサーバーの添付ファイルサイズ制限で送信できないことがあります。
*6:多忙で放置モードになったら非公開にします。
 ググって不具合放置状態なゴミが検索一覧に表示されるのが嫌なので ^_^;
*7:らじるのコーデックが風変わりなHE-AACv2の場合がある
 常にそうであるのでは無く、HE-AACの場合もあるので困る。
 これが頻繁に続く様なら、常に再エンコードした方が良いのかもしれない。
 落書き人は保存目的ではなく聴ければ良いので、取り敢えず再エンコードなし。
 ID : 1
 Format : AAC
 Format/Info : Advanced Audio Codec
 Format profile : HE-AACv2 / HE-AAC / LC
 Codec ID : 40
 Duration : 1mn 0s
 Bit rate mode : Constant
 Bit rate : 48.0 Kbps
 Channel(s) : 2 channels / 2 channels / 2 channels ←何これ?(・・;)
 Channel positions : Front: L R / Front: L R / Front: L R
 Sampling rate : 48.0 KHz / 48.0 KHz / 24.0 KHz
 Compression mode : Lossy
6.参考情報
(1). 録音URLの調べ方 (ストリーミング配信のパケットが読める基礎知識が必要)
 まずはgoogleで検索して、先人者が調べたものがあれば、それを利用すれば良いかと思います。
 Wireshakなどの通信パケットを調べるソフトで、ストリーミング開始リクエストURLが調べられます。
 なお、パケットの授受についての知識が必要ですので、多少、難しいかもしれません。
 例えば、CSRAならばRTSP形式ですので、そのリクエストパケットのURLがそうです。
 RTSPのリクエスト開始はHTTPと同じである場合がありますので、一見するとHTTPの様に見えます。
 またCSRAの場合は複数IPアドレスがラウンドロビンされている局がありますので、通信開始時に複数IPアドレスに対してリクエストしている様に見えて混乱しないようにする必要もあります。
 簡易にはVLC media playerで再生できる配信サイトなら、VLCでメディア情報を参照することでも調べられます。
(2). 音声コーデックは無変換です
 コーデックは無変換ですので、録音時の音質劣化はありません。
 コンテナも、そのコーデックに適した最もスタンダードな物にしてあります。
 もし再エンコードしてコーデックとコンテナを統一したいなら、ffmpegのオプションと出力ファイルの拡張子をセットしている箇所を変更して下さい。
'RajiruRec.vbsは、
' らじる★らじるを録音するWSHです。
' おまけでOTTAVA,Suono Dolce,超!A&G+,JCBA各局,CSRA各局(一部不可),AFNも録音できます。
'
' 起動書式例(引数を順番に指定) cscript RajiruRec.vbs JOAK 2:02:00 "c:\temp\" NHK深夜便 No
' 起動書式例(名前付き引数で指定) cscript RajiruRec.vbs /i:JOAK /t:2:02:00 /d:"c:\temp\" /o:NHK深夜便 /s:No
' 起動書式例(聴取したい場合) cscript RajiruRec.vbs JOAK /p:yes
'  ※詳しくは、コマンドラインの引数取得の箇所を参照のこと
Option Explicit
Dim i,j
'タスクスケジューラで休止モードから復帰させた場合にNet接続までのマージン確保(これが不用な環境はらコメントアウトする)
'WScript.Sleep(1000 * 5) 'スリープさせる秒数は環境により調整が必要
'引数の取得
Dim argStation,argRecTime,argDirectory,argOut,argType,argPlay,argSleep,argDebug,argSilent,argMail,argSendTo,argSMTP
argStation = "JOAK" '引数1(i):放送局指定(サイマル各局はコールサイン,ネット配信専門局はOTTAVA,Suono,AGの3局)
argRecTime = "00:30:00" '引数2(t):録音時間
argDirectory = "" '引数3(d):録音ファイルを出力するディレクトリ
argOut = "out" '引数4(o):録音ファイル名
argSleep = "no" '引数5(s):録音後にスリープさせるなら“yes”
argType = "" '引数(type):“”コールサインのみで検索、“CSRA”CSRAから検索、“JCBA”JCBAから検索、“LISR”ListenRadioから検索、“FMPLUS”FM++から検索
argPlay = "no" '引数(p):“yes”なら録音ではなく聴取
argDebug = "no" '引数(deb):“yes”なら、動作の途中経過を逐次表示する
argSilent = "yes" '引数(cilent):“yes”なら、外部コマンドであるwgetやrtmpdumpの実行プロンプトを表示しない
argMail = "no" '引数(mail):“yes”なら録音完了をメールで通知する。"att"なら録音ファイルを添付いたメールで送信する。なお大きなファイル添付は受信できない環境が多々有り、実用的ではないので注意のこと。
argSendTo = "" '引数(sendto):メール通知する宛先 ex. hogehoge@hogehoge.jp
argSMTP = "" '引数(smtp):"メールボックスがあるSMTPサーバーのホスト名 ex. hogehoge.jp
Dim aNamed, aUnnamed
Set aNamed = WScript.Arguments.Named
Set aUnnamed = WScript.Arguments.Unnamed
If aUnnamed.Count > 0 Then
For i = 0 To aUnnamed.Count - 1
Select Case i
Case 0
argStation = aUnnamed.Item(i)
Case 1
argRecTime = aUnnamed.Item(i)
Case 2
argDirectory = aUnnamed.Item(i)
Case 3
argOut = aUnnamed.Item(i)
Case 4
argSleep = aUnnamed.Item(i)
End Select
Next
End If
If aNamed.Exists("i") Then argStation = aNamed.Item("i")
If aNamed.Exists("t") Then argRecTime = aNamed.Item("t")
If aNamed.Exists("d") Then argDirectory = aNamed.Item("d")
If aNamed.Exists("o") Then argOut = aNamed.Item("o")
If aNamed.Exists("p") Then argPlay = LCase(aNamed.Item("p"))
If aNamed.Exists("s") Then argSleep = LCase(aNamed.Item("s"))
If aNamed.Exists("type") Then argType = UCase(aNamed.Item("type"))
If aNamed.Exists("deb") Then argDebug = LCase(aNamed.Item("deb"))
If aNamed.Exists("silent") Then argSilent = LCase(aNamed.Item("silent"))
If aNamed.Exists("mail") Then argMail = LCase(aNamed.Item("mail"))
If aNamed.Exists("sendto") Then argSendTo = LCase(aNamed.Item("sendto"))
If aNamed.Exists("smtp") Then argSMTP = LCase(aNamed.Item("smtp"))
'メール通知の引数チェック
If argMail = "yes" or argMail = "att" Then
If argSendTo = "" Then
WScript.Echo "warning : メール宛先が指定されていない為、メール通知をオフにしました。"
argMail = "no"
End If
If argSMTP = "" Then
WScript.Echo "warning : メール送信先のSMTPサーバーが指定されていない為、メール通知をオフにしました。"
argMail = "no"
End If
End If
If argPlay = "no" Then
WScript.Echo "「" & argStation & "」の「" & argOut & "」を録音開始、録音時間は「" & argRecTime & "」"
End IF
'引数で指定の録音時間を日時属性に変換
dim RecTime
RecTime = TimeValue(argRecTime)
'録音終了日時を求める
Dim BeginDate
Dim EndDate
EndDate = Now() + RecTime
'シェル起動オブジェクトを生成
Dim WSHShell,gShellStyle
Set WSHShell = WScript.CreateObject("WScript.Shell")
If argSilent = "yes" Then
gShellStyle = 7
Else
gShellStyle = 10
End IF
'ファイルシステム用オブジェクトを生成(ラジコ独自認証でファイルを利用)
Dim WSHFS
Set WSHFS = CreateObject("Scripting.FileSystemObject")
'NHKのStreaming URLの連想配列
Dim aaNHK
Set aaNHK = WScript.CreateObject("Scripting.Dictionary")
aaNHK.Add "r1","https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8" 'R1東京
aaNHK.Add "r2","https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8" 'R2東京
aaNHK.Add "fm","https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8" 'FM東京
aaNHK.Add "JOIK","https://nhkradioikr1-i.akamaihd.net/hls/live/512098/1-r1/1-r1-01.m3u8" 'R1札幌
aaNHK.Add "JOAB","https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8" 'R2東京
aaNHK.Add "JOAK","https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8" 'R1東京
aaNHK.Add "JOHK","https://nhkradiohkr1-i.akamaihd.net/hls/live/512075/1-r1/1-r1-01.m3u8" 'R1仙台
aaNHK.Add "JOCK","https://nhkradiockr1-i.akamaihd.net/hls/live/512072/1-r1/1-r1-01.m3u8" 'R1名古屋
aaNHK.Add "JOBK","https://nhkradiobkr1-i.akamaihd.net/hls/live/512291/1-r1/1-r1-01.m3u8" 'R1大阪
aaNHK.Add "JOFK","https://nhkradiofkr1-i.akamaihd.net/hls/live/512086/1-r1/1-r1-01.m3u8" 'R1広島
aaNHK.Add "JOZK","https://nhkradiozkr1-i.akamaihd.net/hls/live/512103/1-r1/1-r1-01.m3u8" 'R1松山
aaNHK.Add "JOLK","https://nhkradiolkr1-i.akamaihd.net/hls/live/512088/1-r1/1-r1-01.m3u8" 'R1福岡
aaNHK.Add "JOIK-FM","https://nhkradioikfm-i.akamaihd.net/hls/live/512100/1-fm/1-fm-01.m3u8" 'FM札幌
aaNHK.Add "JOAK-FM","https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8" 'FM東京
aaNHK.Add "JOHK-FM","https://nhkradiohkfm-i.akamaihd.net/hls/live/512076/1-fm/1-fm-01.m3u8" 'FM仙台
aaNHK.Add "JOCK-FM","https://nhkradiockfm-i.akamaihd.net/hls/live/512074/1-fm/1-fm-01.m3u8" 'FM名古屋
aaNHK.Add "JOBK-FM","https://nhkradiobkfm-i.akamaihd.net/hls/live/512070/1-fm/1-fm-01.m3u8" 'FM大阪
aaNHK.Add "JOFB-FM","https://nhkradiofkfm-i.akamaihd.net/hls/live/512087/1-fm/1-fm-01.m3u8" 'FM広島
aaNHK.Add "JOZK-FM","https://nhkradiozkfm-i.akamaihd.net/hls/live/512106/1-fm/1-fm-01.m3u8" 'FM松山
aaNHK.Add "JOLK-FM","https://nhkradiolkfm-i.akamaihd.net/hls/live/512097/1-fm/1-fm-01.m3u8" 'FM福岡
'JCBAのStation IDの連想配列 ※JCBAはStreaming URLの統一感があって良いですね
Dim aaJCBA
Set aaJCBA = WScript.CreateObject("Scripting.Dictionary")
aaJCBA.Add "JOZZ1AZ-FM","JCB001" 'FMはな
aaJCBA.Add "JOZZ1AR-FM","JCB002" 'エフエムもえる
aaJCBA.Add "JOZZ1AU-FM","JCB003" 'Airてっし
aaJCBA.Add "JOZZ2AR-FM","JCB004" 'アップルウェーブ
aaJCBA.Add "JOZZ2BA-FM","JCB005" 'FM One
aaJCBA.Add "JOZZ2AA-FM","JCB006" 'ラジオモンスター
aaJCBA.Add "JOZZ2BE-FM","JCB007" 'エフエムNCVおきたまGO!
aaJCBA.Add "JOZZ2AK-FM","JCB009" 'ハーバーRADIO
aaJCBA.Add "JOZZ2BK-FM","JCB008" 'エフエムい~じゃん おらんだラジオ
aaJCBA.Add "JOZZ2AC-FM","JCB010" 'FMポコ
aaJCBA.Add "JOZZ2AJ-FM","JCB011" 'エフエムいわぬま
aaJCBA.Add "JOZZ2AZ-FM","JCB012" 'H@!FM
aaJCBA.Add "JOZZ2AU-FM","JCB013" '喜多方シティエフエム
aaJCBA.Add "JOZZ3AC-FM","JCB014" 'FM湘南ナパサ
aaJCBA.Add "JOZZ3AD-FM","JCB015" 'FM・ブルー湘南
aaJCBA.Add "JOZZ3BM-FM","JCB017" 'FMおだわら
aaJCBA.Add "JOZZ3AF-FM","JCB016" 'KamakuraFM
aaJCBA.Add "JOZZ3CI-FM","JCB018" '湘南マジックウェイブ
aaJCBA.Add "JOZZ3AM-FM","JCB019" 'FMチャッピー
aaJCBA.Add "JOZZ3AY-FM","JCB020" 'I & U-LaLa FM
aaJCBA.Add "JOZZ3AH-FM","JCB021" 'かずさFM
aaJCBA.Add "JOZZ3BZ-FM","JCB022" 'ラジオ成田
aaJCBA.Add "JOZZ3BY-FM","JCB023" 'FMだいご
aaJCBA.Add "JOZZ3BD-FM","JCB024" 'FMかしま
aaJCBA.Add "JOZZ3AO-FM","JCB025" 'エフエム甲府
aaJCBA.Add "JOZZ3CA-FM","JCB026" 'エフエムふじやま
aaJCBA.Add "JOZZ3CF-FM","JCB027" 'エフエムふじごこ
aaJCBA.Add "JOZZ3AQ-FM","JCB028" 'ラジオ高崎
aaJCBA.Add "JOZZ3BB-FM","JCB029" 'エフエム太郎
aaJCBA.Add "JOZZ3AT-FM","JCB030" 'FM OZE
aaJCBA.Add "JOZZ3AU-FM","JCB031" 'エフエム西東京
aaJCBA.Add "JOZZ3AG-FM","JCB032" 'むさしのFM
aaJCBA.Add "JOZZ3AS-FM","JCB033" 'FMえどがわ
aaJCBA.Add "JOZZ6AB-FM","JCB034" 'FM Haro!
aaJCBA.Add "JOZZ6BE-FM","JCB035" 'みらいずステーション
aaJCBA.Add "JOZZ6AY-FM","JCB036" 'g-sky76.5
aaJCBA.Add "JOZZ6BF-FM","JCB037" '富士山GOGOエフエム
aaJCBA.Add "JOZZ6AD-FM","JCB038" 'VOICE CUE
aaJCBA.Add "JOZZ6AC-FM","JCB039" 'マリンパル
aaJCBA.Add "JOZZ6AG-FM","JCB040" 'FM-Hi!
aaJCBA.Add "JOZZ6AS-FM","JCB041" 'Radio-f
aaJCBA.Add "JOZZ6AL-FM","JCB042" 'COAST-FM
aaJCBA.Add "JOZZ6AK-FM","JCB043" 'FM PiPi
aaJCBA.Add "JOZZ6AP-FM","JCB044" 'FMわっち
aaJCBA.Add "JOZZ6AE-FM","JCB045" 'Hits FM
aaJCBA.Add "JOZZ6AV-FM","JCB046" 'United North
aaJCBA.Add "JOZZ6AT-FM","JCB047" 'RADIO SANQ
aaJCBA.Add "JOZZ6BB-FM","JCB048" 'i-wave 76.5 FM
aaJCBA.Add "JOZZ6BC-FM","JCB049" 'エフエム ななみ
aaJCBA.Add "JOZZ6BG-FM","JCB050" 'FMいなべ(いなBee)
aaJCBA.Add "JOZZ6AU-FM","JCB051" 'なばステ
aaJCBA.Add "JOZZ4AE-FM","JCB052" 'RADIO AGATT
aaJCBA.Add "JOZZ4AH-FM","JCB053" 'FMながおか
aaJCBA.Add "JOZZ4AF-FM","JCB054" 'FMゆきぐに
aaJCBA.Add "JOZZ4AO-FM","JCB055" 'エルシーブイFM
aaJCBA.Add "JOZZ4AM-FM","JCB056" 'i ステーション
aaJCBA.Add "JOZZ5AF-FM","JCB057" 'City-FM
aaJCBA.Add "JOZZ5AE-FM","JCB058" 'ラジオたかおか
aaJCBA.Add "JOZZ5AH-FM","JCB059" 'エフエムとなみ
aaJCBA.Add "JOZZ5AD-FM","JCB060" 'ラジオななお
aaJCBA.Add "JOZZ5AB-FM","JCB061" 'ラジオかなざわ
aaJCBA.Add "JOZZ5AC-FM","JCB062" 'ラジオこまつ
aaJCBA.Add "JOZZ7BG-FM","JCB063" 'ロケッツ785
aaJCBA.Add "JOZZ7AM-FM","JCB064" 'FMいかる
aaJCBA.Add "JOZZ7BN-FM","JCB066" 'FMまいづる
aaJCBA.Add "JOZZ7AD-FM","JCB065" 'FMうじ
aaJCBA.Add "JOZZ7AP-FM","JCB067" 'FMちゃお
aaJCBA.Add "JOZZ7AK-FM","JCB068" 'ウメダFM Be Happy! 789
aaJCBA.Add "JOZZ7AA-FM","JCB069" 'FM-HANAKO
aaJCBA.Add "JOZZ7AJ-FM","JCB070" 'ハッピーエフエムいたみ
aaJCBA.Add "JOZZ7AT-FM","JCB071" 'ハミングFM宝塚
aaJCBA.Add "JOZZ7AN-FM","JCB072" 'さくらFM
aaJCBA.Add "JOZZ7AS-FM","JCB073" 'ならどっとFM
aaJCBA.Add "JOZZ7AR-FM","JCB074" 'FMハイホー
aaJCBA.Add "JOZZ7BE-FM","JCB075" 'Banana FM
aaJCBA.Add "JOZZ8AD-FM","JCB079" 'Radio momo
aaJCBA.Add "JOZZ9AI-FM","JCB077" 'FMがいや
aaJCBA.Add "JOZZ9AH-FM","JCB076" 'FMラヂオバリバリ
aaJCBA.Add "JOZZ8AA-FM","JCB078" 'レディオBINGO
aaJCBA.Add "JOZZ8AC-FM","JCB080" 'FMくらしき
aaJCBA.Add "JOZZ8AF-FM","JCB081" 'エフエムおのみち
aaJCBA.Add "JOZZ8AG-FM","JCB082" 'FMちゅーピー
aaJCBA.Add "JOZZ8AP-FM","JCB083" 'FMはつかいち
aaJCBA.Add "JOZZ8AE-FM","JCB084" 'COME ON! FM
aaJCBA.Add "JOZZ8AJ-FM","JCB085" 'しゅうなんエフエム
aaJCBA.Add "JOZZ0BY-FM","JCB086" 'FM八女
aaJCBA.Add "JOZZ8AU-FM","JCB087" 'FM東広島
aaJCBA.Add "JOZZ0BU-FM","JCB088" 'ゆふいんラヂオ局
aaJCBA.Add "JOZZ0AX-FM","JCB089" 'NOAS FM
aaJCBA.Add "JOZZ0AE-FM","JCB090" 'かっぱFM
aaJCBA.Add "JOZZ0AB-FM","JCB091" 'FM791
aaJCBA.Add "JOZZ0BN-FM","JCB092" 'FMからつ
aaJCBA.Add "JOZZ0AI-FM","JCB093" 'Dreams FM
aaJCBA.Add "JOZZ4AD-FM","JCB094" 'FM KENTO
aaJCBA.Add "JOZZ4AJ-FM","JCB095" 'FM-J
aaJCBA.Add "JOZZ3AR-FM","JCB096" 'FMやまと
aaJCBA.Add "JOZZ7BP-FM","JCB097" 'FM五條
aaJCBA.Add "JOZZ3CJ-FM","JCB098" '発するFM
aaJCBA.Add "JOZZ9AJ-FM","JCB099" '新居浜FM放送
aaJCBA.Add "JOZZ3CH-FM","JCB100" 'FMふくろう
'CSRAのStreaming URLの連想配列
' ※CSRAサイトからFM++やListenRadioへのリンクになっている局、icyで配信している局、mmsだがFFplayで再生できない局は除いてあります。
Dim aaCSRA
Set aaCSRA = WScript.CreateObject("Scripting.Dictionary")
aaCSRA.Add "JOZZ1AT-FM","mmsh://hdv4.nkansai.tv/eniwa?MSWMExt=.asf" 'e-niwa
aaCSRA.Add "JOZZ1AH-FM","mmsh://fmwappy.aa0.netvolante.jp:8080" 'FMわっぴー
aaCSRA.Add "JOZZ1AC-FM","mmsh://simuledge.shibapon.net/FmKushiro?MSWMExt=.asf" 'エフエムくしろ
aaCSRA.Add "JOZZ1BB-FM","rtsp://wm2.hvc.co.jp/radioniseko" 'ラジオニセコ
aaCSRA.Add "JOZZ1AK-FM","rtsp://wm2.hvc.co.jp/sankakuyama" '三角山放送局
aaCSRA.Add "JOZZ1AG-FM","mmsh://simuledge.shibapon.net/fm837?MSWMExt=.asf" 'FMおたる
aaCSRA.Add "JOZZ1AJ-FM","mmsh://202.241.170.47:8080/" 'FMアップル
aaCSRA.Add "JOZZ1AI-FM","rtsp://hdv2.nkansai.tv/radiokaros" 'ラジオカロスサッポロ
aaCSRA.Add "JOZZ1AA-FM","rtsp://hdv.nkansai.tv/iruka" 'FMいるか
aaCSRA.Add "JOZZ1AX-FM","rtsp://wm2.hvc.co.jp/radioniseko" 'エフエムしろいし
aaCSRA.Add "JOZZ1AB-FM","mmsh://simuledge.shibapon.net/fm837?MSWMExt=.asf" 'FMりべーる
aaCSRA.Add "JOZZ2AL-FM","mmsh://hdv3.nkansai.tv/befm?MSWMExt=.asf" 'Be FM
aaCSRA.Add "JOZZ2AI-FM","mmst://simul.freebit.net/radiomorioka" 'ラヂオもりおか
aaCSRA.Add "JOYZ2AK-FM","mmsh://hdv2.nkansai.tv/rikutakata" '陸前高田災害FM
aaCSRA.Add "JOZZ2BI-FM","mmsh://hdv2.nkansai.tv/miyako" 'みやこハーバーラジオ
aaCSRA.Add "JOZZ2AB-FM","mmst://simul.freebit.net/radio3" 'RADIO3
aaCSRA.Add "JOZZ2AG-FM","mmsh://hdv2.nkansai.tv/ishinomaki" 'ラジオ石巻
aaCSRA.Add "JOZZ2AF-FM","mmsh://hdv2.nkansai.tv/baywave" 'BAY WAVE
aaCSRA.Add "JOZZ2AY-FM","mmsh://hdv5.nkansai.tv/taihaku?MSWMExt=.asf" 'FMたいはく
aaCSRA.Add "JOZZ2AP-FM","http://www.fm797.co.jp/mf/bcs_na.mp3" 'fmいずみ
aaCSRA.Add "JOZZ2BL-FM","mmsh://hdv2.nkansai.tv/natori" 'なとらじ801
aaCSRA.Add "JOZZ2AN-FM","mmsh://hdv3.nkansai.tv/yutopia" 'FMゆーとぴあ
aaCSRA.Add "JOZZ2BC-FM","mmsh://hdv3.nkansai.tv/yokote" '横手かまくらFM
aaCSRA.Add "JOZZ2BH-FM","mmsh://hdv3.nkansai.tv/kiritampo" '鹿角きりたんぽFM
aaCSRA.Add "JOZZ2AE-FM","mmsh://hdv2.nkansai.tv/seawave" 'SEA WAVE FMいわき
aaCSRA.Add "JOZZ2AD-FM","mmsh://hdv3.nkansai.tv/aizu" 'FM愛'S
aaCSRA.Add "JOZZ2AW-FM","mmsh://hdv2.nkansai.tv/fmmotcom" 'FM-MotCom
aaCSRA.Add "JOYZ2AF-FM","mmsh://hdv2.nkansai.tv/minamisoma" '南相馬ひばりFM
aaCSRA.Add "JOZZ3AN-FM","mmsh://hdv4.nkansai.tv/palulun?MSWMExt=.asf" 'FMぱるるん
aaCSRA.Add "JOZZ3BX-FM","mmsh://hdv3.nkansai.tv/takahagi" 'たかはぎFM
aaCSRA.Add "JOZZ3BU-FM","mmsh:/hdv5.nkansai.tv/hitachi" 'FMひたち
aaCSRA.Add "JOZZ3BO-FM","mmsh://hdv4.nkansai.tv/tsukuba" 'ラヂオつくば
aaCSRA.Add "JOZZ3CC-FM","mmsh://hdv4.nkansai.tv/fmuu" 'FM-UU
aaCSRA.Add "JOZZ3BN-FM","mmst://simuledge.shibapon.net/kiryu.fm" 'エフエムきりゅう
aaCSRA.Add "JOZZ3BV-FM","rtsp://radio.maebashi.fm:80/mwave" 'M-WAVE
aaCSRA.Add "JOZZ3BK-FM","mmsh://hdv.nkansai.tv/smile" 'すまいるエフエム
aaCSRA.Add "JOZZ3AV-FM","rtsp://flower-tv.net/simul" 'フラワーラジオ
aaCSRA.Add "JOZZ3CD-FM","mmsh://hdv4.nkansai.tv/kawaguchi?MSWMExt=.asf" 'FM Kawaguchi
aaCSRA.Add "JOZZ3BI-FM","mmsh://hdv.nkansai.tv/redswave" 'REDS WAVE
aaCSRA.Add "JOZZ3AP-FM","mmsh://hdv3.nkansai.tv/katsushika" 'かつしかFM
aaCSRA.Add "JOZZ3BF-FM","mmsh://hdv3.nkansai.tv/rainbowtown" 'レインボータウンFM
aaCSRA.Add "JOZZ3AW-FM","mmsh://hdv3.nkansai.tv/chofu" '調布FM
aaCSRA.Add "JOZZ3AX-FM","mmsh://hdv.nkansai.tv/radiocity" 'Ginza'RADIO CITY
aaCSRA.Add "JOZZ3BL-FM","mmsh://hdv3.nkansai.tv/tachikawa?MSWMExt=.asf" 'エフエムたちかわ
aaCSRA.Add "JOZZ3AK-FM","mmsh://hdv3.nkansai.tv/kawasaki" 'かわさきFM
aaCSRA.Add "JOZZ3AI-FM","mmst://simul.freebit.net/radioshonan" 'レディオ湘南
aaCSRA.Add "JOZZ3BQ-FM","mmsh://hdv3.nkansai.tv/totsuka?MSWMExt=.asf" 'FM TOTSUKA
aaCSRA.Add "JOZZ3AL-FM","rtsp://122.29.249.8/fmsagami_simul" 'FM HOT 839
aaCSRA.Add "JOZZ3BE-FM","mmsh://210.253.220.164" 'FM salus
aaCSRA.Add "JOZZ3BW-FM","mmsh://hdv.nkansai.tv/kaon" 'エフエムカオン
aaCSRA.Add "JOZZ5AG-FM","mmsh://hdv4.nkansai.tv/radiomyu" 'ラジオ・ミュー
aaCSRA.Add "JOZZ5AA-FM","mmsh://android.fmn1.jp/live/?MSWMExt=.asf" 'えふえむ・エヌ・ワン
aaCSRA.Add "JOZZ4AQ-FM","mmsh://hdv.nkansai.tv/azumino" 'エフエムあづみ野
aaCSRA.Add "JOZZ4AG-FM","mmsh://hdv.nkansai.tv/sakudaira" 'FMさくだいら
aaCSRA.Add "JOZZ4AL-FM","mmsh://hdv2.nkansai.tv/karuizawa" 'エフエム軽井沢
aaCSRA.Add "JOZZ6AM-FM","mmst://simul.freebit.net/ciao" 'Ciao!
aaCSRA.Add "JOZZ6BD-FM","mmsh://hdv4.nkansai.tv/izunokuni?MSWMExt=.asf" 'FMいずのくに
aaCSRA.Add "JOZZ6AX-FM","mmsh://simuledge.shibapon.net/mid-fm761?MSWMExt=.asf" 'MID-FM761
aaCSRA.Add "JOZZ6AF-FM","mmsh://simuledge.shibapon.net/FmOkazaki?MSWMExt=.asf" 'FMおかざき
aaCSRA.Add "JOZZ6AO-FM","mmsh://hdv3.nkansai.tv/toyota?MSWMExt=.asf" 'RADIO LOVEAT
aaCSRA.Add "JOZZ6AN-FM","mmsh://hdv4.nkansai.tv/portwave" 'CTY-FM
aaCSRA.Add "JOZZ6AZ-FM","mmsh://hdv4.nkansai.tv/suzuka?MSWMExt=.asf" 'Suzuka Voice FM
aaCSRA.Add "JOZZ7BF-FM","mmsh://211.1.40.29/tanba" 'FM丹波
aaCSRA.Add "JOZZ7BH-FM","mmsh://hdv4.nkansai.tv/tango" 'FMたんご
aaCSRA.Add "JOZZ7AY-FM","mmsh://hdv3.nkansai.tv/radiocafe" '京都三条ラジオカフェ
aaCSRA.Add "JOZZ7AB-FM","mmsh://simuledge.shibapon.net/KyotoLivingFM?MSWMExt=.asf" 'FM845
aaCSRA.Add "JOZZ7BO-FM","mmsh://hdv5.nkansai.tv/radiomixkyoto" 'RADIO MIX KYOTO
aaCSRA.Add "JOZZ7AG-FM","mmsh://hdv4.nkansai.tv/hirakata" 'エフエムひらかた
aaCSRA.Add "JOZZ7AF-FM","mmsh://hdv3.nkansai.tv/yesfm" 'YES-fm
aaCSRA.Add "JOZZ7AC-FM","mmsh://hdv5.nkansai.tv/minoh?MSWMExt=.asf" 'みのおエフエム
aaCSRA.Add "JOZZ7AL-FM","mmsh://hdv4.nkansai.tv/fmmoov?MSWMExt=.asf" 'FM MOOV KOBE
aaCSRA.Add "JOZZ7AH-FM","mmsh://simuledge.shibapon.net/FmMiki?MSWMExt=.asf" 'エフエムみっきぃ
aaCSRA.Add "JOZZ7AQ-FM","mmsh://hdv3.nkansai.tv/jungle" 'FMジャングル
aaCSRA.Add "JOZZ7AE-FM","mmsh://hdv2.nkansai.tv/fmyy" 'FMわぃわぃ
aaCSRA.Add "JOZZ7AU-FM","mmsh://hdv5.nkansai.tv/genki/?MSWMExt=.asf" 'FM GENKI
aaCSRA.Add "JOZZ7BM-FM","mmsh://hdv5.nkansai.tv/fm805" 'たんばコミュニティエフエム
aaCSRA.Add "JOZZ7AI-FM","mmsh://hdv.nkansai.tv/aiai" 'FM aiai
aaCSRA.Add "JOZZ7AX-FM","mmsh://hdv5.nkansai.tv/honey" 'HONEY FM
aaCSRA.Add "JOZZ7BD-FM","mmsh://hdv3.nkansai.tv/banban" 'BAN-BANラジオ
aaCSRA.Add "JOZZ7AO-FM","mmsh://hdv4.nkansai.tv/beachstation?MSWMExt=.asf" 'ビーチステーション
aaCSRA.Add "JOZZ7BL-FM","mmsh://hdv2.nkansai.tv/hasimoto" 'FMはしもと
aaCSRA.Add "JOZZ7BI-FM","mmsh://simuledge.shibapon.net/FmTanabe?MSWMExt=.asf" 'FM TANABE
aaCSRA.Add "JOZZ8AT-FM","mmsh://121.1.145.25:8080/streaming.asf" 'DARAZ FM
aaCSRA.Add "JOZZ9AC-FM","mmsh://simuledge.shibapon.net/B-FM791?MSWMExt=.asf" 'B-FM791
aaCSRA.Add "JOZZ9AA-FM","mmsh://hdv4.nkansai.tv/fmsun?MSWMExt=.asf" 'FM SUN
aaCSRA.Add "JOZZ9AB-FM","mmsh://hdv4.nkansai.tv/takamatsu?MSWMExt=.asf" 'FM815
aaCSRA.Add "JOZZ0AM-FM","mmsh://hdv.nkansai.tv/starcorn" 'スターコーンFM
aaCSRA.Add "JOZZ0CA-FM","mmsh://st1.shimabara.jp/comiten" 'コミュニティラジオ天神
aaCSRA.Add "JOZZ0AU-FM","mmsh://st1.shimabara.jp/fmkitaq" 'FM KITAQ
aaCSRA.Add "JOZZ0BK-FM","mmsh://hdv3.nkansai.tv/hibiki" 'エフエムひびき
aaCSRA.Add "JOZZ0BF-FM","mmsh://st1.shimabara.jp/fmlive" 'FMしまばら
aaCSRA.Add "JOZZ0BZ-FM","mmsh://211.1.40.21:80/nobeoka?MSWMExt=.asf" 'FMのべおか
aaCSRA.Add "JOZZ0BD-FM","mmsh://hdv.nkansai.tv/amami" 'ディ!ウェイヴ
aaCSRA.Add "JOZZ0BQ-FM","mmsh://hdv5.nkansai.tv/ginga?MSWMExt=.asf" 'FMぎんが
aaCSRA.Add "JOZZ0BC-FM","mmst://118.21.140.45/Push1?MSWMExt=.asf" 'FMいしがき サンサンラジオ
aaCSRA.Add "JOZZ0ZP-FM","mmsh://211.1.40.21/fm21?MSWMExt=.asf" 'FM21
aaCSRA.Add "JOZZ0BT-FM","rtsp://hdv2.nkansai.tv/motob" 'ちゅらハートFMもとぶ
aaCSRA.Add "JOZZ0AT-FM","mmsh://hdv3.nkansai.tv/nirai?MSWMExt=.asf" 'FMニライ
aaCSRA.Add "JOZZ0CG-FM","mmsh://hdv5.nkansai.tv/ginowancity?MSWMExt=.asf" 'FMぎのわん
aaCSRA.Add "JOZZ0BB-FM","mmsh://hdv4.nkansai.tv/lequio?MSWMExt=.asf" 'FMレキオ
aaCSRA.Add "JOZZ0CH-FM","rtsp://hdv5.nkansai.tv/ginowancity" 'ぎのわんシティFM
aaCSRA.Add "JOZZ0BI-FM","rtsp://hdv.nkansai.tv/okiradi" 'オキラジ
aaCSRA.Add "JOZZ0BO-FM","rtsp://hdv.nkansai.tv/fm-uruma" 'FMうるま
aaCSRA.Add "JOZZ0BW-FM","rtsp://hdv3.nkansai.tv/kumejima" 'FMくめじま
'ListenRadioのStation IDの連想配列
Dim aaLISR
Set aaLISR = WScript.CreateObject("Scripting.Dictionary")
aaLISR.Add "JOZZ1AD-FM","30044" 'FM WING
aaLISR.Add "JOZZ1AC-FM","30029" 'FMくしろ
aaLISR.Add "JOZZ1BB-FM","30060" 'ラジオニセコ
aaLISR.Add "JOZZ1AK-FM","30005" '三角山放送局
aaLISR.Add "JOZZ1AJ-FM","30090" 'FMアップル
aaLISR.Add "JOZZ1AQ-FM","30044" 'RadioTXT FM dramacity
aaLISR.Add "JOZZ1AE-FM","30016" 'FM JAGA
aaLISR.Add "JOZZ1AI-FM","30034" 'ラジオカロスサッポロ
aaLISR.Add "JOZZ1AA-FM","30047" 'FMいるか
aaLISR.Add "JOZZ1AB-FM","30074" 'FMりべーる
aaLISR.Add "JOZZ2AL-FM","30079" 'Be FM
aaLISR.Add "JOZZ2AV-FM","30050" 'カシオペアFM
aaLISR.Add "JOYZ2AK-FM","30095" '陸前高田災害FM
aaLISR.Add "JOZZ2BI-FM","30097" 'みやこハーバーラジオ
aaLISR.Add "JOZZ2AB-FM","30007" 'RADIO3
aaLISR.Add "JOZZ2AG-FM","30037" 'ラジオ石巻
aaLISR.Add "JOZZ2BO-FM","30094" 'ラヂオ気仙沼
aaLISR.Add "JOZZ2AF-FM","30056" 'BAY WAVE
aaLISR.Add "JOZZ2AP-FM","30018" 'FMいずみ
aaLISR.Add "JOZZ2BL-FM","30092" 'なとらじ801
aaLISR.Add "JOZZ2AN-FM","30030" 'FMゆーとぴあ
aaLISR.Add "JOZZ2BC-FM","30076" '横手かまくらFM
aaLISR.Add "JOZZ2BH-FM","30089" '鹿角きりたんぽFM
aaLISR.Add "JOZZ2AS-FM","30014" 'エフエム椿台
aaLISR.Add "JOZZ2AE-FM","30009" 'FMいわき
aaLISR.Add "JOYZ2AM-FM","30099" 'おだがいさまFM
aaLISR.Add "JOZZ2AW-FM","30019" 'FM-MOTCom
aaLISR.Add "JOZZ2BB-FM","30020" 'KOCOラジ
aaLISR.Add "JOYZ2AF-FM","30092" '南相馬ひばりFM
aaLISR.Add "JOZZ3AN-FM","30022" 'FMぱるるん
aaLISR.Add "JOZZ3BX-FM","30075" 'たかはぎFM
aaLISR.Add "JOZZ3BU-FM","30023" 'FMひたち
aaLISR.Add "JOZZ3BV-FM","30043" 'まえばしCITYエフエム
aaLISR.Add "JOZZ3BK-FM","30026" 'すまいるエフエム
aaLISR.Add "JOZZ3AV-FM","30002" 'フラワーラジオ
aaLISR.Add "JOZZ3CD-FM","30035" 'FM Kawaguchi
aaLISR.Add "JOZZ3CE-FM","30096" 'ハローハッピー・こしがやエフエム
aaLISR.Add "JOZZ3BI-FM","30008" 'REDS WAVE
aaLISR.Add "JOZZ3CL-FM","30081" '八王子FM
aaLISR.Add "JOZZ3BF-FM","30036" 'レインボータウンFM
aaLISR.Add "JOZZ3AW-FM","30039" '調布FM
aaLISR.Add "JOZZ3BL-FM","30033" 'エフエムたちかわ
aaLISR.Add "JOZZ3AB-FM","30028" '湘南ビーチFM
aaLISR.Add "JOZZ3AK-FM","30046" 'かわさきFM
aaLISR.Add "JOZZ3AI-FM","30063" 'レディオ湘南
aaLISR.Add "JOZZ3BQ-FM","30064" 'エフエム戸塚
aaLISR.Add "JOZZ3AL-FM","30080" 'FMHOT893
aaLISR.Add "JOZZ3BE-FM","30061" 'FMサルース
aaLISR.Add "JOZZ3BW-FM","30057" 'FMカオン
aaLISR.Add "JOZZ5AG-FM","30006" 'ラジオ・ミュー
aaLISR.Add "JOZZ5AA-FM","30001" 'FM N1
aaLISR.Add "JOZZ5AK-FM","30012" '敦賀FM
aaLISR.Add "JOZZ4AQ-FM","30086" 'あづみ野エフエム放送
aaLISR.Add "JOZZ4AL-FM","30032" 'FM軽井沢
aaLISR.Add "JOZZ6AM-FM","30062" 'Ciao!
aaLISR.Add "JOZZ6AX-FM","30004" 'MID-FM
aaLISR.Add "JOZZ6AF-FM","30040" 'FMおかざき
aaLISR.Add "JOZZ6AQ-FM","30065" 'Pitch FM
aaLISR.Add "JOZZ6AN-FM","30015" 'CTY-FM
aaLISR.Add "JOZZ7AY-FM","30082" '京都三条ラジオカフェ
aaLISR.Add "JOZZ7AG-FM","30049" 'エフエムひらかた
aaLISR.Add "JOZZ7AF-FM","30073" 'YES-fm
aaLISR.Add "JOZZ7BC-FM","30048" 'FM千里
aaLISR.Add "JOZZ7AQ-FM","30013" 'FMジャングル
aaLISR.Add "JOZZ7AU-FM","30041" 'FM GENKI
aaLISR.Add "JOZZ7AI-FM","30067" 'FM aiai
aaLISR.Add "JOZZ7BD-FM","30078" 'BAN-BANラジオ
aaLISR.Add "JOZZ7AO-FM","30084" 'ビーチステーション
aaLISR.Add "JOZZ7BI-FM","30051" 'FM TANABE
aaLISR.Add "JOZZ8AT-FM","30053" 'DARAZ FM
aaLISR.Add "JOZZ9AC-FM","30010" 'エフエムびざん
aaLISR.Add "JOZZ9AA-FM","30070" 'FM SUN
aaLISR.Add "JOZZ9AB-FM","30024" 'FM815
aaLISR.Add "JOZZ0BK-FM","30052" 'AIR STATION HIBIKI
aaLISR.Add "JOZZ0BZ-FM","30088" 'FMのべおか
aaLISR.Add "JOZZ0BD-FM","30054" 'あまみエフエム
aaLISR.Add "JOZZ0BC-FM","30069" 'FMいしがきサンサンラジオ
aaLISR.Add "JOZZ0CC-FM","30055" 'FMなんじょう
aaLISR.Add "JOZZ0AT-FM","30003" 'FMニライ
aaLISR.Add "JOZZ0CG-FM","30093" 'FMぎのわん
aaLISR.Add "JOZZ0CH-FM","30098" 'ぎのわんシティFM
aaLISR.Add "JOZZ0BG-FM","30083" 'FMとよみ
aaLISR.Add "JOZZ0BI-FM","30066" 'オキラジ
aaLISR.Add "JOZZ0B0-FM","30011" 'FMうるま
aaLISR.Add "JOZZ0BW-FM","30077" 'FMくめじま
'AFNのStreaming URLの連想配列 ※ホスト名の頭の数字は時々変更されるので、その都度変更が必要
Dim aaAFN
Set aaAFN = WScript.CreateObject("Scripting.Dictionary")
aaAFN.Add "AFNP_MSW","http://17803.live.streamtheworld.com/AFNP_MSW.mp3" '@三沢
aaAFN.Add "AFNP_TKO","http://18393.live.streamtheworld.com/AFNP_TKO.mp3" '@横田
aaAFN.Add "AFNP_IWA","http://18743.live.streamtheworld.com/AFNP_IWA.mp3" '@岩国
aaAFN.Add "AFNP_SBO","http://19993.live.streamtheworld.com/AFNP_SBO.mp3" '@佐世保
aaAFN.Add "AFNP_OKN","http://14013.live.streamtheworld.com/AFNP_OKN.mp3" '@沖縄
aaAFN.Add "AFN_JOE","http://20423.live.streamtheworld.com/AFN_JOEP.mp3" 'AFN Joe Radio
aaAFN.Add "AFN_CTY","http://17793.live.streamtheworld.com/AFN_CTYP.mp3" 'AFN Country
aaAFN.Add "AFN_GRV","http://16693.live.streamtheworld.com/AFN_GRV.mp3" 'AFN Gravity
aaAFN.Add "AFN_PTK","http://18393.live.streamtheworld.com/AFN_PTK.mp3" 'AFN PowerTalk
aaAFN.Add "AFN_VCE","http://14983.live.streamtheworld.com/AFN_VCE.mp3" 'AFN The Voice
aaAFN.Add "AFN_HOT","http://18813.live.streamtheworld.com/AFN_HOTP.mp3" 'AFN Hot AC(Adult Contemporary)
aaAFN.Add "AFN_LGY","http://17813.live.streamtheworld.com/AFN_LGYP.mp3" 'AFN Legacy
aaAFN.Add "AFN_FAN","http://14533.live.streamtheworld.com/AFN_FAN.mp3" 'AFN Fans
aaAFN.Add "AFN_FRE","http://18393.live.streamtheworld.com/AFN_FREP.mp3" 'AFN Freedom
'録音を開始する。エラー発生したらリトライ、なおリトライ制限とリトライと共にインターバルを増やしてゆく考慮あり
Dim strWeekdays
strWeekdays = Array("(日)", "(月)", "(火)", "(水)", "(木)", "(金)", "(土)") '曜日のコンスタント値
Dim lngWeekday '今日の曜日インデックス
Dim strNow 'ファイル名とする日時文字列
Dim strSuffix 'ファイル名の接尾文字列
Dim RecTimeStr '録音時間(Doロールの最初に計算)
Dim RecSecond '録音秒数(Doロールの最初に計算)
Dim strCmd
Dim MaxRetry
MaxRetry = 20 'リトライ回数制限値(初期インターバル3秒でリトライ20回であれば約10分+α程は通信回復までリトライ、それを超えたらギブアップ)
Dim CtrRetry
CtrRetry = 0 'リトライ回数カウンター
Dim IntervalRetry
IntervalRetry = 2 '途中で録音中断した時にリトライを行うまでの初期インターバル秒で、リトライが増えるにしたがって、リトライ回次数×前回のインターバルという計算でインターバルを増やす。これで数分に及ぶ通信途絶の時に、無駄なリトライでリトライ制限に達してしまうことを減らす。
Dim Ans
Dim pFileName '録音保存するファイル名
Dim aryOutFiles() '保存した録音ファイル名の配列、リトライがなければ1ファイルのみ
Dim aryOutCtr '録音したファイルカウントで、リトライがなければZero
aryOutCtr = 0
Do
'録音時間を求める
RecTime = EndDate - Now() + TimeValue("00:00:30") '30秒ほどマージンを設けることで接続までの時間マージンを考慮する。
RecTimeStr = Right("0" & Hour(RecTime) , 2) + ":" + Right("0" & Minute(RecTime) , 2) + ":" + Right("0" & Second(RecTime) , 2)
RecSecond = Hour(RecTime) * 60 * 60 + Minute(RecTime) * 60 + Second(RecTime) + 10 '10秒ほどマージンを設ける(rtmpdumpの内部タイマーとスクリプトのタイマーがズレる様なので
'現在の曜日インデックスを求める
lngWeekday = Weekday(Now) -1
'ファイル名のプレフィックスを編集
strNow = Year(Now) & "年" & Right("0" & Month(Now), 2) & "月" & Right("0" & Day(Now), 2) & "日" & strWeekdays(lngWeekday) & Right("0" & Hour(Now), 2) & "時" & Right("0" & Minute(Now), 2) & "分 "
If CtrRetry > 0 Then
strSuffix = argOut & "~" & Right("000" & CtrRetry, 3) '1分以内にリトライが発生するとファイル名が重複するのでリトライ回数もファイル名に含める
Else
strSuffix = argOut
End If
'録音起動するコマンドラインを編集
pFileName = argDirectory & strNow & strSuffix
If argType = "" And aaNHK.Exists(argStation) Then 'らじる★らじるの録音パラメータ
If argPlay = "no" Then
pFileName = pFileName & ".m4a"
strCmd = "bin\ffmpeg -analyzeduration 1M -probesize 1M -i """ & aaNHK(argStation) & """ -t " & RecTimeStr & " -c:a copy """ & pFileName & """"
Else
TerminateProcess("ffplay.exe")
strCmd = "bin\ffplay -nodisp -analyzeduration 1M -probesize 1M -i """ & aaNHK(argStation) & """"
End If
ElseIf argType = "" And argStation = "AG" Then '超A&G!の録音パラメータ
If argPlay = "no" Then
pFileName = pFileName & ".flv"
strCmd = "bin\rtmpdump --rtmp ""rtmp://fms-base1.mitene.ad.jp/agqr/aandg22"" --timeout 60 -B " & RecSecond & " --live -o """ & pFileName & """"
'strCmd = "bin\ffmpeg -i ""rtmp://fms-base1.mitene.ad.jp/agqr/aandg22 live=1"" -t " & RecTimeStr & " -c:a copy """ & pFileName & """"
Else
TerminateProcess("ffplay.exe")
strCmd = "bin\ffplay -i ""rtmp://fms-base1.mitene.ad.jp/agqr/aandg22 live=1"""
End If
ElseIf argType = "" And argStation = "Suono" Then 'Suono Dolceの録音パラメータ
If argPlay = "no" Then
pFileName = pFileName & ".mp4"
strCmd = "bin\ffmpeg -analyzeduration 1M -probesize 1M -i ""http://web-cache.stream.ne.jp/web/live/hls-live/suono-hls-live/suono-live.m3u8"" -t " & RecTimeStr & " -c:a copy """ & pFileName & """"
Else
TerminateProcess("ffplay.exe")
strCmd = "bin\ffplay -analyzeduration 1M -probesize 1M -i ""http://web-cache.stream.ne.jp/web/live/hls-live/suono-hls-live/suono-live.m3u8"""
End If
ElseIf argType = "" And argStation = "OTTAVA" Then 'OTTAVAの録音パラメータ
If argPlay = "no" Then
pFileName = pFileName & ".mp4"
strCmd = "bin\ffmpeg -analyzeduration 1M -probesize 1M -i ""http://rakuten.streamguys1.com/ottava1_b"" -t " & RecTimeStr & " -c:a copy """ & pFileName & """"
Else
TerminateProcess("ffplay.exe")
strCmd = "bin\ffplay -nodisp -analyzeduration 1M -probesize 1M -i ""http://rakuten.streamguys1.com/ottava1_b"""
End If
ElseIf (argType = "" or argType = "JCBA") And aaJCBA.Exists(argStation) Then 'JCBAの録音パラメータ
If argPlay = "no" Then
pFileName = pFileName & ".m4a"
strCmd = "bin\ffmpeg -analyzeduration 1M -probesize 1M -i ""http://musicbird-hls.leanstream.co/musicbird/" & aaJCBA(argStation) & ".stream/playlist.m3u8"" -t " & RecTimeStr & " -c:a copy """ & pFileName & """"
Else
TerminateProcess("ffplay.exe")
strCmd = "bin\ffplay -analyzeduration 1M -probesize 1M -nodisp -i ""http://musicbird-hls.leanstream.co/musicbird/" & aaJCBA(argStation) & ".stream/playlist.m3u8"""
End IF
argType = "JCBA"
ElseIf (argType = "" or argType = "CSRA") And aaCSRA.Exists(argStation) Then 'CSRAの録音パラメータ
If argPlay = "no" Then
pFileName = pFileName & ".wma"
strCmd = "bin\ffmpeg -analyzeduration 1M -probesize 1M -i """ & aaCSRA(argStation) & """ -t " & RecTimeStr & " -f asf -vn -c:a copy """ & pFileName & """"
Else
TerminateProcess("ffplay.exe")
strCmd = "bin\ffplay -analyzeduration 1M -probesize 1M -nodisp -i """ & aaCSRA(argStation) & """"
End IF
argType = "CSRA"
ElseIf (argType = "" or argType = "LISR") And aaLISR.Exists(argStation) Then 'ListenRadioの録音パラメータ
If argPlay = "no" Then
pFileName = pFileName & ".m4a"
strCmd = "bin\ffmpeg -analyzeduration 1M -probesize 1M -i ""http://mtist.as.smartstream.ne.jp/" & aaLISR(argStation) & "/livestream/playlist.m3u8"" -t " & RecTimeStr & " -c:a copy """ & pFileName & """"
Else
TerminateProcess("ffplay.exe")
strCmd = "bin\ffplay -analyzeduration 1M -probesize 1M -nodisp -i ""http://mtist.as.smartstream.ne.jp/" & aaLISR(argStation) & "/livestream/playlist.m3u8"""
End IF
argType = "LISR"
ElseIf argType = "" And aaAFN.Exists(argStation) Then 'AFNの録音パラメータ
If argPlay = "no" Then
pFileName = pFileName & ".mp3"
strCmd = "bin\ffmpeg -analyzeduration 1M -probesize 1M -i """ & aaAFN(argStation) & """ -t " & RecTimeStr & " -vn -c:a copy """ & pFileName & """"
Else
TerminateProcess("ffplay.exe")
strCmd = "bin\ffplay -analyzeduration 1M -probesize 1M -nodisp -i """ & aaAFN(argStation) & """"
End IF
argType = "AFN"
Else
Ans = MsgBox(" 放送局指定が間違っています。type=" & argType, 48, "☆指定ミス☆")
Exit Do
End If
'録音プログラムを起動する
If argPlay = "yes" Then
If argDebug = "yes" Then WScript.Echo strCmd
WSHShell.Run strCmd,gShellStyle,True
Exit Do
Else
If argDebug = "yes" Then WScript.Echo strCmd
WSHShell.Run strCmd,gShellStyle,True
End IF
'録音したファイル名を記録
if WSHFS.FileExists(pFileName) = True Then
ReDim Preserve aryOutFiles(aryOutCtr)
aryOutFiles(aryOutCtr) = pFileName
aryOutCtr = aryOutCtr + 1
WScript.Echo " 通知:録音ファイル名「" & pFileName & "」が出力されました。"
Else
WScript.Echo " 注意:録音ファイル名「" & pFileName & "」は出力されませんでした!"
End If
'録音終了の判断
If Now() >= EndDate Then Exit Do '予定録音時間まで録音できたので完了
CtrRetry = CtrRetry + 1
If CtrRetry > MaxRetry Then
Ans = MsgBox("abend : リトライ回数制限に達しましたので録音を中断しました。", 48, "☆録音リタイア☆")
Exit Do 'リトライ回数制限を超えたら諦める
End If
WScript.Sleep(1000 * (IntervalRetry * CtrRetry)) 'リトライ・インターバルを増やし行くのは通信途絶が長いくなった場合に必要な配慮
WScript.Echo "warning : " & Right("000" & CtrRetry, 3) & "回目のリトライ発生!"
Loop
'録音完了をメールで通知する。
If argMail = "yes" or argMail = "att" Then call SendMail()
'パソコンを休止にする。 ※全ての環境で機能するのかな?
If argSleep = "yes" Then
WSHShell.Run "%windir%\System32\rundll32.exe powrprof.dll,SetSuspendState",,False
End If
'メール通知(CDOでメール送信できる環境であることが前提、例えばHome Editionなどは使えないと思われる。ポート25が開いていないLANでも利用できない。)
Function SendMail()
Dim oMsg
Dim pBody
Dim pFileNm
Dim oFile
Set oMsg = CreateObject("CDO.Message")
oMsg.From = argSendTo
oMsg.To = argSendTo
oMsg.Subject = "録音が完了しました。 放送局 : " & argStation & " ファイル : " & argOut
pBody = "録音が完了しました" & vbCrLf
For Each pFileNm In aryOutFiles
pBody = pBody & "録音ファイル名 : " & pFileNm & vbCrLf
'録音したファイルを添付する(録音時間が長い場合に受信でるかは、送信先のSMTPサーバーの設定に依存する)
If argMail = "att" Then
Set oFile = WSHFS.GetFile(pFileNm)
oMsg.AddAttachment(oFile.Path) 'フルパスじゃないと添付出来ない
End If
Next
oMsg.TextBody = pBody
oMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
oMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = argSMTP
oMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
oMsg.Configuration.Fields.Update
oMsg.Send
End Function
'指定した名前のプロセスを強制終了
Sub TerminateProcess(ProcessName)
Dim objProcList,objProcess
Set objProcList = GetObject("winmgmts:").InstancesOf("win32_process")
For Each objProcess In objProcList
If LCase(objProcess.Name) = LCase(ProcessName) Then objProcess.Terminate
Next
End Sub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment