Flutter Dart中Spotify API歌曲年代过滤功能失效问题求助
解决Spotify API年代过滤失效问题
你的音乐推荐应用年代过滤失效的核心原因是错误使用了Spotify Recommendations API的过滤参数。Spotify推荐接口不支持直接用release_date作为筛选条件,必须通过min_release_date和max_release_date两个参数分别指定发行日期的起始和结束范围,且日期格式需符合ISO 8601标准(如2020-01-01)。
以下是具体修改步骤:
1. 调整main.dart中的年份范围处理
修改年份范围的生成逻辑,返回包含起始和结束日期的完整ISO格式字符串:
// 在_MyHomePageState类中替换原_getYearRange方法 Map<String, String> _getYearRange(String decade) { int startYear = int.parse(decade.substring(0, 4)); int endYear = startYear + 9; return { 'min': '$startYear-01-01', // 年代起始日期 'max': '$endYear-12-31' // 年代结束日期 }; } // 替换原_recommend方法 void _recommend() async { final genre = _selectedGenre; final dateRange = _getYearRange(_selectedDecade); final results = await _spotifyService.recommendTracks( genre, minReleaseDate: dateRange['min']!, maxReleaseDate: dateRange['max']!, ); setState(() { _recommendationResults = results; }); }
2. 修改spotify_service.dart中的API请求逻辑
更新recommendTracks方法,使用正确的API参数构造请求:
// 替换原recommendTracks方法 Future<List<Map<String, dynamic>>> recommendTracks( String genre, { required String minReleaseDate, required String maxReleaseDate, }) async { final accessToken = await _getAccessToken(); // 使用Uri构造器拼接参数,避免手动拼接字符串出错 final recommendationUrl = Uri.parse('https://api.spotify.com/v1/recommendations') .replace(queryParameters: { 'seed_genres': genre, 'min_release_date': minReleaseDate, 'max_release_date': maxReleaseDate, }); print('Recommendation URL: ${recommendationUrl.toString()}'); final response = await http.get( recommendationUrl, headers: {'Authorization': 'Bearer $accessToken'}, ); if (response.statusCode == 200) { final jsonResponse = json.decode(response.body); final tracks = jsonResponse['tracks'] as List<dynamic>; print('Number of Tracks: ${tracks.length}'); return tracks.map((track) { return { 'name': track['name'] as String, 'artists': track['artists'] as List<dynamic>, 'album': { 'images': track['album']['images'] as List<dynamic>, 'release_date': track['album']['release_date'] as String, }, }; }).toList(); } else { throw Exception('Failed to recommend tracks: ${response.statusCode}'); } }
验证修改
运行应用后,点击推荐按钮,查看控制台打印的请求URL,确认包含min_release_date和max_release_date参数。此时返回的歌曲发行日期应该会严格落在你选择的年代范围内。
内容的提问来源于stack exchange,提问作者Sena
相关产品推荐
相关产品推荐

