// Author: fengshengxiong // Date: 2024/6/18 // Description: 音乐播放器Api import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:tone_snap/data/models/next_model.dart'; import 'package:tone_snap/data/models/player_model.dart'; import 'package:tone_snap/data/models/search_suggestions_model.dart'; import 'package:tone_snap/data/network/base_error.dart'; import 'package:tone_snap/data/network/dio_client.dart'; import 'package:tone_snap/data/storage/music_box.dart'; import 'package:tone_snap/global/app_config.dart'; class MusicApi { static const String baseUrl = 'https://music.youtube.com/youtubei/v1/'; /// browse static Future browse({ String? visitorData, Map? queryParameters, T Function(Map)? formJson, Function(BaseError baseError)? fail, bool showLoading = false, bool showToast = false, }) async { String clientVersion = MusicBox().getClientVersion(); String preferredLanguages = WidgetsBinding.instance.platformDispatcher.locale.languageCode; final body = { "context": { "client": { "visitorData": visitorData, "clientName": "WEB_REMIX", "clientVersion": clientVersion, "platform": "DESKTOP", "hl": preferredLanguages, "gl": AppConfig.isoCode } } }; T? model; await DioClient().request( 'browse', showLoading: showLoading, showToast: showToast, requestMethod: RequestMethod.post, data: body, queryParameters: queryParameters, formJson: formJson, success: (data) => model = data, fail: fail ); return model; } /// next static Future next({ String? playlistId, String? videoId, bool showLoading = false, bool showToast = true, }) async { String clientVersion = MusicBox().getClientVersion(); String preferredLanguages = WidgetsBinding.instance.platformDispatcher.locale.languageCode; final body = { "context": { "client": { "clientName": "WEB_REMIX", "clientVersion": clientVersion, "platform": "DESKTOP", "hl": preferredLanguages, "gl": AppConfig.isoCode } } }; Map? queryParameters = { 'prettyPrint': false, 'playlistId': playlistId, 'videoId': videoId }; NextModel? model; await DioClient().request( 'next', showLoading: showLoading, showToast: showToast, requestMethod: RequestMethod.post, data: body, queryParameters: queryParameters, formJson: NextModel.fromMap, success: (data) => model = data, ); return model; } /// player static Future player({ String? videoId, CancelToken? cancelToken, Function(BaseError baseError)? fail, bool showLoading = false, bool showToast = true, }) async { String playerVersion = MusicBox().getPlayerVersion(); final body = { "context": { "client": { "clientName": "ANDROID_MUSIC", "clientVersion": playerVersion, "platform": "MOBILE", "browserVersion":"125.0.0.0" } } }; Map? queryParameters = { 'prettyPrint': false, 'playlistId': null, 'videoId': videoId }; PlayerModel? model; await DioClient().request( 'player', showLoading: showLoading, showToast: showToast, requestMethod: RequestMethod.post, data: body, queryParameters: queryParameters, cancelToken: cancelToken, formJson: PlayerModel.fromMap, success: (data) => model = data, fail: fail, ); return model; } /// 搜索建议 static Future searchSuggestions({ String? input, CancelToken? cancelToken, bool showLoading = false, bool showToast = false, }) async { String clientVersion = MusicBox().getClientVersion(); String preferredLanguages = WidgetsBinding.instance.platformDispatcher.locale.languageCode; final body = { "context": { "client": { "clientName": "WEB_REMIX", "clientVersion": clientVersion, "platform": "DESKTOP", "hl": preferredLanguages, "gl": AppConfig.isoCode } } }; Map? queryParameters = { 'prettyPrint': false, 'input': input, }; SearchSuggestionsModel? model; await DioClient().request( 'music/get_search_suggestions', showLoading: showLoading, showToast: showToast, requestMethod: RequestMethod.post, data: body, queryParameters: queryParameters, cancelToken: cancelToken, formJson: SearchSuggestionsModel.fromMap, success: (data) => model = data, ); return model; } /// 搜索 static Future search({ Map? queryParameters, T Function(Map)? formJson, Function(BaseError baseError)? fail, bool showLoading = false, bool showToast = true, }) async { String clientVersion = MusicBox().getClientVersion(); String preferredLanguages = WidgetsBinding.instance.platformDispatcher.locale.languageCode; final body = { "context": { "client": { "clientName": "WEB_REMIX", "clientVersion": clientVersion, "platform": "DESKTOP", "hl": preferredLanguages, "gl": AppConfig.isoCode } } }; T? model; await DioClient().request( 'search', showLoading: showLoading, showToast: showToast, requestMethod: RequestMethod.post, data: body, queryParameters: queryParameters, formJson: formJson, success: (data) => model = data, fail: fail, ); return model; } }