2011-02-23 09:52:30 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# vi:si:et:sw=4:sts=4:ts=4
|
2016-09-07 12:38:08 +00:00
|
|
|
from __future__ import division, print_function, absolute_import
|
2011-02-23 09:52:30 +00:00
|
|
|
|
|
|
|
import os.path
|
|
|
|
import hashlib
|
|
|
|
|
2016-09-07 12:38:08 +00:00
|
|
|
from six.moves import urllib
|
2011-02-23 09:52:30 +00:00
|
|
|
from django.db import models
|
|
|
|
from django.core.files.base import ContentFile
|
|
|
|
|
2011-02-23 09:54:06 +00:00
|
|
|
from lookup.models import MovieId
|
|
|
|
|
2011-02-23 09:52:30 +00:00
|
|
|
def getCovers(isbn, url_prefix='', limit=lambda x, y: 0.3 < x/y < 1):
|
|
|
|
covers = {}
|
2016-09-07 12:38:08 +00:00
|
|
|
if url_prefix.endswith('/'):
|
|
|
|
url_prefix = url_prefix[:-1]
|
2011-02-23 09:52:30 +00:00
|
|
|
for p in CoverCache.objects.all().filter(isbn=isbn, failed=False).order_by('id'):
|
|
|
|
if p.site not in covers:
|
|
|
|
covers[p.site] = []
|
|
|
|
cover = p.get()
|
|
|
|
if cover:
|
|
|
|
pjson = {}
|
|
|
|
pjson['url'] = url_prefix + cover._get_url()
|
|
|
|
pjson['width'] = cover.width
|
|
|
|
pjson['height'] = cover.height
|
|
|
|
if p.site not in ['other', 'wikipedia.org'] or limit(cover.width, cover.height):
|
|
|
|
covers[p.site].append(pjson)
|
2016-09-07 12:38:08 +00:00
|
|
|
for p in list(covers):
|
|
|
|
if not covers[p]:
|
|
|
|
del covers[p]
|
2011-02-23 09:52:30 +00:00
|
|
|
covers = Cover.objects.filter(isbn=isbn).exclude(cover='')
|
|
|
|
if cover.count() > 0:
|
|
|
|
covers['local'] = [p.cover.url]
|
|
|
|
return covers
|
|
|
|
|
|
|
|
def cover_path(url, filename):
|
2016-09-07 12:38:08 +00:00
|
|
|
if not isinstance(url, bytes):
|
|
|
|
url = url.encode('utf-8')
|
2011-02-23 09:52:30 +00:00
|
|
|
h = hashlib.sha1(url).hexdigest()
|
|
|
|
ext = 'jpg'
|
|
|
|
if filename.endswith('.png'):
|
|
|
|
ext = 'png'
|
|
|
|
name = "%s.%s" % (h, ext)
|
|
|
|
return os.path.join('covers', h[:2], h[2:4], h[4:6], name)
|
|
|
|
|
2016-03-06 10:35:46 +00:00
|
|
|
def covercache_image_path(i, f):
|
|
|
|
return cover_path(i.url.encode('utf-8'), f)
|
|
|
|
|
2011-02-23 09:52:30 +00:00
|
|
|
class CoverCache(models.Model):
|
|
|
|
class Meta:
|
|
|
|
unique_together = ("isbn", "url")
|
|
|
|
|
|
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
|
|
modified = models.DateTimeField(auto_now=True)
|
|
|
|
|
|
|
|
isbn = models.CharField(max_length=13)
|
|
|
|
url = models.CharField(max_length=1024)
|
|
|
|
site = models.CharField(max_length=255)
|
|
|
|
site_id = models.CharField(max_length=42)
|
2016-03-06 10:35:46 +00:00
|
|
|
image = models.ImageField(max_length=255, upload_to=covercache_image_path)
|
2011-02-23 09:52:30 +00:00
|
|
|
status = models.CharField(max_length=1024, default='200')
|
|
|
|
failed = models.BooleanField(default=False)
|
|
|
|
|
|
|
|
def get(self):
|
|
|
|
if not self.image and not self.failed:
|
|
|
|
import ox.net
|
|
|
|
url = self.url.encode('utf-8')
|
|
|
|
name = hashlib.sha1(url).hexdigest()
|
|
|
|
try:
|
2012-08-15 15:15:59 +00:00
|
|
|
data = ox.net.read_url(url)
|
2011-02-23 09:52:30 +00:00
|
|
|
self.image.save(name, ContentFile(data))
|
2016-09-07 12:38:08 +00:00
|
|
|
except urllib.error.HTTPError as e:
|
2011-02-23 09:52:30 +00:00
|
|
|
#import traceback
|
|
|
|
#print traceback.print_exc()
|
|
|
|
self.status = e.code
|
|
|
|
self.failed = True
|
|
|
|
self.save()
|
2016-09-07 12:38:08 +00:00
|
|
|
except urllib.error.URLError as e:
|
2011-02-23 09:52:30 +00:00
|
|
|
#import traceback
|
|
|
|
#print traceback.print_exc()
|
|
|
|
self.status = e.reason
|
|
|
|
self.failed = True
|
|
|
|
self.save()
|
|
|
|
if self.image:
|
|
|
|
try:
|
|
|
|
self.image.width
|
|
|
|
except IOError:
|
|
|
|
self.image.delete()
|
|
|
|
except TypeError:
|
|
|
|
self.failed = True
|
|
|
|
self.status = "invalid image"
|
|
|
|
self.image.delete()
|
|
|
|
return self.image
|
|
|
|
|
2016-03-06 10:35:46 +00:00
|
|
|
def cover_image_path(i, f):
|
|
|
|
return cover_path('upload/%s' % i.id, f)
|
|
|
|
|
2011-02-23 09:52:30 +00:00
|
|
|
class Cover(models.Model):
|
|
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
|
|
modified = models.DateTimeField(auto_now=True)
|
|
|
|
|
|
|
|
isbn = models.ForeignKey(MovieId, related_name='cover')
|
2016-03-06 10:35:46 +00:00
|
|
|
cover = models.ImageField(max_length=255, upload_to=cover_image_path)
|
2011-02-23 09:52:30 +00:00
|
|
|
|