さんだすメモ

さメモ

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

    TS

開始時間を指定して録画する。等倍なのがよくない。
認証用にselenium-webdriverを利用。ログから探したいのでchromedriverを使う。

手順

起動

require 'selenium-webdriver'

log_prefs = { "performance" => "ALL" }
caps = Selenium::WebDriver::Remote::Capabilities.chrome("loggingPrefs" => log_prefs)

driver = Selenium::WebDriver.for :chrome, desired_capabilities: caps

# タイムアウトの時間設定
driver.manage.timeouts.page_load = 30

これでログが確認できるらしい。何をやっているかは調べてない。

ログイン

省略

再生

# ページのurl
live_url = "?????"

# ページにアクセス
driver.get(live_url)

# 設定ボタン
setting_button = driver.find_element(:xpath, "//button[contains(@class, 'setting-button')]")

# 設定が閉じていたら開く
if setting_button.attribute("aria-pressed") == "false"
  driver.action.move_to(setting_button).click().perform()
end

# 画質を選択する
video_quality_select_box = Selenium::WebDriver::Support::Select.new(driver.find_element(:xpath, "//select[contains(@name, 'videoQualitySelectBox')]"))
video_quality_select_box.select_by(:index, 1)


# 設定が開いていたら閉じる
puts setting_button.attribute("aria-pressed")
if setting_button.attribute("aria-pressed") == "true"
  driver.action.move_to(setting_button).click().perform()
end

# ここまでのログを処理しておく
driver.manage.logs.get(:performance)

# 再生位置を指定
time_text_box = driver.find_element(:xpath, "//input[contains(@class,'time-text-box')]")
time_text_box.send_keys(start_time, :enter)

# 再生中止
begin
  play_button = driver.find_element(:xpath, "//button[contains(@class,'play-button')]")
  Selenium::WebDriver::Wait.new(:timeout => 3).until {
    play_button.attribute("data-toggle-state") == "true"
  }
  driver.action.move_to(play_button).click().perform()
rescue
end

ログを確認

# m3u8のurlを取得
url_m3u8 = ""
driver.manage.logs.get(:performance).each do |log_entry|
  hash_message = JSON.parse(log_entry.message)
  if hash_message["message"]["method"] == "Network.requestWillBeSent"
    url = hash_message.dig("message", "params", "request", "url")
    if url.match(/master\.m3u8/)
      url_m3u8 = url
      puts url_m3u8
    end
  end
end

command = "ffmpeg -i \"#{url_m3u8}\" -bsf:a aac_adtstoasc -movflags faststart #{file_path}"

補足など

ページを開いておけばurlのみで大丈夫みたいだったため、この形にした。
ffmpegの開始が遅れるせいか、開始時間の指定から5秒遅れて始まることに気をつける。終了時間も指定しないとよくないかも。開始時間を指定するのは全体の時間短縮のためで、微調整は後でする。
ブラウザが作れると後々便利そうだけど……。