Exemplo n.º 1
0
 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
Exemplo n.º 2
0
    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()))
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
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# 逆光 - 孙燕姿'
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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
Exemplo n.º 7
0
    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()))
Exemplo n.º 8
0
    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))
Exemplo n.º 9
0
    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'))