PK!imagedb/__init__.pyPK!׹Jimagedb/app.pyimport os from PIL import ImageGrab from io import BytesIO import re from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from . import db class ImageDB: def __init__(self, db_path): self.engine = create_engine('sqlite:///' + db_path) Session = sessionmaker(bind=self.engine) self.session = Session() if not os.path.exists(db_path): db.Base.metadata.create_all(self.engine) def from_clipboard(self, tag_or_tags=None): im = ImageGrab.grabclipboard() if im is not None: fp = BytesIO() im.save(fp, format='png') db_image = db.Image() db_image.data = fp.getvalue() self.session.add(db_image) self.session.commit() if tag_or_tags: self.mark(db_image, tag_or_tags) return db_image def mark(self, db_image, tag_or_tags='marked'): def _mark(tag): db_tag = self.session.query(db.Tag).filter_by(name=tag).first() if db_tag is None: db_tag = db.Tag() db_tag.name = tag self.session.add(db_tag) self.session.commit() db_tic = self.session.query(db.TagImageConnect).filter_by(tag_id=db_tag.id, image_id=db_image.id).first() if db_tic is None: db_tic = db.TagImageConnect() db_tic.tag_id = db_tag.id db_tic.card_id = db_tic.id self.session.add(db_tic) self.session.commit() else: pass # raise ValueError('The card is already marked by "{}".'.format(tag)) return db_tag if isinstance(tag_or_tags, str): yield _mark(tag_or_tags) else: for x in tag_or_tags: yield _mark(x) def unmark(self, db_image, tag_or_tags='marked'): def _unmark(tag): db_tag = self.session.query(db.Tag).filter_by(name=tag).first() if db_tag is None: raise ValueError('Cannot unmark "{}"'.format(tag)) # return db_tic = self.session.query(db.TagImageConnect).filter_by(tag_id=db_tag.id, card_id=db_image.id).first() if db_tic is None: raise ValueError('Cannot unmark "{}"'.format(tag)) # return else: self.session.delete(db_tic) self.session.commit() yield db_tag if isinstance(tag_or_tags, str): yield _unmark(tag_or_tags) else: for x in tag_or_tags: yield _unmark(x) def search(self, content=None, tag_or_tags=None, type_='partial'): def _compare(text, text_compare): if type_ == 'partial': return text_compare in text elif type_ in {'regex', 'regexp', 're'}: return re.search(text_compare, text, flags=re.IGNORECASE) else: return text_compare == text def _filter_tag(text_compare): for db_image in query: if any(_compare(tic.tag.name, text_compare) for tic in db_image.tags): yield db_image def _filter_slide(text_compare): for db_card in query: if any(_compare(db_image.info, text_compare) for db_image in query if db_image.info): yield db_card query = iter(self.session.query(db.Image).order_by(db.Image.modified.desc())) if tag_or_tags: if isinstance(tag_or_tags, str): query = _filter_tag(tag_or_tags) else: for tag in tag_or_tags: query = _filter_tag(tag) if content: query = _filter_slide(content) return list(query) PK!J- imagedb/db.pyfrom datetime import datetime import base64 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Binary, DateTime, Enum, ForeignKey, select from sqlalchemy.orm import relationship, deferred Base = declarative_base() class Image(Base): __tablename__ = 'image' id = Column(Integer, primary_key=True, autoincrement=True) data = Column(Binary, nullable=True) info = Column(String, nullable=True, unique=True) created = Column(DateTime, default=datetime.now) modified = Column(DateTime, default=datetime.now, onupdate=datetime.now) tags = relationship('TagImageConnect', order_by='TagImageConnect.tag_name', back_populates='image') def to_html(self): return '' def _repr_html_(self): if self.data: return self.to_html() else: return self.info def save(self, filename): with open(filename, 'wb') as f: f.write(self.data) class Tag(Base): __tablename__ = 'tag' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String, nullable=False) images = relationship('TagImageConnect', order_by='TagImageConnect.id', back_populates='tag') class TagImageConnect(Base): __tablename__ = 'tag_image_connect' id = Column(Integer, primary_key=True, autoincrement=True) image_id = Column(Integer, ForeignKey('image.id'), nullable=False) tag_id = Column(Integer, ForeignKey('tag.id'), nullable=False) image = relationship('Image', back_populates='tags') tag = relationship('Tag', back_populates='images') tag_name = deferred(select([Tag.name]).where(Tag.id == tag_id)) PK!H WXimagedb-0.1.0.dist-info/WHEEL A н#Z."jm)Afb~ڠO68oF04UhoAf f4=4h0k::wXPK!Hlcs imagedb-0.1.0.dist-info/METADATAQK0)Qa mue>*^钖ooDķ{1$ JY )`5{e!sA7+؍љ ?Pͨ 6E,{@weMʆ)ׯJlޟX?L:CX`' 뿍.&Fl4z-S0ߜn @|Urh\:X&dc-8#=Yk{ۥ,7+_GQd+# PK!Hm"imagedb-0.1.0.dist-info/RECORDuϻ0@o j-@