html/xmms.pl


   1 # XMMS-InfoPipe front-end - allow /np [dest]
   2 #
   3 #   Thanks to ak for suggestions and even changes.
   4 #
   5 #   /set xmms_fifo <dest of xmms-infopipe fifo>
   6 #   /set xmms_format <format of printed text>
   7 #   /set xmms_format_streaming <format for streams>
   8 #   /set xmms_print_if_stopped <ON|OFF>
   9 #   /set xmms_format_time <time format> - default is %m:%s
  10 # 
  11 #   xmms_format* takes these arguments:
  12 #       Variable    Name        Example
  13 #   ----------------------------------------------------
  14 #   Song specific:
  15 #       %status     Status          Playing
  16 #       %title      Title           Blue Planet Corporation - Open Sea
  17 #       %file       File            /mp3s/blue planet corporation - open sea.mp3
  18 #       %length     Length          9:13
  19 #       %pos        Position        0:08
  20 #       %bitrate    Bitrate         160kbps
  21 #       %freq       Sampling freq.  44.1kHz
  22 #       %pctdone    Percent done    1.4%
  23 #       %channels   Channels        2
  24 #   Playlist specific:
  25 #       %pl_total   Total entries
  26 #       %pl_current Position in playlist
  27 #       ¤pl_pctdone Playlist Percent done
  28 use strict;
  29 use Irssi;
  30 use vars qw($VERSION %IRSSI);
  31 $VERSION = "2.0";
  32 %IRSSI = {
  33     authors     => 'Simon Shine',
  34     contact     => 'simon@blueshell.dk',
  35     name        => 'xmms',
  36     description => 'XMMS-InfoPipe front-end - allow /np [-help] [dest]',
  37     license     => 'Public Domain',
  38     changed     => '2004-01-15'
  39 };
  40 
  41 Irssi::settings_add_str('xmms', 'xmms_fifo', '/tmp/xmms-info');
  42 Irssi::settings_add_str('xmms', 'xmms_format', 'np: %title at %bitrate [%pos of %length]');
  43 Irssi::settings_add_str('xmms', 'xmms_format_streaming', 'streaming: %title at %bitrate [%file]');
  44 Irssi::settings_add_str('xmms', 'xmms_format_time', '%m:%s');
  45 Irssi::settings_add_bool('xmms', 'xmms_print_if_stopped', 'yes');
  46 
  47 Irssi::command_bind('np', \&cmd_xmms);
  48 Irssi::command_bind('xmms', \&cmd_xmms);
  49 # Tab completition
  50 Irssi::command_bind('np help', \&cmd_xmms);
  51 Irssi::command_bind('xmms help', \&cmd_xmms);
  52 
  53 sub cmd_xmms {
  54     my ($args, $server, $witem) = @_;
  55 
  56     $args =~ s/^\s+//;
  57     $args =~ s/\s+$//;
  58 
  59     if ($args =~ /^help/) {
  60       print CRAP q{
  61 Valid format strings for xmms_format and xmms_format_streaming:
  62         %%status, %%title, %%file, %%length, %%pos, %%bitrate,
  63         %%freq, %%pctdone, %%channels, %%pl_total, %%pl_current
  64 
  65 Example: /set xmms_format np: %%title at %%bitrate [%%pctdone]
  66 
  67 Valid format string for xmms_format_time:
  68         %%m, %%s
  69 
  70 Example: /set xmms_format_time %%m minutes, %%s seconds
  71 };
  72       return;
  73     }
  74 
  75     my ($xf) = Irssi::settings_get_str('xmms_fifo');
  76     if (!-r $xf) {
  77         if (!-r '/tmp/xmms-info') {
  78             Irssi::print "Couldn't find a valid XMMS-InfoPipe FIFO.";
  79             return;
  80         }
  81         $xf = '/tmp/xmms-info';
  82     }
  83 
  84     my %xi;
  85 
  86     open(XMMS, $xf);
  87     while (<XMMS>) {
  88         chomp;
  89         my ($key, $value) = split /: /, $_, 2;
  90         $xi{$key} = $value;
  91     }
  92     close(XMMS);
  93 
  94     my %fs;
  95 
  96     # %status
  97     $fs{'status'} = $xi{'Status'};
  98     # %title
  99     if ($fs{'status'} ne "Playing") {
 100         if (Irssi::settings_get_bool('xmms_print_if_stopped')) {
 101             $fs{'title'} = sprintf('(%s) %s', $fs{'status'}, $xi{'Title'});
 102         } else {
 103             Irssi::print "XMMS is currently not playing.";
 104             return;
 105         }
 106     } else {
 107         $fs{'title'} = $xi{'Title'};
 108     }
 109     # %file
 110     $fs{'file'} = $xi{'File'};
 111     # %length
 112     $fs{'length'} = &format_time($xi{'Time'});
 113     # %pos
 114     $fs{'pos'} = &format_time($xi{'Position'});
 115     # %bitrate
 116     $fs{'bitrate'} = sprintf("%.0fkbps", $xi{'Current bitrate'} / 1000);
 117     # %freq
 118     $fs{'freq'} = sprintf("%.1fkHz", $xi{'Samping Frequency'} / 1000);
 119     # %pctdone
 120     if ($xi{'uSecTime'} > 0) {
 121         $fs{'pctdone'} = sprintf("%.1f%%%%", ($xi{'uSecPosition'} / $xi{'uSecTime'}) * 100);
 122     } else {
 123         $fs{'pctdone'} = "0.0%%";
 124     }
 125     # %channels
 126     $fs{'channels'} = $xi{'Channels'};
 127     # %pl_total
 128     $fs{'pl_total'} = $xi{'Tunes in playlist'};
 129     # %pl_current
 130     $fs{'pl_current'} = $xi{'Currently playing'};
 131     # %pl_pctdone
 132     $fs{'pl_pctdone'} = sprintf("%.1f%%%%", ($fs{'pl_current'} / ($fs{'pl_total'} ? $fs{'pl_total'} : 1)) * 100);
 133 
 134 
 135     my ($format) = ($xi{'uSecTime'} == "-1") ?
 136         Irssi::settings_get_str('xmms_format_streaming') :
 137         Irssi::settings_get_str('xmms_format');
 138     foreach (keys %fs) {
 139         $format =~ s/\%$_/$fs{$_}/g;
 140     }
 141 
 142     # sending it.
 143     if ($server && $server->{connected} && $witem &&
 144         ($witem->{type} eq "CHANNEL" || $witem->{type} eq "QUERY")) {
 145         if ($args eq "") {
 146             $witem->command("/SAY $format");
 147         } else {
 148             $witem->command("/MSG $args $format");
 149         }
 150     } else {
 151         Irssi::print($format);
 152     }
 153 }
 154 
 155 sub format_time {
 156     my ($m, $s) = split /:/, @_[0], 2;
 157     my ($format) = Irssi::settings_get_str('xmms_format_time');
 158     $format =~ s/\%m/$m/g;
 159     $format =~ s/\%s/$s/g;
 160     return $format;
 161 }