summaryrefslogtreecommitdiffstats
path: root/scripts/irssiBlaster.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/irssiBlaster.pl')
-rw-r--r--scripts/irssiBlaster.pl446
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