add getIds call
This commit is contained in:
parent
ed22ecbfb7
commit
055717d461
3 changed files with 91 additions and 3 deletions
4
README
4
README
|
@ -2,8 +2,8 @@ To setup a local instance of oxdata:
|
||||||
|
|
||||||
bzr branch http://code.0xdb.org/oxdata oxdata
|
bzr branch http://code.0xdb.org/oxdata oxdata
|
||||||
cd oxdata
|
cd oxdata
|
||||||
virtualenv .
|
virtualenv --system-site-packages .
|
||||||
pip -E . install -r requirements.txt
|
./bin/pip install -r requirements.txt
|
||||||
|
|
||||||
you need python, bazaar, pip and virtualenv:
|
you need python, bazaar, pip and virtualenv:
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@ from __future__ import division
|
||||||
import re
|
import re
|
||||||
import unicodedata
|
import unicodedata
|
||||||
from urllib import quote
|
from urllib import quote
|
||||||
|
import hashlib
|
||||||
|
import base64
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
@ -74,11 +76,15 @@ class Imdb(models.Model):
|
||||||
seriesTitle = models.CharField(max_length=1000, blank=True, default='')
|
seriesTitle = models.CharField(max_length=1000, blank=True, default='')
|
||||||
|
|
||||||
invalid = models.BooleanField(default=False)
|
invalid = models.BooleanField(default=False)
|
||||||
patch = DictField(default=None, blank=True)
|
patch = DictField(default=None, blank=True, null=True)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return u"[%s] %s%s" % (self.imdb, self.title, self.year and ' (%s)' % self.year or '')
|
return u"[%s] %s%s" % (self.imdb, self.title, self.year and ' (%s)' % self.year or '')
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
super(Imdb, self).save(*args, **kwargs)
|
||||||
|
Match.update_item(self)
|
||||||
|
|
||||||
keys = ('title', 'director', 'year', 'season', 'episode',
|
keys = ('title', 'director', 'year', 'season', 'episode',
|
||||||
'originalTitle',
|
'originalTitle',
|
||||||
'seriesTitle', 'episodeTitle', 'episodeYear', 'episodeDirector')
|
'seriesTitle', 'episodeTitle', 'episodeYear', 'episodeDirector')
|
||||||
|
@ -212,3 +218,78 @@ def get_new_ids(timeout=-1):
|
||||||
added += 1
|
added += 1
|
||||||
if added:
|
if added:
|
||||||
print url, added
|
print url, added
|
||||||
|
|
||||||
|
class Match(models.Model):
|
||||||
|
keys = [
|
||||||
|
['title', 'director', 'year'],
|
||||||
|
['title', 'director'],
|
||||||
|
['title', 'year'],
|
||||||
|
['director', 'year'],
|
||||||
|
['title'],
|
||||||
|
['director']
|
||||||
|
]
|
||||||
|
|
||||||
|
key = models.CharField(max_length=28, db_index=True)
|
||||||
|
item = models.ForeignKey(Imdb, related_name='matches')
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return '%s(%s)' % (self.hexdigest(), self.item.imdb)
|
||||||
|
|
||||||
|
def json(self):
|
||||||
|
return self.item.json()
|
||||||
|
|
||||||
|
def hexdigest(self):
|
||||||
|
return base64.b64decode(self.key).encode('hex')
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_keys(cls, data):
|
||||||
|
data = {
|
||||||
|
'title': data['title'].lower(),
|
||||||
|
'year': str(data.get('year', '')),
|
||||||
|
'director': ';'.join(sorted(data.get('director', [])))
|
||||||
|
}
|
||||||
|
keys = []
|
||||||
|
for k in cls.keys:
|
||||||
|
key = '\0'.join(k)
|
||||||
|
value = '\0'.join([data[v] for v in k])
|
||||||
|
if isinstance(value, unicode):
|
||||||
|
value = value.encode('utf-8')
|
||||||
|
value = str(value)
|
||||||
|
key = str(key)
|
||||||
|
key = base64.b64encode(hashlib.sha1(key + '\n' + value).digest())
|
||||||
|
keys.append(key)
|
||||||
|
return keys
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def find(cls, data):
|
||||||
|
matches = []
|
||||||
|
items = []
|
||||||
|
for key in cls.get_keys(data):
|
||||||
|
for m in cls.objects.filter(key=key).order_by('item__imdb'):
|
||||||
|
if m.item.id not in items:
|
||||||
|
matches.append(m.json())
|
||||||
|
items.append(m.item.id)
|
||||||
|
return matches
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def update_item(cls, item):
|
||||||
|
info = item.json()
|
||||||
|
data = []
|
||||||
|
if 'originalTitle' in info:
|
||||||
|
data.append({
|
||||||
|
'title': info['originalTitle'],
|
||||||
|
'year': info.get('year', ''),
|
||||||
|
'director': info.get('director', [])
|
||||||
|
})
|
||||||
|
data.append(info)
|
||||||
|
existing_keys = [m.key for m in Match.objects.filter(item=item)]
|
||||||
|
current_keys = []
|
||||||
|
for d in data:
|
||||||
|
for key in cls.get_keys(d):
|
||||||
|
if key not in existing_keys:
|
||||||
|
m = Match(key=key, item=item)
|
||||||
|
m.save()
|
||||||
|
current_keys.append(key)
|
||||||
|
deleted_keys = list(set(existing_keys)-set(current_keys))
|
||||||
|
if deleted_keys:
|
||||||
|
Match.objects.filter(item=item, key__in=deleted_keys).delete()
|
||||||
|
|
|
@ -22,6 +22,13 @@ def getId(request):
|
||||||
return render_to_json_response(response)
|
return render_to_json_response(response)
|
||||||
actions.register(getId)
|
actions.register(getId)
|
||||||
|
|
||||||
|
def getIds(request):
|
||||||
|
data = json.loads(request.POST['data'])
|
||||||
|
response = json_response()
|
||||||
|
response['items'] = models.Match.find(data)
|
||||||
|
return render_to_json_response(response)
|
||||||
|
actions.register(getIds)
|
||||||
|
|
||||||
|
|
||||||
def getData(request):
|
def getData(request):
|
||||||
response = json_response()
|
response = json_response()
|
||||||
|
|
Loading…
Reference in a new issue