39 uint32 readIntegerString(
ID3_Reader& reader,
size_t numBytes)
42 for (
size_t i = 0; i < numBytes && isdigit(reader.
peekChar()); ++i)
44 val = (val * 10) + (reader.
readChar() -
'0');
46 ID3D_NOTICE(
"readIntegerString: val = " << val );
58 if (reader.
getEnd() < cur + 7)
62 bool its = (
'[' == reader.
readChar() &&
70 ID3D_NOTICE(
"isTimeStamp(): found timestamp, cur = " << reader.
getCur() );
78 size_t sec = readIntegerString(reader, 2) * 60;
80 sec += readIntegerString(reader, 2);
82 ID3D_NOTICE(
"readTimeStamp(): timestamp = " << sec );
94 while (!reader.
atEnd())
97 if (ch == text[index])
101 else if (ch == text[0])
109 if (index == text.size())
112 ID3D_NOTICE(
"findText: found \"" << text <<
"\" at " <<
117 return !reader.
atEnd();
122 while (!reader.
atEnd())
127 while (isTimeStamp(reader))
132 readTimeStamp(reader);
136 ms = readTimeStamp(reader);
139 while (!reader.
atEnd() && !isTimeStamp(reader))
142 if (0x0A == ch && (reader.
atEnd() || isTimeStamp(reader)))
157 ID3D_NOTICE(
"lyrics3toSylt: ms = " << ms );
162 ID3D_NOTICE(
"lyrics3toSylt: adding lf" );
175 if (end < reader.
getBeg() + 9 + 128)
177 ID3D_NOTICE(
"id3::v1::parse: bailing, not enough bytes to parse, pos = " << end );
180 reader.
setCur(end - (9 + 128));
191 if (end < reader.
getBeg() + 11 + 9 + 128)
194 ID3D_WARNING(
"id3::v1::parse: not enough data to parse lyrics3" );
199 size_t window = end - reader.
getBeg();
200 size_t lyrDataSize = min<size_t>(window, 11 + 5100 + 9 + 128);
201 reader.
setCur(end - lyrDataSize);
204 if (!findText(wr,
"LYRICSBEGIN"))
206 ID3D_WARNING(
"id3::v1::parse: couldn't find LYRICSBEGIN, bailing" );
216 id3::v2::setLyrics(tag, lyrics,
"Converted from Lyrics3 v1.00",
"XXX");
226 if (end < reader.
getBeg() + 6 + 9 + 128)
228 ID3D_NOTICE(
"lyr3::v2::parse: bailing, not enough bytes to parse, pos = " << reader.
getCur() );
232 reader.
setCur(end - (6 + 9 + 128));
236 lyrSize = readIntegerString(reader, 6);
237 if (reader.
getCur() < beg + 6)
239 ID3D_NOTICE(
"lyr3::v2::parse: couldn't find numeric string, lyrSize = " <<
250 if (end < reader.
getBeg() + lyrSize + 6 + 9 + 128)
252 ID3D_WARNING(
"lyr3::v2::parse: not enough data to parse tag, lyrSize = " << lyrSize );
255 reader.
setCur(end - (lyrSize + 6 + 9 + 128));
265 ID3D_WARNING(
"lyr3::v2::parse: couldn't find LYRICSBEGIN, bailing" );
269 bool has_time_stamps =
false;
278 ID3D_NOTICE(
"lyr3::v2::parse: fldName = " << fldName );
279 fldSize = readIntegerString(wr, 5);
280 ID3D_NOTICE(
"lyr3::v2::parse: fldSize = " << fldSize );
288 ID3D_NOTICE(
"lyr3::v2::parse: fldData = \"" << fldData <<
"\"" );
291 if (fldName ==
"IND")
293 has_time_stamps = (fldData.size() > 1 && fldData[1] ==
'1');
297 else if (fldName ==
"ETT" && !id3::v2::hasTitle(tag))
300 id3::v2::setTitle(tag, fldData);
304 else if (fldName ==
"EAR" && !id3::v2::hasArtist(tag))
307 id3::v2::setArtist(tag, fldData);
311 else if (fldName ==
"EAL" && !id3::v2::hasAlbum(tag))
314 id3::v2::setAlbum(tag, fldData);
318 else if (fldName ==
"AUT")
321 id3::v2::setLyricist(tag, fldData);
325 else if (fldName ==
"INF")
328 id3::v2::setComment(tag, fldData,
"Lyrics3 v2.00 INF",
"XXX");
332 else if (fldName ==
"LYR")
335 String desc =
"Converted from Lyrics3 v2.00";
337 if (!has_time_stamps)
339 lyr_frame = id3::v2::setLyrics(tag, fldData, desc,
"XXX");
345 ID3D_NOTICE(
"lyr3::v2::parse: determining synced lyrics" );
348 lyrics3ToSylt(sr, sw);
350 lyr_frame = id3::v2::setSyncLyrics(tag, sylt,
ID3TSF_MS, desc,
352 ID3D_NOTICE(
"lyr3::v2::parse: determined synced lyrics" );
355 else if (fldName ==
"IMG")
358 ID3D_WARNING(
"lyr3::v2::parse: IMG field unsupported" );
362 ID3D_WARNING(
"lyr3::v2::parse: undefined field id: " <<