diff --git a/.gitignore b/.gitignore index 505a3b1..2733217 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ wheels/ # Virtual environments .venv +tesseract +adis.db diff --git a/main.py b/main.py index 0de38c8..ec6e7ae 100644 --- a/main.py +++ b/main.py @@ -1,64 +1,91 @@ import keyboard -from src.adischeck import is_adis_running, get_active_name, print_new_signature, adis_get_signature, adis_save_and_enter_exemplar, new_search, taskswitcher_name +from src.adischeck import ( + is_adis_running, + get_active_name, + print_new_signature, + adis_get_signature, + adis_save_and_enter_exemplar, + new_search, + taskswitcher_name, + get_mednr_exempl, + enter_print_mode, + exit_print_mode, +) +from src.adischeck_online import run, work_on_page import pyautogui from src.database import Database import time import sys import clipboard +from playwright.sync_api import Playwright, sync_playwright, expect catalogue_pid = None print_pid = None database = Database() +page = run() + def main(): - global catalogue_pid, print_pid - if not is_adis_running(): - print("aDISCl is not running. Please start all required aDIS instances and try again.") - return - print("aDISCl is running. Proceeding to capture PIDs...") - print("Press 'c' to capture the PID of the Catalogue aDIS instance.") - keyboard.wait('c') - #press backspace to clear any previous input - catalogue_pid = get_active_name() - print("Captured Catalogue PID:", catalogue_pid) - pyautogui.hotkey("ctrl", "a") # Switch to the next aDIS instance - pyautogui.hotkey("delete") - # pyautogui.press("backspace") - print("Press 'p' to capture the PID of the Print aDIS instance.") - keyboard.wait('p') - print_pid = get_active_name() - print("Captured Print PID:", print_pid) - pyautogui.hotkey("ctrl", "a") # Switch to the next aDIS instance - pyautogui.hotkey("delete") - - if catalogue_pid and print_pid: - print("Both Catalogue and Print PIDs captured successfully.") - print("Switching back to Catalogue aDIS instance...") - taskswitcher_name(catalogue_pid) # Switch to Catalogue aDIS instance - # pyautogui.hotkey("alt", "s") # Open the search dialog in Catalogue aDIS - else: - print("Failed to capture one or both PIDs. Please ensure you have the correct aDIS instances open.") - print("Exiting the program.") - sys.exit(1) + # global catalogue_pid, print_pid + # if not is_adis_running(): + # print("aDISCl is not running. Please start all required aDIS instances and try again.") + # return + # print("aDISCl is running. Proceeding to capture PIDs...") + # print("Press 'c' to capture the PID of the Catalogue aDIS instance.") + # keyboard.wait('c') + # #press backspace to clear any previous input + # catalogue_pid = get_active_name() + # print("Captured Catalogue PID:", catalogue_pid) + # pyautogui.hotkey("ctrl", "a") # Switch to the next aDIS instance + # pyautogui.hotkey("delete") + # # pyautogui.press("backspace") + # print("Press 'p' to capture the PID of the Print aDIS instance.") + # keyboard.wait('p') + # print_pid = get_active_name() + # print("Captured Print PID:", print_pid) + # pyautogui.hotkey("ctrl", "a") # Switch to the next aDIS instance + # pyautogui.hotkey("delete") + + # if catalogue_pid and print_pid: + # print("Both Catalogue and Print PIDs captured successfully.") + # print("Switching back to Catalogue aDIS instance...") + # taskswitcher_name(catalogue_pid) # Switch to Catalogue aDIS instance + # pyautogui.press("up") + # # pyautogui.hotkey("alt", "s") # Open the search dialog in Catalogue aDIS + # else: + # print("Failed to capture one or both PIDs. Please ensure you have the correct aDIS instances open.") + # print("Exiting the program.") + # sys.exit(1) + print("Starting the script...") while True: - keyboard.wait('space') - print("Space key pressed. Switching to Catalogue aDIS instance...") - time.sleep(5) - text = adis_get_signature() - new = database.insert_ma(text) - clipboard.copy(new) # Copy the new signature to clipboard - print(text, new) - pyautogui.hotkey('ctrl', 'v') # Select all text - mednr = adis_save_and_enter_exemplar(new) # Example usage with a new signature - print("finished main work, printing new signature") + mednr = get_mednr_exempl() + print("Mednr:", mednr) + + pyautogui.hotkey("alt", "s") + work_on_page(page, mednr) + enter_print_mode() + pyautogui.press("space") time.sleep(1) - print_new_signature(catalogue_pid, print_pid, mednr) - new_search() + exit_print_mode() + # keyboard.wait('space') + + # time.sleep(5) + # text = adis_get_signature() + # new = database.insert_ma(text) + # clipboard.copy(new) # Copy the new signature to clipboard + # print(text, new) + # pyautogui.hotkey('ctrl', 'v') # Select all text + # mednr = adis_save_and_enter_exemplar(new) # Example usage with a new signature + # print("finished main work, printing new signature") + # time.sleep(1) + # print_new_signature(catalogue_pid, print_pid, mednr) + # new_search() if __name__ == "__main__": main() - # time.sleep(5) # Wait for a few seconds before starting - # print_new_signature("3 - PHFR: Katalog - aDIS/Client", "4 - PHFR(42): Exemplare - aDIS/Client", "004862920129") \ No newline at end of file + + # time.sleep(5) # Wait for a few seconds before starting + # print_new_signature("3 - PHFR: Katalog - aDIS/Client", "4 - PHFR(42): Exemplare - aDIS/Client", "004862920129") \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 193b7ff..035ecdb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,10 +6,13 @@ readme = "README.md" requires-python = ">=3.13" dependencies = [ "clipboard>=0.0.4", + "getpixelcolor>=0.2.3", "keyboard>=0.13.5", "opencv-python>=4.11.0.86", + "playwright>=1.52.0", "psutil>=7.0.0", "pyautogui>=0.9.54", + "pyperclip>=1.9.0", "pytesseract>=0.3.13", "pywin32>=310", "winregistry>=2.1.1", diff --git a/src/adischeck.py b/src/adischeck.py index c499b2a..c1b24f9 100644 --- a/src/adischeck.py +++ b/src/adischeck.py @@ -3,9 +3,12 @@ import psutil import pygetwindow import pyautogui import time -import clipboard -from src.cursor import classify_cursor, get_current_hcursor +import pyperclip as clipboard +import getpixelcolor +import pytesseract +# from src.cursor import classify_cursor, get_current_hcursor +pytesseract.pytesseract.tesseract_cmd = r".\tesseract\tesseract.exe" def is_adis_running(): @@ -173,6 +176,7 @@ def print_new_signature(catalogue_name:str, print_name:str, mednr:str): pyautogui.press('space') # Simulate pressing space to print #sleep as long as the cursor is not arrow, ibeam or hand + time.sleep(2) while True: cursor = get_current_hcursor() cursor_name = classify_cursor(cursor) @@ -201,9 +205,51 @@ def new_search(): +def get_mednr_exempl(): + keyboard.wait("space") + time.sleep(3) + while ( + pyautogui.locateOnScreen( + "images/exemplar_ident.png", confidence=0.6, minSearchTime=1 + ) + is None + ): + print("waiting") + time.sleep(1) + + return pytesseract.image_to_string(pyautogui.screenshot(region=(509, 357, 250, 25))) + + +def enter_print_mode(): + pyautogui.keyDown("alt") + pyautogui.press("b") # Open the search dialog in Catalogue aDIS + pyautogui.press("d") + pyautogui.keyUp("alt") + time.sleep(5) + if pyautogui.locateOnScreen("images/print_btns.png", confidence=0.8): + pyautogui.press("space") + time.sleep(1) + + +def exit_print_mode(): + print("Exiting print mode...") + time.sleep(2) + while getpixelcolor.pixel(1240, 971) != (192, 215, 242): + print("Not found") + time.sleep(1) + # while getpixelcolor.pixel(1240, 971) == (202, 202, 202): + # time.sleep(1) + # print("Process locked") + # time.sleep(1) + pyautogui.click(1240, 971) # Click the print button + + print("Exited print mode.") + if __name__ == "__main__": time.sleep(5) # Wait for a few seconds before starting + # print("press space") # commit_changes() #new_search() - get_click_locations() \ No newline at end of file + get_click_locations() + # print(get_mednr_exempl()) \ No newline at end of file diff --git a/src/adischeck_online.py b/src/adischeck_online.py new file mode 100644 index 0000000..c175359 --- /dev/null +++ b/src/adischeck_online.py @@ -0,0 +1,56 @@ + + + +import re +from playwright.sync_api import Playwright, sync_playwright, expect +from src.database import Database +import pyperclip as clipboard + +import time +def run(): + browser = sync_playwright().start().chromium.launch(headless=False) + context = browser.new_context() + page = context.new_page() + page.goto("https://bsz.ibs-bw.de:22998/dap42") + page.get_by_role("textbox", name="Benutzer").fill("phfr") + page.get_by_role("textbox", name="Benutzer").press("Tab") + page.get_by_role("textbox", name="Kennwort").fill("freiburg") + page.get_by_role("textbox", name="Kennwort").press("Enter") + page.get_by_role("button", name="Katalog").click() + page.get_by_role("textbox", name="Mediennummer").click() + return page + +def work_on_page(page, mednr: str): + db = Database() + page.get_by_role("textbox", name="Mediennummer").fill(mednr) + page.get_by_text("Suche starten").nth(1).click() + page.get_by_text("Ändern").nth(1).click() + page.get_by_role("link", name="Sacherschließung").click() + page.get_by_role("link", name="Notation, Genre, Signatur").click() + page.locator("input[name=\"cellEditValue\\$7\"]").click() + page.locator("input[name=\"cellEditValue\\$7\"]").press("ControlOrMeta+a") + page.locator("input[name=\"cellEditValue\\$7\"]").press("ControlOrMeta+c") + signature = clipboard.paste() + print(signature) + + new_signature = db.insert(signature) + clipboard.copy(new_signature) + + page.locator("input[name=\"cellEditValue\\$7\"]").fill(new_signature) + page.locator("span").filter(has_text="Speichern").click() + page.locator("iframe").content_frame.get_by_role("cell", name="Bibliothek der Pädagogischen").get_by_role("checkbox").check() + page.get_by_role("list").get_by_text("Gesamtinfo").click() + page.get_by_role("button", name="Ändern").click() + page.get_by_role("textbox", name="Signatur", exact=True).click() + page.get_by_role("textbox", name="Signatur", exact=True).press("ControlOrMeta+a") + page.get_by_role("textbox", name="Signatur", exact=True).fill(new_signature) + page.locator("span").filter(has_text="Speichern").click() + page.get_by_role("button", name="Zurück").click() + page.get_by_role("link", name="Bearbeiten").click() + page.get_by_role("link", name="Ansigeln/Absigeln").click() + page.get_by_role("button", name="Ok").click() + + + + + diff --git a/src/database.py b/src/database.py index 2efc16d..334f5c3 100644 --- a/src/database.py +++ b/src/database.py @@ -51,6 +51,18 @@ class Database: count = cursor.fetchone()[0] return count > 0 + def insert(self, old_signature: str) -> str | None: + table = old_signature.split(" ")[0].lower() + if table == "ma": + return self.insert_ma(old_signature) + elif table == "mb": + return self.insert_mb(old_signature) + elif table == "mc": + return self.insert_mc(old_signature) + else: + # print(f"Error: Unknown signature type '{table}'. Please use 'ma', 'mb', or 'mc'.") + return self.insert_ma(old_signature) + def insert_ma(self, old_signature: str) -> str|None: """Insert an old signature into the ma table and return the new signature. New Signatures is generated by using 01 / as prefix, then incrementing the number by 1 for each new entry.""" diff --git a/uv.lock b/uv.lock index 246c075..2606ec1 100644 --- a/uv.lock +++ b/uv.lock @@ -37,6 +37,68 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/8a/38/17f3885713d0f39994563029942b1d31c93d4e56d80da505abfbfb3a3bc4/clipboard-0.0.4.tar.gz", hash = "sha256:a72a78e9c9bf68da1c3f29ee022417d13ec9e3824b511559fd2b702b1dd5b817", size = 1713 } +[[package]] +name = "getpixelcolor" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')", +] +dependencies = [ + { name = "numpy", marker = "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')" }, + { name = "pasteboard", marker = "platform_system == 'darwin'" }, + { name = "pillow", marker = "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')" }, + { name = "pyautogui", marker = "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')" }, + { name = "pyobjc", marker = "platform_system == 'darwin'" }, + { name = "pyobjc-core", marker = "platform_system == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/fb/50582419aca3d3258e4053834520a0ee64fef14da2cd94684c1d0c77163e/GetPixelColor-0.2.3.tar.gz", hash = "sha256:bacbd0da7f4227ccb8807ff00cf113c10caa6ec1b3803465694791ee08dc623b", size = 3461 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/8b/5f8fc9f748eb3f3c301d5c0b2bf95e4fb5e4d06798068ccfd9a52405bcfc/GetPixelColor-0.2.3-py3-none-any.whl", hash = "sha256:9233cf7bcbf1927a41d07413e4d31d173f4e612bd8ac199ea308b697f2d685ed", size = 3441 }, +] + +[[package]] +name = "getpixelcolor" +version = "0.2.19" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "platform_system == 'Darwin'", + "platform_machine == 'aarch64' and platform_system == 'Linux'", +] +dependencies = [ + { name = "numpy", marker = "platform_system == 'Darwin' or (platform_machine == 'aarch64' and platform_system == 'Linux')" }, + { name = "pillow", marker = "platform_system == 'Darwin' or (platform_machine == 'aarch64' and platform_system == 'Linux')" }, + { name = "pyautogui", marker = "platform_system == 'Darwin' or (platform_machine == 'aarch64' and platform_system == 'Linux')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/14/751ad96804e3ab8ab332f82df8510ac080d38b900ba6c08b9712964d7fc0/GetPixelColor-0.2.19.tar.gz", hash = "sha256:a8953d09e711216f366c019b44ad08cb3cf1fc57b948a01ac35f92f309bf538c", size = 8745 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/fe/2519b3a8affb383f40ffa9c771fe2f09f0d08249b125be7c81c3898cfccd/GetPixelColor-0.2.19-py3-none-any.whl", hash = "sha256:9628b6fd3ac2d3c0b152a8237cd609a5e6b481ce74ffdbf6f902dcaff28df2d6", size = 8288 }, +] + +[[package]] +name = "greenlet" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732 }, + { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033 }, + { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999 }, + { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368 }, + { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037 }, + { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402 }, + { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577 }, + { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121 }, + { url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603 }, + { url = "https://files.pythonhosted.org/packages/d8/ca/accd7aa5280eb92b70ed9e8f7fd79dc50a2c21d8c73b9a0856f5b564e222/greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86", size = 271479 }, + { url = "https://files.pythonhosted.org/packages/55/71/01ed9895d9eb49223280ecc98a557585edfa56b3d0e965b9fa9f7f06b6d9/greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97", size = 683952 }, + { url = "https://files.pythonhosted.org/packages/ea/61/638c4bdf460c3c678a0a1ef4c200f347dff80719597e53b5edb2fb27ab54/greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728", size = 696917 }, + { url = "https://files.pythonhosted.org/packages/22/cc/0bd1a7eb759d1f3e3cc2d1bc0f0b487ad3cc9f34d74da4b80f226fde4ec3/greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a", size = 692443 }, + { url = "https://files.pythonhosted.org/packages/67/10/b2a4b63d3f08362662e89c103f7fe28894a51ae0bc890fabf37d1d780e52/greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892", size = 692995 }, + { url = "https://files.pythonhosted.org/packages/5a/c6/ad82f148a4e3ce9564056453a71529732baf5448ad53fc323e37efe34f66/greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141", size = 655320 }, + { url = "https://files.pythonhosted.org/packages/5c/4f/aab73ecaa6b3086a4c89863d94cf26fa84cbff63f52ce9bc4342b3087a06/greenlet-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:8c47aae8fbbfcf82cc13327ae802ba13c9c36753b67e760023fd116bc124a62a", size = 301236 }, +] + [[package]] name = "keyboard" version = "0.13.5" @@ -55,10 +117,14 @@ version = "0.1.0" source = { virtual = "." } dependencies = [ { name = "clipboard" }, + { name = "getpixelcolor", version = "0.2.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')" }, + { name = "getpixelcolor", version = "0.2.19", source = { registry = "https://pypi.org/simple" }, marker = "platform_system == 'Darwin' or (platform_machine == 'aarch64' and platform_system == 'Linux')" }, { name = "keyboard" }, { name = "opencv-python" }, + { name = "playwright" }, { name = "psutil" }, { name = "pyautogui" }, + { name = "pyperclip" }, { name = "pytesseract" }, { name = "pywin32" }, { name = "winregistry" }, @@ -72,10 +138,13 @@ dev = [ [package.metadata] requires-dist = [ { name = "clipboard", specifier = ">=0.0.4" }, + { name = "getpixelcolor", specifier = ">=0.2.3" }, { name = "keyboard", specifier = ">=0.13.5" }, { name = "opencv-python", specifier = ">=4.11.0.86" }, + { name = "playwright", specifier = ">=1.52.0" }, { name = "psutil", specifier = ">=7.0.0" }, { name = "pyautogui", specifier = ">=0.9.54" }, + { name = "pyperclip", specifier = ">=1.9.0" }, { name = "pytesseract", specifier = ">=0.3.13" }, { name = "pywin32", specifier = ">=310" }, { name = "winregistry", specifier = ">=2.1.1" }, @@ -170,6 +239,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, ] +[[package]] +name = "pasteboard" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ed/d21829c72b2d7de85a3ef8214639e60611e92676c5559a4e879c5711b3ac/pasteboard-0.4.0.tar.gz", hash = "sha256:dd332253c431ada32074dd5693a231261f2bbd78465de4da27a3469f30d0f84d", size = 28213 } + [[package]] name = "pillow" version = "11.2.1" @@ -200,6 +275,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234 }, ] +[[package]] +name = "playwright" +version = "1.52.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet" }, + { name = "pyee" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/62/a20240605485ca99365a8b72ed95e0b4c5739a13fb986353f72d8d3f1d27/playwright-1.52.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:19b2cb9d4794062008a635a99bd135b03ebb782d460f96534a91cb583f549512", size = 39611246 }, + { url = "https://files.pythonhosted.org/packages/dc/23/57ff081663b3061a2a3f0e111713046f705da2595f2f384488a76e4db732/playwright-1.52.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0797c0479cbdc99607412a3c486a3a2ec9ddc77ac461259fd2878c975bcbb94a", size = 37962977 }, + { url = "https://files.pythonhosted.org/packages/a2/ff/eee8532cff4b3d768768152e8c4f30d3caa80f2969bf3143f4371d377b74/playwright-1.52.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:7223960b7dd7ddeec1ba378c302d1d09733b8dac438f492e9854c85d3ca7144f", size = 39611247 }, + { url = "https://files.pythonhosted.org/packages/73/c6/8e27af9798f81465b299741ef57064c6ec1a31128ed297406469907dc5a4/playwright-1.52.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:d010124d24a321e0489a8c0d38a3971a7ca7656becea7656c9376bfea7f916d4", size = 45141333 }, + { url = "https://files.pythonhosted.org/packages/4e/e9/0661d343ed55860bcfb8934ce10e9597fc953358773ece507b22b0f35c57/playwright-1.52.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4173e453c43180acc60fd77ffe1ebee8d0efbfd9986c03267007b9c3845415af", size = 44540623 }, + { url = "https://files.pythonhosted.org/packages/7a/81/a850dbc6bc2e1bd6cc87341e59c253269602352de83d34b00ea38cf410ee/playwright-1.52.0-py3-none-win32.whl", hash = "sha256:cd0bdf92df99db6237a99f828e80a6a50db6180ef8d5352fc9495df2c92f9971", size = 34839156 }, + { url = "https://files.pythonhosted.org/packages/51/f3/cca2aa84eb28ea7d5b85d16caa92d62d18b6e83636e3d67957daca1ee4c7/playwright-1.52.0-py3-none-win_amd64.whl", hash = "sha256:dcbf75101eba3066b7521c6519de58721ea44379eb17a0dafa94f9f1b17f59e4", size = 34839164 }, + { url = "https://files.pythonhosted.org/packages/b5/4f/71a8a873e8c3c3e2d3ec03a578e546f6875be8a76214d90219f752f827cd/playwright-1.52.0-py3-none-win_arm64.whl", hash = "sha256:9d0085b8de513de5fb50669f8e6677f0252ef95a9a1d2d23ccee9638e71e65cb", size = 30688972 }, +] + [[package]] name = "psutil" version = "7.0.0" @@ -240,6 +334,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, ] +[[package]] +name = "pyee" +version = "13.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/03/1fd98d5841cd7964a27d729ccf2199602fe05eb7a405c1462eb7277945ed/pyee-13.0.0.tar.gz", hash = "sha256:b391e3c5a434d1f5118a25615001dbc8f669cf410ab67d04c4d4e07c55481c37", size = 31250 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/4d/b9add7c84060d4c1906abe9a7e5359f2a60f7a9a4f67268b2766673427d8/pyee-13.0.0-py3-none-any.whl", hash = "sha256:48195a3cddb3b1515ce0695ed76036b5ccc2ef3a9f963ff9f77aec0139845498", size = 15730 }, +] + [[package]] name = "pygetwindow" version = "0.0.9" @@ -2871,6 +2977,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/58/0a/e451c3dbda38dd6abab1fd16c3b35623fc0635dffcbbf97f1acc55a58508/rubicon_objc-0.5.1-py3-none-any.whl", hash = "sha256:17092756241b8370231cfaad45ad6e8ce99534987f2acbc944d65df5bdf8f6cd", size = 63323 }, ] +[[package]] +name = "typing-extensions" +version = "4.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839 }, +] + [[package]] name = "winregistry" version = "2.1.1"