rename Movie to Item
This commit is contained in:
parent
0955a03fa4
commit
2ad4abd820
14 changed files with 657 additions and 250 deletions
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
from django.contrib import admin
|
||||
|
||||
#from forms import FileAdminForm, MovieAdminForm, ArchiveFileAdminForm
|
||||
#from forms import FileAdminForm, ItemAdminForm, ArchiveFileAdminForm
|
||||
import models
|
||||
|
||||
class FileAdmin(admin.ModelAdmin):
|
||||
|
|
|
|||
|
|
@ -326,7 +326,7 @@ def divide(num, by):
|
|||
arr.append(div + (i > by - 1 - mod))
|
||||
return arr
|
||||
|
||||
def timeline_strip(movie, cuts, info, prefix):
|
||||
def timeline_strip(item, cuts, info, prefix):
|
||||
_debug = False
|
||||
duration = info['duration']
|
||||
video_height = info['video'][0]['height']
|
||||
|
|
@ -353,29 +353,29 @@ def timeline_strip(movie, cuts, info, prefix):
|
|||
c = cuts.index(frame)
|
||||
if c +1 < len(cuts):
|
||||
duration = cuts[c + 1] - cuts[c]
|
||||
stills = math.ceil(duration / (video_width * timeline_height / video_height))
|
||||
widths = divide(duration, stills)
|
||||
still = frame
|
||||
frames = math.ceil(duration / (video_width * timeline_height / video_height))
|
||||
widths = divide(duration, frames)
|
||||
frame = frame
|
||||
if _debug:
|
||||
print widths, duration, stills, cuts[c], cuts[c + 1]
|
||||
for s in range(int(stills)):
|
||||
still_ratio = widths[s] / timeline_height
|
||||
if video_ratio > still_ratio:
|
||||
width = int(round(video_height * still_ratio))
|
||||
print widths, duration, frames, cuts[c], cuts[c + 1]
|
||||
for s in range(int(frames)):
|
||||
frame_ratio = widths[s] / timeline_height
|
||||
if video_ratio > frame_ratio:
|
||||
width = int(round(video_height * frame_ratio))
|
||||
left = int((video_width - width) / 2)
|
||||
box = (left, 0, left + width, video_height)
|
||||
else:
|
||||
height = int(round(video_width / still_ratio))
|
||||
height = int(round(video_width / frame_ratio))
|
||||
top = int((video_height - height) / 2)
|
||||
box = (0, top, video_width, top + height)
|
||||
if _debug:
|
||||
print frame, 'cut', c, 'still', s, still, 'width', widths[s], box
|
||||
#FIXME: why does this have to be still+1?
|
||||
frame_image = Image.open(movie.frame((still+1)/fps))
|
||||
print frame, 'cut', c, 'frame', s, frame, 'width', widths[s], box
|
||||
#FIXME: why does this have to be frame+1?
|
||||
frame_image = Image.open(item.frame((frame+1)/fps))
|
||||
frame_image = frame_image.crop(box).resize((widths[s], timeline_height), Image.ANTIALIAS)
|
||||
for x_ in range(widths[s]):
|
||||
line_image.append(frame_image.crop((x_, 0, x_ + 1, timeline_height)))
|
||||
still += widths[s]
|
||||
frame += widths[s]
|
||||
if len(line_image) > frame:
|
||||
timeline_image.paste(line_image[frame], (x, 0))
|
||||
if x == timeline_width - 1:
|
||||
|
|
|
|||
146
pandora/archive/migrations/0009_rename_movie.py
Normal file
146
pandora/archive/migrations/0009_rename_movie.py
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
db.rename_column('archive_file', 'movie_id', 'item_id')
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
db.rename_column('archive_file', 'item_id', 'movie_id')
|
||||
|
||||
|
||||
models = {
|
||||
'archive.file': {
|
||||
'Meta': {'object_name': 'File'},
|
||||
'audio_codec': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||
'available': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
|
||||
'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'}),
|
||||
'data': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': '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': ('oxdjango.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'}),
|
||||
'item': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'files'", 'to': "orm['backend.Item']"}),
|
||||
'language': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '8'}),
|
||||
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2048'}),
|
||||
'oshash': ('django.db.models.fields.CharField', [], {'unique': 'True', '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': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
|
||||
'video_codec': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||
'width': ('django.db.models.fields.IntegerField', [], {'default': '0'})
|
||||
},
|
||||
'archive.fileinstance': {
|
||||
'Meta': {'unique_together': "(('name', 'folder', 'volume'),)", 'object_name': 'FileInstance'},
|
||||
'atime': ('django.db.models.fields.IntegerField', [], {'default': '1285254686'}),
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'ctime': ('django.db.models.fields.IntegerField', [], {'default': '1285254686'}),
|
||||
'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'}),
|
||||
'mtime': ('django.db.models.fields.IntegerField', [], {'default': '1285254686'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '2048'}),
|
||||
'volume': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'files'", 'to': "orm['archive.Volume']"})
|
||||
},
|
||||
'archive.frame': {
|
||||
'Meta': {'unique_together': "(('file', 'position'),)", 'object_name': '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': {
|
||||
'Meta': {'unique_together': "(('user', 'name'),)", 'object_name': 'Volume'},
|
||||
'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': '1024'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'volumes'", 'to': "orm['auth.User']"})
|
||||
},
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': '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'),)", 'object_name': 'Permission'},
|
||||
'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': {
|
||||
'Meta': {'object_name': '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.item': {
|
||||
'Meta': {'object_name': 'Item'},
|
||||
'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': ('oxdjango.fields.DictField', [], {'default': '{}'}),
|
||||
'itemId': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128', 'blank': 'True'}),
|
||||
'json': ('oxdjango.fields.DictField', [], {'default': '{}'}),
|
||||
'metadata': ('oxdjango.fields.DictField', [], {'default': '{}'}),
|
||||
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'oxdbId': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '42', 'blank': 'True'}),
|
||||
'poster': ('django.db.models.fields.files.ImageField', [], {'default': 'None', 'max_length': '100', 'blank': 'True'}),
|
||||
'poster_frame': ('django.db.models.fields.FloatField', [], {'default': '-1'}),
|
||||
'poster_height': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||
'poster_url': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'poster_width': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||
'published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'stream_aspect': ('django.db.models.fields.FloatField', [], {'default': '1.3333333333333333'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', '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']
|
||||
|
|
@ -23,7 +23,7 @@ from firefogg import Firefogg
|
|||
import chardet
|
||||
|
||||
from backend import utils
|
||||
from pandora.backend.models import Movie
|
||||
from pandora.backend.models import Item
|
||||
|
||||
import extract
|
||||
|
||||
|
|
@ -46,7 +46,7 @@ class File(models.Model):
|
|||
verified = models.BooleanField(default=False)
|
||||
|
||||
oshash = models.CharField(max_length=16, unique=True)
|
||||
movie = models.ForeignKey(Movie, related_name='files')
|
||||
item = models.ForeignKey(Item, 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
|
||||
|
|
@ -260,8 +260,8 @@ class FileInstance(models.Model):
|
|||
return u"%s's %s <%s>"% (self.volume.user, self.name, self.file.oshash)
|
||||
|
||||
@property
|
||||
def movieId(self):
|
||||
return File.objects.get(oshash=self.oshash).movieId
|
||||
def itemId(self):
|
||||
return File.objects.get(oshash=self.oshash).itemId
|
||||
|
||||
def frame_path(frame, name):
|
||||
ext = os.path.splitext(name)[-1]
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ def api_update(request):
|
|||
param data
|
||||
volume: '',
|
||||
files: [
|
||||
{oshash:, path:, ctime:, atime:, mtime:, }
|
||||
{oshash:, path:, mtime:, }
|
||||
]
|
||||
info: {oshash: object}
|
||||
|
||||
|
|
@ -88,9 +88,9 @@ def api_update(request):
|
|||
|
||||
same_folder = models.FileInstance.objects.filter(folder=folder, volume=volume)
|
||||
if same_folder.count() > 0:
|
||||
movie = same_folder[0].file.movie
|
||||
item = same_folder[0].file.item
|
||||
else:
|
||||
movie = None
|
||||
item = None
|
||||
|
||||
path = os.path.join(folder, name)
|
||||
|
||||
|
|
@ -98,7 +98,7 @@ def api_update(request):
|
|||
if instance.count()>0:
|
||||
instance = instance[0]
|
||||
updated = False
|
||||
for key in ('atime', 'mtime', 'ctime', 'name', 'folder'):
|
||||
for key in ('mtime', 'name', 'folder'):
|
||||
if f[key] != getattr(instance, key):
|
||||
setattr(instance, key, f[key])
|
||||
updated=True
|
||||
|
|
@ -111,24 +111,24 @@ def api_update(request):
|
|||
file_object = file_objects[0]
|
||||
#new oshash, add to database
|
||||
else:
|
||||
if not movie:
|
||||
movie_info = parse_path(folder)
|
||||
movie = backend.models.getMovie(movie_info)
|
||||
if not item:
|
||||
item_info = parse_path(folder)
|
||||
item = backend.models.getItem(item_info)
|
||||
file_object = models.File()
|
||||
file_object.oshash = oshash
|
||||
file_object.name = name
|
||||
file_object.movie = movie
|
||||
file_object.item = item
|
||||
file_object.save()
|
||||
response['data']['info'].append(oshash)
|
||||
instance = models.FileInstance()
|
||||
instance.volume = volume
|
||||
instance.file = file_object
|
||||
for key in ('atime', 'mtime', 'ctime', 'name', 'folder'):
|
||||
for key in ('mtime', 'name', 'folder'):
|
||||
setattr(instance, key, f[key])
|
||||
instance.save()
|
||||
|
||||
#remove deleted files
|
||||
#FIXME: can this have any bad consequences? i.e. on the selction of used movie files.
|
||||
#FIXME: can this have any bad consequences? i.e. on the selction of used item files.
|
||||
models.FileInstance.objects.filter(volume=volume).exclude(file__oshash__in=all_files).delete()
|
||||
|
||||
user_profile = user.get_profile()
|
||||
|
|
@ -255,7 +255,7 @@ def api_editFile(request): #FIXME: should this be file.files. or part of update
|
|||
|
||||
def lookup_file(request, oshash):
|
||||
f = get_object_or_404(models.File, oshash=oshash)
|
||||
return redirect(f.movie.get_absolute_url())
|
||||
return redirect(f.item.get_absolute_url())
|
||||
|
||||
|
||||
"""
|
||||
|
|
@ -270,7 +270,7 @@ def api_fileInfo(request):
|
|||
oshash = json.loads(request.POST['data'])
|
||||
elif 'oshash' in request.GET:
|
||||
oshash = request.GET['oshash']
|
||||
f = models.MovieFile.objects.get(oshash=oshash)
|
||||
f = models.ItemFile.objects.get(oshash=oshash)
|
||||
response = {'data': f.json()}
|
||||
return render_to_json_response(response)
|
||||
|
||||
|
|
@ -301,11 +301,11 @@ def api_subtitles(request):
|
|||
else:
|
||||
response = json_response({})
|
||||
if language:
|
||||
q = models.Subtitles.objects.filter(movie_file__oshash=oshash, language=language)
|
||||
q = models.Subtitles.objects.filter(item_file__oshash=oshash, language=language)
|
||||
if q.count() > 0:
|
||||
response['data']['subtitle'] = q[0].srt
|
||||
return render_to_json_response(response)
|
||||
l = models.Subtitles.objects.filter(movie_file__oshash=oshash).values('language')
|
||||
l = models.Subtitles.objects.filter(item_file__oshash=oshash).values('language')
|
||||
response['data']['languages'] = [f['language'] for f in l]
|
||||
return render_to_json_response(response)
|
||||
"""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue