119 lines
3.8 KiB
Python
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) |