00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <stdio.h>
00030
00031 #include "misc_support.h"
00032
00033 #include "id3/utils.h"
00034
00035
00036
00037 char *ID3_GetString(const ID3_Frame *frame, ID3_FieldID fldName)
00038 {
00039 char *text = NULL;
00040
00041 ID3_Field* fld;
00042 if (NULL != frame && NULL != (fld = frame->GetField(fldName)))
00043 {
00044
00045 ID3_TextEnc enc = fld->GetEncoding();
00046 fld->SetEncoding(ID3TE_ISO8859_1);
00047 size_t nText = fld->Size();
00048 text = new char[nText + 1];
00049 fld->Get(text, nText + 1);
00050 fld->SetEncoding(enc);
00051 }
00052 return text;
00053 }
00054
00055 char *ID3_GetString(const ID3_Frame *frame, ID3_FieldID fldName, size_t nIndex)
00056 {
00057 char *text = NULL;
00058 if (NULL != frame)
00059 {
00060 size_t nText = frame->GetField(fldName)->Size();
00061 text = new char[nText + 1];
00062 frame->GetField(fldName)->Get(text, nText + 1, nIndex);
00063 }
00064 return text;
00065 }
00066
00067 void ID3_FreeString(char *str)
00068 {
00069 if(str != NULL)
00070 delete [] str;
00071 }
00072
00073 char *ID3_GetArtist(const ID3_Tag *tag)
00074 {
00075 char *sArtist = NULL;
00076 if (NULL == tag)
00077 {
00078 return sArtist;
00079 }
00080
00081 ID3_Frame *frame = NULL;
00082 if ((frame = tag->Find(ID3FID_LEADARTIST)) ||
00083 (frame = tag->Find(ID3FID_BAND)) ||
00084 (frame = tag->Find(ID3FID_CONDUCTOR)) ||
00085 (frame = tag->Find(ID3FID_COMPOSER)))
00086 {
00087 sArtist = ID3_GetString(frame, ID3FN_TEXT);
00088 }
00089 return sArtist;
00090 }
00091
00092 ID3_Frame* ID3_AddArtist(ID3_Tag *tag, const char *text, bool replace)
00093 {
00094 ID3_Frame* frame = NULL;
00095 if (NULL != tag && NULL != text && strlen(text) > 0)
00096 {
00097 if (replace)
00098 {
00099 ID3_RemoveArtists(tag);
00100 }
00101 if (replace ||
00102 (tag->Find(ID3FID_LEADARTIST) == NULL &&
00103 tag->Find(ID3FID_BAND) == NULL &&
00104 tag->Find(ID3FID_CONDUCTOR) == NULL &&
00105 tag->Find(ID3FID_COMPOSER) == NULL))
00106 {
00107 frame = new ID3_Frame(ID3FID_LEADARTIST);
00108 if (frame)
00109 {
00110 frame->GetField(ID3FN_TEXT)->Set(text);
00111 tag->AttachFrame(frame);
00112 }
00113 }
00114 }
00115 return frame;
00116 }
00117
00118 size_t ID3_RemoveArtists(ID3_Tag *tag)
00119 {
00120 size_t num_removed = 0;
00121 ID3_Frame *frame = NULL;
00122
00123 if (NULL == tag)
00124 {
00125 return num_removed;
00126 }
00127
00128 while ((frame = tag->Find(ID3FID_LEADARTIST)))
00129 {
00130 frame = tag->RemoveFrame(frame);
00131 delete frame;
00132 num_removed++;
00133 }
00134 while ((frame = tag->Find(ID3FID_BAND)))
00135 {
00136 frame = tag->RemoveFrame(frame);
00137 delete frame;
00138 num_removed++;
00139 }
00140 while ((frame = tag->Find(ID3FID_CONDUCTOR)))
00141 {
00142 frame = tag->RemoveFrame(frame);
00143 delete frame;
00144 num_removed++;
00145 }
00146 while ((frame = tag->Find(ID3FID_COMPOSER)))
00147 {
00148 frame = tag->RemoveFrame(frame);
00149 delete frame;
00150 num_removed++;
00151 }
00152
00153 return num_removed;
00154 }
00155
00156 char *ID3_GetAlbum(const ID3_Tag *tag)
00157 {
00158 char *sAlbum = NULL;
00159 if (NULL == tag)
00160 {
00161 return sAlbum;
00162 }
00163
00164 ID3_Frame *frame = tag->Find(ID3FID_ALBUM);
00165 if (frame != NULL)
00166 {
00167 sAlbum = ID3_GetString(frame, ID3FN_TEXT);
00168 }
00169 return sAlbum;
00170 }
00171
00172 ID3_Frame* ID3_AddAlbum(ID3_Tag *tag, const char *text, bool replace)
00173 {
00174 ID3_Frame* frame = NULL;
00175 if (NULL != tag && NULL != text && strlen(text) > 0)
00176 {
00177 if (replace)
00178 {
00179 ID3_RemoveAlbums(tag);
00180 }
00181 if (replace || tag->Find(ID3FID_ALBUM) == NULL)
00182 {
00183 frame = new ID3_Frame(ID3FID_ALBUM);
00184 if (frame)
00185 {
00186 frame->GetField(ID3FN_TEXT)->Set(text);
00187 tag->AttachFrame(frame);
00188 }
00189 }
00190 }
00191
00192 return frame;
00193 }
00194
00195 size_t ID3_RemoveAlbums(ID3_Tag *tag)
00196 {
00197 size_t num_removed = 0;
00198 ID3_Frame *frame = NULL;
00199
00200 if (NULL == tag)
00201 {
00202 return num_removed;
00203 }
00204
00205 while ((frame = tag->Find(ID3FID_ALBUM)))
00206 {
00207 frame = tag->RemoveFrame(frame);
00208 delete frame;
00209 num_removed++;
00210 }
00211
00212 return num_removed;
00213 }
00214
00215 char *ID3_GetTitle(const ID3_Tag *tag)
00216 {
00217 char *sTitle = NULL;
00218 if (NULL == tag)
00219 {
00220 return sTitle;
00221 }
00222
00223 ID3_Frame *frame = tag->Find(ID3FID_TITLE);
00224 if (frame != NULL)
00225 {
00226 sTitle = ID3_GetString(frame, ID3FN_TEXT);
00227 }
00228 return sTitle;
00229 }
00230
00231 ID3_Frame* ID3_AddTitle(ID3_Tag *tag, const char *text, bool replace)
00232 {
00233 ID3_Frame* frame = NULL;
00234 if (NULL != tag && NULL != text && strlen(text) > 0)
00235 {
00236 if (replace)
00237 {
00238 ID3_RemoveTitles(tag);
00239 }
00240 if (replace || tag->Find(ID3FID_TITLE) == NULL)
00241 {
00242 frame = new ID3_Frame(ID3FID_TITLE);
00243 if (frame)
00244 {
00245 frame->GetField(ID3FN_TEXT)->Set(text);
00246 tag->AttachFrame(frame);
00247 }
00248 }
00249 }
00250
00251 return frame;
00252 }
00253
00254 size_t ID3_RemoveTitles(ID3_Tag *tag)
00255 {
00256 size_t num_removed = 0;
00257 ID3_Frame *frame = NULL;
00258
00259 if (NULL == tag)
00260 {
00261 return num_removed;
00262 }
00263
00264 while ((frame = tag->Find(ID3FID_TITLE)))
00265 {
00266 frame = tag->RemoveFrame(frame);
00267 delete frame;
00268 num_removed++;
00269 }
00270
00271 return num_removed;
00272 }
00273
00274 char *ID3_GetYear(const ID3_Tag *tag)
00275 {
00276 char *sYear = NULL;
00277 if (NULL == tag)
00278 {
00279 return sYear;
00280 }
00281
00282 ID3_Frame *frame = tag->Find(ID3FID_YEAR);
00283 if (frame != NULL)
00284 {
00285 sYear = ID3_GetString(frame, ID3FN_TEXT);
00286 }
00287 return sYear;
00288 }
00289
00290 ID3_Frame* ID3_AddYear(ID3_Tag *tag, const char *text, bool replace)
00291 {
00292 ID3_Frame* frame = NULL;
00293 if (NULL != tag && NULL != text && strlen(text) > 0)
00294 {
00295 if (replace)
00296 {
00297 ID3_RemoveYears(tag);
00298 }
00299 if (replace || tag->Find(ID3FID_YEAR) == NULL)
00300 {
00301 frame = new ID3_Frame(ID3FID_YEAR);
00302 if (NULL != frame)
00303 {
00304 frame->GetField(ID3FN_TEXT)->Set(text);
00305 tag->AttachFrame(frame);
00306 }
00307 }
00308 }
00309
00310 return frame;
00311 }
00312
00313 size_t ID3_RemoveYears(ID3_Tag *tag)
00314 {
00315 size_t num_removed = 0;
00316 ID3_Frame *frame = NULL;
00317
00318 if (NULL == tag)
00319 {
00320 return num_removed;
00321 }
00322
00323 while ((frame = tag->Find(ID3FID_YEAR)))
00324 {
00325 frame = tag->RemoveFrame(frame);
00326 delete frame;
00327 num_removed++;
00328 }
00329
00330 return num_removed;
00331 }
00332
00333 char *ID3_GetComment(const ID3_Tag *tag, const char* desc)
00334 {
00335 char *comment = NULL;
00336 if (NULL == tag)
00337 {
00338 return comment;
00339 }
00340
00341 ID3_Frame* frame = NULL;
00342 if (desc)
00343 {
00344 frame = tag->Find(ID3FID_COMMENT, ID3FN_DESCRIPTION, desc);
00345 }
00346 else
00347 {
00348 frame = tag->Find(ID3FID_COMMENT);
00349 if(frame == tag->Find(ID3FID_COMMENT, ID3FN_DESCRIPTION, STR_V1_COMMENT_DESC))
00350 frame = tag->Find(ID3FID_COMMENT);
00351 }
00352
00353 if (frame)
00354 comment = ID3_GetString(frame, ID3FN_TEXT);
00355 return comment;
00356 }
00357
00358 ID3_Frame* ID3_AddComment(ID3_Tag *tag, const char *text, bool replace)
00359 {
00360 return ID3_AddComment(tag, text, "", replace);
00361 }
00362
00363 ID3_Frame* ID3_AddComment(ID3_Tag *tag, const char *text,
00364 const char *desc, bool replace)
00365 {
00366 return ID3_AddComment(tag, text, desc, "XXX", replace);
00367 }
00368
00369 ID3_Frame* ID3_AddComment(ID3_Tag *tag, const char *text,
00370 const char *desc, const char* lang, bool replace)
00371 {
00372 ID3_Frame* frame = NULL;
00373 if (NULL != tag &&
00374 NULL != text &&
00375 NULL != desc &&
00376 strlen(text) > 0)
00377 {
00378 bool bAdd = true;
00379 if (replace)
00380 {
00381 ID3_RemoveComments(tag, desc);
00382 }
00383 else
00384 {
00385
00386 ID3_Tag::Iterator* iter = tag->CreateIterator();
00387 ID3_Frame* frame = NULL;
00388 while ((frame = iter->GetNext()) != NULL)
00389 {
00390 if (frame->GetID() == ID3FID_COMMENT)
00391 {
00392 char *tmp_desc = ID3_GetString(frame, ID3FN_DESCRIPTION);
00393 if (strcmp(tmp_desc, desc) == 0)
00394 {
00395 bAdd = false;
00396 }
00397 delete [] tmp_desc;
00398 if (!bAdd)
00399 {
00400 break;
00401 }
00402 }
00403 }
00404 delete iter;
00405 }
00406 if (bAdd)
00407 {
00408 frame = new ID3_Frame(ID3FID_COMMENT);
00409 if (NULL != frame)
00410 {
00411 frame->GetField(ID3FN_LANGUAGE)->Set(lang);
00412 frame->GetField(ID3FN_DESCRIPTION)->Set(desc);
00413 frame->GetField(ID3FN_TEXT)->Set(text);
00414 tag->AttachFrame(frame);
00415 }
00416 }
00417 }
00418 return frame;
00419 }
00420
00421
00422
00423 size_t ID3_RemoveComments(ID3_Tag *tag, const char *desc)
00424 {
00425 size_t num_removed = 0;
00426
00427 if (NULL == tag)
00428 {
00429 return num_removed;
00430 }
00431
00432 ID3_Tag::Iterator* iter = tag->CreateIterator();
00433 ID3_Frame* frame = NULL;
00434 while ((frame = iter->GetNext()) != NULL)
00435 {
00436 if (frame->GetID() == ID3FID_COMMENT)
00437 {
00438 bool remove = false;
00439
00440 if (NULL == desc)
00441 {
00442 remove = true;
00443 }
00444 else
00445 {
00446
00447
00448 char *tmp_desc = ID3_GetString(frame, ID3FN_DESCRIPTION);
00449 remove = (strcmp(tmp_desc, desc) == 0);
00450 delete [] tmp_desc;
00451 }
00452 if (remove)
00453 {
00454 frame = tag->RemoveFrame(frame);
00455 delete frame;
00456 num_removed++;
00457 }
00458 }
00459 }
00460 delete iter;
00461
00462 return num_removed;
00463 }
00464
00465 char *ID3_GetTrack(const ID3_Tag *tag)
00466 {
00467 char *sTrack = NULL;
00468 if (NULL == tag)
00469 {
00470 return sTrack;
00471 }
00472
00473 ID3_Frame *frame = tag->Find(ID3FID_TRACKNUM);
00474 if (frame != NULL)
00475 {
00476 sTrack = ID3_GetString(frame, ID3FN_TEXT);
00477 }
00478 return sTrack;
00479 }
00480
00481 size_t ID3_GetTrackNum(const ID3_Tag *tag)
00482 {
00483 char *sTrack = ID3_GetTrack(tag);
00484 size_t nTrack = 0;
00485 if (NULL != sTrack)
00486 {
00487 nTrack = atoi(sTrack);
00488 delete [] sTrack;
00489 }
00490 return nTrack;
00491 }
00492
00493 ID3_Frame* ID3_AddTrack(ID3_Tag *tag, uchar trk, uchar ttl, bool replace)
00494 {
00495 ID3_Frame* frame = NULL;
00496 if (NULL != tag && trk > 0)
00497 {
00498 if (replace)
00499 {
00500 ID3_RemoveTracks(tag);
00501 }
00502 if (replace || NULL == tag->Find(ID3FID_TRACKNUM))
00503 {
00504 frame = new ID3_Frame(ID3FID_TRACKNUM);
00505 if (frame)
00506 {
00507 char *sTrack = NULL;
00508 if (0 == ttl)
00509 {
00510 sTrack = new char[4];
00511 sprintf(sTrack, "%lu", (luint) trk);
00512 }
00513 else
00514 {
00515 sTrack = new char[8];
00516 sprintf(sTrack, "%lu/%lu", (luint) trk, (luint) ttl);
00517 }
00518
00519 frame->GetField(ID3FN_TEXT)->Set(sTrack);
00520 tag->AttachFrame(frame);
00521
00522 delete [] sTrack;
00523 }
00524 }
00525 }
00526
00527 return frame;
00528 }
00529
00530
00531 int ID3_GetPictureData(const ID3_Tag *tag, const char *TempPicPath)
00532 {
00533 if (NULL == tag)
00534 return 0;
00535 else
00536 {
00537 ID3_Frame* frame = NULL;
00538 frame = tag->Find(ID3FID_PICTURE);
00539 if (frame != NULL)
00540 {
00541 ID3_Field* myField = frame->GetField(ID3FN_DATA);
00542 if (myField != NULL)
00543 {
00544 myField->ToFile(TempPicPath);
00545 return (int)myField->Size();
00546 }
00547 else return 0;
00548 }
00549 else return 0;
00550 }
00551 }
00552
00553
00554 char* ID3_GetPictureMimeType(const ID3_Tag *tag)
00555 {
00556 char* sPicMimetype = NULL;
00557 if (NULL == tag)
00558 return sPicMimetype;
00559
00560 ID3_Frame* frame = NULL;
00561 frame = tag->Find(ID3FID_PICTURE);
00562 if (frame != NULL)
00563 {
00564 sPicMimetype = ID3_GetString(frame, ID3FN_MIMETYPE);
00565 }
00566 return sPicMimetype;
00567 }
00568
00569
00570 bool ID3_HasPicture(const ID3_Tag* tag)
00571 {
00572 if (NULL == tag)
00573 return false;
00574 else
00575 {
00576 ID3_Frame* frame = tag->Find(ID3FID_PICTURE);
00577 if (frame != NULL)
00578 {
00579 ID3_Field* myField = frame->GetField(ID3FN_DATA);
00580 if (myField != NULL)
00581 return true;
00582 else
00583 return false;
00584 }
00585 else return false;
00586 }
00587 }
00588
00589
00590 ID3_Frame* ID3_AddPicture(ID3_Tag* tag, const char* TempPicPath, const char* MimeType, bool replace)
00591 {
00592 ID3_Frame* frame = NULL;
00593 if (NULL != tag )
00594 {
00595 if (replace)
00596 ID3_RemovePictures(tag);
00597 if (replace || NULL == tag->Find(ID3FID_PICTURE))
00598 {
00599 frame = new ID3_Frame(ID3FID_PICTURE);
00600 if (NULL != frame)
00601 {
00602 frame->GetField(ID3FN_DATA)->FromFile(TempPicPath);
00603 frame->GetField(ID3FN_MIMETYPE)->Set(MimeType);
00604 tag->AttachFrame(frame);
00605 }
00606 }
00607 }
00608 return frame;
00609 }
00610
00611
00612 size_t ID3_RemovePictures(ID3_Tag* tag)
00613 {
00614 size_t num_removed = 0;
00615 ID3_Frame* frame = NULL;
00616
00617 if (NULL == tag)
00618 return num_removed;
00619
00620 while ((frame = tag->Find(ID3FID_PICTURE)))
00621 {
00622 frame = tag->RemoveFrame(frame);
00623 delete frame;
00624 num_removed++;
00625 }
00626 return num_removed;
00627 }
00628
00629
00630 size_t ID3_RemovePictureType(ID3_Tag* tag, ID3_PictureType pictype)
00631 {
00632 size_t bremoved = 0;
00633 ID3_Frame* frame = NULL;
00634
00635 if (NULL == tag)
00636 return bremoved;
00637
00638 ID3_Tag::Iterator* iter = tag->CreateIterator();
00639
00640 while (NULL != (frame = iter->GetNext()))
00641 {
00642 if (frame->GetID() == ID3FID_PICTURE)
00643 {
00644 if (frame->GetField(ID3FN_PICTURETYPE)->Get() == (uint32)pictype)
00645 break;
00646 }
00647 }
00648 delete iter;
00649
00650 if (NULL != frame)
00651 {
00652 frame = tag->RemoveFrame(frame);
00653 delete frame;
00654 bremoved = 1;
00655 }
00656 return bremoved;
00657 }
00658
00659
00660 ID3_Frame* ID3_AddPicture(ID3_Tag *tag, const char *TempPicPath, const char *MimeType, ID3_PictureType pictype, const char* Description, bool replace)
00661 {
00662 ID3_Frame* frame = NULL;
00663 if (NULL != tag )
00664 {
00665 if (replace)
00666 ID3_RemovePictureType(tag, pictype);
00667 if (replace || NULL == tag->Find(ID3FID_PICTURE))
00668 {
00669 frame = new ID3_Frame(ID3FID_PICTURE);
00670 if (NULL != frame)
00671 {
00672 frame->GetField(ID3FN_DATA)->FromFile(TempPicPath);
00673 frame->GetField(ID3FN_MIMETYPE)->Set(MimeType);
00674 frame->GetField(ID3FN_PICTURETYPE)->Set((uint32)pictype);
00675 frame->GetField(ID3FN_DESCRIPTION)->Set(Description);
00676 tag->AttachFrame(frame);
00677 }
00678 }
00679 }
00680 return frame;
00681 }
00682
00683
00684 size_t ID3_GetPictureDataOfPicType(ID3_Tag* tag, const char* TempPicPath, ID3_PictureType pictype)
00685 {
00686 if (NULL == tag)
00687 return 0;
00688 else
00689 {
00690 ID3_Frame* frame = NULL;
00691 ID3_Tag::Iterator* iter = tag->CreateIterator();
00692
00693 while (NULL != (frame = iter->GetNext() ))
00694 {
00695 if(frame->GetID() == ID3FID_PICTURE)
00696 {
00697 if(frame->GetField(ID3FN_PICTURETYPE)->Get() == (uint32)pictype)
00698 break;
00699 }
00700 }
00701 delete iter;
00702
00703 if (frame != NULL)
00704 {
00705 ID3_Field* myField = frame->GetField(ID3FN_DATA);
00706 if (myField != NULL)
00707 {
00708 myField->ToFile(TempPicPath);
00709 return (size_t)myField->Size();
00710 }
00711 else return 0;
00712 }
00713 else return 0;
00714 }
00715 }
00716
00717
00718 char* ID3_GetMimeTypeOfPicType(ID3_Tag* tag, ID3_PictureType pictype)
00719 {
00720 char* sPicMimetype = NULL;
00721 if (NULL == tag)
00722 return sPicMimetype;
00723
00724 ID3_Frame* frame = NULL;
00725 ID3_Tag::Iterator* iter = tag->CreateIterator();
00726
00727 while (NULL != (frame = iter->GetNext()))
00728 {
00729 if(frame->GetID() == ID3FID_PICTURE)
00730 {
00731 if(frame->GetField(ID3FN_PICTURETYPE)->Get() == (uint32)pictype)
00732 break;
00733 }
00734 }
00735 delete iter;
00736
00737 if (frame != NULL)
00738 {
00739 sPicMimetype = ID3_GetString(frame, ID3FN_MIMETYPE);
00740 }
00741 return sPicMimetype;
00742 }
00743
00744
00745 char* ID3_GetDescriptionOfPicType(ID3_Tag* tag, ID3_PictureType pictype)
00746 {
00747 char* sPicDescription = NULL;
00748 if (NULL == tag)
00749 return sPicDescription;
00750
00751 ID3_Frame* frame = NULL;
00752 ID3_Tag::Iterator* iter = tag->CreateIterator();
00753
00754 while (NULL != (frame = iter->GetNext()))
00755 {
00756 if(frame->GetID() == ID3FID_PICTURE)
00757 {
00758 if(frame->GetField(ID3FN_PICTURETYPE)->Get() == (uint32)pictype)
00759 break;
00760 }
00761 }
00762 delete iter;
00763
00764 if (frame != NULL)
00765 {
00766 sPicDescription = ID3_GetString(frame, ID3FN_DESCRIPTION);
00767 }
00768 return sPicDescription;
00769 }
00770
00771
00772 size_t ID3_RemoveTracks(ID3_Tag* tag)
00773 {
00774 size_t num_removed = 0;
00775 ID3_Frame* frame = NULL;
00776
00777 if (NULL == tag)
00778 {
00779 return num_removed;
00780 }
00781
00782 while ((frame = tag->Find(ID3FID_TRACKNUM)))
00783 {
00784 frame = tag->RemoveFrame(frame);
00785 delete frame;
00786 num_removed++;
00787 }
00788
00789 return num_removed;
00790 }
00791
00792 char *ID3_GetGenre(const ID3_Tag *tag)
00793 {
00794 char *sGenre = NULL;
00795 if (NULL == tag)
00796 {
00797 return sGenre;
00798 }
00799
00800 ID3_Frame *frame = tag->Find(ID3FID_CONTENTTYPE);
00801 if (frame != NULL)
00802 {
00803 sGenre = ID3_GetString(frame, ID3FN_TEXT);
00804 }
00805
00806 return sGenre;
00807 }
00808
00809 size_t ID3_GetGenreNum(const ID3_Tag *tag)
00810 {
00811 char *sGenre = ID3_GetGenre(tag);
00812 size_t ulGenre = 0xFF;
00813 if (NULL == sGenre)
00814 {
00815 return ulGenre;
00816 }
00817
00818
00819
00820 if (sGenre[0] == '(')
00821 {
00822 char *pCur = &sGenre[1];
00823 while (isdigit(*pCur))
00824 {
00825 pCur++;
00826 }
00827 if (*pCur == ')')
00828 {
00829
00830 ulGenre = dami::min(0xFF, atoi(&sGenre[1]));
00831 }
00832 }
00833
00834 delete [] sGenre;
00835 return ulGenre;
00836 }
00837
00838
00839 ID3_Frame* ID3_AddGenre(ID3_Tag* tag, const char* genre, bool replace)
00840 {
00841 ID3_Frame* frame = NULL;
00842 if (NULL != tag && NULL != genre && strlen(genre) > 0)
00843 {
00844 if (replace)
00845 {
00846 ID3_RemoveGenres(tag);
00847 }
00848 if (replace || NULL == tag->Find(ID3FID_CONTENTTYPE))
00849 {
00850 frame = new ID3_Frame(ID3FID_CONTENTTYPE);
00851 if (NULL != frame)
00852 {
00853 frame->GetField(ID3FN_TEXT)->Set(genre);
00854 tag->AttachFrame(frame);
00855 }
00856 }
00857 }
00858
00859 return frame;
00860 }
00861
00862 ID3_Frame* ID3_AddGenre(ID3_Tag *tag, size_t genreNum, bool replace)
00863 {
00864 if(0xFF != genreNum)
00865 {
00866 char sGenre[6];
00867 sprintf(sGenre, "(%lu)", (luint) genreNum);
00868 return(ID3_AddGenre(tag, sGenre, replace));
00869 }
00870 else
00871 {
00872 return(NULL);
00873 }
00874 }
00875
00876 size_t ID3_RemoveGenres(ID3_Tag *tag)
00877 {
00878 size_t num_removed = 0;
00879 ID3_Frame *frame = NULL;
00880
00881 if (NULL == tag)
00882 {
00883 return num_removed;
00884 }
00885
00886 while ((frame = tag->Find(ID3FID_CONTENTTYPE)))
00887 {
00888 frame = tag->RemoveFrame(frame);
00889 delete frame;
00890 num_removed++;
00891 }
00892
00893 return num_removed;
00894 }
00895
00896 char *ID3_GetLyrics(const ID3_Tag *tag)
00897 {
00898 char *sLyrics = NULL;
00899 if (NULL == tag)
00900 {
00901 return sLyrics;
00902 }
00903
00904 ID3_Frame *frame = tag->Find(ID3FID_UNSYNCEDLYRICS);
00905 if (frame != NULL)
00906 {
00907 sLyrics = ID3_GetString(frame, ID3FN_TEXT);
00908 }
00909 return sLyrics;
00910 }
00911
00912 ID3_Frame* ID3_AddLyrics(ID3_Tag *tag, const char *text, bool replace)
00913 {
00914 return ID3_AddLyrics(tag, text, "", replace);
00915 }
00916
00917 ID3_Frame* ID3_AddLyrics(ID3_Tag *tag, const char *text, const char* desc,
00918 bool replace)
00919 {
00920 return ID3_AddLyrics(tag, text, desc, "XXX", replace);
00921 }
00922
00923 ID3_Frame* ID3_AddLyrics(ID3_Tag *tag, const char *text, const char* desc,
00924 const char* lang, bool replace)
00925 {
00926 ID3_Frame* frame = NULL;
00927 if (NULL != tag && strlen(text) > 0)
00928 {
00929 if (replace)
00930 {
00931 ID3_RemoveLyrics(tag);
00932 }
00933 if (replace || tag->Find(ID3FID_UNSYNCEDLYRICS) == NULL)
00934 {
00935 frame = new ID3_Frame(ID3FID_UNSYNCEDLYRICS);
00936 if (NULL != frame)
00937 {
00938 frame->GetField(ID3FN_LANGUAGE)->Set(lang);
00939 frame->GetField(ID3FN_DESCRIPTION)->Set(desc);
00940 frame->GetField(ID3FN_TEXT)->Set(text);
00941 tag->AttachFrame(frame);
00942 }
00943 }
00944 }
00945
00946 return frame;
00947 }
00948
00949 size_t ID3_RemoveLyrics(ID3_Tag *tag)
00950 {
00951 size_t num_removed = 0;
00952 ID3_Frame *frame = NULL;
00953
00954 if (NULL == tag)
00955 {
00956 return num_removed;
00957 }
00958
00959 while ((frame = tag->Find(ID3FID_UNSYNCEDLYRICS)))
00960 {
00961 frame = tag->RemoveFrame(frame);
00962 delete frame;
00963 num_removed++;
00964 }
00965
00966 return num_removed;
00967 }
00968
00969 char *ID3_GetLyricist(const ID3_Tag *tag)
00970 {
00971 char *sLyricist = NULL;
00972 if (NULL == tag)
00973 {
00974 return sLyricist;
00975 }
00976
00977 ID3_Frame *frame = tag->Find(ID3FID_LYRICIST);
00978 if (frame != NULL)
00979 {
00980 sLyricist = ID3_GetString(frame, ID3FN_TEXT);
00981 }
00982 return sLyricist;
00983 }
00984
00985 ID3_Frame* ID3_AddLyricist(ID3_Tag *tag, const char *text, bool replace)
00986 {
00987 ID3_Frame* frame = NULL;
00988 if (NULL != tag && NULL != text && strlen(text) > 0)
00989 {
00990 if (replace)
00991 {
00992 ID3_RemoveLyricist(tag);
00993 }
00994 if (replace || (tag->Find(ID3FID_LYRICIST) == NULL))
00995 {
00996 frame = new ID3_Frame(ID3FID_LYRICIST);
00997 if (frame)
00998 {
00999 frame->GetField(ID3FN_TEXT)->Set(text);
01000 tag->AttachFrame(frame);
01001 }
01002 }
01003 }
01004
01005 return frame;
01006 }
01007
01008 size_t ID3_RemoveLyricist(ID3_Tag *tag)
01009 {
01010 size_t num_removed = 0;
01011 ID3_Frame *frame = NULL;
01012
01013 if (NULL == tag)
01014 {
01015 return num_removed;
01016 }
01017
01018 while ((frame = tag->Find(ID3FID_LYRICIST)))
01019 {
01020 frame = tag->RemoveFrame(frame);
01021 delete frame;
01022 num_removed++;
01023 }
01024
01025 return num_removed;
01026 }
01027
01028 ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
01029 ID3_TimeStampFormat format, bool replace)
01030 {
01031 return ID3_AddSyncLyrics(tag, data, datasize, format, "", replace);
01032 }
01033
01034 ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
01035 ID3_TimeStampFormat format, const char *desc,
01036 bool replace)
01037 {
01038 return ID3_AddSyncLyrics(tag, data, datasize, format, desc, "XXX", replace);
01039 }
01040
01041 ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
01042 ID3_TimeStampFormat format, const char *desc,
01043 const char *lang, bool replace)
01044 {
01045 return ID3_AddSyncLyrics(tag, data, datasize, format, desc, lang,
01046 ID3CT_LYRICS, replace);
01047 }
01048
01049 ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
01050 ID3_TimeStampFormat format, const char *desc,
01051 const char *lang, ID3_ContentType type,
01052 bool replace)
01053 {
01054 ID3_Frame* frame = NULL;
01055
01056 if ((NULL == lang) || (NULL == desc))
01057 {
01058 return NULL;
01059 }
01060
01061
01062 ID3_Frame* frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang);
01063 if (!frmExist)
01064 {
01065 frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc);
01066 }
01067
01068 if (NULL != tag && NULL != data)
01069 {
01070 if (replace && frmExist)
01071 {
01072 frmExist = tag->RemoveFrame (frmExist);
01073 delete frmExist;
01074 frmExist = NULL;
01075 }
01076
01077
01078 if (frmExist)
01079 {
01080 return NULL;
01081 }
01082
01083 ID3_Frame* frame = new ID3_Frame(ID3FID_SYNCEDLYRICS);
01084
01085 frame->GetField(ID3FN_LANGUAGE)->Set(lang);
01086 frame->GetField(ID3FN_DESCRIPTION)->Set(desc);
01087 frame->GetField(ID3FN_TIMESTAMPFORMAT)->Set(format);
01088 frame->GetField(ID3FN_CONTENTTYPE)->Set(type);
01089 frame->GetField(ID3FN_DATA)->Set(data, datasize);
01090 tag->AttachFrame(frame);
01091 }
01092
01093 return frame;
01094 }
01095
01096 ID3_Frame *ID3_GetSyncLyricsInfo(const ID3_Tag *tag, const char *desc,
01097 const char *lang,
01098 ID3_TimeStampFormat& format,
01099 ID3_ContentType& type, size_t& size)
01100 {
01101
01102 ID3_Frame* frmExist = NULL;
01103 if (NULL != lang)
01104 {
01105
01106 frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang);
01107 }
01108 else if (NULL != desc)
01109 {
01110
01111 frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc);
01112 }
01113 else
01114 {
01115
01116 frmExist = tag->Find(ID3FID_SYNCEDLYRICS);
01117 }
01118
01119 if (!frmExist)
01120 {
01121 return NULL;
01122 }
01123
01124
01125 format = static_cast<ID3_TimeStampFormat>(frmExist->GetField(ID3FN_TIMESTAMPFORMAT)->Get ());
01126
01127
01128 type = static_cast<ID3_ContentType>(frmExist->GetField(ID3FN_CONTENTTYPE)->Get ());
01129
01130
01131 size = frmExist->GetField (ID3FN_DATA)->Size ();
01132
01133
01134 return frmExist;
01135 }
01136
01137 ID3_Frame *ID3_GetSyncLyrics(const ID3_Tag* tag, const char* lang,
01138 const char* desc, const uchar* &pData, size_t& size)
01139 {
01140
01141 ID3_Frame* frmExist = NULL;
01142 if (NULL != lang)
01143 {
01144
01145 frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang);
01146 }
01147 else if (NULL != desc)
01148 {
01149
01150 frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc);
01151 }
01152 else
01153 {
01154
01155 frmExist = tag->Find(ID3FID_SYNCEDLYRICS);
01156 }
01157
01158 if (NULL == frmExist)
01159 {
01160 return NULL;
01161 }
01162
01163
01164 size = dami::min(size, frmExist->GetField(ID3FN_DATA)->Size());
01165
01166
01167 pData = frmExist->GetField (ID3FN_DATA)->GetRawBinary();
01168
01169
01170 return frmExist;
01171 }
01172