|
|
@@ -230,6 +230,16 @@ export interface IPlayerService {
|
|
|
* 释放资源
|
|
|
*/
|
|
|
release(): void;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新收藏列表
|
|
|
+ */
|
|
|
+ updateFavoriteList(): Promise<void>;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 强制刷新收藏状态(用于收藏/取消收藏操作后)
|
|
|
+ */
|
|
|
+ refreshFavoriteStatus(): Promise<void>;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -260,7 +270,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
private avMetadataUpdateTimer: number = -1; // 新增:元数据更新防抖定时器
|
|
|
private lastUpdateTime: number=0;
|
|
|
private favList: VideoItem[]=[];
|
|
|
- table: undefined;
|
|
|
+ private table: MediaTable | undefined = undefined;
|
|
|
private lastAutoPlayTime: number = 0; // 新增:上次自动播放时间,用于防抖
|
|
|
private autoPlayDebounceMs: number = 1000; // 自动播放防抖间隔(毫秒)
|
|
|
|
|
|
@@ -378,8 +388,13 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
this.initializeAvSession();
|
|
|
|
|
|
- // 完整的数据恢复(从持久化存储)
|
|
|
- await this.restorePersistedState();
|
|
|
+ // 并行初始化收藏列表和恢复数据,提高效率
|
|
|
+ const initPromises2 = [
|
|
|
+ this.restorePersistedState(),
|
|
|
+ this.initializeFavoriteList()
|
|
|
+ ];
|
|
|
+
|
|
|
+ await Promise.all(initPromises2);
|
|
|
|
|
|
console.log("Heanup2 UnifiedPlayerService: 异步组件初始化完成");
|
|
|
LogUtils.getInstance().LOGI('UnifiedPlayerService: Heavy components initialized');
|
|
|
@@ -840,16 +855,119 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
return this.playlistModel.getCurrentSong();
|
|
|
}
|
|
|
getFav(): Array<VideoItem>{
|
|
|
+ if (this.favList.length>0){
|
|
|
+ console.log("Heanup UnifiedPlayerService favList cached:"+json.stringify( this.favList));
|
|
|
+ return this.favList;
|
|
|
+ }
|
|
|
+ // 如果缓存为空,异步更新但返回空数组,避免阻塞
|
|
|
this.getTable().queryByisFav(1, async (result: VideoItem[]) => {
|
|
|
- this.favList = result
|
|
|
+ console.log("Heanup UnifiedPlayerService favList:"+json.stringify( result));
|
|
|
+ this.favList = result;
|
|
|
+ // 更新收藏列表后,重新更新AVSession状态以反映正确的收藏状态
|
|
|
+ if (result.length > 0) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.updateSessionPlayState();
|
|
|
+ }, 100);
|
|
|
+ }
|
|
|
})
|
|
|
return this.favList;
|
|
|
}
|
|
|
- private getTable():MediaTable{
|
|
|
- if (this.table!=undefined) {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前歌曲的收藏状态
|
|
|
+ */
|
|
|
+ private getCurrentSongFavoriteState(): boolean {
|
|
|
+ try {
|
|
|
+ let currentSong = this.playlistModel.getCurrentSong();
|
|
|
+ if (!currentSong) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: 当前歌曲为空`);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ let favList = this.getFav();
|
|
|
+ if (!favList || favList.length === 0) {
|
|
|
+ // 如果收藏列表为空,可能还在加载中,先返回false
|
|
|
+ // 但不记录为错误,因为这是正常的初始化状态
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查当前歌曲是否在收藏列表中
|
|
|
+ for (let i = 0; i < favList.length; i++) {
|
|
|
+ if (favList[i].filePath === currentSong.filePath && favList[i].isFav === 1) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: 收藏歌曲:${currentSong.filePath}`);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: 未收藏歌曲:${currentSong.filePath}`);
|
|
|
+ return false;
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to get favorite state: ${error}`);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化收藏列表
|
|
|
+ */
|
|
|
+ private async initializeFavoriteList(): Promise<void> {
|
|
|
+ try {
|
|
|
+ return new Promise<void>((resolve) => {
|
|
|
+ this.getTable().queryByisFav(1, (result: VideoItem[]) => {
|
|
|
+ this.favList = result;
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Favorite list initialized with ${this.favList.length} items`);
|
|
|
+ resolve();
|
|
|
+ });
|
|
|
+ });
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to initialize favorite list: ${error}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新收藏列表
|
|
|
+ */
|
|
|
+ public async updateFavoriteList(): Promise<void> {
|
|
|
+ try {
|
|
|
+ return new Promise<void>((resolve) => {
|
|
|
+ this.getTable().queryByisFav(1, (result: VideoItem[]) => {
|
|
|
+ this.favList = result;
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Favorite list updated with ${this.favList.length} items`);
|
|
|
+
|
|
|
+ // 更新收藏列表后,立即更新AVSession状态以反映正确的收藏状态
|
|
|
+ setTimeout(() => {
|
|
|
+ this.updateSessionPlayState();
|
|
|
+ }, 100);
|
|
|
+
|
|
|
+ resolve();
|
|
|
+ });
|
|
|
+ });
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to update favorite list: ${error}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 强制刷新收藏状态(用于收藏/取消收藏操作后)
|
|
|
+ */
|
|
|
+ public async refreshFavoriteStatus(): Promise<void> {
|
|
|
+ try {
|
|
|
+ // 清空缓存,强制重新加载
|
|
|
+ this.favList = [];
|
|
|
+ await this.updateFavoriteList();
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Favorite status refreshed');
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to refresh favorite status: ${error}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private getTable(): MediaTable {
|
|
|
+ if (this.table) {
|
|
|
+ return this.table;
|
|
|
+ }
|
|
|
+ if (this.context) {
|
|
|
+ this.table = new MediaTable(this.context);
|
|
|
return this.table;
|
|
|
}
|
|
|
- return new MediaTable(getContext(this))
|
|
|
+ return new MediaTable(getContext(this) as common.UIAbilityContext);
|
|
|
}
|
|
|
|
|
|
getPlaylist(): VideoItem[] {
|
|
|
@@ -2561,9 +2679,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 避免过于频繁的更新(最小间隔500ms)
|
|
|
+ // 避免过于频繁的更新(最小间隔1000ms,增加防抖时间)
|
|
|
const now = Date.now();
|
|
|
- if (now - this.lastAvSessionUpdate < 500) {
|
|
|
+ if (now - this.lastAvSessionUpdate < 1000) {
|
|
|
LogUtils.getInstance().LOGI('UnifiedPlayerService: Skipping AVSession update due to rate limit');
|
|
|
return;
|
|
|
}
|
|
|
@@ -2595,7 +2713,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
loopMode: this.convertPlayModeToLoopMode(currentState.playMode),
|
|
|
|
|
|
// 收藏状态
|
|
|
- isFavorite: false // 可以根据实际收藏状态设置
|
|
|
+ isFavorite: this.getCurrentSongFavoriteState()
|
|
|
};
|
|
|
|
|
|
// 只有当duration > 0时才设置位置信息,避免进度条显示问题
|
|
|
@@ -2614,7 +2732,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 记录上次更新时间
|
|
|
this.lastAvSessionUpdate = now;
|
|
|
|
|
|
- LogUtils.getInstance().LOGI(`UnifiedPlayerService: AVSession play state updated successfully`);
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: AVSession play state updated successfully`+JSON.stringify(playbackState));
|
|
|
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to update AVSession play state: ${error}`);
|