diff options
Diffstat (limited to '')
-rw-r--r-- | scripts/irssiBlaster.pl | 446 |
1 files changed, 446 insertions, 0 deletions
diff --git a/scripts/irssiBlaster.pl b/scripts/irssiBlaster.pl new file mode 100644 index 0000000..1775763 --- /dev/null +++ b/scripts/irssiBlaster.pl @@ -0,0 +1,446 @@ +# irssiBlaster 1.6 +# Copyright (C) 2003 legion +# +# "Now Playing" (mp3blaster) in Irssi and more. +# +# - mp3blaster (http://www.stack.nl/~brama/mp3blaster.html) +# - irssi (http://irssi.org) +# for /npsend (EXPERIMENTAL): +# - lsof (ftp://vic.cc.purdue.edu/pub/tools/unix/lsof/) +# +# NOTE: these applications are available in any linux distribution. +# +# should work with any version (i'm using irssi 0.8.8 & mp3blaster 3.2.0) +# bug reports,features requests or comments -> a.lepore@email.it +# +# License: +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. www.gnu.org +# +################################################################################# +# *** USAGE: +# +# /np : display the "Artist - Song" played in current window, +# any argument is printed after the song name (i.e. you own comment). +# +# /npa : like /np, but prints "Artist - Album [Year]". +# If there isn't an appropriate album tag,print nothing. +# +# /anp : /np in all channels. +# +# /anpa : /npa in all channels. +# +# /npinfo : display all available info for the current file. +# +# /cleanbar : clean the statubar item (until the next song). +# +# /npsend NICK : *EXPERIMENTAL* (irssi often CRASH) +# send the current played file to NICK user. +# maybe it will be usable in version 2.0. +# +# +# *** SETTINGS: +# +# blaster_bar ON/OFF : statusbar item activation. +# ATTENTION: +# you also have to add the item 'blaster' to your statusbar. +# see: http://irssi.org/?page=docs&doc=startup-HOWTO#c12 +# example: +# /statusbar window add -priority "-10" -alignment right blaster +# +# blaster_infos_path FILE : the file with infos (mp3blaster -f FILE). +# default is ~/.infoz +# +# blaster_bar_prefix STRING : the bar prefix to filename. default is "playing:" +# +# blaster_prefix : the /np prefix to filename. default is "np:" +# +################################################################################# +# Changelog: +# +# 1.6: +# - /npinfo. +# - /cleanbar. +# - /anpa. +# - /npa. +# - help fixes. $infofile is now /tmp/irssiblaster. +# - /npsend (EXPERIMENTAL). +# - /np [comment]. +# - /anp. +# - BUGFIX: no spaces at the end of the filenames. +# - added code comments. +# - prefixes can be changed. +# - statusbar realtime print. +# - 'mp3blaster_infos_path' is now 'blaster_infos_path'. +# +# 1.0: +# - initial release. +# +# TODO: +# - working /npsend +# - (automatic) /cleanbar +# - support for others stuff (album,time..) +# - /help +# - use strict; +################################################################################# + +use strict; +use Irssi; +use Irssi::TextUI; +use vars qw($VERSION %IRSSI); + +$VERSION = '1.6'; +%IRSSI = ( + authors => 'legion', + contact => 'a.lepore@email.it', + name => 'irssiBlaster', + description => 'Display the song played by mp3blaster in channels and statusbar. See the top of the file for usage.', + sbitems => 'blaster', + license => 'GNU GPLv2 or later', + changed => 'Fri Oct 31 12:22:08 CET 2003', +); + +# TODO get rid of all those globals. This script needs some serious rework. +my (@all, @artist, @title, @album, @year, @name, @status, @comment, @mode, @format, @bitrate, @samplerate, @length, @next, @tot); +my ($name, $infofile, $status, $artist, $title, $year, $album, $comment, $format, $bitrate, $mode, $samplerate, $length, $next, $min, $sec, $secs, $prefix, $barprefix, $tot); + +sub get_info { + + my $infofile = Irssi::settings_get_str('blaster_infos_path'); + open (FILE, "<", $infofile); # open and read file with infos + my @all = <FILE>; + close (FILE); + + @artist = grep (/^artist/, @all); # get the lines with tag infos + @title = grep (/^title/, @all); + @album = grep (/^album/, @all); + @year = grep (/^year/, @all); + @name = grep (/^path/, @all); # get the line with filename + +} ## + +sub get_allinfo { + + $infofile = Irssi::settings_get_str('blaster_infos_path'); + open (FILE, "<", $infofile); + @all = <FILE>; + close (FILE); + + @name = grep (/^path/, @all); + $name = $name[0]; + $name =~ s/^path //; + chomp $name; + @status = grep (/^status/, @all); + $status = $status[0]; + $status =~ s/^status //; + chomp $status; + @artist = grep (/^artist/, @all); + $artist = $artist[0]; + $artist =~ s/^artist //; + chomp $artist; + @title = grep (/^title/, @all); + $title = $title[0]; + $title =~ s/^title //; + chomp $title; + @album = grep (/^album/, @all); + $album = $album[0]; + $album =~ s/^album //; + chomp $album; + @year = grep (/^year/, @all); + $year = $year[0]; + $year =~ s/^year //; + chomp $year; + @comment = grep (/^comment/, @all); + $comment = $comment[0]; + $comment =~ s/^comment //; + chomp $comment; + @mode = grep (/^mode/, @all); + $mode = $mode[0]; + $mode =~ s/^mode //; + chomp $mode; + @format = grep (/^format/, @all); + $format = $format[0]; + $format =~ s/^format //; + chomp $format; + @bitrate = grep (/^bitrate/, @all); + $bitrate = $bitrate[0]; + $bitrate =~ s/^bitrate //; + chomp $bitrate; + @samplerate = grep (/^samplerate/, @all); + $samplerate = $samplerate[0]; + $samplerate =~ s/^samplerate //; + chomp $samplerate; + @length = grep (/^length/, @all); + $length = $length[0]; + $length =~ s/^length //; + chomp $length; + @next = grep (/^next/, @all); + $next = $next[0]; + $next =~ s/^next //; + chomp $next; + +} ## + +sub get_status { + + $infofile = Irssi::settings_get_str('blaster_infos_path'); + open (FILE, "<", $infofile); + @all = <FILE>; + close (FILE); + + @status = grep (/^status/, @all); +} ## + +sub get_tag_info { + + $artist = $artist[0]; # is an one-element array + $artist =~ s/^artist //; # remove prefixes + chomp $artist; # remove last char (for correct printing) + $title = $title[0]; + $title =~ s/^title //; + chomp $title; + $album = $album[0]; + $album =~ s/^album //; + chomp $album; + $year = $year[0]; + $year =~ s/^year //; + chomp $year; + + $prefix = Irssi::settings_get_str('blaster_prefix'); + $barprefix = Irssi::settings_get_str('blaster_bar_prefix'); + +} ## + +sub get_name_info { + + $name = $name[0]; + $name =~ s/^path //; # remove prefix + $name =~ s/\.mp3$//i; # remove extensions + $name =~ s/\.ogg$//i; + $name =~ s/_/ /g; # change underscores to spaces + chomp $name; + + $prefix = Irssi::settings_get_str('blaster_prefix'); + $barprefix = Irssi::settings_get_str('blaster_bar_prefix'); + +} ## + +sub noinfo_error { + + $infofile = Irssi::settings_get_str('blaster_infos_path'); + # print help if the info file is not valid + Irssi::print( + "%9IrssiBlaster:%_ \"$infofile\" is not a valid info file. %9Make sure%_ %Rmp3blaster -f $infofile%n %9is running!!!%_\n". + "%9IrssiBlaster:%_ (Hint: put %9alias mp3blaster='mp3blaster -f $infofile'%_ in your ~/.bashrc )" + , MSGLEVEL_CRAP); + +} ## + + + + +sub cmd_np { # /np stuff + +get_info; + +if (@artist && @title) { # if file has a an id3tag + + get_tag_info; + + my ($comment, $server, $witem) = @_; # np: blabla in current window (copied from other scripts..) + if ($witem && ($witem->{type} eq "CHANNEL" || $witem->{type} eq "QUERY")) { + $witem->command("me $prefix $artist - $title $comment"); + } + else { + Irssi::print("$prefix $artist - $title $comment", MSGLEVEL_CRAP); # or print in client level if no active channel/query + } +} + +elsif (@name) { # if there isn't id3tag we use the filename + + get_name_info; + + my ($comment, $server, $witem) = @_; + if ($witem && ($witem->{type} eq "CHANNEL" || $witem->{type} eq "QUERY")) { + $witem->command("me $prefix $name $comment"); + } + else { + Irssi::print("$prefix $name $comment", MSGLEVEL_CRAP); + } +} + +else { noinfo_error; } + +} ## + +sub cmd_npall { # /anp stuff + +get_info; + +if (@artist && @title) { + + get_tag_info; + + my ($comment, $server, $witem) = @_; + Irssi::command("foreach channel /me $prefix $artist - $title $comment"); +} + +elsif (@name) { + + get_name_info; + + my ($comment, $server, $witem) = @_; + Irssi::command("foreach channel /me $prefix $name $comment"); +} + +else { noinfo_error; } + +} ## + +sub cmd_npalbum { # /npa stuff + +if (@artist && @album) { + + get_tag_info; + + if ($year) { $year = "[$year]"; } + + my ($comment, $server, $witem) = @_; + if ($witem && ($witem->{type} eq "CHANNEL" || $witem->{type} eq "QUERY")) { + $witem->command("me $prefix $artist - $album $year $comment"); + } + else { + Irssi::print("$prefix $artist - $album $year $comment", MSGLEVEL_CRAP); + } +} +else { + Irssi::print("%9IrssiBlaster:%_ filename has no album tag.", MSGLEVEL_CRAP); +} +} ## + +sub cmd_npalbumall { # /anpa stuff + +get_info; + +if (@artist && @album) { + + get_tag_info; + + if ($year) { $year = "[$year]"; } + + my ($comment, $server, $witem) = @_; + Irssi::command("foreach channel /me $prefix $artist - $album $year $comment"); +} +else { + Irssi::print("%9IrssiBlaster:%_ filename has no album tag.", MSGLEVEL_CRAP); +} +} ## + +sub cmd_info { + +get_allinfo; + +$tot = $length/60; # calculating minutes:seconds +@tot = split(/\./, $tot); +$min = $tot[0]; +$sec = $min*60; +$secs = $length-$sec; + +Irssi::print("\n%9IrssiBlaster - File Info:%_", MSGLEVEL_CRAP); +Irssi::print("%9F%_ile%9:%_ $name", MSGLEVEL_CRAP); +Irssi::print("%9S%_tatus%9:%_ $status", MSGLEVEL_CRAP); +if ($artist) { Irssi::print("%9A%_rtist%9:%_ $artist", MSGLEVEL_CRAP); } +if ($title) { Irssi::print("%9T%_itle%9:%_ $title", MSGLEVEL_CRAP); } +if ($album) { Irssi::print("%9A%_lbum%9:%_ $album", MSGLEVEL_CRAP); } +if ($year) { Irssi::print("%9Y%_ear%9:%_ $year", MSGLEVEL_CRAP); } +if ($comment) { Irssi::print("%9C%_omment%9:%_ $comment", MSGLEVEL_CRAP); } +Irssi::print("%9-%_----------%9-%_", MSGLEVEL_CRAP); +if ($secs =~ /^.{1}$/) { Irssi::print("%9L%_ength%9:%_ $min\:0$secs", MSGLEVEL_CRAP); } +else { Irssi::print("%9L%_ength%9:%_ $min\:$secs", MSGLEVEL_CRAP); } +if ($format =~ /0$/) { Irssi::print("%9F%_iletype%9:%_ $format (Ogg/Vorbis?)", MSGLEVEL_CRAP); } +else { Irssi::print("%9F%_iletype%9:%_ $format", MSGLEVEL_CRAP); } +Irssi::print("%9R%_ate%9:%_ $bitrate\kb/$samplerate\Khz", MSGLEVEL_CRAP); +if ($mode) { Irssi::print("%9M%_ode%9:%_ $mode", MSGLEVEL_CRAP); } +if ($next) { Irssi::print("%9N%_ext in playlist%9:%_ $next", MSGLEVEL_CRAP); } + +} ## + +####################################################################################### + +sub bar_np { # statusbar stuff + +my ($item, $get_size_only) = @_; + +my $bar_activation = Irssi::settings_get_str('blaster_bar'); +if ($bar_activation =~ /^on$/i) { # display in bar only if /set blaster_bar = ON + +get_info; + +if (@artist && @title) { + + get_tag_info; + + # print in statusbar + $item->default_handler($get_size_only, "{sb $barprefix $artist - $title}", undef, 1); +} + +elsif (@name) { + + get_name_info; + + $item->default_handler($get_size_only, "{sb $barprefix $name}", undef, 1); +} + +else { + $item->default_handler($get_size_only, undef, undef, 1); +} +} +} ## + +sub refresh { + Irssi::statusbar_items_redraw('blaster'); # refresh statusbar + Irssi::statusbars_recreate_items(); +} ## + +sub cmd_cleanbar { # /cleanbar stuff + +my $infofile = Irssi::settings_get_str('blaster_infos_path'); +unlink $infofile; + +} ## + +sub cmd_send { # /npsend stuff + + get_info; + + my @name = grep (/^path/, @all); + my $name = $name[0]; + $name =~ s/path //; + chomp $name; + + # get the full path of the file from 'lsof' (i have lsof 4.64) + my @open_files = grep (/$name$/, `lsof -c mp3blaste -F n`); + $open_files[0] =~ s/^n//; + my $filename = $open_files[0]; + chomp $filename; + + my ($target, $server, $witem) = @_; + $server->command("DCC SEND $target \"$filename\""); # /dcc send + +} ## + + +Irssi::settings_add_str('irssiBlaster', 'blaster_infos_path', '/tmp/irssiblaster'); # register settings +Irssi::settings_add_str('irssiBlaster', 'blaster_prefix', 'np:'); +Irssi::settings_add_str('irssiBlaster', 'blaster_bar_prefix', 'playing:'); +Irssi::settings_add_str('irssiBlaster', 'blaster_bar', 'OFF'); +Irssi::command_bind('np', 'cmd_np'); # register /commands +Irssi::command_bind('anp', 'cmd_npall'); +Irssi::command_bind('npa', 'cmd_npalbum'); +Irssi::command_bind('anpa', 'cmd_npalbumall'); +Irssi::command_bind('npinfo', 'cmd_info'); +Irssi::command_bind('cleanbar', 'cmd_cleanbar'); +Irssi::command_bind('npsend', 'cmd_send'); +Irssi::statusbar_item_register('blaster', undef, 'bar_np'); # register statusbar item +Irssi::timeout_add(1000, 'refresh', undef); # refresh every 1 second |