From 2c833caf5fe8c1180758be3186c2da832c057378 Mon Sep 17 00:00:00 2001 From: yomguy Date: Wed, 27 Apr 2011 11:25:31 +0000 Subject: [PATCH] rm old decoder, add mp3 metadata embedding and test --- timeside/decoder/__init__.py | 2 ++ timeside/decoder/core.py | 2 -- timeside/decoder/old.py | 2 +- timeside/encoder/mp3.py | 27 +++++++++++++++++++++------ timeside/tests/api/test_mp3.py | 16 +++++++++++++++- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/timeside/decoder/__init__.py b/timeside/decoder/__init__.py index 78457b3..0741aad 100644 --- a/timeside/decoder/__init__.py +++ b/timeside/decoder/__init__.py @@ -2,3 +2,5 @@ import timeside.core from core import * +from sink import * +#from old import * diff --git a/timeside/decoder/core.py b/timeside/decoder/core.py index 0a8b69f..ef84c7d 100644 --- a/timeside/decoder/core.py +++ b/timeside/decoder/core.py @@ -25,8 +25,6 @@ from timeside.core import Processor, implements, interfacedoc from timeside.api import IDecoder from numpy import array, frombuffer, getbuffer, float32, append -from timeside.decoder.old import * - from timeside.decoder.sink import * import pygst diff --git a/timeside/decoder/old.py b/timeside/decoder/old.py index 83e4b6e..f2971cb 100644 --- a/timeside/decoder/old.py +++ b/timeside/decoder/old.py @@ -34,7 +34,7 @@ gobject.threads_init() class FileDecoderOld(Processor): """ gstreamer-based decoder """ - implements(IDecoder) + #implements(IDecoder) # duration ms, before discovery process times out MAX_DISCOVERY_TIME = 3000 diff --git a/timeside/encoder/mp3.py b/timeside/encoder/mp3.py index d089f39..599b987 100644 --- a/timeside/encoder/mp3.py +++ b/timeside/encoder/mp3.py @@ -27,6 +27,7 @@ from numpy import array, frombuffer, getbuffer, float32 from timeside.core import FixedSizeInputAdapter import numpy +import mutagen import pygst pygst.require('0.10') import gst @@ -58,7 +59,7 @@ class Mp3Encoder(Processor): # the output data format we want self.pipe = '''appsrc name=src ! audioconvert - ! lamemp3enc bitrate=256 ! id3v2mux + ! lamemp3enc bitrate=256 ! id3v2mux ''' if self.filename and self.streaming: self.pipe += ''' ! tee name=t @@ -113,9 +114,24 @@ class Mp3Encoder(Processor): @interfacedoc def set_metadata(self, metadata): - #TODO: - pass - + self.metadata = metadata + + def write_metadata(self, file): + """Write all ID3v2.4 tags to file from self.metadata""" + from mutagen import id3 + id3 = id3.ID3(file) + for tag in self.metadata.keys(): + value = self.metadata[tag] + frame = mutagen.id3.Frames[tag](3,value) + try: + id3.add(frame) + except: + raise IOError('EncoderError: cannot tag "'+tag+'"') + try: + id3.save() + except: + raise IOError('EncoderError: cannot write tags') + @interfacedoc def process(self, frames, eod=False): self.eod = eod @@ -193,8 +209,7 @@ class Mp3EncoderSubprocess(object): @interfacedoc def set_metadata(self, metadata): - #TODO: - pass + self.metadata = metadata def get_file_info(self): try: diff --git a/timeside/tests/api/test_mp3.py b/timeside/tests/api/test_mp3.py index c333067..b05acc1 100644 --- a/timeside/tests/api/test_mp3.py +++ b/timeside/tests/api/test_mp3.py @@ -5,9 +5,23 @@ from timeside.encoder import * import os.path source = os.path.join(os.path.dirname(__file__), "../samples/sweep.wav") -dest = os.path.join(os.path.dirname(__file__), "../results/sweep_wav.mp3") +dest = os.path.join(os.path.dirname(__file__), "/tmp/sweep_wav.mp3") decoder = FileDecoder(source) encoder = Mp3Encoder(dest) (decoder | encoder).run() + +metadata = {'TIT2': 'title', #title2 + 'TCOM': 'composer', #composer + 'TPE1': 'lead creator', #lead + 'UFID': 'identifier', #Unique ID... + 'TALB': 'album', #album + 'TCON': 'genre', #genre + 'TXXX': 'comment', #comment + #'date': 'TYER', #year + } + +encoder.set_metadata(metadata) +encoder.write_metadata(dest) + -- 2.39.5