diff options
Diffstat (limited to 'plugins/mpcinfo/mp3Info.c')
-rw-r--r-- | plugins/mpcinfo/mp3Info.c | 361 |
1 files changed, 0 insertions, 361 deletions
diff --git a/plugins/mpcinfo/mp3Info.c b/plugins/mpcinfo/mp3Info.c deleted file mode 100644 index f75ba9c4..00000000 --- a/plugins/mpcinfo/mp3Info.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * 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 <stdio.h> -#include <sys/stat.h> -//#include "functions.c" - -struct tagInfo{ - int mode; - int cbr; - int bitrate; - unsigned int freq; - char *artist; - char *title; - char *album; - char *comment; - char *genre; - //int genre; - //int track; -}; - -static int RATES[2][3][15]={ - {//mpeg2 - {-1,8,16,24,32,64,80,56,64,128,160,112,128,256,320},//layer3 (V2) - {-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384},//layer2 (V2) - {-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448},//layer1 (V2) - }, - {//mpeg1 - {-1,32,40,48,56,64,80,96,112,128,160,192,224,256,320},//layer3 (V1) - {-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384},//layer2 (V1) - {-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448},//layer1 (V1) - }}; -static int FREQS[2][4]={{22050,24000,16000,-1},{44100,48000,32000,-1}}; -//static double FRATES[]={38.5,32.5,27.8,0.0}; - -static char GENRES[][50]={"Blues","Classic Rock","Country","Dance","Disco","Funk","Grunge","Hip-Hop","Jazz","Metal", -"New Age","Oldies","Other","Pop","R&B","Rap","Reggae","Rock","Techno","Industrial", -"Alternative","Ska","Death Metal","Pranks","Soundtrack","Euro-Techno","Ambient","Trip-Hop","Vocal","Jazz+Funk", -"Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound Clip","Gospel","Noise", -"AlternRock","Bass","Soul","Punk","Space","Meditative","Instrumental Pop","Instrumental Rock","Ethnic","Gothic", -"Darkwave","Techno-Industrial","Electronic","Pop-Folk","Eurodance","Dream","Southern Rock","Comedy","Cult","Gangsta", -"Top 40","Christian Rap","Pop/Funk","Jungle","Native American","Cabaret","New Wave","Psychadelic","Rave","Showtunes", -"Trailer","Lo-Fi","Tribal","Acid Punk","Acid Jazz","Polka","Retro","Musical","Rock & Roll","Hard Rock", - -//################## END OF OFFICIAL ID3 TAGS, WINAMP TAGS BELOW ######################################## - -"Folk","Folk/Rock","National Folk","Swing","Fast Fusion","Bebob","Latin","Revival","Celtic","Bluegrass", -"Avantgarde","Gothic Rock","Progressive Rock","Psychedelic Rock","Symphonic Rock","Slow Rock","Big Band","Chorus","Easy Listening","Acoustic", -"Humour","Speech","Chanson","Opera","Chamber Music","Sonata","Symphony","Booty Bass","Primus","Porn Groove", -"Satire","Slow Jam","Club","Tango","Samba","Folklore","Ballad","Poweer Ballad","Rhytmic Soul","Freestyle", -"Duet","Punk Rock","Drum Solo","A Capela","Euro-House","Dance Hall", - -//################## FOUND AT http://en.wikipedia.org/wiki/ID3 ########################################### - -"Goa","Drum & Bass","Club-House","Hardcore", -"Terror","Indie","BritPop","Negerpunk","Polsk Punk","Beat","Christian Gangsta Rap","Heavy Metal","Black Metal","Crossover", -"Contemporary Christian","Christian Rock","Merengue","Salsa","Thrash Metal","Anime","JPop","Synthpop" - -}; - -static char MODES [][13]={"Stereo","Joint-Stereo","Dual-Channel","Mono"}; - -int iPow(int x, int y){return (int)(pow((double)x,(double) y));} - -int str2int(char *text){ - //if (DEBUG==1) putlog("converting string to int"); - int i; - int ret=0; - for (i=1;i<=strlen(text);i++){ - if ((text[strlen(text)-i]>57)||(text[strlen(text)-i]<48)){ - xchat_printf(ph,"invalid char in string: %i",text[strlen(text)-i]); - return 255; - } - ret+=((int)text[strlen(text)-i]-48)*iPow(10,i-1); - } - //xchat_printf(ph, "str2int(%s)=%i",text,ret); - //if (DEBUG==1) putlog("int converted"); - return ret; -} -/* -static int getSize(char *file){ - //if (DEBUG==1) putlog("reading filesize"); - struct stat info; - if (stat(file,&info)!=0) return -1; - return info.st_size; -}*/ -/* -int inStr(char *s1, int sl1, char *s2){ - //if (DEBUG==1) putlog("checking instr"); - int i;int j; - for(i=0;i<sl1-strlen(s2);i++){ - for (j=0;j<strlen(s2);j++){ - if (s1[i+j]!=s2[j]) j=strlen(s2)+2; - } - if (j==strlen(s2)) return i; - } - return -1; -} - -static char *subString(char *text, int first, int length, int spcKill){ -//if (DEBUG==1) putlog("creating substring"); - char *ret=(char*) calloc (length+1,sizeof(char)); //malloc(sizeof(char)*(length+1)); - ret[length]=0;int i; - for (i=0;i<length;i++){ - ret[i]=text[i+first]; - //if (ret[i]==0) ret[i]='0'; - } - if (spcKill==1){ - for (i=length-1;i>=0;i--){ - if (ret[i]==32) ret[i]=0; - else i=-1; - } - } - //if (DEBUG==1) putlog("substring created"); - return ret; -} - -static char *substring(char *text, int first, int length){return subString(text,first,length,0);} //1 -*/ - -static char *tagExtract(char *tag, int tagLen, char* info){ -//if (DEBUG==1) putlog("extracting tag"); - int pos, len, i; - pos=inStr(tag,tagLen,info); -//xchat_printf(ph,"pos=%i",pos); - if (pos==-1) return "";//NULL; - //printf("position of %s = %i\n",info,pos); - len=0; - //for (i=pos;i<pos+10;i++)printf("tag[%i]=%i \n",i,tag[i]); - for (i=0;i<4;i++) { - len+=tag[pos+strlen(info)+i]*iPow(255,3-i); - } - //printf("Tag-Length: %i\n",len); - if (strcmp("COMM",info)!=0) return substring(tag,pos+7+strlen(info),len-1);//11 - return substring(tag,pos+7+strlen(info),len-1);//11 - //char *ct=substring(tag,pos+7+strlen(info),len-1);//11 - //return substring(ct,strlen(ct)+1,len-1-strlen(ct)); //<-- do not understand, what i did here :( - -} - -struct tagInfo readID3V1(char *file){ -//if (DEBUG==1) putlog("reading ID3V1"); - FILE *f; - struct tagInfo ret; - int res, i, c, val; - char *tag; - char *id; - char *tmp; - tag = (char*) malloc(sizeof(char)*129); - ret.artist=NULL; - f=fopen(file,"rb"); - if (f==NULL){ - xchat_print(ph,"file not found while trying to read id3v1"); - //if (DEBUG==1) putlog("file not found while trying to read id3v1"); - return ret; - } - //int offset=getSize(file)-128; - res=fseek(f,-128,SEEK_END); - if (res!=0) {printf("seek failed\n");fclose(f);return ret;} - //long int pos=ftell(f); - //printf("position= %li\n",pos); - for (i=0;i<128;i++) { - c=fgetc(f); - if (c==EOF) {xchat_printf(ph,"read ID3V1 failed\n");fclose(f);return ret;} - tag[i]=(char)c; - } - fclose(f); - //printf("tag readed: \n"); - id=substring(tag,0,3); - //printf("header: %s\n",id); - if (strcmp(id,"TAG")!=0){xchat_printf(ph,"no id3 v1 found\n");return ret;} - ret.title=subString(tag,3,30,1); - ret.artist=subString(tag,33,30,1); - ret.album=subString(tag,63,30,1); - ret.comment=subString(tag,97,30,1); - tmp=substring(tag,127,1); - //ret.genre=substring(tag,127,1); - - val=(int)tmp[0]; - if (val<0)val+=256; - //xchat_printf(ph, "tmp[0]=%i (%i)",val,tmp[0]); - if ((val<148)&&(val>=0)) - ret.genre=GENRES[val];//#############changed - else { - ret.genre="unknown"; - //xchat_printf(ph, "tmp[0]=%i (%i)",val,tmp[0]); - } - //xchat_printf(ph, "tmp: \"%s\" -> %i",tmp,tmp[0]); - //xchat_printf(ph,"genre \"%s\"",ret.genre); - //if (DEBUG==1) putlog("id3v1 extracted"); - return ret; -} - -char *extractID3Genre(char *tag){ - //if (DEBUG==1) putlog("extracting id3 genre"); - if (tag[strlen(tag)-1]==')'){ - tag[strlen(tag)-1]=0; - tag=&tag[1]; - return GENRES[str2int(tag)]; - //return tag; - } - else{ - int i; - //xchat_print(ph, "Using 2 criteria"); - for (i=0;i<strlen(tag);i++){ - if (tag[i]==')'){ tag=&tag[i]+1;return tag;} - //return tag; - } - } - return "[152] failed"; -} - -struct tagInfo readID3V2(char *file){ -//if (DEBUG==1) putlog("reading id3v2"); - FILE *f; - int i, c, len; - char header[10]; - char *tag; - struct tagInfo ret; - - f = fopen(file,"rb"); - //xchat_printf(ph,"file :%s",file); - if (f==NULL) - { - xchat_print(ph,"file not found whilt trying to read ID3V2"); - //if (DEBUG==1)putlog("file not found while trying to read ID3V2"); - return ret; - } - - ret.artist=NULL; - for (i=0;i<10;i++){ - c=fgetc(f); - if (c==EOF){ - //putlog("found eof while reading id3v2"); - return ret; - } - header[i]=(char)c; - } - if (strstr(header,"ID3")==header){ - //xchat_printf(ph,"found id3v2\n"); - len=0; - for (i=6;i<10;i++) len+=(int)header[i]*iPow(256,9-i); - - //char *tag=(char*)malloc(sizeof(char)*len); - tag=(char*) calloc(len,sizeof(char)); //malloc(sizeof(char)*len); - for (i=0;i<len;i++){c=fgetc(f);tag[i]=(char)c;} -//xchat_printf(ph,"tag length: %i\n",len); -//xchat_printf(ph,"tag: %s\n",tag); - fclose(f); - ret.comment=tagExtract(tag,len,"COMM"); -//xchat_printf(ph,"Comment: %s\n",ret.comment); - ret.genre=tagExtract(tag,len,"TCON"); - //if (strcmp(ret.genre,"(127)")==0) ret.genre="unknown"; -//xchat_printf(ph, "ret.genre = %s",ret.genre); - if ((ret.genre!=NULL)&&(ret.genre[0]=='(')) ret.genre=extractID3Genre(ret.genre); -//xchat_printf(ph,"genre: %s\n",ret.genre); - ret.title=tagExtract(tag,len,"TIT2"); -//xchat_printf(ph,"Title: %s\n",ret.title); - ret.album=tagExtract(tag,len,"TALB"); -//xchat_printf(ph,"Album: %s\n",ret.album); - ret.artist=tagExtract(tag,len,"TPE1"); -//xchat_printf(ph,"Artist: %s\n",ret.artist); - } - else{fclose(f);printf("no id3v2 tag found\n"); return ret;} - //printf("id2v2 done\n"); - //if (DEBUG==1) putlog("id3v2 readed"); - return ret; -} - -struct tagInfo readHeader(char *file){ -//if (DEBUG==1) putlog("reading header"); - FILE *f; - //int buffer[5120]; - int versionB, layerB, bitrateB, freqB, modeB; - int header[4]; - int count=0; - int cc=0; - struct tagInfo info; - info.artist=NULL; - - f = fopen(file,"rb"); - if (f==NULL) - { - xchat_print(ph,"file not found while trying to read mp3 header"); - //if (DEBUG==1) putlog("file not found while trying to read mp3 header"); - return info; - } - //struct tagInfo tagv2 - - info=readID3V2(file); - //struct tagInfo tagv1;//=readID3V1(file); - //if (tagv2.artist!=NULL){info=tagv2;} - //else { - if (info.artist==NULL){ - //printf("searching for id3v1\n"); - //tagv1=readID3V1(file); - info=readID3V1(file); //##################### - } - /* - if (tagv1.artist!=NULL){ - //printf("Artist: %s\nTitle: %s\nAlbum: %s\nComment: %s\nGenre: %s\n",tagv1.artist,tagv1.title,tagv1.album,tagv1.comment,tagv1.genre); - info=tagv1; - } - */ - while ((count<5120)&&(cc!=EOF)&&(cc!=255)) {cc=fgetc(f);count++;} - if ((cc==EOF)||(count==5119)) printf("no header found\n"); - else { - //printf("located header at %i\n",count); - header[0]=255; - for (count=1;count<4;count++){ - header[count]=fgetc(f); - //printf("header[%i]=%i\n",count,header[count]); - } - versionB=(header[1]&8)>>3; - layerB=(header[1]&6)>>1; - bitrateB=(header[2]&240)>>4; //4 - freqB=(header[2]&12)>>2;//2 - modeB=(header[3]&192)>>6;//6 - //printf("Mpeg: %i\nLayer: %i\nBitrate: %i\nFreq: %i\nMode: %i\n",versionB, layerB, bitrateB, freqB, modeB); - //int Bitrate=RATES[versionB][layerB-1][bitrateB]; - //int Freq=FREQS[versionB][freqB]; - info.bitrate=RATES[versionB][layerB-1][bitrateB]; - info.freq=FREQS[versionB][freqB]; - info.mode=modeB; - } - fclose(f); - //if (DEBUG==1) putlog("header readed"); - return info; -} -/* -static void printMp3Info(char *file){ - //printf("\nScanning Mp3-File for Informations: %s\n",file); - //printf("size:\t%10d byte\n",getSize(file)); - struct tagInfo info =readHeader(file); - printf("%s | %10d",file,getSize(file)); - if (info.bitrate>0){ - //printf("Bitrate: %i\nFreq: %i\nMode: %s\n",info.bitrate,info.freq,MODES[info.mode]); - printf(" | %i kbps | %i kHz | %s",info.bitrate,info.freq,MODES[info.mode]); - //if (info.artist!=NULL) printf("\nArtist: %s\nTitle: %s\nAlbum: %s\nComment: %s\nGenre: %s\n",info.artist,info.title,info.album,info.comment,info.genre); - if (info.artist!=NULL) { - printf("| %s | %s | %s | %s | %s",info.artist,info.title,info.album,info.comment,info.genre); - //printf("| %s ",info.title);//,info.title,info.album,info.comment,info.genre - } - } - printf("\n"); - -} -*/ |