audio/src/klio_audio/transforms/_base.py (33 lines of code) (raw):

# Copyright 2020 Spotify AB # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import apache_beam as beam import matplotlib.pyplot as plt from klio.transforms import decorators as tfm_decorators from klio_audio import decorators class KlioAudioDoFnMetaclass(type): """Enforce behavior upon subclasses of `KlioAudioBaseDoFn`.""" def __call__(self, *args, **kwargs): # automatically wrap DoFn in a beam.ParDo so folks can just do # `pcoll | SomeAudioTransform()` rather than # `pcoll | beam.ParDo(SomeAudioTransform())` return beam.ParDo( super(KlioAudioDoFnMetaclass, self).__call__(*args, **kwargs) ) class KlioAudioBaseDoFn(beam.DoFn, metaclass=KlioAudioDoFnMetaclass): pass class KlioPlotBaseDoFn(KlioAudioBaseDoFn): DEFAULT_TITLE = "" def __init__(self, *_, title=None, **plot_args): if "ax" in plot_args: raise RuntimeError( "Invalid keyword `ax`: Specifying the plot's axes is not " "supported." ) self.title = title or self.DEFAULT_TITLE self.plot_args = plot_args def _plot(self, *args, **kwargs): pass @tfm_decorators._handle_klio @decorators.handle_binary(load_with_numpy=True) def process(self, item): element = item.element.decode("utf-8") title = self.title.format(element=element) self._klio.logger.debug("Generating plot '{}'".format(title)) fig = plt.figure() fig.suptitle(title) self._plot(item, fig) yield fig