|
|
@@ -273,6 +273,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
private table: MediaTable | undefined = undefined;
|
|
|
private lastAutoPlayTime: number = 0; // 新增:上次自动播放时间,用于防抖
|
|
|
private autoPlayDebounceMs: number = 1000; // 自动播放防抖间隔(毫秒)
|
|
|
+ private isManualSongChange: boolean = false; // 新增:是否正在进行手动歌曲切换
|
|
|
|
|
|
private constructor() {
|
|
|
this.playerManager = PlayerManager.getInstance();
|
|
|
@@ -698,6 +699,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 播放列表控制方法
|
|
|
async playNext(): Promise<void> {
|
|
|
try {
|
|
|
+ // 设置手动歌曲切换标志,防止自动播放干扰
|
|
|
+ this.isManualSongChange = true;
|
|
|
+
|
|
|
// 首先检查服务是否已准备就绪
|
|
|
if (!this.isAllServicesReady()) {
|
|
|
LogUtils.getInstance().LOGI('UnifiedPlayerService: playNext - 服务未就绪,等待服务初始化完成');
|
|
|
@@ -705,6 +709,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
const isReady = await this.waitForAllServicesReady(500, false);
|
|
|
if (!isReady) {
|
|
|
LogUtils.getInstance().LOGI('UnifiedPlayerService: Services not ready for playNext, skipping');
|
|
|
+ this.isManualSongChange = false;
|
|
|
return; // 直接返回,不抛出错误
|
|
|
}
|
|
|
}
|
|
|
@@ -712,10 +717,12 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
const playMode = this.stateModel.getState().playMode;
|
|
|
|
|
|
if (!this.playlistModel.hasNext(playMode)) {
|
|
|
+ this.isManualSongChange = false;
|
|
|
return;
|
|
|
}
|
|
|
const moved = this.playlistModel.moveToNext(playMode);
|
|
|
if (!moved) {
|
|
|
+ this.isManualSongChange = false;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -744,11 +751,19 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
} catch (error) {
|
|
|
await this.handlePlaybackError(error as Error, PlayerErrorType.PLAYBACK_ERROR);
|
|
|
+ } finally {
|
|
|
+ // 确保在任何情况下都清除手动切换标志
|
|
|
+ setTimeout(() => {
|
|
|
+ this.isManualSongChange = false;
|
|
|
+ }, 1000); // 延迟1秒清除,确保播放器状态稳定
|
|
|
}
|
|
|
}
|
|
|
|
|
|
async playPrevious(): Promise<void> {
|
|
|
try {
|
|
|
+ // 设置手动歌曲切换标志,防止自动播放干扰
|
|
|
+ this.isManualSongChange = true;
|
|
|
+
|
|
|
// 首先检查服务是否已准备就绪
|
|
|
if (!this.isAllServicesReady()) {
|
|
|
LogUtils.getInstance().LOGI('UnifiedPlayerService: playPrevious - 服务未就绪,等待服务初始化完成');
|
|
|
@@ -756,6 +771,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
if (!isReady) {
|
|
|
const error = new Error('Services not ready for playPrevious');
|
|
|
await this.handlePlaybackError(error, PlayerErrorType.INITIALIZATION_ERROR);
|
|
|
+ this.isManualSongChange = false;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
@@ -763,6 +779,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
const playMode = this.stateModel.getState().playMode;
|
|
|
|
|
|
if (!this.playlistModel.hasPrevious(playMode)) {
|
|
|
+ this.isManualSongChange = false;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -772,6 +789,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
const moved = this.playlistModel.moveToPrevious(playMode);
|
|
|
if (!moved) {
|
|
|
+ this.isManualSongChange = false;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -800,12 +818,21 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
} catch (error) {
|
|
|
await this.handlePlaybackError(error as Error, PlayerErrorType.PLAYBACK_ERROR);
|
|
|
+ } finally {
|
|
|
+ // 确保在任何情况下都清除手动切换标志
|
|
|
+ setTimeout(() => {
|
|
|
+ this.isManualSongChange = false;
|
|
|
+ }, 1000); // 延迟1秒清除,确保播放器状态稳定
|
|
|
}
|
|
|
}
|
|
|
async playSongAtIndex(index: number): Promise<void> {
|
|
|
try {
|
|
|
+ // 设置手动歌曲切换标志,防止自动播放干扰
|
|
|
+ this.isManualSongChange = true;
|
|
|
+
|
|
|
const success = this.playlistModel.playSongAtIndex(index);
|
|
|
if (!success) {
|
|
|
+ this.isManualSongChange = false;
|
|
|
throw new Error(`Invalid song index: ${index}`);
|
|
|
}
|
|
|
|
|
|
@@ -826,6 +853,11 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
} catch (error) {
|
|
|
throw new Error;
|
|
|
+ } finally {
|
|
|
+ // 确保在任何情况下都清除手动切换标志
|
|
|
+ setTimeout(() => {
|
|
|
+ this.isManualSongChange = false;
|
|
|
+ }, 1000); // 延迟1秒清除,确保播放器状态稳定
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -2310,6 +2342,12 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
*/
|
|
|
private async handleAutoPlayOnCompletion(): Promise<void> {
|
|
|
try {
|
|
|
+ // 检查是否正在进行手动歌曲切换,如果是则跳过自动播放
|
|
|
+ if (this.isManualSongChange) {
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Manual song change in progress, skipping auto-play');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
// 防抖检查:避免快速连续的自动播放调用
|
|
|
const currentTime = Date.now();
|
|
|
if (currentTime - this.lastAutoPlayTime < this.autoPlayDebounceMs) {
|