#!/usr/bin/perl -w

# WEFUNK tray widget
# copyright 2008 Christian Herzog <daduke@daduke.org>, distributed under
# the terms of the GNU General Public License version 2 or any later version.
# thanks to Premek Vyhnal <premysl.vyhnal gmail.com> and Olivier Duclos (oliwer.net)
# for their trayicon code

# v0.6 2008/10/21 - some optimizations
# v0.5 2008/10/08 - icon changed again due to transparency issues
# v0.4 2008/10/07 - new icon. Thanks PG!
# v0.3 2008/10/02 - set LWP timeout to prevent blank icon
# v0.2 2008/09/30 - better error handling, code cleanup
# v0.1 2008/09/27 - first version

use strict;
use LWP::UserAgent;
use Gtk2 '-init';
use Gtk2::TrayIcon;


my $DELAY = shift (@ARGV) || 90000;	#update every 90 s
my $CARD = "0";				#usually 0 is the regular soundcard
my $url = 'http://www.wefunkradio.com/radio/json?pl=textbrief&limitpl=5&from=linuxwidget';
my $C1 = "firefox http://www.wefunkradio.com/radio/";


my @icon = setIcon();
my %eventbox;
my %container;

my $tooltip= Gtk2::Tooltips->new;

my $tray = Gtk2::TrayIcon->new("wefunkradio");
my $eventbox = Gtk2::EventBox->new;
my $hbox = Gtk2::HBox->new(0,0);
	
my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_xpm_data(@icon);
$container{'w'} = Gtk2::Image->new_from_pixbuf($pixbuf);

$eventbox{'w'} = Gtk2::EventBox->new;
$hbox->add($eventbox{'w'});
$eventbox{'w'}->add($container{'w'});

$tray->add($eventbox);
$eventbox->add($hbox);

$eventbox{'w'}->signal_connect('scroll_event', \&scroll);
$eventbox{'w'}->signal_connect('button_release_event', \&click );

$tray->show_all;

&update;

Glib::Timeout->add($DELAY, \&update);
Gtk2->main();


##########################################################################
sub scroll {
	my ($check, $event) = @_;
	&volup ("PCM") if ("up" eq $event->direction);
	&voldown ("PCM") if ("down" eq $event->direction);
	&vol_update;
}

sub click {
	my ($check, $event) = @_;
	if (1 eq $event->button) { exec $C1 unless fork; }
	&popup if (3 eq $event->button)
}

sub volup { system "amixer -c $CARD set $_[0] 5%+ &> /dev/null"; }
sub voldown { system "amixer -c $CARD set $_[0] 5%- &> /dev/null"; }

sub popup {
	my $item_factory = Gtk2::ItemFactory->new("Gtk2::Menu", '<main>', undef);
	my $popup_menu = $item_factory->get_widget('<main>');
	my @menu_items = (
            { path => '/About',       item_type => '<Item>', callback => \&about_dialog},
			{ path => '/Exit',        item_type => '<Item>', callback => \&out}
			);

	$item_factory->create_items(undef, @menu_items);
	$popup_menu->show_all;
	$popup_menu->popup(undef, undef, undef, undef, 0, 0);
}

sub about_dialog {
    my $about = Gtk2::AboutDialog->new;
    $about->set_program_name("WEFUNK widget");
    $about->set_version("0.6");
    $about->set_copyright("(c) 2008 daduke");
    $about->set_comments("Display WEFUNK show information");
    $about->set_website("http://daduke.org");

    $about->set_logo($pixbuf);
    $about->run;
    $about->destroy;
}

sub update {
	my $content;
	my $ua = new LWP::UserAgent(timeout=>2);
	my $response = $ua->get($url);
	if ($response->is_success) {
	    $content = $response->content;
	} else {
	    $content = "{'currentshowname': 'could not get show data!'}";
	}

	my ($json) = $content =~ /{(.+)}/s;
	my @jsons = split ',\n', $json;

	my %json;
	foreach my $line (@jsons) {
		chomp $line;
		my ($key, $value) = $line =~ /^'([^']+)':\s+'(.*)'$/s;
		next unless defined $value;
		$value =~ s/\\'/'/g;
		chomp $value;
		$json{"$key"} = $value;
	}

	my $songlist = $json{"currentplaylisttext"};

	my $text = $json{"currentshowname"};
	if ($json{"nextshowname"}) {
		$text .= " - next is ".$json{"nextshowname"}."\n"
		.$json{"currenttimeelapsed"}." in, ".$json{"currenttimeremaining"}. " to go\n\n"
		.$songlist;
	}
	$tooltip->set_tip($tray, $text);

	return 1;
}

sub vol_update {
	$_ = `amixer -c $CARD`;
	s/\n\s+/ /g;
	my ($pvol) = /'PCM'.*\[(\d+)%\]/;
}

sub out {
	Gtk2->main_quit;
}

sub setIcon {
return ("24 24 524 2",
"  	c #834409",
". 	c #7B4008",
"+ 	c #8B5011",
"\@ 	c #E3B84D",
"# 	c #FFD656",
"\$ 	c #FBC84F",
"% 	c #F8CE55",
"& 	c #BB8B34",
"* 	c #7B3C05",
"= 	c #7B3F07",
"- 	c #7B3E07",
"; 	c #905412",
"> 	c #DDB54C",
", 	c #FFDE61",
"' 	c #FDDB60",
") 	c #B98530",
"! 	c #7F430A",
"~ 	c #854509",
"{ 	c #BA6211",
"] 	c #BA6412",
"^ 	c #C27922",
"/ 	c #E6B94A",
"( 	c #CB8C30",
"_ 	c #AF6E28",
": 	c #D09537",
"< 	c #DBAD41",
"[ 	c #BD822A",
"} 	c #BA6715",
"| 	c #BA600F",
"1 	c #BA6917",
"2 	c #C79537",
"3 	c #E9B946",
"4 	c #C7913A",
"5 	c #D49C3A",
"6 	c #D9AB42",
"7 	c #BC6D19",
"8 	c #88470A",
"9 	c #FF8C1C",
"0 	c #FF8F1E",
"a 	c #FFAB37",
"b 	c #D59F3B",
"c 	c #7C2D01",
"d 	c #833603",
"e 	c #883707",
"f 	c #C38930",
"g 	c #FBC44A",
"h 	c #FFBC40",
"i 	c #FF9E2B",
"j 	c #FF8B1B",
"k 	c #FF8919",
"l 	c #FFA02D",
"m 	c #FFC247",
"n 	c #FCCD53",
"o 	c #B87724",
"p 	c #7A2A01",
"q 	c #823003",
"r 	c #DEA538",
"s 	c #FFB53E",
"t 	c #88490B",
"u 	c #834106",
"v 	c #FE8B1E",
"w 	c #FF9425",
"x 	c #FBB23E",
"y 	c #C78E35",
"z 	c #7A3408",
"A 	c #DB9F21",
"B 	c #A06114",
"C 	c #7A2F04",
"D 	c #A6621B",
"E 	c #DEAD43",
"F 	c #FDBF46",
"G 	c #FFA332",
"H 	c #FFAE39",
"I 	c #FFC74D",
"J 	c #E6B84A",
"K 	c #AB681F",
"L 	c #772D0A",
"M 	c #AC6D17",
"N 	c #883F06",
"O 	c #944408",
"P 	c #F3C34F",
"Q 	c #88490C",
"R 	c #AE7827",
"S 	c #FFB139",
"T 	c #FFB641",
"U 	c #FDC850",
"V 	c #E0AF43",
"W 	c #883A08",
"X 	c #DEA928",
"Y 	c #F9D93B",
"Z 	c #BC801C",
"` 	c #7C3206",
" .	c #8B3C09",
"..	c #C2882F",
"+.	c #EBBD4C",
"\@.	c #FBCF55",
"#.	c #EBC04E",
"\$.	c #C79033",
"%.	c #94420C",
"&.	c #7A300B",
"*.	c #BE832C",
"=.	c #FDDD42",
"-.	c #C17C10",
";.	c #803307",
">.	c #E2A83F",
",.	c #87480B",
"'.	c #E7BD51",
").	c #DBA941",
"!.	c #CA943C",
"~.	c #BF8C3A",
"{.	c #B57927",
"].	c #7D2900",
"^.	c #B2700F",
"/.	c #FFE438",
"(.	c #FFE13C",
"_.	c #E1AE2B",
":.	c #975510",
"<.	c #772702",
"[.	c #9F5011",
"}.	c #C07D25",
"|.	c #9C4D0F",
"1.	c #782905",
"2.	c #914714",
"3.	c #DCA439",
"4.	c #FFDF4A",
"5.	c #FFD431",
"6.	c #974A08",
"7.	c #B06418",
"8.	c #D89027",
"9.	c #87470A",
"0.	c #873605",
"a.	c #7F2800",
"b.	c #762802",
"c.	c #6C2605",
"d.	c #752B07",
"e.	c #81350B",
"f.	c #A86111",
"g.	c #F4BF26",
"h.	c #FDCF30",
"i.	c #FFE03B",
"j.	c #FDD63B",
"k.	c #CD9221",
"l.	c #833505",
"m.	c #661200",
"n.	c #8A3F0E",
"o.	c #CE942F",
"p.	c #FDD649",
"q.	c #FFE144",
"r.	c #FFD632",
"s.	c #F5B923",
"t.	c #782E04",
"u.	c #D1912A",
"v.	c #D77F19",
"w.	c #86460A",
"x.	c #AF660B",
"y.	c #D18F1A",
"z.	c #EDB427",
"A.	c #F0BB34",
"B.	c #F7C234",
"C.	c #F4C439",
"D.	c #E1A927",
"E.	c #C3730D",
"F.	c #D5901A",
"G.	c #F5C129",
"H.	c #FFD633",
"I.	c #FFE036",
"J.	c #B97C19",
"K.	c #924308",
"L.	c #E2B63B",
"M.	c #FFE749",
"N.	c #FFD535",
"O.	c #FDC82A",
"P.	c #EEB624",
"Q.	c #B76F11",
"R.	c #782F05",
"S.	c #E0A52D",
"T.	c #D87514",
"U.	c #864609",
"V.	c #DFA116",
"W.	c #DF9F18",
"X.	c #DE9F1F",
"Y.	c #DEA121",
"Z.	c #E3A921",
"`.	c #EEBC25",
" +	c #F1C72C",
".+	c #C78514",
"++	c #792800",
"\@+	c #A6590A",
"#+	c #E8AE21",
"\$+	c #FECD2E",
"%+	c #BD7817",
"&+	c #A95F15",
"*+	c #E9BD32",
"=+	c #FFD030",
"-+	c #FAC328",
";+	c #D48F17",
">+	c #8B3703",
",+	c #6A2104",
"'+	c #BD7519",
")+	c #DC931C",
"!+	c #E57A16",
"~+	c #87460A",
"{+	c #6F1F03",
"]+	c #6D1E03",
"^+	c #661A03",
"/+	c #621802",
"(+	c #691B01",
"_+	c #742002",
":+	c #923F05",
"<+	c #BB710C",
"[+	c #8F4305",
"}+	c #5B0E00",
"|+	c #9D5A13",
"1+	c #F5C52E",
"2+	c #C68619",
"3+	c #BF7A1C",
"4+	c #F4C634",
"5+	c #FDCA2E",
"6+	c #C57D13",
"7+	c #712A04",
"8+	c #90440D",
"9+	c #DB9E27",
"0+	c #DF9E21",
"a+	c #B9620C",
"b+	c #EB7C17",
"c+	c #E4A72F",
"d+	c #E3A731",
"e+	c #D99E34",
"f+	c #D79C32",
"g+	c #E1A430",
"h+	c #CE8D2A",
"i+	c #984B0F",
"j+	c #671300",
"k+	c #631201",
"l+	c #84360C",
"m+	c #CC912C",
"n+	c #FCD13A",
"o+	c #D69419",
"p+	c #D59423",
"q+	c #FACF37",
"r+	c #EDB326",
"s+	c #7F3A09",
"t+	c #AF6D20",
"u+	c #F4BE33",
"v+	c #B46D11",
"w+	c #974605",
"x+	c #C6640F",
"y+	c #F58219",
"z+	c #894504",
"A+	c #934803",
"B+	c #AD6209",
"C+	c #E5AB2C",
"D+	c #FADD57",
"E+	c #D9A237",
"F+	c #8E3A05",
"G+	c #792705",
"H+	c #B56F1F",
"I+	c #F2C644",
"J+	c #FFDE41",
"K+	c #F4BC26",
"L+	c #C67810",
"M+	c #D7A122",
"N+	c #FFD635",
"O+	c #F8C52A",
"P+	c #9B530C",
"Q+	c #964A12",
"R+	c #E4B13C",
"S+	c #CA801A",
"T+	c #CC6911",
"U+	c #EB7B17",
"V+	c #FD871B",
"W+	c #854006",
"X+	c #CF801B",
"Y+	c #F7C744",
"Z+	c #E6B740",
"`+	c #91440A",
" \@	c #641902",
".\@	c #A05518",
"+\@	c #E9B943",
"\@\@	c #FFE04A",
"#\@	c #FFD835",
"\$\@	c #E5A51C",
"%\@	c #984706",
"&\@	c #6B1901",
"*\@	c #B56E11",
"=\@	c #F8C62A",
"-\@	c #FFD832",
";\@	c #EBB422",
">\@	c #7D3A07",
",\@	c #994F14",
"'\@	c #EFC348",
")\@	c #F29627",
"!\@	c #FC881B",
"~\@	c #FE881B",
"{\@	c #BE8427",
"]\@	c #FBDA5B",
"^\@	c #C17F26",
"/\@	c #671A01",
"(\@	c #85370B",
"_\@	c #D9A43A",
":\@	c #FDDA4E",
"<\@	c #FFD83C",
"[\@	c #FCC529",
"}\@	c #D38B15",
"|\@	c #8A3703",
"1\@	c #6F1D01",
"2\@	c #6D1B00",
"3\@	c #752100",
"4\@	c #C68718",
"5\@	c #FCCF2F",
"6\@	c #FFD933",
"7\@	c #DCA31C",
"8\@	c #6F2C05",
"9\@	c #AA6014",
"0\@	c #F6D459",
"a\@	c #FD9627",
"b\@	c #F6D65E",
"c\@	c #AA5F15",
"d\@	c #692105",
"e\@	c #BA7822",
"f\@	c #F6D44C",
"g\@	c #FEDB43",
"h\@	c #FFD132",
"i\@	c #FECA2C",
"j\@	c #D08B18",
"k\@	c #792702",
"l\@	c #A86E1E",
"m\@	c #EDC032",
"n\@	c #A05A0F",
"o\@	c #641200",
"p\@	c #8A3A04",
"q\@	c #DDA720",
"r\@	c #FFD130",
"s\@	c #FED831",
"t\@	c #D09113",
"u\@	c #682502",
"v\@	c #BE781C",
"w\@	c #FAD257",
"x\@	c #FE8E20",
"y\@	c #F6CB54",
"z\@	c #6B2201",
"A\@	c #B26D0F",
"B\@	c #FFDF35",
"C\@	c #FFE038",
"D\@	c #FFD331",
"E\@	c #FFCD2F",
"F\@	c #FECC2D",
"G\@	c #CE8E19",
"H\@	c #7A2800",
"I\@	c #B47212",
"J\@	c #FFCE24",
"K\@	c #CE8D13",
"L\@	c #772902",
"M\@	c #AE6B12",
"N\@	c #F4C42C",
"O\@	c #FFD231",
"P\@	c #FCD730",
"Q\@	c #BC790F",
"R\@	c #6B2303",
"S\@	c #DAA035",
"T\@	c #FDB540",
"U\@	c #F7D45D",
"V\@	c #A95D12",
"W\@	c #651900",
"X\@	c #833905",
"Y\@	c #BC730E",
"Z\@	c #F6B923",
"`\@	c #FFD731",
" #	c #FFD232",
".#	c #F5C42E",
"+#	c #D19321",
"\@#	c #D18C1B",
"##	c #CE8716",
"\$#	c #D09818",
"%#	c #CB9318",
"&#	c #7F3206",
"*#	c #B16D1D",
"=#	c #FFD031",
"-#	c #F9CF2D",
";#	c #964C08",
">#	c #92410A",
",#	c #F6C651",
"'#	c #884A0C",
")#	c #B47F2C",
"!#	c #F1C147",
"~#	c #D19630",
"{#	c #AD6319",
"]#	c #772501",
"^#	c #793003",
"/#	c #C78214",
"(#	c #FFCD2B",
"_#	c #FFD634",
":#	c #FBD239",
"<#	c #F8CD35",
"[#	c #BA7817",
"}#	c #8D3E06",
"|#	c #D49E1B",
"1#	c #F1CE35",
"2#	c #F5CF40",
"3#	c #FDCF36",
"4#	c #FFCE2F",
"5#	c #FFD834",
"6#	c #D69219",
"7#	c #762902",
"8#	c #F2BE46",
"9#	c #8C4C0D",
"0#	c #F79425",
"a#	c #CD831C",
"b#	c #D49624",
"c#	c #DAA32E",
"d#	c #AB671C",
"e#	c #722200",
"f#	c #AA650F",
"g#	c #FDCA29",
"h#	c #FFE035",
"i#	c #DBA621",
"j#	c #873B05",
"k#	c #762D05",
"l#	c #BF7B13",
"m#	c #F9C327",
"n#	c #FFDA31",
"o#	c #FFDF33",
"p#	c #BF7710",
"q#	c #782604",
"r#	c #F2B93E",
"s#	c #874509",
"t#	c #F78218",
"u#	c #D36F12",
"v#	c #BA6611",
"w#	c #C27B16",
"x#	c #DDA22A",
"y#	c #BE832A",
"z#	c #792A05",
"A#	c #8B4407",
"B#	c #BF7B12",
"C#	c #EBAF21",
"D#	c #FBC626",
"E#	c #AD6A10",
"F#	c #721D00",
"G#	c #752200",
"H#	c #B36D0D",
"I#	c #D7971B",
"J#	c #DD9E1E",
"K#	c #B97110",
"L#	c #692201",
"M#	c #BE7B22",
"N#	c #E09422",
"O#	c #FC871B",
"P#	c #F27F18",
"Q#	c #DD7114",
"R#	c #CD690F",
"S#	c #D07C18",
"T#	c #DFA129",
"U#	c #CE942D",
"V#	c #A15715",
"W#	c #873606",
"X#	c #803104",
"Y#	c #894007",
"Z#	c #7A2D03",
"`#	c #AA6719",
" \$	c #D09B2C",
".\$	c #AD6A1D",
"+\$	c #8E3E09",
"\@\$	c #7F3004",
"#\$	c #7D2E04",
"\$\$	c #873405",
"%\$	c #B27019",
"&\$	c #E29F21",
"*\$	c #D07212",
"=\$	c #F48119",
"-\$	c #E77815",
";\$	c #DB7E17",
">\$	c #D58E20",
",\$	c #CF8D22",
"'\$	c #CB8A24",
")\$	c #BB7A23",
"!\$	c #AA631C",
"~\$	c #B4701D",
"{\$	c #D49522",
"]\$	c #D39420",
"^\$	c #CE8E21",
"/\$	c #C98821",
"(\$	c #BD7B23",
"_\$	c #B97822",
":\$	c #C5801C",
"<\$	c #CB8718",
"[\$	c #B4660D",
"}\$	c #D16B11",
"|\$	c #FF8D1C",
"1\$	c #FF8E1D",
"2\$	c #F98319",
"3\$	c #DF7613",
"4\$	c #CC7615",
"5\$	c #C77C18",
"6\$	c #C7831C",
"7\$	c #C37F1D",
"8\$	c #C27E19",
"9\$	c #C07111",
"0\$	c #C1640D",
"a\$	c #C76E12",
"b\$	c #C47516",
"c\$	c #BD7518",
"d\$	c #B87117",
"e\$	c #B36A11",
"f\$	c #A8580A",
"g\$	c #B85A0C",
"h\$	c #EE7D17",
"i\$	c #BB6311",
"j\$	c #B35D0F",
"k\$	c #9D4D0A",
"l\$	c #8E4305",
"m\$	c #8C4504",
"n\$	c #904B07",
"o\$	c #8D4705",
"p\$	c #914506",
"q\$	c #A0500B",
"r\$	c #9F4E0B",
"s\$	c #904306",
"t\$	c #883E03",
"u\$	c #843C02",
"v\$	c #843B03",
"w\$	c #8C4207",
"x\$	c #A2530C",
"y\$	c #B65F10",
"  . . + \@ # \$ % & * = . . . . . - ; > , ' ) !   ",
"~ { ] ^ / ( _ : < [ } | { { { | 1 2 3 4 5 6 7 ~ ",
"8 9 0 a b c d e f g h i j k 9 l m n o p q r s t ",
"u v w x y z A B C D E F a G H I J K L M N O P Q ",
"R S T U V W X Y Z `  ...+.\@.#.\$.%.&.*.=.-.;.>.,.",
"'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.",
"0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.",
"x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.",
"V.W.X.Y.Z.`. +.+++\@+#+\$+%+&+*+=+-+;+>+,+'+)+!+~+",
"{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+0+a+b+~+",
"c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+8 ",
"z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+8 ",
"W+X+Y+Z+`+ \@.\@+\@\@\@#\@\$\@%\@&\@*\@=\@-\@;\@>\@,\@'\@)\@!\@~\@8 ",
"{\@]\@^\@/\@(\@_\@:\@<\@[\@}\@|\@1\@2\@3\@4\@5\@6\@7\@8\@9\@0\@a\@~\@8 ",
"b\@c\@d\@e\@f\@g\@h\@i\@j\@k\@l\@m\@n\@o\@p\@q\@r\@s\@t\@u\@v\@w\@x\@8 ",
"y\@z\@A\@B\@C\@D\@E\@F\@G\@H\@I\@J\@K\@L\@}+M\@N\@O\@P\@Q\@R\@S\@T\@t ",
"U\@V\@W\@X\@Y\@Z\@`\@ #.#+#\@###\$#%#&#*#4+=#O\@-#;#>#,#'#",
")#!#~#{#]#^#/#(#_#:#<#[#}#|#1#2#3#4#E\@5#6#7#8#Q ",
"9#0#a#b#c#d#e#f#g#h#I.i#j#k#l#m#n#6\@6\@o#p#q#r#t ",
"s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#d H#I#J#K#L#M#N#9.",
"8 O#P#Q#R#S#T#U#V#W#X#Y#Z#`# \$.\$+\$\@\$#\$\$\$%\$&\$*\$U.",
"8 ~\@~\@O#=\$-\$;\$>\$,\$'\$)\$!\$~\${\$]\$^\$/\$(\$_\$:\$<\$[\$}\$U.",
"8 |\$|\$|\$1\$9 2\$3\$4\$5\$6\$7\$8\$9\$0\$a\$b\$c\$d\$e\$f\$g\$h\$~+",
"~ { { { { i\$i\$j\$k\$l\$m\$n\$o\$p\$q\$r\$s\$t\$u\$v\$w\$x\$y\$~ ");
}
