# 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:
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"
class Meta(MetaCore):
db_table = 'media_collections'
-
+
class MediaItem(MediaResource):
"Describe an item"
element_type = 'item'
def __unicode__(self):
return self.time + ' : ' + self.description + '(' + self.author + ')'
+
+
-# -*- coding: utf-8 -*-
+ # -*- coding: utf-8 -*-
# Copyright (C) 2007-2010 Samalyse SARL
#
# This software is a computer program whose purpose is to backup, analyse,
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:
--- /dev/null
+{% extends "telemeta_default/mediaitem_detail_edit.html" %}
\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
--- /dev/null
+{% 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> 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
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',
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
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
dict['author'] = marker.author
list.append(dict)
return list
+
+