- 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:
parent
d6a95727a6
commit
9defcd3c9f
16 changed files with 1493 additions and 914 deletions
0
pandora/archive/__init__.py
Normal file
0
pandora/archive/__init__.py
Normal file
25
pandora/archive/admin.py
Normal file
25
pandora/archive/admin.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
|
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
#from forms import FileAdminForm, MovieAdminForm, ArchiveFileAdminForm
|
||||||
|
import models
|
||||||
|
|
||||||
|
class FileAdmin(admin.ModelAdmin):
|
||||||
|
search_fields = ['path', 'video_codec']
|
||||||
|
|
||||||
|
#form = FileAdminForm
|
||||||
|
|
||||||
|
admin.site.register(models.File, FileAdmin)
|
||||||
|
|
||||||
|
class FileInstanceAdmin(admin.ModelAdmin):
|
||||||
|
search_fields = ['path', 'archive__name']
|
||||||
|
#form = ArchiveFileAdminForm
|
||||||
|
|
||||||
|
admin.site.register(models.FileInstance, FileInstanceAdmin)
|
||||||
|
|
||||||
|
class ArchiveAdmin(admin.ModelAdmin):
|
||||||
|
search_fields = ['name']
|
||||||
|
admin.site.register(models.Archive, ArchiveAdmin)
|
||||||
|
|
240
pandora/archive/migrations/0001_initial.py
Normal file
240
pandora/archive/migrations/0001_initial.py
Normal file
|
@ -0,0 +1,240 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from south.db import db
|
||||||
|
from django.db import models
|
||||||
|
from archive.models import *
|
||||||
|
|
||||||
|
class Migration:
|
||||||
|
|
||||||
|
def forwards(self, orm):
|
||||||
|
|
||||||
|
# Adding model 'Volume'
|
||||||
|
db.create_table('archive_volume', (
|
||||||
|
('id', orm['archive.Volume:id']),
|
||||||
|
('start', orm['archive.Volume:start']),
|
||||||
|
('end', orm['archive.Volume:end']),
|
||||||
|
('name', orm['archive.Volume:name']),
|
||||||
|
))
|
||||||
|
db.send_create_signal('archive', ['Volume'])
|
||||||
|
|
||||||
|
# Adding model 'Frame'
|
||||||
|
db.create_table('archive_frame', (
|
||||||
|
('id', orm['archive.Frame:id']),
|
||||||
|
('created', orm['archive.Frame:created']),
|
||||||
|
('modified', orm['archive.Frame:modified']),
|
||||||
|
('file', orm['archive.Frame:file']),
|
||||||
|
('position', orm['archive.Frame:position']),
|
||||||
|
('frame', orm['archive.Frame:frame']),
|
||||||
|
))
|
||||||
|
db.send_create_signal('archive', ['Frame'])
|
||||||
|
|
||||||
|
# Adding model 'Archive'
|
||||||
|
db.create_table('archive_archive', (
|
||||||
|
('id', orm['archive.Archive:id']),
|
||||||
|
('created', orm['archive.Archive:created']),
|
||||||
|
('modified', orm['archive.Archive:modified']),
|
||||||
|
('published', orm['archive.Archive:published']),
|
||||||
|
('name', orm['archive.Archive:name']),
|
||||||
|
('user', orm['archive.Archive:user']),
|
||||||
|
))
|
||||||
|
db.send_create_signal('archive', ['Archive'])
|
||||||
|
|
||||||
|
# Adding model 'File'
|
||||||
|
db.create_table('archive_file', (
|
||||||
|
('id', orm['archive.File:id']),
|
||||||
|
('created', orm['archive.File:created']),
|
||||||
|
('modified', orm['archive.File:modified']),
|
||||||
|
('verified', orm['archive.File:verified']),
|
||||||
|
('oshash', orm['archive.File:oshash']),
|
||||||
|
('movie', orm['archive.File:movie']),
|
||||||
|
('name', orm['archive.File:name']),
|
||||||
|
('sort_name', orm['archive.File:sort_name']),
|
||||||
|
('part', orm['archive.File:part']),
|
||||||
|
('version', orm['archive.File:version']),
|
||||||
|
('language', orm['archive.File:language']),
|
||||||
|
('season', orm['archive.File:season']),
|
||||||
|
('episode', orm['archive.File:episode']),
|
||||||
|
('size', orm['archive.File:size']),
|
||||||
|
('duration', orm['archive.File:duration']),
|
||||||
|
('info', orm['archive.File:info']),
|
||||||
|
('video_codec', orm['archive.File:video_codec']),
|
||||||
|
('pixel_format', orm['archive.File:pixel_format']),
|
||||||
|
('display_aspect_ratio', orm['archive.File:display_aspect_ratio']),
|
||||||
|
('width', orm['archive.File:width']),
|
||||||
|
('height', orm['archive.File:height']),
|
||||||
|
('framerate', orm['archive.File:framerate']),
|
||||||
|
('audio_codec', orm['archive.File:audio_codec']),
|
||||||
|
('channels', orm['archive.File:channels']),
|
||||||
|
('samplerate', orm['archive.File:samplerate']),
|
||||||
|
('bits_per_pixel', orm['archive.File:bits_per_pixel']),
|
||||||
|
('pixels', orm['archive.File:pixels']),
|
||||||
|
('is_audio', orm['archive.File:is_audio']),
|
||||||
|
('is_video', orm['archive.File:is_video']),
|
||||||
|
('is_extra', orm['archive.File:is_extra']),
|
||||||
|
('is_main', orm['archive.File:is_main']),
|
||||||
|
('is_subtitle', orm['archive.File:is_subtitle']),
|
||||||
|
('is_version', orm['archive.File:is_version']),
|
||||||
|
))
|
||||||
|
db.send_create_signal('archive', ['File'])
|
||||||
|
|
||||||
|
# Adding model 'FileInstance'
|
||||||
|
db.create_table('archive_fileinstance', (
|
||||||
|
('id', orm['archive.FileInstance:id']),
|
||||||
|
('created', orm['archive.FileInstance:created']),
|
||||||
|
('modified', orm['archive.FileInstance:modified']),
|
||||||
|
('published', orm['archive.FileInstance:published']),
|
||||||
|
('accessed', orm['archive.FileInstance:accessed']),
|
||||||
|
('path', orm['archive.FileInstance:path']),
|
||||||
|
('folder', orm['archive.FileInstance:folder']),
|
||||||
|
('file', orm['archive.FileInstance:file']),
|
||||||
|
('archive', orm['archive.FileInstance:archive']),
|
||||||
|
))
|
||||||
|
db.send_create_signal('archive', ['FileInstance'])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def backwards(self, orm):
|
||||||
|
|
||||||
|
# Deleting model 'Volume'
|
||||||
|
db.delete_table('archive_volume')
|
||||||
|
|
||||||
|
# Deleting model 'Frame'
|
||||||
|
db.delete_table('archive_frame')
|
||||||
|
|
||||||
|
# Deleting model 'Archive'
|
||||||
|
db.delete_table('archive_archive')
|
||||||
|
|
||||||
|
# Deleting model 'File'
|
||||||
|
db.delete_table('archive_file')
|
||||||
|
|
||||||
|
# Deleting model 'FileInstance'
|
||||||
|
db.delete_table('archive_fileinstance')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
models = {
|
||||||
|
'archive.archive': {
|
||||||
|
'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'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||||
|
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'owned_archives'", 'to': "orm['auth.User']"}),
|
||||||
|
'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False'}),
|
||||||
|
'volumes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archive.Volume']", 'symmetrical': 'False'})
|
||||||
|
},
|
||||||
|
'archive.file': {
|
||||||
|
'audio_codec': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'bits_per_pixel': ('django.db.models.fields.FloatField', [], {'default': '-1'}),
|
||||||
|
'channels': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'display_aspect_ratio': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'duration': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'episode': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
|
||||||
|
'framerate': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'height': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'info': ('fields.DictField', [], {'default': '{}'}),
|
||||||
|
'is_audio': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
|
||||||
|
'is_extra': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
|
||||||
|
'is_main': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
|
||||||
|
'is_subtitle': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
|
||||||
|
'is_version': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
|
||||||
|
'is_video': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
|
||||||
|
'language': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8'}),
|
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||||
|
'movie': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'files'", 'to': "orm['backend.Movie']"}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2048'}),
|
||||||
|
'oshash': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
|
||||||
|
'part': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
|
||||||
|
'pixel_format': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'pixels': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}),
|
||||||
|
'samplerate': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'season': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
|
||||||
|
'size': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}),
|
||||||
|
'sort_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2048'}),
|
||||||
|
'verified': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
|
||||||
|
'version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
|
||||||
|
'video_codec': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'width': ('django.db.models.fields.IntegerField', [], {'default': '0'})
|
||||||
|
},
|
||||||
|
'archive.fileinstance': {
|
||||||
|
'accessed': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||||
|
'archive': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'files'", 'to': "orm['archive.Archive']"}),
|
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'file': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'instances'", 'to': "orm['archive.File']"}),
|
||||||
|
'folder': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||||
|
'path': ('django.db.models.fields.CharField', [], {'max_length': '2048'}),
|
||||||
|
'published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'})
|
||||||
|
},
|
||||||
|
'archive.frame': {
|
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'file': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'frames'", 'to': "orm['archive.File']"}),
|
||||||
|
'frame': ('django.db.models.fields.files.ImageField', [], {'default': 'None', 'max_length': '100', 'null': 'True'}),
|
||||||
|
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||||
|
'position': ('django.db.models.fields.FloatField', [], {})
|
||||||
|
},
|
||||||
|
'archive.volume': {
|
||||||
|
'end': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
|
||||||
|
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'start': ('django.db.models.fields.CharField', [], {'max_length': '1'})
|
||||||
|
},
|
||||||
|
'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.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'})
|
||||||
|
},
|
||||||
|
'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 = ['archive']
|
0
pandora/archive/migrations/__init__.py
Normal file
0
pandora/archive/migrations/__init__.py
Normal file
182
pandora/archive/models.py
Normal file
182
pandora/archive/models.py
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
|
from datetime import datetime
|
||||||
|
import os.path
|
||||||
|
import random
|
||||||
|
import re
|
||||||
|
from decimal import Decimal
|
||||||
|
|
||||||
|
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
|
||||||
|
from django.utils import simplejson as json
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
from oxdjango import fields
|
||||||
|
import ox
|
||||||
|
from ox import stripTags
|
||||||
|
from ox.normalize import canonicalTitle, canonicalName
|
||||||
|
from firefogg import Firefogg
|
||||||
|
|
||||||
|
from backend import utils
|
||||||
|
from backend import extract
|
||||||
|
from pandora.backend.models import Movie
|
||||||
|
|
||||||
|
def parse_decimal(string):
|
||||||
|
string = string.replace(':', '/')
|
||||||
|
if '/' not in string:
|
||||||
|
string = '%s/1' % string
|
||||||
|
d = string.split('/')
|
||||||
|
return Decimal(d[0]) / Decimal(d[1])
|
||||||
|
|
||||||
|
#ARCHIVE stuff
|
||||||
|
class Volume(models.Model):
|
||||||
|
start = models.CharField(max_length=1)
|
||||||
|
end = models.CharField(max_length=1)
|
||||||
|
name = models.CharField(max_length=255)
|
||||||
|
|
||||||
|
class Archive(models.Model):
|
||||||
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
|
modified = models.DateTimeField(auto_now=True)
|
||||||
|
published = models.DateTimeField(default=datetime.now, editable=False)
|
||||||
|
|
||||||
|
name = models.CharField(max_length=255)
|
||||||
|
user = models.ForeignKey(User, related_name='owned_archives')
|
||||||
|
|
||||||
|
users = models.ManyToManyField(User, related_name='archives')
|
||||||
|
volumes = models.ManyToManyField(Volume, related_name='archives')
|
||||||
|
|
||||||
|
def editable(self, user):
|
||||||
|
return self.users.filter(username=user.username).count() > 0
|
||||||
|
|
||||||
|
class File(models.Model):
|
||||||
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
|
modified = models.DateTimeField(auto_now=True)
|
||||||
|
|
||||||
|
verified = models.BooleanField(default = False)
|
||||||
|
|
||||||
|
oshash = models.CharField(max_length=16)
|
||||||
|
movie = models.ForeignKey(Movie, related_name='files')
|
||||||
|
|
||||||
|
name = models.CharField(max_length=2048, default="") # canoncial path/file
|
||||||
|
sort_name = models.CharField(max_length=2048, default="") # sort path/file name
|
||||||
|
|
||||||
|
part = models.CharField(default="", max_length=255)
|
||||||
|
version = models.CharField(default="", max_length=255) # sort path/file name
|
||||||
|
language = models.CharField(default="", max_length=8)
|
||||||
|
|
||||||
|
season = models.IntegerField(default = -1)
|
||||||
|
episode = models.IntegerField(default = -1)
|
||||||
|
|
||||||
|
size = models.BigIntegerField(default = 0)
|
||||||
|
duration = models.IntegerField(default = 0)
|
||||||
|
|
||||||
|
info = fields.DictField(default={})
|
||||||
|
|
||||||
|
video_codec = models.CharField(max_length=255)
|
||||||
|
pixel_format = models.CharField(max_length=255)
|
||||||
|
display_aspect_ratio = models.CharField(max_length=255)
|
||||||
|
width = models.IntegerField(default = 0)
|
||||||
|
height = models.IntegerField(default = 0)
|
||||||
|
framerate = models.CharField(max_length=255)
|
||||||
|
|
||||||
|
audio_codec = models.CharField(max_length=255)
|
||||||
|
channels = models.IntegerField(default = 0)
|
||||||
|
samplerate = models.IntegerField(default = 0)
|
||||||
|
|
||||||
|
bits_per_pixel = models.FloatField(default=-1)
|
||||||
|
pixels = models.BigIntegerField(default=0)
|
||||||
|
|
||||||
|
is_audio = models.BooleanField(default = False)
|
||||||
|
is_video = models.BooleanField(default = False)
|
||||||
|
is_extra = models.BooleanField(default = False)
|
||||||
|
is_main = models.BooleanField(default = False)
|
||||||
|
is_subtitle = models.BooleanField(default = False)
|
||||||
|
is_version = models.BooleanField(default = False)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
if self.name and not self.sort_name:
|
||||||
|
self.sort_name = canonicalTitle(self.name)
|
||||||
|
if self.info:
|
||||||
|
for key in ('duration', 'size'):
|
||||||
|
setattr(self, key, self.info.get(key, 0))
|
||||||
|
|
||||||
|
if 'video' in self.info and self.info['video']:
|
||||||
|
self.video_codec = self.info['video'][0]['codec']
|
||||||
|
self.width = self.info['video'][0]['width']
|
||||||
|
self.height = self.info['video'][0]['height']
|
||||||
|
self.framerate = self.info['video'][0]['framerate']
|
||||||
|
if 'display_aspect_ratio' in self.info['video'][0]:
|
||||||
|
self.display_aspect_ratio = self.info['video'][0]['display_aspect_ratio']
|
||||||
|
else:
|
||||||
|
self.display_aspect_ratio = "%s:%s" % (self.width, self.height)
|
||||||
|
self.is_video = True
|
||||||
|
self.is_audio = False
|
||||||
|
else:
|
||||||
|
self.is_video = False
|
||||||
|
if 'audio' in self.info and self.info['audio']:
|
||||||
|
self.audio_codec = self.info['audio'][0]['codec']
|
||||||
|
self.samplerate = self.info['audio'][0]['samplerate']
|
||||||
|
self.channels = self.info['audio'][0]['channels']
|
||||||
|
|
||||||
|
if not self.is_video:
|
||||||
|
self.is_audio = True
|
||||||
|
else:
|
||||||
|
self.is_audio = False
|
||||||
|
|
||||||
|
if self.framerate:
|
||||||
|
self.pixels = int(self.width * self.height * float(parse_decimal(self.framerate)) * self.duration)
|
||||||
|
|
||||||
|
if not self.is_audio and not self.is_video and self.name.endswith('.srt'):
|
||||||
|
self.is_subtitle = True
|
||||||
|
|
||||||
|
if self.name and self.name.startswith('Extra/'):
|
||||||
|
self.is_extra = True
|
||||||
|
self.is_main = False
|
||||||
|
else:
|
||||||
|
self.is_extra = False
|
||||||
|
self.is_main = True
|
||||||
|
|
||||||
|
super(File, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
def json(self):
|
||||||
|
r = {}
|
||||||
|
for k in self:
|
||||||
|
r[k] = unicode(self[k])
|
||||||
|
return r
|
||||||
|
|
||||||
|
class FileInstance(models.Model):
|
||||||
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
|
modified = models.DateTimeField(auto_now=True)
|
||||||
|
published = models.DateTimeField(default=datetime.now, editable=False)
|
||||||
|
accessed = models.DateTimeField(default=datetime.now, editable=False)
|
||||||
|
|
||||||
|
path = models.CharField(max_length=2048)
|
||||||
|
folder = models.CharField(max_length=255)
|
||||||
|
|
||||||
|
file = models.ForeignKey(File, related_name='instances')
|
||||||
|
archive = models.ForeignKey(Archive, related_name='files')
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return u'%s <%s> in %s'% (self.path, self.oshash, self.archive.name)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def movieId(self):
|
||||||
|
return File.objects.get(oshash=self.oshash).movieId
|
||||||
|
|
||||||
|
class Frame(models.Model):
|
||||||
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
|
modified = models.DateTimeField(auto_now=True)
|
||||||
|
file = models.ForeignKey(File, related_name="frames")
|
||||||
|
position = models.FloatField()
|
||||||
|
frame = models.ImageField(default=None, null=True, upload_to=lambda f, x: frame_path(f))
|
||||||
|
|
||||||
|
#FIXME: frame path should be renamed on save to match current position
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return '%s at %s' % (self.file, self.position)
|
||||||
|
|
23
pandora/archive/tests.py
Normal file
23
pandora/archive/tests.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
"""
|
||||||
|
This file demonstrates two different styles of tests (one doctest and one
|
||||||
|
unittest). These will both pass when you run "manage.py test".
|
||||||
|
|
||||||
|
Replace these with more appropriate tests for your application.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
class SimpleTest(TestCase):
|
||||||
|
def test_basic_addition(self):
|
||||||
|
"""
|
||||||
|
Tests that 1 + 1 always equals 2.
|
||||||
|
"""
|
||||||
|
self.failUnlessEqual(1 + 1, 2)
|
||||||
|
|
||||||
|
__test__ = {"doctest": """
|
||||||
|
Another way to test that 1 + 1 is equal to 2.
|
||||||
|
|
||||||
|
>>> 1 + 1 == 2
|
||||||
|
True
|
||||||
|
"""}
|
||||||
|
|
164
pandora/archive/views.py
Normal file
164
pandora/archive/views.py
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
|
from __future__ import division
|
||||||
|
import os.path
|
||||||
|
import re
|
||||||
|
from datetime import datetime
|
||||||
|
from urllib2 import unquote
|
||||||
|
import mimetypes
|
||||||
|
|
||||||
|
from django import forms
|
||||||
|
from django.core.paginator import Paginator
|
||||||
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from django.db.models import Q, Avg, Count, Sum
|
||||||
|
from django.http import HttpResponse, Http404
|
||||||
|
from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404
|
||||||
|
from django.template import RequestContext
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
try:
|
||||||
|
import simplejson as json
|
||||||
|
except ImportError:
|
||||||
|
from django.utils import simplejson as json
|
||||||
|
|
||||||
|
from oxdjango.decorators import login_required_json
|
||||||
|
from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
|
||||||
|
from oxdjango.http import HttpFileResponse
|
||||||
|
import ox
|
||||||
|
|
||||||
|
import models
|
||||||
|
|
||||||
|
from backend.utils import oxid, parsePath
|
||||||
|
import backend.models
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#@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']
|
||||||
|
folder = data['folder']
|
||||||
|
files = data['files']
|
||||||
|
needs_data = []
|
||||||
|
rename = []
|
||||||
|
archive, created = models.Archive.objects.get_or_create(name=archive, user=request.user)
|
||||||
|
if archive.editable(request.user):
|
||||||
|
print 'editing'
|
||||||
|
same_folder = models.FileInstance.objects.filter(folder=folder)
|
||||||
|
if same_folder.count() > 0:
|
||||||
|
movie = same_folder[0].file.movie
|
||||||
|
else:
|
||||||
|
movie = None
|
||||||
|
for filename in files:
|
||||||
|
data = files[filename]
|
||||||
|
oshash = data['oshash']
|
||||||
|
path = os.path.join(folder, filename)
|
||||||
|
|
||||||
|
instance = models.FileInstance.objects.filter(file__oshash=oshash)
|
||||||
|
if instance.count()>0:
|
||||||
|
instance = instance[0]
|
||||||
|
if path != instance.path: #file was movied
|
||||||
|
instance.path = path
|
||||||
|
instance.folder = folder
|
||||||
|
f.save()
|
||||||
|
print "file movied, so other shit"
|
||||||
|
else:
|
||||||
|
#look if oshash is known
|
||||||
|
f = models.File.objects.filter(oshash=oshash)
|
||||||
|
if f.count() > 0:
|
||||||
|
f = f[0]
|
||||||
|
instance = models.FileInstance()
|
||||||
|
instance.file = f
|
||||||
|
instance.path=data['path']
|
||||||
|
instance.folder=folder
|
||||||
|
instance.save()
|
||||||
|
movie = f.movie
|
||||||
|
#new oshash, add to database
|
||||||
|
else:
|
||||||
|
if not movie:
|
||||||
|
movie_info = parsePath(folder)
|
||||||
|
movie = backend.models.getMovie(movie_info)
|
||||||
|
f = models.File()
|
||||||
|
f.oshash = oshash
|
||||||
|
f.info = data
|
||||||
|
del f.info['oshash']
|
||||||
|
f.name = filename
|
||||||
|
f.movie = movie
|
||||||
|
f.save()
|
||||||
|
instance = models.FileInstance()
|
||||||
|
instance.archive = archive
|
||||||
|
instance.file = f
|
||||||
|
instance.path = path
|
||||||
|
instance.folder = folder
|
||||||
|
instance.save()
|
||||||
|
|
||||||
|
response = json_response({'info': needs_data, 'rename': rename})
|
||||||
|
else:
|
||||||
|
response = json_response(status=403, text='permission denied')
|
||||||
|
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.user = request.user
|
||||||
|
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)
|
||||||
|
|
|
@ -3,41 +3,27 @@
|
||||||
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from forms import FileAdminForm, MovieAdminForm, ArchiveFileAdminForm
|
#from forms import FileAdminForm, MovieAdminForm, ArchiveFileAdminForm
|
||||||
import models
|
import models
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
#class MovieImdbAdmin(admin.ModelAdmin):
|
#class MovieImdbAdmin(admin.ModelAdmin):
|
||||||
# search_fields = ['imdbId', 'title']
|
# search_fields = ['imdbId', 'title']
|
||||||
#admin.site.register(models.MovieImdb, MovieImdbAdmin)
|
#admin.site.register(models.MovieImdb, MovieImdbAdmin)
|
||||||
|
|
||||||
class MovieImdbInline(admin.StackedInline):
|
class MovieImdbInline(admin.StackedInline):
|
||||||
model = models.MovieImdb
|
model = models.MovieImdb
|
||||||
|
|
||||||
class MovieOxdbInline(admin.StackedInline):
|
class MovieOxdbInline(admin.StackedInline):
|
||||||
model = models.MovieOxdb
|
model = models.MovieOxdb
|
||||||
|
'''
|
||||||
|
|
||||||
class MovieAdmin(admin.ModelAdmin):
|
class MovieAdmin(admin.ModelAdmin):
|
||||||
search_fields = ['movieId', 'imdb__title', 'oxdb__title']
|
search_fields = ['movieId', 'imdb__title', 'oxdb__title']
|
||||||
form = MovieAdminForm
|
#form = MovieAdminForm
|
||||||
#inlines = [MovieImdbInline, MovieOxdbInline]
|
#inlines = [MovieImdbInline, MovieOxdbInline]
|
||||||
|
|
||||||
admin.site.register(models.Movie, MovieAdmin)
|
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)
|
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ ajax_filtered_js = (
|
||||||
settings.STATIC_URL + 'js/jquery/jquery.js',
|
settings.STATIC_URL + 'js/jquery/jquery.js',
|
||||||
settings.STATIC_URL + 'js/ajax_filtered_fields.js',
|
settings.STATIC_URL + 'js/ajax_filtered_fields.js',
|
||||||
)
|
)
|
||||||
|
"""
|
||||||
class FileAdminForm(forms.ModelForm):
|
class FileAdminForm(forms.ModelForm):
|
||||||
movie = ForeignKeyByLetter(models.Movie, field_name='imdb__title')
|
movie = ForeignKeyByLetter(models.Movie, field_name='imdb__title')
|
||||||
|
|
||||||
|
@ -39,4 +39,4 @@ class MovieAdminForm(forms.ModelForm):
|
||||||
|
|
||||||
class Media:
|
class Media:
|
||||||
js = ajax_filtered_js
|
js = ajax_filtered_js
|
||||||
|
"""
|
||||||
|
|
|
@ -46,7 +46,7 @@ class MovieManager(Manager):
|
||||||
query: {
|
query: {
|
||||||
conditions: [
|
conditions: [
|
||||||
{
|
{
|
||||||
value: "war""
|
value: "war"
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
key: "year",
|
key: "year",
|
||||||
|
@ -59,10 +59,10 @@ class MovieManager(Manager):
|
||||||
operator: "^"
|
operator: "^"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
operator: "&"
|
operator: ","
|
||||||
}
|
}
|
||||||
'''
|
'''
|
||||||
query_operator = data['query'].get('operator', '&')
|
query_operator = data['query'].get('operator', ',')
|
||||||
conditions = []
|
conditions = []
|
||||||
for condition in data['query']['conditions']:
|
for condition in data['query']['conditions']:
|
||||||
k = condition.get('key', 'all')
|
k = condition.get('key', 'all')
|
||||||
|
|
647
pandora/backend/migrations/0003_archive.py
Normal file
647
pandora/backend/migrations/0003_archive.py
Normal 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
|
@ -12,16 +12,17 @@ import models
|
||||||
def cronjob(**kwargs):
|
def cronjob(**kwargs):
|
||||||
print "do some cleanup stuff once a day"
|
print "do some cleanup stuff once a day"
|
||||||
|
|
||||||
@task(ignore_resulsts=True)
|
@task(ignore_resulsts=True, queue='default')
|
||||||
def loadIMDb(imdbId):
|
def updateImdb(imdbId):
|
||||||
load.loadIMDb(imdbId)
|
movie = models.Movie.objects.get(movieId=imdbId)
|
||||||
|
movie.updateImdb()
|
||||||
|
|
||||||
@task(ignore_resulsts=True)
|
@task(ignore_resulsts=True)
|
||||||
def findMovie(fileId):
|
def findMovie(fileId):
|
||||||
f = models.File.objects.get(pk=fileId)
|
f = models.File.objects.get(pk=fileId)
|
||||||
f.findMovie()
|
f.findMovie()
|
||||||
|
|
||||||
@task(ignore_resulsts=True, exchange="encoding")
|
@task(ignore_resulsts=True, queue="encoding")
|
||||||
def extractData(fileId):
|
def extractData(fileId):
|
||||||
'''
|
'''
|
||||||
update file stuff
|
update file stuff
|
||||||
|
@ -30,7 +31,7 @@ def extractData(fileId):
|
||||||
f = models.File.objects.get(pk=fileId)
|
f = models.File.objects.get(pk=fileId)
|
||||||
f.extract()
|
f.extract()
|
||||||
|
|
||||||
@task(ignore_resulsts=True, exchange="encoding")
|
@task(ignore_resulsts=True, queue="encoding")
|
||||||
def updateMovie(movidId):
|
def updateMovie(movidId):
|
||||||
'''
|
'''
|
||||||
update movie
|
update movie
|
||||||
|
|
|
@ -12,7 +12,8 @@ import ox
|
||||||
import ox.iso
|
import ox.iso
|
||||||
from ox.normalize import normalizeName
|
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_value = u"\n".join([title, director, year])
|
||||||
oxid = hashlib.sha1(oxid_value.encode('utf-8')).hexdigest()
|
oxid = hashlib.sha1(oxid_value.encode('utf-8')).hexdigest()
|
||||||
if seriesTitle:
|
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]
|
oxid += hashlib.sha1(oxid_value.encode('utf-8')).hexdigest()[:20]
|
||||||
return u"0x" + oxid
|
return u"0x" + oxid
|
||||||
|
|
||||||
def oxdb_director(director):
|
def oxdb_directors(director):
|
||||||
director = os.path.basename(os.path.dirname(director))
|
director = os.path.basename(os.path.dirname(director))
|
||||||
if director.endswith('_'):
|
if director.endswith('_'):
|
||||||
director = "%s." % director[:-1]
|
director = "%s." % director[:-1]
|
||||||
director = ", ".join([normalizeName(d) for d in director.split('; ')])
|
directors = [normalizeName(d) for d in director.split('; ')]
|
||||||
director = director.replace('Series', '')
|
def cleanup(director):
|
||||||
director = director.replace('Unknown Director', '')
|
director = director.strip()
|
||||||
director = director.replace('Various Directors', '')
|
director = director.replace('Series', '')
|
||||||
return director
|
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):
|
def oxdb_title(_title, searchTitle = False):
|
||||||
'''
|
'''
|
||||||
|
@ -117,11 +122,15 @@ def parsePath(path):
|
||||||
search_title = oxdb_title(path, True)
|
search_title = oxdb_title(path, True)
|
||||||
r = {}
|
r = {}
|
||||||
r['title'] = oxdb_title(path)
|
r['title'] = oxdb_title(path)
|
||||||
r['director'] = oxdb_director(path)
|
r['directors'] = oxdb_directors(path)
|
||||||
r['episode_title'] = oxdb_episode_title(path)
|
r['episode_title'] = oxdb_episode_title(path)
|
||||||
r['season'], r['episode'] = oxdb_season_episode(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['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
|
return r
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,9 @@ import tasks
|
||||||
|
|
||||||
from oxuser.models import getUserJSON
|
from oxuser.models import getUserJSON
|
||||||
from oxuser.views import api_login, api_logout, api_register, api_contact, api_recover, api_preferences
|
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):
|
def api(request):
|
||||||
if request.META['REQUEST_METHOD'] == "OPTIONS":
|
if request.META['REQUEST_METHOD'] == "OPTIONS":
|
||||||
|
@ -78,10 +80,18 @@ def api_error(request):
|
||||||
|
|
||||||
def _order_query(qs, sort, prefix='sort__'):
|
def _order_query(qs, sort, prefix='sort__'):
|
||||||
order_by = []
|
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:
|
for e in sort:
|
||||||
operator = e['operator']
|
operator = e['operator']
|
||||||
if operator != '-': operator = ''
|
if operator != '-': operator = ''
|
||||||
key = {'id': 'movieId'}.get(e['key'], e['key'])
|
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 = '%s%s%s' % (operator, prefix, key)
|
||||||
order_by.append(order)
|
order_by.append(order)
|
||||||
if order_by:
|
if order_by:
|
||||||
|
@ -180,29 +190,23 @@ Positions
|
||||||
query['sort'] = [{'key': 'name', 'operator':'+'}]
|
query['sort'] = [{'key': 'name', 'operator':'+'}]
|
||||||
#FIXME: also filter lists here
|
#FIXME: also filter lists here
|
||||||
response['data']['items'] = []
|
response['data']['items'] = []
|
||||||
name = 'name'
|
|
||||||
items = 'movies'
|
items = 'movies'
|
||||||
movie_qs = query['qs']
|
movie_qs = query['qs']
|
||||||
if query['group'] == "director":
|
if query['group'] == "year":
|
||||||
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":
|
|
||||||
qs = models.MovieSort.objects.filter(movie__id__in=movie_qs).values('year').annotate(movies=Count('year'))
|
qs = models.MovieSort.objects.filter(movie__id__in=movie_qs).values('year').annotate(movies=Count('year'))
|
||||||
name='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
|
#replace normalized items/name sort with actual db value
|
||||||
for i in range(0, len(query['sort'])):
|
for i in range(0, len(query['sort'])):
|
||||||
if query['sort'][i]['key'] == 'name':
|
if query['sort'][i]['key'] == 'name':
|
||||||
if query['group'] in ('director', ):
|
query['sort'][i]['key'] = name_sort
|
||||||
query['sort'][i]['key'] = 'person__name_sort'
|
elif query['sort'][i]['key'] == 'items':
|
||||||
else:
|
|
||||||
query['sort'][i]['key'] = name
|
|
||||||
if query['sort'][i]['key'] == 'items':
|
|
||||||
query['sort'][i]['key'] = items
|
query['sort'][i]['key'] = items
|
||||||
qs = _order_query(qs, query['sort'], prefix='')
|
qs = _order_query(qs, query['sort'], prefix='')
|
||||||
if 'ids' in query:
|
if 'ids' in query:
|
||||||
|
@ -235,26 +239,25 @@ Positions
|
||||||
for p in _p:
|
for p in _p:
|
||||||
r[p] = m.get(p, '')
|
r[p] = m.get(p, '')
|
||||||
return r
|
return r
|
||||||
|
|
||||||
qs = qs[query['range'][0]:query['range'][1]]
|
qs = qs[query['range'][0]:query['range'][1]]
|
||||||
response['data']['items'] = [only_p(m['json']) for m in qs.values('json')]
|
response['data']['items'] = [only_p(m['json']) for m in qs.values('json')]
|
||||||
else: # otherwise stats
|
else: # otherwise stats
|
||||||
#movies = models.Movie.objects.filter(available=True)
|
#movies = models.Movie.objects.filter(available=True)
|
||||||
movies = query['qs']
|
movies = query['qs']
|
||||||
files = models.File.objects.all().filter(movie__in=movies)
|
files = File.objects.all().filter(movie__in=movies)
|
||||||
r = files.aggregate(
|
r = files.aggregate(
|
||||||
Count('duration'),
|
Sum('duration'),
|
||||||
Count('pixels'),
|
Sum('pixels'),
|
||||||
Count('size')
|
Sum('size')
|
||||||
)
|
)
|
||||||
response['data']['duration'] = r['duration__count']
|
response['data']['duration'] = r['duration__sum']
|
||||||
response['data']['files'] = files.count()
|
response['data']['files'] = files.count()
|
||||||
response['data']['items'] = movies.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']
|
response['data']['runtime'] = movies.aggregate(Sum('sort__runtime'))['sort__runtime__sum']
|
||||||
if response['data']['runtime'] == None:
|
if response['data']['runtime'] == None:
|
||||||
response['data']['runtime'] = 1337
|
response['data']['runtime'] = 1337
|
||||||
response['data']['size'] = r['size__count']
|
response['data']['size'] = r['size__sum']
|
||||||
return render_to_json_response(response)
|
return render_to_json_response(response)
|
||||||
|
|
||||||
def api_getItem(request):
|
def api_getItem(request):
|
||||||
|
@ -401,106 +404,6 @@ def api_removeList(request):
|
||||||
response = json_response(status=501, text='not implemented')
|
response = json_response(status=501, text='not implemented')
|
||||||
return render_to_json_response(response)
|
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):
|
def api_encodingSettings(request):
|
||||||
'''
|
'''
|
||||||
returns Firefogg encoding settings as specified by site
|
returns Firefogg encoding settings as specified by site
|
||||||
|
|
|
@ -112,6 +112,7 @@ INSTALLED_APPS = (
|
||||||
|
|
||||||
'app',
|
'app',
|
||||||
'backend',
|
'backend',
|
||||||
|
'archive',
|
||||||
'oxuser',
|
'oxuser',
|
||||||
'torrent',
|
'torrent',
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue