use strict;
use vars qw($VERSION %IRSSI);
# Consolidate Irssi Player
#
# Copyright (C) 2009 Dani Soufi
#
# 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 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# Change Log:
# v2.0.0:
# - Start/Play(Toggle)/Stop/Pause/Unpause/Next/Previous/Volume MOC Player control functions are added.
# - MOC Player support is implemented.
# v1.1.2:
# - The script is now meant to be a bit more intelligent in dealing with song tags and different user song display settings.
# - Display album name in --details if it exists.
# v1.1.0:
# - Script's name is renamed to Consolidate Irssi Player on global basis to expand it's use in the future.
# - Removed cmd_shuffle{} and cmd_repeat{} functions since they aren't supported anymore by Audacious2.
# - Added use --details flag for bitrate and frequency details in current playing song.
# - Added Jump to specific song in the playing list according to track number.
# - Added Volume control support from Irssi.
# - Updated the script to work with the newest Audacious v2 and audtool2 available.
# v1.0.4:
# - Added Repeat on/off capability
# - Added Shuffle on/off capability
# - Fixed script output handling for audacious version in case audacious isn't running
# - If encountered a problem with audacious version, try changing `audacious --version` to `audtool -v`
# v1.0.3:
# - Added Playlist functionality
# - Added Song details (Bitrate/Frequency/Length/Volume)
# - Current song notice with song details (Optional)
# v1.0.2:
# - The script now handles warning support if you got audacious not running
# - Added track number, current time elapse and total track time
# - Added Stop functionality
# v1.0.1:
# - Added ability to autonotify the channel after skipping a song (optional)
# - Added Skip/Play/Pause/Resume calls
#
# How To Use?
# Copy your script into ~/.irssi/scripts/ directory
# Load your script with /script load audacious in your Irssi Client
# Type '/audacious help' in any channel for script commands
# For autoload insert your script into ~/.irssi/scripts/autorun/ directory
# Even better would be if you placed them in ~/.irssi/scripts/ and created symlinks in autorun directory
#
use Irssi;
use IPC::Open3;
$VERSION = '2.0.0';
%IRSSI = (
authors => "Dani Soufi (compengi)",
contact => "IRC: Freenode network, #ubuntu-lb",
name => "Consolidate Irssi Player",
description => "Controls Audacious2 and MOCP from Irssi",
license => "GNU General Public License",
url => "http://bazaar.launchpad.net/~compengi/%2Bjunk/Cirssi/annotate/head%3A/Cirssi.pl",
changed => "Thu Aug 14 22:43 CET 2009",
);
#################################################################################
# Please do not change anything below this, unless you know what you are doing. #
#################################################################################
sub cmd_aud_song {
my ($data, $server, $witem) = @_;
# Get current song information.
if ($witem && ($witem->{type} eq "CHANNEL")) {
# Read output.
my ( $wtr, $rdr, $err );
my $pid = open3( $wtr, $rdr, $err,
'audtool2', '--current-song-tuple-data', 'file-name') or die $!;
# Make it global.
my $file;
{
local $/;
$file = <$rdr>;
$file =~ s/\.(?i:mp3|cda|aa3|ac3|aif|ape|med|mpu|wave|mpc|oga|wma|ogg|wav|aac|flac)\n//;
}
if ($data ne "--details") {
if (`ps -C audacious2` =~ /audacious/) {
my $position = `audtool2 --playlist-position`;
# I'm the most nasty variable ever.
my $song = `audtool2 --current-song`;
my $current = `audtool2 --current-song-output-length`;
my $total = `audtool2 --current-song-length`;
my $artist = `audtool2 --current-song-tuple-data artist`;
my $album = `audtool2 current-song-tuple-data album`;
my $title = `audtool2 --current-song-tuple-data title`;
chomp($song);
chomp($position);
chomp($current);
chomp($total);
chomp($artist);
chomp($album);
chomp($title);
# If we notice that the user sorted his playlist
# by song title, we will try to be nice and parse
# the existing artist for him.
if ($song !~ /$artist/) {
# If $song is different from $album,
# we add the artist to output line.
# Else strip the album from $song.
if ($song !~ /$album/) {
# If we have no song tags, $song will be set to the file's name.
# In this case, we drop the file's extension know to us and print it.
if ($song =~ /$file/) {
$witem->command("/me is listening to: $file ($current/$total)");
}
else {
$witem->command("/me is listening to: $artist - $song ($current/$total)");
}
}
else {
$song =~ s/$album - //im;
$witem->command("/me is listening to: $artist - $song ($current/$total)");
}
}
else {
$witem->command("/me is listening to: $artist - $title ($current/$total)");
}
}
else {
$witem->print("Audacious is not currently running.");
}
}
if ($data eq "--details") {
# Show more details in the output.
if (`ps -C audacious2` =~ /audacious/) {
my $position = `audtool2 --playlist-position`;
# I'm a nasty variable.
my $song = `audtool2 --current-song`;
my $current = `audtool2 --current-song-output-length`;
my $total = `audtool2 --current-song-length`;
my $bitrate = `audtool2 --current-song-bitrate-kbps`;
my $frequency = `audtool2 --current-song-frequency-khz`;
my $album = `audtool2 current-song-tuple-data album`;
my $artist = `audtool2 --current-song-tuple-data artist`;
my $title = `audtool2 --current-song-tuple-data title`;
chomp($song);
chomp($position);
chomp($current);
chomp($total);
chomp($bitrate);
chomp($frequency);
chomp($album);
chomp($artist);
chomp($title);
# Check against an empty string.
# If it's empty, we don't print it.
if ($album ne "") {
# Make sure $song doesn't match $artist.
# Else we print the $song as it is.
if ($song !~ /$artist/) {
# If $song is different from $album,
# we add the artist to output line.
# Else strip the album from $song.
if ($song !~ /$album/) {
if ($song =~ /$file/) {
$witem->command("/me is listening to: $artist - $song from $album ($current/$total) [$bitrate Kbps/$frequency KHz]");
}
}
else {
$witem->command("/me is listening to: $artist - $title from $album ($current/$total) [$bitrate Kbps/$frequency KHz]");
}
}
elsif ($song =~ /\[ $album \]/) {
$witem->command("/me is listening to: $artist - $title from $album ($current/$total) [$bitrate Kbps/$frequency KHz]");
}
else {
$song =~ s/$album - //im;
$witem->command("/me is listening to: $song from $album ($current/$total) [$bitrate Kbps/$frequency KHz]");
}
}
elsif ($song =~ /$file/) {
$witem->command("/me is listening to: $file ($current/$total) [$bitrate Kbps/$frequency KHz]");
}
else {
$witem->command("/me is listening to: $artist - $title ($current/$total) [$bitrate Kbps/$frequency KHz]");
}
}
else {
$witem->print("Audacious is not currently running.");
}
}
return 1;
}
}
sub cmd_aud_next {
my ($data, $server, $witem) = @_;
# Skip to the next track.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C audacious2` =~ /audacious/) {
my $next = `audtool2 --playlist-advance`;
$witem->print("Skipped to next track.");
}
else {
$witem->print("Can't skip to next track. Check your Audacious.");
}
return 1;
}
}
sub cmd_aud_previous {
my ($data, $server, $witem) = @_;
# Skip to the previous track.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C audacious2` =~ /audacious/) {
my $reverse = `audtool2 --playlist-reverse`;
$witem->print("Skipped to previous track.");
}
else {
$witem->print("Can't skip to next track. Check your Audacious.");
}
return 1;
}
}
sub cmd_aud_play {
my ($data, $server, $witem) = @_;
# Start playback.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C audacious2` =~ /audacious/) {
my $play = `audtool2 --playback-play`;
$witem->print("Started playback.");
}
else {
$witem->print("Playback can't be performed now.");
}
return 1;
}
}
sub cmd_aud_pause {
my ($data, $server, $witem) = @_;
# Pause playback.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C audacious2` =~ /audacious/) {
my $pause = `audtool2 --playback-pause`;
$witem->print("Paused playback.");
}
else {
$witem->print("Pause can be only performed when Audacious is running.");
}
return 1;
}
}
sub cmd_aud_stop {
my ($data, $server, $witem) = @_;
# Pause playback.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C audacious2` =~ /audacious/) {
my $stop = `audtool2 --playback-stop`;
$witem->print("Stopped playback.");
}
else {
$witem->print("This way you can't start Audacious.");
}
return 1;
}
}
sub cmd_aud_volume {
my ($data, $server, $witem) = @_;
# Set volume and make sure the value is an integer
# that lays between 0 and 100.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C audacious2` =~ /audacious/) {
if ($data eq "") {
$witem->print("Use /audacious volume to set a specific volume value");
}
elsif ($data < 0 or $data > 100) {
$witem->print("Given value is out of range [0-100].");
return 0;
}
elsif ($data =~ /^[\d]+$/) {
system 'audtool2','--set-volume', $data;
my $volume = `audtool2 --get-volume`;
chomp($volume);
$witem->print("Volume is changed to $volume%%");
}
else {
$witem->print("Please use a value [0-100] instead.");
}
}
else {
$witem->print("Volume can't be set in the current state.");
}
return 1;
}
}
sub cmd_aud_jump {
my ($data, $server, $witem) = @_;
# Jump to a specific track, making sure that
# the selected track number exists.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C audacious2` =~ /audacious/) {
if ($data eq "") {
$witem->print("Use /audacious jump