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 }