auto-mp3tags.pl 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 15 August 2011
  5. # Edit: 11 August 2019
  6. # https://github.com/trizen
  7. # Adds auto-tags to MP3 audio files in a given directory and its subdirectories.
  8. use 5.010;
  9. use strict;
  10. use warnings;
  11. use MP3::Tag;
  12. use File::Find qw(find);
  13. use File::Copy qw(copy);
  14. use File::Temp qw(tempfile);
  15. use File::Basename qw(basename);
  16. use Encode qw(encode_utf8 decode_utf8);
  17. my @files = grep { -e $_ } @ARGV;
  18. die "Usage: $0 <dirs|files>\n" unless @files;
  19. my @mp3_files;
  20. find(\&wanted_files, @files);
  21. sub wanted_files {
  22. my $file = $File::Find::name;
  23. push @mp3_files, $file if $file =~ /\.mp3\z/i;
  24. }
  25. foreach my $filename (@mp3_files) {
  26. say "Processing: $filename";
  27. my (undef, $tmpfile) = tempfile(basename($filename) . ' - XXXXXX', TMPDIR => 1);
  28. unlink($tmpfile);
  29. $tmpfile =~ s/ - .{6}\z//;
  30. copy($filename, $tmpfile);
  31. my $mp3 = 'MP3::Tag'->new($tmpfile);
  32. my @fields = qw(artist album title comment);
  33. $mp3->config(write_v24 => 1);
  34. $mp3->autoinfo;
  35. $mp3->update_tags({map { $_ => decode_utf8($mp3->$_) } @fields});
  36. $mp3->close;
  37. unlink($filename);
  38. copy($tmpfile, $filename);
  39. unlink($tmpfile);
  40. }