web/blinkster/views.py
author ymh <ymh.work@gmail.com>
Thu, 19 May 2011 17:52:54 +0200
changeset 117 565fd34c668c
parent 107 4ab1136e388d
permissions -rw-r--r--
correct segment details

# Create your views here.
from blinkster.models import Roi, Poi
from django.conf import settings
from django.core.serializers.json import DjangoJSONEncoder
from django.core.urlresolvers import reverse
from django.http import HttpResponse
from django.shortcuts import (render_to_response, get_object_or_404, 
    get_list_or_404)
from django.template import RequestContext
from django.utils import simplejson
from ldt.ldt_utils.models import Segment, Content
from ldt.ldt_utils.utils import LdtSearch
import blinkster
import django.utils.encoding
import math
import re
import urllib2




def serialize_queryset_to_json(response, obj_list, extra=None):
    objs = {
        "version" : blinkster.VERSION,
        "list" : obj_list,
    }
    if extra:
        objs = dict(objs, **extra)

    #blinkster.utils.log.debug("before views dumps JSON RES : " + repr(objs))
    res = simplejson.dumps(objs, cls=DjangoJSONEncoder, ensure_ascii=False, indent=4)
    #blinkster.utils.log.debug("views dumps JSON RES : " + res)
    response.write(res)
    return response

def roi_list(request):

    content_type = request.GET.get("content-type")
    content_type_req = ""
    if content_type is None:
        content_type = u"application/json; charset=utf-8"
    else:
        content_type_req = "?content-type=" + urllib2.quote(content_type)
    

    response = HttpResponse(content_type=str(content_type))
    results = []
    for roi_dict in [roi.serialize_to_dict() for roi in Roi.objects.all()]: #@UndefinedVariable
        roi_dict["poi_list_url"] = unicode(settings.WEB_URL.rstrip('/') + reverse('blinkster.views.poi_list', args=[roi_dict["sid"]]) + content_type_req)
        results.append(roi_dict)

    return serialize_queryset_to_json(response, results)

def poi_list(request, roi_sid):
    content_type = request.GET.get("content-type")
    content_type_req = ""
    if content_type is None:
        content_type = u"application/json; charset=utf-8"
    else:
        content_type_req = "?content-type=" + urllib2.quote(content_type)

    response = HttpResponse(content_type=str(content_type))
    roi = get_object_or_404(Roi, sid=roi_sid)
    results = []
    for poi_dict in [poi.serialize_to_dict() for poi in Poi.objects.filter(roi=roi)]: #@UndefinedVariable
        poi_dict["segment_search_url"] = django.utils.encoding.iri_to_uri(unicode(settings.WEB_URL.rstrip('/') + reverse('blinkster.views.segment_search_get', args=[u"tags", u"or", urllib2.quote(poi_dict["tags"].encode("utf-8"))]) + content_type_req))
        results.append(poi_dict)
    return serialize_queryset_to_json(response, results)

# Display segment detail.
# This will have to be moved to ldt module
def segment_detail(request, project_id, iri_id, ensemble_id, cutting_id, element_id):
    
    if project_id is None or project_id == "_":
        project_id = ""
        
    segment = get_list_or_404(Segment, project_id=project_id, iri_id=iri_id, ensemble_id=ensemble_id, cutting_id=cutting_id, element_id=element_id)[0]
    tags = segment.tags
    tag_list = tags.split(",")
    segment_tags_list = ", ".join([tag.strip() for tag in tag_list])
    content = Content.objects.get(iri_id=iri_id) #@UndefinedVariable
    content_dur = content.get_duration()
    
    if segment.duration > 0:
        start_ts = segment.start_ts
        duration = segment.duration
    else:
        start_ts = max(0, segment.start_ts - (settings.DEFAULT_SEGMENT_LENGTH_SECONDS * 500))
        end_ts = min(content_dur, start_ts + (settings.DEFAULT_SEGMENT_LENGTH_SECONDS * 1000))
        duration = end_ts - start_ts
        
    segment_relative_duration = max(int(float(duration) / float(content_dur) * 100), 1)
    segment_relative_start = int(float(start_ts) / float(content_dur) * 100)
    
    return render_to_response("segment_detail.html",
                              {'segment':segment,
                               'segment_tags_list':segment_tags_list,
                               'ldt_id': "_" if project_id == "" else project_id,
                               'iri_id':iri_id,
                               'ensemble_id':ensemble_id,
                               'cutting_id':cutting_id,
                               'element_id':element_id,
                               'project_id':project_id,
                               'content_duration':content_dur,
                               'start_ts':start_ts,
                               'duration':duration,
                               'segment_relative_duration':segment_relative_duration,
                               'segment_relative_start':segment_relative_start 
                               }, context_instance=RequestContext(request))

def segment_search_post(request):
    query = request.POST["query"]
    field = request.POST["field"]
    operator = request.POST["operator"]
    return segment_search_get(request, query, field, operator)

def segment_search_get(request, query, field=u"tags", operator=u"or"):
    
    content_type = request.GET.get("content-type")
    content_type_req = ""
    if content_type is None:
        content_type = u"application/json; charset=utf-8"
    else:
        content_type_req = "?content-type=" + urllib2.quote(content_type)

    response = HttpResponse(content_type=str(content_type))

    # transform tag1, tag2, tag3 in "tag1" OR "tag2" OR "tag3"
    query_str = (u" " + operator.upper() + u" ").join(["\"" + t.strip() + "\"" for t in re.split("\,|\;", query)])
    

    searcher = LdtSearch()
    index_results = searcher.query(field, query_str)

    results = []

    for index_res in index_results:
        res = dict(index_res)
        segs_filter = Segment.objects.filter(iri_id=index_res["iri_id"], element_id=index_res["element_id"], cutting_id=index_res["decoupage_id"], ensemble_id=index_res["ensemble_id"]) #@UndefinedVariable
        if index_res["project_id"]:
            segs_filter.filter(project_obj__ldt_id=index_res["project_id"])
        segs = segs_filter.values() 
        if segs and len(segs) > 0:
            seg = segs[0]             
            res = dict(res, **seg)
            del res["project_obj_id"]
            del res["content_id"]
            del res["id"]
            res["project_id"] = res["project_id"] if res["project_id"] else "_"            
        res["segment_detail_url"] = unicode(settings.WEB_URL.rstrip('/') + reverse('blinkster.views.segment_detail', args=[res["project_id"], res["iri_id"], res["ensemble_id"], res["cutting_id"], res["element_id"]]) + content_type_req)
        res["segment_video_url"] = unicode(settings.WEB_URL.rstrip('/') + reverse('blinkster.views.segment_ts_playlist', args=[res["project_id"], res["iri_id"], res["ensemble_id"], res["cutting_id"], res["element_id"]]) + content_type_req)
        res["segment_ldt_url"] = unicode(settings.WEB_URL.rstrip('/') + reverse('ldt.ldt_utils.views.index_segment', args=[res["project_id"], res["iri_id"], res["ensemble_id"], res["cutting_id"], res["element_id"]]) + content_type_req)
        results.append(res)
    
    return serialize_queryset_to_json(response, results, {u"query" : query, u"field": field, u"operator":operator, u"final_query": query_str})


def segment_ts_playlist(request, project_id, iri_id, ensemble_id, cutting_id, element_id):

    if project_id is None or project_id == "_":
        project_id = ""
    content_type = "application/x-mpegURL; charset=utf-8"
    segment = get_list_or_404(Segment, project_id=project_id, iri_id=iri_id, ensemble_id=ensemble_id, cutting_id=cutting_id, element_id=element_id)[0]
    start_ts = int(math.floor(segment.start_ts / 1000.0))
    
    content = Content.objects.get(iri_id=iri_id) #@UndefinedVariable
    content_duration = content.get_duration()
    
    if segment.duration == 0:
        start_ts = max(start_ts - settings.DEFAULT_SEGMENT_LENGTH_SECONDS / 2, 0)
        seg_duration = settings.DEFAULT_SEGMENT_LENGTH_SECONDS
    else:
        seg_duration = int(math.ceil(segment.duration / 1000.0))
        
    
    end_ts = min(math.floor(content_duration / 1000.0), start_ts + seg_duration)
    
    respstr = u"#EXTM3U\n"
    respstr += u"#EXT-X-TARGETDURATION:1\n"
    respstr += u"#EXT-X-MEDIA-SEQUENCE:0\n"

    ext = ".ts"
    
    
    for i in range(start_ts, end_ts + 1):
        respstr += u"#EXTINF:1,\n"
        respstr += u"%s%s/videos/%s/fileSequence%s%s\n" % (settings.WEB_URL, settings.MEDIA_URL, iri_id, i, ext)

    respstr += u"#EXT-X-ENDLIST\n"

    
    response = HttpResponse(content=respstr, mimetype=content_type)
    
    return response