#!/usr/bin/perl use strict; $|++; no strict 'refs'; use warnings; use Mac::Glue ':all'; use Getopt::Std; getopts('vsp:nuqr:d:P:N:L:A:T:Y:he'); our($opt_s, $opt_p, $opt_n, $opt_u, $opt_q, $opt_r, $opt_d, $opt_v, $opt_P, $opt_N, $opt_A, $opt_T, $opt_Y, $opt_h, $opt_L, $opt_e); my $helptxt = <<_ENDHELP; usage: $0 [-s|-p |-d ] -s : work with selection (default if no playlist specified) -p : work with playlist. -n : just print info after processing without changing anything -u : do not remove underscores from any set value (not working yet) -q : suppress all output pick one of: -r : regular expression to use against current track name -d : delimeter to split current track name against -P : change track name in place (provide replacement) -N # : track name to set -A # : track artist to set -T # : track number to set -L # : album name to set -Y # : track year to set where # is the backreference from your regex, or array number from the split. -h : print this help text -e : print out examples NOTE: this will also strip any underscores and remove leading or tailing whitespace WARNING: I highly suggest against using this on your whole library. _ENDHELP if ( $opt_h ) { print $helptxt; exit; } if ( $opt_e ) { print "check out http://rexroof.com/code/imunge_examples.html\n"; exit; } die "must pick one of -r or -d" unless ( $opt_r or $opt_d ); die "must pick one of -s or -p" unless ( $opt_s or $opt_p ); die "options -N -A -T -L -Y options must be numbers." if ( ( defined $opt_N and $opt_N =~ /\D/ ) or ( defined $opt_A and $opt_A =~ /\D/ ) or ( defined $opt_T and $opt_T =~ /\D/ ) or ( defined $opt_L and $opt_L =~ /\D/ ) or ( defined $opt_Y and $opt_Y =~ /\D/ ) ); my $itunes = new Mac::Glue 'iTunes'; die "can't find itunes" unless ( $itunes ); my @tracks; if ( $opt_s ) { @tracks = $itunes->prop('selection')->get; } elsif ( $opt_p ) { @tracks = $itunes->obj(tracks => playlist => $opt_p)->get; } else { die "must specify either -p or -s\n"; } die "no songs found\n" unless ( @tracks ); for my $track (@tracks) { my ( @new_data, $name_data ); my ($name_obj, $artist_obj, $track_obj, $album_obj, $year_obj); my ($new_name, $new_artist, $new_num, $new_album, $new_year); $name_obj = $track->prop('name'); $name_data = $name_obj->get; $artist_obj = $track->prop('artist') if (defined $opt_A); $track_obj = $track->prop('track number') if (defined $opt_T); $album_obj = $track->prop('album') if (defined $opt_L); $year_obj = $track->prop('year') if (defined $opt_Y); # my $dbid_obj = $track->prop('database ID'); if ( $opt_d ) { @new_data = split /$opt_d/, $name_data; $new_name = $new_data[$opt_N] if ( defined $opt_N ); $new_artist = $new_data[$opt_A] if ( defined $opt_A ); $new_num = $new_data[$opt_T] if ( defined $opt_T ); $new_album = $new_data[$opt_L] if ( defined $opt_L ); $new_year = $new_data[$opt_Y] if ( defined $opt_Y ); } elsif ( $opt_r ) { if ( defined $opt_P ) { my $regex_replace = '"'.$opt_P.'"'; print "name data: $name_data\n" if ($opt_v); print "opt_r: $opt_r\n" if ($opt_v); print "regex_replace: $regex_replace\n" if ($opt_v); $name_data =~ s/$opt_r/$regex_replace/oee; $new_name = $name_data; $new_artist = ${$opt_A} if ( defined $opt_A ); $new_num = ${$opt_T} if ( defined $opt_T ); $new_album = ${$opt_L} if ( defined $opt_L ); $new_year = ${$opt_Y} if ( defined $opt_Y ); } else { $name_data =~ $opt_r; $new_name = ${$opt_N} if ( defined $opt_N ); $new_artist = ${$opt_A} if ( defined $opt_A ); $new_num = ${$opt_T} if ( defined $opt_T ); $new_album = ${$opt_L} if ( defined $opt_L ); $new_year = ${$opt_Y} if ( defined $opt_Y ); } } # TRACK NAME if ( defined $new_name ) { $new_name =~ s/_/ /g; $new_name =~ s/^\s+//g; $new_name =~ s/\s+$//g; if ( $opt_n ) { print "N: \"$new_name\" "; } else { $name_obj->set(to => $new_name); } } # TRACK ARTIST if ( defined $new_artist ) { $new_artist =~ s/_/ /g; $new_artist =~ s/^\s+//g; $new_artist =~ s/\s+$//g; if ( $opt_n ) { print "A: \"$new_artist\" "; } else { $artist_obj->set(to => $new_artist); } } # TRACK NUMBER if ( defined $new_num ) { $new_num =~ s/_/ /g; $new_num =~ s/^\s+//g; $new_num =~ s/\s+$//g; if ( $opt_n ) { print "T: \"$new_num\" "; } else { $track_obj->set(to => $new_num); } } # TRACK ALBUM if ( defined $new_album ) { $new_album =~ s/_/ /g; $new_album =~ s/^\s+//g; $new_album =~ s/\s+$//g; if ( $opt_n ) { print "L: \"$new_album\" "; } else { $album_obj->set(to => $new_album); } } # TRACK YEAR if ( defined $new_year ) { $new_year =~ s/_/ /g; $new_year =~ s/^\s+//g; $new_year =~ s/\s+$//g; if ( $opt_n ) { print "Y: \"$new_year\" "; } else { $year_obj->set(to => $new_year); } } print $/ if ( $opt_n ); }