# -*- coding: utf-8 -*- # vi:si:et:sw=4:sts=4:ts=4 from __future__ import division, print_function, absolute_import import os.path import hashlib import urllib from django.db import models from django.core.files.base import ContentFile from lookup.models import MovieId def getCovers(isbn, url_prefix='', limit=lambda x, y: 0.3 < x/y < 1): covers = {} if url_prefix.endswith('/'): url_prefix = url_prefix[:-1] 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) for p in list(covers): if not covers[p]: del covers[p] covers = Cover.objects.filter(isbn=isbn).exclude(cover='') if cover.count() > 0: covers['local'] = [p.cover.url] return covers def cover_path(url, filename): if not isinstance(url, bytes): url = url.encode('utf-8') 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) def covercache_image_path(i, f): return cover_path(i.url.encode('utf-8'), f) 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) image = models.ImageField(max_length=255, upload_to=covercache_image_path) 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: data = ox.net.read_url(url) self.image.save(name, ContentFile(data)) except urllib.error.HTTPError as e: #import traceback #print traceback.print_exc() self.status = e.code self.failed = True self.save() except urllib.error.URLError as e: #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 def cover_image_path(i, f): return cover_path('upload/%s' % i.id, f) class Cover(models.Model): created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) isbn = models.ForeignKey(MovieId, related_name='cover') cover = models.ImageField(max_length=255, upload_to=cover_image_path)