from iqdb import Iqdb from library import Library from metadata import Metadata from database import Database from datetime import datetime from pathlib import Path import re import logging import time import shutil import os class PicSorter: def __init__(self): self.dir_tmp = Path('R:/') self.dir_input = Path('R:/input') self.dir_processed = Path('R:/processed') self.dir_logs = Path('./logs') self.dir_library = Path('./library') self.setup_folders() self.setup_logging() def setup_folders(self): self.dir_tmp.mkdir(exist_ok=True) self.dir_processed.mkdir(exist_ok=True) self.dir_logs.mkdir(exist_ok=True) self.dir_library.mkdir(exist_ok=True) def setup_logging(self): logfile = Path(self.dir_logs, datetime.now().strftime('%Y-%m-%d.log')) logging.basicConfig( filename=logfile, level=logging.INFO, format='%(asctime)s %(levelname)s %(module)s: %(message)s', datefmt='%H:%M:%S', ) def process_folder(self): iqdb = Iqdb() library = Library(self.dir_library) metadata = Metadata(self.dir_tmp) db = Database() for filename in self.dir_input.rglob('*.jpg'): print("Process ", filename) try: url = iqdb.search(filename) if url is None: logging.warn("%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(self.dir_processed)) time.sleep(5) except Exception as ex: raise ex if __name__ == '__main__': PicSorter().process_folder()