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