chiark / gitweb /
bin/disorder-notify: Rewrite and take over the functionality of `media-keys'.
[profile] / bin / disorder-propagate-autoplay
CommitLineData
8f3f3f67
MW
1#! /usr/bin/perl -w
2
3use autodie qw{:all};
4use strict;
5
94275284 6use DisOrder;
8f3f3f67
MW
7
8(my $PROG = $0) =~ s:.*/::;
9
8f3f3f67
MW
10sub grobble_dir (\@$$$);
11
12sub grobble_dir (\@$$$) {
13 my ($list, $sk, $root, $dir) = @_;
14 my @d;
15
16 for my $f (send_command $sk, "files", "$root$dir") {
17 my ($tail) = $f =~ /\Q$root\E(.*)$/;
18 die "`$f' not under root `$root'" unless $tail;
19 push @$list, $tail;
20 }
21
22 for my $d (send_command $sk, "dirs", "$root$dir") {
23 my ($tail) = $d =~ /\Q$root\E(.*)$/;
24 die "`$d' not under root `$root'" unless $tail;
25 push @d, $tail;
26 }
27 for my $d (@d) { grobble_dir @$list, $sk, $root, $d; }
28}
29
30sub grobble_root ($) {
31 my ($sk) = @_;
32 my $root = undef;
33 my @list = ();
34
35 for my $d (send_command $sk, "dirs", "") {
36 my ($pre, $tail) = $d =~ m{^(.*/)([^/]*)$};
37 die "no root in `$_'?" unless $pre;
38 if (!defined $root) { $root = $pre; }
39 elsif ($root ne $pre) { die "root was `$root'; now it's `$pre'"; }
40 grobble_dir @list, $sk, $root, $tail;
41 }
42 return $root, \@list;
43}
44
45sub trim_extension ($) {
46 my ($f) = @_;
47 $f =~ s/\.(flac|mp[23]|ogg|wav)$//;
48 return $f;
49}
50
51if (@ARGV != 2) { die "usage: $PROG FROM TO\n"; }
52my ($from, $to) = @ARGV;
53
54my $sk = connect_to_server $from;
55my ($root0, $list) = grobble_root $sk;
56my %black = ();
57for my $f (@$list) {
58 my $pick = send_command $sk, "get", "$root0$f", "pick_at_random";
59 if (($pick // 1) eq "0") { $black{trim_extension $f} = 1; }
60}
61close $sk;
62
63$sk = connect_to_server $to;
64(my $root1, $list) = grobble_root $sk;
65FILE: for my $f (@$list) {
66 my $pick = send_command $sk, "get", "$root1$f", "pick_at_random";
67 if (($pick // 1) eq "0") {
68 next FILE if $black{trim_extension $f};
69 send_command $sk, "unset", "$root1$f", "pick_at_random";
70 print STDERR ";; reinstate <$f>\n";
71 } else {
72 next FILE unless $black{trim_extension $f};
73 send_command $sk, "set", "$root1$f", "pick_at_random", 0;
74 print STDERR ";; blacklist <$f>\n";
75 }
76}
77close $sk;