--- mp32ogg.old	2005-12-31 15:40:28.000000000 +0000
+++ mp32ogg	2006-01-11 20:28:42.000000000 +0000
@@ -7,6 +7,13 @@
 
 # ChangeLog
 #
+# 0.12
+#     * Added option for track number in rename option
+#     * Update checks for valid ID3 info to check for valid characters only
+#     * Updated verbose output to list input and output files
+#     * Partial ID3 for rename allowed
+#     * Optionally create new filename rather than replace existing file
+#
 # 0.11
 #     * Have output reflect change in license (doh)
 #     * Check ogg after conversion using ogginfo, see if the file was truncated
@@ -79,7 +86,7 @@
 # 0.1
 #     First Release
 
-$version = "v0.11";
+$version = "v0.12";
 
 use MP3::Info;
 use File::Find ();
@@ -104,6 +111,8 @@
 		"lowercase",
 		"no-replace",
 		"verbose",
+		"partial",
+		"overwrite",
 		"<>", \&checkfile);
 
 sub showhelp() {
@@ -113,10 +122,13 @@
 	print "--rename=format          Instead of simply replacing the .mp3 with\n";
 	print "                         .ogg for the output file, produce output \n";
 	print "                         filenames in this format, replacing %a, %t\n";
-	print "                         and %l with artist, title, and album name\n";
-	print "                         for the track\n";
+	print "                         %l and %n with artist, title, album name\n";
+	print "                         and track number for the track\n";
+	print "--partial                Perform rename even if not all the required ID3\n";
+	print "                         information is available\n";
+	print "--overwrite              Overwrite existing file with new file\n";
 	print "--lowercase              Force lowercase filenames when using --rename\n";
-	print "--verbose		Verbose output\n";
+	print "--verbose                Verbose output\n";
 	print "--help                   Display this help message\n";
 	exit;
 
@@ -150,6 +162,10 @@
 	my $lowercase = $opt_lowercase;
 	my $noreplace = $opt_no_replace;
 	my $verbose = $opt_verbose;
+	my $partial = $opt_partial;
+	my $overwrite = $opt_overwrite;
+	
+	my $tracknumber = "0";
 
 	$info = get_mp3tag($mp3file);
 	$fileinfo = get_mp3info($mp3file);
@@ -181,10 +197,15 @@
 	   $quality = 5;
 	   print "MP3::Info didn't report the bitrate... weird. Corrupt MP3 file? Bug?\n";
 	}
-	if($filename eq "" ||
-		((/\%a/) && $info->{ARTIST} eq "") ||
-		((/\%t/) && $info->{TITLE} eq "") ||
-		((/\%l/) && $info->{ALBUM} eq "") ){
+
+	if((!$partial) && 
+		($filename eq "" ||
+		((/\%a/) && $info->{ARTIST} !~ /[A-Za-z0-9]/) ||
+		((/\%t/) && $info->{TITLE} !~ /[A-Za-z0-9]/) ||
+		((/\%l/) && $info->{ALBUM} !~ /[A-Za-z0-9]/) ||
+		((/\%n/) && $info->{TRACKNUM} !~ /[A-Za-z0-9]/)
+		))
+		{
 
 		if($filename ne "") {
 			warn "not enough ID3 info to rename, reverting to old filename.\n";
@@ -193,9 +214,30 @@
 		($filename,$dirname,$ext) = fileparse($mp3file,'\.mp\d');
 	}
 	else {
-		$filename =~ s/\%a/$info->{ARTIST}/g;
-		$filename =~ s/\%t/$info->{TITLE}/g;
-		$filename =~ s/\%l/$info->{ALBUM}/g;
+		$tracknumber = $info->{ARTIST};
+		$tracknumber = "" unless ($tracknumber);
+		$tracknumber =~ s/\///g;
+		$filename =~ s/\%a/$tracknumber/g;
+
+		$tracknumber = $info->{TITLE};
+		$tracknumber = "" unless ($tracknumber);
+		$tracknumber =~ s/\///g;
+		$filename =~ s/\%t/$tracknumber/g;
+		
+		$tracknumber = $info->{ALBUM};
+		$tracknumber = "" unless ($tracknumber);
+		$tracknumber =~ s/\///g;
+		$filename =~ s/\%l/$tracknumber/g;
+
+		$tracknumber = $info->{TRACKNUM};
+		$tracknumber = "0" unless ($tracknumber);
+		if ($info->{TRACKNUM} < 10)
+		{
+			$tracknumber = "0" . $info->{TRACKNUM};
+		}
+		$filename =~ s/\%n/$tracknumber/g;
+		$filename =~ s/\/\/+/\//g;
+		
 		if($lowercase) {
 			$filename = lc($filename);
 		}
@@ -206,16 +248,26 @@
 		($name, $dir, $ext) = fileparse($filename, '.ogg');
 		$filename = "$dir$name";
 		$dirname = dirname($mp3file);
-
 	}
 
+	if (!$overwrite && -e "$filename.ogg")
+	{
+		my $counter = 1;
+		while (-e "$filename.$counter.ogg")
+		{
+			$counter++;
+		}
+		$filename = "$filename.$counter";
+		($name, $dir, $ext) = fileparse($filename, '.ogg');
+		$filename = "$dir$name";
+		$dirname = dirname($mp3file);
+	}
 	$oggoutputfile = "$filename.ogg";
 	$newdir = dirname($oggoutputfile);
 
 	# until i find a way to make perl's mkdir work like mkdir -p...
 	system("mkdir -p $newdir");
 
-
 	$infostring = "";
 	
 	print "Converting $mp3file to OGG...\n";
@@ -230,6 +282,9 @@
 	        print "  Genre: $info->{GENRE}\n";
 		print "Track #: $info->{TRACKNUM}\n";
 		print "Comment: $info->{COMMENT}\n";
+		print "\n";
+		print "Input file: $mp3file\n";
+		print "Output file: $filename\n";
 	}
 
 	if($info->{ARTIST} ne "") {

