録音されたファイルにアクセス権を設定するようにした.
[rec-radiko.git] / rec-radiko.pl
1 #!/usr/bin/env -S perl -w
2
3 # 指定時刻に radiko を録音するための at job を発行するツール.
4 #                                (https://satomichan.jp/rec-radiko)
5 #
6 # 録音には radish (https://github.com/uru2/radish) を利用しています.
7 # m4a形式で録音後, mp3形式に変換をします.
8 #
9 # 使い方は引数なしで実行すると表示されます.
10 #
11 # Copyright 2024 FUKUDA Satomi (https://satomichan.jp/)
12
13 # Licensed under the Apache License, Version 2.0 (the “License”);
14 # you may not use this file except in compliance with the License.
15 # You may obtain a copy of the License at
16 # http://www.apache.org/licenses/LICENSE-2.0
17
18 # Unless required by applicable law or agreed to in writing, software
19 # distributed under the License is distributed on an “AS IS” BASIS,
20 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
22 # See the License for the specific language governing permissions and
23 # limitations under the License.
24
25 use strict;
26 use warnings;
27
28 use utf8;
29 binmode STDIN,  ":utf8";
30 binmode STDOUT, ":utf8";
31 binmode STDERR, ":utf8";
32
33 use File::Basename;
34 use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat);
35
36
37
38 # コマンドのフルパスを取得
39 my $AT     = `which at      | tr -d '\n'` or die 'at がインストールされていないか, パスが通っていません.';
40 my $RADISH = `which radi.sh | tr -d '\n'` or die 'radi.sh がインストールされていないか, パスが通っていません.';
41 my $FFMPEG = `which ffmpeg  | tr -d '\n'` or die 'ffmpeg がインストールされていないか, パスが通っていません.';
42 my $BASH   = `which bash    | tr -d '\n'`;
43 my $ECHO   = `which echo    | tr -d '\n'`;
44 my $SLEEP  = `which sleep   | tr -d '\n'`;
45 my $RM     = `which rm      | tr -d '\n'`;
46 my $CHMOD  = `which chmod   | tr -d '\n'`;
47
48
49
50 # 保存先
51 my $DIR_SAVE_TO = $ENV{RADIKO_SAVE_TO};
52 die "環境変数 RADIKO_SAVE_TO に保存先ディレクトリを指定してください." unless    $DIR_SAVE_TO;
53 die "保存先 $DIR_SAVE_TO が存在しません."                             unless -d $DIR_SAVE_TO;
54 die "保存先 $DIR_SAVE_TO に書き込み権限がありません."                 unless -w $DIR_SAVE_TO;
55
56
57
58 # 動作モード
59 my $is_check_mode   = 0;
60 my $is_conv_to_mp3  = 1;
61 my $SLEEP_TIME_SEC  = 5;
62 my $FILE_PERMISSION = 644;
63
64
65
66 # オプション解析
67 my %opts;
68 GetOptions(  \%opts, ("check|c", "no-conversion-to-mp3|n")  );
69 $is_check_mode  = 1 if $opts{'check'};
70 $is_conv_to_mp3 = 0 if $opts{'no-conversion-to-mp3'};
71
72
73
74 # 引数なし実行 使い方を表示
75 unless (@ARGV) {
76         my $script_name = basename($0, '');
77         my $usage = << "    EOM_USAGE";
78     USAGE) $script_name [-c|--check] [-n|--no-conversion-to-mp3] <放送局ID> <録音開始日> <録音開始時刻> <録音長(分)> <タイトル>
79        ex) $script_name JOAK-FM 2024-08-25 0305 56 shinyabin_taniyama-hiroko
80        ex) $script_name --check JOAK-FM 2024-08-25 3:05 56 shinyabin_taniyama-hiroko
81
82     <放送局ID>は  radi.sh -l | perl -ne 'print if /radiko/../^\$/'  で確認できます.
83     
84     EOM_USAGE
85     
86     print STDERR $usage;
87     exit;
88 }
89
90
91
92 # 引数 解析
93 my($station, $date, $time, $min, $title) = @ARGV;
94
95 my($y, $m, $d) = split(/-/, $date);
96 my($time_h, $time_m) = ($1, $2) if $time =~ /(\d{1,2}):?(\d{2})/;
97 $title =~ s/\s+/_/g;
98 die "無効な引数です." unless ($y && $m && $d && $time_h <= 24 && $time_h >= 0 &&
99                                $time_m <= 59  && $time_m >= 0  && $min > 0     && length $title);
100
101 my $file_name_base = sprintf('%04d-%02d-%02d_%02d%02d_%s_%s', $y, $m, $d, $time_h, $time_m, $station, $title);
102 my $m4a = "${file_name_base}.m4a";
103 my $mp3 = "${file_name_base}.mp3";
104
105
106
107 # コマンド構築
108 my $rec_cmd = "cd $ENV{RADIKO_SAVE_TO}; $RADISH -t radiko -s $station -d $min -o $m4a; $CHMOD $FILE_PERMISSION $m4a; ";
109 if ($is_conv_to_mp3) {
110     $rec_cmd .= "$FFMPEG -i $m4a $mp3 &> /dev/null; $SLEEP $SLEEP_TIME_SEC; ".
111                 "if [ -s $mp3 ]; then $RM $m4a; $CHMOD $FILE_PERMISSION $mp3; fi";
112 }
113
114 my $at_time = sprintf('%d:%02d %02d.%02d.%02d', $time_h, $time_m, $d, $m, ($y - int($y/100)*100 )  );
115
116 my $cmd     = qq{$ECHO -e '$BASH << EOC\\n$rec_cmd\\nEOC' | $AT "$at_time"};
117
118
119
120 # 実行
121 if ($is_check_mode) {
122     print "$cmd\n\n";
123     exit;
124 } else {
125     chdir $DIR_SAVE_TO;
126     system($cmd);
127     exit;
128 }