Browse Source

Multiple changes:

Add publisher tag
Copy or apply replaygain
Copy lyrics tags
master
moex3 1 year ago
parent
commit
d44c74e40f
No known key found for this signature in database GPG Key ID: ABC92E00CF59BB7A
1 changed files with 101 additions and 37 deletions
  1. +101
    -37
      flac2mp3.pl

+ 101
- 37
flac2mp3.pl View File

@@ -12,12 +12,10 @@ my $opt_comment;
my $opt_catid;
my $opt_rg;
my $opt_embedcover;
my $opt_publisher;

# TODO fill this out
my %genreMap = (
edm => 52,
soundtrack => 24,
);
# Additional encode options for a single track
my $LAME_opts = "";

# this is a godsent page
# https://wiki.hydrogenaud.io/index.php?title=Tag_Mapping
@@ -110,11 +108,7 @@ my %idLookup = (
return undef if ($opt_no_genre);

my $genreName = shift->{genre}[0];
if (!exists($genreMap{lc($genreName)})) {
# If no genre number exists, use the name
return mp3TagEscapeOwn($genreName);
}
return mp3TagEscapeOwn($genreMap{$genreName});
return mp3TagEscapeOwn($genreName);
}],
#mood => ['TMOO', sub {
#}],
@@ -129,22 +123,50 @@ my %idLookup = (
#replaygain_album_peak => 'TXXX=REPLAYGAIN_ALBUM_PEAK',
#replaygain_album_gain => 'TXXX=REPLAYGAIN_ALBUM_GAIN',
replaygain_track_gain => sub {
print("EEEEEEERRRRRRRRROOOOOOOOOORRRRRRRRRRRE FIXXXXXXXXXXXX THIIIIIIIIISSSSSSSS\n");
exit(1);
return undef if (!$opt_rg);
shift->{replaygain_track_gain}[0] =~ /^(-?\d+\.\d+) dB$/;
my $gain_db = $1;
exit(1) if ($gain_db eq "");
return "--replaygain-accurate --gain $gain_db";
# TODO this lulw
my $gain_db = getGainFromTag(shift->{replaygain_track_gain}[0]);

if ($opt_rg) {
print("REPLAYGAIN :::::::::::::::: MODIFYING FILE\n");
# Modify file
$LAME_opts .= " --replaygain-accurate --gain $gain_db";
#print("Added LAME opt: $LAME_opts\n");
return undef;
} else {
print("REPLAYGAIN :::::::::::::::: COPYING TAG\n");
# Copy tags
return ["TXXX", "REPLAYGAIN_TRACK_GAIN:" . mp3TagEscapeOwn("$gain_db dB")];
}
},
replaygain_track_peak => sub {
my $peak = shift->{replaygain_track_peak}[0];

if ($opt_rg) {
# Modify file
$LAME_opts .= " --replaygain-accurate";
#print("Added LAME opt: $LAME_opts\n");
return undef;
} else {
# Copy tags
return ["TXXX", "REPLAYGAIN_TRACK_PEAK:" . mp3TagEscapeOwn("$peak")];
}
},

#replaygain_album_gain => 'TXXX=REPLAYGAIN_ALBUM_GAIN',
#replaygain_album_peak => 'TXXX=REPLAYGAIN_ALBUM_PEAK',
#replaygain_track_gain => 'TXXX=REPLAYGAIN_TRACK_GAIN',
#replaygain_track_peak => 'TXXX=REPLAYGAIN_TRACK_PEAK',
script => ['TXXX', 'SCRIPT:'],
lyrics => 'USLT',
#lyrics => 'USLT',
#unsyncedlyrics => 'USLT',
unsyncedlyrics => sub {
my @lyrArr = @{shift->{unsyncedlyrics}};
my $tagStr = "";

foreach (@lyrArr) {
$tagStr .= mp3TagEscapeOwn($_) . "\\n";
}
# TODO figure out how to set language here
return ["USLT", "$tagStr"];
},
lyricist => 'TEXT',
circle => ['TXXX', 'CIRCLE:'],
event => ['TXXX', 'EVENT:'],
@@ -160,6 +182,18 @@ sub tagmap_catalogid {
return $t->{$own_tag_name}[0];
}

sub getGainFromTag {
my $tagVal = shift;

$tagVal =~ /^([-+]?\d+\.\d+) dB$/;
my $gain_db = $1;
if ($gain_db eq "") {
print("gain FAIL...: $tagVal\n");
exit(1);
}
return $gain_db;
}

my $opt_genre;
my $opt_help;
my @opt_tagreplace;
@@ -172,6 +206,7 @@ GetOptions(
"catid=s" => \$opt_catid,
"comment=s" => \$opt_comment,
"cover=s" => \$opt_embedcover,
"pub=s" => \$opt_publisher,
"tagreplace|t=s" => \@opt_tagreplace,
"320|3" => \$opt_cbr,
) or die("Error in command line option");
@@ -206,6 +241,7 @@ sub iterFlac {
#print("DEBUG: $dest\n");
$dest =~ s/\.flac$/\.mp3/;
my $tags = getFlacTags($flac);
#print(Dumper($tags));

my $has_req_tags = 1;
foreach (@required_tags) {
@@ -226,19 +262,25 @@ sub iterFlac {
#}
my $tagopts = tagsToOpts($tags);

#print("Debug: @$tagopts\n");
#print(Dumper($tagopts));

$dest =~ m!(.*)/[^/]+!;
my $basedir = $1;
mkdir($basedir) if (not -f $basedir);

shellsan(\$dest);
my $cmd;
if ($opt_cbr) {
$cmd = "flac -cd -- '$flac' | lame -S -b 320 -q 0 --add-id3v2 - '$dest'";
$cmd = "flac -cd -- '$flac' | lame $LAME_opts -S -b 320 -q 0 --add-id3v2 - '$dest'";
} else {
$cmd = "flac -cd -- '$flac' | lame -S -V0 --vbr-new -q 0 --add-id3v2 - '$dest'";
$cmd = "flac -cd -- '$flac' | lame $LAME_opts -S -V0 --vbr-new -q 0 --add-id3v2 - '$dest'";
}
#print("Debug - CMD: [$cmd]\n");
qx($cmd);
if ($? != 0) {
exit(1);
}
$LAME_opts = ""; # Reset for the next track

my $mid3v2TagLine = "";
#print(Dumper(\@$tagopts));
@@ -311,6 +353,13 @@ sub argsToTags {
$argTags->{comment} = [$opt_comment];
}
}
if (defined($opt_publisher)) {
if ($opt_publisher eq "") {
delete($argTags->{organization});
} else {
$argTags->{organization} = [$opt_publisher];
}
}
if (defined($opt_catid) && $opt_catid ne "") {
$argTags->{catalognumber} = [$opt_catid];
}
@@ -403,6 +452,7 @@ sub tagsToOpts {
#}

my $codeRet = $tagMapping->($tags);
next if (not defined($codeRet));
my $mapKey = $codeRet->[0];
my $mapCont = $codeRet->[1];
shellsan(\$mapCont);
@@ -430,17 +480,30 @@ sub getFlacTags {
if ($? != 0) {
exit(1);
}
my $curr_tag = "";
foreach my $tagline (@tagtxt) {
if ($tagline =~ /comment\[\d+\]:\s(.*?)=(.*)/) {
if ($tagline =~ /^\s+comment\[\d+\]:\s(.*?)=(.*)/) {
if ($2 eq '') {
print("Empty tag: $1\n");
next;
}
if (not exists($tags{lc($1)})) {
@{$tags{lc($1)}} = ($2);
$curr_tag = lc($1);
if (not exists($tags{$curr_tag})) {
@{$tags{$curr_tag}} = ($2);
} else {
push(@{$tags{lc($1)}}, $2);
push(@{$tags{$curr_tag}}, $2);
}
} elsif ($curr_tag ne "") {
# Maybe multi line? (like lyrics) store if it was multiple tag=value fields
chomp($tagline);
push(@{$tags{$curr_tag}}, $tagline);
#if (ref(@{$tags{$curr_tag}}) eq "") {
# Second line
#@{$tags{$curr_tag}} = (@{$tags{$curr_tag}}, $tagline);
#} else {
# 3rd, or later line
#push(@{$tags{$curr_tag}}, $tagline);
#}
}
}
return \%tags;
@@ -470,16 +533,17 @@ sub help {
Usage:
flac2mp3.pl [options] <input_dir> <output_dir>

-h, --help print this help text
-g, --genre NUM force this genre as a tag (lame --genre-list)
-G, --no-genre ignore genre in flac file
-r, --replay-gain use replay gain values
--catid STRING the catalog id to set (or "")
--comment STRING the comment to set (or "")
--cover STRING Use this image as cover (or "" to not copy from flac)
-t --tagreplace STR Replace flac tags for a specific file only
Like -t '02*flac/TITLE=Some other title'
-3, --320 Convert into CBR 320 instead into the default V0
-h, --help print this help text
-g, --genre NUM force this genre as a tag (lame --genre-list)
-G, --no-genre ignore genre in flac file
-r, --replay-gain modify file with the replay-gain values
--catid STRING the catalog id to set (or "")
--comment STRING the comment to set (or "")
--cover STRING Use this image as cover (or "" to not copy from flac)
--pub STRING Publisher
-t --tagreplace STR Replace flac tags for a specific file only
Like -t '02*flac/TITLE=Some other title'
-3, --320 Convert into CBR 320 instead into the default V0
EOF
print($h);
exit 0;


Loading…
Cancel
Save