web/ldt/ldt_utils/projectserializer.py
author wakimd
Sun, 14 Nov 2010 20:25:22 +0100
changeset 1 3a30d255c235
permissions -rw-r--r--
First version of API with tests
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
     1
from datetime import datetime
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
     2
from django.utils.datastructures import SortedDict
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
     3
from ldt.ldt_utils.models import Content, Project
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
     4
import logging
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
     5
import lxml.etree
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
     6
import uuid
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
     7
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
     8
DATE_FORMATS = ["%d/%m/%Y","%Y-%m-%d"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
     9
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    10
"""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    11
Serialize a project object to a cinelab compatible array
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    12
"""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    13
class ProjectSerializer:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    14
    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    15
    def __init__(self, project, from_contents=True, from_display=True):
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    16
        self.project = project
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    17
        self.parsed = False
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    18
        self.ldt_doc = None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    19
        self.medias_dict = SortedDict()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    20
        self.annotations_dict = SortedDict()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    21
        self.annotations_by_annotation_types = {}
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    22
        self.tags = {}
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    23
        self.tags_dict = SortedDict()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    24
        self.annotation_types_dict = SortedDict()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    25
        self.views_dict = SortedDict()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    26
        self.lists_dict = SortedDict()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    27
        self.serialize_contents = from_contents
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    28
        self.from_display = from_display
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    29
        self.display_contents_list = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    30
        self.display_cuttings_list = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    31
        self.display_ensemble_list = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    32
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    33
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    34
    def __parse_views(self, display_node_list):
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    35
        for display_node in display_node_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    36
            display_id = display_node.get(u"id", None)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    37
            if not display_id:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    38
                continue
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    39
            content_list = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    40
            cuttings_list = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    41
            new_display = {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    42
                "id": display_id,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    43
                "contents": content_list,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    44
                "annotation_types": cuttings_list,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    45
            }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    46
            
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    47
            for content_node in display_node.xpath("content"):
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    48
                content_id = content_node.get("id")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    49
                if content_id not in content_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    50
                    content_list.append(content_id)                    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    51
                if content_id not in self.display_contents_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    52
                    self.display_contents_list.append(content_id)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    53
                for cutting_node  in content_node.xpath("decoupage"):
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    54
                    cutting_id = cutting_node.get("id")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    55
                    if cutting_id not in cuttings_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    56
                        cuttings_list.append(cutting_id)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    57
                    if cutting_id not in self.display_cuttings_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    58
                        self.display_cuttings_list.append(cutting_id)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    59
                    ensemble_id = cutting_node.get("idens")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    60
                    if ensemble_id not in self.display_ensemble_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    61
                        self.display_ensemble_list.append(ensemble_id)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    62
            self.views_dict[display_id] = new_display
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    63
                    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    64
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    65
    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    66
    def __parse_ensemble(self, ensemble_node, content):
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    67
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    68
        ensemble_id = ensemble_node.attrib[u"id"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    69
        ensemble_author = ensemble_node.attrib[u"author"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    70
        ensemble_title = ensemble_node.attrib[u"title"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    71
        ensemble_description = ensemble_node.attrib[u"abstract"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    72
        ensemble_created = datetime.utcnow().isoformat()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    73
        ensemble_modified = ensemble_created 
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    74
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    75
        list_items = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    76
        new_list = {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    77
            "id" : ensemble_id,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    78
            "items" : list_items,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    79
            "meta" : {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    80
                "dc:creator":ensemble_author,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    81
                "dc:created": ensemble_created,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    82
                "dc:contributor":"undefined",
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    83
                "dc:modified": ensemble_modified,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    84
                "dc:title":ensemble_title,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    85
                "dc:description": ensemble_description,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    86
                "id-ref":content.iri_id,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    87
                "editable":"false"
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    88
            }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    89
        }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    90
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    91
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    92
        for decoupage_node in ensemble_node:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    93
            if decoupage_node.tag != "decoupage" :
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    94
                continue
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    95
            
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    96
            decoupage_id = decoupage_node.attrib[ u"id"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    97
            if self.from_display and decoupage_id not in self.display_cuttings_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    98
                continue
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
    99
            decoupage_creator = decoupage_node.attrib[u"author"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   100
            if not decoupage_creator:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   101
                decoupage_creator = "IRI"
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   102
            decoupage_contributor = decoupage_creator
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   103
            date_str = decoupage_node.get(u"date")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   104
            decoupage_created = None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   105
            if date_str :
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   106
                for date_format in DATE_FORMATS:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   107
                    try:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   108
                        decoupage_created = datetime.strptime(date_str,date_format).isoformat()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   109
                        break
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   110
                    except Exception:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   111
                        decoupage_created = None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   112
            if decoupage_created is None:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   113
                decoupage_created = datetime.utcnow().isoformat()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   114
            decoupage_modified = decoupage_created
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   115
            
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   116
            decoupage_title = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   117
            for txtRes in decoupage_node.xpath("title/text()", smart_strings=False): 
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   118
                    decoupage_title += txtRes
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   119
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   120
            decoupage_description = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   121
            for txtRes in decoupage_node.xpath("abstract/text()", smart_strings=False): 
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   122
                    decoupage_description += txtRes
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   123
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   124
            
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   125
            list_items.append({"id-ref":decoupage_id})
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   126
            
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   127
            new_annotation_types = {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   128
                "id":decoupage_id,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   129
                "dc:creator":decoupage_creator,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   130
                "dc:created":decoupage_created,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   131
                "dc:contributor":decoupage_contributor,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   132
                "dc:modified":decoupage_modified,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   133
                "dc:title":decoupage_title,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   134
                "dc:description":decoupage_description
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   135
            }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   136
            
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   137
            self.annotation_types_dict[decoupage_id] = new_annotation_types
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   138
            self.annotations_by_annotation_types[decoupage_id] = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   139
                        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   140
            res = decoupage_node.xpath("elements/element")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   141
            for element_node in res:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   142
                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   143
                element_id = element_node.attrib[u"id"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   144
                element_begin = element_node.attrib[u"begin"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   145
                element_duration = element_node.attrib[u"dur"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   146
                element_media = content.iri_id
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   147
                element_color = element_node.attrib[u"color"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   148
                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   149
                element_title = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   150
                for txtRes in element_node.xpath("title/text()", smart_strings=False): 
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   151
                    element_title += txtRes
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   152
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   153
                element_description = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   154
                for txtRes in element_node.xpath("abstract/text()", smart_strings=False): 
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   155
                    element_description += txtRes
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   156
                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   157
                element_audio_src = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   158
                element_audio_href = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   159
                res = element_node.xpath("audio")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   160
                if len(res) > 0:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   161
                    element_audio_src = res[0].get(u"source",u"")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   162
                    element_audio_href =  res[0].text                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   163
                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   164
                element_tags = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   165
                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   166
                tags = element_node.get(u"tags",u"")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   167
                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   168
                tags_list = map(lambda s:s.strip(),tags.split(","))
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   169
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   170
                #tags                                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   171
                if tags is None or len(tags) == 0:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   172
                    tags_list = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   173
                    restagnode = element_node.xpath("tag/text()", smart_strings=False)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   174
                    for tagnode in restagnode:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   175
                        tags_list.append(tagnode)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   176
                        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   177
                if tags_list is None or len(tags_list) == 0:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   178
                    tags_list = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   179
                    restagnode = element_node.xpath("tags/tag/text()", smart_strings=False)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   180
                    for tagnode in restagnode:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   181
                        tags_list.append(tagnode)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   182
                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   183
                tag_date = datetime.utcnow().isoformat()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   184
                for tag_title in tags_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   185
                    if tag_title not in self.tags:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   186
                        tag_id = unicode(uuid.uuid1())
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   187
                        new_tag = {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   188
                            "id":tag_id,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   189
                            "meta" : {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   190
                                "dc:creator":"IRI",
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   191
                                "dc:created": tag_date,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   192
                                "dc:contributor":"IRI",
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   193
                                "dc:modified": tag_date,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   194
                                "dc:title":tag_title
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   195
                            }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   196
                        }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   197
                        self.tags[tag_title] = new_tag
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   198
                        self.tags_dict[tag_id] = new_tag
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   199
                    element_tags.append({"id-ref":tag_id})
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   200
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   201
                if not element_tags:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   202
                    element_tags = None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   203
                    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   204
                new_annotation = {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   205
                    "begin": element_begin,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   206
                    "end": int(element_begin) + int(element_duration),
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   207
                    "id": element_id,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   208
                    "media": element_media,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   209
                    "content": {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   210
                        "mimetype": "application/x-ldt-structured",
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   211
                        "title": element_title,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   212
                        "description": element_description,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   213
                        "color": element_color,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   214
                        "audio": {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   215
                            "src" : element_audio_src,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   216
                            "mimetype": "audio/mp3",
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   217
                            "href": element_audio_href
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   218
                        },
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   219
                    },
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   220
                    "tags": element_tags,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   221
                    "meta": {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   222
                        "id-ref": decoupage_id,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   223
                        "dc:creator": decoupage_creator,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   224
                        "dc:contributor": decoupage_contributor,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   225
                        "dc:created": decoupage_created,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   226
                        "dc:modified": decoupage_modified
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   227
                    }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   228
                }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   229
                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   230
                self.annotations_dict[element_id] = new_annotation
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   231
                self.annotations_by_annotation_types[decoupage_id].append(new_annotation)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   232
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   233
        if not list_items:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   234
            new_list["items"] = None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   235
        self.lists_dict[ensemble_id] = new_list
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   236
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   237
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   238
    def __parse_ldt(self):
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   239
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   240
        self.ldt_doc = lxml.etree.fromstring(self.project.ldt.encode("utf-8"))
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   241
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   242
        if self.from_display:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   243
            xpath_str = "/iri/displays/display[position()=1]"
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   244
            if isinstance(self.from_display, basestring):
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   245
                xpath_str = "/iri/displays/display[@id='%s']" % self.from_display
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   246
            
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   247
            self.__parse_views(self.ldt_doc.xpath(xpath_str))
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   248
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   249
        res = self.ldt_doc.xpath("/iri/medias/media")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   250
        for mediaNode in res:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   251
            iri_id = mediaNode.attrib[u"id"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   252
            if self.from_display and iri_id not in self.display_contents_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   253
                continue
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   254
            content = Content.objects.get(iri_id=iri_id)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   255
            self.__parse_content(content)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   256
            
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   257
        res = self.ldt_doc.xpath("/iri/annotations/content")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   258
        for content_node in res:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   259
            content_id = content_node.attrib[u"id"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   260
            if self.from_display and content_id not in self.display_contents_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   261
                continue
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   262
            content = Content.objects.get(iri_id=content_id)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   263
            for ensemble_node in content_node:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   264
                if ensemble_node.tag != "ensemble" :
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   265
                    continue
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   266
                ensemble_id = ensemble_node.get("id")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   267
                if self.from_display and ensemble_id not in self.display_ensemble_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   268
                    continue
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   269
                self.__parse_ensemble(ensemble_node, content)            
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   270
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   271
        #reorder annotations and annotation type from view
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   272
        if self.from_display and len(self.views_dict) > 0:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   273
            new_annotation_types_dict = SortedDict()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   274
            new_annotations_dict = SortedDict()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   275
            for annotation_type in self.display_cuttings_list:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   276
                if annotation_type in self.annotation_types_dict:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   277
                    new_annotation_types_dict[annotation_type] = self.annotation_types_dict[annotation_type]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   278
                    for annot in self.annotations_by_annotation_types[annotation_type]:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   279
                        new_annotations_dict[annot['id']] = annot
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   280
                    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   281
            self.annotations_dict = new_annotations_dict
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   282
            self.annotation_types_dict = new_annotation_types_dict
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   283
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   284
        self.parsed = True
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   285
    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   286
    def __parse_content(self, content):
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   287
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   288
        doc = lxml.etree.parse(content.iri_file_path())
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   289
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   290
        authors = content.authors.all()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   291
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   292
        if len(authors) > 0 :
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   293
            author = authors[0].handle
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   294
        else :
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   295
            author = "IRI"
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   296
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   297
        if len(authors) > 1 :
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   298
            contributor = authors[1].handle
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   299
        else :
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   300
            contributor = author
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   301
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   302
        content_author = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   303
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   304
        res = doc.xpath("/iri/head/meta[@name='author']/@content")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   305
        if len(res) > 0:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   306
            content_author = res[0]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   307
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   308
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   309
        content_date = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   310
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   311
        res = doc.xpath("/iri/head/meta[@name='date']/@content")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   312
        if len(res) > 0:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   313
            content_date = res[0]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   314
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   315
        href = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   316
        meta_item_value = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   317
        if content.videopath:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   318
            href = content.videopath.rstrip('/') + "/" + content.src
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   319
            meta_item_value = content.videopath.rstrip('/') + "/"
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   320
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   321
        new_media = {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   322
             "http://advene.liris.cnrs.fr/ns/frame_of_reference/ms" : "o=0",
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   323
             "id" : content.iri_id,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   324
             "href" : href,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   325
             "unit" : "ms",
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   326
             "origin" : "0",
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   327
             "meta": {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   328
                 "dc:creator" : author,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   329
                 "dc:created" : content.creation_date.isoformat(),
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   330
                 "dc:contributor" : contributor,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   331
                 "dc:modified" : content.update_date.isoformat(),
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   332
                 "dc:creator.contents" : content_author,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   333
                 "dc:created.contents" : content_date,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   334
                 "dc:title" : content.title,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   335
                 "dc:description" : content.description,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   336
                 "dc:duration" : content.get_duration(),
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   337
                 "item": {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   338
                     "name" : "streamer",
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   339
                     "value": meta_item_value, 
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   340
                 },
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   341
             }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   342
        }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   343
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   344
        self.medias_dict[content.iri_id] = new_media
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   345
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   346
        if self.serialize_contents:        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   347
            res = doc.xpath("/iri/body/ensembles/ensemble")
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   348
            for ensemble_node in res:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   349
                self.__parse_ensemble(ensemble_node, content)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   350
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   351
    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   352
    def serialize_to_cinelab(self):
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   353
    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   354
        res = {}
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   355
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   356
        if not self.parsed:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   357
            self.__parse_ldt()    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   358
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   359
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   360
        project_main_media = ""
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   361
        if len(self.medias_dict) > 0:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   362
            project_main_media = self.medias_dict.value_for_index(0)["id"]
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   363
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   364
        res['meta'] = {
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   365
             'id': self.project.ldt_id,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   366
             'dc:created':self.project.creation_date.isoformat(),
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   367
             'dc:modified':self.project.modification_date.isoformat(),
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   368
             'dc:contributor':self.project.changed_by,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   369
             'dc:creator':self.project.created_by,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   370
             'dc:title':self.project.title,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   371
             'dc:description':self.project.get_description(self.ldt_doc), # get from doc, parse ldt
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   372
             'main_media': {"id-ref":project_main_media}
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   373
            }
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   374
                
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   375
                    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   376
        res['medias'] =  self.medias_dict.values() if len(self.medias_dict) > 0 else None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   377
        res['lists'] = self.lists_dict.values() if len(self.lists_dict) > 0 else None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   378
        res['tags'] = self.tags.values() if len(self.tags) > 0 else None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   379
        res['views'] = self.views_dict.values() if len(self.views_dict) > 0 else None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   380
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   381
        res['annotation-types'] = self.annotation_types_dict.values() if len(self.annotation_types_dict) > 0 else None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   382
        res['annotations'] = self.annotations_dict.values() if len(self.annotations_dict) > 0 else None 
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   383
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   384
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   385
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   386
        return res
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   387
    
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   388
    def getAnnotations(self, first_cutting=True):
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   389
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   390
        if not self.parsed:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   391
            self.__parse_ldt()
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   392
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   393
        annotations = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   394
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   395
        current_cutting = None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   396
        uri = None
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   397
        for annot in self.annotations_dict.values():
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   398
            logging.debug("current cutting" + repr(current_cutting) + " : annot " + annot['meta']['id-ref'])
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   399
            if first_cutting and current_cutting and current_cutting != annot['meta']['id-ref'] :
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   400
                break
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   401
            current_cutting = annot['meta']['id-ref']
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   402
            content_id = annot['media']
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   403
            content = Content.objects.get(iri_id=content_id)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   404
            if annot['tags']:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   405
                tags_list = map(lambda tag_entry: self.tags_dict[tag_entry['id-ref']]['meta']['dc:title'],annot['tags'])
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   406
            else:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   407
                tags_list = []
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   408
            begin = int(annot['begin'])
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   409
            duration = int(annot['end'])-begin
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   410
            if content.media_obj and content.media_obj.external_publication_url:
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   411
                uri = "%s#t=%d" % (content.media_obj.external_publication_url, begin)
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   412
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   413
        
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   414
            annotations.append({
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   415
                'begin': begin,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   416
                'duration':duration,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   417
                'title':annot['content']['title'],
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   418
                'desc':annot['content']['description'],
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   419
                'tags': tags_list,
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   420
                'id':annot['id'],
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   421
                'uri':uri
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   422
            })
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   423
            
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   424
        return annotations
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   425
3a30d255c235 First version of API with tests
wakimd
parents:
diff changeset
   426