Changeset d511f9f


Ignore:
Timestamp:
Dec 7, 2011 3:32:19 PM (3 years ago)
Author:
yomguy <yomguy@…>
Branches:
master, crem, crem2, dev, dev2, diadems, dj1.6, feature/breadcrumbs, feature/ts-0.5, feature/ts-0.5.4, feature/writecache, forma, generic, instru_search, lam, lam2, mapsv3, merge, nlivemulti, production, release/1.4.4, sabiod, security, server, social, storage, telecaster, test, video
Children:
06ce8dd
Parents:
40aa64b
git-author:
yomguy <yomguy@…> (07/12/2011 15:32:19)
git-committer:
yomguy <yomguy@…> (07/12/2011 15:32:19)
Message:

transcode flag only from source streaming, cleanup

Location:
telemeta
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • telemeta/__init__.py

    r887f937 rd511f9f  
    1313 
    1414__docformat__ = 'epytext en' 
    15 __version__ = '1.3' 
     15__version__ = '1.4' 
    1616__url__ = 'http://telemeta.org' 
    1717__copyright__ = '(C) 2007-2011 Parisson' 
     
    2424<riccardo.zaccarelli@gmail.com> 
    2525 
    26 This software is a computer program whose purpose is to backup, analyse,  
     26This software is a computer program whose purpose is to backup, analyse, 
    2727transcode and stream any audio content with its metadata. 
    2828 
    2929This software is governed by the CeCILL v2 license under French law and 
    30 abiding by the rules of distribution of free software.  You can  use,  
     30abiding by the rules of distribution of free software.  You can  use, 
    3131modify and/ or redistribute the software under the terms of the CeCILL 
    3232license as circulated by CEA, CNRS and INRIA at the following URL 
    33 "http://www.cecill.info".  
     33"http://www.cecill.info". 
    3434 
    3535As a counterpart to the access to the source code and  rights to copy, 
     
    3737with a limited warranty  and the software's author,  the holder of the 
    3838economic rights,  and the successive licensors  have only  limited 
    39 liability.  
     39liability. 
    4040 
    4141In this respect, the user's attention is drawn to the risks associated 
     
    4646professionals having in-depth computer knowledge. Users are therefore 
    4747encouraged to load and test the software's suitability as regards their 
    48 requirements in conditions enabling the security of their systems and/or  
    49 data to be ensured and,  more generally, to use and operate it in the  
    50 same conditions as regards security.  
     48requirements in conditions enabling the security of their systems and/or 
     49data to be ensured and,  more generally, to use and operate it in the 
     50same conditions as regards security. 
    5151 
    5252The fact that you are presently reading this means that you have had 
  • telemeta/models/media.py

    r33d177a rd511f9f  
    5151from django.db.models.fields import URLField 
    5252 
    53          
     53 
    5454collection_published_code_regex   = '[A-Za-z0-9._-]*' 
    5555collection_unpublished_code_regex = '[A-Za-z0-9._-]*' 
    56 collection_code_regex             = '(?:%s|%s)' % (collection_published_code_regex,  
     56collection_code_regex             = '(?:%s|%s)' % (collection_published_code_regex, 
    5757                                                    collection_unpublished_code_regex) 
    5858 
     
    7777    def set_revision(self, user): 
    7878        "Save a media object and add a revision" 
    79         Revision.touch(self, user)     
     79        Revision.touch(self, user) 
    8080 
    8181    def get_revision(self): 
     
    8787class MediaRelated(MediaResource): 
    8888    "Related media" 
    89      
     89 
    9090    element_type = 'media' 
    91      
     91 
    9292    title           = CharField(_('title')) 
    9393    date            = DateTimeField(_('date'), auto_now=True) 
     
    9797    credits         = CharField(_('credits')) 
    9898    file            = FileField(_('file'), upload_to='items/%Y/%m/%d', db_column="filename") 
    99      
     99 
    100100    def is_image(self): 
    101101        is_url_image = False 
     
    106106                    is_url_image = True 
    107107        return 'image' in self.mime_type or is_url_image 
    108          
     108 
    109109    def save(self, force_insert=False, force_update=False): 
    110110        super(MediaRelated, self).save(force_insert, force_update) 
    111          
     111 
    112112    def set_mime_type(self): 
    113113        if self.file: 
    114114            self.mime_type = mimetypes.guess_type(self.file.path)[0] 
    115      
     115 
    116116    def __unicode__(self): 
    117117        if self.title and not re.match('^ *N *$', self.title): 
     
    120120            title = unicode(self.item) 
    121121        return title 
    122      
     122 
    123123    class Meta: 
    124124        abstract = True 
     
    127127class MediaCorpus(MediaResource): 
    128128    "Describe a corpus of collections" 
    129      
     129 
    130130    element_type = 'corpus' 
    131131 
     
    135135    description           = CharField(_('description')) 
    136136    code                  = CharField(_('code'), unique=True, required=True) 
    137     public_access         = CharField(_('public access'), choices=PUBLIC_ACCESS_CHOICES,  
     137    public_access         = CharField(_('public access'), choices=PUBLIC_ACCESS_CHOICES, 
    138138                                      max_length=16, default="metadata") 
    139                                        
     139 
    140140    def __unicode__(self): 
    141141        return self.code 
     
    147147    def save(self, force_insert=False, force_update=False, user=None, code=None): 
    148148        super(MediaCorpus, self).save(force_insert, force_update) 
    149          
     149 
    150150    class Meta(MetaCore): 
    151151        db_table = 'media_corpus' 
     
    155155class MediaCorpusCollectionRelation(ModelCore): 
    156156    "Relations between Corpus and Collections" 
    157      
    158     collection        = ForeignKey('MediaCollection', related_name="parent_relation",  
     157 
     158    collection        = ForeignKey('MediaCollection', related_name="parent_relation", 
    159159                                   verbose_name=_('collection')) 
    160     corpus            = ForeignKey('MediaCorpus', related_name="child_relation",  
     160    corpus            = ForeignKey('MediaCorpus', related_name="child_relation", 
    161161                                   verbose_name=_('corpus')) 
    162162 
     
    164164        db_table = 'media_corpus_collection_relations' 
    165165        unique_together = (('collection', 'corpus'),) 
    166      
     166 
    167167    def __unicode__(self): 
    168168        sep = ' > ' 
    169169        return self.corpus.code + sep + self.collection.code 
    170170 
    171                                                          
     171 
    172172class MediaCollection(MediaResource): 
    173173    "Describe a collection of items" 
    174      
     174 
    175175    element_type = 'collection' 
    176176 
     
    180180        if not re.match(regex, value): 
    181181            raise ValidationError(u'%s is not a valid collection code' % value) 
    182      
     182 
    183183    # General informations 
    184184    reference             = CharField(_('reference'), unique=True, null=True) 
     
    186186    alt_title             = CharField(_('original title / translation')) 
    187187    creator               = CharField(_('depositor / contributor')) 
    188     recording_context     = WeakForeignKey('RecordingContext', related_name="collections",  
     188    recording_context     = WeakForeignKey('RecordingContext', related_name="collections", 
    189189                                           verbose_name=_('recording context')) 
    190190    recorded_from_year    = IntegerField(_('recording year (from)')) 
    191191    recorded_to_year      = IntegerField(_('recording year (until)')) 
    192192    year_published        = IntegerField(_('year published')) 
    193      
     193 
    194194    # Geographic and cultural informations 
    195195    ## See "countries" and "ethnic_groups" methods below 
     
    197197    # Legal notices 
    198198    collector             = CharField(_('recordist')) 
    199     publisher             = WeakForeignKey('Publisher', related_name="collections",  
    200                                            verbose_name=_('publisher / status'))      
    201     publisher_collection  = WeakForeignKey('PublisherCollection', related_name="collections",  
     199    publisher             = WeakForeignKey('Publisher', related_name="collections", 
     200                                           verbose_name=_('publisher / status')) 
     201    publisher_collection  = WeakForeignKey('PublisherCollection', related_name="collections", 
    202202                                            verbose_name=_('publisher collection')) 
    203203    publisher_serial      = CharField(_('publisher serial number')) 
     
    205205    external_references   = TextField(_('bibliographic references')) 
    206206    doctype_code          = IntegerField(_('document type')) 
    207     public_access         = CharField(_('public access'), choices=PUBLIC_ACCESS_CHOICES,  
     207    public_access         = CharField(_('public access'), choices=PUBLIC_ACCESS_CHOICES, 
    208208                                      max_length=16, default="metadata") 
    209     legal_rights          = WeakForeignKey('LegalRight', related_name="collections",  
     209    legal_rights          = WeakForeignKey('LegalRight', related_name="collections", 
    210210                                           verbose_name=_('legal rights')) 
    211      
     211 
    212212    # Archiving data 
    213     acquisition_mode      = WeakForeignKey('AcquisitionMode', related_name="collections",  
     213    acquisition_mode      = WeakForeignKey('AcquisitionMode', related_name="collections", 
    214214                                            verbose_name=_('mode of acquisition')) 
    215215    cnrs_contributor      = CharField(_('CNRS depositor')) 
    216     metadata_author       = WeakForeignKey('MetadataAuthor', related_name="collections",  
     216    metadata_author       = WeakForeignKey('MetadataAuthor', related_name="collections", 
    217217                                           verbose_name=_('record author')) 
    218218    booklet_description   = TextField(_('related documentation')) 
    219     publishing_status     = WeakForeignKey('PublishingStatus', related_name="collections",  
     219    publishing_status     = WeakForeignKey('PublishingStatus', related_name="collections", 
    220220                                           verbose_name=_('secondary edition')) 
    221221    alt_ids               = CharField(_('copies')) 
    222222    comment               = TextField(_('comment')) 
    223     metadata_writer       = WeakForeignKey('MetadataWriter', related_name="collections",  
     223    metadata_writer       = WeakForeignKey('MetadataWriter', related_name="collections", 
    224224                                           verbose_name=_('record writer')) 
    225225    travail               = CharField(_('archiver notes')) 
     
    228228    is_published          = BooleanField(_('published')) 
    229229    conservation_site     = CharField(_('conservation site')) 
    230      
     230 
    231231    # Technical data 
    232232    code                  = CharField(_('code'), unique=True, required=True, validators=[is_valid_collection_code]) 
     
    234234    approx_duration       = DurationField(_('approximative duration')) 
    235235    physical_items_num    = IntegerField(_('number of components (medium / piece)')) 
    236     physical_format       = WeakForeignKey('PhysicalFormat', related_name="collections",  
     236    physical_format       = WeakForeignKey('PhysicalFormat', related_name="collections", 
    237237                                           verbose_name=_('archive format')) 
    238     ad_conversion         = WeakForeignKey('AdConversion', related_name='collections',  
     238    ad_conversion         = WeakForeignKey('AdConversion', related_name='collections', 
    239239                                           verbose_name=_('digitization')) 
    240240    state                 = TextField(_('status')) 
    241241    a_informer_07_03      = CharField(_('a_informer_07_03')) 
    242      
     242 
    243243    # All 
    244244    objects               = MediaCollectionManager() 
    245          
     245 
    246246    def __unicode__(self): 
    247247        return self.code 
     
    250250    def public_id(self): 
    251251        return self.code 
    252      
     252 
    253253    @property 
    254254    def has_mediafile(self): 
     
    259259                return True 
    260260        return False 
    261      
     261 
    262262    def __name_cmp(self, obj1, obj2): 
    263263        return unaccent_icmp(obj1.name, obj2.name) 
     
    270270                if not country in countries: 
    271271                    countries.append(country) 
    272              
    273         countries.sort(self.__name_cmp)                 
     272 
     273        countries.sort(self.__name_cmp) 
    274274 
    275275        return countries 
     
    285285 
    286286        cmp = lambda a, b: unaccent_icmp(a.value, b.value) 
    287         groups.sort(cmp)                 
     287        groups.sort(cmp) 
    288288 
    289289        return groups 
     
    295295            duration += item.computed_duration() 
    296296        return duration 
    297          
    298     computed_duration.verbose_name = _('computed duration')         
    299              
     297 
     298    computed_duration.verbose_name = _('computed duration') 
     299 
    300300    def save(self, force_insert=False, force_update=False, user=None, code=None): 
    301301        super(MediaCollection, self).save(force_insert, force_update) 
    302          
     302 
    303303    class Meta(MetaCore): 
    304304        db_table = 'media_collections' 
     
    308308class MediaCollectionRelated(MediaRelated): 
    309309    "Collection related media" 
    310      
     310 
    311311    collection      = ForeignKey('MediaCollection', related_name="related", verbose_name=_('collection')) 
    312      
     312 
    313313    class Meta(MetaCore): 
    314314        db_table = 'media_collection_related' 
    315315 
    316          
     316 
    317317class MediaItem(MediaResource): 
    318318    "Describe an item" 
    319      
     319 
    320320    element_type = 'item' 
    321      
     321 
    322322    # Main Informations 
    323323    title                 = CharField(_('title')) 
    324324    alt_title             = CharField(_('original title / translation')) 
    325325    collector             = CharField(_('recordist')) 
    326     collection            = ForeignKey('MediaCollection', related_name="items",  
    327                                        verbose_name=_('collection'))     
     326    collection            = ForeignKey('MediaCollection', related_name="items", 
     327                                       verbose_name=_('collection')) 
    328328    recorded_from_date    = DateField(_('recording date (from)')) 
    329329    recorded_to_date      = DateField(_('recording date (until)')) 
    330      
     330 
    331331    # Geographic and cultural informations 
    332332    location              = WeakForeignKey('Location', verbose_name=_('location')) 
    333333    location_comment      = CharField(_('location details')) 
    334334    cultural_area         = CharField(_('cultural area')) 
    335     ethnic_group          = WeakForeignKey('EthnicGroup', related_name="items",  
     335    ethnic_group          = WeakForeignKey('EthnicGroup', related_name="items", 
    336336                                           verbose_name=_('population / social group')) 
    337337    language              = CharField(_('language')) 
    338338    context_comment       = TextField(_('comments / ethnographic context')) 
    339339    moda_execut           = CharField(_('moda_execut')) 
    340      
     340 
    341341    # Musical informations 
    342     vernacular_style      = WeakForeignKey('VernacularStyle', related_name="items",  
     342    vernacular_style      = WeakForeignKey('VernacularStyle', related_name="items", 
    343343                                           verbose_name=_('vernacular style')) 
    344     generic_style         = WeakForeignKey('GenericStyle', related_name="items",  
     344    generic_style         = WeakForeignKey('GenericStyle', related_name="items", 
    345345                                           verbose_name=_('generic style')) 
    346346    author                = CharField(_('author / compositor')) 
    347      
     347 
    348348    # General informations 
    349349    comment               = TextField(_('remarks')) 
    350350    collector_selection   = CharField(_('recordist selection')) 
    351351    collector_from_collection = BooleanField(_('recordist as in collection')) 
    352      
     352 
    353353    # Archiving data 
    354354    code                  = CharField(_('code'), unique=True, blank=True) 
     
    360360    public_access         = CharField(_('public access'), choices=PUBLIC_ACCESS_CHOICES, max_length=16, default="metadata") 
    361361    file                  = FileField(_('file'), upload_to='items/%Y/%m/%d', db_column="filename") 
    362      
     362 
    363363    # Technical data 
    364364    approx_duration       = DurationField(_('approximative duration')) 
    365      
     365 
    366366    # All 
    367367    objects               = MediaItemManager() 
     
    379379    class Meta(MetaCore): 
    380380        db_table = 'media_items' 
    381         permissions = (("can_play_all_items", "Can play all media items"),  
     381        permissions = (("can_play_all_items", "Can play all media items"), 
    382382                       ("can_download_all_items", "Can download all media items"), ) 
    383383 
     
    396396    def clean(self): 
    397397        if self.code and not self.is_valid_code(self.code): 
    398             raise ValidationError("%s is not a valid item code for collection %s"  
     398            raise ValidationError("%s is not a valid item code for collection %s" 
    399399                                        % (self.code, self.collection.code)) 
    400                                          
     400 
    401401    def save(self, force_insert=False, force_update=False): 
    402402        super(MediaItem, self).save(force_insert, force_update) 
     
    406406        return self.approx_duration 
    407407 
    408     computed_duration.verbose_name = _('computed duration')         
     408    computed_duration.verbose_name = _('computed duration') 
    409409 
    410410    def __unicode__(self): 
     
    420420class MediaItemRelated(MediaRelated): 
    421421    "Item related media" 
    422      
     422 
    423423    item            = ForeignKey('MediaItem', related_name="related", verbose_name=_('item')) 
    424      
     424 
    425425    class Meta(MetaCore): 
    426426        db_table = 'media_item_related' 
     
    439439class MediaItemPerformance(ModelCore): 
    440440    "Item performance" 
    441     media_item      = ForeignKey('MediaItem', related_name="performances",  
     441    media_item      = ForeignKey('MediaItem', related_name="performances", 
    442442                                 verbose_name=_('item')) 
    443     instrument      = WeakForeignKey('Instrument', related_name="performances",  
     443    instrument      = WeakForeignKey('Instrument', related_name="performances", 
    444444                                     verbose_name=_('composition')) 
    445     alias           = WeakForeignKey('InstrumentAlias', related_name="performances",  
     445    alias           = WeakForeignKey('InstrumentAlias', related_name="performances", 
    446446                                     verbose_name=_('vernacular name')) 
    447447    instruments_num = CharField(_('number')) 
     
    455455    "Item analysis result computed by TimeSide" 
    456456 
    457     element_type = 'analysis'     
     457    element_type = 'analysis' 
    458458    item  = ForeignKey('MediaItem', related_name="analysis", verbose_name=_('item')) 
    459459    analyzer_id = CharField(_('id'), required=True) 
     
    461461    value = CharField(_('value')) 
    462462    unit = CharField(_('unit')) 
    463      
     463 
    464464    class Meta(MetaCore): 
    465465        db_table = 'media_analysis' 
    466466        ordering = ['name'] 
    467          
     467 
    468468    def to_dict(self): 
    469469        if self.analyzer_id == 'duration': 
     
    472472                self.value = '.'.join([value[0], value[1][:2]]) 
    473473        return {'id': self.analyzer_id, 'name': self.name, 'value': self.value, 'unit': self.unit} 
    474          
    475          
     474 
     475 
    476476class MediaPart(MediaResource): 
    477477    "Describe an item part" 
     
    481481    start = FloatField(_('start'), required=True) 
    482482    end   = FloatField(_('end'), required=True) 
    483      
     483 
    484484    class Meta(MetaCore): 
    485485        db_table = 'media_parts' 
     
    501501    def __unicode__(self): 
    502502        return self.title 
    503          
     503 
    504504 
    505505class PlaylistResource(ModelCore): 
     
    514514    class Meta(MetaCore): 
    515515        db_table = 'playlist_resources' 
    516          
    517          
     516 
     517 
    518518class MediaItemMarker(MediaResource): 
    519519    "2D marker object : text value vs. time" 
    520      
     520 
    521521    element_type = 'marker' 
    522      
     522 
    523523    item            = ForeignKey('MediaItem', related_name="markers", verbose_name=_('item')) 
    524524    public_id       = CharField(_('public_id'), required=True) 
     
    528528    description     = TextField(_('description')) 
    529529    author          = ForeignKey(User, related_name="markers", verbose_name=_('author')) 
    530      
     530 
    531531    class Meta(MetaCore): 
    532532        db_table = 'media_markers' 
     
    541541class MediaItemTranscodingFlag(ModelCore): 
    542542    "Item flag to know if the MediaItem has been transcoded to a given format" 
    543      
     543 
    544544    item            = ForeignKey('MediaItem', related_name="transcoding", verbose_name=_('item')) 
    545545    mime_type       = CharField(_('mime_type'), required=True) 
    546546    date            = DateTimeField(_('date'), auto_now=True) 
    547547    value           = BooleanField(_('transcoded')) 
    548      
     548 
    549549    class Meta(MetaCore): 
    550550        db_table = 'media_transcoding' 
    551          
    552          
     551 
     552 
    553553class Search(ModelCore): 
    554554    "Keywork search" 
    555      
     555 
    556556    element_type = 'search' 
    557      
     557 
    558558    username = ForeignKey(User, related_name="searches", db_column="username") 
    559559    keywords = CharField(_('keywords'), required=True) 
     
    568568 
    569569class DublinCoreToFormatMetadata(object): 
    570     """ a mapping class to get item DublinCore metadata dictionaries  
     570    """ a mapping class to get item DublinCore metadata dictionaries 
    571571    in various audio metadata format (MP3, OGG, etc...)""" 
    572      
     572 
    573573    #FIXME: should be given by timeside 
    574     unavailable_extensions = ['wav', 'aiff', 'aif'] 
    575      
    576     metadata_mapping = {  
     574    unavailable_extensions = ['wav', 'aiff', 'aif', 'flac'] 
     575 
     576    metadata_mapping = { 
    577577                    'mp3' : { 
    578578                         'title': 'TIT2', #title2 
     
    585585                         'date': 'TDRC', #year 
    586586#                         'coverage': 'COMM',  #comment 
    587                          },  
     587                         }, 
    588588                    'ogg': { 
    589589                        'creator': 'artist', 
    590                         'relation': 'album',  
    591                         'all': 'all',  
    592                        },  
     590                        'relation': 'album', 
     591                        'all': 'all', 
     592                       }, 
    593593                    'flac': { 
    594594                        'creator': 'artist', 
    595                         'relation': 'album',  
    596                         'all': 'all',  
    597                        },  
     595                        'relation': 'album', 
     596                        'all': 'all', 
     597                       }, 
    598598                    'wav': { 
    599599                        'creator': 'artist', 
    600                         'relation': 'album',  
    601                         'all': 'all',  
    602                        },  
     600                        'relation': 'album', 
     601                        'all': 'all', 
     602                       }, 
    603603                    } 
    604      
     604 
    605605    def __init__(self, format): 
    606606        self.format = format 
    607          
     607 
    608608    def get_metadata(self, dc_metadata): 
    609609        mapp = self.metadata_mapping[self.format] 
  • telemeta/web/base.py

    r40aa64b rd511f9f  
    8383                              mimetype=mimetype) 
    8484 
    85 def stream_from_processor(__decoder, __processor, __flag): 
     85def stream_from_processor(__decoder, __processor, __flag, metadata=None): 
    8686    while True: 
    87         __frames, eodproc = __processor.process(*__decoder.process()) 
    88         if eodproc: 
     87        __frames, __eodproc = __processor.process(*__decoder.process()) 
     88        if __eodproc or not len(__frames): 
     89            if metadata: 
     90                __processor.set_metadata(metadata) 
     91                __processor.write_metadata() 
    8992            __flag.value = True 
    9093            __flag.save() 
     
    876879            # source > stream 
    877880            if not extension in mapping.unavailable_extensions: 
    878                 try: 
    879                     proc = encoder(audio) 
    880                     proc.set_metadata(metadata) 
    881                     proc.write_metadata() 
    882                 except: 
    883                     pass 
     881                proc = encoder(audio) 
     882                proc.set_metadata(metadata) 
     883                proc.write_metadata() 
    884884            response = HttpResponse(stream_from_file(audio), mimetype = mime_type) 
    885885        else: 
    886886            media = self.cache_export.dir + os.sep + file 
    887             if not self.cache_export.exists(file) or flag.value == False: 
     887            if not self.cache_export.exists(file) or not flag.value: 
    888888                # source > encoder > stream 
    889889                decoder = timeside.decoder.FileDecoder(audio) 
     
    891891                proc = encoder(media, streaming=True) 
    892892                proc.setup(channels=decoder.channels(), samplerate=decoder.samplerate()) 
    893                 proc.set_metadata(metadata) 
    894                 response = HttpResponse(stream_from_processor(decoder, proc, flag), mimetype = mime_type) 
     893                if extension in mapping.unavailable_extensions: 
     894                    metadata=None 
     895                response = HttpResponse(stream_from_processor(decoder, proc, flag, metadata=metadata), mimetype = mime_type) 
    895896            else: 
    896897                # cache > stream 
    897                 if not extension in mapping.unavailable_extensions: 
    898                     try: 
    899                         proc = encoder(media) 
    900                         proc.set_metadata(metadata) 
    901                         proc.write_metadata() 
    902                     except: 
    903                         pass 
    904898                response = HttpResponse(self.cache_export.read_stream_bin(file), mimetype = mime_type) 
    905899 
Note: See TracChangeset for help on using the changeset viewer.