import os import sys from pathlib import Path from playwright.sync_api import TimeoutError as PlaywrightTimeoutError from playwright.sync_api import sync_playwright XLSX_DIR = Path(os.getenv('CKAL_XLSX_DIR', '/data/ckal-xlsx')) CKAL_USERNAME = os.getenv('CKAL_USERNAME') CKAL_PASSWORD = os.getenv('CKAL_PASSWORD') def upload_file(xlsx_file: Path) -> None: print(f'Verarbeite: {xlsx_file.name}', flush=True) with sync_playwright() as p: browser = p.chromium.launch( headless=True, chromium_sandbox=False, args=['--disable-dev-shm-usage'], ) page = browser.new_page(viewport={'width': 1400, 'height': 800}) page.on('dialog', lambda dialog: dialog.accept()) try: page.goto( 'https://v2.ckalender.de/index.php?content=Login', wait_until='domcontentloaded', timeout=30000, ) page.locator('[name="username"]').fill(CKAL_USERNAME) page.locator('[name="password"]').fill(CKAL_PASSWORD) page.locator('[name="password"]').press('Enter') try: page.wait_for_url( lambda url: 'content=Login' not in str(url), timeout=15000, ) except PlaywrightTimeoutError as exc: raise RuntimeError('CKalender-Login fehlgeschlagen.') from exc page.goto( 'https://v2.ckalender.de/index.php?content=Admin.EventImport', wait_until='domcontentloaded', timeout=30000, ) page.locator('[value="Excel"]').click() upload = page.locator('input[type="file"]') upload.wait_for(state='attached', timeout=15000) upload.set_input_files(str(xlsx_file)) page.locator('[value="Append"]').click() page.locator('[class="ui primary button"]').click() page.wait_for_timeout(1500) finally: browser.close() def main() -> int: if not CKAL_USERNAME or not CKAL_PASSWORD: print('FEHLER: CKAL_USERNAME/CKAL_PASSWORD fehlt.', file=sys.stderr) return 1 XLSX_DIR.mkdir(parents=True, exist_ok=True) files = sorted(XLSX_DIR.glob('*.xlsx')) if not files: print('Keine XLSX-Dateien vorhanden.', flush=True) return 0 for xlsx_file in files: try: upload_file(xlsx_file) xlsx_file.unlink() print(f'Upload erfolgreich: {xlsx_file.name}', flush=True) except Exception as exc: print(f'FEHLER bei {xlsx_file.name}: {exc}', file=sys.stderr, flush=True) return 1 return 0 if __name__ == '__main__': sys.exit(main())