oxdata/oxdata/lookup/models.py

242 lines
8.8 KiB
Python

# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
import os
from urllib import quote
from django.db import models
import ox
from ox.normalize import canonical_name
import ox.web.archive
import ox.web.imdb
import ox.web.wikipedia
import ox.web.allmovie
from modules import get_info
oxdb_api = ox.API('https://0xdb.org/api/')
def oxdb_sortnames(names):
try:
sort_names = oxdb_api.sortName(names=names)['data'].values()
except:
sort_names = map(canonical_name, names)
return sort_names
def get_movie_id(imdb_id):
#movies moved in imdb
imdb_id = {
'0377059': '0343663',
'0426560': '0088000',
}.get(imdb_id, imdb_id)
m, created = MovieId.objects.get_or_create(imdb_id=imdb_id)
if created:
m = MovieId.objects.get(imdb_id=imdb_id)
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)
archiveorg_id = models.CharField(unique=True, max_length=255, 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 u'%s (%s)' % (self.title, id)
def updateFromWikipedia(self):
if self.wikipedia_id:
wikipedia_url = ox.web.wikipedia.get_url(self.wikipedia_id)
data = ox.web.wikipedia.get_movie_data(wikipedia_url)
_key = {}
for key in ('imdb_id', 'amg_id', 'archiveorg_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 = ox.web.imdb.ImdbCombined(self.imdb_id)
for key in ('title', 'year', 'seriesTitle', 'episodeTitle', 'season', 'episode'):
if key in data and data[key]:
setattr(self, {
'seriesTitle': 'series_title',
'episodeTitle': 'episode_title',
}.get(key, key), data.get(key, ''))
directors = data.get('director', [])
self.director = u', '.join(directors)
if not self.wikipedia_id:
self.wikipedia_id = ox.web.wikipedia.get_id(ox.web.wikipedia.get_url(imdb=self.imdb_id))
if not self.wikipedia_id:
self.wikipedia_id=None
#ignore wikipedia id if already used by another movie,
#its most likely wrong for both in that case
elif MovieId.objects.filter(wikipedia_id=self.wikipedia_id).count() >= 1:
self.wikipedia_id=None
#if not self.oxdb_id:
# self.gen_oxdb_id()
self.save()
if self.imdb_id:
from movie.models import Imdb
m, created = Imdb.objects.get_or_create(imdb=self.imdb_id)
m.update()
def gen_oxdb_id(self):
self.oxdb_id = ox.get_oxid(
self.title,
self.director,
self.year or '',
self.season or '',
self.episode or '',
self.episode_title or '',
self.episode_director or [],
self.episode_yeaer or '')
def suggested_name(self):
return os.path.splitext(os.path.basename(self.format_path()))[0]
def suggested_path(self):
path = self.format_path()
path = os.path.dirname(path)
return os.path.join(path[0], path)
def format_path(self):
info = {}
for key in ('season', 'episode', 'isEpisode',
'version', 'language', 'part', 'partTitle'):
if not key in info:
info[key] = None
for key in ('title', 'year'):
info[key] = getattr(self, key)
if self.series_title:
info['seriesTitle'] = self.series_title
info['type'] = 'video'
info['extension'] = 'avi'
if not self.director:
info['director'] = info['directorSort'] = ['Unknown Director']
else:
info['director'] = self.director.split(', ')
info['directorSort'] = oxdb_sortnames(info['director'])
return ox.movie.format_path(info)
def links(self):
links = []
if self.imdb_id:
links.append({
'source': 'IMDb',
'url': ox.web.imdb.get_url(self.imdb_id)
})
if self.wikipedia_id:
links.append({
'source': 'Wikipedia',
'url': ox.web.wikipedia.get_url(self.wikipedia_id).replace('http://', 'https://')
})
if self.criterion_id:
links.append({
'source': 'Criterion',
'url': ox.web.criterion.get_url(self.criterion_id)
})
if self.archiveorg_id:
links.append({
'source': 'Internet Archive',
'url': ox.web.archive.get_url(self.archiveorg_id).replace('http://', 'https://')
})
qs = u'"%s (%s)"'%(self.title, self.year)
links.append({
'source': 'Google',
'url': 'https://google.com/search?q=%s' % quote(qs.encode('utf-8'))
})
return links
def info(self, key):
return get_info(self, key)
def json(self, prefix):
from poster.models import getPosters
json = {}
json['imdb.com'] = {}
for key in [
'title',
'director',
'year',
'imdb_id',
]:
value = getattr(self, key)
if value:
json['imdb.com'][{'imdb_id': 'id'}.get(key, key)] = value
json['imdb.com']['url'] = ox.web.imdb.get_url(self.imdb_id)
if self.amg_id:
json['allmovie.com'] = {
'id': self.amg_id,
'url': ox.web.allmovie.get_url(self.amg_id)
}
if self.wikipedia_id:
json['wikipedia.org'] = {
'id': self.wikipedia_id,
'url': ox.web.wikipedia.get_url(self.wikipedia_id)
}
if self.criterion_id:
json['criterion.com'] = {
'id': self.criterion_id,
'url': ox.web.criterion.get_url(self.criterion_id)
}
if self.impawards_id:
json['impawards.com'] = {
'id': self.impawards_id,
'url': ox.web.impawards.get_url(self.impawards_id)
}
if self.archiveorg_id:
json['archive.org'] = {
'id': self.archiveorg_id,
'url': ox.web.archive.get_url(self.archiveorg_id)
}
if self.episode > -1:
keys = ['episode', 'season', 'episode_title', 'series_title']
for key in keys:
value = getattr(self, key)
if value:
json['imdb.com'][key] = value
if 'director' in json['imdb.com']:
json['imdb.com']['directors'] = json['imdb.com'].pop('director').split(', ')
if 'year' in json['imdb.com'] and json['imdb.com']['year']:
json['imdb.com']['year'] = int(json['imdb.com']['year'])
json['0xdb.org'] = {}
json['0xdb.org']['suggested_name'] = self.suggested_name()
json['0xdb.org']['suggested_path'] = self.suggested_path()
posters = getPosters(self, prefix)
for key in posters:
if not key in json:
json[key] = {}
json[key]['posters'] = posters[key]
return json