from django.db import models
from ox.django.fields import DictField
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.forms import ValidationError
import re
import ox
from app.models import ItfModel
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
import urllib2
from decimal import Decimal
PANDORA_BASE = 'pad.ma'
class PadmaVideo(ItfModel):
# embed_code = models.TextField()
# url = models.CharField(max_length=512, editable=False)
title = models.CharField(max_length=512, blank=True)
poster = models.ImageField(blank=True, upload_to='upload/padmaposters/')
padma_id = models.CharField(editable=False, max_length=16, unique=True, db_index=True)
duration = models.DecimalField(max_digits=16, decimal_places=3, editable=False)
width = models.IntegerField(null=True, editable=False)
height = models.IntegerField(null=True, editable=False)
data = DictField(default={}, editable=False)
layers = DictField(default={}, editable=False)
def __unicode__(self):
return self.padma_id
def get_dict(self):
return {
'embed_code': self.embed_code,
'url': self.url,
'title': self.title,
'data': self.data,
'time_in': self.time_in,
'time_out': self.time_out,
'layers':self.layers
}
'''
def save(self, *args, **kwargs):
embed_code = self.embed_code
regex = r'\'
match = re.match(regex, embed_code)
if not match:
raise ValidationError("Invalid Embed Code")
self.width, self.height, self.padma_id, self.time_in, self.time_out = match.groups()
self.time_in = int(self.time_in)
self.time_out = int(self.time_out)
self.url = "http://%s/%s/" % (PANDORA_BASE, self.padma_id,) #FIXME time_in, time_out
self.get_padma_data()
super(PadmaVideo, self).save(*args, **kwargs)
'''
def get_padma_data(self, update_poster=True):
api = ox.api.API("http://%s/api" % PANDORA_BASE)
self.data = api.get({
'id': self.padma_id,
'keys': []
})['data']
if not self.title:
self.title = self.data['title']
self.duration = Decimal(str(self.data['duration']))
if update_poster:
self.update_poster()
self.layers = api.get({
'id': self.padma_id,
'keys': ['layers']
})
return self
#ref: http://djangosnippets.org/snippets/2587/
def update_poster(self):
#poster_time = int((self.time_in + self.time_out) / 2)
poster_time = self.data['posterFrame']
url = 'http://%s/%s/480p%d.jpg' % (PANDORA_BASE, self.padma_id, poster_time,)
img_temp = NamedTemporaryFile(delete=True)
img_temp.write(urllib2.urlopen(url).read())
img_temp.flush()
self.poster.save("%s.jpg" % self.padma_id, File(img_temp), save=False)
class PadmaClip(ItfModel):
padmavideo = models.ForeignKey(PadmaVideo, editable=False)
embed_code = models.TextField()
time_in = models.DecimalField(max_digits=16, decimal_places=3, editable=False)
time_out = models.DecimalField(max_digits=16, decimal_places=3, editable=False)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
def save(self, *args, **kwargs):
embed_code = self.embed_code
regex = r'\'
match = re.match(regex, embed_code)
if not match:
raise ValidationError("Invalid Embed Code")
width, height, padma_id, time_in, time_out = match.groups()
self.time_in = Decimal(time_in)
self.time_out = Decimal(time_out)
try:
padmaVideo = PadmaVideo.objects.get(padma_id=padma_id)
created = True
except PadmaVideo.DoesNotExist:
padmaVideo = PadmaVideo(padma_id=padma_id)
created = False
padmaVideo.get_padma_data(update_poster=created) #update poster only if video is freshly created
padmaVideo.save()
self.padmavideo = padmaVideo
super(PadmaClip, self).save(*args, **kwargs)