def _get_items(self, model): # initialize fields that need to be serialized # if as_line option is set, we always use fields_display if self.opt_as_line or self.opt_brief: if ModelFlags.v2 in model.meta.flags: modelcls = type(model) fields = [ field for field in model.__fields__ if field not in BaseModel.__fields__ ] # Include properties. fields += [ prop for prop in dir(modelcls) if isinstance(getattr(modelcls, prop), property) and prop not in ("__values__", "fields") ] else: fields = model.meta.fields_display else: fields = self._declared_fields items = [("provider", model.source), ("identifier", model.identifier), ("uri", reverse(model))] if self.opt_fetch: for field in fields: items.append((field, getattr(model, field))) else: for field in fields: items.append((field, getattr(model, field + '_display'))) return items
async def render(self): playlist = self.playlist # show playlist title self.meta_widget.show() self.meta_widget.title = playlist.name # show playlist song list with suppress(ProviderIOError): if playlist.meta.allow_create_songs_g: reader = wrap(playlist.create_songs_g()) else: songs = await async_run(lambda: playlist.songs) reader = wrap(songs) self.show_songs(reader=reader, show_count=True) # show playlist cover if playlist.cover: aio.create_task( self.show_cover(playlist.cover, reverse(playlist, '/cover'))) def remove_song(song): playlist.remove(song.identifier) self.songs_table.remove_song_func = remove_song self.tabbar.show_desc_needed.connect( lambda: aio.create_task(self._show_desc()))
async def render(self): artist = self.model tab_index = self.tab_index # fetch and render basic metadata self.meta_widget.title = await aio.run_fn(lambda: artist.name) self.meta_widget.show() self.render_tab_bar() if tab_index == 0: self.show_desc(self.model.description) elif tab_index == 1: await self._show_songs() elif tab_index == 2: self.toolbar.filter_albums_needed.connect( lambda types: self.albums_table.model().filter_by_types(types)) reader = await aio.run_fn( self._app.library.artist_create_albums_rd, artist) self.show_albums(reader) elif tab_index == 3: if hasattr(artist, 'contributed_albums') and artist.contributed_albums: # This model must be v1. self.show_albums(artist.create_contributed_albums_g()) # finally, we render cover cover = artist.pic_url if cover: await self.show_cover(cover, reverse(artist) + '/cover', as_background=True)
def test_reverse(): artist = DummyArtistModel(identifier=1, name='孙燕姿') album = DummyAlbumModel(identifier=1, name='逆光', artists=[artist]) song = DummySongModel(identifier=1, title='我怀念的', artists=[artist], duration=0, album=album) # reverse various song model assert reverse(song, as_line=True) == \ 'fuo://dummy/songs/1\t# 我怀念的 - 孙燕姿 - 逆光 - 00:00' song_with_no_artist_album = DummySongModel(identifier=1, title='我怀念的') assert reverse(song_with_no_artist_album, as_line=True) == \ 'fuo://dummy/songs/1\t# 我怀念的 - "" - "" - 00:00' song_with_nothing = DummySongModel(identifier=1) assert reverse(song_with_nothing, as_line=True) == \ 'fuo://dummy/songs/1\t# "" - "" - "" - 00:00' song_display = DummySongModel.create_by_display(identifier=1) assert reverse(song_display, as_line=True) == \ 'fuo://dummy/songs/1' # reverse various album model album_with_nothing = DummyAlbumModel(identifier=1) assert reverse(album_with_nothing, as_line=True) == \ 'fuo://dummy/albums/1' album_with_no_artist = DummyAlbumModel(identifier=1, name='逆光') assert reverse(album_with_no_artist, as_line=True) == \ 'fuo://dummy/albums/1\t# 逆光' assert reverse(album, as_line=True) == \ 'fuo://dummy/albums/1\t# 逆光 - 孙燕姿'
def dump_state(self): playlist = self.playlist player = self.player song = self.player.current_song if song is not None: song = reverse(song, as_line=True) # TODO: dump player.media state = { 'playback_mode': playlist.playback_mode.value, 'volume': player.volume, 'state': player.state.value, 'song': song, 'position': player.position, 'playlist': [reverse(song, as_line=True) for song in playlist.list()], } with open(STATE_FILE, 'w') as f: json.dump(state, f)
async def render(self): playlist = self.playlist # show playlist title self.meta_widget.show() self.meta_widget.title = playlist.name await self._show_songs() # show playlist cover if playlist.cover: aio.create_task( self.show_cover(playlist.cover, reverse(playlist) + '/cover')) self.songs_table.remove_song_func = self.remove_song
async def render(self): artist = self.artist # bind signal first # we only show album that implements create_albums_g if artist.meta.allow_create_albums_g: self.toolbar.filter_albums_needed.connect( lambda types: self.albums_table.model().filter_by_types(types)) self.tabbar.show_albums_needed.connect( lambda: self.show_albums(self.artist.create_albums_g())) if hasattr(artist, 'contributed_albums') and artist.contributed_albums: # show contributed_album list self.tabbar.show_contributed_albums_needed.connect( lambda: self.show_albums(self.artist. create_contributed_albums_g())) # fetch and render basic metadata self.meta_widget.title = artist.name self.meta_widget.show() self.tabbar.show() self.tabbar.artist_mode() # fetch and render songs songs = songs_g = None if artist.meta.allow_create_songs_g: songs_g = wrap(artist.create_songs_g()) self.tabbar.show_songs_needed.connect( lambda: self.show_songs(songs_g=wrap(artist.create_songs_g()), songs=songs, show_count=True)) else: songs = await async_run(lambda: artist.songs) self.tabbar.show_songs_needed.connect(lambda: self.show_songs( songs_g=None, songs=songs, show_count=True)) self.show_songs(songs_g=songs_g, songs=songs, show_count=True) # finally, we render cover and description cover = await async_run(lambda: artist.cover) if cover: aio.create_task( self.show_cover(cover, reverse(artist, '/cover'), as_background=True)) self.tabbar.show_desc_needed.connect( lambda: aio.create_task(self._show_desc()))
async def render(self): album = self.album songs = await async_run(lambda: album.songs) self.show_songs(wrap(songs)) self.meta_widget.title = album.name_display self.meta_widget.songs_count = len(songs) self.meta_widget.creator = album.artists_name_display self.meta_widget.show() # fetch cover and description cover = await async_run(lambda: album.cover) if cover: aio.create_task(self.show_cover(cover, reverse(album, '/cover'))) self.tabbar.show() self.tabbar.album_mode() self.tabbar.show_desc_needed.connect(lambda: aio.create_task(self._show_desc())) self.tabbar.show_songs_needed.connect(lambda: self.show_songs(songs))
async def render(self): album = self.model tab_index = self.tab_index self.meta_widget.title = album.name self.meta_widget.creator = album.artists_name self.meta_widget.show() self.render_tab_bar() if tab_index == 0: self.show_desc(self.model.description) else: reader = create_reader(album.songs) self.meta_widget.songs_count = reader.count self.show_songs(reader) # fetch cover and description cover = album.cover if cover: aio.run_afn(self.show_cover, cover, reverse(album, '/cover'))