]> git.parisson.com Git - telemeta.git/commitdiff
add MediaItem formset for edit, fix aprrox_duration bug when save
authoryomguy <yomguy@parisson.com>
Wed, 2 Feb 2011 14:13:41 +0000 (15:13 +0100)
committeryomguy <yomguy@parisson.com>
Wed, 2 Feb 2011 14:13:41 +0000 (15:13 +0100)
telemeta/models/core.py
telemeta/models/media.py
telemeta/models/query.py
telemeta/templates/telemeta/mediaitem_detail_edit.html [new file with mode: 0644]
telemeta/templates/telemeta_default/mediaitem_detail.html
telemeta/templates/telemeta_default/mediaitem_detail_edit.html [new file with mode: 0644]
telemeta/urls.py
telemeta/web/base.py

index a5ed16a1a5a8d0471da436edfe4c3738320c69a1..7c568004cb6b52befc07d3bb27a4209e51a61639 100644 (file)
@@ -165,7 +165,8 @@ class DurationField(models.Field):
             # information), but this can be a side-effect of interacting with a
             # database backend (e.g. Oracle), so we'll be accommodating.
             return self.to_python(value.time())
-
+        else:
+            value = str(value)
         try:
             return Duration.fromstr(value)
         except ValueError:
index c2747ee047176be116e7dbce082033457a1aee6f..5019b94075542adfb6d585770724a215d22bbb91 100644 (file)
@@ -41,6 +41,7 @@ import re
 from telemeta.models.location import LocationRelation, Location
 from telemeta.models.system import Revision
 from telemeta.models import query
+from django.forms import ModelForm
 
 class MediaResource(ModelCore):
     "Base class of all media objects"
@@ -202,7 +203,7 @@ class MediaCollection(MediaResource):
 
     class Meta(MetaCore):
         db_table = 'media_collections'
-
+    
 class MediaItem(MediaResource):
     "Describe an item"
     element_type = 'item'
@@ -374,3 +375,5 @@ class MediaItemMarker(ModelCore):
 
     def __unicode__(self):
         return self.time + ' : ' + self.description + '(' + self.author + ')'
+
+
index f99300cacc52bc8313d8710b794118ad6abf3b04..7e1906933cfb65a512fa7730493d1f3bc32f4d46 100644 (file)
@@ -1,4 +1,4 @@
-# -*- coding: utf-8 -*-
+    # -*- coding: utf-8 -*-
 # Copyright (C) 2007-2010 Samalyse SARL
 #
 # This software is a computer program whose purpose is to backup, analyse,
@@ -57,6 +57,10 @@ class MediaItemQuerySet(CoreQuerySet):
         return self.extra(
             where = ["collection_id NOT IN (SELECT id FROM media_collections)"]);
 
+    def by_public_id(self, public_id):
+        "Find items by public_id"
+        return self.filter(public_id=public_id) 
+
     def by_recording_date(self, from_date, to_date = None):
         "Find items by recording date"
         if to_date is None:
diff --git a/telemeta/templates/telemeta/mediaitem_detail_edit.html b/telemeta/templates/telemeta/mediaitem_detail_edit.html
new file mode 100644 (file)
index 0000000..eeeec91
--- /dev/null
@@ -0,0 +1 @@
+{% extends "telemeta_default/mediaitem_detail_edit.html" %}
index 44cc3460449cd2db817fdb300cea9e968d677d6c..0deefd7d2d5b05ba28213867c32fe172859d64be 100644 (file)
@@ -31,7 +31,10 @@ load_player({{ item.approx_duration.as_seconds }});
 \r
 {% if item %}\r
 {% block submenu %}\r
-    <div><a href="{% url telemeta-item-dublincore item.public_id %}">Dublin Core</a></div>\r
+    <div>\r
+    <a href="{% url telemeta-item-detail-edit item.public_id %}"><button>EDIT</button></a>\r
+    <a href="{% url telemeta-item-dublincore item.public_id %}">Dublin Core</a>\r
+    </div>\r
 {% endblock %}\r
 \r
 {% block content %}\r
diff --git a/telemeta/templates/telemeta_default/mediaitem_detail_edit.html b/telemeta/templates/telemeta_default/mediaitem_detail_edit.html
new file mode 100644 (file)
index 0000000..d505c77
--- /dev/null
@@ -0,0 +1,144 @@
+{% extends "telemeta/base.html" %}\r
+{% load telemeta_utils %}\r
+{% load i18n %}\r
+\r
+{% block head_title %}{% trans "Item" %}{{item|prepend:': '}} - {{ block.super }}{% endblock %}\r
+\r
+{% block stylesheets %}\r
+{{ block.super }}\r
+<link rel="stylesheet" type="text/css" href="{% url telemeta-timeside "css/timeside.css" %}" />\r
+<link rel="stylesheet" type="text/css" href="{% url telemeta-timeside "skins/lab/style.css" %}" />\r
+<link rel="stylesheet" type="text/css" href="{% url telemeta-css "player.css" %}" />\r
+{% endblock %}\r
+{% block extra_javascript %}\r
+\r
+<script src="{% url telemeta-js "wz_jsgraphics.js" %}" type="text/javascript"></script>\r
+<script src="{% url telemeta-js "soundmanager2.js" %}" type="text/javascript"></script>\r
+<script src="{% url telemeta-timeside "src/timeside.js" %}" type="text/javascript"></script>\r
+<script src="{% url telemeta-js "player.js" %}" type="text/javascript"></script>\r
+\r
+<script type="text/javascript">\r
+soundManager.url = '{% url telemeta-swf "./" %}';\r
+soundManager.flashVersion = 9;\r
+soundManager.useMovieStar = true; // enable MP4/M4A/AAC\r
+soundManager.debugMode = false;\r
+set_player_image_url('{% url telemeta-item-visualize item.public_id,visualizer_id,"WIDTH","HEIGHT" %}');\r
+load_player({{ item.approx_duration.as_seconds }});\r
+</script>\r
+\r
+{% endblock %}\r
+\r
+{% if item %}\r
+{% block submenu %}\r
+    <div>\r
+    <a href="{% url telemeta-item-dublincore item.public_id %}">Dublin Core</a>\r
+    </div>\r
+{% endblock %}\r
+\r
+{% block content %}\r
+\r
+<h3>Item : {{ item }}</h3>\r
+<div class="{% if item.file %}with-rightcol{% endif %}">\r
+\r
+{% if item.file %}\r
+    <div id="player_maximized" class="ts-skin-lab">\r
+        <a href="#" class="toggle">Minimize</a>\r
+        <div class="wazing"></div>\r
+    </div>\r
+    <div id="rightcol">\r
+        <div id="player_minimized" class="ts-skin-lab">\r
+        <a href="#" class="toggle">Maximize</a>\r
+        <div class="wazing"></div>\r
+        <div id="player" class="ts-player">\r
+            <div class="ts-viewer">\r
+                <div class="ts-wave">\r
+                    <div class="ts-image-container">\r
+                        <a href="{% url telemeta-item-export item.public_id,"mp3" %}">\r
+                        <img class="ts-image" src="{% url telemeta-item-visualize item.public_id,visualizer_id,360,130 %}"\r
+                          alt="" /></a>\r
+                    </div>\r
+                </div>\r
+            </div>\r
+        </div>\r
+        </div>\r
+\r
+        <div class="item_visualization">\r
+            <form id="visualizer_id_form" method="get" action="#">\r
+                <!--\r
+                <select name="visualizer_id" onchange="this.form.submit()">\r
+                    {% for v in visualizers %}\r
+                    <option value="{{ v.id }}" {% ifequal v.id visualizer_id %} selected="selected" {% endifequal %}>\r
+                    {{v.name}}</option>\r
+                    {% endfor %}\r
+                </select>\r
+                -->\r
+                <select id="visualizer_id" name="visualizer_id">\r
+                    {% for v in visualizers %}\r
+                    <option value="{% url telemeta-item-visualize item.public_id,v.id,"WIDTH","HEIGHT" %}">\r
+                    {{v.name}}</option>\r
+                    {% endfor %}\r
+                </select>\r
+                <input type="submit" value="Set" />\r
+            </form>\r
+\r
+          <div class="analyzer">\r
+            <table width="100%">\r
+             <tr class="analyzer-title">\r
+              <td>Property</td>\r
+              <td>Value</td>\r
+              <td>Unit</td>\r
+             <tr>\r
+            {% for analyser in analysers %}\r
+             <tr class="analyzer-line">\r
+              <td>\r
+                {{ analyser.name }}\r
+              </td>\r
+              <td>\r
+                {{ analyser.value }}\r
+              </td>\r
+              <td>\r
+                {{ analyser.unit }}\r
+              </td>\r
+            </tr>\r
+            {% endfor %}\r
+           </table>\r
+         </div>\r
+<!--\r
+        <form method="get" action="#">\r
+            <p>&nbsp;Vamp plugin analysis</p>\r
+            <select name="vamp_id">\r
+            {% for plugin in vamp_plugins %}\r
+            <option value="{{ plugin }}" {% ifequal plugin vamp_id %} selected="selected" {% endifequal %}>\r
+            {{ plugin }}</option>\r
+            {% endfor %}\r
+            </select>\r
+            <input type="submit" value="Get" />\r
+        </form>\r
+-->\r
+        </div>\r
+\r
+        {% if audio_export_enabled %}\r
+        <div class="exporter">\r
+            <p>{% trans "Download:" %}\r
+            {% for format in export_formats %}\r
+            <a href="{% url telemeta-item-export item.public_id,format.extension %}">{{ format.name }}</a>\r
+            {% endfor %}</p>\r
+        </div>\r
+        {% endif %}\r
+\r
+    </div>\r
+{% endif %}\r
+\r
+<div class="infos">\r
+<form method="POST" action="">{% csrf_token %}\r
+    {{ formset }}\r
+<button type="submit">SAVE</button>\r
+</form>\r
+</div>\r
+\r
+</div> <!-- with-rightcol -->\r
+\r
+{% endblock %}\r
+{% else %}\r
+    <p>No such item</p>\r
+{% endif %}\r
index a52536452ba33b8f58d8917e37a3531cdfc37e76..9e6b3a01368dbf5378ff794a768a3be17c00139c 100644 (file)
@@ -84,6 +84,9 @@ urlpatterns = patterns('',
         web_view.item_playlist, 
         dict(template="telemeta/mediaitem_xspf.xml", mimetype="application/xspf+xml"),
         name="telemeta-item-xspf"),
+    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/edit/$', 
+        web_view.item_detail_edit,
+        name="telemeta-item-detail-edit"),
 
     # collections
     url(r'^collections/$', 'django.views.generic.list_detail.object_list',
index 2407adac8a1ea7d1afb3956f2c6b5d4918702f9d..dac02486f3e527e667b6fc196b1030be2a760b24 100644 (file)
@@ -50,6 +50,7 @@ from django.conf import settings
 from django.contrib import auth
 from django.contrib.auth.decorators import login_required
 from django.core.context_processors import csrf
+from django.forms.models import modelformset_factory
 
 from telemeta.models import MediaItem, Location, MediaCollection, EthnicGroup
 from telemeta.models import dublincore, Enumeration, MediaItemMarker
@@ -174,13 +175,88 @@ class WebView(object):
                   
             self.cache.write_analyzer_xml(analyzers, analyze_file)
             
-        
         return render(request, template, 
                     {'item': item, 'export_formats': formats, 
                     'visualizers': graphers, 'visualizer_id': grapher_id,'analysers': analyzers,  #FIXME analysers
                     'audio_export_enabled': getattr(settings, 'TELEMETA_DOWNLOAD_ENABLED', True)
                     })
 
+    def item_detail_edit(self, request, public_id, template='telemeta/mediaitem_detail_edit.html'):
+        """Show the details of a given item"""
+        item = MediaItem.objects.get(public_id=public_id)
+        
+        formats = []
+        for encoder in self.encoders:
+            formats.append({'name': encoder.format(), 'extension': encoder.file_extension()})
+
+        graphers = []
+        for grapher in self.graphers:
+            graphers.append({'name':grapher.name(), 'id': grapher.id()})
+        if request.REQUEST.has_key('grapher_id'):
+            grapher_id = request.REQUEST['grapher_id']
+        else:
+            grapher_id = 'waveform'
+        
+        analyze_file = public_id + '.xml'
+        
+        if self.cache.exists(analyze_file):
+            analyzers = self.cache.read_analyzer_xml(analyze_file)
+            if not item.approx_duration:
+                for analyzer in analyzers:
+                    if analyzer['id'] == 'duration':
+                        value = analyzer['value']
+                        time = value.split(':')
+                        time[2] = time[2].split('.')[0]
+                        time = ':'.join(time)
+                        item.approx_duration = str(time)
+                        item.save()
+        else:
+            analyzers = []
+            analyzers_sub = []
+            if item.file:
+                decoder  = timeside.decoder.FileDecoder(item.file.path)
+                pipe = decoder
+                
+                for analyzer in self.analyzers:
+                    subpipe = analyzer()
+                    analyzers_sub.append(subpipe)
+                    pipe = pipe | subpipe
+                    
+                pipe.run()
+                
+                mime_type = decoder.format()
+                analyzers.append({'name': 'Mime type', 'id': 'mime_type', 'unit': '', 'value': mime_type})
+                    
+                for analyzer in analyzers_sub:
+                    value = analyzer.result()
+                    if analyzer.id() == 'duration':
+                        approx_value = int(round(value))
+                        item.approx_duration = approx_value
+                        item.save()
+                        value = datetime.timedelta(0,value)
+                        
+                    analyzers.append({'name':analyzer.name(),
+                                      'id':analyzer.id(),
+                                      'unit':analyzer.unit(),
+                                      'value':str(value)})
+                  
+            self.cache.write_analyzer_xml(analyzers, analyze_file)
+            
+        MediaItemFormSet = modelformset_factory(MediaItem)
+        if request.method == 'POST':
+            formset = MediaItemFormSet(request.POST, request.FILES, queryset=MediaItem.objects.filter(code=public_id))
+            if formset.is_valid():
+                formset.save()
+                # do something.
+        else:
+            formset = MediaItemFormSet(queryset=MediaItem.objects.filter(code=public_id))
+        
+        return render(request, template, 
+                    {'item': item, 'export_formats': formats, 
+                    'visualizers': graphers, 'visualizer_id': grapher_id,'analysers': analyzers,  #FIXME analysers
+                    'audio_export_enabled': getattr(settings, 'TELEMETA_DOWNLOAD_ENABLED', True), "formset": formset, 
+                    })
+        
     def item_analyze(self):
         pass
         
@@ -565,3 +641,5 @@ class WebView(object):
             dict['author'] = marker.author
             list.append(dict)
         return list
+
+