Changelog for 'id3'. 2006-078 (W11): ---------[v0.78]----------- main.cpp: integrated Lyrics3 support setfname.cpp: renaming-to-self allowed 2006-073 (W11): main: [CLI CHANGE] -R has been made into a simple switch which enables the matching of '/' against wildcards. fileexp: integrated pattern() into glob() main.cpp/set_base.h: code reorganisation pattern.cpp: prefix gets copied now; making `id3 -m "%+a - %||t.mp3"' equal to `id3 -a "%+1" -t "%||2" "* - *.mp3"' sedit.cpp: added %* prefix to split "ThisIsATest" -> "This Is A Test" 2006-040 (W06): lyrics3.cpp/getlyr3.cpp created getid3v2.cpp/id3v2.c: added/fixed check for silly id3v2 frames 2006-039 (W06): setid3.cpp: also writes id3v1.0 tags if possible. 2006-035 (W05): main.cpp/mass_tag.cpp: added -A, -T and %A, %T as quiet synonyms for -l, -n this is for better CLI compatibility with other programs; charconv.cpp: added an extra check whether there is nl_langinfo(CODESET) setid3v2.cpp:251: [bug] "<empty>" could get written to ID3v2. fixed. 2006-030 (W04): ---------[v0.77]----------- main.cpp: user checks: ignore extra file arguments when using -m, ignore options after first filename was given (regression) 2006-027 (W04): small portability fixes mass_tag.cpp: split %x; %x is for autonumbering, %X for counting files, added %p (path) to complement %f (filename) 2006-025 (W04): main.cpp: added -M (preserve time stamp) main.cpp: added -D (replace tag by that from a different file) other small tweaks, partial i18n outside of Linux 2006-024 (W04): adapted to use new replacement function; totally empty variables will not clobber existing values now; also means -u will truly be 'update'. 2005-362 (W52): charconv.*: redesigned character conversion, support for win/dos sedit: replacement written; added support for \n, \t, \r and other escape sequences. added multiple fallbacks and "%| a || b || c |?" selection 2005-342 (W49): main.cpp: removed internal globbing on directory arguments to -R main.cpp: fixed cases where tag was clobbered before values were read 2005-308 (W44): main.cpp: split up in mass_tag.cpp and pattern.cpp. set_base.cpp: simplified set_tag::combined into set_tag::group setfname.cpp: derived from group, fixes order of operation 2005-305 (W44): setid3v2.cpp: rewrote binarize (using shared categorisations) getid3v2.cpp: rewrote unbinarize, and reading ID3v2.2 sedit.cpp: underscores prevented capitalization fileops.c: added mvfile(), which honours hard and sym links id3v2.c: replaced explicit code with calls to mvfile() 2005-299 (W43): id3v2.c: added transparant support for id3v2.2 tags (iTunes default) 2005-198 (W28): ---------[v0.76]----------- id3v2.c:177: [bug] fixed another class of id3v2 rejections (sigh) 2005-187 (W27): main.cpp:136: [bug] %x could get incremented more than once for each file code cleanup/redesign 2005-060 (W09): id3v2.c:128:[bug] since v0.75, rejected id3v2 tags w/o padding 2005-039 (W06): sedit.cpp:89: [CLI] "#" prefixes in vars get processed better now: only numbers found inside the string will get padded. E.g. [1/5] -> [01/05] setid3[v2].cpp: regression: setting dupe fields overrides again fileexp.cpp:110: optimized speed for cases where the shell has handled wildcards (saves sorting and scanning a whole dir for each file) fileexp.cpp:132: [CLI] added -R for recursive directory search mp3file.c: wrote mp3 length checking 2005-037 (W05): main.cpp:326: [CLI] added -m switch for 'pattern' shorthand. For example, id3 -m "%a - %t.mp3" is identical to id3 -a %1 -t %2 "* - *.mp3". Only works on recognized variables, so for ex., id3 -m "%s.mp3" is illegal. 2005-035 (W05): code cleanup. 2005-034 (W05): ---------[v0.75]----------- updated documentation getid3.cpp: fixed localization bug 2005-033 (W05): setid3[v2].cpp: setting genre by number now works through substitution setid3[v2].cpp: setting a dupe field won't override an earlier one anymore setfname.cpp: empty vars get substituted by 'Unknown' (by default) id3v2.c:129: [BUGFIX] out of bounds access on illegal id3v2 tags ironically, that routine was supposed to catch illegal id3v2 tags... ffindexp.cpp:94: now sorts file list (wasn't necessary previously) sedit.cpp: [CLI] added %||v fallback, and grouping (kept disabled) 2005-031 (W05): getid3[v2].cpp: added main.cpp: [CLI] added substitution of %t, %a, %n, %l, %y, %c, %g, %x main.cpp: [CLI] enabled -! and -f switch sedit.cpp: removed substitutions that introduced null chars 2005-025 (W04): setid3v2.cpp: [BUGFIX] v2 tag contents weren't written if using a user specified locale. Also -wPCNT listens to vars now. setecho: [CLI] Added very primitive tag info display (-q switch) charconv: Implemented cvtstring system for conversion. sedit: string_parm adapted to use cvtstring sedit: now filters control characters from substituted variables 2004-196 (W27): debian/*: automation of building .deb packages via dpkg-buildpackage -b makefile: added 'wget-orig' and 'fetch-orig' (get latest source tarball) makefile: deGNUified 2004-183 (W27): sedit.cpp: edit() overhauled + support for %a .. %z added 2004-176 (W26): ---------[v0.74]----------- main.cpp: [BUGFIX] ARGH! Since 0.72, id3 crashed on invalid %indexes. I had carefully placed range checks in the original varexp, but due to later mod's, the original varexp [] didn't get called anymore. #$()*# 2004-171 (W25): sedit.cpp: [BUGFIX] conversion to latin1 gets used correctly now sedit.cpp: removed deprecated stuff 2004-170 (W25): setid3v2.cpp: [CLI] free form id3v2 tags get processed now knows T???, W???, COMM, IPLS, USLT, USER and PCNT frames 2004-167 (W25): setfname: created file rename implementation set_base.h: streamlining 2004-162 (W24): main.cpp: [CLI] added -s switch for suggesting tag size id3v2.c:249:added size-hint recognition main.cpp:278: [BUGFIX] -rXXXX didn't work anymore 2004-148 (W22): ---------[v0.73]----------- makefile deGNUified (mostly), some size optimizations 2004-144 (W21): charconv.cpp: hacked together a converion to latin1 on systems that are fully unicode compliant (e.g. glibc2.2 and up) setid3.cpp: now upgrades old ID3v1.0 tags id3v2.c:186: fixed (rare) leak, added check to see if padding is zeroed setid3v2.cpp:127: added checking and prevention against malformed tags main.cpp: added "-V" version information, changed help screen 2004-093 (W14): main.cpp: Added "--" option (stops scanning for more options) 2004-053 (W08): Replaced smartID3 functionality with something more extensible. 2004-030 (W05): Added a lot of makefile fluff (install-full, dist, dist-zip) main.cpp:178: made options case sensitive 2004-029 (W05): Created a unix manpage. (Whew!) 2004-027 (W05): ---------[v0.72]----------- [CLI] Now supports directory wildcards (e.g. "mp3root/*/*/*_*.mp3") Be careful with this, mkay? ;) sedit.cpp:capitalize: now handles punctuation properly (so it will be "Love's" and "2nd", not "Love'S" and "2Nd") sedit.cpp: Added a "%-" modifier (all characters lowercase), and added removal of extraneous spaces (suppressed by the "%_" modifier) main.cpp: now uses ffindexp for solving wildcard match (see above) 2004-019 (W04): (Resumed development) varexp.h: added varexp::iterator class ffindexp.cpp: fleshed out base algorithm 2003-301 (W44): setid3.cpp:clipped_compare: added a more intelligent ID3v1 genre-lookup, so saying "alt" and "alternative", "prog.rock" and "progressive rock", "fast fusion" and "fast-fusion", "humour" and "humor", "psyche/adelic", etc, etc, will all resolve to the correct genre. setid3.cpp<>sedit.cpp: made smartID3::edit an independent function 2003-299 (W43): main:cpp: error messages to stderr instead of stdout, program now gives meaningful result codes. id3v2.c:11: fixed copyright notice. :) id3v2.c<>fileops.c: split into two components. fileops.c: replaced fopentmp with something conceptually simpler. makefile: made it somewhat more conformant. id3 is still too basic to warrant using autoconf, imo. 2003-296 (W43): ---------[v0.71]----------- main.cpp:dirvector: reads directory as a whole to avoid order mangling main.cpp: added version info to -h, and added verbose mode with timing main.cpp:67: now uses posix constant setid3:86: [CLI] added "%," as alternative to "%n", "%@" for "%:" varexp.cpp:19: no longer copies vectors around. Updated documentation 2003-269 (W39): main.cpp : [CLI CHANGE!] -dFRAME is now -rFRAME to remove possible confusion when -d is used as a stacked parameter. id3v2.c:87: encapsulated tmpname handling in fopentmp(), added code that uses mktemp() to make id3v2 tag handling _much_ faster. 2003-267 (W39): setid3.cpp:38: made freshly written ID3v1 tags have an empty genre. id3v2.c:307 : don't rewrite files with no ID3v2 tags when removing ID3v2 tags from files. 2003-262 (W38): (Resumed development) main.cpp: [CLI CHANGE!] implemented command stacking, so '-nat Track Artist Title' == '-n Track -a Artist -t Title' 2003-218 (W32): ---------[v0.70]----------- id3v2.c:ID3_writef: [BUGFIX] Serious. tmpnam() does not guarantee to create filenames that can always be fed to rename() on all systems, thus causing files to disappear / remain in your temp dir. Fix: Added a copy routine/handler. setid3.cpp & setid3v2.cpp: now throw exceptions on serious errors varexp.h: better explanation of index-out-of-range error main.cpp: handles all exceptions, more consistent help messages 2003-216 (W32): id3v2.c: added check on tmpnam(0) returning NULL id3v2.c:66: added safety to see if copyfile() halted because of eof setid3v2.cpp: [BUGFIX] Harmless. w_ptr constructor sometimes got an uninitialized allocation value (went by unnoticed because of alloc-on-write?). Fix: Removed this feature - unnecessary anyway. setid3v2.cpp: only read previous ID3v2 if necessary. 2003-198 (W29): added conditional stdint.h include, some dirent.h implementations need it 2003-189 (W28): ---------[v0.60]----------- First public release setid3.cpp: removed silly packing check setid3v2.cpp: added "&& src". Whoopsee! :) id3v2.c: writef() now writes ID3v2 tags to files < 10 bytes. :) 2003-185 (W27): setid3v2.cpp: made w_ptr a live object + added bad_alloc checks setid3v2.cpp: void* src + ID3_free -> voidp<> src (exception safety) setid3.cpp: Now emits CR/LF pairs for %n, violating ID3v2, but conforming to Winamp. I figure more people care about Winamp. 2003-184 (W27): Readme Added specifying genre per number 2003-183 (W27): Started changelog. Install More code cleaning. Removed implementation-dependency with rename() 2003-181 (W27): Code clean up + minor improvements (e.g. added [] to wildcard match) Bolted together (private) `id3' & (private) ID3v2 sources Todo list: - Change -R into a switch instead of an option? (Ditch `find' behavior?) - Reading MP3 data (Bitrate, length, etc. Half done.) - Cross-directory renaming/moving - Setting content descriptors in ID3v2 (how?) - Conditional expressions - Long options - More things: + Support for Ogg Vorbis + Support for APEv2 + Support for Lyrics3 v2.0 (no priority) - Enable multibyte encodings for varexp? - Extend substitution capabilities (i/o? slice?) - User configurable switches (.rc file?) Thanks go out to everybody who has responded with questions, suggestions, and bug reports!