- simplify metadata db structure

- better sort values if field is empty
- switch to python-ox, faster imdb import
- move files backend into own app
This commit is contained in:
j 2010-07-12 16:56:14 +02:00
commit 9defcd3c9f
16 changed files with 1493 additions and 914 deletions

View file

@ -3,41 +3,27 @@
from django.contrib import admin
from forms import FileAdminForm, MovieAdminForm, ArchiveFileAdminForm
#from forms import FileAdminForm, MovieAdminForm, ArchiveFileAdminForm
import models
'''
#class MovieImdbAdmin(admin.ModelAdmin):
# search_fields = ['imdbId', 'title']
#admin.site.register(models.MovieImdb, MovieImdbAdmin)
class MovieImdbInline(admin.StackedInline):
model = models.MovieImdb
class MovieOxdbInline(admin.StackedInline):
model = models.MovieOxdb
'''
class MovieAdmin(admin.ModelAdmin):
search_fields = ['movieId', 'imdb__title', 'oxdb__title']
form = MovieAdminForm
#form = MovieAdminForm
#inlines = [MovieImdbInline, MovieOxdbInline]
admin.site.register(models.Movie, MovieAdmin)
class FileAdmin(admin.ModelAdmin):
search_fields = ['path', 'video_codec']
form = FileAdminForm
admin.site.register(models.File, FileAdmin)
class ArchiveFileAdmin(admin.ModelAdmin):
search_fields = ['path', 'archive__name']
form = ArchiveFileAdminForm
admin.site.register(models.ArchiveFile, ArchiveFileAdmin)
class ArchiveAdmin(admin.ModelAdmin):
search_fields = ['name']
admin.site.register(models.Archive, ArchiveAdmin)

View file

@ -10,7 +10,7 @@ ajax_filtered_js = (
settings.STATIC_URL + 'js/jquery/jquery.js',
settings.STATIC_URL + 'js/ajax_filtered_fields.js',
)
"""
class FileAdminForm(forms.ModelForm):
movie = ForeignKeyByLetter(models.Movie, field_name='imdb__title')
@ -39,4 +39,4 @@ class MovieAdminForm(forms.ModelForm):
class Media:
js = ajax_filtered_js
"""

View file

@ -46,7 +46,7 @@ class MovieManager(Manager):
query: {
conditions: [
{
value: "war""
value: "war"
}
{
key: "year",
@ -59,10 +59,10 @@ class MovieManager(Manager):
operator: "^"
}
],
operator: "&"
operator: ","
}
'''
query_operator = data['query'].get('operator', '&')
query_operator = data['query'].get('operator', ',')
conditions = []
for condition in data['query']['conditions']:
k = condition.get('key', 'all')

View file

@ -0,0 +1,647 @@
# -*- coding: utf-8 -*-
from south.db import db
from django.db import models
from backend.models import *
class Migration:
def forwards(self, orm):
# Deleting unique_together for [imdb] on movie.
db.delete_unique('backend_movie', ['imdb_id'])
# Adding model 'Facet'
db.create_table('backend_facet', (
('id', orm['backend.facet:id']),
('movie', orm['backend.facet:movie']),
('key', orm['backend.facet:key']),
('value', orm['backend.facet:value']),
('value_sort', orm['backend.facet:value_sort']),
))
db.send_create_signal('backend', ['Facet'])
# Adding field 'Movie.metadata'
db.add_column('backend_movie', 'metadata', orm['backend.movie:metadata'])
# Adding field 'MovieSort.director_desc'
db.add_column('backend_moviesort', 'director_desc', orm['backend.moviesort:director_desc'])
# Adding field 'MovieSort.writer_desc'
db.add_column('backend_moviesort', 'writer_desc', orm['backend.moviesort:writer_desc'])
# Adding field 'MovieSort.country_desc'
db.add_column('backend_moviesort', 'country_desc', orm['backend.moviesort:country_desc'])
# Adding field 'MovieFind.location'
db.add_column('backend_moviefind', 'location', orm['backend.moviefind:location'])
# Adding field 'MovieFind.actor'
db.add_column('backend_moviefind', 'actor', orm['backend.moviefind:actor'])
# Adding field 'MovieSort.producer_desc'
db.add_column('backend_moviesort', 'producer_desc', orm['backend.moviesort:producer_desc'])
# Adding field 'MovieSort.cinematographer_desc'
db.add_column('backend_moviesort', 'cinematographer_desc', orm['backend.moviesort:cinematographer_desc'])
# Adding field 'MovieSort.title_desc'
db.add_column('backend_moviesort', 'title_desc', orm['backend.moviesort:title_desc'])
# Adding field 'MovieSort.language_desc'
db.add_column('backend_moviesort', 'language_desc', orm['backend.moviesort:language_desc'])
# Adding field 'MovieSort.year_desc'
db.add_column('backend_moviesort', 'year_desc', orm['backend.moviesort:year_desc'])
# Adding field 'MovieFind.character'
db.add_column('backend_moviefind', 'character', orm['backend.moviefind:character'])
# Adding field 'MovieSort.editor_desc'
db.add_column('backend_moviesort', 'editor_desc', orm['backend.moviesort:editor_desc'])
# Adding field 'MovieFind.keyword'
db.add_column('backend_moviefind', 'keyword', orm['backend.moviefind:keyword'])
# Deleting field 'Movie.extra'
db.delete_column('backend_movie', 'extra_id')
# Deleting field 'MovieFind.cast'
db.delete_column('backend_moviefind', 'cast')
# Dropping ManyToManyField 'Person.movies'
db.delete_table('backend_person_movies')
# Deleting field 'Movie.oxdb'
db.delete_column('backend_movie', 'oxdb_id')
# Deleting field 'MovieFind.keywords'
db.delete_column('backend_moviefind', 'keywords')
# Deleting field 'MovieFind.locations'
db.delete_column('backend_moviefind', 'locations')
# Deleting model 'movieoxdb'
db.delete_table('backend_movieoxdb')
# Deleting model 'review'
db.delete_table('backend_review')
# Deleting model 'archive'
db.delete_table('backend_archive')
# Deleting model 'alternativetitle'
db.delete_table('backend_alternativetitle')
# Deleting model 'moviecountry'
db.delete_table('backend_moviecountry')
# Deleting model 'trivia'
db.delete_table('backend_trivia')
# Deleting model 'connection'
db.delete_table('backend_connection')
# Deleting model 'cast'
db.delete_table('backend_cast')
# Deleting model 'frame'
db.delete_table('backend_frame')
# Deleting model 'movielanguage'
db.delete_table('backend_movielanguage')
# Deleting model 'file'
db.delete_table('backend_file')
# Deleting model 'movieimdb'
db.delete_table('backend_movieimdb')
# Deleting model 'country'
db.delete_table('backend_country')
# Deleting model 'archivefile'
db.delete_table('backend_archivefile')
# Deleting model 'movieextra'
db.delete_table('backend_movieextra')
# Deleting model 'language'
db.delete_table('backend_language')
# Deleting model 'keyword'
db.delete_table('backend_keyword')
# Deleting model 'genre'
db.delete_table('backend_genre')
# Changing field 'Movie.imdb'
# (to signature: fields.DictField(default={}, editable=False))
db.alter_column('backend_movie', 'imdb', orm['backend.movie:imdb'])
def backwards(self, orm):
# Deleting model 'Facet'
db.delete_table('backend_facet')
# Deleting field 'Movie.metadata'
db.delete_column('backend_movie', 'metadata')
# Deleting field 'MovieSort.director_desc'
db.delete_column('backend_moviesort', 'director_desc')
# Deleting field 'MovieSort.writer_desc'
db.delete_column('backend_moviesort', 'writer_desc')
# Deleting field 'MovieSort.country_desc'
db.delete_column('backend_moviesort', 'country_desc')
# Deleting field 'MovieFind.location'
db.delete_column('backend_moviefind', 'location')
# Deleting field 'MovieFind.actor'
db.delete_column('backend_moviefind', 'actor')
# Deleting field 'MovieSort.producer_desc'
db.delete_column('backend_moviesort', 'producer_desc')
# Deleting field 'MovieSort.cinematographer_desc'
db.delete_column('backend_moviesort', 'cinematographer_desc')
# Deleting field 'MovieSort.title_desc'
db.delete_column('backend_moviesort', 'title_desc')
# Deleting field 'MovieSort.language_desc'
db.delete_column('backend_moviesort', 'language_desc')
# Deleting field 'MovieSort.year_desc'
db.delete_column('backend_moviesort', 'year_desc')
# Deleting field 'MovieFind.character'
db.delete_column('backend_moviefind', 'character')
# Deleting field 'MovieSort.editor_desc'
db.delete_column('backend_moviesort', 'editor_desc')
# Deleting field 'MovieFind.keyword'
db.delete_column('backend_moviefind', 'keyword')
# Adding field 'Movie.extra'
db.add_column('backend_movie', 'extra', orm['backend.movie:extra'])
# Adding field 'MovieFind.cast'
db.add_column('backend_moviefind', 'cast', orm['backend.moviefind:cast'])
# Adding ManyToManyField 'Person.movies'
db.create_table('backend_person_movies', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('person', models.ForeignKey(orm.Person, null=False)),
('movie', models.ForeignKey(orm.movie, null=False))
))
# Adding field 'Movie.oxdb'
db.add_column('backend_movie', 'oxdb', orm['backend.movie:oxdb'])
# Adding field 'MovieFind.keywords'
db.add_column('backend_moviefind', 'keywords', orm['backend.moviefind:keywords'])
# Adding field 'MovieFind.locations'
db.add_column('backend_moviefind', 'locations', orm['backend.moviefind:locations'])
# Adding model 'movieoxdb'
db.create_table('backend_movieoxdb', (
('series_title', orm['backend.moviefind:series_title']),
('gross', orm['backend.moviefind:gross']),
('votes', orm['backend.moviefind:votes']),
('episode', orm['backend.moviefind:episode']),
('created', orm['backend.moviefind:created']),
('profit', orm['backend.moviefind:profit']),
('season', orm['backend.moviefind:season']),
('plot', orm['backend.moviefind:plot']),
('rating', orm['backend.moviefind:rating']),
('year', orm['backend.moviefind:year']),
('budget', orm['backend.moviefind:budget']),
('modified', orm['backend.moviefind:modified']),
('episode_title', orm['backend.moviefind:episode_title']),
('series_imdb', orm['backend.moviefind:series_imdb']),
('tagline', orm['backend.moviefind:tagline']),
('title', orm['backend.moviefind:title']),
('runtime', orm['backend.moviefind:runtime']),
('release_date', orm['backend.moviefind:release_date']),
('id', orm['backend.moviefind:id']),
('plot_outline', orm['backend.moviefind:plot_outline']),
))
db.send_create_signal('backend', ['movieoxdb'])
# Adding model 'review'
db.create_table('backend_review', (
('title', orm['backend.moviefind:title']),
('url', orm['backend.moviefind:url']),
('movie', orm['backend.moviefind:movie']),
('manual', orm['backend.moviefind:manual']),
('id', orm['backend.moviefind:id']),
))
db.send_create_signal('backend', ['review'])
# Adding model 'archive'
db.create_table('backend_archive', (
('users', orm['backend.moviefind:users']),
('created', orm['backend.moviefind:created']),
('modified', orm['backend.moviefind:modified']),
('id', orm['backend.moviefind:id']),
('public', orm['backend.moviefind:public']),
('name', orm['backend.moviefind:name']),
))
db.send_create_signal('backend', ['archive'])
# Adding model 'alternativetitle'
db.create_table('backend_alternativetitle', (
('title', orm['backend.moviefind:title']),
('movie', orm['backend.moviefind:movie']),
('manual', orm['backend.moviefind:manual']),
('type', orm['backend.moviefind:type']),
('id', orm['backend.moviefind:id']),
))
db.send_create_signal('backend', ['alternativetitle'])
# Adding model 'moviecountry'
db.create_table('backend_moviecountry', (
('country', orm['backend.moviefind:country']),
('manual', orm['backend.moviefind:manual']),
('movie', orm['backend.moviefind:movie']),
('position', orm['backend.moviefind:position']),
('id', orm['backend.moviefind:id']),
))
db.send_create_signal('backend', ['moviecountry'])
# Adding model 'trivia'
db.create_table('backend_trivia', (
('movie', orm['backend.moviefind:movie']),
('manual', orm['backend.moviefind:manual']),
('position', orm['backend.moviefind:position']),
('trivia', orm['backend.moviefind:trivia']),
('id', orm['backend.moviefind:id']),
))
db.send_create_signal('backend', ['trivia'])
# Adding model 'connection'
db.create_table('backend_connection', (
('object', orm['backend.moviefind:object']),
('manual', orm['backend.moviefind:manual']),
('relation', orm['backend.moviefind:relation']),
('id', orm['backend.moviefind:id']),
('subject', orm['backend.moviefind:subject']),
))
db.send_create_signal('backend', ['connection'])
# Adding model 'cast'
db.create_table('backend_cast', (
('character', orm['backend.moviefind:character']),
('manual', orm['backend.moviefind:manual']),
('person', orm['backend.moviefind:person']),
('role', orm['backend.moviefind:role']),
('movie', orm['backend.moviefind:movie']),
('position', orm['backend.moviefind:position']),
('id', orm['backend.moviefind:id']),
))
db.send_create_signal('backend', ['cast'])
# Adding model 'frame'
db.create_table('backend_frame', (
('created', orm['backend.moviefind:created']),
('frame', orm['backend.moviefind:frame']),
('modified', orm['backend.moviefind:modified']),
('file', orm['backend.moviefind:file']),
('position', orm['backend.moviefind:position']),
('id', orm['backend.moviefind:id']),
))
db.send_create_signal('backend', ['frame'])
# Adding model 'movielanguage'
db.create_table('backend_movielanguage', (
('language', orm['backend.moviefind:language']),
('movie', orm['backend.moviefind:movie']),
('manual', orm['backend.moviefind:manual']),
('position', orm['backend.moviefind:position']),
('id', orm['backend.moviefind:id']),
))
db.send_create_signal('backend', ['movielanguage'])
# Adding model 'file'
db.create_table('backend_file', (
('available', orm['backend.moviefind:available']),
('needs_data', orm['backend.moviefind:needs_data']),
('pixel_aspect_ratio', orm['backend.moviefind:pixel_aspect_ratio']),
('stream_high', orm['backend.moviefind:stream_high']),
('pixel_format', orm['backend.moviefind:pixel_format']),
('oshash', orm['backend.moviefind:oshash']),
('stream_low', orm['backend.moviefind:stream_low']),
('height', orm['backend.moviefind:height']),
('channels', orm['backend.moviefind:channels']),
('part', orm['backend.moviefind:part']),
('display_aspect_ratio', orm['backend.moviefind:display_aspect_ratio']),
('audio_codec', orm['backend.moviefind:audio_codec']),
('duration', orm['backend.moviefind:duration']),
('path', orm['backend.moviefind:path']),
('samplerate', orm['backend.moviefind:samplerate']),
('id', orm['backend.moviefind:id']),
('md5', orm['backend.moviefind:md5']),
('info', orm['backend.moviefind:info']),
('sha1', orm['backend.moviefind:sha1']),
('verified', orm['backend.moviefind:verified']),
('created', orm['backend.moviefind:created']),
('movie', orm['backend.moviefind:movie']),
('framerate', orm['backend.moviefind:framerate']),
('modified', orm['backend.moviefind:modified']),
('pixels', orm['backend.moviefind:pixels']),
('bpp', orm['backend.moviefind:bpp']),
('stream_mid', orm['backend.moviefind:stream_mid']),
('published', orm['backend.moviefind:published']),
('video_codec', orm['backend.moviefind:video_codec']),
('size', orm['backend.moviefind:size']),
('type', orm['backend.moviefind:type']),
('width', orm['backend.moviefind:width']),
))
db.send_create_signal('backend', ['file'])
# Adding model 'movieimdb'
db.create_table('backend_movieimdb', (
('rating', orm['backend.moviefind:rating']),
('modified', orm['backend.moviefind:modified']),
('year', orm['backend.moviefind:year']),
('id', orm['backend.moviefind:id']),
('gross', orm['backend.moviefind:gross']),
('votes', orm['backend.moviefind:votes']),
('title', orm['backend.moviefind:title']),
('profit', orm['backend.moviefind:profit']),
('tagline', orm['backend.moviefind:tagline']),
('season', orm['backend.moviefind:season']),
('plot', orm['backend.moviefind:plot']),
('imdbId', orm['backend.moviefind:imdbId']),
('series_imdb', orm['backend.moviefind:series_imdb']),
('series_title', orm['backend.moviefind:series_title']),
('episode', orm['backend.moviefind:episode']),
('created', orm['backend.moviefind:created']),
('release_date', orm['backend.moviefind:release_date']),
('budget', orm['backend.moviefind:budget']),
('episode_title', orm['backend.moviefind:episode_title']),
('runtime', orm['backend.moviefind:runtime']),
('plot_outline', orm['backend.moviefind:plot_outline']),
))
db.send_create_signal('backend', ['movieimdb'])
# Adding model 'country'
db.create_table('backend_country', (
('movies', orm['backend.moviefind:movies']),
('id', orm['backend.moviefind:id']),
('name', orm['backend.moviefind:name']),
))
db.send_create_signal('backend', ['country'])
# Adding model 'archivefile'
db.create_table('backend_archivefile', (
('created', orm['backend.moviefind:created']),
('modified', orm['backend.moviefind:modified']),
('archive', orm['backend.moviefind:archive']),
('file', orm['backend.moviefind:file']),
('path', orm['backend.moviefind:path']),
('id', orm['backend.moviefind:id']),
))
db.send_create_signal('backend', ['archivefile'])
# Adding model 'movieextra'
db.create_table('backend_movieextra', (
('rights_level', orm['backend.moviefind:rights_level']),
('description', orm['backend.moviefind:description']),
('created', orm['backend.moviefind:created']),
('title', orm['backend.moviefind:title']),
('modified', orm['backend.moviefind:modified']),
('contributor', orm['backend.moviefind:contributor']),
('id', orm['backend.moviefind:id']),
))
db.send_create_signal('backend', ['movieextra'])
# Adding model 'language'
db.create_table('backend_language', (
('movies', orm['backend.moviefind:movies']),
('id', orm['backend.moviefind:id']),
('name', orm['backend.moviefind:name']),
))
db.send_create_signal('backend', ['language'])
# Adding model 'keyword'
db.create_table('backend_keyword', (
('movies', orm['backend.moviefind:movies']),
('manual', orm['backend.moviefind:manual']),
('id', orm['backend.moviefind:id']),
('name', orm['backend.moviefind:name']),
))
db.send_create_signal('backend', ['keyword'])
# Adding model 'genre'
db.create_table('backend_genre', (
('movies', orm['backend.moviefind:movies']),
('manual', orm['backend.moviefind:manual']),
('id', orm['backend.moviefind:id']),
('name', orm['backend.moviefind:name']),
))
db.send_create_signal('backend', ['genre'])
# Changing field 'Movie.imdb'
# (to signature: django.db.models.fields.related.OneToOneField(unique=True, null=True, to=orm['backend.MovieImdb']))
db.alter_column('backend_movie', 'imdb', orm['backend.movie:imdb'])
# Creating unique_together for [imdb] on movie.
db.create_unique('backend_movie', ['imdb_id'])
models = {
'auth.group': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'unique_together': "(('content_type', 'codename'),)"},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'backend.collection': {
'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'}),
'movies': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['backend.Movie']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}),
'subdomain': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '2048'}),
'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False'})
},
'backend.facet': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
'movie': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'facets'", 'to': "orm['backend.Movie']"}),
'value': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'value_sort': ('django.db.models.fields.CharField', [], {'max_length': '200'})
},
'backend.layer': {
'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': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['backend.Movie']"}),
'time_in': ('django.db.models.fields.FloatField', [], {'default': '-1'}),
'time_out': ('django.db.models.fields.FloatField', [], {'default': '-1'}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
'value': ('django.db.models.fields.TextField', [], {})
},
'backend.list': {
'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'}),
'movies': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['backend.Movie']", 'symmetrical': 'False'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
},
'backend.listitem': {
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['backend.List']"}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'movie': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['backend.Movie']"})
},
'backend.location': {
'area': ('django.db.models.fields.FloatField', [], {'default': '-1'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'lat_center': ('django.db.models.fields.FloatField', [], {'default': '0'}),
'lat_ne': ('django.db.models.fields.FloatField', [], {'default': '0'}),
'lat_sw': ('django.db.models.fields.FloatField', [], {'default': '0'}),
'lng_center': ('django.db.models.fields.FloatField', [], {'default': '0'}),
'lng_ne': ('django.db.models.fields.FloatField', [], {'default': '0'}),
'lng_sw': ('django.db.models.fields.FloatField', [], {'default': '0'}),
'manual': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
'movies': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['backend.Movie']", 'symmetrical': 'False'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'})
},
'backend.movie': {
'available': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'imdb': ('fields.DictField', [], {'default': '{}', 'editable': 'False'}),
'json': ('fields.DictField', [], {'default': '{}', 'editable': 'False'}),
'metadata': ('fields.DictField', [], {'default': '{}', 'editable': 'False'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'movieId': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128', 'blank': 'True'}),
'oxdbId': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '42', 'blank': 'True'}),
'poster_height': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'poster_width': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'scene_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'stream_high': ('django.db.models.fields.files.FileField', [], {'default': 'None', 'max_length': '100', 'blank': 'True'}),
'stream_low': ('django.db.models.fields.files.FileField', [], {'default': 'None', 'max_length': '100', 'blank': 'True'}),
'stream_mid': ('django.db.models.fields.files.FileField', [], {'default': 'None', 'max_length': '100', 'blank': 'True'})
},
'backend.moviefind': {
'actor': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'all': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'character': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'cinematographer': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'country': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'director': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'editor': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'filename': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'genre': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'keyword': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'language': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'location': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'movie': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'find'", 'unique': 'True', 'primary_key': 'True', 'to': "orm['backend.Movie']"}),
'producer': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'title': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'trivia': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'writer': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
'year': ('django.db.models.fields.CharField', [], {'max_length': '4'})
},
'backend.moviesort': {
'aspectratio': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'bitrate': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'cast': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'cinematographer': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'cinematographer_desc': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'connections': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'country': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'country_desc': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'director': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'director_desc': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'duration': ('django.db.models.fields.FloatField', [], {'default': '-1', 'db_index': 'True'}),
'editor': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'editor_desc': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'filename': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'files': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'genre': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'keywords': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'language': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'language_desc': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'movie': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'sort'", 'unique': 'True', 'primary_key': 'True', 'to': "orm['backend.Movie']"}),
'movieId': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'blank': 'True'}),
'pixels': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'producer': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'producer_desc': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'rating': ('django.db.models.fields.FloatField', [], {'db_index': 'True', 'blank': 'True'}),
'resolution': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'risk': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'runtime': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'scenes': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'size': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'summary': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'db_index': 'True'}),
'title_desc': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'db_index': 'True'}),
'trivia': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'votes': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'words': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'wpm': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'writer': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'writer_desc': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}),
'year': ('django.db.models.fields.CharField', [], {'max_length': '4', 'db_index': 'True'}),
'year_desc': ('django.db.models.fields.CharField', [], {'max_length': '4', 'db_index': 'True'})
},
'backend.person': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'imdbId': ('django.db.models.fields.CharField', [], {'max_length': '7', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'name_sort': ('django.db.models.fields.CharField', [], {'max_length': '200'})
},
'backend.reviewwhitelist': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
'url': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
},
'contenttypes.contenttype': {
'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
}
}
complete_apps = ['backend']

File diff suppressed because it is too large Load diff

View file

@ -12,16 +12,17 @@ import models
def cronjob(**kwargs):
print "do some cleanup stuff once a day"
@task(ignore_resulsts=True)
def loadIMDb(imdbId):
load.loadIMDb(imdbId)
@task(ignore_resulsts=True, queue='default')
def updateImdb(imdbId):
movie = models.Movie.objects.get(movieId=imdbId)
movie.updateImdb()
@task(ignore_resulsts=True)
def findMovie(fileId):
f = models.File.objects.get(pk=fileId)
f.findMovie()
@task(ignore_resulsts=True, exchange="encoding")
@task(ignore_resulsts=True, queue="encoding")
def extractData(fileId):
'''
update file stuff
@ -30,7 +31,7 @@ def extractData(fileId):
f = models.File.objects.get(pk=fileId)
f.extract()
@task(ignore_resulsts=True, exchange="encoding")
@task(ignore_resulsts=True, queue="encoding")
def updateMovie(movidId):
'''
update movie

View file

@ -12,7 +12,8 @@ import ox
import ox.iso
from ox.normalize import normalizeName
def oxid(title, director, year='', seriesTitle='', episodeTitle='', season=0, episode=0):
def oxid(title, directors, year='', seriesTitle='', episodeTitle='', season=0, episode=0):
director = ', '.join(directors)
oxid_value = u"\n".join([title, director, year])
oxid = hashlib.sha1(oxid_value.encode('utf-8')).hexdigest()
if seriesTitle:
@ -22,15 +23,19 @@ def oxid(title, director, year='', seriesTitle='', episodeTitle='', season=0, ep
oxid += hashlib.sha1(oxid_value.encode('utf-8')).hexdigest()[:20]
return u"0x" + oxid
def oxdb_director(director):
def oxdb_directors(director):
director = os.path.basename(os.path.dirname(director))
if director.endswith('_'):
director = "%s." % director[:-1]
director = ", ".join([normalizeName(d) for d in director.split('; ')])
director = director.replace('Series', '')
director = director.replace('Unknown Director', '')
director = director.replace('Various Directors', '')
return director
directors = [normalizeName(d) for d in director.split('; ')]
def cleanup(director):
director = director.strip()
director = director.replace('Series', '')
director = director.replace('Unknown Director', '')
director = director.replace('Various Directors', '')
return director
directors = filter(None, [cleanup(d) for d in directors])
return directors
def oxdb_title(_title, searchTitle = False):
'''
@ -117,11 +122,15 @@ def parsePath(path):
search_title = oxdb_title(path, True)
r = {}
r['title'] = oxdb_title(path)
r['director'] = oxdb_director(path)
r['directors'] = oxdb_directors(path)
r['episode_title'] = oxdb_episode_title(path)
r['season'], r['episode'] = oxdb_season_episode(path)
r['series'] = oxdb_series_title(path)
r['series_title'] = oxdb_series_title(path)
r['part'] = oxdb_part(path)
r['imdbId'] = ox.web.imdb.guess(search_title, r['director'], timeout=-1)
r['imdbId'] = ox.web.imdb.guess(search_title, ', '.join(r['directors']), timeout=-1)
r['oxdbId'] = oxid(r['title'], r['directors'],
seriesTitle=r['series_title'],
episodeTitle=r['episode_title'],
season=r['season'], episode=r['episode'])
return r

View file

@ -33,8 +33,10 @@ import tasks
from oxuser.models import getUserJSON
from oxuser.views import api_login, api_logout, api_register, api_contact, api_recover, api_preferences
from archive.views import api_update, api_addArchive, api_editArchive, api_removeArchive
from archive.models import File
def api(request):
if request.META['REQUEST_METHOD'] == "OPTIONS":
response = HttpResponse('')
@ -78,10 +80,18 @@ def api_error(request):
def _order_query(qs, sort, prefix='sort__'):
order_by = []
if len(sort) == 1:
if sort[0]['key'] in ('title', 'director'):
sort.append({'operator': '-', 'key': 'year'})
if sort[0]['key'] in ('year', ):
sort.append({'operator': '+', 'key': 'director'})
for e in sort:
operator = e['operator']
if operator != '-': operator = ''
key = {'id': 'movieId'}.get(e['key'], e['key'])
#FIXME: this should be a property of models.MovieSort!!!
if operator=='-' and key in ('title', 'director', 'writer', 'producer', 'editor', 'cinematographer', 'language', 'country', 'year'):
key = '%s_desc' % key
order = '%s%s%s' % (operator, prefix, key)
order_by.append(order)
if order_by:
@ -180,29 +190,23 @@ Positions
query['sort'] = [{'key': 'name', 'operator':'+'}]
#FIXME: also filter lists here
response['data']['items'] = []
name = 'name'
items = 'movies'
movie_qs = query['qs']
if query['group'] == "director":
qs = models.Cast.objects.filter(role='directors').filter(movie__id__in=movie_qs).values('person__name').annotate(movies=Count('person__id')).order_by()
name = 'person__name'
elif query['group'] == "country":
qs = models.Country.objects.filter(movies__id__in=movie_qs).values('name').annotate(movies=Count('id'))
elif query['group'] == "genre":
qs = models.Genre.objects.filter(movies__id__in=movie_qs).values('name').annotate(movies=Count('id'))
elif query['group'] == "language":
qs = models.Language.objects.filter(movies__id__in=movie_qs).values('name').annotate(movies=Count('id'))
elif query['group'] == "year":
if query['group'] == "year":
qs = models.MovieSort.objects.filter(movie__id__in=movie_qs).values('year').annotate(movies=Count('year'))
name='year'
name_sort='year'
else:
qs = models.Facet.objects.filter(key=query['group']).filter(movie__id__in=movie_qs)
qs = qs.values('value').annotate(movies=Count('id')).order_by()
name = 'value'
name_sort = 'value_sort'
#replace normalized items/name sort with actual db value
for i in range(0, len(query['sort'])):
if query['sort'][i]['key'] == 'name':
if query['group'] in ('director', ):
query['sort'][i]['key'] = 'person__name_sort'
else:
query['sort'][i]['key'] = name
if query['sort'][i]['key'] == 'items':
query['sort'][i]['key'] = name_sort
elif query['sort'][i]['key'] == 'items':
query['sort'][i]['key'] = items
qs = _order_query(qs, query['sort'], prefix='')
if 'ids' in query:
@ -235,26 +239,25 @@ Positions
for p in _p:
r[p] = m.get(p, '')
return r
qs = qs[query['range'][0]:query['range'][1]]
response['data']['items'] = [only_p(m['json']) for m in qs.values('json')]
else: # otherwise stats
#movies = models.Movie.objects.filter(available=True)
movies = query['qs']
files = models.File.objects.all().filter(movie__in=movies)
files = File.objects.all().filter(movie__in=movies)
r = files.aggregate(
Count('duration'),
Count('pixels'),
Count('size')
Sum('duration'),
Sum('pixels'),
Sum('size')
)
response['data']['duration'] = r['duration__count']
response['data']['duration'] = r['duration__sum']
response['data']['files'] = files.count()
response['data']['items'] = movies.count()
response['data']['pixels'] = r['pixels__count']
response['data']['pixels'] = r['pixels__sum']
response['data']['runtime'] = movies.aggregate(Sum('sort__runtime'))['sort__runtime__sum']
if response['data']['runtime'] == None:
response['data']['runtime'] = 1337
response['data']['size'] = r['size__count']
response['data']['size'] = r['size__sum']
return render_to_json_response(response)
def api_getItem(request):
@ -401,106 +404,6 @@ def api_removeList(request):
response = json_response(status=501, text='not implemented')
return render_to_json_response(response)
@login_required_json
def api_addArchive(request):
'''
ARCHIVE API NEEDS CLEANUP
param data
{name: string}
return {'status': {'code': int, 'text': string},
'data': {}}
'''
data = json.loads(request.POST['data'])
try:
archive = models.Archive.objects.get(name=data['name'])
response = {'status': {'code': 401, 'text': 'archive with this name exists'}}
except models.Archive.DoesNotExist:
archive = models.Archive(name=data['name'])
archive.save()
archive.users.add(request.user)
response = json_response({})
response['status']['text'] = 'archive created'
return render_to_json_response(response)
@login_required_json
def api_editArchive(request):
'''
ARCHIVE API NEEDS CLEANUP
param data
{id: string, key: value,..}
return {'status': {'code': int, 'text': string},
'data': {}}
'''
data = json.loads(request.POST['data'])
item = get_object_or_404_json(models.Archive, name=data['name'])
if item.editable(request.user):
response = json_response(status=501, text='not implemented')
item.edit(data)
else:
response = json_response(status=403, text='permission denied')
return render_to_json_response(response)
@login_required_json
def api_removeArchive(request):
'''
ARCHIVE API NEEDS CLEANUP
param data
string id
return {'status': {'code': int, 'text': string}}
'''
response = json_response({})
itemId = json.loads(request.POST['data'])
item = get_object_or_404_json(models.Archive, movieId=itemId)
if item.editable(request.user):
response = json_response(status=501, text='not implemented')
else:
response = json_response(status=403, text='permission denied')
return render_to_json_response(response)
#@login_required_json
def api_update(request):
'''
param data
{archive: string, files: json}
return {'status': {'code': int, 'text': string},
'data': {info: object, rename: object}}
'''
data = json.loads(request.POST['data'])
archive = data['archive']
files = data['files']
archive = get_object_or_404_json(models.Archive, name=archive)
if archive.editable(request.user):
needs_data = []
rename = {}
for oshash in files:
data = files[oshash]
q = models.ArchiveFile.objects.filter(archive=archive, file__oshash=oshash)
if q.count() == 0:
#print "adding file", oshash, data['path']
f = models.ArchiveFile.get_or_create(archive, oshash)
f.update(data)
if not f.file.movie:
task.findMovie(f.file.id)
#FIXME: only add if it was not in File
else:
f = q[0]
if data['path'] != f.path:
f.path = data['path']
f.save()
if f.file.needs_data:
needs_data.append(oshash)
if f.path != f.file.path:
rename[oshash] = f.file.path
#print "processed files for", archive.name
#remove all files not in files.keys() from ArchiveFile
response = json_response({'info': needs_data, 'rename': rename})
else:
response = json_response(status=403, text='permission denied')
return render_to_json_response(response)
def api_encodingSettings(request):
'''
returns Firefogg encoding settings as specified by site