1/** @license 2 * 3 * ProRadio Music Player: JavaScript player with audio analyzer 4 * ---------------------------------------------- 5 * http://proradio.com/ 6 * 7 * Copyright (c) 2020-2021, ProRadio / Igor Nardo. All rights reserved. 8 * This software cna be used only within our products. It can't be edited or modified for reuse under other projects. 9 * Cannot be re-sold or embedded in other products for sale. 10 * 11 */ 12 13 14// IMPORTANT: THE FOLLOWING IS NOT A COMMENT! IT IS JAVASCIPT IMPORTING! DO NOT DELETE 15// =================================================================================== 16// @codekit-prepend "../components/jquery.marquee.js" 17// @codekit-prepend "../components/raphael/raphael.min.js" 18// @codekit-prepend "../soundmanager/script/soundmanager2-nodebug-jsmin.js" 19// @codekit-prepend "qtmplayer-smpo.js" 20// @codekit-prepend "qtmplayer-radiofeed.js" 21 22// Not required codekit-prepend "qtmplayer-webapiplayer.js" 23 24(function($){ 25 26 27 var qtPlayDebug = $('#qtmplayer').data('qtmplayer-debugger'); 28 29 30 var qtAnalyzer = $('#qtmplayer').data('analyzer'); // disable webaudio 31 var qtInitialized = false; 32 33 var qtPlayIsAllowed = false; 34 var qtShowPlayer = $('#qtmplayer').data('showplayer'); // disable webaudio 35 36 if( /MSIE|Edge|Trident/i.test(navigator.userAgent) || ( navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 ) ){ 37 qtAnalyzer = 0; 38 } 39 40 function qtMplayer_filename(path){ 41 path = path.substring(path.lastIndexOf("/")+ 1); 42 return (path.match(/[^.]+(\.[^?#]+)?/) || [])[0]; 43 } 44 45 46 // since 3.0.2 moved browser detection to mobile 47 var qtMplayerisMobile = false; 48 if( /MSIE|Edge|Trident/i.test(navigator.userAgent) 49 || ( 50 navigator.userAgent.indexOf('Safari') != -1 51 && 52 navigator.userAgent.indexOf('Chrome') == -1 53 ) 54 ){ 55 qtMplayerisMobile = true; 56 } 57 if( /iPad/i.test(navigator.userAgent) ){ 58 qtMplayerisMobile = true; 59 } 60 if( /iPhone/i.test(navigator.userAgent) ){ 61 qtMplayerisMobile = true; 62 } 63 if (window.matchMedia("(max-width: 1024px)").matches){ 64 qtMplayerisMobile = true; 65 } 66 if(true === qtMplayerisMobile){ 67 qtAnalyzer = 0; 68 } 69 70 71 $.qtMplayerPlaylistCue = { 72 minicue: false, 73 tadv: false, 74 init: function(){ 75 $.qtMplayerPlaylistCue.destroy(); 76 var item, offset, width,left, 77 minicue, det;; 78 item = $("li.qtmplayer-played"); 79 if(item.length > 0){ 80 offset = item.offset().left; 81 width = item.width(); 82 left = 0; 83 item.append('<div id="qtMplayerPlaylistTrack" class="qtmplayer-playlist__track"><span id="qtMplayerPlaylistTrackAdv" data-qtmplayer-trackadv class="qtmplayer-track-adv qtmplayer-content-accent"></span>
83<span id="qtMplayerPlaylistMinicue" class="qtmplayer-playlist-minicue"></span></div>'); 84 $.qtMplayerPlaylistCue.minicue = $("#qtMplayerPlaylistMinicue"); 85 $.qtMplayerPlaylistCue.tadv = $("#qtMplayerPlaylistTrackAdv"); 86 det = $("#qtMplayerPlaylistTrack"); 87 det.off("mousemove").off("click"); 88 det.on("mousemove", function(e){ 89 left = e.clientX - offset; 90 $.qtMplayerPlaylistCue.minicue.css({'left': left}); 91 }); 92 det.on("click", function(e){ 93 $.qtPlayerObj.uniPlayer.seek((e.clientX - offset) / width * 100); 94 }); 95 } 96 }, 97 update:function(p){ 98 if($.qtMplayerPlaylistCue.tadv){ 99 $.qtMplayerPlaylistCue.tadv.css({"width": p+'%'}); 100 } 101 if($.qtMplayerPlaylistCue.minicue){ 102 // $.qtMplayerPlaylistCue.minicue.css({"left": p+'%'}); 103 } 104 }, 105 destroy: function(){ 106 $("#qtMplayerPlaylistTrack").remove(); 107 } 108 }; 109 110 /** 111 * =========================================================================== 112 * Circle for podcast 113 * @type {Object} 114 * =========================================================================== 115 */ 116 $.qtRaphaelCircle = { 117 container: $(".qtmplayer-circularplayer"), 118 findXY: function(obj) { 119 var curleft = 0, curtop = 0; 120 do { 121 curleft += obj.offsetLeft; 122 curtop += obj.offsetTop; 123 } while (!!(obj = obj.offsetParent)); 124 return [curleft,curtop]; 125 }, 126 getScrollLeft: function() { 127 return ($('body').scrollLeft+document.documentElement.scrollLeft); 128 }, 129 getScrollTop: function() { 130 return ($('body').scrollTop+document.documentElement.scrollTop); 131 }, 132 init: function(){ 133 var RC = $.qtRaphaelCircle, 134 rcontainer = $("#qtdonut"), 135 136 cH = rcontainer.height(), 137 cW = rcontainer.width(), 138 R = cH / 2; 139 RC.destroy(); 140 rcontainer.find("svg").remove(); 141 RC.R = R; 142 var archtype = new Raphael("qtdonut", cW, cH); 143 archtype.customAttributes.arc = function (xloc, yloc, value, total, R) { 144 var alpha = 360 / total * value, 145 a = (90 - alpha) * Math.PI / 180, 146 x = xloc + R * Math.cos(a), 147 y = yloc - R * Math.sin(a), 148 path; 149 if (total === value) { 150 path = [ 151 ["M", xloc, yloc - R], 152 ["A", R, R, 0, 1, 1, xloc - 0.01, yloc - R] 153 ]; 154 } else { 155 path = [ 156 ["M", xloc, yloc - R], 157 ["A", R, R, 0, +(alpha > 180), 1, x, y] 158 ]; 159 } 160 return { 161 path: path 162 }; 163 }; 164 var my_arc = archtype.path().attr({ 165 "stroke": "#fff", 166 "stroke-width": '16px', 167 arc: [0, 0, 0, 0, 0] 168 }); 169 RC.arc = my_arc; 170 RC.container = rcontainer; 171 var uA = navigator.userAgent, 172 isOpera = (uA.match(/opera/i)), 173 isChrome = (uA.match(/chrome/i)), 174 isTouchDevice = (uA.match(/ipad|iphone/i)), 175 fullCircle = (isOpera||isChrome?359.9:360), 176 angle, offl, offt, 177 dx,dy,coords, perc; 178 179 rcontainer.on('click','svg',function(e){ 180 e = e?e:window.event; 181 if (isTouchDevice && e.touches) { 182 e = e.touches[0]; 183 } 184 if (e.pageX || e.pageY) { 185 coords = [e.pageX,e.pageY]; 186 } else if (e.clientX || e.clientY) { 187 coords = [e.clientX+RC.getScrollLeft(),e.clientY+RC.getScrollTop()]; 188 } 189 offl = rcontainer.offset().left; 190 offt = rcontainer.offset().top - $(window).scrollTop() ; 191 dx = e.clientX - (offl + (cW / 2)); 192 dy = e.clientY - (offt + (cH / 2)); 193 angle = Math.floor(fullCircle-( (Math.atan2(dx,dy) * 180/Math.PI ) +180)); 194 perc = angle/fullCircle * 100; 195 $.qtPlayerObj.uniPlayer.seek(perc); 196 }); 197 rcontainer.addClass("active"); 198 }, 199 update: function(p){ 200 var RC = $.qtRaphaelCircle, 201 R = RC.R; 202 if(typeof(p) === 'undefined' || typeof(RC.arc) === 'undefined' ){ 203 return; 204 } 205 if(isNaN(p)){ 206 return; 207 } 208 RC.arc.animate({ 209 arc: [R, R, p*100, 100, R] 210 }, 2, "ease"); 211 }, 212 destroy: function(){ 213 var RC = $.qtRaphaelCircle; 214 215 if(typeof(RC.arc) !== 'undefined'){ 216 RC.arc.remove(); 217 RC.container.removeClass('active'); 218 } 219 if(typeof(RC.container) !== 'undefined'){ 220 RC.container.removeClass('active'); 221 } 222 } 223 }; 224 225 226 $.qtPlayerObj = { 227 isSoundApi: false, 228 masterVolume: $('#qtmplayer').data('qtmplayer-startvol'),//100, 229 uniPlayer: { 230 btnPlay: $("[data-qtmplayer-playbtn]"), //btnPlay: $("#qtmplayerPlay"), 231 canMoove: true, 232 pause: function(){ 233 // qtmplayer-radiofeed.js 234 if('object' === typeof($.qtmplayerRadioFeedObj)){ // check if the file is loaded 235 $.qtmplayerRadioFeedObj.fn.stopFeed(); 236 } 237 $.qtPlayerObj.interface.justStop(); 238 if( 'radio' === $.qtPlayerObj.songdata.type ){ 239 // With this, after pausing from the bar, music can't restart 240 $.qtPlayerObj.songdata.file_hold = $.qtPlayerObj.songdata.file; // Store stream in a temorary object 241 $.qtPlayerObj.songdata.file = 'file_hold'; // replace stream with a string to block it 242 $.qtPlayerObj.interface.doSpinner(false); 243 if($.qtPlayerObj.isSoundApi === true){ 244 $.qtWebApiPlayer.stop(); 245 } else { 246 $.qtSMPO.smStop(); 247 } 248 249 } else { 250 if($.qtPlayerObj.isSoundApi === true){ 251 $.qtWebApiPlayer.pause(); 252 } else { 253 $.qtSMPO.smPause(); 254 } 255 } 256 }, 257 webapiPlay: function(){ 258 $.qtWebApiPlayer.play($.qtPlayerObj.songdata.file); 259 }, 260 radioFeedCallback:function( feedImageUrl ){ 261 var fallback = $.qtPlayerObj.imgCover.attr('data-fallback'); 262 if(undefined !== feedImageUrl){ 263 $.qtPlayerObj.imgCover.attr( 'src', feedImageUrl ).show(); 264 } else { 265 if(fallback) { 266 $.qtPlayerObj.imgCover.attr('src', fallback).show(); 267 } else { 268 $.qtPlayerObj.imgCover.hide(); 269 } 270 } 271 }, 272 play: function(){ 273 274 if ($.qtPlayerObj.uniPlayer.btnPlay.find("i.material-icons").html() === 'pause') { 275 return; 276 } 277 if(qtInitialized && qtPlayIsAllowed){ 278 279 280 $.qtPlayerObj.uniPlayer.btnPlay.find("i.material-icons").html("pause"); 281 if($.qtPlayerObj.isSoundApi === true){ 282 $.qtWebApiPlayer.play($.qtPlayerObj.songdata.file); 283 } else { 284 if( 'radio' === $.qtPlayerObj.songdata.type && 'file_hold' === $.qtPlayerObj.songdata.file ){ 285 $.qtPlayerObj.songdata.file = $.qtPlayerObj.songdata.file_hold; 286 // FIX-2021-06-16_01 - set volume fix after change track 287 // fix issue when after pause the feed doesn't restart 288 $.qtmplayerRadioFeedObj.fn.pushFeed( $.qtPlayerObj.songdata ); 289 } 290 $.qtSMPO.smPause(); 291 $.qtSMPO.smPlay(); 292 } 293 // FIX-2021-06-16_02 - set volume fix after change track 294 setTimeout( 295 function(){ 296 if($.qtPlayerObj.masterVolume !== 100){ 297 var mvol = $.qtPlayerObj.masterVolume; 298 $.qtPlayerObj.uniPlayer.setVolume( mvol ); 299 $("[data-qtmplayer-vball]").css({'top': 100 - mvol}); 300 $("[data-qtmplayer-vfill]").css({'height':mvol+'%'}); 301 } 302 }, 300 303 ); 304 } 305 }, 306 seek: function(p){ // p = percentage 307 if(isNaN(p)){ 308 return; 309 } 310 p = parseFloat(p); 311 if(p > 100){ 312 p = 100; 313 } 314 if($.qtPlayerObj.isSoundApi === true){ 315 $.qtWebApiPlayer.seek(p); 316 } else { 317 $.qtSMPO.smSeek(p); 318 } 319 }, 320 seekTime: function(t){ 321 if(t === '00:00'){ 322 t = '00:00:00'; 323 } 324 if($.qtPlayerObj.isSoundApi === true){ 325 $.qtWebApiPlayer.seekTime(t); 326 } else { 327 $.qtSMPO.smSeekTime(t); 328 } 329 }, 330 setVolume: function(v){ 331 $.qtPlayerObj.masterVolume = v; 332 if($.qtPlayerObj.isSoundApi === true){ 333 $.qtWebApiPlayer.setvolume(v / 100); 334 } else { 335 $.qtSMPO.sm.setVolume(v); 336 } 337 } 338 }, 339 340 341 /** 342 * ================================================================ 343 * 344 * [interface functions controlling interaction and visual feedback] 345 * @type {Object} 346 * 347 * ================================================================ 348 */ 349 interface: { 350 window: $(window), 351 body: $("body"), 352 htmlAndbody: $('html,body'), 353 player: $('#qtmplayer'),
354 controls: $('#qtmplayer-controls'), 355 qtmplayer: $('#qtmplayer-playlistcontainer'), 356 playlist: $("#qtmplayer-playlist ul"), 357 grooveadv: $('#qtMplayerTadv'), // music cue 358 buffer: $('#qtMplayerBuffer'), // buffer 359 progWave: $('#qtMplayerprogWave'), // buffer 360 advance: $("#qtMplayerTadv"), 361 btnPlay: $("[data-qtmplayer-playbtn]"), // $("#qtmplayerPlay"), 362 363 control: $("#qtmplayerTrackControl"), 364 minicue: $("#qtMplayerMiniCue"), 365 minicueT: $("#qtMplayerPlaylistTrackMinicue"), 366 trackAdvance: $("#qtmplayerTrackAdv"), 367 time: $("#qtmplayerTime"), 368 autoplay: $('#qtmplayer').data('autoplay'), 369 artwork: $('#qtmplayer').data('artwork'), 370 dragging: false, 371 vdragging: false, 372 debug: function(msg){ 373 $("#qtmplayerDebug").prepend(msg+'<br>'); 374 }, 375 doSpinner: function(state, content){ 376 var notif = $('[data-qtmplayerNotif]'); 377 notif.html(content); 378 if( true === state ){ 379 notif.addClass("active qtmplayer-spinner"); 380 } else { 381 notif.removeClass("active").removeClass("qtmplayer-spinner"); 382 } 383 }, 384 preloadTrack: function(){ 385 var p = $.qtPlayerObj, 386 i = p.interface; 387 p.interface.doSpinner(true); 388 i.playlist.find("li:first-child .qtmplayer-play-btn").each(function(i,c){ 389 var trk = $(c), 390 q = 'qtmplayer-'; 391 392 p.songdata = {}; 393 $.each(trk.data() , function(i,c){ 394 var newKey = i.replace("qtmplayer", "").toLowerCase(); 395 p.songdata[newKey] = c; 396 }); 397 398 399 $('.qtmplayer-played').removeClass('qtmplayer-played'); 400 trk.closest(".qtmplayer-trackitem").addClass("qtmplayer-played"); 401 var c = $.qtPlayerObj.interface.controls, 402 ot = false; 403 if(qtShowPlayer){ 404 p.interface.showhide(); 405 } 406 407 408 if(p.interface.deployTrack()){ 409 if(p.interface.autoplay){ 410 setTimeout( 411 p.uniPlayer.play, 412 2200 413 ); 414 } 415 } 416 }); 417 }, 418 419 isMobile: function(){ 420 return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || $.ProRadioMainObj.window.width() < 1170 ; 421 }, 422 423 424 deployTrack: function(autoplay){ 425 var o = $.qtPlayerObj, 426 i = o.interface, 427 hd = i.controls, 428 dt = o.songdata, 429 mp = i.qtmplayer, 430 durtime = $("#qtmplayerDuration"), 431 cartlink, 432 cartbt = hd.find('.qtmplayer__cart'), 433 cur_url = window.location.href, 434 wc_params = '', 435 wc_classes = '', 436 params, // for URL 437 params_str; // for URL 438 if(dt.file == ''){ 439 return; 440 } 441 442 443 if(true === qtMplayerisMobile && $.qtPlayerObj.songdata.file_mobile ){ 444 $.qtPlayerObj.songdata.file = $.qtPlayerObj.songdata.file_mobile; 445 } 446 447 448 i.doSpinner(true); 449 450 if(false == qtInitialized){ 451 setTimeout( 452 i.doSpinner, 453 1000 454 ); 455 } 456 457 if( 'radio' === dt.type ){ 458 i.minicue.hide(); 459 i.buffer.hide(); 460 i.trackAdvance.hide(); 461 durtime.hide(); 462 $('#qtmplayerTrackControl canvas').remove(); 463 if( $.qtmplayerRadioFeedObj ){ 464 $.qtPlayerObj.songdata.callBack = false; 465 if( $.qtPlayerObj.interface.artwork ){ 466 $.qtPlayerObj.imgCover = $.qtPlayerObj.interface.controls.find('.qtmplayer__cover img'); 467 var original = $.qtPlayerObj.imgCover.attr('src'); 468 if( original ){ 469 $.qtPlayerObj.imgCover.attr('data-fallback', original); 470 } 471 $.qtPlayerObj.interface.controls.find('.qtmplayer__cover img').attr('data-fallback', original); 472 $.qtPlayerObj.songdata.callBack = $.qtPlayerObj.uniPlayer.radioFeedCallback; 473 } 474 $.qtmplayerRadioFeedObj.fn.pushFeed( $.qtPlayerObj.songdata ); 475 } 476 } else { 477 if( $.qtmplayerRadioFeedObj ){ 478 $.qtmplayerRadioFeedObj.fn.stopFeed(); 479 } 480 481 i.minicue.show(); 482 i.buffer.show(); 483 i.trackAdvance.show(); 484 durtime.show(); 485 if( false === i.isMobile() ){ 486 var comp = new RegExp(location.host); 487 try { 488 if(comp.test( dt.file ) && 'function' === typeof(qtDrawAudio)){ 489 qtDrawAudio(dt.file); 490 } else { 491 $('#qtmplayerTrackControl canvas').remove(); 492 } 493 } catch(e){ 494 console.log(e); 495 } 496 } 497 } 498 499 500 if( dt.link !== ''){ 501 hd.find('.qtmplayer__title').html('<a href="'+dt.link+'"><strong>'+dt.title+'</strong></a> '); 502 } else { 503 hd.find('.qtmplayer__title').html(dt.title); 504 } 505 506 507 hd.find('.qtmplayer__artist').text(dt.artist); 508 if(typeof( dt.album ) !== 'undefined' && dt.album !== ''){ 509 hd.find('.qtmplayer__title').append('['+dt.album+']'); 510 } 511 hd.find('.qtmplayer__cover').attr("href", dt.link); 512 // WooCommerce support added 513 cartbt.addClass('qtmplayer__disabled'); 514 if(dt.buylink !== ''){ 515 516 cartbt.removeClass('qtmplayer__disabled'); 517 // WooCommerce 518 cartlink = dt.buylink; 519 if('undefined' !== typeof( dt.buylink )) { 520 dt.buylink = dt.buylink.toString(); 521 if (dt.buylink.match(/^-?\d+$/)) { // is a numeric ID 522 params = { "add-to-cart":dt.buylink }; 523 params_str = jQuery.param( params ); 524 if(cur_url.indexOf('?') != -1) { 525 cartlink = cur_url+"&"+params_str; 526 }else{ 527 cartlink = cur_url+"?"+params_str; 528 } 529 // Extra cart classes and attrs 530 wc_classes = ' product_type_simple add_to_cart_button ajax_add_to_cart '; 531 cartbt.attr("href", cartlink).attr('data-quantity','1').attr('data-product_id', dt.buylink).addClass(wc_classes).show(); 532 } else { 533 cartbt.attr("href", dt.buylink).removeClass('product_type_simple').removeClass('add_to_cart_button').removeClass('ajax_add_to_cart').show(); 534 535 } 536 } 537 } else { 538 cartbt.removeClass('product_type_simple').removeClass('add_to_cart_button').removeClass('ajax_add_to_cart'); 539 } 540 541 if(dt.icon == 'download') { 542 dt.icon = 'file_download'; 543 } 544 if(dt.buylink == ''){ 545 cartbt.hide(); 546 } else { 547 cartbt.show(); 548 } 549 550 cartbt.find('i').html(dt.icon); 551 552 i.advance.width(0); 553 i.buffer.width(0); 554 if(dt.cover !== '' && dt.cover !== undefined){ 555 mp.find('.qtmplayer__album img').attr("src", dt.cover).show(); 556 hd.find('.qtmplayer__cover img').attr("src", dt.cover).show(); 557 hd.find('.qtmplayer__bgimg').css({"background-image": 'url('+dt.cover+')' }); 558 } else { 559 mp.find('.qtmplayer__album img').hide(); 560 hd.find('.qtmplayer__cover img').hide(); 561 hd.find('.qtmplayer__bgimg').css({"background-image": 'none' }); 562 } 563 mp.find('.qtmplayer-albumlink').attr("href",dt.link); 564 if(qtShowPlayer){ 565 i.showhide(); 566 } 567 568 569 570 571 i.btnPlayClick(); 572 i.playTrack(); 573 if(autoplay){ 574 o.uniPlayer.play(); 575 } 576 return true; 577 }, 578 btnPlaySetup: function(dt){ 579 var state = 'pause', 580 o = $.qtPlayerObj, 581 i = o.interface, 582 b = i.btnPlay, 583 p = o.uniPlayer; 584 585 b.off("click"); 586 b.on("click", function(e){ 587 e.preventDefault(); 588 state = b.find("i").html(); 589 if(state === 'pause'){ 590 $(".qtmplayer-played .qtmplayer-play-btn").click(); 591 } else { 592 $('#qtmplayer-playlist li:first-child').find(".qtmplayer-play-btn").click(); 593 } 594 }); 595 }, 596 /** 597 * Questa funzione è probabilmente inutile adesso 598 */ 599 btnPlayClick: function(){ 600 var state = 'pause', 601 o = $.qtPlayerObj, 602 i = o.interface, 603 b = i.btnPlay, 604 p = o.uniPlayer; 605 b.off("click"); 606 b.on("click", function(e){ 607 e.preventDefault(); 608 // state = b.find("i").html(); 609 state = b.find("i.material-icons").html(); 610 if(state === 'pause'){ 611 p.pause(); 612 } else { 613 if(false == qtInitialized){ 614 i.doSpinner(true); 615 i.initializeAudio(); 616 qtPlayIsAllowed = true; 617 setTimeout( 618 p.play, 619 200 620 ); 621 } else { 622 // if(state === 'pause'){ 623 // p.pause(); 624 // } else { 625 qtPlayIsAllowed = true; 626 p.play(); 627 // } 628 } 629 } 630 return true; 631 }); 632 }, 633 playTrack: function(){ 634 var p = $.qtPlayerObj, 635 i = p.interface, 636 u = p.uniPlayer;
637 i.body.off("click", ".qtmplayer-play-btn"); 638 i.body.on("click", ".qtmplayer-play-btn", function(e){ 639 e.preventDefault(); 640 qtPlayIsAllowed = true; 641 i.doSpinner(true); 642 var tr = $(this), 643 item = tr.closest(".qtmplayer-trackitem"), 644 isDonut = item.hasClass("qtmplayer-donut"), 645 icon = tr.find("i"), 646 clickedsong = tr.attr('data-qtmplayer-file'), 647 playedclass = "qtmplayer-played", 648 playedtrack = i.body.find("."+playedclass), 649 iplay = "dripicons-media-play", 650 ipause = "dripicons-media-pause"; 651 if(item.hasClass(playedclass) && tr.find('i').html() === 'pause'){ 652 i.switchicon(icon, 'play'); 653 item.removeClass(playedclass); 654 i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play'); 655 u.pause(); 656 e.stopPropagation(); 657 return; 658 } else { 659 // Check if is the same track. If yes pause, if not stop the first play the second 660 // update 2019 05 22 661 if(clickedsong === p.songdata.file) { 662 if(playedtrack.length > 0){ 663 664 if(p.uniPlayer.btnPlay.find("i.material-icons").html() === 'pause'){ 665 playedtrack.removeClass(playedclass); 666 i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play'); 667 u.pause(); 668 e.stopPropagation(); 669 return; 670 } else { 671 u.pause(); 672 i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play'); 673 playedtrack.removeClass(playedclass); 674 } 675 676 } 677 } else { 678 i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play'); 679 playedtrack.removeClass(playedclass); 680 i.justStop(); 681 u.pause(); 682 } 683 684 685 if( undefined === tr.data("qtmplayer-type") ){ 686 tr.data("qtmplayer-type", 'track'); 687 } 688 689 690 // 2019 12 29 new faster remapping of data 691 p.songdata = {}; 692 693 $.each(tr.data() , function(i,c){ 694 var newKey = i.replace("qtmplayer", "").toLowerCase(); 695 p.songdata[newKey] = c; 696 }); 697 698 i.seekBtn(); 699 i.switchicon(icon, 'pause'); 700 item.addClass(playedclass); 701 if($("#qtdonut").length > 0){ 702 $("#qtdonut").removeAttr("id"); 703 } 704 if(isDonut){ 705 item.attr("id", "qtdonut"); 706 $.qtMplayerPlaylistCue.destroy(); 707 if( 'track' === p.songdata.type){ 708 $.qtRaphaelCircle.init(); 709 } 710 } else { 711 if( 'track' === p.songdata.type){ 712 $.qtMplayerPlaylistCue.init(); 713 } 714 } 715 i.deployTrack(); 716 // safe initialization 717 if(false == qtInitialized){ 718 i.initializeAudio(); 719 i.doSpinner(true); 720 setTimeout( 721 u.play, 722 2200 723 ); 724 } else { 725 u.play(); 726 } 727 728 // u.play(); 729 } 730 e.stopPropagation(); 731 }); 732 }, 733 734 switchicon: function(i, state) { 735 if(state === 'play'){ 736 i.html('play_arrow'); 737 } else if (state === 'pause') { 738 i.html('pause'); 739 } 740 }, 741 progressUpdate: function(perc){ // buffered 742 var i = $.qtPlayerObj.interface, 743 p = perc * 100; 744 i.buffer.css({width: p+'%'}); 745 i.minicue.addClass('actvd'); 746 747 }, 748 timeupdate: function(perc, time){ 749 var i = $.qtPlayerObj.interface, 750 p = perc * 100; 751 i.advance.css({width: (p)+'%'}); 752 i.time.html(time); 753 if(perc > 0.001){ 754 i.doSpinner(); 755 setTimeout( 756 i.doSpinner, 757 300 758 ); 759 } 760 if($('#qtMplayerprogWave')){ 761 $('#qtMplayerprogWave').css({width: (p)+'%'}); 762 } 763 if(i.dragging === false) { 764 i.minicue.css({left: (p)+'%'}); 765 } 766 }, 767 seekBtn: function(){ 768 var o = $.qtPlayerObj, 769 i = o.interface, 770 c = i.control, 771 m = i.minicue, 772 ol = c.offset().left, 773 w = c.outerWidth(), 774 t = (o.songdata.type == 'radio') ? 'radio' : 'track', 775 l, 776 active = false, 777 currentX, currentY, initialX, initialY, 778 xOffset = 0; 779 yOffset = 0; 780 dragItem = m; 781 c.off("touchstart").off("touchend").off('touchmove').off('mousedown').off('mouseup').off('mouseleave').off('mousemove'); 782 if(t === 'radio') { 783 m.css({'left': 0}); 784 } else { 785 c.on("touchstart", dragStart); 786 c.on("touchend", dragEnd); 787 c.on("touchmove", drag); 788 c.on("mousedown", dragStart); 789 c.on("mouseup", dragEnd); 790 c.on("mouseleave", dragEnd); 791 c.on("mousemove", drag); 792 function dragStart(e) { 793 i.dragging = true; 794 active = true; 795 m.addClass('qtmplayer-touch'); 796 } 797 function dragEnd(e) { 798 i.dragging = false;
799 active = false; 800 m.removeClass('qtmplayer-touch'); 801 } 802 function drag(e) { 803 ol = c.offset().left; 804 w = c.outerWidth(); 805 if (e.type === "touchmove") { 806 l = e.originalEvent.touches[0].pageX - ol; 807 } else { 808 l = e.clientX - ol; 809 } 810 if(active){ 811 relocate(l); 812 } 813 } 814 function relocate(l){ 815 var p = l / w; 816 if( p < 0 || p > 99.9 ){ 817 return; 818 } 819 m.css({'left': l}); 820 o.uniPlayer.seek(p * 100); 821 } 822 } 823 }, 824 appendAlbum: function(){ 825 var p = $.qtPlayerObj, 826 i = p.interface, 827 c = i.controls, 828 cartlink, 829 cur_url = window.location.href, 830 wc_params = '', 831 wc_classes = '', 832 params, // for URL 833 params_str, // for URL 834 ot = false, // timeout 835 notif = $('[data-qtmplayerNotif]'); 836 i.body.on("click", "[data-qtmplayer-addrelease]", function(e){ 837 e.preventDefault(); 838 var that = $(this), 839 url = that.data("qtmplayer-addrelease"), 840 playnow = that.data("playnow"), 841 latestAdded = 'qtmplayer-latestadded'; 842 if(that.data("qtmplayer-addrelease") == '0' || that.hasClass("disabled")){ 843 return; 844 } 845 $.getJSON(url, function( data ) { 846 var newitem, 847 special_action, 848 tn = data.length; 849 $.each( data, function( key, val ) { 850 // WooCommerce 851 cartlink = val.buylink; 852 if (val.buylink.match(/^-?\d+$/)) { // is a numeric ID 853 params = { "add-to-cart":val.buylink }; 854 params_str = jQuery.param( params ); 855 if( cur_url) { 856 if( cur_url.indexOf("?")>= 0 ) { 857 cartlink = cur_url+"&"+params_str; 858 }else{ 859 cartlink = cur_url+"?"+params_str; 860 } 861 } 862 // Extra cart classes and attrs 863 wc_classes = ' product_type_simple add_to_cart_button ajax_add_to_cart '; 864 wc_params = ' data-quantity="1" data-product_id="'+ val.buylink +'" '; 865 } 866 special_action = '<i class="material-icons">'+val.icon+'</i>'; 867 if( typeof(val.price) !== 'undefined'){ 868 if (val.price !== ''){ 869 special_action = '<span class="qtmplayer-price qtmplayer-btn qtmplayer-btn-xs qtmplayer-btn-primary">'+val.price+'</span>'; 870 } 871 } 872 newitem = '<li class="qtmplayer-trackitem dynamic">'; 873 if(val.cover !== ''){ 874 newitem += '<img src="'+val.cover+'">'; 875 } 876 newitem += '<span class="qtmplayer-play qtmplayer-link-sec qtmplayer-play-btn '+latestAdded+'" data-qtmplayer-type="track" data-qtmplayer-cover="'+val.cover+'" data-qtmplayer-price="'+val.price+'" data-qtmplayer-file="'+val.file+'" data-qtmplayer-title="'+val.title+'"'+'data-qtmplayer-artist="'+val.artist+'"'+'data-qtmplayer-album="'+val.album+'" data-qtmplayer-link="'+val.link+'" data-qtmplayer-buylink="'+val.buylink+'" data-qtmplayer-icon="'+val.icon+'"><i class="material-icons">play_arrow</i></span><p> <span class="qtmplayer-tit">'+val.title+'</span><br> <span class="qtmplayer-art">'+val.artist+'</span></p><a href="'+cartlink+'" '+wc_params+' class="qtmplayer-cart '+ wc_classes +'" target="_blank">'+special_action+'</a></li>'; 877 i.playlist.append(newitem); 878 if(0 === key && playnow){ 879 $.qtPlayerObj.interface.justStop(); 880 $.qtPlayerObj.uniPlayer.pause(); 881 p.songdata = val; 882 $("."+latestAdded).click(); 883 } 884 latestAdded = ''; 885 }); 886 i.showhide(); 887 if(that.data("clickonce") === 1){ 888 that.hide(); 889 890 $(that.data("notificate")).addClass("active"); 891 892 } else { 893 that.addClass('disabled'); 894 895 } 896 notif.addClass("wait").delay(1500).promise().done(function(){ 897 notif.removeClass("wait"); 898 }); 899 // Disable the functionality 900 that.attr("data-qtmplayer-addrelease", '0'); 901 }); 902 }); 903 }, 904 showhide: function(){ 905 var c = $.qtPlayerObj.interface.controls; 906 c.addClass('open'); 907 ot = setTimeout(function() { 908 c.removeClass('open'); 909 clearTimeout(ot); 910 }, 4000); 911 }, 912 prevNext: function(){ 913 $.qtPlayerObj.interface.controls.on("click",".qtmplayer__prev, .qtmplayer__next", function(e){ 914 e.preventDefault(); 915 var t = $(this), b; 916 $.qtPlayerObj.interface.doSpinner(true);
917 if(t.data("control") === "prev"){ 918 b = $(".qtmplayer-played").prev(); 919 } else { 920 b = $(".qtmplayer-played").next(); 921 } 922 b.find(".qtmplayer-play-btn").click(); 923 }); 924 }, 925 next: function(){ 926 var i = $.qtPlayerObj.interface, 927 nt = $(".qtmplayer-played").next(); 928 if(nt !== undefined){ 929 if(nt.length > 0){ 930 nt.find(".qtmplayer-play-btn").click(); 931 } else { 932 i.justStop(); 933 } 934 } else { 935 i.justStop(); 936 } 937 }, 938 justStop: function(){ 939 $.qtPlayerObj.interface.switchicon($(".qtmplayer-played .qtmplayer-play-btn i.material-icons"), 'play'); 940 $.qtPlayerObj.uniPlayer.btnPlay.find("i.material-icons").html("play_arrow"); 941 }, 942 skipCue: function(){ 943 var o = $.qtPlayerObj, 944 i = o.interface; 945 i.body.on('click', '[data-qtplayercue]',function(){ 946 var t = $(this), 947 k = t.data('qttrackurl'), 948 c = t.data('qtplayercue'); 949 if("undefined" === typeof( o.songdata.type )) { 950 return; 951 } 952 if(o.songdata.file === k) { 953 o.uniPlayer.seekTime(c); 954 } 955 }); 956 }, 957 volBtn: function(){ 958 var o = $.qtPlayerObj, 959 i = o.interface, 960 c = $("[data-qtmplayer-vcontrol]"); 961 if( 0 === c.length ){ return; } 962 var ol = c.offset().top, 963 w = c.outerHeight(), 964 ct = $("[data-qtmplayer-vtrack]"), // cue 965 f = $("[data-qtmplayer-vfill]"), // fill 966 m = $("[data-qtmplayer-vball]"), // fill 967 off = c.offset().top, 968 h = c.height(), 969 vi = $('[data-qtmplayer-vicon]'), 970 t, // top 971 p = 100, // percentage 972 tp = 100, // volume before muting to unmute 973 d; // delta 974 c.on("touchstart", vdragStart); 975 c.on("touchend", vdragEnd); 976 c.on("touchmove", vdrag); 977 c.on("mousedown", vdragStart); 978 c.on("mouseup", vdragEnd); 979 c.on("mouseleave", vdragEnd); 980 c.on("mousemove", vdrag); 981 var vactive = false; 982 var vcurrentX; 983 var vcurrentY; 984 var vinitialX; 985 var vinitialY; 986 var vxOffset = 0; 987 var vyOffset = 0; 988 var vdragItem = m; 989 function vdragStart(e) { 990 i.vdragging = true; 991 vactive = true; 992 m.addClass('qtmplayer-touch'); 993 } 994 function vdragEnd(e) { 995 i.vdragging = false; 996 vactive = false; 997 m.removeClass('qtmplayer-touch'); 998 } 999 function vdrag(e) { 1000 off = c.offset().top - $(window).scrollTop(); 1001 if(vactive){ 1002 ol = c.offset().top; 1003 w = c.outerHeight(); 1004 if (e.type === "touchmove") { 1005 l = off - e.originalEvent.touches[0].pageY; 1006 } else { 1007 l = off - e.clientY; 1008 } 1009 vrelocate(100 - Math.abs(l) ); 1010 } 1011 } 1012 function vrelocate(l){ 1013 if(l < 0 ){ 1014 l = 0; 1015 } 1016 if(l > 95 ){ 1017 l = 100; 1018 } 1019 m.css({'top': 100 -l}); 1020 p = l; 1021 f.css({'height':p+'%'}); 1022 $.qtPlayerObj.uniPlayer.setVolume(p); 1023 if(p > 1){ 1024 if(p < 50){ 1025 vi.html('volume_down'); 1026 } else { 1027 vi.html('volume_up'); 1028 } 1029 } else { 1030 vi.html('volume_off'); 1031 } 1032 } 1033 vi.on('click', function(e){ 1034 e.preventDefault(); 1035 1036 if(p > 1){ 1037 tp = p; 1038 vrelocate(0); 1039 } else { 1040 vrelocate(tp); 1041 } 1042 e.stopPropagation(); 1043 }); 1044 // Boot setup start volume 1045 var mvol = $.qtPlayerObj.masterVolume; 1046 if(mvol !== 100){ 1047 $.qtPlayerObj.uniPlayer.setVolume( mvol ); 1048 vrelocate(mvol); 1049 } 1050 }, 1051 setDuration: function(text){ 1052 if(text === 'NaN:NaN' || text === '00:00'){ 1053 $("#qtmplayerDuration").html(); 1054 return; 1055 } 1056 $("#qtmplayerDuration").html(text); 1057 }, 1058 bufferStart: function(){ 1059 1060 $("#qtmplayerDuration").html('...'); 1061 $("#qtmplayer-buffer").show(); 1062 $('#qtMplayerMiniCue, #qtMplayerTadv').animate({'opacity':0.4}, 'fast' ).css({'pointer-events': 'none'}); 1063 }, 1064 bufferEnd: function(){ 1065 $("#qtmplayer-buffer").hide(); 1066 var returnAlive = setTimeout(function(){ 1067 $('#qtMplayerMiniCue, #qtMplayerTadv').animate({'opacity':1}, 'fast' ).css({'pointer-events': 'all'}); 1068 }, 300); 1069 1070 }, 1071 screenResize: function(){ 1072 var resizeTimer, 1073 o = $.qtPlayerObj, 1074 i = o.interface, 1075 w = i.window, 1076 ww = w.width(), 1077 wh = w.height(); 1078 w.on('resize', function() { 1079 clearTimeout(resizeTimer); 1080 resizeTimer = setTimeout(function() { 1081 if (w.width() !== ww || w.height() !== wh) { 1082 i.seekBtn(); 1083 $.qtMplayerPlaylistCue.init(); 1084 } 1085 1086 }, 100); 1087 }); 1088 }, 1089 initializeAudio: function() { 1090 var o = $.qtPlayerObj, 1091 i = o.interface; 1092 i.doSpinner(true); 1093 if(qtAnalyzer){ 1094 var hasAudioContext = false;
1095 try { 1096 hasAudioContext = window.AudioContext || window.webkitAudioContext; 1097 } catch(e) { 1098 if($.qtSMPO.init()){ 1099 qtInitialized = true; 1100 return true; 1101 }; 1102 } 1103 if(hasAudioContext !== false){ 1104 o.isSoundApi = true; 1105 if($.qtWebApiPlayer.init()){ 1106 qtInitialized = true; 1107 return true; 1108 } 1109 } 1110 } else { 1111 if($.qtSMPO.init()){ 1112 qtInitialized = true; 1113 return true; 1114 }; 1115 } 1116 }, 1117 resumeAudioOld: function(){ 1118 var o = $.qtPlayerObj, 1119 i = o.interface; 1120 i.initializeAudio(); // Appply new fixes 1121 qtPlayIsAllowed = true; 1122 if(i.autoplay){ 1123 setTimeout( 1124 o.uniPlayer.play, 1125 2200 1126 ); 1127 1128 } 1129 document.removeEventListener("click", i.resumeAudio); 1130 }, 1131 resumeAudio: function(){ 1132 // this seems to break the player by creating sometimes a parallel audio instance 1133 // return; 1134 1135 var o = $.qtPlayerObj, 1136 i = o.interface; 1137 i.log("resumeAudio A"); 1138 i.initializeAudio(); // Appply new fixes 1139 qtPlayIsAllowed = true; 1140 if(i.autoplay){ 1141 i.log("resumeAudio B"); 1142 setTimeout( 1143 function(){ 1144 i.btnPlay.click(); 1145 i.log("resumeAudio A1"); 1146 setTimeout( 1147 function(){ 1148 i.log("resumeAudio AB"); 1149 if(false === i.isMobile()){ 1150 i.log("resumeAudio AB 0"); 1151 } else { 1152 i.btnPlay.click(); 1153 i.log("resumeAudio AB 1"); 1154 } 1155 }, 1156 10 1157 ); 1158 }, 1159 2200 1160 ); 1161 } 1162 i.log("resumeAudio C"); 1163 document.removeEventListener("click", i.resumeAudio); 1164 1165 1166 }, 1167 triucco: function(){ 1168 var b = $('body'), 1169 i = $.qtPlayerObj.interface, 1170 t; 1171 $('#qtmusicplayer').addClass('qt-mplayer-mobile'); 1172 i.initializeAudio(); 1173 i.resumeAudio(); 1174 b.addClass("qt-mplayer-enabled"); 1175 i.log('mobile player enabled'); 1176 setTimeout( 1177 function(){ 1178 i.doSpinner(); 1179 }, 1180 1200 1181 ); 1182 1183 }, 1184 log: function(m){ 1185 var c = $("#qtmPlayerDebugger"); 1186 if(c.length > 0){ 1187 c.append(m+'<br>'); 1188 } 1189 }, 1190 1191 }, 1192 initPlayer: function(){ 1193 if(qtPlayDebug){ 1194 $('#qtmplayer-playlist').append('<div class="qtmplayer__debugger" id="qtmPlayerDebugger"><h5>Player Debug</h5></div>'); 1195 } 1196 var o = $.qtPlayerObj, 1197 i = o.interface, 1198 c = i.controls, 1199 b = i.body, 1200 ot; // ot = outTimer 1201 o.songdata = {}; 1202 b.addClass("qtmplayer-enabled"); 1203 $(document).on("click", "[data-playlistopen]", function(){ 1204 b.toggleClass("qtmplayer-openplaylist"); 1205 }); 1206 b.on("click", "[data-playeropen]", function(){ 1207 b.toggleClass("qtmplayer-open"); 1208 }); 1209 c.find('.qtmplayer__cover').html('<img src="">'); 1210 i.qtmplayer.find('.qtmplayer__album').prepend('<img src="">'); 1211 // i.initializeAudio(); // Appply new fixes 1212 // document.addEventListener("click", i.resumeAudio); // trick: if autoplay is enabled and blocked, any click will start audio 1213 1214 if( qtMplayerisMobile ){ 1215 i.triucco(); 1216 1217 } else { 1218 b.addClass("qt-mplayer-enabled"); 1219 } 1220 1221 i.preloadTrack(); 1222 i.prevNext(); 1223 i.appendAlbum(); 1224 i.seekBtn(); 1225 i.volBtn(); 1226 i.bufferEnd(); 1227 i.skipCue(); 1228 i.screenResize(); 1229 c.mouseenter(function(){ 1230 c.addClass('open'); 1231 i.seekBtn(); 1232 clearTimeout(ot); 1233 }).mouseleave(function(){ 1234 ot = setTimeout(function() { 1235 c.removeClass('open'); 1236 }, c.data('hidetimeout')); 1237 }); 1238 }, 1239 }; 1240 $(document).ready(function() { 1241 if(0 === $('#qtmplayer-playlist li').length ){ 1242 return; 1243 } 1244 $.qtPlayerObj.initPlayer(); 1245 }); 1246})(jQuery); 1247 1248 1249 1250
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.