source: products/Plone4ArtistsAudioPatch/trunk/extralibs/p4a.audiopatch/p4a/audiopatch/adapters.py @ 1

Last change on this file since 1 was 1, checked in by myroslav, 18 years ago

Building directory structure

  • Property svn:eol-style set to native
File size: 4.2 KB
Line 
1from zope import interface
2from zope import component
3
4from p4a.audio.interfaces import IAudio, IAudioEnhanced
5from Products.ATContentTypes.interface import IATFile
6from p4a.audio.atct._atct import _ATCTFileAudio
7from p4a.audiopatch.interfaces import IAudioEncoded
8
9from zope.app.annotation.interfaces import IAnnotations
10from persistent.dict import PersistentDict
11
12from zope.event import notify
13from p4a.audiopatch.events import AudioEncodingChangedEvent
14
15from p4a.fileimage import utils
16from p4a.audio.mp3.thirdparty import eyeD3
17import os
18
19
20#need to override existing adapter form IATFile to IAudio
21@interface.implementer(IAudio)
22@component.adapter(IATFile)
23def ATCTFileAudioOverriding(context):
24    if not IAudioEnhanced.providedBy(context):
25        return None
26    return _ATCTFileAudioEncoded(context)
27
28
29@interface.implementer(IAudioEncoded)
30@component.adapter(IATFile)
31def ATCTFileAudioEncoded(context):
32    if not IAudioEnhanced.providedBy(context):
33        return None
34    return _ATCTFileAudioEncoded(context)
35
36class _ATCTFileAudioEncoded(_ATCTFileAudio):
37    """An IAudioEncoded adapter that handle ATCT based file content.
38    """
39    interface.implements(IAudioEncoded)
40
41    ENCODING_KEY = "p4a.patch.adapters.ATCTFileAudioEncoded"
42
43    def __init__(self, context):
44        _ATCTFileAudio.__init__(self, context)
45        annotations = IAnnotations(context)
46        self.encoding_data = annotations.get(self.ENCODING_KEY, None)
47        if self.encoding_data == None:
48            self.encoding_data = PersistentDict()
49            annotations[self.ENCODING_KEY] = self.encoding_data
50            self.encoding_data['encoding'] = ""
51            self.encoding_data['original_encoding'] = ""
52
53    def getEncoding(self):
54        """get encoding"""
55        return self.encoding_data['encoding']
56       
57    def setEncoding(self, value):
58        """set encoding"""
59        self.encoding_data['encoding'] = value
60        notify(AudioEncodingChangedEvent(self.context))
61 
62    encoding = property(getEncoding, setEncoding)
63   
64    def get_original_encoding(self):
65        if not self.encoding_data['original_encoding'] and self.audio_type == "MP3":
66            filename = utils.write_ofsfile_to_tempfile(self.context.getRawFile())
67            tag = eyeD3.Tag()
68            tag.link(filename)
69            for f in tag.frames:
70                if self.encoding_data['original_encoding']: break
71                if isinstance(f, eyeD3.frames.TextFrame):
72                    self.encoding_data['original_encoding'] = eyeD3.id3EncodingToString(f.encoding)
73            os.remove(filename)
74        return self.encoding_data['original_encoding']
75       
76    def set_original_encoding(self, value):
77        self.encoding_data['original_encoding'] = value
78       
79    original_encoding = property(get_original_encoding, set_original_encoding)
80
81    @property
82    def title(self):
83        data = self.audio_data.get('title', None)
84        if self.audio_type == "MP3" and self.encoding and self.original_encoding and isinstance(data, unicode):
85            data = data.encode(self.original_encoding, 'replace').decode(self.encoding, 'replace')
86        return data
87
88    @property
89    def artist(self):
90        data = self.audio_data.get('artist', None)   
91        if self.audio_type == "MP3" and self.encoding and self.original_encoding and isinstance(data, unicode):
92            data = data.encode(self.original_encoding, 'replace').decode(self.encoding, 'replace')
93        return data
94       
95    @property
96    def album(self):
97        data = self.audio_data.get('album', None)   
98        if self.audio_type == "MP3" and self.encoding and self.original_encoding and isinstance(data, unicode):
99            data = data.encode(self.original_encoding, 'replace').decode(self.encoding, 'replace')
100        return data
101       
102    @property
103    def comment(self):
104        data = self.audio_data.get('comment', None)   
105        if self.audio_type == "MP3" and self.encoding and self.original_encoding and isinstance(data, unicode):
106            data = data.encode(self.original_encoding, 'replace').decode(self.encoding, 'replace')
107        return data
108       
109    def __str__(self):
110        return '<p4a.audiopatch.adapters.ATCTFileAudioEncoded title=%s>' % self.title
111    __repr__ = __str__
Note: See TracBrowser for help on using the repository browser.