From 03929dac2a29664878d2c971648a4fe1fb698462 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 22:19:02 +0200 Subject: Adding upstream version 20231031. Signed-off-by: Daniel Baumann --- scripts/Cirssi.pl | 802 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 802 insertions(+) create mode 100644 scripts/Cirssi.pl (limited to 'scripts/Cirssi.pl') diff --git a/scripts/Cirssi.pl b/scripts/Cirssi.pl new file mode 100644 index 0000000..92e0b9f --- /dev/null +++ b/scripts/Cirssi.pl @@ -0,0 +1,802 @@ +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 number to jump to it in your playlist."); + } + elsif ($data =~ /^[\d]+$/) { + # Many thanks to Khisanth for this awesome fix! + my ( $wtr, $rdr, $err ); + my $pid = open3( $wtr, $rdr, $err, + $c_audtool, '--playlist-jump', $data) or die $!; + my $output; + { + local $/; + $output = <$rdr>; + } + if ($output =~ /invalid/) { + $witem->print("Track #$data isn't found in your playlist."); + } + else { + $witem->print("Jumped to track #$data."); + } + } + else { + $witem->print("Please use a valid integer."); + } + } + else { + $witem->print("Start your audacious first."); + } + return 1; + } + else { + cmd_err(); + } +} + +sub cmd_aud_playlist { + my ($data, $server, $witem) = @_; + # Displays entire playlist loaded. + if (`ps -C $c_audacious` =~ /audacious/) { + my $display = `$c_audtool --playlist-display`; + chomp($display); + + Irssi::print("$display"); + } + else { + $witem->print("Start your player first."); + } + return 1; +} + +sub cmd_aud_search { + my ($data, $server, $witem) = @_; + + if ($witem && ($witem->{type} eq "CHANNEL")) { + if (`ps -C $c_audacious` =~ /audacious/) { + my $playlist = `$c_audtool --playlist-display`; + my @matches; + + for (split /\n/, $playlist) { + push @matches, $_ if /$data/i; + } + if (@matches) { + $witem->print("Search Results:"); + for (@matches) { + $_ =~ s/^\s+|\s+$//g; + $witem->print("$_"); + } + } + else { + $witem->print("Couldn't find any match(s) for your keyword '$data'."); + } + } + else { + $witem->print("Audacious is not running."); + } + } + else { + cmd_err(); + } +} + + +sub cmd_aud_details { + my ($data, $server, $witem) = @_; + + # Displays current song's details. + if ($witem && ($witem->{type} eq "CHANNEL")) { + if (`ps -C $c_audacious` =~ /audacious/) { + my ($bitrate, $frequency, $length, $volume); + + chomp($bitrate = `$c_audtool --current-song-bitrate-kbps`); + chomp($frequency = `$c_audtool --current-song-frequency-khz`); + chomp($length = `$c_audtool --current-song-length`); + chomp($volume = `$c_audtool --get-volume`); + + $witem->print("Current song details: rate: $bitrate kbps - freq: $frequency KHz - l: $length min - vol: $volume%%"); + } + else { + $witem->print("Your player doesn't seem to be running"); + } + return 1; + } + else { + cmd_err(); + } +} + +sub cmd_aud_version { + my ($data, $server, $witem) = @_; + + my ($audtool, $audacious); + chop($audtool = `$c_audtool --version`); + chop($audacious = `$c_audacious --version`); + + # Displays version information to the channel. + if ($witem && ($witem->{type} eq "CHANNEL")) { + + if ($data eq "--audtool") { + $witem->command("/me is running: Consolidate Irssi Player v$VERSION with $audtool"); + } + elsif ($data eq "--audacious") { + $witem->command("/me is running: Consolidate Irssi Player v$VERSION with $audacious"); + } + return 1; + } + else { + Irssi::print("Consolidate Irssi Player v$VERSION on $audacious with $audtool"); + } +} + +sub cmd_audacious { + my ($data, $server, $witem) = @_; + if ($data =~ m/^[(song)|(next)|(previous)|(play)|(pause)|(stop)|(help)|(volume)|(jump)|(playlist)|(details)|(about)|(search)]/i) { + Irssi::command_runsub('audacious', $data, $server, $witem); + } + else { + Irssi::print("Use /audacious