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