line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
|
2
|
|
|
|
|
|
|
package MP3::Tag; |
3
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
# Copyright (c) 2000-2004 Thomas Geffert. All rights reserved. |
5
|
|
|
|
|
|
|
# |
6
|
|
|
|
|
|
|
# This program is free software; you can redistribute it and/or |
7
|
|
|
|
|
|
|
# modify it under the terms of the Artistic License, distributed |
8
|
|
|
|
|
|
|
# with Perl. |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
################ |
11
|
|
|
|
|
|
|
# |
12
|
|
|
|
|
|
|
# provides a general interface for different modules, which can read tags |
13
|
|
|
|
|
|
|
# |
14
|
|
|
|
|
|
|
# at the moment MP3::Tag works with MP3::Tag::ID3v1 and MP3::Tag::ID3v2 |
15
|
|
|
|
|
|
|
|
16
|
6
|
|
|
6
|
|
5960
|
use strict; |
|
6
|
|
|
|
|
6
|
|
|
6
|
|
|
|
|
687
|
|
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
{ |
19
|
|
|
|
|
|
|
package MP3::Tag::__hasparent; |
20
|
|
|
|
|
|
|
sub parent_ok { |
21
|
1814
|
|
|
1814
|
|
1283
|
my $self = shift; |
22
|
1814
|
100
|
|
|
|
4757
|
$self->{parent} and $self->{parent}->proxy_ok; |
23
|
|
|
|
|
|
|
} |
24
|
|
|
|
|
|
|
sub get_config { |
25
|
1804
|
|
|
1804
|
|
1388
|
my $self = shift; |
26
|
1804
|
100
|
|
|
|
1902
|
return $MP3::Tag::config{shift()} unless $self->parent_ok; |
27
|
1394
|
|
|
|
|
4480
|
return $self->{parent}->get_config(@_); |
28
|
|
|
|
|
|
|
} |
29
|
|
|
|
|
|
|
*get_config1 = \&MP3::Tag::Implemenation::get_config1; |
30
|
|
|
|
|
|
|
*get_config1 = 0 if 0; # quiet a warning |
31
|
|
|
|
|
|
|
} |
32
|
|
|
|
|
|
|
|
33
|
6
|
|
|
6
|
|
2199
|
use MP3::Tag::ID3v1; |
|
6
|
|
|
|
|
9
|
|
|
6
|
|
|
|
|
161
|
|
34
|
6
|
|
|
6
|
|
3690
|
use MP3::Tag::ID3v2; |
|
6
|
|
|
|
|
10
|
|
|
6
|
|
|
|
|
179
|
|
35
|
6
|
|
|
6
|
|
2206
|
use MP3::Tag::File; |
|
6
|
|
|
|
|
10
|
|
|
6
|
|
|
|
|
133
|
|
36
|
6
|
|
|
6
|
|
1961
|
use MP3::Tag::Inf; |
|
6
|
|
|
|
|
9
|
|
|
6
|
|
|
|
|
124
|
|
37
|
6
|
|
|
6
|
|
2001
|
use MP3::Tag::CDDB_File; |
|
6
|
|
|
|
|
7
|
|
|
6
|
|
|
|
|
153
|
|
38
|
6
|
|
|
6
|
|
1924
|
use MP3::Tag::Cue; |
|
6
|
|
|
|
|
7
|
|
|
6
|
|
|
|
|
141
|
|
39
|
6
|
|
|
6
|
|
1960
|
use MP3::Tag::ParseData; |
|
6
|
|
|
|
|
110
|
|
|
6
|
|
|
|
|
140
|
|
40
|
6
|
|
|
6
|
|
1767
|
use MP3::Tag::ImageSize; |
|
6
|
|
|
|
|
7
|
|
|
6
|
|
|
|
|
122
|
|
41
|
6
|
|
|
6
|
|
1892
|
use MP3::Tag::ImageExifTool; |
|
6
|
|
|
|
|
9
|
|
|
6
|
|
|
|
|
131
|
|
42
|
6
|
|
|
6
|
|
1871
|
use MP3::Tag::LastResort; |
|
6
|
|
|
|
|
10
|
|
|
6
|
|
|
|
|
125
|
|
43
|
|
|
|
|
|
|
|
44
|
6
|
|
|
6
|
|
20
|
use vars qw/$VERSION @ISA/; |
|
6
|
|
|
|
|
6
|
|
|
6
|
|
|
|
|
352
|
|
45
|
|
|
|
|
|
|
$VERSION="1.14"; |
46
|
|
|
|
|
|
|
@ISA = qw( MP3::Tag::User MP3::Tag::Site MP3::Tag::Vendor |
47
|
|
|
|
|
|
|
MP3::Tag::Implemenation ); # Make overridable |
48
|
|
|
|
|
|
|
*config = \%MP3::Tag::Implemenation::config; |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
package MP3::Tag::Implemenation; # XXXX Old mispring... |
51
|
6
|
|
|
6
|
|
16
|
use vars qw/%config/; |
|
6
|
|
|
|
|
4
|
|
|
6
|
|
|
|
|
2017
|
|
52
|
|
|
|
|
|
|
%config = ( autoinfo => [qw( ParseData ID3v2 ID3v1 ImageExifTool |
53
|
|
|
|
|
|
|
CDDB_File Inf Cue ImageSize |
54
|
|
|
|
|
|
|
filename LastResort )], |
55
|
|
|
|
|
|
|
cddb_files => [qw(audio.cddb cddb.out cddb.in)], |
56
|
|
|
|
|
|
|
v2title => [qw(TIT1 TIT2 TIT3)], |
57
|
|
|
|
|
|
|
composer => ['TCOM|a'], |
58
|
|
|
|
|
|
|
performer => ['TXXX[TPE1]|TPE1|a'], |
59
|
|
|
|
|
|
|
extension => ['\.(?!\d+\b)\w{1,4}$'], |
60
|
|
|
|
|
|
|
parse_data => [], |
61
|
|
|
|
|
|
|
parse_split => ["\n"], |
62
|
|
|
|
|
|
|
encoded_v1_fits => [0], |
63
|
|
|
|
|
|
|
parse_filename_ignore_case => [1], |
64
|
|
|
|
|
|
|
parse_filename_merge_dots => [1], |
65
|
|
|
|
|
|
|
parse_join => ['; '], |
66
|
|
|
|
|
|
|
year_is_timestamp => [1], |
67
|
|
|
|
|
|
|
comment_remove_date => [0], |
68
|
|
|
|
|
|
|
id3v2_frame_empty_ok => [0], |
69
|
|
|
|
|
|
|
id3v2_minpadding => [128], |
70
|
|
|
|
|
|
|
id3v2_sizemult => [512], |
71
|
|
|
|
|
|
|
id3v2_shrink => [0], |
72
|
|
|
|
|
|
|
id3v2_mergepadding => [0], |
73
|
|
|
|
|
|
|
id3v23_unsync_size_w => [0], |
74
|
|
|
|
|
|
|
id3v23_unsync => [1], |
75
|
|
|
|
|
|
|
parse_minmatch => [0], |
76
|
|
|
|
|
|
|
update_length => [1], |
77
|
|
|
|
|
|
|
default_language => ['XXX'], |
78
|
|
|
|
|
|
|
default_descr_c => [''], |
79
|
|
|
|
|
|
|
person_frames => [qw{ TEXT TCOM TXXX[TPE1] TPE1 |
80
|
|
|
|
|
|
|
TPE3 TOPE TOLY TMCL TIPL TENC |
81
|
|
|
|
|
|
|
TXXX[person-file-by] }], |
82
|
|
|
|
|
|
|
id3v2_frames_autofill => [qw{ TXXX[MCDI-fulltoc] 1 TXXX[cddb_id] 0 |
83
|
|
|
|
|
|
|
TXXX[cdindex_id] 0 }], |
84
|
|
|
|
|
|
|
id3v2_set_trusted_encoding0 => [1], |
85
|
|
|
|
|
|
|
id3v2_fix_encoding_on_edit => [1], |
86
|
|
|
|
|
|
|
name_for_field_normalization => ['%{composer}'], |
87
|
|
|
|
|
|
|
local_cfg_file => ['~/.mp3tagprc'], |
88
|
|
|
|
|
|
|
extra_config_keys => [], |
89
|
|
|
|
|
|
|
is_writable => ['writable_by_extension'], |
90
|
|
|
|
|
|
|
# ExifTool says: ID3 may be in MP3/MPEG/AIFF/OGG/FLAC/APE/RealAudio (MPC). |
91
|
|
|
|
|
|
|
writable_extensions => [qw(mp3 mp2 id3 tag ogg mpg mpeg |
92
|
|
|
|
|
|
|
mp4 aiff flac ape ram mpc)], |
93
|
|
|
|
|
|
|
ampersand_joiner => ['; '], |
94
|
|
|
|
|
|
|
); |
95
|
|
|
|
|
|
|
{ |
96
|
|
|
|
|
|
|
my %e; |
97
|
|
|
|
|
|
|
for my $t (qw(V1 V2 FILENAME FILES INF CDDB_FILE CUE)) { |
98
|
|
|
|
|
|
|
$e{$t} = $ENV{"MP3TAG_DECODE_${t}_DEFAULT"}; |
99
|
|
|
|
|
|
|
$e{$t} = $ENV{MP3TAG_DECODE_DEFAULT} unless defined $e{$t}; |
100
|
|
|
|
|
|
|
$config{"decode_encoding_" . lc $t} = [$e{$t}] if $e{$t}; |
101
|
|
|
|
|
|
|
} |
102
|
|
|
|
|
|
|
$e{eV1} = $ENV{MP3TAG_ENCODE_V1_DEFAULT}; |
103
|
|
|
|
|
|
|
$e{eV1} = $ENV{MP3TAG_ENCODE_DEFAULT} unless defined $e{eV1}; |
104
|
|
|
|
|
|
|
$e{eV1} = $e{V1} unless defined $e{eV1}; |
105
|
|
|
|
|
|
|
$config{encode_encoding_v1} = [$e{eV1}] if $e{eV1}; |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
$e{eF} = $ENV{MP3TAG_ENCODE_FILES_DEFAULT}; |
108
|
|
|
|
|
|
|
$e{eF} = $ENV{MP3TAG_ENCODE_DEFAULT} unless defined $e{eF}; |
109
|
|
|
|
|
|
|
$e{eF} = $e{FILES} unless defined $e{eF}; |
110
|
|
|
|
|
|
|
$config{encode_encoding_files} = [$e{eF}] if $e{eF}; |
111
|
|
|
|
|
|
|
} |
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
=pod |
114
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
=head1 NAME |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
MP3::Tag - Module for reading tags of MP3 audio files |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
=head1 SYNOPSIS |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
use MP3::Tag; |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
$mp3 = MP3::Tag->new($filename); |
124
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
# get some information about the file in the easiest way |
126
|
|
|
|
|
|
|
($title, $track, $artist, $album, $comment, $year, $genre) = $mp3->autoinfo(); |
127
|
|
|
|
|
|
|
# Or: |
128
|
|
|
|
|
|
|
$comment = $mp3->comment(); |
129
|
|
|
|
|
|
|
$dedicated_to |
130
|
|
|
|
|
|
|
= $mp3->select_id3v2_frame_by_descr('COMM(fre,fra,eng,#0)[dedicated to]'); |
131
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
$mp3->title_set('New title'); # Edit in-memory copy |
133
|
|
|
|
|
|
|
$mp3->select_id3v2_frame_by_descr('TALB', 'New album name'); # Edit in memory |
134
|
|
|
|
|
|
|
$mp3->select_id3v2_frame_by_descr('RBUF', $n1, $n2, $n3); # Edit in memory |
135
|
|
|
|
|
|
|
$mp3->update_tags({year => 1866}); # Edit in-memory, and commit to file |
136
|
|
|
|
|
|
|
$mp3->update_tags(); # Commit to file |
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
The following low-level access code is discouraged; better use title() |
139
|
|
|
|
|
|
|
etc., title_set() etc., update_tags(), select_id3v2_frame_by_descr() |
140
|
|
|
|
|
|
|
etc. methods on the wrapper $mp3: |
141
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
# scan file for existing tags |
143
|
|
|
|
|
|
|
$mp3->get_tags; |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
if (exists $mp3->{ID3v1}) { |
146
|
|
|
|
|
|
|
# read some information from the tag |
147
|
|
|
|
|
|
|
$id3v1 = $mp3->{ID3v1}; # $id3v1 is only a shortcut for $mp3->{ID3v1} |
148
|
|
|
|
|
|
|
print $id3v1->title; |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
# change the tag contents |
151
|
|
|
|
|
|
|
$id3v1->all("Song","Artist","Album",2001,"Comment",10,"Top 40"); |
152
|
|
|
|
|
|
|
$id3v1->write_tag; |
153
|
|
|
|
|
|
|
} |
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
if (exists $mp3->{ID3v2}) { |
156
|
|
|
|
|
|
|
# read some information from the tag |
157
|
|
|
|
|
|
|
($name, $info) = $mp3->{ID3v2}->get_frame("TIT2"); |
158
|
|
|
|
|
|
|
# delete the tag completely from the file |
159
|
|
|
|
|
|
|
$mp3->{ID3v2}->remove_tag; |
160
|
|
|
|
|
|
|
} else { |
161
|
|
|
|
|
|
|
# create a new tag |
162
|
|
|
|
|
|
|
$mp3->new_tag("ID3v2"); |
163
|
|
|
|
|
|
|
$mp3->{ID3v2}->add_frame("TALB", "Album title"); |
164
|
|
|
|
|
|
|
$mp3->{ID3v2}->write_tag; |
165
|
|
|
|
|
|
|
} |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
$mp3->close(); |
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
Please consider using the script F; it allows simple access |
170
|
|
|
|
|
|
|
to most features of this module via command-line options; see |
171
|
|
|
|
|
|
|
L. |
172
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
=head1 AUTHORS |
174
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
Thomas Geffert, thg@users.sourceforge.net |
176
|
|
|
|
|
|
|
Ilya Zakharevich, ilyaz@cpan.org |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
=head1 DESCRIPTION |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
C is a wrapper module to read different tags of mp3 files. |
181
|
|
|
|
|
|
|
It provides an easy way to access the functions of separate modules which |
182
|
|
|
|
|
|
|
do the handling of reading/writing the tags itself. |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
At the moment MP3::Tag::ID3v1 and MP3::Tag::ID3v2 are supported for |
185
|
|
|
|
|
|
|
read and write; MP3::Tag::ImageExifTool, MP3::Tag::Inf, MP3::Tag::CDDB_File, |
186
|
|
|
|
|
|
|
MP3::Tag::File, MP3::Tag::Cue, MP3::Tag::ImageSize, MP3::Tag::LastResort |
187
|
|
|
|
|
|
|
are supported for read access (the information obtained by |
188
|
|
|
|
|
|
|
L (if present), parsing CDDB files, |
189
|
|
|
|
|
|
|
F<.inf> file, the filename, and F<.cue> file, and obtained via |
190
|
|
|
|
|
|
|
L) (if present). |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
=over 4 |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
=item new() |
195
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
$mp3 = MP3::Tag->new($filename); |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
Creates a mp3-object, which can be used to retrieve/set |
199
|
|
|
|
|
|
|
different tags. |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
=cut |
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
sub rel2abs ($) { |
204
|
174
|
|
|
174
|
|
152
|
shift; |
205
|
174
|
50
|
|
|
|
142
|
if (eval {require File::Spec; File::Spec->can('rel2abs')}) { |
|
174
|
|
|
|
|
580
|
|
|
174
|
|
|
|
|
745
|
|
206
|
174
|
|
|
|
|
2580
|
File::Spec->rel2abs(shift); |
207
|
|
|
|
|
|
|
} else { |
208
|
|
|
|
|
|
|
# require Cwd; |
209
|
|
|
|
|
|
|
# Cwd::abs_path(shift); |
210
|
0
|
|
|
|
|
0
|
shift; |
211
|
|
|
|
|
|
|
} |
212
|
|
|
|
|
|
|
} |
213
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
sub new { |
215
|
87
|
|
|
87
|
|
4226
|
my $class = shift; |
216
|
87
|
|
|
|
|
95
|
my $filename = shift; |
217
|
87
|
|
|
|
|
72
|
my $mp3data; |
218
|
87
|
|
|
|
|
108
|
my $self = {}; |
219
|
87
|
|
|
|
|
110
|
bless $self, $class; |
220
|
87
|
|
|
|
|
302
|
my $proxy = MP3::Tag::__proxy->new($self); |
221
|
87
|
50
|
33
|
|
|
960
|
if (-f $filename or -c $filename) { |
222
|
87
|
|
|
|
|
410
|
$mp3data = MP3::Tag::File->new_with_parent($filename, $proxy); |
223
|
|
|
|
|
|
|
} |
224
|
|
|
|
|
|
|
# later it should hopefully possible to support also http/ftp sources |
225
|
|
|
|
|
|
|
# with a MP3::Tag::Net module or something like that |
226
|
87
|
50
|
|
|
|
178
|
if ($mp3data) { |
227
|
87
|
|
|
|
|
178
|
%$self = (filename => $mp3data, |
228
|
|
|
|
|
|
|
ofilename => $filename, |
229
|
|
|
|
|
|
|
abs_filename => $class->rel2abs($filename), |
230
|
|
|
|
|
|
|
__proxy => $proxy); |
231
|
87
|
|
|
|
|
246
|
return $self; |
232
|
|
|
|
|
|
|
} |
233
|
0
|
|
|
|
|
0
|
return undef; |
234
|
|
|
|
|
|
|
} |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
{ # Proxy class: to have only one place where to weaken/localize the reference |
237
|
|
|
|
|
|
|
# $obj->[0] must be settable to the handle (not needed if weakening succeeds) |
238
|
|
|
|
|
|
|
package MP3::Tag::__proxy; |
239
|
6
|
|
|
6
|
|
27
|
use vars qw/$AUTOLOAD/; |
|
6
|
|
|
|
|
10
|
|
|
6
|
|
|
|
|
7564
|
|
240
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
my $skip_weaken = $ENV{MP3TAG_SKIP_WEAKEN}; |
242
|
|
|
|
|
|
|
sub new { |
243
|
88
|
|
|
88
|
|
120
|
my ($class, $handle) = (shift,shift); |
244
|
88
|
|
|
|
|
138
|
my $self = bless [$handle], $class; |
245
|
|
|
|
|
|
|
#warn("weaken() failed, falling back"), |
246
|
|
|
|
|
|
|
return bless [], $class if $skip_weaken or not |
247
|
88
|
50
|
33
|
|
|
229
|
eval {require Scalar::Util; Scalar::Util::weaken($self->[0]); 1}; |
|
88
|
|
|
|
|
408
|
|
|
88
|
|
|
|
|
250
|
|
|
88
|
|
|
|
|
283
|
|
248
|
88
|
|
|
|
|
122
|
$self; |
249
|
|
|
|
|
|
|
} |
250
|
|
|
|
0
|
|
|
sub DESTROY {} |
251
|
1404
|
|
|
1404
|
|
3773
|
sub proxy_ok { shift->[0] } |
252
|
|
|
|
|
|
|
sub AUTOLOAD { |
253
|
1544
|
|
|
1544
|
|
1095
|
my $self = shift; |
254
|
1544
|
50
|
|
|
|
2010
|
die "local_proxy not initialized" unless $self->[0]; |
255
|
1544
|
|
|
|
|
4756
|
(my $meth = $AUTOLOAD) =~ s/.*:://; |
256
|
1544
|
|
|
|
|
2880
|
my $smeth = $self->[0]->can($meth); |
257
|
1544
|
50
|
|
|
|
2105
|
die "proxy can't find the method $meth" unless $smeth; |
258
|
1544
|
|
|
|
|
1667
|
unshift @_, $self->[0]; |
259
|
1544
|
|
|
|
|
2513
|
goto &$smeth; |
260
|
|
|
|
|
|
|
} |
261
|
|
|
|
|
|
|
} |
262
|
|
|
|
|
|
|
|
263
|
0
|
|
|
0
|
|
0
|
sub proxy_ok { 1 } # We can always be a proxy to ourselves... ;-) |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
=pod |
266
|
|
|
|
|
|
|
|
267
|
|
|
|
|
|
|
=item get_tags() |
268
|
|
|
|
|
|
|
|
269
|
|
|
|
|
|
|
[old name: getTags() . The old name is still available, but its use is not advised] |
270
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
@tags = $mp3->get_tags; |
272
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
Checks which tags can be found in the mp3-object. It returns |
274
|
|
|
|
|
|
|
a list @tags which contains strings identifying the found tags, like |
275
|
|
|
|
|
|
|
"ID3v1", "ID3v2", "Inf", or "CDDB_File" (the last but one if the F<.inf> |
276
|
|
|
|
|
|
|
information file with the same basename as MP3 file is found). |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
Each found tag can then be accessed with $mp3->{tagname} , where tagname is |
279
|
|
|
|
|
|
|
a string returned by get_tags ; |
280
|
|
|
|
|
|
|
|
281
|
|
|
|
|
|
|
Use the information found in L, L and |
282
|
|
|
|
|
|
|
L, L, L to see what you can do with the tags. |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
=cut |
285
|
|
|
|
|
|
|
|
286
|
|
|
|
|
|
|
################ tag subs |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
sub get_tags { |
289
|
937
|
|
|
937
|
|
744
|
my $self = shift; |
290
|
937
|
100
|
|
|
|
1644
|
return @{$self->{gottags}} if exists $self->{gottags}; |
|
852
|
|
|
|
|
1110
|
|
291
|
85
|
|
|
|
|
75
|
my (@IDs, $id); |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
# Will not create a reference loop |
294
|
85
|
0
|
33
|
|
|
147
|
local $self->{__proxy}[0] = $self unless $self->{__proxy}[0] or $ENV{MP3TAG_TEST_WEAKEN}; |
295
|
85
|
|
|
|
|
118
|
for $id (qw(ParseData ID3v2 ID3v1 ImageExifTool Inf CDDB_File Cue ImageSize LastResort)) { |
296
|
765
|
|
|
|
|
3433
|
my $ref = "MP3::Tag::$id"->new_with_parent($self->{filename}, $self->{__proxy}); |
297
|
765
|
100
|
|
|
|
1322
|
next unless defined $ref; |
298
|
470
|
|
|
|
|
606
|
$self->{$id} = $ref; |
299
|
470
|
|
|
|
|
613
|
push @IDs, $id; |
300
|
|
|
|
|
|
|
} |
301
|
85
|
|
|
|
|
162
|
$self->{gottags} = [@IDs]; |
302
|
85
|
|
|
|
|
126
|
return @IDs; |
303
|
|
|
|
|
|
|
} |
304
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
sub _get_tag { |
306
|
12
|
|
|
12
|
|
12
|
my $self = shift; |
307
|
12
|
|
|
|
|
42
|
$self->{shift()}; |
308
|
|
|
|
|
|
|
} |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
# keep old name for a while |
311
|
|
|
|
|
|
|
*getTags = \&get_tags; |
312
|
|
|
|
|
|
|
*getTags = 0 if 0; # quiet a warning |
313
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
=item new_fake |
315
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
$obj = MP3::Tag->new_fake(); |
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
This method produces a "fake" MP3::Tag object which behaves as an MP3 |
319
|
|
|
|
|
|
|
file without tags. Give a TRUE optional argument if you want to set |
320
|
|
|
|
|
|
|
some properties of this object. |
321
|
|
|
|
|
|
|
|
322
|
|
|
|
|
|
|
=cut |
323
|
|
|
|
|
|
|
|
324
|
|
|
|
|
|
|
sub new_fake { |
325
|
3
|
|
|
3
|
|
28
|
my ($class, $settable) = (shift, shift); |
326
|
3
|
|
|
|
|
9
|
my %h = (gottags => []); |
327
|
3
|
|
|
|
|
8
|
my $self = bless \%h, $class; |
328
|
3
|
100
|
|
|
|
6
|
if ($settable) { |
329
|
1
|
|
|
|
|
7
|
$h{__proxy} = MP3::Tag::__proxy->new($self); |
330
|
1
|
|
|
|
|
6
|
$h{ParseData} = MP3::Tag::ParseData->new_with_parent(undef, $h{__proxy}); |
331
|
|
|
|
|
|
|
} |
332
|
3
|
|
|
|
|
6
|
\%h; |
333
|
|
|
|
|
|
|
} |
334
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
=pod |
337
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
=item new_tag() |
339
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
[old name: newTag() . The old name is still available, but its use is not advised] |
341
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
$tag = $mp3->new_tag($tagname); |
343
|
|
|
|
|
|
|
|
344
|
|
|
|
|
|
|
Creates a new tag of the given type $tagname. You |
345
|
|
|
|
|
|
|
can access it then with $mp3->{$tagname}. At the |
346
|
|
|
|
|
|
|
moment ID3v1 and ID3v2 are supported as tagname. |
347
|
|
|
|
|
|
|
|
348
|
|
|
|
|
|
|
Returns an tag-object: $mp3->{$tagname}. |
349
|
|
|
|
|
|
|
|
350
|
|
|
|
|
|
|
=cut |
351
|
|
|
|
|
|
|
|
352
|
|
|
|
|
|
|
sub new_tag { |
353
|
32
|
|
|
32
|
|
29
|
my $self = shift; |
354
|
32
|
|
|
|
|
31
|
my $whichTag = shift; |
355
|
32
|
100
|
|
|
|
96
|
if ($whichTag =~ /1/) { |
|
|
50
|
|
|
|
|
|
356
|
16
|
|
|
|
|
74
|
$self->{ID3v1}= MP3::Tag::ID3v1->new($self->{filename},1); |
357
|
16
|
|
|
|
|
26
|
return $self->{ID3v1}; |
358
|
|
|
|
|
|
|
} elsif ($whichTag =~ /2/) { |
359
|
16
|
|
|
|
|
73
|
$self->{ID3v2}= MP3::Tag::ID3v2->new($self->{filename},1); |
360
|
16
|
|
|
|
|
25
|
return $self->{ID3v2}; |
361
|
|
|
|
|
|
|
} |
362
|
|
|
|
|
|
|
} |
363
|
|
|
|
|
|
|
|
364
|
|
|
|
|
|
|
# keep old name for a while |
365
|
|
|
|
|
|
|
*newTag = \&new_tag; |
366
|
|
|
|
|
|
|
*newTag = 0 if 0; # quiet a warning |
367
|
|
|
|
|
|
|
|
368
|
|
|
|
|
|
|
#only as a shortcut to {filename}->close to explicitly close a file |
369
|
|
|
|
|
|
|
|
370
|
|
|
|
|
|
|
=pod |
371
|
|
|
|
|
|
|
|
372
|
|
|
|
|
|
|
=item close() |
373
|
|
|
|
|
|
|
|
374
|
|
|
|
|
|
|
$mp3->close; |
375
|
|
|
|
|
|
|
|
376
|
|
|
|
|
|
|
You can use close() to explicitly close a file. Normally this is done |
377
|
|
|
|
|
|
|
automatically by the module, so that you do not need to do this. |
378
|
|
|
|
|
|
|
|
379
|
|
|
|
|
|
|
=cut |
380
|
|
|
|
|
|
|
|
381
|
|
|
|
|
|
|
sub close { |
382
|
0
|
|
|
0
|
|
0
|
my $self=shift; |
383
|
0
|
|
|
|
|
0
|
$self->{filename}->close; |
384
|
|
|
|
|
|
|
} |
385
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
=pod |
387
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
=item genres() |
389
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
$allgenres = $mp3->genres; |
391
|
|
|
|
|
|
|
$genreName = $mp3->genres($genreID); |
392
|
|
|
|
|
|
|
$genreID = $mp3->genres($genreName); |
393
|
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
Returns a list of all genres (reference to an array), or the according |
395
|
|
|
|
|
|
|
name or id to a given id or name. |
396
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
This function is only a shortcut to MP3::Tag::ID3v1->genres. |
398
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
This can be also called as MP3::Tag->genres; |
400
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
=cut |
402
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
sub genres { |
404
|
|
|
|
|
|
|
# returns all genres, or if a parameter is given, the according genre |
405
|
0
|
|
|
0
|
|
0
|
my $self=shift; |
406
|
0
|
|
|
|
|
0
|
return MP3::Tag::ID3v1::genres(shift); |
407
|
|
|
|
|
|
|
} |
408
|
|
|
|
|
|
|
|
409
|
|
|
|
|
|
|
=pod |
410
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
=item autoinfo() |
412
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
($title, $track, $artist, $album, $comment, $year, $genre) = $mp3->autoinfo(); |
414
|
|
|
|
|
|
|
$info_hashref = $mp3->autoinfo(); |
415
|
|
|
|
|
|
|
|
416
|
|
|
|
|
|
|
autoinfo() returns information about the title, track number, |
417
|
|
|
|
|
|
|
artist, album name, the file comment, the year and genre. It can get this |
418
|
|
|
|
|
|
|
information from an ID3v1-tag, an ID3v2-tag, from CDDB file, from F<.inf>-file, |
419
|
|
|
|
|
|
|
and from the filename itself. |
420
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
It will as default first try to find a ID3v2-tag to get this |
422
|
|
|
|
|
|
|
information. If this cannot be found it tries to find a ID3v1-tag, then |
423
|
|
|
|
|
|
|
to read an CDDB file, an F<.inf>-file, and |
424
|
|
|
|
|
|
|
if these are not present either, it will use the filename to retrieve |
425
|
|
|
|
|
|
|
the title, track number, artist, album name. The comment, year and genre |
426
|
|
|
|
|
|
|
are found differently, via the C, C and C methods. |
427
|
|
|
|
|
|
|
|
428
|
|
|
|
|
|
|
You can change the order of lookup with the config() command. |
429
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
autoinfo() returns an array with the information or a hashref. The hash |
431
|
|
|
|
|
|
|
has four keys 'title', 'track', 'artist' and 'album' where the information is |
432
|
|
|
|
|
|
|
stored. If comment, year or genre are found, the hash will have keys |
433
|
|
|
|
|
|
|
'comment' and/or 'year' and/or 'genre' too. |
434
|
|
|
|
|
|
|
|
435
|
|
|
|
|
|
|
If an optional argument C<'from'> is given, the returned values (title, |
436
|
|
|
|
|
|
|
track number, artist, album name, the file comment, the year and genre) are |
437
|
|
|
|
|
|
|
array references with the first element being the value, the second the |
438
|
|
|
|
|
|
|
tag (C or C or C or C or C or C) from which |
439
|
|
|
|
|
|
|
it is taken. |
440
|
|
|
|
|
|
|
|
441
|
|
|
|
|
|
|
(Deprecated name 'song' can be used instead of 'title' as well.) |
442
|
|
|
|
|
|
|
|
443
|
|
|
|
|
|
|
=cut |
444
|
|
|
|
|
|
|
|
445
|
|
|
|
|
|
|
sub autoinfo() { |
446
|
23
|
|
|
23
|
|
31
|
my ($self, $from) = (shift, shift); |
447
|
23
|
|
|
|
|
21
|
my (@out, %out); |
448
|
|
|
|
|
|
|
|
449
|
23
|
|
|
|
|
40
|
for my $elt ( qw( title track artist album comment year genre ) ) { |
450
|
161
|
|
|
|
|
345
|
my $out = $self->$elt($from); |
451
|
161
|
50
|
66
|
|
|
681
|
if (wantarray) { |
|
|
100
|
|
|
|
|
|
452
|
0
|
|
|
|
|
0
|
push @out, $out; |
453
|
|
|
|
|
|
|
} elsif (defined $out and length $out) { |
454
|
111
|
|
|
|
|
214
|
$out{$elt} = $out; |
455
|
|
|
|
|
|
|
} |
456
|
|
|
|
|
|
|
} |
457
|
23
|
50
|
|
|
|
54
|
$out{song} = $out{title} if exists $out{title}; |
458
|
|
|
|
|
|
|
|
459
|
23
|
50
|
|
|
|
77
|
return wantarray ? @out : \%out; |
460
|
|
|
|
|
|
|
} |
461
|
|
|
|
|
|
|
|
462
|
|
|
|
|
|
|
=item comment() |
463
|
|
|
|
|
|
|
|
464
|
|
|
|
|
|
|
$comment = $mp3->comment(); # empty string unless found |
465
|
|
|
|
|
|
|
|
466
|
|
|
|
|
|
|
comment() returns comment information. It can get this information from an |
467
|
|
|
|
|
|
|
ID3v1-tag, or an ID3v2-tag (from C frame with empty field), |
468
|
|
|
|
|
|
|
CDDB file (from C or C fields), or F<.inf>-file (from |
469
|
|
|
|
|
|
|
C field). |
470
|
|
|
|
|
|
|
|
471
|
|
|
|
|
|
|
It will as default first try to find a ID3v2-tag to get this |
472
|
|
|
|
|
|
|
information. If no comment is found there, it tries to find it in a ID3v1-tag, |
473
|
|
|
|
|
|
|
if none present, will try CDDB file, then F<.inf>-file. It returns an empty string if |
474
|
|
|
|
|
|
|
no comment is found. |
475
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
You can change the order of this with the config() command. |
477
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
If an optional argument C<'from'> is given, returns an array reference with |
479
|
|
|
|
|
|
|
the first element being the value, the second the tag (ID3v2 or ID3v1) from |
480
|
|
|
|
|
|
|
which the value is taken. |
481
|
|
|
|
|
|
|
|
482
|
|
|
|
|
|
|
=cut |
483
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
=item year() |
485
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
$year = $mp3->year(); # empty string unless found |
487
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
year() returns the year information. It can get this information from an |
489
|
|
|
|
|
|
|
ID3v2-tag, or ID3v1-tag, or F<.inf>-file, or filename. |
490
|
|
|
|
|
|
|
|
491
|
|
|
|
|
|
|
It will as default first try to find a ID3v2-tag to get this |
492
|
|
|
|
|
|
|
information. If no year is found there, it tries to find it in a ID3v1-tag, |
493
|
|
|
|
|
|
|
if none present, will try CDDB file, then F<.inf>-file, |
494
|
|
|
|
|
|
|
then by parsing the file name. It returns an empty string if no year is found. |
495
|
|
|
|
|
|
|
|
496
|
|
|
|
|
|
|
You can change the order of this with the config() command. |
497
|
|
|
|
|
|
|
|
498
|
|
|
|
|
|
|
If an optional argument C<'from'> is given, returns an array reference with |
499
|
|
|
|
|
|
|
the first element being the value, the second the tag (ID3v2 or ID3v1 or |
500
|
|
|
|
|
|
|
filename) from which the value is taken. |
501
|
|
|
|
|
|
|
|
502
|
|
|
|
|
|
|
=item comment_collection(), comment_track(), title_track(). artist_collection() |
503
|
|
|
|
|
|
|
|
504
|
|
|
|
|
|
|
access the corresponding fields returned by parse() method of CDDB_File. |
505
|
|
|
|
|
|
|
|
506
|
|
|
|
|
|
|
=item cddb_id(), cdindex_id() |
507
|
|
|
|
|
|
|
|
508
|
|
|
|
|
|
|
access the corresponding methods of C, C or C. |
509
|
|
|
|
|
|
|
|
510
|
|
|
|
|
|
|
=item title_set(), artist_set(), album_set(), year_set(), comment_set(), track_set(), genre_set() |
511
|
|
|
|
|
|
|
|
512
|
|
|
|
|
|
|
$mp3->title_set($newtitle, [$force_id3v2]); |
513
|
|
|
|
|
|
|
|
514
|
|
|
|
|
|
|
Set the corresponding value in ID3v1 tag, and, if the value does not fit, |
515
|
|
|
|
|
|
|
or force_id3v2 is TRUE, in the ID3v2 tag. Changes are made to in-memory |
516
|
|
|
|
|
|
|
copy only. To propagate to the file, use update_tags() or similar methods. |
517
|
|
|
|
|
|
|
|
518
|
|
|
|
|
|
|
=item track1() |
519
|
|
|
|
|
|
|
|
520
|
|
|
|
|
|
|
Same as track(), but strips trailing info: if track() returns C<3/12> |
521
|
|
|
|
|
|
|
(which means track 3 of 12), this method returns C<3>. |
522
|
|
|
|
|
|
|
|
523
|
|
|
|
|
|
|
=item track2() |
524
|
|
|
|
|
|
|
|
525
|
|
|
|
|
|
|
Returns the second part of track number (compare with track1()). |
526
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
=item track0() |
528
|
|
|
|
|
|
|
|
529
|
|
|
|
|
|
|
Same as track1(), but pads with leading 0s to width of track2(); takes an |
530
|
|
|
|
|
|
|
optional argument (default is 2) giving the pad width in absense of track2(). |
531
|
|
|
|
|
|
|
|
532
|
|
|
|
|
|
|
=item disk1(), disk2() |
533
|
|
|
|
|
|
|
|
534
|
|
|
|
|
|
|
Same as track1(), track2(), but with disk-number instead of track-number |
535
|
|
|
|
|
|
|
(stored in C ID3v2 frame). |
536
|
|
|
|
|
|
|
|
537
|
|
|
|
|
|
|
=item disk_alphanum() |
538
|
|
|
|
|
|
|
|
539
|
|
|
|
|
|
|
Same as disk1(), but encodes a non-empty result as a letter (1 maps to C, |
540
|
|
|
|
|
|
|
2 to C, etc). If number of disks is more than 26, falls back to numeric |
541
|
|
|
|
|
|
|
(e.g, C<3/888> will be encoded as C<003>). |
542
|
|
|
|
|
|
|
|
543
|
|
|
|
|
|
|
=cut |
544
|
|
|
|
|
|
|
|
545
|
|
|
|
|
|
|
sub track1 ($) { |
546
|
19
|
|
|
19
|
|
35
|
my $r = track(@_); |
547
|
19
|
|
|
|
|
36
|
$r =~ s(/.*)()s; |
548
|
19
|
|
|
|
|
46
|
$r; |
549
|
|
|
|
|
|
|
} |
550
|
|
|
|
|
|
|
|
551
|
|
|
|
|
|
|
sub track2 ($) { |
552
|
5
|
|
|
5
|
|
9
|
my $r = track(@_); |
553
|
5
|
50
|
|
|
|
25
|
return '' unless $r =~ s(^.*?/)()s; |
554
|
5
|
|
|
|
|
9
|
$r; |
555
|
|
|
|
|
|
|
} |
556
|
|
|
|
|
|
|
|
557
|
|
|
|
|
|
|
sub track0 ($) { |
558
|
5
|
|
|
5
|
|
5
|
my $self = shift; |
559
|
5
|
50
|
|
|
|
9
|
my $d = (@_ ? shift() : 2); |
560
|
5
|
|
|
|
|
7
|
my $r = $self->track(); |
561
|
5
|
50
|
|
|
|
10
|
return '' unless defined $r; |
562
|
5
|
|
|
|
|
13
|
(my $r1 = $r) =~ s(/.*)()s; |
563
|
5
|
50
|
|
|
|
15
|
$r = 'a' x $d unless $r =~ s(^.*?/)()s; |
564
|
5
|
|
|
|
|
6
|
my $l = length $r; |
565
|
5
|
|
|
|
|
22
|
sprintf "%0${l}d", $r1; |
566
|
|
|
|
|
|
|
} |
567
|
|
|
|
|
|
|
|
568
|
|
|
|
|
|
|
sub disk1 ($) { |
569
|
11
|
|
|
11
|
|
9
|
my $self = shift; |
570
|
11
|
|
|
|
|
18
|
my $r = $self->select_id3v2_frame('TPOS'); |
571
|
11
|
100
|
|
|
|
22
|
return '' unless defined $r; |
572
|
5
|
|
|
|
|
14
|
$r =~ s(/.*)()s; |
573
|
5
|
|
|
|
|
10
|
$r; |
574
|
|
|
|
|
|
|
} |
575
|
|
|
|
|
|
|
|
576
|
|
|
|
|
|
|
sub disk2 ($) { |
577
|
7
|
|
|
7
|
|
9
|
my $self = shift; |
578
|
7
|
|
|
|
|
13
|
my $r = $self->select_id3v2_frame('TPOS'); |
579
|
7
|
100
|
|
|
|
12
|
return '' unless defined $r; |
580
|
5
|
50
|
|
|
|
236
|
return '' unless $r =~ s(^.*?/)()s; |
581
|
5
|
|
|
|
|
15
|
$r; |
582
|
|
|
|
|
|
|
} |
583
|
|
|
|
|
|
|
|
584
|
|
|
|
|
|
|
sub disk_alphanum ($) { |
585
|
7
|
|
|
7
|
|
7
|
my $self = shift; |
586
|
7
|
|
|
|
|
12
|
my $r = $self->select_id3v2_frame('TPOS'); |
587
|
7
|
100
|
|
|
|
16
|
return '' unless defined $r; |
588
|
5
|
|
|
|
|
13
|
(my $r1 = $r) =~ s(/.*)()s; |
589
|
5
|
50
|
|
|
|
14
|
$r = $r1 unless $r =~ s(^.*?/)()s; # max(disk2, disk1) |
590
|
5
|
100
|
|
|
|
16
|
return chr(ord('a') - 1 + $r1) if $r <= 26; |
591
|
2
|
|
|
|
|
3
|
my $l = length $r; |
592
|
2
|
|
|
|
|
10
|
sprintf "%0${l}d", $r1; |
593
|
|
|
|
|
|
|
} |
594
|
|
|
|
|
|
|
|
595
|
|
|
|
|
|
|
my %ignore_0length = qw(ID3v1 1 CDDB_File 1 Inf 1 Cue 1 ImageSize 1 ImageExifTool 1); |
596
|
|
|
|
|
|
|
|
597
|
|
|
|
|
|
|
sub _auto_field_from($$$;$$$$) { |
598
|
284
|
|
100
|
284
|
|
875
|
my ($self, $check_only, $packs, $rwhat, $ret_from, $args, $all) = (shift, shift, shift, shift, shift, shift || [], shift); |
599
|
284
|
100
|
|
|
|
478
|
my @what = ref $rwhat ? @$rwhat : $rwhat; |
600
|
284
|
|
|
|
|
197
|
my @out; |
601
|
284
|
0
|
33
|
|
|
494
|
local $self->{__proxy}[0] = $self unless $self->{__proxy}[0] or $ENV{MP3TAG_TEST_WEAKEN}; |
602
|
|
|
|
|
|
|
|
603
|
284
|
|
|
|
|
372
|
$self->get_tags; |
604
|
|
|
|
|
|
|
|
605
|
|
|
|
|
|
|
# ID3v1 has AUTOLOAD |
606
|
|
|
|
|
|
|
# my $do_can = ($what =~ /^(cd\w+_id|height|width|bit_depth|mime_type|img_type|_duration)$/); |
607
|
284
|
|
|
|
|
345
|
foreach my $pack (@$packs) { |
608
|
1697
|
100
|
|
|
|
2337
|
next unless exists $self->{$pack}; |
609
|
1064
|
|
|
|
|
864
|
my $do_can = $pack ne 'ID3v1'; |
610
|
1064
|
|
|
|
|
623
|
my $out; |
611
|
1064
|
|
|
|
|
901
|
for my $what (@what) { |
612
|
1066
|
100
|
100
|
|
|
1728
|
next if $pack eq 'ID3v1' and not $MP3::Tag::ID3v1::ok_length{$what}; # dup of a warning in AUTOLOAD |
613
|
1065
|
100
|
100
|
|
|
4260
|
next if $do_can and not $self->{$pack}->can($what); |
614
|
1064
|
50
|
33
|
|
|
1606
|
if ($check_only and $self->{$pack}->can(my $m = $what . '_have')) { |
615
|
0
|
0
|
|
|
|
0
|
next unless $self->{$pack}->$m(@$args); |
616
|
0
|
0
|
|
|
|
0
|
return $ret_from ? [1, $pack] : 1; |
617
|
|
|
|
|
|
|
} |
618
|
1064
|
100
|
|
|
|
2536
|
next unless defined ($out = $self->{$pack}->$what(@$args)); |
619
|
|
|
|
|
|
|
# Ignore 0-length answers from ID3v1, ImageExifTool, CDDB_File, Cue, ImageSize, and Inf |
620
|
261
|
100
|
66
|
|
|
640
|
undef $out, next if not length $out and $ignore_0length{$pack}; # These return '' |
621
|
|
|
|
|
|
|
} |
622
|
1064
|
100
|
|
|
|
1550
|
next unless defined $out; |
623
|
228
|
50
|
|
|
|
292
|
$out = 1 if $check_only; |
624
|
228
|
50
|
|
|
|
418
|
if ($all) { # Currently, @out is not used by our callers |
625
|
0
|
0
|
|
|
|
0
|
push @out, ($ret_from ? [$out, $pack] : $out); |
626
|
0
|
|
|
|
|
0
|
next; |
627
|
|
|
|
|
|
|
} |
628
|
228
|
100
|
|
|
|
424
|
return [$out, $pack] if $ret_from; |
629
|
160
|
|
|
|
|
291
|
return $out; |
630
|
|
|
|
|
|
|
} |
631
|
56
|
50
|
|
|
|
78
|
return @out if $all; |
632
|
56
|
|
|
|
|
79
|
return; |
633
|
|
|
|
|
|
|
} |
634
|
|
|
|
|
|
|
|
635
|
|
|
|
|
|
|
sub auto_field($;$$) { |
636
|
282
|
|
|
282
|
|
324
|
my ($self, $what, $ret_from) = (shift, shift, shift); |
637
|
282
|
|
33
|
|
|
302
|
my $packs = $self->get_config($what) || $self->get_config('autoinfo'); |
638
|
282
|
|
|
|
|
426
|
my $o = $self->_auto_field_from(!'check_only', $packs, $what, $ret_from); |
639
|
282
|
100
|
|
|
|
472
|
return '' unless defined $o; |
640
|
227
|
|
|
|
|
415
|
$o; |
641
|
|
|
|
|
|
|
} |
642
|
|
|
|
|
|
|
|
643
|
|
|
|
|
|
|
for my $elt ( qw( title track artist album comment year genre ) ) { |
644
|
6
|
|
|
6
|
|
28
|
no strict 'refs'; |
|
6
|
|
|
|
|
6
|
|
|
6
|
|
|
|
|
618
|
|
645
|
|
|
|
|
|
|
*$elt = sub (;$) { |
646
|
282
|
|
|
282
|
|
554
|
my $self = shift; |
647
|
282
|
|
50
|
282
|
|
653
|
my $translate = ($self->get_config("translate_$elt") || [])->[0] || sub {$_[1]}; |
|
282
|
|
|
|
|
852
|
|
648
|
282
|
|
|
|
|
600
|
return &$translate($self, $self->auto_field($elt, @_)); |
649
|
|
|
|
|
|
|
} |
650
|
|
|
|
|
|
|
} |
651
|
|
|
|
|
|
|
|
652
|
|
|
|
|
|
|
my %hide_meth = qw(mime_type _mime_type); |
653
|
|
|
|
|
|
|
|
654
|
|
|
|
|
|
|
for my $elt ( qw( cddb_id cdindex_id height width bit_depth mime_type img_type _duration ) ) { |
655
|
6
|
|
|
6
|
|
20
|
no strict 'refs'; |
|
6
|
|
|
|
|
7
|
|
|
6
|
|
|
|
|
350
|
|
656
|
|
|
|
|
|
|
*{$hide_meth{$elt} || $elt} = sub (;$) { |
657
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
658
|
0
|
|
|
|
|
0
|
return $self->auto_field($elt, @_); |
659
|
|
|
|
|
|
|
} |
660
|
|
|
|
|
|
|
} |
661
|
|
|
|
|
|
|
|
662
|
|
|
|
|
|
|
for my $elt ( qw( comment_collection comment_track title_track artist_collection ) ) { |
663
|
6
|
|
|
6
|
|
20
|
no strict 'refs'; |
|
6
|
|
|
|
|
6
|
|
|
6
|
|
|
|
|
923
|
|
664
|
|
|
|
|
|
|
my ($tr) = ($elt =~ /^(\w+)_/); |
665
|
|
|
|
|
|
|
*$elt = sub (;$) { |
666
|
20
|
|
|
20
|
|
22
|
my $self = shift; |
667
|
20
|
0
|
33
|
|
|
38
|
local $self->{__proxy}[0] = $self unless $self->{__proxy}[0] or $ENV{MP3TAG_TEST_WEAKEN}; |
668
|
20
|
|
|
|
|
27
|
$self->get_tags; |
669
|
20
|
100
|
|
|
|
61
|
return unless exists $self->{CDDB_File}; |
670
|
6
|
|
|
|
|
16
|
my $v = $self->{CDDB_File}->parse($elt); |
671
|
6
|
100
|
|
|
|
11
|
return unless defined $v; |
672
|
5
|
|
50
|
5
|
|
13
|
my $translate = ($self->get_config("translate_$tr") || [])->[0] || sub {$_[1]}; |
|
5
|
|
|
|
|
20
|
|
673
|
5
|
|
|
|
|
11
|
return &$translate( $self, $v ); |
674
|
|
|
|
|
|
|
} |
675
|
|
|
|
|
|
|
} |
676
|
|
|
|
|
|
|
|
677
|
|
|
|
|
|
|
for my $elt ( qw(title artist album year comment track genre) ) { |
678
|
6
|
|
|
6
|
|
22
|
no strict 'refs'; |
|
6
|
|
|
|
|
5
|
|
|
6
|
|
|
|
|
1868
|
|
679
|
|
|
|
|
|
|
*{"${elt}_set"} = sub ($$;$) { |
680
|
4
|
|
|
4
|
|
19
|
my ($mp3, $val, $force2) = (shift, shift, shift); |
681
|
|
|
|
|
|
|
|
682
|
4
|
|
|
|
|
11
|
$mp3->get_tags; |
683
|
4
|
100
|
|
|
|
17
|
$mp3->new_tag("ID3v1") unless exists $mp3->{ID3v1}; |
684
|
4
|
|
|
|
|
21
|
$mp3->{ID3v1}->$elt( $val ); |
685
|
|
|
|
|
|
|
|
686
|
|
|
|
|
|
|
return 1 |
687
|
|
|
|
|
|
|
if not $force2 and $mp3->{ID3v1}->fits_tag({$elt => $val}) |
688
|
4
|
100
|
66
|
|
|
23
|
and not exists $mp3->{ID3v2}; |
|
|
|
66
|
|
|
|
|
689
|
|
|
|
|
|
|
|
690
|
2
|
50
|
|
|
|
12
|
$mp3->new_tag("ID3v2") unless exists $mp3->{ID3v2}; |
691
|
2
|
|
|
|
|
11
|
$mp3->{ID3v2}->$elt( $val ); |
692
|
|
|
|
|
|
|
} |
693
|
|
|
|
|
|
|
} |
694
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
sub aspect_ratio ($) { |
696
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
697
|
0
|
|
|
|
|
0
|
my ($w, $h) = ($self->width, $self->height); |
698
|
0
|
0
|
0
|
|
|
0
|
return unless $w and $h; |
699
|
0
|
|
|
|
|
0
|
$w/$h; |
700
|
|
|
|
|
|
|
} |
701
|
|
|
|
|
|
|
|
702
|
|
|
|
|
|
|
sub aspect_ratio_inverted ($) { |
703
|
0
|
0
|
|
0
|
|
0
|
my $r = shift->aspect_ratio or return; |
704
|
0
|
|
|
|
|
0
|
1/$r; |
705
|
|
|
|
|
|
|
} |
706
|
|
|
|
|
|
|
|
707
|
|
|
|
|
|
|
sub aspect_ratio3 ($) { |
708
|
0
|
|
|
0
|
|
0
|
my $r = shift->aspect_ratio(); |
709
|
0
|
0
|
|
|
|
0
|
$r ? sprintf '%.3f', $r : $r; |
710
|
|
|
|
|
|
|
} |
711
|
|
|
|
|
|
|
|
712
|
|
|
|
|
|
|
=item mime_type( [$lazy] ) |
713
|
|
|
|
|
|
|
|
714
|
|
|
|
|
|
|
Returns the MIME type as a string. Returns C |
715
|
|
|
|
|
|
|
for unrecognized types. If not $lazy, will try harder (via ExifTool, if |
716
|
|
|
|
|
|
|
needed). |
717
|
|
|
|
|
|
|
|
718
|
|
|
|
|
|
|
=item mime_Pretype( [$lazy] ) |
719
|
|
|
|
|
|
|
|
720
|
|
|
|
|
|
|
Returns uppercased first component of MIME type. |
721
|
|
|
|
|
|
|
|
722
|
|
|
|
|
|
|
=cut |
723
|
|
|
|
|
|
|
|
724
|
|
|
|
|
|
|
sub mime_Pretype ($;$) { |
725
|
0
|
|
|
0
|
|
0
|
my $r = shift->mime_type(shift); |
726
|
0
|
|
|
|
|
0
|
$r =~ s,/.*,,s; |
727
|
0
|
|
|
|
|
0
|
ucfirst lc $r |
728
|
|
|
|
|
|
|
} |
729
|
|
|
|
|
|
|
|
730
|
|
|
|
|
|
|
sub mime_type ($;$) { # _mime_type goes thru auto_field 'mime_type' |
731
|
0
|
|
|
0
|
|
0
|
my ($self, $lazy) = (shift, shift); |
732
|
0
|
|
|
|
|
0
|
$self->get_tags; |
733
|
0
|
|
|
|
|
0
|
my $h = $self->{header}; |
734
|
0
|
|
0
|
|
|
0
|
my $t = $h && $self->_Data_to_MIME($h, 1); |
735
|
0
|
0
|
|
|
|
0
|
return $t if $t; |
736
|
0
|
|
0
|
|
|
0
|
return((!$lazy && $self->_mime_type()) || 'application/octet-stream'); |
737
|
|
|
|
|
|
|
} |
738
|
|
|
|
|
|
|
|
739
|
|
|
|
|
|
|
=item genre() |
740
|
|
|
|
|
|
|
|
741
|
|
|
|
|
|
|
$genre = $mp3->genre(); # empty string unless found |
742
|
|
|
|
|
|
|
|
743
|
|
|
|
|
|
|
genre() returns the genre string. It can get this information from an |
744
|
|
|
|
|
|
|
ID3v2-tag or ID3v1-tag. |
745
|
|
|
|
|
|
|
|
746
|
|
|
|
|
|
|
It will as default first try to find a ID3v2-tag to get this |
747
|
|
|
|
|
|
|
information. If no genre is found there, it tries to find it in a ID3v1-tag, |
748
|
|
|
|
|
|
|
if none present, will try F<.inf>-file, |
749
|
|
|
|
|
|
|
It returns an empty string if no genre is found. |
750
|
|
|
|
|
|
|
|
751
|
|
|
|
|
|
|
You can change the order of this with the config() command. |
752
|
|
|
|
|
|
|
|
753
|
|
|
|
|
|
|
If an optional argument C<'from'> is given, returns an array reference with |
754
|
|
|
|
|
|
|
the first element being the value, the second the tag (ID3v2 or ID3v1 or |
755
|
|
|
|
|
|
|
filename) from which the value is taken. |
756
|
|
|
|
|
|
|
|
757
|
|
|
|
|
|
|
=item composer() |
758
|
|
|
|
|
|
|
|
759
|
|
|
|
|
|
|
$composer = $mp3->composer(); # empty string unless found |
760
|
|
|
|
|
|
|
|
761
|
|
|
|
|
|
|
composer() returns the composer. By default, it gets from ID3v2 tag, |
762
|
|
|
|
|
|
|
otherwise returns artist. |
763
|
|
|
|
|
|
|
|
764
|
|
|
|
|
|
|
You can change the inspected fields with the config() command. |
765
|
|
|
|
|
|
|
Subject to normalization via C or |
766
|
|
|
|
|
|
|
C configuration variables. |
767
|
|
|
|
|
|
|
|
768
|
|
|
|
|
|
|
=item performer() |
769
|
|
|
|
|
|
|
|
770
|
|
|
|
|
|
|
$performer = $mp3->performer(); # empty string unless found |
771
|
|
|
|
|
|
|
|
772
|
|
|
|
|
|
|
performer() returns the main performer. By default, it gets from ID3v2 |
773
|
|
|
|
|
|
|
tag C, otherwise from ID3v2 tag C, otherwise |
774
|
|
|
|
|
|
|
returns artist. |
775
|
|
|
|
|
|
|
|
776
|
|
|
|
|
|
|
You can change the inspected fields with the config() command. |
777
|
|
|
|
|
|
|
Subject to normalization via C or |
778
|
|
|
|
|
|
|
C configuration variables. |
779
|
|
|
|
|
|
|
|
780
|
|
|
|
|
|
|
=cut |
781
|
|
|
|
|
|
|
|
782
|
|
|
|
|
|
|
for my $elt ( qw( composer performer ) ) { |
783
|
6
|
|
|
6
|
|
24
|
no strict 'refs'; |
|
6
|
|
|
|
|
5
|
|
|
6
|
|
|
|
|
39708
|
|
784
|
|
|
|
|
|
|
*$elt = sub (;$) { |
785
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
786
|
|
|
|
|
|
|
my $translate = ($self->get_config("translate_$elt") |
787
|
|
|
|
|
|
|
|| $self->get_config("translate_person") |
788
|
0
|
|
0
|
0
|
|
0
|
|| [])->[0] || sub {$_[1]}; |
|
0
|
|
|
|
|
0
|
|
789
|
0
|
|
|
|
|
0
|
my $fields = ($self->get_config($elt))->[0]; |
790
|
0
|
|
|
|
|
0
|
return &$translate($self, $self->interpolate("%{$fields}")); |
791
|
|
|
|
|
|
|
} |
792
|
|
|
|
|
|
|
} |
793
|
|
|
|
|
|
|
|
794
|
|
|
|
|
|
|
=item config |
795
|
|
|
|
|
|
|
|
796
|
|
|
|
|
|
|
MP3::Tag->config(item => value1, value2...); # Set options globally |
797
|
|
|
|
|
|
|
$mp3->config(item => value1, value2...); # Set object options |
798
|
|
|
|
|
|
|
|
799
|
|
|
|
|
|
|
When object options are first time set or get, the global options are |
800
|
|
|
|
|
|
|
propagated into object options. (So if global options are changed later, these |
801
|
|
|
|
|
|
|
changes are not inherited.) |
802
|
|
|
|
|
|
|
|
803
|
|
|
|
|
|
|
Possible items are: |
804
|
|
|
|
|
|
|
|
805
|
|
|
|
|
|
|
=over |
806
|
|
|
|
|
|
|
|
807
|
|
|
|
|
|
|
=item autoinfo |
808
|
|
|
|
|
|
|
|
809
|
|
|
|
|
|
|
Configure the order in which ID3v1-, ID3v2-tag and filename are used |
810
|
|
|
|
|
|
|
by autoinfo. The default is C
|
811
|
|
|
|
|
|
|
CDDB_File, Inf, Cue, ImageSize, filename, LastResort>. |
812
|
|
|
|
|
|
|
Options can be elements of the default list. The order |
813
|
|
|
|
|
|
|
in which they are given to config also sets the order how they are |
814
|
|
|
|
|
|
|
used by autoinfo. If an option is not present, it will not be used |
815
|
|
|
|
|
|
|
by autoinfo (and other auto-methods if the specific overriding config |
816
|
|
|
|
|
|
|
command were not issued). |
817
|
|
|
|
|
|
|
|
818
|
|
|
|
|
|
|
$mp3->config("autoinfo","ID3v1","ID3v2","filename"); |
819
|
|
|
|
|
|
|
|
820
|
|
|
|
|
|
|
sets the order to check first ID3v1, then ID3v2 and at last the |
821
|
|
|
|
|
|
|
Filename |
822
|
|
|
|
|
|
|
|
823
|
|
|
|
|
|
|
$mp3->config("autoinfo","ID3v1","filename","ID3v2"); |
824
|
|
|
|
|
|
|
|
825
|
|
|
|
|
|
|
sets the order to check first ID3v1, then the Filename and last |
826
|
|
|
|
|
|
|
ID3v2. As the filename will be always present ID3v2 will here |
827
|
|
|
|
|
|
|
never be checked. |
828
|
|
|
|
|
|
|
|
829
|
|
|
|
|
|
|
$mp3->config("autoinfo","ID3v1","ID3v2"); |
830
|
|
|
|
|
|
|
|
831
|
|
|
|
|
|
|
sets the order to check first ID3v1, then ID3v2. The filename will |
832
|
|
|
|
|
|
|
never be used. |
833
|
|
|
|
|
|
|
|
834
|
|
|
|
|
|
|
=item title artist album year comment track genre |
835
|
|
|
|
|
|
|
|
836
|
|
|
|
|
|
|
Configure the order in which ID3v1- and ID3v2-tag are used |
837
|
|
|
|
|
|
|
by the corresponding methods (e.g., comment()). Options can be |
838
|
|
|
|
|
|
|
the same as for C. The order |
839
|
|
|
|
|
|
|
in which they are given to config also sets the order how they are |
840
|
|
|
|
|
|
|
used by comment(). If an option is not present, then C option |
841
|
|
|
|
|
|
|
will be used instead. |
842
|
|
|
|
|
|
|
|
843
|
|
|
|
|
|
|
=item extension |
844
|
|
|
|
|
|
|
|
845
|
|
|
|
|
|
|
regular expression to match the file extension (including the dot). The |
846
|
|
|
|
|
|
|
default is to match 1..4 letter extensions which are not numbers. |
847
|
|
|
|
|
|
|
|
848
|
|
|
|
|
|
|
=item composer |
849
|
|
|
|
|
|
|
|
850
|
|
|
|
|
|
|
string to put into C<%{}> to interpolate to get the composer. Default |
851
|
|
|
|
|
|
|
is C<'TCOM|a'>. |
852
|
|
|
|
|
|
|
|
853
|
|
|
|
|
|
|
=item performer |
854
|
|
|
|
|
|
|
|
855
|
|
|
|
|
|
|
string to put into C<%{}> to interpolate to get the main performer. |
856
|
|
|
|
|
|
|
Default is C<'TXXX[TPE1]|TPE1|a'>. |
857
|
|
|
|
|
|
|
|
858
|
|
|
|
|
|
|
=item parse_data |
859
|
|
|
|
|
|
|
|
860
|
|
|
|
|
|
|
the data used by L handler; each option is an array |
861
|
|
|
|
|
|
|
reference of the form C<[$flag, $string, $pattern1, ...]>. All the options |
862
|
|
|
|
|
|
|
are processed in the following way: patterns are matched against $string |
863
|
|
|
|
|
|
|
until one of them succeeds; the information obtained from later options takes |
864
|
|
|
|
|
|
|
precedence over the information obtained from earlier ones. |
865
|
|
|
|
|
|
|
|
866
|
|
|
|
|
|
|
=item parse_split |
867
|
|
|
|
|
|
|
|
868
|
|
|
|
|
|
|
The regular expression to split the data when parsing with C or C flags. |
869
|
|
|
|
|
|
|
|
870
|
|
|
|
|
|
|
=item parse_filename_ignore_case |
871
|
|
|
|
|
|
|
|
872
|
|
|
|
|
|
|
If true (default), calling parse() and parse_rex() with match-filename |
873
|
|
|
|
|
|
|
escapes (such as C<%=D>) matches case-insensitively. |
874
|
|
|
|
|
|
|
|
875
|
|
|
|
|
|
|
=item parse_filename_merge_dots |
876
|
|
|
|
|
|
|
|
877
|
|
|
|
|
|
|
If true (default), calling parse() and parse_rex() with match-filename |
878
|
|
|
|
|
|
|
escapes (such as C<%=D>) does not distinguish a dot and many consequent |
879
|
|
|
|
|
|
|
dots. |
880
|
|
|
|
|
|
|
|
881
|
|
|
|
|
|
|
=item parse_join |
882
|
|
|
|
|
|
|
|
883
|
|
|
|
|
|
|
string to put between multiple occurences of a tag in a parse pattern; |
884
|
|
|
|
|
|
|
defaults to C<'; '>. E.g., parsing C<'1988-1992, Homer (LP)'> with pattern |
885
|
|
|
|
|
|
|
C<'%c, %a (%c)'> results in comment set to C<'1988-1992; LP'> with the |
886
|
|
|
|
|
|
|
default value of C. |
887
|
|
|
|
|
|
|
|
888
|
|
|
|
|
|
|
=item v2title |
889
|
|
|
|
|
|
|
|
890
|
|
|
|
|
|
|
Configure the elements of ID3v2-tag which are used by ID3v2::title(). |
891
|
|
|
|
|
|
|
Options can be "TIT1", "TIT2", "TIT3"; the present values are combined. |
892
|
|
|
|
|
|
|
If an option is not present, it will not be used by ID3v2::title(). |
893
|
|
|
|
|
|
|
|
894
|
|
|
|
|
|
|
=item cddb_files |
895
|
|
|
|
|
|
|
|
896
|
|
|
|
|
|
|
List of files to look for in the directory of MP3 file to get CDDB info. |
897
|
|
|
|
|
|
|
|
898
|
|
|
|
|
|
|
=item year_is_timestamp |
899
|
|
|
|
|
|
|
|
900
|
|
|
|
|
|
|
If TRUE (default) parse() will match complicated timestamps against C<%y>; |
901
|
|
|
|
|
|
|
for example, C<2001-10-23--30,2002-02-28> is a range from 23rd to 30th of |
902
|
|
|
|
|
|
|
October 2001, I 28th of February of 2002. According to ISO, C<--> can |
903
|
|
|
|
|
|
|
be replaced by C as well. For convenience, the leading 0 can be omited |
904
|
|
|
|
|
|
|
from the fields which ISO requires to be 2-digit. |
905
|
|
|
|
|
|
|
|
906
|
|
|
|
|
|
|
=item comment_remove_date |
907
|
|
|
|
|
|
|
|
908
|
|
|
|
|
|
|
When extracting the date from comment fields, remove the recognized portion |
909
|
|
|
|
|
|
|
even if it is human readable (e.g., C) if TRUE. |
910
|
|
|
|
|
|
|
Current default: FALSE. |
911
|
|
|
|
|
|
|
|
912
|
|
|
|
|
|
|
=item default_language |
913
|
|
|
|
|
|
|
|
914
|
|
|
|
|
|
|
The language to use to select ID3v2 frames, and to choose C |
915
|
|
|
|
|
|
|
ID3v2 frame accessed in comment() method (default is 'XXX'; if not |
916
|
|
|
|
|
|
|
C, this should be lowercase 3-letter abbreviation according to |
917
|
|
|
|
|
|
|
ISO-639-2). |
918
|
|
|
|
|
|
|
|
919
|
|
|
|
|
|
|
=item default_descr_c |
920
|
|
|
|
|
|
|
|
921
|
|
|
|
|
|
|
The description field used to choose the C ID3v2 frame accessed |
922
|
|
|
|
|
|
|
in comment() method. Defaults to C<''>. |
923
|
|
|
|
|
|
|
|
924
|
|
|
|
|
|
|
=item id3v2_frame_empty_ok |
925
|
|
|
|
|
|
|
|
926
|
|
|
|
|
|
|
When setting the individual id3v2 frames via ParseData, do not |
927
|
|
|
|
|
|
|
remove the frames set to an empty string. Default 0 (empty means 'remove'). |
928
|
|
|
|
|
|
|
|
929
|
|
|
|
|
|
|
=item id3v2_minpadding |
930
|
|
|
|
|
|
|
|
931
|
|
|
|
|
|
|
Minimal padding to reserve after ID3v2 tag when writing (default 128), |
932
|
|
|
|
|
|
|
|
933
|
|
|
|
|
|
|
=item id3v2_sizemult |
934
|
|
|
|
|
|
|
|
935
|
|
|
|
|
|
|
Additionally to C, insert padding to make file size multiple |
936
|
|
|
|
|
|
|
of this when writing ID3v2 tag (default 512), Should be power of 2. |
937
|
|
|
|
|
|
|
|
938
|
|
|
|
|
|
|
=item id3v2_shrink |
939
|
|
|
|
|
|
|
|
940
|
|
|
|
|
|
|
If TRUE, when writing ID3v2 tag, shrink the file if needed (default FALSE). |
941
|
|
|
|
|
|
|
|
942
|
|
|
|
|
|
|
=item id3v2_mergepadding |
943
|
|
|
|
|
|
|
|
944
|
|
|
|
|
|
|
If TRUE, when writing ID3v2 tag, consider the 0-bytes following the |
945
|
|
|
|
|
|
|
ID3v2 header as writable space for the tag (default FALSE). |
946
|
|
|
|
|
|
|
|
947
|
|
|
|
|
|
|
=item update_length |
948
|
|
|
|
|
|
|
|
949
|
|
|
|
|
|
|
If TRUE, when writing ID3v2 tag, create a C tag if the duration |
950
|
|
|
|
|
|
|
is known (as it is after calling methods like C, or |
951
|
|
|
|
|
|
|
interpolation the duration value). If this field is 2 or more, force |
952
|
|
|
|
|
|
|
creation of ID3v2 tag by update_tags() if the duration is known. |
953
|
|
|
|
|
|
|
|
954
|
|
|
|
|
|
|
=item translate_* |
955
|
|
|
|
|
|
|
|
956
|
|
|
|
|
|
|
FALSE, or a subroutine used to munch a field C<*> (out of C
</tr>
<tr>
<td class="h" >
<a name="957">957</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> track artist album comment year genre comment_collection comment_track </td>
</tr>
<tr>
<td class="h" >
<a name="958">958</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> title_track artist_collection person>) to some "normalized" form. </td>
</tr>
<tr>
<td class="h" >
<a name="959">959</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Takes two arguments: the MP3::Tag object, and the current value of the </td>
</tr>
<tr>
<td class="h" >
<a name="960">960</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> field. </td>
</tr>
<tr>
<td class="h" >
<a name="961">961</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="962">962</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The second argument may also have the form C<[value, handler]>, where </td>
</tr>
<tr>
<td class="h" >
<a name="963">963</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<handler> is the string indentifying the handler which returned the </td>
</tr>
<tr>
<td class="h" >
<a name="964">964</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> value. </td>
</tr>
<tr>
<td class="h" >
<a name="965">965</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="966">966</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item short_person </td>
</tr>
<tr>
<td class="h" >
<a name="967">967</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="968">968</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Similar to C<translate_person>, but the intent is for this subroutine </td>
</tr>
<tr>
<td class="h" >
<a name="969">969</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> to translate a personal name field to a shortest "normalized" form. </td>
</tr>
<tr>
<td class="h" >
<a name="970">970</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="971">971</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item person_frames </td>
</tr>
<tr>
<td class="h" >
<a name="972">972</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="973">973</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> list of ID3v2 frames subject to normalization via C<translate_person> </td>
</tr>
<tr>
<td class="h" >
<a name="974">974</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> handler; current default is C<TEXT TCOM TXXX[TPE1] TPE1 TPE3 TOPE TOLY </td>
</tr>
<tr>
<td class="h" >
<a name="975">975</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> TMCL TIPL TENC TXXX[person-file-by]>. </td>
</tr>
<tr>
<td class="h" >
<a name="976">976</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Used by select_id3v2_frame_by_descr(), frame_translate(), </td>
</tr>
<tr>
<td class="h" >
<a name="977">977</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frames_translate(). </td>
</tr>
<tr>
<td class="h" >
<a name="978">978</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="979">979</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item id3v2_missing_fatal </td>
</tr>
<tr>
<td class="h" >
<a name="980">980</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="981">981</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If TRUE, interpolating ID3v2 frames (e.g., by C<%{TCOM}>) when </td>
</tr>
<tr>
<td class="h" >
<a name="982">982</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the ID3v2 tags is missing is a fatal error. If false (default), in such cases </td>
</tr>
<tr>
<td class="h" >
<a name="983">983</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> interpolation results in an empty string. </td>
</tr>
<tr>
<td class="h" >
<a name="984">984</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="985">985</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item id3v2_recalculate </td>
</tr>
<tr>
<td class="h" >
<a name="986">986</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="987">987</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If TRUE, interpolating the whole ID3v2 tag (by C<%{ID3v2}>) will recalculate </td>
</tr>
<tr>
<td class="h" >
<a name="988">988</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the tag even if its contents is not modified. </td>
</tr>
<tr>
<td class="h" >
<a name="989">989</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="990">990</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item parse_minmatch </td>
</tr>
<tr>
<td class="h" >
<a name="991">991</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="992">992</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> may be 0, 1, or a list of C<%>-escapes (matching any string) which should </td>
</tr>
<tr>
<td class="h" >
<a name="993">993</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> matched non-greedily by parse() and friends. E.g., parsing </td>
</tr>
<tr>
<td class="h" >
<a name="994">994</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<'Adagio - Andante - Piano Sonata'> via C<'%t - %l'> gives different results </td>
</tr>
<tr>
<td class="h" >
<a name="995">995</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for the settings 0 and 1; note that greediness of C<%l> does not matter, </td>
</tr>
<tr>
<td class="h" >
<a name="996">996</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> thus the value of 1 is equivalent for the value of C<t> for this particular </td>
</tr>
<tr>
<td class="h" >
<a name="997">997</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> pattern. </td>
</tr>
<tr>
<td class="h" >
<a name="998">998</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="999">999</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item id3v23_unsync_size_w </td>
</tr>
<tr>
<td class="h" >
<a name="1000">1000</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1001">1001</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Old experimental flag to test why ITunes refuses to handle unsyncronized tags </td>
</tr>
<tr>
<td class="h" >
<a name="1002">1002</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (does not help, see L<id3v23_unsync>). The idea was that </td>
</tr>
<tr>
<td class="h" >
<a name="1003">1003</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> version 2.3 of the standard is not clear about frame size field, whether it </td>
</tr>
<tr>
<td class="h" >
<a name="1004">1004</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> is the size of the frame after unsyncronization, or not. We assume </td>
</tr>
<tr>
<td class="h" >
<a name="1005">1005</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> that this size is one before unsyncronization (as in v2.2). </td>
</tr>
<tr>
<td class="h" >
<a name="1006">1006</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Setting this value to 1 will assume another interpretation (as in v2.4) for </td>
</tr>
<tr>
<td class="h" >
<a name="1007">1007</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> write. </td>
</tr>
<tr>
<td class="h" >
<a name="1008">1008</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1009">1009</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item id3v23_unsync </td>
</tr>
<tr>
<td class="h" >
<a name="1010">1010</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1011">1011</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Some broken MP3 players (e.g., ITunes, at least up to v6) refuse to </td>
</tr>
<tr>
<td class="h" >
<a name="1012">1012</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> handle unsyncronized (i.e., written as the standard requires it) tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1013">1013</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> they may need this to be set to FALSE. Default: TRUE. </td>
</tr>
<tr>
<td class="h" >
<a name="1014">1014</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1015">1015</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (Some details: by definition, MP3 files should contain combinations of bytes </td>
</tr>
<tr>
<td class="h" >
<a name="1016">1016</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<FF F*> or C<FF E*> only at the start of audio frames ("syncronization" points). </td>
</tr>
<tr>
<td class="h" >
<a name="1017">1017</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ID3v2 standards take this into account, and supports storing raw tag data </td>
</tr>
<tr>
<td class="h" >
<a name="1018">1018</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> in a format which does not contain these combinations of bytes </td>
</tr>
<tr>
<td class="h" >
<a name="1019">1019</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> [via "unsyncronization"]. Itunes etc do not only emit broken MP3 files </td>
</tr>
<tr>
<td class="h" >
<a name="1020">1020</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> [which cause severe hiccups in players which do not know how to skip ID3v2 </td>
</tr>
<tr>
<td class="h" >
<a name="1021">1021</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> tags, as most settop DVD players], they also refuse to read ID3v2 tags </td>
</tr>
<tr>
<td class="h" >
<a name="1022">1022</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> written in a correct, unsyncronized, format.) </td>
</tr>
<tr>
<td class="h" >
<a name="1023">1023</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1024">1024</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (Note also that the issue of syncronization is also applicable to ID3v1 </td>
</tr>
<tr>
<td class="h" >
<a name="1025">1025</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> tags; however, since this data is near the end of the file, many players </td>
</tr>
<tr>
<td class="h" >
<a name="1026">1026</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> are able to recognize that the syncronization points in ID3v1 tag cannot </td>
</tr>
<tr>
<td class="h" >
<a name="1027">1027</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> start a valid frame, since there is not enough data to read; some other </td>
</tr>
<tr>
<td class="h" >
<a name="1028">1028</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> players would hiccup anyway if ID3v1 contains these combinations of bytes...) </td>
</tr>
<tr>
<td class="h" >
<a name="1029">1029</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1030">1030</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item encoded_v1_fits </td>
</tr>
<tr>
<td class="h" >
<a name="1031">1031</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1032">1032</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If FALSE (default), data containing "high bit characters" is considered to </td>
</tr>
<tr>
<td class="h" >
<a name="1033">1033</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> not fit ID3v1 tag if one of the following conditions hold: </td>
</tr>
<tr>
<td class="h" >
<a name="1034">1034</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1035">1035</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 4 </td>
</tr>
<tr>
<td class="h" >
<a name="1036">1036</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1037">1037</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item 1. </td>
</tr>
<tr>
<td class="h" >
<a name="1038">1038</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1039">1039</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<encode_encoding_v1> is set (so the resulting ID3v1 tag is not </td>
</tr>
<tr>
<td class="h" >
<a name="1040">1040</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> standard-complying, thus ambiguous without ID3v2), or </td>
</tr>
<tr>
<td class="h" >
<a name="1041">1041</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1042">1042</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item 2. </td>
</tr>
<tr>
<td class="h" >
<a name="1043">1043</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1044">1044</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<encode_encoding_v1> is not set, but C<decode_encoding_v1> is set </td>
</tr>
<tr>
<td class="h" >
<a name="1045">1045</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (thus read+write operation is not idempotent for ID3v1 tag). </td>
</tr>
<tr>
<td class="h" >
<a name="1046">1046</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1047">1047</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="1048">1048</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1049">1049</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> With the default setting, these problems are resolved as far as (re)encoding </td>
</tr>
<tr>
<td class="h" >
<a name="1050">1050</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> of ID3v2 tag is non-ambiguous (which holds with the default settings for </td>
</tr>
<tr>
<td class="h" >
<a name="1051">1051</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ID3v2 encodeing). </td>
</tr>
<tr>
<td class="h" >
<a name="1052">1052</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1053">1053</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item decode_encoding_v1 </td>
</tr>
<tr>
<td class="h" >
<a name="1054">1054</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1055">1055</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item encode_encoding_v1 </td>
</tr>
<tr>
<td class="h" >
<a name="1056">1056</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1057">1057</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item decode_encoding_v2 </td>
</tr>
<tr>
<td class="h" >
<a name="1058">1058</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1059">1059</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item decode_encoding_filename </td>
</tr>
<tr>
<td class="h" >
<a name="1060">1060</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1061">1061</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item decode_encoding_inf </td>
</tr>
<tr>
<td class="h" >
<a name="1062">1062</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1063">1063</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item decode_encoding_cddb_file </td>
</tr>
<tr>
<td class="h" >
<a name="1064">1064</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1065">1065</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item decode_encoding_cue </td>
</tr>
<tr>
<td class="h" >
<a name="1066">1066</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1067">1067</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item decode_encoding_files </td>
</tr>
<tr>
<td class="h" >
<a name="1068">1068</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1069">1069</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item encode_encoding_files </td>
</tr>
<tr>
<td class="h" >
<a name="1070">1070</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1071">1071</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Encodings of C<ID3v1>, non-Unicode frames of C<ID3v2>, filenames, </td>
</tr>
<tr>
<td class="h" >
<a name="1072">1072</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> external files, F<.inf> files, C<CDDB> files, F<.cue> files, </td>
</tr>
<tr>
<td class="h" >
<a name="1073">1073</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and user-specified files correspondingly. The value of 0 means "latin1". </td>
</tr>
<tr>
<td class="h" >
<a name="1074">1074</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1075">1075</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The default values for C<decode_encoding_*> are set from the </td>
</tr>
<tr>
<td class="h" >
<a name="1076">1076</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> corresponding C<MP3TAG_DECODE_*_DEFAULT> environment variable (here </td>
</tr>
<tr>
<td class="h" >
<a name="1077">1077</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<*> stands for the uppercased last component of the name); if this </td>
</tr>
<tr>
<td class="h" >
<a name="1078">1078</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> variable is not set, from C<MP3TAG_DECODE_DEFAULT>. Likewise, the </td>
</tr>
<tr>
<td class="h" >
<a name="1079">1079</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> default value for C<encode_encoding_v1> is set from </td>
</tr>
<tr>
<td class="h" >
<a name="1080">1080</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<MP3TAG_ENCODE_V1_DEFAULT> or C<MP3TAG_ENCODE_DEFAULT>; if not </td>
</tr>
<tr>
<td class="h" >
<a name="1081">1081</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> present, from the value for C<decode_encoding_v1>; similarly for </td>
</tr>
<tr>
<td class="h" >
<a name="1082">1082</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<encode_encoding_files>. </td>
</tr>
<tr>
<td class="h" >
<a name="1083">1083</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1084">1084</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Note that C<decode_encoding_v2> has no "encode" pair; it may also be disabled </td>
</tr>
<tr>
<td class="h" >
<a name="1085">1085</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> per tag via effects of C<ignore_trusted_encoding0_v2> and the corresponding </td>
</tr>
<tr>
<td class="h" >
<a name="1086">1086</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frame C<TXXX[trusted_encoding0_v2]> in the tag. One should also keep in </td>
</tr>
<tr>
<td class="h" >
<a name="1087">1087</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mind that the ID3v1 standard requires the encoding to be "latin1" (so </td>
</tr>
<tr>
<td class="h" >
<a name="1088">1088</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> does not store the encoding anywhere); this does not make a lot of sense, </td>
</tr>
<tr>
<td class="h" >
<a name="1089">1089</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and a lot of effort of this module is spend to fix this unfortunate flaw. </td>
</tr>
<tr>
<td class="h" >
<a name="1090">1090</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> See L<"Problems with ID3 format">. </td>
</tr>
<tr>
<td class="h" >
<a name="1091">1091</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1092">1092</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item ignore_trusted_encoding0_v2 </td>
</tr>
<tr>
<td class="h" >
<a name="1093">1093</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1094">1094</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If FALSE (default), and the frame C<TXXX[trusted_encoding0_v2]> is set to TRUE, </td>
</tr>
<tr>
<td class="h" >
<a name="1095">1095</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the setting of C<decode_encoding_v2> is ignored. </td>
</tr>
<tr>
<td class="h" >
<a name="1096">1096</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1097">1097</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item id3v2_set_trusted_encoding0 </td>
</tr>
<tr>
<td class="h" >
<a name="1098">1098</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1099">1099</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If TRUE (default), and frames are converted from the given C<decode_encoding_v2> </td>
</tr>
<tr>
<td class="h" >
<a name="1100">1100</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> to a standard-conforming encoding, a frame C<TXXX[trusted_encoding0_v2]> with </td>
</tr>
<tr>
<td class="h" >
<a name="1101">1101</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> a TRUE value is added. </td>
</tr>
<tr>
<td class="h" >
<a name="1102">1102</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1103">1103</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> [The purpose is to make multi-step update in presence of C<decode_encoding_v2> </td>
</tr>
<tr>
<td class="h" >
<a name="1104">1104</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> possible; with C<id3v2_set_trusted_encoding0> TRUE, and </td>
</tr>
<tr>
<td class="h" >
<a name="1105">1105</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<ignore_trusted_encoding0_v2> FALSE (both are default values), editing of tags </td>
</tr>
<tr>
<td class="h" >
<a name="1106">1106</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> can be idempotent.] </td>
</tr>
<tr>
<td class="h" >
<a name="1107">1107</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1108">1108</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item id3v2_fix_encoding_on_write </td>
</tr>
<tr>
<td class="h" >
<a name="1109">1109</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1110">1110</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If TRUE and C<decode_encoding_v2> is defined, the ID3v2 frames are converted </td>
</tr>
<tr>
<td class="h" >
<a name="1111">1111</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> to standard-conforming encodings on write. The default is FALSE. </td>
</tr>
<tr>
<td class="h" >
<a name="1112">1112</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1113">1113</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item id3v2_fix_encoding_on_edit </td>
</tr>
<tr>
<td class="h" >
<a name="1114">1114</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1115">1115</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If TRUE (default) and C<decode_encoding_v2> is defined (and not disabled </td>
</tr>
<tr>
<td class="h" >
<a name="1116">1116</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> via a frame C<TXXX[trusted_encoding0_v2]> and the setting </td>
</tr>
<tr>
<td class="h" >
<a name="1117">1117</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<ignore_trusted_encoding0_v2>), a CYA action is performed when an </td>
</tr>
<tr>
<td class="h" >
<a name="1118">1118</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> edit may result in a confusion. More precise, adding an ID3v2 frame which </td>
</tr>
<tr>
<td class="h" >
<a name="1119">1119</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> is I<essentially> affected by C<decode_encoding_v2> would convert other </td>
</tr>
<tr>
<td class="h" >
<a name="1120">1120</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frames to a standard-conforming encoding (and would set </td>
</tr>
<tr>
<td class="h" >
<a name="1121">1121</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<TXXX[trusted_encoding0_v2]> if required by C<id3v2_set_trusted_encoding0>). </td>
</tr>
<tr>
<td class="h" >
<a name="1122">1122</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1123">1123</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Recall that the added frames are always encoded in standard-conformant way; </td>
</tr>
<tr>
<td class="h" >
<a name="1124">1124</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the action above avoids mixing non-standard-conformant frames with </td>
</tr>
<tr>
<td class="h" >
<a name="1125">1125</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> standard-conformant frames. Such a mix could not be cleared up by setting </td>
</tr>
<tr>
<td class="h" >
<a name="1126">1126</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<decode_encoding_v2>! One should also keep in mind that this does not affect </td>
</tr>
<tr>
<td class="h" >
<a name="1127">1127</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frames which contain characters above C<0x255>; such frames are always written </td>
</tr>
<tr>
<td class="h" >
<a name="1128">1128</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> in Unicode, thus are not affected by C<decode_encoding_v2>. </td>
</tr>
<tr>
<td class="h" >
<a name="1129">1129</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1130">1130</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item id3v2_frames_autofill </td>
</tr>
<tr>
<td class="h" >
<a name="1131">1131</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1132">1132</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Hash of suggested ID3v2 frames to autogenerate basing on extra information </td>
</tr>
<tr>
<td class="h" >
<a name="1133">1133</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> available; keys are frame descriptors (such as C<TXXX[cddb_id]>), values </td>
</tr>
<tr>
<td class="h" >
<a name="1134">1134</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> indicate whether ID3v2 tag should be created if it was not present. </td>
</tr>
<tr>
<td class="h" >
<a name="1135">1135</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1136">1136</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> This variable is inspected by the method C<id3v2_frames_autofill>, </td>
</tr>
<tr>
<td class="h" >
<a name="1137">1137</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> which is not called automatically when the tag is accessed, but may be called </td>
</tr>
<tr>
<td class="h" >
<a name="1138">1138</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> by scripts using the module. </td>
</tr>
<tr>
<td class="h" >
<a name="1139">1139</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1140">1140</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The default is to force creation of tag for C<TXXX[MCDI-fulltoc]> frame, and do not </td>
</tr>
<tr>
<td class="h" >
<a name="1141">1141</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> force creation for C<TXXX[cddb_id]> and C<TXXX[cdindex_id]>. </td>
</tr>
<tr>
<td class="h" >
<a name="1142">1142</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1143">1143</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item local_cfg_file </td>
</tr>
<tr>
<td class="h" >
<a name="1144">1144</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1145">1145</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Name of configuration file read at startup by the method parse_cfg(); is </td>
</tr>
<tr>
<td class="h" >
<a name="1146">1146</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<~>-substituted; defaults to F<~/.mp3tagprc>. </td>
</tr>
<tr>
<td class="h" >
<a name="1147">1147</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1148">1148</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item prohibit_v24 </td>
</tr>
<tr>
<td class="h" >
<a name="1149">1149</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1150">1150</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If FALSE (default), reading of ID3v2.4 is allowed (it is not fully supported, </td>
</tr>
<tr>
<td class="h" >
<a name="1151">1151</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> but most things work acceptably). </td>
</tr>
<tr>
<td class="h" >
<a name="1152">1152</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1153">1153</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item write_v24 </td>
</tr>
<tr>
<td class="h" >
<a name="1154">1154</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1155">1155</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If FALSE (default), writing of ID3v2.4 is prohibited (it is not fully </td>
</tr>
<tr>
<td class="h" >
<a name="1156">1156</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> supported; allow on your own risk). </td>
</tr>
<tr>
<td class="h" >
<a name="1157">1157</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1158">1158</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item name_for_field_normalization </td>
</tr>
<tr>
<td class="h" >
<a name="1159">1159</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1160">1160</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> interpolation of this string is used as a person name to normalize </td>
</tr>
<tr>
<td class="h" >
<a name="1161">1161</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> title-like fields. Defaults to C<%{composer}>. </td>
</tr>
<tr>
<td class="h" >
<a name="1162">1162</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1163">1163</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item extra_config_keys </td>
</tr>
<tr>
<td class="h" >
<a name="1164">1164</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1165">1165</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> List of extra config keys (default is empty); setting these would not cause </td>
</tr>
<tr>
<td class="h" >
<a name="1166">1166</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> warnings, and would not affect operation of C<MP3::Tag>. Applications using </td>
</tr>
<tr>
<td class="h" >
<a name="1167">1167</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> this module may add to this list to allow their configuration by the same </td>
</tr>
<tr>
<td class="h" >
<a name="1168">1168</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> means as configuration of C<MP3::Tag>. </td>
</tr>
<tr>
<td class="h" >
<a name="1169">1169</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1170">1170</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item is_writable </td>
</tr>
<tr>
<td class="h" >
<a name="1171">1171</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1172">1172</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Contains a boolean value, or a method name and argument list </td>
</tr>
<tr>
<td class="h" >
<a name="1173">1173</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> to call whether the tag may be added to the file. Defaults to </td>
</tr>
<tr>
<td class="h" >
<a name="1174">1174</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> writable_by_extension(). </td>
</tr>
<tr>
<td class="h" >
<a name="1175">1175</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1176">1176</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item writable_extensions </td>
</tr>
<tr>
<td class="h" >
<a name="1177">1177</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1178">1178</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Contains a list of extensions (case insensitive) for which the tag may be </td>
</tr>
<tr>
<td class="h" >
<a name="1179">1179</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> added to the file. Current default is C<mp3 mp2 id3 tag ogg mpg mpeg </td>
</tr>
<tr>
<td class="h" >
<a name="1180">1180</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mp4 aiff flac ape ram mpc> (extracted from L<ExifTool> docs; may be tuned </td>
</tr>
<tr>
<td class="h" >
<a name="1181">1181</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> later). </td>
</tr>
<tr>
<td class="h" >
<a name="1182">1182</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1183">1183</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1184">1184</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1185">1185</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Later there will be probably more things to configure. </td>
</tr>
<tr>
<td class="h" >
<a name="1186">1186</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1187">1187</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="1188">1188</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1189">1189</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1190">1190</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1191">1191</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $conf_rex; </td>
</tr>
<tr>
<td class="h" >
<a name="1192">1192</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1193">1193</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub config { </td>
</tr>
<tr>
<td class="h" >
<a name="1194">1194</a>
</td>
<td class="c3" >
24
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1194-1">
24
</a>
</td>
<td >
</td>
<td >
80
</td>
<td class="s"> my ($self, $item, @options) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="1195">1195</a>
</td>
<td class="c3" >
24
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
36
</td>
<td class="s"> $item = lc $item; </td>
</tr>
<tr>
<td class="h" >
<a name="1196">1196</a>
</td>
<td class="c3" >
24
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1196-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1196-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
305
</td>
<td class="s"> my $config = ref $self ? ($self->{config} ||= {%config}) : \%config; </td>
</tr>
<tr>
<td class="h" >
<a name="1197">1197</a>
</td>
<td class="c3" >
24
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
180
</td>
<td class="s"> my @known = qw(autoinfo title artist album year comment track genre </td>
</tr>
<tr>
<td class="h" >
<a name="1198">1198</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> v2title cddb_files force_interpolate parse_data parse_split </td>
</tr>
<tr>
<td class="h" >
<a name="1199">1199</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> composer performer default_language default_descr_c </td>
</tr>
<tr>
<td class="h" >
<a name="1200">1200</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> update_length id3v2_fix_encoding_on_write </td>
</tr>
<tr>
<td class="h" >
<a name="1201">1201</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> id3v2_fix_encoding_on_edit extra_config_keys </td>
</tr>
<tr>
<td class="h" >
<a name="1202">1202</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> parse_join parse_filename_ignore_case encoded_v1_fits </td>
</tr>
<tr>
<td class="h" >
<a name="1203">1203</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> parse_filename_merge_dots year_is_timestamp </td>
</tr>
<tr>
<td class="h" >
<a name="1204">1204</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> comment_remove_date extension id3v2_missing_fatal </td>
</tr>
<tr>
<td class="h" >
<a name="1205">1205</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> id3v2_frame_empty_ok id3v2_minpadding id3v2_sizemult </td>
</tr>
<tr>
<td class="h" >
<a name="1206">1206</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> id3v2_shrink id3v2_mergepadding person_frames short_person </td>
</tr>
<tr>
<td class="h" >
<a name="1207">1207</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> parse_minmatch id3v23_unsync id3v23_unsync_size_w </td>
</tr>
<tr>
<td class="h" >
<a name="1208">1208</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> id3v2_recalculate ignore_trusted_encoding0_v2 </td>
</tr>
<tr>
<td class="h" >
<a name="1209">1209</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> id3v2_set_trusted_encoding0 write_v24 prohibit_v24 </td>
</tr>
<tr>
<td class="h" >
<a name="1210">1210</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> encode_encoding_files encode_encoding_v1 encode_encoding_cue </td>
</tr>
<tr>
<td class="h" >
<a name="1211">1211</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> decode_encoding_v1 decode_encoding_v2 </td>
</tr>
<tr>
<td class="h" >
<a name="1212">1212</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> decode_encoding_filename decode_encoding_files </td>
</tr>
<tr>
<td class="h" >
<a name="1213">1213</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> decode_encoding_inf decode_encoding_cddb_file </td>
</tr>
<tr>
<td class="h" >
<a name="1214">1214</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> name_for_field_normalization is_writable writable_extensions </td>
</tr>
<tr>
<td class="h" >
<a name="1215">1215</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> id3v2_frames_autofill local_cfg_file ampersand_joiner); </td>
</tr>
<tr>
<td class="h" >
<a name="1216">1216</a>
</td>
<td class="c3" >
24
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
217
</td>
<td class="s"> my @tr = map "translate_$_", qw( title track artist album comment </td>
</tr>
<tr>
<td class="h" >
<a name="1217">1217</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> year genre comment_collection </td>
</tr>
<tr>
<td class="h" >
<a name="1218">1218</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> comment_track title_track </td>
</tr>
<tr>
<td class="h" >
<a name="1219">1219</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> composer performer </td>
</tr>
<tr>
<td class="h" >
<a name="1220">1220</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> artist_collection person ); </td>
</tr>
<tr>
<td class="h" >
<a name="1221">1221</a>
</td>
<td class="c3" >
24
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
54
</td>
<td class="s"> my $e_known = $self->get_config('extra_config_keys'); </td>
</tr>
<tr>
<td class="h" >
<a name="1222">1222</a>
</td>
<td class="c3" >
24
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
37
</td>
<td class="s"> $e_known = [map lc, @$e_known]; </td>
</tr>
<tr>
<td class="h" >
<a name="1223">1223</a>
</td>
<td class="c3" >
24
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1223-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
72
</td>
<td class="s"> $conf_rex = '^(' . join('|', @known, @$e_known, @tr) . ')$' unless $conf_rex; </td>
</tr>
<tr>
<td class="h" >
<a name="1224">1224</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1225">1225</a>
</td>
<td class="c3" >
24
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1225-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
1402
</td>
<td class="s"> if ($item =~ /^(force)$/) { </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1226">1226</a>
</td>
<td class="c0" >
<a href="#1228">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return $config->{$item} = {@options}; </td>
</tr>
<tr>
<td class="h" >
<a name="1227">1227</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($item !~ $conf_rex) { </td>
</tr>
<tr>
<td class="h" >
<a name="1228">1228</a>
</td>
<td class="c0" >
<a href="#1229">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> warn "MP3::Tag::config(): Unknown option '$item' found; known options: @known @$e_known @tr\n REX = <<<$conf_rex>>>\n"; </td>
</tr>
<tr>
<td class="h" >
<a name="1229">1229</a>
</td>
<td class="c0" >
<a href="#1277">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return; </td>
</tr>
<tr>
<td class="h" >
<a name="1230">1230</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1231">1231</a>
</td>
<td class="c3" >
24
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1231-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
78
</td>
<td class="s"> undef $conf_rex if $item eq 'extra_config_keys'; </td>
</tr>
<tr>
<td class="h" >
<a name="1232">1232</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1233">1233</a>
</td>
<td class="c3" >
24
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
133
</td>
<td class="s"> $config->{$item} = \@options; </td>
</tr>
<tr>
<td class="h" >
<a name="1234">1234</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1235">1235</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1236">1236</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item get_config </td>
</tr>
<tr>
<td class="h" >
<a name="1237">1237</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1238">1238</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $opt_array = $mp3->get_config("item"); </td>
</tr>
<tr>
<td class="h" >
<a name="1239">1239</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1240">1240</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> When object options are first time set or get, the global options are </td>
</tr>
<tr>
<td class="h" >
<a name="1241">1241</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> propagated into object options. (So if global options are changed later, these </td>
</tr>
<tr>
<td class="h" >
<a name="1242">1242</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> changes are not inherited.) </td>
</tr>
<tr>
<td class="h" >
<a name="1243">1243</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1244">1244</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item get_config1 </td>
</tr>
<tr>
<td class="h" >
<a name="1245">1245</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1246">1246</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $opt = $mp3->get_config1("item"); </td>
</tr>
<tr>
<td class="h" >
<a name="1247">1247</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1248">1248</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Similar to get_config(), but returns UNDEF if no config array is present, or </td>
</tr>
<tr>
<td class="h" >
<a name="1249">1249</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the first entry of array otherwise. </td>
</tr>
<tr>
<td class="h" >
<a name="1250">1250</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1251">1251</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1252">1252</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1253">1253</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub get_config ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1254">1254</a>
</td>
<td class="c3" >
2622
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1254-1">
2622
</a>
</td>
<td >
</td>
<td >
2320
</td>
<td class="s"> my ($self, $item) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="1255">1255</a>
</td>
<td class="c3" >
2622
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1255-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1255-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
6480
</td>
<td class="s"> my $config = ref $self ? ($self->{config} ||= {%config}) : \%config; </td>
</tr>
<tr>
<td class="h" >
<a name="1256">1256</a>
</td>
<td class="c3" >
2622
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
8260
</td>
<td class="s"> $config->{lc $item}; </td>
</tr>
<tr>
<td class="h" >
<a name="1257">1257</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1258">1258</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1259">1259</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub get_config1 { </td>
</tr>
<tr>
<td class="h" >
<a name="1260">1260</a>
</td>
<td class="c3" >
683
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1260-1">
683
</a>
</td>
<td >
</td>
<td >
525
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="1261">1261</a>
</td>
<td class="c3" >
683
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
790
</td>
<td class="s"> my $c = $self->get_config(@_); </td>
</tr>
<tr>
<td class="h" >
<a name="1262">1262</a>
</td>
<td class="c3" >
683
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1262-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3072
</td>
<td class="s"> $c and $c->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="1263">1263</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1264">1264</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1265">1265</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item name_for_field_normalization </td>
</tr>
<tr>
<td class="h" >
<a name="1266">1266</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1267">1267</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $name = $mp3->name_for_field_normalization; </td>
</tr>
<tr>
<td class="h" >
<a name="1268">1268</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1269">1269</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns "person name" to use for normalization of title-like fields; </td>
</tr>
<tr>
<td class="h" >
<a name="1270">1270</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> it is the result of interpolation of the configuration variable </td>
</tr>
<tr>
<td class="h" >
<a name="1271">1271</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<name_for_field_normalization> (defaults to C<%{composer}> - which, by </td>
</tr>
<tr>
<td class="h" >
<a name="1272">1272</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> default, expands the same as C<%{TCOM|a}>). </td>
</tr>
<tr>
<td class="h" >
<a name="1273">1273</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1274">1274</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1275">1275</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1276">1276</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub name_for_field_normalization ($) { </td>
</tr>
<tr>
<td class="h" >
<a name="1277">1277</a>
</td>
<td class="c0" >
<a href="#1278">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1277-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="1278">1278</a>
</td>
<td class="c0" >
<a href="#1292">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->interpolate( $self->get_config1("name_for_field_normalization") ); </td>
</tr>
<tr>
<td class="h" >
<a name="1279">1279</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1280">1280</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1281">1281</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item pure_filetags </td>
</tr>
<tr>
<td class="h" >
<a name="1282">1282</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1283">1283</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $data = $mp3->pure_filetags()->autoinfo; </td>
</tr>
<tr>
<td class="h" >
<a name="1284">1284</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1285">1285</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Configures $mp3 to not read anything except the pure ID3v2 or ID3v1 tags, and </td>
</tr>
<tr>
<td class="h" >
<a name="1286">1286</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> do not postprocess them. Returns the object reference itself to simplify </td>
</tr>
<tr>
<td class="h" >
<a name="1287">1287</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> chaining of method calls. </td>
</tr>
<tr>
<td class="h" >
<a name="1288">1288</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1289">1289</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1290">1290</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1291">1291</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub pure_filetags ($) { </td>
</tr>
<tr>
<td class="h" >
<a name="1292">1292</a>
</td>
<td class="c0" >
<a href="#1293">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1292-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="1293">1293</a>
</td>
<td class="c0" >
<a href="#1294">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> for my $c (qw(autoinfo title artist album year comment track genre)) { </td>
</tr>
<tr>
<td class="h" >
<a name="1294">1294</a>
</td>
<td class="c0" >
<a href="#1296">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->config($c,"ID3v2","ID3v1"); </td>
</tr>
<tr>
<td class="h" >
<a name="1295">1295</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1296">1296</a>
</td>
<td class="c0" >
<a href="#1297">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->config('comment_remove_date', 0); </td>
</tr>
<tr>
<td class="h" >
<a name="1297">1297</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> for my $k (%{$self->{config}}) { </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#1298">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1298">1298</a>
</td>
<td class="c0" >
<a href="#1300">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1298-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> delete $self->{config}->{$k} if $k =~ /^translate_/; </td>
</tr>
<tr>
<td class="h" >
<a name="1299">1299</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1300">1300</a>
</td>
<td class="c0" >
<a href="#1318">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return $self; </td>
</tr>
<tr>
<td class="h" >
<a name="1301">1301</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1302">1302</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1303">1303</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item get_user </td>
</tr>
<tr>
<td class="h" >
<a name="1304">1304</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1305">1305</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $data = $mp3->get_user($n); # n-th piece of user scratch space </td>
</tr>
<tr>
<td class="h" >
<a name="1306">1306</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1307">1307</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Queries an entry in a scratch array ($n=3 corresponds to C<%{U3}>). </td>
</tr>
<tr>
<td class="h" >
<a name="1308">1308</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1309">1309</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item set_user </td>
</tr>
<tr>
<td class="h" >
<a name="1310">1310</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1311">1311</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->set_user($n, $data); # n-th piece of user scratch space </td>
</tr>
<tr>
<td class="h" >
<a name="1312">1312</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1313">1313</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Sets an entry in a scratch array ($n=3 corresponds to C<%{U3}>). </td>
</tr>
<tr>
<td class="h" >
<a name="1314">1314</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1315">1315</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1316">1316</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1317">1317</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub get_user ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1318">1318</a>
</td>
<td class="c0" >
<a href="#1319">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1318-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self, $item) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="1319">1319</a>
</td>
<td class="c0" >
<a href="#1320">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1319-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> unless ($self->{userdata}) { </td>
</tr>
<tr>
<td class="h" >
<a name="1320">1320</a>
</td>
<td class="c0" >
<a href="#1321">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1320-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1320-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> local $self->{__proxy}[0] = $self unless $self->{__proxy}[0] or $ENV{MP3TAG_TEST_WEAKEN}; </td>
</tr>
<tr>
<td class="h" >
<a name="1321">1321</a>
</td>
<td class="c0" >
<a href="#1322">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{ParseData}->parse('track'); # Populate the hash if possible </td>
</tr>
<tr>
<td class="h" >
<a name="1322">1322</a>
</td>
<td class="c0" >
<a href="#1324">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1322-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{userdata} ||= []; </td>
</tr>
<tr>
<td class="h" >
<a name="1323">1323</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1324">1324</a>
</td>
<td class="c0" >
<a href="#1325">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1324-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return unless defined (my $d = $self->{userdata}[$item]); </td>
</tr>
<tr>
<td class="h" >
<a name="1325">1325</a>
</td>
<td class="c0" >
<a href="#1329">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $d; </td>
</tr>
<tr>
<td class="h" >
<a name="1326">1326</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1327">1327</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1328">1328</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub set_user ($$$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1329">1329</a>
</td>
<td class="c0" >
<a href="#1330">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1329-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self, $item, $val) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="1330">1330</a>
</td>
<td class="c0" >
<a href="#1331">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1330-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{userdata} ||= []; </td>
</tr>
<tr>
<td class="h" >
<a name="1331">1331</a>
</td>
<td class="c0" >
<a href="#1368">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{userdata}[$item] = $val; </td>
</tr>
<tr>
<td class="h" >
<a name="1332">1332</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1333">1333</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1334">1334</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item set_id3v2_frame </td>
</tr>
<tr>
<td class="h" >
<a name="1335">1335</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1336">1336</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->set_id3v2_frame($name, @values); </td>
</tr>
<tr>
<td class="h" >
<a name="1337">1337</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1338">1338</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> When called with only $name as the argument, removes the specified </td>
</tr>
<tr>
<td class="h" >
<a name="1339">1339</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frame (if it existed). Otherwise sets the frame passing the specified </td>
</tr>
<tr>
<td class="h" >
<a name="1340">1340</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> @values to the add_frame() function of MP3::Tag::ID3v2. (The old value is </td>
</tr>
<tr>
<td class="h" >
<a name="1341">1341</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> removed.) </td>
</tr>
<tr>
<td class="h" >
<a name="1342">1342</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1343">1343</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1344">1344</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1345">1345</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # With two elements, removes frame </td>
</tr>
<tr>
<td class="h" >
<a name="1346">1346</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub set_id3v2_frame ($$;@) { </td>
</tr>
<tr>
<td class="h" >
<a name="1347">1347</a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1347-1">
6
</a>
</td>
<td >
</td>
<td >
184
</td>
<td class="s"> my ($self, $item) = (shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1348">1348</a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
13
</td>
<td class="s"> $self->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1349">1349</a>
</td>
<td class="c3" >
6
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1349-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1349-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
15
</td>
<td class="s"> return if not @_ and not exists $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="1350">1350</a>
</td>
<td class="c3" >
6
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1350-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
21
</td>
<td class="s"> $self->new_tag("ID3v2") unless exists $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="1351">1351</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $self->{ID3v2}->remove_frame($item) </td>
</tr>
<tr>
<td class="h" >
<a name="1352">1352</a>
</td>
<td class="c3" >
6
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1352-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
16
</td>
<td class="s"> if defined $self->{ID3v2}->get_frame($item); </td>
</tr>
<tr>
<td class="h" >
<a name="1353">1353</a>
</td>
<td class="c3" >
6
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1353-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
20
</td>
<td class="s"> return unless @_; </td>
</tr>
<tr>
<td class="h" >
<a name="1354">1354</a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
18
</td>
<td class="s"> return $self->{ID3v2}->add_frame($item, @_); </td>
</tr>
<tr>
<td class="h" >
<a name="1355">1355</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1356">1356</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1357">1357</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item get_id3v2_frames </td>
</tr>
<tr>
<td class="h" >
<a name="1358">1358</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1359">1359</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ($descr, @frames) = $mp3->get_id3v2_frames($fname); </td>
</tr>
<tr>
<td class="h" >
<a name="1360">1360</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1361">1361</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns the specified frame(s); has the same API as </td>
</tr>
<tr>
<td class="h" >
<a name="1362">1362</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tag::ID3v2::get_frames>, but also returns undef if no ID3v2 </td>
</tr>
<tr>
<td class="h" >
<a name="1363">1363</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> tag is present. </td>
</tr>
<tr>
<td class="h" >
<a name="1364">1364</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1365">1365</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1366">1366</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1367">1367</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub get_id3v2_frames ($$;$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1368">1368</a>
</td>
<td class="c0" >
<a href="#1369">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1368-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1369">1369</a>
</td>
<td class="c0" >
<a href="#1370">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1370">1370</a>
</td>
<td class="c0" >
<a href="#1371">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1370-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return if not exists $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="1371">1371</a>
</td>
<td class="c0" >
<a href="#1384">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{ID3v2}->get_frames(@_); </td>
</tr>
<tr>
<td class="h" >
<a name="1372">1372</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1373">1373</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1374">1374</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item delete_tag </td>
</tr>
<tr>
<td class="h" >
<a name="1375">1375</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1376">1376</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $deleted = $mp3->delete_tag($tag); </td>
</tr>
<tr>
<td class="h" >
<a name="1377">1377</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1378">1378</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $tag should be either C<ID3v1> or C<ID3v2>. Deletes the tag if it is present. </td>
</tr>
<tr>
<td class="h" >
<a name="1379">1379</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns FALSE if the tag is not present. </td>
</tr>
<tr>
<td class="h" >
<a name="1380">1380</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1381">1381</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1382">1382</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1383">1383</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub delete_tag ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1384">1384</a>
</td>
<td class="c0" >
<a href="#1385">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1384-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self, $tag) = (shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1385">1385</a>
</td>
<td class="c0" >
<a href="#1386">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1386">1386</a>
</td>
<td class="c0" >
<a href="#1387">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1386-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> die "Unexpected tag type '$tag'" unless $tag =~ /^ID3v[12]$/; </td>
</tr>
<tr>
<td class="h" >
<a name="1387">1387</a>
</td>
<td class="c0" >
<a href="#1388">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1387-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return unless exists $self->{$tag}; </td>
</tr>
<tr>
<td class="h" >
<a name="1388">1388</a>
</td>
<td class="c0" >
<a href="#1389">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $res = $self->{$tag}->remove_tag(); </td>
</tr>
<tr>
<td class="h" >
<a name="1389">1389</a>
</td>
<td class="c0" >
<a href="#1390">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1389-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $res = ($res >= 0) if $tag eq 'ID3v1'; # -1 on error </td>
</tr>
<tr>
<td class="h" >
<a name="1390">1390</a>
</td>
<td class="c0" >
<a href="#1402">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1390-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $res or die "Error deleting tag `$tag'"; </td>
</tr>
<tr>
<td class="h" >
<a name="1391">1391</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1392">1392</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1393">1393</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item is_id3v2_modified </td>
</tr>
<tr>
<td class="h" >
<a name="1394">1394</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1395">1395</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $frame = $mp3->is_id3v2_modified(); </td>
</tr>
<tr>
<td class="h" >
<a name="1396">1396</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1397">1397</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns TRUE if ID3v2 tag exists and was modified after creation. </td>
</tr>
<tr>
<td class="h" >
<a name="1398">1398</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1399">1399</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1400">1400</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1401">1401</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub is_id3v2_modified ($$;@) { </td>
</tr>
<tr>
<td class="h" >
<a name="1402">1402</a>
</td>
<td class="c0" >
<a href="#1403">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1402-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1403">1403</a>
</td>
<td class="c0" >
<a href="#1404">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1403-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return if not exists $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="1404">1404</a>
</td>
<td class="c0" >
<a href="#1520">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{ID3v2}->is_modified(); </td>
</tr>
<tr>
<td class="h" >
<a name="1405">1405</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1406">1406</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1407">1407</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item select_id3v2_frame </td>
</tr>
<tr>
<td class="h" >
<a name="1408">1408</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1409">1409</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $frame = $mp3->select_id3v2_frame($fname, $descrs, $langs [, $VALUE]); </td>
</tr>
<tr>
<td class="h" >
<a name="1410">1410</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1411">1411</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns the specified frame(s); has the same API as </td>
</tr>
<tr>
<td class="h" >
<a name="1412">1412</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tag::ID3v2/frame_select> (args are the frame name, the list of </td>
</tr>
<tr>
<td class="h" >
<a name="1413">1413</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> wanted Descriptors, list of wanted Languages, and possibly the new </td>
</tr>
<tr>
<td class="h" >
<a name="1414">1414</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> contents - with C<undef> meaning deletion). For read-only access it </td>
</tr>
<tr>
<td class="h" >
<a name="1415">1415</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> returns empty if no ID3v2 tag is present, or no frame is found. </td>
</tr>
<tr>
<td class="h" >
<a name="1416">1416</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1417">1417</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If new contents is specified, B<ALL> the existing frames matching the </td>
</tr>
<tr>
<td class="h" >
<a name="1418">1418</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> specification are deleted. </td>
</tr>
<tr>
<td class="h" >
<a name="1419">1419</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1420">1420</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item have_id3v2_frame </td>
</tr>
<tr>
<td class="h" >
<a name="1421">1421</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1422">1422</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $have_it = $mp3->have_id3v2_frame($fname, $descrs, $langs); </td>
</tr>
<tr>
<td class="h" >
<a name="1423">1423</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1424">1424</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns TRUE the specified frame(s) exist; has the same API as </td>
</tr>
<tr>
<td class="h" >
<a name="1425">1425</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tag::ID3v2::frame_have> (args are frame name, list of wanted </td>
</tr>
<tr>
<td class="h" >
<a name="1426">1426</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Descriptors, list of wanted Languages). </td>
</tr>
<tr>
<td class="h" >
<a name="1427">1427</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1428">1428</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item get_id3v2_frame_ids </td>
</tr>
<tr>
<td class="h" >
<a name="1429">1429</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1430">1430</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $h = $mp3->get_id3v2_frame_ids(); </td>
</tr>
<tr>
<td class="h" >
<a name="1431">1431</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> print " $_ => $h{$_}" for keys %$h; </td>
</tr>
<tr>
<td class="h" >
<a name="1432">1432</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1433">1433</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns a hash reference with the short names of ID3v2 frames present </td>
</tr>
<tr>
<td class="h" >
<a name="1434">1434</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> in the tag as keys (and long description of the meaning as values), or </td>
</tr>
<tr>
<td class="h" >
<a name="1435">1435</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> FALSE if no ID3v2 tag is present. See </td>
</tr>
<tr>
<td class="h" >
<a name="1436">1436</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tags::ID3v2::get_frame_ids> for details. </td>
</tr>
<tr>
<td class="h" >
<a name="1437">1437</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1438">1438</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item id3v2_frame_descriptors </td>
</tr>
<tr>
<td class="h" >
<a name="1439">1439</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1440">1440</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns the list of human-readable "long names" of frames (such as </td>
</tr>
<tr>
<td class="h" >
<a name="1441">1441</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<COMM(eng)[lyricist birthdate]>), appropriate for interpolation, or </td>
</tr>
<tr>
<td class="h" >
<a name="1442">1442</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for select_id3v2_frame_by_descr(). </td>
</tr>
<tr>
<td class="h" >
<a name="1443">1443</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1444">1444</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item select_id3v2_frame_by_descr </td>
</tr>
<tr>
<td class="h" >
<a name="1445">1445</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1446">1446</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item have_id3v2_frame_by_descr </td>
</tr>
<tr>
<td class="h" >
<a name="1447">1447</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1448">1448</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Similar to select_id3v2_frame(), have_id3v2_frame(), but instead of </td>
</tr>
<tr>
<td class="h" >
<a name="1449">1449</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> arguments $fname, $descrs, $langs take one string of the form </td>
</tr>
<tr>
<td class="h" >
<a name="1450">1450</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1451">1451</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> NAME(langs)[descr] </td>
</tr>
<tr>
<td class="h" >
<a name="1452">1452</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1453">1453</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Both C<(langs)> and C<[descr]> parts may be omitted; langs should </td>
</tr>
<tr>
<td class="h" >
<a name="1454">1454</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> contain comma-separated list of needed languages. The semantic is </td>
</tr>
<tr>
<td class="h" >
<a name="1455">1455</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> similar to </td>
</tr>
<tr>
<td class="h" >
<a name="1456">1456</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tag::ID3v2::frame_select_by_descr_simpler|MP3::Tag::ID3v2/frame_select_by_descr_simpler>. </td>
</tr>
<tr>
<td class="h" >
<a name="1457">1457</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1458">1458</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> It is allowed to have C<NAME> of the form C<FRAMnn>; C<nn>-th frame </td>
</tr>
<tr>
<td class="h" >
<a name="1459">1459</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> with name C<FRAM> is chosen (C<-1>-based: the first frame is C<FRAM>, </td>
</tr>
<tr>
<td class="h" >
<a name="1460">1460</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the second C<FRAM00>, the third C<FRAM01> etc; for more user-friendly </td>
</tr>
<tr>
<td class="h" >
<a name="1461">1461</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> scheme, use C<langs> of the form C<#NNN>, with C<NNN> 0-based; see </td>
</tr>
<tr>
<td class="h" >
<a name="1462">1462</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tag::ID3v2/"get_frame_ids()">). </td>
</tr>
<tr>
<td class="h" >
<a name="1463">1463</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1464">1464</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $frame = $mp3->select_id3v2_frame_by_descr($descr [, $VALUE1, ...]); </td>
</tr>
<tr>
<td class="h" >
<a name="1465">1465</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $have_it = $mp3->have_id3v2_frame_by_descr($descr); </td>
</tr>
<tr>
<td class="h" >
<a name="1466">1466</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1467">1467</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> select_id3v2_frame_by_descr() will also apply the normalizer in config </td>
</tr>
<tr>
<td class="h" >
<a name="1468">1468</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> setting C<translate_person> if the frame name matches one of the </td>
</tr>
<tr>
<td class="h" >
<a name="1469">1469</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> elements of the configuration setting C<person_frames>. </td>
</tr>
<tr>
<td class="h" >
<a name="1470">1470</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1471">1471</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $c = $mp3->select_id3v2_frame_by_descr("COMM(fre,fra,eng,#0)[]"); </td>
</tr>
<tr>
<td class="h" >
<a name="1472">1472</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $t = $mp3->select_id3v2_frame_by_descr("TIT2"); </td>
</tr>
<tr>
<td class="h" >
<a name="1473">1473</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->select_id3v2_frame_by_descr("TIT2", "MyT"); # Set/Change </td>
</tr>
<tr>
<td class="h" >
<a name="1474">1474</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->select_id3v2_frame_by_descr("RBUF", $n1, $n2, $n3); # Set/Change </td>
</tr>
<tr>
<td class="h" >
<a name="1475">1475</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->select_id3v2_frame_by_descr("RBUF", "$n1;$n2;$n3"); # Set/Change </td>
</tr>
<tr>
<td class="h" >
<a name="1476">1476</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->select_id3v2_frame_by_descr("TIT2", undef); # Remove </td>
</tr>
<tr>
<td class="h" >
<a name="1477">1477</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1478">1478</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Remember that when select_id3v2_frame_by_descr() is used for </td>
</tr>
<tr>
<td class="h" >
<a name="1479">1479</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> modification, B<ALL> found frames are deleted before a new one is </td>
</tr>
<tr>
<td class="h" >
<a name="1480">1480</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> added. For gory details, see L<MP3::Tag::ID3v2/frame_select>. </td>
</tr>
<tr>
<td class="h" >
<a name="1481">1481</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1482">1482</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item frame_translate </td>
</tr>
<tr>
<td class="h" >
<a name="1483">1483</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1484">1484</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->frame_translate('TCOM'); # Normalize TCOM ID3v2 frame </td>
</tr>
<tr>
<td class="h" >
<a name="1485">1485</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1486">1486</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> assuming that the frame value denotes a person, normalizes the value </td>
</tr>
<tr>
<td class="h" >
<a name="1487">1487</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> using personal name normalization logic (via C<translate_person> </td>
</tr>
<tr>
<td class="h" >
<a name="1488">1488</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> configuration value). Frame is updated, but the tag is not written </td>
</tr>
<tr>
<td class="h" >
<a name="1489">1489</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> back. The frame must be in the list of personal names frames </td>
</tr>
<tr>
<td class="h" >
<a name="1490">1490</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (C<person_frames> configuration value). </td>
</tr>
<tr>
<td class="h" >
<a name="1491">1491</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1492">1492</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item frames_translate </td>
</tr>
<tr>
<td class="h" >
<a name="1493">1493</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1494">1494</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Similar to frame_translate(), but updates all the frames in </td>
</tr>
<tr>
<td class="h" >
<a name="1495">1495</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<person_frames> configuration value. </td>
</tr>
<tr>
<td class="h" >
<a name="1496">1496</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1497">1497</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1498">1498</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1499">1499</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub select_id3v2_frame ($$;@) { </td>
</tr>
<tr>
<td class="h" >
<a name="1500">1500</a>
</td>
<td class="c3" >
49
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1500-1">
49
</a>
</td>
<td >
</td>
<td >
257
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1501">1501</a>
</td>
<td class="c3" >
49
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
70
</td>
<td class="s"> $self->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1502">1502</a>
</td>
<td class="c3" >
49
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1502-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
77
</td>
<td class="s"> if (not exists $self->{ID3v2}) { </td>
</tr>
<tr>
<td class="h" >
<a name="1503">1503</a>
</td>
<td class="c3" >
1
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1503-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1503-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
7
</td>
<td class="s"> return if @_ <= 3 or not defined $_[3]; # Read access, or deletion </td>
</tr>
<tr>
<td class="h" >
<a name="1504">1504</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> $self->new_tag("ID3v2"); </td>
</tr>
<tr>
<td class="h" >
<a name="1505">1505</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1506">1506</a>
</td>
<td class="c3" >
49
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
124
</td>
<td class="s"> $self->{ID3v2}->frame_select(@_); </td>
</tr>
<tr>
<td class="h" >
<a name="1507">1507</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1508">1508</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1509">1509</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _select_id3v2_frame_by_descr ($$$;@) { </td>
</tr>
<tr>
<td class="h" >
<a name="1510">1510</a>
</td>
<td class="c3" >
169
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1510-1">
169
</a>
</td>
<td >
</td>
<td >
168
</td>
<td class="s"> my ($self, $update) = (shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1511">1511</a>
</td>
<td class="c3" >
169
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
213
</td>
<td class="s"> $self->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1512">1512</a>
</td>
<td class="c3" >
169
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1512-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
259
</td>
<td class="s"> if (not exists $self->{ID3v2}) { </td>
</tr>
<tr>
<td class="h" >
<a name="1513">1513</a>
</td>
<td class="c3" >
7
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1513-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1513-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
41
</td>
<td class="s"> return if @_ <= 1 or @_ <= 2 and not defined $_[1]; # Read or delete </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1514">1514</a>
</td>
<td class="c3" >
7
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
13
</td>
<td class="s"> $self->new_tag("ID3v2"); </td>
</tr>
<tr>
<td class="h" >
<a name="1515">1515</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1516">1516</a>
</td>
<td class="c3" >
169
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
144
</td>
<td class="s"> my $fname = $_[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="1517">1517</a>
</td>
<td class="c3" >
169
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
303
</td>
<td class="s"> $fname =~ s/^(\w{4})\d+/$1/; # if FRAMnn, convert to FRAM </td>
</tr>
<tr>
<td class="h" >
<a name="1518">1518</a>
</td>
<td class="c3" >
169
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1518-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
271
</td>
<td class="s"> my $tr = ($self->get_config('translate_person') || [])->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="1519">1519</a>
</td>
<td class="c3" >
169
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1519-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
268
</td>
<td class="s"> if ($tr) { </td>
</tr>
<tr>
<td class="h" >
<a name="1520">1520</a>
</td>
<td class="c0" >
<a href="#1521">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $translate = $self->get_config('person_frames'); </td>
</tr>
<tr>
<td class="h" >
<a name="1521">1521</a>
</td>
<td class="c0" >
<a href="#1522">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1521-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> unless (ref $translate eq 'HASH') { # XXXX Store the hash somewhere??? </td>
</tr>
<tr>
<td class="h" >
<a name="1522">1522</a>
</td>
<td class="c0" >
<a href="#1525">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $translate = {map +($_, 1), @$translate}; </td>
</tr>
<tr>
<td class="h" >
<a name="1523">1523</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> #$self->config('person_frames', @translate); </td>
</tr>
<tr>
<td class="h" >
<a name="1524">1524</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1525">1525</a>
</td>
<td class="c0" >
<a href="#1526">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $do = $translate->{$fname}; </td>
</tr>
<tr>
<td class="h" >
<a name="1526">1526</a>
</td>
<td class="c0" >
<a href="#1528">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1526-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1526-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $do = $translate->{$fname} # Remove language </td>
</tr>
<tr>
<td class="h" >
<a name="1527">1527</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if not $do and $fname =~ s/^(\w{4})(?:\(([^()]*(?:\([^()]+\)[^()]*)*)\))/$1/; </td>
</tr>
<tr>
<td class="h" >
<a name="1528">1528</a>
</td>
<td class="c0" >
<a href="#1543">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1528-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> undef $tr unless $do; </td>
</tr>
<tr>
<td class="h" >
<a name="1529">1529</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1530">1530</a>
</td>
<td class="c3" >
169
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1530-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1530-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
267
</td>
<td class="s"> return if $update and not $tr; </td>
</tr>
<tr>
<td class="h" >
<a name="1531">1531</a>
</td>
<td class="c3" >
169
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1531-1">
50
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1531-1">
102
</a>
</td>
<td >
</td>
<td >
717
</td>
<td class="s"> $tr ||= sub {$_[1]}; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
102
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
124
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1532">1532</a>
</td>
<td class="c3" >
169
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1532-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1532-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
564
</td>
<td class="s"> return $self->{ID3v2}->frame_select_by_descr_simpler(@_) </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1533">1533</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if @_ > 2 or @_ == 2 and not defined $_[1]; # Multi-arg write or delete </td>
</tr>
<tr>
<td class="h" >
<a name="1534">1534</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $self->{ID3v2}->frame_select_by_descr_simpler( </td>
</tr>
<tr>
<td class="h" >
<a name="1535">1535</a>
</td>
<td class="c3" >
153
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1535-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
235
</td>
<td class="s"> $_[0], &$tr($self, $_[1]) </td>
</tr>
<tr>
<td class="h" >
<a name="1536">1536</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ) if @_ == 2; # Write access with one arg </td>
</tr>
<tr>
<td class="h" >
<a name="1537">1537</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1538">1538</a>
</td>
<td class="c3" >
135
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
348
</td>
<td class="s"> my $val = $self->{ID3v2}->frame_select_by_descr_simpler(@_); </td>
</tr>
<tr>
<td class="h" >
<a name="1539">1539</a>
</td>
<td class="c3" >
135
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
108
</td>
<td class="s"> my $nval; </td>
</tr>
<tr>
<td class="h" >
<a name="1540">1540</a>
</td>
<td class="c3" >
135
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1540-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
253
</td>
<td class="s"> $nval = &$tr($self, $val) if defined $val; </td>
</tr>
<tr>
<td class="h" >
<a name="1541">1541</a>
</td>
<td class="c3" >
135
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1541-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
532
</td>
<td class="s"> return $nval unless $update; </td>
</tr>
<tr>
<td class="h" >
<a name="1542">1542</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Update logic: </td>
</tr>
<tr>
<td class="h" >
<a name="1543">1543</a>
</td>
<td class="c0" >
<a href="#1544">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1543-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1543-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return if not defined $val or $val eq $nval; </td>
</tr>
<tr>
<td class="h" >
<a name="1544">1544</a>
</td>
<td class="c0" >
<a href="#1553">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{ID3v2}->frame_select_by_descr_simpler($_[0], $nval); </td>
</tr>
<tr>
<td class="h" >
<a name="1545">1545</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1546">1546</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1547">1547</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub select_id3v2_frame_by_descr ($$;@) { </td>
</tr>
<tr>
<td class="h" >
<a name="1548">1548</a>
</td>
<td class="c3" >
169
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1548-1">
169
</a>
</td>
<td >
</td>
<td >
911
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1549">1549</a>
</td>
<td class="c3" >
169
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
272
</td>
<td class="s"> return $self->_select_id3v2_frame_by_descr(0, @_); </td>
</tr>
<tr>
<td class="h" >
<a name="1550">1550</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1551">1551</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1552">1552</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub frame_translate ($@) { </td>
</tr>
<tr>
<td class="h" >
<a name="1553">1553</a>
</td>
<td class="c0" >
<a href="#1554">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1553-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1554">1554</a>
</td>
<td class="c0" >
<a href="#1558">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return $self->_select_id3v2_frame_by_descr(1, @_); </td>
</tr>
<tr>
<td class="h" >
<a name="1555">1555</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1556">1556</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1557">1557</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub frames_translate ($) { </td>
</tr>
<tr>
<td class="h" >
<a name="1558">1558</a>
</td>
<td class="c0" >
<a href="#1559">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1558-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1559">1559</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1559-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> for my $f (@{$self->get_config('person_frames') || []}) { </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#1560">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1560">1560</a>
</td>
<td class="c0" >
<a href="#1565">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->frame_translate($f); </td>
</tr>
<tr>
<td class="h" >
<a name="1561">1561</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1562">1562</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1563">1563</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1564">1564</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub have_id3v2_frame ($$;@) { </td>
</tr>
<tr>
<td class="h" >
<a name="1565">1565</a>
</td>
<td class="c0" >
<a href="#1566">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1565-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1566">1566</a>
</td>
<td class="c0" >
<a href="#1567">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1567">1567</a>
</td>
<td class="c0" >
<a href="#1568">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1567-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return if not exists $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="1568">1568</a>
</td>
<td class="c0" >
<a href="#1579">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{ID3v2}->frame_have(@_); </td>
</tr>
<tr>
<td class="h" >
<a name="1569">1569</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1570">1570</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1571">1571</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub have_id3v2_frame_by_descr ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1572">1572</a>
</td>
<td class="c3" >
30
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1572-1">
30
</a>
</td>
<td >
</td>
<td >
30
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1573">1573</a>
</td>
<td class="c3" >
30
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
37
</td>
<td class="s"> $self->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1574">1574</a>
</td>
<td class="c3" >
30
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1574-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
51
</td>
<td class="s"> return if not exists $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="1575">1575</a>
</td>
<td class="c3" >
27
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
70
</td>
<td class="s"> $self->{ID3v2}->frame_have_by_descr(shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1576">1576</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1577">1577</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1578">1578</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub get_id3v2_frame_ids ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1579">1579</a>
</td>
<td class="c0" >
<a href="#1580">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1579-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1580">1580</a>
</td>
<td class="c0" >
<a href="#1581">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1581">1581</a>
</td>
<td class="c0" >
<a href="#1582">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1581-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return if not exists $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="1582">1582</a>
</td>
<td class="c0" >
<a href="#1611">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{ID3v2}->get_frame_ids(@_); </td>
</tr>
<tr>
<td class="h" >
<a name="1583">1583</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1584">1584</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1585">1585</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub id3v2_frame_descriptors ($) { </td>
</tr>
<tr>
<td class="h" >
<a name="1586">1586</a>
</td>
<td class="c3" >
7
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1586-1">
7
</a>
</td>
<td >
</td>
<td >
10
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1587">1587</a>
</td>
<td class="c3" >
7
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
9
</td>
<td class="s"> $self->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1588">1588</a>
</td>
<td class="c3" >
7
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1588-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
14
</td>
<td class="s"> return if not exists $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="1589">1589</a>
</td>
<td class="c3" >
7
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
20
</td>
<td class="s"> $self->{ID3v2}->get_frame_descriptors(@_); </td>
</tr>
<tr>
<td class="h" >
<a name="1590">1590</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1591">1591</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1592">1592</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item copy_id3v2_frames($from, $to, $overwrite, [$keep_flags, $f_ids]) </td>
</tr>
<tr>
<td class="h" >
<a name="1593">1593</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1594">1594</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Copies specified frames between C<MP3::Tag> objects $from, $to. Unless </td>
</tr>
<tr>
<td class="h" >
<a name="1595">1595</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $keep_flags, the copied frames have their flags cleared. </td>
</tr>
<tr>
<td class="h" >
<a name="1596">1596</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If the array reference $f_ids is not specified, all the frames (but C<GRID> </td>
</tr>
<tr>
<td class="h" >
<a name="1597">1597</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and C<TLEN>) are considered (subject to $overwrite), otherwise $f_ids should </td>
</tr>
<tr>
<td class="h" >
<a name="1598">1598</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> contain short frame ids to consider. Group ID flag is always cleared. </td>
</tr>
<tr>
<td class="h" >
<a name="1599">1599</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1600">1600</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If $overwrite is C<'delete'>, frames with the same descriptors (as </td>
</tr>
<tr>
<td class="h" >
<a name="1601">1601</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> returned by get_frame_descr()) in $to are deleted first, then all the </td>
</tr>
<tr>
<td class="h" >
<a name="1602">1602</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> specified frames are copied. If $overwrite is FALSE, only frames with </td>
</tr>
<tr>
<td class="h" >
<a name="1603">1603</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> descriptors not present in $to are copied. (If one of these two </td>
</tr>
<tr>
<td class="h" >
<a name="1604">1604</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> conditions is not met, the result may be not conformant to standards.) </td>
</tr>
<tr>
<td class="h" >
<a name="1605">1605</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1606">1606</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns count of copied frames. </td>
</tr>
<tr>
<td class="h" >
<a name="1607">1607</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1608">1608</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1609">1609</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1610">1610</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub copy_id3v2_frames { </td>
</tr>
<tr>
<td class="h" >
<a name="1611">1611</a>
</td>
<td class="c0" >
<a href="#1612">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1611-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($from, $to, $overwrite, $keep_flags, $f_ids) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="1612">1612</a>
</td>
<td class="c0" >
<a href="#1613">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $from->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1613">1613</a>
</td>
<td class="c0" >
<a href="#1614">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1613-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return 0 unless $from = $from->{ID3v2}; # No need to create it... </td>
</tr>
<tr>
<td class="h" >
<a name="1614">1614</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1614-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $f_ids ||= [keys %{$from->get_frame_ids}]; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#1615">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1615">1615</a>
</td>
<td class="c0" >
<a href="#1616">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1615-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return 0 unless @$f_ids; </td>
</tr>
<tr>
<td class="h" >
<a name="1616">1616</a>
</td>
<td class="c0" >
<a href="#1617">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $to->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1617">1617</a>
</td>
<td class="c0" >
<a href="#1618">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1617-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $to->new_tag("ID3v2") if not exists $to->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="1618">1618</a>
</td>
<td class="c0" >
<a href="#1622">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $from->copy_frames($to->{ID3v2}, $overwrite, $keep_flags, $f_ids); </td>
</tr>
<tr>
<td class="h" >
<a name="1619">1619</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1620">1620</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1621">1621</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _Data_to_MIME ($$;$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1622">1622</a>
</td>
<td class="c0" >
<a href="#1648">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1622-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> goto &MP3::Tag::ID3v2::_Data_to_MIME </td>
</tr>
<tr>
<td class="h" >
<a name="1623">1623</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1624">1624</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1625">1625</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item _Data_to_MIME </td>
</tr>
<tr>
<td class="h" >
<a name="1626">1626</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1627">1627</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Internal method to extract MIME type from a string the image file content. </td>
</tr>
<tr>
<td class="h" >
<a name="1628">1628</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns C<application/octet-stream> for unrecognized data </td>
</tr>
<tr>
<td class="h" >
<a name="1629">1629</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (unless extra TRUE argument is given). </td>
</tr>
<tr>
<td class="h" >
<a name="1630">1630</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1631">1631</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $format = $id3->_Data_to_MIME($data); </td>
</tr>
<tr>
<td class="h" >
<a name="1632">1632</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1633">1633</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Currently, only the first 4 bytes of the string are inspected. </td>
</tr>
<tr>
<td class="h" >
<a name="1634">1634</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1635">1635</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1636">1636</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1637">1637</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1638">1638</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item shorten_person </td>
</tr>
<tr>
<td class="h" >
<a name="1639">1639</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1640">1640</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $string = $mp3->shorten_person($person_name); </td>
</tr>
<tr>
<td class="h" >
<a name="1641">1641</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1642">1642</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> shorten $person_name as a personal name (according to C<short_person> </td>
</tr>
<tr>
<td class="h" >
<a name="1643">1643</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> configuration setting). </td>
</tr>
<tr>
<td class="h" >
<a name="1644">1644</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1645">1645</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1646">1646</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1647">1647</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub shorten_person ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1648">1648</a>
</td>
<td class="c0" >
<a href="#1649">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1648-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="1649">1649</a>
</td>
<td class="c0" >
<a href="#1650">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1649-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $tr = ($self->get_config('short_person') || [])->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="1650">1650</a>
</td>
<td class="c0" >
<a href="#1651">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1650-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return shift unless $tr; </td>
</tr>
<tr>
<td class="h" >
<a name="1651">1651</a>
</td>
<td class="c0" >
<a href="#1664">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return &$tr($self, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1652">1652</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1653">1653</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1654">1654</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item normalize_person </td>
</tr>
<tr>
<td class="h" >
<a name="1655">1655</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1656">1656</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $string = $mp3->normalize_person($person_name); </td>
</tr>
<tr>
<td class="h" >
<a name="1657">1657</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1658">1658</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> normalize $person_name as a personal name (according to C<translate_person> </td>
</tr>
<tr>
<td class="h" >
<a name="1659">1659</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> configuration setting). </td>
</tr>
<tr>
<td class="h" >
<a name="1660">1660</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1661">1661</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1662">1662</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1663">1663</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub normalize_person ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1664">1664</a>
</td>
<td class="c0" >
<a href="#1665">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1664-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="1665">1665</a>
</td>
<td class="c0" >
<a href="#1666">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1665-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $tr = ($self->get_config('translate_person') || [])->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="1666">1666</a>
</td>
<td class="c0" >
<a href="#1667">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1666-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return shift unless $tr; </td>
</tr>
<tr>
<td class="h" >
<a name="1667">1667</a>
</td>
<td class="c0" >
<a href="#1693">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return &$tr($self, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1668">1668</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1669">1669</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1670">1670</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1671">1671</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item id3v2_frames_autofill </td>
</tr>
<tr>
<td class="h" >
<a name="1672">1672</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1673">1673</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->id3v2_frames_autofill($force); </td>
</tr>
<tr>
<td class="h" >
<a name="1674">1674</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1675">1675</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Generates missing tags from the list specified in C<id3v2_frames_autofill> </td>
</tr>
<tr>
<td class="h" >
<a name="1676">1676</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> configuration variable. The tags should be from a short list this method </td>
</tr>
<tr>
<td class="h" >
<a name="1677">1677</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> knows how to deal with: </td>
</tr>
<tr>
<td class="h" >
<a name="1678">1678</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1679">1679</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> TXXX[MCDI-fulltoc]: filled from file audio_cd.toc in directory of the </td>
</tr>
<tr>
<td class="h" >
<a name="1680">1680</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> audio file. [Create this file with </td>
</tr>
<tr>
<td class="h" >
<a name="1681">1681</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> readcd -fulltoc dev=0,1,0 -f=audio_cd >& nul </td>
</tr>
<tr>
<td class="h" >
<a name="1682">1682</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> modifying the dev (and redirection per your shell). ] </td>
</tr>
<tr>
<td class="h" >
<a name="1683">1683</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> TXXX[cddb_id] </td>
</tr>
<tr>
<td class="h" >
<a name="1684">1684</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> TXXX[cdindex_id]: filled from the result of the corresponding method </td>
</tr>
<tr>
<td class="h" >
<a name="1685">1685</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (which may extract from .inf or cddb files). </td>
</tr>
<tr>
<td class="h" >
<a name="1686">1686</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1687">1687</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Existing frames are not modified unless $force option is specified; when </td>
</tr>
<tr>
<td class="h" >
<a name="1688">1688</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $force is true, ID3v2 tag will be created even if it was not present. </td>
</tr>
<tr>
<td class="h" >
<a name="1689">1689</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1690">1690</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="1691">1691</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1692">1692</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub id3v2_frames_autofill ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="1693">1693</a>
</td>
<td class="c0" >
<a href="#1694">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#1693-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self, $forceframe) = (shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="1694">1694</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my %force = @{$self->get_config('id3v2_frames_autofill')}; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#1695">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1695">1695</a>
</td>
<td class="c0" >
<a href="#1696">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="1696">1696</a>
</td>
<td class="c0" >
<a href="#1697">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1696-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1696-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> unless ($self->{ID3v2} or $forceframe) { # first run: force ID3v2? </td>
</tr>
<tr>
<td class="h" >
<a name="1697">1697</a>
</td>
<td class="c0" >
<a href="#1698">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> for my $tag (keys %force) { </td>
</tr>
<tr>
<td class="h" >
<a name="1698">1698</a>
</td>
<td class="c0" >
<a href="#1699">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1698-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> next unless $force{$tag}; </td>
</tr>
<tr>
<td class="h" >
<a name="1699">1699</a>
</td>
<td class="c0" >
<a href="#1700">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $v; </td>
</tr>
<tr>
<td class="h" >
<a name="1700">1700</a>
</td>
<td class="c0" >
<a href="#1701">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1700-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1700-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $v = $self->$1() or next if $tag =~ /^TXXX\[(cd(?:db|index)_id)\]$/; </td>
</tr>
<tr>
<td class="h" >
<a name="1701">1701</a>
</td>
<td class="c0" >
<a href="#1702">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1701-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> if ($tag eq 'TXXX[MCDI-fulltoc]') { </td>
</tr>
<tr>
<td class="h" >
<a name="1702">1702</a>
</td>
<td class="c0" >
<a href="#1703">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $file = $self->interpolate('%D/audio_cd.toc'); </td>
</tr>
<tr>
<td class="h" >
<a name="1703">1703</a>
</td>
<td class="c0" >
<a href="#1705">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $v = -e $file; </td>
</tr>
<tr>
<td class="h" >
<a name="1704">1704</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1705">1705</a>
</td>
<td class="c0" >
<a href="#1708">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1705-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $forceframe = 1, last if $v </td>
</tr>
<tr>
<td class="h" >
<a name="1706">1706</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1707">1707</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1708">1708</a>
</td>
<td class="c0" >
<a href="#1709">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> for my $tag (keys %force) { </td>
</tr>
<tr>
<td class="h" >
<a name="1709">1709</a>
</td>
<td class="c0" >
<a href="#1710">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1709-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1709-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> next if $self->have_id3v2_frame_by_descr($tag) and not $forceframe; </td>
</tr>
<tr>
<td class="h" >
<a name="1710">1710</a>
</td>
<td class="c0" >
<a href="#1711">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1710-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1710-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> next unless $force{$tag} or $self->{ID3v2} or $forceframe; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1711">1711</a>
</td>
<td class="c0" >
<a href="#1712">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $v; </td>
</tr>
<tr>
<td class="h" >
<a name="1712">1712</a>
</td>
<td class="c0" >
<a href="#1713">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1712-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#1712-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $v = $self->$1() or next if $tag =~ /^TXXX\[(cd(?:db|index)_id)\]$/; </td>
</tr>
<tr>
<td class="h" >
<a name="1713">1713</a>
</td>
<td class="c0" >
<a href="#1714">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1713-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> if ($tag eq 'TXXX[MCDI-fulltoc]') { </td>
</tr>
<tr>
<td class="h" >
<a name="1714">1714</a>
</td>
<td class="c0" >
<a href="#1715">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $file = $self->interpolate('%D/audio_cd.toc'); </td>
</tr>
<tr>
<td class="h" >
<a name="1715">1715</a>
</td>
<td class="c0" >
<a href="#1716">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1715-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> next unless -e $file; </td>
</tr>
<tr>
<td class="h" >
<a name="1716">1716</a>
</td>
<td class="c0" >
<a href="#1719">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1716-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> warn(<<EOW), next unless $self->track; </td>
</tr>
<tr>
<td class="h" >
<a name="1717">1717</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Could deduce MCDI info, but per id3v2.4 specs, must know the track number! </td>
</tr>
<tr>
<td class="h" >
<a name="1718">1718</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> EOW </td>
</tr>
<tr>
<td class="h" >
<a name="1719">1719</a>
</td>
<td class="c0" >
<a href="#1720">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1719-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> eval { </td>
</tr>
<tr>
<td class="h" >
<a name="1720">1720</a>
</td>
<td class="c0" >
<a href="#1721">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1720-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> open F, "< $file" or die "Can't open `$file' for read: $!"; </td>
</tr>
<tr>
<td class="h" >
<a name="1721">1721</a>
</td>
<td class="c0" >
<a href="#1722">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1721-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> binmode F or die "Can't binmode `$file' for read: $!"; </td>
</tr>
<tr>
<td class="h" >
<a name="1722">1722</a>
</td>
<td class="c0" >
<a href="#1723">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> local $/; </td>
</tr>
<tr>
<td class="h" >
<a name="1723">1723</a>
</td>
<td class="c0" >
<a href="#1724">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $v = <F>; </td>
</tr>
<tr>
<td class="h" >
<a name="1724">1724</a>
</td>
<td class="c0" >
<a href="#1727">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1724-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> CORE::close F or die "Can't close `$file' for read: $!"; </td>
</tr>
<tr>
<td class="h" >
<a name="1725">1725</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } or warn($@), next; </td>
</tr>
<tr>
<td class="h" >
<a name="1726">1726</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1727">1727</a>
</td>
<td class="c0" >
<a href="#1728">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#1727-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->select_id3v2_frame_by_descr($tag, $v), next if defined $v; </td>
</tr>
<tr>
<td class="h" >
<a name="1728">1728</a>
</td>
<td class="c0" >
<a href="#2178">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> die "id3v2_frames_autofill(): do not know how to create frame `$tag'"; </td>
</tr>
<tr>
<td class="h" >
<a name="1729">1729</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1730">1730</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="1731">1731</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1732">1732</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item interpolate </td>
</tr>
<tr>
<td class="h" >
<a name="1733">1733</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1734">1734</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $string = $mp3->interpolate($pattern) </td>
</tr>
<tr>
<td class="h" >
<a name="1735">1735</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1736">1736</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> interpolates C<%>-escapes in $pattern using the information from $mp3 tags. </td>
</tr>
<tr>
<td class="h" >
<a name="1737">1737</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The syntax of escapes is similar to this of sprintf(): </td>
</tr>
<tr>
<td class="h" >
<a name="1738">1738</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1739">1739</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> % [ [FLAGS] MINWIDTH] [.MAXWIDTH] ESCAPE </td>
</tr>
<tr>
<td class="h" >
<a name="1740">1740</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1741">1741</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The only recognized FLAGS are C<-> (to denote left-alignment inside MINWIDTH- </td>
</tr>
<tr>
<td class="h" >
<a name="1742">1742</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> wide field), C<' '> (SPACE), and C<0> (denoting the fill character to use), as </td>
</tr>
<tr>
<td class="h" >
<a name="1743">1743</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> well as an arbitrary character in parentheses (which becomes the fill </td>
</tr>
<tr>
<td class="h" >
<a name="1744">1744</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> character). MINWIDTH and MAXWIDTH should be numbers. </td>
</tr>
<tr>
<td class="h" >
<a name="1745">1745</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1746">1746</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The short ESCAPEs are replaced by </td>
</tr>
<tr>
<td class="h" >
<a name="1747">1747</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1748">1748</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> % => literal '%' </td>
</tr>
<tr>
<td class="h" >
<a name="1749">1749</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> t => title </td>
</tr>
<tr>
<td class="h" >
<a name="1750">1750</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> a => artist </td>
</tr>
<tr>
<td class="h" >
<a name="1751">1751</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> l => album </td>
</tr>
<tr>
<td class="h" >
<a name="1752">1752</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> y => year </td>
</tr>
<tr>
<td class="h" >
<a name="1753">1753</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> g => genre </td>
</tr>
<tr>
<td class="h" >
<a name="1754">1754</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> c => comment </td>
</tr>
<tr>
<td class="h" >
<a name="1755">1755</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> n => track </td>
</tr>
<tr>
<td class="h" >
<a name="1756">1756</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> f => filename without the directory path </td>
</tr>
<tr>
<td class="h" >
<a name="1757">1757</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> F => filename with the directory path </td>
</tr>
<tr>
<td class="h" >
<a name="1758">1758</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> D => the directory path of the filename </td>
</tr>
<tr>
<td class="h" >
<a name="1759">1759</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> E => file extension </td>
</tr>
<tr>
<td class="h" >
<a name="1760">1760</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> e => file extension without the leading dot </td>
</tr>
<tr>
<td class="h" >
<a name="1761">1761</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> A => absolute filename without extension </td>
</tr>
<tr>
<td class="h" >
<a name="1762">1762</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> B => filename without the directory part and extension </td>
</tr>
<tr>
<td class="h" >
<a name="1763">1763</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> N => filename as originally given without extension </td>
</tr>
<tr>
<td class="h" >
<a name="1764">1764</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1765">1765</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> v mpeg_version </td>
</tr>
<tr>
<td class="h" >
<a name="1766">1766</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L mpeg_layer_roman </td>
</tr>
<tr>
<td class="h" >
<a name="1767">1767</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> r bitrate_kbps </td>
</tr>
<tr>
<td class="h" >
<a name="1768">1768</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> q frequency_kHz </td>
</tr>
<tr>
<td class="h" >
<a name="1769">1769</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Q frequency_Hz </td>
</tr>
<tr>
<td class="h" >
<a name="1770">1770</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> S total_secs_int </td>
</tr>
<tr>
<td class="h" >
<a name="1771">1771</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> M total_millisecs_int </td>
</tr>
<tr>
<td class="h" >
<a name="1772">1772</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> m total_mins </td>
</tr>
<tr>
<td class="h" >
<a name="1773">1773</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mL leftover_mins </td>
</tr>
<tr>
<td class="h" >
<a name="1774">1774</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> H total_hours </td>
</tr>
<tr>
<td class="h" >
<a name="1775">1775</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> s leftover_secs </td>
</tr>
<tr>
<td class="h" >
<a name="1776">1776</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> SL leftover_secs_trunc </td>
</tr>
<tr>
<td class="h" >
<a name="1777">1777</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ML leftover_msec </td>
</tr>
<tr>
<td class="h" >
<a name="1778">1778</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> SML leftover_secs_float </td>
</tr>
<tr>
<td class="h" >
<a name="1779">1779</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C is_copyrighted_YN </td>
</tr>
<tr>
<td class="h" >
<a name="1780">1780</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> p frames_padded_YN </td>
</tr>
<tr>
<td class="h" >
<a name="1781">1781</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> o channel_mode </td>
</tr>
<tr>
<td class="h" >
<a name="1782">1782</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> u frames </td>
</tr>
<tr>
<td class="h" >
<a name="1783">1783</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1784">1784</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> h height (these 3 for image files, Image::Size or Image::ExifData required) </td>
</tr>
<tr>
<td class="h" >
<a name="1785">1785</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> w width </td>
</tr>
<tr>
<td class="h" >
<a name="1786">1786</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> iT img_type </td>
</tr>
<tr>
<td class="h" >
<a name="1787">1787</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mT mime_type </td>
</tr>
<tr>
<td class="h" >
<a name="1788">1788</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mP mime_Pretype (the capitalized first part of mime_type) </td>
</tr>
<tr>
<td class="h" >
<a name="1789">1789</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> aR aspect_ratio (width/height) </td>
</tr>
<tr>
<td class="h" >
<a name="1790">1790</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> a3 aspect_ratio3 (3 decimal places after the dot) </td>
</tr>
<tr>
<td class="h" >
<a name="1791">1791</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> aI aspect_ratio_inverted (height/width) </td>
</tr>
<tr>
<td class="h" >
<a name="1792">1792</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> bD bit_depth </td>
</tr>
<tr>
<td class="h" >
<a name="1793">1793</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1794">1794</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> aC collection artist (from CDDB_File) </td>
</tr>
<tr>
<td class="h" >
<a name="1795">1795</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> tT track title (from CDDB_File) </td>
</tr>
<tr>
<td class="h" >
<a name="1796">1796</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> cC collection comment (from CDDB_File) </td>
</tr>
<tr>
<td class="h" >
<a name="1797">1797</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> cT track comment (from CDDB_File) </td>
</tr>
<tr>
<td class="h" >
<a name="1798">1798</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> iC CDDB id </td>
</tr>
<tr>
<td class="h" >
<a name="1799">1799</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> iI CDIndex id </td>
</tr>
<tr>
<td class="h" >
<a name="1800">1800</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1801">1801</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (Multi-char escapes must be inclosed in braces, as in C<%{SML}> or C<%.5{aR}>. </td>
</tr>
<tr>
<td class="h" >
<a name="1802">1802</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1803">1803</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Additional multi-char escapes are interpretated is follows: </td>
</tr>
<tr>
<td class="h" >
<a name="1804">1804</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1805">1805</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 4 </td>
</tr>
<tr>
<td class="h" >
<a name="1806">1806</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1807">1807</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1808">1808</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1809">1809</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Names of ID3v2 frames are replaced by their text values (empty for missing </td>
</tr>
<tr>
<td class="h" >
<a name="1810">1810</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frames). </td>
</tr>
<tr>
<td class="h" >
<a name="1811">1811</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1812">1812</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1813">1813</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1814">1814</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Strings C<n1> and C<n2> are replaced by "pure track number" and </td>
</tr>
<tr>
<td class="h" >
<a name="1815">1815</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> "max track number" (this allows for both formats C<N1> and C<N1/N2> of "track", </td>
</tr>
<tr>
<td class="h" >
<a name="1816">1816</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the latter meaning track N1 of N2); use C<n0> to pad C<n1> with leading 0 </td>
</tr>
<tr>
<td class="h" >
<a name="1817">1817</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> to the width of C<n2> (in absense of n2, to 2). Likewise for C<m1>, C<m2> </td>
</tr>
<tr>
<td class="h" >
<a name="1818">1818</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> but with disk (media) number instead of track number; use C<mA> to encode </td>
</tr>
<tr>
<td class="h" >
<a name="1819">1819</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<m1> as a letter (see L<disk_alphanum()>). </td>
</tr>
<tr>
<td class="h" >
<a name="1820">1820</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1821">1821</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1822">1822</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1823">1823</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Strings C<ID3v1> and C<ID3v2> are replaced by the whole ID3v1/2 tag </td>
</tr>
<tr>
<td class="h" >
<a name="1824">1824</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (interpolation of C<ID3v2> for an unmodified tag is subject to </td>
</tr>
<tr>
<td class="h" >
<a name="1825">1825</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<id3v2_recalculate> configuration variable). (These may work as </td>
</tr>
<tr>
<td class="h" >
<a name="1826">1826</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> conditionals too, with C<:>.) </td>
</tr>
<tr>
<td class="h" >
<a name="1827">1827</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1828">1828</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1829">1829</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1830">1830</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Strings of the form C<FRAM(list,of,languages)[description]> are </td>
</tr>
<tr>
<td class="h" >
<a name="1831">1831</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> replaced by the first FRAM frame with the descriptor "description" in </td>
</tr>
<tr>
<td class="h" >
<a name="1832">1832</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the specified comma-separated list of languages. Instead of a </td>
</tr>
<tr>
<td class="h" >
<a name="1833">1833</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> language (ID3v2 uses lowercase 3-char ISO-639-2 language notations) one can use </td>
</tr>
<tr>
<td class="h" >
<a name="1834">1834</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> a string of the form C<#Number>; e.g., C<#4> means 4th FRAM frame, or </td>
</tr>
<tr>
<td class="h" >
<a name="1835">1835</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> FRAM04. Empty string for the language means any language.) Works as </td>
</tr>
<tr>
<td class="h" >
<a name="1836">1836</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> a condition for conditional interpolation too. </td>
</tr>
<tr>
<td class="h" >
<a name="1837">1837</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1838">1838</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Any one of the list of languages and the disription can be omitted; </td>
</tr>
<tr>
<td class="h" >
<a name="1839">1839</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> this means that either the frame FRAM has no language or descriptor </td>
</tr>
<tr>
<td class="h" >
<a name="1840">1840</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> associated, or no restriction should be applied. </td>
</tr>
<tr>
<td class="h" >
<a name="1841">1841</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1842">1842</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Unknown language should be denoted as C<XXX> (in uppercase!). The language </td>
</tr>
<tr>
<td class="h" >
<a name="1843">1843</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> match is case-insensitive. </td>
</tr>
<tr>
<td class="h" >
<a name="1844">1844</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1845">1845</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1846">1846</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1847">1847</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Several descriptors of the form </td>
</tr>
<tr>
<td class="h" >
<a name="1848">1848</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<FRAM(list,of,languages)[description]> discussed above may be </td>
</tr>
<tr>
<td class="h" >
<a name="1849">1849</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> combined together with C<&>; the non-empty expansions are joined </td>
</tr>
<tr>
<td class="h" >
<a name="1850">1850</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> together with the value of configuration variable C<ampersand_joiner> </td>
</tr>
<tr>
<td class="h" >
<a name="1851">1851</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (default C<"; ">). Example: </td>
</tr>
<tr>
<td class="h" >
<a name="1852">1852</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1853">1853</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> %{TXXX[pre-title]&TIT1&TIT2&TIT3&TXXX[post-title]} </td>
</tr>
<tr>
<td class="h" >
<a name="1854">1854</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1855">1855</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1856">1856</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1857">1857</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1858">1858</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Strings of the form C<method(list,of,packages)[arg1][arg2]> are replaced </td>
</tr>
<tr>
<td class="h" >
<a name="1859">1859</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> by the result of C<method> (with the given arguments) in one of the specified </td>
</tr>
<tr>
<td class="h" >
<a name="1860">1860</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> known subpackages (e.g., for C<Inf>, C<MP3::Tag::Inf> is used). Arbitrary number </td>
</tr>
<tr>
<td class="h" >
<a name="1861">1861</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> of arguments is supported. Instead of a long name C<method> one can use its </td>
</tr>
<tr>
<td class="h" >
<a name="1862">1862</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> standard shortcut (e.g., C<t> for C<title>). For example, </td>
</tr>
<tr>
<td class="h" >
<a name="1863">1863</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1864">1864</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->interpolate('%{t(ID3v1,Cue)}') </td>
</tr>
<tr>
<td class="h" >
<a name="1865">1865</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1866">1866</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> returns the title from the ID3v1 tag, or (if not there) from a cue sheet. </td>
</tr>
<tr>
<td class="h" >
<a name="1867">1867</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> One can use this in conditionals etc as well. </td>
</tr>
<tr>
<td class="h" >
<a name="1868">1868</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1869">1869</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1870">1870</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1871">1871</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<d>I<NUMBER> is replaced by I<NUMBER>-th component of the directory name (with </td>
</tr>
<tr>
<td class="h" >
<a name="1872">1872</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> 0 corresponding to the last component). </td>
</tr>
<tr>
<td class="h" >
<a name="1873">1873</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1874">1874</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1875">1875</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1876">1876</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<D>I<NUMBER> is replaced by the directory name with NUMBER components stripped. </td>
</tr>
<tr>
<td class="h" >
<a name="1877">1877</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1878">1878</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1879">1879</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1880">1880</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<U>I<NUMBER> is replaced by I<NUMBER>-th component of the user scratch </td>
</tr>
<tr>
<td class="h" >
<a name="1881">1881</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> array. </td>
</tr>
<tr>
<td class="h" >
<a name="1882">1882</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1883">1883</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1884">1884</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1885">1885</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If string starts with C<FNAME:>: if frame FNAME does not exists, the escape </td>
</tr>
<tr>
<td class="h" >
<a name="1886">1886</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> is ignored; otherwise the rest of the string is reinterpreted. </td>
</tr>
<tr>
<td class="h" >
<a name="1887">1887</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1888">1888</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1889">1889</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1890">1890</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> String starting with C<!FNAME:> are treated similarly with inverted test. </td>
</tr>
<tr>
<td class="h" >
<a name="1891">1891</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1892">1892</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1893">1893</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1894">1894</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If string starts with C<FNAME||>: if frame FNAME exists, the part </td>
</tr>
<tr>
<td class="h" >
<a name="1895">1895</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> after C<||> is ignored; otherwise the part before C<||> is ignored, </td>
</tr>
<tr>
<td class="h" >
<a name="1896">1896</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and the rest is reinterpreted. </td>
</tr>
<tr>
<td class="h" >
<a name="1897">1897</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1898">1898</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1899">1899</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1900">1900</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If string starts with C<FNAME|>: if frame FNAME exists, the part </td>
</tr>
<tr>
<td class="h" >
<a name="1901">1901</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> after C<|> is ignored; otherwise the part before C<|> is ignored, </td>
</tr>
<tr>
<td class="h" >
<a name="1902">1902</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and the rest is reinterpreted as if it started with C<%{>. </td>
</tr>
<tr>
<td class="h" >
<a name="1903">1903</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1904">1904</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1905">1905</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1906">1906</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> String starting with I<LETTER>C<:> or C<!>I<LETTER>C<:> are treated similarly </td>
</tr>
<tr>
<td class="h" >
<a name="1907">1907</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> to ID3v2 conditionals, but the condition is that the corresponding escape </td>
</tr>
<tr>
<td class="h" >
<a name="1908">1908</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> expands to non-empty string. Same applies to non-time related 2-char escapes </td>
</tr>
<tr>
<td class="h" >
<a name="1909">1909</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and user variables. </td>
</tr>
<tr>
<td class="h" >
<a name="1910">1910</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1911">1911</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1912">1912</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1913">1913</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Likewise for string starting with I<LETTER>C<|> or I<LETTER>C<||>. </td>
</tr>
<tr>
<td class="h" >
<a name="1914">1914</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1915">1915</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1916">1916</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1917">1917</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> For strings of the form C<nmP[VALUE]> or C<shP[VALUE]>, I<VALUE> is </td>
</tr>
<tr>
<td class="h" >
<a name="1918">1918</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> interpolated, then normalized or shortened as a personal name </td>
</tr>
<tr>
<td class="h" >
<a name="1919">1919</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (according to C<translate_person> or C<short_person> configuration </td>
</tr>
<tr>
<td class="h" >
<a name="1920">1920</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> setting). </td>
</tr>
<tr>
<td class="h" >
<a name="1921">1921</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1922">1922</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1923">1923</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1924">1924</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<composer> or C<performer> is replaced by the result of calling the </td>
</tr>
<tr>
<td class="h" >
<a name="1925">1925</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> corresponding method. </td>
</tr>
<tr>
<td class="h" >
<a name="1926">1926</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1927">1927</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1928">1928</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1929">1929</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<frames> is replaced by space-separated list of "long names" of ID3v2 </td>
</tr>
<tr>
<td class="h" >
<a name="1930">1930</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frames (see id3v2_frame_descriptors()). (To use a different separator, </td>
</tr>
<tr>
<td class="h" >
<a name="1931">1931</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> put it after slash, as in C<%{frames/, }>, where separator is COMMA </td>
</tr>
<tr>
<td class="h" >
<a name="1932">1932</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> SPACE). </td>
</tr>
<tr>
<td class="h" >
<a name="1933">1933</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1934">1934</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1935">1935</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1936">1936</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<_out_frames[QQPRE//QQPOST]> is replaced by a verbose listing of frames. </td>
</tr>
<tr>
<td class="h" >
<a name="1937">1937</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> "simple" frames are output one-per-line (with the value surrounded by </td>
</tr>
<tr>
<td class="h" >
<a name="1938">1938</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<QQPRE> and C<QQPOST>); fields of other frames are output one-per-line. </td>
</tr>
<tr>
<td class="h" >
<a name="1939">1939</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If one omits the leading C<_>, then C<__binary_DATA__> replaces the value </td>
</tr>
<tr>
<td class="h" >
<a name="1940">1940</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> of binary fields. </td>
</tr>
<tr>
<td class="h" >
<a name="1941">1941</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1942">1942</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1943">1943</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1944">1944</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<ID3v2-size>, C<ID3v2-pad>, and C<ID3v2-stripped> are replaced by size of </td>
</tr>
<tr>
<td class="h" >
<a name="1945">1945</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ID3v2 tag in bytes, the amount of 0-padding at the end of the tag </td>
</tr>
<tr>
<td class="h" >
<a name="1946">1946</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (not counting one extra 0 byte at the end of tag which may be needed for </td>
</tr>
<tr>
<td class="h" >
<a name="1947">1947</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> unsyncing if the last char is \xFF), and size without padding. Currently, </td>
</tr>
<tr>
<td class="h" >
<a name="1948">1948</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for modified ID3v2 tag, what is returned reflect the size on disk (i.e., </td>
</tr>
<tr>
<td class="h" >
<a name="1949">1949</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> before modification). </td>
</tr>
<tr>
<td class="h" >
<a name="1950">1950</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1951">1951</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1952">1952</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1953">1953</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<ID3v2-modified> is replaced by C<'modified'> if ID3v2 is present and </td>
</tr>
<tr>
<td class="h" >
<a name="1954">1954</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> is modified in memory; otherwise is replaced by an empty string. </td>
</tr>
<tr>
<td class="h" >
<a name="1955">1955</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1956">1956</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1957">1957</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1958">1958</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> For strings of the form C<I(FLAGS)VALUE>, I<VALUE> is interpolated </td>
</tr>
<tr>
<td class="h" >
<a name="1959">1959</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> with flags in I<FLAGS> (see L<"interpolate_with_flags">). If FLAGS </td>
</tr>
<tr>
<td class="h" >
<a name="1960">1960</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> does not contain C<i>, VALUE should have C<{}> and C<\> backwacked. </td>
</tr>
<tr>
<td class="h" >
<a name="1961">1961</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1962">1962</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item * </td>
</tr>
<tr>
<td class="h" >
<a name="1963">1963</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1964">1964</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> For strings of the form C<T[FORMAT]>, I<FORMAT> is split on comma, and </td>
</tr>
<tr>
<td class="h" >
<a name="1965">1965</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the resulting list of formats is used to convert the duration of the </td>
</tr>
<tr>
<td class="h" >
<a name="1966">1966</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> audio to a string using the method format_time(). (E.g., </td>
</tr>
<tr>
<td class="h" >
<a name="1967">1967</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<%{T[=E<gt>m,?H:,{mL}]}> would print duration in (optional) hours and minutes </td>
</tr>
<tr>
<td class="h" >
<a name="1968">1968</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> rounded to the closest minute.) </td>
</tr>
<tr>
<td class="h" >
<a name="1969">1969</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1970">1970</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="1971">1971</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1972">1972</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The default for the fill character is SPACE. Fill character should preceed </td>
</tr>
<tr>
<td class="h" >
<a name="1973">1973</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<-> if both are given. Example: </td>
</tr>
<tr>
<td class="h" >
<a name="1974">1974</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1975">1975</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Title: %(/)-12.12t%{TIT3:; TIT3 is %\{TIT3\}}%{!TIT3:. No TIT3 is present} </td>
</tr>
<tr>
<td class="h" >
<a name="1976">1976</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1977">1977</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> will result in </td>
</tr>
<tr>
<td class="h" >
<a name="1978">1978</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1979">1979</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Title: TITLE///////; TIT3 is Op. 16 </td>
</tr>
<tr>
<td class="h" >
<a name="1980">1980</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1981">1981</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if title is C<TITLE>, and TIT3 is C<Op. 16>, and </td>
</tr>
<tr>
<td class="h" >
<a name="1982">1982</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1983">1983</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Title: TITLE///////. No TIT3 is present </td>
</tr>
<tr>
<td class="h" >
<a name="1984">1984</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1985">1985</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if title is C<TITLE>, but TIT3 is not present. </td>
</tr>
<tr>
<td class="h" >
<a name="1986">1986</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1987">1987</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Fat content: %{COMM(eng,fra,fre,rus,)[FatContent]} </td>
</tr>
<tr>
<td class="h" >
<a name="1988">1988</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1989">1989</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> will print the comment field with I<Description> C<FatContent> </td>
</tr>
<tr>
<td class="h" >
<a name="1990">1990</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> prefering the description in English to one in French, Russian, or any </td>
</tr>
<tr>
<td class="h" >
<a name="1991">1991</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> other language (in this order). (I do not know which one of </td>
</tr>
<tr>
<td class="h" >
<a name="1992">1992</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> terminology/bibliography codes for French is used, so for safety </td>
</tr>
<tr>
<td class="h" >
<a name="1993">1993</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> include both.) </td>
</tr>
<tr>
<td class="h" >
<a name="1994">1994</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1995">1995</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Composer: %{TCOM|a} </td>
</tr>
<tr>
<td class="h" >
<a name="1996">1996</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="1997">1997</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> will use the ID3v2 field C<TCOM> if present, otherwise uses C<%a> (this is </td>
</tr>
<tr>
<td class="h" >
<a name="1998">1998</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> similar to </td>
</tr>
<tr>
<td class="h" >
<a name="1999">1999</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2000">2000</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Composer: %{composer} </td>
</tr>
<tr>
<td class="h" >
<a name="2001">2001</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2002">2002</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> but the latter may be subject to (different) normalization, and/or </td>
</tr>
<tr>
<td class="h" >
<a name="2003">2003</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> configuration variables). </td>
</tr>
<tr>
<td class="h" >
<a name="2004">2004</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2005">2005</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Interpolation of ID3v2 frames uses the minimal possible non-ambiguous </td>
</tr>
<tr>
<td class="h" >
<a name="2006">2006</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> backslashing rules: the only backslashes needed are to protect the </td>
</tr>
<tr>
<td class="h" >
<a name="2007">2007</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> innermost closing delimiter (C<]> or C<}>) appearing as a literal </td>
</tr>
<tr>
<td class="h" >
<a name="2008">2008</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> character, or to protect backslashes I<immediately> preceding such </td>
</tr>
<tr>
<td class="h" >
<a name="2009">2009</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> literal, or the closing delimiter. E.g., the pattern equal to </td>
</tr>
<tr>
<td class="h" >
<a name="2010">2010</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2011">2011</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> %{COMM(eng)[a\b\\c\}\]end\\\]\\\\]: comment `a\b\\c\\\}]end\]\\' present} </td>
</tr>
<tr>
<td class="h" >
<a name="2012">2012</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2013">2013</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> checks for the presence of comment with the descriptor C<a\b\\c\}]end\]\\>. </td>
</tr>
<tr>
<td class="h" >
<a name="2014">2014</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Note that if you want to write this string as a Perl literal, a lot of </td>
</tr>
<tr>
<td class="h" >
<a name="2015">2015</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> extra backslashes may be needed (unless you use C<E<lt>E<lt>'FOO'> </td>
</tr>
<tr>
<td class="h" >
<a name="2016">2016</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> HERE-document). </td>
</tr>
<tr>
<td class="h" >
<a name="2017">2017</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2018">2018</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> %{T[?Hh,?{mL}m,{SML}s]} </td>
</tr>
<tr>
<td class="h" >
<a name="2019">2019</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2020">2020</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for a file of duration 2345.62sec will result in C<39m05.62s>, while </td>
</tr>
<tr>
<td class="h" >
<a name="2021">2021</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2022">2022</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> %{T[?H:,?{mL}:,{SL},?{ML}]}sec </td>
</tr>
<tr>
<td class="h" >
<a name="2023">2023</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2024">2024</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> will result in C<39:05.620sec>. </td>
</tr>
<tr>
<td class="h" >
<a name="2025">2025</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2026">2026</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="2027">2027</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2028">2028</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # ` </td>
</tr>
<tr>
<td class="h" >
<a name="2029">2029</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2030">2030</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my %trans = qw( t title </td>
</tr>
<tr>
<td class="h" >
<a name="2031">2031</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> a artist </td>
</tr>
<tr>
<td class="h" >
<a name="2032">2032</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> l album </td>
</tr>
<tr>
<td class="h" >
<a name="2033">2033</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> y year </td>
</tr>
<tr>
<td class="h" >
<a name="2034">2034</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> g genre </td>
</tr>
<tr>
<td class="h" >
<a name="2035">2035</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> c comment </td>
</tr>
<tr>
<td class="h" >
<a name="2036">2036</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> n track </td>
</tr>
<tr>
<td class="h" >
<a name="2037">2037</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2038">2038</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> E filename_extension </td>
</tr>
<tr>
<td class="h" >
<a name="2039">2039</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> e filename_extension_nodot </td>
</tr>
<tr>
<td class="h" >
<a name="2040">2040</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> A abs_filename_noextension </td>
</tr>
<tr>
<td class="h" >
<a name="2041">2041</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> B filename_nodir_noextension </td>
</tr>
<tr>
<td class="h" >
<a name="2042">2042</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> N filename_noextension </td>
</tr>
<tr>
<td class="h" >
<a name="2043">2043</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> f filename_nodir </td>
</tr>
<tr>
<td class="h" >
<a name="2044">2044</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> D dirname </td>
</tr>
<tr>
<td class="h" >
<a name="2045">2045</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> F abs_filename </td>
</tr>
<tr>
<td class="h" >
<a name="2046">2046</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2047">2047</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> aC artist_collection </td>
</tr>
<tr>
<td class="h" >
<a name="2048">2048</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> tT title_track </td>
</tr>
<tr>
<td class="h" >
<a name="2049">2049</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> cC comment_collection </td>
</tr>
<tr>
<td class="h" >
<a name="2050">2050</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> cT comment_track </td>
</tr>
<tr>
<td class="h" >
<a name="2051">2051</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> iD cddb_id </td>
</tr>
<tr>
<td class="h" >
<a name="2052">2052</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> iI cdindex_id </td>
</tr>
<tr>
<td class="h" >
<a name="2053">2053</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> n1 track1 </td>
</tr>
<tr>
<td class="h" >
<a name="2054">2054</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> n2 track2 </td>
</tr>
<tr>
<td class="h" >
<a name="2055">2055</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> n0 track0 </td>
</tr>
<tr>
<td class="h" >
<a name="2056">2056</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mA disk_alphanum </td>
</tr>
<tr>
<td class="h" >
<a name="2057">2057</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> m1 disk1 </td>
</tr>
<tr>
<td class="h" >
<a name="2058">2058</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> m2 disk2 </td>
</tr>
<tr>
<td class="h" >
<a name="2059">2059</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2060">2060</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> h height </td>
</tr>
<tr>
<td class="h" >
<a name="2061">2061</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> w width </td>
</tr>
<tr>
<td class="h" >
<a name="2062">2062</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> iT img_type </td>
</tr>
<tr>
<td class="h" >
<a name="2063">2063</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mT mime_type </td>
</tr>
<tr>
<td class="h" >
<a name="2064">2064</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mP mime_Pretype </td>
</tr>
<tr>
<td class="h" >
<a name="2065">2065</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> aR aspect_ratio </td>
</tr>
<tr>
<td class="h" >
<a name="2066">2066</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> a3 aspect_ratio3 </td>
</tr>
<tr>
<td class="h" >
<a name="2067">2067</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> aI aspect_ratio_inverted </td>
</tr>
<tr>
<td class="h" >
<a name="2068">2068</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> bD bit_depth </td>
</tr>
<tr>
<td class="h" >
<a name="2069">2069</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2070">2070</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> v mpeg_version </td>
</tr>
<tr>
<td class="h" >
<a name="2071">2071</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L mpeg_layer_roman </td>
</tr>
<tr>
<td class="h" >
<a name="2072">2072</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ? is_stereo </td>
</tr>
<tr>
<td class="h" >
<a name="2073">2073</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ? is_vbr </td>
</tr>
<tr>
<td class="h" >
<a name="2074">2074</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> r bitrate_kbps </td>
</tr>
<tr>
<td class="h" >
<a name="2075">2075</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> q frequency_kHz </td>
</tr>
<tr>
<td class="h" >
<a name="2076">2076</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Q frequency_Hz </td>
</tr>
<tr>
<td class="h" >
<a name="2077">2077</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ? size_bytes </td>
</tr>
<tr>
<td class="h" >
<a name="2078">2078</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> S total_secs_int </td>
</tr>
<tr>
<td class="h" >
<a name="2079">2079</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> M total_millisecs_int </td>
</tr>
<tr>
<td class="h" >
<a name="2080">2080</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> m total_mins </td>
</tr>
<tr>
<td class="h" >
<a name="2081">2081</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mL leftover_mins </td>
</tr>
<tr>
<td class="h" >
<a name="2082">2082</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> H total_hours </td>
</tr>
<tr>
<td class="h" >
<a name="2083">2083</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> s leftover_secs </td>
</tr>
<tr>
<td class="h" >
<a name="2084">2084</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ML leftover_msec </td>
</tr>
<tr>
<td class="h" >
<a name="2085">2085</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> SML leftover_secs_float </td>
</tr>
<tr>
<td class="h" >
<a name="2086">2086</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> SL leftover_secs_trunc </td>
</tr>
<tr>
<td class="h" >
<a name="2087">2087</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ? time_mm_ss </td>
</tr>
<tr>
<td class="h" >
<a name="2088">2088</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C is_copyrighted_YN </td>
</tr>
<tr>
<td class="h" >
<a name="2089">2089</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> p frames_padded_YN </td>
</tr>
<tr>
<td class="h" >
<a name="2090">2090</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> o channel_mode </td>
</tr>
<tr>
<td class="h" >
<a name="2091">2091</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> u frames </td>
</tr>
<tr>
<td class="h" >
<a name="2092">2092</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ? frame_len </td>
</tr>
<tr>
<td class="h" >
<a name="2093">2093</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ? vbr_scale </td>
</tr>
<tr>
<td class="h" >
<a name="2094">2094</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ); </td>
</tr>
<tr>
<td class="h" >
<a name="2095">2095</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2096">2096</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Different: %v is without trailing 0s, %q has fractional part, </td>
</tr>
<tr>
<td class="h" >
<a name="2097">2097</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # %e, %E are for the extension, </td>
</tr>
<tr>
<td class="h" >
<a name="2098">2098</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # %r is a number instead of 'Variable', %u is one less... </td>
</tr>
<tr>
<td class="h" >
<a name="2099">2099</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Missing: </td>
</tr>
<tr>
<td class="h" >
<a name="2100">2100</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # %b Number of corrupt audio frames (integer) </td>
</tr>
<tr>
<td class="h" >
<a name="2101">2101</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # %e Emphasis (string) </td>
</tr>
<tr>
<td class="h" >
<a name="2102">2102</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # %E CRC Error protection (string) </td>
</tr>
<tr>
<td class="h" >
<a name="2103">2103</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # %O Original material flag (string) </td>
</tr>
<tr>
<td class="h" >
<a name="2104">2104</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # %G Musical genre (integer) </td>
</tr>
<tr>
<td class="h" >
<a name="2105">2105</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2106">2106</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Made as tags: ParseData ID3v2 ID3v1 ImageExifTool Inf CDDB_File Cue ImageSize LastResort </td>
</tr>
<tr>
<td class="h" >
<a name="2107">2107</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my %handlers = map {($_, 1)} qw( </td>
</tr>
<tr>
<td class="h" >
<a name="2108">2108</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> CDDB_File File ID3v2 ImageExifTool Inf ParseData </td>
</tr>
<tr>
<td class="h" >
<a name="2109">2109</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Cue ID3v1 ImageSize LastResort </td>
</tr>
<tr>
<td class="h" >
<a name="2110">2110</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ); # Inf/Cue are not in language list: https://www.loc.gov/standards/iso639-2/php/code_list.php </td>
</tr>
<tr>
<td class="h" >
<a name="2111">2111</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2112">2112</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> #$handler_r = qr/$handler_r/; </td>
</tr>
<tr>
<td class="h" >
<a name="2113">2113</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # </td>
</tr>
<tr>
<td class="h" >
<a name="2114">2114</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> #my $frame_bra = # FRAM | FRAM03 | FRAM(lang)[ </td>
</tr>
<tr>
<td class="h" >
<a name="2115">2115</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # qr{\w{4}(?:(?:\d\d)|(?:\([^()]*(?:\([^()]+\)[^()]*)*\))?(?:(\[)|(?=[\}:|&])))}s; # 1 group for begin-descr </td>
</tr>
<tr>
<td class="h" >
<a name="2116">2116</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2117">2117</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $at_end_frame_name = qr/(?=[\}:|&])/; </td>
</tr>
<tr>
<td class="h" >
<a name="2118">2118</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $lang_or_handlers_rex = qr/\(([^()]*(?:\([^()]+\)[^()]*)*)\)/; </td>
</tr>
<tr>
<td class="h" >
<a name="2119">2119</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $frame_bra = # FRAM | FRAM03 | FRAM(lang)[ | cmd(PACKAGES) | cmd(PACKAGES)[args] </td>
</tr>
<tr>
<td class="h" >
<a name="2120">2120</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> qr{(?:\w{4}(?=\d\d\b|\b)|(?!I\b)\w+(?=\())(?:\d\d|$lang_or_handlers_rex?(?:(\[)|$at_end_frame_name))}s; # 2 groups for descr + bra </td>
</tr>
<tr>
<td class="h" >
<a name="2121">2121</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2122">2122</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # used with offset by 1: 2: fill, 3: same, 4: $left, 5..6 width, 7: key </td>
</tr>
<tr>
<td class="h" >
<a name="2123">2123</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $pat_rx = qr/^%(?:(?:\((.)\)|([^-.1-9%a-zA-Z]))?(-)?(\d+))?(?:\.(\d+))?([talgcynfFeEABDNvLrqQSmsCpouMHwh{%])/s; </td>
</tr>
<tr>
<td class="h" >
<a name="2124">2124</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # XXXX Partially repeated below, search for `talgc'??? vLrqQSmsCpouMH miss??? </td>
</tr>
<tr>
<td class="h" >
<a name="2125">2125</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2126">2126</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $longer_f = qr(a[3CRI]|tT|c[TC]|i[DIT]|n[012]|m[A12TP]|bD); </td>
</tr>
<tr>
<td class="h" >
<a name="2127">2127</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # (a[CR]|tT|c[TC]|[mMS]L|SML|i[DIT]|n[012]|m[A12T]|bD) </td>
</tr>
<tr>
<td class="h" >
<a name="2128">2128</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # a[CR]|tT|c[TC]|i[DIT]|n[012]|m[A12T]|bD </td>
</tr>
<tr>
<td class="h" >
<a name="2129">2129</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2130">2130</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub process_handlers ($$$$;$$) { # only 1 level of parens allowed in flags </td>
</tr>
<tr>
<td class="h" >
<a name="2131">2131</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2131-1">
2
</a>
</td>
<td >
</td>
<td >
5
</td>
<td class="s"> my ($self, $h, $handlers, $args, $cond, $set) = (shift, shift, shift, shift, shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="2132">2132</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # die "Conditionals with handlers not supported yet" if $cond; </td>
</tr>
<tr>
<td class="h" >
<a name="2133">2133</a>
</td>
<td class="c3" >
2
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2133-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
4
</td>
<td class="s"> die "Handlers with arguments not supported yet" if @$args; </td>
</tr>
<tr>
<td class="h" >
<a name="2134">2134</a>
</td>
<td class="c3" >
2
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2134-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
9
</td>
<td class="s"> my (@f) = ($h =~ /^(\w+)/) or die "Panic: `$h' as a handler"; </td>
</tr>
<tr>
<td class="h" >
<a name="2135">2135</a>
</td>
<td class="c3" >
2
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2135-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
5
</td>
<td class="s"> push @f, $trans{$f[0]} if exists $trans{$f[0]}; </td>
</tr>
<tr>
<td class="h" >
<a name="2136">2136</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2136-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
7
</td>
<td class="s"> $set and $_ .= '__set' for @f; </td>
</tr>
<tr>
<td class="h" >
<a name="2137">2137</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
5
</td>
<td class="s"> $self->_auto_field_from($cond, $handlers, \@f, undef, $args, $set); # if $set, calls a method in all packages where possible </td>
</tr>
<tr>
<td class="h" >
<a name="2138">2138</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2139">2139</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2140">2140</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $upto TRUE: parse the part including $upto char </td>
</tr>
<tr>
<td class="h" >
<a name="2141">2141</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Very restricted backslashitis: only $upto and \ before $upto-or-end </td>
</tr>
<tr>
<td class="h" >
<a name="2142">2142</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $upto defined but FALSE: interpolate only one %-escape. </td>
</tr>
<tr>
<td class="h" >
<a name="2143">2143</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Anyway: $_[1] is modified to remove interpolated part. </td>
</tr>
<tr>
<td class="h" >
<a name="2144">2144</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _interpolate ($$;$$) { </td>
</tr>
<tr>
<td class="h" >
<a name="2145">2145</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # goto &interpolate_flags if @_ == 3; </td>
</tr>
<tr>
<td class="h" >
<a name="2146">2146</a>
</td>
<td class="c3" >
324
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2146-1">
324
</a>
</td>
<td >
</td>
<td >
358
</td>
<td class="s"> my ($self, undef, $upto, $skip) = @_; # pattern is modified, so is $_[1] </td>
</tr>
<tr>
<td class="h" >
<a name="2147">2147</a>
</td>
<td class="c3" >
324
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
389
</td>
<td class="s"> $self->get_tags(); </td>
</tr>
<tr>
<td class="h" >
<a name="2148">2148</a>
</td>
<td class="c3" >
324
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
282
</td>
<td class="s"> my $res = ""; </td>
</tr>
<tr>
<td class="h" >
<a name="2149">2149</a>
</td>
<td class="c3" >
324
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
211
</td>
<td class="s"> my $ids; </td>
</tr>
<tr>
<td class="h" >
<a name="2150">2150</a>
</td>
<td class="c3" >
324
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2150-1">
50
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2150-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
796
</td>
<td class="s"> die "upto=`$upto' not supported" if $upto and $upto ne ']' and $upto ne'}'; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2151">2151</a>
</td>
<td class="c3" >
324
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2151-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2151-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
674
</td>
<td class="s"> die "upto=`$upto' not supported with skip" </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2152">2152</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $upto and not defined $upto and $skip; # XXXX Unreachable??? </td>
</tr>
<tr>
<td class="h" >
<a name="2153">2153</a>
</td>
<td class="c3" >
324
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2153-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2153-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
849
</td>
<td class="s"> my $cnt = ($upto or not defined $upto) ? -1 : 1; # upto eq '': 1 escape </td>
</tr>
<tr>
<td class="h" >
<a name="2154">2154</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2155">2155</a>
</td>
<td class="c3" >
324
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2155-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2155-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
3167
</td>
<td class="s"> while ($cnt-- and ($upto # undef and '' use the same code </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2156">2156</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ? ($upto eq ']' </td>
</tr>
<tr>
<td class="h" >
<a name="2157">2157</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ? $_[1] =~ s/^((?:[^%\\\]]|(?:\\\\)*\\\]|\\+[^\\\]]|\\\\)+)|$pat_rx//so </td>
</tr>
<tr>
<td class="h" >
<a name="2158">2158</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> : $_[1] =~ s/^((?:[^%\\\}]|(?:\\\\)*\\\}|\\+[^\\\}]|\\\\)+)|$pat_rx//so) </td>
</tr>
<tr>
<td class="h" >
<a name="2159">2159</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> : $_[1] =~ s/^([^%]+)|$pat_rx//so)) { </td>
</tr>
<tr>
<td class="h" >
<a name="2160">2160</a>
</td>
<td class="c3" >
527
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2160-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
922
</td>
<td class="s"> if (defined $1) { </td>
</tr>
<tr>
<td class="h" >
<a name="2161">2161</a>
</td>
<td class="c3" >
237
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
229
</td>
<td class="s"> my $str = $1; </td>
</tr>
<tr>
<td class="h" >
<a name="2162">2162</a>
</td>
<td class="c3" >
237
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2162-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2162-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
829
</td>
<td class="s"> if ($upto and $upto eq ']') { </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2163">2163</a>
</td>
<td class="c3" >
73
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
342
</td>
<td class="s"> $str =~ s<((?:\\\\)*)(?:\\(?=\])|(?!.))>< '\\' x (length($1)/2) >ges; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
137
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
439
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2164">2164</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($upto and $upto eq '}') { </td>
</tr>
<tr>
<td class="h" >
<a name="2165">2165</a>
</td>
<td class="c3" >
63
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
265
</td>
<td class="s"> $str =~ s<((?:\\\\)*)(?:\\(?=\})|(?!.))>< '\\' x (length($1)/2) >ges; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
78
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
310
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2166">2166</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2167">2167</a>
</td>
<td class="c3" >
237
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
1430
</td>
<td class="s"> $res .= $str, next; </td>
</tr>
<tr>
<td class="h" >
<a name="2168">2168</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2169">2169</a>
</td>
<td class="c3" >
290
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2169-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
784
</td>
<td class="s"> my ($fill, $left, $minwidth, $maxwidth, $what) </td>
</tr>
<tr>
<td class="h" >
<a name="2170">2170</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> = ((defined $2 ? $2 : $3), $4, $5, $6, $7); </td>
</tr>
<tr>
<td class="h" >
<a name="2171">2171</a>
</td>
<td class="c3" >
290
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2171-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2171-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
459
</td>
<td class="s"> next if $skip and $what ne '{'; </td>
</tr>
<tr>
<td class="h" >
<a name="2172">2172</a>
</td>
<td class="c3" >
290
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
203
</td>
<td class="s"> my $str; </td>
</tr>
<tr>
<td class="h" >
<a name="2173">2173</a>
</td>
<td class="c3" >
290
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2173-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2173-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
4041
</td>
<td class="s"> if ($what eq '{' and $_[1] =~ s/^([dD])(\d+)}//) { # Directory </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-3">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-3">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-4">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-4">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-5">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-5">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-6">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-6">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-7">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-7">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-8">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-8">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-9">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-10">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2174">2174</a>
</td>
<td class="c3" >
1
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2174-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> next if $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2175">2175</a>
</td>
<td class="c3" >
1
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2175-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
4
</td>
<td class="s"> if ($1 eq 'd') { </td>
</tr>
<tr>
<td class="h" >
<a name="2176">2176</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
10
</td>
<td class="s"> $str = $self->dir_component($2); </td>
</tr>
<tr>
<td class="h" >
<a name="2177">2177</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2178">2178</a>
</td>
<td class="c0" >
<a href="#2181">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = $self->dirname($2); </td>
</tr>
<tr>
<td class="h" >
<a name="2179">2179</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2180">2180</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq '{' and $_[1] =~ s/^U(\d+)}//) { # User data </td>
</tr>
<tr>
<td class="h" >
<a name="2181">2181</a>
</td>
<td class="c0" >
<a href="#2182">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2181-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> next if $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2182">2182</a>
</td>
<td class="c0" >
<a href="#2203">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = $self->get_user($1); </td>
</tr>
<tr>
<td class="h" >
<a name="2183">2183</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq '{' and $_[1] =~ s/^($longer_f|[mMS]L|SML)}//o) { </td>
</tr>
<tr>
<td class="h" >
<a name="2184">2184</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # CDDB, IDs, or leftover times </td>
</tr>
<tr>
<td class="h" >
<a name="2185">2185</a>
</td>
<td class="c3" >
60
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2185-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
73
</td>
<td class="s"> next if $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2186">2186</a>
</td>
<td class="c3" >
60
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
86
</td>
<td class="s"> my $meth = $trans{$1}; </td>
</tr>
<tr>
<td class="h" >
<a name="2187">2187</a>
</td>
<td class="c3" >
60
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
117
</td>
<td class="s"> $str = $self->$meth(); </td>
</tr>
<tr>
<td class="h" >
<a name="2188">2188</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq '{' and # $frame_bra has 2 groups, No. 5, 6 </td>
</tr>
<tr>
<td class="h" >
<a name="2189">2189</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # 2-char fields as above, except for [mMS]L|SML (XXX: vLrqQSmsCpouMH ???) </td>
</tr>
<tr>
<td class="h" >
<a name="2190">2190</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $_[1] =~ s/^(!)?(([talgcynfFeEABDNvLrqQSmsCpouMHwh]|ID3v[12]|ID3v2-modified|$longer_f|U\d+)(:|\|\|?)|$frame_bra)//o) { </td>
</tr>
<tr>
<td class="h" >
<a name="2191">2191</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Alternation with simple/complicated stuff </td>
</tr>
<tr>
<td class="h" >
<a name="2192">2192</a>
</td>
<td class="c3" >
163
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
331
</td>
<td class="s"> my ($neg, $id, $simple, $delim, $lang_or_packages, $have_bra) = ($1, $2, $3, $4, $5, $6); </td>
</tr>
<tr>
<td class="h" >
<a name="2193">2193</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2194">2194</a>
</td>
<td class="c3" >
163
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2194-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
495
</td>
<td class="s"> my(@_handlers, @args) = split /,/, ($lang_or_packages || ''); </td>
</tr>
<tr>
<td class="h" >
<a name="2195">2195</a>
</td>
<td class="c3" >
163
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
228
</td>
<td class="s"> my @handlers = grep $handlers{$_}, @_handlers; </td>
</tr>
<tr>
<td class="h" >
<a name="2196">2196</a>
</td>
<td class="c3" >
163
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2196-1">
50
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2196-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
607
</td>
<td class="s"> $delim or $id =~ /^[A-Z]{3}[A-Z\d](\d\d)?\b/ or @handlers and @handlers == @_handlers </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-3">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2197">2197</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> or die "Cannot parse frame descriptor: <<<$id>>>"; </td>
</tr>
<tr>
<td class="h" >
<a name="2198">2198</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2199">2199</a>
</td>
<td class="c3" >
163
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2199-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
187
</td>
<td class="s"> if ($delim) { # Not a frame/cmd id... </td>
</tr>
<tr>
<td class="h" >
<a name="2200">2200</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
39
</td>
<td class="s"> $id = $simple; </td>
</tr>
<tr>
<td class="h" >
<a name="2201">2201</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { # Frame/cmd: maybe trailed by :, |, ||, maybe not </td>
</tr>
<tr>
<td class="h" >
<a name="2202">2202</a>
</td>
<td class="c3" >
128
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2202-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
259
</td>
<td class="s"> while (@handlers and $have_bra) { </td>
</tr>
<tr>
<td class="h" >
<a name="2203">2203</a>
</td>
<td class="c0" >
<a href="#2204">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> push @args, $self->_interpolate($_[1], ']', $skip); </td>
</tr>
<tr>
<td class="h" >
<a name="2204">2204</a>
</td>
<td class="c0" >
<a href="#2225">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $have_bra = ($_[1] =~ s/^\[//); </td>
</tr>
<tr>
<td class="h" >
<a name="2205">2205</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2206">2206</a>
</td>
<td class="c3" >
128
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2206-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
323
</td>
<td class="s"> $id .= ($self->_interpolate($_[1], ']', $skip) . ']') if $have_bra; # unreachable if handler present! </td>
</tr>
<tr>
<td class="h" >
<a name="2207">2207</a>
</td>
<td class="c3" >
128
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2207-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
299
</td>
<td class="s"> $_[1] =~ s/^(:|\|\|?)// and $delim = $1; </td>
</tr>
<tr>
<td class="h" >
<a name="2208">2208</a>
</td>
<td class="c3" >
128
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2208-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
179
</td>
<td class="s"> unless ($delim) { </td>
</tr>
<tr>
<td class="h" >
<a name="2209">2209</a>
</td>
<td class="c3" >
98
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2209-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
125
</td>
<td class="s"> die "Can't parse negated conditional: I see `$_[1]'" if $neg; </td>
</tr>
<tr>
<td class="h" >
<a name="2210">2210</a>
</td>
<td class="c3" >
98
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
75
</td>
<td class="s"> my $nonesuch = 0; </td>
</tr>
<tr>
<td class="h" >
<a name="2211">2211</a>
</td>
<td class="c3" >
98
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2211-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2211-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
291
</td>
<td class="s"> unless (@handlers or $self->{ID3v2} or $neg) { </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2212">2212</a>
</td>
<td class="c3" >
2
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2212-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> die "No ID3v2 present" </td>
</tr>
<tr>
<td class="h" >
<a name="2213">2213</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $self->get_config('id3v2_missing_fatal'); </td>
</tr>
<tr>
<td class="h" >
<a name="2214">2214</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
2
</td>
<td class="s"> $nonesuch = 1; </td>
</tr>
<tr>
<td class="h" >
<a name="2215">2215</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2216">2216</a>
</td>
<td class="c3" >
98
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2216-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2216-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
329
</td>
<td class="s"> next if ($skip or $nonesuch) and $_[1] =~ s/^\}//; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2217">2217</a>
</td>
<td class="c3" >
96
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2217-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
175
</td>
<td class="s"> if ($_[1] =~ /^[\}&]/) { # frame with optional (lang)/[descr], or a package-handled descriptor </td>
</tr>
<tr>
<td class="h" >
<a name="2218">2218</a>
</td>
<td class="c3" >
96
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2218-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
117
</td>
<td class="s"> if (@handlers) { </td>
</tr>
<tr>
<td class="h" >
<a name="2219">2219</a>
</td>
<td class="c3" >
2
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2219-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
10
</td>
<td class="s"> $str = $self->process_handlers($id, \@handlers, \@args) unless $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2220">2220</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $str = '' if not defined $str and $1 eq '&'; </td>
</tr>
<tr>
<td class="h" >
<a name="2221">2221</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2222">2222</a>
</td>
<td class="c3" >
94
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
178
</td>
<td class="s"> $str = $self->select_id3v2_frame_by_descr($id); </td>
</tr>
<tr>
<td class="h" >
<a name="2223">2223</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2224">2224</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2225">2225</a>
</td>
<td class="c0" >
<a href="#2248">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> die "unknown frame terminator; I see `$_[1]'"; </td>
</tr>
<tr>
<td class="h" >
<a name="2226">2226</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2227">2227</a>
</td>
<td class="c3" >
96
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2227-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
188
</td>
<td class="s"> if ($_[1] =~ s/^&/%\{/) { # join of frames with optional (language)/[descriptor], etc </td>
</tr>
<tr>
<td class="h" >
<a name="2228">2228</a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
16
</td>
<td class="s"> my $rest = $self->_interpolate($_[1], '', $skip); </td>
</tr>
<tr>
<td class="h" >
<a name="2229">2229</a>
</td>
<td class="c3" >
6
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2229-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
11
</td>
<td class="s"> next if $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2230">2230</a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
18
</td>
<td class="s"> my $joiner = $self->get_config1('ampersand_joiner'); # default '; ' </td>
</tr>
<tr>
<td class="h" >
<a name="2231">2231</a>
</td>
<td class="c3" >
6
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2231-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2231-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> $str = join $joiner, map {(defined and length) ? $_ : ()} $str, $rest; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
12
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
42
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2232">2232</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2233">2233</a>
</td>
<td class="c3" >
90
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
237
</td>
<td class="s"> $_[1] =~ s/^\}//; </td>
</tr>
<tr>
<td class="h" >
<a name="2234">2234</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2235">2235</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2236">2236</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2237">2237</a>
</td>
<td class="c3" >
161
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2237-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
268
</td>
<td class="s"> if ($delim) { # Conditional </td>
</tr>
<tr>
<td class="h" >
<a name="2238">2238</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $self->_interpolate($_[1], $upto, $skip), next if $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2239">2239</a>
</td>
<td class="c3" >
65
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2239-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
134
</td>
<td class="s"> my $alt = ($delim ne ':') && $delim; # FALSE or $delim </td>
</tr>
<tr>
<td class="h" >
<a name="2240">2240</a>
</td>
<td class="c3" >
65
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2240-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2240-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
137
</td>
<td class="s"> die "Negation and alternation incompatible in interpolation" </td>
</tr>
<tr>
<td class="h" >
<a name="2241">2241</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $alt and $neg; </td>
</tr>
<tr>
<td class="h" >
<a name="2242">2242</a>
</td>
<td class="c3" >
65
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
42
</td>
<td class="s"> my $have; </td>
</tr>
<tr>
<td class="h" >
<a name="2243">2243</a>
</td>
<td class="c3" >
65
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2243-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2243-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
306
</td>
<td class="s"> if ($simple and (2 >= length $simple or $simple =~ /^U/)) { </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-3">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-3">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-4">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2244">2244</a>
</td>
<td class="c3" >
21
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2244-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
39
</td>
<td class="s"> my $s = (1 == length $simple ? $simple : "{$simple}"); </td>
</tr>
<tr>
<td class="h" >
<a name="2245">2245</a>
</td>
<td class="c3" >
21
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
51
</td>
<td class="s"> $str = $self->interpolate("%$s"); </td>
</tr>
<tr>
<td class="h" >
<a name="2246">2246</a>
</td>
<td class="c3" >
21
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
24
</td>
<td class="s"> $have = length($str); </td>
</tr>
<tr>
<td class="h" >
<a name="2247">2247</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif (($simple || '') eq 'ID3v2-modified') { # may be undef </td>
</tr>
<tr>
<td class="h" >
<a name="2248">2248</a>
</td>
<td class="c0" >
<a href="#2255">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2248-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $have = ${ $self->{ID3v2} || {} }{modified} || ''; </td>
</tr>
<tr>
<td class="h" >
<a name="2249">2249</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($simple) { # ID3v2 or ID3v1 </td>
</tr>
<tr>
<td class="h" >
<a name="2250">2250</a>
</td>
<td class="c3" >
14
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2250-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
23
</td>
<td class="s"> die "ID3v2 or ID3v1 as conditionals incompatible with $alt" </td>
</tr>
<tr>
<td class="h" >
<a name="2251">2251</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $alt; </td>
</tr>
<tr>
<td class="h" >
<a name="2252">2252</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
23
</td>
<td class="s"> $have = !! $self->{$simple}; # Make logical </td>
</tr>
<tr>
<td class="h" >
<a name="2253">2253</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif (@handlers) { </td>
</tr>
<tr>
<td class="h" >
<a name="2254">2254</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # warn "\t!!! Handlers"; </td>
</tr>
<tr>
<td class="h" >
<a name="2255">2255</a>
</td>
<td class="c0" >
<a href="#2275">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $have = $self->process_handlers($id, \@handlers, \@args, 'cond'); </td>
</tr>
<tr>
<td class="h" >
<a name="2256">2256</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2257">2257</a>
</td>
<td class="c3" >
30
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
74
</td>
<td class="s"> $have = $self->have_id3v2_frame_by_descr($id); </td>
</tr>
<tr>
<td class="h" >
<a name="2258">2258</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # warn "\t!!! Cond: <<$id>> <<$have>>"; </td>
</tr>
<tr>
<td class="h" >
<a name="2259">2259</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2260">2260</a>
</td>
<td class="c3" >
65
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2260-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
228
</td>
<td class="s"> my $skipping = $skip || (not $alt and $neg ? $have : !$have); </td>
</tr>
<tr>
<td class="h" >
<a name="2261">2261</a>
</td>
<td class="c3" >
65
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
58
</td>
<td class="s"> my $s; </td>
</tr>
<tr>
<td class="h" >
<a name="2262">2262</a>
</td>
<td class="c3" >
65
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2262-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2262-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
148
</td>
<td class="s"> if ($alt and $alt ne '||') { # Need to prepend % </td>
</tr>
<tr>
<td class="h" >
<a name="2263">2263</a>
</td>
<td class="c3" >
14
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2263-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
27
</td>
<td class="s"> if ($_[1] =~ s/^([^\\])\}//) { # One-char escape </td>
</tr>
<tr>
<td class="h" >
<a name="2264">2264</a>
</td>
<td class="c3" >
3
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2264-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
14
</td>
<td class="s"> $s = $self->interpolate("%$1") unless $skipping; </td>
</tr>
<tr>
<td class="h" >
<a name="2265">2265</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { # Understood with {}; prepend %{ </td>
</tr>
<tr>
<td class="h" >
<a name="2266">2266</a>
</td>
<td class="c3" >
11
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2266-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
37
</td>
<td class="s"> $_[1] =~ s/^/%\{/ or die; </td>
</tr>
<tr>
<td class="h" >
<a name="2267">2267</a>
</td>
<td class="c3" >
11
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
24
</td>
<td class="s"> $s = $self->_interpolate($_[1], '', $skipping); </td>
</tr>
<tr>
<td class="h" >
<a name="2268">2268</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2269">2269</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2270">2270</a>
</td>
<td class="c3" >
51
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
136
</td>
<td class="s"> $s = $self->_interpolate($_[1], '}', $skipping); </td>
</tr>
<tr>
<td class="h" >
<a name="2271">2271</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2272">2272</a>
</td>
<td class="c3" >
65
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2272-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
153
</td>
<td class="s"> next if $skipping; </td>
</tr>
<tr>
<td class="h" >
<a name="2273">2273</a>
</td>
<td class="c3" >
50
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2273-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2273-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
151
</td>
<td class="s"> if ($alt and $have and not $simple) { </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2274">2274</a>
</td>
<td class="c3" >
7
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2274-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
12
</td>
<td class="s"> if (@handlers) { </td>
</tr>
<tr>
<td class="h" >
<a name="2275">2275</a>
</td>
<td class="c0" >
<a href="#2285">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = $self->process_handlers($id, \@handlers, \@args); </td>
</tr>
<tr>
<td class="h" >
<a name="2276">2276</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2277">2277</a>
</td>
<td class="c3" >
7
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
12
</td>
<td class="s"> $str = $self->select_id3v2_frame_by_descr($id); </td>
</tr>
<tr>
<td class="h" >
<a name="2278">2278</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2279">2279</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2280">2280</a>
</td>
<td class="c3" >
50
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2280-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2280-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
131
</td>
<td class="s"> $str = $s unless $have and $alt; </td>
</tr>
<tr>
<td class="h" >
<a name="2281">2281</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $str = $str->{_Data} </td>
</tr>
<tr>
<td class="h" >
<a name="2282">2282</a>
</td>
<td class="c3" >
50
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2282-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2282-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
176
</td>
<td class="s"> if $str and ref $str and exists $str->{_Data}; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2283">2283</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2284">2284</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq '{' and $_[1] =~ s/^ID3v1}//) { </td>
</tr>
<tr>
<td class="h" >
<a name="2285">2285</a>
</td>
<td class="c0" >
<a href="#2286">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2285-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> next if $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2286">2286</a>
</td>
<td class="c0" >
<a href="#2290">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2286-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = $self->{ID3v1}->as_bin if $self->{ID3v1}; </td>
</tr>
<tr>
<td class="h" >
<a name="2287">2287</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq '{' </td>
</tr>
<tr>
<td class="h" >
<a name="2288">2288</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and $_[1] =~ s/^(sh|nm)P\[//s) { </td>
</tr>
<tr>
<td class="h" >
<a name="2289">2289</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # (Short) personal name </td>
</tr>
<tr>
<td class="h" >
<a name="2290">2290</a>
</td>
<td class="c0" >
<a href="#2291">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $what = $1; </td>
</tr>
<tr>
<td class="h" >
<a name="2291">2291</a>
</td>
<td class="c0" >
<a href="#2292">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = $self->_interpolate($_[1], ']', $skip); </td>
</tr>
<tr>
<td class="h" >
<a name="2292">2292</a>
</td>
<td class="c0" >
<a href="#2293">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2292-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $_[1] =~ s/^\}// or die "Can't find end of ${what}P escape; I see `$_[1]'"; </td>
</tr>
<tr>
<td class="h" >
<a name="2293">2293</a>
</td>
<td class="c0" >
<a href="#2294">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2293-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> next if $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2294">2294</a>
</td>
<td class="c0" >
<a href="#2295">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2294-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $meth = ($what eq 'sh' ? 'shorten_person' : 'normalize_person'); </td>
</tr>
<tr>
<td class="h" >
<a name="2295">2295</a>
</td>
<td class="c0" >
<a href="#2316">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = $self->$meth($str); </td>
</tr>
<tr>
<td class="h" >
<a name="2296">2296</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq '{' and $_[1] =~ s/^I\((\w+)\)//s) { </td>
</tr>
<tr>
<td class="h" >
<a name="2297">2297</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Interpolate </td>
</tr>
<tr>
<td class="h" >
<a name="2298">2298</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
6
</td>
<td class="s"> my $flags = $1; </td>
</tr>
<tr>
<td class="h" >
<a name="2299">2299</a>
</td>
<td class="c3" >
5
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2299-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
11
</td>
<td class="s"> if ($flags =~ s/i//) { </td>
</tr>
<tr>
<td class="h" >
<a name="2300">2300</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> $str = $self->_interpolate($_[1], '}', $skip); </td>
</tr>
<tr>
<td class="h" >
<a name="2301">2301</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2302">2302</a>
</td>
<td class="c3" >
1
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2302-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
7
</td>
<td class="s"> $_[1] =~ s/^((?:[^\\\}]|(?:\\\\)*\\\}|\\+[^\\\}]|\\\\)*)\}//s </td>
</tr>
<tr>
<td class="h" >
<a name="2303">2303</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $_[1] =~ s/^((?:\\.|[^{}\\])*)}// </td>
</tr>
<tr>
<td class="h" >
<a name="2304">2304</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> or die "Can't find non-interpolated argument in `$_[1]'"; </td>
</tr>
<tr>
<td class="h" >
<a name="2305">2305</a>
</td>
<td class="c3" >
1
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2305-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> next if $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2306">2306</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # ($str = $1) =~ s/\\([\\{}])/$1/g; </td>
</tr>
<tr>
<td class="h" >
<a name="2307">2307</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
6
</td>
<td class="s"> ($str = $1) =~ s<((?:\\\\)*)(?:\\(?=\})|(?!.))>< '\\' x (length($1)/2) >ges; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
5
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2308">2308</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2309">2309</a>
</td>
<td class="c3" >
5
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2309-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
11
</td>
<td class="s"> next if $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2310">2310</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
12
</td>
<td class="s"> ($str) = $self->interpolate_with_flags($str, $flags); </td>
</tr>
<tr>
<td class="h" >
<a name="2311">2311</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq '{' and $_[1] =~ s/^T\[([^\[\]]*)\]\}//s) { # time </td>
</tr>
<tr>
<td class="h" >
<a name="2312">2312</a>
</td>
<td class="c3" >
1
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2312-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> next if $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2313">2313</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
5
</td>
<td class="s"> $str = $self->format_time(undef, split /,/, $1); </td>
</tr>
<tr>
<td class="h" >
<a name="2314">2314</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq '{') { #id3v2=whole, composer/performer/frames </td>
</tr>
<tr>
<td class="h" >
<a name="2315">2315</a>
</td>
<td class="c3" >
6
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2315-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2315-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
22
</td>
<td class="s"> unless ($self->{ID3v2} or $skip) { </td>
</tr>
<tr>
<td class="h" >
<a name="2316">2316</a>
</td>
<td class="c0" >
<a href="#2318">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2316-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> die "No ID3v2 present" </td>
</tr>
<tr>
<td class="h" >
<a name="2317">2317</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $self->get_config('id3v2_missing_fatal'); </td>
</tr>
<tr>
<td class="h" >
<a name="2318">2318</a>
</td>
<td class="c0" >
<a href="#2319">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $_[1] =~ s/^[^\}]*}//; # XXXX No error checking here... </td>
</tr>
<tr>
<td class="h" >
<a name="2319">2319</a>
</td>
<td class="c0" >
<a href="#2322">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> next; </td>
</tr>
<tr>
<td class="h" >
<a name="2320">2320</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2321">2321</a>
</td>
<td class="c3" >
6
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2321-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
42
</td>
<td class="s"> if ($_[1] =~ s/ID3v2}//) { # Whole tag </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-3">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-4">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-5">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-6">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-7">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-8">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2322">2322</a>
</td>
<td class="c0" >
<a href="#2323">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2322-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2322-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> if (not $skip and $self->{ID3v2}) { </td>
</tr>
<tr>
<td class="h" >
<a name="2323">2323</a>
</td>
<td class="c0" >
<a href="#2324">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2323-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> if ($self->get_config('id3v2_recalculate')) { </td>
</tr>
<tr>
<td class="h" >
<a name="2324">2324</a>
</td>
<td class="c0" >
<a href="#2326">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = $self->{ID3v2}->as_bin; </td>
</tr>
<tr>
<td class="h" >
<a name="2325">2325</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2326">2326</a>
</td>
<td class="c0" >
<a href="#2330">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = $self->{ID3v2}->as_bin_raw; </td>
</tr>
<tr>
<td class="h" >
<a name="2327">2327</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2328">2328</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2329">2329</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($_[1] =~ s/^(composer|performer)}//) { </td>
</tr>
<tr>
<td class="h" >
<a name="2330">2330</a>
</td>
<td class="c0" >
<a href="#2335">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2330-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = $self->$1() unless $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2331">2331</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($_[1] =~ s,^frames(?:/(.*?))?},,) { </td>
</tr>
<tr>
<td class="h" >
<a name="2332">2332</a>
</td>
<td class="c3" >
6
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2332-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
14
</td>
<td class="s"> my $sep = (defined $1 ? $1 : ' '); </td>
</tr>
<tr>
<td class="h" >
<a name="2333">2333</a>
</td>
<td class="c3" >
6
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2333-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
28
</td>
<td class="s"> $str = join $sep, $self->id3v2_frame_descriptors() unless $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2334">2334</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($_[1] =~ s,^(_)?out_frames\[(.*?)//(.*?)\]},,) { </td>
</tr>
<tr>
<td class="h" >
<a name="2335">2335</a>
</td>
<td class="c0" >
<a href="#2336">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my($bin, $pre, $post) = ($1, $2, $3); </td>
</tr>
<tr>
<td class="h" >
<a name="2336">2336</a>
</td>
<td class="c0" >
<a href="#2338">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $v2 = $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="2337">2337</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $fr_sep, $fn_sep, $pre,$post,$fsep,$pre_mult,$val_sep # length "Picture Type" = 12 </td>
</tr>
<tr>
<td class="h" >
<a name="2338">2338</a>
</td>
<td class="c0" >
<a href="#2341">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2338-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = ($v2 ? $v2->__frames_as_printable("\n", "\t==>\n ", $pre, # Tune tabbing for length=5..12 (_Data) </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2339">2339</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $post, "\n ", "", " \t=\t", $bin) : '') unless $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2340">2340</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($_[1] =~ s,^ID3v2-size},,) { </td>
</tr>
<tr>
<td class="h" >
<a name="2341">2341</a>
</td>
<td class="c0" >
<a href="#2342">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $v2 = $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="2342">2342</a>
</td>
<td class="c0" >
<a href="#2345">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2342-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = ($v2 ? 10 + $v2->{buggy_padding_size} + $v2->{tagsize} : 0) </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2343">2343</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> unless $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2344">2344</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($_[1] =~ s,^ID3v2-pad},,) { </td>
</tr>
<tr>
<td class="h" >
<a name="2345">2345</a>
</td>
<td class="c0" >
<a href="#2346">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $v2 = $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="2346">2346</a>
</td>
<td class="c0" >
<a href="#2347">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2346-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2346-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $v2->get_frame_ids() if $v2 and not exists $v2->{frameIDs}; </td>
</tr>
<tr>
<td class="h" >
<a name="2347">2347</a>
</td>
<td class="c0" >
<a href="#2349">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2347-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = ($v2 ? $v2->{padding} : 0) unless $skip; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2348">2348</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($_[1] =~ s,^ID3v2-stripped},,) { </td>
</tr>
<tr>
<td class="h" >
<a name="2349">2349</a>
</td>
<td class="c0" >
<a href="#2350">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $v2 = $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="2350">2350</a>
</td>
<td class="c0" >
<a href="#2351">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2350-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2350-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $v2->get_frame_ids() if $v2 and not exists $v2->{frameIDs}; </td>
</tr>
<tr>
<td class="h" >
<a name="2351">2351</a>
</td>
<td class="c0" >
<a href="#2353">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2351-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = ($v2 ? 10 + $v2->{buggy_padding_size} + $v2->{tagsize} - $v2->{padding} : 0) unless $skip; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2352">2352</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($_[1] =~ s,^ID3v2-modified},,) { </td>
</tr>
<tr>
<td class="h" >
<a name="2353">2353</a>
</td>
<td class="c0" >
<a href="#2354">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $v2 = $self->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="2354">2354</a>
</td>
<td class="c0" >
<a href="#2356">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2354-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2354-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = ($v2 and $v2->{modified}) || '' unless $skip; </td>
</tr>
<tr>
<td class="h" >
<a name="2355">2355</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2356">2356</a>
</td>
<td class="c0" >
<a href="#2366">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> die "unknown escape; I see `$_[1]'"; </td>
</tr>
<tr>
<td class="h" >
<a name="2357">2357</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2358">2358</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq '%') { </td>
</tr>
<tr>
<td class="h" >
<a name="2359">2359</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
4
</td>
<td class="s"> $str = '%'; </td>
</tr>
<tr>
<td class="h" >
<a name="2360">2360</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2361">2361</a>
</td>
<td class="c3" >
50
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
83
</td>
<td class="s"> my $meth = $trans{$what}; </td>
</tr>
<tr>
<td class="h" >
<a name="2362">2362</a>
</td>
<td class="c3" >
50
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
164
</td>
<td class="s"> $str = $self->$meth(); </td>
</tr>
<tr>
<td class="h" >
<a name="2363">2363</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2364">2364</a>
</td>
<td class="c3" >
272
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2364-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
434
</td>
<td class="s"> $str = '' unless defined $str; </td>
</tr>
<tr>
<td class="h" >
<a name="2365">2365</a>
</td>
<td class="c3" >
272
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2365-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2365-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
439
</td>
<td class="s"> if (defined $maxwidth and length $str > $maxwidth) { </td>
</tr>
<tr>
<td class="h" >
<a name="2366">2366</a>
</td>
<td class="c0" >
<a href="#2367">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2366-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> if ($str =~ /^(?:\+|(\-))?(\d*)(\.\d*)?$/) { </td>
</tr>
<tr>
<td class="h" >
<a name="2367">2367</a>
</td>
<td class="c0" >
<a href="#2368">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2367-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2367-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> if (length($1 || '') + length $2 <= $maxwidth) { </td>
</tr>
<tr>
<td class="h" >
<a name="2368">2368</a>
</td>
<td class="c0" >
<a href="#2369">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2368-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $w = $maxwidth - length $2 - length($1 || ''); </td>
</tr>
<tr>
<td class="h" >
<a name="2369">2369</a>
</td>
<td class="c0" >
<a href="#2370">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2369-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $w-- if $w; # Take into account decimal point... </td>
</tr>
<tr>
<td class="h" >
<a name="2370">2370</a>
</td>
<td class="c0" >
<a href="#2372">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = sprintf '%.*f', $w, $str </td>
</tr>
<tr>
<td class="h" >
<a name="2371">2371</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { # Might be a long integer benefiting from %g </td>
</tr>
<tr>
<td class="h" >
<a name="2372">2372</a>
</td>
<td class="c0" >
<a href="#2373">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my($w, $s0) = ($maxwidth, $str); </td>
</tr>
<tr>
<td class="h" >
<a name="2373">2373</a>
</td>
<td class="c0" >
<a href="#2374">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> while ($w >= 1) { </td>
</tr>
<tr>
<td class="h" >
<a name="2374">2374</a>
</td>
<td class="c0" >
<a href="#2375">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = sprintf '%.*g', $w, $s0; </td>
</tr>
<tr>
<td class="h" >
<a name="2375">2375</a>
</td>
<td class="c0" >
<a href="#2376">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str =~ s/(^|(?<=[-+]))0+|(?<=e)\+//gi; # 1e+07 to 1e7 </td>
</tr>
<tr>
<td class="h" >
<a name="2376">2376</a>
</td>
<td class="c0" >
<a href="#2377">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2376-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> last if length $str <= $maxwidth; </td>
</tr>
<tr>
<td class="h" >
<a name="2377">2377</a>
</td>
<td class="c0" >
<a href="#2379">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $w-- </td>
</tr>
<tr>
<td class="h" >
<a name="2378">2378</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2379">2379</a>
</td>
<td class="c0" >
<a href="#2380">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2379-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = $s0 if length $str > length $s0; # 12 vs 1e1 </td>
</tr>
<tr>
<td class="h" >
<a name="2380">2380</a>
</td>
<td class="c0" >
<a href="#2383">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = substr $str, 0, $maxwidth; # 1e as a truncation of 1234 is better than 12... </td>
</tr>
<tr>
<td class="h" >
<a name="2381">2381</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2382">2382</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2383">2383</a>
</td>
<td class="c0" >
<a href="#2445">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $str = substr $str, 0, $maxwidth; </td>
</tr>
<tr>
<td class="h" >
<a name="2384">2384</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2385">2385</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2386">2386</a>
</td>
<td class="c3" >
272
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2386-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
353
</td>
<td class="s"> if (defined $minwidth) { </td>
</tr>
<tr>
<td class="h" >
<a name="2387">2387</a>
</td>
<td class="c3" >
16
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2387-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
22
</td>
<td class="s"> $fill = ' ' unless defined $fill; </td>
</tr>
<tr>
<td class="h" >
<a name="2388">2388</a>
</td>
<td class="c3" >
16
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2388-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
21
</td>
<td class="s"> if ($left) { </td>
</tr>
<tr>
<td class="h" >
<a name="2389">2389</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> $str .= $fill x ($minwidth - length $str); </td>
</tr>
<tr>
<td class="h" >
<a name="2390">2390</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2391">2391</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
33
</td>
<td class="s"> $str = $fill x ($minwidth - length $str) . $str; </td>
</tr>
<tr>
<td class="h" >
<a name="2392">2392</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2393">2393</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2394">2394</a>
</td>
<td class="c3" >
272
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
1114
</td>
<td class="s"> $res .= $str; </td>
</tr>
<tr>
<td class="h" >
<a name="2395">2395</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2396">2396</a>
</td>
<td class="c3" >
324
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2396-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
381
</td>
<td class="s"> if (defined $upto) { </td>
</tr>
<tr>
<td class="h" >
<a name="2397">2397</a>
</td>
<td class="c3" >
145
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2397-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2397-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
574
</td>
<td class="s"> not $upto or </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2398">2398</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ($upto eq ']' ? $_[1] =~ s/^\]// : $_[1] =~ s/^\}//) </td>
</tr>
<tr>
<td class="h" >
<a name="2399">2399</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> or die "Can't find final delimiter `$upto': I see `$_[1]'"; </td>
</tr>
<tr>
<td class="h" >
<a name="2400">2400</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2401">2401</a>
</td>
<td class="c3" >
179
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2401-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
277
</td>
<td class="s"> die "Can't parse `$_[1]' during interpolation" if length $_[1]; </td>
</tr>
<tr>
<td class="h" >
<a name="2402">2402</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2403">2403</a>
</td>
<td class="c3" >
324
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
904
</td>
<td class="s"> return $res; </td>
</tr>
<tr>
<td class="h" >
<a name="2404">2404</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2405">2405</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2406">2406</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub interpolate ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="2407">2407</a>
</td>
<td class="c3" >
179
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2407-1">
179
</a>
</td>
<td >
</td>
<td >
1537
</td>
<td class="s"> my ($self, $pattern) = @_; # local copy; $pattern is modified </td>
</tr>
<tr>
<td class="h" >
<a name="2408">2408</a>
</td>
<td class="c3" >
179
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
322
</td>
<td class="s"> $self->_interpolate($pattern); </td>
</tr>
<tr>
<td class="h" >
<a name="2409">2409</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2410">2410</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2411">2411</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2412">2412</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item interpolate_with_flags </td>
</tr>
<tr>
<td class="h" >
<a name="2413">2413</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2414">2414</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> @results = $mp3->interpolate_with_flags($text, $flags); </td>
</tr>
<tr>
<td class="h" >
<a name="2415">2415</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2416">2416</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Processes $text according to directives in the string $flags; $flags is </td>
</tr>
<tr>
<td class="h" >
<a name="2417">2417</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> split into separate flag characters; the meanings (and order of application) of </td>
</tr>
<tr>
<td class="h" >
<a name="2418">2418</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> flags are </td>
</tr>
<tr>
<td class="h" >
<a name="2419">2419</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2420">2420</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> i interpolate via $mp3->interpolate </td>
</tr>
<tr>
<td class="h" >
<a name="2421">2421</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> f interpret (the result) as filename, read from file </td>
</tr>
<tr>
<td class="h" >
<a name="2422">2422</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> F if file does not exist, it is not an error </td>
</tr>
<tr>
<td class="h" >
<a name="2423">2423</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> B read is performed in binary mode (otherwise </td>
</tr>
<tr>
<td class="h" >
<a name="2424">2424</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> in text mode, modified per </td>
</tr>
<tr>
<td class="h" >
<a name="2425">2425</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> 'decode_encoding_files' configuration variable) </td>
</tr>
<tr>
<td class="h" >
<a name="2426">2426</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> l split result per 'parse_split' configuration variable </td>
</tr>
<tr>
<td class="h" >
<a name="2427">2427</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> n as l, using the track-number-th element (1-based) </td>
</tr>
<tr>
<td class="h" >
<a name="2428">2428</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> in the result </td>
</tr>
<tr>
<td class="h" >
<a name="2429">2429</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> I interpolate (again) via $mp3->interpolate </td>
</tr>
<tr>
<td class="h" >
<a name="2430">2430</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> b unless present, remove leading and trailing whitespace </td>
</tr>
<tr>
<td class="h" >
<a name="2431">2431</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2432">2432</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> With C<l>, may produce multiple results. May be accessed via </td>
</tr>
<tr>
<td class="h" >
<a name="2433">2433</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> interpolation of C<%{I(flags)text}>. </td>
</tr>
<tr>
<td class="h" >
<a name="2434">2434</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2435">2435</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="2436">2436</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2437">2437</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub interpolate_with_flags ($$$) { </td>
</tr>
<tr>
<td class="h" >
<a name="2438">2438</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2438-1">
35
</a>
</td>
<td >
</td>
<td >
41
</td>
<td class="s"> my ($self, $data, $flags) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="2439">2439</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2440">2440</a>
</td>
<td class="c3" >
35
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2440-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
97
</td>
<td class="s"> $data = $self->interpolate($data) if $flags =~ /i/; </td>
</tr>
<tr>
<td class="h" >
<a name="2441">2441</a>
</td>
<td class="c3" >
35
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2441-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
60
</td>
<td class="s"> if ($flags =~ /f/) { </td>
</tr>
<tr>
<td class="h" >
<a name="2442">2442</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
7
</td>
<td class="s"> local *F; </td>
</tr>
<tr>
<td class="h" >
<a name="2443">2443</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> my $e; </td>
</tr>
<tr>
<td class="h" >
<a name="2444">2444</a>
</td>
<td class="c3" >
4
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2444-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
89
</td>
<td class="s"> unless (open F, "< $data") { </td>
</tr>
<tr>
<td class="h" >
<a name="2445">2445</a>
</td>
<td class="c0" >
<a href="#2446">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2445-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return if $flags =~ /F/; </td>
</tr>
<tr>
<td class="h" >
<a name="2446">2446</a>
</td>
<td class="c0" >
<a href="#2449">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> die "Can't open file `$data' for parsing: $!"; </td>
</tr>
<tr>
<td class="h" >
<a name="2447">2447</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2448">2448</a>
</td>
<td class="c3" >
4
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2448-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
9
</td>
<td class="s"> if ($flags =~ /B/) { </td>
</tr>
<tr>
<td class="h" >
<a name="2449">2449</a>
</td>
<td class="c0" >
<a href="#2453">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> binmode F; </td>
</tr>
<tr>
<td class="h" >
<a name="2450">2450</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2451">2451</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> my $e; </td>
</tr>
<tr>
<td class="h" >
<a name="2452">2452</a>
</td>
<td class="c3" >
4
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2452-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2452-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
6
</td>
<td class="s"> if ($e = $self->get_config('decode_encoding_files') and $e->[0]) { </td>
</tr>
<tr>
<td class="h" >
<a name="2453">2453</a>
</td>
<td class="c0" >
<a href="#2464">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> eval "binmode F, ':encoding($e->[0])'"; # old binmode won't compile... </td>
</tr>
<tr>
<td class="h" >
<a name="2454">2454</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2455">2455</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2456">2456</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2457">2457</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> local $/; </td>
</tr>
<tr>
<td class="h" >
<a name="2458">2458</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
54
</td>
<td class="s"> my $d = <F>; </td>
</tr>
<tr>
<td class="h" >
<a name="2459">2459</a>
</td>
<td class="c3" >
4
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2459-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
22
</td>
<td class="s"> CORE::close F or die "Can't close file `$data' for parsing: $!"; </td>
</tr>
<tr>
<td class="h" >
<a name="2460">2460</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
12
</td>
<td class="s"> $data = $d; </td>
</tr>
<tr>
<td class="h" >
<a name="2461">2461</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2462">2462</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
44
</td>
<td class="s"> my @data = $data; </td>
</tr>
<tr>
<td class="h" >
<a name="2463">2463</a>
</td>
<td class="c3" >
35
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2463-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
73
</td>
<td class="s"> if ($flags =~ /[ln]/) { </td>
</tr>
<tr>
<td class="h" >
<a name="2464">2464</a>
</td>
<td class="c0" >
<a href="#2465">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $p = $self->get_config('parse_split')->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2465">2465</a>
</td>
<td class="c0" >
<a href="#2468">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> @data = split $p, $data, -1; </td>
</tr>
<tr>
<td class="h" >
<a name="2466">2466</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2467">2467</a>
</td>
<td class="c3" >
35
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2467-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
54
</td>
<td class="s"> if ($flags =~ /n/) { </td>
</tr>
<tr>
<td class="h" >
<a name="2468">2468</a>
</td>
<td class="c0" >
<a href="#2469">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2468-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $track = $self->track1 or return; </td>
</tr>
<tr>
<td class="h" >
<a name="2469">2469</a>
</td>
<td class="c0" >
<a href="#2555">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> @data = $data[$track - 1]; </td>
</tr>
<tr>
<td class="h" >
<a name="2470">2470</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2471">2471</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
41
</td>
<td class="s"> for my $d (@data) { </td>
</tr>
<tr>
<td class="h" >
<a name="2472">2472</a>
</td>
<td class="c3" >
35
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2472-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
60
</td>
<td class="s"> $d = $self->interpolate($d) if $flags =~ /I/; </td>
</tr>
<tr>
<td class="h" >
<a name="2473">2473</a>
</td>
<td class="c3" >
35
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2473-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
54
</td>
<td class="s"> unless ($flags =~ /b/) { </td>
</tr>
<tr>
<td class="h" >
<a name="2474">2474</a>
</td>
<td class="c3" >
34
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
41
</td>
<td class="s"> $d =~ s/^\s+//; </td>
</tr>
<tr>
<td class="h" >
<a name="2475">2475</a>
</td>
<td class="c3" >
34
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
60
</td>
<td class="s"> $d =~ s/\s+$//; </td>
</tr>
<tr>
<td class="h" >
<a name="2476">2476</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2477">2477</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2478">2478</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
94
</td>
<td class="s"> @data; </td>
</tr>
<tr>
<td class="h" >
<a name="2479">2479</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2480">2480</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2481">2481</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item parse_rex($pattern, $string) </td>
</tr>
<tr>
<td class="h" >
<a name="2482">2482</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2483">2483</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Parse $string according to the regular expression $pattern with </td>
</tr>
<tr>
<td class="h" >
<a name="2484">2484</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<%>-escapes C<%%, %a, %t, %l, %y, %g, %c, %n, %e, %E> etc. The meaning </td>
</tr>
<tr>
<td class="h" >
<a name="2485">2485</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> of escapes is the same as for method L<"interpolate">(); but (with </td>
</tr>
<tr>
<td class="h" >
<a name="2486">2486</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the exception of C<%%>) they are </td>
</tr>
<tr>
<td class="h" >
<a name="2487">2487</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> used not for I<expansion>, but for I<matching> a part of $string </td>
</tr>
<tr>
<td class="h" >
<a name="2488">2488</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> suitable to be a value for these fields. Returns false on failure, a </td>
</tr>
<tr>
<td class="h" >
<a name="2489">2489</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> hash reference with parsed fields otherwise (with C<%a> setting the </td>
</tr>
<tr>
<td class="h" >
<a name="2490">2490</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> field C<author>, etc). </td>
</tr>
<tr>
<td class="h" >
<a name="2491">2491</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2492">2492</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Some more escapes are supported: C<%=a, %=t, %=l, %=y, %=g, %=c, %=n, %=e, </td>
</tr>
<tr>
<td class="h" >
<a name="2493">2493</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> %=E, %=A, %=B, %=D, %=f, %=F, %=N, %={WHATEVER}> I<match> </td>
</tr>
<tr>
<td class="h" >
<a name="2494">2494</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> substrings which are I<current> values of artist/title/etc (C<%=n> also </td>
</tr>
<tr>
<td class="h" >
<a name="2495">2495</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> matches leading 0s; actual file-name matches ignore the difference </td>
</tr>
<tr>
<td class="h" >
<a name="2496">2496</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> between C</> and C<\>, between one and multiple consequent dots (if </td>
</tr>
<tr>
<td class="h" >
<a name="2497">2497</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> configuration variable C<parse_filename_merge_dots> is true (default)) </td>
</tr>
<tr>
<td class="h" >
<a name="2498">2498</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and are case-insensitive if configuration variable </td>
</tr>
<tr>
<td class="h" >
<a name="2499">2499</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<parse_filename_ignore_case> is true (default); moreover, C<%n>, </td>
</tr>
<tr>
<td class="h" >
<a name="2500">2500</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<%y>, C<%=n>, C<%=y> will not match if the string-to-match is </td>
</tr>
<tr>
<td class="h" >
<a name="2501">2501</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> adjacent to a digit). Double C<=> if you want to match to fail when </td>
</tr>
<tr>
<td class="h" >
<a name="2502">2502</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the corresponding conditional C<%>-escape would fail (a missing field, </td>
</tr>
<tr>
<td class="h" >
<a name="2503">2503</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> or a zero-length field for required fields). </td>
</tr>
<tr>
<td class="h" >
<a name="2504">2504</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2505">2505</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The escapes C<%{UE<lt>numberE<gt>}> and escapes of the forms </td>
</tr>
<tr>
<td class="h" >
<a name="2506">2506</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<%{ABCD}> match any string; the </td>
</tr>
<tr>
<td class="h" >
<a name="2507">2507</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> corresponding hash key in the result hash is what is inside braces; </td>
</tr>
<tr>
<td class="h" >
<a name="2508">2508</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> here C<ABCD> is a 4-letter word possibly followed by 2-digit number </td>
</tr>
<tr>
<td class="h" >
<a name="2509">2509</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (as in names of ID3v2 tags), or what can be put in </td>
</tr>
<tr>
<td class="h" >
<a name="2510">2510</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<'%{FRAM(lang,list)[description]}'>. </td>
</tr>
<tr>
<td class="h" >
<a name="2511">2511</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2512">2512</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $res = $mp3->parse_rex( qr<^%a - %t\.\w{1,4}$>, </td>
</tr>
<tr>
<td class="h" >
<a name="2513">2513</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->filename_nodir ) or die; </td>
</tr>
<tr>
<td class="h" >
<a name="2514">2514</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $author = $res->{author}; </td>
</tr>
<tr>
<td class="h" >
<a name="2515">2515</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2516">2516</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> 2-digit numbers, or I<number1/number2> with number1,2 up to 999 are </td>
</tr>
<tr>
<td class="h" >
<a name="2517">2517</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> allowed for the track number (the leading 0 is stripped); 4-digit </td>
</tr>
<tr>
<td class="h" >
<a name="2518">2518</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> years in the range 1000..2999 are allowed for year. Alternatively, if </td>
</tr>
<tr>
<td class="h" >
<a name="2519">2519</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> option year_is_timestamp is TRUE (default), year may be a range of </td>
</tr>
<tr>
<td class="h" >
<a name="2520">2520</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> timestamps in the format understood by ID3v2 method year() (see </td>
</tr>
<tr>
<td class="h" >
<a name="2521">2521</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tag::ID3v2/"year">). </td>
</tr>
<tr>
<td class="h" >
<a name="2522">2522</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2523">2523</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The escape C<%E> matches the REx in the configuration variable C<extension>; </td>
</tr>
<tr>
<td class="h" >
<a name="2524">2524</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the escape C<%e> matches the part of %E after the leading dot. </td>
</tr>
<tr>
<td class="h" >
<a name="2525">2525</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2526">2526</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> In list context, also returns an array reference with %{handler} groups </td>
</tr>
<tr>
<td class="h" >
<a name="2527">2527</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> parsed (if present). Such groups can match everything, and a successful match gives an </td>
</tr>
<tr>
<td class="h" >
<a name="2528">2528</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> array element with C<[$method, $packages, $args, $matched]>. </td>
</tr>
<tr>
<td class="h" >
<a name="2529">2529</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2530">2530</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Currently the regular expressions with capturing parens are not supported. </td>
</tr>
<tr>
<td class="h" >
<a name="2531">2531</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2532">2532</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item parse_rex_prepare($pattern) </td>
</tr>
<tr>
<td class="h" >
<a name="2533">2533</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2534">2534</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns a data structure which later can be used by parse_rex_match(). </td>
</tr>
<tr>
<td class="h" >
<a name="2535">2535</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> These two are equivalent: </td>
</tr>
<tr>
<td class="h" >
<a name="2536">2536</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2537">2537</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->parse_rex($pattern, $data); </td>
</tr>
<tr>
<td class="h" >
<a name="2538">2538</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->parse_rex_match($mp3->parse_rex_prepare($pattern), $data); </td>
</tr>
<tr>
<td class="h" >
<a name="2539">2539</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2540">2540</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> This call constitutes the "slow part" of the parse_rex() call; it makes sense to </td>
</tr>
<tr>
<td class="h" >
<a name="2541">2541</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> factor out this step if the parse_rex() with the same $pattern is called </td>
</tr>
<tr>
<td class="h" >
<a name="2542">2542</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> against multiple $data. </td>
</tr>
<tr>
<td class="h" >
<a name="2543">2543</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2544">2544</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item parse_rex_match($prepared, $data) </td>
</tr>
<tr>
<td class="h" >
<a name="2545">2545</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2546">2546</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Matches $data against a data structure returned by parse_rex_prepare(). </td>
</tr>
<tr>
<td class="h" >
<a name="2547">2547</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> These two are equivalent: </td>
</tr>
<tr>
<td class="h" >
<a name="2548">2548</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2549">2549</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->parse_rex($pattern, $data); </td>
</tr>
<tr>
<td class="h" >
<a name="2550">2550</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->parse_rex_match($mp3->parse_rex_prepare($pattern), $data); </td>
</tr>
<tr>
<td class="h" >
<a name="2551">2551</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2552">2552</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="2553">2553</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2554">2554</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _rex_protect_filename { </td>
</tr>
<tr>
<td class="h" >
<a name="2555">2555</a>
</td>
<td class="c0" >
<a href="#2556">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2555-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self, $filename, $what) = (shift, quotemeta shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="2556">2556</a>
</td>
<td class="c0" >
<a href="#2557">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $filename =~ s,\\[\\/],[\\\\/],g; # \ and / are interchangeable + backslashitis </td>
</tr>
<tr>
<td class="h" >
<a name="2557">2557</a>
</td>
<td class="c0" >
<a href="#2559">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2557-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> if ($self->get_config('parse_filename_merge_dots')->[0]) { </td>
</tr>
<tr>
<td class="h" >
<a name="2558">2558</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # HPFS doesn't distinguish x..y and x.y </td>
</tr>
<tr>
<td class="h" >
<a name="2559">2559</a>
</td>
<td class="c0" >
<a href="#2560">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $filename =~ s(\\\.+)(\\.+)g; </td>
</tr>
<tr>
<td class="h" >
<a name="2560">2560</a>
</td>
<td class="c0" >
<a href="#2562">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2560-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $filename =~ s($)(\\.*) if $what =~ /[ABN]/; </td>
</tr>
<tr>
<td class="h" >
<a name="2561">2561</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2562">2562</a>
</td>
<td class="c0" >
<a href="#2563">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $case = $self->get_config('parse_filename_ignore_case')->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2563">2563</a>
</td>
<td class="c0" >
<a href="#2564">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2563-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return $filename unless $case; </td>
</tr>
<tr>
<td class="h" >
<a name="2564">2564</a>
</td>
<td class="c0" >
<a href="#2571">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return "(?i:$filename)"; </td>
</tr>
<tr>
<td class="h" >
<a name="2565">2565</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2566">2566</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2567">2567</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _parse_rex_anything ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="2568">2568</a>
</td>
<td class="c3" >
42
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2568-1">
42
</a>
</td>
<td >
</td>
<td >
57
</td>
<td class="s"> my $c = shift->get_config('parse_minmatch'); </td>
</tr>
<tr>
<td class="h" >
<a name="2569">2569</a>
</td>
<td class="c3" >
42
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
43
</td>
<td class="s"> my $min = $c->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2570">2570</a>
</td>
<td class="c3" >
42
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2570-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2570-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
72
</td>
<td class="s"> if ($min and $min ne '1') { </td>
</tr>
<tr>
<td class="h" >
<a name="2571">2571</a>
</td>
<td class="c0" >
<a href="#2572">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $field = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2572">2572</a>
</td>
<td class="c0" >
<a href="#2578">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $min = grep $_ eq $field, @$c; </td>
</tr>
<tr>
<td class="h" >
<a name="2573">2573</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2574">2574</a>
</td>
<td class="c3" >
42
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2574-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
151
</td>
<td class="s"> return $min ? '(.*?)' : '(.*)'; </td>
</tr>
<tr>
<td class="h" >
<a name="2575">2575</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2576">2576</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2577">2577</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub __pure_track_rex ($) { </td>
</tr>
<tr>
<td class="h" >
<a name="2578">2578</a>
</td>
<td class="c0" >
<a href="#2579">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2578-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $t = shift()->track; </td>
</tr>
<tr>
<td class="h" >
<a name="2579">2579</a>
</td>
<td class="c0" >
<a href="#2580">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $t =~ s/^0+//; </td>
</tr>
<tr>
<td class="h" >
<a name="2580">2580</a>
</td>
<td class="c0" >
<a href="#2581">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $t =~ s,^(.*?)(/.*),\Q$1\E(?:\Q$2\E)?,; </td>
</tr>
<tr>
<td class="h" >
<a name="2581">2581</a>
</td>
<td class="c0" >
<a href="#2587">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $t </td>
</tr>
<tr>
<td class="h" >
<a name="2582">2582</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2583">2583</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2584">2584</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _parse_rex_microinterpolate ($$$;$) { # $self->idem($code, $groups, $have_non_trivial__not_group) </td>
</tr>
<tr>
<td class="h" >
<a name="2585">2585</a>
</td>
<td class="c3" >
47
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2585-1">
47
</a>
</td>
<td >
</td>
<td >
61
</td>
<td class="s"> my ($self, $code, $groups) = (shift, shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="2586">2586</a>
</td>
<td class="c3" >
47
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2586-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
66
</td>
<td class="s"> if ($_[1]) { # handler </td>
</tr>
<tr>
<td class="h" >
<a name="2587">2587</a>
</td>
<td class="c0" >
<a href="#2589">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2587-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($check, $fail, $id) = ($code =~ /^(=(=)?)?(\w+)/) or die "Panic: <<$code>>"; </td>
</tr>
<tr>
<td class="h" >
<a name="2588">2588</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # die "Setting via handler not suppored, handler=<<<$id>>>" unless $check; </td>
</tr>
<tr>
<td class="h" >
<a name="2589">2589</a>
</td>
<td class="c0" >
<a href="#2590">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2589-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> (push @$groups, [$id, $_[1], $_[2]]), return $self->_parse_rex_anything($code) unless $check; </td>
</tr>
<tr>
<td class="h" >
<a name="2590">2590</a>
</td>
<td class="c0" >
<a href="#2591">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2590-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2590-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return '(?!)' if $fail and not (my($o) = $self->process_handlers($id, $_[1], $_[2])); </td>
</tr>
<tr>
<td class="h" >
<a name="2591">2591</a>
</td>
<td class="c0" >
<a href="#2592">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2591-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $o = '' unless defined $o; </td>
</tr>
<tr>
<td class="h" >
<a name="2592">2592</a>
</td>
<td class="c0" >
<a href="#2622">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $_[0]++, return quotemeta $o; </td>
</tr>
<tr>
<td class="h" >
<a name="2593">2593</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2594">2594</a>
</td>
<td class="c3" >
47
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2594-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
66
</td>
<td class="s"> $_[0]++, return '%' if $code eq '%'; </td>
</tr>
<tr>
<td class="h" >
<a name="2595">2595</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # In these two, allow setting to '', and to 123/789 too... </td>
</tr>
<tr>
<td class="h" >
<a name="2596">2596</a>
</td>
<td class="c3" >
47
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2596-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
71
</td>
<td class="s"> push(@$groups, $code), return '((?<!\d)\d{1,3}(?:/\d{1,3})?(?!\d)|\A\Z)' if $code eq 'n'; </td>
</tr>
<tr>
<td class="h" >
<a name="2597">2597</a>
</td>
<td class="c3" >
46
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2597-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2597-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
61
</td>
<td class="s"> (push @$groups, $code), return '((?<!\d)[12]\d{3}(?:(?:--|[-:/T\0,])\d(?:|\d|\d\d\d))*(?!\d)|\A\Z)' </td>
</tr>
<tr>
<td class="h" >
<a name="2598">2598</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $code eq 'y' and ($self->get_config('year_is_timestamp'))->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2599">2599</a>
</td>
<td class="c3" >
46
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2599-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
64
</td>
<td class="s"> (push @$groups, $code), return '((?<!\d)[12]\d{3}(?!\d)|\A\Z)' </td>
</tr>
<tr>
<td class="h" >
<a name="2600">2600</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $code eq 'y'; </td>
</tr>
<tr>
<td class="h" >
<a name="2601">2601</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Filename parts ABDfFN and vLrqQSmsCpouMH not settable... </td>
</tr>
<tr>
<td class="h" >
<a name="2602">2602</a>
</td>
<td class="c3" >
46
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2602-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
110
</td>
<td class="s"> (push @$groups, $code), return $self->_parse_rex_anything($code) </td>
</tr>
<tr>
<td class="h" >
<a name="2603">2603</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $code =~ /^[talgc]$/; </td>
</tr>
<tr>
<td class="h" >
<a name="2604">2604</a>
</td>
<td class="c3" >
28
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2604-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
49
</td>
<td class="s"> $_[0]++, return $self->_rex_protect_filename($self->interpolate("%$1"), $1) </td>
</tr>
<tr>
<td class="h" >
<a name="2605">2605</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $code =~ /^=([ABDfFN]|\{d\d+\})$/; </td>
</tr>
<tr>
<td class="h" >
<a name="2606">2606</a>
</td>
<td class="c3" >
28
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2606-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
50
</td>
<td class="s"> $_[0]++, return quotemeta($self->interpolate("%$1")) </td>
</tr>
<tr>
<td class="h" >
<a name="2607">2607</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $code =~ /^=([talgceEwhvLrqQSmsCpouMH]|\{.*\})$/; </td>
</tr>
<tr>
<td class="h" >
<a name="2608">2608</a>
</td>
<td class="c3" >
26
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2608-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
44
</td>
<td class="s"> $_[0]++, return $self->interpolate("%{$+:1}") ? quotemeta($self->interpolate("%$1")) : '(?!)' </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2609">2609</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $code =~ /^==(([talgcynfFeEABDNvLrqQSmsCpouMHwh])|\{(.*)\})$/; </td>
</tr>
<tr>
<td class="h" >
<a name="2610">2610</a>
</td>
<td class="c3" >
26
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2610-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
33
</td>
<td class="s"> $_[0]++, return '(?<!\d)0*' . $self->__pure_track_rex . '(?!\d)' </td>
</tr>
<tr>
<td class="h" >
<a name="2611">2611</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $code eq '=n'; </td>
</tr>
<tr>
<td class="h" >
<a name="2612">2612</a>
</td>
<td class="c3" >
26
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2612-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
38
</td>
<td class="s"> $_[0]++, return '(?<!\d)' . quotemeta($self->year) . '(?!\d)' </td>
</tr>
<tr>
<td class="h" >
<a name="2613">2613</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $code eq '=y'; </td>
</tr>
<tr>
<td class="h" >
<a name="2614">2614</a>
</td>
<td class="c3" >
26
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2614-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
144
</td>
<td class="s"> (push @$groups, $1), return $self->_parse_rex_anything() </td>
</tr>
<tr>
<td class="h" >
<a name="2615">2615</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if $code =~ /^\{(U\d+|\w{4}(\d\d+|(?:\([^\)]*\))?(?:\[.*\])?)?)\}$/s; </td>
</tr>
<tr>
<td class="h" >
<a name="2616">2616</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # What remains is extension </td>
</tr>
<tr>
<td class="h" >
<a name="2617">2617</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
5
</td>
<td class="s"> my $e = $self->get_config('extension')->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2618">2618</a>
</td>
<td class="c3" >
2
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2618-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
11
</td>
<td class="s"> (push @$groups, $code), return "($e)" if $code eq 'E'; </td>
</tr>
<tr>
<td class="h" >
<a name="2619">2619</a>
</td>
<td class="c3" >
1
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2619-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
7
</td>
<td class="s"> (push @$groups, $code), return "(?<=(?=(?:$e)\$)\\.)(.*)" if $code eq 'e'; </td>
</tr>
<tr>
<td class="h" >
<a name="2620">2620</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Check whether '=' was omitted, as in %f </td>
</tr>
<tr>
<td class="h" >
<a name="2621">2621</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $code =~ /^=/ or </td>
</tr>
<tr>
<td class="h" >
<a name="2622">2622</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2622-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2622-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> eval {my ($a, $b); $self->_parse_rex_microinterpolate("=$code", $a, $b)} </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#2624">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2623">2623</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and die "escape `%$code' can't be parsed; did you forget to put `='?"; </td>
</tr>
<tr>
<td class="h" >
<a name="2624">2624</a>
</td>
<td class="c0" >
<a href="#2653">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> die "unknown escape `%$code'"; </td>
</tr>
<tr>
<td class="h" >
<a name="2625">2625</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2626">2626</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2627">2627</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _parse_rex_prepare ($$$) { </td>
</tr>
<tr>
<td class="h" >
<a name="2628">2628</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2628-1">
35
</a>
</td>
<td >
</td>
<td >
41
</td>
<td class="s"> my ($self, $is_rex, $pattern) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="2629">2629</a>
</td>
<td class="c3" >
35
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2629-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
70
</td>
<td class="s"> my ($codes, $exact, $p) = ([], 0, ($is_rex ? '' : '^')); </td>
</tr>
<tr>
<td class="h" >
<a name="2630">2630</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
32
</td>
<td class="s"> my $o = $pattern; </td>
</tr>
<tr>
<td class="h" >
<a name="2631">2631</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # (=? is correct! Groups 4(descr), 5(have_bra) are inside $frame_bra </td>
</tr>
<tr>
<td class="h" >
<a name="2632">2632</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
436
</td>
<td class="s"> while ($pattern =~ s< ^ ( [^%]+ ) # 1: no %-escapes </td>
</tr>
<tr>
<td class="h" >
<a name="2633">2633</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> | % ( ={0,2} \{ # 2: %-group (beg-of-{FRAME}, or full {non-frame}), or single-letter </td>
</tr>
<tr>
<td class="h" >
<a name="2634">2634</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (?: ($frame_bra) # 3: beg-FRAME (up to leading [, if present) </td>
</tr>
<tr>
<td class="h" >
<a name="2635">2635</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> | [^}]+ \} # or full non-frame </td>
</tr>
<tr>
<td class="h" >
<a name="2636">2636</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ) </td>
</tr>
<tr>
<td class="h" >
<a name="2637">2637</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> | =? . # or single letter </td>
</tr>
<tr>
<td class="h" >
<a name="2638">2638</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ) </td>
</tr>
<tr>
<td class="h" >
<a name="2639">2639</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ><>sox) { </td>
</tr>
<tr>
<td class="h" >
<a name="2640">2640</a>
</td>
<td class="c3" >
58
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2640-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
110
</td>
<td class="s"> if (defined $1) { </td>
</tr>
<tr>
<td class="h" >
<a name="2641">2641</a>
</td>
<td class="c3" >
11
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2641-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
41
</td>
<td class="s"> $p .= ($is_rex ? $1 : quotemeta $1); </td>
</tr>
<tr>
<td class="h" >
<a name="2642">2642</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="2643">2643</a>
</td>
<td class="c3" >
47
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
58
</td>
<td class="s"> my $group = $2; </td>
</tr>
<tr>
<td class="h" >
<a name="2644">2644</a>
</td>
<td class="c3" >
47
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2644-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
81
</td>
<td class="s"> if ($3) { </td>
</tr>
<tr>
<td class="h" >
<a name="2645">2645</a>
</td>
<td class="c3" >
23
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
41
</td>
<td class="s"> my ($id, $langs_or_packs, $have_bra) = ($3, $4, $5); </td>
</tr>
<tr>
<td class="h" >
<a name="2646">2646</a>
</td>
<td class="c3" >
23
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2646-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
90
</td>
<td class="s"> my(@_handlers, @args) = split /,/, ($4 || ''); </td>
</tr>
<tr>
<td class="h" >
<a name="2647">2647</a>
</td>
<td class="c3" >
23
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
31
</td>
<td class="s"> my @handlers = grep $handlers{$_}, @_handlers; </td>
</tr>
<tr>
<td class="h" >
<a name="2648">2648</a>
</td>
<td class="c3" >
23
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2648-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2648-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
67
</td>
<td class="s"> $id =~ /^[A-Z]{3}[A-Z\d](\d\d)?\b/ or @handlers and @handlers == @_handlers </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2649">2649</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> or die "Cannot parse frame descriptor: <<<$id>>>"; </td>
</tr>
<tr>
<td class="h" >
<a name="2650">2650</a>
</td>
<td class="c3" >
23
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2650-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
61
</td>
<td class="s"> my ($meth) = ($id =~ /^(\w+)/) or die "Panic: meth"; </td>
</tr>
<tr>
<td class="h" >
<a name="2651">2651</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2652">2652</a>
</td>
<td class="c3" >
23
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2652-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
55
</td>
<td class="s"> while (@handlers and $have_bra) { # process []-arguments of a handler ($group is not terminated!) </td>
</tr>
<tr>
<td class="h" >
<a name="2653">2653</a>
</td>
<td class="c0" >
<a href="#2654">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> push @args, $self->_interpolate($_[1], ']', !'skip'); </td>
</tr>
<tr>
<td class="h" >
<a name="2654">2654</a>
</td>
<td class="c0" >
<a href="#2706">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $have_bra = ($_[1] =~ s/^\[//); </td>
</tr>
<tr>
<td class="h" >
<a name="2655">2655</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } # append []-arguments of a frame: </td>
</tr>
<tr>
<td class="h" >
<a name="2656">2656</a>
</td>
<td class="c3" >
23
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2656-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
60
</td>
<td class="s"> $group .= ($self->_interpolate($pattern, ']') . ']') if $have_bra; </td>
</tr>
<tr>
<td class="h" >
<a name="2657">2657</a>
</td>
<td class="c3" >
23
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2657-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
55
</td>
<td class="s"> $pattern =~ s/^}// or die "Can't find end of frame name, I see `$p'"; </td>
</tr>
<tr>
<td class="h" >
<a name="2658">2658</a>
</td>
<td class="c3" >
23
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2658-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
36
</td>
<td class="s"> $p .= $self->_parse_rex_microinterpolate($group, $codes, $exact, \@handlers, \@args), next if @handlers; </td>
</tr>
<tr>
<td class="h" >
<a name="2659">2659</a>
</td>
<td class="c3" >
23
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
30
</td>
<td class="s"> $group .= '}'; </td>
</tr>
<tr>
<td class="h" >
<a name="2660">2660</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2661">2661</a>
</td>
<td class="c3" >
47
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
92
</td>
<td class="s"> $p .= $self->_parse_rex_microinterpolate($group, $codes, $exact); </td>
</tr>
<tr>
<td class="h" >
<a name="2662">2662</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2663">2663</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2664">2664</a>
</td>
<td class="c3" >
35
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2664-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
50
</td>
<td class="s"> $p .= '$' unless $is_rex; </td>
</tr>
<tr>
<td class="h" >
<a name="2665">2665</a>
</td>
<td class="c3" >
35
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2665-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
60
</td>
<td class="s"> die "Can't parse pattern, I see `$pattern'" if length $pattern; </td>
</tr>
<tr>
<td class="h" >
<a name="2666">2666</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> #$pattern =~ s<%(=?{(?:[^\\{}]|\\[\\{}])*}|{U\d+}|=?.)> # (=? is correct! </td>
</tr>
<tr>
<td class="h" >
<a name="2667">2667</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # ( $self->_parse_rex_microinterpolate($1, $codes, $exact) )seg; </td>
</tr>
<tr>
<td class="h" >
<a name="2668">2668</a>
</td>
<td class="c3" >
35
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2668-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2668-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
42
</td>
<td class="s"> my @tags = map { (not ref and length == 1) ? $trans{$_} : $_ } @$codes; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
45
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
210
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2669">2669</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
163
</td>
<td class="s"> return [$o, $p, \@tags, $exact]; </td>
</tr>
<tr>
<td class="h" >
<a name="2670">2670</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2671">2671</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2672">2672</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub parse_rex_prepare ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="2673">2673</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2673-1">
2
</a>
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> my ($self) = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2674">2674</a>
</td>
<td class="c3" >
2
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
5
</td>
<td class="s"> $self->_parse_rex_prepare('REx', @_) </td>
</tr>
<tr>
<td class="h" >
<a name="2675">2675</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2676">2676</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2677">2677</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub parse_prepare ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="2678">2678</a>
</td>
<td class="c3" >
33
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2678-1">
33
</a>
</td>
<td >
</td>
<td >
34
</td>
<td class="s"> my ($self) = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2679">2679</a>
</td>
<td class="c3" >
33
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
67
</td>
<td class="s"> $self->_parse_rex_prepare(!'REx', @_) </td>
</tr>
<tr>
<td class="h" >
<a name="2680">2680</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2681">2681</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2682">2682</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub parse_rex_match { # pattern = [Original, Interpolated, Fields, NumExact] </td>
</tr>
<tr>
<td class="h" >
<a name="2683">2683</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2683-1">
35
</a>
</td>
<td >
</td>
<td >
36
</td>
<td class="s"> my ($self, $pattern, $data) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="2684">2684</a>
</td>
<td class="c3" >
35
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2684-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2684-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
31
</td>
<td class="s"> return unless @{$pattern->[2]} or $pattern->[3]; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
64
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2685">2685</a>
</td>
<td class="c3" >
35
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2685-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
412
</td>
<td class="s"> my @vals = ($data =~ /$pattern->[1]()/s) or return; # At least 1 group </td>
</tr>
<tr>
<td class="h" >
<a name="2686">2686</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
50
</td>
<td class="s"> my $cv = @vals - 1; </td>
</tr>
<tr>
<td class="h" >
<a name="2687">2687</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die "Unsupported %-regular expression `$pattern->[0]' (catching parens? Got $cv vals) (converted to `$pattern->[1]')" </td>
</tr>
<tr>
<td class="h" >
<a name="2688">2688</a>
</td>
<td class="c3" >
35
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2688-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
32
</td>
<td class="s"> unless $cv == @{$pattern->[2]}; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
60
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2689">2689</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
59
</td>
<td class="s"> my ($c, %h, @a) = 0; </td>
</tr>
<tr>
<td class="h" >
<a name="2690">2690</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
24
</td>
<td class="s"> for my $k ( @{$pattern->[2]} ) { </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
55
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2691">2691</a>
</td>
<td class="c3" >
45
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2691-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
76
</td>
<td class="s"> next unless defined (my $v = $vals[$c++]); </td>
</tr>
<tr>
<td class="h" >
<a name="2692">2692</a>
</td>
<td class="c3" >
45
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2692-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
56
</td>
<td class="s"> push(@a, [@$k, $v]), next if ref $k; </td>
</tr>
<tr>
<td class="h" >
<a name="2693">2693</a>
</td>
<td class="c3" >
45
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2693-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
157
</td>
<td class="s"> $h{$k} ||= []; </td>
</tr>
<tr>
<td class="h" >
<a name="2694">2694</a>
</td>
<td class="c3" >
45
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
31
</td>
<td class="s"> push @{ $h{$k} }, $v; # Support multiple occurences </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
45
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
89
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2695">2695</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2696">2696</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
63
</td>
<td class="s"> my $j = $self->get_config('parse_join')->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2697">2697</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
72
</td>
<td class="s"> for $c (keys %h) { </td>
</tr>
<tr>
<td class="h" >
<a name="2698">2698</a>
</td>
<td class="c3" >
42
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
25
</td>
<td class="s"> $h{$c} = join $j, grep length, @{ $h{$c} }; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
42
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
142
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2699">2699</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2700">2700</a>
</td>
<td class="c3" >
35
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2700-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
64
</td>
<td class="s"> $h{track} =~ s/^0+(?=\d)// if exists $h{track}; </td>
</tr>
<tr>
<td class="h" >
<a name="2701">2701</a>
</td>
<td class="c3" >
35
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2701-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2701-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
75
</td>
<td class="s"> return \%h, \@a if wantarray and @a; </td>
</tr>
<tr>
<td class="h" >
<a name="2702">2702</a>
</td>
<td class="c3" >
35
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
134
</td>
<td class="s"> return \%h; </td>
</tr>
<tr>
<td class="h" >
<a name="2703">2703</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2704">2704</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2705">2705</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub parse_rex { </td>
</tr>
<tr>
<td class="h" >
<a name="2706">2706</a>
</td>
<td class="c0" >
<a href="#2707">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2706-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self, $pattern, $data) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="2707">2707</a>
</td>
<td class="c0" >
<a href="#2740">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->parse_rex_match($self->parse_rex_prepare($pattern), $data); </td>
</tr>
<tr>
<td class="h" >
<a name="2708">2708</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2709">2709</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2710">2710</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item parse($pattern, $string) </td>
</tr>
<tr>
<td class="h" >
<a name="2711">2711</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2712">2712</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Parse $string according to the string $pattern with C<%>-escapes C<%%, </td>
</tr>
<tr>
<td class="h" >
<a name="2713">2713</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> %a, %t, %l, %y, %g, %c, %n, %e, %E>. The meaning of escapes is the </td>
</tr>
<tr>
<td class="h" >
<a name="2714">2714</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> same as for L<"interpolate">. See L<"parse_rex($pattern, $string)"> </td>
</tr>
<tr>
<td class="h" >
<a name="2715">2715</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for more details. Returns false on failure, a hash reference with </td>
</tr>
<tr>
<td class="h" >
<a name="2716">2716</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> parsed fields otherwise. </td>
</tr>
<tr>
<td class="h" >
<a name="2717">2717</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2718">2718</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $res = $mp3->parse("%a - %t.mp3", $mp3->filename_nodir) or die; </td>
</tr>
<tr>
<td class="h" >
<a name="2719">2719</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $author = $res->{author}; </td>
</tr>
<tr>
<td class="h" >
<a name="2720">2720</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2721">2721</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> 2-digit numbers are allowed for the track number; 4-digit years in the range </td>
</tr>
<tr>
<td class="h" >
<a name="2722">2722</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> 1000..2999 are allowed for year. </td>
</tr>
<tr>
<td class="h" >
<a name="2723">2723</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2724">2724</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item parse_prepare($pattern) </td>
</tr>
<tr>
<td class="h" >
<a name="2725">2725</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2726">2726</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Returns a data structure which later can be used by parse_rex_match(). </td>
</tr>
<tr>
<td class="h" >
<a name="2727">2727</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> This is a counterpart of parse_rex_prepare() used with non-regular-expression </td>
</tr>
<tr>
<td class="h" >
<a name="2728">2728</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> patterns. These two are equivalent: </td>
</tr>
<tr>
<td class="h" >
<a name="2729">2729</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2730">2730</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->parse($pattern, $data); </td>
</tr>
<tr>
<td class="h" >
<a name="2731">2731</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->parse_rex_match($mp3->parse_prepare($pattern), $data); </td>
</tr>
<tr>
<td class="h" >
<a name="2732">2732</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2733">2733</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> This call constitutes the "slow part" of the parse() call; it makes sense to </td>
</tr>
<tr>
<td class="h" >
<a name="2734">2734</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> factor out this step if the parse() with the same $pattern is called </td>
</tr>
<tr>
<td class="h" >
<a name="2735">2735</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> against multiple $data. </td>
</tr>
<tr>
<td class="h" >
<a name="2736">2736</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2737">2737</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="2738">2738</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2739">2739</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> #my %unquote = ('\\%' => '%', '\\%\\=' => '%='); </td>
</tr>
<tr>
<td class="h" >
<a name="2740">2740</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2740-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> sub __unquote ($) { (my $k = shift) =~ s/\\(\W)/$1/g; $k } </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#2743">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2741">2741</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2742">2742</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub __parse_prepare { # obsolete parse_prepare </td>
</tr>
<tr>
<td class="h" >
<a name="2743">2743</a>
</td>
<td class="c0" >
<a href="#2744">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2743-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my ($self, $pattern) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="2744">2744</a>
</td>
<td class="c0" >
<a href="#2746">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $pattern = "^\Q$pattern\E\$"; </td>
</tr>
<tr>
<td class="h" >
<a name="2745">2745</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # unquote %. and %=. and %={WHATEVER} and %{WHATEVER}; look for quoted \w or [^\w\\{}] or \[\\{}] </td>
</tr>
<tr>
<td class="h" >
<a name="2746">2746</a>
</td>
<td class="c0" >
<a href="#2747">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $pattern =~ s<(\\%(?:\\=){0,2}(\w|\\\{(?:\w|\\[^\w\\{}]|\\\\\\[\\{}])*\\\}|\\[^\w=\{]))> </td>
</tr>
<tr>
<td class="h" >
<a name="2747">2747</a>
</td>
<td class="c0" >
<a href="#2749">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> ( __unquote($1) )ge; </td>
</tr>
<tr>
<td class="h" >
<a name="2748">2748</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $pattern =~ s/(\\%(?:\\=)?)(\w|\\(\W))/$unquote{$1}$+/g; </td>
</tr>
<tr>
<td class="h" >
<a name="2749">2749</a>
</td>
<td class="c0" >
<a href="#2808">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return $self->parse_rex_prepare($pattern); </td>
</tr>
<tr>
<td class="h" >
<a name="2750">2750</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2751">2751</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2752">2752</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub parse { </td>
</tr>
<tr>
<td class="h" >
<a name="2753">2753</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2753-1">
5
</a>
</td>
<td >
</td>
<td >
14
</td>
<td class="s"> my ($self, $pattern, $data) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="2754">2754</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
19
</td>
<td class="s"> $self->parse_rex_match($self->parse_prepare($pattern), $data); </td>
</tr>
<tr>
<td class="h" >
<a name="2755">2755</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2756">2756</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2757">2757</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item filename() </td>
</tr>
<tr>
<td class="h" >
<a name="2758">2758</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2759">2759</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item abs_filename() </td>
</tr>
<tr>
<td class="h" >
<a name="2760">2760</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2761">2761</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item filename_nodir() </td>
</tr>
<tr>
<td class="h" >
<a name="2762">2762</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2763">2763</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item filename_noextension() </td>
</tr>
<tr>
<td class="h" >
<a name="2764">2764</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2765">2765</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item filename_nodir_noextension() </td>
</tr>
<tr>
<td class="h" >
<a name="2766">2766</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2767">2767</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item abs_filename_noextension() </td>
</tr>
<tr>
<td class="h" >
<a name="2768">2768</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2769">2769</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item dirname([$strip_levels]) </td>
</tr>
<tr>
<td class="h" >
<a name="2770">2770</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2771">2771</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item filename_extension() </td>
</tr>
<tr>
<td class="h" >
<a name="2772">2772</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2773">2773</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item filename_extension_nodot() </td>
</tr>
<tr>
<td class="h" >
<a name="2774">2774</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2775">2775</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item dir_component([$level]) </td>
</tr>
<tr>
<td class="h" >
<a name="2776">2776</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2777">2777</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $filename = $mp3->filename(); </td>
</tr>
<tr>
<td class="h" >
<a name="2778">2778</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $abs_filename = $mp3->abs_filename(); </td>
</tr>
<tr>
<td class="h" >
<a name="2779">2779</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $filename_nodir = $mp3->filename_nodir(); </td>
</tr>
<tr>
<td class="h" >
<a name="2780">2780</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $abs_dirname = $mp3->dirname(); </td>
</tr>
<tr>
<td class="h" >
<a name="2781">2781</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $abs_dirname = $mp3->dirname(0); </td>
</tr>
<tr>
<td class="h" >
<a name="2782">2782</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $abs_parentdir = $mp3->dirname(1); </td>
</tr>
<tr>
<td class="h" >
<a name="2783">2783</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $last_dir_component = $mp3->dir_component(0); </td>
</tr>
<tr>
<td class="h" >
<a name="2784">2784</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2785">2785</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Return the name of the audio file: either as given to the new() method, or </td>
</tr>
<tr>
<td class="h" >
<a name="2786">2786</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> absolute, or directory-less, or originally given without extension, or </td>
</tr>
<tr>
<td class="h" >
<a name="2787">2787</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> directory-less without extension, or </td>
</tr>
<tr>
<td class="h" >
<a name="2788">2788</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> absolute without extension, or the directory part of the fullname only, or </td>
</tr>
<tr>
<td class="h" >
<a name="2789">2789</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> filename extension (with dot included, or not). </td>
</tr>
<tr>
<td class="h" >
<a name="2790">2790</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2791">2791</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The extension is calculated using the config() value C<extension>. </td>
</tr>
<tr>
<td class="h" >
<a name="2792">2792</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2793">2793</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The dirname() method takes an optional argument: the number of directory </td>
</tr>
<tr>
<td class="h" >
<a name="2794">2794</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> components to strip; the C<dir_component($level)> method returns one </td>
</tr>
<tr>
<td class="h" >
<a name="2795">2795</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> component of the directory (to get the last use 0 as $level; this is the </td>
</tr>
<tr>
<td class="h" >
<a name="2796">2796</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> default if no $level is specified). </td>
</tr>
<tr>
<td class="h" >
<a name="2797">2797</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2798">2798</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The configuration option C<decode_encoding_filename> can be used to </td>
</tr>
<tr>
<td class="h" >
<a name="2799">2799</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> specify the encoding of the filename; all these functions would use </td>
</tr>
<tr>
<td class="h" >
<a name="2800">2800</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> filename decoded from this encoding. </td>
</tr>
<tr>
<td class="h" >
<a name="2801">2801</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2802">2802</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="2803">2803</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2804">2804</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub from_filesystem ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="2805">2805</a>
</td>
<td class="c3" >
41
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2805-1">
41
</a>
</td>
<td >
</td>
<td >
48
</td>
<td class="s"> my ($self, $f) = @_; </td>
</tr>
<tr>
<td class="h" >
<a name="2806">2806</a>
</td>
<td class="c3" >
41
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
70
</td>
<td class="s"> my $e = $self->get_config('decode_encoding_filename'); </td>
</tr>
<tr>
<td class="h" >
<a name="2807">2807</a>
</td>
<td class="c3" >
41
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2807-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#2807-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
780
</td>
<td class="s"> return $f unless $e and $e->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2808">2808</a>
</td>
<td class="c0" >
<a href="#2809">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> require Encode; </td>
</tr>
<tr>
<td class="h" >
<a name="2809">2809</a>
</td>
<td class="c0" >
<a href="#2823">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> Encode::decode($e->[0], $f); </td>
</tr>
<tr>
<td class="h" >
<a name="2810">2810</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2811">2811</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2812">2812</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub filename { </td>
</tr>
<tr>
<td class="h" >
<a name="2813">2813</a>
</td>
<td class="c3" >
36
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2813-1">
36
</a>
</td>
<td >
</td>
<td >
34
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2814">2814</a>
</td>
<td class="c3" >
36
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
79
</td>
<td class="s"> $self->from_filesystem($self->{ofilename}); </td>
</tr>
<tr>
<td class="h" >
<a name="2815">2815</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2816">2816</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2817">2817</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub abs_filename { </td>
</tr>
<tr>
<td class="h" >
<a name="2818">2818</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2818-1">
5
</a>
</td>
<td >
</td>
<td >
6
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2819">2819</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> $self->from_filesystem($self->{abs_filename}); </td>
</tr>
<tr>
<td class="h" >
<a name="2820">2820</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2821">2821</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2822">2822</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub filename_noextension { </td>
</tr>
<tr>
<td class="h" >
<a name="2823">2823</a>
</td>
<td class="c0" >
<a href="#2824">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2823-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2824">2824</a>
</td>
<td class="c0" >
<a href="#2825">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $f = $self->filename; </td>
</tr>
<tr>
<td class="h" >
<a name="2825">2825</a>
</td>
<td class="c0" >
<a href="#2826">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $ext_re = $self->get_config('extension')->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2826">2826</a>
</td>
<td class="c0" >
<a href="#2827">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $f =~ s/$ext_re//; </td>
</tr>
<tr>
<td class="h" >
<a name="2827">2827</a>
</td>
<td class="c0" >
<a href="#2982">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return $f; </td>
</tr>
<tr>
<td class="h" >
<a name="2828">2828</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2829">2829</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2830">2830</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub filename_nodir { </td>
</tr>
<tr>
<td class="h" >
<a name="2831">2831</a>
</td>
<td class="c3" >
36
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2831-1">
36
</a>
</td>
<td >
</td>
<td >
297
</td>
<td class="s"> require File::Basename; </td>
</tr>
<tr>
<td class="h" >
<a name="2832">2832</a>
</td>
<td class="c3" >
36
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
84
</td>
<td class="s"> return scalar File::Basename::fileparse(shift->filename, ""); </td>
</tr>
<tr>
<td class="h" >
<a name="2833">2833</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2834">2834</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2835">2835</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub dirname { </td>
</tr>
<tr>
<td class="h" >
<a name="2836">2836</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2836-1">
1
</a>
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> require File::Basename; </td>
</tr>
<tr>
<td class="h" >
<a name="2837">2837</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
2
</td>
<td class="s"> my ($self, $l) = (shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="2838">2838</a>
</td>
<td class="c3" >
1
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2838-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> my $p = $l ? $self->dirname($l - 1) : $self->abs_filename; </td>
</tr>
<tr>
<td class="h" >
<a name="2839">2839</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
41
</td>
<td class="s"> return File::Basename::dirname($p); </td>
</tr>
<tr>
<td class="h" >
<a name="2840">2840</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2841">2841</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2842">2842</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub dir_component { </td>
</tr>
<tr>
<td class="h" >
<a name="2843">2843</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2843-1">
1
</a>
</td>
<td >
</td>
<td >
4
</td>
<td class="s"> require File::Basename; </td>
</tr>
<tr>
<td class="h" >
<a name="2844">2844</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> my ($self, $l) = (shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="2845">2845</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
4
</td>
<td class="s"> return scalar File::Basename::fileparse($self->dirname($l), ""); </td>
</tr>
<tr>
<td class="h" >
<a name="2846">2846</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2847">2847</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2848">2848</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub filename_extension { </td>
</tr>
<tr>
<td class="h" >
<a name="2849">2849</a>
</td>
<td class="c3" >
16
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2849-1">
16
</a>
</td>
<td >
</td>
<td >
15
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2850">2850</a>
</td>
<td class="c3" >
16
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
27
</td>
<td class="s"> my $f = $self->filename_nodir; </td>
</tr>
<tr>
<td class="h" >
<a name="2851">2851</a>
</td>
<td class="c3" >
16
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
35
</td>
<td class="s"> my $ext_re = $self->get_config('extension')->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2852">2852</a>
</td>
<td class="c3" >
16
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2852-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
128
</td>
<td class="s"> $f =~ /($ext_re)/ or return ''; </td>
</tr>
<tr>
<td class="h" >
<a name="2853">2853</a>
</td>
<td class="c3" >
16
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
36
</td>
<td class="s"> return $1; </td>
</tr>
<tr>
<td class="h" >
<a name="2854">2854</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2855">2855</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2856">2856</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub filename_nodir_noextension { </td>
</tr>
<tr>
<td class="h" >
<a name="2857">2857</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2857-1">
4
</a>
</td>
<td >
</td>
<td >
6
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2858">2858</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
10
</td>
<td class="s"> my $f = $self->filename_nodir; </td>
</tr>
<tr>
<td class="h" >
<a name="2859">2859</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
13
</td>
<td class="s"> my $ext_re = $self->get_config('extension')->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2860">2860</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
33
</td>
<td class="s"> $f =~ s/$ext_re//; </td>
</tr>
<tr>
<td class="h" >
<a name="2861">2861</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
10
</td>
<td class="s"> return $f; </td>
</tr>
<tr>
<td class="h" >
<a name="2862">2862</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2863">2863</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2864">2864</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub abs_filename_noextension { </td>
</tr>
<tr>
<td class="h" >
<a name="2865">2865</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2865-1">
1
</a>
</td>
<td >
</td>
<td >
2
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2866">2866</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> my $f = $self->abs_filename; </td>
</tr>
<tr>
<td class="h" >
<a name="2867">2867</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
2
</td>
<td class="s"> my $ext_re = $self->get_config('extension')->[0]; </td>
</tr>
<tr>
<td class="h" >
<a name="2868">2868</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
20
</td>
<td class="s"> $f =~ s/$ext_re//; </td>
</tr>
<tr>
<td class="h" >
<a name="2869">2869</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
2
</td>
<td class="s"> return $f; </td>
</tr>
<tr>
<td class="h" >
<a name="2870">2870</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2871">2871</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2872">2872</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub filename_extension_nodot { </td>
</tr>
<tr>
<td class="h" >
<a name="2873">2873</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2873-1">
15
</a>
</td>
<td >
</td>
<td >
11
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2874">2874</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
39
</td>
<td class="s"> my $e = $self->filename_extension; </td>
</tr>
<tr>
<td class="h" >
<a name="2875">2875</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
38
</td>
<td class="s"> $e =~ s/^\.//; </td>
</tr>
<tr>
<td class="h" >
<a name="2876">2876</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
23
</td>
<td class="s"> return $e; </td>
</tr>
<tr>
<td class="h" >
<a name="2877">2877</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2878">2878</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2879">2879</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item mpeg_version() </td>
</tr>
<tr>
<td class="h" >
<a name="2880">2880</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2881">2881</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item mpeg_layer() </td>
</tr>
<tr>
<td class="h" >
<a name="2882">2882</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2883">2883</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item mpeg_layer_roman() </td>
</tr>
<tr>
<td class="h" >
<a name="2884">2884</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2885">2885</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item is_stereo() </td>
</tr>
<tr>
<td class="h" >
<a name="2886">2886</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2887">2887</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item is_vbr() </td>
</tr>
<tr>
<td class="h" >
<a name="2888">2888</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2889">2889</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item bitrate_kbps() </td>
</tr>
<tr>
<td class="h" >
<a name="2890">2890</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2891">2891</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item frequency_Hz() </td>
</tr>
<tr>
<td class="h" >
<a name="2892">2892</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2893">2893</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item frequency_kHz() </td>
</tr>
<tr>
<td class="h" >
<a name="2894">2894</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2895">2895</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item size_bytes() </td>
</tr>
<tr>
<td class="h" >
<a name="2896">2896</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2897">2897</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item total_secs() </td>
</tr>
<tr>
<td class="h" >
<a name="2898">2898</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2899">2899</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item total_secs_int() </td>
</tr>
<tr>
<td class="h" >
<a name="2900">2900</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2901">2901</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item total_secs_trunc() </td>
</tr>
<tr>
<td class="h" >
<a name="2902">2902</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2903">2903</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item total_millisecs_int() </td>
</tr>
<tr>
<td class="h" >
<a name="2904">2904</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2905">2905</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item total_mins() </td>
</tr>
<tr>
<td class="h" >
<a name="2906">2906</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2907">2907</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item leftover_mins() </td>
</tr>
<tr>
<td class="h" >
<a name="2908">2908</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2909">2909</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item leftover_secs() </td>
</tr>
<tr>
<td class="h" >
<a name="2910">2910</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2911">2911</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item leftover_secs_float() </td>
</tr>
<tr>
<td class="h" >
<a name="2912">2912</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2913">2913</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item leftover_secs_trunc() </td>
</tr>
<tr>
<td class="h" >
<a name="2914">2914</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2915">2915</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item leftover_msec() </td>
</tr>
<tr>
<td class="h" >
<a name="2916">2916</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2917">2917</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item time_mm_ss() </td>
</tr>
<tr>
<td class="h" >
<a name="2918">2918</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2919">2919</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item is_copyrighted() </td>
</tr>
<tr>
<td class="h" >
<a name="2920">2920</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2921">2921</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item is_copyrighted_YN() </td>
</tr>
<tr>
<td class="h" >
<a name="2922">2922</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2923">2923</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item frames_padded() </td>
</tr>
<tr>
<td class="h" >
<a name="2924">2924</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2925">2925</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item frames_padded_YN() </td>
</tr>
<tr>
<td class="h" >
<a name="2926">2926</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2927">2927</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item channel_mode_int() </td>
</tr>
<tr>
<td class="h" >
<a name="2928">2928</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2929">2929</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item frames() </td>
</tr>
<tr>
<td class="h" >
<a name="2930">2930</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2931">2931</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item frame_len() </td>
</tr>
<tr>
<td class="h" >
<a name="2932">2932</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2933">2933</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item vbr_scale() </td>
</tr>
<tr>
<td class="h" >
<a name="2934">2934</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2935">2935</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> These methods return the information about the contents of the MP3 </td>
</tr>
<tr>
<td class="h" >
<a name="2936">2936</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> file. If this information is not cached in ID3v2 tags (not </td>
</tr>
<tr>
<td class="h" >
<a name="2937">2937</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> implemented yet), using these methods requires that the module </td>
</tr>
<tr>
<td class="h" >
<a name="2938">2938</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Info|MP3::Info> is installed. Since these calls are </td>
</tr>
<tr>
<td class="h" >
<a name="2939">2939</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> redirectoed to the module L<MP3::Info|MP3::Info>, the returned info is </td>
</tr>
<tr>
<td class="h" >
<a name="2940">2940</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> subject to the same restrictions as the method get_mp3info() of this </td>
</tr>
<tr>
<td class="h" >
<a name="2941">2941</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> module; in particular, the information about the frame number and </td>
</tr>
<tr>
<td class="h" >
<a name="2942">2942</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frame length is only approximate. </td>
</tr>
<tr>
<td class="h" >
<a name="2943">2943</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2944">2944</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> vbr_scale() is from the VBR header; total_secs() is not necessarily an </td>
</tr>
<tr>
<td class="h" >
<a name="2945">2945</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> integer, but total_secs_int() and total_secs_trunc() are (first is </td>
</tr>
<tr>
<td class="h" >
<a name="2946">2946</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> rounded, second truncated); time_mm_ss() has format C<MM:SS>; the </td>
</tr>
<tr>
<td class="h" >
<a name="2947">2947</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<*_YN> flavors return the value as a string Yes or No; </td>
</tr>
<tr>
<td class="h" >
<a name="2948">2948</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mpeg_layer_roman() returns the value as a roman numeral; </td>
</tr>
<tr>
<td class="h" >
<a name="2949">2949</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> channel_mode() takes values in C<'stereo', 'joint stereo', 'dual </td>
</tr>
<tr>
<td class="h" >
<a name="2950">2950</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> channel', 'mono'>. </td>
</tr>
<tr>
<td class="h" >
<a name="2951">2951</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2952">2952</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="2953">2953</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2954">2954</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my %mp3info = qw( </td>
</tr>
<tr>
<td class="h" >
<a name="2955">2955</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mpeg_version VERSION </td>
</tr>
<tr>
<td class="h" >
<a name="2956">2956</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> mpeg_layer LAYER </td>
</tr>
<tr>
<td class="h" >
<a name="2957">2957</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> is_stereo STEREO </td>
</tr>
<tr>
<td class="h" >
<a name="2958">2958</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> is_vbr VBR </td>
</tr>
<tr>
<td class="h" >
<a name="2959">2959</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> bitrate_kbps BITRATE </td>
</tr>
<tr>
<td class="h" >
<a name="2960">2960</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frequency_kHz FREQUENCY </td>
</tr>
<tr>
<td class="h" >
<a name="2961">2961</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> size_bytes SIZE </td>
</tr>
<tr>
<td class="h" >
<a name="2962">2962</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> is_copyrighted COPYRIGHT </td>
</tr>
<tr>
<td class="h" >
<a name="2963">2963</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frames_padded PADDING </td>
</tr>
<tr>
<td class="h" >
<a name="2964">2964</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> channel_mode_int MODE </td>
</tr>
<tr>
<td class="h" >
<a name="2965">2965</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frames FRAMES </td>
</tr>
<tr>
<td class="h" >
<a name="2966">2966</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frame_len FRAME_LENGTH </td>
</tr>
<tr>
<td class="h" >
<a name="2967">2967</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> vbr_scale VBR_SCALE </td>
</tr>
<tr>
<td class="h" >
<a name="2968">2968</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> total_secs_fetch SECS </td>
</tr>
<tr>
<td class="h" >
<a name="2969">2969</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ); </td>
</tr>
<tr>
<td class="h" >
<a name="2970">2970</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2971">2971</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Obsoleted: </td>
</tr>
<tr>
<td class="h" >
<a name="2972">2972</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # total_mins MM </td>
</tr>
<tr>
<td class="h" >
<a name="2973">2973</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # time_mm_ss TIME </td>
</tr>
<tr>
<td class="h" >
<a name="2974">2974</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # leftover_secs SS </td>
</tr>
<tr>
<td class="h" >
<a name="2975">2975</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # leftover_msec MS </td>
</tr>
<tr>
<td class="h" >
<a name="2976">2976</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2977">2977</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for my $elt (keys %mp3info) { </td>
</tr>
<tr>
<td class="h" >
<a name="2978">2978</a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2978-1">
6
</a>
</td>
<td >
</td>
<td >
35
</td>
<td class="s"> no strict 'refs'; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
6
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
14220
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2979">2979</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $k = $mp3info{$elt}; </td>
</tr>
<tr>
<td class="h" >
<a name="2980">2980</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> *$elt = sub (;$) { </td>
</tr>
<tr>
<td class="h" >
<a name="2981">2981</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $MP3::Info::try_harder = 1; # Bug: loops infinitely if no frames </td>
</tr>
<tr>
<td class="h" >
<a name="2982">2982</a>
</td>
<td class="c0" >
<a href="#2983">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2982-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="2983">2983</a>
</td>
<td class="c0" >
<a href="#2984">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $info = $self->{mp3info}; </td>
</tr>
<tr>
<td class="h" >
<a name="2984">2984</a>
</td>
<td class="c0" >
<a href="#2985">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2984-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> unless ($info) { </td>
</tr>
<tr>
<td class="h" >
<a name="2985">2985</a>
</td>
<td class="c0" >
<a href="#2986">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> require MP3::Info; </td>
</tr>
<tr>
<td class="h" >
<a name="2986">2986</a>
</td>
<td class="c0" >
<a href="#2987">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $info = MP3::Info::get_mp3info($self->abs_filename); </td>
</tr>
<tr>
<td class="h" >
<a name="2987">2987</a>
</td>
<td class="c0" >
<a href="#2990">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2987-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> die "Didn't get valid data from MP3::Info for `".($self->abs_filename)."': $@" </td>
</tr>
<tr>
<td class="h" >
<a name="2988">2988</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> unless defined $info; </td>
</tr>
<tr>
<td class="h" >
<a name="2989">2989</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2990">2990</a>
</td>
<td class="c0" >
<a href="#2995">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $info->{$k} </td>
</tr>
<tr>
<td class="h" >
<a name="2991">2991</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2992">2992</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2993">2993</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2994">2994</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub frequency_Hz ($) { </td>
</tr>
<tr>
<td class="h" >
<a name="2995">2995</a>
</td>
<td class="c0" >
<a href="#2998">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2995-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> 1000 * (shift->frequency_kHz); </td>
</tr>
<tr>
<td class="h" >
<a name="2996">2996</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="2997">2997</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2998">2998</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#2998-1">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2998-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> sub mpeg_layer_roman { eval { 'I' x (shift->mpeg_layer) } || '' } </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#2999">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="2999">2999</a>
</td>
<td class="c0" >
<a href="#3000">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#2999-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> sub total_millisecs_int_fetch { int (0.5 + 1000 * shift->duration_secs) } </td>
</tr>
<tr>
<td class="h" >
<a name="3000">3000</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3000-1">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3000-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> sub frames_padded_YN { eval {shift->frames_padded() ? 'Yes' : 'No' } || '' } </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#3001">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3001">3001</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3001-1">
0
</a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3001-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> sub is_copyrighted_YN { eval {shift->is_copyrighted() ? 'Yes' : 'No' } || '' } </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#3007">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3002">3002</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3003">3003</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub total_millisecs_int { </td>
</tr>
<tr>
<td class="h" >
<a name="3004">3004</a>
</td>
<td class="c3" >
32
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3004-1">
32
</a>
</td>
<td >
</td>
<td >
20
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="3005">3005</a>
</td>
<td class="c3" >
32
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
27
</td>
<td class="s"> my $ms = $self->{ms}; </td>
</tr>
<tr>
<td class="h" >
<a name="3006">3006</a>
</td>
<td class="c3" >
32
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3006-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
89
</td>
<td class="s"> return $ms if defined $ms; </td>
</tr>
<tr>
<td class="h" >
<a name="3007">3007</a>
</td>
<td class="c0" >
<a href="#3008">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> (undef, $ms) = $self->get_id3v2_frames('TLEN'); </td>
</tr>
<tr>
<td class="h" >
<a name="3008">3008</a>
</td>
<td class="c0" >
<a href="#3009">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3008-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $ms = $self->total_millisecs_int_fetch() unless defined $ms; </td>
</tr>
<tr>
<td class="h" >
<a name="3009">3009</a>
</td>
<td class="c0" >
<a href="#3010">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{ms} = $ms; </td>
</tr>
<tr>
<td class="h" >
<a name="3010">3010</a>
</td>
<td class="c0" >
<a href="#3012">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return $ms; </td>
</tr>
<tr>
<td class="h" >
<a name="3011">3011</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3012">3012</a>
</td>
<td class="c0" >
<a href="#3018">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3012-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> sub total_secs_int { int (0.5 + 0.001 * shift->total_millisecs_int) } </td>
</tr>
<tr>
<td class="h" >
<a name="3013">3013</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3013-1">
1
</a>
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> sub total_secs { 0.001 * shift->total_millisecs_int } </td>
</tr>
<tr>
<td class="h" >
<a name="3014">3014</a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3014-1">
6
</a>
</td>
<td >
</td>
<td >
7
</td>
<td class="s"> sub total_secs_trunc { int (0.001 * (0.5 + shift->total_millisecs_int)) } </td>
</tr>
<tr>
<td class="h" >
<a name="3015">3015</a>
</td>
<td class="c3" >
9
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3015-1">
9
</a>
</td>
<td >
</td>
<td >
12
</td>
<td class="s"> sub total_mins { int (0.001/60 * (0.5 + shift->total_millisecs_int)) } </td>
</tr>
<tr>
<td class="h" >
<a name="3016">3016</a>
</td>
<td class="c3" >
9
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3016-1">
9
</a>
</td>
<td >
</td>
<td >
12
</td>
<td class="s"> sub leftover_mins { shift->total_mins() % 60 } </td>
</tr>
<tr>
<td class="h" >
<a name="3017">3017</a>
</td>
<td class="c3" >
4
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3017-1">
4
</a>
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> sub total_hours { int (0.001/60/60 * (0.5 + shift->total_millisecs_int)) } </td>
</tr>
<tr>
<td class="h" >
<a name="3018">3018</a>
</td>
<td class="c0" >
<a href="#3023">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3018-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> sub leftover_secs { shift->total_secs_int() % 60 } </td>
</tr>
<tr>
<td class="h" >
<a name="3019">3019</a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3019-1">
6
</a>
</td>
<td >
</td>
<td >
9
</td>
<td class="s"> sub leftover_secs_trunc { shift->total_secs_trunc() % 60 } </td>
</tr>
<tr>
<td class="h" >
<a name="3020">3020</a>
</td>
<td class="c3" >
3
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3020-1">
3
</a>
</td>
<td >
</td>
<td >
27
</td>
<td class="s"> sub leftover_msec { shift->total_millisecs_int % 1000 } </td>
</tr>
<tr>
<td class="h" >
<a name="3021">3021</a>
</td>
<td class="c3" >
9
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3021-1">
9
</a>
</td>
<td >
</td>
<td >
11
</td>
<td class="s"> sub leftover_secs_float { shift->total_millisecs_int % 60000 / 1000 } </td>
</tr>
<tr>
<td class="h" >
<a name="3022">3022</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub time_mm_ss { # Borrowed from MP3::Info </td>
</tr>
<tr>
<td class="h" >
<a name="3023">3023</a>
</td>
<td class="c0" >
<a href="#3024">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3023-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="3024">3024</a>
</td>
<td class="c0" >
<a href="#3028">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> sprintf "%.2d:%.2d", $self->total_mins, $self->leftover_secs; </td>
</tr>
<tr>
<td class="h" >
<a name="3025">3025</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3026">3026</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3027">3027</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub duration_secs { # Tricky: in which order to query MP3::Info and ExifTool? </td>
</tr>
<tr>
<td class="h" >
<a name="3028">3028</a>
</td>
<td class="c0" >
<a href="#3029">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3028-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="3029">3029</a>
</td>
<td class="c0" >
<a href="#3030">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $d = $self->{duration}; </td>
</tr>
<tr>
<td class="h" >
<a name="3030">3030</a>
</td>
<td class="c0" >
<a href="#3032">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3030-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return $d if defined $d; # Cached value </td>
</tr>
<tr>
<td class="h" >
<a name="3031">3031</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $self->{duration} = $self->total_secs_fetch # Have MP3::Info or a chance to work </td>
</tr>
<tr>
<td class="h" >
<a name="3032">3032</a>
</td>
<td class="c0" >
<a href="#3033">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3032-1">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3032-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> if $self->{mp3info} or $self->{filename} =~ /\.mp[23]$/i; </td>
</tr>
<tr>
<td class="h" >
<a name="3033">3033</a>
</td>
<td class="c0" >
<a href="#3034">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $r = $self->_duration; # Next: try ExifTool </td>
</tr>
<tr>
<td class="h" >
<a name="3034">3034</a>
</td>
<td class="c0" >
<a href="#3035">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3034-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $r = $self->total_secs_fetch unless $r; # Try MP3::Info anyway </td>
</tr>
<tr>
<td class="h" >
<a name="3035">3035</a>
</td>
<td class="c0" >
<a href="#3084">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> return $r; </td>
</tr>
<tr>
<td class="h" >
<a name="3036">3036</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3037">3037</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3038">3038</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item format_time </td>
</tr>
<tr>
<td class="h" >
<a name="3039">3039</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3040">3040</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $output = $mp3->format_time(67456.123, @format); </td>
</tr>
<tr>
<td class="h" >
<a name="3041">3041</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3042">3042</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> formats time according to @format, which should be a list of format </td>
</tr>
<tr>
<td class="h" >
<a name="3043">3043</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> descriptors. Each format descriptor is either a simple letter, or a </td>
</tr>
<tr>
<td class="h" >
<a name="3044">3044</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> string in braces appropriate to be put after C<%> in an interpolated </td>
</tr>
<tr>
<td class="h" >
<a name="3045">3045</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> string. A format descriptor can be followed by a literal string to be </td>
</tr>
<tr>
<td class="h" >
<a name="3046">3046</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> put as a suffix, and can be preceded by a question mark, which says </td>
</tr>
<tr>
<td class="h" >
<a name="3047">3047</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> that this part of format should be printed only if needed. </td>
</tr>
<tr>
<td class="h" >
<a name="3048">3048</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3049">3049</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Leftover minutes, seconds are formated 0-padded to width 2 if they are </td>
</tr>
<tr>
<td class="h" >
<a name="3050">3050</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> preceded by more coarse units. Similarly, leftover milliseconds are </td>
</tr>
<tr>
<td class="h" >
<a name="3051">3051</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> printed with leading dot, and 0-padded to width 3. </td>
</tr>
<tr>
<td class="h" >
<a name="3052">3052</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3053">3053</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Two examples of useful C<@format>s are </td>
</tr>
<tr>
<td class="h" >
<a name="3054">3054</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3055">3055</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> qw(?H: ?{mL}: {SML}) </td>
</tr>
<tr>
<td class="h" >
<a name="3056">3056</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> qw(?Hh ?{mL}m {SL} ?{ML}) </td>
</tr>
<tr>
<td class="h" >
<a name="3057">3057</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3058">3058</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Both will print hours, minutes, and milliseconds only if needed. The </td>
</tr>
<tr>
<td class="h" >
<a name="3059">3059</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> second one will use 3 digit-format after a point, the first one will </td>
</tr>
<tr>
<td class="h" >
<a name="3060">3060</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> not print the trailing 0s of milliseconds. The first one uses C<:> as </td>
</tr>
<tr>
<td class="h" >
<a name="3061">3061</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> separator of hours and minutes, the second one will use C<h m>. </td>
</tr>
<tr>
<td class="h" >
<a name="3062">3062</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3063">3063</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Optionally, the first element of the array may be of the form </td>
</tr>
<tr>
<td class="h" >
<a name="3064">3064</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<=E<gt>U>, here C<U> is one of C<h m s>. In this case, duration is </td>
</tr>
<tr>
<td class="h" >
<a name="3065">3065</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> rounded to closest hours, min or second before processing. (E.g., </td>
</tr>
<tr>
<td class="h" >
<a name="3066">3066</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> 1.7sec would print as C<1> with C<@format>s above, but would print as </td>
</tr>
<tr>
<td class="h" >
<a name="3067">3067</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<2> if rounded to seconds.) </td>
</tr>
<tr>
<td class="h" >
<a name="3068">3068</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3069">3069</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="3070">3070</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3071">3071</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my %Unit = qw( h 3600 m 60 s 1 ); </td>
</tr>
<tr>
<td class="h" >
<a name="3072">3072</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3073">3073</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub format_time { </td>
</tr>
<tr>
<td class="h" >
<a name="3074">3074</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3074-1">
15
</a>
</td>
<td >
</td>
<td >
349
</td>
<td class="s"> my ($self, $time) = (shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="3075">3075</a>
</td>
<td class="c3" >
15
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3075-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
28
</td>
<td class="s"> $self = $self->new_fake() unless ref $self; </td>
</tr>
<tr>
<td class="h" >
<a name="3076">3076</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
24
</td>
<td class="s"> local $self->{ms} = $self->{ms}; # Make modifiable </td>
</tr>
<tr>
<td class="h" >
<a name="3077">3077</a>
</td>
<td class="c3" >
15
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3077-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
41
</td>
<td class="s"> local $self->{ms} = int($time * 1000 + 0.5) if defined $time; </td>
</tr>
<tr>
<td class="h" >
<a name="3078">3078</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
16
</td>
<td class="s"> my ($out, %have, $c) = ''; </td>
</tr>
<tr>
<td class="h" >
<a name="3079">3079</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
19
</td>
<td class="s"> for my $f (@_) { </td>
</tr>
<tr>
<td class="h" >
<a name="3080">3080</a>
</td>
<td class="c3" >
51
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3080-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
155
</td>
<td class="s"> $have{$+}++ if $f =~ /^\??({([^{}]+)}|.)/; </td>
</tr>
<tr>
<td class="h" >
<a name="3081">3081</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3082">3082</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
17
</td>
<td class="s"> for my $f (@_) { </td>
</tr>
<tr>
<td class="h" >
<a name="3083">3083</a>
</td>
<td class="c3" >
51
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3083-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3083-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
106
</td>
<td class="s"> if (!$c++ and $f =~ /^=>(\w)$/) { </td>
</tr>
<tr>
<td class="h" >
<a name="3084">3084</a>
</td>
<td class="c0" >
<a href="#3085">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3084-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> my $u = $Unit{$1} or die "Unexpected unit of time for rounding: `$1'"; </td>
</tr>
<tr>
<td class="h" >
<a name="3085">3085</a>
</td>
<td class="c0" >
<a href="#3086">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3085-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $time = $self->total_secs unless defined $time; </td>
</tr>
<tr>
<td class="h" >
<a name="3086">3086</a>
</td>
<td class="c0" >
<a href="#3087">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $time = $u * int($time/$u + 0.5); </td>
</tr>
<tr>
<td class="h" >
<a name="3087">3087</a>
</td>
<td class="c0" >
<a href="#3088">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $self->{ms} = 1000 * $time; </td>
</tr>
<tr>
<td class="h" >
<a name="3088">3088</a>
</td>
<td class="c0" >
<a href="#3104">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> next; </td>
</tr>
<tr>
<td class="h" >
<a name="3089">3089</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3090">3090</a>
</td>
<td class="c3" >
51
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
33
</td>
<td class="s"> my $ff = $f; # Modifiable </td>
</tr>
<tr>
<td class="h" >
<a name="3091">3091</a>
</td>
<td class="c3" >
51
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
79
</td>
<td class="s"> my $opt = ($ff =~ s/^\?//); </td>
</tr>
<tr>
<td class="h" >
<a name="3092">3092</a>
</td>
<td class="c3" >
51
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3092-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
116
</td>
<td class="s"> $ff =~ s/^({[^{}]+}|\w)// or die "unexpected time format: <<$f>>"; </td>
</tr>
<tr>
<td class="h" >
<a name="3093">3093</a>
</td>
<td class="c3" >
51
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
60
</td>
<td class="s"> my ($what, $format) = ($1, ''); </td>
</tr>
<tr>
<td class="h" >
<a name="3094">3094</a>
</td>
<td class="c3" >
51
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3094-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
58
</td>
<td class="s"> if ($opt) { </td>
</tr>
<tr>
<td class="h" >
<a name="3095">3095</a>
</td>
<td class="c3" >
36
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3095-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3095-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
87
</td>
<td class="s"> if ($what eq 'H') { </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-2">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#-3">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3096">3096</a>
</td>
<td class="c3" >
15
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3096-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
25
</td>
<td class="s"> $time = $self->total_secs unless defined $time; </td>
</tr>
<tr>
<td class="h" >
<a name="3097">3097</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3097-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
58
</td>
<td class="s"> $opt = int($time / 3600) || !(grep $have{$_}, qw(m mL s S SL SML)); </td>
</tr>
<tr>
<td class="h" >
<a name="3098">3098</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq 'm' or $what eq '{mL}') { </td>
</tr>
<tr>
<td class="h" >
<a name="3099">3099</a>
</td>
<td class="c3" >
15
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3099-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
18
</td>
<td class="s"> $time = $self->total_secs unless defined $time; </td>
</tr>
<tr>
<td class="h" >
<a name="3100">3100</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3100-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
32
</td>
<td class="s"> $opt = int($time / 60) || !(grep $have{$_}, qw(s S SL SML)); </td>
</tr>
<tr>
<td class="h" >
<a name="3101">3101</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } elsif ($what eq '{ML}') { </td>
</tr>
<tr>
<td class="h" >
<a name="3102">3102</a>
</td>
<td class="c3" >
6
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
7
</td>
<td class="s"> $opt = ($time != int $time); </td>
</tr>
<tr>
<td class="h" >
<a name="3103">3103</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="3104">3104</a>
</td>
<td class="c0" >
<a href="#3128">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $opt = 1; </td>
</tr>
<tr>
<td class="h" >
<a name="3105">3105</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> #die "Do not know how to treat optional `$what'"; </td>
</tr>
<tr>
<td class="h" >
<a name="3106">3106</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3107">3107</a>
</td>
<td class="c3" >
36
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3107-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
72
</td>
<td class="s"> $what =~ /^(?:{(.*)}|(.))/ or die; </td>
</tr>
<tr>
<td class="h" >
<a name="3108">3108</a>
</td>
<td class="c3" >
36
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3108-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
76
</td>
<td class="s"> (delete $have{$+}), next unless $opt; </td>
</tr>
<tr>
<td class="h" >
<a name="3109">3109</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3110">3110</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $format = '02' </td>
</tr>
<tr>
<td class="h" >
<a name="3111">3111</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if (($what eq 's' or $what eq '{SL}') and (grep $have{$_}, qw(H m mL))) </td>
</tr>
<tr>
<td class="h" >
<a name="3112">3112</a>
</td>
<td class="c3" >
31
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3112-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3112-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
154
</td>
<td class="s"> or $what eq '{mL}' and $have{H}; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-3">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-4">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3113">3113</a>
</td>
<td class="c3" >
31
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
33
</td>
<td class="s"> $what = "%$format$what"; </td>
</tr>
<tr>
<td class="h" >
<a name="3114">3114</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $what = ".%03{ML}" </td>
</tr>
<tr>
<td class="h" >
<a name="3115">3115</a>
</td>
<td class="c3" >
31
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3115-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3115-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
58
</td>
<td class="s"> if $what eq '%{ML}' and grep $have{$_}, qw(H m mL s S SL); </td>
</tr>
<tr>
<td class="h" >
<a name="3116">3116</a>
</td>
<td class="c3" >
31
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3116-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3116-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
64
</td>
<td class="s"> if ($what eq '%{SML}' and grep $have{$_}, qw(H m mL)) { # manual padding </td>
</tr>
<tr>
<td class="h" >
<a name="3117">3117</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
6
</td>
<td class="s"> my $res = $self->interpolate($what); </td>
</tr>
<tr>
<td class="h" >
<a name="3118">3118</a>
</td>
<td class="c3" >
5
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3118-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
13
</td>
<td class="s"> $res = "0$res" unless $res =~ /^\d\d/; </td>
</tr>
<tr>
<td class="h" >
<a name="3119">3119</a>
</td>
<td class="c3" >
5
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> $out .= "$res$ff"; </td>
</tr>
<tr>
<td class="h" >
<a name="3120">3120</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="3121">3121</a>
</td>
<td class="c3" >
26
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
35
</td>
<td class="s"> $out .= $self->interpolate($what) . $ff; </td>
</tr>
<tr>
<td class="h" >
<a name="3122">3122</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3123">3123</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3124">3124</a>
</td>
<td class="c3" >
15
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
48
</td>
<td class="s"> $out; </td>
</tr>
<tr>
<td class="h" >
<a name="3125">3125</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3126">3126</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3127">3127</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my @channel_modes = ('stereo', 'joint stereo', 'dual channel', 'mono'); </td>
</tr>
<tr>
<td class="h" >
<a name="3128">3128</a>
</td>
<td class="c0" >
<a href="#3283">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3128-1">
0
</a>
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> sub channel_mode { $channel_modes[shift->channel_mode_int] } </td>
</tr>
<tr>
<td class="h" >
<a name="3129">3129</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3130">3130</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item can_write() </td>
</tr>
<tr>
<td class="h" >
<a name="3131">3131</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3132">3132</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> checks permission to write per the configuration variable C<is_writable>. </td>
</tr>
<tr>
<td class="h" >
<a name="3133">3133</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3134">3134</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item can_write_or_die($mess) </td>
</tr>
<tr>
<td class="h" >
<a name="3135">3135</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3136">3136</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> as can_write(), but die()s on non-writable files with meaningful error message </td>
</tr>
<tr>
<td class="h" >
<a name="3137">3137</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ($mess is prepended to the message). </td>
</tr>
<tr>
<td class="h" >
<a name="3138">3138</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3139">3139</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item die_cant_write($mess) </td>
</tr>
<tr>
<td class="h" >
<a name="3140">3140</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3141">3141</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die() with the same message as can_write_or_die(). </td>
</tr>
<tr>
<td class="h" >
<a name="3142">3142</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3143">3143</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item writable_by_extension() </td>
</tr>
<tr>
<td class="h" >
<a name="3144">3144</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3145">3145</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Checks that extension is (case-insensitively) in the list given by </td>
</tr>
<tr>
<td class="h" >
<a name="3146">3146</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> configuration variable C<writable_extensions>. </td>
</tr>
<tr>
<td class="h" >
<a name="3147">3147</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3148">3148</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="3149">3149</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3150">3150</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub can_write ($) { </td>
</tr>
<tr>
<td class="h" >
<a name="3151">3151</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3151-1">
14
</a>
</td>
<td >
</td>
<td >
17
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="3152">3152</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
12
</td>
<td class="s"> my @wr = @{ $self->get_config('is_writable') }; # Make copy </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
22
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3153">3153</a>
</td>
<td class="c3" >
14
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3153-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3153-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
96
</td>
<td class="s"> return $wr[0] if @wr == 1 and not $wr[0] =~ /\D/; </td>
</tr>
<tr>
<td class="h" >
<a name="3154">3154</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
17
</td>
<td class="s"> my $meth = shift @wr; </td>
</tr>
<tr>
<td class="h" >
<a name="3155">3155</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
38
</td>
<td class="s"> $self->$meth(@wr); </td>
</tr>
<tr>
<td class="h" >
<a name="3156">3156</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3157">3157</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3158">3158</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub writable_by_extension ($) { </td>
</tr>
<tr>
<td class="h" >
<a name="3159">3159</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3159-1">
14
</a>
</td>
<td >
</td>
<td >
12
</td>
<td class="s"> my $self = shift; </td>
</tr>
<tr>
<td class="h" >
<a name="3160">3160</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
24
</td>
<td class="s"> my $wr = $self->get_config('writable_extensions'); # Make copy </td>
</tr>
<tr>
<td class="h" >
<a name="3161">3161</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
36
</td>
<td class="s"> $self->extension_is(@$wr); </td>
</tr>
<tr>
<td class="h" >
<a name="3162">3162</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3163">3163</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3164">3164</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub die_cant_write ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="3165">3165</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3165-1">
1
</a>
</td>
<td >
</td>
<td >
2
</td>
<td class="s"> my($self, $what) = (shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="3166">3166</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die $what, $self->interpolate("File %F is not writable per `is_writable' confuration variable, current value is `"), </td>
</tr>
<tr>
<td class="h" >
<a name="3167">3167</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
5
</td>
<td class="s"> join(', ', @{$self->get_config('is_writable')}), "'"; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3168">3168</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3169">3169</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3170">3170</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub can_write_or_die ($$) { </td>
</tr>
<tr>
<td class="h" >
<a name="3171">3171</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3171-1">
14
</a>
</td>
<td >
</td>
<td >
20
</td>
<td class="s"> my($self, $what) = (shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="3172">3172</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
34
</td>
<td class="s"> my $wr = $self->can_write; </td>
</tr>
<tr>
<td class="h" >
<a name="3173">3173</a>
</td>
<td class="c3" >
14
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3173-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
30
</td>
<td class="s"> return $wr if $wr; </td>
</tr>
<tr>
<td class="h" >
<a name="3174">3174</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
7
</td>
<td class="s"> $self->die_cant_write($what); </td>
</tr>
<tr>
<td class="h" >
<a name="3175">3175</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3176">3176</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3177">3177</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item update_tags( [ $data, [ $force2 ]] ) </td>
</tr>
<tr>
<td class="h" >
<a name="3178">3178</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3179">3179</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3 = MP3::Tag->new($filename); </td>
</tr>
<tr>
<td class="h" >
<a name="3180">3180</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->update_tags(); # Fetches the info, and updates tags </td>
</tr>
<tr>
<td class="h" >
<a name="3181">3181</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3182">3182</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->update_tags({}); # Updates tags if needed/changed </td>
</tr>
<tr>
<td class="h" >
<a name="3183">3183</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3184">3184</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->update_tags({title => 'This is not a song'}); # Updates tags </td>
</tr>
<tr>
<td class="h" >
<a name="3185">3185</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3186">3186</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> This method updates ID3v1 and ID3v2 tags (the latter only if in-memory copy </td>
</tr>
<tr>
<td class="h" >
<a name="3187">3187</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> contains any data, or $data does not fit ID3v1 restrictions, or $force2 </td>
</tr>
<tr>
<td class="h" >
<a name="3188">3188</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> argument is given) </td>
</tr>
<tr>
<td class="h" >
<a name="3189">3189</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> with the the information about title, artist, album, year, comment, track, </td>
</tr>
<tr>
<td class="h" >
<a name="3190">3190</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> genre from the hash reference $data. The format of $data is the same as </td>
</tr>
<tr>
<td class="h" >
<a name="3191">3191</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> one returned from autoinfo() (with or without the optional argument 'from'). </td>
</tr>
<tr>
<td class="h" >
<a name="3192">3192</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The fields which are marked as coming from ID3v1 or ID3v2 tags are not updated </td>
</tr>
<tr>
<td class="h" >
<a name="3193">3193</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> when written to the same tag. </td>
</tr>
<tr>
<td class="h" >
<a name="3194">3194</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3195">3195</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If $data is not defined or missing, C<autoinfo('from')> is called to obtain </td>
</tr>
<tr>
<td class="h" >
<a name="3196">3196</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the data. Returns the object reference itself to simplify chaining of method </td>
</tr>
<tr>
<td class="h" >
<a name="3197">3197</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> calls. </td>
</tr>
<tr>
<td class="h" >
<a name="3198">3198</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3199">3199</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> This is probably the simplest way to set data in the tags: populate </td>
</tr>
<tr>
<td class="h" >
<a name="3200">3200</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $data and call this method - no further tinkering with subtags is </td>
</tr>
<tr>
<td class="h" >
<a name="3201">3201</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> needed. </td>
</tr>
<tr>
<td class="h" >
<a name="3202">3202</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3203">3203</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="3204">3204</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3205">3205</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub update_tags { </td>
</tr>
<tr>
<td class="h" >
<a name="3206">3206</a>
</td>
<td class="c3" >
32
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3206-1">
32
</a>
</td>
<td >
</td>
<td >
527
</td>
<td class="s"> my ($mp3, $data, $force2, $wr2) = (shift, shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="3207">3207</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3208">3208</a>
</td>
<td class="c3" >
32
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
52
</td>
<td class="s"> $mp3->get_tags; </td>
</tr>
<tr>
<td class="h" >
<a name="3209">3209</a>
</td>
<td class="c3" >
32
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3209-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
81
</td>
<td class="s"> $data = $mp3->autoinfo('from') unless defined $data; </td>
</tr>
<tr>
<td class="h" >
<a name="3210">3210</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3211">3211</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $mp3->new_tag("ID3v1") unless $wr1 = exists $mp3->{ID3v1}; </td>
</tr>
<tr>
<td class="h" >
<a name="3212">3212</a>
</td>
<td class="c3" >
32
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3212-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
61
</td>
<td class="s"> unless (exists $mp3->{ID3v1}) { </td>
</tr>
<tr>
<td class="h" >
<a name="3213">3213</a>
</td>
<td class="c3" >
13
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
48
</td>
<td class="s"> $mp3->can_write_or_die('update_tags() doing ID3v1: '); </td>
</tr>
<tr>
<td class="h" >
<a name="3214">3214</a>
</td>
<td class="c3" >
12
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
13
</td>
<td class="s"> $wr2 = 1; </td>
</tr>
<tr>
<td class="h" >
<a name="3215">3215</a>
</td>
<td class="c3" >
12
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
26
</td>
<td class="s"> $mp3->new_tag("ID3v1"); </td>
</tr>
<tr>
<td class="h" >
<a name="3216">3216</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3217">3217</a>
</td>
<td class="c3" >
31
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
23
</td>
<td class="s"> my $elt; </td>
</tr>
<tr>
<td class="h" >
<a name="3218">3218</a>
</td>
<td class="c3" >
31
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
45
</td>
<td class="s"> for $elt (qw/title artist album year comment track genre/) { </td>
</tr>
<tr>
<td class="h" >
<a name="3219">3219</a>
</td>
<td class="c3" >
217
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
173
</td>
<td class="s"> my $d = $data->{$elt}; </td>
</tr>
<tr>
<td class="h" >
<a name="3220">3220</a>
</td>
<td class="c3" >
217
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3220-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
296
</td>
<td class="s"> next unless defined $d; </td>
</tr>
<tr>
<td class="h" >
<a name="3221">3221</a>
</td>
<td class="c3" >
74
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3221-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
115
</td>
<td class="s"> $d = [$d, ''] unless ref $d; </td>
</tr>
<tr>
<td class="h" >
<a name="3222">3222</a>
</td>
<td class="c3" >
74
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3222-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
324
</td>
<td class="s"> $mp3->{ID3v1}->$elt( $d->[0] ) if $d->[1] ne 'ID3v1'; </td>
</tr>
<tr>
<td class="h" >
<a name="3223">3223</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } # Skip what is already there... </td>
</tr>
<tr>
<td class="h" >
<a name="3224">3224</a>
</td>
<td class="c3" >
31
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
79
</td>
<td class="s"> $mp3->{ID3v1}->write_tag; </td>
</tr>
<tr>
<td class="h" >
<a name="3225">3225</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3226">3226</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $do_length </td>
</tr>
<tr>
<td class="h" >
<a name="3227">3227</a>
</td>
<td class="c3" >
31
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3227-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
58
</td>
<td class="s"> = (defined $mp3->{ms}) ? ($mp3->get_config('update_length'))->[0] : 0; </td>
</tr>
<tr>
<td class="h" >
<a name="3228">3228</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3229">3229</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return $mp3 </td>
</tr>
<tr>
<td class="h" >
<a name="3230">3230</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if not $force2 and $mp3->{ID3v1}->fits_tag($data) </td>
</tr>
<tr>
<td class="h" >
<a name="3231">3231</a>
</td>
<td class="c3" >
31
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3231-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3231-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
106
</td>
<td class="s"> and not exists $mp3->{ID3v2} and $do_length < 2; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-2">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#-3">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3232">3232</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3233">3233</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $mp3->new_tag("ID3v2") unless exists $mp3->{ID3v2}; </td>
</tr>
<tr>
<td class="h" >
<a name="3234">3234</a>
</td>
<td class="c3" >
26
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3234-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
46
</td>
<td class="s"> unless (exists $mp3->{ID3v2}) { </td>
</tr>
<tr>
<td class="h" >
<a name="3235">3235</a>
</td>
<td class="c3" >
3
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3235-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
8
</td>
<td class="s"> if (defined $wr2) { </td>
</tr>
<tr>
<td class="h" >
<a name="3236">3236</a>
</td>
<td class="c3" >
2
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3236-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> $mp3->die_cant_write('update_tags() doing ID3v2: ') unless $wr2; </td>
</tr>
<tr>
<td class="h" >
<a name="3237">3237</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } else { </td>
</tr>
<tr>
<td class="h" >
<a name="3238">3238</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> $mp3->can_write_or_die('update_tags() doing ID3v2: '); </td>
</tr>
<tr>
<td class="h" >
<a name="3239">3239</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3240">3240</a>
</td>
<td class="c3" >
3
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
7
</td>
<td class="s"> $mp3->new_tag("ID3v2"); </td>
</tr>
<tr>
<td class="h" >
<a name="3241">3241</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3242">3242</a>
</td>
<td class="c3" >
26
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
42
</td>
<td class="s"> for $elt (qw/title artist album year comment track genre/) { </td>
</tr>
<tr>
<td class="h" >
<a name="3243">3243</a>
</td>
<td class="c3" >
182
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
164
</td>
<td class="s"> my $d = $data->{$elt}; </td>
</tr>
<tr>
<td class="h" >
<a name="3244">3244</a>
</td>
<td class="c3" >
182
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3244-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
219
</td>
<td class="s"> next unless defined $d; </td>
</tr>
<tr>
<td class="h" >
<a name="3245">3245</a>
</td>
<td class="c3" >
69
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3245-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
109
</td>
<td class="s"> $d = [$d, ''] unless ref $d; </td>
</tr>
<tr>
<td class="h" >
<a name="3246">3246</a>
</td>
<td class="c3" >
69
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3246-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
214
</td>
<td class="s"> $mp3->{ID3v2}->$elt( $d->[0] ) if $d->[1] ne 'ID3v2'; </td>
</tr>
<tr>
<td class="h" >
<a name="3247">3247</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } # Skip what is already there... </td>
</tr>
<tr>
<td class="h" >
<a name="3248">3248</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # $mp3->{ID3v2}->comment($data->{comment}->[0]); </td>
</tr>
<tr>
<td class="h" >
<a name="3249">3249</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3250">3250</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->set_id3v2_frame('TLEN', $mp3->{ms}) </td>
</tr>
<tr>
<td class="h" >
<a name="3251">3251</a>
</td>
<td class="c3" >
26
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3251-1">
50
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3251-1">
33
</a>
</td>
<td >
</td>
<td >
</td>
<td >
63
</td>
<td class="s"> if $do_length and not $mp3->have_id3v2_frame('TLEN'); </td>
</tr>
<tr>
<td class="h" >
<a name="3252">3252</a>
</td>
<td class="c3" >
26
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
63
</td>
<td class="s"> $mp3->{ID3v2}->write_tag; </td>
</tr>
<tr>
<td class="h" >
<a name="3253">3253</a>
</td>
<td class="c3" >
26
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
118
</td>
<td class="s"> return $mp3; </td>
</tr>
<tr>
<td class="h" >
<a name="3254">3254</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3255">3255</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3256">3256</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub _massage_genres ($;$) { # Thanks to neil verplank for the prototype </td>
</tr>
<tr>
<td class="h" >
<a name="3257">3257</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3257-1">
71
</a>
</td>
<td >
</td>
<td >
254
</td>
<td class="s"> require MP3::Tag::ID3v1; </td>
</tr>
<tr>
<td class="h" >
<a name="3258">3258</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
79
</td>
<td class="s"> my($data, $how) = (shift, shift); </td>
</tr>
<tr>
<td class="h" >
<a name="3259">3259</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3259-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
181
</td>
<td class="s"> my $firstnum = (($how || 0) eq 'num'); </td>
</tr>
<tr>
<td class="h" >
<a name="3260">3260</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3260-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
131
</td>
<td class="s"> my $prefer_num = (($how || 0) eq 'prefer_num'); </td>
</tr>
<tr>
<td class="h" >
<a name="3261">3261</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
37
</td>
<td class="s"> my (%seen, @genres); # find all genres in incoming data </td>
</tr>
<tr>
<td class="h" >
<a name="3262">3262</a>
</td>
<td class="c3" >
71
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3262-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
90
</td>
<td class="s"> $data = $data->[0] if ref $data; </td>
</tr>
<tr>
<td class="h" >
<a name="3263">3263</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # clean and split line on both null and parentheses </td>
</tr>
<tr>
<td class="h" >
<a name="3264">3264</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
132
</td>
<td class="s"> $data =~ s/\s+/ /g; </td>
</tr>
<tr>
<td class="h" >
<a name="3265">3265</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
71
</td>
<td class="s"> $data =~ s/\s*\0[\0\s]*/\0/g; </td>
</tr>
<tr>
<td class="h" >
<a name="3266">3266</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
89
</td>
<td class="s"> $data =~ s/^[\s\0]+//; </td>
</tr>
<tr>
<td class="h" >
<a name="3267">3267</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
78
</td>
<td class="s"> $data =~ s/[\s\0]+$//; </td>
</tr>
<tr>
<td class="h" >
<a name="3268">3268</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
232
</td>
<td class="s"> my @data = split m<\0|\s+/\s+>, $data; </td>
</tr>
<tr>
<td class="h" >
<a name="3269">3269</a>
</td>
<td class="c3" >
71
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3269-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
231
</td>
<td class="s"> @data = split /\( ( \d+ | rx | cr ) \)/xi, $data[0] if @data == 1; </td>
</tr>
<tr>
<td class="h" >
<a name="3270">3270</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3271">3271</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # review array, produce a clean, ordered list of unique genres for output </td>
</tr>
<tr>
<td class="h" >
<a name="3272">3272</a>
</td>
<td class="c3" >
71
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
94
</td>
<td class="s"> foreach my $genre (@data) { </td>
</tr>
<tr>
<td class="h" >
<a name="3273">3273</a>
</td>
<td class="c3" >
138
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3273-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
196
</td>
<td class="s"> next if $genre eq ""; # (12)(13) ==> in front, and between </td>
</tr>
<tr>
<td class="h" >
<a name="3274">3274</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3275">3275</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # convert text to number to eliminate collisions, and produce consistent output </td>
</tr>
<tr>
<td class="h" >
<a name="3276">3276</a>
</td>
<td class="c3" >
89
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3276-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
163
</td>
<td class="s"> if ($genre =~ /\D/) {{ # Not a pure number </td>
</tr>
<tr>
<td class="h" >
<a name="3277">3277</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # return id number </td>
</tr>
<tr>
<td class="h" >
<a name="3278">3278</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
11
</td>
<td class="s"> my $genre_num = MP3::Tag::ID3v1::genres($genre); </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
26
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3279">3279</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # 255 is "non-standard text" in ID3v1; pass the rest through </td>
</tr>
<tr>
<td class="h" >
<a name="3280">3280</a>
</td>
<td class="c3" >
14
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3280-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3280-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
45
</td>
<td class="s"> last if $genre_num eq '255' or $genre_num eq ''; </td>
</tr>
<tr>
<td class="h" >
<a name="3281">3281</a>
</td>
<td class="c3" >
2
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3281-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
6
</td>
<td class="s"> return $genre_num if $firstnum; </td>
</tr>
<tr>
<td class="h" >
<a name="3282">3282</a>
</td>
<td class="c3" >
1
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3282-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
3
</td>
<td class="s"> $genre = $genre_num, last if $prefer_num; </td>
</tr>
<tr>
<td class="h" >
<a name="3283">3283</a>
</td>
<td class="c0" >
<a href="#3284">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $genre_num = MP3::Tag::ID3v1::genres($genre_num); </td>
</tr>
<tr>
<td class="h" >
<a name="3284">3284</a>
</td>
<td class="c0" >
<a href="#3285">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3284-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> last unless defined $genre_num; </td>
</tr>
<tr>
<td class="h" >
<a name="3285">3285</a>
</td>
<td class="c0" >
<a href="#3326">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
0
</td>
<td class="s"> $genre = $genre_num; </td>
</tr>
<tr>
<td class="h" >
<a name="3286">3286</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> }} # Now converted to a number - if possible </td>
</tr>
<tr>
<td class="h" >
<a name="3287">3287</a>
</td>
<td class="c3" >
88
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3287-1">
100
</a>
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3287-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
276
</td>
<td class="s"> unless ($prefer_num or $genre =~ /\D/) {{ # Here $genre is a number </td>
</tr>
<tr>
<td class="h" >
<a name="3288">3288</a>
</td>
<td class="c3" >
61
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3288-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
38
</td>
<td class="s"> my $genre_str = MP3::Tag::ID3v1::genres($genre) or last; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c3" >
61
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
113
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3289">3289</a>
</td>
<td class="c3" >
39
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3289-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
87
</td>
<td class="s"> return $genre if $firstnum; </td>
</tr>
<tr>
<td class="h" >
<a name="3290">3290</a>
</td>
<td class="c3" >
24
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
28
</td>
<td class="s"> $genre = $genre_str; </td>
</tr>
<tr>
<td class="h" >
<a name="3291">3291</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> }} </td>
</tr>
<tr>
<td class="h" >
<a name="3292">3292</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # 2.4 defines these conversions </td>
</tr>
<tr>
<td class="h" >
<a name="3293">3293</a>
</td>
<td class="c3" >
73
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3293-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
110
</td>
<td class="s"> $genre = "Remix" if lc $genre eq "rx"; </td>
</tr>
<tr>
<td class="h" >
<a name="3294">3294</a>
</td>
<td class="c3" >
73
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3294-1">
50
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
103
</td>
<td class="s"> $genre = "Cover" if lc $genre eq "cr"; </td>
</tr>
<tr>
<td class="h" >
<a name="3295">3295</a>
</td>
<td class="c3" >
73
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3295-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3295-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
285
</td>
<td class="s"> $genre = "($genre)" if length $genre and not $genre =~ /\D/; # Only digits </td>
</tr>
<tr>
<td class="h" >
<a name="3296">3296</a>
</td>
<td class="c3" >
73
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3296-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
227
</td>
<td class="s"> push @genres, $genre unless $seen{$genre}++; </td>
</tr>
<tr>
<td class="h" >
<a name="3297">3297</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3298">3298</a>
</td>
<td class="c3" >
55
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3298-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
76
</td>
<td class="s"> return if $firstnum; </td>
</tr>
<tr>
<td class="h" >
<a name="3299">3299</a>
</td>
<td class="c3" >
48
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
180
</td>
<td class="s"> @genres; </td>
</tr>
<tr>
<td class="h" >
<a name="3300">3300</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3301">3301</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3302">3302</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item extension_is </td>
</tr>
<tr>
<td class="h" >
<a name="3303">3303</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3304">3304</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $mp3->extension_is(@EXT_LIST) </td>
</tr>
<tr>
<td class="h" >
<a name="3305">3305</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3306">3306</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> returns TRUE if the extension of the filename coincides (case-insensitive) </td>
</tr>
<tr>
<td class="h" >
<a name="3307">3307</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> with one of the elements of the list. </td>
</tr>
<tr>
<td class="h" >
<a name="3308">3308</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3309">3309</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="3310">3310</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3311">3311</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub extension_is ($@) { </td>
</tr>
<tr>
<td class="h" >
<a name="3312">3312</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3312-1">
14
</a>
</td>
<td >
</td>
<td >
31
</td>
<td class="s"> my ($self) = (shift); </td>
</tr>
<tr>
<td class="h" >
<a name="3313">3313</a>
</td>
<td class="c3" >
14
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
38
</td>
<td class="s"> my $ext = lc($self->filename_extension_nodot()); </td>
</tr>
<tr>
<td class="h" >
<a name="3314">3314</a>
</td>
<td class="c3" >
14
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3314-1">
100
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
82
</td>
<td class="s"> return 1 if grep $ext eq lc, @_; </td>
</tr>
<tr>
<td class="h" >
<a name="3315">3315</a>
</td>
<td class="c3" >
1
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
2
</td>
<td class="s"> return; </td>
</tr>
<tr>
<td class="h" >
<a name="3316">3316</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3317">3317</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3318">3318</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub DESTROY { </td>
</tr>
<tr>
<td class="h" >
<a name="3319">3319</a>
</td>
<td class="c3" >
84
</td>
<td >
</td>
<td >
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3319-1">
84
</a>
</td>
<td >
</td>
<td >
266
</td>
<td class="s"> my $self=shift; </td>
</tr>
<tr>
<td class="h" >
<a name="3320">3320</a>
</td>
<td class="c3" >
84
</td>
<td class="c3" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3320-1">
100
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--condition.html#3320-1">
66
</a>
</td>
<td >
</td>
<td >
</td>
<td >
367
</td>
<td class="s"> if (exists $self->{filename} and defined $self->{filename}) { </td>
</tr>
<tr>
<td class="h" >
<a name="3321">3321</a>
</td>
<td class="c3" >
82
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
194
</td>
<td class="s"> $self->{filename}->close; </td>
</tr>
<tr>
<td class="h" >
<a name="3322">3322</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3323">3323</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3324">3324</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3325">3325</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub parse_cfg_line ($$$) { </td>
</tr>
<tr>
<td class="h" >
<a name="3326">3326</a>
</td>
<td class="c0" >
<a href="#3327">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3326-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my ($self, $line, $data) = (shift,shift,shift); </td>
</tr>
<tr>
<td class="h" >
<a name="3327">3327</a>
</td>
<td class="c0" >
<a href="#3328">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3327-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return if $line =~ /^\s*(#|$)/; </td>
</tr>
<tr>
<td class="h" >
<a name="3328">3328</a>
</td>
<td class="c0" >
<a href="#3330">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3328-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> die "Unrecognized configuration file line: <<<$line>>>" </td>
</tr>
<tr>
<td class="h" >
<a name="3329">3329</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> unless $line =~ /^\s*(\w+)\s*=\s*(.*?)\s*$/; </td>
</tr>
<tr>
<td class="h" >
<a name="3330">3330</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> push @{$data->{$1}}, $2; </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#3347">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3331">3331</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3332">3332</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3333">3333</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item C<parse_cfg( [$filename] )> </td>
</tr>
<tr>
<td class="h" >
<a name="3334">3334</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3335">3335</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Reads configuration information from the specified file (defaults to </td>
</tr>
<tr>
<td class="h" >
<a name="3336">3336</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the value of configuration variable C<local_cfg_file>, which is </td>
</tr>
<tr>
<td class="h" >
<a name="3337">3337</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<~>-substituted). Empty lines and lines starting with C<#> are ignored. </td>
</tr>
<tr>
<td class="h" >
<a name="3338">3338</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The remaining lines should have format C<varname=value>; leading </td>
</tr>
<tr>
<td class="h" >
<a name="3339">3339</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and trailing whitespace is stripped; there may be several lines with the same </td>
</tr>
<tr>
<td class="h" >
<a name="3340">3340</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<varname>; this sets list-valued variables. </td>
</tr>
<tr>
<td class="h" >
<a name="3341">3341</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3342">3342</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="3343">3343</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3344">3344</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="3345">3345</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3346">3346</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub parse_cfg ($;$) { </td>
</tr>
<tr>
<td class="h" >
<a name="3347">3347</a>
</td>
<td class="c0" >
<a href="#3348">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3347-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my ($self, $file) = (shift,shift); </td>
</tr>
<tr>
<td class="h" >
<a name="3348">3348</a>
</td>
<td class="c0" >
<a href="#3349">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3348-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $file = ($self->get_config('local_cfg_file'))->[0] unless defined $file; </td>
</tr>
<tr>
<td class="h" >
<a name="3349">3349</a>
</td>
<td class="c0" >
<a href="#3350">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3349-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return unless defined $file; </td>
</tr>
<tr>
<td class="h" >
<a name="3350">3350</a>
</td>
<td class="c0" >
<a href="#3351">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3350-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $file =~ s,^~(?=[/\\]),$ENV{HOME}, if $ENV{HOME}; </td>
</tr>
<tr>
<td class="h" >
<a name="3351">3351</a>
</td>
<td class="c0" >
<a href="#3352">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3351-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return unless -e $file; </td>
</tr>
<tr>
<td class="h" >
<a name="3352">3352</a>
</td>
<td class="c0" >
<a href="#3353">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3352-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> open F, "< $file" or die "Can't open `$file' for read: $!"; </td>
</tr>
<tr>
<td class="h" >
<a name="3353">3353</a>
</td>
<td class="c0" >
<a href="#3354">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $data = {}; </td>
</tr>
<tr>
<td class="h" >
<a name="3354">3354</a>
</td>
<td class="c0" >
<a href="#3355">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> while (defined (my $l = <F>)) { </td>
</tr>
<tr>
<td class="h" >
<a name="3355">3355</a>
</td>
<td class="c0" >
<a href="#3357">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $self->parse_cfg_line($l, $data); </td>
</tr>
<tr>
<td class="h" >
<a name="3356">3356</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3357">3357</a>
</td>
<td class="c0" >
<a href="#3358">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3357-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> CORE::close F or die "Can't close `$file' for read: $!"; </td>
</tr>
<tr>
<td class="h" >
<a name="3358">3358</a>
</td>
<td class="c0" >
<a href="#3359">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for my $k (keys %$data) { </td>
</tr>
<tr>
<td class="h" >
<a name="3359">3359</a>
</td>
<td class="c0" >
<a href="# ">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $self->config($k, @{$data->{$k}}); </td>
</tr>
<tr>
<td class="h" >
<a > </a>
</td>
<td class="c0" >
<a href="#3371">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3360">3360</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3361">3361</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3362">3362</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3363">3363</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my @parents = qw(User Site Vendor); </td>
</tr>
<tr>
<td class="h" >
<a name="3364">3364</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3365">3365</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> @MP3::Tag::User::ISA = qw( MP3::Tag::Site MP3::Tag::Vendor </td>
</tr>
<tr>
<td class="h" >
<a name="3366">3366</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3::Tag::Implemenation ); # Make overridable </td>
</tr>
<tr>
<td class="h" >
<a name="3367">3367</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> @MP3::Tag::Site::ISA = qw( MP3::Tag::Vendor MP3::Tag::Implemenation ); </td>
</tr>
<tr>
<td class="h" >
<a name="3368">3368</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> @MP3::Tag::Vendor::ISA = qw( MP3::Tag::Implemenation ); </td>
</tr>
<tr>
<td class="h" >
<a name="3369">3369</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3370">3370</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> sub load_parents { </td>
</tr>
<tr>
<td class="h" >
<a name="3371">3371</a>
</td>
<td class="c0" >
<a href="#3372">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--subroutine.html#3371-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $par; </td>
</tr>
<tr>
<td class="h" >
<a name="3372">3372</a>
</td>
<td class="c0" >
<a href="#3373">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> while ($par = shift @parents) { </td>
</tr>
<tr>
<td class="h" >
<a name="3373">3373</a>
</td>
<td class="c0" >
<a href="#3375">
0
</a>
</td>
<td class="c0" >
<a href="blib-lib-MP3-Tag-pm--branch.html#3373-1">
0
</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return 1 if eval "require MP3::Tag::$par; 1" </td>
</tr>
<tr>
<td class="h" >
<a name="3374">3374</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3375">3375</a>
</td>
<td class="c0" >
0
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> return; </td>
</tr>
<tr>
<td class="h" >
<a name="3376">3376</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3377">3377</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> load_parents() unless $ENV{MP3TAG_SKIP_LOCAL}; </td>
</tr>
<tr>
<td class="h" >
<a name="3378">3378</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3::Tag->parse_cfg() unless $ENV{MP3TAG_SKIP_LOCAL}; </td>
</tr>
<tr>
<td class="h" >
<a name="3379">3379</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3380">3380</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> 1; </td>
</tr>
<tr>
<td class="h" >
<a name="3381">3381</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3382">3382</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =pod </td>
</tr>
<tr>
<td class="h" >
<a name="3383">3383</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3384">3384</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 ENVIRONMENT </td>
</tr>
<tr>
<td class="h" >
<a name="3385">3385</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3386">3386</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Some defaults for the operation of this module (and/or scripts distributed </td>
</tr>
<tr>
<td class="h" >
<a name="3387">3387</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> with this module) are set from </td>
</tr>
<tr>
<td class="h" >
<a name="3388">3388</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> environment. Assumed encodings (0 or encoding name): for read access: </td>
</tr>
<tr>
<td class="h" >
<a name="3389">3389</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3390">3390</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_DECODE_V1_DEFAULT MP3TAG_DECODE_V2_DEFAULT </td>
</tr>
<tr>
<td class="h" >
<a name="3391">3391</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_DECODE_FILENAME_DEFAULT MP3TAG_DECODE_FILES_DEFAULT </td>
</tr>
<tr>
<td class="h" >
<a name="3392">3392</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_DECODE_INF_DEFAULT MP3TAG_DECODE_CDDB_FILE_DEFAULT </td>
</tr>
<tr>
<td class="h" >
<a name="3393">3393</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_DECODE_CUE_DEFAULT </td>
</tr>
<tr>
<td class="h" >
<a name="3394">3394</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3395">3395</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for write access: </td>
</tr>
<tr>
<td class="h" >
<a name="3396">3396</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3397">3397</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_ENCODE_V1_DEFAULT MP3TAG_ENCODE_FILES_DEFAULT </td>
</tr>
<tr>
<td class="h" >
<a name="3398">3398</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3399">3399</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (if not set, default to corresponding C<DECODE> options). </td>
</tr>
<tr>
<td class="h" >
<a name="3400">3400</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3401">3401</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Defaults for the above: </td>
</tr>
<tr>
<td class="h" >
<a name="3402">3402</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3403">3403</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_DECODE_DEFAULT MP3TAG_ENCODE_DEFAULT </td>
</tr>
<tr>
<td class="h" >
<a name="3404">3404</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3405">3405</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (if the second one is not set, the value of the first one is used). </td>
</tr>
<tr>
<td class="h" >
<a name="3406">3406</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Value 0 for more specific variable will cancel the effect of the less </td>
</tr>
<tr>
<td class="h" >
<a name="3407">3407</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> specific variables. </td>
</tr>
<tr>
<td class="h" >
<a name="3408">3408</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3409">3409</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> These variables set default configuration settings for C<MP3::Tag>; </td>
</tr>
<tr>
<td class="h" >
<a name="3410">3410</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the values are read during the load time of the module. After load, </td>
</tr>
<tr>
<td class="h" >
<a name="3411">3411</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> one can use config()/get_config() methods to change/access these </td>
</tr>
<tr>
<td class="h" >
<a name="3412">3412</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> settings. See C<encode_encoding_*> and C<encode_decoding_*> in </td>
</tr>
<tr>
<td class="h" >
<a name="3413">3413</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> documentation of L<config|config> method. (Note that C<FILES> variant </td>
</tr>
<tr>
<td class="h" >
<a name="3414">3414</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> govern file read/written in non-binary mode by L<MP3/ParseData> module, </td>
</tr>
<tr>
<td class="h" >
<a name="3415">3415</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> as well as reading of control files of some scripts using this module, such as </td>
</tr>
<tr>
<td class="h" >
<a name="3416">3416</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<typeset_audio_dir>.) </td>
</tr>
<tr>
<td class="h" >
<a name="3417">3417</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3418">3418</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over </td>
</tr>
<tr>
<td class="h" >
<a name="3419">3419</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3420">3420</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item B<EXAMPLE> </td>
</tr>
<tr>
<td class="h" >
<a name="3421">3421</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3422">3422</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Assume that locally present CDDB files and F<.inf> files </td>
</tr>
<tr>
<td class="h" >
<a name="3423">3423</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> are in encoding C<cp1251> (this is not supported by "standard", but since </td>
</tr>
<tr>
<td class="h" >
<a name="3424">3424</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the standard supports only a handful of languages, this is widely used anyway), </td>
</tr>
<tr>
<td class="h" >
<a name="3425">3425</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and that one wants C<ID3v1> fields to be in the same encoding, but C<ID3v2> </td>
</tr>
<tr>
<td class="h" >
<a name="3426">3426</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> have an honest (Unicode, if needed) encoding. Then set </td>
</tr>
<tr>
<td class="h" >
<a name="3427">3427</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3428">3428</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_DECODE_INF_DEFAULT=cp1251 </td>
</tr>
<tr>
<td class="h" >
<a name="3429">3429</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_DECODE_CDDB_FILE_DEFAULT=cp1251 </td>
</tr>
<tr>
<td class="h" >
<a name="3430">3430</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_DECODE_V1_DEFAULT=cp1251 </td>
</tr>
<tr>
<td class="h" >
<a name="3431">3431</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3432">3432</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Since C<MP3TAG_DECODE_V1_DEFAULT> implies C<MP3TAG_ENCODE_V1_DEFAULT>, </td>
</tr>
<tr>
<td class="h" >
<a name="3433">3433</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> you will get the desired effect both for read and write of MP3 tags. </td>
</tr>
<tr>
<td class="h" >
<a name="3434">3434</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3435">3435</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="3436">3436</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3437">3437</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Additionally, the following (unsupported) variables are currently </td>
</tr>
<tr>
<td class="h" >
<a name="3438">3438</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> recognized by ID3v2 code: </td>
</tr>
<tr>
<td class="h" >
<a name="3439">3439</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3440">3440</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_DECODE_UNICODE MP3TAG_DECODE_UTF8 </td>
</tr>
<tr>
<td class="h" >
<a name="3441">3441</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3442">3442</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3TAG_DECODE_UNICODE (default 1) enables decoding; the target of </td>
</tr>
<tr>
<td class="h" >
<a name="3443">3443</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> decoding is determined by MP3TAG_DECODE_UTF8: if 0, decoded values are </td>
</tr>
<tr>
<td class="h" >
<a name="3444">3444</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> byte-encoded UTF-8 (every Perl character contains a byte of UTF-8 </td>
</tr>
<tr>
<td class="h" >
<a name="3445">3445</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> encoded string); otherwise (default) it is a native Perl Unicode </td>
</tr>
<tr>
<td class="h" >
<a name="3446">3446</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> string. </td>
</tr>
<tr>
<td class="h" >
<a name="3447">3447</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3448">3448</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> If C<MP3TAG_SKIP_LOCAL> is true, local customization files are not loaded. </td>
</tr>
<tr>
<td class="h" >
<a name="3449">3449</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3450">3450</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 CUSTOMIZATION </td>
</tr>
<tr>
<td class="h" >
<a name="3451">3451</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3452">3452</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Many aspects of operation of this module are subject to certain subtle </td>
</tr>
<tr>
<td class="h" >
<a name="3453">3453</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> choices. A lot of effort went into making these choices customizable, </td>
</tr>
<tr>
<td class="h" >
<a name="3454">3454</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> by setting global or per-object configuration variables. </td>
</tr>
<tr>
<td class="h" >
<a name="3455">3455</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3456">3456</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> A certain degree of customization of global configuration variables is </td>
</tr>
<tr>
<td class="h" >
<a name="3457">3457</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> available via the environment variables. Moreover, at startup the local </td>
</tr>
<tr>
<td class="h" >
<a name="3458">3458</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> customization file F<~/.mp3tagprc> is read, and defaults are set accordingly. </td>
</tr>
<tr>
<td class="h" >
<a name="3459">3459</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3460">3460</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> In addition, to make customization as flexible as possible, I<ALL> aspects </td>
</tr>
<tr>
<td class="h" >
<a name="3461">3461</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> of operation of C<MP3::Tag> are subject to local override. Three customization </td>
</tr>
<tr>
<td class="h" >
<a name="3462">3462</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> modules </td>
</tr>
<tr>
<td class="h" >
<a name="3463">3463</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3464">3464</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3::Tag::User MP3::Tag::Site MP3::Tag::Vendor </td>
</tr>
<tr>
<td class="h" >
<a name="3465">3465</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3466">3466</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> are attempted to be loaded if present. Only the first module (of </td>
</tr>
<tr>
<td class="h" >
<a name="3467">3467</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> those present) is loaded directly; if sequential load is desirable, </td>
</tr>
<tr>
<td class="h" >
<a name="3468">3468</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the first thing a customization module should do is to call </td>
</tr>
<tr>
<td class="h" >
<a name="3469">3469</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3470">3470</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3::Tag->load_parents() </td>
</tr>
<tr>
<td class="h" >
<a name="3471">3471</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3472">3472</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> method. </td>
</tr>
<tr>
<td class="h" >
<a name="3473">3473</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3474">3474</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The customization modules have an opportunity to change global </td>
</tr>
<tr>
<td class="h" >
<a name="3475">3475</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> configuration variables on load. To allow more flexibility, they may </td>
</tr>
<tr>
<td class="h" >
<a name="3476">3476</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> override any method defined in C<MP3::Tag>; as usual, the overriden </td>
</tr>
<tr>
<td class="h" >
<a name="3477">3477</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> method may be called using C<SUPER> modifier (see L<perlobj/"Method </td>
</tr>
<tr>
<td class="h" >
<a name="3478">3478</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> invocation">). </td>
</tr>
<tr>
<td class="h" >
<a name="3479">3479</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3480">3480</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> E.g., it is recommended to make a local customization file with </td>
</tr>
<tr>
<td class="h" >
<a name="3481">3481</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3482">3482</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> eval 'require Normalize::Text::Music_Fields'; </td>
</tr>
<tr>
<td class="h" >
<a name="3483">3483</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for my $elt ( qw( title track artist album comment year genre </td>
</tr>
<tr>
<td class="h" >
<a name="3484">3484</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> title_track artist_collection person ) ) { </td>
</tr>
<tr>
<td class="h" >
<a name="3485">3485</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> no strict 'refs'; </td>
</tr>
<tr>
<td class="h" >
<a name="3486">3486</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3::Tag->config("translate_$elt", \&{"Normalize::Text::Music_Fields::normalize_$elt"}) </td>
</tr>
<tr>
<td class="h" >
<a name="3487">3487</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if defined &{"Normalize::Text::Music_Fields::normalize_$elt"}; </td>
</tr>
<tr>
<td class="h" >
<a name="3488">3488</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> } </td>
</tr>
<tr>
<td class="h" >
<a name="3489">3489</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> MP3::Tag->config("short_person", \&Normalize::Text::Music_Fields::short_person) </td>
</tr>
<tr>
<td class="h" >
<a name="3490">3490</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> if defined &Normalize::Text::Music_Fields::short_person; </td>
</tr>
<tr>
<td class="h" >
<a name="3491">3491</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3492">3492</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> and install the (supplied, in the F<examples/modules>) module </td>
</tr>
<tr>
<td class="h" >
<a name="3493">3493</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<Normalize::Text::Music_Fields> which enables normalization of person </td>
</tr>
<tr>
<td class="h" >
<a name="3494">3494</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> names (to a long or a short form), and of music piece names to </td>
</tr>
<tr>
<td class="h" >
<a name="3495">3495</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> canonical forms. </td>
</tr>
<tr>
<td class="h" >
<a name="3496">3496</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3497">3497</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> To simplify debugging of local customization, it may be switched off </td>
</tr>
<tr>
<td class="h" >
<a name="3498">3498</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> completely by setting MP3TAG_SKIP_LOCAL to TRUE (in environment). </td>
</tr>
<tr>
<td class="h" >
<a name="3499">3499</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3500">3500</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> For example, putting </td>
</tr>
<tr>
<td class="h" >
<a name="3501">3501</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3502">3502</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> id3v23_unsync = 0 </td>
</tr>
<tr>
<td class="h" >
<a name="3503">3503</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3504">3504</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> into F<~/.mp3tagprc> will produce broken ID3v2 tags (but those required </td>
</tr>
<tr>
<td class="h" >
<a name="3505">3505</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> by ITunes). </td>
</tr>
<tr>
<td class="h" >
<a name="3506">3506</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3507">3507</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 EXAMPLE SCRIPTS </td>
</tr>
<tr>
<td class="h" >
<a name="3508">3508</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3509">3509</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Some example scripts come with this module (either installed, or in directory </td>
</tr>
<tr>
<td class="h" >
<a name="3510">3510</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> F<examples> in the distribution); they either use this module, or </td>
</tr>
<tr>
<td class="h" >
<a name="3511">3511</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> provide data understood by this module: </td>
</tr>
<tr>
<td class="h" >
<a name="3512">3512</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3513">3513</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over </td>
</tr>
<tr>
<td class="h" >
<a name="3514">3514</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3515">3515</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item mp3info2 </td>
</tr>
<tr>
<td class="h" >
<a name="3516">3516</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3517">3517</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> perform command line manipulation of audio tags (and more!); </td>
</tr>
<tr>
<td class="h" >
<a name="3518">3518</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3519">3519</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item audio_rename </td>
</tr>
<tr>
<td class="h" >
<a name="3520">3520</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3521">3521</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> rename audio files according to associated tags (and more!); </td>
</tr>
<tr>
<td class="h" >
<a name="3522">3522</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3523">3523</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item typeset_mp3_dir </td>
</tr>
<tr>
<td class="h" >
<a name="3524">3524</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3525">3525</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> write LaTeX files suitable for CD covers and normal-size sheet </td>
</tr>
<tr>
<td class="h" >
<a name="3526">3526</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> descriptions of hierarchy of audio files; </td>
</tr>
<tr>
<td class="h" >
<a name="3527">3527</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3528">3528</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item mp3_total_time </td>
</tr>
<tr>
<td class="h" >
<a name="3529">3529</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3530">3530</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Calculate total duration of audio files; </td>
</tr>
<tr>
<td class="h" >
<a name="3531">3531</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3532">3532</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item eat_wav_mp3_header </td>
</tr>
<tr>
<td class="h" >
<a name="3533">3533</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3534">3534</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> remove WAV headers from MP3 files in WAV containers. </td>
</tr>
<tr>
<td class="h" >
<a name="3535">3535</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3536">3536</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item fulltoc_2fake_cddb </td>
</tr>
<tr>
<td class="h" >
<a name="3537">3537</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3538">3538</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> converts a CD's "full TOC" to a "fake" CDDB file (header only). Create </td>
</tr>
<tr>
<td class="h" >
<a name="3539">3539</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> this file with something like </td>
</tr>
<tr>
<td class="h" >
<a name="3540">3540</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3541">3541</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> readcd -fulltoc dev=0,1,0 -f=audio_cd >& nul </td>
</tr>
<tr>
<td class="h" >
<a name="3542">3542</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3543">3543</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> run similar to </td>
</tr>
<tr>
<td class="h" >
<a name="3544">3544</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3545">3545</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> fulltoc_2fake_cddb < audio_cd.toc | cddb2cddb > cddb.out </td>
</tr>
<tr>
<td class="h" >
<a name="3546">3546</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3547">3547</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item dir_mp3_2fake_cddb </td>
</tr>
<tr>
<td class="h" >
<a name="3548">3548</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3549">3549</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> tries to convert a directory of MP3 files to a "fake" CDDB file (header only); </td>
</tr>
<tr>
<td class="h" >
<a name="3550">3550</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> assumes that files are a rip from a CD, and that alphabetical sort gives </td>
</tr>
<tr>
<td class="h" >
<a name="3551">3551</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the track order (works only heuristically, since quantization of duration </td>
</tr>
<tr>
<td class="h" >
<a name="3552">3552</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> of MP3 files and of CD tracks is so different). </td>
</tr>
<tr>
<td class="h" >
<a name="3553">3553</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3554">3554</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Run similar to </td>
</tr>
<tr>
<td class="h" >
<a name="3555">3555</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3556">3556</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> dir_mp3_2fake_cddb | cddb2cddb > cddb.out </td>
</tr>
<tr>
<td class="h" >
<a name="3557">3557</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3558">3558</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3559">3559</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item inf_2fake_cddb </td>
</tr>
<tr>
<td class="h" >
<a name="3560">3560</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3561">3561</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> tries to convert a directory of F<.inf> files to a "fake" CDDB file (header </td>
</tr>
<tr>
<td class="h" >
<a name="3562">3562</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> only). (Still heuristic, since it can't guess the length of the leader.) </td>
</tr>
<tr>
<td class="h" >
<a name="3563">3563</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3564">3564</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Run similar to </td>
</tr>
<tr>
<td class="h" >
<a name="3565">3565</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3566">3566</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> inf_2fake_cddb | cddb2cddb > cddb.out </td>
</tr>
<tr>
<td class="h" >
<a name="3567">3567</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3568">3568</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item cddb2cddb </td>
</tr>
<tr>
<td class="h" >
<a name="3569">3569</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3570">3570</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Reads a (header of) CDDB file from STDIN, outputs (on STDOUT) the current </td>
</tr>
<tr>
<td class="h" >
<a name="3571">3571</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> version of the database record. Can be used to update a file, and/or to </td>
</tr>
<tr>
<td class="h" >
<a name="3572">3572</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> convert a fake CDDB file to a real one. </td>
</tr>
<tr>
<td class="h" >
<a name="3573">3573</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3574">3574</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="3575">3575</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3576">3576</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (Last four do not use these modules!) </td>
</tr>
<tr>
<td class="h" >
<a name="3577">3577</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3578">3578</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Some more examples: </td>
</tr>
<tr>
<td class="h" >
<a name="3579">3579</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3580">3580</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> # Convert from one (non-standard-conforming!) encoding to another </td>
</tr>
<tr>
<td class="h" >
<a name="3581">3581</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> perl -MMP3::Tag -MEncode -wle ' </td>
</tr>
<tr>
<td class="h" >
<a name="3582">3582</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my @fields = qw(artist album title comment); </td>
</tr>
<tr>
<td class="h" >
<a name="3583">3583</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for my $f (@ARGV) { </td>
</tr>
<tr>
<td class="h" >
<a name="3584">3584</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> print $f; </td>
</tr>
<tr>
<td class="h" >
<a name="3585">3585</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> my $t = MP3::Tag->new($f) or die; </td>
</tr>
<tr>
<td class="h" >
<a name="3586">3586</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> $t->update_tags( </td>
</tr>
<tr>
<td class="h" >
<a name="3587">3587</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> { map { $_ => encode "cp1251", decode "koi8-r", $t->$_() }, @fields } </td>
</tr>
<tr>
<td class="h" >
<a name="3588">3588</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> ); </td>
</tr>
<tr>
<td class="h" >
<a name="3589">3589</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> }' list_of_audio_files </td>
</tr>
<tr>
<td class="h" >
<a name="3590">3590</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3591">3591</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 Problems with ID3 format </td>
</tr>
<tr>
<td class="h" >
<a name="3592">3592</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3593">3593</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> The largest problem with ID3 format is that the first versions of these </td>
</tr>
<tr>
<td class="h" >
<a name="3594">3594</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> format were absolutely broken (underspecified). It I<looks> like the newer </td>
</tr>
<tr>
<td class="h" >
<a name="3595">3595</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> versions of this format resolved most of these problems; however, in reality </td>
</tr>
<tr>
<td class="h" >
<a name="3596">3596</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> they did not (due to unspecified backward compatibility, and </td>
</tr>
<tr>
<td class="h" >
<a name="3597">3597</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> grandfathering considerations). </td>
</tr>
<tr>
<td class="h" >
<a name="3598">3598</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3599">3599</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> What are the problems with C<ID3v1>? First, one of the fields was C<artist>, </td>
</tr>
<tr>
<td class="h" >
<a name="3600">3600</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> which does not make any sense. In particular, different people/publishers </td>
</tr>
<tr>
<td class="h" >
<a name="3601">3601</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> would put there performer(s), composer, author of text/lyrics, or a combination </td>
</tr>
<tr>
<td class="h" >
<a name="3602">3602</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> of these. The second problem is that the only allowed encoding was </td>
</tr>
<tr>
<td class="h" >
<a name="3603">3603</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<iso-8859-1>; since most of languages of the world can't be expressed </td>
</tr>
<tr>
<td class="h" >
<a name="3604">3604</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> in this encoding, this restriction was completely ignored, thus the </td>
</tr>
<tr>
<td class="h" >
<a name="3605">3605</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> encoding is essentially "unknown". </td>
</tr>
<tr>
<td class="h" >
<a name="3606">3606</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3607">3607</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Newer versions of C<ID3> allow specification of encodings; however, </td>
</tr>
<tr>
<td class="h" >
<a name="3608">3608</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> since there is no way to specify that the encoding is "unknown", when a </td>
</tr>
<tr>
<td class="h" >
<a name="3609">3609</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> tag is automatically upgraded from C<ID3v1>, it is most probably assumed to be </td>
</tr>
<tr>
<td class="h" >
<a name="3610">3610</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> in the "standard" C<iso-8859-1> encoding. Thus impossibility to </td>
</tr>
<tr>
<td class="h" >
<a name="3611">3611</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> distinguish "unknown, assumed C<iso-8859-1>" from "known to be C<iso-8859-1>" </td>
</tr>
<tr>
<td class="h" >
<a name="3612">3612</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> in C<ID3v2>, essentially, makes any encoding specified in the tag "unknown" </td>
</tr>
<tr>
<td class="h" >
<a name="3613">3613</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (or, at least, "untrusted"). (Since the upgrade [or a chain of upgrades] </td>
</tr>
<tr>
<td class="h" >
<a name="3614">3614</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> from the C<ID3v1> tag to the C<ID3v2> tag can result in any encoding of </td>
</tr>
<tr>
<td class="h" >
<a name="3615">3615</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the "supposedly C<iso-8859-1>" tag, one cannot trust the content of </td>
</tr>
<tr>
<td class="h" >
<a name="3616">3616</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<ID3v2> tag even if it stored as Unicode strings.) </td>
</tr>
<tr>
<td class="h" >
<a name="3617">3617</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3618">3618</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> This is why this module provides what some may consider only lukewarm support </td>
</tr>
<tr>
<td class="h" >
<a name="3619">3619</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> for encoding field in ID3v2 tags: if done fully automatic, it can allow </td>
</tr>
<tr>
<td class="h" >
<a name="3620">3620</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> instant propagation of wrong information; and this propagation is in a form </td>
</tr>
<tr>
<td class="h" >
<a name="3621">3621</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> which is quite hard to undo (but still possible to do with suitable settings </td>
</tr>
<tr>
<td class="h" >
<a name="3622">3622</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> to this module; see L<mp3info2/"Examples on dealing with broken encodings">). </td>
</tr>
<tr>
<td class="h" >
<a name="3623">3623</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3624">3624</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Likewise, the same happens with the C<artist> field in C<ID3v1>. Since there </td>
</tr>
<tr>
<td class="h" >
<a name="3625">3625</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> is no way to specify just "artist, type unknown" in C<ID3v2> tags, when </td>
</tr>
<tr>
<td class="h" >
<a name="3626">3626</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<ID3v1> tag is automatically upgraded to C<ID3v2>, the content would most </td>
</tr>
<tr>
<td class="h" >
<a name="3627">3627</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> probably be put in the "main performer", C<TPE1>, tag. As a result, the </td>
</tr>
<tr>
<td class="h" >
<a name="3628">3628</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> content of C<TPE1> tag is also "untrusted" - it may contain, e.g., the composer. </td>
</tr>
<tr>
<td class="h" >
<a name="3629">3629</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3630">3630</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> In my opinion, a different field should be used for "known to be </td>
</tr>
<tr>
<td class="h" >
<a name="3631">3631</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> principal performer"; for example, the method performer() (and the </td>
</tr>
<tr>
<td class="h" >
<a name="3632">3632</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> script F<mp3info2> shipped with this module) uses C<%{TXXX[TPE1]}> in </td>
</tr>
<tr>
<td class="h" >
<a name="3633">3633</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> preference to C<%{TPE1}>. </td>
</tr>
<tr>
<td class="h" >
<a name="3634">3634</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3635">3635</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> For example, interpolate C<%{TXXX[TPE1]|TPE1}> or C<%{TXXX[TPE1]|a}> - </td>
</tr>
<tr>
<td class="h" >
<a name="3636">3636</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> this will use the frame C<TXXX> with identifier C<TPE1> if present, if not, </td>
</tr>
<tr>
<td class="h" >
<a name="3637">3637</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> it will use the frame C<TPE1> (the first example), or will try to get I<artist> </td>
</tr>
<tr>
<td class="h" >
<a name="3638">3638</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> by other means (including C<TPE1> frame) (the second example). </td>
</tr>
<tr>
<td class="h" >
<a name="3639">3639</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3640">3640</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 FILES </td>
</tr>
<tr>
<td class="h" >
<a name="3641">3641</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3642">3642</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> There are many files with special meaning to this module and its dependent </td>
</tr>
<tr>
<td class="h" >
<a name="3643">3643</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> modules. </td>
</tr>
<tr>
<td class="h" >
<a name="3644">3644</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3645">3645</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =over 4 </td>
</tr>
<tr>
<td class="h" >
<a name="3646">3646</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3647">3647</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item F<*.inf> </td>
</tr>
<tr>
<td class="h" >
<a name="3648">3648</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3649">3649</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Files with extension F<.inf> and the same basename as the audio file are </td>
</tr>
<tr>
<td class="h" >
<a name="3650">3650</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> read by module C<MP3::Tag::Inf>, and the extracted data is merged into the </td>
</tr>
<tr>
<td class="h" >
<a name="3651">3651</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> information flow according to configuration variable C<autoinfo>. </td>
</tr>
<tr>
<td class="h" >
<a name="3652">3652</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3653">3653</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> It is assumed that these files are compatible in format to the files written </td>
</tr>
<tr>
<td class="h" >
<a name="3654">3654</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> by the program F<cdda2wav>. </td>
</tr>
<tr>
<td class="h" >
<a name="3655">3655</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3656">3656</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item F<audio.cddb> F<cddb.out> F<cddb.in> </td>
</tr>
<tr>
<td class="h" >
<a name="3657">3657</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3658">3658</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> in the same directory as the audio file are read by module </td>
</tr>
<tr>
<td class="h" >
<a name="3659">3659</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> C<MP3::Tag::CDDB_File>, and the extracted data is merged into the </td>
</tr>
<tr>
<td class="h" >
<a name="3660">3660</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> information flow according to configuration variable C<autoinfo>. </td>
</tr>
<tr>
<td class="h" >
<a name="3661">3661</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3662">3662</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> (In fact, the list may be customized by configuration variable C<cddb_files>.) </td>
</tr>
<tr>
<td class="h" >
<a name="3663">3663</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3664">3664</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item F<audio_cd.toc> </td>
</tr>
<tr>
<td class="h" >
<a name="3665">3665</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3666">3666</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> in the same directory as the audio file may be read by the method </td>
</tr>
<tr>
<td class="h" >
<a name="3667">3667</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> id3v2_frames_autofill() (should be called explicitly) to fill the C<TXXX[MCDI-fulltoc]> </td>
</tr>
<tr>
<td class="h" >
<a name="3668">3668</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> frame. Depends on contents of configuration variable C<id3v2_frames_autofill>. </td>
</tr>
<tr>
<td class="h" >
<a name="3669">3669</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3670">3670</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =item F<~/.mp3tagprc> </td>
</tr>
<tr>
<td class="h" >
<a name="3671">3671</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3672">3672</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> By default, this file is read on startup (may be customized by overriding </td>
</tr>
<tr>
<td class="h" >
<a name="3673">3673</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> the method parse_cfg()). By default, the name of the file is in the </td>
</tr>
<tr>
<td class="h" >
<a name="3674">3674</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> configuration variable C<local_cfg_file>. </td>
</tr>
<tr>
<td class="h" >
<a name="3675">3675</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3676">3676</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =back </td>
</tr>
<tr>
<td class="h" >
<a name="3677">3677</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3678">3678</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 SEE ALSO </td>
</tr>
<tr>
<td class="h" >
<a name="3679">3679</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3680">3680</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tag::ID3v1>, L<MP3::Tag::ID3v2>, L<MP3::Tag::File>, </td>
</tr>
<tr>
<td class="h" >
<a name="3681">3681</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tag::ParseData>, L<MP3::Tag::Inf>, L<MP3::Tag::CDDB_File>, </td>
</tr>
<tr>
<td class="h" >
<a name="3682">3682</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tag::Cue>, L<MP3::Tag::ImageExifTool>, L<MP3::Tag::ImageSize>, </td>
</tr>
<tr>
<td class="h" >
<a name="3683">3683</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> L<MP3::Tag::LastResort>, L<mp3info2>, L<typeset_audio_dir>. </td>
</tr>
<tr>
<td class="h" >
<a name="3684">3684</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3685">3685</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =head1 COPYRIGHT </td>
</tr>
<tr>
<td class="h" >
<a name="3686">3686</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3687">3687</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> Copyright (c) 2000-2016 Thomas Geffert, Ilya Zakharevich. All rights reserved. </td>
</tr>
<tr>
<td class="h" >
<a name="3688">3688</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3689">3689</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> This program is free software; you can redistribute it and/or </td>
</tr>
<tr>
<td class="h" >
<a name="3690">3690</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> modify it under the terms of the Artistic License, distributed </td>
</tr>
<tr>
<td class="h" >
<a name="3691">3691</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> with Perl. </td>
</tr>
<tr>
<td class="h" >
<a name="3692">3692</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
<tr>
<td class="h" >
<a name="3693">3693</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> =cut </td>
</tr>
<tr>
<td class="h" >
<a name="3694">3694</a>
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td class="s"> </td>
</tr>
</table>
</body>
</html>
|