bin/disorder-notify: Abstract out invoking the `disorder' client.
[profile] / bin / disorder-notify
CommitLineData
6bdf3aad
MW
1#! /usr/bin/perl
2
3sub 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",
0990cf69 15 $head, $body, "[]", "{}", "5000";
6bdf3aad
MW
16 }
17 waitpid $kid, 0;
18}
19
994838b7
MW
20sub 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
6bdf3aad
MW
30for (;;) {
31 open my $log, "-|", "disorder", "log";
32 LINE: while (<$log>) {
33 chomp;
34 my @f = ();
35 my $q = my $t = undef;
36 my $e = 0;
37 my $j = -1;
38 for (my $i = 0; $i < length $_; $i++) {
39 my $ch = substr($_, $i, 1);
40 if ($e) {
41 if ($ch eq "n") { $ch = "\n"; }
42 $t .= $ch; $e = 0;
43 } elsif ($ch eq $q) {
44 push @f, $t; $q = $t = undef;
45 } elsif (defined $q) {
46 if ($ch eq "\\") { $e = 1; }
47 else { $t .= $ch; }
48 } elsif ($ch eq " ") {
49 push @f, $t if defined $t; $t = undef;
50 } elsif (!defined $t && ($ch eq '"' || $ch eq "'")) {
51 $t //= ""; $q = $ch; $j = $i;
52 } else {
53 $t //= ""; $t .= $ch;
54 }
55 }
56 defined $q and die "unmatched $q (pos $j) in: $_";
57 push @f, $t if defined $t;
58
59 my $what = $f[1];
60 if ($what eq "state") {
61 my $st = $f[2];
62 if ($st eq "disable_random") {
63 notify "DisOrder state", "Random play disabled";
64 } elsif ($st eq "enable_random") {
65 notify "DisOrder state", "Random play enabled";
66 } elsif ($st eq "disable_play") {
67 notify "DisOrder state", "Playing disabled";
68 } elsif ($st eq "enable_play") {
69 notify "DisOrder state", "Playing enabled";
70 } elsif ($st eq "pause") {
71 notify "DisOrder state", "Paused";
72 } elsif ($st eq "resume") {
73 notify "DisOrder state", "Resuming";
74 }
75 } elsif ($what eq playing) {
76 my $track = $f[2];
77 my %p;
994838b7
MW
78 for my $p ("artist", "album", "title")
79 { $p{$p} = cmd "part", $track, "display", $p; }
6bdf3aad
MW
80 if ($p{artist} =~ /^[A-Z]$/)
81 { $p{artist} = $p{album}; $p{album} = undef; }
82 elsif ($p{artist} eq "share" && $p{album} eq "disorder")
83 { next LINE; }
84 my $r = "$p{artist}: ‘$p{title}’";
85 if (defined $p{album}) { $r .= ", from ‘$p{album}’"; }
86 notify "Now playing", $r;
87 }
88 }
89 close $log;
90 sleep 5;
91}