#!/usr/bin/perl -w # WEFUNK tray widget # copyright 2008 Christian Herzog , distributed under # the terms of the GNU General Public License version 2 or any later version. # thanks to Premek Vyhnal 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", '
', undef); my $popup_menu = $item_factory->get_widget('
'); my @menu_items = ( { path => '/About', item_type => '', callback => \&about_dialog}, { path => '/Exit', item_type => '', 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\$~ "); }