From f75c7fa58239de569dcf032839c91e33c860a7d1 Mon Sep 17 00:00:00 2001 From: moex3 <46636583+moex3@users.noreply.github.com> Date: Sun, 1 Aug 2021 17:46:19 +0200 Subject: [PATCH] Add comment & catalog option, improve genre option --- README.md | 4 ++-- flac2mp3.pl | 73 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 925f4a4..0afdb8f 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,8 @@ Dependencies: `flac` `metaflac` `lame` flac2mp3.pl ~/flacs ~/mp3 ``` -Tags can be overridden with options. Only the genre tag is supported rith now. +Some tags can be overridden with options. ```bash -flac2mp3.pl --genre 145 ~/flacs ~/mp3 +flac2mp3.pl --genre 145 --comment "yes" ~/flacs ~/mp3 ``` This would add the genre as 'Anime'. Run `lame --genre-list` for the whole list. Can be specified multiple ones, with comma separation (i think). diff --git a/flac2mp3.pl b/flac2mp3.pl index 0c4ed2b..fe828c2 100755 --- a/flac2mp3.pl +++ b/flac2mp3.pl @@ -6,9 +6,20 @@ use File::Find; use Data::Dumper; use File::Basename; +my $opt_no_genre; +my $opt_comment; +my $opt_catid; + +# TODO fill this out +my %genreMap = ( + edm => 52, + soundtrack => 24, +); + # this is a godsent page # https://wiki.hydrogenaud.io/index.php?title=Tag_Mapping # a lot of this may not work +# TODO escape potential 's my %idLookup = ( album => 'TALB', albumsort => 'TSOA', @@ -36,23 +47,28 @@ my %idLookup = ( remixer => 'TPE4', discnumber => ['TPOS', sub { my $t = shift; - return "$t->{discnumber}" if !exists($t->{disctotal}); - return "$t->{discnumber}/$t->{disctotal}"; + my $totalkey = exists($t->{disctotal}) ? 'disctotal' : 'totaldiscs'; + return "$t->{discnumber}" if !exists($t->{$totalkey}); + return "$t->{discnumber}/$t->{$totalkey}"; }], + totaldiscs => undef, disctotal => undef, tracknumber => ['TRCK', sub { my $t = shift; - return "$t->{tracknumber}" if !exists($t->{tracktotal}); - return "$t->{tracknumber}/$t->{tracktotal}"; + my $totalkey = exists($t->{tracktotal}) ? 'tracktotal' : 'totaltracks'; + return "$t->{tracknumber}" if !exists($t->{$totalkey}); + return "$t->{tracknumber}/$t->{$totalkey}"; }], + totaltracks => undef, tracktotal => undef, - date => 'TDRC', # This is for id3v2.4 + #date => 'TDRC', # This is for id3v2.4 + date => 'TYER', originaldate => 'TDOR', # Also for 2.4 only isrc => 'TSRC', barcode => 'TXXX=BARCODE', - catalognumber => 'TXXX=CATALOGNUMBER', - catalog => 'TXXX=CATALOGNUMBER', - catalogid => 'TXXX=CATALOGNUMBER', + catalog => ['TXXX=CATALOGNUMBER', sub { return tagmap_catalogid(shift, 'catalog'); } ], + catalognumber => ['TXXX=CATALOGNUMBER', sub { return tagmap_catalogid(shift, 'catalognumber'); } ], + catalogid => ['TXXX=CATALOGNUMBER', sub { return tagmap_catalogid(shift, 'catalogid'); } ], 'encoded-by' => 'TENC', encoder => 'TSSE', encoding => 'TSSE', @@ -63,23 +79,43 @@ my %idLookup = ( replaygain_track_gain => 'TXXX=REPLAYGAIN_TRACK_GAIN', replaygain_track_peak => 'TXXX=REPLAYGAIN_TRACK_PEAK', genre => ['TCON', sub { - return 24; + return undef if ($opt_no_genre); + + my $genreName = shift->{genre}; + if (!exists($genreMap{lc($genreName)})) { + # If no genre number exists, use the name + return $genreName; + } + return $genreMap{$genreName}; }], #mood => ['TMOO', sub { #}], bpm => 'TBPM', - comment => 'COMM', + comment => ['COMM=Comment', sub { + return undef if (defined($opt_comment) && $opt_comment eq ""); + return shift->{comment}; + }], copyright => 'TCOP', language => 'TLAN', script => 'TXXX=SCRIPT', lyrics => 'USLT', + circle => 'TXXX=CIRCLE', ); +sub tagmap_catalogid { + my $t = shift; + my $own_tag_name = shift; + return undef if (defined($opt_catid) && $opt_catid eq ""); + return $t->{$own_tag_name}; +} my $opt_genre; my $opt_help; GetOptions( - "genre=s" => \$opt_genre, - "help" => \$opt_help + "genre|g=s" => \$opt_genre, + "no-genre|G" => \$opt_no_genre, + "help|h" => \$opt_help, + "catid=s" => \$opt_catid, + "comment=s" => \$opt_comment, ) or die("Error in command line option"); if ($opt_help) { @@ -132,6 +168,10 @@ sub argsToTags { my $argTags = shift; if (defined($opt_genre)) { $argTags->{genre} = $opt_genre; + } elsif (defined($opt_comment) && $opt_comment ne "") { + $argTags->{comment} = $opt_comment; + } elsif (defined($opt_catid) && $opt_catid ne "") { + $argTags->{catalognumber} = $opt_catid; } } @@ -153,8 +193,10 @@ sub tagsToOpts { push(@tagopts, qq(--tv '$tagName=$tagCont')); } elsif ($type eq "ARRAY") { my $tagCont = $tagName->[1]->($tags); - shellsan(\$tagCont); - push(@tagopts, qq(--tv '$tagName->[0]=$tagCont')); + if (defined($tagCont)) { + shellsan(\$tagCont); + push(@tagopts, qq(--tv '$tagName->[0]=$tagCont')); + } } } @@ -191,6 +233,9 @@ Usage: -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 + --catid STRING the catalog id to set (or "") + --comment STRING the comment to set (or "") EOF print($h); exit 0;