init
This commit is contained in:
commit
dc47a1d50f
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
build
|
||||||
|
dist
|
||||||
|
__pycache__
|
72
__main__.py
Normal file
72
__main__.py
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
import asyncio
|
||||||
|
from winrt.windows.media.control import GlobalSystemMediaTransportControlsSessionManager as MediaManager
|
||||||
|
import win32com.client
|
||||||
|
import pythoncom
|
||||||
|
import time
|
||||||
|
|
||||||
|
from resources import LineState, CLMgrMessage
|
||||||
|
|
||||||
|
phone_mgr = ""
|
||||||
|
lines = []
|
||||||
|
class PhoneLineEventHandler():
|
||||||
|
|
||||||
|
def OnDispOnLineMgrNotification(self, msg, param, returns=""):
|
||||||
|
if msg == 0:
|
||||||
|
print(CLMgrMessage.s[msg], LineState.s[param])
|
||||||
|
for line in lines:
|
||||||
|
if line.DispState != LineState.Inactive:
|
||||||
|
asyncio.run(try_pause())
|
||||||
|
return True
|
||||||
|
asyncio.run(try_play())
|
||||||
|
return True
|
||||||
|
|
||||||
|
# async def get_media_info():
|
||||||
|
# sessions = await MediaManager.request_async()
|
||||||
|
|
||||||
|
# # This source_app_user_model_id check and if statement is optional
|
||||||
|
# # Use it if you want to only get a certain player/program's media
|
||||||
|
# # (e.g. only chrome.exe's media not any other program's).
|
||||||
|
|
||||||
|
# # To get the ID, use a breakpoint() to run sessions.get_current_session()
|
||||||
|
# # while the media you want to get is playing.
|
||||||
|
# # Then set TARGET_ID to the string this call returns.
|
||||||
|
|
||||||
|
# current_session = sessions.get_current_session()
|
||||||
|
# if current_session: # there needs to be a media session running
|
||||||
|
# #if current_session.source_app_user_model_id == TARGET_ID:
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# # It could be possible to select a program from a list of current
|
||||||
|
# # available ones. I just haven't implemented this here for my use case.
|
||||||
|
# # See references for more information.
|
||||||
|
# raise Exception('TARGET_PROGRAM is not the current media session')
|
||||||
|
|
||||||
|
async def try_play():
|
||||||
|
print("try_play")
|
||||||
|
sessions = await MediaManager.request_async()
|
||||||
|
current_session = sessions.get_current_session()
|
||||||
|
if current_session:
|
||||||
|
await current_session.try_play_async()
|
||||||
|
|
||||||
|
async def try_pause():
|
||||||
|
print("try_pause")
|
||||||
|
sessions = await MediaManager.request_async()
|
||||||
|
current_session = sessions.get_current_session()
|
||||||
|
if current_session:
|
||||||
|
await current_session.try_pause_async()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
phone_mgr = win32com.client.Dispatch("CLMgr.ClientLineMgr")
|
||||||
|
phone_mgr_event = win32com.client.WithEvents("CLMgr.ClientLineMgr", PhoneLineEventHandler)
|
||||||
|
for i in range(3):
|
||||||
|
lines.append(phone_mgr.DispGetLine(i))
|
||||||
|
while True:
|
||||||
|
#pythoncom.PumpWaitingMessages()
|
||||||
|
time.sleep(0.1) # Don't use up all our CPU checking constantly
|
44
__main__.spec
Normal file
44
__main__.spec
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# -*- mode: python ; coding: utf-8 -*-
|
||||||
|
|
||||||
|
|
||||||
|
block_cipher = None
|
||||||
|
|
||||||
|
|
||||||
|
a = Analysis(['__main__.py'],
|
||||||
|
pathex=['X:\\Documents\\Projekte\\Simon\\python media controll'],
|
||||||
|
binaries=[],
|
||||||
|
datas=[],
|
||||||
|
hiddenimports=[],
|
||||||
|
hookspath=[],
|
||||||
|
hooksconfig={},
|
||||||
|
runtime_hooks=[],
|
||||||
|
excludes=[],
|
||||||
|
win_no_prefer_redirects=False,
|
||||||
|
win_private_assemblies=False,
|
||||||
|
cipher=block_cipher,
|
||||||
|
noarchive=False)
|
||||||
|
pyz = PYZ(a.pure, a.zipped_data,
|
||||||
|
cipher=block_cipher)
|
||||||
|
|
||||||
|
exe = EXE(pyz,
|
||||||
|
a.scripts,
|
||||||
|
[],
|
||||||
|
exclude_binaries=True,
|
||||||
|
name='__main__',
|
||||||
|
debug=False,
|
||||||
|
bootloader_ignore_signals=False,
|
||||||
|
strip=False,
|
||||||
|
upx=True,
|
||||||
|
console=True,
|
||||||
|
disable_windowed_traceback=False,
|
||||||
|
target_arch=None,
|
||||||
|
codesign_identity=None,
|
||||||
|
entitlements_file=None )
|
||||||
|
coll = COLLECT(exe,
|
||||||
|
a.binaries,
|
||||||
|
a.zipfiles,
|
||||||
|
a.datas,
|
||||||
|
strip=False,
|
||||||
|
upx=True,
|
||||||
|
upx_exclude=[],
|
||||||
|
name='__main__')
|
99
resources.py
Normal file
99
resources.py
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
|
||||||
|
class CLMgrMessage():
|
||||||
|
CLMgrLineStateChangedMessage = 0 # state of at least one line has changed
|
||||||
|
CLMgrLineSelectionChangedMessage = 1 # line in focus has changed
|
||||||
|
CLMgrLineDetailsChangedMessage = 2 # details of at least one line have changed
|
||||||
|
CLMgrCallDetailsMessage = 4 # details of last call are available, post mortem for logging purpose
|
||||||
|
CLMgrServerDownMessage = 5 # server goes down, keep line manager, wait for ServerUp message
|
||||||
|
CLMgrServerUpMessage = 6 # server is up again, keep interfaces to line manger
|
||||||
|
CLMgrWaveDeviceChanged = 7 # speaker / micro has been switched on / off
|
||||||
|
CLMgrGroupCallNotificationMessage = 8 # notification about group call
|
||||||
|
CLMgrNumberOfLinesChangedMessage = 10 # the number of lines has changed
|
||||||
|
CLMgrClientShutDownRequest = 11 # Client Line Manager requests client to shutdown and release all interfaces
|
||||||
|
CLMgrLineStateChangedMessageEx = 28 # state of certain line has changed, lParam: LOWORD: line index of line that changed its state (starting with 0) HIWORD: new state of this line
|
||||||
|
|
||||||
|
s = [
|
||||||
|
"CLMgrLineStateChangedMessage",
|
||||||
|
"CLMgrLineSelectionChangedMessage",
|
||||||
|
"CLMgrLineDetailsChangedMessage",
|
||||||
|
"",
|
||||||
|
"CLMgrCallDetailsMessage",
|
||||||
|
"CLMgrServerDownMessage",
|
||||||
|
"CLMgrServerUpMessage",
|
||||||
|
"CLMgrWaveDeviceChanged",
|
||||||
|
"CLMgrGroupCallNotificationMessage",
|
||||||
|
"",
|
||||||
|
"CLMgrNumberOfLinesChangedMessage",
|
||||||
|
"CLMgrClientShutDownRequest",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"CLMgrLineStateChangedMessageEx"
|
||||||
|
]
|
||||||
|
|
||||||
|
class LineState():
|
||||||
|
Inactive = 0 # line is inactive
|
||||||
|
HookOffInternal = 1 # off hook, internal dialtone
|
||||||
|
HookOffExternal = 2 # off hook, external dialtone
|
||||||
|
Ringing = 3 # incoming call, ringing
|
||||||
|
Dialing = 4 # outgoing call, we are dialing, no sound
|
||||||
|
Alerting = 5 # outgoing call, alerting = ringing on destination
|
||||||
|
Knocking = 6 # outgoing call, knocking = second call ringing on destination
|
||||||
|
Busy = 7 # outgoing call, destination is busy
|
||||||
|
Active = 8 # incoming / outgoing call, logical and physical connection is established
|
||||||
|
OnHold = 9 # incoming / outgoing call, logical connection is established, destination gets music on hold
|
||||||
|
ConferenceActive = 10 # incoming / outgoing conference, logical and physical connection is established
|
||||||
|
ConferenceOnHold = 11 # incoming / outgoing conference, logical connection is established, not physcically connected
|
||||||
|
Terminated = 12 # incoming / outgoing connection / call has been disconnected
|
||||||
|
Transferring = 13 # special LSOnHold, call is awaiting to be transferred, peer gets special music on hold
|
||||||
|
Disabled = 14 # special LSInactive: wrap up time
|
||||||
|
|
||||||
|
s = [
|
||||||
|
"Inactive",
|
||||||
|
"HookOffInternal",
|
||||||
|
"HookOffExternal",
|
||||||
|
"Ringing",
|
||||||
|
"Dialing",
|
||||||
|
"Alerting",
|
||||||
|
"Knocking",
|
||||||
|
"Busy",
|
||||||
|
"Active",
|
||||||
|
"OnHold",
|
||||||
|
"ConferenceActive",
|
||||||
|
"ConferenceOnHold",
|
||||||
|
"Terminated",
|
||||||
|
"Transferring",
|
||||||
|
"Disabled"
|
||||||
|
]
|
||||||
|
|
||||||
|
class DisconnectReason():
|
||||||
|
Normal = 0
|
||||||
|
Busy = 1
|
||||||
|
Rejected = 2
|
||||||
|
Cancelled = 3
|
||||||
|
Transferred = 4
|
||||||
|
JoinedConference = 5
|
||||||
|
NoAnswer = 6
|
||||||
|
TooLate = 7
|
||||||
|
DirectCallImpossible = 8
|
||||||
|
WrongNumber = 9
|
||||||
|
Unreachable = 10
|
||||||
|
CallDiverted = 11
|
||||||
|
CallRoutingFailed = 12
|
||||||
|
PermissionDenied = 13
|
||||||
|
NetworkCongestion = 14
|
||||||
|
NoChannelAvailable = 15
|
||||||
|
NumberChanged = 16
|
||||||
|
IncompatibleDestination = 17
|
Loading…
x
Reference in New Issue
Block a user