最近のテレビは録画機能が充実していて、
指定したキーワードで勝手に録画をためこんでくれます。
私が使っている「ビエラ」さんには、
2TBの外付けハードディスクを付けていて、
200時間ほどの録画ができるのですが、
気づくと一杯になってしまいます。
困ったことに、容量が一杯の状態で、
予約録画を開始すると、
予約録画の方をやめてしまいます。
そのため、容量が一杯になる前に、
もう見ないような番組を消していかないといけないのですが、
手動で消すとなかなかの手間です。
古いものから順番に消してくれればいいのに、
と思っても、そんな都合のいい機能はありません。。。
ないなら、作るしかない!
ということで、ビエラの録画番組を自動消去するプログラムを作ってみましょう。
[:contetns]
Dimora を使う
プログラムを作るにしても、
パソコンからテレビの操作ができないことには、
始まりません。
ここでは、ブラウザから家のテレビの録画操作ができる
Dimora を使うことにします。
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 で削除が出来なくなっています。
そのため、削除されたくない番組は保護しておけば、
問題ありませんね。
むしろ、保護設定があるのに、
自動削除の機能がないのが不思議ですね。。。
まとめ
ビエラに備わっていない自動削除機能を自作してみました。
このプログラムを定期的に実行するようにすれば、
容量一杯で録画したかった番組が撮れてない!
という悲しい思いをせずに済みますね。