Commit c4666f55 authored by Dmitry Shelepnev's avatar Dmitry Shelepnev
Browse files

Fix book mimetypes for opdsFedds and downloads

parent dd689d0f
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -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:
+6 −14
Original line number Diff line number Diff line
@@ -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
+30 −24
Original line number Diff line number Diff line
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"),
            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"}),"application/epub+zip","http://opds-spec.org/acquisition/open-access")]
                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"}),"application/mobi","http://opds-spec.org/acquisition/open-access")]
                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: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"}),"application/epub+zip","http://opds-spec.org/acquisition/open-access")] 
            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"}),"application/mobi","http://opds-spec.org/acquisition/open-access")] 
            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