mirror of
https://github.com/moex3/flac2mp3.pl
synced 2024-11-24 04:22:49 -05:00
Add id3v2 tag escaping
This commit is contained in:
parent
1628834c1b
commit
63edb804ce
40
flac2mp3.pl
40
flac2mp3.pl
@ -29,10 +29,10 @@ my %genreMap = (
|
||||
# Vorbis tag string => Mp3 tag value
|
||||
# where mp3 tag value may be:
|
||||
# undef -> Skip this tag
|
||||
# A string -> Use this as the mp3 tag, and use the vorbis tag value as value
|
||||
# code -> Execute this function. This should return an array, where [0] is the tag, [1] is the value.
|
||||
# An array (str, str) -> [0] is the mp3 tag to use, [1] is the value prefix
|
||||
# An array (str, code) -> [0] is the mp3 tag to use, [1] is a function that is executed, and the result is the tag value
|
||||
# A string -> Use this as the mp3 tag, and use the vorbis tag value as value (tags are escaped)
|
||||
# code -> Execute this function. This should return an array, where [0] is the tag, [1] is the value. (tags are not escaped)
|
||||
# An array (str, str) -> [0] is the mp3 tag to use, [1] is the value prefix (tags are escaped)
|
||||
# An array (str, code) -> [0] is the mp3 tag to use, [1] is a function that is executed, and the result is the tag value (tags are not escaped)
|
||||
# The code-s here will be called with the flac tags hashmap
|
||||
my %idLookup = (
|
||||
album => 'TALB',
|
||||
@ -83,7 +83,7 @@ my %idLookup = (
|
||||
date => sub {
|
||||
my $t = shift;
|
||||
my $date = $t->{date}[0];
|
||||
if (length($date) == 4) { # Only year
|
||||
if (length($date) == 4 && $date =~ m/\d{4}/) { # Only year
|
||||
return ["TYER", "$date"];
|
||||
}
|
||||
if (!($date =~ m/^\d{4}[\.-]\d{2}[\.-]\d{2}$/)) {
|
||||
@ -97,10 +97,10 @@ my %idLookup = (
|
||||
'release date' => 'TDOR', # Also for 2.4 only
|
||||
isrc => 'TSRC',
|
||||
barcode => ['TXXX', 'BARCODE:'],
|
||||
catalog => ['TXXX', sub { return "CATALOGNUMBER:" . tagmap_catalogid(shift, 'catalog'); } ],
|
||||
catalognumber => ['TXXX', sub { return "CATALOGNUMBER:" . tagmap_catalogid(shift, 'catalognumber'); } ],
|
||||
catalogid => ['TXXX', sub { return "CATALOGNUMBER:" . tagmap_catalogid(shift, 'catalogid'); } ],
|
||||
labelno => ['TXXX', sub { return "CATALOGNUMBER:" . tagmap_catalogid(shift, 'labelno'); } ],
|
||||
catalog => ['TXXX', sub { return "CATALOGNUMBER:" . mp3TagEscapeOwn(tagmap_catalogid(shift, 'catalog')); } ],
|
||||
catalognumber => ['TXXX', sub { return "CATALOGNUMBER:" . mp3TagEscapeOwn(tagmap_catalogid(shift, 'catalognumber')); } ],
|
||||
catalogid => ['TXXX', sub { return "CATALOGNUMBER:" . mp3TagEscapeOwn(tagmap_catalogid(shift, 'catalogid')); } ],
|
||||
labelno => ['TXXX', sub { return "CATALOGNUMBER:" . mp3TagEscapeOwn(tagmap_catalogid(shift, 'labelno')); } ],
|
||||
#'encoded-by' => 'TENC',
|
||||
#encoder => 'TSSE',
|
||||
#encoding => 'TSSE',
|
||||
@ -112,16 +112,17 @@ my %idLookup = (
|
||||
my $genreName = shift->{genre}[0];
|
||||
if (!exists($genreMap{lc($genreName)})) {
|
||||
# If no genre number exists, use the name
|
||||
return $genreName;
|
||||
return mp3TagEscapeOwn($genreName);
|
||||
}
|
||||
return $genreMap{$genreName};
|
||||
return mp3TagEscapeOwn($genreMap{$genreName});
|
||||
}],
|
||||
#mood => ['TMOO', sub {
|
||||
#}],
|
||||
bpm => 'TBPM',
|
||||
comment => ['COMM', sub {
|
||||
return undef if (defined($opt_comment) && $opt_comment eq "");
|
||||
return "Comment:" . shift->{comment}[0];
|
||||
# Use the default empty description and default english language
|
||||
return mp3TagEscapeOwn(shift->{comment}[0]);
|
||||
}],
|
||||
copyright => 'TCOP',
|
||||
language => 'TLAN',
|
||||
@ -247,7 +248,7 @@ sub iterFlac {
|
||||
}
|
||||
#print(Dumper(\$mid3v2TagLine));
|
||||
|
||||
my $mid3v2TagCmd = "mid3v2 $mid3v2TagLine -- '$dest'";
|
||||
my $mid3v2TagCmd = "mid3v2 -e $mid3v2TagLine -- '$dest'";
|
||||
#print("Mid3V2 Debug - CMD: [$mid3v2TagCmd]\n");
|
||||
qx($mid3v2TagCmd);
|
||||
if ($? != 0) {
|
||||
@ -358,7 +359,6 @@ sub tagsToOpts {
|
||||
my $tags = shift;
|
||||
my @tagopts;
|
||||
|
||||
# TODO escape stuff?
|
||||
foreach my $currKey (keys (%$tags)) {
|
||||
if (!exists($idLookup{$currKey})) {
|
||||
print("Tag: '$currKey' doesn't have a mapping, skipping\n");
|
||||
@ -369,6 +369,7 @@ sub tagsToOpts {
|
||||
if ($type eq "" && defined($tagMapping)) {
|
||||
# If tag name is defined and tag contents exists (aka not silenced)
|
||||
foreach my $tagCont (@{$tags->{$currKey}}) {
|
||||
mp3TagEscape(\$tagCont);
|
||||
shellsan(\$tagCont);
|
||||
push(@tagopts, ["$tagMapping", "$tagCont"]);
|
||||
}
|
||||
@ -383,6 +384,7 @@ sub tagsToOpts {
|
||||
|
||||
if ($mapContType eq "") {
|
||||
foreach my $tagValue (@{$tags->{$currKey}}) {
|
||||
mp3TagEscape(\$tagValue);
|
||||
shellsan(\$tagValue);
|
||||
push(@tagopts, ["$mapKey", "$mapCont$tagValue"]);
|
||||
}
|
||||
@ -448,6 +450,16 @@ sub shellsan {
|
||||
${$_[0]} =~ s/'/'\\''/g;
|
||||
}
|
||||
|
||||
# Escape ':', and '\' characters in mp3 tag values
|
||||
sub mp3TagEscape {
|
||||
${$_[0]} =~ s!([:\\])!\\$1!g;
|
||||
}
|
||||
sub mp3TagEscapeOwn {
|
||||
my $s = shift;
|
||||
mp3TagEscape(\$s);
|
||||
return $s;
|
||||
}
|
||||
|
||||
sub usage {
|
||||
print("Usage: flac2mp3.pl [-h | --help] [-r] [-3] [-g | --genre NUM] <input_dir> <output_dir>\n");
|
||||
exit 1;
|
||||
|
Loading…
Reference in New Issue
Block a user