move files for new virtualenv setup
This commit is contained in:
parent
2b957c7495
commit
e38385fcd8
33 changed files with 28 additions and 4 deletions
0
oxdata/lookup/__init__.py
Normal file
0
oxdata/lookup/__init__.py
Normal file
10
oxdata/lookup/admin.py
Normal file
10
oxdata/lookup/admin.py
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
|
||||
import models
|
||||
from django.contrib import admin
|
||||
|
||||
class MovieIdAdmin(admin.ModelAdmin):
|
||||
search_fields = ['title', 'imdb_id']
|
||||
admin.site.register(models.MovieId, MovieIdAdmin)
|
||||
|
||||
62
oxdata/lookup/cache.py
Normal file
62
oxdata/lookup/cache.py
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
# -*- coding: UTF-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
import os
|
||||
|
||||
from django.conf import settings
|
||||
from oxlib.cache import getUrlUnicode
|
||||
from oxlib import findRe
|
||||
import oxlib.net
|
||||
import oxweb.criterion
|
||||
import oxweb.karagarga
|
||||
import oxweb.imdb
|
||||
import oxweb.impawards
|
||||
|
||||
import models
|
||||
from oxdata.poster.models import PosterCache
|
||||
|
||||
def addPoster(m, url, site, site_id):
|
||||
if PosterCache.objects.all().filter(url=url).count() == 0:
|
||||
p = PosterCache(url=url, site=site, site_id=site_id, movie_id=m)
|
||||
p.save()
|
||||
|
||||
def getIds():
|
||||
for id in oxweb.impawards.getIds():
|
||||
if models.MovieId.objects.all().filter(impawards_id=id).count() == 0:
|
||||
print 'impawards', id
|
||||
data = oxweb.impawards.getData(id)
|
||||
if data and 'imdbId' in data:
|
||||
m = models.getMovieIdByImdbId(data['imdbId'])
|
||||
if not m.impawards_id:
|
||||
m.impawards_id = id
|
||||
m.save()
|
||||
for poster in data['posters']:
|
||||
addPoster(m, poster, 'impawards.com', m.imdb_id)
|
||||
|
||||
for id in oxweb.criterion.getIds():
|
||||
if models.MovieId.objects.all().filter(criterion_id=id).count() == 0:
|
||||
print 'criterion', id
|
||||
data = oxweb.criterion.getData(id)
|
||||
if data and 'imdbId' in data:
|
||||
m = models.getMovieIdByImdbId(data['imdbId'])
|
||||
if not m.criterion_id:
|
||||
m.criterion_id = id
|
||||
m.save()
|
||||
addPoster(m, poster, 'criterion.com', m.criterion_id)
|
||||
else:
|
||||
print data['title'], "no imdbId"
|
||||
|
||||
#kg
|
||||
lastId = models.Karagarga.maxId()
|
||||
for id in oxweb.karagarga.getIds(lastId):
|
||||
if models.Karagarga.objects.filter(karagarga_id=id).count() == 0:
|
||||
print 'kg', id
|
||||
data = oxweb.karagarga.getData(id)
|
||||
if data and 'imdbId' in data:
|
||||
m = models.getMovieIdByImdbId(data['imdbId'])
|
||||
kg = models.Karagarga()
|
||||
kg.movie_id = m
|
||||
kg.karagarga_id = id
|
||||
kg.save()
|
||||
for poster in data['posters']:
|
||||
addPoster(m, poster, 'karagarga.net', kg.karagarga_id)
|
||||
|
||||
0
oxdata/lookup/management/__init__.py
Normal file
0
oxdata/lookup/management/__init__.py
Normal file
0
oxdata/lookup/management/commands/__init__.py
Normal file
0
oxdata/lookup/management/commands/__init__.py
Normal file
19
oxdata/lookup/management/commands/cache_ids.py
Normal file
19
oxdata/lookup/management/commands/cache_ids.py
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
from django.conf import settings
|
||||
|
||||
import lookup.cache
|
||||
|
||||
class Command(BaseCommand):
|
||||
"""
|
||||
load new ids into cache
|
||||
"""
|
||||
help = 'load ids from sites that dont support search.'
|
||||
args = ''
|
||||
|
||||
def handle(self, **options):
|
||||
import oxdata.lookup.cache
|
||||
lookup.cache.getIds()
|
||||
|
||||
78
oxdata/lookup/migrations/0001_initial.py
Normal file
78
oxdata/lookup/migrations/0001_initial.py
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from south.db import db
|
||||
from django.db import models
|
||||
from oxdata.lookup.models import *
|
||||
|
||||
class Migration:
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Adding model 'MovieId'
|
||||
db.create_table('lookup_movieid', (
|
||||
('id', orm['lookup.MovieId:id']),
|
||||
('created', orm['lookup.MovieId:created']),
|
||||
('modified', orm['lookup.MovieId:modified']),
|
||||
('title', orm['lookup.MovieId:title']),
|
||||
('year', orm['lookup.MovieId:year']),
|
||||
('director', orm['lookup.MovieId:director']),
|
||||
('series_title', orm['lookup.MovieId:series_title']),
|
||||
('episode_title', orm['lookup.MovieId:episode_title']),
|
||||
('season', orm['lookup.MovieId:season']),
|
||||
('episode', orm['lookup.MovieId:episode']),
|
||||
('oxdb_id', orm['lookup.MovieId:oxdb_id']),
|
||||
('imdb_id', orm['lookup.MovieId:imdb_id']),
|
||||
('amg_id', orm['lookup.MovieId:amg_id']),
|
||||
('wikipedia_id', orm['lookup.MovieId:wikipedia_id']),
|
||||
('criterion_id', orm['lookup.MovieId:criterion_id']),
|
||||
('impawards_id', orm['lookup.MovieId:impawards_id']),
|
||||
))
|
||||
db.send_create_signal('lookup', ['MovieId'])
|
||||
|
||||
# Adding model 'Karagarga'
|
||||
db.create_table('lookup_karagarga', (
|
||||
('id', orm['lookup.Karagarga:id']),
|
||||
('movie_id', orm['lookup.Karagarga:movie_id']),
|
||||
('karagarga_id', orm['lookup.Karagarga:karagarga_id']),
|
||||
))
|
||||
db.send_create_signal('lookup', ['Karagarga'])
|
||||
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting model 'MovieId'
|
||||
db.delete_table('lookup_movieid')
|
||||
|
||||
# Deleting model 'Karagarga'
|
||||
db.delete_table('lookup_karagarga')
|
||||
|
||||
|
||||
|
||||
models = {
|
||||
'lookup.karagarga': {
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'karagarga_id': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}),
|
||||
'movie_id': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'karagarga_ids'", 'to': "orm['lookup.MovieId']"})
|
||||
},
|
||||
'lookup.movieid': {
|
||||
'amg_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'criterion_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'director': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1000', 'blank': 'True'}),
|
||||
'episode': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
|
||||
'episode_title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1000', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'imdb_id': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '7', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'impawards_id': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'oxdb_id': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '42', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'season': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
|
||||
'series_title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1000', 'blank': 'True'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1000', 'blank': 'True'}),
|
||||
'wikipedia_id': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'year': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '4', 'blank': 'True'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['lookup']
|
||||
0
oxdata/lookup/migrations/__init__.py
Normal file
0
oxdata/lookup/migrations/__init__.py
Normal file
128
oxdata/lookup/models.py
Normal file
128
oxdata/lookup/models.py
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
import os
|
||||
import hashlib
|
||||
|
||||
from django.db import models
|
||||
from django.db.models import Q, Max
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils import simplejson
|
||||
|
||||
import oxweb.wikipedia
|
||||
import oxweb.imdb
|
||||
from oxlib import stripTags
|
||||
|
||||
|
||||
def getMovieIdByImdbId(imdb_id):
|
||||
try:
|
||||
m = MovieId.objects.get(imdb_id=imdb_id)
|
||||
except MovieId.DoesNotExist:
|
||||
m = MovieId()
|
||||
m.imdb_id = imdb_id
|
||||
m.save()
|
||||
#m.updateFromImdb()
|
||||
return m
|
||||
|
||||
class MovieId(models.Model):
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
modified = models.DateTimeField(auto_now=True)
|
||||
|
||||
title = models.CharField(max_length=1000, blank=True, default='')
|
||||
year = models.CharField(max_length=4, blank=True, default='')
|
||||
director = models.CharField(max_length=1000, blank=True, default='')
|
||||
series_title = models.CharField(max_length=1000, blank=True, default='')
|
||||
episode_title = models.CharField(max_length=1000, blank=True, default='')
|
||||
season = models.IntegerField(default=-1)
|
||||
episode = models.IntegerField(default=-1)
|
||||
|
||||
oxdb_id = models.CharField(max_length=42, unique=True, blank=True, null=True, default=None)
|
||||
imdb_id = models.CharField(max_length=7, unique=True, blank=True, null=True, default=None)
|
||||
|
||||
amg_id = models.IntegerField(unique=True, blank=True, null=True, default=None)
|
||||
wikipedia_id = models.CharField(unique=True, max_length=255, blank=True, null=True, default=None)
|
||||
criterion_id = models.IntegerField(unique=True, blank=True, null=True, default=None)
|
||||
impawards_id = models.CharField(max_length=255, unique=True, blank=True, null=True, default=None)
|
||||
|
||||
#FIXME: look into other ids
|
||||
#what about tv.com ids/urls for tv episodes
|
||||
|
||||
#movieposterdb can be mapped via imdbid and does not need to be saved here
|
||||
|
||||
def __unicode__(self):
|
||||
id = self.imdb_id
|
||||
if not id:
|
||||
id = self.id
|
||||
return '%s (%s)' % (self.title, id)
|
||||
|
||||
def updateFromWikipedia(self):
|
||||
if self.wikipedia_id:
|
||||
wikipedia_url = oxweb.wikipedia.getUrl(self.wikipedia_id)
|
||||
data = oxweb.wikipedia.getMovieData(wikipedia_url)
|
||||
_key = {}
|
||||
for key in ('imdb_id', 'amg_id'):
|
||||
if key in data:
|
||||
if data[key] and not getattr(self, _key.get(key, key)):
|
||||
setattr(self, _key.get(key, key), data[key])
|
||||
self.save()
|
||||
|
||||
def updateFromImdb(self):
|
||||
if self.imdb_id:
|
||||
data = oxweb.imdb.getMovieInfo(self.imdb_id)
|
||||
_key = {
|
||||
'episode title': 'episode_title',
|
||||
'series title': 'series_title',
|
||||
}
|
||||
for key in ('title', 'year', 'series title', 'episode title', 'season', 'episode'):
|
||||
if key in data and data[key]:
|
||||
setattr(self, _key.get(key, key), data[key])
|
||||
directors = []
|
||||
credits = oxweb.imdb.getMovieCredits(self.imdb_id)
|
||||
if 'directors' in credits:
|
||||
directors = credits['directors']
|
||||
self.director = ', '.join([stripTags(d[0]) for d in directors])
|
||||
if not self.wikipedia_id:
|
||||
self.wikipedia_id = oxweb.wikipedia.getId(oxweb.wikipedia.getUrlByImdb(self.imdb_id))
|
||||
if not self.oxdb_id:
|
||||
self.gen_oxdb_id()
|
||||
self.save()
|
||||
|
||||
def gen_oxdb_id(self):
|
||||
oxid_value = u"\n".join([self.title, self.director, self.year])
|
||||
oxid = hashlib.sha1(oxid_value.encode('utf-8')).hexdigest()
|
||||
if self.episode > -1:
|
||||
oxid_value = u"\n".join([self.series_title, "%02d" % self.season])
|
||||
oxid = hashlib.sha1(oxid_value.encode('utf-8')).hexdigest()[:20]
|
||||
oxid_value = u"\n".join(["%02d" % self.episode, self.episode_title, self.director, self.year])
|
||||
oxid += hashlib.sha1(oxid_value.encode('utf-8')).hexdigest()[:20]
|
||||
self.oxdb_id = u"0x" + oxid
|
||||
self.save()
|
||||
|
||||
def json(self):
|
||||
json = {}
|
||||
keys = [
|
||||
'title',
|
||||
'director',
|
||||
'year',
|
||||
'imdb_id',
|
||||
'oxdb_id',
|
||||
'amg_id',
|
||||
'wikipedia_id',
|
||||
'criterion_id',
|
||||
'impawards_id',
|
||||
]
|
||||
if self.episode > -1:
|
||||
keys += ['episode', 'season', 'episode_title', 'series_title']
|
||||
for key in keys:
|
||||
value = getattr(self, key)
|
||||
if value:
|
||||
json[key] = value
|
||||
return simplejson.dumps(json, indent=4)
|
||||
|
||||
class Karagarga(models.Model):
|
||||
movie_id = models.ForeignKey(MovieId, related_name='karagarga_ids', default=None)
|
||||
karagarga_id = models.IntegerField(unique=True)
|
||||
|
||||
@classmethod
|
||||
def maxId(cls):
|
||||
return cls.objects.aggregate(Max('karagarga_id'))['karagarga_id__max']
|
||||
|
||||
7
oxdata/lookup/urls.py
Normal file
7
oxdata/lookup/urls.py
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
from django.conf.urls.defaults import *
|
||||
|
||||
urlpatterns = patterns('oxdata.lookup.views',
|
||||
(r'^$', 'ids'),
|
||||
(r'^urls$', 'urls'),
|
||||
)
|
||||
|
||||
17
oxdata/lookup/views.py
Normal file
17
oxdata/lookup/views.py
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
import os.path
|
||||
from django.db import models
|
||||
from django.db.models import Q
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from oxdata.utils.shortcuts import render_to_json_response
|
||||
|
||||
def ids(request):
|
||||
json = {}
|
||||
return render_to_json_response(json)
|
||||
|
||||
def urls(request):
|
||||
json = {}
|
||||
return render_to_json_response(json)
|
||||
|
||||
11
oxdata/manage.py
Normal file
11
oxdata/manage.py
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
#!/usr/bin/env python
|
||||
from django.core.management import execute_manager
|
||||
try:
|
||||
import settings # Assumed to be in the same directory.
|
||||
except ImportError:
|
||||
import sys
|
||||
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
execute_manager(settings)
|
||||
0
oxdata/poster/__init__.py
Normal file
0
oxdata/poster/__init__.py
Normal file
10
oxdata/poster/admin.py
Normal file
10
oxdata/poster/admin.py
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
|
||||
import models
|
||||
from django.contrib import admin
|
||||
|
||||
class PosterAdmin(admin.ModelAdmin):
|
||||
search_fields = ['url', 'movie_id__title', 'movie_id__imdb_id']
|
||||
admin.site.register(models.Poster, PosterAdmin)
|
||||
|
||||
90
oxdata/poster/migrations/0001_initial.py
Normal file
90
oxdata/poster/migrations/0001_initial.py
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from south.db import db
|
||||
from django.db import models
|
||||
from oxdata.poster.models import *
|
||||
|
||||
class Migration:
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Adding model 'PosterCache'
|
||||
db.create_table('poster_postercache', (
|
||||
('id', orm['poster.PosterCache:id']),
|
||||
('created', orm['poster.PosterCache:created']),
|
||||
('modified', orm['poster.PosterCache:modified']),
|
||||
('movie_id', orm['poster.PosterCache:movie_id']),
|
||||
('url', orm['poster.PosterCache:url']),
|
||||
('site', orm['poster.PosterCache:site']),
|
||||
('site_id', orm['poster.PosterCache:site_id']),
|
||||
('image', orm['poster.PosterCache:image']),
|
||||
('failed', orm['poster.PosterCache:failed']),
|
||||
))
|
||||
db.send_create_signal('poster', ['PosterCache'])
|
||||
|
||||
# Adding model 'Poster'
|
||||
db.create_table('poster_poster', (
|
||||
('id', orm['poster.Poster:id']),
|
||||
('created', orm['poster.Poster:created']),
|
||||
('modified', orm['poster.Poster:modified']),
|
||||
('movie_id', orm['poster.Poster:movie_id']),
|
||||
('poster', orm['poster.Poster:poster']),
|
||||
('upload', orm['poster.Poster:upload']),
|
||||
('oxdb', orm['poster.Poster:oxdb']),
|
||||
))
|
||||
db.send_create_signal('poster', ['Poster'])
|
||||
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting model 'PosterCache'
|
||||
db.delete_table('poster_postercache')
|
||||
|
||||
# Deleting model 'Poster'
|
||||
db.delete_table('poster_poster')
|
||||
|
||||
|
||||
|
||||
models = {
|
||||
'lookup.movieid': {
|
||||
'amg_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'criterion_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'director': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1000', 'blank': 'True'}),
|
||||
'episode': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
|
||||
'episode_title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1000', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'imdb_id': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '7', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'impawards_id': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'oxdb_id': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '42', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'season': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
|
||||
'series_title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1000', 'blank': 'True'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1000', 'blank': 'True'}),
|
||||
'wikipedia_id': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'year': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '4', 'blank': 'True'})
|
||||
},
|
||||
'poster.poster': {
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'movie_id': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'poster'", 'to': "orm['lookup.MovieId']"}),
|
||||
'oxdb': ('django.db.models.fields.files.ImageField', [], {'max_length': '255'}),
|
||||
'poster': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['poster.PosterCache']", 'blank': 'True'}),
|
||||
'upload': ('django.db.models.fields.files.ImageField', [], {'max_length': '255'})
|
||||
},
|
||||
'poster.postercache': {
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'failed': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '255'}),
|
||||
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'movie_id': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'postercache'", 'to': "orm['lookup.MovieId']"}),
|
||||
'site': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||
'site_id': ('django.db.models.fields.CharField', [], {'max_length': '42'}),
|
||||
'url': ('django.db.models.fields.CharField', [], {'max_length': '1024'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['poster']
|
||||
0
oxdata/poster/migrations/__init__.py
Normal file
0
oxdata/poster/migrations/__init__.py
Normal file
120
oxdata/poster/models.py
Normal file
120
oxdata/poster/models.py
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
import os.path
|
||||
import hashlib
|
||||
|
||||
from django.db import models
|
||||
from django.db.models import Q
|
||||
from django.contrib.auth.models import User
|
||||
from django.core.files.base import ContentFile
|
||||
|
||||
import oxweb.criterion
|
||||
import oxweb.movieposterdb
|
||||
import oxweb.karagarga
|
||||
import oxweb.imdb
|
||||
import oxweb.impawards
|
||||
|
||||
from oxdata.lookup.models import MovieId, Karagarga
|
||||
|
||||
def getPosters(movie_id):
|
||||
getPosterUrls(movie_id)
|
||||
posters = {}
|
||||
for p in PosterCache.objects.all().filter(movie_id=movie_id):
|
||||
if p.site not in posters:
|
||||
posters[p.site] = []
|
||||
poster = p.get()
|
||||
if poster:
|
||||
pjson = {}
|
||||
pjson['url'] = poster._get_url()
|
||||
pjson['width'] = poster.width
|
||||
pjson['height'] = poster.height
|
||||
posters[p.site].append(pjson)
|
||||
for p in posters:
|
||||
if not posters[p]:
|
||||
del posters[p]
|
||||
return posters
|
||||
|
||||
def poster_path(url, filename):
|
||||
url_hash = hashlib.sha1(url).hexdigest()
|
||||
ext = 'jpg'
|
||||
if filename.endswith('.png'):
|
||||
ext = 'png'
|
||||
name = "%s.%s" % (url_hash, ext)
|
||||
return os.path.join('posters', url_hash[:2], url_hash[2:4], url_hash[4:6], name)
|
||||
|
||||
class PosterCache(models.Model):
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
modified = models.DateTimeField(auto_now=True)
|
||||
|
||||
movie_id = models.ForeignKey(MovieId, related_name='postercache')
|
||||
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=lambda i, f: poster_path(i.url, f))
|
||||
failed = models.BooleanField(default=False)
|
||||
|
||||
def get(self):
|
||||
if not self.image and not self.failed:
|
||||
try:
|
||||
import oxlib.net
|
||||
name = hashlib.sha1(self.url).hexdigest()
|
||||
data = oxlib.net.getUrl(self.url)
|
||||
self.image.save(name, ContentFile(data))
|
||||
except:
|
||||
self.failed = True
|
||||
self.save()
|
||||
return self.image
|
||||
|
||||
|
||||
class Poster(models.Model):
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
modified = models.DateTimeField(auto_now=True)
|
||||
|
||||
movie_id = models.ForeignKey(MovieId, related_name='poster')
|
||||
poster = models.ForeignKey(PosterCache, default=None, blank=True)
|
||||
upload = models.ImageField(max_length=255, upload_to=lambda i, f: poster_path('upload/%s' % i.id, f))
|
||||
oxdb = models.ImageField(max_length=255, upload_to=lambda i, f: poster_path('oxdb/%s' % i.id, f))
|
||||
|
||||
def get(self):
|
||||
if self.image:
|
||||
return self.image
|
||||
if self.poster:
|
||||
return self.poster.get()
|
||||
#FIXME: select poster
|
||||
return None
|
||||
|
||||
def getPosterUrls(m):
|
||||
def addPoster(url, site, site_id):
|
||||
if PosterCache.objects.all().filter(url=url).count() == 0:
|
||||
p = PosterCache(url=url, site=site, site_id=site_id, movie_id=m)
|
||||
p.save()
|
||||
|
||||
if m.imdb_id:
|
||||
poster = oxweb.imdb.getMoviePoster(m.imdb_id)
|
||||
if poster:
|
||||
addPoster(poster, 'imdb.com', m.imdb_id)
|
||||
for poster in oxweb.movieposterdb.getData(m.imdb_id)['posters']:
|
||||
addPoster(poster, 'movieposterdb.com', m.imdb_id)
|
||||
if m.criterion_id:
|
||||
print 'criterion', m.criterion_id
|
||||
for poster in oxweb.criterion.getData(m.criterion_id)['posters']:
|
||||
addPoster(poster, 'criterion.com', m.criterion_id)
|
||||
if m.wikipedia_id:
|
||||
poster = oxweb.wikipedia.getPosterUrl(m.wikipedia_id)
|
||||
if poster:
|
||||
if PosterCache.objects.all().filter(url=poster).count() == 0:
|
||||
addPoster(poster, 'wikipedia.org', m.wikipedia_id)
|
||||
if m.impawards_id:
|
||||
data = oxweb.impawards.getData(m.impawards_id)
|
||||
if data and 'imdbId' in data:
|
||||
for poster in data['posters']:
|
||||
addPoster(poster, 'impawards.com', m.imdb_id)
|
||||
|
||||
for kg in Karagarga.objects.all().filter(movie_id=m):
|
||||
data = oxweb.karagarga.getData(kg.karagarga_id)
|
||||
if data:
|
||||
for poster in data['posters']:
|
||||
addPoster(poster, 'karagarga.net', kg.karagarga_id)
|
||||
else:
|
||||
kg.delete()
|
||||
|
||||
7
oxdata/poster/urls.py
Normal file
7
oxdata/poster/urls.py
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
from django.conf.urls.defaults import *
|
||||
|
||||
urlpatterns = patterns('oxdata.poster.views',
|
||||
(r'^$', 'poster'),
|
||||
(r'^json$', 'poster_json'),
|
||||
)
|
||||
|
||||
36
oxdata/poster/views.py
Normal file
36
oxdata/poster/views.py
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
import os.path
|
||||
from django.db import models
|
||||
from django.db.models import Q
|
||||
from django.contrib.auth.models import User
|
||||
from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404
|
||||
from django.template import RequestContext
|
||||
|
||||
from oxdata.utils.shortcuts import render_to_json_response
|
||||
from oxdata.lookup.models import MovieId
|
||||
|
||||
import models
|
||||
|
||||
def poster(request):
|
||||
#FIXME: get MovieId from provided id and redirect to poster url
|
||||
if 'imdb' in request.GET:
|
||||
imdbId = request.GET['imdb']
|
||||
movie_id = MovieId.objects.get(imdb_id=imdbId)
|
||||
elif 'oxdb' in request.GET:
|
||||
oxdbId = request.GET['oxdb']
|
||||
movie_id = MovieId.objects.get(oxdb_id=oxdbId)
|
||||
context = RequestContext(request, {'imdb': imdbId})
|
||||
return render_to_response('poster.html', context)
|
||||
|
||||
def poster_json(request):
|
||||
#FIXME: get MovieId from provided id and redirect to poster url
|
||||
if 'imdb' in request.GET:
|
||||
imdbId = request.GET['imdb']
|
||||
movie_id = MovieId.objects.get(imdb_id=imdbId)
|
||||
elif 'oxdb' in request.GET:
|
||||
oxdbId = request.GET['oxdb']
|
||||
movie_id = MovieId.objects.get(oxdb_id=oxdbId)
|
||||
json = models.getPosters(movie_id)
|
||||
return render_to_json_response(json)
|
||||
|
||||
118
oxdata/settings.py
Normal file
118
oxdata/settings.py
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
# Django settings for oxdata project.
|
||||
import os
|
||||
from os.path import join
|
||||
|
||||
PROJECT_ROOT = os.path.normpath(os.path.dirname(__file__))
|
||||
|
||||
DEBUG = True
|
||||
TEMPLATE_DEBUG = DEBUG
|
||||
|
||||
ADMINS = (
|
||||
# ('Your Name', 'your_email@domain.com'),
|
||||
)
|
||||
|
||||
MANAGERS = ADMINS
|
||||
|
||||
DATABASE_ENGINE = 'sqlite3' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
|
||||
DATABASE_NAME = 'dev.sqlite' # Or path to database file if using sqlite3.
|
||||
DATABASE_USER = '' # Not used with sqlite3.
|
||||
DATABASE_PASSWORD = '' # Not used with sqlite3.
|
||||
DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3.
|
||||
DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3.
|
||||
|
||||
# Local time zone for this installation. Choices can be found here:
|
||||
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
|
||||
# although not all choices may be available on all operating systems.
|
||||
# If running in a Windows environment this must be set to the same as your
|
||||
# system time zone.
|
||||
TIME_ZONE = 'Europe/Berlin'
|
||||
|
||||
# Language code for this installation. All choices can be found here:
|
||||
# http://www.i18nguy.com/unicode/language-identifiers.html
|
||||
LANGUAGE_CODE = 'en-us'
|
||||
|
||||
SITE_ID = 1
|
||||
|
||||
# If you set this to False, Django will make some optimizations so as not
|
||||
# to load the internationalization machinery.
|
||||
USE_I18N = True
|
||||
|
||||
# Absolute path to the directory that holds media.
|
||||
# Example: "/home/media/media.lawrence.com/"
|
||||
MEDIA_ROOT = join(PROJECT_ROOT, 'media')
|
||||
STATIC_ROOT = join(PROJECT_ROOT, 'static')
|
||||
DATA_ROOT = join(PROJECT_ROOT, 'data')
|
||||
CACHE_ROOT = join(PROJECT_ROOT, 'cache')
|
||||
|
||||
os.environ['oxCACHE'] = CACHE_ROOT
|
||||
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||
# trailing slash if there is a path component (optional in other cases).
|
||||
# Examples: "http://media.lawrence.com", "http://example.com/media/"
|
||||
MEDIA_URL = '/media/'
|
||||
|
||||
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
|
||||
# trailing slash.
|
||||
# Examples: "http://foo.com/media/", "/media/".
|
||||
ADMIN_MEDIA_PREFIX = '/admin/media/'
|
||||
|
||||
# List of callables that know how to import templates from various sources.
|
||||
TEMPLATE_LOADERS = (
|
||||
'django.template.loaders.filesystem.load_template_source',
|
||||
'django.template.loaders.app_directories.load_template_source',
|
||||
# 'django.template.loaders.eggs.load_template_source',
|
||||
)
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
)
|
||||
|
||||
ROOT_URLCONF = 'oxdata.urls'
|
||||
|
||||
TEMPLATE_DIRS = (
|
||||
join(PROJECT_ROOT, 'templates'),
|
||||
)
|
||||
|
||||
INSTALLED_APPS = (
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.sites',
|
||||
'django.contrib.admin',
|
||||
'django.contrib.humanize',
|
||||
'south',
|
||||
|
||||
'oxdata.lookup',
|
||||
'oxdata.poster',
|
||||
)
|
||||
|
||||
LOGIN_REDIRECT_URL='/'
|
||||
|
||||
#overwrite default settings with local settings
|
||||
try:
|
||||
from local_settings import *
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
# Make this unique, creates random key first at first time.
|
||||
try:
|
||||
SECRET_KEY
|
||||
except NameError:
|
||||
SECRET_FILE = os.path.join(PROJECT_ROOT, 'secret.txt')
|
||||
try:
|
||||
SECRET_KEY = open(SECRET_FILE).read().strip()
|
||||
except IOError:
|
||||
try:
|
||||
from random import choice
|
||||
SECRET_KEY = ''.join([choice('abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)])
|
||||
secret = file(SECRET_FILE, 'w')
|
||||
secret.write(SECRET_KEY)
|
||||
secret.close()
|
||||
except IOError:
|
||||
Exception('Please create a %s file with random characters to generate your secret key!' % SECRET_FILE)
|
||||
|
||||
19
oxdata/static/js/jquery.js
vendored
Normal file
19
oxdata/static/js/jquery.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
oxdata/templates/admin/base_site.html
Normal file
10
oxdata/templates/admin/base_site.html
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{% extends "admin/base.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{{ title }} | data.0xdb.org{% endblock %}
|
||||
|
||||
{% block branding %}
|
||||
<h1 id="site-name">data.0xdb.org</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block nav-global %}{% endblock %}
|
||||
1
oxdata/templates/index.html
Normal file
1
oxdata/templates/index.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
|
||||
41
oxdata/templates/poster.html
Normal file
41
oxdata/templates/poster.html
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<script src="/static/js/jquery.js"></script>
|
||||
<script>
|
||||
$(function(){
|
||||
$.getJSON('/poster/json?imdb={{ imdb }}', function(posters) {
|
||||
$("#loading").hide();
|
||||
$.each(posters, function(key, urls) {
|
||||
var id = 'row' + key.replace('.', '_');
|
||||
var row = '<tr id="'+id+'">';
|
||||
row += '<td id="'+id+'_title" valign="top">' + key + '</td>';
|
||||
row += '<td>';
|
||||
$.each(urls, function(i, poster) {
|
||||
row += '<div style="float: left; height: 280px;padding-right: 4px;"><img src="'+poster.url+'" height="256">';
|
||||
row += '<div>' + poster.width + 'x'+ poster.height + '</div></div>';
|
||||
});
|
||||
row += '</td>';
|
||||
row += '</tr>';
|
||||
$("#posters").append(row);
|
||||
$('#'+id+'_title').click(function() {
|
||||
$('#'+id+' img, #'+id+' div').toggleClass("hide");
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="loading">loading...</div>
|
||||
<table id="posters">
|
||||
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
25
oxdata/urls.py
Normal file
25
oxdata/urls.py
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
from django.conf.urls.defaults import *
|
||||
from django.conf import settings
|
||||
|
||||
# Uncomment the next two lines to enable the admin:
|
||||
from django.contrib import admin
|
||||
admin.autodiscover()
|
||||
|
||||
urlpatterns = patterns('',
|
||||
(r'^$', 'oxdata.views.index'),
|
||||
(r'^poster/', include('oxdata.poster.urls')),
|
||||
(r'^id/', include('oxdata.lookup.urls')),
|
||||
|
||||
# Uncomment the next line to enable the admin:
|
||||
(r'^admin/(.*)', admin.site.root),
|
||||
)
|
||||
|
||||
if settings.DEBUG:
|
||||
urlpatterns += patterns('',
|
||||
(r'^media/(?P<path>.*)$', 'django.views.static.serve',
|
||||
{'document_root': settings.MEDIA_ROOT}),
|
||||
(r'^static/(?P<path>.*)$', 'django.views.static.serve',
|
||||
{'document_root': settings.STATIC_ROOT}),
|
||||
)
|
||||
|
||||
|
||||
0
oxdata/utils/__init__.py
Normal file
0
oxdata/utils/__init__.py
Normal file
113
oxdata/utils/monitor.py
Normal file
113
oxdata/utils/monitor.py
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import signal
|
||||
import threading
|
||||
import atexit
|
||||
import Queue
|
||||
|
||||
_interval = 1.0
|
||||
_times = {}
|
||||
_files = []
|
||||
|
||||
_running = False
|
||||
_queue = Queue.Queue()
|
||||
_lock = threading.Lock()
|
||||
|
||||
def _restart(path):
|
||||
_queue.put(True)
|
||||
prefix = 'monitor (pid=%d):' % os.getpid()
|
||||
print >> sys.stderr, '%s Change detected to \'%s\'.' % (prefix, path)
|
||||
print >> sys.stderr, '%s Triggering process restart.' % prefix
|
||||
os.kill(os.getpid(), signal.SIGINT)
|
||||
|
||||
def _modified(path):
|
||||
try:
|
||||
# If path doesn't denote a file and were previously
|
||||
# tracking it, then it has been removed or the file type
|
||||
# has changed so force a restart. If not previously
|
||||
# tracking the file then we can ignore it as probably
|
||||
# pseudo reference such as when file extracted from a
|
||||
# collection of modules contained in a zip file.
|
||||
|
||||
if not os.path.isfile(path):
|
||||
return path in _times
|
||||
|
||||
# Check for when file last modified.
|
||||
|
||||
mtime = os.stat(path).st_mtime
|
||||
if path not in _times:
|
||||
_times[path] = mtime
|
||||
|
||||
# Force restart when modification time has changed, even
|
||||
# if time now older, as that could indicate older file
|
||||
# has been restored.
|
||||
|
||||
if mtime != _times[path]:
|
||||
return True
|
||||
except:
|
||||
# If any exception occured, likely that file has been
|
||||
# been removed just before stat(), so force a restart.
|
||||
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def _monitor():
|
||||
while 1:
|
||||
# Check modification times on all files in sys.modules.
|
||||
|
||||
for module in sys.modules.values():
|
||||
if not hasattr(module, '__file__'):
|
||||
continue
|
||||
path = getattr(module, '__file__')
|
||||
if not path:
|
||||
continue
|
||||
if os.path.splitext(path)[1] in ['.pyc', '.pyo', '.pyd']:
|
||||
path = path[:-1]
|
||||
if _modified(path):
|
||||
return _restart(path)
|
||||
|
||||
# Check modification times on files which have
|
||||
# specifically been registered for monitoring.
|
||||
|
||||
for path in _files:
|
||||
if _modified(path):
|
||||
return _restart(path)
|
||||
|
||||
# Go to sleep for specified interval.
|
||||
|
||||
try:
|
||||
return _queue.get(timeout=_interval)
|
||||
except:
|
||||
pass
|
||||
|
||||
_thread = threading.Thread(target=_monitor)
|
||||
_thread.setDaemon(True)
|
||||
|
||||
def _exiting():
|
||||
try:
|
||||
_queue.put(True)
|
||||
except:
|
||||
pass
|
||||
_thread.join()
|
||||
|
||||
atexit.register(_exiting)
|
||||
|
||||
def track(path):
|
||||
if not path in _files:
|
||||
_files.append(path)
|
||||
|
||||
def start(interval=1.0):
|
||||
global _interval
|
||||
if interval < _interval:
|
||||
_interval = interval
|
||||
|
||||
global _running
|
||||
_lock.acquire()
|
||||
if not _running:
|
||||
_running = True
|
||||
_thread.start()
|
||||
_lock.release()
|
||||
9
oxdata/utils/shortcuts.py
Normal file
9
oxdata/utils/shortcuts.py
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
|
||||
from django.http import HttpResponse
|
||||
from django.utils import simplejson
|
||||
|
||||
def render_to_json_response(dictionary, content_type="text/json"):
|
||||
return HttpResponse(simplejson.dumps(dictionary), content_type=content_type)
|
||||
|
||||
10
oxdata/views.py
Normal file
10
oxdata/views.py
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vi:si:et:sw=4:sts=4:ts=4
|
||||
from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404
|
||||
from django.template import RequestContext
|
||||
|
||||
|
||||
def index(request):
|
||||
context = RequestContext(request, {})
|
||||
return render_to_response('index.html', context)
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue