You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:14:55