Changeset 40 in mp3-find for trunk/lib/MP3
- Timestamp:
- 06/07/11 23:10:52 (13 years ago)
- Location:
- trunk/lib/MP3/Find
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/MP3/Find/Base.pm
r39 r40 6 6 use Carp; 7 7 8 #TODO: allow ID3v2 tags in printf format9 8 my %format_codes = ( 10 9 a => 'ARTIST', -
trunk/lib/MP3/Find/Filesystem.pm
r39 r40 12 12 use MP3::Find::Util qw(get_mp3_metadata); 13 13 14 # XXX: this may or may not lead to faster searches15 14 eval { 16 15 require Sort::Key; … … 19 18 }; 20 19 my $USE_SORT_KEY = $@ ? 0 : 1; 20 21 22 eval { require MP3::Tag }; 23 my $CAN_USE_ID3V2 = $@ ? 0 : 1; 21 24 22 25 use_winamp_genres(); … … 49 52 } 50 53 } 51 54 55 if ($$options{use_id3v2} and not $CAN_USE_ID3V2) { 56 # they want to use ID3v2, but don't have MP3::Tag 57 warn "MP3::Tag is required to search ID3v2 tags\n"; 58 } 59 52 60 # run the actual find 53 61 my @results; … … 94 102 my $mp3 = get_mp3_metadata({ 95 103 filename => $filename, 104 use_id3v2 => $options->{use_id3v2}, 96 105 }); 97 106 … … 130 139 L<File::Find>, L<MP3::Info>, L<Scalar::Util> 131 140 141 L<MP3::Tag> is also needed if you want to search using ID3v2 tags. 142 132 143 =head1 DESCRIPTION 133 144 134 145 This module implements the C<search> method from L<MP3::Find::Base> 135 146 using a L<File::Find> based search of the local filesystem. 136 137 In addition to just the basic ID3v1 tags, you can search for files by their138 ID3v2 data, using the four-character frame names. This isn't very useful if139 you are just search by artist or title, but if, for example, you have made use140 of the C<TOPE> ("Orignal Performer") frame, you could search for all the cover141 songs in your collection:142 143 $finder->find_mp3s(query => { tope => '.' });144 145 As with the basic query keys, ID3v2 query keys are converted to uppercase146 internally.147 147 148 148 =head2 Special Options … … 152 152 =item C<exclude_path> 153 153 154 Scalar or arrayref; any file whose name matches any of these paths will be 155 skipped. 154 Scalar or arrayref; any file whose name matches any of these paths 155 will be skipped. 156 157 =item C<use_id3v2> 158 159 Boolean, defaults to false. If set to true, MP3::Find::Filesystem will 160 use L<MP3::Tag> to get the ID3v2 tag for each file. You can then search 161 for files by their ID3v2 data, using the four-character frame names. 162 This isn't very useful if you are just search by artist or title, but if, 163 for example, you have made use of the C<TOPE> ("Orignal Performer") frame, 164 you could search for all the cover songs in your collection: 165 166 $finder->find_mp3s(query => { tope => '.' }); 167 168 As with the basic query keys, ID3v2 query keys are converted to uppercase 169 internally. 156 170 157 171 =back … … 167 181 =head1 COPYRIGHT AND LICENSE 168 182 169 Copyright (c) 2006 -2008by Peter Eichman. All rights reserved.183 Copyright (c) 2006 by Peter Eichman. All rights reserved. 170 184 171 185 This program is free software; you can redistribute it and/or -
trunk/lib/MP3/Find/Util.pm
r39 r40 51 51 my $mp3 = { 52 52 FILENAME => $filename, 53 # ID3v2 tags, if present, override ID3v1 tags 54 %{ get_mp3tag($filename, 0, 2) || {} }, 55 %{ get_mp3info($filename) || {} }, 53 %{ get_mp3tag($filename) || {} }, 54 %{ get_mp3info($filename) || {} }, 56 55 }; 56 57 if ($CAN_USE_ID3V2 and $args->{use_id3v2}) { 58 # add ID3v2 tag info, if present 59 my $mp3_tags = MP3::Tag->new($filename); 60 unless (defined $mp3_tags) { 61 warn "Can't get MP3::Tag object for $filename\n"; 62 } else { 63 $mp3_tags->get_tags; 64 if (my $id3v2 = $mp3_tags->{ID3v2}) { 65 for my $frame_id (keys %{ $id3v2->get_frame_ids }) { 66 my ($info) = $id3v2->get_frame($frame_id); 67 if (ref $info eq 'HASH') { 68 # use the "Text" value as the value for this frame, if present 69 $mp3->{$frame_id} = $info->{Text} if exists $info->{Text}; 70 } else { 71 $mp3->{$frame_id} = $info; 72 } 73 } 74 } 75 } 76 } 57 77 58 78 return $mp3;
Note: See TracChangeset
for help on using the changeset viewer.