Source code for woob.capabilities.audio

# Copyright(C) 2013 Pierre Mazière
#
# This file is part of woob.
#
# woob is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# woob 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 Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with woob. If not, see <http://www.gnu.org/licenses/>.

import re

from .image import Thumbnail
from .base import Field, StringField, IntField, BaseObject
from .date import DeltaField
from .file import CapFile, BaseFile


__all__ = ['BaseAudio', 'CapAudio']


def decode_id(decode_func):
    def wrapper(func):
        def inner(self, *args, **kwargs):
            arg = str(args[0])
            _id = decode_func(arg)
            if _id is None:
                return None

            new_args = [_id]
            new_args.extend(args[1:])
            return func(self, *new_args, **kwargs)
        return inner
    return wrapper


class Album(BaseObject):
    """
    Represent an album
    """
    title = StringField('album name')
    author = StringField('artist name')
    year = IntField('release year')
    thumbnail = Field('Image associated to the album', Thumbnail)
    tracks_list = Field('list of tracks', list)

    @classmethod
    def decode_id(cls, _id):
        if _id:
            m = re.match(r'^(album)\.(.*)', _id)
            if m:
                return m.group(2)
            return _id

        return ''


class Playlist(BaseObject):
    """
    Represent a playlist
    """
    title = StringField('playlist name')
    tracks_list = Field('list of tracks', list)

    @classmethod
    def decode_id(cls, _id):
        if _id:
            m = re.match(r'^(playlist)\.(.*)', _id)
            if m:
                return m.group(2)
            return _id

        return ''


[docs]class BaseAudio(BaseFile): """ Represent an audio file """ duration = DeltaField('file duration') bitrate = IntField('file bit rate in Kbps') format = StringField('file format') thumbnail = Field('Image associated to the file', Thumbnail)
[docs] @classmethod def decode_id(cls, _id): if _id: m = re.match(r'^(audio)\.(.*)', _id) if m: return m.group(2) return _id return ''
[docs]class CapAudio(CapFile): """ Audio file provider """
[docs] @classmethod def get_object_method(cls, _id): m = re.match(r'^(\w+)\.(.*)', _id) if m: if m.group(1) == 'album': return 'get_album' if m.group(1) == 'playlist': return 'get_playlist' return 'get_audio' return None
[docs] def search_audio(self, pattern, sortby=CapFile.SEARCH_RELEVANCE): """ search for a audio file :param pattern: pattern to search on :type pattern: str :param sortby: sort by ...(use SEARCH_* constants) :rtype: iter[:class:`BaseAudio`] """ return self.search_file(pattern, sortby)
[docs] def search_album(self, pattern, sortby=CapFile.SEARCH_RELEVANCE): """ search for an album :param pattern: pattern to search on :type pattern: str :rtype: iter[:class:`Album`] """ raise NotImplementedError()
[docs] def search_playlist(self, pattern, sortby=CapFile.SEARCH_RELEVANCE): """ search for an album :param pattern: pattern to search on :type pattern: str :rtype: iter[:class:`Playlist`] """ raise NotImplementedError()
[docs] @decode_id(BaseAudio.decode_id) def get_audio(self, _id): """ Get an audio file from an ID. :param id: audio file ID :type id: str :rtype: :class:`BaseAudio`] """ return self.get_file(_id)
[docs] @decode_id(Playlist.decode_id) def get_playlist(self, _id): """ Get a playlist from an ID. :param id: playlist ID :type id: str :rtype: :class:`Playlist`] """ raise NotImplementedError()
[docs] @decode_id(Album.decode_id) def get_album(self, _id): """ Get an album from an ID. :param id: album ID :type id: str :rtype: :class:`Album`] """ raise NotImplementedError()