1Changelog for 'id3'. 2 32015-352 (W51): ---------[v0.80]----------- 4 dumptag.cpp: [CLI CHANGE] added a verbose tag viewing mode; if the 5 -v/--verbose flag is added to the commandline, a full listing of 6 the selected tags will be given 7 82015-352 (W51): 9 fileexp.cpp: '?' will no langer match against / in --recursive mode; 10 -R was not working on UNC paths in Windows. optimized file access. 11 setid3v2.cpp: convert text encoded using v2.4-only encodings 12 charconv.cpp: fix issues with iconv: const char** vs char** change 13 in FreeBSD; fix faulty behaviour wrt. unconvertible characters 14 152015-348 (W50): 16 main.cpp: %a variable substitution now will read from the first valid 17 tag selected on the commandline, instead of only the first 18 192015-347 (W50): 20 main.cpp: [cli change] added --long-options; see `id3 --help' 21 fileexp.cpp: [bugfix] globbing failed if prefix contained a directory 22 without read access; also fixes a segfault if cwd wasn't readable 23 242015-336 (W49): 25 ?etid3v2.cpp: [bugfixes] frames being written by -wCOMM:xxxx lacked a 26 language field, potentially producing invalidly formatted frames; 27 fixed behaviour in presence of multiple COMM frames; 28 fix behaviour with Unicode characters in TXXX/COMM:xxxx tags 29 302015-335 (W49): 31 id3v2.c: [bugfix] fix check that prevented conversion of ID3v2.4 tags 32 set*.cpp: tighter error checking; should produce more warnings 33 342015-332 (W48): 35 [cli change] added support for bash auto-completion; installed with 36 'make install-full' or 'make install bash_completion' 37 382015-029 (W05): ---------[v0.79]----------- 39 main.cpp: [cli change] if no tags are selected (using -1, -2, -3), id3 will 40 select the best tag to read from; also, in this case ID3v2 will be 41 modified if already present (but not added) 42 main.cpp: [cli change] default operation (without options) is now to view 43 tag info, instead of `do nothing'. 44 452015-024 (W04): 46 mass_tag.cpp: Unicode-escape sequences (\uXXXX, \UXXXXXXXX) added 47 fileexp.cpp: [bugfix] -R could match too many files in obscure cases 48 492015-020 (W04): 50 [CLI CHANGE]: %##n now means 'pad embedded numbers in %n out to width two' 51 sedit.cpp: remove leading zeroes from numbers in %subsitution if # used 52 getid3v2.cpp/setid3v2.cpp: allow writing user-defined TXXX/COMM flags with 53 descriptors; for example with `id3 -2 -wTXXX:FMPS_Rating 42' 54 mass_tag.cpp: allow reading non-standard information with %{TAG}; e.g. 55 '%{TMOO}' to get the 'mood' information in ID3v2.3 56 572015-019 (W04): 58 charconv.cpp: use iconv() on platforms that are not __STDC_ISO_10646__ to 59 support non-UTF8 locales on *BSD; disable with -DNO_ICONV 60 id3v2.c/getid3v2.cpp: minimalist ID3v2.4 support; upon write these will be 61 converted to ID3v2.3 62 632015-016 (W03): 64 id3v2.c: some tweaks to be more accepting/attempt repair of invalid tags 65 added missing #include <cstring> to three files + compilation under MSVC 66 672007-009 (W02): 68 charconv.h: should now compile out of the box in Cygwin without -mno-cygwin 69 702006-287 (W41): 71 varexp.cpp: replaced inefficient wildcard matching 72 732006-084 (W12): 74 fileexp.cpp: added support for unc pathnames 75 762006-078 (W11): ---------[v0.78]----------- 77 main.cpp: integrated Lyrics3 support 78 setfname.cpp: renaming-to-self allowed 79 802006-073 (W11): 81 main: [CLI CHANGE] -R has been made into a simple switch which enables the 82 matching of '/' against wildcards. 83 fileexp: integrated pattern() into glob() 84 main.cpp/set_base.h: code reorganisation 85 pattern.cpp: prefix gets copied now; making 86 `id3 -m "%+a - %||t.mp3"' equal to `id3 -a "%+1" -t "%||2" "* - *.mp3"' 87 sedit.cpp: added %* prefix to split "ThisIsATest" -> "This Is A Test" 88 892006-040 (W06): 90 lyrics3.cpp/getlyr3.cpp created 91 getid3v2.cpp/id3v2.c: added/fixed check for silly id3v2 frames 92 932006-039 (W06): 94 setid3.cpp: also writes id3v1.0 tags if possible. 95 962006-035 (W05): 97 main.cpp/mass_tag.cpp: added -A, -T and %A, %T as quiet synonyms for -l, -n 98 this is for better CLI compatibility with other programs; 99 charconv.cpp: added an extra check whether there is nl_langinfo(CODESET) 100 setid3v2.cpp:251: [bug] "<empty>" could get written to ID3v2. fixed. 101 1022006-030 (W04): ---------[v0.77]----------- 103 main.cpp: user checks: ignore extra file arguments when using -m, ignore 104 options after first filename was given (regression) 105 1062006-027 (W04): 107 small portability fixes 108 mass_tag.cpp: split %x; %x is for autonumbering, %X for counting files, 109 added %p (path) to complement %f (filename) 110 1112006-025 (W04): 112 main.cpp: added -M (preserve time stamp) 113 main.cpp: added -D (replace tag by that from a different file) 114 other small tweaks, partial i18n outside of Linux 115 1162006-024 (W04): 117 adapted to use new replacement function; totally empty variables will not 118 clobber existing values now; also means -u will truly be 'update'. 119 1202005-362 (W52): 121 charconv.*: redesigned character conversion, support for win/dos 122 sedit: replacement written; added support for \n, \t, \r and other escape 123 sequences. added multiple fallbacks and "%| a || b || c |?" selection 124 1252005-342 (W49): 126 main.cpp: removed internal globbing on directory arguments to -R 127 main.cpp: fixed cases where tag was clobbered before values were read 128 1292005-308 (W44): 130 main.cpp: split up in mass_tag.cpp and pattern.cpp. 131 set_base.cpp: simplified set_tag::combined into set_tag::group 132 setfname.cpp: derived from group, fixes order of operation 133 1342005-305 (W44): 135 setid3v2.cpp: rewrote binarize (using shared categorisations) 136 getid3v2.cpp: rewrote unbinarize, and reading ID3v2.2 137 sedit.cpp: underscores prevented capitalization 138 fileops.c: added mvfile(), which honours hard and sym links 139 id3v2.c: replaced explicit code with calls to mvfile() 140 1412005-299 (W43): 142 id3v2.c: added transparant support for id3v2.2 tags (iTunes default) 143 1442005-198 (W28): ---------[v0.76]----------- 145 id3v2.c:177: [bug] fixed another class of id3v2 rejections (sigh) 146 1472005-187 (W27): 148 main.cpp:136: [bug] %x could get incremented more than once for each file 149 code cleanup/redesign 150 1512005-060 (W09): 152 id3v2.c:128:[bug] since v0.75, rejected id3v2 tags w/o padding 153 1542005-039 (W06): 155 sedit.cpp:89: [CLI] "#" prefixes in vars get processed better now: only 156 numbers found inside the string will get padded. E.g. [1/5] -> [01/05] 157 setid3[v2].cpp: regression: setting dupe fields overrides again 158 fileexp.cpp:110: optimized speed for cases where the shell has handled 159 wildcards (saves sorting and scanning a whole dir for each file) 160 fileexp.cpp:132: [CLI] added -R for recursive directory search 161 mp3file.c: wrote mp3 length checking 162 1632005-037 (W05): 164 main.cpp:326: [CLI] added -m switch for 'pattern' shorthand. For example, 165 id3 -m "%a - %t.mp3" is identical to id3 -a %1 -t %2 "* - *.mp3". Only 166 works on recognized variables, so for ex., id3 -m "%s.mp3" is illegal. 167 1682005-035 (W05): 169 code cleanup. 170 1712005-034 (W05): ---------[v0.75]----------- 172 updated documentation 173 getid3.cpp: fixed localization bug 174 1752005-033 (W05): 176 setid3[v2].cpp: setting genre by number now works through substitution 177 setid3[v2].cpp: setting a dupe field won't override an earlier one anymore 178 setfname.cpp: empty vars get substituted by 'Unknown' (by default) 179 id3v2.c:129: [BUGFIX] out of bounds access on illegal id3v2 tags 180 ironically, that routine was supposed to catch illegal id3v2 tags... 181 ffindexp.cpp:94: now sorts file list (wasn't necessary previously) 182 sedit.cpp: [CLI] added %||v fallback, and grouping (kept disabled) 183 1842005-031 (W05): 185 getid3[v2].cpp: added 186 main.cpp: [CLI] added substitution of %t, %a, %n, %l, %y, %c, %g, %x 187 main.cpp: [CLI] enabled -! and -f switch 188 sedit.cpp: removed substitutions that introduced null chars 189 1902005-025 (W04): 191 setid3v2.cpp: [BUGFIX] v2 tag contents weren't written if using a user 192 specified locale. Also -wPCNT listens to vars now. 193 setecho: [CLI] Added very primitive tag info display (-q switch) 194 charconv: Implemented cvtstring system for conversion. 195 sedit: string_parm adapted to use cvtstring 196 sedit: now filters control characters from substituted variables 197 1982004-196 (W27): 199 debian/*: automation of building .deb packages via dpkg-buildpackage -b 200 makefile: added 'wget-orig' and 'fetch-orig' (get latest source tarball) 201 makefile: deGNUified 202 2032004-183 (W27): 204 sedit.cpp: edit() overhauled + support for %a .. %z added 205 2062004-176 (W26): ---------[v0.74]----------- 207 main.cpp: [BUGFIX] ARGH! Since 0.72, id3 crashed on invalid %indexes. I 208 had carefully placed range checks in the original varexp, but due to 209 later mod's, the original varexp [] didn't get called anymore. #$()*# 210 2112004-171 (W25): 212 sedit.cpp: [BUGFIX] conversion to latin1 gets used correctly now 213 sedit.cpp: removed deprecated stuff 214 2152004-170 (W25): 216 setid3v2.cpp: [CLI] free form id3v2 tags get processed now 217 knows T???, W???, COMM, IPLS, USLT, USER and PCNT frames 218 2192004-167 (W25): 220 setfname: created file rename implementation 221 set_base.h: streamlining 222 2232004-162 (W24): 224 main.cpp: [CLI] added -s switch for suggesting tag size 225 id3v2.c:249:added size-hint recognition 226 main.cpp:278: [BUGFIX] -rXXXX didn't work anymore 227 2282004-148 (W22): ---------[v0.73]----------- 229 makefile deGNUified (mostly), some size optimizations 230 2312004-144 (W21): 232 charconv.cpp: hacked together a converion to latin1 on systems that are 233 fully unicode compliant (e.g. glibc2.2 and up) 234 setid3.cpp: now upgrades old ID3v1.0 tags 235 id3v2.c:186: fixed (rare) leak, added check to see if padding is zeroed 236 setid3v2.cpp:127: added checking and prevention against malformed tags 237 main.cpp: added "-V" version information, changed help screen 238 2392004-093 (W14): 240 main.cpp: Added "--" option (stops scanning for more options) 241 2422004-053 (W08): 243 Replaced smartID3 functionality with something more extensible. 244 2452004-030 (W05): 246 Added a lot of makefile fluff (install-full, dist, dist-zip) 247 main.cpp:178: made options case sensitive 248 2492004-029 (W05): 250 Created a unix manpage. (Whew!) 251 2522004-027 (W05): ---------[v0.72]----------- 253 [CLI] Now supports directory wildcards (e.g. "mp3root/*/*/*_*.mp3") 254 Be careful with this, mkay? ;) 255 sedit.cpp:capitalize: now handles punctuation properly 256 (so it will be "Love's" and "2nd", not "Love'S" and "2Nd") 257 sedit.cpp: Added a "%-" modifier (all characters lowercase), and added 258 removal of extraneous spaces (suppressed by the "%_" modifier) 259 main.cpp: now uses ffindexp for solving wildcard match (see above) 260 2612004-019 (W04): 262 (Resumed development) 263 varexp.h: added varexp::iterator class 264 ffindexp.cpp: fleshed out base algorithm 265 2662003-301 (W44): 267 setid3.cpp:clipped_compare: added a more intelligent ID3v1 genre-lookup, 268 so saying "alt" and "alternative", "prog.rock" and "progressive rock", 269 "fast fusion" and "fast-fusion", "humour" and "humor", "psyche/adelic", 270 etc, etc, will all resolve to the correct genre. 271 setid3.cpp<>sedit.cpp: made smartID3::edit an independent function 272 2732003-299 (W43): 274 main:cpp: error messages to stderr instead of stdout, program now gives 275 meaningful result codes. 276 id3v2.c:11: fixed copyright notice. :) 277 id3v2.c<>fileops.c: split into two components. 278 fileops.c: replaced fopentmp with something conceptually simpler. 279 makefile: made it somewhat more conformant. id3 is still too basic to 280 warrant using autoconf, imo. 281 2822003-296 (W43): ---------[v0.71]----------- 283 main.cpp:dirvector: reads directory as a whole to avoid order mangling 284 main.cpp: added version info to -h, and added verbose mode with timing 285 main.cpp:67: now uses posix constant 286 setid3:86: [CLI] added "%," as alternative to "%n", "%@" for "%:" 287 varexp.cpp:19: no longer copies vectors around. 288 Updated documentation 289 2902003-269 (W39): 291 main.cpp : [CLI CHANGE!] -dFRAME is now -rFRAME to remove possible 292 confusion when -d is used as a stacked parameter. 293 id3v2.c:87: encapsulated tmpname handling in fopentmp(), added code that 294 uses mktemp() to make id3v2 tag handling _much_ faster. 295 2962003-267 (W39): 297 setid3.cpp:38: made freshly written ID3v1 tags have an empty genre. 298 id3v2.c:307 : don't rewrite files with no ID3v2 tags when removing 299 ID3v2 tags from files. 300 3012003-262 (W38): 302 (Resumed development) 303 main.cpp: [CLI CHANGE!] implemented command stacking, so 304 '-nat Track Artist Title' == '-n Track -a Artist -t Title' 305 3062003-218 (W32): ---------[v0.70]----------- 307 id3v2.c:ID3_writef: [BUGFIX] Serious. tmpnam() does not guarantee to 308 create filenames that can always be fed to rename() on all systems, 309 thus causing files to disappear / remain in your temp dir. 310 Fix: Added a copy routine/handler. 311 setid3.cpp & setid3v2.cpp: now throw exceptions on serious errors 312 varexp.h: better explanation of index-out-of-range error 313 main.cpp: handles all exceptions, more consistent help messages 314 3152003-216 (W32): 316 id3v2.c: added check on tmpnam(0) returning NULL 317 id3v2.c:66: added safety to see if copyfile() halted because of eof 318 setid3v2.cpp: [BUGFIX] Harmless. w_ptr constructor sometimes got an 319 uninitialized allocation value (went by unnoticed because of 320 alloc-on-write?). Fix: Removed this feature - unnecessary anyway. 321 setid3v2.cpp: only read previous ID3v2 if necessary. 322 3232003-198 (W29): 324 added conditional stdint.h include, some dirent.h implementations need it 325 3262003-189 (W28): ---------[v0.60]----------- 327 First public release 328 setid3.cpp: removed silly packing check 329 setid3v2.cpp: added "&& src". Whoopsee! :) 330 id3v2.c: writef() now writes ID3v2 tags to files < 10 bytes. :) 331 3322003-185 (W27): 333 setid3v2.cpp: made w_ptr a live object + added bad_alloc checks 334 setid3v2.cpp: void* src + ID3_free -> voidp<> src (exception safety) 335 setid3.cpp: Now emits CR/LF pairs for %n, violating ID3v2, but 336 conforming to Winamp. I figure more people care about Winamp. 337 3382003-184 (W27): 339 Readme 340 Added specifying genre per number 341 3422003-183 (W27): 343 Started changelog. 344 Install 345 More code cleaning. Removed implementation-dependency with rename() 346 3472003-181 (W27): 348 Code clean up + minor improvements (e.g. added [] to wildcard match) 349 Bolted together (private) `id3' & (private) ID3v2 sources 350 351Todo list: 352 353 - Reading MP3 data (Bitrate, length, etc. Half done.) 354 - Cross-directory renaming/moving 355 - More things: 356 + Support for Ogg Vorbis 357 + Support for APEv2 358 - Enable multibyte encodings for varexp? 359 - Extend substitution capabilities (i/o? slice?) 360 361Thanks go out to everybody who has responded with questions, suggestions, 362and bug reports! 363 364