# Copyright [2010] [Sebastian Köhler] # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # #=============================================================================== # # FILE: weerock.pl # # DESCRIPTION: WeeChat Pluging to show others youre good taste in music # # Supported Players: # audacious # banshee # exaile # moc # mpc # ncmpcpp # pytone # quod libet # rhytmbox(requires Net::DBus) # # REQUIREMENTS: weechat 0.3.0, one of the above players # AUTHOR: Sebastian Köhler (sk), sebkoehler@whoami.org.uk # WEBSITE: http://hg.whoami.org.uk/weerock # VERSION: 0.3 # CREATED: 31.01.2010 04:17:41 #=============================================================================== use strict; my $description = "Rock this chat!"; my $helptext = "Use this command to show your current song in the channel\n\n"; weechat::register('weerock','Sebastian Köhler','0.3','Apache 2.0', $description,'',''); weechat::hook_command('audacious',$description,"","$helptext","","audacious", ""); weechat::hook_command('banshee',$description,"","$helptext","","banshee",""); weechat::hook_command('exaile',$description,"","$helptext","","exaile",""); weechat::hook_command('moc',$description,"","$helptext","","moc",""); weechat::hook_command('mpc',$description,"", "$helptext". "SETTINGS\n". " /set plugins.var.perl.weerock.mpc_host PASSWORD\@IP\n". " Default: localhost\n". " /set plugins.var.perl.weerock.mpc_port PORT\n". " Default: 6600\n", "","mpc",""); weechat::hook_command('ncmpcpp',$description,"", "$helptext". "SETTINGS". " /set plugins.var.perl.weerock.ncmpcpp_host PASSWORD\@IP\n". " Default: localhost\n". " /set plugins.var.perl.weerock.ncmpcpp_port PORT\n". " Default: 6600\n", "","ncmpcpp",""); weechat::hook_command('pytone',$description,"","$helptext","","pytone",""); weechat::hook_command('quodlibet',$description,"","$helptext","","quodlibet", ""); weechat::hook_command('rhythmbox',$description,"","$helptext","","rhythmbox", ""); weechat::hook_command('weerock',$description,"","Show help for weerock","", "weerock",""); return weechat::WEECHAT_RC_OK; sub audacious { load_defaults(); my $cmd = "audtool2 --current-song-tuple-data artist ". "--current-song-tuple-data album ". "--current-song-tuple-data title ". "--current-song-output-length-seconds ". "--current-song-length-seconds 2> /dev/null"; my $exp = "(.*)\n(.*)\n(.*)\n(.*)\n(.*)"; my ($artist,$album,$title,$ct,$tt) = ("","","","",""); if(`pgrep audacious`) { ($artist,$album,$title,$ct,$tt) = `$cmd` =~ /$exp/; $ct = sec_to_min($ct); $tt = sec_to_min($tt); } echo_to_channel(build_message($artist,$album,$title,$ct,$tt)); } sub banshee { load_defaults(); my $cmd = "banshee --query-artist --query-album --query-title ". "--query-position --query-duration 2> /dev/null"; my $exp = "artist: (.*)\nalbum:\ (.*)\ntitle: (.*)\nposition: ". "(.*),.*\nduration: (.*),.*"; my ($artist,$album,$title,$ct,$tt) = ("","","","",""); if(`pgrep banshee`) { ($artist,$album,$title,$ct,$tt) = `$cmd` =~ /$exp/; $ct = sec_to_min($ct); $tt = sec_to_min($tt); } echo_to_channel(build_message($artist,$album,$title,$ct,$tt)); } sub exaile { load_defaults(); my $cmd = "exaile --get-artist --get-album --get-title ". "--current-position --get-length 2>/dev/null"; my $exp = "(.*)\n(.*)\n(.*)\n(.*)\n(.*)"; my ($artist,$album,$title,$ct,$tt) = ("","","","",""); if(`pgrep exaile`) { ($album,$artist,$title,$tt,$ct) = `$cmd` =~ /$exp/; $tt = sec_to_min(int($tt)); } echo_to_channel(build_message($artist,$album,$title,$ct,$tt)); } sub moc { load_defaults(); my $cmd = "mocp -i 2> /dev/null"; my $exp = "Artist: (.*)\n.*: (.*)\n.*: (.*)\n.*: (.*)\n.*\n.*\n.*: (.*)"; my ($artist,$album,$title,$ct,$tt) = ("","","","",""); if(`pgrep mocp`) { ($artist,$title,$album,$tt,$ct) = `cmd` =~ /$exp/; } echo_to_channel(build_message($artist,$album,$title,$ct,$tt)); } sub mpc { load_defaults(); my $host = weechat::config_get_plugin("mpc_host"); my $port = weechat::config_get_plugin("mpc_port"); my $cmd = "mpc status -h $host -p $port -f \"%artist% #| ". "%album% #| %title%\""; my $exp = '(.*) \| (.*) \| (.*)\n.*(\d+:\d{2})/(\d+:\d{2})'; my ($artist,$album,$title,$ct,$tt) = ("","","","",""); if(`pgrep mpd`) { ($artist,$album,$title,$ct,$tt) = `$cmd` =~ /$exp/; } echo_to_channel(build_message($artist,$album,$title,$ct,$tt)); } sub ncmpcpp { load_defaults(); my $host = weechat::config_get_plugin("ncmpcpp_host"); my $port = weechat::config_get_plugin("ncmpcpp_port"); my $cmd = "ncmpcpp -h $host -p $port --now-playing ". "'%a ^ %b ^ %t' 2> /dev/null"; my $exp = '(.*) \^ (.*) \^ (.*)'; my ($artist,$album,$title) = ("","",""); if(`pgrep mpd`) { ($artist,$album,$title) = `$cmd` =~ /$exp/; } echo_to_channel(build_message($artist,$album,$title,"","")); } sub pytone { load_defaults(); my $cmd = "pytonectl getplayerinfo 2> /dev/null"; my $exp = '(.*) - (.*) \( (\d?\d:\d\d)\/ (\d?\d:\d\d)\)'; my ($artist,$title,$ct,$tt) = ("","","",""); if(`pgrep pytone`) { ($artist,$title,$ct,$tt) = `$cmd` =~ /$exp/; } echo_to_channel(build_message($1,"",$2,$3,$4)); } sub quodlibet { load_defaults(); my $cmd = "quodlibet --print-playing 2> /dev/null"; my $exp = "(.*) \- (.*) \- .* \- (.*)"; my ($artist,$album,$title) = ("","",""); if(`pgrep quodlibet`) { ($artist,$album,$title) = `$cmd` =~ /$exp/; } echo_to_channel(build_message($artist,$album,$title,"","")); } sub rhythmbox { require Net::DBus; load_defaults(); my ($artist,$album,$title,$ct,$tt) = ("","","","",""); if(`pgrep rhythmbox`) { my $bus = Net::DBus->session; my $rboxservice = $bus->get_service("org.gnome.Rhythmbox"); my $rboxplayer = $rboxservice->get_object("/org/gnome/Rhythmbox/Player"); my $rboxshell = $rboxservice->get_object("/org/gnome/Rhythmbox/Shell"); if($rboxplayer->getPlaying()) { my $song = $rboxshell->getSongProperties($rboxplayer->getPlayingUri()); my $ct = sec_to_min($rboxplayer->getElapsed()); if(exists $song->{'artist'}) { $artist = $song->{'artist'}; } if(exists $song->{'title'}) { $title = $song->{'title'}; } if(exists $song->{'album'}) { $album = $song->{'album'}; } if(exists $song->{'duration'}) { $tt = sec_to_min($song->{'duration'}); } } } echo_to_channel(build_message($artist,$album,$title,$ct,$tt)); } sub weerock { my $bold = weechat::color("bold"); my $unbold = weechat::color("-bold"); my $help = "%bold%NAME%unbold%\n". " weerock - $description\n". "%bold%COMMANDS%unbold%\n". " /mpc\n". " /moc\n". " /ncmpcpp\n". " /rhythmbox\n\n". " For more information do:\n". " /help command\n\n". "%bold%GLOBAL SETTINGS%unbold%\n". " /set plugins.var.perl.weerock.format STRING\n". " STRING will be send to the Channel\n". " Following Variables are available:\n". " %artist% - Artist\n". " %album% - Album\n". " %title% - Title\n". " %ct% - Current Time\n". " %tt% - Total Time\n". " Default: \"%artist%(%album%) - %title% [%ct%/%tt%]\"\n". " /set plugins.var.perl.weerock.left_string STRING\n". " STRING is printed before the song information\n". " Default: \"/me np\"\n". " /set plugins.var.perl.weerock.right_string STRING\n". " STRING is printed after the song information\n". " Default: \"\""; $help =~ s/%bold%/$bold/g; $help =~ s/%unbold%/$unbold/g; echo_to_buffer($help); } # ## ### Basic functions ## # sub echo_to_channel { my ($string) = @_; my $buffer = weechat::current_buffer; my $left_string = weechat::config_get_plugin("left_string"); my $right_string = weechat::config_get_plugin("right_string" eq ""); weechat::command($buffer, "$left_string" . $string . "$right_string"); } sub echo_to_buffer { my ($string) = @_; my $buffer = weechat::current_buffer; weechat::print($buffer,$string); } sub sec_to_min { my ($sec) = @_; if(! $sec) { return 0; } return int($sec/60).":".sprintf("%02d",$sec%60); } sub build_message { my ($artist, $album, $title, $ct, $tt) = @_; my $message = weechat::config_get_plugin("format"); $message =~ s/%artist%/$artist/g; $message =~ s/%album%/$album/g; $message =~ s/%title%/$title/g; $message =~ s/%ct%/$ct/g; $message =~ s/%tt%/$tt/g; $message =~ s/\n//g; return $message; } sub load_defaults { if(weechat::config_get_plugin("mpc_host") eq "") { weechat::config_set_plugin("mpc_host", "localhost"); } if(weechat::config_get_plugin("mpc_port") eq ""){ weechat::config_set_plugin("mpc_port", 6600); } if(weechat::config_get_plugin("ncmpcpp_host") eq ""){ weechat::config_set_plugin("ncmpcpp_host", "localhost"); } if(weechat::config_get_plugin("ncmpcpp_port") eq ""){ weechat::config_set_plugin("ncmpcpp_port", "6600"); } if(weechat::config_get_plugin("left_string" eq "")) { weechat::config_set_plugin("left_string", "/me np"); } if(weechat::config_get_plugin("right_string" eq "")) { weechat::config_set_plugin("right_string", ""); } if(weechat::config_get_plugin("format") eq "") { weechat::config_set_plugin("format", "%artist%(%album%) ". "- %title% [%ct%/%tt%]"); } }