Skip to content

Instantly share code, notes, and snippets.

@CannoHarito
Last active June 10, 2022 08:19
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CannoHarito/75acd6ac09edfa93b54864bdd6b4df3e to your computer and use it in GitHub Desktop.
Save CannoHarito/75acd6ac09edfa93b54864bdd6b4df3e to your computer and use it in GitHub Desktop.
hibiki radio stationからaccess_idsで指定した番組をffmpegで保存するps1をbatファイルに格納したもの。
@powershell/c '#'+(gc \"%~f0\"-ra)^|iex&exit/b
############################################################################
$DEFO_access_ids = @"
ccsakura
hanaso
priconne_re
"@ -split "\s+"
$DEFO_output_dir = "$HOME\Music\records\"
$DEFO_ffmpeg = "C:\Program_Free\ffmpeg\bin\ffmpeg.exe"#pathが通っているなら書く必要はない
############################################################################
if (!$access_ids) {
$access_ids = $DEFO_access_ids
}
if (!$ffmpeg) {
if (!!(Get-Command ffmpeg 2>$null)) {
$ffmpeg = (Get-Command ffmpeg).Definition
}
else {
$ffmpeg = $DEFO_ffmpeg
}
}
if (!$output_dir) {
$output_dir = $DEFO_output_dir
}
if (!(Test-Path $output_dir)) {
mkdir $output_dir
}
$useragent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0'
$headers = @{
'X-Requested-With' = 'XMLHttpRequest';
'Origin' = 'https://hibiki-radio.jp'
}
# 禁止文字(半角記号)
$CannotUsedFileName = '\/:*?`"><|'
# 禁止文字(全角記号)
$UsedFileName = '¥/:*?`”><|'
function get-program-detail {
Param(
[Parameter(ValueFromPipeline = $true)]
[String]
$access_id = 'ccsakura'
)
process {
$url = "https://vcms-api.hibiki-radio.jp/api/v1/programs/$access_id"
Invoke-RestMethod -Method Get -Uri $url -UserAgent $useragent -Headers $headers
}
}
function get-playlist-url-by-id {
Param(
[Parameter(mandatory = $true, ValueFromPipeline = $true)]
[String]
$video_id
)
process {
$url = "https://vcms-api.hibiki-radio.jp/api/v1/videos/play_check?video_id=$video_id"
(Invoke-RestMethod -Method Get -Uri $url -UserAgent $useragent -Headers $headers).playlist_url
}
}
function save-hibiki-radio {
Param(
[Parameter(ValueFromPipeline = $true)]
[String]
$access_id = 'ccsakura'
)
begin {
$succeeded = @()
$failed = @()
}
process {
$program = get-program-detail $access_id
if (!$program.episode.video.id) {
"No episodes in $access_id"
return
}
$date = $program.episode.updated_at -split "[^\d]"
$year = $date[0]
$date = "$($date[0].Substring($date[0].Length - 2, 2)).$($date[1]).$($date[2])"
$track = [regex]::replace($program.episode.name, "[0-9]", { $args.value[0] - 65248 -as "char" }) -replace "[^\d]", ""
$filename = $program.episode.program_name + $(if ($track) { "_#$track" }) + "_($date).m4a"
$filename = [regex]::Replace($filename, "[$CannotUsedFileName]", { $UsedFileName[$CannotUsedFileName.IndexOf($args.value[0])] })
$filename = $output_dir + $filename
if (Test-Path $filename) {
"File already exists: $filename"
return
}
$playlist_url = get-playlist-url-by-id $program.episode.video.id
$ffmepg_arg = @('-i' , "`"$playlist_url`"", "-vn" , "-acodec", "copy" , "-bsf:a" , "aac_adtstoasc",
"-metadata", ("title=`"$($program.episode.program_name)" + $(if ($track) { " #$track" }) + " ($date)`""),
"-metadata", "artist=`"$($program.cast)`"",
"-metadata", "album=`"$($program.episode.program_name)`"",
"-metadata", "comment=`"$($program.description -replace '\s+',' ')`"",
"-metadata", "genre=`"Web Radio`"",
"-metadata", "year=`"$year`"",
"-metadata", "date=`"$year`"",
"-metadata", "track=`"$track`"",
"`"$filename`"")
& $ffmpeg $ffmepg_arg
if (Test-Path $filename) {
$succeeded += $filename
}
else {
$failed += $filename
}
}
end {
if ($succeeded) {
"Succeeded: $succeeded"
}
if ($failed) {
"Failed: $failed"
}
}
}
$access_ids | save-hibiki-radio
############################################################################
$DEFO_access_ids = @"
ccsakura
Roselia
"@ -split "\s+"
$DEFO_output_dir = "$HOME\Music\records\"
$DEFO_ffmpeg = "C:\Program_Free\ffmpeg\bin\ffmpeg.exe"#pathが通っているなら書く必要はない
############################################################################
if (!$access_ids) {
$access_ids = $DEFO_access_ids
}
if (!$ffmpeg) {
if (!!(Get-Command ffmpeg 2>$null)) {
$ffmpeg = (Get-Command ffmpeg).Definition
}
else {
$ffmpeg = $DEFO_ffmpeg
}
}
if (!$output_dir) {
$output_dir = $DEFO_output_dir
}
if (!(Test-Path $output_dir)) {
mkdir $output_dir
}
$useragent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0'
$headers = @{
'X-Requested-With' = 'XMLHttpRequest';
'Origin' = 'https://hibiki-radio.jp'
}
# 禁止文字(半角記号)
$CannotUsedFileName = '\/:*?`"><|'
# 禁止文字(全角記号)
$UsedFileName = '¥/:*?`”><|'
function get-program-detail {
Param(
[Parameter(ValueFromPipeline = $true)]
[String]
$access_id = 'ccsakura'
)
process {
$url = "https://vcms-api.hibiki-radio.jp/api/v1/programs/$access_id"
Invoke-RestMethod -Method Get -Uri $url -UserAgent $useragent -Headers $headers
}
}
function get-playlist-url-by-id {
Param(
[Parameter(mandatory = $true, ValueFromPipeline = $true)]
[String]
$video_id
)
process {
$url = "https://vcms-api.hibiki-radio.jp/api/v1/videos/play_check?video_id=$video_id"
(Invoke-RestMethod -Method Get -Uri $url -UserAgent $useragent -Headers $headers).playlist_url
}
}
function save-hibiki-radio {
Param(
[Parameter(ValueFromPipeline = $true)]
[String]
$access_id = 'ccsakura'
)
begin {
$succeeded = @()
$failed = @()
}
process {
$program = get-program-detail $access_id
if (!$program.episode.video.id) {
"No episodes in $access_id"
return
}
$date = $program.episode.updated_at -split "[^\d]"
$year = $date[0]
$date = "$($date[0].Substring($date[0].Length - 2, 2)).$($date[1]).$($date[2])"
$track = [regex]::replace($program.episode.name, "[0-9]", { $args.value[0] - 65248 -as "char" }) -replace "[^\d]", ""
$filename = $program.episode.program_name + $(if ($track) { "_#$track" }) + "_($date).m4a"
$filename = [regex]::Replace($filename, "[$CannotUsedFileName]", { $UsedFileName[$CannotUsedFileName.IndexOf($args.value[0])] })
$filename = $output_dir + $filename
if (Test-Path $filename) {
"File already exists: $filename"
return
}
$playlist_url = get-playlist-url-by-id $program.episode.video.id
$ffmepg_arg = @('-i' , "`"$playlist_url`"", "-vn" , "-acodec", "copy" , "-bsf:a" , "aac_adtstoasc",
"-metadata", ("title=`"$($program.episode.program_name)" + $(if ($track) { " #$track" }) + " ($date)`""),
"-metadata", "artist=`"$($program.cast)`"",
"-metadata", "album=`"$($program.episode.program_name)`"",
"-metadata", "comment=`"$($program.description -replace '\s+',' ')`"",
"-metadata", "genre=`"Web Radio`"",
"-metadata", "year=`"$year`"",
"-metadata", "date=`"$year`"",
"-metadata", "track=`"$track`"",
"`"$filename`"")
& $ffmpeg $ffmepg_arg
if (Test-Path $filename) {
$succeeded += $filename
}
else {
$failed += $filename
}
}
end {
if ($succeeded) {
"Succeeded: $succeeded"
}
if ($failed) {
"Failed: $failed"
}
}
}
$access_ids | save-hibiki-radio

とりあえず実行

Windowsキーに続いてpowershellと打ち込んでpowershellを起動

ffmpeg*1のパスが通ってないなら、

$ffmpeg='C:\Program Files\...\ffmpeg.exe'

などとする。通っているなら何もしない。

そして、以下の一行を実行

(Invoke-WebRequest https://gist.githubusercontent.com/CannoHarito/75acd6ac09edfa93b54864bdd6b4df3e/raw/save-hibiki-radio.ps1).Content|Invoke-Expression

~/Music/records/フォルダに録音されたm4aファイルが並んでいるはず。

自分の好きなラジオ番組を保存したいなら

$access_ids=@('poppin-radio','hanaso','gfonpu')
(Invoke-WebRequest https://gist.githubusercontent.com/CannoHarito/75acd6ac09edfa93b54864bdd6b4df3e/raw/save-hibiki-radio.ps1).Content|Invoke-Expression

とかすればいいと思う。

ダブルクリックで実行したい

毎週実行するなら、ダブルクリックで実行したい。 文字コードやセキュリティ設定の関係でダウンロードしたbatファイルには一手間必要。

Windowsキーに続いてnotepadと打ち込んでメモ帳を起動。

ブラウザでbatファイルのRawを表示し、Ctrl+ACtrl+C

メモ帳にCtrl+VしてCtrl+Sで文字コードがANSIになっていること確認してラジオ録音.batなどと保存。

これをダブルクリックで実行できる。batファイル上部の###に挟まれた部分にある$DEFO_xxxへの代入を好きなように書き換えよう。

access_idの例

$res=Invoke-RestMethod https://vcms-api.hibiki-radio.jp/api/v1//programs -UserAgent $useragent -Headers $headers
$res|Where-Object{$_.episode_updated_at -And((get-date $_.episode_updated_at)-gt (get-date).AddMonths(-1))}|%{"|"+$_.access_id + "|" +$_.name+"|"+$_.cast+"|"}>access_ids.txt
access_id name cast
road59_radio ROAD59 -新時代ラジオ特区- 君沢ユウキ, 砂川脩弥
mamamika 星めぐり学園presents 京子と帝の☆VTuberだからOK☆ 倉持京子, 帝
skdw ホロライブpresents Vのすこんなオタ活なんだワ! 白上フブキ, 宝鐘マリン
road59_ojyo ROAD59 -新時代任侠特区- お嬢のよりみちラジオ 河内美里, 美波わかな
Septet らじお café Konzert 岩瀬恒輝, 唐崎孝二, 安達勇人
guruguru D4DJ ぐるぐるRADIOTIME!!∼陽葉学園放送室∼
floral D4DJ フローラルトゥナイト
assaultlily アサルトリリィ ラジオガーデン‐OVERFLOW‐ 井澤美香子, 高橋花林
animania あにまにあ 西尾知亜紀(北陸放送アナウンサー)
naviradi ARGONAVIS ナビゲーターラジオ 伊藤昌弘, 小笠原仁
aaside アルゴナビス from BanG Dream! AAside ラジオ・ロワイヤル・フェス
ooimachi 大井町クリームソーダのシュワシュワオーバーフロー・エコータイム 入江玲於奈, 西山宏太朗, 谷口悠
vg-overdress カードファイト!! ヴァンガード overDress 夜の園内放送 小野友樹, 内田雄馬
kadoradi カドラジ 河本啓佑, 加藤里保菜, 遠野ひかる
gfonpu ガルフレ♪ラジオ「明音と文緒の聖櫻学園放送室♪」 佐藤利奈, 名塚佳織
yuzuradi 小林裕介・石上静香のゆずラジ 小林裕介, 石上静香
siegfeld シークフェルトのえ~でるラジオ 野本ほたる, 工藤晴香
revuestarlight 少女☆歌劇 ラジオスタァライト 小山百代, 佐藤日向
symphogear 戦姫絶笑シンフォギアRADIO
chomipa ちょうみりょうぱーてぃー 永野希, 藤川茜, 吉成由貴
joshikin 津田健次郎・大河元気のジョシ禁ラジオ!! 津田健次郎, 大河元気
anigasaki TVアニメ『ラブライブ!虹ヶ咲学園スクールアイドル同好会』RADIO アニガサキ! 矢野妃菜喜, 大西亜玖璃
imas_cg デレラジ☆ アイドルマスターシンデレラガールズ
imas_cg_live デレラジ☆ 生放送 アイドルマスターシンデレラガールズ
kawaii 中島由貴・武田羅梨沙多胡のかわいいラジオ 中島由貴, 武田羅梨沙多胡
rakuon 仲村宗悟・Machicoのらくおん 仲村宗悟, Machico
ff 南條愛乃・エオルゼアより愛をこめて 南條愛乃
tsunradi 新田恵海のえみゅーじっく♪すぱいす☆ 新田恵海
hhw ハロー、ハッピーワールド!のRadioすまいる! 伊藤美来, 田所あずさ, 吉田有里, 豊田萌絵, 黒沢ともよ
daiundoukai バトルアスリーテス大運動会 ReSTART!ラジオ・音楽部 諏訪ななか, 近藤玲奈
Afterglowplus バンドリ! ガールズバンドパーティ!presents Afterglowの夕焼けSTUDIO+ 金元寿子, 三澤紗千香
morfonica バンドリ!ガールズバンドパーティ! presents モニカラジオ 直田姫奈, 西尾夕香
bdp BanG Dream! presents RoseliaのRADIO SHOUT Roselia
poppin-radio バンドリ!ポッピンラジオ! 愛美, 伊藤彩沙, 西本りみ, 大塚紗英, 大橋彩香
pstl Pastel*Palettesのしゅわりんラジオ 前島亜美, 小澤亜李, 上坂すみれ, 中上育実, 秦佐和子
pure ピュアモンラジオ 柳木みり, 吉咲みゆ
priconne_re プリコネチャンネルRe:Dive M・A・O, 伊藤美来, 立花理香
moriya_radio 森谷里美の完パケラジオ! 森谷里美
5hanayomeArchive3 ラジオ「五等分の花嫁∬」再配信 第3回
5hanayomeArchive4 ラジオ「五等分の花嫁∬」再配信 第4回
5hanayome ラジオ「五等分の花嫁∬」 天津向
5hanayomeArchive2 ラジオ「五等分の花嫁∬」再配信 第2回
5hanayomeArchive1 ラジオ「五等分の花嫁∬」再配信 第1回
1000chan RADIO 1000ちゃんねる BOOST! 新田恵海, 白石稔
llss ラブライブ!サンシャイン!! Aqours浦の星女学院RADIO!!! 逢田梨香子, 高槻かなこ, 鈴木愛奈
llnijitmclllz 「ラブライブ!虹ヶ咲学園~お昼休み&おはよう放送室~」公開録音~にじがリッスン♪とみちりりりーず!~ 久保田未夢, 楠木ともり, 田中ちえ美
llniji ラブライブ!虹ヶ咲学園 ~おはよう放送室~ 前田佳織里, 鬼頭明里, 楠木ともり
rebirth Reバースラジオ #りばらじ 西尾夕香, 小山百代
ras RAISE A SUILENのRADIO R・I・O・T 倉知玲鳳, 紡木吏佐
loschool レオパは砕けない 伊藤祐弥, 横山媛奈
lostdecade ロストディケイドRADIO ~アウロラ通信~ 佐々木未来, 愛美, 前島亜美
workssezu THE WORKS せず 桃井はるこ, ユカフィン
wts わきことせりこ 和氣あず未, 芹澤優
yayasuki 鷲崎健・千葉翔也 今んとこやや好き 鷲崎健, 千葉翔也

ffmpeg: 持ってないならぐぐれ。Chocolateyを使ってインストールするとパスが勝手に通るので便利だとか。

@CannoHarito
Copy link
Author

CannoHarito commented Aug 28, 2019

bug fixed
ファイル名に使えない半角記号を全角記号に置き換える処理を追加
→「プリコネチャンネルRe:Dive」の:にして保存するように変更

ついでに「access_idの例」の表を更新しておきました

@CannoHarito
Copy link
Author

久しぶりにHiBiKiラジオを聞こうとしてやり方を忘れたので検索したら、
このgistをきっかけの1つとして開発されたすごいものを発見したので共有しておく。
https://maeda577.github.io/2021/01/10/webradio.html

嬉しくなったので、「access_idの例」の表を更新しておきました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment