src/ldt/ldt/ldt_utils/segmentserializer.py
author verrierj
Wed, 18 Jan 2012 15:30:35 +0100
changeset 412 8d777b1d1d92
child 415 4236f99104ba
permissions -rw-r--r--
Add API to search annotations inside a content between two timecodes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
412
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
     1
from django.conf import settings
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
     2
from django.utils.datastructures import SortedDict
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
     3
import uuid
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
     4
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
     5
DATE_FORMATS = ["%d/%m/%Y", "%Y-%m-%d"]
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
     6
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
     7
class SegmentSerializer(object):
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
     8
    """
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
     9
    Serialize a set of annotations to a cinelab compatible array
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    10
    """
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    11
    
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    12
    def __init__(self, content, segments, viewable_contents=[], default_color=2194379):
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    13
        self.content = content
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    14
        self.segments = segments
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    15
        self.viewable_contents = viewable_contents
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    16
        self.default_color = default_color
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    17
        self.views = None
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    18
        self.annotation_types = None
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    19
        self.medias = None
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    20
        self.annotations = None
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    21
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    22
    
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    23
    def __parse_views(self):
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    24
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    25
        view = {
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    26
                "id": "0",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    27
                "contents": [
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    28
                    self.content.iri_id
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    29
                ],
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    30
                "annotation_types": [ ],
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    31
        }
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    32
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    33
        self.annotation_types = []
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    34
        annotation_types = [seg.cutting_id for seg in self.segments]
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    35
        for a in annotation_types:
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    36
            view['annotation_types'].append(a)
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    37
            self.annotation_types.append({
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    38
                    "dc:contributor": "undefined",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    39
                    "dc:creator": "undefined",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    40
                    "dc:title": "cutting %s" % a,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    41
                    "id": "%s" % a,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    42
                    "dc:created": "",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    43
                    "dc:description": "",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    44
                    "dc:modified": ""
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    45
                })
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    46
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    47
        self.views = [view]
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    48
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    49
    
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    50
    def __parse_content(self):
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    51
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    52
        href = ""
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    53
        meta_item_value = ""
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    54
        if self.content.iri_id not in self.viewable_contents:
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    55
            href = settings.FORBIDDEN_STREAM_URL
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    56
        elif self.content.videopath:
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    57
            href = self.content.videopath.rstrip('/') + "/" + self.content.src
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    58
            meta_item_value = self.content.videopath.rstrip('/') + "/"
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    59
        else:
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    60
            href = self.content.src
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    61
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    62
        media = {
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    63
             "http://advene.liris.cnrs.fr/ns/frame_of_reference/ms" : "o=0",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    64
             "id" : self.content.iri_id,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    65
             "href" : href,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    66
             "unit" : "ms",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    67
             "origin" : "0",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    68
             "meta": {
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    69
                 "dc:creator" : "",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    70
                 "dc:created" : self.content.creation_date.isoformat(),
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    71
                 "dc:contributor" : "",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    72
                 "dc:modified" : self.content.update_date.isoformat(),
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    73
                 "dc:creator.contents" : "",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    74
                 "dc:title" : self.content.title,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    75
                 "dc:description" : self.content.description,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    76
                 "dc:duration" : self.content.get_duration(),
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    77
                 "item": {
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    78
                     "name" : "streamer",
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    79
                     "value": meta_item_value,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    80
                 },
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    81
             }
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    82
        }
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    83
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    84
        self.medias = [media]
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    85
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    86
    
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    87
    def __parse_segments(self):
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    88
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    89
        self.annotations = []
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    90
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    91
        for seg in self.segments:
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    92
            
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    93
            segment = {
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    94
                'begin': seg.start_ts,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    95
                'end': seg.start_ts + seg.duration,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    96
                'tags': seg.tags,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    97
                'id': "s_%s" % unicode(uuid.uuid1()),
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    98
                'color': "%s" % self.default_color,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
    99
                'media': self.content.iri_id,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   100
                'content': {
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   101
                    'mimetype': 'application/x-ldt-structured',
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   102
                    'description': seg.abstract,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   103
                    'img': {
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   104
                        'src': ''
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   105
                    },
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   106
                    'title': seg.title,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   107
                    'color': '2194379',
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   108
                    'polemics': [ ],
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   109
                    'audio': {
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   110
                        'mimetype': 'audio/mp3',
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   111
                        'src': '',
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   112
                        'href': 'null'
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   113
                    }
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   114
                
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   115
                },
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   116
                'meta': {
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   117
                         "dc:creator": seg.author,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   118
                         "dc:contributor": seg.author,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   119
                         "dc:created": seg.date,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   120
                         "dc:modified": seg.date,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   121
                         "id-ref": seg.iri_id,
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   122
                         "project": seg.project_id
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   123
                         }
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   124
            }
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   125
            
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   126
            self.annotations.append(segment)
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   127
    
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   128
    def serialize_to_cinelab(self):
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   129
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   130
        self.__parse_content()
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   131
        self.__parse_segments()
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   132
        self.__parse_views()
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   133
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   134
        res = {}
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   135
        res['views'] = self.views 
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   136
        res['tags'] = None
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   137
        res['lists'] = None
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   138
        res['medias'] = self.medias
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   139
        res['annotations'] = self.annotations
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   140
        res['annotation-types'] = self.annotation_types
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   141
        
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   142
        return res
8d777b1d1d92 Add API to search annotations inside a content between two timecodes
verrierj
parents:
diff changeset
   143