radiko.jpのタイムフリーを一括ダウンロードバッチを改良修正した


radiko.jpのタイムフリーをバッチファイルで一括ダウンロードしてみた

前回の記事で実際に一括ダウンロードしてみたので記事を書いたがその後毎日いつ実行してもいい状況を想定して改良修正したのでここに記事にしたい

radiko.jpのタイムフリーをバッチファイルで一括ダウンロードする

AYTHKeyGet.vbsの導入は前回の記事を参考にしてください。date.vbsを追加しtimeshift_get.batを修正します。
date.vbs

' CScript date.vbs w
' CScript date.vbs /d:-6

Option Explicit
dim argDay
Dim aNamed
Set aNamed = WScript.Arguments.Named
argDay = WScript.Arguments. Named.Item("d")
Dim strFormattedDate

Dim argC
Dim i
Dim strCmd
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Dim aUnnamed
Set aUnnamed = WScript.Arguments.Unnamed
argC = ""
If aUnnamed.Count > 0 Then
  For i = 0 To aUnnamed.Count - 1
    Select Case i
      Case 0
        argC = aUnnamed.Item(i)
    End Select
  Next
End If

if not (argDay = "") Then

  dim strNow
  strNow = Now()
  strFormattedDate = DateAdd("d",argDay,strNow)
  strFormattedDate = Left(strFormattedDate, 10)
 	strFormattedDate = Replace(strFormattedDate, "/", "")
  WScript.Echo strFormattedDate 

End If

if (argC = "w") Then
  WScript.Quit(WeekDay(Date))
End If

日付計算のためのスプリクトです。

timeshift_get.bat

D:
cd \RadikoRec

set F=./rec/
REM TBS,QRR,LFR,RN1,RN2,INT,FMT,FMJ,JORF,BAYFM78,NACK5,YFM,HOUSOU-DAIGAKU

goto DAY

:MON
for /f %%i in ('CScript date.vbs /d:%dayC%') do SET D=%%i
call :get_ts TBS %D%175000 %D%180000 %F%%D%1750_週刊自動車批評
exit /b

:TUE
for /f %%i in ('CScript date.vbs /d:%dayC%') do SET D=%%i
call :get_ts TBS %D%010000 %D%030000 %F%%D%0100_JUNK_伊集院光・深夜の馬鹿力

REM 終了時間が日付をまたぐので一日足す
set /a dayC=%dayC%+1
for /f %%i in ('CScript date.vbs /d:%dayC%') do SET D2=%%i
call :get_ts RN1 %D%233000 %D2%000000 %F%%D%2330_Anime_&_Seiyu_Music_Night
exit /b

:WED
for /f %%i in ('CScript date.vbs /d:%dayC%') do SET D=%%i
call :get_ts TBS %D%010000 %D%030000 %F%%D%0100_JUNK_爆笑問題カーボーイ
call :get_ts RN2 %D%223000 %D%230000 %F%%D%2230_ライダーズ
exit /b

:THU
for /f %%i in ('CScript date.vbs /d:%dayC%') do SET D=%%i
call :get_ts TBS %D%010000 %D%030000 %F%%D%0100_JUNK_山里亮太の不毛な議論
exit /b

:FRI
for /f %%i in ('CScript date.vbs /d:%dayC%') do SET D=%%i
call :get_ts TBS %D%010000 %D%030000 %F%%D%0100_JUNK_おぎやはぎのメガネびいき
call :get_ts LFR %D%010000 %D%030000 %F%%D%0100_LFR_ナインティナイン_岡村のオールナイトニッポン
exit /b

:SAT
for /f %%i in ('CScript date.vbs /d:%dayC%') do SET D=%%i
call :get_ts TBS %D%010000 %D%030000 %F%%D%0100_JUNK_バナナマンのバナナムーンGOLD

call :get_ts FMT %D%170000 %D%175000 %F%%D%1700_MITSUBISHI_MOTORS_ピートのふしぎなガレージ
call :get_ts TBS %D%130000 %D%145500 %F%%D%1300_久米宏_ラジオなんですけど
call :get_ts QRR %D%210000 %D%230000 %F%%D%2100_A&G_TRIBAL_RADIO_エジソン

REM 終了時間が日付をまたぐので一日足す
set /a dayC=%dayC%+1
for /f %%i in ('CScript date.vbs /d:%dayC%') do SET D2=%%i
call :get_ts QRR %D%230000 %D2%000000 %F%%D%2300_A&Gメディアステーション_こむちゃっとカウントダウン
exit /b

:SUN
for /f %%i in ('CScript date.vbs /d:%dayC%') do SET D=%%i
call :get_ts TBS %D%130000 %D%170000 %F%%D%1300_爆笑問題の日曜サンデー
exit /b


REM ここから処理部分
:DAY
cscript /b date.vbs w
if %errorlevel%==7 set WDAY=SAT
if %errorlevel%==6 set WDAY=FRI
if %errorlevel%==5 set WDAY=THU
if %errorlevel%==4 set WDAY=WED
if %errorlevel%==3 set WDAY=TUE
if %errorlevel%==2 set WDAY=MON
if %errorlevel%==1 set WDAY=SUN

if "%WDAY%" == "MON" (
  set /a dayC=-6
  call :TUE
  set /a dayC=-5
  call :WED
  set /a dayC=-4
  call :THU
  set /a dayC=-3
  call :FRI
  set /a dayC=-2
  call :SAT
  set /a dayC=-1
  call :SUN
  set /a dayC=0
  call :MON
  exit
)

if "%WDAY%" == "TUE" (
  set /a dayC=-6
  call :WED
  set /a dayC=-5
  call :THU
  set /a dayC=-4
  call :FRI
  set /a dayC=-3
  call :SAT
  set /a dayC=-2
  call :SUN
  set /a dayC=-1
  call :MON
  set /a dayC=0
  call :TUE
  exit
)

if "%WDAY%" == "WED" (
  set /a dayC=-6
  call :THU
  set /a dayC=-5
  call :FRI
  set /a dayC=-4
  call :SAT
  set /a dayC=-3
  call :SUN
  set /a dayC=-2
  call :MON
  set /a dayC=-1
  call :TUE
  set /a dayC=0
  call :WED
  exit
)

if "%WDAY%" == "THU" (
  set /a dayC=-6
  call :FRI
  set /a dayC=-5
  call :SAT
  set /a dayC=-4
  call :SUN
  set /a dayC=-3
  call :MON
  set /a dayC=-2
  call :TUE
  set /a dayC=-1
  call :WED
  set /a dayC=0
  call :THU
  exit
)

if "%WDAY%" == "FRI" (
  set /a dayC=-6
  call :SAT
  set /a dayC=-5
  call :SUN
  set /a dayC=-4
  call :MON
  set /a dayC=-3
  call :TUE
  set /a dayC=-2
  call :WED
  set /a dayC=-1
  call :THU
  set /a dayC=0
  call :FRI
  exit
)

if "%WDAY%" == "SAT" (
  set /a dayC=-6
  call :SUN
  set /a dayC=-5
  call :MON
  set /a dayC=-4
  call :TUE
  set /a dayC=-3
  call :WED
  set /a dayC=-2
  call :THU
  set /a dayC=-1
  call :FRI
  set /a dayC=0
  call :SAT
  exit
)

if "%WDAY%" == "SUN" (
  set /a dayC=-6
  call :MON
  set /a dayC=-5
  call :TUE
  set /a dayC=-4
  call :WED
  set /a dayC=-3
  call :THU
  set /a dayC=-2
  call :FRI
  set /a dayC=-1
  call :SAT
  set /a dayC=0
  call :SUN
  exit
)

echo date.vbs処理エラー
pause

:get_ts

set ch=%1
set ft=%2
set to=%3
set AYTHKeyGet=AYTHKeyGet.vbs
del timeshift.m3u8

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

wget -q --header="pragma: no-cache" --header="Content-Type: application/x-www-form-urlencoded" --header="X-Radiko-AuthToken: %AUTHTOKEN%" --header="Referer: http://radiko.jp/apps/js/flash/myplayer-release.swf" --post-data='flash=1' --no-check-certificate -O timeshift.m3u8  "https://radiko.jp/v2/api/ts/playlist.m3u8?l=15&station_id=%ch%&ft=%ft%&to=%to%"

for /f %%i in ('find "radiko" timeshift.m3u8') do SET PLAYLIST_URL=%%i

REM ffmpeg -headers "X-Radiko-AuthToken: %AUTHTOKEN%" -i %PLAYLIST_URL% "%4.m4a"
ffmpeg -headers "X-Radiko-AuthToken: %AUTHTOKEN%" -i %PLAYLIST_URL% "%4.ts"

exit /b

毎日いつ実行してもいい状況を想定して書いてあります。
F=./rec/は録音ファイルのフォルダー名です。
MON(月)TUE(火)WED(水)THU(木)FRI(金)SAT(土)SUN(日)
なと曜日でダウンロードしたい日に番組を指定していきます。
get_ts 局名 開始時間 終了時間 録音ファイル名 です
EXITでバッチが終了します。
タイムフリーは一週間分しかダウンロードできません。ラジコプレミアムに加入してればどの地域の人でもダウンロードできます。

radiko.jpのラジコプレミアムに対応した


こちらを参照してください。

 


久しぶりにジェベル250xcを動かすが中々始動しない


ジェベル250xcを友人から譲ってもらったが保険が切れて動かしてない。メンテの為時々エンジンを動かしてる。
しかし、寒い日が続いてる最近は中々エンジンが始動しない。
ジェベル250xcはバッテリーが小さい為連続して1分もセルを回すとバッテリーが上がってしまう。

そこでアルトとブースターケーブルで繋いでセルを回す
キュルキュルと5分ぐらいセルを回してやっと始動する
一カ月ぐらい回してなかったせいだろうか?
寒い日はしょうがない。しばらくエンジンを回してエンジンを温める。

再び乗る日の為に家の中に入れて大切に保管している。


radiko.jpのタイムフリーをバッチファイルで一括ダウンロードしてみた


2017年02月20日記事を追加しました。

radiko.jpのタイムフリーを一括ダウンロードバッチを改良修正した

radiko.jpのタイムフリーをバッチファイルで一括ダウンロードする

前回、radiko.jpのタイムフリーをバッチファイルで一括ダウンロードすることを検証して記事にしたが実際に一括ダウンロードはしてなかった。今回実際に一括ダウンロードしてみたので記事にするAYTHKeyGet.vbsの導入は前回の記事を参考にしてください。timeshift_get.batだけ修正します。

timeshift_get.bat

D:
cd \RadikoRec

set F=./rec/
REM TBS,QRR,LFR,RN1,RN2,INT,FMT,FMJ,JORF,BAYFM78,NACK5,YFM,HOUSOU-DAIGAKU

set D=20170131
call :get_ts TBS %D%010000 %D%030000 %F%%D%0100_JUNK_伊集院光・深夜の馬鹿力
set D2=20170201
call :get_ts RN1 %D%233000 %D2%000000 %F%%D%2330_Anime_&_Seiyu_Music_Night
set D=20170201
call :get_ts TBS %D%010000 %D%030000 %F%%D%0100_JUNK_爆笑問題カーボーイ
set D=20170202
call :get_ts TBS %D%010000 %D%030000 %F%%D%0100_JUNK_山里亮太の不毛な議論
set D=20170203
call :get_ts TBS %D%010000 %D%030000 %F%%D%0100_JUNK_おぎやはぎのメガネびいき
set D=20170204
call :get_ts TBS %D%010000 %D%030000 %F%%D%0100_JUNK_バナナマンのバナナムーンGOLD
call :get_ts FMT %D%170000 %D%175000 %F%%D%1700_MITSUBISHI_MOTORS_ピートのふしぎなガレージ
call :get_ts TBS %D%130000 %D%145500 %F%%D%1300_久米宏_ラジオなんですけど
call :get_ts QRR %D%210000 %D%230000 %F%%D%2100_A&G_TRIBAL_RADIO_エジソン
set D2=20170205
call :get_ts QRR %D%230000 %D2%000000 %F%%D%2300_A&Gメディアステーション_こむちゃっとカウントダウン
set D=20170205
call :get_ts TBS %D%130000 %D%170000 %F%%D%1300_爆笑問題の日曜サンデー
EXIT

:get_ts

set ch=%1
set ft=%2
set to=%3
set AYTHKeyGet=AYTHKeyGet.vbs
del timeshift.m3u8

REM for /f %%i in ('CScript %AYTHKeyGet% "%ch%&ft=%ft%&to=%to%"') do SET AUTHTOKEN=%%i
for /f %%i in ('CScript %AYTHKeyGet% %ch%') do SET AUTHTOKEN=%%i

wget -q --header="pragma: no-cache" --header="Content-Type: application/x-www-form-urlencoded" --header="X-Radiko-AuthToken: %AUTHTOKEN%" --header="Referer: http://radiko.jp/apps/js/flash/myplayer-release.swf" --post-data='flash=1' --no-check-certificate -O timeshift.m3u8  "https://radiko.jp/v2/api/ts/playlist.m3u8?l=15&station_id=%ch%&ft=%ft%&to=%to%"

for /f %%i in ('find "radiko" timeshift.m3u8') do SET PLAYLIST_URL=%%i

ffmpeg -headers "X-Radiko-AuthToken: %AUTHTOKEN%" -i %PLAYLIST_URL% "%4.ts"

exit /b

2月6日に実行することを想定して書いてあります。
D=20170131はダウンロードしたい日です。
F=./rec/は録音ファイルのフォルダー名です。
get_ts 局名 開始時間 終了時間 録音ファイル名 です
EXITでバッチが終了します。
タイムフリーは一週間分しかダウンロードできません。ラジコプレミアムに加入してればどの地域の人でもダウンロードできます。

radiko.jpのラジコプレミアムに対応した


こちらを参照してください。

 

 


radiko.jpのラジコプレミアムに対応した


前回の記事でradiko.jpのタイムフリーのダウンロードに対応したが
radiko.jpのタイムフリーをバッチファイルで一括ダウンロードする

radiko.jpのタイムフリーをバッチファイルで一括ダウンロードする

今回、radiko.jpのラジコプレミアムに対応できるように修正することにした。以前から存在は知っていたが以前に作ったWSHで同時アクセスが上限3アクセスまでだったのであまり興味なかった。

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

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

しかし、radiko.jpのタイムフリーを使ってるうちにラジコプレミアムを使用することで一括ダウンロードが可能になった為対応してみた。
ついでにプロキシサーバーにも対応した。

ラジコプレミアムは月額350円でエリアフリーで日本全国のラジオ局が聴き放題になりタイムフリーでは一週間分遡ってダウンロードできます。

修正箇所はAYTHKeyGet.vbsのみ修正でWSHで録音もバッチファイルで一括ダウンロードも対応してます。

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

利用にあたって
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/

各種実行ファイルを集めて一つのフォルダに置いてください
ここでの例としてD:\RadikoRecに置いてます

AYTHKeyGet.vbs

Option Explicit

Dim argStation,argDebug,argSilent,cookiefile,mail,pass,checkfile,loginfile,PROXY,PROXY_T

'radiko premium
mail = ""
pass = ""

PROXY = "" 'プロキシサーバー 例:xx.xx.xx.xx.xx:8080 

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

Dim i
Dim strCmd
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
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

'プロキシサーバー
If not PROXY = "" Then
  PROXY = " -e HTTP_PROXY=" & PROXY

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

  'radiko premium
  if not (mail = "") then
    RtnCD = WSHShell.run("wget.exe -q --save-cookie=" & cookiefile _
        & " --keep-session-cookies" & PROXY _
        & " --post-data=""mail=" & mail & "&pass=" & pass & """" _
        & " -O " & loginfile & PROXY _
        & " https://radiko.jp/ap/member/login/login",gShellStyle,True)
    If RtnCD <> 0 Then
      GetRadikoCmd = "error 認証ステップ0:radiko premiumの取得失敗!"
      premiumLogoutCmd()
      Exit Function
    Else
      If argDebug = "yes" Then WScript.Echo "認証ステップ0:radiko premiumの取得成功"
    End If

    WScript.Sleep 2000
    if not objFso.FileExists(cookiefile) then
      WScript.Echo "failed login1"
      premiumLogoutCmd()
      Exit Function
    End IF
  End IF


  'check login
  if not (mail = "") then
    RtnCD = WSHShell.run("wget.exe -q" _
        & " --header=""pragma: no-cache""" _
        & " --header=""Cache-Control: no-cache""" _
        & " --header=""Expires: Thu, 01 Jan 1970 00:00:00 GMT""" _
        & " --header=""Accept-Language: ja-jp""" _
        & " --header=""Accept-Encoding: gzip, deflate""" _
        & " --header=""Accept: application/json, text/javascript, */*; q=0.01""" _
        & " --header=""X-Requested-With: XMLHttpRequest""" _
        & " --no-check-certificate " _
        & " --load-cookies " & cookiefile _
        & " --save-headers " _
        & " -O " & checkfile & PROXY _
        & " https://radiko.jp/ap/member/webapi/member/login/check",gShellStyle,True)
    If RtnCD <> 0 Then
      GetRadikoCmd = "error 認証ステップ0:radiko premiumの取得失敗!"
      premiumLogoutCmd()
      Exit Function
    Else
      If argDebug = "yes" Then WScript.Echo "認証ステップ0:radiko premiumの取得成功"
    End If

    WScript.Sleep 2000 
    if not objFso.FileExists(checkfile) then
      WScript.Echo "failed login2"
      premiumLogoutCmd()
      Exit Function
    End IF
  End IF

  '認証ステップ1:Radikoのswfプレイヤーをplayer.swfというファイル名でダウンロード
  RtnCD = WSHShell.run("wget.exe -q --timeout=60 --tries=10 -O """ & pSwfPlayer & """ """ & playerurl & """" & PROXY ,gShellStyle,True)
  If RtnCD <> 0 Then
    GetRadikoCmd = "error 認証ステップ1:player.swfの取得失敗!"
    premiumLogoutCmd()
    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の抜き出し失敗!"
    premiumLogoutCmd()
    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" _
      & " --load-cookies " & cookiefile _
      & " --save-headers https://radiko.jp/v2/api/auth1_fms" _
      & " -O """ & auth1_fms & """" & PROXY ,gShellStyle,True)
  If RtnCD <> 0 Then
    GetRadikoCmd = "error 認証ステップ3:auth1_fmsファイルの取得失敗!"
    premiumLogoutCmd()
    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""" _
        & " --load-cookies " & cookiefile _
        & " --no-check-certificate" _
        & " https://radiko.jp/v2/api/auth2_fms" _
        & " -O """ & auth2_fms & """" & PROXY ,gShellStyle,True)
  If RtnCD <> 0 Then
    GetRadikoCmd = "error 認証ステップ6:authtokenとpartialkeyの失敗!"
    premiumLogoutCmd()
    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
    if not (mail = "") then
      WSHFS.DeleteFile loginfile, True
      WSHFS.DeleteFile checkfile, True

    End If
  End If

        WScript.Echo(pAuthtoken)

  premiumLogoutCmd()

End Function

Function premiumLogoutCmd()

  Dim RtnCD
  'radiko premium Logout
  if not (mail = "") then
    RtnCD = WSHShell.run("wget -q" _
      & " --header=""pragma: no-cache""" _
      & " --header=""Cache-Control: no-cache""" _
      & " --header=""Expires: Thu, 01 Jan 1970 00:00:00 GMT""" _
      & " --header=""Accept-Language: ja-jp""" _
      & " --header=""Accept-Encoding: gzip, deflate""" _
      & " --header=""Accept: application/json, text/javascript, */*; q=0.01""" _
      & " --header=""X-Requested-With: XMLHttpRequest""" _
      & " --no-check-certificate "_
      & " --load-cookies $cookiefile "_
      & " --save-headers "_
      & " -O $logoutfile" & PROXY _
      & " https://radiko.jp/ap/member/webapi/member/logout",gShellStyle,True)
    If RtnCD <> 0 Then
      GetRadikoCmd = "error radiko premiumのLogout失敗!"
      Exit Function
    Else
      If argDebug = "yes" Then WScript.Echo "radiko premiumのLogout取得成功"
    End If
    if objFso.FileExists(cookiefile) then
      WSHFS.DeleteFile cookiefile, True
    End IF
  End IF

End Function

この部分はbooskaさんのスプリクトを参考しました

‘radiko premium
mail = “”
pass = “”

ここの部分を修正することでラジコプレミアムに対応します。


radiko.jpのタイムフリーをバッチファイルで一括ダウンロードする


前回radiko.jpのタイムフリーをダウンロード(録音)する記事を書いた。その後いろいろ調べた結果バッチファイルで時間指定してダウンロード(録音)出来たので記事にしたい。

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

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


こちらのスプリクトを引用します。

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

利用にあたって
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/

各種実行ファイルを集めて一つのフォルダに置いてください
ここでの例としてD:\RadikoRecに置いてます

AYTHKeyGet.vbs

Option Explicit

Dim argStation,argDebug,argSilent,cookiefile,mail,pass,checkfile,loginfile,PROXY,PROXY_T

'radiko premium
mail = ""
pass = ""

PROXY = "" 'プロキシサーバー 例:xx.xx.xx.xx.xx:8080 

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

Dim i
Dim strCmd
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
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

'プロキシサーバー
If not PROXY = "" Then
    PROXY = " -e HTTP_PROXY=" & PROXY

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

    'radiko premium
    if not (mail = "") then
        RtnCD = WSHShell.run("wget.exe -q --save-cookie=" & cookiefile _
                & " --keep-session-cookies" & PROXY _
                & " --post-data=""mail=" & mail & "&pass=" & pass & """" _
                & " -O " & loginfile & PROXY _
                & " https://radiko.jp/ap/member/login/login",gShellStyle,True)
        If RtnCD <> 0 Then
            GetRadikoCmd = "error 認証ステップ0:radiko premiumの取得失敗!"
            premiumLogoutCmd()
            Exit Function
        Else
            If argDebug = "yes" Then WScript.Echo "認証ステップ0:radiko premiumの取得成功"
        End If

        WScript.Sleep 2000
        if not objFso.FileExists(cookiefile) then
            WScript.Echo "failed login1"
            premiumLogoutCmd()
            Exit Function
        End IF
    End IF


    'check login
    if not (mail = "") then
        RtnCD = WSHShell.run("wget.exe -q" _
                & " --header=""pragma: no-cache""" _
                & " --header=""Cache-Control: no-cache""" _
                & " --header=""Expires: Thu, 01 Jan 1970 00:00:00 GMT""" _
                & " --header=""Accept-Language: ja-jp""" _
                & " --header=""Accept-Encoding: gzip, deflate""" _
                & " --header=""Accept: application/json, text/javascript, */*; q=0.01""" _
                & " --header=""X-Requested-With: XMLHttpRequest""" _
                & " --no-check-certificate " _
                & " --load-cookies " & cookiefile _
                & " --save-headers " _
                & " -O " & checkfile & PROXY _
                & " https://radiko.jp/ap/member/webapi/member/login/check",gShellStyle,True)
        If RtnCD <> 0 Then
            GetRadikoCmd = "error 認証ステップ0:radiko premiumの取得失敗!"
            premiumLogoutCmd()
            Exit Function
        Else
            If argDebug = "yes" Then WScript.Echo "認証ステップ0:radiko premiumの取得成功"
        End If

        WScript.Sleep 2000 
        if not objFso.FileExists(checkfile) then
            WScript.Echo "failed login2"
            premiumLogoutCmd()
            Exit Function
        End IF
    End IF

    '認証ステップ1:Radikoのswfプレイヤーをplayer.swfというファイル名でダウンロード
    RtnCD = WSHShell.run("wget.exe -q --timeout=60 --tries=10 -O """ & pSwfPlayer & """ """ & playerurl & """" & PROXY ,gShellStyle,True)
    If RtnCD <> 0 Then
        GetRadikoCmd = "error 認証ステップ1:player.swfの取得失敗!"
        premiumLogoutCmd()
        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の抜き出し失敗!"
        premiumLogoutCmd()
        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" _
            & " --load-cookies " & cookiefile _
            & " --save-headers https://radiko.jp/v2/api/auth1_fms" _
            & " -O """ & auth1_fms & """" & PROXY ,gShellStyle,True)
    If RtnCD <> 0 Then
        GetRadikoCmd = "error 認証ステップ3:auth1_fmsファイルの取得失敗!"
        premiumLogoutCmd()
        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""" _
          & " --load-cookies " & cookiefile _
          & " --no-check-certificate" _
          & " https://radiko.jp/v2/api/auth2_fms" _
          & " -O """ & auth2_fms & """" & PROXY ,gShellStyle,True)
    If RtnCD <> 0 Then
        GetRadikoCmd = "error 認証ステップ6:authtokenとpartialkeyの失敗!"
        premiumLogoutCmd()
        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
        if not (mail = "") then
            WSHFS.DeleteFile loginfile, True
            WSHFS.DeleteFile checkfile, True

        End If
    End If

        WScript.Echo(pAuthtoken)

    premiumLogoutCmd()

End Function

Function premiumLogoutCmd()

    Dim RtnCD
    'radiko premium Logout
    if not (mail = "") then
        RtnCD = WSHShell.run("wget -q" _
            & " --header=""pragma: no-cache""" _
            & " --header=""Cache-Control: no-cache""" _
            & " --header=""Expires: Thu, 01 Jan 1970 00:00:00 GMT""" _
            & " --header=""Accept-Language: ja-jp""" _
            & " --header=""Accept-Encoding: gzip, deflate""" _
            & " --header=""Accept: application/json, text/javascript, */*; q=0.01""" _
            & " --header=""X-Requested-With: XMLHttpRequest""" _
            & " --no-check-certificate "_
            & " --load-cookies $cookiefile "_
            & " --save-headers "_
            & " -O $logoutfile" & PROXY _
            & " https://radiko.jp/ap/member/webapi/member/logout",gShellStyle,True)
        If RtnCD <> 0 Then
            GetRadikoCmd = "error radiko premiumのLogout失敗!"
            Exit Function
        Else
            If argDebug = "yes" Then WScript.Echo "radiko premiumのLogout取得成功"
        End If
        if objFso.FileExists(cookiefile) then
            WSHFS.DeleteFile cookiefile, True
        End IF
    End IF

End Function

この部分はbooskaさんのスプリクトを参考しました

修正しました
radiko.jpのラジコプレミアムに対応した
投稿日: 2017年2月2日

radiko.jpのラジコプレミアムに対応した

timeshift_get.bat

D:
cd \RadikoRec

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

set ch=TBS
set ft=20170130090000
set to=20170130093000
set AYTHKeyGet=AYTHKeyGet.vbs
del timeshift.m3u8

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

wget -q --header="pragma: no-cache" --header="Content-Type: application/x-www-form-urlencoded" --header="X-Radiko-AuthToken: %AUTHTOKEN%" --header="Referer: http://radiko.jp/apps/js/flash/myplayer-release.swf" --post-data='flash=1' --no-check-certificate -O timeshift.m3u8  "https://radiko.jp/v2/api/ts/playlist.m3u8?l=15&station_id=%ch%&ft=%ft%&to=%to%"

for /f %%i in ('find "radiko" timeshift.m3u8') do SET PLAYLIST_URL=%%i

ffmpeg -headers "X-Radiko-AuthToken: %AUTHTOKEN%" -i %PLAYLIST_URL% "ファイル名.ts"

set ch=TBSでダウンロードしたい局を指定します。
set ft=20170130090000でダウンロードしたい番組の開始時間
set to=20170130093000でダウンロードしたい番組の終了時間
2017年01月30日09時30分00秒となります。
最後のファイル名.tsを好きなファイル名にしてください。

これで目的の番組がtsファイルで一瞬ダウンロードされます。時々速度が等倍になったり途中で途切れたりするケースもあるようです。ファイル変換したり各種プレーヤーで再生できるのでお試しください。

このバッチを繰り返す事で決まった番組を次々と落とせます。あまりにも便利なためそのうち規制されそう…

2017年2月6日
実際に一括ダウンロードしてみた

radiko.jpのタイムフリーをバッチファイルで一括ダウンロードしてみた

2017年02月20日記事を追加しました。

radiko.jpのタイムフリーを一括ダウンロードバッチを改良修正した


radiko.jpのタイムフリーをダウンロードする


前回、radiko.jpのタイムフリーを録音する方法を紹介した。その後いろいろ調べたらダウンロードが分かったので紹介する。

firefox
https://www.mozilla.org/ja/firefox/new/

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

使用するのはfirefoxとffmpeg.exeだ。

firefoxでradiko.jpを開きタイムフリーをクリックする

ダウンロードしたい番組をクリックする

番組の再生画面が出たらF12を押してデバック環境を開き “ネットワークウィンドウ”を開く。その後再生するボタンを押す。音がうるさかったら一時停止してかまいません。

再生するとm3u8 のURLが2つ追加されます。追加された m3u8 のうち1行目の長い方(メソッド:POST)のURLを右クリックしてURLをコピーします。
※1後で必要になるm3u8のURLの部分です
例:https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=RN2&l=15&ft=20170125140000&to=20170125142000

その後、m3u8のURLを右クリックして”編集して再送信(E)” を選択する

選択すると右ウインドをスクロールしてX-Radiko-AuthTokenの文字列を探してその部分をコピーする
※2後で必要になるX-Radiko-AuthTokenの文字列の部分です
例:X-Radiko-AuthToken: WVd0pdgXMUo1wcbvtUq14Q

文字列がそろったらffmpeg.exeをインストールしたフォルダに移動してそのフォルダに下記のバッチファイルを作成する
ここの例ではD:\Program Files\ffmpegにインストールしてます

get.bat

D:
cd \Program Files\ffmpeg

REM ffmpeg -headers "X-Radiko-AuthTokenの文字列" -i "m3u8のURL" -acodec copy "ファイル名.ts"

ffmpeg -headers "X-Radiko-AuthToken: WVd0pdgXMUo1wcbvtUq14Q" -i "https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=RN2&l=15&ft=20170125140000&to=20170125142000" -acodec copy "ファイル名.ts"

pause

ここで※2のX-Radiko-AuthTokenの文字列と※1のm3u8のURLをffmpeg -headersの後に付け足して好きなファイル名に変更してください。そして保存しバッチファイルを実行してください。
これで目的の番組がtsファイルで一瞬ダウンロードされます。時々速度が等倍になったり途中で途切れたりするケースもあるようです。ファイル変換したり各種プレーヤーで再生できるのでお試しください。

記事を追加しました。
radiko.jpのタイムフリーをバッチファイルで一括ダウンロードする

radiko.jpのタイムフリーをバッチファイルで一括ダウンロードする


ねこのそらちゃんを病院へ連れてく


母が猫のそらちゃんの首回りや腰回りにぶつぶつができてる事が気になるそうで毎月病院で餌(去勢したので専用の餌)を買うのでついでに診察してもらう事になった。ブツブツを写真に撮りたかったが毛深いので触感でしか分からなかった。

猫専用のゲージに入れて車で向かう

以前はバスで連れて行った事もあるが移動中ずーと泣いてる
バスだとずーと泣いて困るので最近は車で移動

いつもお世話になってるいけだ動物病院

以前は佐世保のララコープ日野店の近くにあったが同じ日野の新興住宅街に移動してきた
診察すると猫栗粒性皮膚炎との診断。
アレルギー性の皮膚炎との事。昔からブツブツはあったのでそんなに驚かなかったが去勢とも関係あるのだろう。とりあえず抗生剤と消炎症薬を頂く。初診と薬代で3180円でした。ここは毎月餌も買ってるが比較的リーズナブルな価格なので助かる

地域柄米軍基地の方も見えられ英語対応も可能みたいでよく外人の方も来る。薬を一週間分貰って様子を見ることにした。後日また報告したい。


ジェントス懐中電灯(DM-031B)を買った



今まで使ってたLED懐中電灯が接触不良でいまいちなのでAmazonで新しい懐中電灯を買った。ジェントス 懐中電灯45ルーメン(DM-031B)ってやつだ。単三一本のを探してた。

ストラップはダイソーの奴です。ストラップの付属はありません

横から。後で記載しますがストラップはペンクリップに引っ掛けてます

穴の電源ボタン。押しやすい

頭のライト部分。照射範囲はかなり広めで近い位置を照らす感じ。
ズーム機能など可動部分はありません

単三一本で10時間ぐらい。一日1時間使用で一週間ぐらいで暗くなる。

ペンクリップは取り外し可能。根元にストラップを引っかきてストラップを使ってライトを首から下げてる

夜室内で使用感を撮影しようとしたが撮影がうまくいかなかった。
汚い襖に照射してみてる。
パワフルな照射感ではないが100均の単4×3つのLEDライトより明るい。ズーム機能があればかなりいいのだが残念ながら無い。
しかし、このジェントスのライトは軽く小さい。口でくわえて作業しても苦にならない。他社のLED単4×3つライトより暗いが小さく軽いため常用するのにいい。ポケットに入れても邪魔にならない。
900円でこのサイズ感はお買い得だ


一眼レフカメラの掃除は大変だ


遅くなりましたがあけましておめでとうございます
2017年もよろしくお願いします
年末年始は風邪で寝込んでたのと微妙に忙しくこの時期になってしまった。去年の年末に佐世保九十九島の夕暮れを撮ろうと石岳展望台に行った模様を記事にした。

車で行くとちょっとした駐車場がある

山道を歩いていくと展望台がある

映画ラストサムライの撮影場所らしい。

人気の撮影場所で何人もカメラ片手に待機してた。島並がいいのだろうか?

場所取りで先客が沢山だったので奥の展望台に行くことにした

奥の展望台で一眼レフカメラで何枚も撮影したのだがセンサーにゴミが沢山あって失敗した

帰って一眼レフカメラを掃除して次の晴れ間に近くの船越展望所で再チャレンジしたがまだゴミが残ってたようだ

普通の景色撮影ならゴミが目立たないが夕焼けは厳しいようだ
掃除を何回もして天気がいい日に再チャレンジしたい


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で空欄の場合、秒計算で時間の引数を計算しないようにしました