#!/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.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", '
', 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.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# "); }