EPGStation で WebAPI を使って録画ファイルをキーワード削除

EPGStation での録画ファイル管理。

「EPGStation で WebAPI を使って余分な TS ファイルを削除」
https://qiita.com/nanbuwks/items/bab77ef5c61b5e74c905

を応用して、 python で EPGStation の録画ファイルをキーワード削除するようにしてみます。


# 環境

 
- Version of EPGStation: 2.6.20
- Version of Mirakurun: 3.9.0-rc.2
- OS:Ubuntu Linux 20.04
- Architecture: x64

「PLEX PX-Q3PE4 で docker-mirakurun-epgstation を使いたい」
https://qiita.com/nanbuwks/items/640ee4405e1fdd2ca497
こちらで構築したものです。

# 作戦

1. 録画リスト取得
1. 不要な録画ファイルがあるか判定
1. 不要な録画ファイルを削除

# 録画リスト取得、不要な録画ファイルがあるか判定

以下のようにして取得
```
$ curl -X 'GET' 'http://192.168.42.100:8888/api/recorded?isHalfWidth=false&offset=0&limit=24&isReverse=true&keyword=%E5%88%97%E5%B3%B6%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&hasOriginalFile=false'   -H 'accept: application/json'
```
取得したもの
```
{"records":[{"id":50,"channelId":3273601024,"startAt":1661486700000,"endAt":1661489700000,"name":"列島ニュース[字]","isRecording":false,"isEncoding":false,"isProtected":false,"programId":327360102401403,"description":"日本列島の今が見える！ＮＨＫが地域向けに放送しているお昼のニュースを選（え）りすぐって大阪から全国に発信。地域の課題や郷土の話題を盛りだくさんでお届けします。","extended":"◇番組内容\n「列島各地の地域ニュースを選りすぐって大阪から全国に発信します」。全国に５４あるＮＨＫの各放送局が取材して地域向けに放送したお昼のニュースから地域の課題、地元ならではの話題などを集めて盛りだくさんでお伝えします。今年度は中継で結んで現地の放送局から伝える「列島ニュースアップ」と「ＮＨＫ　ＮＥＷＳ　ＷＥＢ」に掲載された特集記事を紹介するコーナーを新たに開始！ライブ感とネット連携を強化してお届けします\n◇出演者\n【キャスター】武田真一，伊藤雄彦，二宮直輝，牛田茉友，一柳亜矢子，【気象予報士】坂下恵理","genre1":0,"subGenre1":0,"videoType":"mpeg2","videoResolution":"1080i","videoStreamContent":1,"videoComponentType":179,"audioSamplingRate":48000,"audioComponentType":1,"thumbnails":[48],"videoFiles":[{"id":13451,"name":"H.264","filename":"2022年08月26日13時05分00秒-列島ニュース[字].mp4","type":"encoded","size":80505197}]}],"total":1}
```
この中の

- "id":50,"

を指定して、録画を削除する。

# 不要な録画を削除
```
$ curl -X 'DELETE'   'http://192.168.42.100:8888/api/recorded/50'   -H 'accept: application/json'
```
これに対し、帰ってきた返答は
```
{"code":200}
```
うまくいったようです。

# pythonプログラム

上記の操作を元に、以下のプログラムを作りました。

```
#import requests
import sys
import urllib.parse
import urllib.request
import json
import time

# limit を適宜変更のこと
urlget = "http://192.168.42.100:8888/api/recorded?isHalfWidth=false&offset=0&limit=10000&keyword="+urllib.parse.quote(sys.argv[1])
urldelete = "http://192.168.42.100:8888/api/recorded/"

# 録画一覧を表示
# 録画一覧を得る
response = urllib.request.urlopen(urlget)
jsonData = json.load(response)
# 録画ごとにループ
for jsonObj in jsonData["records"]:
    # "videoFilesを取り出し
    for videoFileObj in jsonObj["videoFiles"]:
        name=videoFileObj["filename"]
        print(":",name)

yesno = input("Delete Files. OK? [y/N]: ").lower()
    if yesno in ['y', 'ye', 'yes']:
        # 削除実行
        # 録画一覧を得る
        response = urllib.request.urlopen(urlget)
        jsonData = json.load(response)
        # 録画ごとにループ
        for jsonObj in jsonData["records"]:
            # "録画IDを取り出し
            id=jsonObj["id"]
            url=urldelete+str(id)
            headers = {"Content-Type": "application/json"}
            res=urllib.request.Request(url,json.dumps(jsonObj).encode(),headers,method="DELETE")
            try:
              with urllib.request.urlopen(res) as f:
                  pass
              print(f.status,end="")
              if (200==f.status):
                print(" DELETE",end="")
                print(":",id)
              else:
                print(" Error",end=" ")
                print(f.reason)
                print(" at:",nameTs)
            except urllib.error.HTTPError as err:
              print(" Error",end=" ")
              print(err.code,end=" ")
              print("at:",id)
            except urllib.error.URLError as err:
              print(" Error",end="")
              print(err.reason)
              print("at:",id)


```

## 実行
```
$ python3 deleteepgstation.py おはよう日本
```
合致するリストが出てきます。
```
: 2022年08月28日07時40分00秒-ＮＨＫニュース　おはよう日本（関東甲信越）[字].mp4
: 2022年08月28日07時00分00秒-ＮＨＫニュース　おはよう日本　夏休み明け子どもの悩み▽「魔球」の謎[字].mp4
```
まずはキャンセルして
```
Delete Files. OK? [y/N]: n
```

再度絞り込んで指定します。
```
$ python3 deleteepgstation.py おはよう日本（関東甲信越）
```
該当が出てきたのでこれを削除します

```
: 2022年08月28日07時40分00秒-ＮＨＫニュース　おはよう日本（関東甲信越）[字].mp4
Delete Files. OK? [y/N]: y
```
うまく削除できました。
```
200 DELETE: 110
```