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.2:
# - change the audacious and audtool command name
# v2.0.1b:
# - Cleaning some unusefull code.
# - Show an error when a command is executed in a wrong window, instead of exiting silently.
# 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.2';
%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://git.peersnode.net/",
changed => "2019-01-20",
);
#################################################################################
# Please do not change anything below this, unless you know what you are doing. #
#################################################################################
# command names of audacious and audtool
my $c_audtool="audtool";
my $c_audacious="audacious";
# Give an error when a command is used where it was not supposed to, instead
# of exiting silently. Much better this way.
sub cmd_err {
print "Error: This command can't be executed in this window.";
}
sub cmd_aud_song {
my ($data, $server, $witem) = @_;
# Get current song information.
if ($witem && ($witem->{type} eq "CHANNEL")) {
my ($position, $song, $current, $total, $artist, $album, $title,
$total, $bitrate, $frequency, $album);
chomp($position = `$c_audtool --playlist-position`);
chomp($song = `$c_audtool --current-song`);
chomp($current = `$c_audtool --current-song-output-length`);
chomp($total = `$c_audtool --current-song-length`);
chomp($artist = `$c_audtool --current-song-tuple-data artist`);
chomp($album = `$c_audtool current-song-tuple-data album`);
chomp($title = `$c_audtool --current-song-tuple-data title`);
chomp($total = `$c_audtool --current-song-length`);
chomp($bitrate = `$c_audtool --current-song-bitrate-kbps`);
chomp($frequency = `$c_audtool --current-song-frequency-khz`);
chomp($album = `$c_audtool current-song-tuple-data album`);
# Read output.
my ( $wtr, $rdr, $err );
my $pid = open3( $wtr, $rdr, $err,
$c_audtool, '--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 (`ps -C $c_audacious` =~ /audacious/) {
if ($data ne "--details") {
# 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)");
}
}
# Show more details in our output.
if ($data eq "--details") {
# 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;
}
else {
cmd_err();
}
}
sub cmd_aud_next {
my ($data, $server, $witem) = @_;
# Skip to the next track.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C audacious` =~ /audacious/) {
my $next = `$c_audtool --playlist-advance`;
$witem->print("Skipped to next track.");
}
else {
$witem->print("Can't skip to next track. Check your Audacious.");
}
return 1;
}
else {
cmd_err();
}
}
sub cmd_aud_previous {
my ($data, $server, $witem) = @_;
# Skip to the previous track.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C $c_audacious` =~ /audacious/) {
my $reverse = `$c_audtool --playlist-reverse`;
$witem->print("Skipped to previous track.");
}
else {
$witem->print("Can't skip to next track. Check your Audacious.");
}
return 1;
}
else {
cmd_err();
}
}
sub cmd_aud_play {
my ($data, $server, $witem) = @_;
# Start playback.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C $c_audacious` =~ /audacious/) {
my $play = `$c_audtool --playback-play`;
$witem->print("Started playback.");
}
else {
$witem->print("Playback can't be performed now.");
}
return 1;
}
else {
cmd_err();
}
}
sub cmd_aud_pause {
my ($data, $server, $witem) = @_;
# Pause playback.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C $c_audacious` =~ /audacious/) {
my $pause = `$c_audtool --playback-pause`;
$witem->print("Paused playback.");
}
else {
$witem->print("Pause can be only performed when Audacious is running.");
}
return 1;
}
else {
cmd_err();
}
}
sub cmd_aud_stop {
my ($data, $server, $witem) = @_;
# Pause playback.
if ($witem && ($witem->{type} eq "CHANNEL")) {
if (`ps -C $c_audacious` =~ /audacious/) {
my $stop = `$c_audtool --playback-stop`;
$witem->print("Stopped playback.");
}
else {
$witem->print("This way you can't start Audacious.");
}
return 1;
}
else {
cmd_err();
}
}
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 $c_audacious` =~ /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 $c_audtool,'--set-volume', $data;
my $volume = `$c_audtool --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;
}
else {
cmd_err();
}
}
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 $c_audacious` =~ /audacious/) {
if ($data eq "") {
$witem->print("Use /audacious jump