use strict;
use Irssi;
use vars qw($VERSION %IRSSI);
$VERSION = "2.3.1";
%IRSSI = (
authors => "Matti 'qvr' Hiljanen, Piotr 'Pieta' Szymanski",
contact => "matti\@hiljanen.com, pieta\@osiedle.net.pl",
contributors => "bd\@bc-bd.org",
name => "wa",
description => "shows what WinAmp is playing with /wa command",
license => "Public Domain",
commands => "wa",
url => "http://matin.maapallo.org/softa/irssi",
);
#
# Requires httpQ >= 1.8 (http://www.kostaa.com/)
# Requires also WinAmp2 plugin manager if you want to use it with WinAmp3
# (Component ID: 118230 @ winamp.com)
#
# /SET httpq_ to configure the script
# /SET httpq_command sets the command which is executed on /wa
# the following expandos can be used with it:
# %T (time)
# %F (file name)
# %P (percent)
# %S (song name)
# %L (lower cased song name)
# httpq_command -setting was originally contributed by [email protected]
#
# /SET httpq_trigger_ to configure the (very lame) public trigger
# /SET httpq_trigger_command has all the same expandos as httpq_command
# with some extra ones:
# %N (nick that triggered the script)
# %C (channel where the script was triggered)
#
# Known BUGS:
# WinAmp 2 plugin manager doesn't get the name of the song that's first in
# playlist, nothing that I can do about it.. But other than that, it should work
# just fine.
#
# Piotr Szymanski:
#
# When using httpq_v3 you'd always get error (httpq returns 0 after sending a
# '/getoutputtime', '/getplaylistpos', '/getplaylisttitle' and '/ getplaylistfile'
# because of wrong args used in previous version). I just added proper args for
# version 3 of httpq. Now it should work just fine.
#
use Socket;
my($waport, $wahost, $wapass, $di);
sub getstat($$$) {
my ($host, $port, $data) = @_;
$data = "$data HTTP/1.0\r\n\r\n";
if (socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'))) {
if (connect(SOCK, sockaddr_in($port, inet_aton($host)))) {
unless (send(SOCK, $data, 0)) {
Irssi::print("Unable to write to the socket: $!", MSGLEVEL_CLIENTERROR);
return;
}
} else {
Irssi::print("Unable to connect to the socket: $!", MSGLEVEL_CLIENTERROR);
return;
}
} else {
Irssi::print("Connection to $host failed: $!", MSGLEVEL_CLIENTERROR);
return;
}
# uncomment this for slow networks
# sleep(1);
my @lines = ;
close(SOCK);
my $result = join("", @lines);
$result =~ s/^HTTP.*\n//g;
$result =~ s/^Server.*\n//g;
$result =~ s/^Content.*\n//g;
$result =~ s/^\r//g;
$result =~ s/[\r,\n]//g;
return $result;
}
sub check_version {
$wapass = Irssi::settings_get_str('httpq_password');
$wahost = Irssi::settings_get_str('httpq_host');
$waport = Irssi::settings_get_int('httpq_port');
my (undef,$version) = split(/x/, getstat($wahost, $waport, "GET /getversion?p=$wapass"));
if ($version >= 3000) {
return 1000000;
} else {
return 1;
}
}
sub parse_times ($$) {
my $emulatorbug = check_version();
my ($position, $length) = @_;
$position = sprintf("%02d", int(($position/1000/60))).":"
.sprintf("%02d", ($position/1000%60));
if ($length eq "-1") {
if ($di) {
$length = "/di.fm";
} else {
$length = "/netradio";
}
} elsif ($length eq "0") {
$length = "/sid";
} else {
$length = "/".sprintf("%02d", int(($length/$emulatorbug/60))).":"
.sprintf("%02d", ($length/$emulatorbug%60));
}
my $result = "$position$length";
return $result;
}
sub mkpercent ($$) {
my $emulatorbug = check_version();
my ($position, $length) = @_;
my $result;
my $numbers;
if ($length eq "-1" || $length eq "0") {
$result = "0";
} else {
$numbers = sprintf("%.0f",((($position/1000)/($length/$emulatorbug))*100));
$result = "(${numbers}%)";
}
if ($numbers>100 || $numbers<0) {
$result = "(wtf?)";
}
return $result;
}
sub vol_control($) {
$wapass = Irssi::settings_get_str('httpq_password');
$wahost = Irssi::settings_get_str('httpq_host');
$waport = Irssi::settings_get_int('httpq_port');
my ($direction) = @_;
if (!$direction) {
Irssi::print("Usage: /vol ");
return;
}
if ($direction eq "up") {
Irssi::print("Vol up..") if getstat($wahost, $waport, "GET /volumeup?p=$wapass");
} elsif ($direction eq "down") {
Irssi::print("Vol down..") if getstat($wahost, $waport, "GET /volumedown?p=$wapass");
}
}
# this function from [email protected]
sub expand {
my ($string, %format) = @_;
my ($exp, $repl);
$string =~ s/%$exp/$repl/g while (($exp, $repl) = each(%format));
return $string;
}
sub main_wa {
$wapass = Irssi::settings_get_str('httpq_password');
$wahost = Irssi::settings_get_str('httpq_host');
$waport = Irssi::settings_get_int('httpq_port');
my $status = getstat($wahost, $waport, "GET /isplaying?p=$wapass");
if ($status eq "1") {
my $position = getstat($wahost, $waport, "GET /getoutputtime?p=$wapass&frmt=0"); #changed arg 'a' to 'frmt'/Pieta
my $length = getstat($wahost, $waport, "GET /getoutputtime?p=$wapass&frmt=1"); #changed arg 'a' to 'frmt'/Pieta
my $emulatorbug = check_version();
my $song = getstat($wahost, $waport, "GET /getplaylisttitle?p=$wapass&index=" #changed arg 'a' to 'index'/Pieta
.getstat($wahost, $waport, "GET /getplaylistpos?p=$wapass"));
my $file = getstat($wahost, $waport, "GET /getplaylistfile?p=$wapass&index=" #changed arg 'a' to 'index'/Pieta
.getstat($wahost, $waport, "GET /getplaylistpos?p=$wapass"));
if ($emulatorbug > 1 && getstat($wahost, $waport, "GET /getplaylistpos?p=$wapass") == 0) {
$song = "WA2 plugin emulator error";
$file = "WA2 plugin emulator error";
}
# di.fm
if ($song =~ /\s?\(D.?I.?G.?I.?T.?A.?L.?L.?Y.?-.?I.?M.?P.?O.?R.?T.?E.?D.*?\)/i) {
$song =~ s/\s?\(D.?I.?G.?I.?T.?A.?L.?L.?Y.?-.?I.?M.?P.?O.?R.?T.?E.?D.*?\)//i;
$di = 1;
} else {
$di = 0;
}
my $lc = lc($song);
my $time = parse_times($position, $length);
my $percent = mkpercent($position, $length);
if (!$percent) {
$percent = '';
}
#my $final = "np: '$song' [$time$percent]";
my $final = expand(Irssi::settings_get_str("httpq_command"),
"S", $song,
"T", $time,
"P", $percent,
"F", $file,
"L", $lc);
Irssi::active_win()->command("$final");
} elsif ($status eq "3") {
Irssi::print("WinAmp is paused.");
} else {
Irssi::print("WinAmp isn't playing any song.");
}
}
sub trigger{
my($server,$text,$nick,$hostmask,$channel)=@_;
return unless Irssi::settings_get_bool('httpq_trigger_enabled');
my $trigger = Irssi::settings_get_str('httpq_trigger_string');
$trigger = "!lame" if !$trigger;
return unless ($text =~ /^$trigger$/);
# now just a copy and paste of most of the main_wa function
# this sucks, if you figure out a better way PLEASE send me a patch :)
$wapass = Irssi::settings_get_str('httpq_password');
$wahost = Irssi::settings_get_str('httpq_host');
$waport = Irssi::settings_get_int('httpq_port');
my $status = getstat($wahost, $waport, "GET /isplaying?p=$wapass");
if ($status eq "1") {
my $position = getstat($wahost, $waport, "GET /getoutputtime?p=$wapass&frmt=0"); #changed arg 'a' to 'frmt'/Pieta
my $length = getstat($wahost, $waport, "GET /getoutputtime?p=$wapass&frmt=1"); #changed arg 'a' to 'frmt'/Pieta
my $emulatorbug = check_version();
my $song = getstat($wahost, $waport, "GET /getplaylisttitle?p=$wapass&index=" #changed arg 'a' to 'index'/Pieta
.getstat($wahost, $waport, "GET /getplaylistpos?p=$wapass"));
my $file = getstat($wahost, $waport, "GET /getplaylistfile?p=$wapass&index=" #changed arg 'a' to 'index'/Pieta
.getstat($wahost, $waport, "GET /getplaylistpos?p=$wapass"));
if ($emulatorbug > 1 && getstat($wahost, $waport, "GET /getplaylistpos?p=$wapass") == 0) {
$song = "WA2 plugin emulator error";
$file = "WA2 plugin emulator error";
}
# di.fm
if ($song =~ /\s?\(D.?I.?G.?I.?T.?A.?L.?L.?Y.?-.?I.?M.?P.?O.?R.?T.?E.?D.*?\)/i) {
$song =~ s/\s?\(D.?I.?G.?I.?T.?A.?L.?L.?Y.?-.?I.?M.?P.?O.?R.?T.?E.?D.*?\)//i;
$di = 1;
} else {
$di = 0;
}
my $lc = lc($song);
my $time = parse_times($position, $length);
my $percent = mkpercent($position, $length);
if (!$percent) {
$percent = '';
}
my $final = expand(Irssi::settings_get_str("httpq_trigger_command"),
"S", $song,
"T", $time,
"P", $percent,
"N", $nick,
"F", $file,
"C", $channel,
"L", $lc);
$server->command("$final");
}
}
#
# the statusbar item code used to be here, but i doubt anyone ever used it so
# i removed it completely. it was buggy and, imo, useless :)
#
Irssi::command_bind('wa', 'main_wa');
Irssi::command_bind('vol', 'vol_control');
Irssi::settings_add_str('misc', 'httpq_password', "password");
Irssi::settings_add_str('misc', 'httpq_host', "hostname");
Irssi::settings_add_int('misc', 'httpq_port', "4800");
Irssi::settings_add_str('misc', 'httpq_command', "say np: '%S' [%T %P]");
#trigger settings
Irssi::settings_add_bool('misc', 'httpq_trigger_enabled', 0);
Irssi::settings_add_str('misc', 'httpq_trigger_string', "!lame");
Irssi::settings_add_str('misc', 'httpq_trigger_command', "notice %N np: '%S' [%T %P]");
Irssi::signal_add_last("message public","trigger");
#EOF