Index: trunk/lib/MP3/Find/Base.pm
===================================================================
--- trunk/lib/MP3/Find/Base.pm	(revision 39)
+++ trunk/lib/MP3/Find/Base.pm	(revision 40)
@@ -6,5 +6,4 @@
 use Carp;
 
-#TODO: allow ID3v2 tags in printf format
 my %format_codes = (
     a => 'ARTIST',
Index: trunk/lib/MP3/Find/Filesystem.pm
===================================================================
--- trunk/lib/MP3/Find/Filesystem.pm	(revision 39)
+++ trunk/lib/MP3/Find/Filesystem.pm	(revision 40)
@@ -12,5 +12,4 @@
 use MP3::Find::Util qw(get_mp3_metadata);
 
-# XXX: this may or may not lead to faster searches
 eval {
     require Sort::Key;
@@ -19,4 +18,8 @@
 };
 my $USE_SORT_KEY = $@ ? 0 : 1;
+
+
+eval { require MP3::Tag };
+my $CAN_USE_ID3V2 = $@ ? 0 : 1;
 
 use_winamp_genres();
@@ -49,5 +52,10 @@
         }
     }
-
+    
+    if ($$options{use_id3v2} and not $CAN_USE_ID3V2) {
+	# they want to use ID3v2, but don't have MP3::Tag
+	warn "MP3::Tag is required to search ID3v2 tags\n";
+    }
+	
     # run the actual find
     my @results;
@@ -94,4 +102,5 @@
     my $mp3 = get_mp3_metadata({
 	filename  => $filename,
+	use_id3v2 => $options->{use_id3v2},
     });
 
@@ -130,19 +139,10 @@
 L<File::Find>, L<MP3::Info>, L<Scalar::Util>
 
+L<MP3::Tag> is also needed if you want to search using ID3v2 tags.
+
 =head1 DESCRIPTION
 
 This module implements the C<search> method from L<MP3::Find::Base>
 using a L<File::Find> based search of the local filesystem.
-
-In addition to just the basic ID3v1 tags, you can search for files by their
-ID3v2 data, using the four-character frame names.  This isn't very useful if
-you are just search by artist or title, but if, for example, you have made use
-of the C<TOPE> ("Orignal Performer") frame, you could search for all the cover
-songs in your collection:
-
-    $finder->find_mp3s(query => { tope => '.' });
-
-As with the basic query keys, ID3v2 query keys are converted to uppercase
-internally.
 
 =head2 Special Options
@@ -152,6 +152,20 @@
 =item C<exclude_path>
 
-Scalar or arrayref; any file whose name matches any of these paths will be
-skipped.
+Scalar or arrayref; any file whose name matches any of these paths
+will be skipped.
+
+=item C<use_id3v2>
+
+Boolean, defaults to false. If set to true, MP3::Find::Filesystem will
+use L<MP3::Tag> to get the ID3v2 tag for each file. You can then search
+for files by their ID3v2 data, using the four-character frame names. 
+This isn't very useful if you are just search by artist or title, but if,
+for example, you have made use of the C<TOPE> ("Orignal Performer") frame,
+you could search for all the cover songs in your collection:
+
+    $finder->find_mp3s(query => { tope => '.' });
+
+As with the basic query keys, ID3v2 query keys are converted to uppercase
+internally.
 
 =back
@@ -167,5 +181,5 @@
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2006-2008 by Peter Eichman. All rights reserved.
+Copyright (c) 2006 by Peter Eichman. All rights reserved.
 
 This program is free software; you can redistribute it and/or
Index: trunk/lib/MP3/Find/Util.pm
===================================================================
--- trunk/lib/MP3/Find/Util.pm	(revision 39)
+++ trunk/lib/MP3/Find/Util.pm	(revision 40)
@@ -51,8 +51,28 @@
     my $mp3 = {
         FILENAME => $filename,
-        # ID3v2 tags, if present, override ID3v1 tags
-        %{ get_mp3tag($filename, 0, 2)  || {} },
-        %{ get_mp3info($filename)       || {} },
+        %{ get_mp3tag($filename)  || {} },
+        %{ get_mp3info($filename) || {} },
     };
+    
+    if ($CAN_USE_ID3V2 and $args->{use_id3v2}) {
+	# add ID3v2 tag info, if present
+	my $mp3_tags = MP3::Tag->new($filename);
+	unless (defined $mp3_tags) {
+	    warn "Can't get MP3::Tag object for $filename\n";
+	} else {
+	    $mp3_tags->get_tags;
+	    if (my $id3v2 = $mp3_tags->{ID3v2}) {
+		for my $frame_id (keys %{ $id3v2->get_frame_ids }) {
+		    my ($info) = $id3v2->get_frame($frame_id);
+		    if (ref $info eq 'HASH') {
+			# use the "Text" value as the value for this frame, if present
+			$mp3->{$frame_id} = $info->{Text} if exists $info->{Text};
+		    } else {
+			$mp3->{$frame_id} = $info;
+		    }
+		}
+	    }
+	}
+    }
 
     return $mp3;
