summary refs log tree commit diff stats
path: root/plugins/fishlim
AgeCommit message (Collapse)Author
2013-09-15plugins: fishlim: VS2013 comes with a working stdbool.hArnavion
2013-09-15Convert project files to vs2013Eustachy Kapusta
2013-07-24Move optimization settings from all subsequent projects to hexchat.propsEustachy Kapusta
2013-04-28Don't hardcode "plugins" as the subdirectory for plugins in manyChristoph J. Thompson
places. modified: config-win32.h modified: configure.ac modified: plugins/checksum/Makefile.am modified: plugins/doat/Makefile.am modified: plugins/fishlim/Makefile.am modified: plugins/perl/Makefile.am modified: plugins/python/Makefile.am modified: plugins/sysinfo/Makefile.am modified: plugins/xdcc/Makefile.am modified: src/common/plugin.c modified: src/fe-text/fe-text.c
2013-04-25win32: Moved PlatformToolset configuration to individual project files. It ↵Arnavion
should be set before setting other properties or importing other props. This fixes the broken GUI Platform Toolset indicator, as well as VS compilation itself if another version such as 2010 was also installed.
2013-04-01Remove another bunch of obsolete junkBerke Viktor
2012-11-04Use configdir instead of *xchatdir*Berke Viktor
2012-10-30Now some final cleanup (I hope)Berke Viktor
2012-10-30Some final rebrandingBerke Viktor
2012-10-30Rebrand get_info(xchatdir) but remain compatible for Perl and PythonBerke Viktor
2012-10-30Rebranding for the rest of plugin*Berke Viktor
2012-10-30Rebranding for XCHAT_EAT_*Berke Viktor
2012-10-30Rebranding for XCHAT_PRI_*Berke Viktor
2012-10-30Remove hexchat-plugin.h duplicateBerke Viktor
2012-10-28Further doc relocations and conversionsBerke Viktor
2012-10-24A lot more rebrandingBerke Viktor
2012-10-21Move warning level to property sheetBerke Viktor
2012-10-13Compatibility for Automake 1.12.4+Berke Viktor
2012-10-03Revert to VS2010 part4Berke Viktor
2012-10-02Use explicit project names, output filenames depend on themBerke Viktor
2012-10-02Oops, wrong find'n'replaceBerke Viktor
2012-10-02Remove hardcoding as much as possibleBerke Viktor
2012-10-02Change platform toolset to Visual Studio 2012Berke Viktor
2012-10-02Add XP (WDK) solution as a fallback optionBerke Viktor
2012-07-26Make FiSHLiM consistent with recent naming changesBerke Viktor
2012-07-21Add _AMD64_ definition for x64 builds, make Visual Studio even happierBerke Viktor
2012-07-21Add trailing backslashes to Output and Intermediate directories, make Visual ↵Berke Viktor
Studio happy
2012-07-18Prepare FiSHLiM to use the plugin config APIBerke Viktor
2012-07-18Add make support for FiSHLiM on UnixBerke Viktor
2012-07-14get rid of *.user files and ignore themxhmikosr
2012-07-13Rename DLL files, rename X-SASL to SASLBerke Viktor
2012-07-13Rename files, delete old windows makefilesBerke Viktor
2012-07-11Rebranding on the file levelBerke Viktor
2012-06-15Add .user files and .gitignoreBerke Viktor
2012-06-15Add x64 support to the VS solutionBerke Viktor
2012-06-15LOTS of fixes to the VS solutionBerke Viktor
2012-06-10Add all plugins to solution except WMPABerke Viktor
2012-05-13Sync with FiSHLiM HEADBerke Viktor
2012-05-04sync with fishlim headBerke Viktor
2012-03-16sync with fishlim headBerke Viktor
2012-01-03sync with fishlim headBerke Viktor
2011-11-25rename fishlim main file in makefile tooBerke Viktor
2011-11-25get in sync with fishlim upstreamBerke Viktor
2011-11-25rename fishlim main file to avoid confusionBerke Viktor
2011-11-24fix fishlim config handlerBerke Viktor
2011-11-24add fishlim pluginBerke Viktor
etails. * * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, 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)){ hexchat_printf(ph,"invalid char in string: %i",text[strlen(text)-i]); return 255; } ret+=((int)text[strlen(text)-i]-48)*iPow(10,i-1); } //hexchat_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); //hexchat_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){ hexchat_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) {hexchat_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){hexchat_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; //hexchat_printf(ph, "tmp[0]=%i (%i)",val,tmp[0]); if ((val<148)&&(val>=0)) ret.genre=GENRES[val];//#############changed else { ret.genre="unknown"; //hexchat_printf(ph, "tmp[0]=%i (%i)",val,tmp[0]); } //hexchat_printf(ph, "tmp: \"%s\" -> %i",tmp,tmp[0]); //hexchat_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; //hexchat_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"); //hexchat_printf(ph,"file :%s",file); if (f==NULL) { hexchat_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){ //hexchat_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;} //hexchat_printf(ph,"tag length: %i\n",len); //hexchat_printf(ph,"tag: %s\n",tag); fclose(f); ret.comment=tagExtract(tag,len,"COMM"); //hexchat_printf(ph,"Comment: %s\n",ret.comment); ret.genre=tagExtract(tag,len,"TCON"); //if (strcmp(ret.genre,"(127)")==0) ret.genre="unknown"; //hexchat_printf(ph, "ret.genre = %s",ret.genre); if ((ret.genre!=NULL)&&(ret.genre[0]=='(')) ret.genre=extractID3Genre(ret.genre); //hexchat_printf(ph,"genre: %s\n",ret.genre); ret.title=tagExtract(tag,len,"TIT2"); //hexchat_printf(ph,"Title: %s\n",ret.title); ret.album=tagExtract(tag,len,"TALB"); //hexchat_printf(ph,"Album: %s\n",ret.album); ret.artist=tagExtract(tag,len,"TPE1"); //hexchat_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) { hexchat_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"); } */