def _generate_and_add(self, img_hash, old_img_hash, generate, model, item_id, image_size, profile_size): model_name = db.model_name(model) cover = db.Profile() if generate: log.d("Generating new profile", image_size, "for database item", model) with self.generate.call_capture(model_name, model_name, item_id, image_size) as plg: p = plg.first_or_default() if not p: p = "" cover.path = p cover.data = img_hash cover.size = profile_size self.next_progress() if cover.path and generate: log.d("Updating database") self._update_db(cover, item_id, model, old_img_hash) elif not cover.path: cover = None return cover
def _generate_and_add(self, img_hash, generate, cover_path, model, item_id, image_size): sess = constants.db_session() model_name = db.model_name(model) new = False if cover_path: self.cover = sess.query( db.Profile).filter(db.Profile.data == img_hash).one_or_none() else: self.cover = db.Profile() new = True if generate: with self.generate.call_capture(model_name, model_name, item_id, image_size) as plg: self.cover.path = plg.first() self.cover.data = img_hash self.cover.size = str(tuple(image_size)) if self.cover.path and generate: if new: s = constants.db_session() i = s.query(model).get(item_id) i.profiles.append(self.cover) sess.commit() elif not self.cover.path: self.cover = None return self.cover
def main(self, model: db.Base, item_id: int, image_size: enums.ImageSize) -> db.Profile: self.model = model if image_size == enums.ImageSize.Original: image_size = utils.ImageSize(0, 0) else: image_size = utils.ImageSize( *constants.image_sizes[image_size.name.lower()]) with self.models.call() as plg: for p in plg.all(default=True): self._supported_models.update(p) if self.model not in self._supported_models: raise exceptions.CommandError( utils.this_command(self), "Model '{}' is not supported".format(model)) img_hash = io_cmd.ImageItem.gen_hash(model, image_size, item_id) generate = True sess = constants.db_session() self.cover = sess.query( db.Profile).filter(db.Profile.data == img_hash).one_or_none() if self.cover: if io_cmd.CoreFS(self.cover.path).exists: generate = False else: self.cover = db.Profile() if generate: model_name = db.model_name(model) with self.generate.call_capture(model_name, model_name, item_id, image_size) as plg: self.cover.path = plg.first() self.cover.data = img_hash self.cover.size = str(tuple(image_size)) if self.cover.path and generate: i = GetModelItemByID().run(model, {item_id})[0] i.profiles.append(self.cover) sess.commit() elif not self.cover.path: self.cover = None self.cover_event.emit(self.cover) return self.cover
def _update_db(self, stale_cover, item_id, model, old_hash): log.d("Updating profile for database item", model) s = constants.db_session() cover = s.query(db.Profile).filter( db.and_op(db.Profile.data == old_hash, db.Profile.size == stale_cover.size)).all() if len(cover) > 1: cover, *cover_ex = cover for x in cover_ex: s.delete(x) elif cover: cover = cover[0] new = False if cover: # sometimes an identical img has already been generated and exists so we shouldnt do anything fs = io_cmd.CoreFS(cover.path) if (cover.path != stale_cover.path) and fs.exists: fs.delete() else: cover = db.Profile() new = True cover.data = stale_cover.data cover.path = stale_cover.path cover.size = stale_cover.size if new or not s.query(db.Profile).join( db.relationship_column(model, db.Profile)).filter( db.and_op(db.Profile.id == cover.id, model.id == item_id)).scalar(): log.d("Adding new profile to database item", model, "()".format(item_id)) i = s.query(model).get(item_id) i.profiles.append(cover) s.commit() self.next_progress()