|
|
@@ -41,6 +41,16 @@ import { FormInfo } from '../../viewmodel/FormInfo';
|
|
|
import { WidgetDataRdbHelper } from '../../database/WidgetDataRdbHelper';
|
|
|
import { WidgetDataInfo } from '../../viewmodel/WidgetDataInfo';
|
|
|
import { PreferencesUtil, IWidgetData } from '../utils/PreferencesUtil';
|
|
|
+import { SettingPage } from '../../pages/SettingPage';
|
|
|
+
|
|
|
+/**
|
|
|
+ * 跳过设置接口
|
|
|
+ */
|
|
|
+interface JumpSettings {
|
|
|
+ isEnabled: boolean;
|
|
|
+ jumpTopTime: number;
|
|
|
+ jumpEndTime: number;
|
|
|
+}
|
|
|
|
|
|
/**
|
|
|
* 存储方式枚举
|
|
|
@@ -501,7 +511,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.playlistSync = PlaylistSyncService.getInstance();
|
|
|
this.errorRecovery = ErrorRecoveryStrategy.getInstance();
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Instance created');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Instance created');
|
|
|
}
|
|
|
|
|
|
public static getInstance(): UnifiedPlayerService {
|
|
|
@@ -513,7 +523,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
async initialize(context: common.UIAbilityContext): Promise<void> {
|
|
|
if (this.isInitialized && this.context === context) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService已经初始化过了');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService已经初始化过了');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -548,7 +558,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 清理无效的Form ID
|
|
|
this.cleanupInvalidFormIds();
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Core initialization completed');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Core initialization completed');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService initialization error: ${error}`);
|
|
|
throw new Error(`初始化失败: ${error}`);
|
|
|
@@ -564,7 +574,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.context = context as common.UIAbilityContext;
|
|
|
// 同时设置到AppStorage,确保卡片进程中其他地方能访问
|
|
|
AppStorage.setOrCreate('context', context);
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Form context set successfully');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Form context set successfully');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to set form context: ${error}`);
|
|
|
}
|
|
|
@@ -628,14 +638,14 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
setTimeout(async () => {
|
|
|
try {
|
|
|
this.saveCurrentState()
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Player state synced to UI after initialization');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Player state synced to UI after initialization');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to sync player state after initialization: ${error}`);
|
|
|
}
|
|
|
}, 500); // 延迟500ms确保初始化完全完成
|
|
|
|
|
|
console.log("Heanup2 UnifiedPlayerService: 异步组件初始化完成");
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Heavy components initialized');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Heavy components initialized');
|
|
|
} catch (error) {
|
|
|
console.log(`Heanup2 UnifiedPlayerService: 异步组件初始化失败: ${error}`);
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService heavy components init error: ${error}`);
|
|
|
@@ -900,7 +910,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
try {
|
|
|
// 检查服务是否已准备就绪
|
|
|
if (!this.isAllServicesReady()) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: pause - 服务未就绪');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: pause - 服务未就绪');
|
|
|
// 对于暂停操作,如果服务未就绪,可以尝试简单的状态更新
|
|
|
this.stateModel.updatePlayingState(false);
|
|
|
return;
|
|
|
@@ -956,7 +966,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 更新卡片显示停止状态
|
|
|
await this.updateWidgetsForPlayStateChange();
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Stop completed, all states cleared');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Stop completed, all states cleared');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService stop error: ${error}`);
|
|
|
throw new Error;
|
|
|
@@ -1078,7 +1088,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 移除此处的AVSession更新,避免与onPrepared中的更新冲突
|
|
|
// AVSession会在onPrepared回调中正确更新
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Widget state updated after track change');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Widget state updated after track change');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to update widgets after track change: ${error}`);
|
|
|
}
|
|
|
@@ -1272,7 +1282,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 触发状态变化通知,确保LocalMusic UI能收到收藏状态变化
|
|
|
this.stateModel.forceNotifyStateChanged();
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Favorite status refreshed and state change notified');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Favorite status refreshed and state change notified');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to refresh favorite status: ${error}`);
|
|
|
}
|
|
|
@@ -1320,11 +1330,11 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
*/
|
|
|
async forceDataRestoration(): Promise<boolean> {
|
|
|
try {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Force data restoration started');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Force data restoration started');
|
|
|
|
|
|
// 如果数据已经恢复,直接返回
|
|
|
if (this.isDataRestored) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Data already restored');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Data already restored');
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -1333,7 +1343,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 如果播放列表仍为空,尝试从内存快速恢复
|
|
|
if (this.playlistModel.getTotalCount() === 0) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Playlist empty, trying memory restore');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Playlist empty, trying memory restore');
|
|
|
await this.fastRestoreFromMemory();
|
|
|
}
|
|
|
|
|
|
@@ -1358,30 +1368,30 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
try {
|
|
|
// 检查基本初始化状态
|
|
|
if (!this.isInitialized) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Service not initialized');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Service not initialized');
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// 检查核心组件是否就绪
|
|
|
if (!this.playerManager || !this.stateModel || !this.playlistModel) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Core components not ready');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Core components not ready');
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// 检查 PlayerManager 是否已经初始化
|
|
|
const playerInstance = this.playerManager.getIjkPlayer();
|
|
|
if (!playerInstance) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Player instance not ready');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Player instance not ready');
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// 检查上下文是否可用
|
|
|
if (!this.context) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Context not available');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Context not available');
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: All services ready');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: All services ready');
|
|
|
return true;
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Service readiness check failed: ${error}`);
|
|
|
@@ -1510,13 +1520,13 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
if (this.isAllServicesReady()) {
|
|
|
// 如果不需要检查数据恢复,直接返回成功
|
|
|
if (!checkDataRestore) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: All services ready (data restore check skipped)');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: All services ready (data restore check skipped)');
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
// 检查数据恢复状态
|
|
|
if (this.isDataRestored) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: All services ready and data restored');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: All services ready and data restored');
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -1662,7 +1672,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Small playlist sync detected, first few songs: ${songList.slice(0, 5).map(s => s.name).join(', ')}`);
|
|
|
}
|
|
|
} else {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: syncPlaylistToService - No songs to sync');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: syncPlaylistToService - No songs to sync');
|
|
|
}
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService syncPlaylistToService error: ${error}`);
|
|
|
@@ -1704,7 +1714,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.playerManager.release() ;
|
|
|
}
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Forced stop state before release');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Forced stop state before release');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to force stop state: ${error}`);
|
|
|
}
|
|
|
@@ -1724,7 +1734,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.playlistModel.clear();
|
|
|
this.isInitialized = false;
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Resources released');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Resources released');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService release error: ${error}`);
|
|
|
}
|
|
|
@@ -1739,12 +1749,12 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
try {
|
|
|
|
|
|
this.avSessionController = AvSessionController.getInstance(false);
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession controller created');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession controller created');
|
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
this.setAvSessionListener();
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession listeners configured');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession listeners configured');
|
|
|
}, 500);
|
|
|
|
|
|
} catch (error) {
|
|
|
@@ -1764,7 +1774,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
const avSession = this.avSessionController.getAvSession();
|
|
|
if (!avSession) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession not available for listener setup');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession not available for listener setup');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -1779,7 +1789,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 暂停事件监听
|
|
|
avSession.on('pause', () => {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession pause command received');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession pause command received');
|
|
|
this.pause().catch((error: Error) => {
|
|
|
LogUtils.getInstance().LOGI(`AVSession pause command failed: ${error}`);
|
|
|
});
|
|
|
@@ -1787,7 +1797,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 停止事件监听
|
|
|
avSession.on('stop', () => {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession stop command received');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession stop command received');
|
|
|
this.stop().catch((error: Error) => {
|
|
|
LogUtils.getInstance().LOGI(`AVSession stop command failed: ${error}`);
|
|
|
});
|
|
|
@@ -1795,7 +1805,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 下一首事件监听
|
|
|
avSession.on('playNext', () => {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession playNext command received');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession playNext command received');
|
|
|
this.playNext().catch((error: Error) => {
|
|
|
LogUtils.getInstance().LOGI(`AVSession playNext command failed: ${error}`);
|
|
|
});
|
|
|
@@ -1803,7 +1813,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 上一首事件监听
|
|
|
avSession.on('playPrevious', () => {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession playPrevious command received');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession playPrevious command received');
|
|
|
this.playPrevious().catch((error: Error) => {
|
|
|
LogUtils.getInstance().LOGI(`AVSession playPrevious command failed: ${error}`);
|
|
|
});
|
|
|
@@ -1835,7 +1845,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.toggleFavorite() ;
|
|
|
});
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession listeners set up successfully');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession listeners set up successfully');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to set AVSession listeners: ${error}`);
|
|
|
}
|
|
|
@@ -1941,7 +1951,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
*/
|
|
|
private async skipToNextSong(): Promise<void> {
|
|
|
try {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Skipping to next song due to error');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Skipping to next song due to error');
|
|
|
|
|
|
// 重置重试计数
|
|
|
this.currentRetryCount = 0;
|
|
|
@@ -1953,7 +1963,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
} else {
|
|
|
// 没有下一首,停止播放
|
|
|
await this.stop();
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: No next song available, stopping playback');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No next song available, stopping playback');
|
|
|
}
|
|
|
|
|
|
} catch (skipError) {
|
|
|
@@ -2141,7 +2151,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 启动新的定时器
|
|
|
this.setupProgressTimer();
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Progress timer started');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Progress timer started');
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -2151,7 +2161,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
if (this.progressTimer !== -1) {
|
|
|
clearInterval(this.progressTimer);
|
|
|
this.progressTimer = -1;
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Progress timer stopped');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Progress timer stopped');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -2364,7 +2374,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 立即更新播放列表状态,确保上一首/下一首状态正确
|
|
|
this.updatePlaylistStateInModelSync();
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Data restoration completed');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Data restoration completed');
|
|
|
} catch (error) {
|
|
|
console.log(`Heanup2 UnifiedPlayerService: 恢复持久化状态时出错: ${error}`);
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService restorePersistedState error: ${error}`);
|
|
|
@@ -2471,13 +2481,13 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.stateModel.updateCurrentIndex(playlistData.currentIndex);
|
|
|
this.stateModel.updatePlayMode(playlistData.playMode);
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Local playlist updated from storage');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Local playlist updated from storage');
|
|
|
}
|
|
|
|
|
|
// 更新数据恢复状态(如果还没有恢复的话)
|
|
|
if (!this.isDataRestored) {
|
|
|
this.isDataRestored = true;
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Data restoration completed via onPlaylistLoaded');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Data restoration completed via onPlaylistLoaded');
|
|
|
}
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService onPlaylistLoaded error: ${error}`);
|
|
|
@@ -2542,7 +2552,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
*/
|
|
|
public async onPlayPause(params?: PlayPauseInterface): Promise<void> {
|
|
|
try {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Received play/pause command from widget');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Received play/pause command from widget');
|
|
|
const widgetIsPlaying = params?.widgetIsPlaying;
|
|
|
|
|
|
if (widgetIsPlaying !== undefined) {
|
|
|
@@ -2550,16 +2560,16 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Using widget state - widgetIsPlaying=${widgetIsPlaying}`);
|
|
|
if (widgetIsPlaying) {
|
|
|
// 卡片显示的是暂停按钮(UI为播放状态),所以执行暂停
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Widget state is PLAYING, will pause.');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Widget state is PLAYING, will pause.');
|
|
|
await this.pause();
|
|
|
} else {
|
|
|
// 卡片显示的是播放按钮(UI为暂停/停止状态),所以执行播放
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Widget state is PAUSED, will play.');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Widget state is PAUSED, will play.');
|
|
|
await this.startPlayOrResumePlay();
|
|
|
}
|
|
|
} else {
|
|
|
// 向后兼容的旧逻辑:根据播放器实际状态切换
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: widgetIsPlaying not provided, using fallback logic.');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: widgetIsPlaying not provided, using fallback logic.');
|
|
|
const isActuallyPlaying = this.getActualPlayingState();
|
|
|
if (isActuallyPlaying) {
|
|
|
await this.pause();
|
|
|
@@ -2577,9 +2587,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
*/
|
|
|
async onNextSong?(): Promise<void> {
|
|
|
try {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Received next song command from widget');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Received next song command from widget');
|
|
|
await this.playNext();
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Next song command executed successfully');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Next song command executed successfully');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService onNextSong error: ${error}`);
|
|
|
throw new Error;
|
|
|
@@ -2591,9 +2601,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
*/
|
|
|
async onPreviousSong?(): Promise<void> {
|
|
|
try {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Received previous song command from widget');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Received previous song command from widget');
|
|
|
await this.playPrevious();
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Previous song command executed successfully');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Previous song command executed successfully');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService onPreviousSong error: ${error}`);
|
|
|
throw new Error;
|
|
|
@@ -2607,7 +2617,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
try {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Received seek to command from widget - position: ${position}`);
|
|
|
await this.seekTo(position.toString());
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Seek to command executed successfully');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Seek to command executed successfully');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService onSeekTo error: ${error}`);
|
|
|
throw new Error;
|
|
|
@@ -2619,9 +2629,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
*/
|
|
|
async onStateRequest?(): Promise<void> {
|
|
|
try {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Received state request from widget');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Received state request from widget');
|
|
|
await this.broadcastCurrentState();
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: State request handled successfully');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: State request handled successfully');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService onStateRequest error: ${error}`);
|
|
|
throw new Error;
|
|
|
@@ -2641,7 +2651,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 更新桌面卡片
|
|
|
await this.updateAllForms(true); // 强制更新
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Current state broadcasted manually');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Current state broadcasted manually');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService broadcastCurrentState error: ${error}`);
|
|
|
throw new Error;
|
|
|
@@ -2660,10 +2670,10 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
ijkPlayer.on('audioInterrupt', (event: InterruptEvent) => {
|
|
|
this.handleAudioInterrupt(event);
|
|
|
});
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt listener set up successfully');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt listener set up successfully');
|
|
|
} else {
|
|
|
LogUtils.getInstance()
|
|
|
- .LOGI('UnifiedPlayerService: Failed to set up audio interrupt listener - no player instance');
|
|
|
+ .LOGI('Heanup UnifiedPlayerService: Failed to set up audio interrupt listener - no player instance');
|
|
|
}
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Error setting up audio interrupt listener: ${error.message}`);
|
|
|
@@ -2682,27 +2692,27 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
switch (event.hintType) {
|
|
|
case InterruptHintType.INTERRUPT_HINT_PAUSE:
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - pausing playback');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt - pausing playback');
|
|
|
await this.pause();
|
|
|
break;
|
|
|
|
|
|
case InterruptHintType.INTERRUPT_HINT_RESUME:
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - resuming playback');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt - resuming playback');
|
|
|
await this.startPlayOrResumePlay();
|
|
|
break;
|
|
|
|
|
|
case InterruptHintType.INTERRUPT_HINT_STOP:
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - stopping playback');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt - stopping playback');
|
|
|
await this.stop();
|
|
|
break;
|
|
|
|
|
|
case InterruptHintType.INTERRUPT_HINT_DUCK:
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - ducking (lowering volume)');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt - ducking (lowering volume)');
|
|
|
// 可以实现音量降低逻辑
|
|
|
break;
|
|
|
|
|
|
case InterruptHintType.INTERRUPT_HINT_UNDUCK:
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Audio interrupt - unducking (restoring volume)');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Audio interrupt - unducking (restoring volume)');
|
|
|
// 可以实现音量恢复逻辑
|
|
|
break;
|
|
|
|
|
|
@@ -2784,13 +2794,18 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// ==================== PlayerStateCallback 实现 ====================
|
|
|
|
|
|
onPrepared(): void {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Player prepared');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Player prepared');
|
|
|
this.stateModel.updateLoadingState(false);
|
|
|
|
|
|
// 标记播放器已为当前歌曲准备就绪
|
|
|
this.isPlayerPreparedForCurrentSong = true;
|
|
|
console.log("Heanup2 UnifiedPlayerService: onPrepared - 播放器已为当前歌曲准备就绪");
|
|
|
|
|
|
+ // 执行跳过片头和记忆播放恢复逻辑
|
|
|
+ setTimeout(() => {
|
|
|
+ this.checkAndHandleOnPreparedLogic();
|
|
|
+ }, 200);
|
|
|
+
|
|
|
setTimeout(() => {
|
|
|
const ijkPlayer = this.playerManager.getIjkPlayer();
|
|
|
const isActuallyPlaying = ijkPlayer ? ijkPlayer.isPlaying() : false;
|
|
|
@@ -2826,8 +2841,118 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.updateWidgetsForStateChange();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 播放器准备完成后的特殊逻辑处理
|
|
|
+ * 包括跳过片头和记忆播放恢复
|
|
|
+ */
|
|
|
+ private checkAndHandleOnPreparedLogic(): void {
|
|
|
+ try {
|
|
|
+ const currentSong = this.playlistModel.getCurrentSong();
|
|
|
+ if (!currentSong) {
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No current song, skipping onPrepared logic');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const videoUrl = currentSong.filePath;
|
|
|
+ const duration = this.playerManager.getIjkPlayer()?.getDuration() || 0;
|
|
|
+
|
|
|
+ // 检查跳过片头功能
|
|
|
+ const jumpSettings = this.loadJumpSettings(currentSong);
|
|
|
+
|
|
|
+ if (jumpSettings.isEnabled && jumpSettings.jumpTopTime > 0) {
|
|
|
+ if (jumpSettings.jumpTopTime * 1000 <= duration) {
|
|
|
+ // 需要跳过片头
|
|
|
+ if (videoUrl && !videoUrl.toLowerCase().endsWith('.ts')) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Jumping to intro end: ${jumpSettings.jumpTopTime}s`);
|
|
|
+ this.seekTo((jumpSettings.jumpTopTime * 1000).toString());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Jump time exceeds video duration');
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 没有跳过片头,检查记忆播放
|
|
|
+ this.handleMemoryPlayback(currentSong, videoUrl);
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Error in checkAndHandleOnPreparedLogic: ${error}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载跳过头尾设置
|
|
|
+ */
|
|
|
+ private loadJumpSettings(currentSong: VideoItem): JumpSettings {
|
|
|
+ try {
|
|
|
+ // 这里应该根据播放模式来获取设置,但因为我们在 UnifiedPlayerService 中,
|
|
|
+ // 暂时从当前歌曲的文件路径获取文件夹设置
|
|
|
+ const parentPath = this.getParentPath(currentSong.filePath);
|
|
|
+
|
|
|
+ const jumpTopTime: number = PuraPreferencesUtil.getNumberSync(parentPath + 'jumpTopTime', 0);
|
|
|
+ const jumpEndTime: number = PuraPreferencesUtil.getNumberSync(parentPath + 'jumpEndTime', 0);
|
|
|
+ const isEnabled: boolean = PuraPreferencesUtil.getBooleanSync(parentPath + 'isOpenJump', false);
|
|
|
+
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Loaded jump settings - enabled: ${isEnabled}, top: ${jumpTopTime}s, end: ${jumpEndTime}s`);
|
|
|
+
|
|
|
+ const settings: JumpSettings = { isEnabled, jumpTopTime, jumpEndTime };
|
|
|
+ return settings;
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Error loading jump settings: ${error}`);
|
|
|
+ const defaultSettings: JumpSettings = { isEnabled: false, jumpTopTime: 0, jumpEndTime: 0 };
|
|
|
+ return defaultSettings;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理记忆播放
|
|
|
+ */
|
|
|
+ private handleMemoryPlayback(currentSong: VideoItem, videoUrl: string): void {
|
|
|
+ try {
|
|
|
+ // 检查用户是否启用了记忆播放功能
|
|
|
+ const isMusicMemoryPlay: boolean = PuraPreferencesUtil.getBooleanSync(SettingPage.iS_MUSIC_MEMORY_PLAY, false);
|
|
|
+ const isMemoryLastPlay: boolean = PuraPreferencesUtil.getBooleanSync(SettingPage.iS_MEMORY_LAST_PLAY, false);
|
|
|
+
|
|
|
+ // 只在首次启动时检查 isMemoryLastPlay
|
|
|
+ // 这里我们假设如果是首次播放,会有特殊标记
|
|
|
+ if (!isMusicMemoryPlay && !isMemoryLastPlay) {
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Memory play disabled, skipping restore');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (videoUrl && !videoUrl.toLowerCase().endsWith('.ts')) {
|
|
|
+ // 优先从 AppStorage 获取,如果没有则从 PreferencesUtil 获取
|
|
|
+ let position: number = AppStorage.get<number>(`playback_${videoUrl}`) || 0;
|
|
|
+ if (position === 0) {
|
|
|
+ position = PuraPreferencesUtil.getNumberSync(videoUrl, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (position > 0) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Restoring playback position: ${position}ms for ${currentSong.name}`);
|
|
|
+ this.seekTo(position.toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Error in handleMemoryPlayback: ${error}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取文件的父目录路径
|
|
|
+ */
|
|
|
+ private getParentPath(filePath: string): string {
|
|
|
+ try {
|
|
|
+ const lastSlashIndex = filePath.lastIndexOf('/');
|
|
|
+ if (lastSlashIndex > 0) {
|
|
|
+ return filePath.substring(0, lastSlashIndex + 1);
|
|
|
+ }
|
|
|
+ return filePath;
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Error getting parent path: ${error}`);
|
|
|
+ return filePath;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
onPlaybackStarted(): void {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Playback started (new song)');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Playback started (new song)');
|
|
|
|
|
|
// 这个回调只应该在新歌曲开始播放时被调用(通过onPrepared触发)
|
|
|
// 不应该在暂停恢复时被调用
|
|
|
@@ -2836,7 +2961,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
const playMode = this.stateModel.getState().playMode;
|
|
|
if (playMode === PlayMode.RANDOM) {
|
|
|
this.playlistModel.ensureCurrentSongInHistory();
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Ensured current song in play history for random mode');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Ensured current song in play history for random mode');
|
|
|
}
|
|
|
|
|
|
// 立即更新播放状态
|
|
|
@@ -2850,7 +2975,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 立即更新系统播控状态,确保与播放状态同步
|
|
|
this.updateSessionPlayState(true); // 强制更新,不使用防抖
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession state updated for new song playback');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession state updated for new song playback');
|
|
|
|
|
|
// 播放开始时更新卡片显示播放状态
|
|
|
this.updateWidgetsForPlayStateChange();
|
|
|
@@ -2858,11 +2983,11 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 同步更新所有桌面卡片状态
|
|
|
this.updateAllForms();
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: New song playback started successfully');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: New song playback started successfully');
|
|
|
}
|
|
|
|
|
|
onPlaybackCompleted(): void {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Playback completed');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Playback completed');
|
|
|
this.stateModel.updatePlayingState(false);
|
|
|
this.stopProgressTimer();
|
|
|
|
|
|
@@ -2891,21 +3016,21 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
try {
|
|
|
// 检查是否正在进行手动歌曲切换,如果是则跳过自动播放
|
|
|
if (this.isManualSongChange) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Manual song change in progress, skipping auto-play');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Manual song change in progress, skipping auto-play');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 防抖检查:避免快速连续的自动播放调用
|
|
|
const currentTime = Date.now();
|
|
|
if (currentTime - this.lastAutoPlayTime < this.autoPlayDebounceMs) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Auto-play debounced, skipping');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Auto-play debounced, skipping');
|
|
|
return;
|
|
|
}
|
|
|
this.lastAutoPlayTime = currentTime;
|
|
|
|
|
|
// 检查服务状态,避免在服务未就绪时执行自动播放
|
|
|
if (!this.isAllServicesReady()) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Services not ready for auto-play, skipping');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Services not ready for auto-play, skipping');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -2916,28 +3041,28 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
switch (playMode) {
|
|
|
case PlayMode.SEQUENCE: // 0: 顺序播放/列表循环
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Auto-playing next song in sequence mode');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Auto-playing next song in sequence mode');
|
|
|
// 检查是否有下一首歌曲
|
|
|
if (this.playlistModel.hasNext(playMode)) {
|
|
|
await this.playNext();
|
|
|
} else {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: No next song available in sequence mode');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No next song available in sequence mode');
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case PlayMode.SINGLE_REPEAT: // 1: 单曲循环
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Repeating current song');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Repeating current song');
|
|
|
// 重新播放当前歌曲
|
|
|
await this.startPlayOrResumePlay();
|
|
|
break;
|
|
|
|
|
|
case PlayMode.NORMAL: // 2: 正常播放,播完停止
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Normal mode - stopping after completion');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Normal mode - stopping after completion');
|
|
|
// 不做任何操作,保持停止状态
|
|
|
break;
|
|
|
|
|
|
case PlayMode.RANDOM: // 3: 随机播放
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Auto-playing random next song');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Auto-playing random next song');
|
|
|
await this.playRandomNext();
|
|
|
break;
|
|
|
|
|
|
@@ -2961,7 +3086,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
try {
|
|
|
const playlist = this.playlistModel.getSongs();
|
|
|
if (playlist.length <= 1) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Not enough songs for random play');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Not enough songs for random play');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -3041,13 +3166,13 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 增强防抖保护,特别是在APP前台运行时
|
|
|
const now = Date.now();
|
|
|
if (!forceUpdate && this.lastFormUpdateTime && (now - this.lastFormUpdateTime < 200)) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: Skipping due to debounce protection (200ms)');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService updateAllForms: Skipping due to debounce protection (200ms)');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 防抖和重入保护,防止短时间内重复执行更新
|
|
|
if (this.isUpdatingForms && !forceUpdate) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: Update already in progress, skipping.');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService updateAllForms: Update already in progress, skipping.');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -3058,7 +3183,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
const context = this.getContext();
|
|
|
if (!context) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: No context available');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService updateAllForms: No context available');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -3068,7 +3193,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 优化:立即获取卡片数据,优先响应UI
|
|
|
const widgetData = await this.getWidgetFormData();
|
|
|
if (!widgetData) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: Failed to get widget data.');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService updateAllForms: Failed to get widget data.');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -3077,7 +3202,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 等待Form列表获取完成
|
|
|
const formInfoList = await formInfoListPromise;
|
|
|
if (formInfoList.length === 0) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: No forms found');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService updateAllForms: No forms found');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -3162,7 +3287,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
};
|
|
|
|
|
|
if (!formData) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService getWidgetFormData: No current song, returning default data.');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService getWidgetFormData: No current song, returning default data.');
|
|
|
const defaultData: widgeData = {
|
|
|
id: '',
|
|
|
name: '未知歌曲',
|
|
|
@@ -3355,12 +3480,12 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
}
|
|
|
|
|
|
if (!context) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService saveWidgetDataToDatabase: No context available');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService saveWidgetDataToDatabase: No context available');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (!formData || !formData.id) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService saveWidgetDataToDatabase: No valid current song');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService saveWidgetDataToDatabase: No valid current song');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -3513,7 +3638,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
public async initializeWidgetDisplay(): Promise<void> {
|
|
|
try {
|
|
|
this.updateAllForms();
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Widget display initialized');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Widget display initialized');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`Heanup UnifiedPlayerService: Failed to initialize widget display: ${error}`);
|
|
|
}
|
|
|
@@ -3606,14 +3731,14 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
private doUpdateSessionPlayState(): void {
|
|
|
try {
|
|
|
if (!this.avSessionController) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession controller not initialized');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession controller not initialized');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 避免过于频繁的更新(最小间隔1000ms,增加防抖时间)
|
|
|
const now = Date.now();
|
|
|
if (now - this.lastAvSessionUpdate < 1000) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Skipping AVSession update due to rate limit');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Skipping AVSession update due to rate limit');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -3623,7 +3748,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 添加数据一致性检查
|
|
|
if (!currentSong) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: No current song available for AVSession update');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No current song available for AVSession update');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -3723,7 +3848,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
private async doUpdateAvSessionMetadata(song: VideoItem): Promise<void> {
|
|
|
try {
|
|
|
if (!this.avSessionController) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession controller not initialized');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: AVSession controller not initialized');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -3736,7 +3861,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
song = currentSong;
|
|
|
LogUtils.getInstance().LOGI(`UnifiedPlayerService: Using latest song data: ${song.name}`);
|
|
|
} else {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: No current song available, skipping metadata update');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No current song available, skipping metadata update');
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
@@ -3744,7 +3869,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 减少防抖时间,提高响应速度
|
|
|
const now = Date.now();
|
|
|
if (now - this.lastAvMetadataUpdate < 300) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Skipping AVSession metadata update due to rate limit');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: Skipping AVSession metadata update due to rate limit');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -3993,7 +4118,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
private async cleanupInvalidFormIds(): Promise<void> {
|
|
|
try {
|
|
|
if (!this.context) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: No context for cleanup invalid form IDs');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No context for cleanup invalid form IDs');
|
|
|
return;
|
|
|
}
|
|
|
// 根据存储配置读取所有Form信息
|
|
|
@@ -4012,7 +4137,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
}
|
|
|
|
|
|
if (formInfoList.length === 0) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService cleanupInvalidFormIds: No forms found');
|
|
|
+ LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService cleanupInvalidFormIds: No forms found');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -4057,7 +4182,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// const formIds = await preferencesUtil.getFormIds(prefs);
|
|
|
//
|
|
|
// if (formIds.length === 0) {
|
|
|
- // LogUtils.getInstance().LOGI('UnifiedPlayerService: No form IDs to cleanup');
|
|
|
+ // LogUtils.getInstance().LOGI('Heanup UnifiedPlayerService: No form IDs to cleanup');
|
|
|
// return;
|
|
|
// }
|
|
|
//
|