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