Browse Source

上传苹果的qq音乐服务

newdev_shunjiawei
liwei1dao 1 year ago
parent
commit
f296d7aa34
  1. 19
      lib/data/services/qq_musoc.dart
  2. 24
      lib/modules/agent/views/qqmusic_card.dart
  3. 48
      lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart
  4. 11
      lib/modules/qqmusic/views/qqmusic_playlist_view.dart

19
lib/data/services/qq_musoc.dart

@ -94,7 +94,7 @@ class QqMusocService extends GetxService {
_syncPlaybackInfo(); _syncPlaybackInfo();
// 改为每2-3秒同步一次,减少频率 // 改为每2-3秒同步一次,减少频率
_stateMonitorTimer = Timer.periodic(const Duration(seconds: 2), (timer) { _stateMonitorTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
_syncPlaybackInfo(); _syncPlaybackInfo();
}); });
@ -255,26 +255,31 @@ class QqMusocService extends GetxService {
SongModel? currentSongModel, SongModel? currentSongModel,
}) async { }) async {
try { try {
stopPlaybackStateMonitor();
isPlaying.value = true;
currentPosition.value = 0;
currentSong.value = currentSongModel;
final result = await _qqMusic.playSongs( final result = await _qqMusic.playSongs(
songMids: songMids, songMids: songMids,
index: index, index: index,
); );
print('💥 [QQMusicService] playSongs: $result');
if (result['success'] == true) { if (result['success'] == true) {
if (currentSongModel != null) { if (currentSongModel != null) {
currentSong.value = currentSongModel; currentSong.value = currentSongModel;
totalDuration.value = currentSongModel.duration; totalDuration.value = currentSongModel.duration;
} }
isPlaying.value = true; isPlaying.value = true;
currentPosition.value = 0; currentPosition.value = 0;
// 启动全局状态监听 // 启动全局状态监听
Future.delayed(Duration(milliseconds: 500), () { Future.delayed(Duration(seconds: 1), () {
syncCurrentPlayInfo(); syncCurrentPlayInfo();
}); });
_notifyListeners(); _notifyListeners();
} else {
isPlaying.value = false;
currentPosition.value = 0;
currentSong.value = null;
} }
return result; return result;
@ -419,7 +424,7 @@ class QqMusocService extends GetxService {
try { try {
_stateMonitorTimer?.cancel(); //先关闭计时器 _stateMonitorTimer?.cancel(); //先关闭计时器
final result = await _qqMusic.syncCurrentPlayInfo(); final result = await _qqMusic.syncCurrentPlayInfo();
print('💥 [QQMusicService] syncCurrentPlayInfo: $result');
// 如果同步成功,更新全局状态 // 如果同步成功,更新全局状态
if (result['success'] == true && result['data'] != null) { if (result['success'] == true && result['data'] != null) {
final data = result['data']; final data = result['data'];

24
lib/modules/agent/views/qqmusic_card.dart

@ -122,49 +122,35 @@ Widget buildQQMusicItem(
backgroundColor: Colors.grey, backgroundColor: Colors.grey,
size: 36.0, size: 36.0,
strokeWidth: 2.0, strokeWidth: 2.0,
onPlayPause: () async { onPlayPause: () {
try { try {
if (qqMusicService.isPlaying.value) { if (qqMusicService.isPlaying.value) {
if (qqMusicService.currentSong.value?.mid == song.mid) { if (qqMusicService.currentSong.value?.mid == song.mid) {
// 当前歌曲正在播放,暂停它 // 当前歌曲正在播放,暂停它
await qqMusicService.pauseMusic(); qqMusicService.pauseMusic();
} else { } else {
final songMids = songs.map((s) => s.mid).toList(); final songMids = songs.map((s) => s.mid).toList();
// 其他歌曲正在播放,播放这首歌 // 其他歌曲正在播放,播放这首歌
final result = await qqMusicService.playSongs( qqMusicService.playSongs(
songMids: songMids, songMids: songMids,
index: index, index: index,
songList: [song], songList: [song],
currentSongModel: song, currentSongModel: song,
); );
if (result['success'] == true) {
// 播放成功后,如果歌曲不在当前列表中,保持列表显示状态不变
Get.snackbar('开始播放', song.name);
// qqMusicService.syncCurrentPlayInfo();
} else {
Get.snackbar('播放失败', result['error'] ?? '未知错误');
}
} }
} else { } else {
if (qqMusicService.currentSong.value?.mid == song.mid) { if (qqMusicService.currentSong.value?.mid == song.mid) {
// 当前歌曲已暂停,恢复播放 // 当前歌曲已暂停,恢复播放
await qqMusicService.resumeMusic(); qqMusicService.resumeMusic();
} else { } else {
final songMids = songs.map((s) => s.mid).toList(); final songMids = songs.map((s) => s.mid).toList();
// 播放新歌曲 // 播放新歌曲
final result = await qqMusicService.playSongs( qqMusicService.playSongs(
songMids: songMids, songMids: songMids,
index: index, index: index,
songList: [song], songList: [song],
currentSongModel: song, currentSongModel: song,
); );
if (result['success'] == true) {
// 播放成功后,如果歌曲不在当前列表中,保持列表显示状态不变
Get.snackbar('开始播放', song.name);
// qqMusicService.syncCurrentPlayInfo();
} else {
Get.snackbar('播放失败', result['error'] ?? '未知错误');
}
} }
} }
} catch (e) { } catch (e) {

48
lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart

@ -41,30 +41,10 @@ class QQMusicPlaylistController extends GetxController {
final arguments = Get.arguments; final arguments = Get.arguments;
if (arguments != null && arguments['playlist'] != null) { if (arguments != null && arguments['playlist'] != null) {
final List<SongModel> songList = arguments['playlist']; final List<SongModel> songList = arguments['playlist'];
// try {
// // 解析播放列表数据
// final songList = playlistData
// .map((item) {
// try {
// return SongModel.fromJson(item);
// } catch (e) {
// Logger.e('QQMusicPlaylist', '解析歌曲数据失败: $e, 数据: $item');
// return null;
// }
// })
// .where((song) => song != null)
// .cast<SongModel>()
// .toList();
// Logger.d('QQMusicPlaylist', '成功解析歌曲数量: ${songList.length}');
// 更新播放列表 // 更新播放列表
playlist.assignAll(songList); playlist.assignAll(songList);
// 检查当前播放歌曲是否在列表中 // 检查当前播放歌曲是否在列表中
_syncDisplayStateWithActualPlayback(); _syncDisplayStateWithActualPlayback();
// } catch (e) {
// Logger.e('QQMusicPlaylist', '处理播放列表时发生异常: $e');
// _setDefaultDisplayState();
// }
} else { } else {
Logger.w('QQMusicPlaylist', '未接收到播放列表参数'); Logger.w('QQMusicPlaylist', '未接收到播放列表参数');
_setDefaultDisplayState(); _setDefaultDisplayState();
@ -150,31 +130,9 @@ class QQMusicPlaylistController extends GetxController {
final songMids = finalSongList.map((s) => s.mid).toList(); final songMids = finalSongList.map((s) => s.mid).toList();
final playIndex = finalSongList.indexOf(song); final playIndex = finalSongList.indexOf(song);
// 如果歌曲不在当前列表中,则只播放这一首
if (playIndex == -1) {
final singleSongList = [song];
final result = await _qqMusicService.playSongs(
songMids: [song.mid],
index: 0,
songList: singleSongList,
currentSongModel: song,
);
if (result['success'] == true) {
// 播放成功后,如果歌曲不在当前列表中,保持列表显示状态不变
Get.snackbar('开始播放', song.name);
// _qqMusicService.syncCurrentPlayInfo();
} else {
Get.snackbar('播放失败', result['error'] ?? '未知错误');
displayIsPlaying.value = false;
}
return;
}
// 歌曲在当前列表中,更新界面状态 // 歌曲在当前列表中,更新界面状态
currentIndex.value = playIndex; currentIndex.value = playIndex;
displayCurrentSong.value = song; displayCurrentSong.value = song;
final result = await _qqMusicService.playSongs( final result = await _qqMusicService.playSongs(
songMids: songMids, songMids: songMids,
index: playIndex, index: playIndex,
@ -185,14 +143,14 @@ class QQMusicPlaylistController extends GetxController {
if (result['success'] == true) { if (result['success'] == true) {
displayIsPlaying.value = true; displayIsPlaying.value = true;
// _qqMusicService.syncCurrentPlayInfo(); // _qqMusicService.syncCurrentPlayInfo();
Get.snackbar('开始播放', song.name); // Get.snackbar('开始播放', song.name);
} else { } else {
displayIsPlaying.value = false; displayIsPlaying.value = false;
Get.snackbar('播放失败', result['error'] ?? '未知错误'); // Get.snackbar('播放失败', result['error'] ?? '未知错误');
} }
} catch (e) { } catch (e) {
displayIsPlaying.value = false; displayIsPlaying.value = false;
Get.snackbar('播放失败', e.toString()); // Get.snackbar('播放失败', e.toString());
} }
} }

11
lib/modules/qqmusic/views/qqmusic_playlist_view.dart

@ -163,7 +163,8 @@ class QqmusicPlaylistView extends GetView<QQMusicPlaylistController> {
itemCount: controller.playlist.length, itemCount: controller.playlist.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final song = controller.playlist[index]; final song = controller.playlist[index];
return _buildMusicItem(context, song, isDarkMode); return _buildMusicItem(
context, controller.playlist, song, index, isDarkMode);
}, },
); );
}, },
@ -172,12 +173,14 @@ class QqmusicPlaylistView extends GetView<QQMusicPlaylistController> {
Widget _buildMusicItem( Widget _buildMusicItem(
BuildContext context, BuildContext context,
List<SongModel> songs,
SongModel song, SongModel song,
int index,
bool isDarkMode, bool isDarkMode,
) { ) {
return GestureDetector( return GestureDetector(
onTap: () async { onTap: () async {
await controller.playSong(song); await controller.playSong(song, songList: songs);
}, },
child: Container( child: Container(
margin: EdgeInsets.only(bottom: 10.h), margin: EdgeInsets.only(bottom: 10.h),
@ -309,11 +312,11 @@ class QqmusicPlaylistView extends GetView<QQMusicPlaylistController> {
await controller.togglePlayPause(); await controller.togglePlayPause();
} else { } else {
Logger.d('MusicPlaylistView', '播放新歌曲'); Logger.d('MusicPlaylistView', '播放新歌曲');
await controller.playSong(song); await controller.playSong(song, songList: songs);
} }
} else { } else {
Logger.d('MusicPlaylistView', '开始播放歌曲'); Logger.d('MusicPlaylistView', '开始播放歌曲');
await controller.playSong(song); await controller.playSong(song, songList: songs);
} }
} catch (e) { } catch (e) {
Logger.e('MusicPlaylistView', '播放音乐时发生错误: $e'); Logger.e('MusicPlaylistView', '播放音乐时发生错误: $e');

Loading…
Cancel
Save