Browse Source

上传苹果的qq音乐服务

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

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

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

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

@ -41,30 +41,10 @@ class QQMusicPlaylistController extends GetxController {
final arguments = Get.arguments;
if (arguments != null && arguments['playlist'] != null) {
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);
// 检查当前播放歌曲是否在列表中
_syncDisplayStateWithActualPlayback();
// } catch (e) {
// Logger.e('QQMusicPlaylist', '处理播放列表时发生异常: $e');
// _setDefaultDisplayState();
// }
} else {
Logger.w('QQMusicPlaylist', '未接收到播放列表参数');
_setDefaultDisplayState();
@ -150,31 +130,9 @@ class QQMusicPlaylistController extends GetxController {
final songMids = finalSongList.map((s) => s.mid).toList();
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;
displayCurrentSong.value = song;
final result = await _qqMusicService.playSongs(
songMids: songMids,
index: playIndex,
@ -185,14 +143,14 @@ class QQMusicPlaylistController extends GetxController {
if (result['success'] == true) {
displayIsPlaying.value = true;
// _qqMusicService.syncCurrentPlayInfo();
Get.snackbar('开始播放', song.name);
// Get.snackbar('开始播放', song.name);
} else {
displayIsPlaying.value = false;
Get.snackbar('播放失败', result['error'] ?? '未知错误');
// Get.snackbar('播放失败', result['error'] ?? '未知错误');
}
} catch (e) {
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,
itemBuilder: (context, 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(
BuildContext context,
List<SongModel> songs,
SongModel song,
int index,
bool isDarkMode,
) {
return GestureDetector(
onTap: () async {
await controller.playSong(song);
await controller.playSong(song, songList: songs);
},
child: Container(
margin: EdgeInsets.only(bottom: 10.h),
@ -309,11 +312,11 @@ class QqmusicPlaylistView extends GetView<QQMusicPlaylistController> {
await controller.togglePlayPause();
} else {
Logger.d('MusicPlaylistView', '播放新歌曲');
await controller.playSong(song);
await controller.playSong(song, songList: songs);
}
} else {
Logger.d('MusicPlaylistView', '开始播放歌曲');
await controller.playSong(song);
await controller.playSong(song, songList: songs);
}
} catch (e) {
Logger.e('MusicPlaylistView', '播放音乐时发生错误: $e');

Loading…
Cancel
Save