242 lines
8.8 KiB
Python
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
|
|
|