diff --git a/utils/Sync/settings.py b/utils/Sync/settings.py index 2495ef4a..ea2160bd 100644 --- a/utils/Sync/settings.py +++ b/utils/Sync/settings.py @@ -146,6 +146,7 @@ dir_articles = f('Articles') dir_collective = f('Collective') dir_albums = f('Gallery') dir_pages = './Pages' +dir_images = './Images' page_url_base = 'https://static.shlisselburg.org/art/images/page-{page}-{id}-{size}{ext}' diff --git a/utils/Sync/sync.py b/utils/Sync/sync.py index d19ba9fa..ba960d73 100644 --- a/utils/Sync/sync.py +++ b/utils/Sync/sync.py @@ -7,6 +7,7 @@ from sync.data.yandexdisk import YDProvider import asyncio import logging +from sync.models.Image import Image from sync.models.Album import Album from sync.models.Article import Article from sync.models.Page import Page @@ -80,6 +81,12 @@ async def run(run_interval=0): model=Settings, ) + sync_images = Sync( + provider=io(settings.provider_root), + model=Image, + ) + sync_images.strict_origin = True + while True: await asyncio.wait([ run_sync(sync_documents), @@ -89,6 +96,7 @@ async def run(run_interval=0): run_sync(sync_schedules), run_sync(sync_albums), run_sync(sync_settings), + run_sync(sync_images), ]) if run_interval == 0: diff --git a/utils/Sync/sync/models/Image.py b/utils/Sync/sync/models/Image.py index 8d9ee61c..e2d292e0 100644 --- a/utils/Sync/sync/models/Image.py +++ b/utils/Sync/sync/models/Image.py @@ -7,10 +7,11 @@ from typing import Optional, List import settings from db import collection -from sync.data import request +from sync.data import request, list_images from sync.models import Model from utils.hash import md5 from utils.image import image_magick_resize +from utils.text.transform import url_encode_text logger = logging.getLogger(settings.name + '.Image') @@ -32,6 +33,14 @@ class Image(Model): document = store.find_one(query) return document + @staticmethod + async def find(query): + return store.find(query) + + @staticmethod + async def delete(query): + return store.find_one_and_delete(query) + @staticmethod async def new(provider, file, sizes, url_factory=None): url_factory = url_factory if url_factory else default_url_factory @@ -49,15 +58,36 @@ class Image(Model): return img + @staticmethod + async def scan(provider): + scan_path = settings.dir_images + documents = list_images(provider, scan_path) + + return [Image.read_path(provider, i) for i in documents] + + @staticmethod + def read_path(provider, path): + return Image( + provider, + path, + data=None, + url_factory=default_url_factory + ) + def __init__(self, provider, file, data, url_factory): + self.origin = None + self.data = data self.url_factory = url_factory super().__init__(provider, store, file) def init(self): + self.id = self.__get_id() self.hash = self.__get_hash() + self.origin = f"{settings.origin}:{os.path.dirname(self.file)}" + async def is_changed(self): i = await Image.find_one({'file': self.file}) return self._is_changed_hash(i) @@ -97,7 +127,9 @@ class Image(Model): def bake(self): return { + 'id': self.id, 'file': self.file, + 'origin': self.origin, 'hash': self.hash, 'data': self.data, } @@ -110,8 +142,9 @@ class Image(Model): def __filename(self): return os.path.basename(self.file) - def __set_id(self, value): - self.id = value + def __get_id(self): + filename = os.path.basename(self.file) + return url_encode_text(filename) def __get_hash(self): return self.provider.hash(self.file)