import logging import os import re import shutil import time from datetime import datetime from pathlib import Path from config import Config from database import Database from iqdb import Iqdb from library import Library from metadata import Metadata class PicSorter: def __init__(self): self.config = Config.load('config.yml') self.setup_logging() def setup_logging(self): filename = datetime.now().strftime('%Y-%m-%d.log') logfile = Path(self.config.dir_logs, filename) logging.basicConfig( filename=os.fspath(logfile), level=logging.INFO, format='%(asctime)s %(levelname)s %(module)s: %(message)s', datefmt='%H:%M:%S', ) def process_folder(self): config = self.config library = Library(config.dir_library) metadata = Metadata(config.dir_tmp) db = Database() files = {p for p in config.dir_input.iterdir() if p.suffix in [".jpg", ".png"]} for filename in files: print("Process", filename) try: url = Iqdb.search(filename) if url is None: logging.warning("%s not found", filename) library.move_to_orphan(Path(filename)) continue m = re.search(r".*posts/(\d{3,})", url) if not m: continue post_id = int(m.group(1)) if db.is_exists(post_id): logging.info("Skipping exists post %d", post_id) continue meta_result = metadata.process(url) if meta_result is None: continue image_path, tags = meta_result library.move(image_path, tags) db.add(post_id, tags.tags_string) shutil.move(os.fspath(filename), os.fspath(config.dir_processed)) time.sleep(5) except Exception as ex: raise ex if __name__ == '__main__': PicSorter().process_folder()