Project import generated by Copybara.

GitOrigin-RevId: 975161aa2f1036264c56d7a81b79ac74ba68b276
diff --git a/private_dot_config/i3blocks/mediaplayer/README.md b/private_dot_config/i3blocks/mediaplayer/README.md
new file mode 100644
index 0000000..ae81911
--- /dev/null
+++ b/private_dot_config/i3blocks/mediaplayer/README.md
@@ -0,0 +1,36 @@
+# mediaplayer
+
+Generic media player status/controls.
+
+![Example screenshot](mediaplayer.png)
+
+This displays "ARTIST - SONG" if music is playing. By
+left-clicking/right-clicking the displayed text, it will play the previous/next
+song. Middle-clicking will pause/unpause the song.
+
+Supported players are:
+- spotify, vlc, audacious, xmms2, mplayer and others that
+use MPRIS DBus Interface Specification
+- mpd
+- cmus
+- rhythmbox
+
+mpd is supported through mpc (music player client).
+
+For MPRIS support you need to have the playerctl binary in your path.
+See: https://github.com/acrisci/playerctl
+
+If you leave the instance empty playerctl will try to find an
+active MPRIS-compatible player on its own.
+
+# Installation
+
+Add the following to your i3blocks config:
+
+``` ini
+[mediaplayer]
+command=$SCRIPT_DIR/mediaplayer
+instance=spotify
+interval=5
+signal=10
+```
diff --git a/private_dot_config/i3blocks/mediaplayer/executable_mediaplayer b/private_dot_config/i3blocks/mediaplayer/executable_mediaplayer
new file mode 100644
index 0000000..7259080
--- /dev/null
+++ b/private_dot_config/i3blocks/mediaplayer/executable_mediaplayer
@@ -0,0 +1,159 @@
+#!/usr/bin/env perl
+# Copyright (C) 2014 Tony Crisci <tony@dubstepdish.com>
+# Copyright (C) 2015 Thiago Perrotta <perrotta dot thiago at poli dot ufrj dot br>
+
+# 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 <http://www.gnu.org/licenses/>.
+
+# For all media players except mpd/cmus/rhythmbox, MPRIS support should be
+# enabled and the playerctl binary should be in your path.
+# See https://github.com/acrisci/playerctl
+
+# Set instance=NAME in the i3blocks configuration to specify a music player
+# (playerctl will attempt to connect to org.mpris.MediaPlayer2.[NAME] on your
+# DBus session). If instance is empty, playerctl will connect to the first
+# supported media player it finds.
+
+use Time::HiRes qw(usleep);
+use Env qw(BLOCK_INSTANCE);
+
+use constant DELAY => 50; # Delay in ms to let network-based players (spotify) reflect new data.
+use constant SPOTIFY_STR => 'spotify';
+
+my @metadata = ();
+my $player_arg = "";
+
+if ($BLOCK_INSTANCE) {
+    $player_arg = "--player='$BLOCK_INSTANCE'";
+}
+
+sub buttons {
+    my $method = shift;
+
+    if($method eq 'mpd') {
+        if ($ENV{'BLOCK_BUTTON'} == 1) {
+            system("mpc prev &>/dev/null");
+        } elsif ($ENV{'BLOCK_BUTTON'} == 2) {
+            system("mpc toggle &>/dev/null");
+        } elsif ($ENV{'BLOCK_BUTTON'} == 3) {
+            system("mpc next &>/dev/null");
+        } elsif ($ENV{'BLOCK_BUTTON'} == 4) {
+            system("mpc volume +10 &>/dev/null");
+        } elsif ($ENV{'BLOCK_BUTTON'} == 5) {
+            system("mpc volume -10 &>/dev/null");
+        }
+    } elsif ($method eq 'cmus') {
+        if ($ENV{'BLOCK_BUTTON'} == 1) {
+            system("cmus-remote --prev");
+        } elsif ($ENV{'BLOCK_BUTTON'} == 2) {
+            system("cmus-remote --pause");
+        } elsif ($ENV{'BLOCK_BUTTON'} == 3) {
+            system("cmus-remote --next");
+        }
+    } elsif ($method eq 'playerctl') {
+        if ($ENV{'BLOCK_BUTTON'} == 1) {
+            system("playerctl $player_arg previous");
+            usleep(DELAY * 1000) if $BLOCK_INSTANCE eq SPOTIFY_STR;
+        } elsif ($ENV{'BLOCK_BUTTON'} == 2) {
+            system("playerctl $player_arg play-pause");
+        } elsif ($ENV{'BLOCK_BUTTON'} == 3) {
+            system("playerctl $player_arg next");
+            usleep(DELAY * 1000) if $BLOCK_INSTANCE eq SPOTIFY_STR;
+        } elsif ($ENV{'BLOCK_BUTTON'} == 4) {
+            system("playerctl $player_arg volume 0.01+");
+        } elsif ($ENV{'BLOCK_BUTTON'} == 5) {
+            system("playerctl $player_arg volume 0.01-");
+        }
+    } elsif ($method eq 'rhythmbox') {
+        if ($ENV{'BLOCK_BUTTON'} == 1) {
+            system("rhythmbox-client --previous");
+        } elsif ($ENV{'BLOCK_BUTTON'} == 2) {
+            system("rhythmbox-client --play-pause");
+        } elsif ($ENV{'BLOCK_BUTTON'} == 3) {
+            system("rhythmbox-client --next");
+        }
+    }
+}
+
+sub cmus {
+    my @cmus = split /^/, qx(cmus-remote -Q);
+    if ($? == 0) {
+        foreach my $line (@cmus) {
+            my @data = split /\s/, $line;
+            if (shift @data eq 'tag') {
+                my $key = shift @data;
+                my $value = join ' ', @data;
+
+                @metadata[0] = $value if $key eq 'artist';
+                @metadata[1] = $value if $key eq 'title';
+            }
+        }
+
+        if (@metadata) {
+            buttons('cmus');
+
+            # metadata found so we are done
+            print(join ' - ', @metadata);
+            print("\n");
+            exit 0;
+        }
+    }
+}
+
+sub mpd {
+    my $data = qx(mpc current);
+    if (not $data eq '') {
+        buttons("mpd");
+        print($data);
+        exit 0;
+    }
+}
+
+sub playerctl {
+    buttons('playerctl');
+
+    my $artist = qx(playerctl $player_arg metadata artist 2>/dev/null);
+    chomp $artist;
+    # exit status will be nonzero when playerctl cannot find your player
+    exit(0) if $? || $artist eq '(null)';
+
+    push(@metadata, $artist) if $artist;
+
+    my $title = qx(playerctl $player_arg metadata title);
+    exit(0) if $? || $title eq '(null)';
+
+    push(@metadata, $title) if $title;
+
+    print(join(" - ", @metadata)) if @metadata;
+}
+
+sub rhythmbox {
+    buttons('rhythmbox');
+
+    my $data = qx(rhythmbox-client --print-playing --no-start);
+    print($data);
+}
+
+if ($player_arg =~ /mpd/) {
+    mpd;
+}
+elsif ($player_arg =~ /cmus/) {
+    cmus;
+}
+elsif ($player_arg =~ /rhythmbox/) {
+    rhythmbox;
+}
+else {
+    playerctl;
+}
+print("\n");
diff --git a/private_dot_config/i3blocks/mediaplayer/mediaplayer.png b/private_dot_config/i3blocks/mediaplayer/mediaplayer.png
new file mode 100644
index 0000000..40e89fa
--- /dev/null
+++ b/private_dot_config/i3blocks/mediaplayer/mediaplayer.png
Binary files differ