All pastes #740028 Raw Edit

iTunesInfo.pl

public text v1 · immutable
·published 2007-10-17 17:23 UTC
rendered paste body
#!/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;
}