it/itf/padmavideos/models.py
2012-03-28 16:20:07 +05:30

86 lines
3.3 KiB
Python

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
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=8, db_index=True)
time_in = models.IntegerField(null=True, editable=False)
time_out = models.IntegerField(null=True, 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)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
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'\<iframe width=\"([0-9]{1,3})\" height\=\"([0-9]{1,3})\" src\=\"http\:\/\/pad.ma\/([A-Z]{1,8})\/embed\?in\=([0-9].*?)\&out\=([0-9].*?)\&view\=video\" frameborder\=\"0\" allowfullscreen></iframe>'
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']
if self.time_in == self.time_out:
self.time_out = int(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)
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)