27 #if defined HAVE_CONFIG_H
35 #include "id3/io_decorators.h"
41 uint32 readSeconds(
ID3_Reader& reader,
size_t len)
43 io::ExitTrigger et(reader);
44 io::WindowedReader wr(reader, len);
56 else if (!isdigit(ch))
62 cur = cur * 10 + (ch -
'0');
71 uint32 size = io::readLENumber(reader, 2);
72 ID3D_NOTICE(
"readTextFrame: size = " << size );
81 io::LineFeedReader lfr(reader);
82 text = io::readText(lfr, size);
83 ID3D_NOTICE(
"readTextFrame: text = " << text );
87 text =
toString(readSeconds(reader, size) * 1000);
88 ID3D_NOTICE(
"readTextFrame: songlen = " << text );
96 frame->GetField(
ID3FN_TEXT)->Set(text.c_str());
100 frame->GetField(
ID3FN_URL)->Set(text.c_str());
117 io::ExitTrigger et(rdr);
119 if (end < rdr.
getBeg() + 48)
121 ID3D_NOTICE(
"mm::parse: bailing, not enough bytes to parse, pos = " << end );
129 if (io::readText(rdr, 32) !=
"Brava Software Inc. ")
131 ID3D_NOTICE(
"mm::parse: bailing, couldn't find footer" );
135 version = io::readText(rdr, 4);
136 if (version.size() != 4 ||
137 !isdigit(version[0]) || version[1] !=
'.' ||
138 !isdigit(version[2]) ||
139 !isdigit(version[3]))
141 ID3D_WARNING(
"mm::parse: bailing, nonstandard version = " << version );
150 ID3D_NOTICE(
"mm::parse: bailing, not enough bytes to parse offsets, pos = " << end );
155 io::WindowedReader dataWindow(rdr);
156 dataWindow.setEnd(rdr.
getCur());
160 io::WindowedReader offsetWindow(rdr, 20);
161 for (
size_t i = 0; i < 5; ++i)
163 offsets[i] = io::readLENumber(rdr,
sizeof(uint32));
166 size_t metadataSize = 0;
167 if (version <=
"3.00")
179 size_t possibleSizes[] = { 8132, 8004, 7936 };
181 for (
size_t i = 0; i <
sizeof(possibleSizes)/
sizeof(
size_t); ++i)
183 dataWindow.setCur(dataWindow.getEnd());
187 size_t offset = possibleSizes[i] + 256;
188 if (dataWindow.getCur() < offset)
194 dataWindow.setCur(dataWindow.getCur() - offset);
197 if (io::readText(dataWindow, 8) ==
"18273645")
199 metadataSize = possibleSizes[i];
204 if (0 == metadataSize)
208 ID3D_WARNING(
"mm::parse: bailing, couldn't find meta data signature, end = " << end );
214 size_t sectionSizes[5];
215 size_t tagSize = metadataSize;
218 sectionSizes[4] = metadataSize;
220 size_t lastOffset = 0;
221 for (
int i = 0; i < 5; i++)
223 size_t thisOffset = offsets[i];
227 size_t sectionSize = thisOffset - lastOffset;
228 sectionSizes[i-1] = sectionSize;
229 tagSize += sectionSize;
231 lastOffset = thisOffset;
235 if (dataWindow.getEnd() < tagSize)
239 ID3D_WARNING(
"mm::parse: bailing, tag size is too big, tag size = " << tagSize <<
", end = " << end );
243 dataWindow.setBeg(dataWindow.getEnd() - tagSize);
244 dataWindow.setCur(dataWindow.getBeg());
247 offsets[0] = dataWindow.getBeg();
248 for (
size_t i = 0; i < 4; ++i)
250 offsets[i+1] = offsets[i] + sectionSizes[i];
254 if (dataWindow.getBeg() >= 256)
256 rdr.
setCur(dataWindow.getBeg() - 256);
257 if (io::readText(rdr, 8) ==
"18273645")
259 et.setExitPos(rdr.
getCur() - 8);
263 et.setExitPos(dataWindow.getBeg());
265 dataWindow.setCur(dataWindow.getBeg());
271 dataWindow.setCur(offsets[0]);
272 String imgExt = io::readTrailingSpaces(dataWindow, 4);
275 dataWindow.setCur(offsets[1]);
276 uint32 imgSize = io::readLENumber(dataWindow, 4);
283 io::WindowedReader imgWindow(dataWindow, imgSize);
284 if (imgWindow.getEnd() < imgWindow.getBeg() + imgSize)
291 BString imgData = io::readAllBinary(imgWindow);
295 String mimetype(
"image/");
301 frame->GetField(
ID3FN_DATA)->Set(
reinterpret_cast<const uchar*
>(imgData.data()), imgData.size());
309 dataWindow.setCur(offsets[4]);
324 dataWindow.skipChars(12);
330 uint32 trkNum = io::readLENumber(dataWindow, 2);
337 frame->GetField(
ID3FN_TEXT)->Set(trkStr.c_str());
The representative class of an id3v2 frame.
virtual pos_type setCur(pos_type pos)=0
Set the value of the current position for reading.
virtual pos_type getCur()=0
Return the current position in the reader.
virtual pos_type getBeg()
Return the beginning position in the reader.
bool AttachFrame(ID3_Frame *)
@ ID3FN_MIMETYPE
Mimetype field.
@ ID3FN_DESCRIPTION
Description field.
@ ID3FN_IMAGEFORMAT
Image format field.
@ ID3FN_LANGUAGE
Language field.
@ ID3FN_PICTURETYPE
Picture type field.
ID3_FrameID
Enumeration of the different types of frames recognized by id3lib.
@ ID3FID_LEADARTIST
Lead performer(s)/Soloist(s)
@ ID3FID_CONTENTTYPE
Content type.
@ ID3FID_WWWARTIST
Official artist/performer webpage.
@ ID3FID_ALBUM
Album/Movie/Show title.
@ ID3FID_COMMENT
Comments.
@ ID3FID_WWWCOMMERCIALINFO
Commercial information.
@ ID3FID_PICTURE
Attached picture.
@ ID3FID_TRACKNUM
Track number/Position in set.
@ ID3FID_UNSYNCEDLYRICS
Unsynchronized lyric/text transcription.
@ ID3FID_TITLE
Title/songname/content description.
bool parse(ID3_TagImpl &, ID3_Reader &)
String ID3_C_EXPORT toString(uint32 val)