import os from io import BytesIO import pandas as pd from dotenv import load_dotenv from synology_drive_api.drive import SynologyDrive from synology_drive_api.base import SynologyException load_dotenv() SYNO_HOST = os.getenv("SYNO_BASE_URL", "").strip() # без схемы! например: "nas.example.com" SYNO_USERNAME = os.getenv("SYNO_USERNAME", "") SYNO_PASSWORD = os.getenv("SYNO_PASSWORD", "") SYNO_PORT = int(os.getenv("SYNO_PORT", "5001")) def load_osheet(file_path: str, sheet: str | int = 0) -> pd.DataFrame: """ Скачивает Synology Office .osheet через Drive API (делает экспорт в xlsx под капотом) и возвращает pandas.DataFrame для указанного листа. file_path: путь вида '/GFX/…/MATCH.osheet' (шара должна быть Team Folder в Drive). """ drv = SynologyDrive(SYNO_USERNAME, SYNO_PASSWORD, SYNO_HOST, SYNO_PORT, https=True, dsm_version="7") try: # вернёт BytesIO c xlsx bio = drv.download_synology_office_file(file_path) df = pd.read_excel(bio, sheet_name=sheet) return df except SynologyException as e: # Часто: {"code":1000,"message":"get file information failed"} — Drive не видит путь (нет Team Folder/прав) raise RuntimeError( "Не удалось экспортировать .osheet через Synology Drive. " "Проверь, что шара включена в Drive Admin Console → Team Folder, " "и у пользователя есть права. Исходная ошибка: " + str(e) ) finally: try: drv.logout() except Exception: pass load_osheet(file_path="/GFX/Hockey/KHL/Soft/MATCH.osheet", sheet="TEAMS")