diff options
author | Blaster4385 <[email protected]> | 2025-08-15 15:09:35 +0530 |
---|---|---|
committer | Blaster4385 <[email protected]> | 2025-08-15 15:09:35 +0530 |
commit | 5690fffa9360180dcf79738cde27b918e09e6273 (patch) | |
tree | b999d0a1f875791652bcec1a80ad8d575ad55d9a /waybar/custom_modules/media-player-status.py | |
parent | addbb7a93bf327b3f4f445805722039df457c145 (diff) |
Diffstat (limited to 'waybar/custom_modules/media-player-status.py')
-rwxr-xr-x | waybar/custom_modules/media-player-status.py | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/waybar/custom_modules/media-player-status.py b/waybar/custom_modules/media-player-status.py new file mode 100755 index 0000000..df348c7 --- /dev/null +++ b/waybar/custom_modules/media-player-status.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python + +import html +import json +import gi +import sys +gi.require_version('Playerctl', '2.0') +from gi.repository import Playerctl, GLib # noqa: E402 + +ARTIST = 'xesam:artist' +TITLE = 'xesam:title' +ICONS = { + 'spotify': '阮 ', + 'ncspot': '阮 ', + 'vlc': '嗢 ', + 'firefox': ' ', + 'default': '契 ', + 'paused': ' ' +} + +last_status = None + + +def find_active_player(manager, vanished_player): + for player in manager.props.players: + if player == vanished_player: + continue + if player.props.playback_status != Playerctl.PlaybackStatus.STOPPED: + return player + return None + + +def get_status(manager, vanished_player): + player = find_active_player(manager, vanished_player) + if player is None: + return '', '', 'stopped' + name = player.props.player_name + metadata = player.props.metadata + title = metadata[TITLE] if TITLE in metadata.keys() else None + artist = metadata[ARTIST][0] if ARTIST in metadata.keys() else None + if name == 'firefox' and title == 'Firefox' and artist == 'Mozilla': + title = None + artist = None + if player.props.playback_status == Playerctl.PlaybackStatus.PAUSED: + css_class = 'paused' + else: + css_class = 'playing' + if title is None and artist is None: + if css_class == 'paused': + icon = ICONS['paused'] + else: + icon = ICONS['default'] + app_icon = ICONS.get(name, None) + if app_icon is None: + label = icon + else: + label = f'{icon} {app_icon}' + return label, f'{name.title()}: {css_class.title()}', css_class + if css_class == 'paused': + icon = ICONS['paused'] + else: + # Added override for icon + #icon = ICONS.get(name, ICONS['default']) + icon = ICONS['default'] + if title is None or title == '': + song = artist or name.title() + elif artist is None or artist == '': + song = f'{title}' + else: + song = f'{artist} – {title}' + html_song = html.escape(song) + return f'{icon} {html_song}', f'{name.title()}: {song}', css_class + + +def print_status(manager, vanished_player=None): + text, tooltip, css_class = get_status(manager, vanished_player) + status = json.dumps({'text': text, 'tooltip': tooltip, 'class': css_class}) + global last_status + if last_status != status: + print(status) + sys.stdout.flush() + last_status = status + + +def on_playback_status(player, status, manager): + manager.move_player_to_top(player) + print_status(manager) + + +def on_metadata(player, metadata, manager): + manager.move_player_to_top(player) + print_status(manager) + + +def init_player(manager, name): + player = Playerctl.Player.new_from_name(name) + player.connect('playback-status', on_playback_status, manager) + player.connect('metadata', on_metadata, manager) + manager.manage_player(player) + + +def on_name_appeared(manager, name, _): + init_player(manager, name) + print_status(manager) + + +def on_player_vanished(manager, player, _): + print_status(manager, player) + + +def init_manager(): + manager = Playerctl.PlayerManager() + manager.connect('name-appeared', on_name_appeared, manager) + manager.connect('player-vanished', on_player_vanished, manager) + for name in manager.props.player_names: + init_player(manager, name) + print_status(manager) + + +if __name__ == '__main__': + init_manager() + main = GLib.MainLoop() + main.run() |