Example #1
0
def main():
    arguments = parse_arguments()

    # Initialize logging
    logging.basicConfig(stream=sys.stderr,
                        level=logging.DEBUG,
                        format='%(name)s %(levelname)s %(message)s')

    # Logging is set by default to WARN and higher.
    # With every occurrence of -v it's lowered by one
    logger.setLevel(max((3 - arguments.verbose) * 10, 0))

    # Log the sent command line arguments
    logger.debug('Arguments received {}'.format(vars(arguments)))

    manager = Playerctl.PlayerManager()
    loop = GLib.MainLoop()

    manager.connect('name-appeared',
                    lambda *args: on_player_appeared(*args, arguments.player))
    manager.connect('player-vanished', on_player_vanished)

    signal.signal(signal.SIGINT, signal_handler)
    signal.signal(signal.SIGTERM, signal_handler)

    for player in manager.props.player_names:
        if arguments.player is not None and arguments.player != player.name:
            logger.debug(
                '{player} is not the filtered player, skipping it'.format(
                    player=player.name))
            continue

        init_player(manager, player)

    loop.run()
Example #2
0
def main():

    arguments = parse_arguments()

    # Initialize logging
    LOG = home+"/.dotfiles/configs/waybar/media.log"                                    logger.setLevel(max((3 - arguments.verbose) * 10, 0))
    logging.basicConfig(stream=sys.stderr, filename=LOG, level=logging.DEBUG,
                        format='%(name)s %(levelname)s %(message)s')

    logger.setLevel(0)

    # Log the sent command line arguments
    logger.debug('Arguments received {}'.format(vars(arguments)))

    manager = Playerctl.PlayerManager()
    loop = GLib.MainLoop()

    manager.connect('name-appeared', lambda *args: on_player_appeared(*args, arguments.player))
    manager.connect('player-vanished', on_player_vanished)

    signal.signal(signal.SIGINT, signal_handler)
    signal.signal(signal.SIGTERM, signal_handler)

    for player in manager.props.player_names:
        if arguments.player is not None and arguments.player != player.name:
            logger.debug('{player} is not the filtered player, skipping it'
                         .format(player=player.name)
                         )
            continue

        init_player(manager, player)

    update_song()
    loop.run()
Example #3
0
    def __init__(
        self,
        player_name,
        stream: VideoStream,
        detector: FaceDetector,
        logdir: Path,
        metric_name: str,
        debug: bool,
    ) -> None:
        """The controller. It controls your player, tracks and classify your face."""
        self._desired_player = player_name
        self._manager = Playerctl.PlayerManager()
        self._manager.connect("name-appeared", self._on_name_appeared)
        self._manager.connect("name-vanished", self._on_name_vanished)
        self._player = None
        self._stream = stream
        self._detector = detector
        self._debug = debug
        self._expansion = (70, 70)
        self._counters = {hit: 0 for hit in ClassificationResult}
        # FPS value of this application. It has nothing to the with the
        # VideoStram.fps value.
        self._fps = -1

        with open(logdir / "on" / "best" / metric_name /
                  (metric_name + ".json")) as json_fp:
            json_file = json.load(json_fp)
            thresholds = Thresholds(
                on={
                    "mean": float(json_file.get("positive_threshold", -1)),
                    "variance": float(json_file.get("positive_variance", -1)),
                },
                off={
                    "mean": float(json_file.get("negative_threshold", -1)),
                    "variance": float(json_file.get("negative_variance", -1)),
                },
            )

        model = tf.saved_model.load(str(logdir / "on" / "saved"))
        self._classifier = Classifier(
            model=model,
            thresholds=thresholds,
            debug=self._debug,
        )

        # These 3 bools control the player using the camera
        self._play = False
        self._stop = False
        self._pause = False
        # However, we need to let the user control the player
        # thus we set another flag that is set only if the play(),pause(),stop()
        # methods have been called from this application.
        self._internal = False

        # Start main loop
        glib_loop = GLib.MainLoop()
        glib_loop.run()
Example #4
0
 def __init__(self):
     self.player = None
     for player in Playerctl.list_players():
         self.on_name_appeared(None, player)
     self.player_manager = Playerctl.PlayerManager()
     self.player_manager.connect('name-appeared', self.on_name_appeared)
     self.player_manager.connect('name-vanished', self.on_name_vanished)
     print('{}'.format(STOPPED), flush=True)
     self.main = GLib.MainLoop()
     self.main.run()
Example #5
0
    def __init__(self, **kwargs):
        super().__init__(application_id='com.aymanbagabas.Glyrics',
                         flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE,
                         **kwargs)

        self.playermanager = Playerctl.PlayerManager()
        self.player = None

        self.add_main_option("version", ord("v"), GLib.OptionFlags.NONE,
                             GLib.OptionArg.NONE, "Show Glyrics version", None)
Example #6
0
    def __init__(self, q, conf, name):
        super().__init__(q, conf, name)
        self.font_col = conf['font_color']
        self.manager = Playerctl.PlayerManager()
        self.string = Utilities.f_colour('No Media Playing', self.font_col)

        def init_player(name):
            player = Playerctl.Player.new_from_name(name)
            player.connect('playback-status::stopped', self.on_stopped, self.manager)
            player.connect('playback-status::playing', self.on_change, self.manager)
            player.connect('metadata', self.on_change, self.manager)
            self.manager.manage_player(player)

        self.manager.connect('name-appeared', lambda manager, name: init_player(name))

        for name in self.manager.props.player_names:
            init_player(name)
def get_playing_media_name():
    players = []
    man=Playerctl.PlayerManager().props.player_names
    for name in man: # Iterate over every media player
        try: # A media player's properties may sometimes be unavailable for some reason
            player = Playerctl.Player.new_from_name(name)
            try: # Try getting title
                title = player.get_title()
                if len(title)==0: # Title is empty
                    continue
            except Exception: # Couldn't get title - happens when there is no media player.
                continue
            artist = player.get_artist()
            try:
                pos = time.strftime("%H:%M:%S", time.gmtime(max(player.get_position()/1000000, 0)))
            except gi.repository.GLib.Error: # Player position may be not supported
                pos = None
            if 'mpris:length' in player.props.metadata.keys():
                length = time.strftime("%H:%M:%S", time.gmtime(player.props.metadata['mpris:length']/1000000))
            else:
                length=None
            if (artist is None) & (title is None):
                continue
                #return "" # No valid media data yet
            output=""
            if artist is not None:
                if len(artist)>0:
                    output+=artist+" - "
            output+=title
            if pos is not None:
                output+=" ("+pos
                if length is not None:
                    output+="/"+length
                output+=")"
            players.append( (output, player.props.status) )
        except Exception:
            players.append( ("?", "?") )
            continue
    return players
#!/usr/bin/env python3
"""
A simple Discord Rich Presence client that connects to MPRIS and shows your current song.
"""

import sys
import time
import gi
gi.require_version('Playerctl', '2.0')

from gi.repository import Playerctl, GLib
from pypresence import Presence
import pypresence.exceptions

manager = Playerctl.PlayerManager()

print("Starting RPC client...")
RPC = Presence('440997014315204609')

def connect_rpc():
    while True:
        try:
            RPC.connect()
            print("RPC client connected")
            break
        except ConnectionRefusedError as e:
            print("Failed to connect to RPC! Trying again in 10 seconds...")
            time.sleep(10)
        except (FileNotFoundError, AttributeError) as e:
            print("RPC failed to connect due to Discord not being opened yet. Please open it. Reconnecting in 10 seconds...")
            time.sleep(10)
Example #9
0
def get_player_status(show_track=False):
    manager = Playerctl.PlayerManager()
    available_players = manager.props.player_names
    if not available_players:
        return ""

    for name in available_players:
        player = Playerctl.Player.new_from_name(name)
        try:
            status = player.get_property('status')
            if status == 'Playing':
                break
        except GLib.Error:
            # player might not be running
            return ""
    try:
        track = player.get_title()
        artist = player.get_artist()
        metadata = player.get_property('metadata')
        # try extracting some data from metadata attribute
        metadata = metadata.unpack()
        if not track:
            track = metadata.get("xesam:url").split("/")[-1]
        # get information from vlc
        try:
            vlctitle = metadata['vlc:nowplaying'].strip()
            try:
                vlcartist, realtitle = vlctitle.split(" - ", 1)
                artist = vlcartist
                track = realtitle
            except ValueError:
                if vlctitle:
                    track = vlctitle
        except KeyError:
            # no further information available from vlc
            pass
    except AttributeError:
        pass

    # Fortmat output
    playing = ""
    if status:
        if status.startswith("Playing"):
            playing = "▶"
        elif status.startswith("Paused"):
            playing = ""  # paused
        elif status.startswith("Stopped"):
            playing = ""  #"\u23F9" # stop
    else:
        return ""

    if artist:
        artist = f"{artist[:10]}-"
    else:
        artist = ""
    try:
        track = re.split(
            " -| \\(",
            track)[0]  # remove stuff like '- Radio Edit' aka make it short!
    except TypeError:
        track = ""
    if show_track and status.startswith("Playing"):
        playing = f"{playing} {artist}{track[:20]}"
    return playing