Skip to content

Commit fb2e8a2

Browse files
authored
Merge pull request #50 from KumaTea/main
`winsdk` is deprecated, use `winrt-Namespace` instead
2 parents e84c91e + 638d7e6 commit fb2e8a2

2 files changed

Lines changed: 54 additions & 28 deletions

File tree

setup.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name='win11toast',
5-
version='0.35',
5+
version='0.36.1',
66
description='Toast notifications for Windows 10 and 11',
77
long_description=open('README.md', encoding='utf-8').read(),
88
long_description_content_type='text/markdown',
@@ -19,7 +19,20 @@
1919
'Operating System :: Microsoft :: Windows :: Windows 10',
2020
'Operating System :: Microsoft :: Windows :: Windows 11'
2121
],
22-
install_requires=['winsdk'],
22+
install_requires=[
23+
'winrt-Windows.Data.Xml.Dom',
24+
'winrt-Windows.Foundation',
25+
'winrt.windows.Foundation.Collections',
26+
'winrt-Windows.Globalization',
27+
'winrt-Windows.Graphics.Imaging',
28+
'winrt-Windows.Media.Core',
29+
'winrt-Windows.Media.Ocr',
30+
'winrt-Windows.Media.Playback',
31+
'winrt-Windows.Media.Speechsynthesis',
32+
'winrt-Windows.Storage',
33+
'winrt-Windows.Storage.Streams',
34+
'winrt-Windows.UI.Notifications'
35+
],
2336
py_modules=['win11toast']
2437
)
2538

win11toast.py

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import asyncio
22
from pathlib import Path
3-
from winsdk.windows.data.xml.dom import XmlDocument
4-
from winsdk.windows.foundation import IPropertyValue
5-
from winsdk.windows.ui.notifications import (
3+
from winrt.windows.data.xml.dom import XmlDocument
4+
from winrt.windows.foundation import IPropertyValue
5+
from winrt.windows.ui.notifications import (
66
ToastNotificationManager,
77
ToastNotification,
88
NotificationData,
@@ -152,18 +152,21 @@ def add_selection(selection, document):
152152
selection_element.set_attribute(name, value)
153153
input.append_child(selection_element)
154154

155+
155156
result = list()
156157

158+
157159
def result_wrapper(*args):
158160
global result
159161
result = args
160162
return result
161163

164+
162165
def activated_args(_, event):
163166
global result
164167
e = ToastActivatedEventArgs._from(event)
165168
user_input = dict([(name, IPropertyValue._from(
166-
e.user_input[name]).get_string()) for name in e.user_input])
169+
e.user_input[name]).get_string()) for name in e.user_input()])
167170
result = {
168171
'arguments': e.arguments,
169172
'user_input': user_input
@@ -172,14 +175,14 @@ def activated_args(_, event):
172175

173176

174177
async def play_sound(audio):
175-
from winsdk.windows.media.core import MediaSource
176-
from winsdk.windows.media.playback import MediaPlayer
178+
from winrt.windows.media.core import MediaSource
179+
from winrt.windows.media.playback import MediaPlayer
177180

178181
if audio.startswith('http'):
179-
from winsdk.windows.foundation import Uri
182+
from winrt.windows.foundation import Uri
180183
source = MediaSource.create_from_uri(Uri(audio))
181184
else:
182-
from winsdk.windows.storage import StorageFile
185+
from winrt.windows.storage import StorageFile
183186
file = await StorageFile.get_file_from_path_async(audio)
184187
source = MediaSource.create_from_storage_file(file)
185188

@@ -190,43 +193,44 @@ async def play_sound(audio):
190193

191194

192195
async def speak(text):
193-
from winsdk.windows.media.core import MediaSource
194-
from winsdk.windows.media.playback import MediaPlayer
195-
from winsdk.windows.media.speechsynthesis import SpeechSynthesizer
196+
from winrt.windows.media.core import MediaSource
197+
from winrt.windows.media.playback import MediaPlayer
198+
from winrt.windows.media.speechsynthesis import SpeechSynthesizer
196199

197200
# print(list(map(lambda info: info.description, SpeechSynthesizer.get_all_voices())))
198201

199202
stream = await SpeechSynthesizer().synthesize_text_to_stream_async(text)
200203
player = MediaPlayer()
201-
player.source = MediaSource.create_from_stream(stream, stream.content_type)
204+
player.source = MediaSource.create_from_stream(stream, stream.content_type())
202205
player.play()
203206
await asyncio.sleep(7)
204207

205208

206209
async def recognize(ocr):
207-
from winsdk.windows.media.ocr import OcrEngine
208-
from winsdk.windows.graphics.imaging import BitmapDecoder
210+
from winrt.windows.media.ocr import OcrEngine
211+
from winrt.windows.graphics.imaging import BitmapDecoder
209212
if isinstance(ocr, str):
210213
ocr = {'ocr': ocr}
211214
if ocr['ocr'].startswith('http'):
212-
from winsdk.windows.foundation import Uri
213-
from winsdk.windows.storage.streams import RandomAccessStreamReference
215+
from winrt.windows.foundation import Uri
216+
from winrt.windows.storage.streams import RandomAccessStreamReference
214217
ref = RandomAccessStreamReference.create_from_uri(Uri(ocr['ocr']))
215218
stream = await ref.open_read_async()
216219
else:
217-
from winsdk.windows.storage import StorageFile, FileAccessMode
220+
from winrt.windows.storage import StorageFile, FileAccessMode
218221
file = await StorageFile.get_file_from_path_async(ocr['ocr'])
219222
stream = await file.open_async(FileAccessMode.READ)
220223
decoder = await BitmapDecoder.create_async(stream)
221224
bitmap = await decoder.get_software_bitmap_async()
222225
if 'lang' in ocr:
223-
from winsdk.windows.globalization import Language
226+
from winrt.windows.globalization import Language
224227
if OcrEngine.is_language_supported(Language(ocr['lang'])):
225228
engine = OcrEngine.try_create_from_language(Language(ocr['lang']))
226229
else:
227230
class UnsupportedOcrResult:
228231
def __init__(self):
229232
self.text = 'Please install. Get-WindowsCapability -Online -Name "Language.OCR*"'
233+
230234
return UnsupportedOcrResult()
231235
else:
232236
engine = OcrEngine.try_create_from_user_profile_languages()
@@ -236,15 +240,17 @@ def __init__(self):
236240

237241

238242
def available_recognizer_languages():
239-
from winsdk.windows.media.ocr import OcrEngine
243+
from winrt.windows.media.ocr import OcrEngine
240244
for language in OcrEngine.get_available_recognizer_languages():
241245
print(language.display_name, language.language_tag)
242246
print('Run as Administrator')
243247
print('Get-WindowsCapability -Online -Name "Language.OCR*"')
244248
print('Add-WindowsCapability -Online -Name "Language.OCR~~~en-US~0.0.1.0"')
245249

246250

247-
def notify(title=None, body=None, on_click=print, icon=None, image=None, progress=None, audio=None, dialogue=None, duration=None, input=None, inputs=[], selection=None, selections=[], button=None, buttons=[], xml=xml, app_id=DEFAULT_APP_ID, scenario=None, tag=None, group=None):
251+
def notify(title=None, body=None, on_click=print, icon=None, image=None, progress=None, audio=None, dialogue=None,
252+
duration=None, input=None, inputs=[], selection=None, selections=[], button=None, buttons=[], xml=xml,
253+
app_id=DEFAULT_APP_ID, scenario=None, tag=None, group=None):
248254
document = XmlDocument()
249255
document.load_xml(xml.format(scenario=scenario if scenario else 'default'))
250256
if isinstance(on_click, str):
@@ -281,7 +287,7 @@ def notify(title=None, body=None, on_click=print, icon=None, image=None, progres
281287
if audio:
282288
if isinstance(audio, str) and audio.startswith('ms'):
283289
add_audio(audio, document)
284-
elif isinstance(audio, str) and (path := Path(audio)).is_file():
290+
elif isinstance(audio, str) and (path := Path(audio)).is_file():
285291
add_audio(f"file:///{path.absolute().as_posix()}", document)
286292
elif isinstance(audio, dict) and 'src' in audio and audio['src'].startswith('ms'):
287293
add_audio(audio, document)
@@ -306,14 +312,17 @@ def notify(title=None, body=None, on_click=print, icon=None, image=None, progres
306312
try:
307313
notifier = ToastNotificationManager.create_toast_notifier()
308314
except Exception as e:
309-
notifier = ToastNotificationManager.create_toast_notifier(app_id)
315+
notifier = ToastNotificationManager.create_toast_notifier_with_id(app_id)
310316
else:
311-
notifier = ToastNotificationManager.create_toast_notifier(app_id)
317+
notifier = ToastNotificationManager.create_toast_notifier_with_id(app_id)
312318
notifier.show(notification)
313319
return notification
314320

315321

316-
async def toast_async(title=None, body=None, on_click=print, icon=None, image=None, progress=None, audio=None, dialogue=None, duration=None, input=None, inputs=[], selection=None, selections=[], button=None, buttons=[], xml=xml, app_id=DEFAULT_APP_ID, ocr=None, on_dismissed=print, on_failed=print, scenario=None, tag=None, group=None):
322+
async def toast_async(title=None, body=None, on_click=print, icon=None, image=None, progress=None, audio=None,
323+
dialogue=None, duration=None, input=None, inputs=[], selection=None, selections=[], button=None,
324+
buttons=[], xml=xml, app_id=DEFAULT_APP_ID, ocr=None, on_dismissed=print, on_failed=print,
325+
scenario=None, tag=None, group=None):
317326
"""
318327
Notify
319328
Args:
@@ -339,7 +348,8 @@ async def toast_async(title=None, body=None, on_click=print, icon=None, image=No
339348
src = ocr if isinstance(ocr, str) else ocr['ocr']
340349
image = {'placement': 'hero', 'src': src}
341350
notification = notify(title, body, on_click, icon, image,
342-
progress, audio, dialogue, duration, input, inputs, selection, selections, button, buttons, xml, app_id, scenario, tag, group)
351+
progress, audio, dialogue, duration, input, inputs, selection, selections, button, buttons,
352+
xml, app_id, scenario, tag, group)
343353
loop = asyncio.get_running_loop()
344354
futures = []
345355

@@ -406,7 +416,10 @@ def on_done(t):
406416

407417
task.add_done_callback(on_done)
408418
return future
409-
419+
420+
421+
async def atoast(*args, **kwargs):
422+
return await toast_async(*args, **kwargs)
410423

411424

412425
def update_progress(progress, app_id=DEFAULT_APP_ID, tag='my_tag'):

0 commit comments

Comments
 (0)