2021年1月26日火曜日

Androidで超A&G+録画

 いらない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

タスクの作成

タスク名はなんでも良い。このタスクは録画する番組ごとに作成する。
  1. 通知を出す / Notify
  2. タイトル:AgRec
    文字:録画中
    アイコン:任意
    永続:有効
  3. Termux
  4. →後述
  5. 通知取り消し / Notify Cancel
  6. タイトル:AgRec
  7. 通知を出す / Notify
  8. タイトル: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 件のコメント:

コメントを投稿