@quicktvui/ai 1.0.9 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/README.md +31 -0
  2. package/USAGE.md +22 -7
  3. package/package.json +1 -1
  4. package/rules/.clinerules +1 -0
  5. package/rules/.cursorrules +1 -0
  6. package/rules/.docs/zh-CN/guide/ai/ai-assistant.md +16 -6
  7. package/rules/.github/copilot-instructions.md +1 -0
  8. package/rules/.source/hellotv/PROJECT-README.md +52 -0
  9. package/rules/.source/hellotv/app.d.ts +11 -0
  10. package/rules/.source/hellotv/package.json +146 -0
  11. package/rules/.source/hellotv/scripts/build-apk.ts +12 -0
  12. package/rules/.source/hellotv/scripts/build.ts +35 -0
  13. package/rules/.source/hellotv/scripts/dev.ts +12 -0
  14. package/rules/.source/hellotv/scripts/pack.ts +24 -0
  15. package/rules/.source/hellotv/scripts/process.ts +37 -0
  16. package/rules/.source/hellotv/scripts/quicktvui-webpack.android.ts +187 -0
  17. package/rules/.source/hellotv/scripts/quicktvui-webpack.dev.ts +147 -0
  18. package/rules/.source/hellotv/scripts/webpack-watch.ts +24 -0
  19. package/rules/.source/hellotv/src/App.vue +192 -0
  20. package/rules/.source/hellotv/src/api/my/index.ts +198 -0
  21. package/rules/.source/hellotv/src/api/user/impl-user.ts +52 -0
  22. package/rules/.source/hellotv/src/api/user/qr-code-mock.ts +2 -0
  23. package/rules/.source/hellotv/src/api/user/request-url.ts +11 -0
  24. package/rules/.source/hellotv/src/api/user/user-manager.ts +258 -0
  25. package/rules/.source/hellotv/src/app.scss +8 -0
  26. package/rules/.source/hellotv/src/assets/component-media/ic_media_btn_pause.png +0 -0
  27. package/rules/.source/hellotv/src/assets/component-media/ic_media_btn_play.png +0 -0
  28. package/rules/.source/hellotv/src/assets/component-media/ic_media_menu_setting_focused.png +0 -0
  29. package/rules/.source/hellotv/src/assets/component-media/ic_media_menu_setting_normal.png +0 -0
  30. package/rules/.source/hellotv/src/assets/component-media/ic_media_menu_xuanji_focused.png +0 -0
  31. package/rules/.source/hellotv/src/assets/component-media/ic_media_menu_xuanji_normal.png +0 -0
  32. package/rules/.source/hellotv/src/assets/component-media/ic_media_ok_focused.png +0 -0
  33. package/rules/.source/hellotv/src/assets/component-media/ic_media_ok_selected.png +0 -0
  34. package/rules/.source/hellotv/src/assets/detail/ic_collect_focused.png +0 -0
  35. package/rules/.source/hellotv/src/assets/detail/ic_collect_normal.png +0 -0
  36. package/rules/.source/hellotv/src/assets/detail/ic_full_focused.png +0 -0
  37. package/rules/.source/hellotv/src/assets/detail/ic_full_normal.png +0 -0
  38. package/rules/.source/hellotv/src/assets/detail/ic_info_focused.png +0 -0
  39. package/rules/.source/hellotv/src/assets/detail/ic_info_normal.png +0 -0
  40. package/rules/.source/hellotv/src/assets/detail/ic_introduction_bg.png +0 -0
  41. package/rules/.source/hellotv/src/assets/detail/ic_media_list_item_normal.png +0 -0
  42. package/rules/.source/hellotv/src/assets/detail/ic_media_list_item_selected.png +0 -0
  43. package/rules/.source/hellotv/src/assets/detail/ic_media_player_pause.png +0 -0
  44. package/rules/.source/hellotv/src/assets/detail/ic_media_player_placeholder.png +0 -0
  45. package/rules/.source/hellotv/src/assets/detail/ic_media_player_play.png +0 -0
  46. package/rules/.source/hellotv/src/assets/detail/ic_vip_focused.png +0 -0
  47. package/rules/.source/hellotv/src/assets/detail/ic_vip_normal.png +0 -0
  48. package/rules/.source/hellotv/src/assets/detail/skeleton.png +0 -0
  49. package/rules/.source/hellotv/src/assets/filter/ic_empty.png +0 -0
  50. package/rules/.source/hellotv/src/assets/filter/ic_filter_focused.png +0 -0
  51. package/rules/.source/hellotv/src/assets/filter/ic_filter_normal.png +0 -0
  52. package/rules/.source/hellotv/src/assets/filter/ic_filter_selected.png +0 -0
  53. package/rules/.source/hellotv/src/assets/filter/ic_left_focused.png +0 -0
  54. package/rules/.source/hellotv/src/assets/filter/ic_left_normal.png +0 -0
  55. package/rules/.source/hellotv/src/assets/filter/ic_left_selected.png +0 -0
  56. package/rules/.source/hellotv/src/assets/history/ic_delete.png +0 -0
  57. package/rules/.source/hellotv/src/assets/history/ic_empty.png +0 -0
  58. package/rules/.source/hellotv/src/assets/home/bg_history_item.png +0 -0
  59. package/rules/.source/hellotv/src/assets/home/bg_shadow.png +0 -0
  60. package/rules/.source/hellotv/src/assets/home/ic_4k_logo.png +0 -0
  61. package/rules/.source/hellotv/src/assets/home/ic_4k_play_focused.png +0 -0
  62. package/rules/.source/hellotv/src/assets/home/ic_4k_subtitle_normal.png +0 -0
  63. package/rules/.source/hellotv/src/assets/home/ic_arrow_focused.png +0 -0
  64. package/rules/.source/hellotv/src/assets/home/ic_arrow_normal.png +0 -0
  65. package/rules/.source/hellotv/src/assets/home/ic_exit_corner.png +0 -0
  66. package/rules/.source/hellotv/src/assets/home/ic_exit_header.png +0 -0
  67. package/rules/.source/hellotv/src/assets/home/ic_play.png +0 -0
  68. package/rules/.source/hellotv/src/assets/live/bg-error.png +0 -0
  69. package/rules/.source/hellotv/src/assets/live/bg-play-info.png +0 -0
  70. package/rules/.source/hellotv/src/assets/live/ic-arrow-left.png +0 -0
  71. package/rules/.source/hellotv/src/assets/live/ic-arrow-right.png +0 -0
  72. package/rules/.source/hellotv/src/assets/live/ic-back.png +0 -0
  73. package/rules/.source/hellotv/src/assets/live/ic-change.png +0 -0
  74. package/rules/.source/hellotv/src/assets/live/ic-corner-vip-tips.png +0 -0
  75. package/rules/.source/hellotv/src/assets/live/ic-corner-vip.png +0 -0
  76. package/rules/.source/hellotv/src/assets/live/ic-key.png +0 -0
  77. package/rules/.source/hellotv/src/assets/live/ic-loading-error.png +0 -0
  78. package/rules/.source/hellotv/src/assets/live/ic-menu-ext-arrow.png +0 -0
  79. package/rules/.source/hellotv/src/assets/live/ic-menu-ext.png +0 -0
  80. package/rules/.source/hellotv/src/assets/live/ic-menu.png +0 -0
  81. package/rules/.source/hellotv/src/assets/live/ic-mine.png +0 -0
  82. package/rules/.source/hellotv/src/assets/live/ic-network-error.png +0 -0
  83. package/rules/.source/hellotv/src/assets/live/ic-ok.png +0 -0
  84. package/rules/.source/hellotv/src/assets/live/ic-playing.png +0 -0
  85. package/rules/.source/hellotv/src/assets/live/ic-playing2.png +0 -0
  86. package/rules/.source/hellotv/src/assets/live/ic-playing3.png +0 -0
  87. package/rules/.source/hellotv/src/assets/live/ic-service.png +0 -0
  88. package/rules/.source/hellotv/src/assets/live/ic_live_broadcast.png +0 -0
  89. package/rules/.source/hellotv/src/assets/live/ic_live_broadcast_focused.png +0 -0
  90. package/rules/.source/hellotv/src/assets/my/ic_collect_focus.png +0 -0
  91. package/rules/.source/hellotv/src/assets/my/ic_collect_normal.png +0 -0
  92. package/rules/.source/hellotv/src/assets/my/ic_order_focus.png +0 -0
  93. package/rules/.source/hellotv/src/assets/my/ic_order_normal.png +0 -0
  94. package/rules/.source/hellotv/src/assets/my/ic_record_focus.png +0 -0
  95. package/rules/.source/hellotv/src/assets/my/ic_record_normal.png +0 -0
  96. package/rules/.source/hellotv/src/assets/my/ic_user.png +0 -0
  97. package/rules/.source/hellotv/src/assets/my/ic_vip_normal.png +0 -0
  98. package/rules/.source/hellotv/src/assets/search/ic_back.png +0 -0
  99. package/rules/.source/hellotv/src/assets/search/ic_back_focused.png +0 -0
  100. package/rules/.source/hellotv/src/assets/search/ic_clear.png +0 -0
  101. package/rules/.source/hellotv/src/assets/search/ic_clear_dark.png +0 -0
  102. package/rules/.source/hellotv/src/assets/search/ic_clear_focused.png +0 -0
  103. package/rules/.source/hellotv/src/assets/search/ic_search.png +0 -0
  104. package/rules/.source/hellotv/src/assets/top-view/ic_logo.png +0 -0
  105. package/rules/.source/hellotv/src/assets/top-view/ic_top_search_focused.png +0 -0
  106. package/rules/.source/hellotv/src/assets/top-view/ic_top_search_normal.png +0 -0
  107. package/rules/.source/hellotv/src/assets/top-view/ic_top_user_focused.png +0 -0
  108. package/rules/.source/hellotv/src/assets/top-view/ic_top_user_normal.png +0 -0
  109. package/rules/.source/hellotv/src/components/bg-animation.scss +14 -0
  110. package/rules/.source/hellotv/src/components/bg-animation.vue +176 -0
  111. package/rules/.source/hellotv/src/components/btn-pack-view.vue +172 -0
  112. package/rules/.source/hellotv/src/components/btn-pack.scss +53 -0
  113. package/rules/.source/hellotv/src/components/grid-item-horizontal.vue +203 -0
  114. package/rules/.source/hellotv/src/components/grid-item-vertical.vue +201 -0
  115. package/rules/.source/hellotv/src/components/media/build-data/media-config.ts +4 -0
  116. package/rules/.source/hellotv/src/components/media/build-data/media-control-adapter.ts +378 -0
  117. package/rules/.source/hellotv/src/components/media/build-data/media-imp.ts +44 -0
  118. package/rules/.source/hellotv/src/components/media/view/media-loading-component.vue +50 -0
  119. package/rules/.source/hellotv/src/components/media/view/media-loading-view.vue +154 -0
  120. package/rules/.source/hellotv/src/components/media/view/media-manager-view.vue +931 -0
  121. package/rules/.source/hellotv/src/components/media/view/media-menu-detail-item.vue +42 -0
  122. package/rules/.source/hellotv/src/components/media/view/media-menu-detail-view.vue +109 -0
  123. package/rules/.source/hellotv/src/components/media/view/media-menu-icon-item.vue +43 -0
  124. package/rules/.source/hellotv/src/components/media/view/media-menu-text-item.vue +27 -0
  125. package/rules/.source/hellotv/src/components/media/view/media-menu-view.vue +88 -0
  126. package/rules/.source/hellotv/src/components/media/view/media-player-view.vue +408 -0
  127. package/rules/.source/hellotv/src/components/media/view/scss/media-loading.scss +51 -0
  128. package/rules/.source/hellotv/src/components/media/view/scss/media-manager.scss +79 -0
  129. package/rules/.source/hellotv/src/components/media/view/scss/media-menu.scss +114 -0
  130. package/rules/.source/hellotv/src/components/media/view/scss/media-player.scss +6 -0
  131. package/rules/.source/hellotv/src/components/qt-tabs-component.ts +268 -0
  132. package/rules/.source/hellotv/src/components/qt-ul-component.ts +792 -0
  133. package/rules/.source/hellotv/src/components/top-view.scss +38 -0
  134. package/rules/.source/hellotv/src/components/top-view.vue +114 -0
  135. package/rules/.source/hellotv/src/config/README.md +22 -0
  136. package/rules/.source/hellotv/src/config/build-config.ts +22 -0
  137. package/rules/.source/hellotv/src/config/private-theme-config.ts +21 -0
  138. package/rules/.source/hellotv/src/config/public-config.scss +16 -0
  139. package/rules/.source/hellotv/src/config/test.scss +45 -0
  140. package/rules/.source/hellotv/src/config/theme-config.ts +51 -0
  141. package/rules/.source/hellotv/src/main.ts +45 -0
  142. package/rules/.source/hellotv/src/pages/activity/adapter/config.ts +37 -0
  143. package/rules/.source/hellotv/src/pages/activity/adapter/index.ts +849 -0
  144. package/rules/.source/hellotv/src/pages/activity/adapter/interface.ts +173 -0
  145. package/rules/.source/hellotv/src/pages/activity/api/index.ts +36 -0
  146. package/rules/.source/hellotv/src/pages/activity/api/interface.ts +11 -0
  147. package/rules/.source/hellotv/src/pages/activity/api/request-url.ts +10 -0
  148. package/rules/.source/hellotv/src/pages/activity/components/item/focus-change-img-item.vue +40 -0
  149. package/rules/.source/hellotv/src/pages/activity/components/item/inner-out-title-item.vue +59 -0
  150. package/rules/.source/hellotv/src/pages/activity/components/item/no-title-item.vue +45 -0
  151. package/rules/.source/hellotv/src/pages/activity/components/item/placeholder-item.vue +25 -0
  152. package/rules/.source/hellotv/src/pages/activity/index.vue +219 -0
  153. package/rules/.source/hellotv/src/pages/activity/scss/index.scss +46 -0
  154. package/rules/.source/hellotv/src/pages/activity/scss/item.scss +69 -0
  155. package/rules/.source/hellotv/src/pages/detail/adapter/index.ts +317 -0
  156. package/rules/.source/hellotv/src/pages/detail/adapter/interface.ts +150 -0
  157. package/rules/.source/hellotv/src/pages/detail/adapter/media-player.ts +378 -0
  158. package/rules/.source/hellotv/src/pages/detail/api/index.ts +77 -0
  159. package/rules/.source/hellotv/src/pages/detail/api/request-url.ts +8 -0
  160. package/rules/.source/hellotv/src/pages/detail/components/media-player/collapse/media-collapse-definition.vue +192 -0
  161. package/rules/.source/hellotv/src/pages/detail/components/media-player/collapse/media-collapse-list-item.vue +108 -0
  162. package/rules/.source/hellotv/src/pages/detail/components/media-player/collapse/media-collapse-media-series.vue +349 -0
  163. package/rules/.source/hellotv/src/pages/detail/components/media-player/collapse/media-collapse-order.vue +194 -0
  164. package/rules/.source/hellotv/src/pages/detail/components/media-player/collapse/media-collapse-speed.vue +192 -0
  165. package/rules/.source/hellotv/src/pages/detail/components/media-player/index.vue +404 -0
  166. package/rules/.source/hellotv/src/pages/detail/components/media-player/media-player-small-view.vue +382 -0
  167. package/rules/.source/hellotv/src/pages/detail/components/media-player/media-player-view.vue +1099 -0
  168. package/rules/.source/hellotv/src/pages/detail/components/recommend-item.vue +167 -0
  169. package/rules/.source/hellotv/src/pages/detail/components/section/basic-section.vue +218 -0
  170. package/rules/.source/hellotv/src/pages/detail/components/section/config.ts +6 -0
  171. package/rules/.source/hellotv/src/pages/detail/components/section/header-section.vue +15 -0
  172. package/rules/.source/hellotv/src/pages/detail/components/section/item/button-menu.vue +259 -0
  173. package/rules/.source/hellotv/src/pages/detail/components/section/item/media-introduction.vue +238 -0
  174. package/rules/.source/hellotv/src/pages/detail/components/section/item/media-series.vue +308 -0
  175. package/rules/.source/hellotv/src/pages/detail/components/section/item/player-placeholder.vue +88 -0
  176. package/rules/.source/hellotv/src/pages/detail/index.vue +571 -0
  177. package/rules/.source/hellotv/src/pages/detail/scss/index.scss +22 -0
  178. package/rules/.source/hellotv/src/pages/detail-full-player/components/media-player/full-player-loading.vue +78 -0
  179. package/rules/.source/hellotv/src/pages/detail-full-player/components/media-player/full-player-menu-view.vue +803 -0
  180. package/rules/.source/hellotv/src/pages/detail-full-player/components/media-player/full-player-view.vue +219 -0
  181. package/rules/.source/hellotv/src/pages/detail-full-player/index.vue +101 -0
  182. package/rules/.source/hellotv/src/pages/detail-full-player/scss/full-player-view.scss +6 -0
  183. package/rules/.source/hellotv/src/pages/detail-full-screen/adapter/index.ts +0 -0
  184. package/rules/.source/hellotv/src/pages/detail-full-screen/adapter/interface.ts +133 -0
  185. package/rules/.source/hellotv/src/pages/detail-full-screen/api/index.ts +77 -0
  186. package/rules/.source/hellotv/src/pages/detail-full-screen/api/request-url.ts +8 -0
  187. package/rules/.source/hellotv/src/pages/detail-full-screen/components/media-info.vue +263 -0
  188. package/rules/.source/hellotv/src/pages/detail-full-screen/components/media-player.vue +42 -0
  189. package/rules/.source/hellotv/src/pages/detail-full-screen/components/media-series-section.vue +26 -0
  190. package/rules/.source/hellotv/src/pages/detail-full-screen/components/recommend-item.vue +167 -0
  191. package/rules/.source/hellotv/src/pages/detail-full-screen/index.vue +163 -0
  192. package/rules/.source/hellotv/src/pages/detail-full-screen/scss/index.scss +41 -0
  193. package/rules/.source/hellotv/src/pages/device-info/index.vue +106 -0
  194. package/rules/.source/hellotv/src/pages/device-info/scss/device-info.scss +49 -0
  195. package/rules/.source/hellotv/src/pages/filter/README.md +66 -0
  196. package/rules/.source/hellotv/src/pages/filter/adapter/index.ts +180 -0
  197. package/rules/.source/hellotv/src/pages/filter/adapter/interface.ts +111 -0
  198. package/rules/.source/hellotv/src/pages/filter/api/index.ts +38 -0
  199. package/rules/.source/hellotv/src/pages/filter/api/interface.ts +44 -0
  200. package/rules/.source/hellotv/src/pages/filter/api/request-url.ts +8 -0
  201. package/rules/.source/hellotv/src/pages/filter/components/content/index.vue +469 -0
  202. package/rules/.source/hellotv/src/pages/filter/components/content/list-item-record.vue +16 -0
  203. package/rules/.source/hellotv/src/pages/filter/components/content/list-item.vue +78 -0
  204. package/rules/.source/hellotv/src/pages/filter/components/expand/index.vue +83 -0
  205. package/rules/.source/hellotv/src/pages/filter/components/sidebar/index.vue +81 -0
  206. package/rules/.source/hellotv/src/pages/filter/components/sidebar/list-item-filter-title.vue +78 -0
  207. package/rules/.source/hellotv/src/pages/filter/components/sidebar/list-item-filter.vue +68 -0
  208. package/rules/.source/hellotv/src/pages/filter/components/sidebar/list-item-line.vue +11 -0
  209. package/rules/.source/hellotv/src/pages/filter/components/sidebar/list-item-text.vue +43 -0
  210. package/rules/.source/hellotv/src/pages/filter/components/sidebar/list-item-title.vue +14 -0
  211. package/rules/.source/hellotv/src/pages/filter/config.ts +10 -0
  212. package/rules/.source/hellotv/src/pages/filter/expand-sidebar-contents.vue +203 -0
  213. package/rules/.source/hellotv/src/pages/filter/scss/filter-content-list-item.scss +42 -0
  214. package/rules/.source/hellotv/src/pages/filter/scss/filter-content.scss +60 -0
  215. package/rules/.source/hellotv/src/pages/filter/scss/filter-expand.scss +30 -0
  216. package/rules/.source/hellotv/src/pages/filter/scss/filter-sidebar.scss +45 -0
  217. package/rules/.source/hellotv/src/pages/filter/scss/filter.scss +21 -0
  218. package/rules/.source/hellotv/src/pages/filter/sidebar-contents.vue +145 -0
  219. package/rules/.source/hellotv/src/pages/filter/single-contents.vue +61 -0
  220. package/rules/.source/hellotv/src/pages/history/adapter/index.ts +51 -0
  221. package/rules/.source/hellotv/src/pages/history/adapter/interface.ts +22 -0
  222. package/rules/.source/hellotv/src/pages/history/api/index.ts +54 -0
  223. package/rules/.source/hellotv/src/pages/history/api/interface.ts +41 -0
  224. package/rules/.source/hellotv/src/pages/history/api/request-url.ts +10 -0
  225. package/rules/.source/hellotv/src/pages/history/components/confirm-dialog.vue +155 -0
  226. package/rules/.source/hellotv/src/pages/history/config.ts +8 -0
  227. package/rules/.source/hellotv/src/pages/history/index-raw.vue +540 -0
  228. package/rules/.source/hellotv/src/pages/history/index.vue +431 -0
  229. package/rules/.source/hellotv/src/pages/history/mock.ts +32 -0
  230. package/rules/.source/hellotv/src/pages/history/scss/history-raw.scss +181 -0
  231. package/rules/.source/hellotv/src/pages/history/scss/history.scss +148 -0
  232. package/rules/.source/hellotv/src/pages/home/adapter/exit/home-exit-adapter.ts +20 -0
  233. package/rules/.source/hellotv/src/pages/home/adapter/exit/home-exit-imp.ts +13 -0
  234. package/rules/.source/hellotv/src/pages/home/adapter/media/create-home-player-interceptor.ts +50 -0
  235. package/rules/.source/hellotv/src/pages/home/adapter/media/home-media-imp.ts +74 -0
  236. package/rules/.source/hellotv/src/pages/home/adapter/tab-bar/tab-bar-adapter.ts +151 -0
  237. package/rules/.source/hellotv/src/pages/home/adapter/tab-bar/tab-bar-config.ts +17 -0
  238. package/rules/.source/hellotv/src/pages/home/adapter/tab-bar/tab-bar-imp.ts +53 -0
  239. package/rules/.source/hellotv/src/pages/home/adapter/tab-bar/tab-bar-item-type.ts +6 -0
  240. package/rules/.source/hellotv/src/pages/home/adapter/tab-content/tab-content-adapter.ts +1304 -0
  241. package/rules/.source/hellotv/src/pages/home/adapter/tab-content/tab-content-config.ts +30 -0
  242. package/rules/.source/hellotv/src/pages/home/adapter/tab-content/tab-content-imp.ts +173 -0
  243. package/rules/.source/hellotv/src/pages/home/adapter/tab-content/tab-content-item-type.ts +17 -0
  244. package/rules/.source/hellotv/src/pages/home/api/index.ts +157 -0
  245. package/rules/.source/hellotv/src/pages/home/api/interface.ts +56 -0
  246. package/rules/.source/hellotv/src/pages/home/api/request-url.ts +22 -0
  247. package/rules/.source/hellotv/src/pages/home/components/exit-dialog.vue +148 -0
  248. package/rules/.source/hellotv/src/pages/home/components/media/bg-player.vue +440 -0
  249. package/rules/.source/hellotv/src/pages/home/components/nav-bar/bar-img-item.vue +39 -0
  250. package/rules/.source/hellotv/src/pages/home/components/nav-bar/bar-text-item.vue +100 -0
  251. package/rules/.source/hellotv/src/pages/home/components/tab-content/bg-player-cell-list-item-img.vue +54 -0
  252. package/rules/.source/hellotv/src/pages/home/components/tab-content/bg-player-cell-list-item-text.vue +67 -0
  253. package/rules/.source/hellotv/src/pages/home/components/tab-content/cell-list-player-item.vue +74 -0
  254. package/rules/.source/hellotv/src/pages/home/components/tab-content/cell-player-item.vue +40 -0
  255. package/rules/.source/hellotv/src/pages/home/components/tab-content/focus-change-img-item.vue +41 -0
  256. package/rules/.source/hellotv/src/pages/home/components/tab-content/history-item.vue +362 -0
  257. package/rules/.source/hellotv/src/pages/home/components/tab-content/inner-out-title-item.vue +60 -0
  258. package/rules/.source/hellotv/src/pages/home/components/tab-content/no-title-item.vue +46 -0
  259. package/rules/.source/hellotv/src/pages/home/components/tab-content/placeholder-item.vue +25 -0
  260. package/rules/.source/hellotv/src/pages/home/components/tab-content/short-video/short-video-section-item.vue +80 -0
  261. package/rules/.source/hellotv/src/pages/home/components/tab-content/short-video/short-video-section.vue +70 -0
  262. package/rules/.source/hellotv/src/pages/home/components/tab-content/small-4k/small-four-section.vue +76 -0
  263. package/rules/.source/hellotv/src/pages/home/components/tab-content/world-4k/world-four-section-item.vue +90 -0
  264. package/rules/.source/hellotv/src/pages/home/components/tab-content/world-4k/world-four-section.vue +57 -0
  265. package/rules/.source/hellotv/src/pages/home/components/waterfall-tabs.vue +1307 -0
  266. package/rules/.source/hellotv/src/pages/home/index.vue +117 -0
  267. package/rules/.source/hellotv/src/pages/home/scss/bar-img-item.scss +11 -0
  268. package/rules/.source/hellotv/src/pages/home/scss/bar-text-item.scss +80 -0
  269. package/rules/.source/hellotv/src/pages/home/scss/base.scss +8 -0
  270. package/rules/.source/hellotv/src/pages/home/scss/bg-player-cell-list-item.scss +24 -0
  271. package/rules/.source/hellotv/src/pages/home/scss/bg-player.scss +50 -0
  272. package/rules/.source/hellotv/src/pages/home/scss/cell-player-item.scss +24 -0
  273. package/rules/.source/hellotv/src/pages/home/scss/exit-dialog.scss +89 -0
  274. package/rules/.source/hellotv/src/pages/home/scss/focus-change-img-item.scss +12 -0
  275. package/rules/.source/hellotv/src/pages/home/scss/home.scss +32 -0
  276. package/rules/.source/hellotv/src/pages/home/scss/inner-out-title-item.scss +24 -0
  277. package/rules/.source/hellotv/src/pages/home/scss/no-title-item.scss +15 -0
  278. package/rules/.source/hellotv/src/pages/home/scss/placeholder-item.scss +14 -0
  279. package/rules/.source/hellotv/src/pages/home/scss/short-video-section.scss +59 -0
  280. package/rules/.source/hellotv/src/pages/home/scss/small-four-section.scss +14 -0
  281. package/rules/.source/hellotv/src/pages/home/scss/waterfall-tabs.scss +50 -0
  282. package/rules/.source/hellotv/src/pages/home/scss/world-four-section.scss +106 -0
  283. package/rules/.source/hellotv/src/pages/introduction/index.vue +227 -0
  284. package/rules/.source/hellotv/src/pages/live/components/menu/first-list-item-icon-text.vue +35 -0
  285. package/rules/.source/hellotv/src/pages/live/components/menu/first-list-item-img.vue +16 -0
  286. package/rules/.source/hellotv/src/pages/live/components/menu/first-list-item-text.vue +16 -0
  287. package/rules/.source/hellotv/src/pages/live/components/menu/index.vue +266 -0
  288. package/rules/.source/hellotv/src/pages/live/components/menu/second-list-item.vue +80 -0
  289. package/rules/.source/hellotv/src/pages/live/components/menu/third-list-item.vue +68 -0
  290. package/rules/.source/hellotv/src/pages/live/components/player/index.vue +168 -0
  291. package/rules/.source/hellotv/src/pages/live/components/player/player-error.vue +48 -0
  292. package/rules/.source/hellotv/src/pages/live/components/player/player-loading.vue +50 -0
  293. package/rules/.source/hellotv/src/pages/live/components/player/player-tips.vue +125 -0
  294. package/rules/.source/hellotv/src/pages/live/components/player/tips-icon-text.vue +27 -0
  295. package/rules/.source/hellotv/src/pages/live/css/menu.css +109 -0
  296. package/rules/.source/hellotv/src/pages/live/css/player.css +56 -0
  297. package/rules/.source/hellotv/src/pages/live/index.vue +128 -0
  298. package/rules/.source/hellotv/src/pages/live/mock/index.ts +263 -0
  299. package/rules/.source/hellotv/src/pages/live/types/index.ts +42 -0
  300. package/rules/.source/hellotv/src/pages/login/index.vue +116 -0
  301. package/rules/.source/hellotv/src/pages/login/scss/login.scss +61 -0
  302. package/rules/.source/hellotv/src/pages/m-test.vue +84 -0
  303. package/rules/.source/hellotv/src/pages/my/README.md +87 -0
  304. package/rules/.source/hellotv/src/pages/my/index.vue +177 -0
  305. package/rules/.source/hellotv/src/pages/my/my-data-manager.ts +606 -0
  306. package/rules/.source/hellotv/src/pages/my/my-templates.vue +24 -0
  307. package/rules/.source/hellotv/src/pages/my/poster/index.vue +98 -0
  308. package/rules/.source/hellotv/src/pages/my/poster/my-card2.vue +90 -0
  309. package/rules/.source/hellotv/src/pages/my/poster/my-icon-title-col.vue +72 -0
  310. package/rules/.source/hellotv/src/pages/my/poster/my-icon-title-row.vue +72 -0
  311. package/rules/.source/hellotv/src/pages/my/poster/my-info.vue +50 -0
  312. package/rules/.source/hellotv/src/pages/my/poster/my-user.vue +126 -0
  313. package/rules/.source/hellotv/src/pages/play-test.vue +95 -0
  314. package/rules/.source/hellotv/src/pages/search/README.md +57 -0
  315. package/rules/.source/hellotv/src/pages/search/adapter/index.ts +285 -0
  316. package/rules/.source/hellotv/src/pages/search/adapter/interface.ts +60 -0
  317. package/rules/.source/hellotv/src/pages/search/api/index.ts +100 -0
  318. package/rules/.source/hellotv/src/pages/search/api/interface.ts +64 -0
  319. package/rules/.source/hellotv/src/pages/search/api/request-url.ts +20 -0
  320. package/rules/.source/hellotv/src/pages/search/components/search-content-tabs.vue +153 -0
  321. package/rules/.source/hellotv/src/pages/search/components/search-content.vue +282 -0
  322. package/rules/.source/hellotv/src/pages/search/components/search-keyboard.vue +252 -0
  323. package/rules/.source/hellotv/src/pages/search/components/search-keyword-grid.vue +85 -0
  324. package/rules/.source/hellotv/src/pages/search/components/search-keyword.vue +346 -0
  325. package/rules/.source/hellotv/src/pages/search/config.ts +10 -0
  326. package/rules/.source/hellotv/src/pages/search/scss/search-content.scss +130 -0
  327. package/rules/.source/hellotv/src/pages/search/scss/search-keyboard.scss +91 -0
  328. package/rules/.source/hellotv/src/pages/search/scss/search-keyword-grid.scss +30 -0
  329. package/rules/.source/hellotv/src/pages/search/scss/search-keyword.scss +104 -0
  330. package/rules/.source/hellotv/src/pages/search/scss/search.scss +18 -0
  331. package/rules/.source/hellotv/src/pages/search/three-columns.vue +164 -0
  332. package/rules/.source/hellotv/src/pages/search/two-columns.vue +128 -0
  333. package/rules/.source/hellotv/src/pages/tabs-test.vue +339 -0
  334. package/rules/.source/hellotv/src/pages/webview/load-web-view.vue +44 -0
  335. package/rules/.source/hellotv/src/routes.ts +142 -0
  336. package/rules/.source/hellotv/src/tools/common.ts +18 -0
  337. package/rules/.source/hellotv/src/tools/format-date.ts +16 -0
  338. package/rules/.source/hellotv/src/tools/index.ts +58 -0
  339. package/rules/.source/hellotv/src/tools/launch.ts +339 -0
  340. package/rules/.source/hellotv/src/tools/request/index.ts +206 -0
  341. package/rules/.source/hellotv/src/tools/request/interface.ts +64 -0
  342. package/rules/.source/hellotv/src/typings/shims-vue.d.ts +6 -0
  343. package/rules/.source/hellotv/src/vue.config.js +3 -0
  344. package/rules/.source/hellotv/tsconfig.json +34 -0
  345. package/rules/.windsurfrules +1 -0
  346. package/rules/AGENTS.md +1 -0
  347. package/rules/CLAUDE.md +1 -0
  348. package/rules/GEMINI.md +1 -0
@@ -0,0 +1,1307 @@
1
+ <template>
2
+ <div
3
+ class="waterfall-tabs-root-css"
4
+ :clipChildren="false"
5
+ :clipPadding="false"
6
+ >
7
+ <!-- 背景图-->
8
+ <bg-animation
9
+ ref="waterfallBgRef"
10
+ style="position: absolute"
11
+ :focusable="false"
12
+ />
13
+ <!-- 4k图标-->
14
+ <bg-animation
15
+ ref="waterfallLogo4kRef"
16
+ class="waterfall-tabs-4k-logo"
17
+ :bgStyle="{ width: '240px', height: '84px' }"
18
+ :focusable="false"
19
+ :transitionTime="200"
20
+ />
21
+ <!-- 背景播放及小窗播放组件 -->
22
+ <bg-player
23
+ class="waterfall-tabs-bg-player"
24
+ ref="waterfallBgPlayerRef"
25
+ :clipChildren="false"
26
+ sid="waterfallBgPlayerSid"
27
+ @setCellListIndex="setCellListIndex"
28
+ />
29
+ <!--顶部按钮组-->
30
+ <div
31
+ ref="waterfallTopRef"
32
+ name="waterfallTopView"
33
+ sid="waterfallTopSid"
34
+ class="waterfall-top-view"
35
+ :clipChildren="false"
36
+ :blockFocusDirections="['left', 'right', 'up']"
37
+ >
38
+ <slot name="topView" />
39
+ </div>
40
+ <qt-tabs
41
+ ref="tabRef"
42
+ sid="homeTabsSid"
43
+ tabNavBarSid="tabNavBarSid"
44
+ nextFocusUpSID="topMyBtnSid"
45
+ class="waterfall-qt-tabs-css"
46
+ tabNavBarClass="waterfall-tab-bar-css"
47
+ tabPageClass="waterfall-content-css"
48
+ :tabContentBlockFocusDirections="['left', 'right', 'down', 'top']"
49
+ :autoHandleBackKey="true"
50
+ :useDiff="false"
51
+ :horizontalFadingEdgeEnabled="true"
52
+ :customPool="{ name: 'home' }"
53
+ :customItemPool="{ name: 'homeItems' }"
54
+ :fadingEdgeLength="400"
55
+ :outOfDateTime="5 * 60 * 1000"
56
+ :tabContentSwitchDelay="100"
57
+ :tabContentResumeDelay="300"
58
+ :resumePlayerTaskDelay="1000"
59
+ :triggerTask="tabsTriggerTask"
60
+ :qtTabSectionEnable="qtTabSectionEnable"
61
+ @onTabClick="onTabClick"
62
+ @onTabEvent="onTabEvent"
63
+ @onTabPageChanged="onTabPageChanged"
64
+ @onTabMoveToTopStart="onTabMoveToTopStart"
65
+ @onTabMoveToBottomEnd="onTabMoveToBottomEnd"
66
+ @onTabPageItemClick="onTabPageItemClick"
67
+ @onTabPageItemFocused="onTabPageItemFocused"
68
+ @onTabPageLoadData="onTabPageLoadData"
69
+ >
70
+ <!-- @onTabPageSectionAttached='onTabPageSectionAttached'-->
71
+ <template v-slot:tab-item>
72
+ <!--文字Tab导航-->
73
+ <bar-text-item :type="TabBarItemType.BAR_TEXT_TYPE" />
74
+ <!--图片Tab导航-->
75
+ <bar-img-item :type="TabBarItemType.BAR_IMG_TYPE" />
76
+ <!--文字 带角标Tab导航-->
77
+ <bar-text-item
78
+ :type="TabBarItemType.BAR_CORNER_TYPE"
79
+ :showCorner="true"
80
+ cornerRight
81
+ />
82
+ </template>
83
+ <template v-slot:waterfall-shared-item>
84
+ <!-- 带边框无标题格子-->
85
+ <no-title-item :type="TabContentType.TYPE_ITEM_SECTION_NO_TITLE" />
86
+ <!-- 带标题格子(图片上/图片下)-->
87
+ <inner-out-title-item
88
+ :type="TabContentType.TYPE_ITEM_SECTION_HAS_TITLE"
89
+ />
90
+ <!-- 占位格子-->
91
+ <placeholder-item
92
+ :type="TabContentType.TYPE_ITEM_SECTION_PLACEHOLDER"
93
+ />
94
+ <!-- 焦点变图格子-->
95
+ <focus-change-img-item
96
+ :type="TabContentType.TYPE_ITEM_SECTION_FOCUS_CHANGE_IMG"
97
+ />
98
+ <!-- 小窗播放格子-->
99
+ <cell-player-item
100
+ :type="TabContentType.TYPE_ITEM_SECTION_CELL_PLAYER"
101
+ />
102
+ <!-- 小窗列表播放格子 -->
103
+ <cell-list-player-item
104
+ :type="TabContentType.TYPE_ITEM_SECTION_CELL_PLAYER_LIST"
105
+ />
106
+ <!-- 历史记录格子-->
107
+ <history-item :type="TabContentType.TYPE_ITEM_HISTORY_TEXT" />
108
+ </template>
109
+ <template v-slot:waterfall-section>
110
+ <!-- 4K 模板-->
111
+ <world-four-section
112
+ :type="TabContentType.TYPE_WATERFALL_SECTION_4K"
113
+ @loadMore="load4KData"
114
+ :getTabRef="getTabRef"
115
+ />
116
+ <!-- 小 4K-->
117
+ <small-four-section
118
+ :type="TabContentType.TYPE_WATERFALL_SECTION_SMALL_4K"
119
+ />
120
+ <!-- 短视频全屏背景播放-->
121
+ <short-video-section
122
+ :type="TabContentType.TYPE_WATERFALL_SECTION_SHORT_SCREEN"
123
+ @loadMore="loadShortData"
124
+ :getTabRef="getTabRef"
125
+ />
126
+ </template>
127
+ </qt-tabs>
128
+ </div>
129
+ </template>
130
+
131
+ <script lang="ts" setup name="waterfall-tabs">
132
+ import {
133
+ ESKeyCode,
134
+ ESKeyEvent,
135
+ ESLogLevel,
136
+ useESLog,
137
+ useESToast,
138
+ } from "@extscreen/es3-core";
139
+
140
+ import { EventBus, Native } from "@extscreen/es3-vue";
141
+ import {
142
+ QTITab,
143
+ QTTab,
144
+ QTTabItem,
145
+ QTTabPageData,
146
+ QTTabPageState,
147
+ QTWaterfallItem,
148
+ VirtualView,
149
+ } from "@quicktvui/quicktvui3";
150
+ import { ref, nextTick } from "vue";
151
+ import homeManager from "../api/index";
152
+ import ic_4k_logo from "../../../assets/home/ic_4k_logo.png";
153
+ import BgAnimation from "../../../components/bg-animation.vue";
154
+ import { IMediaList } from "../../../components/media/build-data/media-imp";
155
+ import launch from "../../../tools/launch";
156
+ import {
157
+ HomePlayData,
158
+ HomePlayType,
159
+ PlayerState,
160
+ } from "../adapter/media/home-media-imp";
161
+ import barsDataManager, {
162
+ buildTabBarAdapter,
163
+ } from "../adapter/tab-bar/tab-bar-adapter";
164
+ import TabBarConfig from "../adapter/tab-bar/tab-bar-config";
165
+ import TabBarItemType from "../adapter/tab-bar/tab-bar-item-type";
166
+ import ThemeConfig from "../../../config/theme-config.ts";
167
+ import tabsContent, {
168
+ buildTabContentAdapter,
169
+ } from "../adapter/tab-content/tab-content-adapter";
170
+ import TabContentConfig from "../adapter/tab-content/tab-content-config";
171
+ import TabContentType from "../adapter/tab-content/tab-content-item-type";
172
+ import BgPlayer from "./media/bg-player.vue";
173
+ import BarImgItem from "./nav-bar/bar-img-item.vue";
174
+ import BarTextItem from "./nav-bar/bar-text-item.vue";
175
+ import CellPlayerItem from "./tab-content/cell-player-item.vue";
176
+ import CellListPlayerItem from "./tab-content/cell-list-player-item.vue";
177
+ import FocusChangeImgItem from "./tab-content/focus-change-img-item.vue";
178
+ import HistoryItem from "./tab-content/history-item.vue";
179
+ import InnerOutTitleItem from "./tab-content/inner-out-title-item.vue";
180
+ import NoTitleItem from "./tab-content/no-title-item.vue";
181
+ import ShortVideoSection from "./tab-content/short-video/short-video-section.vue";
182
+ import PlaceholderItem from "./tab-content/placeholder-item.vue";
183
+ import SmallFourSection from "./tab-content/small-4k/small-four-section.vue";
184
+ import WorldFourSection from "./tab-content/world-4k/world-four-section.vue";
185
+
186
+ const log = useESLog();
187
+ //控制顶部吸顶
188
+ const tabsTriggerTask = [
189
+ {
190
+ event: "onContentScrollYGreater",
191
+ target: "waterfallTopView",
192
+ function: "changeVisibility",
193
+ params: ["invisible"],
194
+ },
195
+ {
196
+ event: "onContentScrollYLesser",
197
+ target: "waterfallTopView",
198
+ function: "changeVisibility",
199
+ params: ["visible"],
200
+ },
201
+ // {
202
+ // event: 'onPageChange',
203
+ // target: 'home_player',
204
+ // function: 'changeAlpha',
205
+ // params: [0],
206
+ // },
207
+ ];
208
+
209
+ //控制qt-tabs section是否初始化
210
+ const qtTabSectionEnable = {
211
+ tabEnable: false,
212
+ flexSectionEnable: true,
213
+ flexSection: {
214
+ qtPosterEnable: false,
215
+ qtPluginItemEnable: false,
216
+ cardItemEnable: false,
217
+ },
218
+ listSectionEnable: true,
219
+ listSection: {
220
+ qtPosterEnable: true,
221
+ cardItemEnable: true,
222
+ },
223
+ loadingSectionEnable: true,
224
+ endSectionEnable: true,
225
+ blankSectionEnable: false,
226
+ cardSectionEnable: false,
227
+ pluginSectionEnable: false,
228
+ vueSectionEnable: false,
229
+ //共享功能waterfall-shared-item使用需设置 itemStoreEnable 为true
230
+ itemStoreEnable: true,
231
+ };
232
+
233
+ const toast = useESToast();
234
+ const waterfallBgRef = ref();
235
+ const waterfallLogo4kRef = ref();
236
+ const waterfallBgPlayerRef = ref();
237
+ const tabRef = ref<QTITab>();
238
+ const recordPlayerMap = new Map<string, HomePlayData>();
239
+ //当前播放数据
240
+ let curBgPlayData: Array<IMediaList>;
241
+ //当前播放类型
242
+ let curPlayerType = HomePlayType.TYPE_UNDEFINED;
243
+ //当前 Tab index
244
+ let curTabPageIndex = 0;
245
+ //短视频播放 index
246
+ // let curShortPlayerIndex = 0
247
+ let isMoreFront = false;
248
+ let isMoreFrontTimer: any = -1;
249
+ let bgTimer: any = -1;
250
+ let resumePlayTimer: any = -1;
251
+ //焦点背景播放 Timer
252
+ let typeBgFocusTimer: any = -1;
253
+ //4k 焦点播放 Timer
254
+ let delay4KFocusTimer: any = -1;
255
+ //小4K
256
+ let small4KTimer: any = -1;
257
+ let small4KSetChildSIdTimer: any = -1;
258
+ //short
259
+ let shortVideoTimer: any = -1;
260
+ //小窗列表
261
+ let cellListTimer: any = -1;
262
+ //小窗列表当前 index
263
+ let curCellListItemIndex: number = 0;
264
+
265
+ //当前背景图地址
266
+ let curBg = "";
267
+ //当前首屏图地址
268
+ let curFirstScreenBg = "";
269
+ //记录播放位置
270
+ let recordPlayerData = {
271
+ tabPageIndex: -1,
272
+ sectionItemIndex: 0,
273
+ };
274
+ // 播放控制 是否吸顶
275
+ let isCeiling = false;
276
+ // 是否执行生命周期 onESStop
277
+ let isOnEsStop = false;
278
+ //控制 4K 图标
279
+ let is4kSectionItemFocused = false;
280
+ //当前 4K sid
281
+ let cur4KSid = "";
282
+ let isSwitchTabSmall4KFlag: boolean = false;
283
+ const getTabRef = () => {
284
+ return tabRef.value!;
285
+ };
286
+ /**
287
+ * nav bar item 点击跳转
288
+ * @param item
289
+ */
290
+ const onTabClick = (item: QTTabItem) => {
291
+ //launch.launch()
292
+ };
293
+ /**
294
+ * 瀑布流event事件集合回调
295
+ * @param tabIndex
296
+ * @param eventName
297
+ * @param params
298
+ */
299
+ const onTabEvent = (tabIndex: number, eventName: string, params: any) => {
300
+ if (eventName === "onPageBringToFront") {
301
+ const tabPageIndex = params.page;
302
+ curTabPageIndex = tabPageIndex;
303
+ let sectionData = tabRef.value?.getPageSection(tabPageIndex, 0);
304
+ let obj: HomePlayData | undefined = recordPlayerMap.get("_" + tabPageIndex);
305
+ if (obj) {
306
+ const playType =
307
+ barsDataManager.barsData.itemList[tabPageIndex]?.playType;
308
+ VirtualView.call("waterfallBgPlayerSid", "changeAlpha", [1]);
309
+ if (playType === HomePlayType.TYPE_SMALL_4K) {
310
+ return;
311
+ }
312
+ clearTimeout(isMoreFrontTimer);
313
+ if (isMoreFront) {
314
+ return;
315
+ }
316
+ isMoreFrontTimer = setTimeout(() => {
317
+ isMoreFront = false;
318
+ }, 2000);
319
+ isMoreFront = true;
320
+ if (playType === HomePlayType.TYPE_SHORT_SCREEN) {
321
+ //列表恢复原位置
322
+ //todo 记得来修改成动态的sid getPageSection bug修复后
323
+ let listSID = sectionData!.shortList.sid;
324
+ VirtualView.call(listSID, "scrollToPosition", [0]);
325
+ VirtualView.call(listSID, "setSelectChildPosition", [0, true]);
326
+ } else if (playType === HomePlayType.TYPE_4K) {
327
+ const _4KListSid = sectionData!.list4KSid;
328
+ //初始化位置
329
+ VirtualView.call(_4KListSid, "scrollToPositionWithOffsetInfiniteMode", [
330
+ 0,
331
+ 253,
332
+ false,
333
+ ]);
334
+ VirtualView.call(_4KListSid, "setSelectChildPosition", [
335
+ 1000000000,
336
+ true,
337
+ ]);
338
+ } else if (playType === HomePlayType.TYPE_CELL_LIST) {
339
+ const url = obj.playerData[0].cover;
340
+ VirtualView.call("cellPlayerListBgSid", "setSrc", [url]);
341
+ VirtualView.call("cellPlayerListSid", "scrollToPositionWithOffset", [
342
+ 0,
343
+ 0,
344
+ false,
345
+ ]);
346
+ VirtualView.call("cellPlayerListSid", "setSelectChildPosition", [
347
+ 0,
348
+ true,
349
+ ]);
350
+ }
351
+ recordPlayerData.tabPageIndex = tabPageIndex;
352
+ recordPlayerData.sectionItemIndex = obj.sectionItemIndex;
353
+ doBgPlayItem(obj);
354
+ } else if (
355
+ sectionData &&
356
+ sectionData.itemList &&
357
+ sectionData.itemList.length > 0 &&
358
+ sectionData.itemList[0]?.imageFocusBackground
359
+ ) {
360
+ const firstBgUrl = sectionData.itemList[0]?.imageFocusBackground;
361
+ setFirstScreenImg("", "1", firstBgUrl, true);
362
+ }
363
+ } else if (eventName === "onTabFocusChange") {
364
+ if (curPlayerType === HomePlayType.TYPE_SMALL_4K && waterfallBgPlayerRef) {
365
+ waterfallBgPlayerRef.value?.pause();
366
+ waterfallBgPlayerRef.value?.stop();
367
+ }
368
+ }
369
+ };
370
+ /**
371
+ * 播放开始
372
+ * @param hpd
373
+ */
374
+ const doBgPlayItem = (hpd: HomePlayData) => {
375
+ curBgPlayData = hpd.playerData;
376
+ curPlayerType = hpd.type;
377
+ waterfallBgPlayerRef.value?.setPlayState(PlayerState.STATE_WAIT);
378
+ if (curPlayerType === HomePlayType.TYPE_4K) {
379
+ cur4KSid = curBgPlayData[0].sid;
380
+ VirtualView.call(cur4KSid, "changeVisibility", [`visible`]);
381
+ }
382
+ waterfallBgPlayerRef.value?.initPlay(hpd);
383
+ };
384
+ /**
385
+ * tab切换回调
386
+ * @param pageIndex
387
+ * @param data
388
+ */
389
+ const onTabPageChanged = (pageIndex: number) => {
390
+ //隐藏播放器
391
+ VirtualView.call("waterfallBgPlayerSid", "changeAlpha", [0]);
392
+ if (cur4KSid) {
393
+ VirtualView.call(cur4KSid, "changeVisibility", [`visible`]);
394
+ }
395
+ isSwitchTabSmall4KFlag = true;
396
+ isMoreFront = false;
397
+ curFirstScreenBg = "";
398
+ cur4KSid = "";
399
+ // curShortPlayerIndex = 0
400
+ waterfallBgPlayerRef.value?.pause();
401
+ waterfallBgPlayerRef.value?.stop();
402
+ waterfallBgPlayerRef.value?.setBgImage("");
403
+ curPlayerType = HomePlayType.TYPE_UNDEFINED;
404
+ clearTimeout(isMoreFrontTimer);
405
+ //设置首屏图
406
+ setFirstScreenImg(
407
+ barsDataManager.barsData.itemList[pageIndex]._id ?? "",
408
+ "0",
409
+ "",
410
+ true,
411
+ );
412
+ };
413
+ /**
414
+ * 吸顶开始
415
+ * @param pageIndex
416
+ * @param eventName
417
+ * @param params
418
+ */
419
+ const onTabMoveToTopStart = () => {
420
+ isCeiling = true;
421
+ if (
422
+ curPlayerType !== HomePlayType.TYPE_UNDEFINED &&
423
+ curPlayerType !== HomePlayType.TYPE_SMALL_4K
424
+ ) {
425
+ //隐藏播放器
426
+ VirtualView.call("waterfallBgPlayerSid", "changeAlpha", [0]);
427
+ waterfallBgPlayerRef.value?.pause();
428
+ waterfallBgPlayerRef.value?.stop();
429
+ }
430
+ //设置二屏图
431
+ set2ScreenImg(barsDataManager.barsData.itemList[curTabPageIndex]._id ?? "");
432
+ };
433
+ /**
434
+ * 恢复吸顶结束
435
+ */
436
+ const onTabMoveToBottomEnd = () => {
437
+ isCeiling = false;
438
+ if (
439
+ curPlayerType !== HomePlayType.TYPE_UNDEFINED &&
440
+ curPlayerType !== HomePlayType.TYPE_SMALL_4K
441
+ ) {
442
+ //显示播放器
443
+ VirtualView.call("waterfallBgPlayerSid", "changeAlpha", [1]);
444
+ if (curPlayerType === HomePlayType.TYPE_BG) {
445
+ waterfallBgPlayerRef?.value.setBgImage("", true);
446
+ }
447
+ waterfallBgPlayerRef.value?.setPlayState(PlayerState.STATE_WAIT);
448
+ setTimeout(() => {
449
+ if (curPlayerType === HomePlayType.TYPE_CELL_LIST) {
450
+ waterfallBgPlayerRef?.value.playByIndex(curCellListItemIndex);
451
+ } else {
452
+ waterfallBgPlayerRef?.value.play(curBgPlayData);
453
+ }
454
+ }, 400);
455
+ }
456
+ //设置首屏图
457
+ if (curFirstScreenBg) {
458
+ setFirstScreenImg("", "1", curFirstScreenBg, true);
459
+ } else {
460
+ setFirstScreenImg(
461
+ barsDataManager.barsData.itemList[curTabPageIndex]._id ?? "",
462
+ );
463
+ }
464
+ };
465
+ /**
466
+ * 格子item 点击事件
467
+ * @param pageIndex 当前导航tab index
468
+ * @param sectionIndex 当前板块 index
469
+ * @param itemIndex 板块中格子 index
470
+ * @param item
471
+ * @param e
472
+ */
473
+ const onTabPageItemClick = (
474
+ pageIndex: number,
475
+ sectionIndex: number,
476
+ itemIndex: number,
477
+ item: QTWaterfallItem,
478
+ e,
479
+ ) => {
480
+ launch.launch(item.jumpParams);
481
+
482
+ //4K内容跳转的时候 将图片设置回来
483
+ if (cur4KSid) {
484
+ VirtualView.call(cur4KSid, "changeVisibility", [`visible`]);
485
+ }
486
+ };
487
+ /**
488
+ * 格子item 焦点事件
489
+ * @param pageIndex
490
+ * @param sectionIndex
491
+ * @param itemIndex
492
+ * @param isFocused
493
+ * @param item
494
+ */
495
+ const onTabPageItemFocused = (
496
+ tabPageIndex: number,
497
+ sectionIndex: number,
498
+ sectionItemIndex: number,
499
+ isFocused: boolean,
500
+ item: QTWaterfallItem,
501
+ ) => {
502
+ if (isFocused) {
503
+ //小 4K 的版块判断必须在第一个放 主要是 else 里面的逻辑需要首次加入
504
+ if (item.name === TabContentConfig.worldSmall4kSectionItemName) {
505
+ sectionItemIndex = sectionItemIndex - 1000000000;
506
+ dealSmall4KFocused(tabPageIndex, sectionItemIndex, item);
507
+ return;
508
+ } else {
509
+ if (
510
+ curPlayerType === HomePlayType.TYPE_SMALL_4K &&
511
+ waterfallBgPlayerRef
512
+ ) {
513
+ clearTimeout(small4KTimer);
514
+ clearTimeout(small4KSetChildSIdTimer);
515
+ waterfallBgPlayerRef.value.pause();
516
+ waterfallBgPlayerRef.value.stop();
517
+ }
518
+ }
519
+ //4K 判断
520
+ if (item.name === TabContentConfig.world4kSectionItemName) {
521
+ //首次隐藏顶部按钮,展示 4K logo
522
+ if (!is4kSectionItemFocused) {
523
+ waterfallLogo4kRef.value?.setImg(ic_4k_logo);
524
+ VirtualView.call("tabNavBarSid", "changeAlpha", [0]);
525
+ VirtualView.call("waterfallTopSid", "changeVisibility", [`invisible`]);
526
+ }
527
+ is4kSectionItemFocused = true;
528
+ sectionItemIndex = sectionItemIndex - 1000000000;
529
+ if (
530
+ recordPlayerData.tabPageIndex !== tabPageIndex ||
531
+ recordPlayerData.sectionItemIndex !== sectionItemIndex
532
+ ) {
533
+ deal4KFocused(tabPageIndex, sectionItemIndex, item);
534
+ }
535
+ return;
536
+ } else {
537
+ is4kSectionItemFocused = false;
538
+ }
539
+ if (item.name === TabContentConfig.shortVideoSectionItemName) {
540
+ if (
541
+ recordPlayerData.tabPageIndex !== tabPageIndex ||
542
+ recordPlayerData.sectionItemIndex !== sectionItemIndex
543
+ ) {
544
+ dealShortFocused(tabPageIndex, sectionItemIndex, item);
545
+ }
546
+ }
547
+ if (item.name === TabContentConfig.cellListSectionItemName) {
548
+ if (
549
+ recordPlayerData.tabPageIndex !== tabPageIndex ||
550
+ recordPlayerData.sectionItemIndex !== sectionItemIndex
551
+ ) {
552
+ dealCellListFocus(tabPageIndex, sectionItemIndex, item);
553
+ }
554
+ }
555
+ //背景播放
556
+ if (curPlayerType === HomePlayType.TYPE_BG && sectionIndex === 0) {
557
+ typeBgFocused(tabPageIndex, sectionIndex, sectionItemIndex, item);
558
+ } else {
559
+ //格子焦点切换背景
560
+ if (
561
+ sectionIndex === 0 &&
562
+ item.imageFocusBackground &&
563
+ !barsDataManager.barsData.itemList[tabPageIndex].isPlay
564
+ ) {
565
+ setFirstScreenImg("", "1", item.imageFocusBackground);
566
+ }
567
+ }
568
+ }
569
+ };
570
+ /**
571
+ * 背景播放焦点事件
572
+ * @param tabPageIndex
573
+ * @param sectionIndex
574
+ * @param sectionItemIndex
575
+ * @param item
576
+ */
577
+ const typeBgFocused = (
578
+ tabPageIndex: number,
579
+ sectionIndex: number,
580
+ sectionItemIndex: number,
581
+ item: QTWaterfallItem,
582
+ ) => {
583
+ //相同位置不再触发
584
+ if (
585
+ recordPlayerData.tabPageIndex === tabPageIndex &&
586
+ recordPlayerData.sectionItemIndex === sectionItemIndex
587
+ )
588
+ return;
589
+ clearTimeout(typeBgFocusTimer);
590
+ curBgPlayData = item.play.playData;
591
+ if (curBgPlayData && curBgPlayData.length > 0) {
592
+ const bgUrl = curBgPlayData[0].cover;
593
+ waterfallBgPlayerRef?.value?.setBgImage(bgUrl);
594
+ waterfallBgPlayerRef?.value?.setPlayState(PlayerState.STATE_WAIT);
595
+ recordPlayerData.tabPageIndex = tabPageIndex;
596
+ recordPlayerData.sectionItemIndex = sectionItemIndex;
597
+ typeBgFocusTimer = setTimeout(() => {
598
+ waterfallBgPlayerRef?.value?.play(curBgPlayData);
599
+ }, 300);
600
+ }
601
+ };
602
+ /**
603
+ * 4K 焦点
604
+ * @param tabPageIndex
605
+ * @param sectionItemIndex
606
+ * @param item
607
+ */
608
+ const deal4KFocused = (
609
+ tabPageIndex: number,
610
+ sectionItemIndex: number,
611
+ item: QTWaterfallItem,
612
+ ) => {
613
+ clearTimeout(delay4KFocusTimer);
614
+ waterfallBgPlayerRef?.value.pause();
615
+ VirtualView.call(TabContentConfig.homeBgPlaySid, "changeAlpha", [0]);
616
+ curBgPlayData = item.play.playData;
617
+ if (curBgPlayData && curBgPlayData.length > 0) {
618
+ const beforeSid = curBgPlayData[0].beforeSid;
619
+ cur4KSid = curBgPlayData[0].sid;
620
+ const nextSid = curBgPlayData[0].nextSid;
621
+ VirtualView.call(beforeSid, "changeVisibility", [`visible`]);
622
+ VirtualView.call(nextSid, "changeVisibility", [`visible`]);
623
+ recordPlayerData.tabPageIndex = tabPageIndex;
624
+ recordPlayerData.sectionItemIndex = sectionItemIndex;
625
+ waterfallBgPlayerRef?.value?.setPlayState(PlayerState.STATE_WAIT);
626
+ delay4KFocusTimer = setTimeout(() => {
627
+ waterfallBgPlayerRef?.value?.play(curBgPlayData);
628
+ }, 300);
629
+ }
630
+ };
631
+ const setCellListIndex = (index) => {
632
+ curCellListItemIndex = index;
633
+ recordPlayerData.sectionItemIndex = index;
634
+ };
635
+ const dealCellListFocus = (
636
+ tabPageIndex: number,
637
+ sectionItemIndex: number,
638
+ item: QTWaterfallItem,
639
+ ) => {
640
+ clearTimeout(cellListTimer);
641
+ waterfallBgPlayerRef?.value.pause();
642
+ curCellListItemIndex = sectionItemIndex;
643
+ recordPlayerData.tabPageIndex = tabPageIndex;
644
+ recordPlayerData.sectionItemIndex = sectionItemIndex;
645
+ const url = item.imgUrl;
646
+ VirtualView.call("cellPlayerListBgSid", "setSrc", [url]);
647
+ //此处只能隐藏播放器
648
+ VirtualView.call(TabContentConfig.homeBgPlaySid, "changeAlpha", [0]);
649
+ waterfallBgPlayerRef?.value?.setPlayState(PlayerState.STATE_WAIT);
650
+ cellListTimer = setTimeout(() => {
651
+ waterfallBgPlayerRef?.value?.playByIndex(curCellListItemIndex);
652
+ }, 300);
653
+ };
654
+
655
+ /**
656
+ * short item 焦点
657
+ * @param tabPageIndex
658
+ * @param sectionItemIndex
659
+ * @param item
660
+ */
661
+ const dealShortFocused = (
662
+ tabPageIndex: number,
663
+ sectionItemIndex: number,
664
+ item: QTWaterfallItem,
665
+ ) => {
666
+ clearTimeout(shortVideoTimer);
667
+ waterfallBgPlayerRef?.value.pause();
668
+ curBgPlayData = item.play.playData;
669
+ if (curBgPlayData && curBgPlayData.length > 0) {
670
+ const bgUrl = curBgPlayData[0].cover;
671
+ waterfallBgPlayerRef?.value?.setBgImage(bgUrl);
672
+ recordPlayerData.tabPageIndex = tabPageIndex;
673
+ recordPlayerData.sectionItemIndex = sectionItemIndex;
674
+ waterfallBgPlayerRef?.value?.setPlayState(PlayerState.STATE_WAIT);
675
+ shortVideoTimer = setTimeout(() => {
676
+ waterfallBgPlayerRef?.value?.play(curBgPlayData);
677
+ }, 300);
678
+ }
679
+ };
680
+
681
+ const dealSmall4KFocused = (
682
+ tabPageIndex: number,
683
+ sectionItemIndex: number,
684
+ item: QTWaterfallItem,
685
+ ) => {
686
+ curBgPlayData = item.play.playData;
687
+ clearTimeout(small4KTimer);
688
+ clearTimeout(small4KSetChildSIdTimer);
689
+ waterfallBgPlayerRef.value.pause();
690
+ VirtualView.call("waterfallBgPlayerSid", "changeAlpha", [1]);
691
+ VirtualView.call(TabContentConfig.homeBgPlaySid, "changeAlpha", [0]);
692
+ small4KTimer = setTimeout(() => {
693
+ waterfallBgPlayerRef.value?.setPlayState(PlayerState.STATE_WAIT);
694
+ waterfallBgPlayerRef?.value.setBgImage("", false);
695
+ curPlayerType = HomePlayType.TYPE_SMALL_4K;
696
+ if (
697
+ !waterfallBgPlayerRef.value.playerWindowInit ||
698
+ isSwitchTabSmall4KFlag
699
+ ) {
700
+ if (curBgPlayData) {
701
+ const obj: HomePlayData = {
702
+ type: HomePlayType.TYPE_SMALL_4K,
703
+ windowWidth: <number>item.style?.width,
704
+ windowHeight: <number>item.style?.height,
705
+ playerWidth: item.play.style.width,
706
+ playerHeight: item.play.style.height,
707
+ playerLeft: 0,
708
+ playerTop: 0,
709
+ playerData: item.play.playData,
710
+ };
711
+ doBgPlayItem(obj);
712
+ }
713
+ isSwitchTabSmall4KFlag = false;
714
+ } else {
715
+ waterfallBgPlayerRef.value.play(curBgPlayData);
716
+ }
717
+ }, 300);
718
+ small4KSetChildSIdTimer = setTimeout(() => {
719
+ VirtualView.call("sectionSmall4kReplaceChildSid", "setChildSID", [
720
+ TabContentConfig.homeBgPlaySid,
721
+ ]);
722
+ VirtualView.call("bg-player", "changeAlpha", [1]);
723
+ }, 800);
724
+ };
725
+
726
+ /**
727
+ * 设置首屏图
728
+ * @param tabId
729
+ * @param isSwitchBg
730
+ * @param switchBg
731
+ * @param isLoad
732
+ */
733
+ const setFirstScreenImg = (
734
+ tabId: string | null,
735
+ isSwitchBg: string = "0",
736
+ firstScreenBg: string = "",
737
+ isLoad: boolean = false,
738
+ ) => {
739
+ if (isSwitchBg === "1") {
740
+ curFirstScreenBg = firstScreenBg;
741
+ setWTabBg(firstScreenBg, isLoad);
742
+ } else {
743
+ const bg = getFirstBg(tabId || "");
744
+ setWTabBg(bg, isLoad);
745
+ }
746
+ };
747
+ /**
748
+ * 获取首屏图
749
+ * @param tabId
750
+ */
751
+ const getFirstBg = (tabId: string): string => {
752
+ return <string>barsDataManager.barsBgUrls.get(tabId);
753
+ };
754
+ /**
755
+ * 设置二屏图
756
+ * @param tabId
757
+ */
758
+ const set2ScreenImg = (tabId: string) => {
759
+ const imgUrl = get2Bg(tabId);
760
+ setWTabBg(imgUrl);
761
+ };
762
+ /**
763
+ * 获取二屏图
764
+ * @param tabId
765
+ */
766
+ const get2Bg = (tabId: string): string => {
767
+ return <string>tabsContent.tab2BackgroundUrls.get(tabId);
768
+ };
769
+ /**
770
+ * 设置背景图
771
+ * @param bg
772
+ * @param isLoad
773
+ */
774
+ const setWTabBg = (bg: string, isLoad: boolean = false) => {
775
+ clearTimeout(bgTimer);
776
+ if (curBg == bg && !isLoad) return;
777
+ bgTimer = setTimeout(() => {
778
+ if (curBg == bg) return;
779
+ curBg = bg;
780
+ if (bg) {
781
+ waterfallBgRef.value?.setImg(bg);
782
+ } else {
783
+ waterfallBgRef.value?.clearImg();
784
+ }
785
+ }, 400);
786
+ };
787
+ /**
788
+ * 获取导航数据
789
+ */
790
+ const getTabList = () => {
791
+ homeManager.getTabList().then((tabList: any) => {
792
+ const tab: QTTab = buildTabBarAdapter(tabList);
793
+ //关闭启动界面
794
+ try {
795
+ Native.callNative("EsNativeModule", "unSuspendLoadingView");
796
+ } catch (e) {
797
+ if (log.isLoggable(ESLogLevel.DEBUG)) {
798
+ log.e("EsNativeModule unSuspendLoadingView error >> " + e);
799
+ }
800
+ }
801
+ tabRef.value?.initTab(tab);
802
+ // tabRef.value?.initPage()
803
+ const id = barsDataManager.barsBgUrls.get("firstShowBg");
804
+ if (id) {
805
+ setFirstScreenImg(id);
806
+ }
807
+ });
808
+ };
809
+ /**
810
+ * 加载界面数据
811
+ * @param pageIndex
812
+ * @param pageNo
813
+ */
814
+ const onTabPageLoadData = (pageIndex: number, pageNo: number) => {
815
+ if (
816
+ pageIndex >= 0 &&
817
+ pageIndex < barsDataManager.barsData?.itemList?.length
818
+ ) {
819
+ const curTab = barsDataManager.barsData.itemList[pageIndex];
820
+ //添加我的 导航
821
+ if (TabBarConfig.tab.id === curTab._id && pageNo === 0) {
822
+ getTabContent(curTab._id, pageIndex, pageNo + 1);
823
+ } else {
824
+ getTabContent(curTab._id ?? "", pageIndex, pageNo + 1);
825
+ }
826
+ }
827
+ };
828
+ const getTabContent = (tabId: string, tabPageIndex: number, pageNo: number) => {
829
+ homeManager
830
+ .getTabContent(tabId, pageNo, TabContentConfig.sectionLoadLimit)
831
+ .then(
832
+ async (tabContent: any) => {
833
+ const tabPage: QTTabPageData = await buildTabContentAdapter(
834
+ tabContent,
835
+ pageNo,
836
+ tabId,
837
+ tabPageIndex,
838
+ );
839
+ if (tabPage.data.length > 0) {
840
+ if (pageNo <= 1) {
841
+ const playerType =
842
+ barsDataManager.barsData.itemList[tabPageIndex].playType;
843
+ let index = 0;
844
+ if (playerType === HomePlayType.TYPE_SMALL_4K) {
845
+ index =
846
+ barsDataManager.barsData.itemList[tabPageIndex].sectionIndex;
847
+ }
848
+ buildPlayerData(
849
+ tabPageIndex,
850
+ tabPage.data[index].itemList,
851
+ tabPage,
852
+ );
853
+ //判断当前tab是否有历史格子
854
+ let historyItemPos: any = tabsContent.historyItemPos.filter(
855
+ (item) => item.tabIndex == tabPageIndex,
856
+ );
857
+ if (historyItemPos.length > 0)
858
+ updateHistoryItem(tabPageIndex, tabPage, 1, historyItemPos[0]);
859
+ else tabRef.value?.setPageData(tabPageIndex, tabPage);
860
+ } else {
861
+ if (
862
+ barsDataManager.barsData.itemList[tabPageIndex].playType ===
863
+ HomePlayType.TYPE_SMALL_4K
864
+ ) {
865
+ const sectionIndex =
866
+ barsDataManager.barsData.itemList[tabPageIndex].sectionIndex;
867
+ buildPlayerData(
868
+ tabPageIndex,
869
+ tabPage.data[sectionIndex].itemList,
870
+ tabPage,
871
+ );
872
+ }
873
+ tabRef.value?.addPageData(tabPageIndex, tabPage, 0);
874
+ }
875
+ }
876
+ if (tabPage.isLoadPageEnd || tabPage.data.length === 0) {
877
+ tabRef.value?.setPageState(
878
+ tabPageIndex,
879
+ QTTabPageState.QT_TAB_PAGE_STATE_COMPLETE,
880
+ );
881
+ }
882
+ },
883
+ () => {
884
+ toast.showToast("加载数据失败,稍后重试!");
885
+ },
886
+ );
887
+ };
888
+
889
+ // 构建历史格子数据
890
+ const buildHistoryItem = async (item) => {
891
+ // 获取历史记录
892
+ const data = await homeManager.getRecords("xxx", "history", 1, 2);
893
+ if (data.items.length === 0) {
894
+ //无历史
895
+ item.historyList = [
896
+ {
897
+ type: 4001,
898
+ style: { width: item.style.width, height: item.style.height },
899
+ text: "暂无历史记录",
900
+ jumpParams: { type: 1, options: { name: "history", params: {} } },
901
+ },
902
+ ];
903
+ } else {
904
+ // 有历史
905
+ item.historyList = [];
906
+ item.gradientBackground = {
907
+ colors: ["#0FFFFFFF", "#0FFFFFFF"],
908
+ orientation: 6,
909
+ cornerRadius: ThemeConfig.focusBorderCorner,
910
+ };
911
+ // 文字模式
912
+ data.items.forEach((_item) => {
913
+ const percentage = Math.floor(
914
+ (item.viewedDuration / item.totalDuration) * 100,
915
+ );
916
+
917
+ item.historyList.push(
918
+ {
919
+ type: 4002,
920
+ style: { width: item.style.width, height: 76 },
921
+ text: _item.title,
922
+ progress:
923
+ item.totalDuration > 0 && percentage > 0
924
+ ? `${percentage}%`
925
+ : "< 1%",
926
+ jumpParams: {
927
+ type: 1,
928
+ options: {
929
+ name: "detail",
930
+ params: {
931
+ mediaId: _item.id,
932
+ startPosition: _item.viewedDuration,
933
+ },
934
+ },
935
+ },
936
+ },
937
+ {
938
+ type: 4004,
939
+ style: { width: item.style.width, height: 1 },
940
+ },
941
+ );
942
+ });
943
+
944
+ // 图片模式
945
+ // item.historyList.push({
946
+ // type: 4005,
947
+ // style: { width: 410, height: 161 },
948
+ // cover: 'https://extcdn.hsrc.tv/channelzero_image/2022/10/25/97a8b741-2475-46d1-81ee-e6611cad0390.jpg?imageMogr2/interlace/0|imageMogr2/gravity/center/crop/336x198"',
949
+ // text: '禁忌女孩',
950
+ // progress: '观看 70%',
951
+ // jumpParams: { type: 1, options: { name: 'detail', params: { mediaId: 'xxx', startPosition: 0 } } }
952
+ // })
953
+ const mHeight = data.items > 1 ? 76 : 152;
954
+ item.historyList.push({
955
+ type: 4003,
956
+ style: { width: item.style.width, height: mHeight },
957
+ text: "全部历史记录",
958
+ jumpParams: { type: 1, options: { name: "history", params: {} } },
959
+ });
960
+ }
961
+ };
962
+
963
+ /**
964
+ * 更新历史格子的数据
965
+ * @param tabPageIndex
966
+ * @param tabPage
967
+ * @param type 1 build数据 2 更新
968
+ * @param historyItemPos 格子位置
969
+ */
970
+ const updateHistoryItem = async (
971
+ tabPageIndex,
972
+ tabPage,
973
+ type,
974
+ historyItemPos,
975
+ ) => {
976
+ //历史格子默认配在第一个板块
977
+ if (type == 1) {
978
+ let item = tabPage.data[0].itemList[historyItemPos.itemIndex];
979
+ await buildHistoryItem(item);
980
+ tabRef.value?.setPageData(tabPageIndex, tabPage);
981
+ }
982
+ };
983
+
984
+ /**
985
+ * 加载 4K 数据
986
+ * @param tabPageIndex
987
+ * @param content4kId
988
+ */
989
+ const load4KData = async (tabPageIndex: number, content4kId: string) => {
990
+ const world4kSection = await homeManager.get4KSection(
991
+ content4kId,
992
+ 6,
993
+ TabContentType.TYPE_WATERFALL_SECTION_4K,
994
+ );
995
+
996
+ if (world4kSection && world4kSection.length > 0) {
997
+ const cacheList = tabsContent.homeSectionCacheList.get(content4kId);
998
+ if (!cacheList || cacheList.length < 1)
999
+ tabsContent.homeSectionCacheList.set(content4kId, world4kSection);
1000
+ tabRef.value!.addPageItemList(tabPageIndex, 0, world4kSection);
1001
+ const playType = barsDataManager.barsData.itemList[tabPageIndex].playType;
1002
+ const section4kItem = world4kSection[0];
1003
+ buildRecordPlayerMap(
1004
+ tabPageIndex,
1005
+ 0,
1006
+ playType,
1007
+ <number>section4kItem?.style?.width,
1008
+ <number>section4kItem?.style?.height,
1009
+ section4kItem?.play?.style?.width,
1010
+ section4kItem?.play?.style?.height,
1011
+ 253.5,
1012
+ TabContentConfig.firstSectionTop,
1013
+ section4kItem.play.playData,
1014
+ );
1015
+ }
1016
+ };
1017
+
1018
+ /**
1019
+ * 加载 short 数据
1020
+ * @param tabPageIndex
1021
+ * @param shortVideoId
1022
+ * @param pageNo
1023
+ */
1024
+ const loadShortData = async (
1025
+ tabPageIndex: number,
1026
+ shortVideoId: string,
1027
+ pageNo: number,
1028
+ ) => {
1029
+ const shortVideoSection = await homeManager.getShortVideoSection(
1030
+ shortVideoId,
1031
+ TabContentType.TYPE_WATERFALL_SECTION_SHORT_SCREEN,
1032
+ pageNo,
1033
+ 30,
1034
+ );
1035
+ if (shortVideoSection && shortVideoSection.length > 0) {
1036
+ if (pageNo === 1) {
1037
+ const cacheList = tabsContent.homeSectionCacheList.get(shortVideoId);
1038
+ if (!cacheList || cacheList.length < 1)
1039
+ tabsContent.homeSectionCacheList.set(shortVideoId, shortVideoSection);
1040
+ tabRef.value!.addPageItemList(tabPageIndex, 0, shortVideoSection);
1041
+ const playType = barsDataManager.barsData.itemList[tabPageIndex].playType;
1042
+ const shortVideoItem = shortVideoSection[0];
1043
+ buildRecordPlayerMap(
1044
+ tabPageIndex,
1045
+ 0,
1046
+ playType,
1047
+ 1920,
1048
+ 1080,
1049
+ 1920,
1050
+ 1080,
1051
+ 0,
1052
+ 0,
1053
+ shortVideoItem.play.playData,
1054
+ );
1055
+ } else {
1056
+ // todo 分页加载 看接口,当前接口无分页 有分页,放开下面三行加载代码
1057
+ // const shortSection = tabRef.value?.getPageSection(tabPageIndex,0)
1058
+ // const shortListSid = shortSection?.shortList?.sid
1059
+ // VirtualView.call(shortListSid,'addListData',shortVideoSection)
1060
+ }
1061
+ }
1062
+ };
1063
+
1064
+ const buildRecordPlayerMap = (
1065
+ tabPageIndex: number,
1066
+ sectionItemIndex: number,
1067
+ playType: HomePlayType,
1068
+ windowWidth: number,
1069
+ windowHeight: number,
1070
+ playerWidth: number,
1071
+ playerHeight: number,
1072
+ left: number,
1073
+ top: number,
1074
+ playerData: Array<IMediaList>,
1075
+ ): HomePlayData => {
1076
+ const obj: HomePlayData = {
1077
+ type: HomePlayType.TYPE_UNDEFINED,
1078
+ windowWidth: 0,
1079
+ windowHeight: 0,
1080
+ playerWidth: 0,
1081
+ playerHeight: 0,
1082
+ playerLeft: 0,
1083
+ playerTop: 0,
1084
+ playerData: [],
1085
+ };
1086
+ obj.type = playType;
1087
+ const key = "_" + tabPageIndex;
1088
+ if (recordPlayerMap.get(key) === undefined) {
1089
+ obj.windowWidth = windowWidth;
1090
+ obj.windowHeight = windowHeight;
1091
+ obj.playerWidth = playerWidth;
1092
+ obj.playerHeight = playerHeight;
1093
+ obj.playerLeft = left;
1094
+ obj.playerTop = top;
1095
+ obj.playerData = playerData;
1096
+ obj.sectionItemIndex = sectionItemIndex;
1097
+ obj.tabPageIndex = tabPageIndex;
1098
+ recordPlayerMap.set(key, obj);
1099
+ }
1100
+ return obj;
1101
+ };
1102
+ /**
1103
+ * 界面加载之前数据处理
1104
+ * @param pageIndex
1105
+ * @param sectionList
1106
+ */
1107
+ // const onTabPageSectionAttached = (pageIndex: number, sectionList: any) => {
1108
+ //
1109
+ // }
1110
+
1111
+ const buildPlayerData = (
1112
+ tabPageIndex: number,
1113
+ sectionItemList: Array<QTWaterfallItem>,
1114
+ tabPage: QTTabPageData,
1115
+ ) => {
1116
+ const isPlay = barsDataManager.barsData.itemList[tabPageIndex].isPlay;
1117
+ if (isPlay) {
1118
+ const playType = barsDataManager.barsData.itemList[tabPageIndex].playType;
1119
+ if (playType !== HomePlayType.TYPE_UNDEFINED) {
1120
+ if (
1121
+ playType === HomePlayType.TYPE_4K ||
1122
+ playType === HomePlayType.TYPE_SHORT_SCREEN
1123
+ ) {
1124
+ tabPage.bindingPlayer = "bgPlayerReplaceChildSid";
1125
+ return;
1126
+ } else if (playType === HomePlayType.TYPE_SMALL_4K) {
1127
+ tabPage.bindingPlayer = "sectionSmall4kReplaceChildSid";
1128
+ return;
1129
+ }
1130
+ const sectionItemIndex =
1131
+ barsDataManager.barsData.itemList[tabPageIndex].sectionItemIndex;
1132
+ if (sectionItemList && sectionItemList.length > sectionItemIndex) {
1133
+ const sectionItem = sectionItemList[sectionItemIndex];
1134
+ //每次都必须给bindingPlayer绑定replaceChild 的sid
1135
+ if (playType === HomePlayType.TYPE_BG) {
1136
+ tabPage.bindingPlayer = "bgPlayerReplaceChildSid";
1137
+ } else if (
1138
+ playType === HomePlayType.TYPE_CELL ||
1139
+ playType === HomePlayType.TYPE_CELL_LIST
1140
+ ) {
1141
+ tabPage.bindingPlayer = sectionItem.play.sid;
1142
+ }
1143
+ if (playType === HomePlayType.TYPE_BG) {
1144
+ buildRecordPlayerMap(
1145
+ tabPageIndex,
1146
+ sectionItemIndex,
1147
+ playType,
1148
+ 1920,
1149
+ 1080,
1150
+ 1920,
1151
+ 1080,
1152
+ 0,
1153
+ 0,
1154
+ sectionItem.play.playData,
1155
+ );
1156
+ } else if (
1157
+ playType === HomePlayType.TYPE_CELL ||
1158
+ playType === HomePlayType.TYPE_CELL_LIST
1159
+ ) {
1160
+ const windowWidth =
1161
+ playType === HomePlayType.TYPE_CELL
1162
+ ? sectionItem.style.width!
1163
+ : sectionItem?.play?.style?.width;
1164
+ const windowHeight =
1165
+ playType === HomePlayType.TYPE_CELL
1166
+ ? sectionItem.style.height!
1167
+ : sectionItem?.play?.style?.height;
1168
+ buildRecordPlayerMap(
1169
+ tabPageIndex,
1170
+ sectionItemIndex,
1171
+ playType,
1172
+ windowWidth,
1173
+ windowHeight,
1174
+ sectionItem?.play?.style?.width,
1175
+ sectionItem?.play?.style?.height,
1176
+ 0,
1177
+ 0,
1178
+ sectionItem.play.playData,
1179
+ );
1180
+ }
1181
+ }
1182
+ }
1183
+ }
1184
+ };
1185
+ const onESCreate = () => {
1186
+ EventBus.$on("DispatchKeyEvent", dispatchKeyEventFn);
1187
+ getTabList();
1188
+ };
1189
+
1190
+ const onESPause = () => {
1191
+ if (curPlayerType !== HomePlayType.TYPE_UNDEFINED) {
1192
+ waterfallBgPlayerRef?.value.pause();
1193
+ }
1194
+ if (cur4KSid) {
1195
+ VirtualView.call(cur4KSid, "changeVisibility", [`visible`]);
1196
+ }
1197
+ };
1198
+
1199
+ const onESStop = () => {
1200
+ isOnEsStop = true;
1201
+ if (curPlayerType !== HomePlayType.TYPE_UNDEFINED) {
1202
+ waterfallBgPlayerRef?.value.stop();
1203
+ //防止视频未播放出后 执行完stop导致视频还有声音播放
1204
+ setTimeout(() => {
1205
+ waterfallBgPlayerRef.value?.stop();
1206
+ }, 300);
1207
+ }
1208
+ };
1209
+
1210
+ const onESResume = () => {
1211
+ if (isOnEsStop) {
1212
+ isOnEsStop = false;
1213
+
1214
+ // 更新历史格子数据
1215
+ if (curTabPageIndex === 1) {
1216
+ //判断当前tab是否有历史格子
1217
+ let historyItemPos: any = tabsContent.historyItemPos.filter(
1218
+ (item) => item.tabIndex === curTabPageIndex,
1219
+ );
1220
+ if (historyItemPos.length > 0) {
1221
+ let pageItem = tabRef.value?.getPageItem(
1222
+ curTabPageIndex,
1223
+ 0,
1224
+ historyItemPos[0].itemIndex,
1225
+ );
1226
+ if (pageItem) {
1227
+ nextTick(async () => {
1228
+ await buildHistoryItem(pageItem);
1229
+ tabRef.value?.updatePageItem(
1230
+ curTabPageIndex,
1231
+ 0,
1232
+ historyItemPos[0].itemIndex,
1233
+ pageItem,
1234
+ );
1235
+ });
1236
+ }
1237
+ }
1238
+ }
1239
+
1240
+ if (curPlayerType !== HomePlayType.TYPE_UNDEFINED && !isCeiling) {
1241
+ waterfallBgPlayerRef?.value.setBgImage("", true);
1242
+ waterfallBgPlayerRef.value?.setPlayState(PlayerState.STATE_WAIT);
1243
+ clearTimeout(resumePlayTimer);
1244
+ resumePlayTimer = setTimeout(() => {
1245
+ if (curBgPlayData) {
1246
+ if (curPlayerType === HomePlayType.TYPE_CELL_LIST) {
1247
+ waterfallBgPlayerRef?.value.play(
1248
+ curBgPlayData,
1249
+ curCellListItemIndex,
1250
+ );
1251
+ } else {
1252
+ waterfallBgPlayerRef?.value.play(curBgPlayData);
1253
+ }
1254
+ }
1255
+ }, 401);
1256
+ }
1257
+ }
1258
+ };
1259
+
1260
+ const onESDestroy = () => {
1261
+ waterfallBgPlayerRef.value?.destroy();
1262
+ clearTimeout(isMoreFrontTimer);
1263
+ clearTimeout(bgTimer);
1264
+ clearTimeout(typeBgFocusTimer);
1265
+ clearTimeout(delay4KFocusTimer);
1266
+ clearTimeout(shortVideoTimer);
1267
+ clearTimeout(small4KTimer);
1268
+ clearTimeout(resumePlayTimer);
1269
+ clearTimeout(small4KSetChildSIdTimer);
1270
+ EventBus.$off("DispatchKeyEvent", dispatchKeyEventFn);
1271
+ };
1272
+ const dispatchKeyEventFn = (keyEvent: ESKeyEvent) => {
1273
+ if (curPlayerType === HomePlayType.TYPE_4K && is4kSectionItemFocused) {
1274
+ if (
1275
+ keyEvent &&
1276
+ keyEvent.action === 1 &&
1277
+ (keyEvent.keyCode === ESKeyCode.ES_KEYCODE_BACK ||
1278
+ keyEvent.keyCode === ESKeyCode.ES_KEYCODE_DPAD_UP)
1279
+ ) {
1280
+ VirtualView.call("tabNavBarSid", "changeAlpha", [1]);
1281
+ waterfallLogo4kRef.value?.clearImg();
1282
+ if (keyEvent.keyCode === ESKeyCode.ES_KEYCODE_DPAD_UP) {
1283
+ VirtualView.call("waterfallTopSid", "changeVisibility", [`visible`]);
1284
+ }
1285
+ is4kSectionItemFocused = false;
1286
+ }
1287
+ }
1288
+ };
1289
+ const onKeyDown = (keyEvent: ESKeyEvent) => {};
1290
+
1291
+ const onKeyUp = (keyEvent: ESKeyEvent) => {};
1292
+ const onBackPressed = (): boolean => {
1293
+ return false;
1294
+ };
1295
+ defineExpose({
1296
+ onESCreate,
1297
+ onESPause,
1298
+ onESStop,
1299
+ onESResume,
1300
+ onESDestroy,
1301
+ onKeyDown,
1302
+ onKeyUp,
1303
+ onBackPressed,
1304
+ });
1305
+ </script>
1306
+
1307
+ <style lang="scss" src="../scss/waterfall-tabs.scss"></style>