send kindle from s3
add file archiving code, because we needed it for push distribution. Also use archive for kindle. tweak send-to-kindle docs.pull/1/head
parent
ee0d19810c
commit
50930ce2b1
|
@ -1001,8 +1001,8 @@ class Campaign(models.Model):
|
||||||
self.work.make_ebooks_from_ebfs(add_ask=True)
|
self.work.make_ebooks_from_ebfs(add_ask=True)
|
||||||
|
|
||||||
def make_unglued_ebf(self, format, watermarked):
|
def make_unglued_ebf(self, format, watermarked):
|
||||||
ebf=EbookFile.objects.create(edition=self.work.preferred_edition, format=format)
|
|
||||||
r=urllib2.urlopen(watermarked.download_link(format))
|
r=urllib2.urlopen(watermarked.download_link(format))
|
||||||
|
ebf=EbookFile.objects.create(edition=self.work.preferred_edition, format=format)
|
||||||
ebf.file.save(path_for_file(ebf,None),ContentFile(r.read()))
|
ebf.file.save(path_for_file(ebf,None),ContentFile(r.read()))
|
||||||
ebf.file.close()
|
ebf.file.close()
|
||||||
ebf.save()
|
ebf.save()
|
||||||
|
@ -2005,7 +2005,38 @@ class Ebook(models.Model):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def get_archive(self): # returns an archived file
|
||||||
|
if self.edition.ebook_files.filter(format=self.format).count()==0:
|
||||||
|
if self.provider is not 'Unglue.it':
|
||||||
|
try:
|
||||||
|
r=urllib2.urlopen(self.url)
|
||||||
|
try:
|
||||||
|
self.filesize = int(r.info().getheaders("Content-Length")[0])
|
||||||
|
if self.save:
|
||||||
|
self.filesize = self.filesize if self.filesize < 2147483647 else 2147483647 # largest safe positive integer
|
||||||
|
self.save()
|
||||||
|
ebf=EbookFile.objects.create(edition=self.edition, format=self.format)
|
||||||
|
ebf.file.save(path_for_file(ebf,None),ContentFile(r.read()))
|
||||||
|
ebf.file.close()
|
||||||
|
ebf.save()
|
||||||
|
return ebf.file.open()
|
||||||
|
except IndexError:
|
||||||
|
# response has no Content-Length header probably a bad link
|
||||||
|
logging.error( 'Bad link error: {}'.format(ebook.url) )
|
||||||
|
except IOError:
|
||||||
|
logger.error(u'could not open {}'.format(self.url) )
|
||||||
|
else:
|
||||||
|
# this shouldn't happen, except in testing perhaps
|
||||||
|
logger.error(u'couldn\'t find ebookfile for {}'.format(self.url) )
|
||||||
|
# try the url instead
|
||||||
|
f = urllib.urlopen(self.url)
|
||||||
|
return f
|
||||||
|
else:
|
||||||
|
f= self.edition.ebook_files.filter(format=self.format).order_by('-created')[0].file
|
||||||
|
f.open()
|
||||||
|
return f
|
||||||
|
|
||||||
def set_provider(self):
|
def set_provider(self):
|
||||||
self.provider=Ebook.infer_provider(self.url)
|
self.provider=Ebook.infer_provider(self.url)
|
||||||
return self.provider
|
return self.provider
|
||||||
|
|
|
@ -87,11 +87,18 @@ class BookLoaderTests(TestCase):
|
||||||
huck = models.Work.objects.get(id=huck_id)
|
huck = models.Work.objects.get(id=huck_id)
|
||||||
self.assertTrue( huck.ebooks().count()>1)
|
self.assertTrue( huck.ebooks().count()>1)
|
||||||
|
|
||||||
|
|
||||||
def test_add_by_yaml(self):
|
def test_add_by_yaml(self):
|
||||||
space_id = bookloader.load_from_yaml('https://github.com/gitenberg-dev/metadata/raw/master/samples/pandata.yaml')
|
space_id = bookloader.load_from_yaml('https://github.com/gitenberg-dev/metadata/raw/master/samples/pandata.yaml')
|
||||||
huck_id = bookloader.load_from_yaml('https://github.com/GITenberg/Adventures-of-Huckleberry-Finn_76/raw/master/metadata.yaml')
|
huck_id = bookloader.load_from_yaml('https://github.com/GITenberg/Adventures-of-Huckleberry-Finn_76/raw/master/metadata.yaml')
|
||||||
space = models.Work.objects.get(id=space_id)
|
space = models.Work.objects.get(id=space_id)
|
||||||
huck = models.Work.objects.get(id=huck_id)
|
huck = models.Work.objects.get(id=huck_id)
|
||||||
|
|
||||||
|
#test ebook archiving
|
||||||
|
num_ebf= EbookFile.objects.all().count()
|
||||||
|
for ebook in huck.ebooks().all():
|
||||||
|
f = ebook.get_archive()
|
||||||
|
self.assertTrue(EbookFile.objects.all().count()>num_ebf)
|
||||||
|
|
||||||
def test_valid_subject(self):
|
def test_valid_subject(self):
|
||||||
self.assertTrue(bookloader.valid_subject('A, valid, suj\xc3t'))
|
self.assertTrue(bookloader.valid_subject('A, valid, suj\xc3t'))
|
||||||
|
@ -455,7 +462,10 @@ class BookLoaderTests(TestCase):
|
||||||
ebook = bookloader.load_gutenberg_edition(title, gutenberg_etext_id, ol_work_id, seed_isbn, epub_url, format, license, lang, publication_date)
|
ebook = bookloader.load_gutenberg_edition(title, gutenberg_etext_id, ol_work_id, seed_isbn, epub_url, format, license, lang, publication_date)
|
||||||
self.assertEqual(ebook.url, epub_url)
|
self.assertEqual(ebook.url, epub_url)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
for ebf in EbookFile.objects.all():
|
||||||
|
ebf.file.delete()
|
||||||
|
|
||||||
class SearchTests(TestCase):
|
class SearchTests(TestCase):
|
||||||
|
|
||||||
def test_basic_search(self):
|
def test_basic_search(self):
|
||||||
|
|
|
@ -62,11 +62,11 @@
|
||||||
document.getElementById('id_kindle_email').focus()
|
document.getElementById('id_kindle_email').focus()
|
||||||
</script>
|
</script>
|
||||||
</div>
|
</div>
|
||||||
https://www.amazon.com/gp/digital/fiona/manage#manageDevices
|
|
||||||
<div>
|
<div>
|
||||||
<p>Don't know the email address for your device or reading app? <a href="https://www.amazon.com/myk#manageDevices">Find it here</a>. (If you're not logged in to Amazon, you need to click "Manage Your Devices" in the "Your Kindle Account" section on the lower left side of the page.)</p>
|
<p>Don't know the email address for your device or reading app? <a href="https://www.amazon.com/myk#manageDevices">Find it here</a>. (If you're not logged in to Amazon, you need to click "Manage Your Devices" in the "Your Kindle Account" section on the lower left side of the page.)</p>
|
||||||
|
|
||||||
<p>Once we have your Kindle email, you'll be able to send unglued ebooks to your Kindle device or app with one click from any Unglue.it download page.</p>
|
<p>Once we have your Kindle email, you'll be able to send unglued ebooks to your Kindle device or app with one click from any Unglue.it download page. Note: ebooks that we send will appear in the "Docs" tab, not "Books".</p>
|
||||||
</div>
|
</div>
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -3323,21 +3323,13 @@ def send_to_kindle(request, work_id, javascript='0'):
|
||||||
This won't perfectly measure size of email, but should be safe, and is much faster than doing the check after download.
|
This won't perfectly measure size of email, but should be safe, and is much faster than doing the check after download.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
filehandle = urllib.urlopen(ebook.url)
|
filehandle = ebook.get_archive()
|
||||||
except IOError:
|
except IOError:
|
||||||
# problems connection to the ebook source
|
# problems connection to the ebook source
|
||||||
logger.error("couldn't connect error: %s", ebook.url)
|
logger.error("couldn't connect error: %s", ebook.url)
|
||||||
return local_response(request, javascript, context, 5)
|
return local_response(request, javascript, context, 5)
|
||||||
if not ebook.filesize:
|
if not ebook.filesize:
|
||||||
try:
|
return local_response(request, javascript, context, 4)
|
||||||
ebook.filesize = int(filehandle.info().getheaders("Content-Length")[0])
|
|
||||||
if ebook.save:
|
|
||||||
ebook.filesize = ebook.filesize if ebook.filesize < 2147483647 else 2147483647 # largest safe positive integer
|
|
||||||
ebook.save()
|
|
||||||
except IndexError:
|
|
||||||
# response has no Content-Length header probably a bad link
|
|
||||||
logger.error('Bad link error: %s', ebook.url)
|
|
||||||
return local_response(request, javascript, context, 4)
|
|
||||||
if ebook.filesize > models.send_to_kindle_limit:
|
if ebook.filesize > models.send_to_kindle_limit:
|
||||||
logger.info('ebook %s is too large to be emailed' % work.id)
|
logger.info('ebook %s is too large to be emailed' % work.id)
|
||||||
return local_response(request, javascript, context, 0)
|
return local_response(request, javascript, context, 0)
|
||||||
|
|
Loading…
Reference in New Issue