chiark / gitweb /
bin/disorder-notify: Refactor the state reporting machinery.
[profile] / bin / disorder-notify
1 #! /usr/bin/perl
2
3 sub notify ($$) {
4   my ($head, $body) = @_;
5
6   my $kid = fork;
7   defined $kid or return;
8   if (!$kid) {
9     open STDOUT, ">", "/dev/null";
10     exec "gdbus", "call", "-e",
11       "-d", "org.freedesktop.Notifications",
12       "-o", "/org/freedesktop/Notifications",
13       "-m", "org.freedesktop.Notifications.Notify", "--",
14       "DisOrder", "0", "audio-volume-high",
15       $head, $body, "[]", "{}", "5000";
16   }
17   waitpid $kid, 0;
18 }
19
20 sub cmd (@) {
21   my @args = @_;
22   open my $f, "-|", "disorder", @args;
23   chomp (my @r = <$f>);
24   close $f;
25   if (wantarray) { return @r; }
26   elsif (@r == 1) { return $r[0]; }
27   else { return "??? multiple lines"; }
28 }
29
30 sub now_playing ($) {
31   my ($track) = @_;
32   my %p;
33   for my $p ("artist", "album", "title")
34     { $p{$p} = cmd "part", $track, "display", $p; }
35   if ($p{artist} =~ /^[A-Z]$/)
36     { $p{artist} = $p{album}; $p{album} = undef; }
37   elsif ($p{artist} eq "share" && $p{album} eq "disorder")
38     { next LINE; }
39   my $r = "$p{artist}: ‘$p{title}’";
40   if (defined $p{album}) { $r .= ", from ‘$p{album}’"; }
41   notify "DisOrder: now playing", $r;
42 }
43
44 for (;;) {
45   open my $log, "-|", "disorder", "log";
46   LINE: while (<$log>) {
47     chomp;
48     my @f = ();
49     my $q = my $t = undef;
50     my $e = 0;
51     my $j = -1;
52     for (my $i = 0; $i < length $_; $i++) {
53       my $ch = substr($_, $i, 1);
54       if ($e) {
55         if ($ch eq "n") { $ch = "\n"; }
56         $t .= $ch; $e = 0;
57       } elsif ($ch eq $q) {
58         push @f, $t; $q = $t = undef;
59       } elsif (defined $q) {
60         if ($ch eq "\\") { $e = 1; }
61         else { $t .= $ch; }
62       } elsif ($ch eq " ") {
63         push @f, $t if defined $t; $t = undef;
64       } elsif (!defined $t && ($ch eq '"' || $ch eq "'")) {
65         $t //= ""; $q = $ch; $j = $i;
66       } else {
67         $t //= ""; $t .= $ch;
68       }
69     }
70     defined $q and die "unmatched $q (pos $j) in: $_";
71     push @f, $t if defined $t;
72
73     my $what = $f[1];
74     if ($what eq "state") {
75       my $st = $f[2];
76       my $msg;
77       if ($st eq "disable_random") { $msg = "random play disabled"; }
78       elsif ($st eq "enable_random") { $msg = "random play enabled"; }
79       elsif ($st eq "disable_play") { $msg = "playing disabled"; }
80       elsif ($st eq "enable_play") { $msg = "playing enabled"; }
81       elsif ($st eq "pause") { $msg = "paused"; }
82       elsif ($st eq "resume") { $msg = "playing"; }
83       else { next LINE; }
84       notify "DisOrder state", ucfirst $msg;
85       }
86     } elsif ($what eq "playing") {
87       now_playing $f[2];
88     }
89   }
90   close $log;
91   sleep 5;
92 }