diff --git a/book_tools/format/__init__.py b/book_tools/format/__init__.py index 956789bde40bfd331cd1c17110fac7b11cafa6ad..761edb02880adefe7afadbb82f59fedc758dacaf 100644 --- a/book_tools/format/__init__.py +++ b/book_tools/format/__init__.py @@ -17,33 +17,41 @@ from constance import config class __detector: @staticmethod - def file(filename): - (n, e) = os.path.splitext(filename) - if e.lower() == '.xml': + def format(fmt): + if fmt.lower() == 'xml': return Mimetype.XML - if e.lower() == '.fb2': + elif fmt.lower() == 'fb2': return Mimetype.FB2 - elif e.lower()=='.epub' or e.lower()=='.zip': + elif fmt.lower() =='epub': + return Mimetype.EPUB + elif fmt.lower() =='mobi': + return Mimetype.MOBI + elif fmt.lower() == 'zip': return Mimetype.ZIP - elif e.lower()=='.pdf': + elif fmt.lower() =='pdf': return Mimetype.PDF - elif e.lower()=='.doc' or e.lower()=='.docx': + elif fmt.lower() =='doc' or fmt.lower()=='docx': return Mimetype.MSWORD - elif e.lower()=='.djvu': + elif fmt.lower() =='djvu': return Mimetype.DJVU - elif e.lower()=='.txt': + elif fmt.lower() =='txt': return Mimetype.TEXT - elif e.lower()=='.rtf': + elif fmt.lower() =='rtf': return Mimetype.RTF else: return Mimetype.OCTET_STREAM + @staticmethod + def file(filename): + (n, e) = os.path.splitext(filename) + return format(e[1:]) + def detect_mime(file, original_filename): FB2_ROOT = 'FictionBook' mime = __detector.file(original_filename) try: - if mime == Mimetype.XML or mime == Mimetype.FB2: + if mime == Mimetype.XML: if FB2_ROOT == __xml_root_tag(file): return Mimetype.FB2 elif mime == Mimetype.ZIP: diff --git a/opds_catalog/dl.py b/opds_catalog/dl.py index 45be4789f528efec7e85df61061e2a672ab2005f..918683f5cc50ac8512c4cba8cf57f31721e91264 100644 --- a/opds_catalog/dl.py +++ b/opds_catalog/dl.py @@ -11,7 +11,9 @@ from django.http import HttpResponse, Http404 from opds_catalog.models import Book, bookshelf from opds_catalog import settings, utils, opdsdb, fb2parse import opds_catalog.zipf as zipfile -from book_tools.format import create_bookfile + +from book_tools.format import create_bookfile, __detector +from book_tools.format.mimetype import Mimetype from constance import config from PIL import Image @@ -40,17 +42,10 @@ def Download(request, book_id, zip_flag): if zip_flag == '1': dlfilename=transname+'.zip' - content_type='application/zip' + content_type= Mimetype.FB2_ZIP if book.format=='fb2' else Mimetype.ZIP else: dlfilename=transname - if book.format=="fb2": - content_type='text/xml' - elif book.format=="epub": - content_type='application/epub+zip' - elif book.format=="mobi": - content_type='application/x-mobipocket-ebook' - else: - content_type='application/octet-stream' + content_type = __detector.format(book.format) response = HttpResponse() response["Content-Type"]='%s; name="%s"'%(content_type,dlfilename) @@ -243,12 +238,9 @@ def ConvertFB2(request, book_id, convert_type): if convert_type=='epub': converter_path=config.SOPDS_FB2TOEPUB - content_type='application/epub+zip' elif convert_type=='mobi': converter_path=config.SOPDS_FB2TOMOBI - content_type='application/x-mobipocket-ebook' - else: - content_type='application/octet-stream' + content_type=__detector.format(convert_type) if book.cat_type==opdsdb.CAT_NORMAL: tmp_fb2_path=None diff --git a/opds_catalog/feeds.py b/opds_catalog/feeds.py index d313afd08d08f165ad5481d5ff893665867fb222..2c89dba5e7ea85a5e14a18e390c868feb305583a 100644 --- a/opds_catalog/feeds.py +++ b/opds_catalog/feeds.py @@ -1,11 +1,8 @@ -import urllib - from django.utils import timezone from django.utils.translation import ugettext as _ from django.utils.feedgenerator import Atom1Feed, Enclosure, rfc3339_date from django.contrib.syndication.views import Feed from django.core.urlresolvers import reverse -from django.core.paginator import Paginator, EmptyPage from django.shortcuts import render from django.db.models import Count, Min @@ -15,8 +12,12 @@ from opds_catalog import settings from opds_catalog.middleware import BasicAuthMiddleware from opds_catalog.opds_paginator import Paginator as OPDS_Paginator +from book_tools.format import __detector as detector +from book_tools.format.mimetype import Mimetype + from constance import config + class AuthFeed(Feed): request = None def __call__(self,request,*args,**kwargs): @@ -293,17 +294,18 @@ class CatalogsFeed(AuthFeed): if item['is_catalog']: return (opdsEnclosure(reverse("opds_catalog:cat_tree", kwargs={"cat_id":item['id']}),"application/atom+xml;profile=opds-catalog;kind=navigation", "subsection"),) else: - enclosure = [ - opdsEnclosure(reverse("opds_catalog:download", kwargs={"book_id":item['id'],"zip_flag":0}),"application/%s"%item['format'] ,"http://opds-spec.org/acquisition/open-access"), - opdsEnclosure(reverse("opds_catalog:download", kwargs={"book_id":item['id'],"zip_flag":1}),"application/%s+zip"%item['format'], "http://opds-spec.org/acquisition/open-access"), - opdsEnclosure(reverse("opds_catalog:cover", kwargs={"book_id":item['id']}),"image/jpeg", "http://opds-spec.org/image"), - opdsEnclosure(reverse("opds_catalog:thumb", kwargs={"book_id": item['id']}), "image/jpeg","http://opds-spec.org/thumbnail"), - - ] - if (config.SOPDS_FB2TOEPUB!="") and (item['format']=='fb2'): - enclosure += [opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id":item['id'],"convert_type":"epub"}),"application/epub+zip","http://opds-spec.org/acquisition/open-access")] - if (config.SOPDS_FB2TOMOBI!="") and (item['format']=='fb2'): - enclosure += [opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id":item['id'],"convert_type":"mobi"}),"application/mobi","http://opds-spec.org/acquisition/open-access")] + mime = detector.format(item['format']) + enclosure = [opdsEnclosure(reverse("opds_catalog:download", kwargs={"book_id": item['id'], "zip_flag": 0}), mime, "http://opds-spec.org/acquisition/open-access"),] + if not item['format'] in settings.NOZIP_FORMATS: + mimezip = Mimetype.FB2_ZIP if mime == Mimetype.FB2 else "%s+zip" % mime + enclosure += [opdsEnclosure(reverse("opds_catalog:download", kwargs={"book_id": item['id'], "zip_flag": 1}), mimezip, "http://opds-spec.org/acquisition/open-access")] + enclosure += [opdsEnclosure(reverse("opds_catalog:cover", kwargs={"book_id": item['id']}), "image/jpeg","http://opds-spec.org/image"), + opdsEnclosure(reverse("opds_catalog:thumb", kwargs={"book_id": item['id']}), "image/jpeg","http://opds-spec.org/thumbnail"), + ] + if (config.SOPDS_FB2TOEPUB != "") and (item['format'] == 'fb2'): + enclosure += [opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id": item['id'], "convert_type": "epub"}),Mimetype.EPUB, "http://opds-spec.org/acquisition/open-access")] + if (config.SOPDS_FB2TOMOBI != "") and (item['format'] == 'fb2'): + enclosure += [opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id": item['id'], "convert_type": "mobi"}),Mimetype.MOBI, "http://opds-spec.org/acquisition/open-access")] return enclosure @@ -539,17 +541,21 @@ class SearchBooksFeed(AuthFeed): return item['registerdate'] def item_enclosures(self, item): + mime = detector.format(item['format']) enclosure = [ - opdsEnclosure(reverse("opds_catalog:download", kwargs={"book_id":item['id'],"zip_flag":0}),"application/%s"%item['format'] ,"http://opds-spec.org/acquisition/open-access"), - opdsEnclosure(reverse("opds_catalog:download", kwargs={"book_id":item['id'],"zip_flag":1}),"application/%s+zip"%item['format'], "http://opds-spec.org/acquisition/open-access"), - opdsEnclosure(reverse("opds_catalog:cover", kwargs={"book_id":item['id']}),"image/jpeg", "http://opds-spec.org/image"), - opdsEnclosure(reverse("opds_catalog:thumb", kwargs={"book_id": item['id']}), "image/jpeg","http://opds-spec.org/thumbnail"), - - ] - if (config.SOPDS_FB2TOEPUB!="") and (item['format']=='fb2'): - enclosure += [opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id":item['id'],"convert_type":"epub"}),"application/epub+zip","http://opds-spec.org/acquisition/open-access")] - if (config.SOPDS_FB2TOMOBI!="") and (item['format']=='fb2'): - enclosure += [opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id":item['id'],"convert_type":"mobi"}),"application/mobi","http://opds-spec.org/acquisition/open-access")] + opdsEnclosure(reverse("opds_catalog:download", kwargs={"book_id": item['id'], "zip_flag": 0}), mime, "http://opds-spec.org/acquisition/open-access"), ] + if not item['format'] in settings.NOZIP_FORMATS: + mimezip = Mimetype.FB2_ZIP if mime==Mimetype.FB2 else "%s+zip"%mime + enclosure += [opdsEnclosure(reverse("opds_catalog:download", kwargs={"book_id": item['id'], "zip_flag": 1}), mimezip, "http://opds-spec.org/acquisition/open-access")] + enclosure += [opdsEnclosure(reverse("opds_catalog:cover", kwargs={"book_id": item['id']}), "image/jpeg", "http://opds-spec.org/image"), + opdsEnclosure(reverse("opds_catalog:thumb", kwargs={"book_id": item['id']}), "image/jpeg", "http://opds-spec.org/thumbnail"), + ] + if (config.SOPDS_FB2TOEPUB != "") and (item['format'] == 'fb2'): + enclosure += [ + opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id": item['id'], "convert_type": "epub"}), Mimetype.EPUB, "http://opds-spec.org/acquisition/open-access")] + if (config.SOPDS_FB2TOMOBI != "") and (item['format'] == 'fb2'): + enclosure += [ + opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id": item['id'], "convert_type": "mobi"}), Mimetype.MOBI, "http://opds-spec.org/acquisition/open-access")] return enclosure