いらないAndroid端末を有効活用してみる。
使用環境
- Android 10
- Tasker(有料)
- Termux
- Termux:Tasker(有料)
方針
単純に、Taskerで曜日時間指定してTermux経由でPythonスクリプトを実行する。
python準備
インストール
pkg install -y python
ストレージアクセス
termux-setup-storage
ffmpegインストール
apt install ffmpeg
録画スクリプト
agr4d.py
#-*- coding: utf-8 -*-
import re
import argparse
import subprocess
import math
from pathlib import Path
from time import sleep
from datetime import datetime as dt
from threading import (Event, Thread)
parser = argparse.ArgumentParser(description='')
parser.add_argument('title',)
parser.add_argument('dur',type=float)
args = parser.parse_args()
class AgRec:
def __init__(self):
pass
def rec(self,duration,file):
self.rec_states = True
self.ts_file = file.with_suffix('.ts')
self.duration = duration
th1 = Thread(target=self.rec_start)
th1.start()
self.errchk()
def rec_start(self):
cmd = r'ffmpeg -y -i https://fms2.uniqueradio.jp/agqr10/aandg1.m3u8 -c copy "{}"'.format(str(self.ts_file))
self.proc=subprocess.Popen('exec '+cmd,shell=True,stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
self.proc.communicate()
cmd = r'ffmpeg -y -i {} -c copy "{}"'.format(str(self.ts_file),str(self.ts_file.with_suffix('.mp4')))
subprocess.run(cmd,shell=True,stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
self.ts_file.unlink()
self.rec_states = False
def errchk(self):
c = math.ceil(self.duration / 2)
for i in range(c):
if not self.rec_states:
print('録画が中断されました:{}'.format(self.ts_file.stem))
break
sleep(2)
if self.rec_states:
self.proc.kill()
print('録画が終了しました:{}'.format(self.ts_file.stem))
now = dt.now()
date = now.strftime('%Y%m%d')
r_dir = Path('rec') / args.title
r_dir.mkdir(parents=True,exist_ok=True)
if '[' in args.title:
filename = date + '_' + args.title.split('[')[0]
else:
filename = date + '_' + args.title
duration = args.dur
file = r_dir / (filename)
ag = AgRec()
ag.rec(duration,file)
多分動くはず。以前のやつとは違ってファイル/フォルダのダメ文字処理はないので注意。
謎に途中でffmpegが落ちることがあるので、ffmpegの-tは使わずに指定時間録画したらkillするようにした。まあこれでも落ちる時があるから落ちたことがわかるだけなんだけど。
Tasker
タスクの作成
タスク名はなんでも良い。このタスクは録画する番組ごとに作成する。
- 通知を出す / Notify タイトル:AgRec
- Termux →後述
- 通知取り消し / Notify Cancel タイトル:AgRec
- 通知を出す / Notify タイトル:AgRec
文字:録画中
アイコン:任意
永続:有効
文字:%stdout
Termuxで直接agr4d.pyを指定しても起動できない。そこで、agr4d.pyを呼び出すbashスクリプトを作成する。
Termuxにてnanoをインストール
pkg install -y nano
bashスクリプトの作成
cd ~/.termux/tasker/
nano agr4d.sh
agr4d.sh
cd ~/storage/shared python agr4d.py “$1” $2
上のagr4d.pyはstorage/emulated/0/に配置する。
ここまでやってから、Termux:Taskerの設定を以下のようにする。
設定
Executable in ~/.termux/tasker : agr4d.sh
Arguments : “番組名[再]” 放送時間(sec)
Execute in a terminal session :無効
制限時間(秒):しない
放送時間は念のため30秒程度のマージンがあると良い(なくてもOK)。
プロファイルの作成
タスクのトリガーとなる条件を曜日/時間で指定し作成したタスクと関連づける。HLSのラグが1分弱あるが、秒単位で開始時刻を指定できないので番組表通りの時刻を指定する。
所感
めんどくさいかと思いきや思いの外すんなりいったが、録画専用にするならraspberry piの方が自由度があっていいのかもしれない。そのうちトライしてみたい。
0 件のコメント:
コメントを投稿