173 io::ExitTrigger et(reader);
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));
183 if (io::readText(reader, 9) !=
"LYRICSEND" ||
184 io::readText(reader, 3) !=
"TAG")
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);
202 io::WindowedReader wr(reader, lyrDataSize - (9 + 128));
204 if (!findText(wr,
"LYRICSBEGIN"))
206 ID3D_WARNING(
"id3::v1::parse: couldn't find LYRICSBEGIN, bailing" );
210 et.setExitPos(wr.getCur());
212 wr.setBeg(wr.getCur());
214 io::LineFeedReader lfr(wr);
215 String lyrics = io::readText(lfr, wr.remainingBytes());
216 id3::v2::setLyrics(tag, lyrics,
"Converted from Lyrics3 v1.00",
"XXX");
224 io::ExitTrigger et(reader);
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 = " <<
244 if (io::readText(reader, 9) !=
"LYRICS200" ||
245 io::readText(reader, 3) !=
"TAG")
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));
257 io::WindowedReader wr(reader);
258 wr.setWindow(wr.getCur(), lyrSize);
262 if (io::readText(wr, 11) !=
"LYRICSBEGIN")
265 ID3D_WARNING(
"lyr3::v2::parse: couldn't find LYRICSBEGIN, bailing" );
269 bool has_time_stamps =
false;
277 String fldName = io::readText(wr, 3);
278 ID3D_NOTICE(
"lyr3::v2::parse: fldName = " << fldName );
279 fldSize = readIntegerString(wr, 5);
280 ID3D_NOTICE(
"lyr3::v2::parse: fldSize = " << fldSize );
284 io::WindowedReader wr2(wr, fldSize);
285 io::LineFeedReader lfr(wr2);
287 fldData = io::readText(lfr, 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");
344 io::StringReader sr(fldData);
345 ID3D_NOTICE(
"lyr3::v2::parse: determining synced lyrics" );
347 io::BStringWriter sw(sylt);
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: " <<