App-id3shit

 view release on metacpan or  search on metacpan

bin/id3shit  view on Meta::CPAN

}

elsif(@opt_read_info) {
  print scalar(@opt_read_info);
  if(scalar(@opt_read_info) == 1 && $opt_read_info[0] !~ /\.mp3$/) {
    my $all_mp3 = find_mp3(@opt_read_info);
    show_info(@$all_mp3);
  }
  else {
    show_info(@opt_read_tags);
  }
}

elsif(@opt_write) {
  my $tag   = shift(@opt_write);
  my $value = shift(@opt_write);
  # is it a dir?
  if(scalar(@opt_write) == 1 && $opt_write[0] !~ /\.mp3$/) {
    my $all_mp3 = find_mp3(@opt_write);
    write_tags($tag, $value, @$all_mp3);
  }
  else {
    write_tags($tag, $value, @opt_write);
  }
}

elsif(@opt_rename) {
  if(scalar(@opt_rename) == 1 && $opt_write[0] !~ /\.mp3$/) {
    my $all_mp3 = find_mp3(@opt_rename);
    rename_by_tag(@$all_mp3);
  }
  else {
    rename_by_tag(@opt_rename);
  }
}
elsif(@opt_strip_tags) {
  if(scalar(@opt_strip_tags) == 1 && $opt_strip_tags[0] !~ /\.mp3$/) {
    my $all_mp3 = find_mp3(@opt_strip_tags);
    strip_tags(@$all_mp3);
  }
  else {
    strip_tags(@opt_strip_tags);
  }
}

my @mp3;
sub find_mp3 {
  my $dir = shift;
  #return(-1) if(!-d $dir or !-f $dir);

  my $i = 0;
  for(glob("$dir/*")) {
    ++$i;
    if(-d $_) {
      find_mp3($_);
    }
    elsif(-f $_ && $_ =~ m;\.mp3$;) {
      push(@mp3, $_);
    }
  }
  print "find_mp3(): $i iterations\n" if($DEBUG);
  return(\@mp3);
}

sub show_info {
  my @files = @_;
  return unless(@files);

  for my $f(@files) {
    my $info = get_mp3info($f);
    print "Doesnt look like audio to me\n" and exit(1) unless($info);

    printf("%12s: \033[1m%s\033[0m\n", 'File', $f);
    for my $k(sort(keys(%{$info}))) {
      printf("%12s: %s\n",ucfirst(lc($k)),$info->{$k}) unless(ref($info->{$k}));
    }
    print "\e[30;1m",'-' x 20, "\e[0m\n";
  }
  exit(0);
}

sub read_tags {
  my $changed_tag = shift; # called from write_tags()?
  my @files = @_;

  if(-f $changed_tag) {
    push(@files, $changed_tag); # ... nope
  }

  for my $f(@files) {
    my $tag = get_mp3tag($f);
    printf("%7s: \033[1m%s\033[0m\n",'File', $f);

    for(qw(ARTIST ALBUM TITLE GENRE COMMENT)) {
      if(!($tag->{$_})) {
        printf("\e[31;1m%7s\e[0m: %s\n", ucfirst(lc($_)), 'Missing');
      }
      else {
        if($_ eq uc($changed_tag)) {
          printf("%7s: \033[31;1m%s\033[0m\n", ucfirst(lc($_)),$tag->{$_});
        }
        else {
          printf("%7s: %s\n", ucfirst(lc($_)),$tag->{$_});
        }
      }
    }
    print "\e[30;1m",'-' x 20, "\e[0m\n";
  }
}

sub strip_tags {
  my @files = @_;

  for my $f(@files) {
    my $bytes_removed = remove_mp3tag($f, 'ALL');
    if($bytes_removed < 0) {
      printf("No tags to remove on \033[1m$f\033[0m!\n");
      exit(1);
    }
    else {
      printf("Removed %d bytes from \033[1m$f\033[0m\n", $bytes_removed);



( run in 1.206 second using v1.01-cache-2.11-cpan-71847e10f99 )