Time.vbsにバグがありました


Time.vbsは録音時間計算のスプリクトです。バッチファイルで時間計算は大変なのでWSHで処理します。
しかし終了時間0時近辺の録音が停止しないバグがあったので調べました。

以前の Time.vbs

' CScript Time.vbs /r:0:01:00
' CScript Time.vbs /d:2016/12/14 /t:00:01:00

Option Explicit
Dim argRecTime
Dim value
dim gRecTime
dim argDay
dim argTime
Dim aNamed
Set aNamed = WScript.Arguments.Named

argRecTime = WScript.Arguments.Named.Item("r")
argDay = WScript.Arguments. Named.Item("d")
argTime = WScript.Arguments. Named.Item("t")

if not (argRecTime = "") Then

  '引数で指定の録音時間を日時属性に変換
  gRecTime = TimeValue(argRecTime)

  '録音終了日時を求める
  Dim gEndDate
  gEndDate = Now() + gRecTime
  WScript.Echo gEndDate
End If

if not (argTime = "") Then

  '引数で指定の録音時間を日時属性に変換
  argRecTime = TimeValue(argTime)
  argDay = DateValue(argDay)

  argRecTime = argDay + argRecTime

  '録音秒数をrtmpdumpの引数形式(秒数)にする
  gRecTime = argRecTime - Now()
  if (gRecTime > 0) Then
    gRecTime = Hour(gRecTime) * 60 * 60 + Minute(gRecTime) * 60 + Second(gRecTime) + 20
    '20秒ほどマージンを設けることで録音終了時の誤差でリトライにいってしまうことを防止する。
  Else
    gRecTime ="EXIT"
  End If
  WScript.Echo gRecTime

End If

このスプリクトだと録音終了日時が0:00:00だと省略されて日付のみ返す事がわかりました。秒に直すと文字列を返さないため永遠に録音されます。

新しい Time.vbs

' CScript Time.vbs /r:0:01:00
' CScript Time.vbs /d:2016/12/14 /t:18:47:44

Option Explicit
Dim argRecTime
Dim value
dim gRecTime
dim argDay
dim argTime
Dim aNamed
Set aNamed = WScript.Arguments.Named

argRecTime = WScript.Arguments.Named.Item("r")
argDay = WScript.Arguments. Named.Item("d")
argTime = WScript.Arguments. Named.Item("t")

if not (argRecTime = "") Then

    '引数で指定の録音時間を日時属性に変換
    gRecTime = TimeValue(argRecTime)

    '録音終了日時を求める
    Dim gEndDate
    gEndDate = Now() + gRecTime
    WScript.Echo gEndDate

End If

if not (argDay = "") Then

    '引数で指定の録音時間を日時属性に変換

    argDay = DateValue(argDay)

    if (argTime = "") Then
        argRecTime = argDay
    Else
        argRecTime = TimeValue(argTime)
        argRecTime = argDay + argRecTime
    End If

    '録音秒数をrtmpdumpの引数形式(秒数)にする
    gRecTime = argRecTime - Now()
    if (gRecTime > 0) Then
        gRecTime = Hour(gRecTime) * 60 * 60 + Minute(gRecTime) * 60 + Second(gRecTime) + 20
        '20秒ほどマージンを設けることで録音終了時の誤差でリトライにいってしまうことを防止する。
    Else
        gRecTime ="EXIT"
    End If
    WScript.Echo gRecTime

End If

そこで0:00:00で空欄の場合、秒計算で時間の引数を計算しないようにしました

 


らじる★らじるをバッチファイルとWSHで録音する


以前の記事でらじる★らじるを録音する方法を記事にした。
-注意-
今回はNHKラジオのらじる★らじるを録音する記事です

その時、github.comのbooskaのらじる★らじるを録音するWSHのスプリクトを利用することで録音することを紹介していた。しかし、booskaさんのソースは公開中止になってしまった。

いろいろ検討した結果、booskaさんのスプリクトを参照してバッチファイルとWSHで作成した。現在動作確認中だがほぼ利用可能な状況になったのでここに紹介することにする

おまけでコミュニティFMのJCBA系列と超A&G!が録音できます。

作成はWindows 10環境で作成しています。動作確認はWindows 7です。

利用にあたって
rtmpdump.exe
https://github.com/K-S-V/Scripts/releases

ffmpeg.exe
http://hp.vector.co.jp/authors/VA020429/ffmpeg/ffmpeg.html
https://ffmpeg.org/

各種実行ファイルを集めて一つのフォルダに置いてください

RajiruRec.bat

@echo off

REM rtmpdumpなどの位置のドライブ
set drive=D:

REM rtmpdumpなどの位置(最後に\を)
set DFDirectory=D:\RajiruRec\

REM 録音ファイルの保存のドライブ
set argdrive=D:

REM 録音ファイルの保存先(最後に\を)
set argDirectory=D:\RajiruRec\rec\

set RTMPDUMP=rtmpdump.exe
set argOut = "out"

%drive%
cd %DFDirectory%

rem 録音ファイルの保存先フォルダチェックと作成
IF NOT EXIST "%argDirectory%" (md %argDirectory%)
IF NOT EXIST "%argDirectory%OLD" (md %argDirectory%OLD)

set ch=%1
if "%1"=="" goto usage
if not "%2"=="" set argSTOPSEC=%2
if "%2"=="" goto usage
if not "%3"=="" set argOut=%3

rem 録音終了日時を求める
for /f "tokens=1,2" %%i in ('CScript Time.vbs /r:%argSTOPSEC%') do (
    SET AUTHTOKEN_D=%%i
    SET AUTHTOKEN_T=%%j
)

REM NHKの連想配列
REM R1東京
if %ch%==R1 (
    set aaNHK_r=rtmpe://netradio-r1-flash.nhk.jp
    set aaNHK_y=NetRadio_R1_flash@63346
    )
REM R2東京
if %ch%==R2 (
    set aaNHK_r=rtmpe://netradio-r2-flash.nhk.jp
    set aaNHK_y=NetRadio_R2_flash@63342
    )
REM FM東京
if %ch%==FM (
    set aaNHK_r=rtmpe://netradio-fm-flash.nhk.jp
    set aaNHK_y=NetRadio_FM_flash@63343
    )
REM R2東京
if %ch%==JOAB (
    set aaNHK_r=rtmpe://netradio-r2-flash.nhk.jp
    set aaNHK_y=NetRadio_R2_flash@63342
    )
REM R1東京
if %ch%==JOAK (
    set aaNHK_r=rtmpe://netradio-r1-flash.nhk.jp
    set aaNHK_y=NetRadio_R1_flash@63346
    )
REM R1仙台
if %ch%==JOHK (
    set aaNHK_r=rtmpe://netradio-hkr1-flash.nhk.jp
    set aaNHK_y=NetRadio_HKR1_flash@108442
    )
REM R1名古屋
if %ch%==JOCK (
    set aaNHK_r=rtmpe://netradio-ckr1-flash.nhk.jp
    set aaNHK_y=NetRadio_CKR1_flash@108234
    )
REM R1大阪
if %ch%==JOBK (
    set aaNHK_r=rtmpe://netradio-bkr1-flash.nhk.jp
    set aaNHK_y=NetRadio_BKR1_flash@108232
    )
REM FM東京
if %ch%==JOAK-FM (
    set aaNHK_r=rtmpe://netradio-fm-flash.nhk.jp
    set aaNHK_y=NetRadio_FM_flash@63343
    )
REM FM仙台
if %ch%==JOHK-FM (
    set aaNHK_r=rtmpe://netradio-hkfm-flash.nhk.jp
    set aaNHK_y=NetRadio_HKFM_flash@108237
    )
REM FM名古屋
if %ch%==JOCK-FM (
    set aaNHK_r=rtmpe://netradio-ckfm-flash.nhk.jp
    set aaNHK_y=NetRadio_CKFM_flash@108235
    )
REM FM大阪
if %ch%==JOBK-FM (
    set aaNHK_r=rtmpe://netradio-bkfm-flash.nhk.jp
    set aaNHK_y=NetRadio_BKFM_flash@108233
    )

REM JCBAの連想配列
REM 参考URL https://radioserver2.jimdo.com/
REM はっぴぃ!FM
if %ch%==JOZZ0BE-FM (
    set aaJCBA=rtmpe://jcbasimul061-live1.sp1.fmslive.stream.ne.jp/jcbasimul061-live1/_definst_/jcbasimul061-live
)
REM FM西東京
if %ch%==JOZZ3AU-FM (
    set aaJCBA=rtmp://jcbasimul003-live1.sp1.fmslive.stream.ne.jp/jcbasimul003-live1/_definst_/jcbasimul003-live
)
REM むさしのFM
if %ch%==JOZZ3AG-FM (
    set aaJCBA=rtmp://jcbasimul032-live1.sp1.fmslive.stream.ne.jp/jcbasimul032-live1/_definst_/jcbasimul032-live
)
REM FMえどがわ
if %ch%== JOZZ3AS-FM (
    set aaJCBA=rtmp://jcbasimul033-live1.sp1.fmslive.stream.ne.jp/jcbasimul033-live1/_definst_/jcbasimul033-live
)
REM 超A&G!の録音パラメータ
if %ch%== AG (
    set aaJCBA=rtmp://fms-base1.mitene.ad.jp/agqr/aandg22
)

set loopck=0

:loop

rem 録音時間を秒に変換
for /f %%i in ('CScript Time.vbs /d:%AUTHTOKEN_D% /t:%AUTHTOKEN_T%') do SET AUTHTOKEN_END=%%i
set STOPSEC=--stop %AUTHTOKEN_END%

if "%loopck%" == "0" set FLV_loop=
if "%loopck%" geq "1" set FLV_loop=(%loopck%)

set yyyymmdd=%date: =0%
set hhmmss=%time: =0%
set YMD=%yyyymmdd:~0,4%%yyyymmdd:~5,2%%yyyymmdd:~8,2%_%hhmmss:~0,2%%hhmmss:~3,2%%hhmmss:~6,2%
set FLV=%YMD%_%ch%_%argOut%

set RADI_PASS=

REM らじる★らじるの録音パラメータ
if not "%aaNHK_r%"=="" (
set RADI=%RTMPDUMP% -flashVer "WIN 15,0,0,152" --rtmp "%aaNHK_r%" --timeout 10 --playpath "%aaNHK_y%" --app ""live"" -W ""http://www3.nhk.or.jp/netradio/files/swf/rtmpe.swf"" --live -o "%argDirectory%%FLV%%FLV_loop%.flv" %STOPSEC%
    set RADI_PASS=1
)
REM JCBAの録音パラメータ
if not "%aaJCBA%"=="" (
    set RADI=%RTMPDUMP% --quiet -flashVer "WIN 15,0,0,152" --rtmp "%aaJCBA%" --timeout 10 --live -o "%argDirectory%%FLV%%FLV_loop%.flv" %STOPSEC%
    set RADI_PASS=1
)

if "%RADI_PASS%"=="" goto usage

echo 録音開始%date%_%time%_"%~3" >> log.txt
echo 「%ch%」の「%argOut%」を録音開始、録音時間は「%argSTOPSEC%」
echo %RADI%
%RADI%
echo 録音停止%date%_%time%_"%~3" >> log.txt

for /f %%i in ('CScript Time.vbs /d:%AUTHTOKEN_D% /t:%AUTHTOKEN_T%') do SET AUTHTOKEN_EXIT=%%i
if "%AUTHTOKEN_EXIT%" == "EXIT" goto loopEXIT
if "%loopck%" geq "20" goto loopEXIT
set /a loopck=loopck+1

REM Sleep[15秒数]
set /a wtime=15*1000
echo WScript.Sleep %wtime% > tmp.vbs
cscript //NoLogo tmp.vbs
del tmp.vbs
set wtime=
REM ***

goto loop

:loopEXIT

%argdrive%
cd %argDirectory%
for %%F in (*.flv) do goto FILE_EXIST
echo エラーファイルが無い%date%_%time%_%argOut% >> %DFDirectory%log.txt
goto end

:FILE_EXIST
echo MP3変換開始%date%_%time%_"%argOut%" >> %DFDirectory%log.txt
REN *"%argOut%"*.flv *.m4a
for %%i in (*"%argOut%"*.m4a) do %DFDirectory%ffmpeg.exe  -y -i "./%%~ni.m4a" -vn -acodec libmp3lame -strict unofficial "./%%~ni.mp3"
move *"%argOut%"*.m4a OLD\ >> %DFDirectory%log.txt
echo MP3変換完了%date%_%time%_"%argOut%" >> %DFDirectory%log.txt
goto end

:usage
echo "RajiruRec.bat JOAK 0:01:00 NHK深夜便"
echo "RajiruRec.bat JOZZ3AU-FM 0:01:00 JCBA_FM西東京"
echo "RajiruRec.bat AG 0:01:00 超A&G!"

:end

D:\RajiruRec\にて実行する設定になっています
途中で回線が切断されても時間計算して再録音し最後にmp3に変換するようになっています。
-起動例-
RajiruRec.bat JOAK 1:00:00 NHK深夜便
RajiruRec.bat JOAK 録音時間1時間 録音番組名(ファイル名に含まれます)
コールサインが引数になってます。
R1東京はJOAK、R2東京はJOAB
JCBA系列のFM西東京はJOZZ3AU-FM
他のエリアは下記のURLを参考にバッチファイルを変更してください
参考URL https://radioserver2.jimdo.com/
超A&G!はAGです

Time.vbs

' CScript Time.vbs /r:0:01:00
' CScript Time.vbs /d:2016/12/14 /t:18:47:44

Option Explicit
Dim argRecTime
Dim value
dim gRecTime
dim argDay
dim argTime
Dim aNamed
Set aNamed = WScript.Arguments.Named

argRecTime = WScript.Arguments.Named.Item("r")
argDay = WScript.Arguments. Named.Item("d")
argTime = WScript.Arguments. Named.Item("t")

if not (argRecTime = "") Then

    '引数で指定の録音時間を日時属性に変換
    gRecTime = TimeValue(argRecTime)

    '録音終了日時を求める
    Dim gEndDate
    gEndDate = Now() + gRecTime
    WScript.Echo gEndDate

End If

if not (argDay = "") Then

    '引数で指定の録音時間を日時属性に変換

    argDay = DateValue(argDay)

    if (argTime = "") Then
        argRecTime = argDay
    Else
        argRecTime = TimeValue(argTime)
        argRecTime = argDay + argRecTime
    End If

    '録音秒数をrtmpdumpの引数形式(秒数)にする
    gRecTime = argRecTime - Now()
    if (gRecTime > 0) Then
        gRecTime = Hour(gRecTime) * 60 * 60 + Minute(gRecTime) * 60 + Second(gRecTime) + 20
        '20秒ほどマージンを設けることで録音終了時の誤差でリトライにいってしまうことを防止する。
    Else
        gRecTime ="EXIT"
    End If
    WScript.Echo gRecTime

End If

録音時間計算のスプリクトです。バッチファイルで時間計算は大変なのでWSHで処理します

2016年12月28日 修正しました

Time.vbsにバグがありました

 

schtasks.bat

goto kome

/sc 種類 	スケジュールの種類を指定する。指定できる種類は次の通り。
種類 	内容
MINUTE 	分単位でスケジュールを指定
HOURLY 	時間単位でスケジュールを指定
DAILY 	日単位でスケジュールを指定
WEEKLY 	週単位でスケジュールを指定
MONTHLY 	月単位でスケジュールを指定
ONCE 	指定した日時に一回限り実行
ONSTART 	システム起動ごとに実行
ONLOGON 	ログオンごとに実行
ONIDLE 	アイドル状態が一定時間続いた場合に実行

/d 日 	曜日または日にちを指定する。 スケジュールの種類が「WEEKLY」、または「MONTHLY」の場合に有効。
曜日は以下のように3文字で表す。
値 	内容
MON 	月曜日
TUE 	火曜日
WED 	水曜日
THU 	木曜日
FRI 	金曜日
SAT 	土曜日
SUN 	日曜日
スケジュールの種類と指定できる値は次の通り。
WEEKLYの場合 MON~SUN、あるいは「*(毎日)」。 省略時は「/d MON」を指定したとみなされる。
MONTHLYの場合 1~31の数字。省略時は「/d 1」 を指定したとみなされる。「/mo」オプションに
FIRST、SECOND、THIRD、FOURTH、LAST が指定されている場合は、必ず「/d」オプションで曜日を指定する。

SCHTASKS /CREATE /TN "NHK今日は一日アニソン三昧" /TR "D:\RajiruRec\RajiruRec.bat JOAK-FM 16:04:00 NHK今日は一日アニソン三昧" /sd 2016/04/30 /st 08:58 /sc once

:kome
SCHTASKS /CREATE /TN "NHK深夜便0005" /TR "D:\RajiruRec\RajiruRec.bat JOAK 0:57:00 NHK深夜便" /SC WEEKLY /d * /ST 00:04

pause

タスクスケジューラを使って予約する為のバッチファイル
(schtasks.batは管理者として実行してください)

以上2つの実行ファイルと2つのバッチファイルと1つのvbsファイルと同じフォルダに置いて(上記の例ではD:\RajiruRec)
schtasks.batに録音したい番組を記入してタスクスケジューラに登録して実行する形になります。
タスクスケジューラにて実行するため後日動作確認する時用に実行フォルダにLOGを残す動きになっています。時々ファイルを削除してください

このスプリクトは試験的なもので要望など、いかなるサポートも行いません。 録音失敗や何らかの、いかなる損害が発生しても、苦情などを一切受け付けません。全て自己責任で利用してください。

関連記事

radiko.jpをバッチファイルとWSHで録音する


radiko.jpをバッチファイルとWSHで録音する


以前の記事でradiko.jpを録音する方法を記事にした。
その時、github.comのbooskaのRadikoを録音するWSHのスプリクトを利用することで録音することを紹介していた。しかし、booskaさんのソースは公開中止になって現在Windows環境で動くスプリクトは他に見当たらなくなってしまった。

いろいろ検討した結果、booskaさんのスプリクトを参照してバッチファイルとWSHで作成した。現在動作確認中だがほぼ利用可能な状況になったのでここに紹介することにする

作成はWindows 10環境で作成しています。動作確認はWindows 7です。

利用にあたって
rtmpdump.exe
https://github.com/K-S-V/Scripts/releases

wget.exe
https://eternallybored.org/misc/wget/

swfextract.exe
http://www.swftools.org/download.html
swfextract.exeはSWFToolsをインストールしたフォルダにあります。

ffmpeg.exe
http://hp.vector.co.jp/authors/VA020429/ffmpeg/ffmpeg.html
https://ffmpeg.org/

各種実行ファイルを集めて一つのフォルダに置いてください

RadikoRec.bat

@echo off

REM rtmpdumpなどの位置のドライブ
set drive=D:

REM rtmpdumpなどの位置(最後に\を)
set DFDirectory=D:\RadikoRec\

REM 録音ファイルの保存のドライブ
set argdrive=D:

REM 録音ファイルの保存先(最後に\を)
set argDirectory=D:\RadikoRec\rec\

set RTMPDUMP=rtmpdump.exe
set AYTHKeyGet=AYTHKeyGet.vbs
set argOut = "out"
set RTMPSERVER=rtmpe://f-radiko.smartstream.ne.jp:1935

%drive%
cd %DFDirectory%

rem 録音ファイルの保存先フォルダチェックと作成
IF NOT EXIST "%argDirectory%" (md %argDirectory%)
IF NOT EXIST "%argDirectory%OLD" (md %argDirectory%OLD)

set ch=%1
if "%1"=="" goto usage
if not "%2"=="" set argSTOPSEC=%2
if "%2"=="" goto usage
if not "%3"=="" set argOut=%3

rem 録音終了日時を求める
for /f "tokens=1,2" %%i in ('CScript Time.vbs /r:%argSTOPSEC%') do (
  SET AUTHTOKEN_D=%%i
  SET AUTHTOKEN_T=%%j
)

set loopck=0

:loop

for /f %%i in ('CScript %AYTHKeyGet% %ch%') do SET AUTHTOKEN=%%i

rem 録音時間を秒に変換
for /f %%i in ('CScript Time.vbs /d:%AUTHTOKEN_D% /t:%AUTHTOKEN_T%') do SET AUTHTOKEN_END=%%i
set STOPSEC=--stop %AUTHTOKEN_END%

if "%loopck%" == "0" set FLV_loop=
if "%loopck%" geq "1" set FLV_loop=(%loopck%)

set yyyymmdd=%date: =0%
set hhmmss=%time: =0%
set YMD=%yyyymmdd:~0,4%%yyyymmdd:~5,2%%yyyymmdd:~8,2%_%hhmmss:~0,2%%hhmmss:~3,2%%hhmmss:~6,2%
set FLV=%YMD%_%ch%_%argOut%
set RADI=%RTMPDUMP% -q -flashVer "WIN 15,0,0,152" -v -r "%RTMPSERVER%" --playpath "simul-stream.stream" --app "%ch%/_definst_" -C S:"" -C S:"" -C S:"" -C S:%AUTHTOKEN% --live --timeout 10 --flv "%argDirectory%%FLV%%FLV_loop%.flv" %STOPSEC%

echo 録音開始%date%_%time%_"%~3" >> log.txt
echo 「%ch%」の「%argOut%」を録音開始、録音時間は「%argSTOPSEC%」
echo %RADI%
%RADI%
echo 録音停止%date%_%time%_"%~3" >> log.txt

for /f %%i in ('CScript Time.vbs /d:%AUTHTOKEN_D% /t:%AUTHTOKEN_T%') do SET AUTHTOKEN_EXIT=%%i
if "%AUTHTOKEN_EXIT%" == "EXIT" goto loopEXIT
if "%loopck%" geq "20" goto loopEXIT
set /a loopck=loopck+1

REM Sleep[15秒数]
set /a wtime=15*1000
echo WScript.Sleep %wtime% > tmp.vbs
cscript //NoLogo tmp.vbs
del tmp.vbs
set wtime=
REM ***

goto loop

:loopEXIT

%argdrive%
cd %argDirectory%
for %%F in (*.flv) do goto FILE_EXIST
echo エラーファイルが無い%date%_%time%_%argOut% >> %DFDirectory%log.txt
goto end

:FILE_EXIST
echo MP3変換開始%date%_%time%_"%argOut%" >> %DFDirectory%log.txt
REN *"%argOut%"*.flv *.m4a
for %%i in (*"%argOut%"*.m4a) do %DFDirectory%ffmpeg.exe  -y -i "./%%~ni.m4a" -vn -acodec libmp3lame -strict unofficial "./%%~ni.mp3"
move *"%argOut%"*.m4a OLD\ >> %DFDirectory%log.txt
echo MP3変換完了%date%_%time%_"%argOut%" >> %DFDirectory%log.txt
goto end

:usage
echo "RadikoRec.bat TBS 1:00:00 菊地成孔の粋な夜電波"
:end

D:\RadikoRec\にて実行する設定になっています
途中で回線が切断されても時間計算して再録音し最後にmp3に変換するようになっています。
-起動例-
radiko.bat TBS 1:00:00 菊地成孔の粋な夜電波
radiko.bat TBS 録音時間1時間 録音番組名(ファイル名に含まれます)

AYTHKeyGet.vbs

Option Explicit

Dim argStation,argDebug,argSilent
argStation = "TBS"	'引数1(i):radiko.jp内の放送局のid
argDebug = "no"		'引数(deb):“yes”なら、動作の途中経過を逐次表示する
argSilent = "yes"	'引数(cilent):"yes"なら、外部コマンドであるwgetやrtmpdumpの実行プロンプトを表示しない

Dim i
Dim strCmd
Dim aUnnamed
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)
    End Select
  Next
End If

'シェル起動オブジェクトを生成
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")

  strCmd = GetRadikoCmd()

WScript.Quit(0)

'Radiko.jpの独自認証を行う
Function GetRadikoCmd()

  Dim playerurl,pSwfPlayer,pKeyFile,RtnCD,auth1_fms,auth2_fms
  'playerurl = "http://radiko.jp/player/swf/player_4.0.0.00.swf"
  playerurl = "http://radiko.jp/apps/js/flash/myplayer-release.swf"

  Dim pTmpName
  pTmpName = WSHFS.GetTempName()
  pSwfPlayer = "player_" & argStation & pTmpName & ".swf"
  pKeyFile = "authkey_" & argStation & pTmpName & ".png"
  auth1_fms = "auth1_fms_" & argStation & pTmpName
  auth2_fms = "auth2_fms_" & argStation & pTmpName

  '認証ステップ1:Radikoのswfプレイヤーをplayer.swfというファイル名でダウンロード
  RtnCD = WSHShell.run("wget.exe -q --timeout=60 --tries=10 -O """ & pSwfPlayer & """ """ & playerurl & """",gShellStyle,True)
  If RtnCD <> 0 Then
    GetRadikoCmd = "error 認証ステップ1:player.swfの取得失敗!"
    Exit Function
  Else
    If argDebug = "yes" Then WScript.Echo "認証ステップ1:player.swfの取得成功"
  End If

  '認証ステップ2:player.swfからauthkey.pngを抜き出す
  RtnCD = WSHShell.run("swfextract.exe" & " -b 12 """ & pSwfPlayer & """ -o """ & pKeyFile & """",gShellStyle,True)
  If RtnCD <> 0 Then
    GetRadikoCmd = "error 認証ステップ2:authkey.pngの抜き出し失敗!"
    Exit Function
  Else
    If argDebug = "yes" Then WScript.Echo "認証ステップ2:authkey.pngの抜き出し成功"
  End If

  '認証ステップ3:auth1_fmsを取得
  RtnCD = WSHShell.run("wget.exe -q --timeout=60 --tries=10" _
      & " --header=""pragma: no-cache""" _
      & " --header=""X-Radiko-App: pc_ts""" _
      & " --header=""X-Radiko-App-Version: 4.0.0""" _
      & " --header=""X-Radiko-User: test-stream""" _
      & " --header=""X-Radiko-Device: pc""" _
      & " --post-data=""\r\n""" _
      & " --no-check-certificate" _
      & " --save-headers https://radiko.jp/v2/api/auth1_fms" _
      & " -O """ & auth1_fms & """",gShellStyle,True)
  If RtnCD <> 0 Then
    GetRadikoCmd = "error 認証ステップ3:auth1_fmsファイルの取得失敗!"
    Exit Function
  Else
    If argDebug = "yes" Then WScript.Echo "認証ステップ3:auth1_fmsファイルの取得成功"
  End If

  '認証ステップ4:auth1_fmsから、authtoken,length,offsetを読み取る
  Dim pFile
  Dim pLine
  Dim pAuthtoken,pLength,pOffset
  Set pFile = WSHFS.OpenTextFile(auth1_fms,1)
  Do While pFile.AtEndOfStream = False
    pLine = pFile.ReadLine
    If InStr(LCase(pLine),"x-radiko-authtoken=") <> 0 Then
      pAuthtoken = mid(pLine,InStr(pLine,"=")+1,len(pLine)-InStr(pLine,"="))
    ElseIf InStr(LCase(pLine),"x-radiko-keylength=") <> 0 Then
      pLength = mid(pLine,InStr(pLine,"=")+1,len(pLine)-InStr(pLine,"="))
    ElseIf InStr(LCase(pLine),"x-radiko-keyoffset=") <> 0 Then
      pOffset = mid(pLine,InStr(pLine,"=")+1,len(pLine)-InStr(pLine,"="))
    End If
  Loop
  pFile.Close

  If argDebug = "yes" Then WScript.Echo "認証ステップ4:x-radiko-authtoken=" & pAuthtoken & " ,x-radiko-keylength=" & pLength & " ,x-radiko-keyoffset=" & pOffset

  '認証ステップ5:authkey.pngのoffsetのlengthの内容から、base64の値であるpartialkeyを求める
  Dim pXmldom,pB64,pStream,partialkey

  Set pXmldom = CreateObject("Microsoft.XMLDOM")
  Set pB64 = pXmldom.CreateElement("work")
  pB64.DataType = "bin.base64"

  Set pStream = CreateObject("ADODB.Stream")
  pStream.Type = 1
  pStream.Open
  pStream.LoadFromFile pKeyFile
  pStream.position = pOffset
  pB64.NodeTypedValue = pStream.Read(pLength)

  partialkey = pB64.Text
  pStream.Close
  Set pStream = Nothing

  If argDebug = "yes" Then WScript.Echo "認証ステップ5:partialkey=" & partialkey

  '認証ステップ6:上記で求めたキーからauthtokenとpartialkeyをradikoに送り認証を成立させる
  Dim key
  RtnCD = WSHShell.run("wget.exe -q --timeout=60 --tries=10" _
      & " --header=""pragma: no-cache""" _
      & " --header=""X-Radiko-App: pc_ts""" _
      & " --header=""X-Radiko-App-Version: 4.0.0""" _
      & " --header=""X-Radiko-User: test-stream""" _
      & " --header=""X-Radiko-Device: pc""" _
      & " --header=""X-Radiko-Authtoken: " & pAuthtoken & """"_
      & " --header=""X-Radiko-Partialkey: " & partialkey & """"_
      & " --post-data=""\r\n""" _
      & " --no-check-certificate" _
      & " https://radiko.jp/v2/api/auth2_fms" _
      & " -O """ & auth2_fms & """",gShellStyle,True)
  If RtnCD <> 0 Then
    GetRadikoCmd = "error 認証ステップ6:authtokenとpartialkeyの失敗!"
    Exit Function
  Else
    If argDebug = "yes" Then WScript.Echo "認証ステップ6:authtokenとpartialkeyの送信成功"
  End If
  'テンポラリファイルを消す
  If argDebug <> "yes" Then
    WSHFS.DeleteFile pSwfPlayer, True
    WSHFS.DeleteFile pKeyFile, True
    WSHFS.DeleteFile auth1_fms, True
    WSHFS.DeleteFile auth2_fms, True
  End If

        WScript.Echo(pAuthtoken)

End Function

radiko.batと同じ場所においてください
この部分はbooskaさんのスプリクトを参考しました

Time.vbs

' CScript Time.vbs /r:0:01:00
' CScript Time.vbs /d:2016/12/14 /t:18:47:44

Option Explicit
Dim argRecTime
Dim value
dim gRecTime
dim argDay
dim argTime
Dim aNamed
Set aNamed = WScript.Arguments.Named

argRecTime = WScript.Arguments.Named.Item("r")
argDay = WScript.Arguments. Named.Item("d")
argTime = WScript.Arguments. Named.Item("t")

if not (argRecTime = "") Then

    '引数で指定の録音時間を日時属性に変換
    gRecTime = TimeValue(argRecTime)

    '録音終了日時を求める
    Dim gEndDate
    gEndDate = Now() + gRecTime
    WScript.Echo gEndDate

End If

if not (argDay = "") Then

    '引数で指定の録音時間を日時属性に変換

    argDay = DateValue(argDay)

    if (argTime = "") Then
        argRecTime = argDay
    Else
        argRecTime = TimeValue(argTime)
        argRecTime = argDay + argRecTime
    End If

    '録音秒数をrtmpdumpの引数形式(秒数)にする
    gRecTime = argRecTime - Now()
    if (gRecTime > 0) Then
        gRecTime = Hour(gRecTime) * 60 * 60 + Minute(gRecTime) * 60 + Second(gRecTime) + 20
        '20秒ほどマージンを設けることで録音終了時の誤差でリトライにいってしまうことを防止する。
    Else
        gRecTime ="EXIT"
    End If
    WScript.Echo gRecTime

End If

録音時間計算のスプリクトです。バッチファイルで時間計算は大変なのでWSHで処理します

2016年12月28日 修正しました

Time.vbsにバグがありました

TBS_schtasks.bat

goto kome

/sc 種類 	スケジュールの種類を指定する。指定できる種類は次の通り。
種類 	内容
MINUTE 	分単位でスケジュールを指定
HOURLY 	時間単位でスケジュールを指定
DAILY 	日単位でスケジュールを指定
WEEKLY 	週単位でスケジュールを指定
MONTHLY 	月単位でスケジュールを指定
ONCE 	指定した日時に一回限り実行
ONSTART 	システム起動ごとに実行
ONLOGON 	ログオンごとに実行
ONIDLE 	アイドル状態が一定時間続いた場合に実行

/d 日 	曜日または日にちを指定する。 スケジュールの種類が「WEEKLY」、または「MONTHLY」の場合に有効。
曜日は以下のように3文字で表す。
値 	内容
MON 	月曜日
TUE 	火曜日
WED 	水曜日
THU 	木曜日
FRI 	金曜日
SAT 	土曜日
SUN 	日曜日
MON,TUE,WED,THU,FRI,SAT,SUN
スケジュールの種類と指定できる値は次の通り。
WEEKLYの場合 MON~SUN、あるいは「*(毎日)」。 省略時は「/d MON」を指定したとみなされる。
MONTHLYの場合 1~31の数字。省略時は「/d 1」 を指定したとみなされる。「/mo」オプションに
FIRST、SECOND、THIRD、FOURTH、LAST が指定されている場合は、必ず「/d」オプションで曜日を指定する。

TBS
QRR
LFR
RN1
RN2
INT
FMT
FMJ
JORF
BAYFM78
NACK5
YFM
HOUSOU-DAIGAKU

:kome

SCHTASKS /CREATE /TN "TBS_菊地成孔の粋な夜電波" /TR "D:\RadikoRec\RadikoRec.bat TBS 1:01:00 菊地成孔の粋な夜電波" /SC WEEKLY /d FRI /ST 23:59

pause

タスクスケジューラを使って予約する為のバッチファイル
(schtasks.batは管理者として実行してください)

以上4つの実行ファイルと2つのバッチファイルと2つのvbsファイルと同じフォルダに置いて(上記の例ではD:\RadikoRec)
TBS_schtasks.batに録音したい番組を記入してタスクスケジューラに登録して実行する形になります。
タスクスケジューラにて実行するため後日動作確認する時用に実行フォルダにLOGを残す動きになっています。時々ファイルを削除してください

このスプリクトは試験的なもので要望など、いかなるサポートも行いません。 録音失敗や何らかの、いかなる損害が発生しても、苦情などを一切受け付けません。全て自己責任で利用してください。

関連記事

らじる★らじるをバッチファイルとWSHで録音する


radiko.jpをデバイスを指定して再生する


前回の記事で仮想オーディオデバイスを追加したり

仮想オーディオデバイスWsAudioDeviceSを追加する


録音ソフトを検証したりした

radiko.jpのタイムフリーの録音ソフトを検証する


前回の記事で仮想オーディオデバイスを指定してradiko.jpを指定して再生すれば5局まで同時録音できることを説明したが今回、デバイスを指定して再生する事を記事にしたい。

デバイスを指定して再生するにはrtmpdumpとmplayerをコマンドプロンプトで使用する

rtmpdump
https://github.com/K-S-V/Scripts/releases

mplayer
http://mplayerwin.sourceforge.net/downloads.html

フォルダを作成して解凍して同じ場所に配置する

listen_radiko_TBS.bat

set ch=TBS
for /f %%i in ('AYTHKeyGet.bat') do SET AUTHTOKEN=%%i

rtmpdump -q -flashVer "適当な文字列" -vr "rtmpe://w-radiko.smartstream.ne.jp:1935/%ch%/_definst_/simul-stream.stream" -f " " -C S:"" -C S:"" -C S:"" -C S:%AUTHTOKEN% | mplayer -cache 128 -ao dsound:device=6 )

上記のバッチファイルを作成する
set ch=TBSでチャンネル設定。
AYTHKeyGet.batでAuthTokenの取得を行う。詳しくは後ほど説明する。
mplayer -cache 128 -ao dsound:device=6のdsound:device=6の任意の数字でデバイスを指定する。サウンドの設定で番号はコロコロ変わるので注意必要だ

AYTHKeyGet.bat

CScript AYTHKeyGet.vbs

上記のバッチファイルを作成する

AYTHKeyGet.vbs

–2016年12月15日修正–
元のRadikoを録音するWSHが公開を停止したためソースを削除しました。下記の記事でAYTHKeyGet.vbsを公開してますので参照してください。

radiko.jpをバッチファイルとWSHで録音する

 

上記のスプリクトファイルを作成する
上記のスプリクトは前回の記事で紹介したスプリクトのAuthTokenの取得だけ切り取ってAuthTokenを返すようにしてある

radiko.jpを録音する


こちらの記事の
Radikoを録音するWSH
https//gist.github.com/booska/8861693
から引用した。
もちろんこのスプリクトの指示通りswfextract.exeやwget.exe を取得して使える状態にする必要がある。

これらのファイルを用意してlisten_radiko_TBS.batを実行すると仮想オーディオデバイスにTBSラジオが再生される。もちろん地域によって聞けるチャンネルは違うので任意のチャンネルを指定してください。

 


仮想オーディオデバイスWsAudioDeviceSを追加する


radiko.jpのタイムフリーを仮想オーディオデバイスで録音する(Win10対応)


前回の記事で仮想オーディオデバイスWsAudioDeviceSをインストールしたが更に仮想オーディオデバイスを増やす手順を記事にしたい


WIN10の場合設定→デバイス→デバイスマネージャーを開きコンピュータ名を右クリックしレガシハードウェアの追加をクリックする

次へをクリック

一覧から選択したハードウェアをインストールするをクリックし次へをクリック

次へをクリック

詳細をクリック

ドライバはAimersoft DRM Converterに同梱されてるのでAimersoft DRM Converterをインストールした時に指定したフォルダーに入ってる。Win10の場合はC:\Program Files (x86)\Aimersoft\DRM Media Converter\Driverに入っている

Driverフォルダーには32bit版と64bit版が入ってる。32bitはx86。64bitはamd64を指定する。それぞれのフォルダを指定して前のファイルの場所の画面でVirtualAudio_1.inf(5まで)などをのファイルをクリックして開くをクリック

WsAudioDeviceS(1)(5まで)などを選択して次へをクリック

次へをクリック

完了をクリック

Win10の場合、設定→個人用設定→テーマ→サウンドの詳細設定→再生
をクリックするとサウンドの設定画面が出てWsAudioDeviceSが追加される

それぞれのデバイスを指定して再生し指定して録音すると5局まで同時録音できる。次回の記事ではデバイスを指定して再生することを記事にしたい。

記事を追加しました

radiko.jpをデバイスを指定して再生する

関連記事

radiko.jpのタイムフリーの録音ソフトを検証する


radiko.jpのタイムフリーの録音ソフトを検証する


前回の記事で仮想オーディオデバイスWsAudioDeviceSをインストールしループバックで録音しモニターする環境を構築した。

radiko.jpのタイムフリーを仮想オーディオデバイスで録音する(Win10対応)

今回フリーの録音ソフトを検証していきたい
まずは手軽に使えるぽけっとれこーだーを紹介したい

http://www.vector.co.jp/soft/win95/art/se096521.html
コントロールパネルのサウンドの録音にしてしてあるデバイスをwav形式で録音する。録音後mp3などに変換しなければならないが画面の赤丸●の録音ボタン押すだけで録音できる、停止は■の停止を押す。タイマー機能もあるので安心だ。

次にHDRecorder

http://www.vector.co.jp/soft/winnt/art/se247901.html
こちらのソフトは古いのでデバイス指定時にエラーが出てたが無視してそのまま使えた。こちらも録音するだけの単純機能だ。wav形式で録音する。

次にロック音MT

http://hp.vector.co.jp/authors/VA014492/
多彩な設定が出来ラジオ録音では老舗で定番アプリだ
録音後MP3などに変換などできる。
しかし多機能ゆえ操作や設定が難解である

次にS Rec

http://www.rukihena.com/soft/srec.html
こちらはゆうせんやスカパーのSTAR digioなどの音楽ラジオを録音するためのソフトだ。無音状態でファイルを分割録音してくれる。タイマー機能もある。音楽番組や日経第二など音楽を録音するのに向いてる

次にAMFMラジオ録音さん

http://koukaijo.seesaa.net/category/5895615-1.html
ラジオ録音に特化したソフトだ。もともとラジオデバイスを直接操作するソフトだがデバイス指定して録音するので仮想オーディオデバイスWsAudioDeviceSで再生してれば番組毎に録音できる

仮想オーディオデバイスWsAudioDeviceSは5個まで追加できるので5局まで対応できる。5局まで増やすには次回の記事で紹介したい。

仮想オーディオデバイスWsAudioDeviceSを追加する

さらにデバイスを指定してradiko.jpを再生しなきゃいけないのでそれも近々記事にしたい。
記事を追加しました

radiko.jpをデバイスを指定して再生する

最後に超録 – パソコン長時間録音機

https://pino.to/choroku/
フリー版は連続録音時間を90分に制限されてる。制限がない方はシェアウェア:3,348円だ。多機能で使いやすそうだがシェアウェアなのが残念だ


radiko.jpのタイムフリーを仮想オーディオデバイスで録音する(Win10対応)


radiko.jpを録音するにはいろんな手段がある。
前回記事にした

radiko.jpのタイムフリーを録音する

この記事の様にアプリで録音する手もある
しかしタイマー機能など無いので物足りない点がある

そこで仮想オーディオデバイスで録音する方法を検討する
パソコンに仮想オーディオデバイスをインストールし
その仮想オーディオデバイスで再生させることでループバックさせ
パソコン上で好きな録音ソフトにて録音させる

ここで使用する仮想オーディオデバイスは
Aimersoft DRM Converterに同梱さててる
WsAudioDeviceSだ。Win7以上の64bitOSの署名問題にも対応してる
http://www.aimersoft.com/wma-media-converter.html

Aimersoft DRM Converterは$35.95の有料ソフトだ
しかしフリートライアル版でインストール可能だ
インストール後仮想オーディオデバイスは制限なく使用可能だ

http://www.aimersoft.com/wma-media-converter.html
こちらのサイトから画像の通りDownloadをクリックしてソフトをダウンロードする

ダウンロードしたソフトを実行しNextをクリック

赤丸をクリックしてNextをクリック

インストール先の指定をしてNextをクリック
Win10の場合
C:\Program Files (x86)\Aimersoft\DRM Media Converter
にインストールされる

Nextをクリック

Installをクリック
インストール後アプリケーションAimersoft DRM Converterが起動するが使う事はないのでそのまま終了させる

インストール完了すると仮想オーディオデバイスもインストールされ既定のデバイスに指定され音が聞こえなくなる。
Win10の場合、設定→個人用設定→テーマ→サウンドの詳細設定→再生
をクリックするとサウンドの設定画面が出る。
そこの仮想オーディオデバイスWsAudioDeviceS内部で再生されてるので聞こえなくなる。既定のデバイスを元のデバイスに指定すれば元通りに再生されるが録音ができない。
そこでループバックされてる音声をモニターするソフトを使用する
猿ちぃ04
http://www.vector.co.jp/soft/win95/art/se486281.html

ダウンロードし解凍すると実行ファイルが猿ちぃ04だ
画像の通りInにWsAudioDeviceSを指定
画像の通りOutに再生するデバイス
その後Startをクリックすると音声がモニターされ聞こえる

これで再生しながら録音もできる環境が整った
次回記事では録音ソフトを検証して行きたい

radiko.jpのタイムフリーの録音ソフトを検証する


radiko.jpのタイムフリーを録音する


radiko.jpの録音方法はいろいろある。
サウンドカードにステレオミキサーがあればループバックという手法でパソコンの音が録音できる。しかし対応してるサウンドカードは一部だ。
そこでパソコンの音を録音するアプリを利用して録音する方法を今回紹介したい。

使用するソフトは Moo0 ボイス録音器というアプリだ
http://jpn.moo0.com/?top=http://jpn.moo0.com/software/VoiceRecorder/
こちらのサイトの真ん中にあるダウンロードからダウンロードする
ダウンロードし実行するとインストールされる
その後Moo0 ボイス録音器が起動する

操作はシンプルだ。保存先と「全てのPC音」を選択して「録音を開始!」をクリックする。するとPCの音が録音される

録音開始したらブラウザーのradiko.jpのタイムフリーのページで「再生する」をクリックして再生するだけだ。

タイムフリーの再生が完了したら終了をクリックする
時間指定できるアプリがあればまた紹介したい


radiko.jpのタイムフリー対応によるRadikaβVer1.71の修正方法


radiko.jpの録音ツールとして以前からRadikaβVer1.71を使用していた。
開発が終了した現在でも有志がAYTHKeyGet-Alternativeなど作成して延命してきた。しかし今回のradiko.jpのタイムフリー対応による修正で再び録音ができなくなった。
今回その対応をまとめたので記事にしたい。

修正する為に必要なファイルは2個だ
AYTHKeyGet-Alternativeのソースとビルドする為の無料のVisual Studio 2015だ
まずAYTHKeyGet-Alternativeのソースを入手する

https://github.com/dsuz
作者のページのAYTHKeyGet-Alternativeをクリックする

downloadをクリック

download ZIPをクリック。

https://www.microsoft.com/ja-jp/dev/products/visual-studio-2015.aspx
次に無料のVisual Studio 2015をダウンロードする

Free downloadをクリックしてダウンロードする
ダウンロード後インストールを行う
無料のVisual Studio 2015は英語版だ
しかしLanguage Pack というのを入れれば日本語が使える

Visual Studio 2015 Language Pack
https://www.microsoft.com/ja-jp/download/details.aspx?id=48157
こちらをダウンロードして実行する。その後、Visual Studio 2015実行して

メニューバーのTool → Options をクリック

Options のInternational Settingsをクリックして日本語に変更。その後OK
これでVisual Studio 2015を再起動すれば日本語化終了

次に最初の方に落としたAYTHKeyGet-Alternative-master.zipを解凍して
中に入ってるAYTHKeyGet.slnをクリック。Visual Studio 2015が起動

ソリューションエクスプローラーの中にあるswfextract.exeを削除
又はもともと持ってるswfextract.exeをAYTHKeyGetフォルダに置いてもいい

ソリューションエクスプローラーのprogramをダブルクリックしてソースを表示
下記の通りに修正
16行
const string playerURL = “http://radiko.jp/player/swf/player_4.0.0.00.swf”;
↓に変更
http://radiko.jp/apps/js/flash/myplayer-release.swf

73行
string parameterString = “-b 14 ” + swfFile + ” -o ” + pngFile;
↓に変更
“-b 12 ”

94,95行
req.Headers.Add(“X-Radiko-App: pc_1”);
req.Headers.Add(“X-Radiko-App-Version: 2.0.1”);
↓に変更
“X-Radiko-App: pc_ts”
“X-Radiko-App-Version: 4.0.0”

194,195行
req.Headers.Add(“X-Radiko-App: pc_1”);
req.Headers.Add(“X-Radiko-App-Version: 2.0.1”);
↓に変更
“X-Radiko-App: pc_ts”
“X-Radiko-App-Version: 4.0.0”

修正後保存する

その後、ツールバーのDebugReleaseに変更

メニューバーのビルドをクリックしてソリューションのビルドをクリック
ビルドに成功するとAYTHKeyGet\bin\ReleaseにAYTHKeyGet.exeが作成されます。
あとは使用OSによる適切な.net frameworkをインストールしてください
WIN7以降からは自動的にframework 3.5が有効になってるのでそのままで大丈夫だと思われます。

後は作成されたAYTHKeyGet.exeをRadikaβVer1.71のフォルダにコピーして動作すれば作業完了


radiko.jpのタイムフリーで音楽垂れ流し番組を視聴する


radiko.jpにてタイムフリーが開始された。タイムフリーとは過去一週間の放送をいつでも再びネット上で再生できるサービスだ。

使い方は簡単だ。radiko.jpのタイムフリーのボタンをクリック

すると過去一週間分の番組表が表示されるので再生したい番組をクリックするだけだ

番組表から選択すると上記の画面になるので再生するをクリックする
以前にラジオNikkei第2は神チャンネル!!って記事を書いた

radikoで聞けるラジオNikkei第2は神チャンネルに変化してた

今回のタイムフリーはもちろんNikkei第2に対応している。これは嬉しい
これで休日など競馬中継中などで音楽が流れてない時間も音楽を聴ける

再生中は再生するボタンの上に3時間のカウントがスタートする
1番組3時間しか再生できない規制がある。一時停止してもカウントが進むので注意が必要だ

関連記事を追加しました
radiko.jpのタイムフリーを録音する

radiko.jpのタイムフリーを録音する