def v0_lookup() -> Any: q = request.args.get('q', '').strip() if len(q.strip()) < 1: return Err.no_query.get({'arg': q}) print(f'v0_lookup: query: {q}') ficId = FicId.tryParse(q) if ficId is None: return Err.bad_query.get({'arg': q}) print(f'v0_lookup: ficId: {ficId.__dict__}') try: fic = Fic.load(ficId) return v0_fic(fic.urlId) except: print('v0_lookup: something went wrong in load:') traceback.print_exc() pass return Err.bad_ficId.get({'arg': ficId.__dict__})
def handleKey(self, key: int) -> bool: if key == 3: # ctrl c if self.parent is not None: self.parent.quit() return True fic = None if len(self.list) > 0 and self.idx < len(self.list): fic = self.list[self.idx] if key == curses.KEY_DOWN: if self.idx < len(self.list) - 1: self.idx = (self.idx + 1) % len(self.list) return True return False if key == curses.KEY_UP: if self.idx == 0: return False self.idx = self.idx - 1 return True if key == curses.KEY_HOME: self.idx = 0 return True if key == curses.KEY_END: self.idx = len(self.list) - 1 return True if key in {ord('\n'), ord('\r'), curses.KEY_ENTER, curses.KEY_RIGHT}: if len(self.list) == 0: ficId = FicId.parse(self.filter) fic = Fic.load(ficId) self.filter = '' self.fics = Fic.list() self.list = self.fics self.__refilter(fic) self.pushMessage('added fic "{}" ({})'.format( fic.title, fic.localId)) elif self.parent is not None: self.parent.selectFic(self.list[self.idx]) return True if key == 4: # ctrl d self.filter = '' self.list = self.fics self.__refilter(fic) return True # TODO: this is out of hand if ((key >= ord(' ') and key <= ord('~')) and ((chr(key).isalnum()) or ':/ .<>?&()=~'.find(chr(key)) != -1 or (len(self.filter) > 0 and key == ord('-')))): self.appendToFilter(chr(key).lower()) return True if key in {curses.KEY_BACKSPACE, 127} and len(self.filter) > 0: self.backspace() return True if key == curses.KEY_PPAGE: self.idx = max(0, self.idx - int(self.height / 3)) return True if key == curses.KEY_NPAGE: self.idx = min(len(self.list) - 1, self.idx + int(self.height / 3)) return True if fic is None: return True userFic = self.getUserFic(fic) if key == 21: # ctrl u userFic.lastChapterViewed = 0 userFic.update() self.pushMessage('marked "{}" no last chapter'.format(fic.title)) return True if key == 1 and fic.chapterCount is not None: # ctrl a userFic.readStatus = FicStatus.complete userFic.updateLastViewed(fic.chapterCount) userFic.updateLastRead(fic.chapterCount) for cid in range(1, fic.chapterCount + 1): chap = fic.chapter(cid).getUserFicChapter() if chap.readStatus == FicStatus.complete: continue chap.readStatus = FicStatus.complete chap.update() self.pushMessage('marked "{}" all read'.format(fic.title)) return True if key == ord('+'): if userFic.rating is None or userFic.rating < 0: userFic.rating = 0 if userFic.rating < 9: userFic.rating += 1 userFic.update() self.pushMessage( f'changed rating of "{fic.title}" => {userFic.rating}') return True return False if len(self.filter) == 0 and key == ord('-'): if userFic.rating is None: userFic.rating = 2 if userFic.rating > 1: userFic.rating -= 1 userFic.update() self.pushMessage( f'changed rating of "{fic.title}" => {userFic.rating}') return True return False if key == 6: # ctrl f userFic.isFavorite = not userFic.isFavorite userFic.update() self.pushMessage('changed favorite status of "{}"'.format( fic.title)) return True if key == 9: # ctrl i fic.checkForUpdates() self.pushMessage('checked "{}" for updates'.format(fic.title)) return True if key == 23: # ctrl w fic.ficStatus = { FicStatus.ongoing: FicStatus.abandoned, FicStatus.abandoned: FicStatus.complete, FicStatus.complete: FicStatus.ongoing, }[FicStatus(fic.ficStatus)] fic.upsert() return True return False
def __doRefilter(self, force: bool) -> None: if len(self.filter) < 1: return ficId = FicId.tryParse(self.filter) if ficId is not None: self.idx = 0 self.list = [] if ficId.ambiguous == False: fic = Fic.tryLoad(ficId) if fic is None: fic = Fic.load(ficId) self.fics = Fic.list() self.list = [fic] else: fic = Fic.tryLoad(ficId) if fic is not None: self.list = [fic] return plain: List[str] = [] tags: List[str] = [] tagStarts = ['is:', 'i:', ':'] for w in self.filter.split(): isTag = False for tagStart in tagStarts: if w.startswith(tagStart): tags += [w[len(tagStart):]] isTag = True break if not isTag: plain += [w] # TODO: simplify fcmp tags favRel = None ratRel = None isNew = None isComplete = None authorRel = None fandomRel = None descRel = None titleRel = None for tag in tags: if len(tag) == 0: continue arg: str = '' rel: Optional[str] = None for prel in ['=', '<', '>', '~', '.']: if tag.find(prel) != -1: ps = tag.split(prel) if len(ps) != 2: continue tag = ps[0] rel = prel arg = ps[1] break if 'favorite'.startswith(tag): if rel is not None and arg.isnumeric(): favRel = (rel, int(arg)) else: favRel = ('>', 0) elif 'rated'.startswith(tag): if rel is not None and arg.isnumeric(): ratRel = (rel, int(arg)) else: ratRel = ('>', 0) elif 'new'.startswith(tag): isNew = ('=', 'new') elif 'author'.startswith(tag): if rel is not None: authorRel = (rel, arg) elif 'fandom'.startswith(tag): if rel is not None: fandomRel = (rel, arg) elif 'complete'.startswith(tag): isComplete = ('=', 'complete') elif 'description'.startswith(tag): if rel is not None: descRel = (rel, arg) elif 'title'.startswith(tag): if rel is not None: titleRel = (rel, arg) self.pushMessage('f:{}, r:{}, n:{}, c:{}, a:{}, f2:{} p:{}'.format( favRel, ratRel, isNew, isComplete, authorRel, fandomRel, plain)) pfilter = ' '.join(plain).lower() nfics: List[Fic] = [] completelyRefilter = (force or (self.filter[-1] == ' ' or self.filter[-1] == ':')) # TODO FIXME bleh userFics = {uf.ficId: uf for uf in UserFic.select({'userId': 1})} for fic in (self.fics if completelyRefilter else self.list): if fic.id not in userFics: userFics[fic.id] = UserFic.default((1, fic.id)) userFic = userFics[fic.id] if favRel is not None or ratRel is not None or isNew: if favRel is not None: if not self.fcmp(favRel[0], userFic.isFavorite, favRel[1]): continue if ratRel is not None: if not self.fcmp(ratRel[0], userFic.rating or -1, ratRel[1]): continue if isNew is not None: if userFic.lastChapterViewed != 0: continue if descRel is not None: if not self.fcmp(descRel[0], fic.description or '', descRel[1]): continue if titleRel is not None: if not self.fcmp(titleRel[0], fic.title or '', titleRel[1]): continue if isComplete is not None and fic.ficStatus != FicStatus.complete: continue if authorRel is not None: if not self.fcmp(authorRel[0], fic.getAuthorName(), authorRel[1]): continue if fandomRel is not None: ficFandoms = [fandom.name for fandom in fic.fandoms()] matchesFandom = False for fandom in ficFandoms: if self.fcmp(fandomRel[0], fandom, fandomRel[1]): matchesFandom = True break if not matchesFandom: continue ftext = ( f'{fic.localId} {fic.title} {fic.getAuthorName()} {fic.id}'. lower()) if util.subsequenceMatch(ftext, pfilter): nfics += [fic] self.list = nfics