fuocore.provider 源代码

# -*- coding: utf-8 -*-

"""
fuocore.provider
~~~~~~~~~~~~~~~~

"""
from abc import ABC, abstractmethod
from contextlib import contextmanager
from fuocore.models import (
    SongModel,
    ArtistModel,
    AlbumModel,
    PlaylistModel,
    LyricModel,

    UserModel,

    ModelType,
)




_TYPE_NAME_MAP = {
    ModelType.song: 'Song',
    ModelType.artist: 'Artist',
    ModelType.album: 'Album',
    ModelType.playlist: 'Playlist',
    ModelType.lyric: 'Lyric',
    ModelType.user: 'User',
}


[文档]class AbstractProvider(ABC): """abstract music resource provider """ # A well behaved provider should implement its own models . Song = SongModel Artist = ArtistModel Album = AlbumModel Playlist = PlaylistModel Lyric = LyricModel User = UserModel def __init__(self): self._user = None def get_model_cls(self, model_type): name = _TYPE_NAME_MAP[model_type] return getattr(self, name) def set_model_cls(self, model_type, model_cls): name = _TYPE_NAME_MAP[model_type] setattr(self, name, model_cls) @property @abstractmethod def identifier(self): """provider identify""" @property @abstractmethod def name(self): """provider name"""
[文档] @contextmanager def auth_as(self, user): """auth as a user temporarily""" old_user = self._user self.auth(user) try: yield finally: self.auth(old_user)
[文档] def auth(self, user): """use provider as a specific user""" self._user = user