NavidromeRandomLoader.ets 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /**
  2. * NavidromeRandomLoader.ets
  3. * 用于渐进式随机播放时加载更多页数据的工具
  4. */
  5. import { VideoItem } from '../../viewmodel/VideoItem';
  6. import { appendToNavidromePlaylist } from './NavidromePlaylistStore';
  7. import Logger from './Logger';
  8. const TAG = 'NavidromeRandomLoader';
  9. // 加载状态
  10. let isLoadingMore: boolean = false;
  11. // 加载回调函数类型定义
  12. type LoadMoreCallback = () => Promise<VideoItem[]>;
  13. // 加载更多页的回调(由RemoteMusicPage注册)
  14. let loadMoreCallback: LoadMoreCallback | null = null;
  15. // 检查是否还有更多数据可加载
  16. let hasMoreDataCallback: (() => boolean) | null = null;
  17. /**
  18. * 注册加载更多页的回调函数(由RemoteMusicPage在aboutToAppear中调用)
  19. * @param callback 加载一页数据并返回新增歌曲的函数
  20. * @param hasMoreChecker 检查是否还有更多数据的函数
  21. */
  22. export function registerLoadMoreCallback(
  23. callback: LoadMoreCallback,
  24. hasMoreChecker: () => boolean
  25. ): void {
  26. loadMoreCallback = callback;
  27. hasMoreDataCallback = hasMoreChecker;
  28. Logger.info(TAG, '加载回调已注册');
  29. }
  30. /**
  31. * 注销加载回调(由RemoteMusicPage在aboutToDisappear中调用)
  32. */
  33. export function unregisterLoadMoreCallback(): void {
  34. loadMoreCallback = null;
  35. hasMoreDataCallback = null;
  36. Logger.info(TAG, '加载回调已注销');
  37. }
  38. /**
  39. * 检查是否正在加载
  40. */
  41. export function isLoading(): boolean {
  42. return isLoadingMore;
  43. }
  44. /**
  45. * 检查是否还有更多数据可加载
  46. */
  47. export function hasMoreData(): boolean {
  48. return hasMoreDataCallback ? hasMoreDataCallback() : false;
  49. }
  50. /**
  51. * 触发加载更多页数据(由LocalMusic.randomPlay调用)
  52. * @param pageCount 要加载的页数,默认3页
  53. * @returns 是否成功加载(false表示正在加载中或无回调或无更多数据)
  54. */
  55. export async function triggerLoadMoreSongs(pageCount: number = 3): Promise<boolean> {
  56. if (isLoadingMore) {
  57. Logger.warn(TAG, '正在加载中,跳过本次请求');
  58. return false;
  59. }
  60. if (!loadMoreCallback) {
  61. Logger.warn(TAG, '加载回调未注册,无法加载更多');
  62. return false;
  63. }
  64. if (hasMoreDataCallback && !hasMoreDataCallback()) {
  65. Logger.info(TAG, '没有更多数据可加载');
  66. return false;
  67. }
  68. isLoadingMore = true;
  69. Logger.info(TAG, `开始加载${pageCount}页数据`);
  70. try {
  71. let totalLoaded = 0;
  72. for (let i = 0; i < pageCount; i++) {
  73. // 检查是否还有更多数据
  74. if (hasMoreDataCallback && !hasMoreDataCallback()) {
  75. Logger.info(TAG, `第${i + 1}页: 没有更多数据,停止加载`);
  76. break;
  77. }
  78. // 加载一页数据
  79. const newItems = await loadMoreCallback();
  80. if (newItems.length === 0) {
  81. Logger.info(TAG, `第${i + 1}页: 返回空数据,停止加载`);
  82. break;
  83. }
  84. // 追加到播放列表
  85. appendToNavidromePlaylist(newItems);
  86. totalLoaded += newItems.length;
  87. Logger.info(TAG, `第${i + 1}页: 加载${newItems.length}首,累计${totalLoaded}首`);
  88. }
  89. Logger.info(TAG, `加载完成,共加载${totalLoaded}首新歌曲`);
  90. return totalLoaded > 0;
  91. } catch (error) {
  92. Logger.error(TAG, `加载失败: ${(error as Error).message}`);
  93. return false;
  94. } finally {
  95. isLoadingMore = false;
  96. }
  97. }