11import { computed , ref , type ComputedRef , type Ref } from 'vue'
22
3+ import type {
4+ AlbumDetailResponse ,
5+ AlbumInfoResponse as RawAlbumInfo ,
6+ AlbumSublistResponse ,
7+ AlbumTrackResponse as RawAlbumTrack
8+ } from '@/api/album'
39import { getAlbumDetail , getAlbumSublist } from '@/api/album'
410import { createSong , type Song } from '@/platform/music/interface'
511import { isCanceledRequestError } from '@/utils/http/cancelError'
@@ -24,64 +30,6 @@ export interface UseFavoriteAlbumsReturn {
2430 loadAlbumSongs : ( albumId : string | number ) => Promise < Song [ ] >
2531}
2632
27- interface RawAlbumArtist {
28- id ?: string | number
29- name ?: string
30- }
31-
32- interface RawAlbumInfo {
33- id ?: string | number
34- name ?: string
35- picUrl ?: string
36- size ?: number
37- artist ?: RawAlbumArtist
38- artists ?: RawAlbumArtist [ ]
39- }
40-
41- interface RawAlbumTrack {
42- id ?: string | number
43- name ?: string
44- platform ?: Song [ 'platform' ]
45- server ?: Song [ 'platform' ]
46- artists ?: RawAlbumArtist [ ]
47- ar ?: RawAlbumArtist [ ]
48- album ?: {
49- id ?: string | number
50- name ?: string
51- picUrl ?: string
52- artist ?: {
53- img1v1Url ?: string
54- }
55- }
56- al ?: {
57- id ?: string | number
58- name ?: string
59- picUrl ?: string
60- artist ?: {
61- img1v1Url ?: string
62- }
63- }
64- duration ?: number
65- dt ?: number
66- mvid ?: string | number
67- mv ?: string | number
68- originalId ?: string | number
69- url ?: string
70- mediaId ?: string | number
71- extra ?: Record < string , unknown >
72- }
73-
74- interface AlbumSublistResponse {
75- count ?: number
76- data ?: RawAlbumInfo [ ]
77- hasMore ?: boolean
78- }
79-
80- interface AlbumDetailResponse {
81- album ?: RawAlbumInfo
82- songs ?: RawAlbumTrack [ ]
83- }
84-
8533const ALBUM_PAGE_SIZE = 50
8634
8735function formatAlbumArtistName ( album : RawAlbumInfo ) : string {
@@ -217,27 +165,28 @@ export function useFavoriteAlbums(): UseFavoriteAlbumsReturn {
217165 const response = ( await task . guard (
218166 getAlbumSublist ( ALBUM_PAGE_SIZE , offset )
219167 ) ) as AlbumSublistResponse
220- const pageAlbums = extractFavoriteAlbums ( response )
168+ const rawPageAlbums = extractFavoriteAlbums ( response )
169+ const rawPageCount = rawPageAlbums . length
170+ const pageAlbums = rawPageAlbums
221171 . map ( album => normalizeFavoriteAlbum ( album ) )
222172 . filter ( ( album ) : album is FavoriteAlbumItem => Boolean ( album ) )
223173
224174 nextAlbums . push ( ...pageAlbums )
225175
226176 const totalCount = Number ( response . count )
227177 const reachedEnd =
228- pageAlbums . length === 0 ||
229- ( Number . isFinite ( totalCount ) && nextAlbums . length >= totalCount )
178+ rawPageCount === 0 || ( Number . isFinite ( totalCount ) && nextAlbums . length >= totalCount )
230179
231180 const canInferMore =
232- pageAlbums . length === ALBUM_PAGE_SIZE &&
181+ rawPageCount === ALBUM_PAGE_SIZE &&
233182 ( ! Number . isFinite ( totalCount ) || nextAlbums . length < totalCount )
234183
235184 hasMore = ( response . hasMore ?? canInferMore ) && ! reachedEnd
236185 if ( ! hasMore ) {
237186 break
238187 }
239188
240- offset += pageAlbums . length
189+ offset += rawPageCount
241190 }
242191
243192 task . commit ( ( ) => {
0 commit comments