#!/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.7 2010/03/30 - back to transparent icon
# 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 = "iceweasel 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.7");
    $about->set_copyright("(c) 2010 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 23 420 2",
"  	c None",
". 	c #FFDB63",
"+ 	c #FFD556",
"\@ 	c #EEB747",
"# 	c #FDD054",
"\$ 	c #FFE066",
"% 	c #FFDE63",
"& 	c #FFD95F",
"* 	c #FFDC61",
"= 	c #F8CF54",
"- 	c #9C4808",
"; 	c #5F1400",
"> 	c #802903",
", 	c #E8AF3A",
"' 	c #FFE364",
") 	c #FFE568",
"! 	c #E09C2B",
"~ 	c #712608",
"{ 	c #AB5A10",
"] 	c #FDD756",
"^ 	c #DAA13C",
"/ 	c #571000",
"( 	c #DE9F1C",
"_ 	c #904106",
": 	c #571100",
"< 	c #B86C17",
"[ 	c #FAD353",
"} 	c #FFE366",
"| 	c #FFE167",
"1 	c #FFDF5F",
"2 	c #C98325",
"3 	c #581100",
"4 	c #944403",
"5 	c #651800",
"6 	c #B76914",
"7 	c #FFE264",
"8 	c #FFE468",
"9 	c #F8CE53",
"0 	c #691901",
"a 	c #DDA025",
"b 	c #FFE745",
"c 	c #C17D16",
"d 	c #601600",
"e 	c #742101",
"f 	c #D9982D",
"g 	c #FFDC5B",
"h 	c #FFE166",
"i 	c #FFDF60",
"j 	c #E9B23D",
"k 	c #933F09",
"l 	c #581000",
"m 	c #B87224",
"n 	c #FFE747",
"o 	c #B86D07",
"p 	c #702404",
"q 	c #F1C351",
"r 	c #FFD553",
"s 	c #F2C14F",
"t 	c #E7BA51",
"u 	c #EDBF44",
"v 	c #7F2A02",
"w 	c #A55906",
"x 	c #FFE337",
"y 	c #FFE33E",
"z 	c #F0C132",
"A 	c #994D09",
"B 	c #591100",
"C 	c #872F04",
"D 	c #DEA133",
"E 	c #E5A936",
"F 	c #913E08",
"G 	c #5F1300",
"H 	c #822C07",
"I 	c #E3AA3E",
"J 	c #FFE550",
"K 	c #FFD32E",
"L 	c #903C02",
"M 	c #A75914",
"N 	c #D79F34",
"O 	c #8D400C",
"P 	c #7C2400",
"Q 	c #691800",
"R 	c #5A1200",
"S 	c #611500",
"T 	c #651400",
"U 	c #7B2801",
"V 	c #FFD32C",
"W 	c #FFD532",
"X 	c #FFD837",
"Y 	c #FFDF40",
"Z 	c #E2AA2C",
"` 	c #8F4105",
" .	c #691500",
"..	c #671500",
"+.	c #883609",
"\@.	c #D79D34",
"#.	c #FEDB50",
"\$.	c #FFDE43",
"%.	c #FFD130",
"&.	c #FBC124",
"*.	c #681A00",
"=.	c #D8962C",
"-.	c #C07E19",
";.	c #9E5208",
">.	c #C07B16",
",.	c #E0A522",
"'.	c #E1AC32",
").	c #EAB330",
"!.	c #E7B43A",
"~.	c #DFAB2D",
"{.	c #BD6B08",
"].	c #DC9119",
"^.	c #FFCF2C",
"/.	c #FFD432",
"(.	c #FFDD3A",
"_.	c #FFD931",
":.	c #6F1D01",
"<.	c #A2540A",
"[.	c #FFE657",
"}.	c #FFE044",
"|.	c #FFCF31",
"1.	c #FFCE2D",
"2.	c #FFCC2A",
"3.	c #C17611",
"4.	c #601700",
"5.	c #EFB735",
"6.	c #ECAF18",
"7.	c #EEB01B",
"8.	c #EFB324",
"9.	c #EFB427",
"0.	c #F3BA27",
"a.	c #FECB27",
"b.	c #FFE137",
"c.	c #F0B41E",
"d.	c #702000",
"e.	c #924004",
"f.	c #EAA91C",
"g.	c #FFD32F",
"h.	c #FFCB2E",
"i.	c #7E2901",
"j.	c #C48121",
"k.	c #FFE13E",
"l.	c #FFC92B",
"m.	c #FFCB2C",
"n.	c #DA9115",
"o.	c #7E2800",
"p.	c #5A1300",
"q.	c #C3791A",
"r.	c #E49F20",
"s.	c #6A1A00",
"t.	c #691900",
"u.	c #631600",
"v.	c #5E1400",
"w.	c #641800",
"x.	c #6F1C00",
"y.	c #822D02",
"z.	c #CA8310",
"A.	c #B26709",
"B.	c #5B0E00",
"C.	c #ECB429",
"D.	c #FFD531",
"E.	c #8D3802",
"F.	c #E0A72E",
"G.	c #FFD838",
"H.	c #FEC62A",
"I.	c #B8690B",
"J.	c #561100",
"K.	c #98470D",
"L.	c #E8B12E",
"M.	c #E2A021",
"N.	c #954B02",
"O.	c #E4A72F",
"P.	c #E4A831",
"Q.	c #D89E35",
"R.	c #D09532",
"S.	c #DC9D2B",
"T.	c #D4942E",
"U.	c #A95F15",
"V.	c #701A00",
"W.	c #5E0E00",
"X.	c #661300",
"Y.	c #A05415",
"Z.	c #F9D044",
"`.	c #AF5B05",
" +	c #F0BD3A",
".+	c #FFD935",
"++	c #E39D1E",
"\@+	c #520E00",
"#+	c #D2912C",
"\$+	c #FAC633",
"%+	c #9F5608",
"&+	c #7C3300",
"*+	c #8C4704",
"=+	c #874001",
"-+	c #9C5303",
";+	c #E09F22",
">+	c #FFE75C",
",+	c #EFC248",
"'+	c #9C4807",
")+	c #681400",
"!+	c #94450B",
"~+	c #E5AE3E",
"{+	c #FFE14C",
"]+	c #FFDA33",
"^+	c #EDA21B",
"/+	c #A65706",
"(+	c #FFDC39",
"_+	c #FFD332",
":+	c #F3BC25",
"<+	c #6E1E00",
"[+	c #A75D1A",
"}+	c #FACF48",
"|+	c #AB6209",
"1+	c #B87415",
"2+	c #F7C843",
"3+	c #F3CB4A",
"4+	c #9F510D",
"5+	c #591000",
"6+	c #87350A",
"7+	c #DFA73D",
"8+	c #FFE051",
"9+	c #FFE03E",
"0+	c #FFCC28",
"a+	c #C4740C",
"b+	c #681700",
"c+	c #6D1B01",
"d+	c #EDAF1D",
"e+	c #FFD633",
"f+	c #FFD932",
"g+	c #E1A31A",
"h+	c #AE621A",
"i+	c #FFDC53",
"j+	c #E6AF3C",
"k+	c #FFE15F",
"l+	c #CA892A",
"m+	c #631700",
"n+	c #742203",
"o+	c #D29834",
"p+	c #FFDD54",
"q+	c #FFDE42",
"r+	c #FFCC2E",
"s+	c #F3B21E",
"t+	c #9C4704",
"u+	c #701F02",
"v+	c #712001",
"w+	c #6B1900",
"x+	c #792300",
"y+	c #F6C427",
"z+	c #FFD333",
"A+	c #FFDD34",
"B+	c #D39114",
"C+	c #510E00",
"D+	c #BD7017",
"E+	c #FFE968",
"F+	c #FFE367",
"G+	c #AA5C12",
"H+	c #5D1400",
"I+	c #B6701C",
"J+	c #FBDB50",
"K+	c #FFE148",
"L+	c #FFD031",
"M+	c #FFCE2E",
"N+	c #FCBF24",
"O+	c #7C2700",
"P+	c #6B1C02",
"Q+	c #FCDE45",
"R+	c #ECB222",
"S+	c #631300",
"T+	c #651300",
"U+	c #9B4B04",
"V+	c #FDD42D",
"W+	c #FFCE31",
"X+	c #FFDF33",
"Y+	c #CA830B",
"Z+	c #500E00",
"`+	c #CC821C",
" \@	c #FFE667",
".\@	c #FCD357",
"+\@	c #651D00",
"\@\@	c #AB610B",
"#\@	c #FFDE34",
"\$\@	c #FFDB34",
"%\@	c #FFD12F",
"&\@	c #FFCD2F",
"*\@	c #FFCF30",
"=\@	c #FCC929",
"-\@	c #822F01",
";\@	c #7E3003",
">\@	c #FDC923",
",\@	c #FCC920",
"'\@	c #A95D07",
")\@	c #5A0E00",
"!\@	c #D9991C",
"~\@	c #FFD733",
"{\@	c #B96F0A",
"]\@	c #E4A836",
"^\@	c #FFDF64",
"/\@	c #FFE064",
"(\@	c #BE741A",
"_\@	c #601500",
":\@	c #A15105",
"<\@	c #E7A11B",
"[\@	c #FFD22E",
"}\@	c #FFD132",
"|\@	c #FFD331",
"1\@	c #F1BE30",
"2\@	c #C27C19",
"3\@	c #F3B325",
"4\@	c #964504",
"5\@	c #FBD829",
"6\@	c #B7720F",
"7\@	c #702207",
"8\@	c #DFA530",
"9\@	c #FFD737",
"0\@	c #FFCD2E",
"a\@	c #FFDA31",
"b\@	c #8F3F03",
"c\@	c #883406",
"d\@	c #FEDA5E",
"e\@	c #FCCF4F",
"f\@	c #E9B139",
"g\@	c #C88324",
"h\@	c #7F2D05",
"i\@	c #9F4E05",
"j\@	c #F3BA23",
"k\@	c #FFD537",
"l\@	c #FFDE40",
"m\@	c #FDCE2E",
"n\@	c #752401",
"o\@	c #8E3B04",
"p\@	c #FAD729",
"q\@	c #FFE144",
"r\@	c #FFD941",
"s\@	c #FFCD30",
"t\@	c #FFCE2F",
"u\@	c #D58C15",
"v\@	c #681B00",
"w\@	c #FDCC4B",
"x\@	c #AB650E",
"y\@	c #CE8E1F",
"z\@	c #F4C337",
"A\@	c #DD9F2F",
"B\@	c #6C1E03",
"C\@	c #6C1E00",
"D\@	c #EAAB1D",
"E\@	c #FFD530",
"F\@	c #FFE035",
"G\@	c #C98010",
"H\@	c #570D00",
"I\@	c #6E1C00",
"J\@	c #CE820D",
"K\@	c #FAC525",
"L\@	c #FFD431",
"M\@	c #FFD62E",
"N\@	c #A05006",
"O\@	c #7C2A08",
"P\@	c #FAC441",
"Q\@	c #772E00",
"R\@	c #8E4400",
"S\@	c #D8971F",
"T\@	c #FACF45",
"U\@	c #8E3E0D",
"V\@	c #5E1500",
"W\@	c #934403",
"X\@	c #C67C11",
"Y\@	c #F2B423",
"Z\@	c #F3C324",
"`\@	c #721F00",
" #	c #8D3803",
".#	c #6F1E00",
"+#	c #AE6106",
"\@#	c #C98317",
"##	c #C88215",
"\$#	c #954103",
"%#	c #551200",
"&#	c #E4A62F",
"*#	c #C98417",
"=#	c #C57D11",
"-#	c #FACB3F",
";#	c #D18D28",
">#	c #9B4C11",
",#	c #6D1D02",
"'#	c #661700",
")#	c #681900",
"!#	c #722001",
"~#	c #F8CB3C",
"{#	c #F1C239",
"]#	c #BB7520",
"^#	c #853307",
"/#	c #6B1D03",
"(#	c #6D1D03",
"_#	c #92420B",
":#	c #E3A526",
"<#	c #DC9418",
"[#	c #C2821A",
"}#	c #E5A628",
"|#	c #EDB735",
"1#	c #DE9D2E",
"2#	c #C68427",
"3#	c #E9AF2B",
"4#	c #C77E11",
"5#	c #A15A09",
"6#	c #D29220",
"7#	c #E4A72A",
"8#	c #E0A531",
"9#	c #DFA42E",
"0#	c #DC9A20",
"a#	c #B16A0B",
"b#	c #7F3600",
"c#	c #8E4600",
"d#	c #A35F0D",
"e#	c #A9650F",
"f#	c #974F04",
"g#	c #7D3500",
"h#	c #793000",
"i#	c #843C00",
"j#	c #823A00",
"k#	c #7B3300",
"l#	c #793200",
"m#	c #7B3400",
"        . + \@ # \$                     % & *     ",
"        = - ; > , '                 ) ! ~ { ]   ",
"        ^ / ( _ : < [ }         | 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.z.A.B.d C.D.E.F.G.H.I.J.K.L.M.N.  ",
"O.P.Q.R.S.T.U.V.W.X.Y.Z.g.`. +.+++\@+#+\$+%+&+    ",
"*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+      ",
"  1+2+3+4+5+6+7+8+9+0+a+b+c+d+e+f+g+J.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+`+ \@  ",
".\@+\@\@\@#\@\$\@%\@&\@*\@=\@-\@;\@>\@,\@'\@B.)\@!\@~\@*\@X+{\@3 ]\@^\@",
"/\@(\@_\@<+:\@<\@[\@}\@|\@1\@2\@3\@4\@5\@6\@7\@8\@9\@0\@L+a\@b\@c\@d\@",
"  e\@f\@g\@h\@R i\@j\@D.k\@l\@m\@n\@o\@p\@q\@r\@s\@t\@&\@.+u\@v\@w\@",
"    x\@y\@z\@A\@B\@C\@D\@E\@E\@F\@G\@H\@I\@J\@K\@E\@L\@W M\@N\@O\@P\@",
"      Q\@R\@S\@T\@U\@V\@W\@X\@Y\@Z\@`\@ #w..#+#\@###\$#%#&#*#",
"            =#-#;#>#,#'#)#!#~#{#]#^#/#(#_#:#<#  ",
"              -+[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#  ",
"                  &+c#d#e#f#g#  h#g#i#j#k#l#    ",
"                        l#m#                    ");
}
