127 lines
4.8 KiB
Python

import datetime
import os
from time import sleep
from icloudpy import ICloudPyService, exceptions, utils
from src import (
DEFAULT_CONFIG_FILE_PATH,
DEFAULT_COOKIE_DIRECTORY,
ENV_CONFIG_FILE_PATH_KEY,
ENV_ICLOUD_PASSWORD_KEY,
LOGGER,
config_parser,
read_config,
sync_drive
)
def get_api_instance(
username,
password,
cookie_directory=DEFAULT_COOKIE_DIRECTORY,
server_region="global",
):
return (
ICloudPyService(
apple_id=username,
password=password,
cookie_directory=cookie_directory,
home_endpoint="https://www.icloud.com.cn",
setup_endpoint="https://setup.icloud.com.cn/setup/ws/1",
)
if server_region == "china"
else ICloudPyService(
apple_id=username,
password=password,
cookie_directory=cookie_directory,
)
)
def sync():
last_send = None
enable_sync_drive = True
drive_sync_interval = 0
sleep_for = 10
while True:
config = read_config(
config_path=os.environ.get(
ENV_CONFIG_FILE_PATH_KEY, DEFAULT_CONFIG_FILE_PATH
)
)
username = config_parser.get_username(config=config)
if username:
try:
if ENV_ICLOUD_PASSWORD_KEY in os.environ:
password = os.environ.get(ENV_ICLOUD_PASSWORD_KEY)
utils.store_password_in_keyring(
username=username, password=password
)
else:
password = utils.get_password_from_keyring(username=username)
server_region = config_parser.get_region(config=config)
api = get_api_instance(
username=username, password=password, server_region=server_region
)
if not api.requires_2sa:
if "drive" in config and enable_sync_drive:
LOGGER.info("Синхронизация drive...")
vvvv = sync_drive.sync_drive(config=config, drive=api.drive, work=api.work)
LOGGER.info("Drive синхронизирован")
my_file = open("last_update.txt", "w")
my_file.write(datetime.datetime.now().isoformat())
my_file.close()
drive_sync_interval = config_parser.get_drive_sync_interval(
config=config
)
if "drive" not in config:
LOGGER.warning(
"Нечего синхронизировать. Добавьте раздел drive в файл config.yaml."
)
else:
LOGGER.error("Ошибка: требуется 2FA. Пожалуйста, войдите в систему.")
sleep_for = config_parser.get_retry_login_interval(config=config)
next_sync = (
datetime.datetime.now() + datetime.timedelta(seconds=sleep_for)
).strftime("%c")
if sleep_for < 0:
LOGGER.info("retry_login_interval is < 0, exiting ...")
break
LOGGER.info(f"Повторная попытка входа в {next_sync} ...")
sleep(sleep_for)
continue
except exceptions.ICloudPyNoStoredPasswordAvailableException:
LOGGER.error(
"Пароль не сохранен в связке ключей. Пожалуйста, сохраните пароль в связке ключей."
)
sleep_for = config_parser.get_retry_login_interval(config=config)
next_sync = (
datetime.datetime.now() + datetime.timedelta(seconds=sleep_for)
).strftime("%c")
LOGGER.info(f"Повторная попытка входа в систему {next_sync} ...")
sleep(sleep_for)
continue
if "drive" in config:
sleep_for = drive_sync_interval
enable_sync_drive = True
enable_sync_photos = False
next_sync = (
datetime.datetime.now() + datetime.timedelta(seconds=sleep_for)
).strftime("%c")
LOGGER.info(f"Повторная синхронизация в {next_sync} ...")
if (
config_parser.get_drive_sync_interval(config=config) < 0
if "drive" in config
else True and config_parser.get_photos_sync_interval(config=config) < 0
):
break
sleep(sleep_for)