#!/usr/bin/perl -w use strict; use Getopt::Long; use Config::Properties; use YAML; use MP3::Tag; GetOptions( 'file|f=s' => \my $META_FILE, 'clear' => \my $CLEAR, ); my @AUDIO_FILES = @ARGV; my $meta; if ($META_FILE eq '-') { $meta = Config::Properties->new; $meta->load(*STDIN); } else { $meta = Config::Properties->new( file => $META_FILE, ); } my $metadata = $meta->splitToTree; for my $i (1 .. @AUDIO_FILES) { my $mp3 = MP3::Tag->new($AUDIO_FILES[$i - 1]); # first clear the tags if asked if ($CLEAR) { warn "clearing first"; $mp3->delete_tag($_) foreach qw{ID3v1 ID3v2}; } my $track_key = sprintf "TRACK%02d", $i; my $track = $metadata->{$track_key}; #TODO: for reissues, what should the year/date be tagged as? my ($year) = ($metadata->{ORIGINALDATE} || $metadata->{DATE} || '' =~ /^(\d{4})/); $mp3->title_set($track->{TITLE}); $mp3->artist_set($track->{ARTIST} || $metadata->{ALBUMARTIST}); $mp3->album_set($track->{ALBUM} || $metadata->{ALBUM}); $mp3->year_set($year) if $year; $mp3->track_set($i); $mp3->select_id3v2_frame_by_descr('TPE2', $metadata->{ALBUMARTIST}) if $metadata->{ALBUMARTIST}; $mp3->update_tags; printf " Apply to %s\n", $AUDIO_FILES[$i - 1]; #TODO: full version of a make-string-filename-safe function my $sort_filename = lc $track->{ARTISTSORT}; for ($sort_filename) { s/&/and/g; s/\W/-/g; s/--/-/g; } print "Artist sort filename would be: " . $sort_filename . "\n"; }