id3v2-0.1.12/0000755000175000017500000000000011353241504012024 5ustar nagilonagiloid3v2-0.1.12/list.o0000644000175000017500000004614011353241451013165 0ustar nagilonagiloELF+4(UE3Ud‹E9uUhE9EuUVS EtUhU`D$> $t$$D$ $\$$D$$E;Ev [^]U(E&E$D$ED$$E E;EuUSƅ[E $`Džd ``$҉\[tJD$N $UT$$D$b $D$$ƅ[\ \$hhu Džhd \$D$$D$e $hT$$D$h $\$ll](  D$\$ppD$$D$$p p$ DžTD$\$xTD$D$l x$T=u"xtx$TT$tTtD$$D$e $\$$D$q $D$$x x$ D$\$|D$\$ED$s $UT$$D$h $|T$$D$$|t|$}= E$F D$\$ED$ \$ED$u $UT$$D$w $UT$$D$$}t E$}E$D$\$ED$\$ED$ \$ED$s $UT$$D${ $UT$$D$w $UT$$D$$}t E$}t E$}E$D$\$EED$$D$$}IE$ID$\$ED$\$ED$s $UT$$D$h $UT$$D$$}t E$}E$D$\$ $҉EEdED$D$\$EED$$}t E$E;EsD$~ $EE;EuD$$D$ \$ED$\$ED$ \$ED$ \$$҉ED$\$$҉ED$s $UT$$D${ $UT$$D$~ $UT$$D$w $UT$$D$~ $UT$$D$ $D$$}t E$}t E$}XE$RD$ \$ED$\$ED$ \$ED$\$$҉ED$s $UȉT$$D${ $ỦT$$D$w $UĉT$$D$~ $UЉT$$D$ $D$$}t Eĉ$}t Eȉ$}Ẻ$D$\$ED$\$$҉E؋EԉD$$D$~ $U؉T$$D$ $D$$}hEԉ$\D$\$$҉E܋E܉D$$D$$D$\$ED$\$$҉ED$\$$҉EED$$D$ $UT$$D$ $UT$$}PE$AD$\$ED$\$$҉ED$\$$҉ED$s $UT$$D$h $UT$$D$~ $UT$$D$ $kD$ $D$$ED$ $D$$ dE $;d[`$[t[]UVSD$,E$E}u2UT$D$.$$:D$D$E$uWED$ D$D$t$t(UT$D$@$$d E$D$D$Lt$D$P$UT$$D$b $D$$t!D$tD$$dEE9}E$\$D$ t]D$t?D$$Eu&ED$taD$$taD$$İ[^]UVS0EEEEED$$EE $E}u h}uEEE D$D$$EE T$$tEEtKEt@EE D$$D$$D$$Et;EE D$$D$$D$$Et;EE D$$D$$D$$EEӉƍ$ډ$$ۃEE;E70[^]U}u2} u)$D$D$$UD$$!',3;@FNU[_cgnsz  '-8=BGMXi{'0<AKSY`jtz +:DMTclsz)3=HSWcnw~ &+49JO`ens    #8 =PUin8=DIaf !"$ *+!6,;E-JO.Tn/t012357 8% 7 9< ` :h ; < = > ? ' @, [ A` n Cs } D E F G H  L 5 M< m Or P Q R S T  U 5 V: V W\ ~ X Y Z [ \  ] 3 8 KBluesClassic RockCountryDanceDiscoFunkGrungeHip-HopJazzMetalNew AgeOldiesOtherPopR&BRapReggaeRockTechnoIndustrialAlternativeSkaDeath MetalPranksSoundtrackEuro-TechnoAmbientTrip-HopVocalJazz+FunkFusionTranceClassicalInstrumentalAcidHouseGameSound ClipGospelNoiseAlternRockBassSoulPunkSpaceMeditativeInstrumental PopInstrumental RockEthnicGothicDarkwaveTechno-IndustrialElectronicPop-FolkEurodanceDreamSouthern RockComedyCultGangstaTop 40Christian RapPop/FunkJungleNative AmericanCabaretNew WavePsychadelicRaveShowtunesTrailerLo-FiTribalAcid PunkAcid JazzPolkaRetroMusicalRock & RollHard RockFolkFolk-RockNational FolkSwingFast FusionBebobLatinRevivalCelticBluegrassAvantgardeGothic RockProgressive RockPsychedelic RockSymphonic RockSlow RockBig BandChorusEasy ListeningAcousticHumourSpeechChansonOperaChamber MusicSonataSymphonyBooty BassPrimusPorn GrooveSatireSlow JamClubTangoSambaFolkloreBalladPower BalladRhythmic SoulFreestyleDuetPunk RockDrum SoloA capellaEuro-HouseDance HallGoaDrum & BassClub-HouseHardcoreTerrorIndieBritpopNegerpunkPolsk PunkBeatChristian Gangsta RapHeavy MetalBlack MetalCrossoverContemporary ChristianChristian Rock MerengueSalsaTrash MetalAnimeJPopSynthpopAENCAudio encryptionAPICAttached pictureCOMMCommentsCOMRCommercial frameENCREncryption method registrationEQUAEqualizationETCOEvent timing codesGEOBGeneral encapsulated objectGRIDGroup identification registrationIPLSInvolved people listLINKLinked informationMCDIMusic CD identifierMLLTMPEG location lookup tableOWNEOwnership framePRIVPrivate framePCNTPlay counterPOPMPopularimeterPOSSPosition synchronisation frameRBUFRecommended buffer sizeRVADRelative volume adjustmentRVRBReverbSYLTSynchronized lyric/textSYTCSynchronized tempo codesTALBAlbum/Movie/Show titleTBPMBPM (beats per minute)TCOMComposerTCONContent typeTCOPCopyright messageTDATDateTDLYPlaylist delayTENCEncoded byTEXTLyricist/Text writerTFLTFile typeTIMETimeTIT1Content group descriptionTIT2Title/songname/content descriptionTIT3Subtitle/Description refinementTKEYInitial keyTLANLanguage(s)TLENLengthTMEDMedia typeTOALOriginal album/movie/show titleTOFNOriginal filenameTOLYOriginal lyricist(s)/text writer(s)TOPEOriginal artist(s)/performer(s)TORYOriginal release yearTOWNFile owner/licenseeTPE1Lead performer(s)/Soloist(s)TPE2Band/orchestra/accompanimentTPE3Conductor/performer refinementTPE4Interpreted, remixed, or otherwise modified byTPOSPart of a setTPUBPublisherTRCKTrack number/Position in setTRDARecording datesTRSNInternet radio station nameTRSOInternet radio station ownerTSIZSizeTSRCISRC (international standard recording code)TSSESoftware/Hardware and settings used for encodingTXXXUser defined text informationTYERYearUFIDUnique file identifierUSERTerms of useUSLTUnsynchronized lyric/text transcriptionWCOMCommercial informationWCOPCopyright/Legal infromationWOAFOfficial audio file webpageWOAROfficial artist/performer webpageWOASOfficial audio source webpageWORSOfficial internet radio station homepageWPAYPaymentWPUBOfficial publisher webpageWXXXUser defined URL link Encrypted meta frame????Error --%3d: %s id3v2 tag info for : (): (%d))([]: )[, bytes, counter= rating= (unimplemented) frame  \ Y         \TTTTTTTT rfopen: %s: id3v2fread: %s: TAGid3v1 tag info for Title : %-30.30s Artist: %-30.30s UnknownAlbum : %-30.30s Year: %-4.4s, Genre: %s (%d) Comment: %-28.28s Track: %d Comment: %-30.30s : No ID3 tag: No ID3v1 tag: No ID3v2 tag6IGCC: (Debian 4.4.2-9) 4.4.3 20100108 (prerelease)zPR|  XAB <XAB N\FAB x@ AB TB$AB VzPLR|  $fAB b^@AB AB .symtab.strtab.shstrtab.rel.text.rel.data.bss.rel.rodata.gcc_except_table.rel.ctors.comment.note.GNU-stack.rel.eh_frame4 6 ) % ?` /8&4 I@)V0)R L ]04)3fg)zh),v LX *- 15 P7`G^@w    XX.izF@ 9P{)BIB$]cjryf(list.cpp_ZStL8__ioinit_ZL24ID3_v1_genre_description_ZL10frameTable_Z41__static_initialization_and_destruction_0ii_GLOBAL__I_frameTableCountframeTableCount_Z14GetDescription11ID3_FrameID__gxx_personality_v0_Z14PrintFrameHelpPc_ZSt4cout_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6__ZNSolsEPFRSoS_E_Z14PrintGenreListv_Z15GetGenreFromNumiprintf_Z13GetGenreCountv_Z16PrintInformationPcRK7ID3_Tag_ZNK7ID3_Tag14CreateIteratorEv_ZNK9ID3_Frame14GetDescriptionEv_ZNK9ID3_Frame9GetTextIDEv_ZNK9ID3_Frame5GetIDEv_Z13ID3_GetStringPK9ID3_Frame11ID3_FieldID_ZdaPvsscanf_Z15GetNumFromGenrePKc_ZNSolsEi_ZNK9ID3_Frame5FieldE11ID3_FieldID_Z13ID3_GetStringPK9ID3_Frame11ID3_FieldIDj_ZNSolsEj_ZNK9ID3_Frame8GetFieldE11ID3_FieldID_ZNK7ID3_Tag9NumFramesEv_ZdlPv_Z13PrintID3v1TagPcfopenstderrfprintfperrorfseekfreadfclosestrncmp_Unwind_Resume_Z7ListTagiPPci_ZN7ID3_TagC1EPKc_ZN7ID3_Tag4LinkEPKct_ZN7ID3_TagD1Ev_ZNSt8ios_base4InitC1Ev_ZNSt8ios_base4InitD1Ev__dso_handle__cxa_atexit8Cw"'0X(-5=OW_m !" !%3#Z$p%"! !+27FNVhpx""!!%->"S"n!!! %"6"K"f!w|"!! "*;"P"k&'"#!<!U!n&& (  " * 2 A (I Q Y a r " " " ! ! ! )  ! 0 8 @ O W _ n v ~  (     " " " ! &5 : B J Y (a i q y  " &  (   ! &4 &Q V ^ f u (}   ( " ! & &  % 4 (< D S [ c r (z            * +Q\-j.y/012./ 03+94IPUdlt|,1GL7,8HMU]em9+599v{:;<=  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHL`hltx (,48@DLPX\dhpt| $(04<@HLTX`dlpx|  $,08<DHPT\`hltx                     $(,048<@DHLPTX\`dhlptx|  $($@`| id3v2-0.1.12/frametable.h0000644000175000017500000001357411353241266014316 0ustar nagilonagilo/* id3v2 frame table * frametable.h - struct with info on all id3v2 frames * Copyright (C) 2000 Myers Carpenter (icepick@sourceforge.net) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #ifndef __FRAMETABLE_H__ #define __FRAMETABLE_H__ #include struct frameTbl { const char *frameName; enum ID3_FrameID frameID; const char *frameLongName; }; static struct frameTbl frameTable[] = { { "AENC", ID3FID_AUDIOCRYPTO, "Audio encryption" }, { "APIC", ID3FID_PICTURE, "Attached picture" }, { "COMM", ID3FID_COMMENT, "Comments" }, { "COMR", ID3FID_COMMERCIAL, "Commercial frame" }, { "ENCR", ID3FID_CRYPTOREG, "Encryption method registration" }, { "EQUA", ID3FID_EQUALIZATION, "Equalization" }, { "ETCO", ID3FID_EVENTTIMING, "Event timing codes" }, { "GEOB", ID3FID_GENERALOBJECT, "General encapsulated object" }, { "GRID", ID3FID_GROUPINGREG, "Group identification registration" }, { "IPLS", ID3FID_INVOLVEDPEOPLE, "Involved people list" }, { "LINK", ID3FID_LINKEDINFO, "Linked information" }, { "MCDI", ID3FID_CDID, "Music CD identifier" }, { "MLLT", ID3FID_MPEGLOOKUP, "MPEG location lookup table" }, { "OWNE", ID3FID_OWNERSHIP, "Ownership frame" }, { "PRIV", ID3FID_PRIVATE, "Private frame" }, { "PCNT", ID3FID_PLAYCOUNTER, "Play counter" }, { "POPM", ID3FID_POPULARIMETER, "Popularimeter" }, { "POSS", ID3FID_POSITIONSYNC, "Position synchronisation frame" }, { "RBUF", ID3FID_BUFFERSIZE, "Recommended buffer size" }, { "RVAD", ID3FID_VOLUMEADJ, "Relative volume adjustment" }, { "RVRB", ID3FID_REVERB, "Reverb" }, { "SYLT", ID3FID_SYNCEDLYRICS, "Synchronized lyric/text" }, { "SYTC", ID3FID_SYNCEDTEMPO, "Synchronized tempo codes" }, { "TALB", ID3FID_ALBUM, "Album/Movie/Show title" }, { "TBPM", ID3FID_BPM, "BPM (beats per minute)" }, { "TCOM", ID3FID_COMPOSER, "Composer" }, { "TCON", ID3FID_CONTENTTYPE, "Content type" }, { "TCOP", ID3FID_COPYRIGHT, "Copyright message" }, { "TDAT", ID3FID_DATE, "Date" }, { "TDLY", ID3FID_PLAYLISTDELAY, "Playlist delay" }, { "TENC", ID3FID_ENCODEDBY, "Encoded by" }, { "TEXT", ID3FID_LYRICIST, "Lyricist/Text writer" }, { "TFLT", ID3FID_FILETYPE, "File type" }, { "TIME", ID3FID_TIME, "Time" }, { "TIT1", ID3FID_CONTENTGROUP, "Content group description" }, { "TIT2", ID3FID_TITLE, "Title/songname/content description" }, { "TIT3", ID3FID_SUBTITLE, "Subtitle/Description refinement" }, { "TKEY", ID3FID_INITIALKEY, "Initial key" }, { "TLAN", ID3FID_LANGUAGE, "Language(s)" }, { "TLEN", ID3FID_SONGLEN, "Length" }, { "TMED", ID3FID_MEDIATYPE, "Media type" }, { "TOAL", ID3FID_ORIGALBUM, "Original album/movie/show title" }, { "TOFN", ID3FID_ORIGFILENAME, "Original filename" }, { "TOLY", ID3FID_ORIGLYRICIST, "Original lyricist(s)/text writer(s)" }, { "TOPE", ID3FID_ORIGARTIST, "Original artist(s)/performer(s)" }, { "TORY", ID3FID_ORIGYEAR, "Original release year" }, { "TOWN", ID3FID_FILEOWNER, "File owner/licensee" }, { "TPE1", ID3FID_LEADARTIST, "Lead performer(s)/Soloist(s)" }, { "TPE2", ID3FID_BAND, "Band/orchestra/accompaniment" }, { "TPE3", ID3FID_CONDUCTOR, "Conductor/performer refinement" }, { "TPE4", ID3FID_MIXARTIST, "Interpreted, remixed, or otherwise modified by" }, { "TPOS", ID3FID_PARTINSET, "Part of a set" }, { "TPUB", ID3FID_PUBLISHER, "Publisher" }, { "TRCK", ID3FID_TRACKNUM, "Track number/Position in set" }, { "TRDA", ID3FID_RECORDINGDATES, "Recording dates" }, { "TRSN", ID3FID_NETRADIOSTATION, "Internet radio station name" }, { "TRSO", ID3FID_NETRADIOOWNER, "Internet radio station owner" }, { "TSIZ", ID3FID_SIZE, "Size" }, { "TSRC", ID3FID_ISRC, "ISRC (international standard recording code)" }, { "TSSE", ID3FID_ENCODERSETTINGS, "Software/Hardware and settings used for encoding" }, { "TXXX", ID3FID_USERTEXT, "User defined text information" }, { "TYER", ID3FID_YEAR, "Year" }, { "UFID", ID3FID_UNIQUEFILEID, "Unique file identifier" }, { "USER", ID3FID_TERMSOFUSE, "Terms of use" }, { "USLT", ID3FID_UNSYNCEDLYRICS, "Unsynchronized lyric/text transcription" }, { "WCOM", ID3FID_WWWCOMMERCIALINFO, "Commercial information" }, { "WCOP", ID3FID_WWWCOPYRIGHT, "Copyright/Legal infromation" }, { "WOAF", ID3FID_WWWAUDIOFILE, "Official audio file webpage" }, { "WOAR", ID3FID_WWWARTIST, "Official artist/performer webpage" }, { "WOAS", ID3FID_WWWAUDIOSOURCE, "Official audio source webpage" }, { "WORS", ID3FID_WWWRADIOPAGE, "Official internet radio station homepage" }, { "WPAY", ID3FID_WWWPAYMENT, "Payment" }, { "WPUB", ID3FID_WWWPUBLISHER, "Official publisher webpage" }, { "WXXX", ID3FID_WWWUSER, "User defined URL link" }, { " ", ID3FID_METACRYPTO, "Encrypted meta frame" }, { "????", ID3FID_NOFRAME, "Error" } }; int frameTableCount = 75; #endif /* __FRAMETABLE_H__ */ id3v2-0.1.12/convert.cpp0000644000175000017500000001527311353241266014225 0ustar nagilonagilo #include #include #include #include ID3_FrameID GetFrameID(char * abr) { if (strlen(abr) != 4){ std::cerr << "Frame ID must have length 4" << std::endl; return ID3FID_NOFRAME; } if (strncmp("AENC",abr,4) == 0) return ID3FID_AUDIOCRYPTO; if (strncmp("APIC",abr,4) == 0) return ID3FID_PICTURE; if (strncmp("COMM",abr,4) == 0) return ID3FID_COMMENT; if (strncmp("COMR",abr,4) == 0) return ID3FID_COMMERCIAL; if (strncmp("ENCR",abr,4) == 0) return ID3FID_CRYPTOREG; if (strncmp("EQUA",abr,4) == 0) return ID3FID_EQUALIZATION; if (strncmp("ETCO",abr,4) == 0) return ID3FID_EVENTTIMING; if (strncmp("GEOB",abr,4) == 0) return ID3FID_GENERALOBJECT; if (strncmp("GRID",abr,4) == 0) return ID3FID_GROUPINGREG; if (strncmp("IPLS",abr,4) == 0) return ID3FID_INVOLVEDPEOPLE; if (strncmp("LINK",abr,4) == 0) return ID3FID_LINKEDINFO; if (strncmp("MCDI",abr,4) == 0) return ID3FID_CDID; if (strncmp("MLLT",abr,4) == 0) return ID3FID_MPEGLOOKUP; if (strncmp("OWNE",abr,4) == 0) return ID3FID_OWNERSHIP; if (strncmp("PRIV",abr,4) == 0) return ID3FID_PRIVATE; if (strncmp("PCNT",abr,4) == 0) return ID3FID_PLAYCOUNTER; if (strncmp("POPM",abr,4) == 0) return ID3FID_POPULARIMETER; if (strncmp("POSS",abr,4) == 0) return ID3FID_POSITIONSYNC; if (strncmp("RBUF",abr,4) == 0) return ID3FID_BUFFERSIZE; if (strncmp("RVAD",abr,4) == 0) return ID3FID_VOLUMEADJ; if (strncmp("RVRB",abr,4) == 0) return ID3FID_REVERB; if (strncmp("SYLT",abr,4) == 0) return ID3FID_SYNCEDLYRICS; if (strncmp("SYTC",abr,4) == 0) return ID3FID_SYNCEDTEMPO; if (strncmp("TALB",abr,4) == 0) return ID3FID_ALBUM; if (strncmp("TBPM",abr,4) == 0) return ID3FID_BPM; if (strncmp("TCOM",abr,4) == 0) return ID3FID_COMPOSER; if (strncmp("TCON",abr,4) == 0) return ID3FID_CONTENTTYPE; if (strncmp("TCOP",abr,4) == 0) return ID3FID_COPYRIGHT; if (strncmp("TDAT",abr,4) == 0) return ID3FID_DATE; if (strncmp("TDLY",abr,4) == 0) return ID3FID_PLAYLISTDELAY; if (strncmp("TENC",abr,4) == 0) return ID3FID_ENCODEDBY; if (strncmp("TEXT",abr,4) == 0) return ID3FID_LYRICIST; if (strncmp("TFLT",abr,4) == 0) return ID3FID_FILETYPE; if (strncmp("TIME",abr,4) == 0) return ID3FID_TIME; if (strncmp("TIT1",abr,4) == 0) return ID3FID_CONTENTGROUP; if (strncmp("TIT2",abr,4) == 0) return ID3FID_TITLE; if (strncmp("TIT3",abr,4) == 0) return ID3FID_SUBTITLE; if (strncmp("TKEY",abr,4) == 0) return ID3FID_INITIALKEY; if (strncmp("TLAN",abr,4) == 0) return ID3FID_LANGUAGE; if (strncmp("TLEN",abr,4) == 0) return ID3FID_SONGLEN; if (strncmp("TMED",abr,4) == 0) return ID3FID_MEDIATYPE; if (strncmp("TOAL",abr,4) == 0) return ID3FID_ORIGALBUM; if (strncmp("TOFN",abr,4) == 0) return ID3FID_ORIGFILENAME; if (strncmp("TOLY",abr,4) == 0) return ID3FID_ORIGLYRICIST; if (strncmp("TOPE",abr,4) == 0) return ID3FID_ORIGARTIST; if (strncmp("TORY",abr,4) == 0) return ID3FID_ORIGYEAR; if (strncmp("TOWN",abr,4) == 0) return ID3FID_FILEOWNER; if (strncmp("TPE1",abr,4) == 0) return ID3FID_LEADARTIST; if (strncmp("TPE2",abr,4) == 0) return ID3FID_BAND; if (strncmp("TPE3",abr,4) == 0) return ID3FID_CONDUCTOR; if (strncmp("TPE4",abr,4) == 0) return ID3FID_MIXARTIST; if (strncmp("TPOS",abr,4) == 0) return ID3FID_PARTINSET; if (strncmp("TPUB",abr,4) == 0) return ID3FID_PUBLISHER; if (strncmp("TRCK",abr,4) == 0) return ID3FID_TRACKNUM; if (strncmp("TRDA",abr,4) == 0) return ID3FID_RECORDINGDATES; if (strncmp("TRSN",abr,4) == 0) return ID3FID_NETRADIOSTATION; if (strncmp("TRSO",abr,4) == 0) return ID3FID_NETRADIOOWNER; if (strncmp("TSIZ",abr,4) == 0) return ID3FID_SIZE; if (strncmp("TSRC",abr,4) == 0) return ID3FID_ISRC; if (strncmp("TSSE",abr,4) == 0) return ID3FID_ENCODERSETTINGS; if (strncmp("TXXX",abr,4) == 0) return ID3FID_USERTEXT; if (strncmp("TYER",abr,4) == 0) return ID3FID_YEAR; if (strncmp("UFID",abr,4) == 0) return ID3FID_UNIQUEFILEID; if (strncmp("USER",abr,4) == 0) return ID3FID_TERMSOFUSE; if (strncmp("USLT",abr,4) == 0) return ID3FID_UNSYNCEDLYRICS; if (strncmp("WCOM",abr,4) == 0) return ID3FID_WWWCOMMERCIALINFO; if (strncmp("WCOP",abr,4) == 0) return ID3FID_WWWCOPYRIGHT; if (strncmp("WOAF",abr,4) == 0) return ID3FID_WWWAUDIOFILE; if (strncmp("WOAR",abr,4) == 0) return ID3FID_WWWARTIST; if (strncmp("WOAS",abr,4) == 0) return ID3FID_WWWAUDIOSOURCE; if (strncmp("WORS",abr,4) == 0) return ID3FID_WWWRADIOPAGE; if (strncmp("WPAY",abr,4) == 0) return ID3FID_WWWPAYMENT; if (strncmp("WPUB",abr,4) == 0) return ID3FID_WWWPUBLISHER; if (strncmp("WXXX",abr,4) == 0) return ID3FID_WWWUSER; std::cerr << "Frame ID " << abr << " not detected" << std::endl; return ID3FID_NOFRAME; } void DeleteTag(int argc, char *argv[], int optind, int whichTags) { FILE * fp; for (int nIndex = optind; nIndex < argc; nIndex++) { /* cludgy to check if we have the proper perms */ fp = fopen(argv[nIndex], "r+"); if (fp == NULL) { /* file didn't open */ fprintf(stderr, "fopen: %s: ", argv[nIndex]); perror("id3v2"); continue; } fclose(fp); ID3_Tag myTag; std::cout << "Stripping id3 tag in \""; std::cout << argv[nIndex] << "\"..."; myTag.Clear(); myTag.Link(argv[nIndex], ID3TT_ALL); luint nTags; switch(whichTags) { case 1: nTags = myTag.Strip(ID3TT_ID3V1); std::cout << "id3v1 "; break; case 2: nTags = myTag.Strip(ID3TT_ID3V2); std::cout << "id3v2 "; break; case 0: default: nTags = myTag.Strip(ID3TT_ID3); std::cout << "id3v1 and v2 "; } std::cout << "stripped." << std::endl; } return; } void ConvertTag(int argc, char *argv[], int optind) { for (int nIndex = optind; nIndex < argc; nIndex++) { ID3_Tag myTag; std::cout << "Converting id3v1 tag to id3v2 in "; std::cout << argv[nIndex] << "..."; myTag.Clear(); myTag.Link(argv[nIndex], ID3TT_ALL); luint nTags; nTags = myTag.Update(ID3TT_ID3V2); std::cout << " converted "; std::cout << std::endl; } return; } void DeleteFrame(int argc, char *argv[], int optind, char * frame) { for (int nIndex = optind; nIndex < argc; nIndex++) { ID3_Tag myTag; std::cout << "Deleting Frame " << frame << " in file "; std::cout << argv[nIndex] << " ..." << std::endl; myTag.Clear(); myTag.Link(argv[nIndex], ID3TT_ALL); ID3_FrameID fid = GetFrameID(frame); ID3_Frame * f = myTag.Find(fid); while (f != NULL){ ID3_Frame * todel = myTag.RemoveFrame(f); delete todel; f = myTag.Find(fid); } luint nTags; if (myTag.HasChanged()) nTags = myTag.Update(ID3TT_ID3V2); } return; } id3v2-0.1.12/build-stamp0000644000175000017500000000000011353241266014163 0ustar nagilonagiloid3v2-0.1.12/id3v2.cpp0000644000175000017500000006610011353241266013467 0ustar nagilonagilo#if defined HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #ifdef WIN32 #include #define snprintf _snprintf #endif #include #include #include "genre.h" #define MAXNOFRAMES 1000 #define TMPSIZE 255 /* Write both tags by default */ flags_t UpdFlags = ID3TT_ALL; void PrintUsage(char *sName) { std::cout << "Usage: " << sName << " [OPTION]... [FILE]..." << std::endl; std::cout << "Adds/Modifies/Removes/Views id3v2 tags, modifies/converts/lists id3v1 tags" << std::endl; std::cout << std::endl; std::cout << " -h, --help Display this help and exit" << std::endl; std::cout << " -f, --list-frames Display all possible frames for id3v2" << std::endl; std::cout << " -L, --list-genres Lists all id3v1 genres" << std::endl; std::cout << " -v, --version Display version information and exit" << std::endl; std::cout << " -l, --list Lists the tag(s) on the file(s)" << std::endl; std::cout << " -d, --delete-v2 Deletes id3v2 tags" << std::endl; std::cout << " -s, --delete-v1 Deletes id3v1 tags" << std::endl; std::cout << " -D, --delete-all Deletes both id3v1 and id3v2 tags" << std::endl; std::cout << " -C, --convert Converts id3v1 tag to id3v2" << std::endl; std::cout << " -1, --id3v1-only Writes only id3v1 tag" << std::endl; std::cout << " -2, --id3v2-only Writes only id3v2 tag" << std::endl; std::cout << " -r, --remove-frame \"FRAMEID\" Removes the specified id3v2 frame" << std::endl; std::cout << " -a, --artist \"ARTIST\" Set the artist information" << std::endl; std::cout << " -A, --album \"ALBUM\" Set the album title information" << std::endl; std::cout << " -t, --song \"SONG\" Set the song title information" << std::endl; std::cout << " -c, --comment \"DESCRIPTION\":\"COMMENT\":\"LANGUAGE\" "<< std::endl << " Set the comment information (both" << std::endl << " description and language optional)" << std::endl; std::cout << " -g, --genre num Set the genre number" << std::endl; std::cout << " -y, --year num Set the year" << std::endl; std::cout << " -T, --track num/num Set the track number/(optional) total tracks" << std::endl; std::cout << std::endl; std::cout << "You can set the value for any id3v2 frame by using '--' and then frame id" << std::endl; std::cout << "For example: " << std::endl; std::cout << " id3v2 --TIT3 \"Monkey!\" file.mp3" << std::endl; std::cout << "would set the \"Subtitle/Description\" frame to \"Monkey!\". " << std::endl; std::cout << std::endl; } void PrintVersion(char *sName) { std::cout << sName << " " << VERSION << std::endl; std::cout << "Uses " << ID3LIB_FULL_NAME << std::endl << std::endl; std::cout << "This program adds/modifies/removes/views id3v2 tags, " << std::endl << "and can convert from id3v1 tags" << std::endl; } extern void ListTag(int argc, char *argv[], int optind); extern void PrintFrameHelp(char *sName); extern void PrintGenreList(); extern void DeleteTag(int argc, char *argv[], int optind, int whichTags); extern void ConvertTag(int argc, char *argv[], int optind); extern void DeleteFrame(int argc, char *argv[], int optind, char * frame); #ifdef SORT_RUNTIME extern void InitGenres(); #endif // SORT_RUNTIME int main( int argc, char *argv[]) { int iOpt; int argCounter = 0; int ii; char tmp[TMPSIZE]; FILE * fp; struct frameInfo { enum ID3_FrameID id; char *data; } frameList[MAXNOFRAMES]; int frameCounter = 0; while (true) { int option_index = 0; int iLongOpt = 0; int optFrameID = ID3FID_NOFRAME; static struct option long_options[] = { // help and info { "help", no_argument, &iLongOpt, 'h' }, { "list-frames", no_argument, &iLongOpt, 'f' }, { "list-genres", no_argument, &iLongOpt, 'L' }, { "version", no_argument, &iLongOpt, 'v' }, // list / remove / convert { "list", no_argument, &iLongOpt, 'l' }, { "delete-v2", no_argument, &iLongOpt, 'd' }, { "delete-v1", no_argument, &iLongOpt, 's' }, { "delete-all", no_argument, &iLongOpt, 'D' }, { "convert", no_argument, &iLongOpt, 'C' }, { "id3v1-only", no_argument, &iLongOpt, '1' }, { "id3v2-only", no_argument, &iLongOpt, '2' }, { "remove-frame", required_argument, &iLongOpt, 'r' }, // infomation to tag { "artist", required_argument, &iLongOpt, 'a' }, { "album", required_argument, &iLongOpt, 'A' }, { "song", required_argument, &iLongOpt, 't' }, { "comment", required_argument, &iLongOpt, 'c' }, { "genre", required_argument, &iLongOpt, 'g' }, { "year", required_argument, &iLongOpt, 'y' }, { "track", required_argument, &iLongOpt, 'T' }, { "AENC", required_argument, &optFrameID, ID3FID_AUDIOCRYPTO }, { "APIC", required_argument, &optFrameID, ID3FID_PICTURE }, { "COMM", required_argument, &optFrameID, ID3FID_COMMENT }, /* COMR too complex */ { "ENCR", required_argument, &optFrameID, ID3FID_CRYPTOREG }, { "EQUA", required_argument, &optFrameID, ID3FID_EQUALIZATION }, { "ETCO", required_argument, &optFrameID, ID3FID_EVENTTIMING }, { "GEOB", required_argument, &optFrameID, ID3FID_GENERALOBJECT }, { "GRID", required_argument, &optFrameID, ID3FID_GROUPINGREG }, { "IPLS", required_argument, &optFrameID, ID3FID_INVOLVEDPEOPLE }, { "LINK", required_argument, &optFrameID, ID3FID_LINKEDINFO }, { "MCDI", required_argument, &optFrameID, ID3FID_CDID }, { "MLLT", required_argument, &optFrameID, ID3FID_MPEGLOOKUP }, { "OWNE", required_argument, &optFrameID, ID3FID_OWNERSHIP }, { "PRIV", required_argument, &optFrameID, ID3FID_PRIVATE }, { "PCNT", required_argument, &optFrameID, ID3FID_PLAYCOUNTER }, { "POPM", required_argument, &optFrameID, ID3FID_POPULARIMETER }, { "POSS", required_argument, &optFrameID, ID3FID_POSITIONSYNC }, { "RBUF", required_argument, &optFrameID, ID3FID_BUFFERSIZE }, { "RVAD", required_argument, &optFrameID, ID3FID_VOLUMEADJ }, { "RVRB", required_argument, &optFrameID, ID3FID_REVERB }, { "SYLT", required_argument, &optFrameID, ID3FID_SYNCEDLYRICS }, { "SYTC", required_argument, &optFrameID, ID3FID_SYNCEDTEMPO }, { "TALB", required_argument, &optFrameID, ID3FID_ALBUM }, { "TBPM", required_argument, &optFrameID, ID3FID_BPM }, { "TCOM", required_argument, &optFrameID, ID3FID_COMPOSER }, { "TCON", required_argument, &optFrameID, ID3FID_CONTENTTYPE }, { "TCOP", required_argument, &optFrameID, ID3FID_COPYRIGHT }, { "TDAT", required_argument, &optFrameID, ID3FID_DATE }, { "TDLY", required_argument, &optFrameID, ID3FID_PLAYLISTDELAY }, { "TENC", required_argument, &optFrameID, ID3FID_ENCODEDBY }, { "TEXT", required_argument, &optFrameID, ID3FID_LYRICIST }, { "TFLT", required_argument, &optFrameID, ID3FID_FILETYPE }, { "TIME", required_argument, &optFrameID, ID3FID_TIME }, { "TIT1", required_argument, &optFrameID, ID3FID_CONTENTGROUP }, { "TIT2", required_argument, &optFrameID, ID3FID_TITLE }, { "TIT3", required_argument, &optFrameID, ID3FID_SUBTITLE }, { "TKEY", required_argument, &optFrameID, ID3FID_INITIALKEY }, { "TLAN", required_argument, &optFrameID, ID3FID_LANGUAGE }, { "TLEN", required_argument, &optFrameID, ID3FID_SONGLEN }, { "TMED", required_argument, &optFrameID, ID3FID_MEDIATYPE }, { "TOAL", required_argument, &optFrameID, ID3FID_ORIGALBUM }, { "TOFN", required_argument, &optFrameID, ID3FID_ORIGFILENAME }, { "TOLY", required_argument, &optFrameID, ID3FID_ORIGLYRICIST }, { "TOPE", required_argument, &optFrameID, ID3FID_ORIGARTIST }, { "TORY", required_argument, &optFrameID, ID3FID_ORIGYEAR }, { "TOWN", required_argument, &optFrameID, ID3FID_FILEOWNER }, { "TPE1", required_argument, &optFrameID, ID3FID_LEADARTIST }, { "TPE2", required_argument, &optFrameID, ID3FID_BAND }, { "TPE3", required_argument, &optFrameID, ID3FID_CONDUCTOR }, { "TPE4", required_argument, &optFrameID, ID3FID_MIXARTIST }, { "TPOS", required_argument, &optFrameID, ID3FID_PARTINSET }, { "TPUB", required_argument, &optFrameID, ID3FID_PUBLISHER }, { "TRCK", required_argument, &optFrameID, ID3FID_TRACKNUM }, { "TRDA", required_argument, &optFrameID, ID3FID_RECORDINGDATES }, { "TRSN", required_argument, &optFrameID, ID3FID_NETRADIOSTATION }, { "TRSO", required_argument, &optFrameID, ID3FID_NETRADIOOWNER }, { "TSIZ", required_argument, &optFrameID, ID3FID_SIZE }, { "TSRC", required_argument, &optFrameID, ID3FID_ISRC }, { "TSSE", required_argument, &optFrameID, ID3FID_ENCODERSETTINGS }, { "TXXX", required_argument, &optFrameID, ID3FID_USERTEXT }, { "TYER", required_argument, &optFrameID, ID3FID_YEAR }, { "UFID", required_argument, &optFrameID, ID3FID_UNIQUEFILEID }, { "USER", required_argument, &optFrameID, ID3FID_TERMSOFUSE }, { "USLT", required_argument, &optFrameID, ID3FID_UNSYNCEDLYRICS }, { "WCOM", required_argument, &optFrameID, ID3FID_WWWCOMMERCIALINFO }, { "WCOP", required_argument, &optFrameID, ID3FID_WWWCOPYRIGHT }, { "WOAF", required_argument, &optFrameID, ID3FID_WWWAUDIOFILE }, { "WOAR", required_argument, &optFrameID, ID3FID_WWWARTIST }, { "WOAS", required_argument, &optFrameID, ID3FID_WWWAUDIOSOURCE }, { "WORS", required_argument, &optFrameID, ID3FID_WWWRADIOPAGE }, { "WPAY", required_argument, &optFrameID, ID3FID_WWWPAYMENT }, { "WPUB", required_argument, &optFrameID, ID3FID_WWWPUBLISHER }, { "WXXX", required_argument, &optFrameID, ID3FID_WWWUSER }, { 0, 0, 0, 0 } }; iOpt = getopt_long (argc, argv, "12hfLvldsDCr:a:A:t:c:g:y:T:", long_options, &option_index); if (iOpt == -1 && argCounter == 0) { PrintUsage(argv[0]); exit(0); } else if (iOpt == -1) break; argCounter++; if (iOpt == 0) iOpt = iLongOpt; // if (iOpt == 0) iOpt = optFrameID; #ifdef SORT_RUNTIME InitGenres(); #endif // SORT_RUNTIME switch (iOpt) { case 0: frameList[frameCounter].id = (enum ID3_FrameID)optFrameID; frameList[frameCounter].data = optarg; frameCounter++; break; case '?': case 'h': PrintUsage(argv[0]); exit (0); case 'r': DeleteFrame(argc, argv, optind, optarg); exit (0); case 'f': PrintFrameHelp(argv[0]);exit (0); case 'L': PrintGenreList(); exit (0); case 'v': PrintVersion(argv[0]); exit (0); // listing / remove / convert -- see list.cpp and convert.cpp case 'l': ListTag(argc, argv, optind); exit (0); case 'd': DeleteTag(argc, argv, optind, 2); exit (0); case 's': DeleteTag(argc, argv, optind, 1); exit (0); case 'D': DeleteTag(argc, argv, optind, 0); exit (0); case 'C': ConvertTag(argc, argv, optind); exit (0); case '1': UpdFlags = ID3TT_ID3V1; break; case '2': UpdFlags = ID3TT_ID3V2; break; // Tagging stuff case 'a': frameList[frameCounter].id = ID3FID_LEADARTIST; frameList[frameCounter].data = optarg; frameCounter++; break; case 'A': frameList[frameCounter].id = ID3FID_ALBUM; frameList[frameCounter].data = optarg; frameCounter++; break; case 't': frameList[frameCounter].id = ID3FID_TITLE; frameList[frameCounter].data = optarg; frameCounter++; break; case 'c': frameList[frameCounter].id = ID3FID_COMMENT; frameList[frameCounter].data = optarg; frameCounter++; break; case 'g': { int genre_id = 255; char *genre_str; sscanf(optarg, "%d", &genre_id); if (genre_id == 255) genre_id = GetNumFromGenre(optarg); if (genre_id == 255) genre_str = optarg; else { sprintf(tmp, "(%d)", genre_id); genre_str = tmp; } frameList[frameCounter].id = ID3FID_CONTENTTYPE; frameList[frameCounter].data = genre_str; frameCounter++; } break; case 'y': frameList[frameCounter].id = ID3FID_YEAR; frameList[frameCounter].data = optarg; frameCounter++; break; case 'T': frameList[frameCounter].id = ID3FID_TRACKNUM; frameList[frameCounter].data = optarg; frameCounter++; break; // other tags default: std::cerr << "This isn't supposed to happen" << std::endl; exit(1); } } // loop thru the files if (optind == argc) { std::cerr << "No file to work on." << std::endl; exit(1); } for (int nIndex = optind; nIndex < argc; nIndex++) { ID3_Tag myTag; struct stat filestat; // std::cout << "Tagging " << argv[nIndex] << ": "; // fix me - not checking to see if we can link to it if (stat(argv[nIndex], &filestat)) { std::cerr << "Couldn't stat file '" << argv[nIndex] << "'\n"; break; } /* cludgy to check if we have the proper perms */ fp = fopen(argv[nIndex], "r+"); if (fp == NULL) { /* file didn't open */ fprintf(stderr, "fopen: %s: ", argv[nIndex]); perror("id3v2"); continue; } fclose(fp); size_t ret; ret = myTag.Link(argv[nIndex], UpdFlags); // loop thru the frames we need to add/modify for (ii = 0; ii < frameCounter; ii++) { ID3_Frame *myFrame; myFrame = new ID3_Frame; if (NULL == myFrame) { std::cout << "\nOut of memory\n" << std::endl; exit(1); } myFrame->SetID(frameList[ii].id); ID3_Frame *pFrame; pFrame = myTag.Find(frameList[ii].id); switch (frameList[ii].id) { // strings case ID3FID_ALBUM: case ID3FID_BPM: case ID3FID_COMPOSER: case ID3FID_CONTENTTYPE: case ID3FID_COPYRIGHT: case ID3FID_DATE: case ID3FID_PLAYLISTDELAY: case ID3FID_ENCODEDBY: case ID3FID_LYRICIST: case ID3FID_FILETYPE: case ID3FID_TIME: case ID3FID_CONTENTGROUP: case ID3FID_TITLE: case ID3FID_SUBTITLE: case ID3FID_INITIALKEY: case ID3FID_LANGUAGE: case ID3FID_SONGLEN: case ID3FID_MEDIATYPE: case ID3FID_ORIGALBUM: case ID3FID_ORIGFILENAME: case ID3FID_ORIGLYRICIST: case ID3FID_ORIGARTIST: case ID3FID_ORIGYEAR: case ID3FID_FILEOWNER: case ID3FID_LEADARTIST: case ID3FID_BAND: case ID3FID_CONDUCTOR: case ID3FID_MIXARTIST: case ID3FID_PARTINSET: case ID3FID_PUBLISHER: case ID3FID_RECORDINGDATES: case ID3FID_NETRADIOSTATION: case ID3FID_NETRADIOOWNER: case ID3FID_SIZE: case ID3FID_ISRC: case ID3FID_ENCODERSETTINGS: case ID3FID_YEAR: { if (pFrame != NULL) { ID3_Frame * todel = myTag.RemoveFrame(pFrame); delete todel; } if (strlen(frameList[ii].data) > 0) { myFrame->Field(ID3FN_TEXT) = frameList[ii].data; myTag.AttachFrame(myFrame); } break; } case ID3FID_TERMSOFUSE: { if (pFrame != NULL) { ID3_Frame * todel = myTag.RemoveFrame(pFrame); delete todel; } if (strlen(frameList[ii].data) > 0) { myFrame->Field(ID3FN_TEXTENC) = ID3TE_ASCII; char *text; text = strchr(frameList[ii].data, ':'); if (text == NULL) { myFrame->Field(ID3FN_TEXT) = frameList[ii].data; } else { *text = '\0'; text++; myFrame->Field(ID3FN_LANGUAGE) = frameList[ii].data; myFrame->Field(ID3FN_TEXT) = text; } char * test = ID3_GetString(myFrame, ID3FN_TEXT); if (strlen(test) > 0) { delete[] test; myTag.AttachFrame(myFrame); } break; } } case ID3FID_TRACKNUM: { // this ought to check if there is a total track number and // combine it with the given track number, but it doesn't. char *currentTrackNum = NULL; char *newTrackNum = NULL; if (pFrame != NULL) { currentTrackNum = ID3_GetString(pFrame, ID3FN_TEXT); if (*currentTrackNum == '/') { newTrackNum = (char *)malloc(strlen(currentTrackNum) + strlen(frameList[ii].data)); strcpy(newTrackNum, frameList[ii].data); strcat(newTrackNum, currentTrackNum); } else { ID3_Frame * todel = myTag.RemoveFrame(pFrame); delete todel; } } myFrame->Field(ID3FN_TEXT) = frameList[ii].data; myTag.AttachFrame(myFrame); free(newTrackNum); break; } case ID3FID_USERTEXT: { if (pFrame != NULL) { ID3_Frame * todel = myTag.RemoveFrame(pFrame); delete todel; } // split the string at the ':' remember if no : then leave // descrip empty char *text; text = strchr(frameList[ii].data, ':'); if (text == NULL) { myFrame->Field(ID3FN_TEXT) = frameList[ii].data; } else { *text = '\0'; text++; myFrame->Field(ID3FN_DESCRIPTION) = frameList[ii].data; myFrame->Field(ID3FN_TEXT) = text; } if (strlen(ID3_GetString(myFrame, ID3FN_TEXT)) > 0) { myTag.AttachFrame(myFrame); } break; } case ID3FID_COMMENT: case ID3FID_UNSYNCEDLYRICS: { // split the string at the ':' remember if no : then leave // descrip/lang empty char *text; text = strchr(frameList[ii].data, ':'); if (text == NULL) { myFrame->Field(ID3FN_TEXT) = frameList[ii].data; } else { *text = '\0'; text++; char *lang; lang = strchr(text, ':'); if (lang == NULL) { myFrame->Field(ID3FN_DESCRIPTION) = frameList[ii].data; myFrame->Field(ID3FN_TEXT) = text; } else { *lang = '\0'; lang++; myFrame->Field(ID3FN_DESCRIPTION) = frameList[ii].data; myFrame->Field(ID3FN_TEXT) = text; myFrame->Field(ID3FN_LANGUAGE) = lang; } } /* debug std::cout << ID3_GetString(myFrame, ID3FN_DESCRIPTION) << std::endl << ID3_GetString(myFrame, ID3FN_TEXT) << std::endl << ID3_GetString(myFrame, ID3FN_LANGUAGE) << std::endl; */ // now try and find a comment/lyrics with the same descript // and lang as what we have ID3_Frame *pFirstFrame = NULL; do { // if pFrame is NULL, either there were no comments/lyrics // to begin with, or we removed them all in the process if (pFrame == NULL) break; if (pFirstFrame == NULL) { pFirstFrame = pFrame; } char *tmp_desc = ID3_GetString(pFrame, ID3FN_DESCRIPTION); char *tmp_my_desc = ID3_GetString(myFrame, ID3FN_DESCRIPTION); char *tmp_lang = ID3_GetString(pFrame, ID3FN_LANGUAGE); char *tmp_my_lang = ID3_GetString(myFrame, ID3FN_LANGUAGE); if ((strcmp(tmp_desc, tmp_my_desc) == 0) && (strcmp(tmp_lang, tmp_my_lang) == 0)) { ID3_Frame * todel = myTag.RemoveFrame(pFrame); delete todel; if (pFrame == pFirstFrame) { pFirstFrame = NULL; } } delete [] tmp_desc; delete [] tmp_my_desc; delete [] tmp_lang; delete [] tmp_my_lang; // get the next frame until it wraps around } while ((pFrame = myTag.Find(frameList[ii].id)) != pFirstFrame); char * temp = ID3_GetString(myFrame, ID3FN_TEXT); if (strlen(temp) > 0) { delete[] temp; myTag.AttachFrame(myFrame); } break; } case ID3FID_WWWAUDIOFILE: case ID3FID_WWWARTIST: case ID3FID_WWWAUDIOSOURCE: case ID3FID_WWWCOMMERCIALINFO: case ID3FID_WWWCOPYRIGHT: case ID3FID_WWWPUBLISHER: case ID3FID_WWWPAYMENT: case ID3FID_WWWRADIOPAGE: { if (pFrame != NULL) { char *sURL = ID3_GetString(pFrame, ID3FN_URL); if (strcmp(frameList[ii].data, sURL) == 0) { ID3_Frame * todel = myTag.RemoveFrame(pFrame); delete todel; } } if (strlen(frameList[ii].data) > 0) { myFrame->Field(ID3FN_URL) = frameList[ii].data; myTag.AttachFrame(myFrame); } break; } case ID3FID_WWWUSER: { char *sURL = ID3_GetString(myFrame, ID3FN_URL), *sDesc = ID3_GetString(myFrame, ID3FN_DESCRIPTION); std::cout << "(" << sDesc << "): " << sURL << std::endl; delete [] sURL; delete [] sDesc; break; } case ID3FID_INVOLVEDPEOPLE: { // This isn't the right way to do it---will only get first person size_t nItems = myFrame->Field(ID3FN_TEXT).GetNumTextItems(); for (size_t nIndex = 1; nIndex <= nItems; nIndex++) { char *sPeople = ID3_GetString(myFrame, ID3FN_TEXT, nIndex); std::cout << sPeople; delete [] sPeople; if (nIndex < nItems) { std::cout << ", "; } } std::cout << std::endl; break; } case ID3FID_PICTURE: { char *sMimeType = ID3_GetString(myFrame, ID3FN_MIMETYPE), *sDesc = ID3_GetString(myFrame, ID3FN_DESCRIPTION), *sFormat = ID3_GetString(myFrame, ID3FN_IMAGEFORMAT); size_t nPicType = myFrame->Field(ID3FN_PICTURETYPE).Get(), nDataSize = myFrame->Field(ID3FN_DATA).Size(); std::cout << "(" << sDesc << ")[" << sFormat << ", " << nPicType << "]: " << sMimeType << ", " << nDataSize << " bytes" << std::endl; delete [] sMimeType; delete [] sDesc; delete [] sFormat; break; } case ID3FID_GENERALOBJECT: { char *sMimeType = ID3_GetString(myFrame, ID3FN_TEXT), *sDesc = ID3_GetString(myFrame, ID3FN_DESCRIPTION), *sFileName = ID3_GetString(myFrame, ID3FN_FILENAME); size_t nDataSize = myFrame->Field(ID3FN_DATA).Size(); std::cout << "(" << sDesc << ")[" << sFileName << "]: " << sMimeType << ", " << nDataSize << " bytes" << std::endl; delete [] sMimeType; delete [] sDesc; delete [] sFileName; break; } case ID3FID_UNIQUEFILEID: { if (pFrame != NULL) { char *sOwner = ID3_GetString(pFrame, ID3FN_TEXT); size_t nDataSize = pFrame->Field(ID3FN_DATA).Size(); std::cout << sOwner << ", " << nDataSize << " bytes" << std::endl; delete [] sOwner; } break; } case ID3FID_PLAYCOUNTER: { if (pFrame != NULL) { size_t nCounter = pFrame->Field(ID3FN_COUNTER).Get(); std::cout << nCounter << std::endl; } break; } case ID3FID_POPULARIMETER: { if (pFrame != NULL) { char *sEmail = ID3_GetString(pFrame, ID3FN_EMAIL); size_t nCounter = pFrame->Field(ID3FN_COUNTER).Get(), nRating = pFrame->Field(ID3FN_RATING).Get(); std::cout << sEmail << ", counter=" << nCounter << " rating=" << nRating; delete [] sEmail; } break; } case ID3FID_CRYPTOREG: case ID3FID_GROUPINGREG: { char *sOwner = ID3_GetString(myFrame, ID3FN_OWNER); size_t nSymbol = myFrame->Field(ID3FN_ID).Get(), nDataSize = myFrame->Field(ID3FN_DATA).Size(); std::cout << "(" << nSymbol << "): " << sOwner << ", " << nDataSize << " bytes"; break; } case ID3FID_AUDIOCRYPTO: case ID3FID_EQUALIZATION: case ID3FID_EVENTTIMING: case ID3FID_CDID: case ID3FID_MPEGLOOKUP: case ID3FID_OWNERSHIP: case ID3FID_PRIVATE: case ID3FID_POSITIONSYNC: case ID3FID_BUFFERSIZE: case ID3FID_VOLUMEADJ: case ID3FID_REVERB: case ID3FID_SYNCEDLYRICS: case ID3FID_SYNCEDTEMPO: case ID3FID_METACRYPTO: { std::cout << " (unimplemented)" << std::endl; break; } default: { std::cout << " frame" << std::endl; break; } } } // steping thru frames myTag.Update(UpdFlags); /* update file with old mode */ if (chmod(argv[nIndex], filestat.st_mode)) { std::cerr << "Couldn't reset permissions on '" << argv[nIndex] << "'\n"; } } return 0; } id3v2-0.1.12/Makefile0000644000175000017500000000115411353241442013466 0ustar nagilonagiloall: id3v2 VERSION=0.1.12 PREFIX= /opt/local CXXFLAGS+= -Wall -I${PREFIX}/include/ -DVERSION="\"${VERSION}\"" #-DSORT_RUNTIME LDFLAGS+= -L${PREFIX}/lib/ id3v2: convert.o list.o id3v2.o genre.o ${CXX} ${LDFLAGS} -pedantic -Wall -g -o $@ $^ -lz -lid3 create_map: create_map.o ${CXX} -Wall -g -o $@ $^ install: all install -c -s id3v2 ${PREFIX}/bin/id3v2 nroff -man id3v2.1 > ${PREFIX}/share/man/man1/id3v2.1 clean: rm -f id3v2 create_map core *.o tarball: ln -s . id3v2-${VERSION} tar zhcf id3v2-${VERSION}.tar.gz \ --exclude=id3v2-${VERSION}/id3v2-${VERSION} \ id3v2-${VERSION} rm id3v2-${VERSION} id3v2-0.1.12/id3v2.o0000644000175000017500000006700011353241452013140 0ustar nagilonagiloELFHA4(UD$4$UT$$D$<$D$$D$T$D$$D$$D$$D$$D$$D$$D$$D$$D$P$D$$D$$D$$D$$D$$D$$D$$D$0$D$$D$p$D$$D$$D$$D$$D$$D$$D$$D$T$D$$D$$D$$D$$D$$D$ $D$$D$X $D$$D$ $D$$D$ $D$$D$ $D$$D$8 $D$$D$$D$ $D$$D$ $D$$D$ $D$$D$ $D$$D$$USED$$D$> $D$@ $D$$D$G $\$$D$$D$$D$P $D$$D$ $D$$[]UWVS1DŽ$0DŽ$0DŽ$0DŽ$0DŽ$0u$\$0h$0x$0$0$0$0$0$0$0$0$0$0$0($08$0H$0X$0h$0x$0$0$0$0$0$0$0$0$0$0$0($08$0H$0X$0h$0x$0$0$0$0$0$0$0$0$0$0$0($08$0H$0X$0h$0x$0$0$0$0$0$0$0$0$0$0$0($08$0H$0X$0h$0x$0$0$0$0$0$0$0$0$0$0$0($08$0H$0X$0h$0x$0$0$0$0$0$0$0$0$0$0$$0D$D$ `D$ E D$E$$0$0u#$0uE $$$0u;E($0$0u$0$0$0y$0 $0$0T($0T,$0E $$T$ D$E D$E$$E $$$E $$D$E D$E$$D$ D$E D$E$$D$ D$E D$E$$D$ D$E D$E$$D$E D$E$$f f$0D(=$0T,$0$0D($0T,$0$0D(/$0T,$0x$0D($0T,$0KDŽ$0$0T$D$ $$0=u$$0$0=u$00$0D$D$ $u/$$u/$0$0D( $0$0T,$0$0D(P$0T,$0Z$0D(D$0T,$00D$ $D$$$D$ $D$$$$0D$$h$$0E $t0T$$tI$0E D$ $\$$D$ $Z$0E D$ $$0$0u>$0E T$D$ $$% $0$Ћ$0E T$D$$h$$0DŽ$0$ÉD$$$0$0tE։lj$/D$+ $D$$$$0D(D$$0$$0D(D$$h$$1$0D(]$1tE$1D$$h$$1$1t$1$1$ҋ$0D,fD$$0$ $0T,T$$ы$0D$$h$:$1tE$1D$$h$$1$1t$1$1$ҋ$0D,eD$$0$D$$ҋ$0D,D$:$$ 1$ 1u4D$$0$ $0T,T$$r$ 1$ 1D$ $0$ $0T,T$$D$$0$ $ 1T$$D$$0$$1$1$1t$1$$0D$$h$pDŽ$1DŽ$1$1D$$1$$1$1DICQ1\2grta{AtcgyT       !!&"+$0*5+:,?-D.I/N0S1X2]3b5g7l8q9v:{;<=>?@ACDEFGHLMOPQRSTUVWXYZ[\BluesClassic RockCountryDanceDiscoFunkGrungeHip-HopJazzMetalNew AgeOldiesOtherPopR&BRapReggaeRockTechnoIndustrialAlternativeSkaDeath MetalPranksSoundtrackEuro-TechnoAmbientTrip-HopVocalJazz+FunkFusionTranceClassicalInstrumentalAcidHouseGameSound ClipGospelNoiseAlternRockBassSoulPunkSpaceMeditativeInstrumental PopInstrumental RockEthnicGothicDarkwaveTechno-IndustrialElectronicPop-FolkEurodanceDreamSouthern RockComedyCultGangstaTop 40Christian RapPop/FunkJungleNative AmericanCabaretNew WavePsychadelicRaveShowtunesTrailerLo-FiTribalAcid PunkAcid JazzPolkaRetroMusicalRock & RollHard RockFolkFolk-RockNational FolkSwingFast FusionBebobLatinRevivalCelticBluegrassAvantgardeGothic RockProgressive RockPsychedelic RockSymphonic RockSlow RockBig BandChorusEasy ListeningAcousticHumourSpeechChansonOperaChamber MusicSonataSymphonyBooty BassPrimusPorn GrooveSatireSlow JamClubTangoSambaFolkloreBalladPower BalladRhythmic SoulFreestyleDuetPunk RockDrum SoloA capellaEuro-HouseDance HallGoaDrum & BassClub-HouseHardcoreTerrorIndieBritpopNegerpunkPolsk PunkBeatChristian Gangsta RapHeavy MetalBlack MetalCrossoverContemporary ChristianChristian Rock MerengueSalsaTrash MetalAnimeJPopSynthpopUsage: [OPTION]... [FILE]...Adds/Modifies/Removes/Views id3v2 tags, modifies/converts/lists id3v1 tags -h, --help Display this help and exit -f, --list-frames Display all possible frames for id3v2 -L, --list-genres Lists all id3v1 genres -v, --version Display version information and exit -l, --list Lists the tag(s) on the file(s) -d, --delete-v2 Deletes id3v2 tags -s, --delete-v1 Deletes id3v1 tags -D, --delete-all Deletes both id3v1 and id3v2 tags -C, --convert Converts id3v1 tag to id3v2 -1, --id3v1-only Writes only id3v1 tag -2, --id3v2-only Writes only id3v2 tag -r, --remove-frame "FRAMEID" Removes the specified id3v2 frame -a, --artist "ARTIST" Set the artist information -A, --album "ALBUM" Set the album title information -t, --song "SONG" Set the song title information -c, --comment "DESCRIPTION":"COMMENT":"LANGUAGE" Set the comment information (both description and language optional) -g, --genre num Set the genre number -y, --year num Set the year -T, --track num/num Set the track number/(optional) total tracksYou can set the value for any id3v2 frame by using '--' and then frame idFor example: id3v2 --TIT3 "Monkey!" file.mp3would set the "Subtitle/Description" frame to "Monkey!". 0.1.12Uses This program adds/modifies/removes/views id3v2 tags, and can convert from id3v1 tags12hfLvldsDCr:a:A:t:c:g:y:T:%d(%d)This isn't supposed to happenNo file to work on.Couldn't stat file '' r+fopen: %s: id3v2 Out of memory (): , )[]: bytes, counter= rating= (unimplemented) frameCouldn't reset permissions on '                                                " 0             k                           >  n    G      .   O#)#O#O#8"O#)#)#{8"O#)#)#)#)# 9!)#)#O#)#)#O#O#)#)#O#O#O#O#O#O#O#O#O#*O#O#O#O# `)#helplist-frameslist-genresversionlistdelete-v2delete-v1delete-allconvertid3v1-onlyid3v2-onlyremove-frameartistalbumsongcommentgenreyeartrackAENCAPICCOMMENCREQUAETCOGEOBGRIDIPLSLINKMCDIMLLTOWNEPRIVPCNTPOPMPOSSRBUFRVADRVRBSYLTSYTCTALBTBPMTCOMTCONTCOPTDATTDLYTENCTEXTTFLTTIMETIT1TIT2TIT3TKEYTLANTLENTMEDTOALTOFNTOLYTOPETORYTOWNTPE1TPE2TPE3TPE4TPOSTPUBTRCKTRDATRSNTRSOTSIZTSRCTSSETXXXTYERUFIDUSERUSLTWCOMWCOPWOAFWOARWOASWORSWPAYWPUBWXXX >(>>$GCC: (Debian 4.4.2-9) 4.4.3 20100108 (prerelease)zPR|  'AB <'AB RzPLR| <$AB SU  "U  "U  "$@AB $AB .symtab.strtab.shstrtab.rel.text.rel.data.bss.rel.rodata.gcc_except_table.rel.ctors.comment.note.GNU-stack.rel.eh_frame4 % M)@%0 % x_/p-8p- 4 f@|?#V?R m ]0?3f?z?v m@ @D H P8R`j$@$    P'Zk'~*:Mah .Nt IShn~id3v2.cpp_ZStL8__ioinit_ZL24ID3_v1_genre_description_ZGVZ4mainE12long_options_ZZ4mainE12long_options_Z41__static_initialization_and_destruction_0ii_GLOBAL__I_UpdFlagsUpdFlags_Z10PrintUsagePc__gxx_personality_v0_ZSt4cout_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6__ZNSolsEPFRSoS_E_Z12PrintVersionPcID3LIB_FULL_NAME_Unwind_Resumemain__cxa_guard_acquire__cxa_guard_releasegetopt_longexitoptindoptarg_Z11DeleteFrameiPPciS__Z14PrintFrameHelpPc_Z14PrintGenreListv_Z7ListTagiPPci_Z9DeleteTagiPPcii_Z10ConvertTagiPPcisscanf_Z15GetNumFromGenrePKcsprintf_ZSt4cerr_ZN7ID3_TagC1EPKcstatfopenstderrfprintfperrorfclose_ZN7ID3_Tag4LinkEPKct_Znwj_ZN9ID3_FrameC1E11ID3_FrameID_ZdlPv_ZN9ID3_Frame5SetIDE11ID3_FrameID_ZNK7ID3_Tag4FindE11ID3_FrameID_ZN7ID3_Tag11RemoveFrameEPK9ID3_Frame_ZNK9ID3_Frame5FieldE11ID3_FieldID_ZN7ID3_Tag11AttachFrameEP9ID3_Framestrchr_Z13ID3_GetStringPK9ID3_Frame11ID3_FieldID_ZdaPvstrlenmallocstrcpystrcatfreestrcmp_Z13ID3_GetStringPK9ID3_Frame11ID3_FieldIDj_ZNSolsEj_ZN7ID3_Tag6UpdateEtchmod_ZN7ID3_TagD1Ev_ZNSt8ios_base4InitC1Ev_ZNSt8ios_base4InitD1Ev__dso_handle__cxa_atexit %-5=EMTYaiqx} !)19@EMU]diqy %-5<AIQY`emu} !)05=EMTYaiqx} !8=EMU]ems{HZ_x ,8DP\ht(4@LXdp| $0<HT`lx   , 8 D P \ h t             ) 8   !   !  "  #  $* 7 C H  ^ %j o  &   &   &    ' % 3 V ! ! ! ! !  (, !4 )N !j y * ! !+%-9FM+RZbns ,-+!).N/Zb0in12345 6%*2:Fd789":W;9:</:u::=>!;a=??@AB9B:w;C9<:c::=; <5:~<:::O:}:===6=WDuD9> >$>=>[8=>; =0DN9:;==$+0CKSfnv>>: E&+D>\ch===:=:X_dwFF #<>U>r>===: "*2EMUhpxF>>>$ =B :g l t |  F     > :! !F(!0!Z!=x!:!:!!!!!F!!"F/">K"=i":":""""F""""##F###-#4#9#A#I#S#Z#_#g#o###G#H$$+"$.$6$>$X$Id$s$I$$J$K$L$$M  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHL`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p                                 $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                   $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|$@g| id3v2-0.1.12/list.cpp0000644000175000017500000003011111353241266013504 0ustar nagilonagilo// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #if defined HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include "frametable.h" #include "genre.h" const char *GetDescription(const ID3_FrameID eFrameID) { for(int ii = 0; ii < frameTableCount; ii++ ) { if (frameTable[ii].frameID == eFrameID) return frameTable[ii].frameLongName; } return NULL; } void PrintFrameHelp(char *sName) { for(int ii = 0; ii < frameTableCount - 1; ii++ ) { std::cout << " --" << frameTable[ii].frameName << " " << frameTable[ii].frameLongName << std::endl; } return; } void PrintGenreList() { for (int ii = 0; ii < GetGenreCount(); ii++) printf("%3d: %s\n", ii, GetGenreFromNum(ii)); } int PrintInformation(char *sFileName, const ID3_Tag &myTag) { bool firstLine = true; const ID3_Frame * myFrame; ID3_Tag::ConstIterator *Iter=myTag.CreateIterator(); for (size_t nFrames = 0; nFrames < myTag.NumFrames(); nFrames++) { myFrame = Iter->GetNext(); if(firstLine) { std::cout << "id3v2 tag info for " << sFileName << ":" << std::endl; firstLine = false; } if (NULL != myFrame) { const char* desc = myFrame->GetDescription(); if (!desc) desc = ""; std::cout << myFrame->GetTextID() << " (" << desc << "): "; ID3_FrameID eFrameID = myFrame->GetID(); switch (eFrameID) { case ID3FID_ALBUM: case ID3FID_BPM: case ID3FID_COMPOSER: case ID3FID_COPYRIGHT: case ID3FID_DATE: case ID3FID_PLAYLISTDELAY: case ID3FID_ENCODEDBY: case ID3FID_LYRICIST: case ID3FID_FILETYPE: case ID3FID_TIME: case ID3FID_CONTENTGROUP: case ID3FID_TITLE: case ID3FID_SUBTITLE: case ID3FID_INITIALKEY: case ID3FID_LANGUAGE: case ID3FID_SONGLEN: case ID3FID_MEDIATYPE: case ID3FID_ORIGALBUM: case ID3FID_ORIGFILENAME: case ID3FID_ORIGLYRICIST: case ID3FID_ORIGARTIST: case ID3FID_ORIGYEAR: case ID3FID_FILEOWNER: case ID3FID_LEADARTIST: case ID3FID_BAND: case ID3FID_CONDUCTOR: case ID3FID_MIXARTIST: case ID3FID_PARTINSET: case ID3FID_PUBLISHER: case ID3FID_TRACKNUM: case ID3FID_RECORDINGDATES: case ID3FID_NETRADIOSTATION: case ID3FID_NETRADIOOWNER: case ID3FID_SIZE: case ID3FID_ISRC: case ID3FID_ENCODERSETTINGS: case ID3FID_YEAR: { char *sText = ID3_GetString(myFrame, ID3FN_TEXT); std::cout << sText << std::endl; delete [] sText; break; } case ID3FID_CONTENTTYPE: { const char* genre_str; int genre_id = 255; char *sText = ID3_GetString(myFrame, ID3FN_TEXT); sscanf(sText, "(%d)", &genre_id); if (genre_id == 255) { genre_str = sText; genre_id = GetNumFromGenre(sText); } else genre_str = GetGenreFromNum(genre_id); std::cout << genre_str << " (" << genre_id << ")" << std::endl; delete [] sText; break; } case ID3FID_USERTEXT: { char *sText = ID3_GetString(myFrame, ID3FN_TEXT), *sDesc = ID3_GetString(myFrame, ID3FN_DESCRIPTION); std::cout << "(" << sDesc << "): " << sText << std::endl; delete [] sText; delete [] sDesc; break; } case ID3FID_TERMSOFUSE: { char *sText = ID3_GetString(myFrame, ID3FN_TEXT), *sLang = ID3_GetString(myFrame, ID3FN_LANGUAGE); std::cout << "[" << sLang << "]: " << sText << std::endl; delete [] sText; delete [] sLang; break; } case ID3FID_COMMENT: case ID3FID_UNSYNCEDLYRICS: { char *sText = ID3_GetString(myFrame, ID3FN_TEXT), *sDesc = ID3_GetString(myFrame, ID3FN_DESCRIPTION), *sLang = ID3_GetString(myFrame, ID3FN_LANGUAGE); std::cout << "(" << sDesc << ")[" << sLang << "]: " << sText << std::endl; delete [] sText; delete [] sDesc; delete [] sLang; break; } case ID3FID_WWWAUDIOFILE: case ID3FID_WWWARTIST: case ID3FID_WWWAUDIOSOURCE: case ID3FID_WWWCOMMERCIALINFO: case ID3FID_WWWCOPYRIGHT: case ID3FID_WWWPUBLISHER: case ID3FID_WWWPAYMENT: case ID3FID_WWWRADIOPAGE: { char *sURL = ID3_GetString(myFrame, ID3FN_URL); std::cout << sURL << std::endl; delete [] sURL; break; } case ID3FID_WWWUSER: { char *sURL = ID3_GetString(myFrame, ID3FN_URL), *sDesc = ID3_GetString(myFrame, ID3FN_DESCRIPTION); std::cout << "(" << sDesc << "): " << sURL << std::endl; delete [] sURL; delete [] sDesc; break; } case ID3FID_INVOLVEDPEOPLE: { // This isn't the right way to do it---will only get first person size_t nItems = myFrame->Field(ID3FN_TEXT).GetNumTextItems(); for (size_t nIndex = 1; nIndex <= nItems; nIndex++) { char *sPeople = ID3_GetString(myFrame, ID3FN_TEXT, nIndex); std::cout << sPeople; delete [] sPeople; if (nIndex < nItems) { std::cout << ", "; } } std::cout << std::endl; break; } case ID3FID_PICTURE: { char *sMimeType = ID3_GetString(myFrame, ID3FN_MIMETYPE), *sDesc = ID3_GetString(myFrame, ID3FN_DESCRIPTION), *sFormat = ID3_GetString(myFrame, ID3FN_IMAGEFORMAT); size_t nPicType = myFrame->Field(ID3FN_PICTURETYPE).Get(), nDataSize = myFrame->Field(ID3FN_DATA).Size(); std::cout << "(" << sDesc << ")[" << sFormat << ", " << nPicType << "]: " << sMimeType << ", " << nDataSize << " bytes" << std::endl; delete [] sMimeType; delete [] sDesc; delete [] sFormat; break; } case ID3FID_GENERALOBJECT: { char *sMimeType = ID3_GetString(myFrame, ID3FN_MIMETYPE), *sDesc = ID3_GetString(myFrame, ID3FN_DESCRIPTION), *sFileName = ID3_GetString(myFrame, ID3FN_FILENAME); size_t nDataSize = myFrame->GetField(ID3FN_DATA)->Size(); std::cout << "(" << sDesc << ")[" << sFileName << "]: " << sMimeType << ", " << nDataSize << " bytes" << std::endl; delete [] sMimeType; delete [] sDesc; delete [] sFileName; break; } case ID3FID_UNIQUEFILEID: { char *sOwner = ID3_GetString(myFrame, ID3FN_OWNER); size_t nDataSize = myFrame->Field(ID3FN_DATA).Size(); std::cout << sOwner << ", " << nDataSize << " bytes" << std::endl; delete [] sOwner; break; } case ID3FID_PLAYCOUNTER: { size_t nCounter = myFrame->Field(ID3FN_COUNTER).Get(); std::cout << nCounter << std::endl; break; } case ID3FID_POPULARIMETER: { char *sEmail = ID3_GetString(myFrame, ID3FN_EMAIL); size_t nCounter = myFrame->Field(ID3FN_COUNTER).Get(), nRating = myFrame->Field(ID3FN_RATING).Get(); std::cout << sEmail << ", counter=" << nCounter << " rating=" << nRating; delete [] sEmail; break; } case ID3FID_CRYPTOREG: case ID3FID_GROUPINGREG: { char *sOwner = ID3_GetString(myFrame, ID3FN_OWNER); size_t nSymbol = myFrame->Field(ID3FN_ID).Get(), nDataSize = myFrame->Field(ID3FN_DATA).Size(); std::cout << "(" << nSymbol << "): " << sOwner << ", " << nDataSize << " bytes"; break; } case ID3FID_AUDIOCRYPTO: case ID3FID_EQUALIZATION: case ID3FID_EVENTTIMING: case ID3FID_CDID: case ID3FID_MPEGLOOKUP: case ID3FID_OWNERSHIP: case ID3FID_PRIVATE: case ID3FID_POSITIONSYNC: case ID3FID_BUFFERSIZE: case ID3FID_VOLUMEADJ: case ID3FID_REVERB: case ID3FID_SYNCEDLYRICS: case ID3FID_SYNCEDTEMPO: case ID3FID_METACRYPTO: { std::cout << " (unimplemented)" << std::endl; break; } default: { std::cout << " frame" << std::endl; break; } } } } delete Iter; if(firstLine) return 1; return 0; } int PrintID3v1Tag(char *sFileName) // code from id3 { struct id3 { char tag[3]; char title[30]; char artist[30]; char album[30]; char year[4]; /* With ID3 v1.0, the comment is 30 chars long */ /* With ID3 v1.1, if comment[28] == 0 then comment[29] == tracknum */ char comment[30]; unsigned char genre; } id3v1tag; FILE *fp; fp = fopen(sFileName, "r"); /* read only */ if (fp == NULL) { /* file didn't open */ fprintf(stderr, "fopen: %s: ", sFileName); perror("id3v2"); return -1; } if (fseek(fp, -128, SEEK_END) < 0) { /* problem rewinding */ } else { /* we rewound successfully */ if (fread(&id3v1tag, 128, 1, fp) != 1) { /* read error */ fprintf(stderr, "fread: %s: ", sFileName); perror(""); } } fclose(fp); /* This simple detection code has a 1 in 16777216 * chance of misrecognizing or deleting the last 128 * bytes of your mp3 if it isn't tagged. ID3 ain't * world peace, live with it. */ if (!strncmp(id3v1tag.tag, "TAG", 3)) { std::cout << "id3v1 tag info for " << sFileName << ":" << std::endl; printf("Title : %-30.30s Artist: %-30.30s\n", id3v1tag.title, id3v1tag.artist); printf("Album : %-30.30s Year: %-4.4s, Genre: %s (%d)\n", id3v1tag.album, id3v1tag.year, (id3v1tag.genre < GetGenreCount()) ? GetGenreFromNum(id3v1tag.genre) : "Unknown", id3v1tag.genre); if (!id3v1tag.comment[28]) printf("Comment: %-28.28s Track: %d\n", id3v1tag.comment, id3v1tag.comment[29]); else printf("Comment: %-30.30s\n", id3v1tag.comment); } else { return 1; } return 0; } void ListTag(int argc, char *argv[], int optind) { bool id3v1_tag = false; bool id3v2_tag = false; int ret = 0; for (int nIndex = optind; nIndex < argc; nIndex++) { ID3_Tag myTag; ret = PrintID3v1Tag(argv[nIndex]); if (ret == -1) { continue; } else if(ret == 0) { id3v1_tag = true; } myTag.Link(argv[nIndex], ID3TT_ID3V2); if(!PrintInformation(argv[nIndex],myTag)) id3v2_tag = true; if(!id3v1_tag && !id3v2_tag) std::cout << argv[nIndex] << ": No ID3 tag" << std::endl; else { if (!id3v1_tag) std::cout << argv[nIndex] << ": No ID3v1 tag" << std::endl; if (!id3v2_tag) std::cout << argv[nIndex] << ": No ID3v2 tag" << std::endl; } id3v1_tag = false; id3v2_tag = false; } return; } id3v2-0.1.12/genre.cpp0000644000175000017500000000532611353241266013643 0ustar nagilonagilo// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #if defined HAVE_CONFIG_H #include #endif #ifndef __GENRE_H__ #include "genre.h" #endif #ifdef SORT_RUNTIME #include #endif // SORT_RUNTIME #include #include "id3/globals.h" const char ** genre_table = ID3_v1_genre_description; const int genre_count = ID3_NR_OF_V1_GENRES; #ifdef SORT_RUNTIME int genre_map[genre_count]; #else int genre_map[] = {123, 34, 74, 73, 99, 40, 20, 26, 145, 90, 116, 41, 135, 85, 96, 138, 89, 0, 107, 132, 65, 88, 104, 102, 97, 136, 61, 141, 1, 32, 112, 128, 57, 140, 2, 139, 58, 3, 125, 50, 22, 4, 55, 127, 122, 120, 98, 52, 48, 124, 25, 54, 84, 80, 81, 115, 119, 5, 30, 36, 59, 126, 38, 49, 91, 6, 79, 129, 137, 7, 35, 100, 131, 19, 33, 46, 47, 146, 8, 29, 63, 86, 71, 45, 142, 9, 77, 82, 64, 133, 10, 66, 39, 11, 103, 12, 75, 134, 13, 53, 62, 109, 117, 23, 108, 92, 67, 93, 43, 121, 14, 15, 68, 16, 76, 87, 118, 17, 78, 143, 114, 110, 69, 21, 111, 95, 105, 42, 37, 24, 56, 44, 101, 83, 94, 106, 147, 113, 18, 51, 130, 60, 70, 31, 144, 72, 27, 28}; #endif // SORT_RUNTIME int GetGenreCount() { return genre_count; } const char *GetGenreFromNum(int genre_id) { if ((genre_id >= 0) && (genre_id < GetGenreCount())) return genre_table[genre_id]; else return "Unknown"; } int GetNumFromGenre(const char *genre) { int a=0; int b=GetGenreCount()-1; while(a <= b) { const int i = (a+b)/2; const int genre_id = genre_map[i]; const int cmp = strcmp(GetGenreFromNum(genre_id), genre); if (cmp == 0) return genre_id; else if (cmp < 0) a = i+1; else b = i-1; } return 255; } #ifdef SORT_RUNTIME int CompareGenres(const void *a, const void *b) { int g1, g2; g1 = *((int*)a); g2 = *((int*)b); return strcmp(GetGenreFromNum(g1), GetGenreFromNum(g2)); } void InitGenres() { int i; for (i=0; i Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ================================================================================== The DocumentTemplate modules fall under the Zope Public License. See the file common/DocumentTemplate/ZOPE-LICENSE.TXT for details. The license requires that following disclaimer be here: Disclaimer THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of contributions made by Digital Creations and many individuals on behalf of Digital Creations. Specific attributions are listed in the accompanying credits file. id3v2-0.1.12/convert.o0000644000175000017500000003142011353241451013665 0ustar nagilonagiloELF4(UE$t.D$4$D$$ D$ED$$Pu  D$ED$$Uu  D$ED$$Zu  D$ED$$_u x D$ED$$du O D$ED$$iu & D$ED$$nu D$ED$$su D$ED$$xu D$ED$$}u D$ED$$u Y D$ED$$u 0 D$ED$$u  D$ED$$u  D$ED$$u  D$ED$$u  D$ED$$u c D$ED$$u : D$ED$$u  D$ED$$u D$ED$$u D$ED$$u D$ED$$u mD$ED$$u DD$ED$$u D$ED$$u D$ED$$u D$ED$$u !D$ED$$u "wD$ED$$u $ND$ED$$u *%D$ED$$u +D$ED$$u ,D$ED$$u -D$ED$$u .D$ED$$u /XD$ED$$u 0/D$ED$$ u 1D$ED$$u 2D$ED$$u 3D$ED$$u 5D$ED$$u 7bD$ED$$"u 89D$ED$$'u 9D$ED$$,u :D$ED$$1u ;D$ED$$6u <D$ED$$;u =lD$ED$$@u >CD$ED$$Eu ?D$ED$$Ju @D$ED$$Ou AD$ED$$Tu CD$ED$$Yu DvD$ED$$^u EMD$ED$$cu F$D$ED$$hu GD$ED$$mu HD$ED$$ru LD$ED$$wu MD$ED$$|u OWD$ED$$u P.D$ED$$u QD$ED$$u RD$ED$$u SD$ED$$u TD$ED$$u UaD$ED$$u V8D$ED$$u WD$ED$$u XD$ED$$u YD$ED$$u ZD$ED$$u[nD$ED$$u\HD$$UT$$D$$D$$UVS0EEEE D$$E}u5EE T$D$$$E$D$$D$$EE D$$D$$$EE D$D$$Ett4dD$$ED$ $bD$$ED$$0D$$ED$$D$'$D$$$Ӊƍ$ډ$EE;E 0[^]UVS0EED$$D$4$EE D$$D$V$$EE D$D$$D$$ED$Z$D$$$EӉƍ$ډ$E;E0[^]UVS0EED$$D$f$UT$$D$v$EE D$$D$$D$$$EE D$D$$E$EED$$EHED$$E}tEE$ҋED$$E}u$tD$$E$EӉƍ$ډ$E;E]0[^]U}u2} u)$D$D$$UD$$!',3;@FNU[_cgnsz  '-8=BGMXi{'0<AKSY`jtz +:DMTclsz)3=HSWcnw~ &+BluesClassic RockCountryDanceDiscoFunkGrungeHip-HopJazzMetalNew AgeOldiesOtherPopR&BRapReggaeRockTechnoIndustrialAlternativeSkaDeath MetalPranksSoundtrackEuro-TechnoAmbientTrip-HopVocalJazz+FunkFusionTranceClassicalInstrumentalAcidHouseGameSound ClipGospelNoiseAlternRockBassSoulPunkSpaceMeditativeInstrumental PopInstrumental RockEthnicGothicDarkwaveTechno-IndustrialElectronicPop-FolkEurodanceDreamSouthern RockComedyCultGangstaTop 40Christian RapPop/FunkJungleNative AmericanCabaretNew WavePsychadelicRaveShowtunesTrailerLo-FiTribalAcid PunkAcid JazzPolkaRetroMusicalRock & RollHard RockFolkFolk-RockNational FolkSwingFast FusionBebobLatinRevivalCelticBluegrassAvantgardeGothic RockProgressive RockPsychedelic RockSymphonic RockSlow RockBig BandChorusEasy ListeningAcousticHumourSpeechChansonOperaChamber MusicSonataSymphonyBooty BassPrimusPorn GrooveSatireSlow JamClubTangoSambaFolkloreBalladPower BalladRhythmic SoulFreestyleDuetPunk RockDrum SoloA capellaEuro-HouseDance HallGoaDrum & BassClub-HouseHardcoreTerrorIndieBritpopNegerpunkPolsk PunkBeatChristian Gangsta RapHeavy MetalBlack MetalCrossoverContemporary ChristianChristian Rock MerengueSalsaTrash MetalAnimeJPopSynthpopFrame ID must have length 4AENCAPICCOMMCOMRENCREQUAETCOGEOBGRIDIPLSLINKMCDIMLLTOWNEPRIVPCNTPOPMPOSSRBUFRVADRVRBSYLTSYTCTALBTBPMTCOMTCONTCOPTDATTDLYTENCTEXTTFLTTIMETIT1TIT2TIT3TKEYTLANTLENTMEDTOALTOFNTOLYTOPETORYTOWNTPE1TPE2TPE3TPE4TPOSTPUBTRCKTRDATRSNTRSOTSIZTSRCTSSETXXXTYERUFIDUSERUSLTWCOMWCOPWOAFWOARWOASWORSWPAYWPUBWXXXFrame ID not detectedr+fopen: %s: id3v2Stripping id3 tag in ""...id3v1 id3v2 id3v1 and v2 stripped.Converting id3v1 tag to id3v2 in ... converted Deleting Frame in file ...,d';';GCC: (Debian 4.4.2-9) 4.4.3 20100108 (prerelease)zPR|  b AB zPLR|  $b AB S Hx/AB S l1AB Sj@AB AB .symtab.strtab.shstrtab.rel.text.rel.data.bss.rodata.gcc_except_table.rel.ctors.comment.note.GNU-stack.rel.eh_frame4 @&)P % ./P4P<IR N 2Y0$3bWvXr 2X T|  \# P:j@j   b 0AIXb kqxx/ !8X~convert.cpp_ZStL8__ioinit_ZL24ID3_v1_genre_description_Z41__static_initialization_and_destruction_0ii_GLOBAL__I__Z10GetFrameIDPc_Z10GetFrameIDPc__gxx_personality_v0strlen_ZSt4cerr_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6__ZNSolsEPFRSoS_Estrncmp_Unwind_Resume_Z9DeleteTagiPPciifopenstderrfprintfperrorfclose_ZN7ID3_TagC1EPKc_ZSt4cout_ZN7ID3_Tag5ClearEv_ZN7ID3_Tag4LinkEPKct_ZN7ID3_Tag5StripEt_ZN7ID3_TagD1Ev_Z10ConvertTagiPPci_ZN7ID3_Tag6UpdateEt_Z11DeleteFrameiPPciS__ZNK7ID3_Tag4FindE11ID3_FrameID_ZN7ID3_Tag11RemoveFrameEPK9ID3_Frame_ZNK7ID3_Tag10HasChangedEv_ZNSt8ios_base4InitC1Ev_ZNSt8ios_base4InitD1Ev__dso_handle__cxa_atexit !&.6V[#(LQuzBGkp8=af .3W\$)MRv{CHlq9>bg /4X] % * N S w |         D I m r         : ? c h          # ( 7 ? G O W               % - ;  ` ! "    "    "   '5#I#U !(%6=BJQVd#|#%-5=K p!{'(')%'#?#K*+,-  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHL$K`iid3v2-0.1.12/debian/0000755000175000017500000000000011353241266013253 5ustar nagilonagiloid3v2-0.1.12/debian/rules0000755000175000017500000000260211353241266014333 0ustar nagilonagilo#!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # This is the debhelper compatability version to use. export DH_COMPAT=1 build: build-stamp build-stamp: dh_testdir # Add here commands to compile the package. $(MAKE) touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp # Add here commands to clean up after the build process. -$(MAKE) clean dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs # Add here commands to install the package into debian/tmp. cp id3v2 debian/tmp/usr/bin # Build architecture-independent files here. binary-indep: build install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build install # dh_testversion dh_testdir dh_testroot # dh_installdebconf dh_installdocs dh_installexamples dh_installmenu # dh_installemacsen # dh_installpam # dh_installinit dh_installcron dh_installmanpages dh_installinfo # dh_undocumented dh_installchangelogs dh_link dh_strip dh_compress dh_fixperms # You may want to make some executables suid here. dh_suidregister # dh_makeshlibs dh_installdeb # dh_perl dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install id3v2-0.1.12/debian/docs0000644000175000017500000000001711353241266014124 0ustar nagilonagiloINSTALL README id3v2-0.1.12/debian/copyright0000644000175000017500000000047411353241266015213 0ustar nagilonagiloThis package was debianized by Robert Woodcock on Thu, 18 May 2000 21:29:11 -0700. It was downloaded from: http://download.sourceforge.net/id3v2/id3v2-0.1.3.tar.gz (see also http://id3v2.sourceforge.net/) Upstream Author(s): myers Copyright: This code is under the GPL. id3v2-0.1.12/debian/control0000644000175000017500000000044311353241266014657 0ustar nagilonagiloSource: id3v2 Section: sound Priority: optional Maintainer: Robert Woodcock Standards-Version: 3.0.1 Package: id3v2 Architecture: any Depends: ${shlibs:Depends} Description: A command line id3v2 tag editor Adds/Modifies/Removes/Views id3v2 tags, converts/lists id3v1 tags id3v2-0.1.12/debian/changelog0000644000175000017500000000071711353241266015132 0ustar nagilonagiloid3v2 (0.1.7-1) unstable; urgency=low * Fixed display/setting genre. -- Myers Carpenter Mon, 15 Apr 2002 21:34:40 -0400 id3v2 (0.1.6-1) unstable; urgency=low * Fixed perms on updated file. -- Myers Carpenter Tue, 19 Mar 2002 10:15:03 -0500 id3v2 (0.1.3-1) unstable; urgency=low * Initial Release. -- Robert Woodcock Thu, 18 May 2000 21:29:11 -0700 Local variables: mode: debian-changelog End: id3v2-0.1.12/debian/dirs0000644000175000017500000000001011353241266014126 0ustar nagilonagilousr/bin id3v2-0.1.12/id3v20000755000175000017500000014372511353241452012717 0ustar nagilonagiloELF04l4 ( 444444{{||$|$ $$HHHDDPtdLLLQtd/lib/ld-linux.so.2GNUGNUc+!0ƪw*.CI. H42<1 7 CD:A%-;0@9&+3$?6F(E8G5B >=/#!,')" * :e:=B$m C|CEK8qX (EL2 CxIk~[Dudq  |ha90nL>=%zDRO}6/ < =<.L<<@ ,Z<<`=Дd=libz.so.1__gmon_start___Jv_RegisterClasseslibid3-3.8.so.3_ZN7ID3_Tag11RemoveFrameEPK9ID3_Frame_ZNK9ID3_Frame8GetFieldE11ID3_FieldID_ZN7ID3_Tag6UpdateEt_ZN7ID3_TagD1Ev_init_ZN7ID3_Tag5StripEt_ZN9ID3_FrameC1E11ID3_FrameIDID3LIB_FULL_NAME_ZNK9ID3_Frame5FieldE11ID3_FieldID_ZNK7ID3_Tag10HasChangedEv_ZNK7ID3_Tag9NumFramesEv_Z13ID3_GetStringPK9ID3_Frame11ID3_FieldID_ZN9ID3_Frame5SetIDE11ID3_FrameID_ZN7ID3_Tag4LinkEPKct_ZN7ID3_TagC1EPKc_ZN7ID3_Tag11AttachFrameEP9ID3_Frame_ZNK9ID3_Frame9GetTextIDEv_Z13ID3_GetStringPK9ID3_Frame11ID3_FieldIDj_ZN7ID3_Tag5ClearEv_ZNK9ID3_Frame5GetIDEv_ZNK9ID3_Frame14GetDescriptionEv_ZNK7ID3_Tag4FindE11ID3_FrameID_ZNK7ID3_Tag14CreateIteratorEv_finilibstdc++.so.6_Znwj_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6__ZSt4cout_ZNSolsEi_ZNSolsEj_ZSt4cerr_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc__cxa_guard_acquire_ZNSt8ios_base4InitC1Ev_ZdlPv_ZNSt8ios_base4InitD1Ev__cxa_guard_release_ZNSolsEPFRSoS_E__gxx_personality_v0_ZdaPvlibm.so.6libgcc_s.so.1_Unwind_Resumelibc.so.6_IO_stdin_usedstrcpysprintffopenstrncmpoptindperrorchmodstrlen__cxa_atexitfseekfclosemallocstrcatsscanfoptargstderrgetopt_longfreadstrchrfprintfstrcmp__libc_start_mainfree__xstat_edata__bss_start_endGCC_3.0CXXABI_1.3GLIBCXX_3.4GLIBC_2.1GLIBC_2.1.3GLIBC_2.0 P&y 0ӯkt)$$ii 0si :ii F% <:<D<><E`=Fd=H%%%%%%%%% % % % %%%%%C%%%%%%&&& &&&&& & $&!(&",&#0&$4&%8&&<&'@&(D&)H&*L&+P&,T&-X&.\&/`&0d&1h&@l&2p&3t&4x&G|&5&6&7&8&9US[LtYOX[5%%%%%h%%h%%h%%h%%h %%h(%%h0%%h8p%%h@`%%hHP%%hP@%%hX0%%h` %%hh%%hp%%hx%%h%%h%%h%%h%%h%%h%%h%&hp%&h`%&hP% &h@%&h0%&h %&h%&h% &h%$&h%(&h%,&h%0&h%4&h %8&h(%<&h0%@&h8p%D&h@`%H&hHP%L&hP@%P&hX0%T&h` %X&hh%\&hp%`&hx%d&h%h&h%l&h%p&h%t&h%x&h%|&h%&hp%&h`%&hP%&h@1^PTRhPh`QVhiUS=h=u?l=$$9sl=$l=9rh=[]Ít&'U$tt $$ÐUE$;t.D$$ <D$$2 D$ED$$=u  D$ED$$u  D$ED$$u  D$ED$$u x D$ED$$u O D$ED$$pu & D$ED$$Gu D$ED$$u D$ED$$u D$ED$$u D$ED$$u Y D$ED$$zu 0 D$ED$$Qu  D$ED$$(u  D$ED$$u  D$ED$$u  D$ED$$u c D$ED$$u : D$ED$$[u  D$ED$$2u D$ED$$ u D$ED$$ u D$ED$$u mD$ED$$u DD$ED$$eu D$ED$$CD$ED$$du ?D$ED$$;u @D$ED$$u AD$ED$$u CD$ED$$u DvD$ED$$u EMD$ED$$nu F$D$ED$$Eu GD$ED$$u HD$ED$$u LD$ED$$u MD$ED$$u OWD$ED$$xu P.D$ED$$Ou QD$ED$$&u RD$ED$$u SD$ED$$u TD$ED$$u UaD$ED$$u V8D$ED$$Yu WD$ED$$0u XD$ED$$u YD$ED$$u ZD$ED$$u[nD$ED$$ u\HD$$ <UT$$D$$qD$$UVS0EEEE D$*$E}u5EE <T$D$-$L$9E$0D$$D$?$<EE D$$<D$V$$EE D$D$$HEtt4dD$$ED$[$<bD$$aED$b$<0D$$/ED$i$<D$w$<D$$A$#Ӊƍ$ډ$EE;E 0[^]UVS0EED$$HD$$<EE D$$<D$$$;EE D$D$$D$$ED$$<vD$$<$EӉƍ$ډ$E;E0[^]UVS0EED$$D$$<UT$$D$$EE D$$<D$$D$$+$EE D$D$$8E$EED$$EHED$$E}tEE$ҋED$${E}u$?tD$$E$1EӉƍ$ډ$E;E]0[^]U}u2} u)$p=D$&D$p=$$UD$$ÐUE3U+‹E9uU+E/9EuUVS EtU+U+D$$<St$$GD$$7\$$+D$$E/;Ev [^]U(E&E$6D$ED$$E6;EuUSƅ[E $X`Džd ``$҉\[tJD$&$<KUT$$$D$@$D$$wd=D$G$<\$$D$$AD$$1D$P$<mD$$ D$$MD$$[]UWVS1DŽ$0DŽ$0DŽ$0DŽ$0DŽ$0=u$=\$01$01$01$01$01$01$01$01$02$02$0(2$082$0H2$0X2$0h2$0x2$02$02$02$02$02$02$02$02$03$03$0(3$083$0H3$0X3$0h3$0x3$03$03$03$03$03$03$03$03$04$04$0(4$084$0H4$0X4$0h4$0x4$04$04$04$04$04$04$04$04$05$05$0(5$085$0H5$0X5$0h5$0x5$05$05$05$05$05$05$05$05$06$06$0(6$086$0H6$0X6$0h6$0x6$06$06$06$06$06$06$06$06$07$07$0(7$087$=$0D$D$ 1D$E D$E$_$0$0u#$0uE $${$0u<;E($0$0u$0$0$0y$0$0$0T($0`=T,$0E $9$`=<T$ D$E D$E$+$E $$$zE $$a<D$E D$E$H$:<D$ D$E D$E$M$ <D$ D$E D$E$$<D$ D$E D$E$$<D$E D$E$$fp1 fp1$0D(=$0`=T,$0$0D($0`=T,$0$0D(/$0`=T,$0x$0D($0`=T,$0KDŽ$0`=$0T$D$$$0=u`=$$0$0=u`=$00$0D$D$$u/$$u/$0$0D( $0$0T,$0$0D(P$0`=T,$0Z$0D(D$0`=T,$00D$$ <D$$$kD$$ <D$$$6<$0D$$h$$0E $t0T$$tI$0E D$$ <P\$$DD$$4Z$0E D$$$0$0u>$0E <T$D$$"$%$0$p1Ћ$0E T$D$$h$m$0DŽ$0$ÉD$$$0$0tE։lj$/D$+$< D$$$^$0D(D$$0$$0D(D$$h$R$1$0D(]$1tE$1D$$h$:$1$1t$1$1$ҋ$0D,fD$$0$R $0T,T$$ы$0D$$h$:$1tE$1D$$h$$1$1t$1$1$ҋ$0D,eD$$0$D$$ҋ$0D,D$:$$ 1$ 1u4D$$0$E $0T,T$$r$ 1$ 1D$ $0$ $0T,T$$D$$0$ $ 1T$$D$$0$o$1$1$1t$1$$0D$$h$pDŽ$1DŽ$1$1D$$1$$1$1(>>JU.$ @ ,oă, P %h08ooo $Ƒ֑&6FVfvƒ֒&6FVfvƓ֓&6FVfvƔ֔&PVckqw| &07>HUZ`epw}&-2:AOX_ow #)18BMYj{$)/5>ER`joy $.EU^dpv{ &-37;?FKR]imy%0ASZaj|#+18BLRX`lv{%,;DKRZ`nu~  +/;FOV\dny~ "'8=FK\d     (-AFafv{!9>W\sx !"$*+,-"'.,F/Lo0t12357898:@`;e{<=>?@3A8FCKUDZwE|FGHL MEOJhPmrQwRSTU V.W4VX[yYZ[\] K!',3;@FNU[_cgnsz  '-8=BGMXi{'0<AKSY`jtz +:DMTclsz)3=HSWcnw~ &+ h f L v% l* d4 s> DI CQ 1\ 2g rt a{ A t c g y T                           ! !& "+ $0 *5 +: ,? -D .I /N 0S 1X 2] 3b 5g 7l 8q 9v :{ ; < = > ? @ A C D E F G H L M O P Q R S T U V W X Y Z [ \   ' - 3 8 ? G L R Z a g k o s z                    ! , 3 9 D I N S Y d u                  + 3 < H M W _ e l v                  &7FPY`ox&+5?IT_coz ,27`7{"JIc(Zt)U`YkAXhfa= p9:}27zxb40|6TPQsw$;~&1[O#d!./?VG- MR@ B' g K 5>mul\C]+yDLWvNrnEo_i*%8,eS^jq3<FHGCC: (Debian 4.4.2-9) 4.4.3 20100108 (prerelease)GCC: (Debian 4.3.4-8) 4.3.4.symtab.strtab.shstrtab.interp.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.gcc_except_table.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment44#HH 1hh$H8DoăhN ,,VP^o  koz 008 hh @@0pp00K,,aHHa/LL|$|$$$%%&p  <h 0N^l C  4Hhă,  0 h @ p 0,HL|$$$$%%& < |$$($5`Kh=Zl=ht$$p=&PN@6t= )P?+ @OJjx= /Pt=1@U`7PH%{${$$9& D$X9dwP0F+h'< K _sHzb , < 4XT\/h22"CLRb<t&<$?Qaq<&$ !`Z1GYFmt ~;/)>Up1^<j|= # k `=}   <  Д " : L \ 9Pf  d=   i @ crtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.5937dtor_idx.5939frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxconvert.cpp_ZStL8__ioinit_ZL24ID3_v1_genre_description_Z41__static_initialization_and_destruction_0ii_GLOBAL__I__Z10GetFrameIDPclist.cpp_ZL10frameTable_GLOBAL__I_frameTableCountid3v2.cpp_ZGVZ4mainE12long_options_ZZ4mainE12long_options_GLOBAL__I_UpdFlagsgenre.cpp_ZL11genre_count_GLOBAL_OFFSET_TABLE___init_array_end__init_array_start_DYNAMIC_ZNK9ID3_Frame14GetDescriptionEvdata_start_Z13PrintID3v1TagPcgenre_tablesprintf@@GLIBC_2.0_ZNSolsEi@@GLIBCXX_3.4__cxa_atexit@@GLIBC_2.1.3__libc_csu_fini_start_ZNK9ID3_Frame8GetFieldE11ID3_FieldID_Z9DeleteTagiPPcii__cxa_guard_acquire@@CXXABI_1.3__xstat@@GLIBC_2.0_Z10PrintUsagePc__gmon_start___Jv_RegisterClasses_ZN7ID3_Tag5StripEt_fp_hw_Z10GetFrameIDPc_ZdlPv@@GLIBCXX_3.4strchr@@GLIBC_2.0_fini_ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4_ZSt4cerr@@GLIBCXX_3.4_ZNK7ID3_Tag4FindE11ID3_FrameID_Z16PrintInformationPcRK7ID3_Tag_Z14GetDescription11ID3_FrameID_Z10ConvertTagiPPci__libc_start_main@@GLIBC_2.0_ZN7ID3_Tag11AttachFrameEP9ID3_Framechmod@@GLIBC_2.0__statstat_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4perror@@GLIBC_2.0_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4_IO_stdin_usedfree@@GLIBC_2.0optind@@GLIBC_2.0__data_startgetopt_long@@GLIBC_2.0fseek@@GLIBC_2.0_ZNK9ID3_Frame5FieldE11ID3_FieldIDfclose@@GLIBC_2.1__cxa_guard_release@@CXXABI_1.3_ZN7ID3_Tag5ClearEvstderr@@GLIBC_2.0_ZNK9ID3_Frame9GetTextIDEvstrlen@@GLIBC_2.0_ZN7ID3_TagD1Ev_Z7ListTagiPPcifopen@@GLIBC_2.1_ZSt4cout@@GLIBCXX_3.4_ZNK7ID3_Tag14CreateIteratorEv__dso_handle_ZN7ID3_Tag11RemoveFrameEPK9ID3_Framestrcpy@@GLIBC_2.0__DTOR_END___Z11DeleteFrameiPPciS___libc_csu_init_ZN7ID3_Tag4LinkEPKctprintf@@GLIBC_2.0_Z14PrintGenreListv_ZNSolsEj@@GLIBCXX_3.4_ZN9ID3_Frame5SetIDE11ID3_FrameID_ZN7ID3_TagC1EPKc_Z13GetGenreCountv_Znwj@@GLIBCXX_3.4_Z12PrintVersionPc_Z15GetGenreFromNumiframeTableCountfprintf@@GLIBC_2.0_Z14PrintFrameHelpPc_ZNK9ID3_Frame5GetIDEvUpdFlags__bss_startmalloc@@GLIBC_2.0_ZNK7ID3_Tag10HasChangedEv_ZdaPv@@GLIBCXX_3.4strcat@@GLIBC_2.0_end_ZNSolsEPFRSoS_E@@GLIBCXX_3.4_ZN9ID3_FrameC1E11ID3_FrameIDsscanf@@GLIBC_2.0strncmp@@GLIBC_2.0_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4optarg@@GLIBC_2.0fread@@GLIBC_2.0_Z13ID3_GetStringPK9ID3_Frame11ID3_FieldID_edata_ZN7ID3_Tag6UpdateEt__gxx_personality_v0@@CXXABI_1.3_Z13ID3_GetStringPK9ID3_Frame11ID3_FieldIDj_Unwind_Resume@@GCC_3.0strcmp@@GLIBC_2.0exit@@GLIBC_2.0genre_map_ZNK7ID3_Tag9NumFramesEvID3LIB_FULL_NAME__i686.get_pc_thunk.bx_Z15GetNumFromGenrePKcmain_initid3v2-0.1.12/create_map.cpp0000644000175000017500000000250011353241266014632 0ustar nagilonagilo// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "genre.cpp" #ifndef SORT_RUNTIME int CompareGenres(const void *a, const void *b) { int g1, g2; g1 = *((int*)a); g2 = *((int*)b); return strcmp(GetGenreFromNum(g1), GetGenreFromNum(g2)); } #endif // SORT_RUNTIME int main(int, char**) { int i; for (i=0; imul\C]+yDLWvNrnEo_i*%8,eS^jq3<FHBluesClassic RockCountryDanceDiscoFunkGrungeHip-HopJazzMetalNew AgeOldiesOtherPopR&BRapReggaeRockTechnoIndustrialAlternativeSkaDeath MetalPranksSoundtrackEuro-TechnoAmbientTrip-HopVocalJazz+FunkFusionTranceClassicalInstrumentalAcidHouseGameSound ClipGospelNoiseAlternRockBassSoulPunkSpaceMeditativeInstrumental PopInstrumental RockEthnicGothicDarkwaveTechno-IndustrialElectronicPop-FolkEurodanceDreamSouthern RockComedyCultGangstaTop 40Christian RapPop/FunkJungleNative AmericanCabaretNew WavePsychadelicRaveShowtunesTrailerLo-FiTribalAcid PunkAcid JazzPolkaRetroMusicalRock & RollHard RockFolkFolk-RockNational FolkSwingFast FusionBebobLatinRevivalCelticBluegrassAvantgardeGothic RockProgressive RockPsychedelic RockSymphonic RockSlow RockBig BandChorusEasy ListeningAcousticHumourSpeechChansonOperaChamber MusicSonataSymphonyBooty BassPrimusPorn GrooveSatireSlow JamClubTangoSambaFolkloreBalladPower BalladRhythmic SoulFreestyleDuetPunk RockDrum SoloA capellaEuro-HouseDance HallGoaDrum & BassClub-HouseHardcoreTerrorIndieBritpopNegerpunkPolsk PunkBeatChristian Gangsta RapHeavy MetalBlack MetalCrossoverContemporary ChristianChristian Rock MerengueSalsaTrash MetalAnimeJPopSynthpopUnknownGCC: (Debian 4.4.2-9) 4.4.3 20100108 (prerelease)zPR|  AB < ;AB XEAB .symtab.strtab.shstrtab.rel.text.rel.data.bss.rodata.comment.note.GNU-stack.rel.eh_frame4 8 )  % L /4@<0 3EC YD pU   cH   h P)< :PF`PP cx ;Egenre.cpp_ZL24ID3_v1_genre_description_ZL11genre_countgenre_tablegenre_map_Z13GetGenreCountv__gxx_personality_v0_Z15GetGenreFromNumi_Z15GetNumFromGenrePKcstrcmp . ?S {   $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLP$@\id3v2-0.1.12/id3v2.10000644000175000017500000000262311353241266013045 0ustar nagilonagilo.TH ID3V2 1 "May 2000" "" "User Command" .SH NAME id3v2 \- Adds/Modifies/Removes/Views id3v2 tags, converts/lists id3v1 tags .SH SYNOPSIS .B id3v2 .RB [ .I OPTION .RB ] ... .RB [ .I FILE .RB ] ... .br .SH OPTIONS .TP .B \-h, \-\-help Display help and exit .TP .B \-f, \-\-list\-frames Display all possible frames for id3v2 .TP .B \-L, \-\-list\-genres Lists all id3v1 genres .TP .B \-v, \-\-version Display version information and exit .TP .B \-l, \-\-list Lists the tag(s) on the file(s) .TP .B \-R, \-\-list-rfc822 Lists using an rfc822\-style format for output .TP .B \-d, \-\-delete\-v2 Deletes id3v2 tags .TP .B \-s, \-\-delete\-v1 Deletes id3v1 tags .TP .B \-D, \-\-delete\-all Deletes both id3v1 and id3v2 tags .TP .B \-C, \-\-convert Converts id3v1 tag to id3v2 .TP .B \-a, \-\-artist ARTIST Set the artist information .TP .B \-A, \-\-album ALBUM Set the album title information .TP .B \-t, \-\-song SONG Set the song title information .TP .B \-c, \-\-comment DESCRIPTION:COMMENT Set the comment information .TP .B \-g, \-\-genre num Set the genre number .TP .B \-y, \-\-year num Set the year .TP .B \-T, \-\-track num/num Set the track number/(optional) total tracks .SH SEE ALSO id3tag(1), id3info(1), id3convert(1) .SH AUTHOR .B id3v2 is by myers with major portions used from id3lib examples. Manual page written for Debian GNU/Linux by Robert Woodcock . id3v2-0.1.12/INSTALL0000644000175000017500000000051411353241266013062 0ustar nagilonagiloTo Install: 1) Download id3lib version 3.8.3 from http://id3lib.sourceforge.net 2) tar zxvf 3) cd into id3lib. 4) type "./configure" 5) type "make" 6) type "make install" as root 7) cd back into this diretory 8) type "make" 9) type "make install" as root "id3v2 --help" for information on use. id3v2-0.1.12/.git/0000755000175000017500000000000011353241377012675 5ustar nagilonagiloid3v2-0.1.12/.git/hooks/0000755000175000017500000000000011353240717014015 5ustar nagilonagiloid3v2-0.1.12/.git/hooks/pre-applypatch.sample0000755000175000017500000000061611353240717020157 0ustar nagilonagilo#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : id3v2-0.1.12/.git/hooks/post-commit.sample0000755000175000017500000000024011353240717017472 0ustar nagilonagilo#!/bin/sh # # An example hook script that is called after a successful # commit is made. # # To enable this hook, rename this file to "post-commit". : Nothing id3v2-0.1.12/.git/hooks/prepare-commit-msg.sample0000755000175000017500000000230311353240717020731 0ustar nagilonagilo#!/bin/sh # # An example hook script to prepare the commit log message. # Called by git-commit with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" id3v2-0.1.12/.git/hooks/commit-msg.sample0000755000175000017500000000157611353240717017310 0ustar nagilonagilo#!/bin/sh # # An example hook script to check the commit log message. # Called by git-commit with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } id3v2-0.1.12/.git/hooks/post-receive.sample0000755000175000017500000000105011353240717017624 0ustar nagilonagilo#!/bin/sh # # An example hook script for the "post-receive" event. # # The "post-receive" script is run after receive-pack has accepted a pack # and the repository has been updated. It is passed arguments in through # stdin in the form # # For example: # aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master # # see contrib/hooks/ for a sample, or uncomment the next line and # rename the file to "post-receive". #. /usr/share/doc/git-core/contrib/hooks/post-receive-email id3v2-0.1.12/.git/hooks/applypatch-msg.sample0000755000175000017500000000070411353240717020155 0ustar nagilonagilo#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : id3v2-0.1.12/.git/hooks/update.sample0000755000175000017500000000703111353240717016506 0ustar nagilonagilo#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by git-receive-pack with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git-cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 id3v2-0.1.12/.git/hooks/pre-rebase.sample0000755000175000017500000001151611353240717017254 0ustar nagilonagilo#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git-rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git-rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git-rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git-rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git-rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git-rev-list --pretty=oneline ^${publish} "$topic"` perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi exit 0 ################################################################ This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git-rev-list ^master ^topic next git-rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git-rev-list master..topic if this is empty, it is fully merged to "master". id3v2-0.1.12/.git/hooks/post-update.sample0000755000175000017500000000027511353240717017474 0ustar nagilonagilo#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git-update-server-info id3v2-0.1.12/.git/hooks/pre-commit.sample0000755000175000017500000000305011353240717017275 0ustar nagilonagilo#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by git-commit with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git-rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test "$(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0')" then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi exec git diff-index --check --cached $against -- id3v2-0.1.12/.git/branches/0000755000175000017500000000000011353240717014457 5ustar nagilonagiloid3v2-0.1.12/.git/ORIG_HEAD0000644000175000017500000000005111353240742014130 0ustar nagilonagilo4496ea5a6a2931363792c0aa5237863140174927 id3v2-0.1.12/.git/COMMIT_EDITMSG0000644000175000017500000000006611353241377014766 0ustar nagilonagiloOnce again now from git://github.com/nagilo/id3v2.git id3v2-0.1.12/.git/index0000644000175000017500000000314011353241377013725 0ustar nagilonagiloDIRCKBKBU.lyA9 3/*FCOPYINGKBKBG#⛲CK)wZS ChangeLogKBKBU.Lqpi6c-toY INSTALLKBKBU.T^. .u+MakefileKBKBU. $80+Țzqm0m:READMEKBKBG#⛲CK)wZS build-stampKBKBG#Rah۬JpgjRi convert.cppKBKBU.@F$& I'w95create_map.cppKBKB[/ wm(ѐrdebian/changelogKBKB[/#Ϊ faM-=u!qdebian/controlKBKB[/<|zd9ȍaI debian/copyrightKBKB[/ rHU$7IgJ5 debian/dirsKBKB[/7:BaB>7I debian/docsKBKB[/F{@r ct debian/rulesKBKBU.|7u`dx԰D1kz frametable.hKBKBU. `*ع#JL genre.cppKBKBU.'`||8tgenre.hKBKBU.$^Ϙ-'b yid3v2.1KBKBU.l@)3x DhR9 id3v2.cppKBKBU.Y4@UWPﴋV~ id3v2.specKBKBU.0I`=SqV8%list.cpp FN;?U. /57id3v2-0.1.12/.git/FETCH_HEAD0000644000175000017500000000013311353240742014222 0ustar nagilonagilo394cd57851ba1b58e67f5b4e5dc7dc0a149955e5 branch 'master' of git://github.com/nagilo/id3v2 id3v2-0.1.12/.git/config0000644000175000017500000000043311353240724014060 0ustar nagilonagilo[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = ssh://nagilo@id3v2.git.sourceforge.net/gitroot/id3v2/id3v2 [branch "master"] remote = origin merge = refs/heads/master id3v2-0.1.12/.git/HEAD0000644000175000017500000000002711353240724013313 0ustar nagilonagiloref: refs/heads/master id3v2-0.1.12/.git/refs/0000755000175000017500000000000011353240724013627 5ustar nagilonagiloid3v2-0.1.12/.git/refs/heads/0000755000175000017500000000000011353241377014720 5ustar nagilonagiloid3v2-0.1.12/.git/refs/heads/master0000644000175000017500000000005111353241377016132 0ustar nagilonagilo7523fa9e308b853834020aba883897f2ddf2c205 id3v2-0.1.12/.git/refs/tags/0000755000175000017500000000000011353240717014567 5ustar nagilonagiloid3v2-0.1.12/.git/refs/remotes/0000755000175000017500000000000011353240724015305 5ustar nagilonagiloid3v2-0.1.12/.git/refs/remotes/origin/0000755000175000017500000000000011353240724016574 5ustar nagilonagiloid3v2-0.1.12/.git/refs/remotes/origin/HEAD0000644000175000017500000000004011353240724017212 0ustar nagilonagiloref: refs/remotes/origin/master id3v2-0.1.12/.git/description0000644000175000017500000000011111353240717015131 0ustar nagilonagiloUnnamed repository; edit this file 'description' to name the repository. id3v2-0.1.12/.git/info/0000755000175000017500000000000011353240717013625 5ustar nagilonagiloid3v2-0.1.12/.git/info/exclude0000644000175000017500000000036011353240717015200 0ustar nagilonagilo# git-ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ id3v2-0.1.12/.git/logs/0000755000175000017500000000000011353240724013634 5ustar nagilonagiloid3v2-0.1.12/.git/logs/HEAD0000644000175000017500000000057311353241377014272 0ustar nagilonagilo0000000000000000000000000000000000000000 4496ea5a6a2931363792c0aa5237863140174927 Norbert 1269645780 +0100 clone: from ssh://nagilo@id3v2.git.sourceforge.net/gitroot/id3v2/id3v2 4496ea5a6a2931363792c0aa5237863140174927 7523fa9e308b853834020aba883897f2ddf2c205 Norbert 1269646079 +0100 commit: Once again now from git://github.com/nagilo/id3v2.git id3v2-0.1.12/.git/logs/refs/0000755000175000017500000000000011353240724014573 5ustar nagilonagiloid3v2-0.1.12/.git/logs/refs/heads/0000755000175000017500000000000011353240724015657 5ustar nagilonagiloid3v2-0.1.12/.git/logs/refs/heads/master0000644000175000017500000000057311353241377017107 0ustar nagilonagilo0000000000000000000000000000000000000000 4496ea5a6a2931363792c0aa5237863140174927 Norbert 1269645780 +0100 clone: from ssh://nagilo@id3v2.git.sourceforge.net/gitroot/id3v2/id3v2 4496ea5a6a2931363792c0aa5237863140174927 7523fa9e308b853834020aba883897f2ddf2c205 Norbert 1269646079 +0100 commit: Once again now from git://github.com/nagilo/id3v2.git id3v2-0.1.12/.git/packed-refs0000644000175000017500000000013611353240724014777 0ustar nagilonagilo# pack-refs with: peeled 4496ea5a6a2931363792c0aa5237863140174927 refs/remotes/origin/master id3v2-0.1.12/.git/objects/0000755000175000017500000000000011353241377014326 5ustar nagilonagiloid3v2-0.1.12/.git/objects/55/0000755000175000017500000000000011353241377014557 5ustar nagilonagiloid3v2-0.1.12/.git/objects/55/c79b71e2fdc46293bde19d5fb6696859a874080000444000175000017500000000076611353241377021704 0ustar nagilonagilox+)JMU0`040031Qpsgђ叒e6КSꓟlٛ.^s\WuГPE~!>> 6&ӭ/6q$/TobvjZfN*CH=v>O}WX6TM+E-ڧC,X0 "43'E$1{RJ 3FWAegn\XXVU߫wqzUg,ljb )Iy V\d 蔼wznAJ+JM-ILI`0/t!!ʆW.[b]UW ue//o|\(zMjjbP%)eFz *qgȋTOR<0'ۃ(J@Aa\1O.tss RNm4p8|[&A,3;lك(.P,Bu{jCid3v2-0.1.12/.git/objects/75/0000755000175000017500000000000011353241377014561 5ustar nagilonagiloid3v2-0.1.12/.git/objects/75/23fa9e308b853834020aba883897f2ddf2c2050000444000175000017500000000027111353241377021552 0ustar nagilonagiloxm1CsVs0T0f!IʏT Ԏ ڿN$$AL"dEk&w{Nu8BYLHUBstsZksŽ~,. k]w.8gul?*&ܱT83. %/LLid3v2-0.1.12/.git/objects/pack/0000755000175000017500000000000011353240724015237 5ustar nagilonagiloid3v2-0.1.12/.git/objects/pack/pack-6f627446ec3005e824b98df6ba558afc5a5d65f1.idx0000444000175000017500000000704411353240724024342 0ustar nagilonagilotOc  !!###$$$$$$$$$$$%&&&&&&''')))++,,,,----........//1333333333444444555566666667777888888999999::::;<<<<<<<<=>????@AAAABBCCEEEEEEEEEEEEEEFFFFFFFFGGHJJJLMMMNNNPPPQQSTTUUUUVVXZZZ["hsroiSG-F]2-&NNcZ9]~׷ W!2n+a =%3ażjgz(Kv4vZdKG՞lt+7ta;0HL55%'Jd{rd21Se3re+#<ö4tͣG<_LV~2!fP5僭 +p"yՄ\Nm#igGءYf-['8 eR(ZeMpи(DŽ:G !{ GMP)3x DhR9,+^r \ۄ.\s6šc4!4hq5 ZDe5G7u`dx԰D1kz80+Țzqm0m:9LxQX[N] UNL%i6&AK [dn(܍^BLgDǪ5zX }D#ZVn=DZj)167R71@I'F$Y 6mVPSOF$& I'w95K]Bn`K֒IKk3ȞɿQD#BId>MJ+y NAbRQ6G*Qi~ooqvCRah۬JpgjRiTL^JjrT^. .u+Wp蓝WJb6' txzaoU=X”1.qpi6c-toY ukųUlԠ,n1iyA9 3/*F$^Ϙ-'b y߃n3t | ŤMl%` f*+|]qqv I= zcքWJXEh8ߝD# ӂOL]6, `"!{gY_G7:BaB>7IEFߑ|`o:AdNBHweBW].13AJI"L,8ՋYN?:lμ-ѠbgǢ)EGlF{@r ct/-1Z,({W8ώT`&iԽ敄:cMo?|zd9ȍaI €S/B}Ok]& @,ݣy6J⯝\FDY4@UWPﴋV~b{Ҩ0|I'cأ ،[C_\viXع̂yEx|$_44{`~DRk['`||8tLz1b`=SqV8%⛲CK)wZSrHU$7IgJ5޵;*GVYjS韹Ϻ0,SdrO_rc5U/Ϊ faM-=u!q#.n_ zЂ~&L1?IB?xj(=:<mR[a$+xSkFwm(ѐr`*ع#JL nFlOߤ:IkC,{\EݜH5?NUԚ] )7%kQ ;̕^XgW#Pѩ)"BP ǔXY0k[y.2@Tj,5A #ݿcp)neyTqma\9`Hvo38g6}MN¶BXR[!։) U㯱mTtہCO?rP56U4s+@lTZjU 2- 9g?"NдNr.ag4]AOc^F8>]@82c.VIg%M0yCш%:W;tx?noanv)U?p*#P6މRG{ژX rplmM=ahf" eDYZ<$ qI/9 Y<I 1 WM(g2;Oc0QVHwl:un=Bl8n#p cSl8 lIE::l[VQ"?[GVEg^/a$x_*‡bs^c LA id3v2-0.1.12/.git/objects/pack/pack-6f627446ec3005e824b98df6ba558afc5a5d65f1.pack0000444000175000017500000011643611353240724024502 0ustar nagilonagiloPACK[xuJ1 }>tz.=tX@"<};i?BC׫ݪk}oL[SDxu;0bKRq! h8^'V>+!N $*̛cF5TPiN#Yg˖Q5(n wp^g+|R5}s%bFc)߭WhN(ҎS )zڰ0yonP#xQK0 WKaH#PJ; ځl58l__%=Z{T28=փQ;7x֎f8T4憙RA;u*4vfn C~AQL፳\໙/s«5=$N^G՟:mB.k CX \9/tY0Hz>U'!o:y*(x'@9i~LX` i51rln:T1˓1t.5'ɥMB/j2sE8o's4 t'e!q#7,@ey_d1{3dg`.p޼kwixKN0>E/g4r !$6= 8=Yq֯J7LJkDgmti\] ڙGhHZ|\+gQc$/}"+Ejp/y#-]2]`Rv:A*)rƒ{cJPq_qCJGƘY?:z뙔v87Cg.>0v<*jtG'Jx=N0FbJ?kHQQ9΢+Pk#f эќ&;Yq$"V. 0Zl5MzLqR&\$m R#4KK^mE:=) 8m O(5]n|x$,V2n\jdmk; [˶-HqÒ Yb]x;j0{6 ?[?aH"@~zؒd9}+af0IS4ZF:\4k 9 z%SLF+3MZ*zAessY4c^5_6G}ʉW8$gO(o'zw=cs'BpTyuN}Lw\eXoC _[)xQj0)\Rز?KYM;)Pt3|?3)AkXږRMw6/۶cV3F ڪ)սJKhPZ O?c&{8OPcQM+h9yH2P@p@kɊgn oE`wC;I|h_w!m-{z[9GʦT?"%;e* "xj1F<\Vf BqG܍Xh>C7FQI_&%]cb$xnH9H kN%䘃:;`T fk}(&=6Koi|%m+6;-Ӗ-Ѻr~#S~>z?No?;JxMJ0yW iQqĉ+8MNB\r+u܁ykaF R g vMn 襰ͅ V6h"G1kzc6^\ȥRhZoRN| * W'o^C߈{u 5o uIʈ6F3c PijvzaX#xz>mdvxJ0EY*BL^D\t$ڤn9jCgD!bBHsvxb벛';GR0[2Bs .z$Sd |׵uxo=JWH^+_^wNCmU_iBtOROYVd(kiZԅU>w>IWӺJ2mp *#l妿VbY8q]ܗxJ0F}(:C "rқ6&%Iǧ77MJUCܘ:P[ n{YWDj,ŦL % F4FWbN@D4O W~dj:;E+ˮ,(5ˉouhnbmO#VAIOl0Fpp>aW>t@ޜ_-߀QxAj0E:,"[B74XKFWˮ{Ҙ8!} 4 ;894GT6."2n`qܹg'VR |e|+COp6VuvmV]g^7Zi'Vrށַo(8 &xxXV_֝xMn0>쑑=qP ;V`쌃U ǭ5{[զ3 f~lzFܨ\14k^iAiRw8.aO ᅇ)S6̟5AQR9Nf#[;x!K6oUR*gG!iyK?>wtYDxKj1D:E~'u 4roB$ɑ pІS)H'VlT;C\ Q@NqD[AR(09ei~_8/Fpā\0_7Ri%^㜍ީ}m#8ܾ~iC`)[Vi\a0@2JiL._`x;k0w;t31zEK()K+lP߫@|S2X)|{MgP .L^wƱ 3-VA6w6#pM_g<~!5'qi{B~`Mx 0 @{4N#!C084USFMu&g QYPȘS01J@QC0O{He?)>;E~ knp/J?D|ν˟aL &e/CxPN0[Bq7cGBk={sĎ#_)fZe/EōFx23 #*yK.خ heN֦0.3EG *ù rfDzUVPI9)%ܓWZT\P2gro 5tQ÷(20ݸl ջ-GoCǧw[d::(;Ӓ;- ߕ+u&`y]{:Uo '&3*m.$>s+n1AU.[bkx1bLHKeMØ~CtH<[$*K[Ӊ}F#yHn[)9S2yʵ'ڕDa.yܖ5S:iQ^W(&ʁڇpS^eW#8&*pT%>l} ELK%gI^ x+^0qą!PE.mR`ՅomK#8bЎֹ+JkzѴ|@uJOmy$@%7ɃW$rD=W- SI-m{>Ǵ\[S8pkWX%4=cT'[*p DYfG!x_"ٕoxhOԔ߹U{UNJ2V1O喕h1*sg -yVZaL`( v[+K|,9'U2ȸ>[rKRUBl{eHiuSWF<ͩXj"IUzn# Gz^!-H`f‹ԤT%%yȭ 5 /#B>o8|xkdN h g- *Ǵڴ7%x E|D>݊UmG 61%h}g ,v[ :f cHi":[a 䏼͹+"s&Mlr^X1YVnowt'{g $=6W=n冏3pdkbQye1.#EdeK՗LЗ])BB%[60~57 VdH̙mK1^υ3m|U/eʿ"`#7ϱW`bvoU^t$}0p{/r'C~B6 `켅 %T+1>p";ĩ6ub`!MK׆CiLg/[vI/^5LRyKh`h".a VhlD} C O `"}HX`25x˽rD 3"D,J6. :"M<$Vڱ,݁mG35PvۦH,("3Y쩠`ᖉ#f(`8Kok^ &}RZ͑HZDh#aϰQ#[=eB. 8SJr%eI2-1$" /)l-eOqI &$TM]vmph\i L^'K@t"p>c cAG6^.>p7}{ RQvz*b 6![@{#=, a ZơrIJML>3+g|Dj+B,kCeT\% 4f\.o]3]`GKI;&;ː"=>lOCM!! @uy I:2S:$kRPޤY :ؒתכ/Ν͘ڰEFM/%AX8b'Kibǔ(6$FRBsp$LbRQg| iopdB<[03h Q)h_ʡ$ Ƴ eIG$`Y!3&'2wY~jYs86耔 V\~2 6;f}q|"BClrhN?`|e/'|4dJ4٫l>ïxzt9pXKz;$c5 &JPf@ rR{=T4ӒZ29h\]K|l3*cdLUYy{sֿ͚ F}am%m wހ (5+[,s`(9={:; eΏ(KFuȔlx" ݶ86K6WD)?giqy##FkuU4"L F.@r"ˬ|ĭ$G3k +m+@$TA3 f?AUɢ f;LLX_3ms:rvL Ñp Kj!JeT4rci8,f5Zth! u%Mf󔲱xxè65۝{ Bo⬼J15m}מoԮ{j2BkTiRݏ_LA+Z;5'__{RM;x =)ελI 'W6Pdo \K('Վyo:iY[܊Ήapp6 @]ޑ|p*Ml)DN!lH\@׺OpE9);KiJo@raZZ5Pc|4aoZyMz ϛs ⓴FJ.=z_ez j udVֈb8pp#Ŝ>ExǪ`ֽAf%Pa2]7Ni3Be"cN1;*!ÃS@~\}ȷN dr. )Optc["$I_}Ȋk{d!.Y!]v"$pلDu%,=M*L0vܣ$@$&.+!V)dS~rOZֿJ̣ )iۘrQ0 C9`% yyc*72]2j>-䩵$QO4nHWmJ5I9A;[rɱX8(gI ؐ=+L 4 ه)/8-]Z IJrdsJym99,3݈P@~Ҙ; 3|JBkOSgK)%E wMg1R]Q(Cj51ۼ4!/hL᱗xVpCe$Ӛ8QOF>L׺#.Jeqդv{y ?I;E=%ӓE޴gbu+>Op gVD<><8t|Wvm#]^ GSFچ4*DhHqyw 1p~<#ZpՎ\G( ;:zYu:I>Wh q#Yy ͈4s GejsV]6L00A! ߭ka#JH$[\u騣7*=M  H"z~,|Sgr?̀l{j!O驍,wTW i?Rt! Md\V`Y۬]s$V K;F%<%sQ29 i&lwztꐂ2qW_(H51B` c|8ޔEnZX`Zb@T Us%f0-c:AWKh*rE“dV7cNƥ%CyT*O-.^JJa\"vOT"'Q:7$?r΄iJ蛳/Glڳ}ؗ#2%d|S .vlZ`IL U m1 <Ǒaͧ3Pzt"7xKwj";>`2ڦs>;Gީ"f-$ \4K~ǎ|>sDgWdnqE:;_e%R>ҥBPj_K)=$HVL6XQ曏#b% *p3k3$-u.EHG>m ǛN&XktJ󴋏,K08 ) ZRHa\^J#+w$8_TTD()=Ϥ^{䄒歹>Ԙ=6'"6{8ʆr/ Р ڴR=Μlk"juo5lÎ]Ư̳{Ԏ&wOv'w;ÍW,[Zu+' ưgR:SUPˆA[)"(C &P%'RF^UFu- sN}{h3edEHvY)i!OU^%5"*&W}u4K{Kɭs6A# d=eTE9 ŕJV՚\mzi%ft+>Q/v!A_1 ]y3TryrQ:A eDxX_xDO%::vP6K (c=mbPORC[R['mMfmЍM9\z $Wߏ>*!z|BnJMëk#?u'y ɶ:ȽH׏LJN_-ЎPLߪM:ڇl-W5QP>cP?I' 8мƇ h+;QCEfB2xn!t҃犞UEmL_}/G5m'?QChaDu[,Xᆣd߹?BB70j7(ħeu32m?oǾԤ}X}Fw ?(mk.H5H*-%ܚwiW'PxigӥԥjlzKܢzGz.oWy&H7(7,2[oZ=}1R"qSfPb.qKj[kb)7UGm X܃O?'.ӄBDFpo|YkQ‰c /OixVșghһ?{Z-Ԋo8ɄL` 6>EhZE*_{i_No"4~@f,&y/C&կm $uM[lj;mʬjjhRQ8\sð1t^IΛ+yB[(P_k7kO ޣүkzڬhȠy-B$$94E3h|#IHv>yLdѣolq:ZpROt:?9s߾^fC;?7Wz:ɵ|?0n:Ĉyh5s{;~4Ovp{KǾz9ۏc;GDl>~;OpLGpt|;pfo_FW= fD8h|ճO4vwB,ml/G˛+~-0iv O3FA a8%烷-7CG1-w7NfC$wA=fi׿ D\`|*sv S^/_ti$-304ٜtscK_͆_Ḟv0Z~e:,x8</1^1xGfҧƟ-N'tt=~'0$O|2"lx-F8o'["B!Gt50x7EBK32=;^= g.'D)t; C92 ڪ8ϛLf,lW2o4LcnJݑr(V*lAZyB,Ĕ,ḱ&s҃Ee&=! \2b͓uHf# 3#5~O (N jy!c?͉`1:ˉ1iBXoBg^\3_Oj5.N-<lf.'\}>?Tjr~[k3Hp @'x8i!$jy|M_ev#[%ApÕ"ψ_*OA!n{,\+?s2ܡPi &_Kr[Iyg;_@yiޠ9 qwo}|]&wEX|O!_о'aZB&}C[0PExAմRG}s/ʋЗGKhSbhgWU:p냤k~ ەg?+rE;E29B^R 8?? #fVtOWqIY9Lggvg? Q?u^_M_S硊ƛFoH 74 61^Ny X8)}*d'>&^_ FWQ2{Hxo~>Y7J0΢@Z#bl! :Mq(̱ѩ(94E:B |4G n2b%xo`(ib ?  +On B?D'28+)&SE:Cw-slV G0 <]w7#.!@X'H$ bB Ba=<2Öv5ŷ^"ow LSE!]՜MLG@%D'P\s*#joZUjO/fc0xxn0 SX@ѱ8q}/)HI hL|mO atl)pr=R.w( \xu{4 Los&u%^5 R" ;T{)ΟUkr*8Z-h8Gqօ~ׯd`pIN(Ӭ\y2@‚)*ҭXr1V+gtʽ 6b[e㴥RY˶ H!7e'2H;u(醫ç eF0[-*%+ M*cmZ`ȹYX@*Qܓb5_Iڊ#΀J'$sD7ƻ,]kKv8La$MUűjlx:uFp&KxVn8}b\jMA7.Qb_ JK%R );q-X %s=gKҜJuTjäjJr |roWںs!JvJW$؝x? ״- q#gڬm&U!ЮQ Iqi]ŕȨ'ġ̑ ETOE]rN{xK&6)FK~k,$ Ic a:$^˦qWC}hر>솲Q _N) ֶ۝bэ6#X&9QTvX8"v1+915.T|e/8PQy{8B벤e6>137^riNPEM&}6F-q\p:qD9)Z`vEBQ/$^ GM$]C"1&2ਕ TK`M߭tX Psx!e'vm&xt.?FP\` ju+vs3Jb) 8.&g &k y *b7F'\[#>;Xxms6?_)2˧܌>΍9crf߻ $ds-3! ]Vhf2aj(4ش,X<{Ֆ-㇓v#G xsgبh_V㩁1jS5y]!rĊ]]!C-%ď PNЅ4˒iq`@KϮץfy1M}4_5zAvgbrfdϢC?$'zÈ] ʹ1]fYRܓȏ%C>!\ -OA %7w̡Enz~݀@䘔Q“8.L;QW CI3w>!>62I+], !%V áUp/QB@N9 tk@<(IC_ $~ O{7R1 mS[RBPJqH>Htݾ펂+J`&J‚Ղ\@C")>ʅk#[%qIc{ٓu:Xc}~b*虎~3š.^Wo+'y"u95 JbSA֮J96Z3c }# < /YDlӜs #P/o~RӺuKmbˣp /m! b A<^?^lӊB(N3a@  ڌ(Bۓt#%CQϨ[c*}*a.h۠L4 6AG3L `,^㰲\//j/B1 [7; z*+WpT~ܽ@,/QJ6*Y"칁yn44A64+Q\(#YB׫a/ WB7oZNz{mwT`}nƪKrм@7[+n<Mcɚb 0xc+).yqZS4~SffP>lC&T\_8F۪Jȋ&gV(Kbh/&~FnR#_" H4{@ fhmɉZ(:,.kF'; Cx6t6O0uI?*??TkrS k[ 3lO0bozjTU[@3泦$o}/I=jG?0qwzklx;e:t%  xdw"fc\ `^`kb QBxOqnF9!%)VVɩEE 66 J`KsRKRԢ%Լk.~|If^id.176,Ÿxsw 恋1m8odX  ®ҁ5# n۽'GNI,ޝˇ.=}]w:pnig]oVc\Zܗhl̃A 9 <݆ڶ Zs|:pFd2@Ez`N2whEwd ANS;Vgޘ >[JYHccY,}F P3H zРidLy ! +Ty CpćRb-u!J&x"r+UnMTmk8[QR7eU7t=} 'M_=^ !.>26ܯ[{O4R:<YP=z:]\P |adTQuIa"PD&<*lY #T-\-lbrxfP(4FE^0Ā\t*F<F(r'O4% ͢*U Ǧ!r͖TD'40rĺa@e;m|c C}w% ܩIDw'{vdHgl ~1ۏ#hS[ǃ‘kP|oVq6bHŨfDz䑱 q*vvgu)WT23-a#3m̞=ɳT/XYH6_tRSDfh65 Cug gDj䱵F֊i'MMCa^쏧#i`c.CԙX :W⺲%} )AU z*INAU6G"rH*e#BD](hxD_3 ,WmԒHDH9Ue㪪6Joi|0) gř!o<'1λ㹪""n\CaR-T?&unHrL+X#dv;jc+JhSB+TFVg[UL1E&DvȳAZ"Edh 3?j@ZAb>Ф.޽k5\(PQ=fKLڶvKպMbJ_.Y灮[8ݹmrAf[L4YA=8t =c֕u& nj҅󸟦~IlNo7 dPGT'Rr-yi Qr8,C? 0E Wbn<_QАǍ_>nWQ By|v;"M&cxjk.0,csc)̼tsJӋl'ѕ3dP5PW_Algj“5xj*1ЄWCi}%E0N֋ցZ ӂh"Hۃ: j2@J򬹀ePd$$xuN@ǽJ8O 1ʑ/cdRmلփ<݊P46|3>רx(" 4H*,Wт k$K4yDcO1`(,ʼq(xY}kFLYؐ2N *paI%U4WTs/HGE^Pi灴+6]3d( 0qb|U4 G-t=:7)R]vmcC^Nn|ڍ9ޮilUX?u5~3ՃNj+L?ק[hEѳLax;k f<gJ%痖(((%g$)hƗ$&N>,\I..IJKɱmkxXkoF KQoQ,]l(#X58*v"}ό hH3w ZWٖS- ~AoKzn6oQ4Z,)+ [+-wJoze޽W5Ye+z%rײr=[5"وv)jn_^g%U|% X 'PV&R[z֖+llp.^mkk)xɫ]"'B>yzWkTeqY^FΈ5}P mc8t(+;{ qTdM}w\Ax#w8BfXrjknt&7A/֊"OW~o?P`ƹl]1Ydb], n8iE%zVDaA\} A+(0l m\<@rxiB7m E^XS)1=VȧfUβcr~;%JY q./ߍZ֍tn_I -uKnYsz%?}H?_B.3iϋcKuANY7o>\n:Wρ<(vEj#!~*-/Y̷Gcuq;ZI0&zAYJHW{#6>bCb/ȦrM[iyT+'Җ-RNCDDd@Ev]fz; eF*vyٯf%nB?ڬ_; K}Qw3 !P# ;,f+u))`lW*1H.yӱDcDAb{:flw( DET rO9! Bi[>BEK}ǝ(jן'I(脉l=װ:gH*o܎_< F ?T0r?т0SQXo}Cгv CzoZU;X!.r 8 R |&.v  ed)rG#b UuGEin =[&`Ol ϜRJ$I~٥:oKRvG0ҘY~i 7LY c1KYo/+[ڈ8gxK/M3#aZ}ێ昑m3JdFD8RV'L>.:{KǴfZO3v8z7T{ B68#H3U͑ JCh ׂY|ufx33{цZޏ6] hObh%dF y(Ssxzo!B [c$u҉*1?iuN<" jui\^<wEUb):Bj3&A>DS ߧSsJ}הLrSFi)hΪ;W<àg mm+!J)o{ m7t6s~V}N3{x@S'45[ sYcfUbdBk/wNDiѥHϑOe4S@ÍsDQHu5x>7rqb/X?#̫ 2H !m}3i?o{I{BW gb^?׌dҹo&d+0`WGdovēb@ߔ"4T 'LÑr|+yp-S dqn*&N".U44":"q~tcKK@JAzjJAˬc|ls? j–<}Q=1[q"YLO6W(y$YI:ULtnp\BrmJ#gIӍNkWx媰 ; 1B6vTqVJ㵒bv8{t1qo䭧*`O/o?Xm~zaVEw*D+;#TVɼ0Y`5%0ܳv*myؒXEpzb׸Y= \5'aa6MB+S-?v6թ ^fC;W/IZ9fS!:0M#Lfo!5d3i^UC|i2孎J9#kSPTMmDlY<[22md-Bg<0֊kvwtFq[&60Wr"2xT/XᚅGW: < rqcwO7 Tjceal‡v`5Ul_7s@ЎLfiu}uTg *U9w`cҙ&݊=j,w۶>s-Ɩzk,Fok\n|wmD6=/6)$_iokǸ`:U RanȼAqwoN္؊qX{W[wўcF0#ۙWs}='d9ĥ4XjVܹ+AuJyGW[E~oss\?P?-=hP=epNϰ?N|c%Rw?kInSz $wI-- Ӆ ǀ5 ]C 3쪓bQ;v j`O@f@q"4CCFdjNv֠qBG´o4u8+%c8'wPzd'AQqvNrdT,ƻd4 uhx>1x[7bsRĈmW38}&!!?5 9و(sIVtQ|`4(5C=jR8%.)֭f"B2E1r1ɳK7/Mwxҡ6R᧙ )vY(_zOvo Ft'%8۬%0WهiZkҽ1N_u1bK41~ySZ\; &drmJ݌?!Ɋg$$6دnXΌwJmDLs]׳B 2~Nw]7ȟ,n_ܞ&MgyŔ'ŏÌ ͷlhxkmyDR%?xS]o@|W@BPFA|I ( 5>ɾCwgR}"ZUfΌgv׃.T6BLZTd[HR=$2ȍEU;%?Z.&tXx' ~9Jo>LZ;:L ̴P'kVTܿ Kc\L )4,ey'(iU&S%jV&o^-ɊP%I; t_EWPåâ3+ }3Yx \5{-):lRE[ J7…9q%9*K.{Ax[6E-h .CJUR2B { x`J|Y`LW$l#&dl:f_Z 1#/T>xݕ q&^$ufo?W}lb261Tm|V@m=!%aS I|IF~8z`D!ؠպS9a~>]boqAi֢_|9_i~|3I,E3ZUy7U7r;`EpGسYx}Tmo0_qS+PiR`m$^*:M49A&qd;Pv &!;?s/>; _= 4*ɢeaAlDvs`e7X Խ%rK'; eF_@*-*{oݖ~QγX,a ڝotrOsyBW9Uh ߄ik9xHyZ$9߃T|S $f+nGsAZAƮ9o6 ֞s "G2[Ҳ%u:24ZrCQ{m.WMUϼT9"l얧ߢt=~28i^mgFAC#? $ 58bql'' 1Oӻլ9Z)xh1?2?PbQ`i`-61,j!bg1v wbLTs6_ᎋjlr&諄piش;RiZ#s8}x@o2zI'JF`z]D3K{W Z9=L.ưetR9Riވ~6{W敁T"taA3hK2eaN8 U=wY:߂8'׹}<Փv"Kp3Olb.(!veDUJh;!&G5se%RJ.z )pKmn7U;v #TAfL%{Zr$4d3i:Ɓk7pit@R64EBH]22h\*؎vM&heGFj&r;je輗`  75^Uׅnfe}2eH iM4 <@|̿ 1>0kSF-J"縩 _M8eQ؅$]K-+gXnFk$CYf[@PVL;2{F{`]Y3fO-,l`^GVVӀ6)B;BW~@ -l` ߛ22?4hdZ==V"aÒ=nӂ:5h` ?Zu9h!AR>4 y|m4Xzj[PvefH#z [֨c.%eMFn 40BWeb&A = f^]ͮ &pvKK4e$MF$=1 F728>EfCģm4JaqvaV150Lkg,D{ifaCO͏J~Ff7C}ZgGj#5*YFoAps05S4Av<=KB!0@v4pdzE(UF?~CĆsfL|=cN&GDٰh7^az.эm)*73@Ptg$'vD;Fsal$YXfԛS 8F˾ѵ[@g<чO|mSCl 7rz6u4lsyO7s U-\3Reݿ#Gz%mڽ#'5;I'_kUO'y,B'GW Xڽo4k%QMK{bэ&s֓, 읜 vL/~=vPT4epq +hk<%F\ 7[Ez:bQ e&M-EzC$o Z)D<M$GG$tZxb K.SqA%8Tf2'ˌN Iw"厴ßN/DagM2M"{0Zf۰?|v\:+a е_I{|د}|诤^G {@;|C%N0Za+fUF7ĆO!,}%`k$%nkJ"ʉze't>)g-2b^lk&Q5Zpl._ٺohۖ-V< vLmF ,ycP:Ťse堠@(*c |X][1XJ|@],=եxrLB.d[!]^ͶՅ8޶..5;>..@xXd⼹@vpm%ۤb-]],oHd6W"!,кf_F 13 E$n虜⪢b0]CgCDwT-i H|f٩1~|w|&VJ!ulg CA|;(WuH(;D/Y;<'0q0EbVw.QI1_*;%zWrFb EPܹl(V-(a!`$0YBFubOKzK+퐄v5 R\?TEN0KRΥJ U{ϯp Y{ v` /?{jYjF&,LWǓq{a-նnO` /-[Vw0t(1kɧ3H]yYFog~=4tDU9{E)3?1[ULwM\lj%- 5 ԁt6=I1CGGG.MRT3xj!0YݖPjN/3xwpʬy9h \|,F3O0e#>֭:ȀENSJyu=֗kw62ƫ?> GvWN NߺnʫL$PoN(_H(S Y^ QvU:3{J(cW iMAB6pI.REmmn7*?cUZֺGk[Aı !E{q=U;A_TT͉ 9ߪ9 75ĘXg'FEPn$S4\<1]r۩Jt?̷/)>J3+16$5͸nN@`?w '#dvms8Y7oSa,)R [k\kOxTj@}߯^8&m147v֫XŎ] P F֜su&p`^h*  K^[N@ I&pl-rGfge \3vmu0^+"+X  J'7[Z$L+ "h7t^i(z. 4*+WA&וB`!gM|,[UkkUT[\[=yeE%z Av^#ī WֲA3&&U}Uyv]kՙ:-%.BJjRfbx/47:%Ɲ޸[PҊsSKrR2K?]HHE˖wfWAեm*Ak查7v~F;(`xwӻb&6Xd2TIfq!CJ7Փ*;L>Uy^>g.A-'(*.HMf8%%Dpo\UY gw$ز[Q\pYzw:xL1.3+I,Kp[$x;et2&_%||Y4#^,Q(.nE Z %)9 ŤxԒTd-} x340031QHHKOOg+rOԸ8aݿf- Js6[u;-6!9 J *23JvoZ^SDDvσBd3K!a6}T0rl5I|)r-Y߲%9xEj@ D:Ms[J@!=W#bvm\ڃ̈yVfq4pgW*Ei-@q,J5r聐 0Y}QL[^r)bexeAK@+ޱvIRJŃD"7%M^x1hfÔ>DmL0`pET!'x'rl{qHԉoLP(uqF))SZ4v2nFZ-|Jβ\Fy0e>EJr'aY_*"Dw~-[i~Hx 9>XmV!8>i(f: #<¤iU8x+-.O?x q rutu!,ڲXx}TMo0=ǿbr ZC -ʱ'C(Dh{{3ozMoke?"] Vl}1@xhEBaޫpt|P=\`FwFXDS! XOkHsGrrb"];yz)(B$paP.Oo3RT/OCDzU{TU+8:47Ċʔ8.yK|7RbIt &zfI0U^S93$TVWQ ׸T~ X?͘Hᰶ1h^:RQ;'(t2#>+^t* ZLԨ̽a~4 B0gڬPO O}`{+GG5nẮZXTZ{ܕ\(j.řzWF9 GZ)$ \tܴ6@9.\Ѹxe4jGCvнMePCjܡH4ڹ!)96cyB׫z!j;\]?d"} dCHz*cǩ3ls}q~r0/?VOxk}(^93/94%UA)3X?='?)1X/C+9?D!9#HAKK!=5(5$1)'UV80"Z\YPg ӖWՒ_ dCŇƻUOf\/ TR=d> Q\ F: &: IL>'`hlD@)C al$,": &f@ 51,tf@q HGRg1JKPՒ&JM65``KLN133,QX;l#x{(zMt8f%L O x;| X6k Occ89* B۴3O1p,%W癗Z`_PbRS8ޭ(17UAK$?%5Gvrd0NV0~&9/#x~D(kT`ħ ̷)17;.b @䥖B@"E7dž3r'g$L>j8M7 I1:,mY1\IElYfC%7gE}jxp2a]̼kt0W#x90,SdrO_rc5U/ݓ%D#ZVn=(JUyx;p5 |U'ˇL=w&`;2*LVtԘׅgy6Ff ||\ H HzILƽ7r"\Ixe瞟E'ҞZ&n8 "x'SD^X.H ,TX XKVjOx~'Jd{rd21Se3re\(DŽ:G !{ GMP%"yՄ\NmW'8 eR(ZeMpи(69 xeC.Tr:u|}r3 6x5BLgDǪ5zX }(6Pѩ)"BP ǔXFUAhx;|î8M~1דorfN] %x5MJ+y NAbRQ6G*(6€S/B}Ok]& 9Wx;|E 7asܼm*j' l-x;%v((~!x5ӂOL]6, `"(6€S/B}Ok]& HDxe d7̝./rExͪ zqx9n3t | Ť%L1?IB?(JZl1xdg"fc'LI_x9;7ta;0HL55%OZWp蓝WJ/x{ zmb[ĜTk.̼:X@t$JJ4ku]&?llNx;+zQͧj+(H?x,+^r \ۄx:uD"9U 9) * *qf xTL^Jjr0ml_xúqs'#'#cxlrd÷7?'J $x:sc j$cNFNFue6xxj(=:<mwx:Ah dm|AdIƬ͝ Zx 敄:cMo?(J9Gnxyy 2: E%% 1JA!!1Jq>N@`?w '#dvms8Y7oSa,)R [k\]Q"2Sr*2R@__$#U(19[!47)H!-(Y&'*$&e楂tN(Z24ךkckI!\k &pMne|X JM5Eg^/a$xid3v2-0.1.12/.git/objects/info/0000755000175000017500000000000011353240717015256 5ustar nagilonagiloid3v2-0.1.12/id3v2.spec0000644000175000017500000000237511353241266013643 0ustar nagilonagiloSummary: An MP3 technical info viewer and ID3 tag editor Name: id3v2 Version: 0.1.6 Release: 1 Copyright: GPL Group: Utilities/file Packager: Pavel Polischouk Source: http://download.sourceforge.net/%{name}/%{name}-%{version}.tar.gz Patch: %name-%version.newlib.patch BuildRoot: /var/tmp/id3v2 Requires: id3lib URL: http://id3v2.sourceforge.net/ Prefix: /usr %description I wrote this because id3v1 are seriously deficient in what kind of info can be in them and the length of info that can be in them. id3v2 tags are much better but there isn't a tool to edit them in Linux. This is a tool to fill that space. In case you didn't know id3 tags can be found on mp3 files, they can store infomation about what band recorded the song, the song name, etc. id3v2 adds all kinds of neat stuff and you can find out more about it at the id3v2 page %prep %setup %patch -p 1 %build make %install install -d $RPM_BUILD_ROOT%{prefix}/bin/ install -m 755 -s id3v2 $RPM_BUILD_ROOT%{prefix}/bin/ %post %postun %clean rm -rf ${RPM_BUILD_ROOT} %files %defattr(-,root,root) %{prefix}/bin %doc README COPYING INSTALL %changelog * Mon Nov 12 2001 Pavel Polischouk - Initial release of spec - Patch created for id3lib 3.8.0pre2 support id3v2-0.1.12/README0000644000175000017500000000544411353241266012720 0ustar nagilonagiloid3v2 - A command line id3v2 tag editor. http://id3v2.sourceforge.net In case you didn't know id3 tags can be found on mp3 files, they can store infomation about what band recorded the song, the song name, etc. I wrote this because id3v1 are seriously deficient in what kind of info can be in them and the length of info that can be in them. id3v2 tags are much better but there isn't a tool to edit them in Linux. This is a tool to fill that space. See INSTALL for directions on building id3v2. As of version 0.1.10 this code is under the LGPL. A lot of it is based off the examples in id3lib, but there is some code from me :). - myers thanks goes out to: Antti Andreimann - patch to write only one version of tag Vladimir Pastukhov - patch to handle General object frames w/o segfaulting Errica Crome - patch to fix genre display. Branko Radovanovic - patch 1: - No more seg faults for: --IPLS, --UFID, --PCNT, -- POPM. Note that these still merely print the info (i.e. the file is *not* changed). - No more seg faults for --comment. And the new code actually *sets* the comment. - No more seg faults for --TXXX desc:text. - "TSIZ results in unrecognized option" now fixed. Also rearranged some redundant code and made several minor changes (a bit more consistent coding style, spelling, etc.) patch 2: In PrintID3v1Tag() fread() in fact returns size_t (number of items read), which is unsigned, and the error reporting code is thus never executed. Fixed now. BTW, it would probably be a good idea to compile with "- W -Wall pedantic". This is how I caught it. (I've changed the make file as he suggested) Jim Ursetto - Attached patch deletes id3v2 tags when passed an empty string, rather than just setting them to a null string. I.e. -a "" will delete the artist tag. Works for comments too: -c "ID3v1 Comment::XXX" will delete the default comment derived from the v1 tag. Martin Soto When a file has an unknown genre (number 255) the program dies with a segmentation fault. When applied to list.cpp the patch should correct that by printing "Unknown" as the genre. Aubin Paul patch to build under gcc 3.2 Jens Rehsack I attach a few patches for the id3v2 tool you're responsible for. Maybe it's useful to apply them, 'cause at the moment the implementation doesn't conforms the ANSI C++ standard. (I didn't check the whole source but those lines which causes the error). Warren Stevens Whole bunch of stuff Roberto Costa Patch to fix id3 genres