Re: Webラジオの保存方法の質問はこちら【26】 ( No.63 )
日時: 2020/07/31 12:32
名前: おひげ

需要無視シリーズの第4弾です。(たぶん4弾だと思う)

仕様変更後の音泉のダウンロード補助を行うバッチファイルです。

Webラジオの保存方法の質問はこちら【26】 ( No.37 ) No Name さん 作成のブックマークレットで出力される
フォーマットの3行を利用して、ダウンロードを行うバッチファイルです。

ブックマークレットなどの作成は >>37 の No Nameさんの投稿を読んでください。
作成されたデータから番組ごとの3行の情報をコピペすると情報を分解して自動的に保存を行う仕様です。


番組名:番組の名前
データURL:https://onsen-ma3phlsvod.sslcs.cdngc.net...playlist.m3u8
配信日:xx/xx,動画フラグ:false


の形式にそった3行を入力することで

ファイル名称は番組の名前 [配信日] という形式で
音声のみなら m4a で、動画ありなら mp4 で保存します。

やっつけ仕事で作ったので入力されるデータのチェック機構はありません3行のみを最初から最後まで選択してまるまるコピーして
出てくるダイアログにペーストしてください。
(1行くらいしか入らないように見えますが、一気に3行をペーストしてください、選択が足りない場合や多すぎても動作しないと思います)

それぞれのセクションで何をしているかは一応コメントとして記載しています。


※保存中まるで止まっているように見えますがログを抑制しているだけです、保存中にうざいほど流れるログが見たい場合は、
 本文の set log= の行を消すか、REMでコメントアウトしてください。

※改行コード <LF> が正しく処理できるエディタで開いてコピペする必要があります。
 改行コードが置き換えられると正しくデータの入力ができなくなります。
 このあたりの説明は >>68 に記載しています。


::-------ここから下をコピペして 適当な名前で保存して拡張子を .bat に変更してください-------(この行は含めないこと)

@echo off
cls


:: ←この行はコメントです 【 ":" 1文字はジャンプ用のラベル "::" 2文字は注釈用のコメントになります】

::【ffmpegのログを調整 [どちらかに REM を入れて選択してください error : 抑止 info : 通常] 】

   set log=error
REM   set log=info

  if %log%==error (set log2=抑止) else (set log2=通常)

::【実行時に表示する解説などを定義 】


title 音泉 -インターネットラジオステーション- ダウンロード補助

 echo.
 echo **** 音泉 -インターネットラジオステーション- ダウンロード補助 ****
 echo.
 echo Webラジオの保存方法の質問はこちら【26】の ( No.37 ) No Name さん 作成の音泉の配信用 playlist を作成する
 echo ブックマークレットの3行分を分解して番組名、playlist.m3u8、配信日などを自動的に当てはめた形式で保存する
 echo ためのバッチファイルです。
 echo.
 echo ブックマークレットの出力形式の3行のみが入力されるものとして処理します。
 echo そのため間違ったものが入力された場合正常に動作しません。
 echo.
 echo 事前にNo Name さん作成のブックマークレットから出力された情報を準備しておく必要があります。
 echo (下記3行のような形式のデータです)
 echo.
 echo 番組名:番組の名前
 echo データURL:https://onsen-ma3phlsvod.sslcs.cdngc.net...playlist.m3u8
 echo 配信日:xx/xx,動画フラグ:false
 echo.
 echo 同一フォルダに ffmpeg.exe が無いと正常に動作しません
 echo.


:: 【ffmpeg.exe が同一フォルダにあるかどうかチェック】
:Check

 IF EXIST ffmpeg.exe (GOTO URL_IN)
 echo.
 echo ffmpeg.exe が同一フォルダに見つかりませんでした
 echo パスが切られている場所に ffmpeg.exeが 無い場合、ダウンロードは行われません
 echo.
 pause
 goto END

:: 【マークレット入力用VBS作成とデータ入力】
:URL_IN

 echo With CreateObject("Scripting.FileSystemObject").CreateTextFile("URL.txt") >>URL.VBS
 echo .WriteLine InputBox("ブックマークレットの出力データの3行分を ペーストします","音泉 -インターネットラジオステーション-","この文字列を消して、ここに3行分をペーストしてください") >>URL.VBS
 echo .Close >>URL.VBS
 echo End With >>URL.VBS

  URL.VBS

:: 【入力されたマークレットの分解と環境変数への設定】
:main

 set string=
 set del=

 :: 【番組名の抽出】
 :: 【Aに1行目を入力、以下変数[AとB]を交互に使用して & : - ! ? / を順番に全角へ置換処理】
 
  findstr 番組 url.txt >tmp.txt
  
  set /p NAME_A= < url.txt
  set NAME_B=%NAME_A:&=&%
  set NAME_A=%NAME_B::=:%
  set NAME_B=%NAME_A:-=−%
  set NAME_A=%NAME_B:!=!%
  set NAME_B=%NAME_A:?=?%
  set NAME_A=%NAME_B:/=/%

 :: 【番組名にnewが含まれるか確認 0 [含] 先頭9文字削除 else [含まない] 先頭4文字削除】

  findstr "new" tmp.txt >nul

  if %errorlevel% EQU 0 (goto new) else (goto old)

  :new
   echo %NAME_A:~9% >tmp2.txt
   goto endname

  :old
   echo %NAME_A:~4% >tmp2.txt
   goto endname

 :: 【番組名を変数NAMEに入れ、作業ファイルの削除】
  :endname
  
  set /p NAME= < tmp2.txt
  
  del tmp.txt > nul
  del tmp2.txt > nul


 :: 【playlistの抽出】
 :: 【playlistを含む行を変数にいれ、データURL:の文字列をサブルーチンで削除、戻ってきた変数の末尾1桁[改行コード]を削除】

setlocal enabledelayedexpansion

  set string=データURL:
  findstr %string% url.txt > tmp.txt
  call :delst
  For /F "usebackq" %%i In (tmp2.txt) Do Set URL=%%i
  Set URL=%URL:~0,-1%
  del tmp2.txt >nul

 :: 【日付と動画フラグの抽出】
 :: 【配信日を変数にいれ、, の文字列で2つの変数に分解】

  set string=配信日:
  findstr %string% url.txt > tmp.txt

  for /f "tokens=1,2* delims=," %%i in (tmp.txt) do (
   set date=%%i
   set flag=%%j
  )

 :: 【配信日:の文字列を削除し、変数を / で2つに分離 [月と日に分離]、それぞれ先頭に00を追加して末尾2桁を抽出して合成
 :: 【過程により左記に変化 配信日:8/1 -> 8/1 -> 8 と 1 -> 008 と 001 -> 08 と 01 -> 08-01】

  set date2=%date:配信日:=%
  echo %date2% >tmp.txt
  
  for /f "tokens=1,2* delims=/" %%i in (tmp.txt) do (
   set date_m=%%i
   set date_d=%%j
  )

  set date_M=00%date_m%
  set date_m=%date_M:~-2%
  set date_D=00%date_d%
  set date_d=%date_D:~-3%
  set date=%date_m%-%date_d%
  Set date=%date:~0,-1%

 :: 【動画フラグ:の文字列を削除し、入力用の作業ファイルの削除】

  set flag2=%flag:動画フラグ:=%
  del tmp.txt >nul

  del URL.VBS > nul


::【ダウンロード時のタイトル表示】
:download

 cls
 echo.
 echo **** ダウンロード処理を行います ****
 echo.
 echo 出力ファイル : "%NAME% [%date%].mp4"
 echo ソースURL : "%URL%"
 echo 動画フラグ : "%flag2%"
 echo.

  timeout 2 >nul


::【入力URLの確認】
:inputcheck

 ::【先頭2秒の保存を試しストリーミング情報を log.txtに保存】

  ffmpeg -i "%URL%" -vcodec copy -acodec copy -bsf:a aac_adtstoasc -t 2 "tmp.mp4" > log.txt 2>&1
  del tmp.mp4 >nul 2>&1

  ::【log.txt の内容で入力されたURLが有効なストリーミングデータかどうか判断】
  ::【エラーが見つかったら(0)エラー表示して終了へ 】


  ::【ffmpeg への入力データが不正の場合】
   findstr /C:"Invalid data found" log.txt >nul
   if %errorlevel% EQU 0 (goto ERROR)

  ::【URLにファイルが見つからない場合】
   findstr /C:"No such file" log.txt >nul
   if %errorlevel% EQU 0 (goto ERROR)

  ::【アクセス不可のフォルダへアクセスした場合】
   findstr /C:"Server returned" log.txt >nul
   if %errorlevel% EQU 0 (goto ERROR)

  ::【ホスト名が間違っている場合】
   findstr /C:"Failed to resolve hostname" log.txt >nul
   if %errorlevel% EQU 0 (goto ERROR)

   goto download_main

::【入力URLエラー処理】
:ERROR

    echo.
    echo *** Invalid data found when processing input [入力URLに無効なデータが見つかりました] ***
    echo.
    echo 入力したデータに不備があるものと思われます
    echo コピペしたブックマークレットの3行のデータを見直して下さい。
    echo.
    echo.

    echo 入力されたデータは以下のようになっています(正しいデータだったか確認ください)
    echo.
    type URL.TXT
    echo.
    echo.
    echo ここに3行表示されていて、それぞれ 番組名,データURL,配信日 で始まる行になっている必要があります。
    echo 入力データが3行未満だったり、開始文字が異なっている場合コピペミスが考えられます。
    echo.
    echo.
    echo.

    del *.txt >nul
    pause
    
    goto end


::【ダウンロード部】
:download_main

 ::【保存した log.txt から必要のない項目を削除して整理する】
 ::【1行目で囲った文字列の含まれる行を削除する】
 ::【2行目で囲った文字列が含まれる行を抽出する】

  findstr /V "ffmpeg built lib http help speed overhead avc1 mp4a" log.txt >log2.txt
  findstr "Duration Program Stream" log2.txt >log.txt
  del log2.txt


 ::【動画フラグをチェックし確認して分岐】
 ::【フラグが false の場合 [音声のみ mp3 で保存]】
 ::【フラグが true の場合 [動画付き mp4 で保存]】

   echo.
   echo *** streaming information ***
   echo.
   findstr /v "mapping ->" log.txt
   echo.
   echo.
   echo Duration: の後ろがラジオの長さです。 Program が複数ある場合は複数画質が混在するマルチストリーミングです。
   echo.
   del log.txt > nul
   del URL.txt > nul
 
  if %flag2%==false (

   echo *** 音声データを保存中 *** [Loglevel : %log2%]
   echo.
   ffmpeg -i "%URL%" -loglevel %log% -stats -acodec copy -bsf:a aac_adtstoasc ".\%NAME% [%date%].m4a"

  ) else (

   echo *** 動画データを保存中 *** [Loglevel : %log2%]
   echo.
   ffmpeg -i "%URL%" -loglevel %log% -stats -vcodec copy -acodec copy -bsf:a aac_adtstoasc ".\%NAME% [%date%].mp4"

  )

 echo.
 echo *** ダウンロード処理は終了しました ***
 echo.
 echo 正常に完了している場合は、フォルダに %NAME% が作成されています
 echo 再生して確認をお願いします
 echo.
 goto END


::【ブックマークレットの文字列を制御するサブルーチン】
::【初期仕様では番組、URL、配信日、動画フラグの4回使っていたため、行の節約になっていましたが、現在は1回のみ】

:delst
 for /f "delims=" %%a in (tmp.txt) do (
  set line=%%a
  echo !line:%string%=%del%! >> tmp2.txt
 )
 del tmp.txt >nul
 exit /b


::【終了処理】
:END

 ::【XP環境の場合 timeout 15 を pause に変更してください】

  endlocal

  
  timeout 15

  exit

::-------ここから上をコピペしてください-------(この行は含めないこと)

変更履歴

20/07/31 12:35頃 初版
20/07/31 13:20頃 音声データを .mp3 から .m4a 保存に変更 (>>64 で要望いただいたので音声は m4a へ変更)
20/07/31 17:35頃 番組名に(new)が入るものでエラーが出ていた部分を修正 (>>65 で指摘いただいたものの修正)
20/07/31 18:10頃 番組名に & や : が入るものが正常に出力できなかった部分を修正 [それぞれ全角に置換]
20/07/31 19:50頃 入力URLにエラーがあった場合、入力時のデータを表示して終わるよう修正 (>>67 で報告いただいた入力データ不備の際の確認のため)
20/07/31 21:35頃 ファイル名の先頭に - が入る場合、ファイルが保存できなかった問題を修正 (>>73 で指摘いただいたものの修正) [全角に置換]
20/08/01 03:50頃 ファイル名処理部分を全面みなおし (DOSコマンドで因数に間違われそうな文字列をすべて全角化、日付を2桁づつ揃える]
20/08/03 11:55頃 ffmpeg のオプション変更 (進捗状況表示のオプションを追加)
20/08/03 23:35頃 番組日付が1桁だった場合、日付がおかしくなっていた部分を修正
20/08/08 02:05頃 番組名に / が入る場合に正しく処理できなかった部分を修正 (>>99 で指摘いただいたものの修正)




トップページ