如何通过MusicKit获取指定时段内播放量最高的专辑或歌曲?
获取Apple Music播放量最高内容的替代方案
一、本地筛选(最直接的变通方法)
MusicLibraryRequest本身不支持时段筛选,你可以先拉取所有带播放记录的歌曲/专辑,再在本地根据播放时间过滤:
歌曲时段筛选示例代码
func fetchMostPlayedSongsInTimeRange(limit: Int, startDate: Date, endDate: Date) async throws -> [Song] { var request = MusicLibraryRequest<Song>() // 先过滤掉无播放记录的歌曲,减少数据量 request.filter(matching: \.playCount > 0) let response = try await request.response() // 本地筛选出指定时段内有播放记录的歌曲 let filteredSongs = response.items.filter { song in guard let lastPlayedDate = song.lastPlayedDate else { return false } return lastPlayedDate >= startDate && lastPlayedDate <= endDate } // 按播放量排序并取指定数量的结果 return filteredSongs.sorted(by: { $0.playCount > $1.playCount }).prefix(limit).map { $0 } }
注意点
- 这个方法依赖
lastPlayedDate字段,只能判断歌曲最后一次播放是否在目标时段内,如果歌曲在时段内多次播放但最后一次在时段外,会被误过滤,精准度有限。
二、调用Apple Music API的Chart接口(获取平台热门内容)
如果你的需求是获取整个Apple Music平台的播放量最高内容(而非用户本地库),可以用MusicKit封装的Chart请求,它支持按日/周/月的时段筛选:
平台热门歌曲示例代码
import MusicKit func fetchPlatformTopSongs(limit: Int, timeRange: ChartTimeRange) async throws -> [Song] { let countryCode = try await MusicDataRequest.currentCountryCode var request = MusicCatalogChartRequest(types: [.songs], limit: limit) request.chartTimeRange = timeRange request.countryCode = countryCode let response = try await request.response() return response.songs.items } // 调用示例:获取当月地区Top30热门歌曲 let topMonthlySongs = try await fetchPlatformTopSongs(limit: 30, timeRange: .monthly)
支持的时段参数
.daily:当日热门内容.weekly:当周热门内容.monthly:当月热门内容
三、进阶本地播放统计(需额外权限)
如果需要精准统计本地库中某时段内的播放次数,MusicKit没有直接接口,可尝试两种方式:
- 启用
Media Library权限,通过MPMediaQuery(MediaPlayer框架)访问更详细的播放历史记录 - 自行维护本地数据库,每次歌曲播放时记录时间,后续基于自定义数据做筛选统计
内容的提问来源于stack exchange,提问作者Fitzgerald Afful
相关产品推荐
相关产品推荐

