Warning, /plasma-bigscreen/youtube-voice-application/ui/YoutubePlayer.qml is written in an unsupported language. File is not indexed.
0001 import QtMultimedia 5.12 0002 import QtQuick.Layouts 1.4 0003 import QtQuick 2.9 0004 import QtQuick.Controls 2.12 as Controls 0005 import org.kde.kirigami 2.10 as Kirigami 0006 import QtGraphicalEffects 1.0 0007 0008 import Mycroft 1.0 as Mycroft 0009 0010 import "." as Local 0011 0012 Mycroft.Delegate { 0013 id: root 0014 0015 property var videoSource: sessionData.video 0016 property var videoStatus: sessionData.status 0017 property var videoThumb: sessionData.videoThumb 0018 property var videoTitle: sessionData.setTitle 0019 property var videoAuthor: sessionData.videoAuthor 0020 property var videoViewCount: sessionData.viewCount 0021 property var videoPublishDate: sessionData.publishedDate 0022 property var videoListModel: sessionData.videoListBlob.videoList 0023 property var nextSongBlob: sessionData.nextSongBlob 0024 0025 //The player is always fullscreen 0026 fillWidth: true 0027 background: Rectangle { 0028 color: "black" 0029 } 0030 leftPadding: 0 0031 topPadding: 0 0032 rightPadding: 0 0033 bottomPadding: 0 0034 0035 onEnabledChanged: syncStatusTimer.restart() 0036 onVideoSourceChanged: syncStatusTimer.restart() 0037 Component.onCompleted: { 0038 syncStatusTimer.restart() 0039 } 0040 0041 Keys.onDownPressed: { 0042 controlBarItem.opened = true 0043 controlBarItem.forceActiveFocus() 0044 } 0045 0046 onVideoTitleChanged: { 0047 triggerGuiEvent("YoutubeSkill.RefreshWatchList", {"title": videoTitle}) 0048 if(videoTitle != ""){ 0049 infomationBar.visible = true 0050 } 0051 } 0052 0053 Connections { 0054 target: window 0055 onVisibleChanged: { 0056 if(video.playbackState == MediaPlayer.PlayingState) { 0057 video.stop() 0058 } 0059 } 0060 } 0061 0062 function getViewCount(value){ 0063 return value.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,') 0064 } 0065 0066 function setPublishedDate(publishDate){ 0067 var date1 = new Date(publishDate).getTime(); 0068 var date2 = new Date().getTime(); 0069 console.log(date1) 0070 console.log(date2) 0071 0072 var msec = date2 - date1; 0073 var mins = Math.floor(msec / 60000); 0074 var hrs = Math.floor(mins / 60); 0075 var days = Math.floor(hrs / 24); 0076 var yrs = Math.floor(days / 365); 0077 mins = mins % 60; 0078 hrs = hrs % 24; 0079 days = days % 365; 0080 var result = "Published: " + days + " days, " + hrs + " hours, " + mins + " minutes ago" 0081 return result 0082 } 0083 0084 function listProperty(item){ 0085 for (var p in item) 0086 { 0087 if( typeof item[p] != "function" ) 0088 if(p != "objectName") 0089 console.log(p + ":" + item[p]); 0090 } 0091 } 0092 0093 // Sometimes can't be restarted reliably immediately, put it in a timer 0094 Timer { 0095 id: syncStatusTimer 0096 interval: 0 0097 onTriggered: { 0098 if (enabled && videoStatus == "play") { 0099 video.play(); 0100 } else if (videoStatus == "stop") { 0101 video.stop(); 0102 } else { 0103 video.pause(); 0104 } 0105 } 0106 } 0107 0108 Timer { 0109 id: delaytimer 0110 } 0111 0112 function delay(delayTime, cb) { 0113 delaytimer.interval = delayTime; 0114 delaytimer.repeat = false; 0115 delaytimer.triggered.connect(cb); 0116 delaytimer.start(); 0117 } 0118 0119 controlBar: Local.SeekControl { 0120 id: seekControl 0121 anchors { 0122 bottom: parent.bottom 0123 } 0124 title: videoTitle 0125 videoControl: video 0126 duration: video.duration 0127 playPosition: video.position 0128 onSeekPositionChanged: video.seek(seekPosition); 0129 z: 1000 0130 } 0131 0132 Item { 0133 id: videoRoot 0134 anchors.fill: parent 0135 0136 Rectangle { 0137 id: infomationBar 0138 anchors.left: parent.left 0139 anchors.right: parent.right 0140 anchors.top: parent.top 0141 visible: false 0142 color: Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.6) 0143 implicitHeight: vidTitle.implicitHeight + Kirigami.Units.largeSpacing * 2 0144 z: 1001 0145 0146 onVisibleChanged: { 0147 delay(15000, function() { 0148 infomationBar.visible = false; 0149 }) 0150 } 0151 0152 Controls.Label { 0153 id: vidTitle 0154 visible: true 0155 maximumLineCount: 2 0156 wrapMode: Text.Wrap 0157 anchors.left: parent.left 0158 anchors.leftMargin: Kirigami.Units.largeSpacing 0159 anchors.verticalCenter: parent.verticalCenter 0160 text: videoTitle 0161 z: 100 0162 } 0163 } 0164 0165 Image { 0166 id: thumbart 0167 anchors.fill: parent 0168 fillMode: Image.PreserveAspectFit 0169 source: root.videoThumb 0170 enabled: root.videoStatus == "stop" ? 1 : 0 0171 visible: root.videoStatus == "stop" ? 1 : 0 0172 } 0173 0174 Video { 0175 id: video 0176 anchors.fill: parent 0177 focus: true 0178 autoLoad: true 0179 autoPlay: false 0180 Keys.onSpacePressed: video.playbackState == MediaPlayer.PlayingState ? video.pause() : video.play() 0181 KeyNavigation.up: closeButton 0182 source: videoSource 0183 readonly property string currentStatus: root.enabled ? root.videoStatus : "pause" 0184 0185 onCurrentStatusChanged: {print("OOO"+currentStatus) 0186 switch(currentStatus){ 0187 case "stop": 0188 video.stop(); 0189 break; 0190 case "pause": 0191 video.pause() 0192 break; 0193 case "play": 0194 video.play() 0195 delay(6000, function() { 0196 infomationBar.visible = false; 0197 }) 0198 break; 0199 } 0200 } 0201 0202 Keys.onReturnPressed: { 0203 video.playbackState == MediaPlayer.PlayingState ? video.pause() : video.play() 0204 } 0205 0206 Keys.onDownPressed: { 0207 controlBarItem.opened = true 0208 controlBarItem.forceActiveFocus() 0209 } 0210 0211 MouseArea { 0212 anchors.fill: parent 0213 onClicked: { 0214 controlBarItem.opened = !controlBarItem.opened 0215 } 0216 } 0217 0218 onStatusChanged: { 0219 if(status == MediaPlayer.EndOfMedia) { 0220 triggerGuiEvent("YoutubeSkill.NextAutoPlaySong", {}) 0221 } 0222 } 0223 } 0224 } 0225 }