diff --git a/fuo_bilibili/__init__.py b/fuo_bilibili/__init__.py index 8025d56..8770503 100644 --- a/fuo_bilibili/__init__.py +++ b/fuo_bilibili/__init__.py @@ -17,9 +17,17 @@ ui_mgr: Optional[BUiManager] = None +def init_config(config): + config.deffield('ENABLE_LIVE_ROOM_AS_VIDEO', + type_=bool, + default=True, + desc='treat live room as video') + + # noinspection PyProtectedMember def enable(app: Union[App, GuiApp]): global ui_mgr + provider.enable_live_room_as_video = app.config.bilibili.ENABLE_LIVE_ROOM_AS_VIDEO app.library.register(provider) if app.mode & App.GuiMode: ui_mgr = BUiManager(app, provider) diff --git a/fuo_bilibili/model.py b/fuo_bilibili/model.py index 871e4ac..35d8a3a 100644 --- a/fuo_bilibili/model.py +++ b/fuo_bilibili/model.py @@ -19,6 +19,10 @@ PROVIDER_ID = __identifier__ +def get_text_from_html(html): + return BeautifulSoup(html, features="html.parser").get_text() + + class BBriefAlbumModel(BriefAlbumModel): cover: str = '' @@ -241,6 +245,7 @@ def create_model(cls, request: SearchRequest, response: Union[SearchResponse, Tu for result in results: if isinstance(result, SearchResultVideo): songs.append(BSongModel.create_model(result)) + videos.append(BVideoModel.create_video_model(result)) elif isinstance(result, SearchResultUser): artists.append(cls.search_user_model(result)) elif isinstance(result, SearchResultLiveRoom): @@ -477,3 +482,21 @@ def create_live_model(cls, live: LiveFeedListResponse.LiveFeedListResponseData.L duration=0, cover=live.cover, ) + + @classmethod + def create_video_model(cls, result: SearchResultVideo) -> 'VideoModel': + return VideoModel( + source=__identifier__, + identifier=result.bvid, + title=get_text_from_html(result.title), + artists=[BriefArtistModel( + source=__identifier__, + name=result.author, + identifier=result.mid + )], + duration=result.duration.total_seconds(), + cover=result.pic, + play_count=result.play, + released=result.pubdate.strftime('%Y-%m-%d'), + ) + diff --git a/fuo_bilibili/provider.py b/fuo_bilibili/provider.py index a5e6f53..2909def 100644 --- a/fuo_bilibili/provider.py +++ b/fuo_bilibili/provider.py @@ -32,7 +32,8 @@ from fuo_bilibili.util import json_to_lrc_text SEARCH_TYPE_MAP = { - FuoSearchType.vi: BilibiliSearchType.LIVE_ROOM, # 对应直播间 + # 对应直播间 + FuoSearchType.vi: BilibiliSearchType.LIVE_ROOM, FuoSearchType.ar: BilibiliSearchType.BILI_USER, # 对应B站用户 FuoSearchType.so: BilibiliSearchType.VIDEO, # 对应投稿视频 FuoSearchType.al: (BilibiliSearchType.MEDIA, BilibiliSearchType.BANGUMI), # 对应番剧电影 @@ -100,7 +101,7 @@ class meta: ModelType.album: (Pf.model_v2 | Pf.get), } - def __init__(self): + def __init__(self, enable_live_room_as_video=True): super(BilibiliProvider, self).__init__() self._api = BilibiliApi() self._user = None @@ -108,8 +109,13 @@ def __init__(self): self._video_cids = dict() self._video_avids = dict() + self.enable_live_room_as_video = enable_live_room_as_video + def _format_search_request(self, keyword, type_) -> Union[SearchRequest, Tuple[SearchRequest]]: - btype = SEARCH_TYPE_MAP.get(type_) + if self.enable_live_room_as_video is False and type_ == FuoSearchType.vi: + btype = BilibiliSearchType.VIDEO + else: + btype = SEARCH_TYPE_MAP.get(type_) if btype is None: raise NotImplementedError if isinstance(btype, Tuple):