|
43 | 43 | background: #000; |
44 | 44 | color: #fff; |
45 | 45 | } |
| 46 | + #player-info-msg { |
| 47 | + width: 100%; |
| 48 | + height: auto; |
| 49 | + padding: 6px; |
| 50 | + background: #000; |
| 51 | + color: #fff; |
| 52 | + display: flex; |
| 53 | + justify-content: center; |
| 54 | + align-items: center; |
| 55 | + } |
46 | 56 | </style> |
47 | 57 | </head> |
48 | 58 | <body > |
|
52 | 62 | height="280" |
53 | 63 | allowtransparency="true" allow="autoplay *; encrypted-media *;" |
54 | 64 | ></iframe> |
| 65 | + <div id="player-info-msg"></div> |
55 | 66 | </div> |
56 | 67 | <!-- JS --> |
57 | 68 | <script type="text/javascript"> |
|
114 | 125 | if (skinId != undefined){ |
115 | 126 | document.body.classList.add("skin-id-" + skinId); |
116 | 127 | } |
| 128 | + function updateSize(){ |
| 129 | + postProperties({ |
| 130 | + size: { |
| 131 | + height: (cardBody.getBoundingClientRect().height + "px") |
| 132 | + } |
| 133 | + }); |
| 134 | + } |
117 | 135 |
|
118 | 136 | //handle events |
119 | 137 | function eventHandler(ev){ |
|
143 | 161 |
|
144 | 162 | var cardBody = document.getElementById("card-body"); |
145 | 163 | var playerFrame = document.getElementById("audio-player"); |
| 164 | + var playerInfoMsgEle = document.getElementById("player-info-msg"); |
146 | 165 |
|
147 | 166 | var autoplay = false; |
148 | 167 | var restoreSettings = {}; |
|
228 | 247 | }else if (mr.uri){ |
229 | 248 | ytUrl = mr.uri; |
230 | 249 | } |
| 250 | + var errorMessage = ""; |
231 | 251 | if (ytUrl){ |
232 | 252 | //handle a bunch of URLs |
233 | 253 | if (ytUrl.indexOf("search_query=") > 0){ |
234 | 254 | //will fail due to iframe restrictions, e.g.: https://www.youtube.com/results?search_query=purple+haze%2C+jimi+hendrix |
235 | 255 | //TODO: add error message |
236 | 256 | ytUrl = undefined; |
237 | | - playerFrame.src = ""; |
| 257 | + playerFrame.src = "about:blank"; |
| 258 | + errorMessage = "Embedded search requires API now :-("; |
238 | 259 | }else if (!!ytUrl.match(/(&|\?)v=.+/)){ |
239 | 260 | //https://www.youtube.com/watch?v=H-RBJNqdnoM&list=RDEMrHVi-mxOgy0ZqOdSlMHqjA&start_radio=1 |
240 | 261 | var videoId = ytUrl.replace(/.*(&|\?)v=/, "").replace(/&.*/, "").trim(); |
241 | 262 | ytUrl = addYouTubeEmbedUrlParameters(baseUrl + videoId); |
242 | 263 | playerFrame.src = ytUrl; |
243 | | - }else if ((!!ytUrl.match(/(&|\?)listType=playlist/) || ytUrl.indexOf("/playlist?") >= 23) && !!ytUrl.match(/(&|\?)list=.+/)){ |
| 264 | + }else if ((!!ytUrl.match(/(&|\?)listType=playlist/) || ytUrl.indexOf("/playlist?") >= 10) && !!ytUrl.match(/(&|\?)list=.+/)){ |
244 | 265 | //https://www.youtube.com/embed?listType=playlist&list=OLAK5uy_nMLnwHRhSOAO6sO7LmFRkp21RATGG6mT8&start_radio=1 |
245 | 266 | //https://www.youtube.com/playlist?list=OLAK5uy_nMLnwHRhSOAO6sO7LmFRkp21RATGG6mT8 |
246 | 267 | var playlistId = ytUrl.replace(/.*(&|\?)list=/, "").replace(/&.*/, "").trim(); |
247 | 268 | ytUrl = addYouTubeEmbedUrlParameters(baseUrl) + "&listType=playlist&list=" + playlistId; |
248 | 269 | playerFrame.src = ytUrl; |
249 | 270 | }else{ |
250 | 271 | //https://www.youtube.com/embed/dkNfNR1WYMY |
251 | | - //https://www.youtube-nocookie.com/embed/dkNfNR1WYMY |
252 | | - ytUrl = addYouTubeEmbedUrlParameters(ytUrl, ytUrlPlaylistParam); |
| 272 | + //https://www.youtube-nocookie.com/embed/dkNfNR1WYMY //has control bug :-( |
| 273 | + //https://youtu.be/tAGnKpE4NCI |
| 274 | + //https://m.youtube.com/embed/tAGnKpE4NCI |
| 275 | + ytUrl = addYouTubeEmbedUrlParameters( |
| 276 | + ytUrl.replace(/https:\/\/.*?\/(embed\/|)/, "https://www.youtube.com/embed/"), ytUrlPlaylistParam); |
253 | 277 | playerFrame.src = ytUrl; |
254 | 278 | } |
255 | 279 | youTubeLastUrlRequest = ytUrl; |
| 280 | + }else{ |
| 281 | + playerFrame.src = "about:blank"; |
256 | 282 | } |
257 | | - if (!playerFrame.src){ |
| 283 | + if (!ytUrl){ |
258 | 284 | //Error: NoMediaMatch |
259 | 285 | postError("NoMediaMatch", "Found no video to play", 2); |
| 286 | + playerInfoMsgEle.textContent = errorMessage || "No Media"; |
| 287 | + playerInfoMsgEle.style.display = ""; |
| 288 | + playerFrame.style.display = "none"; |
| 289 | + updateSize(); |
260 | 290 | }else{ |
261 | 291 | //console.error("YouTube URL:", playerFrame.src); //DEBUG |
| 292 | + if (playerFrame.style.display == "none"){ |
| 293 | + playerInfoMsgEle.style.display = "none"; |
| 294 | + playerFrame.style.display = ""; |
| 295 | + updateSize(); |
| 296 | + } |
262 | 297 | } |
263 | 298 | //Backup settings |
264 | 299 | restoreSettings.src = playerFrame.src; |
|
269 | 304 | //make sure we have correct URL parameters for embedded link |
270 | 305 | function addYouTubeEmbedUrlParameters(url, add){ |
271 | 306 | var u = ( |
272 | | - url.replace("youtube-nocookie.com", "youtube.com") //for controls bug :-( |
273 | | - .replace(/\?.*/, "").trim() |
| 307 | + url.replace(/\?.*/, "").trim() |
274 | 308 | + "?autoplay=" + (autoplay? 1 : 0) |
275 | 309 | + "&enablejsapi=1&playsinline=1&iv_load_policy=3&fs=1" |
276 | 310 | ); |
|
373 | 407 |
|
374 | 408 | //ready |
375 | 409 | setTimeout(function(){ |
376 | | - postProperties({ |
377 | | - size: { |
378 | | - height: (cardBody.getBoundingClientRect().height + "px") |
379 | | - } |
380 | | - }); |
| 410 | + updateSize(); |
381 | 411 | postState(1, {}); |
382 | 412 | }, 300); |
383 | 413 | </script> |
|
0 commit comments