--- /dev/null
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2010 Guillaume Pellerin
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://svn.parisson.org/telemeta/TelemetaLicense.
+#
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+#
+
+import os
+import sys
+import logging
+import datetime
+from django.core.management import setup_environ
+from django.core.files.base import ContentFile
+
+
+class Logger:
+
+ def __init__(self, file):
+ self.logger = logging.getLogger('myapp')
+ self.hdlr = logging.FileHandler(file)
+ self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
+ self.hdlr.setFormatter(self.formatter)
+ self.logger.addHandler(self.hdlr)
+ self.logger.setLevel(logging.INFO)
+
+ def write_info(self, prefix, message):
+ self.logger.info(' ' + prefix + ' : ' + message.decode('utf8'))
+
+ def write_error(self, prefix, message):
+ self.logger.error(prefix + ' : ' + message.decode('utf8'))
+
+
+class TelemetaMediaImport:
+
+ def __init__(self, media_dir, log_file):
+ self.logger = Logger(log_file)
+ self.media_dir = media_dir + os.sep + 'items'
+ self.medias = os.listdir(self.media_dir)
+ self.buffer_size = 0x1000
+
+ def media_import(self):
+ import telemeta.models
+ for media in self.medias:
+ print media
+ filename, ext = os.path.splitext(media)
+ data = filename.split('.')
+ date = data[0]
+ collection_name = data[1]
+ other = ''
+ if len(data) > 2:
+ other = '.'.join(data[2:])
+
+ item = telemeta.models.media.MediaItem.objects.filter(code=filename)
+ collections = telemeta.models.media.MediaCollection.objects.filter(code=collection_name)
+
+ if not collections:
+ c = telemeta.models.media.MediaCollection(code=collection_name)
+ c.title = collection_name
+ c.save()
+ msg = 'added'
+ self.logger.write_info(collection_name, msg)
+ collection = c
+ else:
+ collection = collections[0]
+
+ if not item:
+ item = telemeta.models.media.MediaItem(collection=collection, code=filename)
+ item.title = filename
+ item.file = self.media_dir + os.sep + media
+ item.save()
+ msg = 'added item : ' + filename
+ self.logger.write_info(collection_name, msg)
+
+
+def run():
+ project_dir = sys.argv[-2]
+ log_file = sys.argv[-1]
+ sys.path.append(project_dir)
+ import settings
+ setup_environ(settings)
+ media_dir = settings.MEDIA_ROOT
+ t = TelemetaMediaImport(media_dir, log_file)
+ t.media_import()
+
+if __name__ == '__main__':
+ run()
-# -*- coding: utf-8 -*-
+ # -*- coding: utf-8 -*-
# Copyright (C) 2007-2010 Samalyse SARL
# This software is a computer program whose purpose is to backup, analyse,
element_type = 'collection'
PUBLIC_ACCESS_CHOICES = (('none', 'none'), ('metadata', 'metadata'), ('full', 'full'))
- published_code_regex = '[A-Za-z0-9.]*'
- unpublished_code_regex = '[A-Za-z0-9.]*'
+ published_code_regex = '[A-Za-z0-9._]*'
+ unpublished_code_regex = '[A-Za-z0-9._]*'
code_regex = '(?:%s|%s)' % (published_code_regex, unpublished_code_regex)
reference = CharField(_('reference'), unique=True, null=True)
def save(self, force_insert=False, force_update=False):
if not self.code:
raise RequiredFieldError(self, self._meta.get_field('code'))
- if not self.is_valid_code(self.code):
- raise MediaInvalidCodeError("%s is not a valid code for this collection" % self.code)
+# if not self.is_valid_code(self.code):
+# raise MediaInvalidCodeError("%s is not a valid code for this collection" % self.code)
super(MediaCollection, self).save(force_insert, force_update)
class Meta(MetaCore):
element_type = 'item'
PUBLIC_ACCESS_CHOICES = (('none', 'none'), ('metadata', 'metadata'), ('full', 'full'))
- published_code_regex = '[A-Za-z0-9.]*'
- unpublished_code_regex = '[A-Za-z0-9.]*'
+ published_code_regex = '[A-Za-z0-9._]*'
+ unpublished_code_regex = '[A-Za-z0-9._]*'
code_regex = '(?:%s|%s)' % (published_code_regex, unpublished_code_regex)
collection = ForeignKey('MediaCollection', related_name="items",
return False
def save(self, force_insert=False, force_update=False):
- if self.code and not self.is_valid_code(self.code):
- raise MediaInvalidCodeError("%s is not a valid item code for collection %s"
- % (self.code, self.collection.code))
+# if self.code and not self.is_valid_code(self.code):
+# raise MediaInvalidCodeError("%s is not a valid item code for collection %s"
+# % (self.code, self.collection.code))
super(MediaItem, self).save(force_insert, force_update)
def computed_duration(self):
url(r'^items/$', 'django.views.generic.list_detail.object_list',
dict(all_items, paginate_by=20, template_name="telemeta/mediaitem_list.html"),
name="telemeta-items"),
- url(r'^items/(?P<public_id>[A-Za-z0-9.]+)/$', web_view.item_detail,
+ url(r'^items/(?P<public_id>[A-Za-z0-9._]+)/$', web_view.item_detail,
name="telemeta-item-detail"),
- url(r'^items/(?P<public_id>[A-Za-z0-9.]+)/dc/$', web_view.item_detail,
+ url(r'^items/(?P<public_id>[A-Za-z0-9._]+)/dc/$', web_view.item_detail,
{'template': 'telemeta/mediaitem_detail_dc.html'},
name="telemeta-item-dublincore"),
- url(r'^items/(?P<public_id>[A-Za-z0-9.]+)/dc/xml/$', web_view.item_detail,
+ url(r'^items/(?P<public_id>[A-Za-z0-9._]+)/dc/xml/$', web_view.item_detail,
{'format': 'dublin_core_xml'},
name="telemeta-item-dublincore-xml"),
- url(r'^items/download/(?P<public_id>[A-Za-z0-9.]+)\.(?P<extension>'
+ url(r'^items/download/(?P<public_id>[A-Za-z0-9._]+)\.(?P<extension>'
+ export_extensions + ')$',
web_view.item_export,
name="telemeta-item-export"),
- url(r'^items/(?P<public_id>[A-Za-z0-9.]+)/visualize/(?P<visualizer_id>[0-9a-z_]+)/(?P<width>[0-9A-Z]+)x(?P<height>[0-9A-Z]+)/$',
+ url(r'^items/(?P<public_id>[A-Za-z0-9._]+)/visualize/(?P<visualizer_id>[0-9a-z_]+)/(?P<width>[0-9A-Z]+)x(?P<height>[0-9A-Z]+)/$',
web_view.item_visualize,
name="telemeta-item-visualize"),
- url(r'^items/(?P<public_id>[A-Za-z0-9.]+)/analyze/(?P<analyzer_id>[0-9a-z_]+)/$',
+ url(r'^items/(?P<public_id>[A-Za-z0-9._]+)/analyze/(?P<analyzer_id>[0-9a-z_]+)/$',
web_view.item_analyze,
name="telemeta-item-analyze"),
- url(r'^items/(?P<public_id>[A-Za-z0-9.]+)/item_xspf.xml$',
+ url(r'^items/(?P<public_id>[A-Za-z0-9._]+)/item_xspf.xml$',
web_view.item_playlist,
dict(template="telemeta/mediaitem_xspf.xml", mimetype="application/xspf+xml"),
name="telemeta-item-xspf"),
url(r'^collections/?page=(?P<page>[0-9]+)$',
'django.views.generic.list_detail.object_list',
dict(all_collections, paginate_by=20)),
- url(r'^collections/(?P<public_id>[A-Za-z0-9.]+)/$', web_view.collection_detail,
+ url(r'^collections/(?P<public_id>[A-Za-z0-9._]+)/$', web_view.collection_detail,
dict(template="telemeta/collection_detail.html"), name="telemeta-collection-detail"),
- url(r'^collections/(?P<public_id>[A-Za-z0-9.]+)/dc/$', web_view.collection_detail,
+ url(r'^collections/(?P<public_id>[A-Za-z0-9._]+)/dc/$', web_view.collection_detail,
dict(template="telemeta/collection_detail_dc.html"), name="telemeta-collection-dublincore"),
- url(r'^collections/(?P<public_id>[A-Za-z0-9.]+)/collection_xspf.xml$',
+ url(r'^collections/(?P<public_id>[A-Za-z0-9._]+)/collection_xspf.xml$',
web_view.collection_playlist,
dict(template="telemeta/collection_xspf.xml", mimetype="application/xspf+xml"),
name="telemeta-collection-xspf"),
- url(r'^collections/(?P<public_id>[A-Za-z0-9.]+)/collection.m3u$',
+ url(r'^collections/(?P<public_id>[A-Za-z0-9._]+)/collection.m3u$',
web_view.collection_playlist,
dict(template="telemeta/collection.m3u", mimetype="audio/mpegurl"),
name="telemeta-collection-m3u"),