def fetchData(self): if self.data == 'OK': if 'X-Forwarded-For' in cherrypy.request.headers: remote_ip = cherrypy.request.headers['X-Forwarded-For'] # apache2 elif 'X-Host' in cherrypy.request.headers: remote_ip = cherrypy.request.headers['X-Host'] # lighthttpd elif 'Host' in cherrypy.request.headers: remote_ip = cherrypy.request.headers['Host'] # nginx elif 'Remote-Addr' in cherrypy.request.headers: remote_ip = cherrypy.request.headers['Remote-Addr'] else: remote_ip = cherrypy.request.remote.ip logger.debug('Received OPDS command from %s: %s %s' % (remote_ip, self.cmd, self.kwargs)) if self.cmd == 'search': if 't' in self.kwargs and self.kwargs['t'] in searchable: self.cmd = self.kwargs['t'] else: self.cmd = 'RecentBooks' methodToCall = getattr(self, "_" + self.cmd) _ = methodToCall(**self.kwargs) if self.img: return serve_file(self.img, content_type='image/jpeg') if self.file and self.filename: logger.debug('Downloading %s: %s' % (self.filename, self.file)) return serve_file(self.file, mimeType(self.filename), 'attachment', name=self.filename) if isinstance(self.data, string_types): return self.data else: cherrypy.response.headers['Content-Type'] = "text/xml" return lazylibrarian.webServe.serve_template(templatename="opds.html", title=self.data['title'], opds=self.data) else: return self.data
def fetchData(self): if self.data == 'OK': if 'Remote-Addr' in cherrypy.request.headers: remote_ip = cherrypy.request.headers['Remote-Addr'] elif 'X-Forwarded-For' in cherrypy.request.headers: remote_ip = cherrypy.request.headers['X-Forwarded-For'] # apache2 elif 'X-Host' in cherrypy.request.headers: remote_ip = cherrypy.request.headers['X-Host'] # lighthttpd else: remote_ip = cherrypy.request.remote.ip logger.debug('Received OPDS command from %s: %s %s' % (remote_ip, self.cmd, self.kwargs)) if self.cmd == 'search': if 't' in self.kwargs and self.kwargs['t'] in searchable: self.cmd = self.kwargs['t'] else: self.cmd = 'RecentBooks' methodToCall = getattr(self, "_" + self.cmd) _ = methodToCall(**self.kwargs) if self.img: return serve_file(self.img, content_type='image/jpeg') if self.file and self.filename: logger.debug('Downloading %s: %s' % (self.filename, self.file)) return serve_file(self.file, mimeType(self.filename), 'attachment', name=self.filename) if isinstance(self.data, string_types): return self.data else: cherrypy.response.headers['Content-Type'] = "text/xml" return lazylibrarian.webServe.serve_template(templatename="opds.html", title=self.data['title'], opds=self.data) else: return self.data
def _Magazine(self, **kwargs): index = 0 if 'index' in kwargs: index = check_int(kwargs['index'], 0) myDB = database.DBConnection() if 'magid' not in kwargs: self.data = self._error_with_message('No Magazine Provided') return links = [] entries = [] title = '' cmd = "SELECT Title,IssueID,IssueDate,IssueAcquired,IssueFile from issues " cmd += "WHERE Title='%s' order by IssueDate DESC" results = myDB.select(cmd % kwargs['magid']) page = results[index:(index + self.PAGE_SIZE)] for issue in page: title = makeUnicode(issue['Title']) entry = {'title': escape('%s (%s)' % (title, issue['IssueDate'])), 'id': escape('issue:%s' % issue['IssueID']), 'updated': opdstime(issue['IssueAcquired']), 'content': escape('%s - %s' % (title, issue['IssueDate'])), 'href': '%s?cmd=Serve&issueid=%s' % (self.opdsroot, quote_plus(issue['IssueID'])), 'kind': 'acquisition', 'rel': 'file', 'type': mimeType(issue['IssueFile'])} if lazylibrarian.CONFIG['OPDS_METAINFO']: fname = os.path.splitext(issue['IssueFile'])[0] res = cache_img('magazine', issue['IssueID'], fname + '.jpg') entry['image'] = self.searchroot + '/' + res[0] entries.append(entry) feed = {} title = '%s (%s)' % (escape(title), len(entries)) feed['title'] = 'LazyLibrarian OPDS - %s' % title feed['id'] = 'magazine:%s' % escape(kwargs['magid']) feed['updated'] = now() links.append(getLink(href=self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='start', title='Home')) links.append(getLink(href='%s?cmd=Magazine&magid=%s' % (self.opdsroot, quote_plus(kwargs['magid'])), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='self')) if len(results) > (index + self.PAGE_SIZE): links.append( getLink(href='%s?cmd=Magazine&magid=%s&index=%s' % (self.opdsroot, quote_plus(kwargs['magid']), index + self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='next')) if index >= self.PAGE_SIZE: links.append( getLink(href='%s?cmd=Magazine&magid=%s&index=%s' % (self.opdsroot, quote_plus(kwargs['magid']), index - self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='previous')) feed['links'] = links feed['entries'] = entries logger.debug("Returning %s issue%s" % (len(entries), plural(len(entries)))) self.data = feed return
def _RecentAudio(self, **kwargs): index = 0 if 'index' in kwargs: index = check_int(kwargs['index'], 0) myDB = database.DBConnection() feed = {'title': 'LazyLibrarian OPDS - Recent AudioBooks', 'id': 'Recent AudioBooks', 'updated': now()} links = [] entries = [] links.append(getLink(href=self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='start', title='Home')) links.append(getLink(href='%s?cmd=RecentAudio' % self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='self')) links.append(getLink(href='%s/opensearchbooks.xml' % self.searchroot, ftype='application/opensearchdescription+xml', rel='search', title='Search Books')) cmd = "select BookName,BookID,AudioLibrary,BookDate,BookImg,BookDesc,BookAdded,AuthorID from books WHERE " if 'query' in kwargs: cmd += "BookName LIKE '%" + kwargs['query'] + "%' AND " cmd += "AudioStatus='Open' order by AudioLibrary DESC" results = myDB.select(cmd) page = results[index:(index + self.PAGE_SIZE)] for book in page: title = makeUnicode(book['BookName']) entry = {'title': escape(title), 'id': escape('audio:%s' % book['BookID']), 'updated': opdstime(book['AudioLibrary']), 'href': '%s?cmd=Serve&audioid=%s' % (self.opdsroot, quote_plus(book['BookID'])), 'kind': 'acquisition', 'rel': 'file', 'type': mimeType("we_send.zip")} if lazylibrarian.CONFIG['OPDS_METAINFO']: author = myDB.match("SELECT AuthorName from authors WHERE AuthorID='%s'" % book['AuthorID']) author = makeUnicode(author['AuthorName']) entry['image'] = self.searchroot + '/' + book['BookImg'] entry['content'] = escape('%s - %s' % (title, book['BookDesc'])) entry['author'] = escape('%s' % author) else: entry['content'] = escape('%s (%s)' % (title, book['BookAdded'])) entries.append(entry) if len(results) > (index + self.PAGE_SIZE): links.append( getLink(href='%s?cmd=RecentAudio&index=%s' % (self.opdsroot, index + self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='next')) if index >= self.PAGE_SIZE: links.append( getLink(href='%s?cmd=RecentAudio&index=%s' % (self.opdsroot, index - self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='previous')) feed['links'] = links feed['entries'] = entries logger.debug("Returning %s result%s" % (len(entries), plural(len(entries)))) self.data = feed return
def _RecentMags(self, **kwargs): index = 0 if 'index' in kwargs: index = check_int(kwargs['index'], 0) myDB = database.DBConnection() feed = {'title': 'LazyLibrarian OPDS - Recent Magazines', 'id': 'Recent Magazines', 'updated': now()} links = [] entries = [] links.append(getLink(href=self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='start', title='Home')) links.append(getLink(href='%s?cmd=RecentMags' % self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='self')) links.append(getLink(href='%s/opensearchmagazines.xml' % self.searchroot, ftype='application/opensearchdescription+xml', rel='search', title='Search Magazines')) cmd = "select Title,IssueID,IssueAcquired,IssueDate,IssueFile from issues " cmd += "where IssueFile != '' " if 'query' in kwargs: cmd += "AND Title LIKE '%" + kwargs['query'] + "%' " cmd += "order by IssueAcquired DESC" results = myDB.select(cmd) page = results[index:(index + self.PAGE_SIZE)] for mag in page: title = makeUnicode(mag['Title']) entry = {'title': escape('%s' % mag['IssueDate']), 'id': escape('issue:%s' % mag['IssueID']), 'updated': opdstime(mag['IssueAcquired']), 'content': escape('%s - %s' % (title, mag['IssueDate'])), 'href': '%s?cmd=Serve&issueid=%s' % (self.opdsroot, quote_plus(mag['IssueID'])), 'kind': 'acquisition', 'rel': 'file', 'author': escape(title), 'type': mimeType(mag['IssueFile'])} if lazylibrarian.CONFIG['OPDS_METAINFO']: fname = os.path.splitext(mag['IssueFile'])[0] res = cache_img('magazine', mag['IssueID'], fname + '.jpg') entry['image'] = self.searchroot + '/' + res[0] entries.append(entry) if len(results) > (index + self.PAGE_SIZE): links.append( getLink(href='%s?cmd=RecentMags&index=%s' % (self.opdsroot, index + self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='next')) if index >= self.PAGE_SIZE: links.append( getLink(href='%s?cmd=RecentMags&index=%s' % (self.opdsroot, index - self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='previous')) feed['links'] = links feed['entries'] = entries logger.debug("Returning %s issue%s" % (len(entries), plural(len(entries)))) self.data = feed return
def multiLink(self, bookfile, bookid): types = [] multi = '' basename, extn = os.path.splitext(bookfile) for item in getList(lazylibrarian.CONFIG['EBOOK_TYPE']): target = basename + '.' + item if os.path.isfile(target): types.append(item) if len(types) > 1: for fmt in types: multi += '<link href="' multi += '%s?cmd=Serve&bookid=%s&fmt=%s' % ( self.opdsroot, quote_plus(bookid), fmt) multi += '" rel="http://opds-spec.org/acquisition" type="' + mimeType( '.' + fmt) + '"/>' return multi
def _RecentBooks(self, **kwargs): index = 0 if 'index' in kwargs: index = check_int(kwargs['index'], 0) myDB = database.DBConnection() feed = { 'title': 'LazyLibrarian OPDS - Recent Books', 'id': 'Recent Books', 'updated': now() } links = [] entries = [] links.append( getLink( href=self.opdsroot, ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='start', title='Home')) links.append( getLink( href='%s?cmd=RecentBooks' % self.opdsroot, ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='self')) links.append( getLink(href='%s/opensearchbooks.xml' % self.searchroot, ftype='application/opensearchdescription+xml', rel='search', title='Search Books')) cmd = "select BookName,BookID,BookLibrary,BookDate,BookImg,BookDesc,BookAdded,BookFile,AuthorID " cmd += "from books where Status='Open' " if 'query' in kwargs: cmd += "AND BookName LIKE '%" + kwargs['query'] + "%' " cmd += "order by BookLibrary DESC" results = myDB.select(cmd) page = results[index:(index + self.PAGE_SIZE)] for book in page: mime_type = None rel = 'file' if book['BookFile']: mime_type = self.multiLink(book['BookFile'], book['BookID']) if mime_type: rel = 'multi' else: mime_type = mimeType(book['BookFile']) elif book['AudioFile']: mime_type = mimeType(book['AudioFile']) if mime_type: title = makeUnicode(book['BookName']) entry = { 'title': escape(title), 'id': escape('book:%s' % book['BookID']), 'updated': opdstime(book['BookLibrary']), 'href': '%s?cmd=Serve&bookid=%s' % (self.opdsroot, quote_plus(book['BookID'])), 'kind': 'acquisition', 'rel': rel, 'type': mime_type } if lazylibrarian.CONFIG['OPDS_METAINFO']: author = myDB.match( "SELECT AuthorName from authors WHERE AuthorID=?", (book['AuthorID'], )) author = makeUnicode(author['AuthorName']) entry['image'] = self.searchroot + '/' + book['BookImg'] entry['thumbnail'] = entry['image'] entry['content'] = escape('%s - %s' % (title, book['BookDesc'])) entry['author'] = escape('%s' % author) else: entry['content'] = escape('%s (%s)' % (title, book['BookAdded'])) entries.append(entry) """ <link type="application/epub+zip" rel="http://opds-spec.org/acquisition" title="EPUB (no images)" length="18552" href="//www.gutenberg.org/ebooks/57490.epub.noimages"/> <link type="application/x-mobipocket-ebook" rel="http://opds-spec.org/acquisition" title="Kindle (no images)" length="110360" href="//www.gutenberg.org/ebooks/57490.kindle.noimages"/> """ if len(results) > (index + self.PAGE_SIZE): links.append( getLink( href='%s?cmd=RecentBooks&index=%s' % (self.opdsroot, index + self.PAGE_SIZE), ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='next')) if index >= self.PAGE_SIZE: links.append( getLink( href='%s?cmd=RecentBooks&index=%s' % (self.opdsroot, index - self.PAGE_SIZE), ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='previous')) feed['links'] = links feed['entries'] = entries logger.debug("Returning %s book%s" % (len(entries), plural(len(entries)))) self.data = feed return
def _Members(self, **kwargs): index = 0 if 'index' in kwargs: index = check_int(kwargs['index'], 0) myDB = database.DBConnection() if 'seriesid' not in kwargs: self.data = self._error_with_message('No Series Provided') return links = [] entries = [] series = myDB.match("SELECT SeriesName from Series WHERE SeriesID=?", (kwargs['seriesid'], )) cmd = "SELECT BookName,BookDate,BookAdded,BookDesc,BookImg,BookFile,AudioFile,books.BookID,SeriesNum " cmd += "from books,member where (Status='Open' or AudioStatus='Open') and SeriesID=? " cmd += "and books.bookid = member.bookid order by CAST(SeriesNum AS INTEGER)" results = myDB.select(cmd, (kwargs['seriesid'], )) cmd = 'SELECT AuthorName from authors,books WHERE authors.authorid = books.authorid AND ' cmd += 'books.bookid=?' res = myDB.match(cmd, (results[0]['BookID'], )) author = res['AuthorName'] page = results[index:(index + self.PAGE_SIZE)] for book in page: mime_type = None rel = 'file' if book['BookFile']: mime_type = self.multiLink(book['BookFile'], book['BookID']) if mime_type: rel = 'multi' else: mime_type = mimeType(book['BookFile']) elif book['AudioFile']: mime_type = mimeType(book['AudioFile']) if mime_type: if book['SeriesNum']: snum = ' (%s)' % book['SeriesNum'] else: snum = '' entry = { 'title': escape('%s%s' % (book['BookName'], snum)), 'id': escape('book:%s' % book['BookID']), 'updated': opdstime(book['BookAdded']), 'href': '%s?cmd=Serve&bookid=%s' % (self.opdsroot, book['BookID']), 'kind': 'acquisition', 'rel': rel, 'author': escape("%s" % author), 'type': mime_type } if lazylibrarian.CONFIG['OPDS_METAINFO']: entry['image'] = self.searchroot + '/' + book['BookImg'] entry['thumbnail'] = entry['image'] entry['content'] = escape( '%s (%s %s) %s' % (book['BookName'], series['SeriesName'], book['SeriesNum'], book['BookDesc'])) else: entry['content'] = escape( '%s (%s %s) %s' % (book['BookName'], series['SeriesName'], book['SeriesNum'], book['BookAdded'])) entries.append(entry) feed = {} seriesname = '%s (%s) %s' % (escape( series['SeriesName']), len(entries), author) feed['title'] = 'LazyLibrarian OPDS - %s' % seriesname feed['id'] = 'series:%s' % escape(kwargs['seriesid']) feed['updated'] = now() links.append( getLink( href=self.opdsroot, ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='start', title='Home')) links.append( getLink( href='%s?cmd=Series' % self.opdsroot, ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='self')) if len(results) > (index + self.PAGE_SIZE): links.append( getLink( href='%s?cmd=Members&seriesid=%s&index=%s' % (self.opdsroot, kwargs['seriesid'], index + self.PAGE_SIZE), ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='next')) if index >= self.PAGE_SIZE: links.append( getLink( href='%s?cmd=Members&seriesid=%s&index=%s' % (self.opdsroot, kwargs['seriesid'], index - self.PAGE_SIZE), ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='previous')) feed['links'] = links feed['entries'] = entries logger.debug("Returning %s book%s" % (len(entries), plural(len(entries)))) self.data = feed return
def _Author(self, **kwargs): index = 0 if 'index' in kwargs: index = check_int(kwargs['index'], 0) myDB = database.DBConnection() if 'authorid' not in kwargs: self.data = self._error_with_message('No Author Provided') return links = [] entries = [] links.append( getLink(href='%s/opensearchbooks.xml' % self.searchroot, ftype='application/opensearchdescription+xml', rel='search', title='Search Books')) author = myDB.match("SELECT AuthorName from authors WHERE AuthorID=?", (kwargs['authorid'], )) author = makeUnicode(author['AuthorName']) cmd = "SELECT BookName,BookDate,BookID,BookAdded,BookDesc,BookImg,BookFile,AudioFile from books WHERE " if 'query' in kwargs: cmd += "BookName LIKE '%" + kwargs['query'] + "%' AND " cmd += "(Status='Open' or AudioStatus='Open') and AuthorID=? order by BookDate DESC" results = myDB.select(cmd, (kwargs['authorid'], )) page = results[index:(index + self.PAGE_SIZE)] for book in page: mime_type = None rel = 'file' if book['BookFile']: mime_type = self.multiLink(book['BookFile'], book['BookID']) if mime_type: rel = 'multi' else: mime_type = mimeType(book['BookFile']) elif book['AudioFile']: mime_type = mimeType(book['AudioFile']) if mime_type: entry = { 'title': escape('%s (%s)' % (book['BookName'], book['BookDate'])), 'id': escape('book:%s' % book['BookID']), 'updated': opdstime(book['BookAdded']), 'href': '%s?cmd=Serve&bookid=%s' % (self.opdsroot, book['BookID']), 'kind': 'acquisition', 'rel': rel, 'type': mime_type } if lazylibrarian.CONFIG['OPDS_METAINFO']: entry['image'] = self.searchroot + '/' + book['BookImg'] entry['thumbnail'] = entry['image'] entry['content'] = escape( '%s - %s' % (book['BookName'], book['BookDesc'])) entry['author'] = escape('%s' % author) else: entry['content'] = escape( '%s (%s)' % (book['BookName'], book['BookAdded'])) entries.append(entry) feed = {} authorname = '%s (%s)' % (escape(author), len(entries)) feed['title'] = 'LazyLibrarian OPDS - %s' % authorname feed['id'] = 'author:%s' % escape(kwargs['authorid']) feed['updated'] = now() links.append( getLink( href=self.opdsroot, ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='start', title='Home')) links.append( getLink( href='%s?cmd=Authors' % self.opdsroot, ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='self')) if len(results) > (index + self.PAGE_SIZE): links.append( getLink( href='%s?cmd=Author&authorid=%s&index=%s' % (self.opdsroot, quote_plus( kwargs['authorid']), index + self.PAGE_SIZE), ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='next')) if index >= self.PAGE_SIZE: links.append( getLink( href='%s?cmd=Author&authorid=%s&index=%s' % (self.opdsroot, quote_plus( kwargs['authorid']), index - self.PAGE_SIZE), ftype= 'application/atom+xml; profile=opds-catalog; kind=navigation', rel='previous')) feed['links'] = links feed['entries'] = entries self.data = feed logger.debug("Returning %s book%s" % (len(entries), plural(len(entries)))) return
def _RecentBooks(self, **kwargs): index = 0 if 'index' in kwargs: index = check_int(kwargs['index'], 0) myDB = database.DBConnection() feed = {'title': 'LazyLibrarian OPDS - Recent Books', 'id': 'Recent Books', 'updated': now()} links = [] entries = [] links.append(getLink(href=self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='start', title='Home')) links.append(getLink(href='%s?cmd=RecentBooks' % self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='self')) links.append(getLink(href='%s/opensearchbooks.xml' % self.searchroot, ftype='application/opensearchdescription+xml', rel='search', title='Search Books')) cmd = "select BookName,BookID,BookLibrary,BookDate,BookImg,BookDesc,BookAdded,BookFile,AuthorID " cmd += "from books where Status='Open' " if 'query' in kwargs: cmd += "AND BookName LIKE '%" + kwargs['query'] + "%' " cmd += "order by BookLibrary DESC" results = myDB.select(cmd) page = results[index:(index + self.PAGE_SIZE)] for book in page: mime_type = None if book['BookFile']: mime_type = mimeType(book['BookFile']) elif book['AudioFile']: mime_type = mimeType(book['AudioFile']) if mime_type: title = makeUnicode(book['BookName']) entry = {'title': escape(title), 'id': escape('book:%s' % book['BookID']), 'updated': opdstime(book['BookLibrary']), 'href': '%s?cmd=Serve&bookid=%s' % (self.opdsroot, quote_plus(book['BookID'])), 'kind': 'acquisition', 'rel': 'file', 'type': mime_type} if lazylibrarian.CONFIG['OPDS_METAINFO']: author = myDB.match("SELECT AuthorName from authors WHERE AuthorID='%s'" % book['AuthorID']) author = makeUnicode(author['AuthorName']) entry['image'] = self.searchroot + '/' + book['BookImg'] entry['content'] = escape('%s - %s' % (title, book['BookDesc'])) entry['author'] = escape('%s' % author) else: entry['content'] = escape('%s (%s)' % (title, book['BookAdded'])) entries.append(entry) """ <link type="application/epub+zip" rel="http://opds-spec.org/acquisition" title="EPUB (no images)" length="18552" href="//www.gutenberg.org/ebooks/57490.epub.noimages"/> <link type="application/x-mobipocket-ebook" rel="http://opds-spec.org/acquisition" title="Kindle (no images)" length="110360" href="//www.gutenberg.org/ebooks/57490.kindle.noimages"/> """ if len(results) > (index + self.PAGE_SIZE): links.append( getLink(href='%s?cmd=RecentBooks&index=%s' % (self.opdsroot, index + self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='next')) if index >= self.PAGE_SIZE: links.append( getLink(href='%s?cmd=RecentBooks&index=%s' % (self.opdsroot, index - self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='previous')) feed['links'] = links feed['entries'] = entries logger.debug("Returning %s book%s" % (len(entries), plural(len(entries)))) self.data = feed return
def _Members(self, **kwargs): index = 0 if 'index' in kwargs: index = check_int(kwargs['index'], 0) myDB = database.DBConnection() if 'seriesid' not in kwargs: self.data = self._error_with_message('No Series Provided') return links = [] entries = [] series = myDB.match("SELECT SeriesName from Series WHERE SeriesID=?", (kwargs['seriesid'],)) cmd = "SELECT BookName,BookDate,BookAdded,BookDesc,BookImg,BookFile,AudioFile,books.BookID,SeriesNum " cmd += "from books,member where (Status='Open' or AudioStatus='Open') and SeriesID=? " cmd += "and books.bookid = member.bookid order by CAST(SeriesNum AS INTEGER)" results = myDB.select(cmd, (kwargs['seriesid'],)) cmd = 'SELECT AuthorName from authors,books WHERE authors.authorid = books.authorid AND ' cmd += 'books.bookid=?' res = myDB.match(cmd, (results[0]['BookID'],)) author = res['AuthorName'] page = results[index:(index + self.PAGE_SIZE)] for book in page: mime_type = None if book['BookFile']: mime_type = mimeType(book['BookFile']) elif book['AudioFile']: mime_type = mimeType(book['AudioFile']) if mime_type: if book['SeriesNum']: snum = ' (%s)' % book['SeriesNum'] else: snum = '' entry = {'title': escape('%s%s' % (book['BookName'], snum)), 'id': escape('book:%s' % book['BookID']), 'updated': opdstime(book['BookAdded']), 'href': '%s?cmd=Serve&bookid=%s' % (self.opdsroot, book['BookID']), 'kind': 'acquisition', 'rel': 'file', 'author': escape("%s" % author), 'type': mime_type} if lazylibrarian.CONFIG['OPDS_METAINFO']: entry['image'] = self.searchroot + '/' + book['BookImg'] entry['content'] = escape('%s (%s %s) %s' % (book['BookName'], series['SeriesName'], book['SeriesNum'], book['BookDesc'])) else: entry['content'] = escape('%s (%s %s) %s' % (book['BookName'], series['SeriesName'], book['SeriesNum'], book['BookAdded'])) entries.append(entry) feed = {} seriesname = '%s (%s) %s' % (escape(series['SeriesName']), len(entries), author) feed['title'] = 'LazyLibrarian OPDS - %s' % seriesname feed['id'] = 'series:%s' % escape(kwargs['seriesid']) feed['updated'] = now() links.append(getLink(href=self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='start', title='Home')) links.append(getLink(href='%s?cmd=Series' % self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='self')) if len(results) > (index + self.PAGE_SIZE): links.append( getLink(href='%s?cmd=Members&seriesid=%s&index=%s' % (self.opdsroot, kwargs['seriesid'], index + self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='next')) if index >= self.PAGE_SIZE: links.append( getLink(href='%s?cmd=Members&seriesid=%s&index=%s' % (self.opdsroot, kwargs['seriesid'], index - self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='previous')) feed['links'] = links feed['entries'] = entries logger.debug("Returning %s book%s" % (len(entries), plural(len(entries)))) self.data = feed return
def _Author(self, **kwargs): index = 0 if 'index' in kwargs: index = check_int(kwargs['index'], 0) myDB = database.DBConnection() if 'authorid' not in kwargs: self.data = self._error_with_message('No Author Provided') return links = [] entries = [] links.append(getLink(href='%s/opensearchbooks.xml' % self.searchroot, ftype='application/opensearchdescription+xml', rel='search', title='Search Books')) author = myDB.match("SELECT AuthorName from authors WHERE AuthorID=?", (kwargs['authorid'],)) author = makeUnicode(author['AuthorName']) cmd = "SELECT BookName,BookDate,BookID,BookAdded,BookDesc,BookImg,BookFile,AudioFile from books WHERE " if 'query' in kwargs: cmd += "BookName LIKE '%" + kwargs['query'] + "%' AND " cmd += "(Status='Open' or AudioStatus='Open') and AuthorID=? order by BookDate DESC" results = myDB.select(cmd, (kwargs['authorid'],)) page = results[index:(index + self.PAGE_SIZE)] for book in page: mime_type = None if book['BookFile']: mime_type = mimeType(book['BookFile']) elif book['AudioFile']: mime_type = mimeType(book['AudioFile']) if mime_type: entry = {'title': escape('%s (%s)' % (book['BookName'], book['BookDate'])), 'id': escape('book:%s' % book['BookID']), 'updated': opdstime(book['BookAdded']), 'href': '%s?cmd=Serve&bookid=%s' % (self.opdsroot, book['BookID']), 'kind': 'acquisition', 'rel': 'file', 'type': mime_type} if lazylibrarian.CONFIG['OPDS_METAINFO']: entry['image'] = self.searchroot + '/' + book['BookImg'] entry['content'] = escape('%s - %s' % (book['BookName'], book['BookDesc'])) entry['author'] = escape('%s' % author) else: entry['content'] = escape('%s (%s)' % (book['BookName'], book['BookAdded'])) entries.append(entry) feed = {} authorname = '%s (%s)' % (escape(author), len(entries)) feed['title'] = 'LazyLibrarian OPDS - %s' % authorname feed['id'] = 'author:%s' % escape(kwargs['authorid']) feed['updated'] = now() links.append(getLink(href=self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='start', title='Home')) links.append(getLink(href='%s?cmd=Authors' % self.opdsroot, ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='self')) if len(results) > (index + self.PAGE_SIZE): links.append( getLink(href='%s?cmd=Author&authorid=%s&index=%s' % (self.opdsroot, quote_plus(kwargs['authorid']), index + self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='next')) if index >= self.PAGE_SIZE: links.append( getLink(href='%s?cmd=Author&authorid=%s&index=%s' % (self.opdsroot, quote_plus(kwargs['authorid']), index - self.PAGE_SIZE), ftype='application/atom+xml; profile=opds-catalog; kind=navigation', rel='previous')) feed['links'] = links feed['entries'] = entries self.data = feed logger.debug("Returning %s book%s" % (len(entries), plural(len(entries)))) return