zhenghy

竖屏直播入口

@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 * ResponseDTO 2 * ResponseDTO
3 */ 3 */
4 export interface ResponseDTO<T = string> { 4 export interface ResponseDTO<T = string> {
5 - success:boolean; 5 + success: boolean;
6 6
7 // 服务请求响应值/微服务响应状态码” 7 // 服务请求响应值/微服务响应状态码”
8 code: number; 8 code: number;
@@ -12,6 +12,7 @@ export interface ResponseDTO<T = string> { @@ -12,6 +12,7 @@ export interface ResponseDTO<T = string> {
12 12
13 // 响应结果 13 // 响应结果
14 data?: T; 14 data?: T;
  15 + totalCount?: number;
15 16
16 // 请求响应时间戳(unix格式) 17 // 请求响应时间戳(unix格式)
17 timestamp?: number; 18 timestamp?: number;
@@ -43,6 +43,7 @@ export class WDRouterPage { @@ -43,6 +43,7 @@ export class WDRouterPage {
43 static detailPlayVodPage = new WDRouterPage("wdDetailPlayVod", "ets/pages/DetailPlayVodPage"); 43 static detailPlayVodPage = new WDRouterPage("wdDetailPlayVod", "ets/pages/DetailPlayVodPage");
44 // 直播详情页 44 // 直播详情页
45 static detailPlayLivePage = new WDRouterPage("wdDetailPlayLive", "ets/pages/DetailPlayLivePage"); 45 static detailPlayLivePage = new WDRouterPage("wdDetailPlayLive", "ets/pages/DetailPlayLivePage");
  46 + static detailPlayVLivePage = new WDRouterPage("wdDetailPlayLive", "ets/pages/DetailPlayVLivePage");
46 // 多图(图集)详情页 47 // 多图(图集)详情页
47 static multiPictureDetailPage = new WDRouterPage("phone", "ets/pages/detail/MultiPictureDetailPage"); 48 static multiPictureDetailPage = new WDRouterPage("phone", "ets/pages/detail/MultiPictureDetailPage");
48 // 音乐详情页 49 // 音乐详情页
@@ -171,12 +171,15 @@ export interface LiveInfo { @@ -171,12 +171,15 @@ export interface LiveInfo {
171 liveState: string 171 liveState: string
172 //2024-04-12 15:00:00 直播开始时间 172 //2024-04-12 15:00:00 直播开始时间
173 planStartTime: string 173 planStartTime: string
  174 + liveStyle: number;
174 vlive: Array<Vlive> 175 vlive: Array<Vlive>
175 - mlive:MLive 176 + mlive: MLive
176 } 177 }
  178 +
177 export interface MLive { 179 export interface MLive {
178 - mliveId:string 180 + mliveId: string
179 } 181 }
  182 +
180 export interface FullColumnImgUrls { 183 export interface FullColumnImgUrls {
181 url: string 184 url: string
182 } 185 }
1 export { DetailPlayLivePage } from './src/main/ets/pages/DetailPlayLivePage' 1 export { DetailPlayLivePage } from './src/main/ets/pages/DetailPlayLivePage'
  2 +
  3 +export { DetailPlayVLivePage } from './src/main/ets/pages/DetailPlayVLivePage'
  1 +import { BottomComponent } from '../widgets/details/BottomComponent';
  2 +import { TopPlayComponent } from '../widgets/details/video/TopPlayComponet';
  3 +import { TopPlayVComponent } from '../widgets/details/video/TopPlayVComponet';
  4 +
  5 +
  6 +@Component
  7 +export struct DetailPlayVLivePage {
  8 + aboutToAppear(): void {
  9 +
  10 + }
  11 +
  12 + build() {
  13 + Column() {
  14 + TopPlayVComponent()
  15 + // TabComponent()
  16 + BottomComponent()
  17 + }
  18 + .height('100%')
  19 + .width('100%')
  20 + }
  21 +
  22 + onPageShow(): void {
  23 +
  24 + }
  25 +
  26 + aboutToDisappear(): void {
  27 +
  28 + }
  29 +}
  1 +import { LiveDetailsBean } from 'wdBean/Index';
  2 +import { WDPlayerController, WDPlayerRenderView } from 'wdPlayer/Index';
  3 +import { PlayUIComponent } from './PlayUIComponent';
  4 +
  5 +@Component
  6 +export struct TopPlayVComponent {
  7 + @Consume @Watch('updateData') liveDetailsBean: LiveDetailsBean
  8 + playerController: WDPlayerController = new WDPlayerController();
  9 +
  10 + aboutToAppear(): void {
  11 + this.playerController.onCanplay = () => {
  12 + this.playerController.play()
  13 + }
  14 + }
  15 +
  16 + updateData() {
  17 + //直播新闻-直播状态 wait待开播running直播中end已结束cancel已取消paused暂停
  18 + if (this.liveDetailsBean.liveInfo && this.liveDetailsBean.liveInfo.vlive.length > 0) {
  19 + let playUrl = ''
  20 + if (this.liveDetailsBean.liveInfo.liveState == 'running') {
  21 + playUrl = this.liveDetailsBean.liveInfo.vlive[0].liveUrl
  22 + } else if (this.liveDetailsBean.liveInfo.liveState == 'end') {
  23 + playUrl = this.liveDetailsBean.liveInfo.vlive[0].replayUri
  24 + }
  25 + this.playerController.firstPlay(playUrl);
  26 + }
  27 + }
  28 +
  29 + build() {
  30 + Stack() {
  31 + // https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-image-effect-0000001862607345
  32 + Image(this.liveDetailsBean.fullColumnImgUrls[0].url)
  33 + .height('100%')
  34 + .width('100%')
  35 + .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
  36 + .blur(100)
  37 +
  38 + WDPlayerRenderView({
  39 + playerController: this.playerController,
  40 + onLoad: async () => {
  41 + }
  42 + })// .height('100%')
  43 + .width('100%')// 扩展至所有非安全区域
  44 + .onClick(() => {
  45 + this.playerController.play()
  46 + })
  47 + // PlayUIComponent({ playerController: this.playerController })
  48 + }
  49 + // .height('100%')
  50 + .width('100%')
  51 + // 扩展至所有非安全区域
  52 + .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
  53 + }
  54 +
  55 + aboutToDisappear(): void {
  56 + this.playerController.pause()
  57 + }
  58 +}
1 import mediaquery from '@ohos.mediaquery'; 1 import mediaquery from '@ohos.mediaquery';
2 import { ContentDetailDTO, InteractDataDTO } from 'wdBean'; 2 import { ContentDetailDTO, InteractDataDTO } from 'wdBean';
3 -import { WDPlayerController, WDPlayerRenderView } from 'wdPlayer'; 3 +import { PlayerConstants, WDPlayerController, WDPlayerRenderView } from 'wdPlayer';
4 import { ContentDetailRequest, devicePLSensorManager } from 'wdDetailPlayApi'; 4 import { ContentDetailRequest, devicePLSensorManager } from 'wdDetailPlayApi';
5 import { PlayControlViewContainer } from '../view/PlayControlViewContainer'; 5 import { PlayControlViewContainer } from '../view/PlayControlViewContainer';
6 import { PlayerDetailContainer } from '../view/PlayerDetailContainer'; 6 import { PlayerDetailContainer } from '../view/PlayerDetailContainer';
@@ -32,6 +32,19 @@ export struct DetailPlayShortVideoPage { @@ -32,6 +32,19 @@ export struct DetailPlayShortVideoPage {
32 @Provide videoLandScape?: number = 1; // 视频朝向, 横屏视频:1;竖屏视频:2 32 @Provide videoLandScape?: number = 1; // 视频朝向, 横屏视频:1;竖屏视频:2
33 @Provide newsStatusOfUser: batchLikeAndCollectResult | undefined = undefined // 点赞、收藏状态 33 @Provide newsStatusOfUser: batchLikeAndCollectResult | undefined = undefined // 点赞、收藏状态
34 @Provide followStatus: string = '0' // 关注状态 34 @Provide followStatus: string = '0' // 关注状态
  35 + @Link @Watch('switchVideoStatusChange') switchVideoStatus: boolean
  36 +
  37 + switchVideoStatusChange() {
  38 + if (this.switchVideoStatus) {
  39 + if (this.currentIndex === this.index && this.playerController.getStatus() === PlayerConstants.STATUS_PAUSE) {
  40 + this.playerController.play()
  41 + }
  42 + } else {
  43 + if (this.currentIndex === this.index && this.playerController.getStatus() === PlayerConstants.STATUS_START) {
  44 + this.playerController.pause()
  45 + }
  46 + }
  47 + }
35 48
36 currentIndexChange() { 49 currentIndexChange() {
37 if (this.currentIndex != this.index) { 50 if (this.currentIndex != this.index) {
@@ -166,6 +179,7 @@ export struct DetailPlayShortVideoPage { @@ -166,6 +179,7 @@ export struct DetailPlayShortVideoPage {
166 }) 179 })
167 .height('100%') 180 .height('100%')
168 .width('100%') 181 .width('100%')
  182 + .margin({ top: this.contentDetailData?.videoInfo[0]?.videoLandScape === 1 ? 218 : 0 })
169 .onClick(() => { 183 .onClick(() => {
170 console.error('WDPlayerRenderView=== onClick') 184 console.error('WDPlayerRenderView=== onClick')
171 this.playerController?.switchPlayOrPause(); 185 this.playerController?.switchPlayOrPause();
@@ -24,6 +24,7 @@ export struct DetailVideoListPage { @@ -24,6 +24,7 @@ export struct DetailVideoListPage {
24 @State currentIndex: number = 0 24 @State currentIndex: number = 0
25 @State interactDataList: InteractDataDTO[] = [] 25 @State interactDataList: InteractDataDTO[] = []
26 @State isFullScreen: boolean = false 26 @State isFullScreen: boolean = false
  27 + @State switchVideoStatus: boolean = false
27 28
28 async aboutToAppear(): Promise<void> { 29 async aboutToAppear(): Promise<void> {
29 30
@@ -157,6 +158,7 @@ export struct DetailVideoListPage { @@ -157,6 +158,7 @@ export struct DetailVideoListPage {
157 ForEach(this.data, (item: ContentDetailDTO, index: number) => { 158 ForEach(this.data, (item: ContentDetailDTO, index: number) => {
158 Column() { 159 Column() {
159 DetailPlayShortVideoPage({ 160 DetailPlayShortVideoPage({
  161 + switchVideoStatus: $switchVideoStatus,
160 contentDetailData: item, 162 contentDetailData: item,
161 currentIndex: this.currentIndex, 163 currentIndex: this.currentIndex,
162 index: index, 164 index: index,
@@ -34,14 +34,15 @@ export struct VideoChannelDetail { @@ -34,14 +34,15 @@ export struct VideoChannelDetail {
34 private channelStrategy: string = '1' // 频道策略 1-推荐;2-时间线 34 private channelStrategy: string = '1' // 频道策略 1-推荐;2-时间线
35 // private topicId?: string = '' // 专题id 35 // private topicId?: string = '' // 专题id
36 // private recommend?: string = '' // 0.非推荐,1.推荐; 36 // private recommend?: string = '' // 0.非推荐,1.推荐;
37 - @State @Watch('navIndexChange') bottomNavIndex: number = 0  
38 - @State @Watch('navIndexChange') topNavIndex: number = 0 37 + @Link @Watch('navIndexChange') bottomNavIndex: number
  38 + @Link @Watch('navIndexChange') topNavIndex: number
39 private swiperController: SwiperController = new SwiperController() 39 private swiperController: SwiperController = new SwiperController()
40 @Provide showComment: boolean = false 40 @Provide showComment: boolean = false
41 @State data: ContentDetailDTO[] = [] 41 @State data: ContentDetailDTO[] = []
42 @State currentIndex: number = 0 42 @State currentIndex: number = 0
43 @State interactDataList: InteractDataDTO[] = [] 43 @State interactDataList: InteractDataDTO[] = []
44 @State totalCount: number = 0 44 @State totalCount: number = 0
  45 + @State switchVideoStatus: boolean = false
45 46
46 /** 47 /**
47 * 监听视频频道激活或失活 48 * 监听视频频道激活或失活
@@ -49,30 +50,22 @@ export struct VideoChannelDetail { @@ -49,30 +50,22 @@ export struct VideoChannelDetail {
49 navIndexChange() { 50 navIndexChange() {
50 if (this.bottomNavIndex === 2 && this.topNavIndex === 0) { 51 if (this.bottomNavIndex === 2 && this.topNavIndex === 0) {
51 // 如果视频在暂停则播放视频 52 // 如果视频在暂停则播放视频
  53 + this.switchVideoStatus = true
52 } else { 54 } else {
53 // 如果视频在播放则暂停视频 55 // 如果视频在播放则暂停视频
  56 + this.switchVideoStatus = false
54 } 57 }
  58 +
55 } 59 }
56 60
57 async aboutToAppear(): Promise<void> { 61 async aboutToAppear(): Promise<void> {
58 - const windowStage = WindowModel.shared.getWindowStage() as window.WindowStage  
59 - const windowClass: window.Window = windowStage.getMainWindowSync();  
60 - windowClass.setWindowSystemBarProperties({  
61 - statusBarContentColor: '#ffffff',  
62 - })  
63 - console.error('aboutToAppear groupId', this.groupId)  
64 - console.error('aboutToAppear pageId', this.pageId)  
65 - console.error('aboutToAppear channelId', this.channelId) 62 + WindowModel.shared.setWindowSystemBarProperties({ statusBarContentColor: '#ffffff', })
66 // 根据视频频道传参查询视频楼层信息 63 // 根据视频频道传参查询视频楼层信息
67 this.getRecCompInfo() 64 this.getRecCompInfo()
68 } 65 }
69 66
70 aboutToDisappear(): void { 67 aboutToDisappear(): void {
71 - const windowStage = WindowModel.shared.getWindowStage() as window.WindowStage  
72 - const windowClass: window.Window = windowStage.getMainWindowSync();  
73 - windowClass.setWindowSystemBarProperties({  
74 - statusBarContentColor: '#000000',  
75 - }) 68 + WindowModel.shared.setWindowSystemBarProperties({ statusBarContentColor: '#000000', })
76 console.error('aboutToDisappear videoChanel') 69 console.error('aboutToDisappear videoChanel')
77 } 70 }
78 71
@@ -105,8 +98,7 @@ export struct VideoChannelDetail { @@ -105,8 +98,7 @@ export struct VideoChannelDetail {
105 } 98 }
106 99
107 await ContentDetailRequest.getRecCompInfo(params).then(res => { 100 await ContentDetailRequest.getRecCompInfo(params).then(res => {
108 - console.log('根据视频频道传参查询视频楼层信息', res.data?.totalCount)  
109 - console.log('根据视频频道传参查询视频楼层信息', JSON.stringify(res.data?.compList)) 101 + console.log('根据视频频道传参查询视频楼层信息totalCount', res.data?.totalCount + '')
110 102
111 this.totalCount = res.data?.totalCount || 0 103 this.totalCount = res.data?.totalCount || 0
112 const list1: batchContentDetailParams = { 104 const list1: batchContentDetailParams = {
@@ -136,8 +128,6 @@ export struct VideoChannelDetail { @@ -136,8 +128,6 @@ export struct VideoChannelDetail {
136 this.batchContentDetail(list1) 128 this.batchContentDetail(list1)
137 this.getContentInteract(list2) 129 this.getContentInteract(list2)
138 130
139 - }).catch((e: BusinessError) => {  
140 - console.error('eeeeeeeeeeeeee', e)  
141 }) 131 })
142 } 132 }
143 133
@@ -147,7 +137,7 @@ export struct VideoChannelDetail { @@ -147,7 +137,7 @@ export struct VideoChannelDetail {
147 async batchContentDetail(list: batchContentDetailParams) { 137 async batchContentDetail(list: batchContentDetailParams) {
148 if (list.contents.length > 0) { 138 if (list.contents.length > 0) {
149 await ContentDetailRequest.batchContentDetail(list).then(res => { 139 await ContentDetailRequest.batchContentDetail(list).then(res => {
150 - console.log('根据视频楼层信息批量查询视频列表', JSON.stringify(res.data)) 140 + console.log('根据视频楼层信息批量查询视频列表', res.data)
151 this.data = this.data.concat(res.data as []) 141 this.data = this.data.concat(res.data as [])
152 }) 142 })
153 } 143 }
@@ -160,7 +150,7 @@ export struct VideoChannelDetail { @@ -160,7 +150,7 @@ export struct VideoChannelDetail {
160 if (list.contentList.length > 0) { 150 if (list.contentList.length > 0) {
161 await ContentDetailRequest.getContentInteract(list).then(res => { 151 await ContentDetailRequest.getContentInteract(list).then(res => {
162 this.interactDataList = res.data || [] 152 this.interactDataList = res.data || []
163 - console.log('根据视频信息批量查询点赞、收藏状态', JSON.stringify(res)) 153 + console.log('根据视频信息批量查询点赞、收藏状态', res.data)
164 }) 154 })
165 } 155 }
166 } 156 }
@@ -171,6 +161,7 @@ export struct VideoChannelDetail { @@ -171,6 +161,7 @@ export struct VideoChannelDetail {
171 ForEach(this.data, (item: ContentDetailDTO, index: number) => { 161 ForEach(this.data, (item: ContentDetailDTO, index: number) => {
172 Column() { 162 Column() {
173 DetailPlayShortVideoPage({ 163 DetailPlayShortVideoPage({
  164 + switchVideoStatus: $switchVideoStatus,
174 contentDetailData: item, 165 contentDetailData: item,
175 currentIndex: this.currentIndex, 166 currentIndex: this.currentIndex,
176 index: index, 167 index: index,
@@ -48,7 +48,9 @@ export struct PlayerTitleComment { @@ -48,7 +48,9 @@ export struct PlayerTitleComment {
48 } 48 }
49 49
50 getName() { 50 getName() {
51 - return this.contentDetailData?.newsSourceName || this.contentDetailData?.editorName || '' 51 + // console.error(this.contentDetailData?.newsSourceName + '===========' + this.contentDetailData?.editorName)
  52 + // this.contentDetailData?.newsSourceName ||
  53 + return this.contentDetailData?.editorName || ''
52 } 54 }
53 55
54 getTitle() { 56 getTitle() {
@@ -41,16 +41,15 @@ class MGPlayRenderViewIns { @@ -41,16 +41,15 @@ class MGPlayRenderViewIns {
41 export struct WDPlayerRenderView { 41 export struct WDPlayerRenderView {
42 private playerController?: WDPlayerController; 42 private playerController?: WDPlayerController;
43 private xComponentController: XComponentController = new XComponentController(); 43 private xComponentController: XComponentController = new XComponentController();
  44 + private insId: string = "WDPlayRenderView" + insIndex;
44 onLoad?: ((event?: object) => void); 45 onLoad?: ((event?: object) => void);
45 - videoWidth: number = 0  
46 - videoHeight: number = 0 46 + @State videoWidth: number = 0
  47 + @State videoHeight: number = 0
47 @State selfSize: Size = new Size('100%', '100%'); 48 @State selfSize: Size = new Size('100%', '100%');
48 - private insId: string = "WDPlayRenderView" + insIndex;  
49 49
50 aboutToAppear() { 50 aboutToAppear() {
51 MGPlayRenderViewIns.add(); 51 MGPlayRenderViewIns.add();
52 52
53 - console.log('playerController', this.playerController)  
54 insIndex++; 53 insIndex++;
55 if (!this.playerController) { 54 if (!this.playerController) {
56 return 55 return
@@ -80,9 +79,7 @@ export struct WDPlayerRenderView { @@ -80,9 +79,7 @@ export struct WDPlayerRenderView {
80 }) 79 })
81 .onLoad(async (event) => { 80 .onLoad(async (event) => {
82 Logger.info(TAG, 'onLoad') 81 Logger.info(TAG, 'onLoad')
83 - let surfaceId = this.xComponentController.getXComponentSurfaceId()  
84 - console.log('surfaceId===', surfaceId)  
85 - console.log('insId===', this.insId) 82 + // const surfaceId = this.xComponentController.getXComponentSurfaceId()
86 this.xComponentController.setXComponentSurfaceSize({ 83 this.xComponentController.setXComponentSurfaceSize({
87 surfaceWidth: 1920, 84 surfaceWidth: 1920,
88 surfaceHeight: 1080 85 surfaceHeight: 1080
@@ -94,25 +91,12 @@ export struct WDPlayerRenderView { @@ -94,25 +91,12 @@ export struct WDPlayerRenderView {
94 }) 91 })
95 .width(this.selfSize.width) 92 .width(this.selfSize.width)
96 .height(this.selfSize.height) 93 .height(this.selfSize.height)
97 - .margin({ top: this.getPlayerMarginTop() })  
98 } 94 }
99 .id(this.insId) 95 .id(this.insId)
100 .onAreaChange(() => { 96 .onAreaChange(() => {
101 // this.updateLayout() 97 // this.updateLayout()
102 }) 98 })
103 .backgroundColor("#000000") 99 .backgroundColor("#000000")
104 - .alignItems(VerticalAlign.Center)  
105 - .justifyContent(FlexAlign.Center)  
106 - .alignItems(this.selfSize.width === '100%' ? VerticalAlign.Top : VerticalAlign.Center)  
107 - .height('100%')  
108 - .width('100%')  
109 - }  
110 -  
111 - /**  
112 - * 横屏播放器非居中展示  
113 - */  
114 - getPlayerMarginTop() {  
115 - return this.selfSize.width === '100%' && this.videoWidth > this.videoHeight ? 218 : 0  
116 } 100 }
117 101
118 updateLayout() { 102 updateLayout() {