From be07690dc41b5eb3e46ecd3f1b14bbcd578881ac Mon Sep 17 00:00:00 2001 From: barbequesauce Date: Mon, 13 Aug 2018 12:09:48 -0400 Subject: [PATCH] IMP: add grabbag to OPDS server --- mylar/opds.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 4 deletions(-) diff --git a/mylar/opds.py b/mylar/opds.py index 0caca8ee..bd4bd9e7 100644 --- a/mylar/opds.py +++ b/mylar/opds.py @@ -17,11 +17,12 @@ # along with Mylar. If not, see . import mylar -from mylar import db, mb, importer, search, PostProcessor, versioncheck, logger, readinglist +from mylar import db, mb, importer, search, PostProcessor, versioncheck, logger, readinglist, helpers import simplejson as simplejson import cherrypy from xml.sax.saxutils import escape import os +import glob import urllib2 from urllib import urlencode, quote_plus import cache @@ -32,7 +33,7 @@ import datetime from mylar.webserve import serve_template import re -cmd_list = ['root', 'Publishers', 'AllTitles', 'StoryArcs', 'ReadList', 'Comic', 'Publisher', 'Issue', 'StoryArc', 'Recent'] +cmd_list = ['root', 'Publishers', 'AllTitles', 'StoryArcs', 'ReadList', 'OneOffs', 'Comic', 'Publisher', 'Issue', 'StoryArc', 'Recent', 'deliverFile'] class OPDS(object): @@ -198,7 +199,20 @@ class OPDS(object): 'rel': 'subsection', } ) - + gbd = mylar.CONFIG.GRABBAG_DIR + '/*' + oneofflist = glob.glob(gbd) + if len(oneofflist) > 0: + entries.append( + { + 'title': 'One-Offs (%s)' % len(oneofflist), + 'id': 'OneOffs', + 'updated': mylar.helpers.now(), + 'content': 'OneOffs', + 'href': '%s?cmd=OneOffs' % self.opdsroot, + 'kind': 'navigation', + 'rel': 'subsection', + } + ) feed['links'] = links feed['entries'] = entries self.data = feed @@ -491,7 +505,16 @@ class OPDS(object): self.data = feed return - + def _deliverFile(self, **kwargs): + logger.fdebug("_deliverFile: kwargs: %s" % kwargs) + if 'file' not in kwargs: + self.data = self._error_with_message('No file provided') + elif 'filename' not in kwargs: + self.data = self._error_with_message('No filename provided') + else: + self.filename = os.path.split(str(kwargs['file']))[1] + self.file = str(kwargs['file']) + return def _Issue(self, **kwargs): if 'issueid' not in kwargs: @@ -575,6 +598,71 @@ class OPDS(object): self.data = feed return + def _OneOffs(self, **kwargs): + index = 0 + if 'index' in kwargs: + index = int(kwargs['index']) + links = [] + entries = [] + flist = [] + book = '' + gbd = str(mylar.CONFIG.GRABBAG_DIR + '/*').encode('utf-8') + flist = glob.glob(gbd) + readlist = [] + for book in flist: + issue = {} + fileexists = True + book = book.encode('utf-8') + issue['Title'] = book + issue['IssueID'] = book + issue['fileloc'] = book + issue['filename'] = book + issue['image'] = None + issue['thumbnail'] = None + issue['updated'] = helpers.now() + if not os.path.isfile(issue['fileloc']): + fileexists = False + if fileexists: + readlist.append(issue) + if len(readlist) > 0: + if index <= len(readlist): + subset = readlist[index:(index + self.PAGE_SIZE)] + for issue in subset: + metainfo = None + metainfo = [{'writer': None,'summary': ''}] + entries.append( + { + 'title': escape(issue['Title']), + 'id': escape('comic:%s' % issue['IssueID']), + 'updated': issue['updated'], + 'content': escape('%s' % (metainfo[0]['summary'])), + 'href': '%s?cmd=deliverFile&file=%s&filename=%s' % (self.opdsroot, quote_plus(issue['fileloc']), quote_plus(issue['filename'])), + 'kind': 'acquisition', + 'rel': 'file', + 'author': metainfo[0]['writer'], + 'image': issue['image'], + 'thumbnail': issue['thumbnail'], + } + ) + + feed = {} + feed['title'] = 'Mylar OPDS - One-Offs' + feed['id'] = escape('OneOffs') + feed['updated'] = mylar.helpers.now() + links.append(getLink(href=self.opdsroot,type='application/atom+xml; profile=opds-catalog; kind=navigation', rel='start', title='Home')) + links.append(getLink(href='%s?cmd=OneOffs' % self.opdsroot,type='application/atom+xml; profile=opds-catalog; kind=navigation',rel='self')) + if len(readlist) > (index + self.PAGE_SIZE): + links.append( + getLink(href='%s?cmd=OneOffs&index=%s' % (self.opdsroot, index+self.PAGE_SIZE), type='application/atom+xml; profile=opds-catalog; kind=navigation', rel='next')) + if index >= self.PAGE_SIZE: + links.append( + getLink(href='%s?cmd=Read&index=%s' % (self.opdsroot, index-self.PAGE_SIZE), type='application/atom+xml; profile=opds-catalog; kind=navigation', rel='previous')) + + feed['links'] = links + feed['entries'] = entries + self.data = feed + return + def _ReadList(self, **kwargs): index = 0 if 'index' in kwargs: