1Release Name: 1.15
2====================
3
4Tag.pm:	Fix more unescaped-{ warnings (thanks to Christian Walde etc).
5
6Release Name: 1.14
7====================
8
9Tag.pm: Quiet warnings from 5.22.
10	Start implementing handlers: instead of FRAM(langs)[opts], one can use, e.g., func_name(ID3v1,Cue)[arg1][arg2]
11		   # ID3v2::_frame_select_by_descr is missing //s
12	New configuration variable ampersand_joiner (default '; ').
13	New method _auto_field_from() (abstracted from _auto_field()).
14	Change logic of calling ->can() in _auto_field_from().
15	_parse_rex_microinterpolate() would not update $ecount on seeing %%.
16	When parsing with %=c etc: with %==c the match fails if there is no comment.
17		(Checked the same way as for %{c:}.)
18	Support some of %-escapes not being matched (e.g, due to alternatives in a REx).
19		(0-length matches were ignored anyway [when join()ing].)
20	parse_rex(), parse_rex_match() may return an extra result (if %{handler}s are present).
21	Recognize ID3v2 frame names as [A-Z]{3}[A-Z\d] (was \w{4}).
22		(Detection frame/vs/handler happens via PACKAGES; so if lang codes inf/cue appear, we may be in trouble.)
23	Use the same code in parse(_rex)?_prepare.  (Now parse() allows the same %-constructs as parse_rex().)
24ID3v2.pm:
25	New method have_one_of_frames().
26	New methods *_have() (for simplest fields: title, comment, track, artist, album, genre, year).
27ImageExifTool.pm:
28	Comprehensive docs.
29
30Release Name: 1.13
31====================
32
33Apply patches from Ian:
34 Makefile.PL,data_pod.PL: Fix path of ID3v2-Data.pod.
35 extract-y.pl: Fix #! path to perl.
36 data_pod.PL, Cue.pm, File.pm, LastResort.pm, ID3v1.pm,
37   ID3v2.pm, Tag.pm: Fix pod
38 ID3v2.pm: fix frame numbering documentation
39   (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D523804)
40 Many: preceeded/explicitely striking again ;-)
41
42ID3v2:	add section BUGS with explanation of how we treat v2.4 frames.
43	extract MP3 start bytes even if ID3v2 tag is present.
44	recognize MP3 MIME type by start bytes
45
46Tag.pm:	document mime_Pretype(), mime_type().
47	New optional arguments to mime_Pretype(), mime_type().
48	ID3v2 genre tag with value "Blues" or "(0)" could not be set
49		(thanks to Eric Benson for analysis).
50
51ID3v2_Data.pod: rename s/-/_/ - cygwin buggy, fails manifying
52		- this was BS, the problem is elsewhere
53
54mp3info2: state another time that COMM(eng)[lyrics] is a non-standard place
55	  for lyrics...
56
57Release Name: 1.12
58====================
59
60Music_Normalize_Fields: new short names in RUS table.
61  Eliminate one record which caused infinite recursion (vas i iva).
62
63ID3v2: replace order of encode() and func_back() when writing frames
64	(e.g., would break unicode genre with space in it).
65       "very low-level" docs had get_frame() mixed up with get_frames()
66		(thanks to Brendan Byrd)
67       new_with_parent() inserts header into parent on failure.
68       optional argument to _Data_to_MIME to return false on unknown.
69
70Tag.pm: better docs for interpolate().
71	misprints in example of update_tags().
72	When truncating inside interpolation, and the value is a number
73	  round it, not truncate.
74	Move old meaning of %{aR} to %{a3} (truncation to 3 places).
75	%{aR} is not rounded now; one may truncate as in %.5{aR} to restrict width.
76	New method mime_Pretype(); new interpolation escape %{mP}.
77	Optional argument to _Data_to_MIME() to return false on unknown.
78	For (image) mime types we can handle ourselves, do it.
79	default return for mime_type() is MP3 (in absense of support modules).
80	Misprint in _Data_to_MIME() made it useless.
81	New method aspect_ratio_inverted().
82	New escape %{aI} for aspect_ratio_inverted().
83	Allow for rounding of duration before formatting T[=>m,?H:,{mL}].
84
85File.pm: fix mismatched C<> in POD.
86
87mp3info2: -F disk_n=DISKNUMBER supported,
88  new configuration variable frames_write_creates_dirs (default 0) to create
89    intermediate directories baz/boz on -F "foo > baz/boz/bar".
90  Use %{mP} instead of `Audio' in the -x output.
91  Make -x=output of MP3-related data conditional on its presence (still wrong
92    since MP3::Info can return such data for non-MP3 files too XXX)
93
94typeset_audio_dir:
95	new option -r
96	Make haveLyrics/haveAPIC symbols take less space
97	Macroize pre/postSectionSkip, make it and \columnsep font-size dependent
98	Slightly more docs in the generated code on grid/non-grid typesetting
99	Slightly more docs
100
101Release Name: 1.11
102====================
103
104ImageExifTool.pm: new handler (a very minimal implementation).
105
106Tag.pm: support for ImageExifTool.pm
107  (problems: deleting frames is not noticed by ExifTool, so the field can be
108     "revived" by update_tags(), so we disable id3 in ExifTool [XXX: must be
109     made conditional on the list of  handlers]; genre-->None massaged to '')
110             'NumColors' => 'Use BitDepth'???
111  rename aspect() to aspect_ratio() (undocumented)
112  new function aspect_ratio3() rounds to 3 decimals in the fractional part
113  map %{aR} to aspect_ratio3()  [instead of aspect()]
114  new method bit_depth() (for images; exact semantic [8 or 24?!] not clear)  (undocumented)
115  new interpolation %{bD} for bit_depth
116  new method _duration() (for very few formats only???) (undocumented)
117  caching MP3::Info data avoid extraneous calls
118  Make duration-fetch methods try _duration() too.
119  mpeg_layer_roman(), frames_padded_YN(), is_copyrighted_YN() now may return ''
120    if MP3::Info fails.
121  Allow for the rest of 1-char escapes NvLrqQSmsCpouMH to be conditioned and
122    %=X-ed.
123  //o-ptimise RExes.
124
125ID3v2.pm: could modify config('default_language').
126
127mp3info2: make MP3-specific fields optional
128  emit %wx%h for images and video (and append bit_depth if present)
129
130Release Name: 1.10
131====================
132
133Bump the version number to 1.10 to sync with mp3info2.
134
135Tag.pm: allow %=n to match against 1 if %n is 01.
136  new methods extension_is(), can_write(), can_write_or_die(), die_cant_write(),
137    writable_by_extension().
138  new methods (require Image::Size) width(), height(), img_type(), mime_type(),
139    aspect(). (undocumented)
140  new interpolation escapes %w %h %{iT} %{mT} %{aR} for these methods.
141  new configuration variables: `is_writable' defaults to writable_by_extension
142    (older versions behaved as if it is 1);  `writable_extensions' to
143       mp3 mp2 id3 tag ogg mpg mpeg mp4 aiff flac ape ram mpc
144  update_tags() checks for can_write().
145
146cddb.tmp was omitted from distribution (==> test failure).
147
148ID3v2.pm: the code to treat compressed fields was completely busted.
149	  (Still not tested a lot...)
150  Now always write UTF-16 as `UTF-16LE with BOM' to cowtow to M$'s bugs
151	(must disable: triggers unsync...; set $ENV{MP3TAG_USE_UTF_16LE}
152	 to TRUE to enable).
153
154Music_Fields.pm: could give `uninitialized' warning in presence of
155	one-word person names in the tables.
156
157ImageSize.pm: new handler.
158
159mp3info2: -d was busted by the repeated-option logic.
160  allow a repeated -u to force update.
161
162typeset_audio_dir: if one of the arguments was 0, -e could fail.
163  Decrease default min-gap before [year] from 0.75em to 0.65em (looks better).
164
165Release Name: 1.00
166====================
167
168Bump all the version numbers to 1.00 (except Normalize::Text::Music_Fields).
169
170Move code to a ./lib subdirectory.  (Allows auto-install of transliterate_cp1251.)
171
172Music_Normalize_Fields.pm: renamed to Normalize::Text::Music_Fields.pm
173  Now check environment variable MUSIC_FIELDS_PATH and/or ~/.music_fields/*.
174  name_for_field_normalization method is used to choose "composer name".
175
176CDDB_File.pm: minor changes to the docs.
177
178Cue.pm: new sub-module.
179
180Tag.pm: allow access to Cue, and customization of the corresponding encoding.
181  Allow conditional interpolation on user variables (check emptiness) %{U1:\n}.
182  New configuration variable and method `name_for_field_normalization'.
183
184typeset_audio_dir: Major simplification of user interface, better docs.
185  Can generate short+long-type listings itself (two-pass so far...).
186  More consistent ornaments in the generated files.
187  Auto-generate the file *_titles.tex (used as the title of the listing).
188  Move common code to file *_common.tex.
189  New options -N, -P, -F.
190  Document option -L.
191  Directory list defaults to ".".
192  Indicator of presence of APIC frames.
193  Lyrics symbols explanation emitted correctly.
194  Allow duplication of comment-like info and a part of the main record title
195    (emphasizes this part of the title).
196  Document known possible problems during typesetting.
197
198mp3info2:
199  Since Normalize::Text::Music_Fields is always loadable now, one
200    uses a different trigger sequence to load this module (environment
201    variable and a directory ~/.music_fields are checked).
202  With -e N, N in 1..3, do not translate the non-option ARGV
203    (could conflict with interation with filesystems).
204  New bit 0x4 of -e N used to influence translation of non-option ARGV.
205  When @ARGV is re-encoded: translate back to 8-bit whatever is possible.
206
207ID3v2.pm: when ordering frames in generated tags, sort APIC frames
208  at the end (since the simplest reason for unsync-related bugs in other
209  programs is misparse of APIC frames, and it is the *consequent* frames
210  which are busted, no non-APIC frames would be affected.  (This is
211  applicable in the case when other frames contain Latin-1 info, so
212  the chance of unsync-sequences there is low...)
213
214Release Name: 0.9714
215====================
216
217Tag.pm: misprint in POD.
218  Add new variable MP3TAG_SKIP_WEAKEN for debugging (does not help with 5.005).
219  Make documentation of encoding settings more clear.
220  New configuration variable `extra_config_keys'.
221  `n' and `I' in interpolation flags were broken.
222  interpolate_with_flags(): take into account that ->track may be not a
223    number, as "1/17".
224
225ID3v2.pm: do not prepend "(C) " to empty TCOP fields.
226
227mp3info2: -F "WHOLE > file" would not write if the given tags are not present.
228  would skip -F "WHOLE ?< file" if corresponding tags were present (as opposed to fields).
229  Long description for TDRC was missing.
230  Long description was wrongly handled in __frames_as_printable().
231  New configuration variable `empty-F-deletes'.
232  The default now is to remove the frame if value -F is empty.
233  Take into account `decode_encoding_files' when processing -F "FRAME < file";
234
235transliterate_win1251.pm: was not updated during move to a subdirectory.
236
237typeset_audio_dir: better docs.
238  Typeset track number without second part, and allowing customization too.
239
240CDDB_File.pm: take into account that ->track may be not a number, as "1/17".
241
242Release Name: 0.9713
243====================
244
245mp3info2: -e was broken by support for duplicated-options.
246  Better structuring of documentation.
247
248Release Name: 0.9712
249====================
250
251Tag.pm:
252  _massage_genres(): 'num' is required if number is wished; new semantic with
253   'prefer_num'.
254  Make methods *_set() return TRUE.
255  In dump of frames, put explanation of frames purposes.
256  Improve the docs.
257
258ID3v2.pm: add `func_back' to frame's field descriptor.
259  add 're2b' to frame's field descriptor.
260  When adding TCOM frame, massage it back to the v2.3 conventions; now one can
261    use the same values for setting frame as returned when reading frame, even
262    in presence of multiple genres.
263  Likewise for TCOP frames (via `re2b').
264  Repeated APIC frames were not expanded in get_frame_descriptors().
265  Would not support "fake" MP3 objects.
266  Allow setting of "filtered for human" fields (except TMED) via add_frame(),
267    using both raw and human-readable forms of the corresponding argument.
268  When splitting an argument for add_frame, split from the end for
269    POPM - they have numbers at end, so it is not ambiguous.
270  AENC and COMR frames had invalid format (trailing 0 omitted from URL).
271  Dump of frames: put explanation of frames purposes, align stuff vertically.
272  Optional string fields were treated with warnings...
273  Improve the docs.
274
275ID3v1.pm: reading v1 genre immediately after setting might return numeric value.
276
277Test suite for changes (except encoding stuff and as_bin()).
278Makefile.PL was clean()ing a shipped file.
279
280Release Name: 0.9711
281====================
282
283ID3v1.pm: last winamp genre was not supported;
284  logic of checking fitting to ID3v1 was not accepting "from"ified tags;
285  add more WinAmp genres (from table in MP3::Info).
286  Avoid an elusive Perl (parser?) bug with
287   can't use string ("") as an ARRAY ref while "strict refs" in use at MP3/Tag/ID3v1.pm line 220.
288  Use the leading part of track numbers of the form NUMBER/WHATEVER.
289
290Tag.pm:
291  logic of massaging genre was not accepting "from"ified tags.
292  id3v23_unsync id3v23_unsync_size_w - better docs.
293  Minor improvements to docs.
294  New methods: "simplified" title_set(), artist_set(), album_set(),
295      year_set(), comment_set(), track_set(), genre_set();
296    _Data_to_MIME(), copy_id3v2_frames(),
297    track1(), track2(), track0(), disk1(), disk2(), disk_alphanum().
298  Prefer frame_select_by_descr_simpler() to frame_select_by_descr_simple()
299    in select_id3v2_frame_by_descr(); so we can:
300  remove special-casing of _Data in _interpolate(), and the first ("supported")
301    frame of the given type can be interpolated via, e.g., "COMM", "APIC".
302  remove setting $MP3::Info::try_harder: may loop infinitely...
303  New interpolation: %{ID3v2-size}, %{ID3v2-pad}, %{ID3v2-stripped}, %{ID3v2-modified}
304    %{out_frames/QQPRE//QQPOST}.
305  Allow condition in conditional interpolation to be a 2-char (n1 etc) escape.
306  Allow select_id3v2_frames() etc to write frames which require multiple
307    arguments to add_frame(), either by adding extra arguments, or by joining
308    arguments together with ";". [Will catch less errors, but is more flexible.]
309  _massage_genres(): extra arg must now be 'num' if number is wished; new semantic
310    with 'prefer_num'.
311
312ID3v2.pm: misprint of getconfig1, and in printout of supported versions.
313  Add some E<gt> to POD; better doc of APIC in frame_select().
314  _Data_to_MIME() documented.
315  Use "Unknown...  Error?" as string representation of unknown pictype in APIC.
316  Do extra close/open before writing ID3v2, so that the size of ID3v1 tag
317   is taken into account when calculating the "best" padding.
318  New methods: frame_select_by_descr_simpler(), add_raw_frame() [undocumented],
319    copy_frames(), add_frame_split().
320  Supports optional fields in frames for read/write (missing
321    fields not set by get_frame() etc, and should be omitted in call to add_frame).
322  allow multiple values in "write" flavor of frame_select() (as in add_frame());
323    moreover, since it calls add_frame_select(), allow joining fields into
324    one with separator=";".  [Will catch less errors, but is more flexible.]
325  For APIC/COMR frames, allow the numeric "type" argument to add_frame() to be
326    specified both as a byte, and as a stringified number (no conflict possible).
327
328audio_rename: move dependent module transliterate_win1251.pm to
329    Encode:: namespace.
330  Change the default rename recipe to use disk number, and pad track number
331    to width of the maximal track number (if known).
332
333mp3info2: With -x, print "ID3v1: present" if applicable, and ID3v2 size(s).
334  Documentation was using I(fimb) where I{fimbB} was needed.
335  Move id3v2_frames_autofill() before -p and -x.
336  Do not autofill unless -u is given, or other modifications are done to ID3v2.
337  Uses foo_set() to process -a/-t/-l/-y/-c/-n/-g options, so no "sane value" check
338    is done any more...  Also disallows "asyncroneous on-demand order of setting"
339    of these fields (but it was hardly documentable anyway)...
340  Document order of processing the options.
341  New semantics "FRAME_spec < FILE", "FRAME_spec ?< FILE", "FRAME_spec > FILE"
342    for -F option (including full-tag operations).
343  Documentation on the usage strategy: Escalation of complexity.
344  Options -d/-F/-C/-P may be repeated (old nonsense of gluing together via
345    triplication is still supported, but deprecated).
346  -x may be repeated (dumps frames).
347
348File.pm: better wording in an error message.
349
350Release Name: 0.9710
351====================
352
353Some minimal changes to make test suite pass "better" on 5.005
354(Music_Translate_Fields does not work; %F is not guarantied to get full name;
355some proxying problems remains [leaks ==> files remain open];
356t/update_tags.t works well under debugger, not otherwise...).
357
358Tag.pm ID3v2.pm ParseData.pm mp3info2: support Language with parentheses, as in
359 "Cover (back)" (when used as "Picture type").
360 Document id3v2_frame_descriptors().
361 New interpolation token: %{frames}, %{frames/SEPARATOR}.
362 Allow %{ID3v2: ... } and ID3v1 as conditionals.
363 Parsing of %{composer} etc inside false conditionals was wrong.
364
365ID3v1.pm: is not confused by multipart genres (such as described by id3v2).
366
367ID3v2.pm: extra $raw-ness for get_frame() (return array [=ordered hash], or
368          array of values, or same with ignoring `decode_encoding_v2');
369 get_frame() handles MCDI as a "simple frame";
370 document get_frame_descr() and get_frame_descriptors();
371 new argument $raw_ok for as_bin() to return original tag if unmodified;
372 new method fix_frames_encoding() to make encoding standard-conformant;
373 fix_frames_encoding() autocalled (controled by `decode_encoding_v2',
374  `id3v2_fix_encoding_on_write' and `id3v2_fix_encoding_on_edit');
375 `decode_encoding_v2' may be disabled per tag via
376   frame TXXX[trusted_encoding0_v2] (in turn, this feature may be disabled
377   by `ignore_trusted_encoding0_v2');
378 frame TXXX[trusted_encoding0_v2] may be auto-added by fix_frames_encoding()
379   (controlled by `id3v2_set_trusted_encoding0');
380 special-field-readers now check their calling API (to allow future extensions);
381 reading TCON normalizes genres, skips duplicates, and handles 0-separated
382   genres (as mandated by v2.4) [thanks to neil verplank for the prototype
383   implementation];
384 reading/writing of v2.4 tags controlled by `prohibit_v24'/`write_v24';
385 misprint in "Media (e.g. label side of CD)" of APIC corrected (backward
386   compatibility value preserved);
387 APIC frames handled by frame_select() (and derivatives); uses "Picture Type"
388   instead of "Language", and auto-calculates "MIME type" for
389   TIFF/JPEG/GIF/PNG;
390 likewise for get_frame_descr().
391
392Tag.pm: simplified method get_config1() for accessing one-element configuration
393        arrays;
394 conversion milleseconds ==> seconds was wrong (!!!) when NVs are 80-bit;
395 new configuration variables `id3v2_recalculate', `ignore_trusted_encoding0_v2',
396   `id3v2_set_trusted_encoding0', `id3v2_fix_encoding_on_write',
397   `id3v2_fix_encoding_on_edit', `prohibit_v24', `write_v24' with sane defaults.
398 instead of MCDI frame, autofills TXXX[MCDI-fulltoc] (since MCDI is supposed
399   to be the "short TOC", and I do not know how to reduce one to another,
400   and know only how to easily read the "full TOC"; please advice if you know).
401
402	[For best results, it is better to rename MCDI frame if it was
403	 autofilled with v0.9709:
404	   mp3info2 -u@P "mi/@{MCDI}/@{TXXX[MCDI-fulltoc]}///m//@{MCDI}" f.mp3
405	]
406
407   Due to these changes, the mess of fixing broken encodings is more or
408   less resolved now (before, it was easy to read tags with broken
409   encoding, but not edit it).  Likewise, reading genre is much easier now
410   (but setting multipart genre may still be some challenge).
411
412[If there are some problems with reading v2.4 tags, I would like to hear about
413 them; likewise, I beg for code donation for better writing of v2.4 tags.]
414
415mp3info2: new option -N to switch off "smart-alec interface";
416  -F allows human-oriented identifiers: composer,text_by,orchestra,conductor
417  will only call autoinfo() if needed (useful for copying ID3 frames, so
418    that they are not modified before copying);
419  better logic in choosing when to emit "Performer:" line.
420  beef up docs.
421
422typeset_audio_dir: could try to print total time even without -T.
423
424audio_rename: pacify some warnings; better docs.
425
426New scripts in examples: fulltoc_2fake_cddb.pl dir_mp3_2fake_cddb.pl
427	inf_2fake_cddb cddb2cddb
428
429Music_Translate_Fields.pm: renamed to Music_Normalize_Fields.pm;
430  a tiny shim module with old name added;
431  subroutines renamed from *translate* to *normalize*;
432  shim subroutines with old names added;
433  minimal docs added;
434  new subroutine read_composer_file() [cut out from load_composer()];
435  new subroutine normalize_opus();
436  better normalization of opus when followed by variants of `No.4';
437  new subroutine _normalize_piece(): as normalize_piece(), but allows
438    better control over (no) database lookup;
439  better recognition of a key ("Piece; b#");
440  support for mail-header-format databases;
441  support for shorted opus-number ids;
442  support for creation of mail-header-format databases;
443  minimal testing suite (builtin);
444  other minor improvements.
445
446Composer files: converted to mail-header format; new files for Brahms,
447Dvorak, Schnittke, Shostakovich added.  Moved to subdirectory
448`Music_Normalize_Fields'; should be relative to Music_Normalize_Fields.pm
449
450
451Release Name: 0.9709
452====================
453
454extract-y.pl was reversing the "informativeness" test, thus one needed
455to redo Music_Translate_Fields-L_van_Beethoven.comp; add missing sonata
456names to the latter.
457
458Improve docs for ENVIRONMENT.  New customization variable local_cfg_file,
459new method parse_cfg() (reads ~/.mp3tagprc).  [not tested]
460
461New interpolation directives iC and iI to access cddb_id, cdindex_id.
462New methods cddb_id, cdindex_id, id3v2_frames_autofill.  New configuration
463variable id3v2_frames_autofill.  Support for filling MCDI frame.
464
465mp3info2: id3v2_frames_autofill() is called unless -d option is given.
466(Most probably the result is not propagated back to file unless -u option
467was given.)
468
469CDDB_File.pm: new method (and parse directive) cddb_id.
470Inf.pm: new methods (and parse directives) cddb_id, cdindex_id (cddb_id
471has the leading '0x' stripped).
472ID3v2.pm: new methods cddb_id, cdindex_id (read the corresponding TXXX frames).
473
474Splitting UCS-2 fields by short-\0 was wrong.
475
476Workaround for ITunes bug was not complete: only size calculation was
477conditional on a configuration variable, but not the actual unsyncronization...
478
479typeset_audio_dir-try.pl - new variant (untested).
480
481typeset_audio_dir was ignoring -n option.
482
483Extend matching of track number when parsing to 999 (not more to avoid
484confusion with years); such tracks are, apparently, written mod 256 into
485ID3v1 tag.
486
487Release Name: 0.9708
488=======================
489
490Allow character devices for files (so /dev/null now "works"
491  mp3info2 -D -a beethoven -t "piano in F#" /dev/null
492will print the info deduced from per-composer databases).
493
494total_secs_trunc() was not documented.
495
496New methods total_hours(), leftover_secs_float(), leftover_secs_trunc(),
497leftover_mins().  Interpolated as %H, %{SML}, %{SL}, %{mL}.  Interpolate
498leftover_msec() as %{ML}.  New method format_time().  New interpolated
499%{T[format1,format2...]}.  New class method new_fake().
500'update_length' config variable was not writable.  New method
501id3v2_frame_descriptors().
502			XXXX Undocumented...
503
504ID3v1: support new option encoded_v1_fits (default NOT as it was).
505
506ID3v2: add_frame() was not documented to support encoding.  New configuration
507variables default_language, default_descr_c.  New functions get_frame_desc(),
508get_frame_descriptors().
509
510Music_Translate_Fields: normalizes title from unambiguous short form (order
511significant, so "piano sonata" and "sonata for piano" still not synonimous).
512Allow #dup_opus_rex, #no_opus_no, #prev_short in composer table.
513New function normalize_file_lines().
514
515Table of names for Beethoven expanded to include all the Op/WoO works;
516dates are extracted from 3 sources.  Table for Gershwin.
517
518New file examples/Music_Translate_Fields-normalize.pl.
519
520mp3info2: processing of the first part of -E was completely wrong; only one
521option could have been \\-interpolated.  New syntax -E +something to add to
522the defaults.  New option -x (modelled after mp3info, plus frame descriptors).
523If file name is empty, will work with a fake tag object.  Print (guessed)
524composer and orchestra fields too.
525
526audio_rename: increase the length of -s to 110 (len controlled by environment
527variable).  Add .tag .mp3 to -e.
528Add documentation.  New option -r.  Now is installed.
529
530typeset_audio_dir: now explains the meaning of (L) and (S).
531
532Release Name: 0.9707
533=======================
534
535%M was not recognized.
536
537parsing for "%n" allows track numbers of the form 123/789 too; such track
538numbers are considered as "not fit for ID3v1".
539
540Document that set_id3v2_frame(), select_id3v2_frame() remove the old value(s).
541
542New method interpolate_with_flags().  Make ...::Parse use this method.
543
544New methods composer(), performer(), delete_tag(), _interpolate() in
545MP3::Tag.  Allow customization via local configuration modules
546MP3::Tag::User MP3::Tag::Site MP3::Tag::Vendor.
547
548New interpolated escape %{I(FLAGS)VALUE}.
549
550New configuration variables id3v23_unsync, composer, performer,
551translate_composer, translate_performer.
552
553New test t/interpolate.t.
554
555Incompatible change: kill backslashitis in %-escapes:
556    frame_select_by_descr() etc: no backslashitis whatsoever.
557    interpolate(): no need to backwack all \{}[], only the innermost delimiter
558      char, and only those backslashes which preseed the innermost delimiter.
559    Likewise for parse(), _parse_rex_microinterpolate().
560  Need to change '%{y||<%\{COMM(rus,EN,#1,)[foo]\}>}' to '%{y||<%{COMM(rus,EN,#1,)[foo]}>}'
561	'%%02t_Title: `%012.12t\'; %{TLAN} %{TLAN01: have %\{TLAN01\}} %{!TLAN02:, do not have TLAN02}'
562     to '%%02t_Title: `%012.12t\'; %{TLAN} %{TLAN01: have %{TLAN01}} %{!TLAN02:, do not have TLAN02}'
563	'%{!COMM(rus,EN,#1)[foo]:<%\{COMM(rus,EN,#1,)[foo]\}>}'
564     to '%{!COMM(rus,EN,#1)[foo]:<%{COMM(rus,EN,#1,)[foo]}>}'
565	'%{COMM(rus,EN,#1)[foo]||<%\{COMM(rus,EN,#1,)[foo]\}>}'
566     to '%{COMM(rus,EN,#1)[foo]||<%{COMM(rus,EN,#1,)[foo]}>}'
567	'%{COMM(rus,EN,#1,)[foo]||<%\{COMM(rus,EN,#1,)[foo]\}>}'
568     to '%{COMM(rus,EN,#1,)[foo]||<%{COMM(rus,EN,#1,)[foo]}>}'
569	'%{COMM01||<%\{COMM(rus,EN,#1,)[foo]\}>}'
570     to '%{COMM01||<%{COMM(rus,EN,#1,)[foo]}>}'
571	'%{TLEN||<%\{COMM(rus,EN,#1,)[foo]\}>}'
572     to	'%{TLEN||<%{COMM(rus,EN,#1,)[foo]}>}'
573	$mp3->select_id3v2_frame_by_descr('TXXX[with[\]]', 'this is my TXXX[with[]]')
574	 to $mp3->select_id3v2_frame_by_descr('TXXX[with[]]', 'this is my TXXX[with[]]')
575
576
577    In mp3info2:
578	      print $mp3->interpolate(exists $opt{p} ? $opt{p} : <<EOC);
579      Title:   %-50t Track: %n
580      %{TCOM:Composer: %\\{TCOM\\}
581      }%{TEXT:Text: %\\{TEXT\\}
582      }$performer
583      Album:   %-50l Year:  %y
584      Comment: %-50c Genre: %g
585      EOC
586    to:
587	      print $mp3->interpolate(exists $opt{p} ? $opt{p} : <<EOC);
588      Title:   %-50t Track: %n
589      %{TCOM:Composer: %{TCOM}
590      }%{TEXT:Text: %{TEXT}
591      }$performer
592      Album:   %-50l Year:  %y
593      Comment: %-50c Genre: %g
594      EOC
595
596mp3info2: allow deletion of whole tags by -d; improve docs.
597
598typeset_audio_dir: improve typesetting, allow indication whether lyrics
599is present, of total duration.
600
601Music_Translate_Fields: short_name works better for, e.g., Beethoven (allow
602  the "from" part, as von/van/di/de); normalize key signature and the
603  composition name (per composer file; set MUSIC_TRANSLATE_FIELDS_SKIP_WARNINGS
604  to skip warnings for not detailed enough standard description).
605
606Music_Translate_Fields-L_van_Beethoven.comp: new file; piano sonatas only
607	perl -wle "for (1..32) {{open my $f, qq(> $_)} system qw(mp3info2 -a Beethoven -l), qq(piano sonata No. $_), $_}"
608
609examples/empty.mp3 got a tag accidentally.
610New file examples/empty_10sec.mp3
611  perl -we "print qq(\0) x (8000*2*10)" | lame -b 8 -r -s 8 -m m - empty_10sec.mp3
612	(For experiments with players which only show ID3 when playing.)
613
614If INSTALLSCRIPT is present in Makefile.PL options, LIB will not disable
615installation of scripts.
616
617Release Name: 0.9706
618=======================
619
620The weaken()ing code was failing since weaken() does not return TRUE.  (Tested
621for no obvious memory leaks.)
622
623Allow for backwacked \[ \] \\ in descriptor of, e.g., COMM[descriptor].
624
625New configuration options:
626		   encode_encoding_v1 decode_encoding_v1 decode_encoding_v2
627		   decode_encoding_filename
628		   decode_encoding_inf decode_encoding_cddb_file
629		   decode_encoding_files encode_encoding_files
630	(en/decode_encoding_files for ParseData; applicable to non-binary i/o).
631Initialized from corresponding environment variables
632
633Document environment variables.
634
635translate_title_collection etc configuration values were not settable
636(neither were they documented...).
637
638New methods of ID3v2: frame_select_by_descr(), frame_have_by_descr(),
639frame_list_by_descr(), frame_select_by_descr_simple().
640
641New methods have_id3v2_frame_by_descr(), select_id3v2_frame_by_descr(),
642frame_translate(), frames_translate(), shorten_person() in MP3::Tag.
643interpolate() significantly simplified; new interpolation %{shP{NAME}}.
644
645New type of interpolation: frame ids connected by &.  Slightly more readable
646documentation of interpolate() and parse_rex().
647
648New configuration settings: person_frames, and translate_person
649(supported only by select_id3v2_frame_by_descr()).
650
651Music_Translate_Fields.pm: much better detection of non-canonical names
652(e.g., year removal), support for person names shortening.  New method
653check_persons() for checking consistency of translation/shortening.
654Piecewise translation for multiple authors in a field (separated by ', ',
655'; ', or ' - ').  Will translate title_collection and other CDDB fields.
656
657Music_Translate_Fields-rus.lst: better list of persons for bard repertoire
658and audiobooks; allow "fixing" wrong years too; handle "translated" and
659many more separators of multi-names; cursory support for cases (genitive);
660support for disabling translation (#keep).
661
662audio_rename.pl: transliterate cyrillic with unicode too.
663
664New options -d, -e, -F for the script mp3info2; brush up the docs.
665
666typeset_audio_dir: new option -c; new generated file *_backcover.tex; slightly
667better conversion of ASCII to TeX; use 'textcomp' (another incompatible LaTeX
668change...); new macros for skips about second-level headings; encapsulate
669\addOnRight; ornaments in *_text.tex and *_cdbooklet.tex; commented out
670support for title; begin merging together the code to generate different
671documents; consistent columnseprule; better positioning of hrule's; template
672to merge several lists into one document; document latex, dvips etc.
673
674audio_rename.pl: support unicode cyrillic.
675
676Release Name: 0.9705
677=======================
678
679New environment variables MP3TAG_DECODE_V1_DEFAULT, MP3TAG_DECODE_DEFAULT,
680MP3TAG_ENCODE_V1_DEFAULT, MP3TAG_ENCODE_DEFAULT (0 or encoding name).
681XXXX Not documented yet; does not cover all aspects (filenames, external
682     files, Inf, CDDB files).
683	v2 ENCODE (to illegal encodings) is not implemented yet.
684
685Default for MP3TAG_DECODE_UTF8 is 1 (used for encoding too).
686
687Encoding argument for v2->add_frame() is (finally!) implemented.
688
689Text field of TXXX, USER, USLT, OWNE were wrongly marked as not encoded.
690
691Setting lang=XXX via frame_select() or id3v2_select_frame() would result
692in lang=xxx.
693
694frame_select() returns the count of found frames if it is used for removal
695of frames.
696
697New parameter value 'hash' for get_frame().
698
699New method frames_list() (variant of frame_select()).
700
701Sanity check for tag size parameter in ID3v2.
702
703Sanity check for wide characters in the prepared raw tag.
704
705New method ->size for ::File.
706
707More examples for update_tags().
708
709Music_Translate_Fields: only the parsing logic remains; the data is
710moved into separate files (encoding supported) Music_Translate_Fields*.lst
711(should live alongside the .pm file).
712
713typeset_audio_dir: new option -e; unify the charset logic; add utf8.
714
715Add example/empty.mp3 (some MP3 applications do not accept "really empty"
716MP3s; this one is "almost empty").
717
718Release Name: 0.9704
719=======================
720
721Document why using "encoding" and "TPE1" mindlessly is a bad idea.
722
723Cleaning up read support of v2.4.
724
725Better error message for version mismatch.
726
727Do not warn "not supported" any more if the footer is found (how could it be
728"supported" anyway, except for skipping, which is already done, [was wrong]?).
729(untested)
730
731Extended header parsed for v2.4 too.	(untested)
732
733Footer was treated wrong...  Apparently frame flags were extracted very wrong
734as well... (untested)  Unknown frame flags are mapped to 'unknown_<letter>'.
735
736Rename 'padding_size' field to 'buggy_padding_size' to avoid confusion with
737ID3v2 padding (it is the padding after the tag [unrelated to the standard],
738not the padding inside tag).
739
740fits_tag(): return FALSE if data contains chars above 255.
741update_tags(): better docs, new argument $force2.
742
743mp3info2: in the standard report, "artist" was offset by one space.  New option
744   -2.  README.shrink updated correspondingly.
745
746typeset_audio_dir: more comments on duplex output.
747
748eat_wav_mp3_header: new options -D for dry run, -M for finding .mp3 files.
749
750Release Name: 0.9703
751=======================
752typeset_audio_dir: would not work without -B switch
753	Add generation of cdbooklet with -B.
754mp3info2: when reporting contents, print "Composer" and "Text" lines too.
755	Without -I and -p, writes "Performer" line if TXXX{TPE1} is present.
756	New option -r.
757method interpolate() could return '' when ID3v2 tag was missing even if
758	the tag would affect only a part of the output.
759There was no way to inform the parser that it is OK if the parse data
760	is coming from file, and the file does not exist.  Add 'F' flag...
761
762
763Release Name: 0.9702
764=======================
765examples/type_mp3_dir.pl:
766	new name typeset_audio_dir.pl;
767	Fully document;
768	Change the semantic of numbers in .top_heading files by 1;
769	New option -n;
770	Generate 1st level header for all "toplevel" dirs;
771	TeXify ", ` and ';
772	Add \hrule's for default toplevel headings.
773	-@ was not working;
774Correct rounding of total_secs_int().
775Truncated version in total_secs_int_trunc().
776Rename total_millisecs_int() to total_millisecs_int_fetch(),
777	likewise for total_secs_fetch().
778New method total_millisecs_int() (with caching).
779Cache duration in ms.
780New escape: %M (total millisecs, integer).
781New confiration variable: update_length.
782Will update TLEN field if needed (governed by `update_length').
783Alternation inside escapes implemented.
784New file README.shrink with recommendations on how to fix results of
785the bug with extra unmarked 0-padding.
786Remove trailing .pl from names of typeset_audio_dir, mp3info2.
787Install typeset_audio_dir, mp3info2 unless one of options -n or LIB=
788is given to Makefile.PL.
789
790Release Name: 0.9701
791=======================
792
793-P option of mp3info2 would ignore trailing empty parse patterns
794  (not very restrictive, since to succeed, pattern should have a set-field,
795  or match-exactly field; workaround: append @={U0}, and do not set U0).
796
797When updating ID3v2 tag without growing the file, the tag length would
798not include padding; thus the following update would not use the padding ==>
799tag size leak.
800
801New configuration options: id3v2_minpadding, id3v2_sizemult, id3v2_shrink,
802id3v2_mergepadding (the first two have new defaults: 128 and 512; was 2K and
8034K).
804
805Close file for write of ID3v2 tag as early as possible.
806
807Release Name: 0.97
808=======================
809
810Better docs for add_frame(), set_id3v2_frame(), for configuration parameter
811id3v2_frame_empty_ok, parse_minmatch.
812
813frame_select() now returns undef if no frame is found; likewise for
814select_id3v2_frame(); better behaviour with very low number of arguments.
815
816When interpolating %{COMM[text]}, use lang='', not undef (otherwise
817answer is returned as hash).
818
819Interpolation would interpret second % in '%%02n' as fill character.
820
821Flag 'b' of ParseData would disable whitespace stripping from the data to
822match, but not from matches.
823
824->get_config() would not work as class method.
825
826Ask MP3::Info to 'try_harder'; needed with very long ID3v2 headers...
827
828Decoding Unicode was not flexible enough: now configured by two environment
829variables: MP3TAG_DECODE_UNICODE (default 1) to enable decoding; the
830target of decoding is determined by MP3TAG_DECODE_UTF8: if 0 (default), decoded
831values are byte-encoded UTF-8 (every Perl character contains a byte of
832UTF-8 encoded string); otherwise it is a native Perl Unicode string.
833
834Language=XXX is the *official* designation of unknown language.
835
836Make dependency for ID3v2-Data.pod on Tag/ID3v2.pm.
837
838Warn in mp3info2 if -P is used without ParseData in autoinfo.  Document
839example of attaching lyrics to audio file.
840
841CDDB_File could generate warnings for files without DGENRE field.
842
843type_mp3_dir: new macro \hourmark, exchange ' and '' for minutes/sec.
844
845Release Name: 0.96
846=======================
847
848A bug fix by Ben Bennett for 2.4 support.
849
850Having a genre of the form '(2345)Some new type' would emit a warning.
851
852UTF encoded fields are decoded by default.  Set MP3TAG_ENCODING=0 in
853environment to disable.
854
855Add ID3v2-Data.pod to MANIFEST to avoid circular dependency (XXXX bug:
856it is generated using the installed version of ID3v2.pm, not the
857current version).
858
859Release Name: 0.95
860=======================
861
862After removing several of repeated frames, get_frame(s) could get confused.
863So could the code using get_frame(s).  Now better documented, and fixed.
864
865New method ->is_modified() of ID3v2.
866
867New method ->as_bin() of ID3v1 and ID3v2.
868
869New methods ->is_id3v2_modified(), ->get_id3v2_frames(), ->select_id3v2_frame(),
870->have_id3v2_frame(), ->get_id3v2_frame_ids() of MP3::Tag.
871
872Some `next's needed to be replaced by `return' in mp3info2 and audio_rename.
873
874mp3info2 would not decide that an edit is not needed if an ID3v2 frame was
875modified directly.
876
877Avoid re-parsing by ParseData more aggressively (10x speedup in one complicated
878real-life example).
879
880set_id3v2_frame() and update_tags() were assuming that get_tags() was already
881called.
882
883File->write() could lead to disaster with -l.		!!!!
884
885New options 'b', 'B', 'o', 'O', 'D' for ParseData.  With 'n', 'l' ParseData
886does not ignore empty trailing lines any more.
887
888New %-interpolations: %{ID3v1} for the tag as a whole, same for ID3v2.
889
890Be more strict during interpolation: do not recognize WORD1 as a valid short
891name of ID3v2 frame.
892
893Two new example scripts: mp3_total_time.pl, eat_wav_mp3_header.pl.
894
895Mention example scripts in documentation of MP3::Tag.
896
897Release Name: 0.94
898=======================
899
900The example of the "long" form of ID3v2-comment setting API has arguments swapped.
901
902New methods ->frame_select(), ->frame_have() of ID3v2.
903
904New methods ->pure_filetags() and ->update_tags() of MP3::Tag.
905
906New config variables id3v2_missing_fatal (it was as if it was defaulting to
907TRUE; now defaults to FALSE), parse_minmatch.
908
909New test files in t/: v2_comments.t update_tags.t parser.t
910
911New escape %{COMM(rus,eng,xxx,#4)[short_description]} (chooses a comment with
912"short_description" descriptor in the specified list of languages; #4 means
9134th comment field, or COMM03; empty language means any language.)  Works
914as a condition for conditional interpolation too, and as a target of parsing
915and ParseData.  Similarly for other frames which have 'Language' and/or
916'Description' fields.
917
918Some POD formatting fixed.
919
920Setting "extra" ID3v2 frames was not immediately visible (only after write
921and re-read from the file).
922
923COMM's short-description was not marked as 'encoded' (due to a misprint).
924
925UNCOMPATIBLE CHANGEs:
926
927COMM's frame short-description now sits on the key "Description", not "short".
928[If you want backward compatibility, check both keys.]
929
930get_frame() considers frames the only content of which is a URL as a "simple
931frame"; likewise for frame_select(), but it also considers frames with _Data
932only as "simple frames".
933
934Release Name: 0.93
935=======================
936
937More robust processing of "Recorded..." in CDDB_File.
938
939Better error message when parse expression has some `=' omitted.
940
941When parsing with nothing to set, would emit "Unsupported reg..." (regmatch
942would return 1 elt if no capturing parens present).
943
944When rewriting id3v2 tag, protect against $\ being set.
945
946Move test.pl to t/mp3tags.t, add t/set_v2.t
947
948Allow arbitrary escapes of the form %{ABCD} or %{ABCD03} in the method parse()
949etc; here ABCD is a 4-letter word.
950
951New config parameter id3v2_frame_empty_ok.
952
953It is possible to set individual id3v2 frames via ParseData; use %{TIT1} or
954some such.  Setting to an empty string deletes the frame if config
955parameter id3v2_frame_empty_ok is true.
956
957Uses TCOM or TPE3 to find "artist" ($mp3->artist) too.
958
959New option -R (recurse into directories) for example scripts.
960
961New example script type_mp3_dir to produce a TeX file with contents of
962directories.  (Put files `.content_comment' into a directory to include comments
963specific for the directory layout.)
964
965Connect parts of comment by \n if \n is already present there.
966
967`Recorded: 1980,1985,1992' was not recognized.
968
969Allow date only at start/end of the comment.
970
971Release Name: 0.92
972=======================
973
974Include a fix by Marco Moreno of Cwd::abspath() not working on files (on
975some architectures).
976
977Release Name: 0.91
978=======================
979
980CDDB_File was removing whitespace on the boundary of continuation fields.
981
982get_user() calls ParseData->parse() to populate the userdata
983
984if $ENV{MP3TAG_TEST_WEAKEN}, will not have a workaround against broken weakrefs
985	(currently tests fail!)
986
987New %-escapes v L r q Q S m s C p o u (require MP3::Info module).
988
989New methods mpeg_version() mpeg_layer() mpeg_layer_roman() is_stereo()
990is_vbr() bitrate_kbps() frequency_Hz() frequency_kHz() size_bytes()
991total_secs() total_secs_int() total_mins() leftover_secs()
992leftover_msec() time_mm_ss() is_copyrighted() is_copyrighted_YN()
993frames_padded() frames_padded_YN() channel_mode_int() frames()
994frame_len() vbr_scale() (require MP3::Info module).
995
996The year() method of ID3v2 takes/returns timestamps in human-readable form;
997parse() recognizes the same formats for %y if option year_is_timestamp is TRUE
998(default).
999
1000New option 'intact' to get_frame() of ID3v2.
1001
1002Support YEAR, ID3Y, ID3G in EXTD, EXTT* fields of CDDB_File.  Support also
1003an alternative syntax "Recorded"/"Recorded on"/"Recorded in"/ with the format
1004of the date recognized by ID3v2::year(), or just a date field without a prefix.
1005The declarations of the former form are stripped from the returned comment.
1006
1007New fields artist_collection, title_track, comment_collection, comment_track
1008in CDDB_File and corresponding accessor methods in MP3::Tag, and corresponding
1009escapes aC, tT, cC, cT for interpolate().
1010
1011New configuration variables 'year_is_timestamp', 'comment_remove_date',
1012'translate_*' (for different values of *).
1013
1014New handler module LastResort; currently it uses artist_collection() as comment
1015if comment is not otherwise defined.
1016
1017New example scripts audio_rename and mod/Music_Translate_Fields.pm.
1018
1019The example script mp3info2 will use Music_Translate_Fields.pm (if found)
1020to postprocess the resulting tag fields via translate_*() methods.
1021
1022Do not load Compress::Zlib unless when processing compressed data.
1023
1024Release Name: 0.9
1025=======================
1026
1027Revision history for Perl modules MP3::Tag, MP3::Tag::ID3v1, MP3::Tag::ID3v2, MP3::Tag::File,
1028             and for Perl program tk-tag
1029
1030Changes:
1031
1032* Bugfix for ID3v2.pm:
1033  - Added support for reading ID3v2.2 and ID3v2.4 tags (alpha stage!!) and converting them to ID3v2.3
1034  - Bugfix for unsynchronization (thanks to Ian Beckwith)
1035  - Bugfix for number-handling in frames
1036  - Bugfix for frame compression
1037  - Set unsynchronization flag only, if unsynchronization was done and changed anything
1038
1039* Bugfix for ID3v1.pm:
1040  - genres didn't return the id if the genre name was passed as parameter, but returned
1041    the same name
1042
1043* Makefile.PL:
1044  - overriding the manifypods() function in MakeMaker to add ID3v2-Data.pod to the MAN3PODS hash
1045    (thanks to Dagfinn Ilmari Mannsaker)
1046
1047* Added copyright text, using Perl Artistic License
1048
1049Thanks to Ilya Zakharevich for the following changes:
1050
1051* Three new modules MP3::Tag::Inf, MP3::Tag::ParseData, and
1052  MP3::Tag::CDDB_File added
1053
1054* Tag.pm:
1055  - autoinfo() method returns the info for all ID3v1 tags;
1056  - autoinfo() method may return the info which tag is obtained from
1057    which source;
1058  - Methods title(), author() etc (one per each ID3v1 tag) exist and
1059    have uniform interface through all the subpackages;
1060  - method song() is renamed to title(); method read_filename() is
1061    renamed to parse_filename(); backward compatible name still
1062    preserved;
1063  - config() subroutine can now change all the arbitrary decisions;
1064  - new methods interpolate() for tag interpolation into strings and
1065    parse(), parse_rex() for an inverse operation;
1066  - new subpackage `__hasparent' to treat cyclic object dependencies;
1067  - per-object configuration;
1068  - new configuration options extension, parse_data, parse_split,
1069    parse_filename_ignore_case, parse_filename_merge_dots, parse_join;
1070  - a way to store and query user-supplied data inside the object (may
1071    be used as scratch space when parsing);
1072  - new methods get_config(), get_user(), set_user(), parse_prepare(),
1073    parse_rex_prepare(), parse_rex_match(), filename(), abs_filename(),
1074    filename_nodir(), filename_noextension(), filename_nodir_noextension(),
1075    abs_filename_noextension(), dirname(), filename_extension(),
1076    filename_extension_nodot(), dir_component().
1077
1078* ID3v1.pm:
1079  - new ID3v1 method fits_tags() to check whether the info can be
1080    placed into an ID3v1 tag
1081  - If no track given use automatically ID3v1.0 tag with longer comment
1082  - open() file if needed; do not close() close during new().
1083
1084* ID3v2.pm:
1085  - allow multiple frames to be returned by get_frame() in ID3v2;
1086  - new method get_frames() with better order of returned values (comparing
1087    to get_frame);
1088  - get_frame_ids() in ID3v2 improved to take new argument 'truename' to
1089    simplify looping over repeated frames;
1090  - simpler treatement of sync; fix uncorrect calculation of padding length;
1091  - overwrite the tail of the previously present tag with 0s;
1092  - a couple of new v2.4 field names added.
1093
1094* File.pm:
1095  - more robust parsing of filenames; year can be read from filename if
1096    appended (in parentheses) to author or title; filename can be
1097    F<.wav> as well.
1098  - support file names starting with track numbers as in 03_This_is_the_title.mp3
1099  - support track_title.ext and title_track.ext formats with one-word title too.
1100  - new method filename();
1101  - use the 'extension' configuration variable to strip extension.
1102
1103* misprints in the docs corrected and some general harmonization of function and
1104  field names in the different modules
1105
1106* new example script mp3info2 (which provides most of functionality of the
1107  "standard" mp3info utility, and much more).
1108
1109Release Name: 0.40
1110==================
1111Changes:
1112
1113* Updated documentation for MP3::Tag, MP3::Tag::ID3v1, MP3::Tag::ID3v2 and MP3::Tag::ID3v2-Data
1114
1115* Renamed some functions. The old names will still work, but try to use the new names.
1116  The following names were changed:
1117
1118  - MP3::Tag::getTags() to MP3::Tag::get_tags()
1119  - MP3::Tag::newTag() to MP3::Tag::new_tag()
1120  - MP3::Tag::ID3v1::removeTag() to MP3::Tag::ID3v1::remove_tag()
1121  - MP3::Tag::ID3v1::writeTag() to MP3::Tag::ID3v1::write_tag()
1122  - MP3::Tag::ID2v2::getFrameIDs() to MP3::Tag::ID3v2::get_frame_ids()
1123  - MP3::Tag::ID2v2::getFrame() to MP3::Tag::ID3v2::get_frame()
1124
1125* Bugfix for ID3v2.pm:
1126  - getFrame() returned "undef" as a string instead of simple undef
1127  - artist() produced an error when TPE1 is missing in TAG
1128
1129* Bugfix for Tag.pm:
1130  - DESTROY() checked only if $mp3->obj{filename} exists and not if it is defined before trying to
1131    close it
1132
1133* Bugfix for ID3v1.pm:
1134  - genres() expected an id3v1-object as first parameter and a genre
1135    only as second parameter. Now the object can be omitted as in a call like
1136    MP3::Tag::ID3v1->genres($genre) used by Tag.pm and ID3v2.pm
1137
1138* bugfix for File.pm:
1139  - Filenames may contain surrounding whitespaces now
1140
1141Release Name: 0.30
1142==================
1143Changes:
1144* Tag.pm
1145  - autoinfo() function added. This returns artist/songtitle/track/album.
1146    It tries to find this information in an ID3v1 or ID3v2 tag or tries
1147    to extract it from the filename. The order in which this happens
1148    can be configured with the new config() function.
1149* ID3v2.pm
1150  - four new functions: artist(), song(), track() and album(). These
1151    are included for compability with the ID3v1 and filename module.
1152* Tag.pm / Tag::File.pm
1153  - All file access routines are collected in an extra modul now.
1154    This prevents circular references between Tag.pm and the ID3v..pm
1155    modules. These circular references prevented Perl from calling
1156    the destructor for mp3-objects.
1157* tk-tag
1158  - Loading/Saving of binary data in frame-fields is supported now
1159  - tk-tag uses now the new what_data functionally of ID3v2 to offer
1160    BrowseEntrys for TCON and TFLT and also for parts of APIC and COMR
1161  - Set Filename uses now the actual contents of the Tags not the old
1162    saved one
1163  - Set Filename from ID3v2-Tag works now at least with Artist (%a),
1164    Album(%l) and Song (%s)
1165* ID3v2::what_data returns now also information about possible restricted
1166  input for some frame fields (APIC; TCON; COMR; TFLT are supported yet).
1167
1168Release Name: 0.25
1169==================
1170Changes:
1171
1172* Bug-fix for MP3::Tag
1173  If you created several mp3-objects for different files, the filehandles
1174  for each file were not used correctly. Thanks to hakimian for reporting
1175  this bug.
1176* Bug-fix for ID3v2::remove_tag()
1177  It was tried twice to rename one temp-file after removing the tag.
1178  Thanks to Brent Sarten <bsarten@bigfoot.com> for reporting this.
1179* Bug-fix for ID3v2::add_tag()
1180  When adding a second (or third, ...) frame of a kind, a wrong header
1181  could be written for this frame
1182* Bug-fix for tk-tag
1183  When opening a new file, the contents of the ID3v2 tag of the last file
1184  would be copied to the ID3v2 tag of the new file for all frames which
1185  existed in the last file, but not in the new one.
1186
1187Release Name: 0.21
1188==================
1189Changes:
1190
1191* tk-tag has lots of new functions (see tk-tag README)
1192* getFrameIDs returns now always a hash ref of all existing frames, not only
1193  when called the first time
1194* Some minor problems in documentation are corrected.
1195* ID3v2::add_frame returns the name of the newly created frame, which can
1196  differ from the short name when already such a frame exists.
1197
1198Release Name: 0.20 (beta)
1199========================
1200Changes:
1201
1202--due to problems when run at windows:
1203  * Added a second seek to ID3v1::write_tag, as windows writes at a wrong
1204    position otherwise
1205  * Setting Filehandle to binmode after opening a mp3 file
1206  * ID3v2: write_tag creates a temp file (if neccessary) now in the same
1207    directory where the original mp3 files is located and not in /tmp
1208
1209* Added tk-tag.pl, a graphical interface for MP3::Tag. tk-tag.pl is a alpha
1210  version
1211* Added a new manpage MP3::Tag::ID3v2-Data which contains information about
1212  the ID3v2 frames and the data returned by MP3::Tag::Id3v2::getFrame()
1213* Frames RVRB ("Reverb"), COMR ("Commercial frame"), AENC ("Audio encryption"),
1214  GRID ("Group identification registration"), RBUF ("Recommended buffer size")
1215  and SYTC ("Synchronized lyric/text") are now supported
1216* Added some test to test.pl for creating new tags
1217* ID3v2::getFrameIDs returns now a hash reference, which contains the found
1218  frames. The keys are the 4 byte codes of the frames, which are needed for
1219  getFrame . The according values are the english (long) names of the frames.
1220* ID3v2::write_tag - Updating tagsize after writing tag
1221* ID3v1::all() returns in array context all fields, otherwise only the song
1222* MP3::ID3v1::write_tag didn't returned an error if a file couldn't be opened
1223  for writing. Now it does.
1224* Renamed MP3::TAG to MP3::Tag following a suggestion of ANDK from CPAN
1225* Makefile.PL : Added that Compress::Zlib and File::Basename is needed for
1226  installation of MP3::Tag
1227
1228Release Name: 0.1 (beta)
1229========================
1230Changes:
1231* Added documentation to the modules
1232
1233* Writing/removing of ID3v2.3 tags is supported now
1234* Adding, changing, removing frames of ID3v2.3 is supported
1235
1236* Changed directory structure
1237* Added file for proper install of modules
1238
1239
1240Release Name: 0.2-alpha
1241=======================
1242Changes:
1243* ID3v2.3 compressed frames are supported now
1244* changed directory structure, support librarys for MP3::Tag are now in a
1245  subdirectory
1246* tagged.pl calls xview to show pictures, which were found in ID3v2 tags
1247  (sorry, not configurable at the moment, but easy to change in tagged.pl)
1248
1249Release Name: 0.1-alpha
1250=======================
1251This is the first alpha version. It contains perl modules to
1252read ID3v1/ID3v2 tags, but they are still lacking a lot of
1253features.
1254
1255* Reading / Writing ID3v1 works
1256* Reading of most frames of ID3v2.3 works
1257
1258Included is a demo program tagged.pl, and a program to change ID3v1
1259tags and to set automatically the filename of a mp3 file: tagit.pl See
1260README.txt for details. More documentation is still lacking. Sorry.
1261
1262
1263
1264MP3::Tag can be found at http://sourceforge.net/projects/tagged