swyx-win10-media-controll/mediacontrol.py
Simon Zeyer 65f3a5c1da refactoring as gui application
:# Please enter the commit message for your changes. Lines starting
2021-12-29 15:14:33 +01:00

119 lines
3.8 KiB
Python

import asyncio
from threading import Thread
import logging
import time
class SessionPlaybackStatus:
Changing: 2 # Das Medium ändert sich.
Closed: 0 # Das Medium ist geschlossen.
Opened: 1 # Das Medium wird geöffnet.
Paused: 5 # Das Medium wird angehalten.
Playing: 4 # Die Medien werden abspielt.
Stopped: 3 # Das Medium wird beendet.
class MediaControl(Thread):
__init_handler = []
__session_changed_handler = []
__running = True
def run(self) -> None:
from winrt.windows.media.control import GlobalSystemMediaTransportControlsSessionManager as MediaManager, CurrentSessionChangedEventArgs
self.MediaManager = MediaManager
# MediaManager.add_current_session_changed(Event)
for handler in self.__init_handler:
handler()
while self.__running:
time.sleep(1)
return super().run()
def __init__(self) -> None:
super().__init__()
def __current_session_changed(self, **kwargs):
print(kwargs)
for handler in self.__session_changed_handler:
handler()
def add_init_handler(self, handler):
self.__init_handler.append(handler)
# def add_session_changed_handler(self, handler):
# self.__session_changed_handler.append(handler)
def play(self):
asyncio.run(self.__try_play())
def pause(self):
asyncio.run(self.__try_pause())
def get_media_info(self):
return asyncio.run(self.__get_media_info())
def get_playback_info(self):
return asyncio.run(self.__get_playback_info())
def stop(self):
self.__running = False
async def __try_play(self):
logging.debug("__try_play")
sessions = await self.MediaManager.request_async()
current_session = sessions.get_current_session()
if current_session:
print("try_play!!!!!!!")
await current_session.try_play_async()
async def __try_pause(self):
logging.debug("__try_pause")
sessions = await self.MediaManager.request_async()
current_session = sessions.get_current_session()
if current_session:
await current_session.try_pause_async()
async def __get_media_info(self):
sessions = await self.MediaManager.request_async()
current_session = sessions.get_current_session()
if current_session: # there needs to be a media session running
info = await current_session.try_get_media_properties_async()
# song_attr[0] != '_' ignores system attributes
info_dict = {song_attr: info.__getattribute__(song_attr) for song_attr in dir(info) if song_attr[0] != '_'}
# converts winrt vector to list
info_dict['genres'] = list(info_dict['genres'])
return info_dict
async def __get_playback_info(self):
sessions = await self.MediaManager.request_async()
current_session = sessions.get_current_session()
if current_session: # there needs to be a media session running
info = current_session.get_playback_info()
# song_attr[0] != '_' ignores system attributes
info_dict = {playback_attr: info.__getattribute__(playback_attr) for playback_attr in dir(info) if playback_attr[0] != '_'}
# converts winrt vector to list
info_dict['controls'] = {control_attr: info.controls.__getattribute__(control_attr) for control_attr in dir(info.controls) if control_attr[0] != '_'}
return info_dict
if __name__ == "__main__":
def handle_init():
print(mc.get_media_info())
print(mc.get_playback_info())
pass
logging.getLogger().setLevel(logging.DEBUG)
mc = MediaControl()
mc.start()
mc.add_init_handler(handle_init)