Exemple #1
0
def to_reader(model, field):
    flag_attr = 'allow_create_{}_g'.format(field)
    method_attr = 'create_{}_g'.format(field)

    flag_g = getattr(model.meta, flag_attr)

    if flag_g:
        return SequentialReader.wrap(getattr(model, method_attr)())

    value = getattr(model, field, None)
    if value is None:
        return RandomSequentialReader.from_list([])
    if isinstance(value, (list, tuple)):
        return RandomSequentialReader.from_list(value)
    return SequentialReader.wrap(iter(value))  # TypeError if not iterable
Exemple #2
0
        def _show_pure_videos_coll(coll):
            from feeluown.containers.table import VideosRenderer

            self.collection_container.hide()
            self.scrollarea.show()
            reader = RandomSequentialReader.from_list(coll.models)
            renderer = VideosRenderer(reader)
            aio.create_task(self.table_container.set_renderer(renderer))
Exemple #3
0
def create_g(func, schema=None):
    data = func()
    if data is None:
        raise QQIOError('server responses with error status code')

    count = int(data['total'])

    def read_func(start, end):
        data = func()
        return [_deserialize(data, schema) for data in data['list']]

    reader = RandomSequentialReader(count,
                                    read_func=read_func,
                                    max_per_read=200)
    return reader
Exemple #4
0
 async def show_album(self, album):
     meta_widget = self.collection_body.meta_widget
     meta_widget.clear()
     meta_widget.title = album.name_display
     meta_widget.creator = album.artists_name_display
     songs = await async_run(lambda: album.songs)
     meta_widget.songs_count = len(songs)
     reader = RandomSequentialReader.from_list(songs)
     model = SongListModel(reader)
     self.collection_body.song_list_view.show()
     self.collection_body.song_list_view.setModel(model)
     meta_widget.desc = await async_run(lambda: album.desc)
     meta_widget.title = await async_run(lambda: album.name)
     meta_widget.creator = await async_run(lambda: album.artists_name)
     cover = await async_run(lambda: album.cover)
     if cover:
         aio.create_task(self.show_cover(cover, reverse(album, '/cover')))
Exemple #5
0
    def create_songs_g(self):
        data = self._api.get_album_songs(self.mid)
        if data is None:
            raise QQIOError('server responses with error status code')

        song_list = data

        def read_func(start, end):

            songs = []
            for song in song_list:
                track = _deserialize(song, QQSongSchema)
                songs.append(track)
            return songs

        count = len(song_list)
        reader = RandomSequentialReader(count,
                                        read_func=read_func,
                                        max_per_read=200)
        return reader
Exemple #6
0
    def show_collection(self, coll):
        pure_songs = True
        for model in coll.models:
            if model.meta.model_type != ModelType.song:
                pure_songs = False
                break

        if coll.name == DEFAULT_COLL_ALBUMS:
            self.collection_container.hide()
            reader = RandomSequentialReader.from_list(coll.models)
            self.table_container.show_albums(reader)
            return

        if pure_songs:
            self.collection_container.hide()
            self.table_container.show()
            self.table_container.show_collection(coll)
        else:
            self.table_container.hide()
            self.collection_container.show()
            self.collection_container.show_collection(coll)
Exemple #7
0
 def test_usage(self):
     count = 11
     mock_read_func = mock.MagicMock()
     mock_read_func.side_effect = [list(range(0, 10)), list(range(10, 11))]
     reader = RandomSequentialReader(count,
                                     read_func=mock_read_func,
                                     max_per_read=10)
     self.assertTrue(reader.allow_sequential_read)
     value = next(reader)
     mock_read_func.assert_called_once_with(0, 10)
     self.assertEqual(value, 0)
     self.assertEqual(reader.offset, 1)
     for _ in range(1, 11):
         next(reader)
     mock_read_func.assert_has_calls([
         mock.call(0, 10),
         mock.call(10, 11),
     ])
     self.assertEqual(reader.offset, 11)
     with self.assertRaises(StopIteration):
         next(reader)
     self.assertEqual(reader.offset, 11)
Exemple #8
0
    def create_songs_g(self):
        data = self._api.get_playlist(self.identifier)
        if data is None:
            raise QQIOError('server responses with error status code')

        songlist = data

        count = songlist['cur_song_num']

        song_list = songlist['songlist']

        def read_func(start, end):
            songs = []
            for song in song_list[start:end]:
                track = _deserialize(song, QQSongSchema)
                songs.append(track)
            return songs

        reader = RandomSequentialReader(count,
                                        read_func=read_func,
                                        max_per_read=200)
        return reader
Exemple #9
0
 def create_contributed_albums_g(self):
     return RandomSequentialReader.from_list(self.contributed_albums)
Exemple #10
0
 def create_albums_g(self):
     return RandomSequentialReader.from_list(self.albums)
Exemple #11
0
 def _show_pure_albums_coll(coll):
     self.collection_container.hide()
     reader = RandomSequentialReader.from_list(coll.models)
     self.table_container.show_albums_coll(reader)
Exemple #12
0
        super().__init__(parent=parent)

        self.delegate = SongListDelegate(self)
        self.setItemDelegate(self.delegate)
        self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.setMouseTracking(True)
        self.setFrameShape(QFrame.NoFrame)
        self.activated.connect(self._on_activated)

    def _on_activated(self, index):
        self.play_song_needed.emit(index.data(Qt.UserRole))


if __name__ == '__main__':
    from fuocore.reader import RandomSequentialReader

    class Song:
        title_display = 'hello world'

    songs = [Song() for i in range(0, 10)]
    reader = RandomSequentialReader.from_list(songs)

    app = QApplication([])
    view = SongListView(None)
    model = SongListModel(reader)
    view.setModel(model)
    view.show()
    app.exec()