#!/usr/bin/perl use strict; use warnings; use Win32::OLE; my $version="1.0.1"; Xchat::register("iTunes-Info", $version, "DMS",sub{&unload();}); Xchat::print("\n\n\00312.:: iTunes-Info 2005 ::.\003\n"); Xchat::print("\00312::: Version $version :::\003\n"); Xchat::print("\00312::: © DMS '05 :::\003\n\n"); Xchat::hook_command('iTunes_play','playHandler',{help_text => ''}); Xchat::hook_command('iTunes_pause','pauseHandler',{help_text => ''}); Xchat::hook_command('iTunes_stop','stopHandler',{help_text => ''}); Xchat::hook_command('iTunes_prev','prevHandler',{help_text => ''}); Xchat::hook_command('iTunes_next','nextHandler',{help_text => ''}); Xchat::hook_command('iTunesInfo','getInfo',{help_text => 'announce info to chanel'}); Xchat::hook_command('iTunesInfo_Set','iTunesInfoSet',{help_text => 'usage: iTunesInfo_Set [Field [Value]]'}); Xchat::hook_command('iTunesInfo_addFileLine','addFileLine',{help_text => 'add announce line for files'}); Xchat::hook_command('iTunesInfo_addStreamLine','addStreamLine',{help_text => 'add announce line for streams'}); Xchat::hook_command('iTunesInfo_showConf','showConfig',{help_text => 'show config'}); Xchat::hook_command('iTunesInfo_reloadTheme','loadTheme',{help_text => 'reloads theme'}); Xchat::hook_command('iTunesInfo_addButton','addButton',{help_text => 'reloads theme'}); Xchat::hook_print('Channel Message', 'chanMsg'); #uncomment this line if you don't want to announce by !mp3 command Xchat::hook_print('Channel Msg Hilight', 'chanMsg'); #uncomment this line if you don't want to announce by !mp3 command my @FILE_LINES; my @STREAM_LINES; my %VAR; &init(); sub addButton{ Xchat::command("addbutton iTunes itunesinfo"); return Xchat::EAT_ALL; } sub playHandler{ my $iTunesApp = Win32::OLE->new("iTunes.Application"); if(!$iTunesApp){Xchat::print("No iTunes App found");return Xchat::EAT_ALL;} $iTunesApp->Play(); return Xchat::EAT_ALL; } sub pauseHandler{ my $iTunesApp = Win32::OLE->new("iTunes.Application"); if(!$iTunesApp){Xchat::print("No iTunes App found");return Xchat::EAT_ALL;} $iTunesApp->Pause(); return Xchat::EAT_ALL; } sub stopHandler{ my $iTunesApp = Win32::OLE->new("iTunes.Application"); if(!$iTunesApp){Xchat::print("No iTunes App found");return Xchat::EAT_ALL;} $iTunesApp->Stop(); return Xchat::EAT_ALL; } sub prevHandler{ my $iTunesApp = Win32::OLE->new("iTunes.Application"); if(!$iTunesApp){Xchat::print("No iTunes App found");return Xchat::EAT_ALL;} $iTunesApp->PreviousTrack(); #BackTrack(); return Xchat::EAT_ALL; } sub nextHandler{ my $iTunesApp = Win32::OLE->new("iTunes.Application"); if(!$iTunesApp){Xchat::print("No iTunes App found");return Xchat::EAT_ALL;} $iTunesApp->NextTrack(); return Xchat::EAT_ALL; } sub showConfig{ my $tBar=getBar(40); Xchat::print("\nITunesInfo-Configuration"); my $line; foreach $line(@FILE_LINES){ IRC::print(" File-Line: $line");} foreach $line(@STREAM_LINES){IRC::print(" Stream-Line: $line");} Xchat::print(" Stopedcommand: $VAR{STOPEDCOMMAND}"); Xchat::print(" Barchar: $VAR{BARCHAR}"); Xchat::print(" Barusedcolor: $VAR{BARUSEDCOLOR}"); Xchat::print(" Barfreecolor: $VAR{BARFREECOLOR}"); Xchat::print(" Samplebar: $tBar"); } sub printSet{ my $field=shift(@_); my $line; if (($field eq "FILE_LINE")||($field eq "STREAM_LINE")){ if ($field eq "FILE_LINE"){foreach $line(@FILE_LINES){ IRC::print(" File-Line: $line");}} if ($field eq "STREAM_LINE"){foreach $line(@STREAM_LINES){IRC::print(" Stream-Line: $line");}} } else {Xchat::print("$field = $VAR{$field}");} } sub printSetHelp(){ Xchat::print("Available Settings for iTunesInfo"); Xchat::print("BARCHAR - Char used in progresbar"); Xchat::print("BARUSEDCOLOR - Colorcode for used part of bar (e.g. 03)"); Xchat::print("BARFREECOLOR - Colorcode for rest part of bar (e.g. 16)"); Xchat::print("STOPEDCOMMAND - command to announce to channel if iTunes is stoped/paused"); Xchat::print("FILE_LINE - comand to announce if file is played (all other will be removed, better use \"iTunesInfo_addFileLine\")"); Xchat::print("STREAM_LINE - command to annoince if stream is played (all other will be removed, better use \"iTunesInfo_addStreamLine\")"); } sub iTunesInfoSet{ if (!$_[0][1]){printSetHelp();return Xchat::EAT_ALL;} my $field=uc($_[0][1]); if (($field ne "FILE_LINE")&&($field ne "STREAM_LINE")&&($field ne "BARCHAR")&&($field ne "BARFREECOLOR")&&($field ne "BARUSEDCOLOR")&&($field ne "POSTCOMMAND")&&($field ne "STOPEDCOMMAND")){ Xchat::print("not a valid field");return Xchat::EAT_ALL; } if (!$_[0][2]){printSet($field);return Xchat::EAT_ALL;} my $val=$_[1][2]; if (($field eq "FILE_LINE")||($field eq "STREAM_LINE")){ if ($field eq "FILE_LINE"){clearArr("FILE_LINES"); push(@FILE_LINES,$val);} if ($field eq "STREAM_LINE"){clearArr("STREAM_LINES"); push(@STREAM_LINES,$val);} } else {$VAR{$field}=$val;} my $themefile=Xchat::get_info("xchatdir");$themefile="$themefile/iTunesInfo.theme.txt"; my $db= readFile($themefile); open (DB, ">$themefile"); my $line; foreach $line(split "\n", $db){ my($var,$value)=(split "=", $line); print DB "$var=$value\n" if ($var ne $field); } print DB "$field=$val\n"; close(DB); IRC::print("\00312.:: $field changed to $val ::.\003\n"); return Xchat::EAT_ALL; } sub addFileLine{ my $val=$_[1][1]; push(@FILE_LINES,$val); addLine("FILE_LINE",$val); Xchat::print("Fileline added"); } sub addStreamLine{ my $val=$_[1][1]; push(@STREAM_LINES,$val); addLine("STREAM_LINE",$val); Xchat::print("Streamline added"); } sub addLine{ my $field=shift(@_); my $val=shift(@_); my $themefile=Xchat::get_info("xchatdir");$themefile="$themefile/iTunesInfo.theme.txt"; my $db= readFile($themefile); open (DB, ">$themefile"); my $line; foreach $line(split "\n", $db){ print DB "$line\n"; } print DB "$field=$val\n"; } sub chanMsg{ my $msg=$_[0][1]; $msg =~ s/^\s+//; $msg =~ s/\s+$//; my $nick=uc(Xchat::get_info("nick")); #Xchat::print("msg: \"$msg\""); ##old##if ((uc($msg) eq "!MP3")||(uc($msg) eq "!MP3 $nick")){ if ((uc($msg) eq "!iwillneverusethiscommandtorapesomeonesconnection")||(uc($msg) eq "!iwillneverusethiscommandtoattempttorapesomeonesconnection.ipromise. $nick")){ getInfo(); } return Xchat::EAT_NONE; } sub getInfo{ my $iTunesApp = Win32::OLE->new("iTunes.Application"); if(!$iTunesApp){Xchat::print("No iTunes App found");return Xchat::EAT_ALL;} my $itState=$iTunesApp->PlayerState(); #if ($itState==0){Xchat::print("stopped");} #if ($itState==1){Xchat::print("playling");} #if ($itState==2){Xchat::print("Fast forward");} #if ($itState==3){Xchat::print("rewind");} $ENV{version}=$iTunesApp->Version(); if ($itState==0){ #Xchat::print(themeLine($VAR{STOPEDCOMMAND})); Xchat::command(themeLine($VAR{STOPEDCOMMAND})); return Xchat::EAT_ALL; } my $itPos=$iTunesApp->{'PlayerPosition'}; $ENV{play_time_min} = timeString($itPos,0); $ENV{play_time} = timeString($itPos,1); $ENV{play_time_auto} = timeString($itPos,2); my $itTrack=$iTunesApp->CurrentTrack(); my $kind=$itTrack->{'Kind'}; $ENV{title}=$itTrack->{'Name'}; $ENV{bitrate}=$itTrack->{'BitRate'}; $ENV{rate}=$itTrack->{'SampleRate'}; $ENV{played}=$itTrack->{'PlayedCount'}; $ENV{rating}=$itTrack->{'Rating'}; #percent $ENV{bpm}=$itTrack->{'BPM'}; if ($kind==3){ # STREAM #Xchat::print(themeStream()); Xchat::command(themeStream()); return Xchat::EAT_ALL; } $ENV{artist}=$itTrack->{'Artist'}; $ENV{album}=$itTrack->{'Album'}; $ENV{comment}=$itTrack->{'Comment'}; #Composer my $len=$itTrack->{'Duration'};#seconds $ENV{length_min} = timeString($len,0); $ENV{length} = timeString($len,1); $ENV{length_auto} = timeString($len,2); $ENV{percent}=0; if ($len ne 0){ $ENV{percent}=int(($itPos/$len)*100);} $ENV{bar}=&getBar($ENV{percent}); $ENV{genre}=$itTrack->{'Genre'}; $ENV{year}=$itTrack->{'Year'}; $ENV{disc}=$itTrack->{'DiscNumber'}; $ENV{discs}=$itTrack->{'DiscCount'}; my $size=$itTrack->{'Size'}; #bytes $ENV{mbsize} = int($size / 1024 / 10.24 + 0.5) / 100; my $ext="b"; $ENV{size_auto}=$size; if ($ENV{size_auto}>1024){$ext="kb";$ENV{size_auto}=int($ENV{size_auto}/1024);} if ($ENV{size_auto}>1024){$ext="mb";$ENV{size_auto}=int($ENV{size_auto}/1024);} $ENV{size_auto}="$ENV{size_auto}$ext"; #Xchat::print(themeFile()); Xchat::command(themeFile()); return Xchat::EAT_ALL; } sub readFile{ my $path=shift(@_); my $data; if (!open(DB, "<","$path")){Xchat::print("file not found: $path");return "";} my @stats=stat(DB); read (DB,$data,$stats[7]); close (DB); return $data; } sub clearArr{ my $name=shift(@_); my $elem; if ($name eq "FILE_LINES") {foreach $elem (@FILE_LINES){pop(@FILE_LINES);}} if ($name eq "STREAM_LINES") {foreach $elem (@STREAM_LINES){pop(@STREAM_LINES);}} } sub loadTheme{ #FILELINES, STREAMLINES, BARCHAR, BARFREECOLOR, BARUSEDCOLOR, POSTCOMMAND, STOPEDCOMMAND, PAUSECOMMAND #clearArr(@FILE_LINES);clearArr(@STREAM_LINES); clearArr("FILE_LINES");clearArr("STREAM_LINES"); my $themefile=Xchat::get_info("xchatdir");$themefile="$themefile/iTunesInfo.theme.txt"; my $line; foreach $line (split "\n", readFile($themefile)){ my($var0, $value)=(split "=", $line); $value=replace($value,"%C",chr(3)); $value=replace($value,"%B",chr(2)); #$value=replace($value,"%U",chr(37)); #$value=replace($value,"%O",chr(17)); #$value=replace($value,"%R",chr(26)); if (index($var0,"LINE") >= 0){ if ($var0 eq "FILE_LINE"){push (@FILE_LINES, $value);} if ($var0 eq "STREAM_LINE"){push (@STREAM_LINES, $value);} } else {$VAR{$var0}=$value;} } $VAR{BARCHAR}="|" if (!$VAR{BARCHAR}); $VAR{BARFREECOLOR}="03" if (!$VAR{BARFREECOLOR}); $VAR{BARUSEDCOLOR}="16" if (!$VAR{BARUSEDCOLOR}); #$VAR{POSTCOMMAND}="say" if (!$VAR{POSTCOMMAND}); $VAR{STOPEDCOMMAND}="say iTunes %version stopped" if (!$VAR{STOPEDCOMMAND}); #$VAR{PAUSECOMMAND}="say iTunes %version stopped" if (!$VAR{PAUSECOMMAND}); #$VAR{}="" if (!$VAR{}); ##old##if (!@FILE_LINES) {IRC::print("no file-line found\n");push(@FILE_LINES,"say i'm listening to %artist with %title since %playtime_auto");} ##old##if (!@STREAM_LINES) {IRC::print("no stream-line found\n");push(@STREAM_LINES,"say i'm listening to %title since %playtime_auto");} if (!@FILE_LINES) {IRC::print("no file-line found\n");push(@FILE_LINES,"say I'm listening to '%title' by /%artist/");} if (!@STREAM_LINES) {IRC::print("no stream-line found\n");push(@STREAM_LINES,"say I've been listening to '%title' since %playtime_auto");} return Xchat::EAT_ALL; } sub init{ loadTheme(); } sub timeString{ my $secs=shift(@_); my $mode=shift(@_); my $mm=int($secs / 60); my $ss=$secs%60; if ($mode==0) {return sprintf('%d:%02d',$mm,$ss);} my $hh=int($mm/60);$mm=$mm%60; if (($mode==1)||($hh>0)) {return sprintf('%d:%02d:%02d',$hh,$mm,$ss);} return sprintf('%02d:%02d',$mm,$ss); } sub getBar{ my $percent=shift(@_); my $b1=int($percent/10); my $b2=(10-$b1); my $bar="\002\003$VAR{BARUSEDCOLOR}"; for (my $i=0;$i < $b1;$i=$i+1){$bar="$bar$VAR{BARCHAR}";} $bar="$bar\003$VAR{BARFREECOLOR}"; for (my $i=0;$i < $b2;$i=$i+1){$bar="$bar$VAR{BARCHAR}";} $bar="$bar\003\002"; return $bar } sub count{ my @arr=@_;my $i=0; foreach $a (@arr){$i=$i+1;} return $i; } sub randLine{ my @lines=@_; my $lcount=count(@lines); my $line=int(rand($lcount)); return $lines[$line]; } sub themeFile{return themeLine(randLine(@FILE_LINES));} sub themeStream{return themeLine(randLine(@STREAM_LINES));} sub themeLine{ my $line=shift(@_); #$line=replace($line,"%",$ENV{}); $line=replace($line,"%version",$ENV{version}); $line=replace($line,"%playtime_min",$ENV{play_time_min}); $line=replace($line,"%playtime_auto",$ENV{play_time_auto}); $line=replace($line,"%playtime",$ENV{play_time}); $line=replace($line,"%title",$ENV{title}); $line=replace($line,"%bitrate",$ENV{bitrate}); $line=replace($line,"%srate",$ENV{rate}); $line=replace($line,"%played",$ENV{played}); $line=replace($line,"%rating",$ENV{rating}); $line=replace($line,"%bpm",$ENV{bpm}); $line=replace($line,"%artist",$ENV{artist}); $line=replace($line,"%album",$ENV{album}); $line=replace($line,"%comment",$ENV{comment}); $line=replace($line,"%len_min",$ENV{length_min}); $line=replace($line,"%len_auto",$ENV{length_auto}); $line=replace($line,"%len",$ENV{length}); $line=replace($line,"%percent",$ENV{percent}); $line=replace($line,"%bar",$ENV{bar}); $line=replace($line,"%genre",$ENV{genre}); $line=replace($line,"%year",$ENV{year}); $line=replace($line,"%discs",$ENV{discs}); $line=replace($line,"%disc",$ENV{disc}); $line=replace($line,"%size_mb",$ENV{mbsize}); $line=replace($line,"%size_auto",$ENV{size_auto}); my $c10=chr(10); my $c13=chr(13); my $CC=chr(3);my $CB=chr(2);my $CU=chr(37);my $CO=chr(17);my $CR=chr(26); my $c1310="$c13$c10"; $line=replace($line,$c1310,"; "); $line=replace($line,$c10,"; "); $line=replace($line,$c13,"; "); $line=replace($line,"%B",$CB);$line=replace($line,"%C",$CC);$line=replace($line,"%O",$CO);$line=replace($line,"%U",$CU);$line=replace($line,"%R",$CR); return $line; } sub replace{ my $text=shift(@_); my $pattern=shift(@_); my $newText=shift(@_); my $left=""; my $right=""; while (index($text,$pattern) ne -1){ $left=substr($text,0,index($text,$pattern)); $right=substr($text,index($text,$pattern)+length($pattern)); $text="$left$newText$right"; } return $text; }