X-Git-Url: https://git.draconx.ca/gitweb/fvwmconf.git/blobdiff_plain/95fe4128ce64545a770629a54779de69570cce73..9e3e0b6e4941da4fd9329dc0d1567bbbbbf58988:/scripts/mpdmenu.pl diff --git a/scripts/mpdmenu.pl b/scripts/mpdmenu.pl index 4639211..c36fad7 100755 --- a/scripts/mpdmenu.pl +++ b/scripts/mpdmenu.pl @@ -1,9 +1,18 @@ #!/usr/bin/perl +# +# Copyright © 2018,2010,2012,2019 Nick Bowler +# +# Silly little script to generate an FVWM menu with various bits of MPD +# status information and controls. +# +# License WTFPL2: Do What The Fuck You Want To Public License, version 2. +# This is free software: you are free to do what the fuck you want to. +# There is NO WARRANTY, to the extent permitted by law. use strict; use Getopt::Long; -use IO::Socket; +use IO::Socket::INET6; use constant { MPD_MJR_MIN => 0, @@ -12,7 +21,8 @@ use constant { }; use utf8; -use encoding 'utf8'; +use open qw(:std :utf8); +binmode(STDOUT, ":utf8"); use Encode; sub cmd @@ -46,10 +56,11 @@ $artist = decode_utf8($artist) if defined($artist); $title = decode_utf8($title) if defined($title);; # Connect to MPD. -my $sock = new IO::Socket::INET( +my $sock = new IO::Socket::INET6( PeerAddr => $host, PeerPort => $port, - Proto => 'tcp' + Proto => 'tcp', + Timeout => 2 ) or die("could not open socket: $!.\n"); binmode($sock, ":utf8"); @@ -100,11 +111,12 @@ if (defined $album) { next if (defined $artist && !$accept{albumdir($t_file)}); - $t_artist = sanitise($t_artist); - $t_title = sanitise($t_title); + $t_artist = sanitise($t_artist, 0); + $t_title = sanitise($t_title, 0); my $cmd = sprintf "AddToMenu $menu \"%d\t%s - %s\"" - ." Exec mpc playid %d", + ." Exec exec $FVWM/scripts/mpdexec.pl" + ." playid %d", $t_trackno, $t_artist, $t_title, $t_id; cmd($cmd); @@ -136,13 +148,13 @@ if (defined $album) { use locale; foreach (sort keys(%albums)) { my $key = $_; - my $a_album = sanitise($key); + my $a_album = sanitise($key, 1); - open THUMB, "-|", "$FVWM/scripts/thumbnail.sh", + open THUMB, "-|", "$FVWM/scripts/thumbnail.zsh", "--small", "--music", $albums{$key}; my $thumb = ; close THUMB; - die("Incompetent use of thumbnail.sh") if ($?); + die("Incompetent use of thumbnail.zsh") if ($?); $thumb =~ s/\n//sg; $thumb = "%$thumb%" if (-f $thumb); @@ -173,7 +185,7 @@ if (defined $album) { $menu = "MenuMPDTitle" unless defined $menu; # Open and close brackets. - my ($ob, $cb) = ("[\[~〜<(ー−-]", "[\]~〜>)ー−-]"); + my ($ob, $cb) = ("[\[~〜<〈(ー−-]", "[\]~〜>〉)ー−-]"); $_ = $title; @@ -186,19 +198,23 @@ if (defined $album) { s/ -Practice Track-//; # Fair Heaven s/〜世界で一番アナタが好き〜//; # Pure Heart s/〜彼方への哀歌//; # 十二幻夢 + s/ sora no uta ver.//; # 美しい星 s/\s*-remix-$//; # Otherwise "D-THREAD -remix-" doesn't work right. # Deal with titles like "blah (ABC version)". - s/\s*$ob.*(style|mix|edit|edition|ver\.?|version|カラオケ)$cb?$//i; + s/\s*$ob.*(style|mix|edit|edition|ver\.?|version|melody|カラオケ)$cb?$//i; # Deal with titles like "blah (without XYZ)". - s/\s*$ob((e\.)?piano|english|japanese|inst|tv|without|w\/o|off|back|short|karaoke|game).*//i; + s/\s*$ob\s*((e\.)?piano|english|japanese|inst|tv|without|w\/o|off|back|short|karaoke|game).*//i; # Deal with titles like "blah instrumental". - s/\s+(instrumental|off vocal|short)(\s+(size|version|s))?$//i; + s/\s+(instrumental|off vocal|short|tv)([\s-]+(mix|size|version))?$//i; s/\s+without\s+\w+$//i; + # Deal with separate movements in classical pieces. + s/: [IVX]+\..*//; + my $basetitle = $_; my $_basetitle = $basetitle; @@ -230,20 +246,23 @@ if (defined $album) { ); # MPD searches are case-insensitive. - next if (!($t_title =~ m/(\P{Latin}|^)\Q$basetitle\E(\P{Latin}|$)/)); - $t_artist = sanitise($t_artist); - $t_title = sanitise($t_title); + next if (!($t_title =~ m/(\P{Latin}|^)\Q$basetitle\E(\P{Latin}|$)/ || $t_title =~ m/\Q$basetitle\E/i)); - open THUMB, "-|", "$FVWM/scripts/thumbnail.sh", + $t_artist = sanitise($t_artist, 1); + $t_title = sanitise($t_title, 1); + + open THUMB, "-|", "$FVWM/scripts/thumbnail.zsh", "--small", "--music", $t_file; my $thumb = ; close(THUMB); - die("Incompetent use of thumbnail.sh") if ($?); + die("Incompetent use of thumbnail.zsh") if ($?); $thumb =~ s/\n//sg; $thumb = "%$thumb%" if (-f $thumb); - cmd("AddToMenu $menu \"$thumb$t_artist - $t_title\" Exec mpc playid $t_id"); + cmd("AddToMenu $menu \"$thumb$t_artist - $t_title\"" + ." Exec exec $FVWM/scripts/mpdexec.pl" + ." playid $t_id"); } } # end use locale workaround } else { @@ -281,7 +300,7 @@ if (defined $album) { } die("Failed data query\n") unless (keys(%entry) > 0); - open THUMB, "-|", "$FVWM/scripts/thumbnail.sh", + open THUMB, "-|", "$FVWM/scripts/thumbnail.zsh", "--image", "--music", $entry{file}; my $thumb = ; my $scan = ; @@ -293,14 +312,14 @@ if (defined $album) { if (-f $thumb) { cmd("AddToMenu $menu \"*$thumb*\" " - ."Exec exec gqview ".shellify($scan, 0)); + ."Exec exec geeqie ".shellify($scan, 0)); } - cmd("AddToMenu $menu \"Title: ".sanitise($entry{Title})."\" " - ."Popup MenuMPDTitle"); - cmd("AddToMenu $menu \"Artist: ".sanitise($entry{Artist})."\" " - ."Popup MenuMPDArtist"); - cmd("AddToMenu $menu \"Album: ".sanitise($entry{Album})."\" " - ."Popup MenuMPDAlbum"); + cmd("AddToMenu $menu \"Title: ".sanitise($entry{Title}, 0) + ."\" Popup MenuMPDTitle"); + cmd("AddToMenu $menu \"Artist: ".sanitise($entry{Artist}, 0) + ."\" Popup MenuMPDArtist"); + cmd("AddToMenu $menu \"Album: ".sanitise($entry{Album}, 0) + ."\" Popup MenuMPDAlbum"); cmd("AddToMenu $menu \"\" Nop"); } else { cmd("AddToMenu $menu \"\""); @@ -309,25 +328,25 @@ if (defined $album) { if ($state eq "play" || $state eq "pause") { cmd("AddToMenu $menu \"\t\tNext%$icons/next.svg:16x16%\" " - ."Exec exec mpc next"); + ."Exec exec $FVWM/scripts/mpdexec.pl next"); cmd("AddToMenu $menu \"\t\tPause%$icons/pause.svg:16x16%\" " - ."Exec exec mpc pause") if ($state eq "play"); + ."Exec exec $FVWM/scripts/mpdexec.pl pause"); cmd("AddToMenu $menu \"\t\tPlay%$icons/play.svg:16x16%\" " - ."Exec exec mpc play") if ($state eq "pause"); + ."Exec exec $FVWM/scripts/mpdexec.pl play"); cmd("AddToMenu $menu \"\t\tStop%$icons/stop.svg:16x16%\" " - ."Exec exec mpc stop"); + ."Exec exec $FVWM/scripts/mpdexec.pl stop"); cmd("AddToMenu $menu \"\t\tPrev%$icons/prev.svg:16x16%\" " - ."Exec exec mpc prev"); + ."Exec exec $FVWM/scripts/mpdexec.pl previous"); } elsif ($state eq "stop") { cmd("AddToMenu $menu \"\t\tPlay%$icons/play.svg:16x16%\" " - ."Exec exec mpc play"); + ."Exec exec $FVWM/scripts/mpdexec.pl play"); } else { die("Unknown MPD state!\n"); } cmd("AddToMenu $menu \"\" Nop"); cmd("AddToMenu $menu \"\t\tShuffle%$icons/shuffle.svg:16x16%\" " - ."Exec exec mpc shuffle"); + ."Exec exec $FVWM/scripts/mpdexec.pl shuffle"); cmd("DestroyMenu MenuMPDTitle"); cmd("AddToMenu MenuMPDTitle DynamicPopUpAction MakeMenuMPDTitle"); @@ -368,7 +387,8 @@ print $sock "close\n"; sub sanitise { $_ = $_[0]; - s/([\$&@%^*])/\1\1/g; + s/&/&&/g if ($_[1]); + s/([\$@%^*])/\1\1/g; s/"/\\"/g; return $_; }