rec_radiko.shを使用して定期的に番組を録音する(MacをSleepする場合)
MacをSleepさせる使い方をしている場合、録音するときSleepを解除する必要がある。
指定した時間スリープ解除するにはpmsetコマンドを使用する。
pmset schedule wake "02/08/18 14:50:00"
2018年2月8日 14:50にSleepから復帰する。
このコマンドはsudoで実行するためパスワードが必要となりシェルスクリプトで使用するには問題がある。
pmsetでパスワード要求をなくすため、visudoを使用して設定する。
sudo visudo
実行したら次の行を追加する。
ユーザー名 ALL=(ALL) NOPASSWD: /usr/bin/pmset
設定後、再ログインするとsudo pmsetをパスワード無しで実行できる。
録音が始まる前にMacをSleepから解除するには、録音終了後に一番近い予約時間を見つけてpmsetコマンドを使用してSleep解除時間を録音時間の数分前に設定すればよい。
以下のスクリプトは録音5分前にMacがSleepを解除し、録音が終了すると直近の録音の設定を見つけてSleep解除時間を設定する。
その後はシステムで設定した時間でMacがSleepする。
#!/bin/sh # 初期化 LANG=C;export LANG compath=`pwd` #myprogram.txtに録音する番組を曜日,開始時間,曲名,録音時間の形式で記載された #予約時間を配列PROGに読み込む filename="myprogram.txt" IFS=$'\n' PROG=(`cat ${filename}|sed -e 's/ //g'` ) function get_nextrecday() { perl -e ' sub get_length_time { my $len_days; my $len_times; my %dotweek=(Mon=>1,Tue=>2,Wed=>3,Thu=>4,Fri=>5,Sat=>6,Sun=>7); my ($valw_1, $valt_1, $valw_2, $valt_2) = @_; my $valt_1_h=substr($valt_1,0,2); my $valt_1_m=substr($valt_1,2,2); my $valt_2_h=substr($valt_2,0,2); my $valt_2_m=substr($valt_2,2,2); if ($valw_1 eq $valw_2) { if ($valt_1 >= $valt_2) { $len_times=6*24*60+(24*60-($valt_1_h*60 + $valt_1_m))+$valt_2_h*60 + $valt_2_m; } else { $len_times=($valt_2_h*60 + $valt_2_m)-($valt_1_h*60 + $valt_1_m); } } else { $len_days=$dotweek{$valw_2} - $dotweek{$valw_1}; if ($len_days<0){$len_days=$len_days+7}; $len_times=(--$len_days)*24*60+(24*60-($valt_1_h*60+$valt_1_m))+$valt_2_h*60+$valt_2_m; } return $len_times; } open(RDFILE, "< myprogram.txt"); @proglist; $prgnum=0; while (<RDFILE>){ s/\s//g; $proglist[$prgnum++] = $_; } $valw=$ARGV[0]; $valt=$ARGV[1]; for ( $i=0; $i < @proglist; $i++ ){ @pdata=split /,/, $proglist[$i]; if ( $i==0 ){ $len_times = get_length_time($valw,$valt,$pdata[0],$pdata[1]); } else { $len_times_next = get_length_time($valw,$valt,$pdata[0],$pdata[1]); if ($len_times_next < $len_times){ $len_times = $len_times_next } } } print "$len_times\n";' $1 $2 } # 一番始めのsleep解除を設定 DOTW=`date|cut -d " " -f 1` NOWT=`date "+%H%M"` let TERM_WAKEUP_TIME=`get_nextrecday $DOTW $NOWT`-5 WAKEUP_TIME=`date -v+${TERM_WAKEUP_TIME}M "+%m/%d/%y %H:%M:00"` sudo pmset schedule wake "$WAKEUP_TIME" echo "** Next Wake Up Time $WAKEUP_TIME **" >> radiko_rec.log # PROGで設定した番組を録音 while true do for i in ${PROG[@]}; do RECWEEK=`echo $i|cut -d, -f 1` RECTIME=`echo $i|cut -d, -f 2` if [ "$RECWEEK" = "`date|cut -d" " -f 1`" ] && [ "$RECTIME" = `date "+%H%M"` ]; then RECRCHN=`echo $i|cut -d, -f 3` RECTLEN=`echo $i|cut -d, -f 4` let RecSec=$RECTLEN*60 $compath/rec_radiko.sh -o $compath/downloads/ -t $RecSec $RECRCHN DOTW=`date|cut -d" " -f 1` NOWT=`date "+%H%M"` let TERM_WAKEUP_TIME=`get_nextrecday $DOTW $NOWT`-5 WAKEUP_TIME=`date -v+${TERM_WAKEUP_TIME}M "+%m/%d/%y %H:%M:00"` sudo pmset schedule wake "$WAKEUP_TIME" echo "=====================================" >> radiko_rec.log echo " Record End Time :`date '+%m/%d/%y %H:%M:%S'`" >> radiko_rec.log echo " Next Wakeup Time :$WAKEUP_TIME" >> radiko_rec.log echo "-------------------------------------" >> radiko_rec.log fi done done