クイックノート

ちょっとした発見・アイデアから知識の発掘を

ビエラの録画番組を自動消去する

最近のテレビは録画機能が充実していて、
指定したキーワードで勝手に録画をためこんでくれます。

私が使っている「ビエラ」さんには、
2TBの外付けハードディスクを付けていて、
200時間ほどの録画ができるのですが、
気づくと一杯になってしまいます。

困ったことに、容量が一杯の状態で、
予約録画を開始すると、
予約録画の方をやめてしまいます

そのため、容量が一杯になる前に、
もう見ないような番組を消していかないといけないのですが、
手動で消すとなかなかの手間です。

古いものから順番に消してくれればいいのに、
と思っても、そんな都合のいい機能はありません。。。

ないなら、作るしかない!
ということで、ビエラの録画番組を自動消去するプログラムを作ってみましょう。

[:contetns]

Dimora を使う

プログラムを作るにしても、
パソコンからテレビの操作ができないことには、
始まりません。

ここでは、ブラウザから家のテレビの録画操作ができる
Dimora を使うことにします。

Dimora を使うためには、

  1. ビエラの設定からディモーラによる録画番組削除を有効にしておく
  2. Dimora のアカウント作成と、ビエラの登録を行う

という準備が必要になります。

準備が整ったら、プログラムを作っていきましょう。

Selenium から Dimora を操作する

後は、Selenium を使って Dimora のブラウザ操作を自動化するだけです。 Selenium を使う準備は下の記事を参考にして下さい。

clean-copy-of-onenote.hatenablog.com

設定

Dimora にログインするためのユーザーIDやパスワードなどの情報を設定します。

library(RSelenium)
library(rvest)
library(readr)

uid = "USER_ID"
pass = "PASSWORD"
cookie_file = "path_to_cookie"

hour_th = 24

また、Dimora でのログインを省略するために、
Cookie を使うので、Cookie 情報の保存先をcookie_fileで決めておきます。

hour_thは確保する残りの録画時間で、
今の場合、HDDの残容量が24時間以下になると、
24時間分の容量を確保するように、古い録画を削除していきます。

Cookie を使って Dimora に接続

一度、認証済みの Cookie が残っていれば、
ログインの手間を省いてそのまま接続することができます。

今回、この Cookie を使うことが重要になります。
というのも、Dimora ではログインの際に画像認証を行っているので、
Cookie を使ってログインの省略をしないと、
自動でログインすることが出来ない(難しい)からです。

dimora_url = "https://dimora.jp"
remDr = remoteDriver(remoteServerAddr = "0.0.0.0",
                     port = 4444,
                     browserName = "chrome")
remDr$open()

remDr$navigate(dimora_url)
Sys.sleep(1)
remDr$deleteAllCookies()
Sys.sleep(1)

load(cookie_file)
for(x in cookie){
  if(is.null(x$expiry)){
    remDr$addCookie(name=x$name,path=x$path,value=x$value,
                    domain=x$domain,httpOnly = x$httpOnly,
                    secure = x$secure)    
  }else{
    remDr$addCookie(name=x$name,path=x$path,value=x$value,
                    domain=x$domain,httpOnly = x$httpOnly,
                    expiry = x$expiry,secure = x$secure)
  }
}

remDr$navigate(dimora_url)
Sys.sleep(1)

上では、保存している Cookie を読み込んだ上で、
Dimora のサイトにアクセスしています。
Cookie が有効であれば、そのままマイページへのアクセスが行われます。

Cookie がない場合の手動ログイン

初めの1回目のアクセスだけは、
Cookie がないので、画像認識を手動で行って、
ログインする必要があります。

下では、ユーザーIDとパスワードを自動で入力して、
画像認識用の画像をスクリーンショットから表示して、
手動で認証コードを入力しています。

ログイン後は、Cookie の保存を行っているので、
2回目以降は、自動的にログインすることができるようになります。

if(remDr$getCurrentUrl() == dimora_url){ # not auto login
  ###### toppage -> login
  
  page = remDr$getPageSource()[[1]] %>% read_html()
  link = page %>% html_nodes(xpath="//a[@id='linkLogin']")
  remDr$navigate(link %>% html_attr("href"))
  
  ###### loginpage -> my page
  id_e = remDr$findElement("xpath",value="//input[@id='loginId']")
  pass_e = remDr$findElement("xpath",value="//input[@id='loginPass']")
  captcha_e = remDr$findElement("xpath",value="//input[@id='loginImgNm']")
  auto_e = remDr$findElement("xpath",value="//input[@id='autologin']")
  login_b = remDr$findElement("xpath",value="//a[@id='loginBtn']")
  
  remDr$screenshot(display =TRUE)
  cap_nm = readline("captcha code : ")
  
  id_e$clickElement()
  remDr$sendKeysToActiveElement(list(uid))
  
  pass_e$clickElement()
  remDr$sendKeysToActiveElement(list(pass))
  
  captcha_e$clickElement()
  remDr$sendKeysToActiveElement(list(cap_nm))
  
  auto_e$clickElement()
  
  login_b$clickElement()
  
  Sys.sleep(1)
  remDr$getAllCookies()->cookie
  save(cookie,file=cookie_file)
} 

HDD の残量を確認

HDDに余裕がある限りは録画番組を残しておきたいので、
ちゃんと、HDDの残量を確認します。

といっても、マイページに表示されているHDDの残量をそのまま読み取るだけですね。

get_remaining_HDD = function(remDr){
  page = remDr$getPageSource()[[1]] %>% read_html()
  HDD_row = page %>% html_node(xpath = "//*[contains(./text(),'HDD残量')]/..")
  parse_number(HDD_row %>% html_node(xpath="td/font") %>% html_text())
}
HDD = get_remaining_HDD(remDr)

古い番組順に録画を消去

後は、録画番組を古い番組から順番に消去していって、
目標の容量を確保すれば完了です。

Dimora の録画番組のページから、
録画番組を古い順番に並べて、
それを順番に削除していくというシンプルなものです。

削除する番組の長さを基に、HDDの残量を更新して、
初めの目標容量を確保するまで、削除を繰り返していきます。

if(HDD < hour_th){
  #### my page -> recorded videos
  remDr$navigate("https://dimora.jp/rec-list")
  Sys.sleep(1)
  #### sort video list old
  sort_btn = remDr$findElement(using="id","iRec_date")
  if(sort_btn$getElementAttribute("class") != "cCmnSortLnk cCmnSortSel cCmnsortAsk"){
    sort_btn$clickElement()
  }
  Sys.sleep(1)
  disnum_btn = remDr$findElement(using="id","iRecLstHundRdi")
  disnum_btn = remDr$findElement(using="xpath","//div[@id='iRecLstHundRdi']/input")
  disnum_btn$clickElement()
  Sys.sleep(1)
  #### auto delete
  pp = 1
  while(HDD < hour_th){
    del_btns = remDr$findElements(using="class","cRecDelBtn")
    i=1
    # deleting page
    while(HDD < hour_th){ 
      del_btn = del_btns[[i]]
      vid = sub("rec-del_","",del_btn$getElementAttribute("id"))
            
      del_btn$clickElement()
      Sys.sleep(1)
      conf_e = remDr$findElement(using="class","cRecBtnYes")
      conf_e$clickElement()
      Sys.sleep(1)
      
      HDD = HDD + get_video_length_by_id(remDr,vid)
      i = i+1
      print(sprintf("DEBUG: deleting video : %s",vid))
    }
    # next page
    pp = pp + 1
    page_btns = remDr$findElements("xpath","//dl[@class='contReservationPageList']/dt")
    pages = sapply(page_btns,function(x){x$getElementText()[[1]]})
    next_btn = page_btns[[min(which(pages == pp))]]
    next_btn$clickElement()
    Sys.sleep(1)
  }
}

自動で削除したくない番組は保護

ビエラ側で保護設定をしている番組については、
Dimora で削除が出来なくなっています。

そのため、削除されたくない番組は保護しておけば、
問題ありませんね。

むしろ、保護設定があるのに、
自動削除の機能がないのが不思議ですね。。。

まとめ

ビエラに備わっていない自動削除機能を自作してみました。
このプログラムを定期的に実行するようにすれば、
容量一杯で録画したかった番組が撮れてない!
という悲しい思いをせずに済みますね。

プライバシーポリシー