def _grFollowAll(self): myDB = database.DBConnection() cmd = 'SELECT AuthorName,AuthorID,GRfollow FROM authors where ' cmd += 'Status="Active" or Status="Wanted" or Status="Loading"' authors = myDB.select(cmd) count = 0 for author in authors: followid = check_int(author['GRfollow'], 0) if followid > 0: logger.debug('%s is already followed' % author['AuthorName']) elif author['GRfollow'] == "0": logger.debug('%s is manually unfollowed' % author['AuthorName']) else: res = grfollow(author['AuthorID'], True) if res.startswith('Unable'): logger.warn(res) try: followid = res.split("followid=")[1] logger.debug('%s marked followed' % author['AuthorName']) count += 1 except IndexError: followid = '' myDB.action('UPDATE authors SET GRfollow=? WHERE AuthorID=?', (followid, author['AuthorID'])) self.data = "Added follow to %s author%s" % (count, plural(count))
def _grUnfollow(self, **kwargs): if 'id' not in kwargs: self.data = 'Missing parameter: id' return else: self.id = kwargs['id'] try: self.data = grfollow(authorid=self.id, follow=False) except Exception as e: self.data = "%s %s" % (type(e).__name__, str(e))
def addAuthorToDB(authorname=None, refresh=False, authorid=None, addbooks=True): """ Add an author to the database by name or id, and optionally get a list of all their books If author already exists in database, refresh their details and optionally booklist """ threadname = threading.currentThread().name if "Thread-" in threadname: threading.currentThread().name = "AddAuthorToDB" try: myDB = database.DBConnection() match = False authorimg = '' new_author = not refresh entry_status = '' if authorid: dbauthor = myDB.match("SELECT * from authors WHERE AuthorID=?", (authorid, )) if not dbauthor: authorname = 'unknown author' logger.debug("Adding new author id %s to database" % authorid) new_author = True else: entry_status = dbauthor['Status'] authorname = dbauthor['authorname'] logger.debug("Updating author %s " % authorname) new_author = False controlValueDict = {"AuthorID": authorid} newValueDict = {"Status": "Loading"} myDB.upsert("authors", newValueDict, controlValueDict) GR = GoodReads(authorname) author = GR.get_author_info(authorid=authorid) if author: authorname = author['authorname'] authorimg = author['authorimg'] controlValueDict = {"AuthorID": authorid} newValueDict = { "AuthorLink": author['authorlink'], "DateAdded": today() } if not dbauthor or (dbauthor and not dbauthor['manual']): newValueDict["AuthorName"] = author['authorname'] newValueDict["AuthorImg"] = author['authorimg'] newValueDict["AuthorBorn"] = author['authorborn'] newValueDict["AuthorDeath"] = author['authordeath'] myDB.upsert("authors", newValueDict, controlValueDict) match = True else: logger.warn(u"Nothing found for %s" % authorid) if not dbauthor: myDB.action('DELETE from authors WHERE AuthorID=?', (authorid, )) if authorname and not match: authorname = ' '.join( authorname.split()) # ensure no extra whitespace GR = GoodReads(authorname) author = GR.find_author_id(refresh=refresh) query = "SELECT * from authors WHERE AuthorName=?" dbauthor = myDB.match(query, (authorname.replace("'", "''"), )) if author and not dbauthor: # may have different name for same authorid (spelling?) query = "SELECT * from authors WHERE AuthorID=?" dbauthor = myDB.match(query, (author['authorid'], )) authorname = dbauthor['AuthorName'] controlValueDict = {"AuthorName": authorname} if not dbauthor: newValueDict = { "AuthorID": "0: %s" % authorname, "Status": "Loading" } logger.debug("Now adding new author: %s to database" % authorname) entry_status = lazylibrarian.CONFIG['NEWAUTHOR_STATUS'] new_author = True else: newValueDict = {"Status": "Loading"} logger.debug("Now updating author: %s" % authorname) entry_status = dbauthor['Status'] new_author = False myDB.upsert("authors", newValueDict, controlValueDict) if author: authorid = author['authorid'] authorimg = author['authorimg'] controlValueDict = {"AuthorName": authorname} newValueDict = { "AuthorID": author['authorid'], "AuthorLink": author['authorlink'], "DateAdded": today(), "Status": "Loading" } if not dbauthor or (dbauthor and not dbauthor['manual']): newValueDict["AuthorImg"] = author['authorimg'] newValueDict["AuthorBorn"] = author['authorborn'] newValueDict["AuthorDeath"] = author['authordeath'] myDB.upsert("authors", newValueDict, controlValueDict) match = True else: logger.warn(u"Nothing found for %s" % authorname) if not dbauthor: myDB.action('DELETE from authors WHERE AuthorName=?', (authorname, )) return if not match: logger.error( "AddAuthorToDB: No matching result for authorname or authorid") return # if author is set to manual, should we allow replacing 'nophoto' ? new_img = False match = myDB.match("SELECT Manual from authors WHERE AuthorID=?", (authorid, )) if not match or not match['Manual']: if authorimg and 'nophoto' in authorimg: newimg = getAuthorImage(authorid) if newimg: authorimg = newimg new_img = True # allow caching if authorimg and authorimg.startswith('http'): newimg, success = cache_img("author", authorid, authorimg, refresh=refresh) if success: authorimg = newimg new_img = True else: logger.debug('Failed to cache image for %s' % authorimg) if new_img: controlValueDict = {"AuthorID": authorid} newValueDict = {"AuthorImg": authorimg} myDB.upsert("authors", newValueDict, controlValueDict) if addbooks: # audiostatus = lazylibrarian.CONFIG['NEWAUDIO_STATUS'] if new_author: bookstatus = lazylibrarian.CONFIG['NEWAUTHOR_STATUS'] else: bookstatus = lazylibrarian.CONFIG['NEWBOOK_STATUS'] if entry_status not in ['Active', 'Wanted', 'Ignored', 'Paused']: entry_status = 'Active' # default for invalid/unknown or "loading" # process books if lazylibrarian.CONFIG['BOOK_API'] == "GoogleBooks": book_api = GoogleBooks() book_api.get_author_books(authorid, authorname, bookstatus, entrystatus=entry_status, refresh=refresh) elif lazylibrarian.CONFIG['BOOK_API'] == "GoodReads": book_api = GoodReads(authorname) book_api.get_author_books(authorid, authorname, bookstatus, entrystatus=entry_status, refresh=refresh) # update totals works for existing authors only. # New authors need their totals updating after libraryscan or import of books. if not new_author: update_totals(authorid) if new_author and lazylibrarian.CONFIG['GR_FOLLOWNEW']: res = grfollow(authorid, True) if res.startswith('Unable'): logger.warn(res) try: followid = res.split("followid=")[1] logger.debug('%s marked followed' % authorname) except IndexError: followid = '' myDB.action('UPDATE authors SET GRfollow=? WHERE AuthorID=?', (followid, authorid)) else: # if we're not loading any books, mark author as ignored entry_status = 'Ignored' controlValueDict = {"AuthorID": authorid} newValueDict = {"Status": entry_status} myDB.upsert("authors", newValueDict, controlValueDict) msg = "[%s] Author update complete, status %s" % (authorname, entry_status) logger.info(msg) return msg except Exception: msg = 'Unhandled exception in addAuthorToDB: %s' % traceback.format_exc( ) logger.error(msg) return msg
def addAuthorToDB(authorname=None, refresh=False, authorid=None, addbooks=True): """ Add an author to the database by name or id, and optionally get a list of all their books If author already exists in database, refresh their details and optionally booklist """ threadname = threading.currentThread().name if "Thread-" in threadname: threading.currentThread().name = "AddAuthorToDB" # noinspection PyBroadException try: myDB = database.DBConnection() match = False author = None authorimg = '' new_author = not refresh entry_status = '' if authorid: dbauthor = myDB.match("SELECT * from authors WHERE AuthorID=?", (authorid,)) if not dbauthor: authorname = 'unknown author' logger.debug("Adding new author id %s to database" % authorid) new_author = True else: entry_status = dbauthor['Status'] authorname = dbauthor['authorname'] logger.debug("Updating author %s " % authorname) new_author = False controlValueDict = {"AuthorID": authorid} newValueDict = {"Status": "Loading"} if new_author: newValueDict["AuthorName"] = "Loading" newValueDict["AuthorImg"] = "images/nophoto.png" myDB.upsert("authors", newValueDict, controlValueDict) GR = GoodReads(authorid) author = GR.get_author_info(authorid=authorid) if author: authorname = author['authorname'] authorimg = author['authorimg'] controlValueDict = {"AuthorID": authorid} newValueDict = { "AuthorLink": author['authorlink'], "DateAdded": today() } if not dbauthor or (dbauthor and not dbauthor['manual']): newValueDict["AuthorImg"] = author['authorimg'] newValueDict["AuthorBorn"] = author['authorborn'] newValueDict["AuthorDeath"] = author['authordeath'] if not dbauthor: newValueDict["AuthorName"] = author['authorname'] elif dbauthor['authorname'] != author['authorname']: authorname = dbauthor['authorname'] logger.warn("Authorname mismatch for %s [%s][%s]" % (authorid, dbauthor['authorname'], author['authorname'])) myDB.upsert("authors", newValueDict, controlValueDict) match = True else: logger.warn("Nothing found for %s" % authorid) if not dbauthor: myDB.action('DELETE from authors WHERE AuthorID=?', (authorid,)) if authorname and author and not match: authorname = ' '.join(authorname.split()) # ensure no extra whitespace GR = GoodReads(authorname) author = GR.find_author_id(refresh=refresh) dbauthor = myDB.match("SELECT * from authors WHERE AuthorName=?", (authorname,)) if author and not dbauthor: # may have different name for same authorid (spelling?) dbauthor = myDB.match("SELECT * from authors WHERE AuthorID=?", (author['authorid'],)) authorname = dbauthor['AuthorName'] controlValueDict = {"AuthorName": authorname} if not dbauthor: newValueDict = { "AuthorID": "0: %s" % authorname, "Status": "Loading" } logger.debug("Now adding new author: %s to database" % authorname) entry_status = lazylibrarian.CONFIG['NEWAUTHOR_STATUS'] new_author = True else: newValueDict = {"Status": "Loading"} logger.debug("Now updating author: %s" % authorname) entry_status = dbauthor['Status'] new_author = False myDB.upsert("authors", newValueDict, controlValueDict) if author: authorid = author['authorid'] authorimg = author['authorimg'] controlValueDict = {"AuthorName": authorname} newValueDict = { "AuthorID": author['authorid'], "AuthorLink": author['authorlink'], "DateAdded": today(), "Status": "Loading" } if dbauthor: if authorname != dbauthor['authorname']: # name change might be users preference logger.warn("Conflicting authorname for %s [%s][%s] Ignoring change" % (author['authorid'], authorname, dbauthor['authorname'])) authorname = dbauthor['authorname'] # cmd = 'UPDATE authors SET AuthorName=? WHERE AuthorName=?' # myDB.action(cmd, (author['authorname'], dbauthor['authorname'])) if author['authorid'] != dbauthor['authorid']: # GoodReads may have altered authorid? logger.warn("Conflicting authorid for %s (%s:%s) Moving to new authorid" % (authorname, author['authorid'], dbauthor['authorid'])) cmd = 'UPDATE books SET AuthorID=? WHERE AuthorID=?' myDB.action(cmd, (author['authorid'], dbauthor['authorid'])) myDB.action('DELETE from authors WHERE AuthorID=?', (dbauthor['authorid'],)) dbauthor = None if not dbauthor or (dbauthor and not dbauthor['manual']): newValueDict["AuthorImg"] = author['authorimg'] newValueDict["AuthorBorn"] = author['authorborn'] newValueDict["AuthorDeath"] = author['authordeath'] myDB.upsert("authors", newValueDict, controlValueDict) match = True else: logger.warn("Nothing found for %s" % authorname) if not dbauthor: myDB.action('DELETE from authors WHERE AuthorName=?', (authorname,)) return if not match: logger.error("No matching result for authorname or authorid") return # if author is set to manual, should we allow replacing 'nophoto' ? new_img = False match = myDB.match("SELECT Manual from authors WHERE AuthorID=?", (authorid,)) if not match or not match['Manual']: if authorimg and 'nophoto' in authorimg: newimg = getAuthorImage(authorid) if newimg: authorimg = newimg new_img = True # allow caching if authorimg and authorimg.startswith('http'): newimg, success, _ = cache_img("author", authorid, authorimg, refresh=refresh) if success: authorimg = newimg new_img = True else: logger.debug('Failed to cache image for %s' % authorimg) if new_img: controlValueDict = {"AuthorID": authorid} newValueDict = {"AuthorImg": authorimg} myDB.upsert("authors", newValueDict, controlValueDict) if addbooks: if new_author: bookstatus = lazylibrarian.CONFIG['NEWAUTHOR_STATUS'] audiostatus = lazylibrarian.CONFIG['NEWAUTHOR_AUDIO'] else: bookstatus = lazylibrarian.CONFIG['NEWBOOK_STATUS'] audiostatus = lazylibrarian.CONFIG['NEWAUDIO_STATUS'] if entry_status not in ['Active', 'Wanted', 'Ignored', 'Paused']: entry_status = 'Active' # default for invalid/unknown or "loading" # process books if lazylibrarian.CONFIG['BOOK_API'] == "GoogleBooks": if lazylibrarian.CONFIG['GB_API']: book_api = GoogleBooks() book_api.get_author_books(authorid, authorname, bookstatus=bookstatus, audiostatus=audiostatus, entrystatus=entry_status, refresh=refresh) # if lazylibrarian.CONFIG['GR_API']: # book_api = GoodReads(authorname) # book_api.get_author_books(authorid, authorname, bookstatus=bookstatus, # ausiostatus=audiostatus, entrystatus=entry_status, # refresh=refresh) elif lazylibrarian.CONFIG['BOOK_API'] == "GoodReads": if lazylibrarian.CONFIG['GR_API']: book_api = GoodReads(authorname) book_api.get_author_books(authorid, authorname, bookstatus=bookstatus, audiostatus=audiostatus, entrystatus=entry_status, refresh=refresh) # if lazylibrarian.CONFIG['GB_API']: # book_api = GoogleBooks() # book_api.get_author_books(authorid, authorname, bookstatus=bookstatus, # audiostatus=audiostatus, entrystatus=entry_status, # refresh=refresh) update_totals(authorid) if new_author and lazylibrarian.CONFIG['GR_FOLLOWNEW']: res = grfollow(authorid, True) if res.startswith('Unable'): logger.warn(res) try: followid = res.split("followid=")[1] logger.debug('%s marked followed' % authorname) except IndexError: followid = '' myDB.action('UPDATE authors SET GRfollow=? WHERE AuthorID=?', (followid, authorid)) else: # if we're not loading any books, mark author as ignored entry_status = 'Ignored' controlValueDict = {"AuthorID": authorid} newValueDict = {"Status": entry_status} myDB.upsert("authors", newValueDict, controlValueDict) msg = "[%s] Author update complete, status %s" % (authorname, entry_status) logger.info(msg) return msg except Exception: msg = 'Unhandled exception in addAuthorToDB: %s' % traceback.format_exc() logger.error(msg) return msg