さんだすメモ

さメモ

技術ブログでは、ない・・・

    ステーション

はじめに

補助的な作業が要らないので完成すれば簡単にできます。

手順

意味不明なドットは省略です。

とりあえず必要なところにアクセスしておく

host_vcms = "vcms...................."
port_vcms = 443
https_vcms = Net::HTTP.new(host_vcms, port_vcms)
https_vcms.use_ssl = true
https_vcms.verify_mode = OpenSSL::SSL::VERIFY_PEER

host_vms = "vms...................."
port_vms = 443
https_vms = Net::HTTP.new(host_vms, port_vms)
https_vms.use_ssl = true
https_vms.verify_mode = OpenSSL::SSL::VERIFY_PEER

最新回の情報を取り出す

GETリクエストを送るときにヘッダーにX-Reuested-Withを加えないと拒否されます。

path_program = "/api/.........../#{program_title}"
request_program = Net::HTTP::Get.new(path_program)
request_program['X-Requested-With'] = "XMLHttpRequest"
response_program = https_vcms.start { |https|
  https.request(request_program)
}

# ハッシュを表す文字列が渡される
# 中でnullが使われているので、とりあえずnull = nilとしておく
null = nil
hash_response_program = eval(response_program.body.force_encoding("utf-8"))

# title, video_idを取得
title = hash_response_program[:episode][:program_name] + "-" + hash_response_program[:episode][:name]
video_id = hash_response_program[:episode][:video][:id].to_s

video_idがわかった後

# play_checkにアクセスしてトークンを取得
# ヘッダーに`X-Reuested-With`を加えておく必要がある
path_play_check = "/............./play_check"
query_play_check = "video_id=#{video_id}"
request_play_check = Net::HTTP::Get.new("#{path_play_check}?#{query_play_check}")
request_play_check['X-Requested-With'] = "XMLHttpRequest"
response_play_check = https_vcms.start { |https|
  https.request(request_play_check)
}

# ハッシュを表す文字列が渡される
# null = nil
hash_response_play_check = eval(response_play_check.body)

# キー情報にアクセスするためのCookieを取得する
url_playlist = hash_response_play_check[:playlist_url]
uri_playlist = URI.split(url_playlist)
path_playlist = uri_playlist[5]
query_playlist = uri_playlist[7]
request_playlist = Net::HTTP::Get.new("#{path_playlist}?#{query_playlist}")
response_playlist = https_vms.start { |https|
  https.request(request_playlist)
}

# Domain, Pathはffmpegで必須
cookie_m3u8 = response_playlist['Set-Cookie'].match(/(_logica.*); path=\/; secure; HttpOnly/)[1] + ";Domain=vms....................;Path=/"
url_m3u8 = response_playlist.body.match(/http.*$/)[0]

system "ffmpeg -cookies #{cookie_m3u8} -i #{url_m3u8} -bsf:a aac_adtstoasc -movflags faststart -acodec copy C:/.../#{title}.m4a"

最後に

video_idは4桁の数字です。重労働ですが、色々調べたいならffmpegで先頭に-t 00:00:03などとすればよいのではないでしょうか(ラジオ)。オープニングは毎回同じなので、やり方は考えていませんがなにかしらを基準に判定させるのもアリですね。