summaryrefslogtreecommitdiff
path: root/contrib/postproc.pl
blob: eefbd32ec2e8e86c761ae9b3b615327e7505641b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/perl
use strict;

use File::Basename;

my $LOGGER = "/usr/bin/logger -t " . basename(__FILE__);
my $mydir = dirname(__FILE__);

# write into logfile for debugging purpose
my $logfile;
$logfile= $mydir . '/' . basename(__FILE__, '.pl') . '.log';

# function to write into syslog
sub Log
{
	system("$LOGGER '[audiorecorder]: @_'");
	print LOGFILE "# @_\n" if (defined($logfile));
}

if (defined($logfile)) {
	# open file for debug
	open(LOGFILE, ">> " . $logfile)
	  or die "Fehler beim Öffnen von '$logfile': $!\n";
	print LOGFILE "=========================== ". localtime() . "\n";
	print LOGFILE 'ARGV[0] = ' . $ARGV[0] . "\n";
	print LOGFILE 'ARGV[1] = ' . $ARGV[1] . "\n";
	print LOGFILE 'ARGV[2] = ' . $ARGV[2] . "\n";
	print LOGFILE 'ARGV[3] = ' . $ARGV[3] . "\n";
	print LOGFILE 'ARGV[4] = ' . $ARGV[4] . "\n";
	print LOGFILE 'ARGV[5] = ' . $ARGV[5] . "\n";
	print LOGFILE 'ARGV[6] = ' . $ARGV[6] . "\n";
	print LOGFILE 'ARGV[7] = ' . $ARGV[7] . "\n";
	print LOGFILE 'ARGV[8] = ' . $ARGV[8] . "\n";
	print LOGFILE 'ARGV[9] = ' . $ARGV[9] . "\n";
}

# test number of parameters
if ($#ARGV ne 7) {
	Log("Wrong number of parameters");
	exit;
}

# use telling names for parameters
my $src = $ARGV[0];
my $src_bitrate = $ARGV[1];
my $artist = $ARGV[2];
my $title = $ARGV[3];
my $channel = $ARGV[4];
my $event = $ARGV[5];
my $codec = $ARGV[6];
my $dst_bitrate = $ARGV[7];

# test parameters
if ($artist eq "" || $title eq "") {
	Log("Without data better remove this file");
	exit;
}

# Create canonical filename
my $dst;
my $tmp = lc($artist . "_-_" . $title);
# clear nearly all non-characters
$tmp =~ s/[ \*\?!:"\']/_/g;
# converts slashes to commas
$tmp =~ s/\//,/g;
# convert special characters to ASCII
$tmp =~ s/[áàå]/a/g;
$tmp =~ s/ä/ae/g;
$tmp =~ s/ç/c/g;
$tmp =~ s/[éÉè]/e/g;
$tmp =~ s/[íï]/i/g;
$tmp =~ s/ñ/n/g;
$tmp =~ s/[óò]/o/g;
$tmp =~ s/ö/oe/g;
$tmp =~ s/ù/u/g;
$tmp =~ s/ü/ue/g;
# remove multiple underscores
$tmp =~ s/___*/_/g;
# remove underscore at file end
$tmp =~ s/_$//g;

# Name with extension
$dst = $tmp . "." . $codec;

# open blacklist
my $inname = $mydir . '/blacklist.m3u';
if (open(BLACKLIST, "< " . $inname)) {
	while (<BLACKLIST>) {
		chomp;
		if ($_ eq $dst) {
			Log("File $dst blacklisted");
			exit;
		}
	}
	close(BLACKLIST)
}

# calculate sizes
my $src_size = (-s $src);
print LOGFILE "size($src) = " . $src_size . "\n" if (defined($logfile));

# No file smaller 8 secs
if ($src_size < $src_bitrate) {
    Log("File $src too small ($src_size)!");
    exit;
}

# Full qualified name
my $audiodir = dirname($src) . '/';
my $fqn = $audiodir . $dst;

# file already exists?
if (-e $fqn) {
	# Write duplicate file under curtain circumstances 
	my $size = (-s $fqn); 
	print LOGFILE "size($dst) = " . $size . "\n" if (defined($logfile));
	# If file size is smaller than 17000 bytes this files are special
	if ($size < 17000) {
		Log("File already on CD");
		exit;
	}

	my $dst_size = 0;
	$dst_size = $src_size * $dst_bitrate / $src_bitrate if (!($src_bitrate == 0));
	print LOGFILE "approx. size($dst) = " . $dst_size . "\n" if (defined($logfile));

	if ($size > $dst_size) {
		Log("Already larger version on disk ($size vs. $dst_size)");
		exit;
	} 

		# Files larger than existing ones are stored with
		# a special numbered extension
		my $i = 0;
		while (-e $fqn) {
			$i++;
			$dst = $tmp . ".~" . $i . "~." . $codec;
			$fqn = $audiodir . $dst;
		}
	}

print LOGFILE '$dst = ' . $dst . "\n" if (defined($logfile));
# return file name
print $dst;