summaryrefslogtreecommitdiffstats
path: root/scripts/amarok_ssh.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/amarok_ssh.pl')
-rw-r--r--scripts/amarok_ssh.pl285
1 files changed, 285 insertions, 0 deletions
diff --git a/scripts/amarok_ssh.pl b/scripts/amarok_ssh.pl
new file mode 100644
index 0000000..091c318
--- /dev/null
+++ b/scripts/amarok_ssh.pl
@@ -0,0 +1,285 @@
+# amarok by Tobias 'camel69' Wulff
+
+use strict;
+use vars qw($VERSION %IRSSI);
+$VERSION = "1.0";
+%IRSSI = (
+ authors => "Tobias 'camel69' Wulff",
+ contact => "camel69(at)codeeye.de",
+ name => "amaroK (via ssh)",
+ description => "Retrievs song infos and controls amaroK via dcop, optionally running on another computer via ssh",
+ license => "Public Domain",
+ commands => "amarok",
+ url => "http://www.codeeye.de/irssi/"
+);
+
+use Irssi;
+
+Irssi::settings_add_bool('amarok', 'amarok_use_ssh', 1);
+Irssi::settings_add_str('amarok', 'amarok_ssh_client', 'localhost');
+Irssi::settings_add_str('amarok', 'amarok_dcop_user', '');
+
+sub show_help() {
+ my $help = $IRSSI{name}." ".$VERSION."
+/amarok song [loud]
+ Prints the artist and title of the song which is currently played.
+ If the argument loud is given, all users in the current channel can
+ see what song you are currently listening.
+/amarok time [loud]
+ Prints the total time of the song as well as the played time
+ and remaining time. Same behaviour for given argument loud
+ as above.
+/amarok pause
+ Pauses (or unpauses) the current song.
+/amarok play
+ Plays the current song (again).
+/amarok stop
+ Stops the current song.
+/amarok next
+ Skips to the next song.
+/amarok prev
+ Skips to the previous song.
+/amarok seek [+|-]secs|min:secs
+ Seeks to the given position. If + or - is given amaroK seeks
+ relatively the amount of minutes and/or seconds to the
+ current position.
+/amarok vol [0 to 100]
+ Prints or changes the output volume of amaroK.
+/amarok mute
+ Toggles between volume 0 and the last used volume.
+/amarok help
+ Prints this help text.
+
+Settings you can change with /SET
+ amarok_use_ssh: Enable or disable remote amaroK'ing
+ amarok_ssh_client: IP or hostname of the remote pc
+ amarok_dcop_user: user who is running dcop and amaroK";
+
+ print CLIENTCRAP $help;
+}
+
+my $preprint = '%Bamarok%n> ';
+
+# Load settings
+my $amarok_use_ssh = Irssi::settings_get_bool('amarok_use_ssh');
+my $ssh_client = Irssi::settings_get_str('amarok_ssh_client');
+my $dcop_user = Irssi::settings_get_str('amarok_dcop_user');
+
+sub cmd ($) {
+ my ($postcmd) = @_;
+ my $dcop_precmd = 'dcop --user '.$dcop_user.' amarok player';
+
+ if ($amarok_use_ssh == 1) {
+ #print "ssh ".$ssh_client." '".$dcop_precmd." ".$postcmd."'";
+ return `ssh $ssh_client '$dcop_precmd $postcmd'`;
+ } else {
+ #print $dcop_precmd.' '.$postcmd;
+ return `$dcop_precmd $postcmd`;
+ }
+}
+
+sub amarokSong ($$) {
+ my($witem, $me_cmd) = @_;
+ if ($me_cmd == 1) {
+ if (!$witem or $witem->{type} ne 'CHANNEL') {
+ print CLIENTCRAP $preprint."The option 'loud' can only be used in channels.";
+ return;
+ }
+ }
+
+ my $artist = cmd('artist');
+ my $title = cmd('title');
+ my $text = 'listening to '.$artist.' - '.$title;
+ $text =~ s/\n//g;
+
+ if ($me_cmd == 1) {
+ $witem->command("ME is ".$text);
+ } else {
+ print CLIENTCRAP $preprint.$text;
+ }
+}
+
+sub amarokTime($$) {
+ my ($witem, $me_cmd) = @_;
+ if ($me_cmd == 1 and (!$witem or $witem->{type} ne 'CHANNEL')) {
+ print CLIENTCRAP $preprint."The option 'loud' can only be used in channels.";
+ return;
+ }
+
+ # Zeiten in Sekunden holen
+ my $time_total_secs = cmd('trackTotalTime');
+ my $time_played_secs = cmd('trackCurrentTime');
+ my $time_remaining_secs = $time_total_secs - $time_played_secs;
+
+ # Zeiten in richtige Minutenangabe umwandeln
+ my @time_total = (0, $time_total_secs % 60);
+ $time_total[0] = ($time_total_secs - $time_total[1]) / 60;
+ my @time_played = (0, $time_played_secs % 60);
+ $time_played[0] = ($time_played_secs - $time_played[1]) / 60;
+ my @time_remaining = (0, $time_remaining_secs % 60);
+ $time_remaining[0] = ($time_remaining_secs - $time_remaining[1]) / 60;
+
+ # Text bauen und ausgeben
+ # Gesamtzeit
+ my $text = 'Total time of track is '.$time_total[0].':';
+ if ($time_total[1] < 10) { $text .= '0'; }
+ $text .= $time_total[1];
+
+ # Gespielte Zeit
+ $text .= ' (played: '.$time_played[0].':';
+ if ($time_played[1] < 10) { $text .= '0'; }
+ $text .= $time_played[1];
+
+ # Verbleibende Zeit
+ $text .= ' / remaining: '.$time_remaining[0].':';
+ if ($time_remaining[1] < 10) { $text .= '0'; }
+ $text .= $time_remaining[1].')';
+
+ if ($me_cmd == 1) {
+ $witem->command("SAY ".$text);
+ } else {
+ print CLIENTCRAP $preprint.$text;
+ }
+}
+
+sub amarokSeek ($) {
+ my($time) = @_;
+
+ # format correct?
+ # just seconds: + or -, some numbers (seconds)
+ # mm:ss format: + or -, some numbers (minutes), :, 2 numbers (seconds)
+ if ($time !~ /^(\+|-)?[0-9]+$/ and
+ $time !~ /^(\+|-)?[0-9]+:[0-9]{2}$/) {
+ print CLIENTCRAP $preprint.'%RERROR%n: Wrong time format (see help for correct format)!';
+ return;
+ }
+
+ my $origtime = cmd('trackCurrentTime');
+
+ # Assume there's no + or -
+ my $seek_sign = '';
+
+ # Check for + or - in $time
+ # If a sign is found save it in $seek_sign and remove
+ # it from $time.
+ $_ = $time;
+ if (/^\+/) {
+ $seek_sign = '+';
+ $time =~ s/^\+//g;
+ } elsif (/^-/) {
+ $seek_sign = '-';
+ $time =~ s/^-//g;
+ }
+
+ # Now split $timearg at ':' if there's one
+ my @timeparts = split(/:/, $time);
+
+ # time has format mm:ss
+ if (defined $timeparts[1]) {
+ # Convert $time into secs
+ $time = 60 * $timeparts[0] + $timeparts[1];
+ }
+
+ # if there's a + or - recalc $time
+ if ($seek_sign eq '+') {
+ $time = $origtime + $time;
+ } elsif ($seek_sign eq '-') {
+ $time = $origtime - $time;
+ }
+
+ # print and do it
+ cmd('seek '.$time);
+ my $newtime = cmd('currentTime');
+ chomp($newtime);
+ print CLIENTCRAP $preprint.'Seeked to '.$newtime.'.';
+}
+
+sub cmd_amarok ($$$) {
+ my ($args, $server, $witem) = @_;
+ my @arg = split(/ /, $args);
+
+ # enough arguments?
+ if (scalar(@arg) == 0) {
+ print CLIENTCRAP $preprint.'%RERROR%n: not enough arguments!';
+ return;
+ }
+
+ my $loud = 0;
+ if (defined $arg[1] && $arg[1] eq 'loud') { $loud = 1; }
+
+ # is amaroK running?
+ # if so, is it currently playing?
+ # status = 0: stopped
+ # = 1: paused
+ # = 2: playing
+ my $status = cmd('status');
+ if ($status eq 'call failed') {
+ print CLIENTCRAP $preprint.'%RERROR%n: amaroK is not running!';
+ return;
+ } elsif ($status == 0 && $arg[0] ne 'play' && $arg[0] ne 'help' && $arg[0] ne 'vol' && $arg[0] ne 'mute') {
+ print CLIENTCRAP $preprint.'%RERROR%n: amaroK is not playing yet!';
+ print CLIENTCRAP $preprint.'Only the play, vol, mute and help commands are available.';
+ return;
+ }
+
+ # amaroK is running and playing or some commands are available though.
+ if ($arg[0] eq 'song') {
+ amarokSong($witem, $loud);
+ } elsif ($arg[0] eq 'time') {
+ amarokTime($witem, $loud);
+ } elsif ($arg[0] eq 'pause') {
+ cmd('pause');
+ if ($status == 1) {
+ print CLIENTCRAP $preprint.'Song unpaused.';
+ } elsif ($status == 2) {
+ print CLIENTCRAP $preprint.'Song paused.';
+ }
+ } elsif ($arg[0] eq 'next') {
+ cmd('next');
+ print CLIENTCRAP $preprint.'Skipped to next song.';
+ } elsif ($arg[0] eq 'prev') {
+ cmd('prev');
+ print CLIENTCRAP $preprint.'Skipped to previous song.';
+ } elsif ($arg[0] eq 'play') {
+ cmd('play');
+ print CLIENTCRAP $preprint.'Playing song.';
+ } elsif ($arg[0] eq 'stop') {
+ cmd('stop');
+ print CLIENTCRAP $preprint.'Song stopped.';
+ } elsif ($arg[0] eq 'seek') {
+ if (!(defined $arg[1])) {
+ print CLIENTCRAP $preprint.'Not enough arguments.';
+ } else {
+ amarokSeek($arg[1]);
+ }
+ } elsif ($arg[0] eq 'vol') {
+ if (!(defined $arg[1])) {
+ my $o_vol = cmd('getVolume');
+ chomp($o_vol);
+ print CLIENTCRAP $preprint.'Current volume is '.$o_vol.'%%.';
+ } else {
+ if ($arg[1] < 0 or $arg[1] > 100) {
+ print CLIENTCRAP $preprint.'Given volume is out of range (0-100)';
+ return;
+ }
+ cmd('setVolume '.$arg[1]);
+ print CLIENTCRAP $preprint.'Volume changed to '.$arg[1].'%%.';
+ }
+ } elsif ($arg[0] eq 'mute') {
+ cmd('mute');
+ print CLIENTCRAP $preprint.'Mute toggled.';
+ } elsif ($arg[0] eq 'help') {
+ show_help();
+ } else {
+ print CLIENTCRAP $preprint.'%RERROR%n: Unknown command!';
+ }
+}
+
+Irssi::command_bind('amarok' => \&cmd_amarok);
+
+foreach my $cmd ('song', 'time', 'pause', 'play', 'stop', 'next', 'prev', 'seek', 'vol', 'mute', 'help') {
+ Irssi::command_bind('amarok '.$cmd =>
+ sub { cmd_amarok("$cmd ".$_[0], $_[1], $_[2]); } );
+}
+
+print CLIENTCRAP $preprint.$IRSSI{name}.' '.$VERSION.' loaded: type /amarok help for help';