From: yomguy Date: Sun, 21 Oct 2012 15:26:57 +0000 (+0200) Subject: cleanup X-Git-Tag: 0.4.3~3^2~5 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=99d6163cda80f8615783bbdb61f962120a8d10c5;p=timeside.git cleanup --- diff --git a/timeside/decoder/old/subprocess.py b/timeside/decoder/old/subprocess.py new file mode 100644 index 0000000..203c49a --- /dev/null +++ b/timeside/decoder/old/subprocess.py @@ -0,0 +1,49 @@ + +class SubProcessPipe: + + def __init__(self, command, stdin=None): + """Read media and stream data through a generator. + Taken from Telemeta (see http://telemeta.org)""" + + self.buffer_size = 0xFFFF + + if not stdin: + stdin = subprocess.PIPE + + self.proc = subprocess.Popen(command.encode('utf-8'), + shell = True, + bufsize = self.buffer_size, + stdin = stdin, + stdout = subprocess.PIPE, + close_fds = True) + + self.input = self.proc.stdin + self.output = self.proc.stdout + + +class DecoderSubProcessCore(Processor): + """Defines the main parts of the decoding tools : + paths, metadata parsing, data streaming thru system command""" + + def __init__(self): + self.command = 'ffmpeg -i "%s" -f wav - ' + + def process(self, source, options=None): + """Encode and stream audio data through a generator""" + + command = self.command % source + proc = SubProcessPipe(command) + return proc.output + + #while True: + #__chunk = proc.output.read(self.proc.buffer_size) + #status = proc.poll() + #if status != None and status != 0: + #raise ExportProcessError('Command failure:', command, proc) + #if len(__chunk) == 0: + #break + #yield __chunk + + + + diff --git a/timeside/decoder/subprocess.py b/timeside/decoder/subprocess.py deleted file mode 100644 index 203c49a..0000000 --- a/timeside/decoder/subprocess.py +++ /dev/null @@ -1,49 +0,0 @@ - -class SubProcessPipe: - - def __init__(self, command, stdin=None): - """Read media and stream data through a generator. - Taken from Telemeta (see http://telemeta.org)""" - - self.buffer_size = 0xFFFF - - if not stdin: - stdin = subprocess.PIPE - - self.proc = subprocess.Popen(command.encode('utf-8'), - shell = True, - bufsize = self.buffer_size, - stdin = stdin, - stdout = subprocess.PIPE, - close_fds = True) - - self.input = self.proc.stdin - self.output = self.proc.stdout - - -class DecoderSubProcessCore(Processor): - """Defines the main parts of the decoding tools : - paths, metadata parsing, data streaming thru system command""" - - def __init__(self): - self.command = 'ffmpeg -i "%s" -f wav - ' - - def process(self, source, options=None): - """Encode and stream audio data through a generator""" - - command = self.command % source - proc = SubProcessPipe(command) - return proc.output - - #while True: - #__chunk = proc.output.read(self.proc.buffer_size) - #status = proc.poll() - #if status != None and status != 0: - #raise ExportProcessError('Command failure:', command, proc) - #if len(__chunk) == 0: - #break - #yield __chunk - - - - diff --git a/timeside/encoder/old/subprocess.py b/timeside/encoder/old/subprocess.py new file mode 100644 index 0000000..de6c709 --- /dev/null +++ b/timeside/encoder/old/subprocess.py @@ -0,0 +1,189 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2007-2009 Guillaume Pellerin + +# This file is part of TimeSide. + +# TimeSide is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. + +# TimeSide is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with TimeSide. If not, see . + +# Author: Guillaume Pellerin + +from timeside.core import * +import subprocess + + +class SubProcessPipe(object): + """Read media and stream data through a generator. + Taken from Telemeta (see http://telemeta.org)""" + + def __init__(self, command, stdin=None): + self.buffer_size = 0xFFFF + if not stdin: + stdin = subprocess.PIPE + + self.proc = subprocess.Popen(command.encode('utf-8'), + shell = True, + bufsize = self.buffer_size, + stdin = stdin, + stdout = subprocess.PIPE, + close_fds = True) + + self.input = self.proc.stdin + self.output = self.proc.stdout + + +class EncoderSubProcessCore(Processor): + """Defines the main parts of the encoding tools : + paths, metadata parsing, data streaming thru system command""" + + def core_process(self, command, stdin): + """Encode and stream audio data through a generator""" + + proc = SubProcessPipe(command, stdin) + + while True: + __chunk = proc.output.read(proc.buffer_size) + #status = proc.poll() + #if status != None and status != 0: + #raise EncodeProcessError('Command failure:', command, proc) + if len(__chunk) == 0: + break + yield __chunk + + +class Mp3EncoderSubprocess(object): + """MP3 encoder in a subprocess pipe""" + +# implements(IEncoder) + + def __init__(self): + import os + import string + import subprocess + self.bitrate_default = '192' + self.dub2id3_dict = {'title': 'TIT2', #title2 + 'creator': 'TCOM', #composer + 'creator': 'TPE1', #lead + 'identifier': 'UFID', #Unique ID... + 'identifier': 'TALB', #album + 'type': 'TCON', #genre + 'publisher': 'TPUB', #comment + #'date': 'TYER', #year + } + self.dub2args_dict = {'title': 'tt', #title2 + 'creator': 'ta', #composerS + 'relation': 'tl', #album + #'type': 'tg', #genre + 'publisher': 'tc', #comment + 'date': 'ty', #year + } + + @interfacedoc + def setup(self, channels=None, samplerate=None, nframes=None): + self.channels = channels + super(Mp3EncoderSubprocess, self).setup(channels, samplerate, nframes) + + @staticmethod + @interfacedoc + def id(): + return "subprocess_mp3_enc" + + @staticmethod + @interfacedoc + def description(): + return "MP3 subprocess based encoder" + + @staticmethod + @interfacedoc + def format(): + return "MP3" + + @staticmethod + @interfacedoc + def file_extension(): + return "mp3" + + @staticmethod + @interfacedoc + def mime_type(): + return "audio/mpeg" + + @interfacedoc + def set_metadata(self, metadata): + self.metadata = metadata + + def get_file_info(self): + try: + file_out1, file_out2 = os.popen4('mp3info "'+self.dest+'"') + info = [] + for line in file_out2.readlines(): + info.append(clean_word(line[:-1])) + self.info = info + return self.info + except: + raise IOError('EncoderError: file does not exist.') + + def write_tags(self): + """Write all ID3v2.4 tags by mapping dub2id3_dict dictionnary with the + respect of mutagen classes and methods""" + from mutagen import id3 + id3 = id3.ID3(self.dest) + for tag in self.metadata.keys(): + if tag in self.dub2id3_dict.keys(): + frame_text = self.dub2id3_dict[tag] + value = self.metadata[tag] + frame = mutagen.id3.Frames[frame_text](3,value) + try: + id3.add(frame) + except: + raise IOError('EncoderError: cannot tag "'+tag+'"') + try: + id3.save() + except: + raise IOError('EncoderError: cannot write tags') + + def get_args(self): + """Get process options and return arguments for the encoder""" + args = [] + if not self.options is None: + if not ( 'verbose' in self.options and self.options['verbose'] != '0' ): + args.append('-S') + if 'mp3_bitrate' in self.options: + args.append('-b ' + self.options['mp3_bitrate']) + else: + args.append('-b '+self.bitrate_default) + #Copyrights, etc.. + args.append('-c -o') + else: + args.append('-S -c --tt "unknown" -o') + + for tag in self.metadata: + name = tag[0] + value = clean_word(tag[1]) + if name in self.dub2args_dict.keys(): + arg = self.dub2args_dict[name] + args.append('--' + arg + ' "' + value + '"') + return args + + def process(self, source, metadata, options=None): + self.metadata = metadata + self.options = options + args = self.get_args() + args = ' '.join(args) + command = 'lame %s - -' % args + + stream = self.core_process(command, source) + for __chunk in stream: + yield __chunk diff --git a/timeside/encoder/subprocess.py b/timeside/encoder/subprocess.py deleted file mode 100644 index de6c709..0000000 --- a/timeside/encoder/subprocess.py +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2007-2009 Guillaume Pellerin - -# This file is part of TimeSide. - -# TimeSide is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# TimeSide is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with TimeSide. If not, see . - -# Author: Guillaume Pellerin - -from timeside.core import * -import subprocess - - -class SubProcessPipe(object): - """Read media and stream data through a generator. - Taken from Telemeta (see http://telemeta.org)""" - - def __init__(self, command, stdin=None): - self.buffer_size = 0xFFFF - if not stdin: - stdin = subprocess.PIPE - - self.proc = subprocess.Popen(command.encode('utf-8'), - shell = True, - bufsize = self.buffer_size, - stdin = stdin, - stdout = subprocess.PIPE, - close_fds = True) - - self.input = self.proc.stdin - self.output = self.proc.stdout - - -class EncoderSubProcessCore(Processor): - """Defines the main parts of the encoding tools : - paths, metadata parsing, data streaming thru system command""" - - def core_process(self, command, stdin): - """Encode and stream audio data through a generator""" - - proc = SubProcessPipe(command, stdin) - - while True: - __chunk = proc.output.read(proc.buffer_size) - #status = proc.poll() - #if status != None and status != 0: - #raise EncodeProcessError('Command failure:', command, proc) - if len(__chunk) == 0: - break - yield __chunk - - -class Mp3EncoderSubprocess(object): - """MP3 encoder in a subprocess pipe""" - -# implements(IEncoder) - - def __init__(self): - import os - import string - import subprocess - self.bitrate_default = '192' - self.dub2id3_dict = {'title': 'TIT2', #title2 - 'creator': 'TCOM', #composer - 'creator': 'TPE1', #lead - 'identifier': 'UFID', #Unique ID... - 'identifier': 'TALB', #album - 'type': 'TCON', #genre - 'publisher': 'TPUB', #comment - #'date': 'TYER', #year - } - self.dub2args_dict = {'title': 'tt', #title2 - 'creator': 'ta', #composerS - 'relation': 'tl', #album - #'type': 'tg', #genre - 'publisher': 'tc', #comment - 'date': 'ty', #year - } - - @interfacedoc - def setup(self, channels=None, samplerate=None, nframes=None): - self.channels = channels - super(Mp3EncoderSubprocess, self).setup(channels, samplerate, nframes) - - @staticmethod - @interfacedoc - def id(): - return "subprocess_mp3_enc" - - @staticmethod - @interfacedoc - def description(): - return "MP3 subprocess based encoder" - - @staticmethod - @interfacedoc - def format(): - return "MP3" - - @staticmethod - @interfacedoc - def file_extension(): - return "mp3" - - @staticmethod - @interfacedoc - def mime_type(): - return "audio/mpeg" - - @interfacedoc - def set_metadata(self, metadata): - self.metadata = metadata - - def get_file_info(self): - try: - file_out1, file_out2 = os.popen4('mp3info "'+self.dest+'"') - info = [] - for line in file_out2.readlines(): - info.append(clean_word(line[:-1])) - self.info = info - return self.info - except: - raise IOError('EncoderError: file does not exist.') - - def write_tags(self): - """Write all ID3v2.4 tags by mapping dub2id3_dict dictionnary with the - respect of mutagen classes and methods""" - from mutagen import id3 - id3 = id3.ID3(self.dest) - for tag in self.metadata.keys(): - if tag in self.dub2id3_dict.keys(): - frame_text = self.dub2id3_dict[tag] - value = self.metadata[tag] - frame = mutagen.id3.Frames[frame_text](3,value) - try: - id3.add(frame) - except: - raise IOError('EncoderError: cannot tag "'+tag+'"') - try: - id3.save() - except: - raise IOError('EncoderError: cannot write tags') - - def get_args(self): - """Get process options and return arguments for the encoder""" - args = [] - if not self.options is None: - if not ( 'verbose' in self.options and self.options['verbose'] != '0' ): - args.append('-S') - if 'mp3_bitrate' in self.options: - args.append('-b ' + self.options['mp3_bitrate']) - else: - args.append('-b '+self.bitrate_default) - #Copyrights, etc.. - args.append('-c -o') - else: - args.append('-S -c --tt "unknown" -o') - - for tag in self.metadata: - name = tag[0] - value = clean_word(tag[1]) - if name in self.dub2args_dict.keys(): - arg = self.dub2args_dict[name] - args.append('--' + arg + ' "' + value + '"') - return args - - def process(self, source, metadata, options=None): - self.metadata = metadata - self.options = options - args = self.get_args() - args = ' '.join(args) - command = 'lame %s - -' % args - - stream = self.core_process(command, source) - for __chunk in stream: - yield __chunk diff --git a/timeside/grapher/old/spectrogram_audiolab.py b/timeside/grapher/old/spectrogram_audiolab.py new file mode 100644 index 0000000..be7143c --- /dev/null +++ b/timeside/grapher/old/spectrogram_audiolab.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2007-2009 Guillaume Pellerin + +# This file is part of TimeSide. + +# TimeSide is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. + +# TimeSide is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with TimeSide. If not, see . + +# Author: Guillaume Pellerin + +from timeside.core import * +from timeside.api import IGrapher +from tempfile import NamedTemporaryFile +from timeside.grapher.core import * + +class SpectrogramGrapherAudiolab(Processor): + """Spectrogram graph driver (python style thanks to wav2png.py and scikits.audiolab)""" + + implements(IGrapher) + + bg_color = None + color_scheme = None + + @staticmethod + def id(): + return "spectrogram" + + def name(self): + return "Spectrogram (audiolab)" + + def set_colors(self, background=None, scheme=None): + self.bg_color = background + self.color_scheme = scheme + + def render(self, media_item, width=None, height=None, options=None): + """Generator that streams the spectrogram as a PNG image with a python method""" + + wav_file = media_item + pngFile = NamedTemporaryFile(suffix='.png') + + if not width == None: + image_width = width + else: + image_width = 1500 + if not height == None: + image_height = height + else: + image_height = 200 + + fft_size = 2048 + args = (wav_file, pngFile.name, image_width, image_height, fft_size, + self.bg_color, self.color_scheme) + create_spectrogram_png(*args) + + buffer = pngFile.read(0xFFFF) + while buffer: + yield buffer + buffer = pngFile.read(0xFFFF) + + pngFile.close() diff --git a/timeside/grapher/old/waveform_audiolab.py b/timeside/grapher/old/waveform_audiolab.py new file mode 100644 index 0000000..ac07330 --- /dev/null +++ b/timeside/grapher/old/waveform_audiolab.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2007-2009 Guillaume Pellerin + +# This file is part of TimeSide. + +# TimeSide is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. + +# TimeSide is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with TimeSide. If not, see . + +# Author: Guillaume Pellerin + +from timeside.core import * +from timeside.api import IGrapher +from tempfile import NamedTemporaryFile +from timeside.grapher.core import * + +class WaveFormGrapherAudiolab(Processor): + """WaveForm graph driver (python style thanks to wav2png.py and scikits.audiolab)""" + + implements(IGrapher) + + bg_color = None + color_scheme = None + + @staticmethod + def id(): + return "waveform" + + def name(self): + return "Waveform (audiolab)" + + def set_colors(self, background=None, scheme=None): + self.bg_color = background + self.color_scheme = scheme + + def render(self, media_item, width=None, height=None, options=None): + """Generator that streams the waveform as a PNG image with a python method""" + + wav_file = media_item + pngFile = NamedTemporaryFile(suffix='.png') + + if not width == None: + image_width = width + else: + image_width = 1500 + if not height == None: + image_height = height + else: + image_height = 200 + + fft_size = 2048 + args = (wav_file, pngFile.name, image_width, image_height, fft_size, + self.bg_color, self.color_scheme) + create_wavform_png(*args) + + buffer = pngFile.read(0xFFFF) + while buffer: + yield buffer + buffer = pngFile.read(0xFFFF) + + pngFile.close() + diff --git a/timeside/grapher/spectrogram_audiolab.py b/timeside/grapher/spectrogram_audiolab.py deleted file mode 100644 index be7143c..0000000 --- a/timeside/grapher/spectrogram_audiolab.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2007-2009 Guillaume Pellerin - -# This file is part of TimeSide. - -# TimeSide is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# TimeSide is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with TimeSide. If not, see . - -# Author: Guillaume Pellerin - -from timeside.core import * -from timeside.api import IGrapher -from tempfile import NamedTemporaryFile -from timeside.grapher.core import * - -class SpectrogramGrapherAudiolab(Processor): - """Spectrogram graph driver (python style thanks to wav2png.py and scikits.audiolab)""" - - implements(IGrapher) - - bg_color = None - color_scheme = None - - @staticmethod - def id(): - return "spectrogram" - - def name(self): - return "Spectrogram (audiolab)" - - def set_colors(self, background=None, scheme=None): - self.bg_color = background - self.color_scheme = scheme - - def render(self, media_item, width=None, height=None, options=None): - """Generator that streams the spectrogram as a PNG image with a python method""" - - wav_file = media_item - pngFile = NamedTemporaryFile(suffix='.png') - - if not width == None: - image_width = width - else: - image_width = 1500 - if not height == None: - image_height = height - else: - image_height = 200 - - fft_size = 2048 - args = (wav_file, pngFile.name, image_width, image_height, fft_size, - self.bg_color, self.color_scheme) - create_spectrogram_png(*args) - - buffer = pngFile.read(0xFFFF) - while buffer: - yield buffer - buffer = pngFile.read(0xFFFF) - - pngFile.close() diff --git a/timeside/grapher/waveform_audiolab.py b/timeside/grapher/waveform_audiolab.py deleted file mode 100644 index ac07330..0000000 --- a/timeside/grapher/waveform_audiolab.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2007-2009 Guillaume Pellerin - -# This file is part of TimeSide. - -# TimeSide is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# TimeSide is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with TimeSide. If not, see . - -# Author: Guillaume Pellerin - -from timeside.core import * -from timeside.api import IGrapher -from tempfile import NamedTemporaryFile -from timeside.grapher.core import * - -class WaveFormGrapherAudiolab(Processor): - """WaveForm graph driver (python style thanks to wav2png.py and scikits.audiolab)""" - - implements(IGrapher) - - bg_color = None - color_scheme = None - - @staticmethod - def id(): - return "waveform" - - def name(self): - return "Waveform (audiolab)" - - def set_colors(self, background=None, scheme=None): - self.bg_color = background - self.color_scheme = scheme - - def render(self, media_item, width=None, height=None, options=None): - """Generator that streams the waveform as a PNG image with a python method""" - - wav_file = media_item - pngFile = NamedTemporaryFile(suffix='.png') - - if not width == None: - image_width = width - else: - image_width = 1500 - if not height == None: - image_height = height - else: - image_height = 200 - - fft_size = 2048 - args = (wav_file, pngFile.name, image_width, image_height, fft_size, - self.bg_color, self.color_scheme) - create_wavform_png(*args) - - buffer = pngFile.read(0xFFFF) - while buffer: - yield buffer - buffer = pngFile.read(0xFFFF) - - pngFile.close() -