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 235 if('object' === typeof($.qtmplayerRadioFeedObj)){ // check if the file is loaded 236 $.qtmplayerRadioFeedObj.fn.stopFeed(); 237 } 238 $.qtPlayerObj.interface.justStop(); 239 if( 'radio' === $.qtPlayerObj.songdata.type ){ 240 // With this, after pausing from the bar, music can't restart 241 $.qtPlayerObj.songdata.file_hold = $.qtPlayerObj.songdata.file; // Store stream in a temorary object 242 $.qtPlayerObj.songdata.file = 'file_hold'; // replace stream with a string to block it 243 $.qtPlayerObj.interface.doSpinner(false); 244 if($.qtPlayerObj.isSoundApi === true){ 245 $.qtWebApiPlayer.stop(); 246 } else { 247 $.qtSMPO.smStop(); 248 } 249 250 } else { 251 if($.qtPlayerObj.isSoundApi === true){ 252 $.qtWebApiPlayer.pause(); 253 } else { 254 $.qtSMPO.smPause(); 255 } 256 } 257 }, 258 webapiPlay: function(){ 259 $.qtWebApiPlayer.play($.qtPlayerObj.songdata.file); 260 }, 261 radioFeedCallback:function( feedImageUrl ){ 262 var fallback = $.qtPlayerObj.imgCover.attr('data-fallback'); 263 if(undefined !== feedImageUrl){ 264 $.qtPlayerObj.imgCover.attr( 'src', feedImageUrl ).show(); 265 } else { 266 if(fallback) { 267 $.qtPlayerObj.imgCover.attr('src', fallback).show(); 268 } else { 269 $.qtPlayerObj.imgCover.hide(); 270 } 271 } 272 }, 273 play: function(){ 274 275 if ($.qtPlayerObj.uniPlayer.btnPlay.find("i.material-icons").html() === 'pause') { 276 return; 277 } 278 if(qtInitialized && qtPlayIsAllowed){ 279 280 281 $.qtPlayerObj.uniPlayer.btnPlay.find("i.material-icons").html("pause"); 282 if($.qtPlayerObj.isSoundApi === true){ 283 $.qtWebApiPlayer.play($.qtPlayerObj.songdata.file); 284 } else { 285 if( 'radio' === $.qtPlayerObj.songdata.type && 'file_hold' === $.qtPlayerObj.songdata.file ){ 286 $.qtPlayerObj.songdata.file = $.qtPlayerObj.songdata.file_hold; 287 // FIX-2021-06-16_01 - set volume fix after change track 288 // fix issue when after pause the feed doesn't restart 289 $.qtmplayerRadioFeedObj.fn.pushFeed( $.qtPlayerObj.songdata ); 290 } 291 $.qtSMPO.smPause(); 292 $.qtSMPO.smPlay(); 293 } 294 // FIX-2021-06-16_02 - set volume fix after change track 295 setTimeout( 296 function(){ 297 if($.qtPlayerObj.masterVolume !== 100){ 298 var mvol = $.qtPlayerObj.masterVolume; 299 $.qtPlayerObj.uniPlayer.setVolume( mvol ); 300 $("[data-qtmplayer-vball]").css({'top': 100 - mvol}); 301 $("[data-qtmplayer-vfill]").css({'height':mvol+'%'}); 302 } 303 }, 300 304 ); 305 } 306 }, 307 seek: function(p){ // p = percentage 308 if(isNaN(p)){ 309 return; 310 } 311 p = parseFloat(p); 312 if(p > 100){ 313 p = 100; 314 } 315 if($.qtPlayerObj.isSoundApi === true){ 316 $.qtWebApiPlayer.seek(p); 317 } else { 318 $.qtSMPO.smSeek(p); 319 } 320 }, 321 seekTime: function(t){ 322 if(t === '00:00'){ 323 t = '00:00:00'; 324 } 325 if($.qtPlayerObj.isSoundApi === true){ 326 $.qtWebApiPlayer.seekTime(t); 327 } else { 328 $.qtSMPO.smSeekTime(t); 329 } 330 }, 331 setVolume: function(v){ 332 $.qtPlayerObj.masterVolume = v; 333 if($.qtPlayerObj.isSoundApi === true){ 334 $.qtWebApiPlayer.setvolume(v / 100); 335 } else { 336 $.qtSMPO.sm.setVolume(v); 337 } 338 } 339 }, 340 341 342 /** 343 * ================================================================ 344 * 345 * [interface functions controlling interaction and visual feedback] 346 * @type {Object} 347 * 348 * ================================================================ 349 */ 350 interface: { 351 window: $(window), 352 body: $("body"), 353 htmlAndbody: $('html,body'), 354 player: $('#qtmplayer'),
355 controls: $('#qtmplayer-controls'), 356 qtmplayer: $('#qtmplayer-playlistcontainer'), 357 playlist: $("#qtmplayer-playlist ul"), 358 grooveadv: $('#qtMplayerTadv'), // music cue 359 buffer: $('#qtMplayerBuffer'), // buffer 360 progWave: $('#qtMplayerprogWave'), // buffer 361 advance: $("#qtMplayerTadv"), 362 btnPlay: $("[data-qtmplayer-playbtn]"), // $("#qtmplayerPlay"), 363 364 control: $("#qtmplayerTrackControl"), 365 minicue: $("#qtMplayerMiniCue"), 366 minicueT: $("#qtMplayerPlaylistTrackMinicue"), 367 trackAdvance: $("#qtmplayerTrackAdv"), 368 time: $("#qtmplayerTime"), 369 autoplay: $('#qtmplayer').data('autoplay'), 370 artwork: $('#qtmplayer').data('artwork'), 371 dragging: false, 372 vdragging: false, 373 debug: function(msg){ 374 $("#qtmplayerDebug").prepend(msg+'<br>'); 375 }, 376 doSpinner: function(state, content){ 377 var notif = $('[data-qtmplayerNotif]'); 378 notif.html(content); 379 if( true === state ){ 380 notif.addClass("active qtmplayer-spinner"); 381 } else { 382 notif.removeClass("active").removeClass("qtmplayer-spinner"); 383 } 384 }, 385 preloadTrack: function(){ 386 var p = $.qtPlayerObj, 387 i = p.interface; 388 p.interface.doSpinner(true); 389 i.playlist.find("li:first-child .qtmplayer-play-btn").each(function(i,c){ 390 var trk = $(c), 391 q = 'qtmplayer-'; 392 393 p.songdata = {}; 394 $.each(trk.data() , function(i,c){ 395 var newKey = i.replace("qtmplayer", "").toLowerCase(); 396 p.songdata[newKey] = c; 397 }); 398 399 400 $('.qtmplayer-played').removeClass('qtmplayer-played'); 401 trk.closest(".qtmplayer-trackitem").addClass("qtmplayer-played"); 402 var c = $.qtPlayerObj.interface.controls, 403 ot = false; 404 if(qtShowPlayer){ 405 p.interface.showhide(); 406 } 407 408 409 if(p.interface.deployTrack()){ 410 if(p.interface.autoplay){ 411 setTimeout( 412 p.uniPlayer.play, 413 2200 414 ); 415 } 416 } 417 }); 418 }, 419 420 isMobile: function(){ 421 return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || $.ProRadioMainObj.window.width() < 1170 ; 422 }, 423 424 425 deployTrack: function(autoplay){ 426 var o = $.qtPlayerObj, 427 i = o.interface, 428 hd = i.controls, 429 dt = o.songdata, 430 mp = i.qtmplayer, 431 durtime = $("#qtmplayerDuration"), 432 cartlink, 433 cartbt = hd.find('.qtmplayer__cart'), 434 cur_url = window.location.href, 435 wc_params = '', 436 wc_classes = '', 437 params, // for URL 438 params_str; // for URL 439 if(dt.file == ''){ 440 return; 441 } 442 443 444 if(true === qtMplayerisMobile && $.qtPlayerObj.songdata.file_mobile ){ 445 $.qtPlayerObj.songdata.file = $.qtPlayerObj.songdata.file_mobile; 446 } 447 448 449 i.doSpinner(true); 450 451 if(false == qtInitialized){ 452 setTimeout( 453 i.doSpinner, 454 1000 455 ); 456 } 457 458 if( 'radio' === dt.type ){ 459 i.minicue.hide(); 460 i.buffer.hide(); 461 i.trackAdvance.hide(); 462 durtime.hide(); 463 $('#qtmplayerTrackControl canvas').remove(); 464 if( $.qtmplayerRadioFeedObj ){ 465 $.qtPlayerObj.songdata.callBack = false; 466 if( $.qtPlayerObj.interface.artwork ){ 467 $.qtPlayerObj.imgCover = $.qtPlayerObj.interface.controls.find('.qtmplayer__cover img'); 468 var original = $.qtPlayerObj.imgCover.attr('src'); 469 if( original ){ 470 $.qtPlayerObj.imgCover.attr('data-fallback', original); 471 } 472 $.qtPlayerObj.interface.controls.find('.qtmplayer__cover img').attr('data-fallback', original); 473 $.qtPlayerObj.songdata.callBack = $.qtPlayerObj.uniPlayer.radioFeedCallback; 474 } 475 $.qtmplayerRadioFeedObj.fn.pushFeed( $.qtPlayerObj.songdata ); 476 } 477 } else { 478 if( $.qtmplayerRadioFeedObj ){ 479 $.qtmplayerRadioFeedObj.fn.stopFeed(); 480 } 481 482 i.minicue.show(); 483 i.buffer.show(); 484 i.trackAdvance.show(); 485 durtime.show(); 486 if( false === i.isMobile() ){ 487 var comp = new RegExp(location.host); 488 try { 489 if(comp.test( dt.file ) && 'function' === typeof(qtDrawAudio)){ 490 qtDrawAudio(dt.file); 491 } else { 492 $('#qtmplayerTrackControl canvas').remove(); 493 } 494 } catch(e){ 495 console.log(e); 496 } 497 } 498 } 499 500 501 if( dt.link !== ''){ 502 hd.find('.qtmplayer__title').html('<a href="'+dt.link+'"><strong>'+dt.title+'</strong></a> '); 503 } else { 504 hd.find('.qtmplayer__title').html(dt.title); 505 } 506 507 508 hd.find('.qtmplayer__artist').text(dt.artist); 509 if(typeof( dt.album ) !== 'undefined' && dt.album !== ''){ 510 hd.find('.qtmplayer__title').append('['+dt.album+']'); 511 } 512 hd.find('.qtmplayer__cover').attr("href", dt.link); 513 // WooCommerce support added 514 cartbt.addClass('qtmplayer__disabled'); 515 if(dt.buylink !== ''){ 516 517 cartbt.removeClass('qtmplayer__disabled'); 518 // WooCommerce 519 cartlink = dt.buylink; 520 if('undefined' !== typeof( dt.buylink )) { 521 dt.buylink = dt.buylink.toString(); 522 if (dt.buylink.match(/^-?\d+$/)) { // is a numeric ID 523 params = { "add-to-cart":dt.buylink }; 524 params_str = jQuery.param( params ); 525 if(cur_url.indexOf('?') != -1) { 526 cartlink = cur_url+"&"+params_str; 527 }else{ 528 cartlink = cur_url+"?"+params_str; 529 } 530 // Extra cart classes and attrs 531 wc_classes = ' product_type_simple add_to_cart_button ajax_add_to_cart '; 532 cartbt.attr("href", cartlink).attr('data-quantity','1').attr('data-product_id', dt.buylink).addClass(wc_classes).show(); 533 } else { 534 cartbt.attr("href", dt.buylink).removeClass('product_type_simple').removeClass('add_to_cart_button').removeClass('ajax_add_to_cart').show(); 535 536 } 537 } 538 } else { 539 cartbt.removeClass('product_type_simple').removeClass('add_to_cart_button').removeClass('ajax_add_to_cart'); 540 } 541 542 if(dt.icon == 'download') { 543 dt.icon = 'file_download'; 544 } 545 if(dt.buylink == ''){ 546 cartbt.hide(); 547 } else { 548 cartbt.show(); 549 } 550 551 cartbt.find('i').html(dt.icon); 552 553 i.advance.width(0); 554 i.buffer.width(0); 555 if(dt.cover !== '' && dt.cover !== undefined){ 556 mp.find('.qtmplayer__album img').attr("src", dt.cover).show(); 557 hd.find('.qtmplayer__cover img').attr("src", dt.cover).show(); 558 hd.find('.qtmplayer__bgimg').css({"background-image": 'url('+dt.cover+')' }); 559 } else { 560 mp.find('.qtmplayer__album img').hide(); 561 hd.find('.qtmplayer__cover img').hide(); 562 hd.find('.qtmplayer__bgimg').css({"background-image": 'none' }); 563 } 564 mp.find('.qtmplayer-albumlink').attr("href",dt.link); 565 if(qtShowPlayer){ 566 i.showhide(); 567 } 568 569 570 571 572 i.btnPlayClick(); 573 i.playTrack(); 574 if(autoplay){ 575 o.uniPlayer.play(); 576 } 577 return true; 578 }, 579 btnPlaySetup: function(dt){ 580 var state = 'pause', 581 o = $.qtPlayerObj, 582 i = o.interface, 583 b = i.btnPlay, 584 p = o.uniPlayer; 585 586 b.off("click"); 587 b.on("click", function(e){ 588 e.preventDefault(); 589 state = b.find("i").html(); 590 if(state === 'pause'){ 591 $(".qtmplayer-played .qtmplayer-play-btn").click(); 592 } else { 593 $('#qtmplayer-playlist li:first-child').find(".qtmplayer-play-btn").click(); 594 } 595 }); 596 }, 597 /** 598 * Questa funzione è probabilmente inutile adesso 599 */ 600 btnPlayClick: function(){ 601 var state = 'pause', 602 o = $.qtPlayerObj, 603 i = o.interface, 604 b = i.btnPlay, 605 p = o.uniPlayer; 606 b.off("click"); 607 b.on("click", function(e){ 608 e.preventDefault(); 609 // state = b.find("i").html(); 610 state = b.find("i.material-icons").html(); 611 if(state === 'pause'){ 612 p.pause(); 613 } else { 614 if(false == qtInitialized){ 615 i.doSpinner(true); 616 i.initializeAudio(); 617 qtPlayIsAllowed = true; 618 setTimeout( 619 p.play, 620 200 621 ); 622 } else { 623 // if(state === 'pause'){ 624 // p.pause(); 625 // } else { 626 qtPlayIsAllowed = true; 627 p.play(); 628 // } 629 } 630 } 631 return true; 632 }); 633 }, 634 playTrack: function(){ 635 var p = $.qtPlayerObj, 636 i = p.interface, 637 u = p.uniPlayer;
638 i.body.off("click", ".qtmplayer-play-btn"); 639 i.body.on("click", ".qtmplayer-play-btn", function(e){ 640 e.preventDefault(); 641 qtPlayIsAllowed = true; 642 i.doSpinner(true); 643 var tr = $(this), 644 item = tr.closest(".qtmplayer-trackitem"), 645 isDonut = item.hasClass("qtmplayer-donut"), 646 icon = tr.find("i"), 647 clickedsong = tr.attr('data-qtmplayer-file'), 648 playedclass = "qtmplayer-played", 649 playedtrack = i.body.find("."+playedclass), 650 iplay = "dripicons-media-play", 651 ipause = "dripicons-media-pause"; 652 if(item.hasClass(playedclass) && tr.find('i').html() === 'pause'){ 653 i.switchicon(icon, 'play'); 654 item.removeClass(playedclass); 655 i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play'); 656 u.pause(); 657 e.stopPropagation(); 658 return; 659 } else { 660 // Check if is the same track. If yes pause, if not stop the first play the second 661 // update 2019 05 22 662 if(clickedsong === p.songdata.file) { 663 if(playedtrack.length > 0){ 664 665 if(p.uniPlayer.btnPlay.find("i.material-icons").html() === 'pause'){ 666 playedtrack.removeClass(playedclass); 667 i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play'); 668 u.pause(); 669 e.stopPropagation(); 670 return; 671 } else { 672 u.pause(); 673 i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play'); 674 playedtrack.removeClass(playedclass); 675 } 676 677 } 678 } else { 679 i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play'); 680 playedtrack.removeClass(playedclass); 681 i.justStop(); 682 u.pause(); 683 } 684 685 686 if( undefined === tr.data("qtmplayer-type") ){ 687 tr.data("qtmplayer-type", 'track'); 688 } 689 690 691 // 2019 12 29 new faster remapping of data 692 p.songdata = {}; 693 694 $.each(tr.data() , function(i,c){ 695 var newKey = i.replace("qtmplayer", "").toLowerCase(); 696 p.songdata[newKey] = c; 697 }); 698 699 i.seekBtn(); 700 i.switchicon(icon, 'pause'); 701 item.addClass(playedclass); 702 if($("#qtdonut").length > 0){ 703 $("#qtdonut").removeAttr("id"); 704 } 705 if(isDonut){ 706 item.attr("id", "qtdonut"); 707 $.qtMplayerPlaylistCue.destroy(); 708 if( 'track' === p.songdata.type){ 709 $.qtRaphaelCircle.init(); 710 } 711 } else { 712 if( 'track' === p.songdata.type){ 713 $.qtMplayerPlaylistCue.init(); 714 } 715 } 716 i.deployTrack(); 717 // safe initialization 718 if(false == qtInitialized){ 719 i.initializeAudio(); 720 i.doSpinner(true); 721 setTimeout( 722 u.play, 723 2200 724 ); 725 } else { 726 u.play(); 727 } 728 729 // u.play(); 730 } 731 e.stopPropagation(); 732 }); 733 }, 734 735 switchicon: function(i, state) { 736 if(state === 'play'){ 737 i.html('play_arrow'); 738 } else if (state === 'pause') { 739 i.html('pause'); 740 } 741 }, 742 progressUpdate: function(perc){ // buffered 743 var i = $.qtPlayerObj.interface, 744 p = perc * 100; 745 i.buffer.css({width: p+'%'}); 746 i.minicue.addClass('actvd'); 747 748 }, 749 timeupdate: function(perc, time){ 750 var i = $.qtPlayerObj.interface, 751 p = perc * 100; 752 i.advance.css({width: (p)+'%'}); 753 i.time.html(time); 754 if(perc > 0.001){ 755 i.doSpinner(); 756 setTimeout( 757 i.doSpinner, 758 300 759 ); 760 } 761 if($('#qtMplayerprogWave')){ 762 $('#qtMplayerprogWave').css({width: (p)+'%'}); 763 } 764 if(i.dragging === false) { 765 i.minicue.css({left: (p)+'%'}); 766 } 767 }, 768 seekBtn: function(){ 769 var o = $.qtPlayerObj, 770 i = o.interface, 771 c = i.control, 772 m = i.minicue, 773 ol = c.offset().left, 774 w = c.outerWidth(), 775 t = (o.songdata.type == 'radio') ? 'radio' : 'track', 776 l, 777 active = false, 778 currentX, currentY, initialX, initialY, 779 xOffset = 0; 780 yOffset = 0; 781 dragItem = m; 782 c.off("touchstart").off("touchend").off('touchmove').off('mousedown').off('mouseup').off('mouseleave').off('mousemove'); 783 if(t === 'radio') { 784 m.css({'left': 0}); 785 } else { 786 c.on("touchstart", dragStart); 787 c.on("touchend", dragEnd); 788 c.on("touchmove", drag); 789 c.on("mousedown", dragStart); 790 c.on("mouseup", dragEnd); 791 c.on("mouseleave", dragEnd); 792 c.on("mousemove", drag); 793 function dragStart(e) { 794 i.dragging = true; 795 active = true; 796 m.addClass('qtmplayer-touch'); 797 } 798 function dragEnd(e) { 799 i.dragging = false;
800 active = false; 801 m.removeClass('qtmplayer-touch'); 802 } 803 function drag(e) { 804 ol = c.offset().left; 805 w = c.outerWidth(); 806 if (e.type === "touchmove") { 807 l = e.originalEvent.touches[0].pageX - ol; 808 } else { 809 l = e.clientX - ol; 810 } 811 if(active){ 812 relocate(l); 813 } 814 } 815 function relocate(l){ 816 var p = l / w; 817 if( p < 0 || p > 99.9 ){ 818 return; 819 } 820 m.css({'left': l}); 821 o.uniPlayer.seek(p * 100); 822 } 823 } 824 }, 825 appendAlbum: function(){ 826 var p = $.qtPlayerObj, 827 i = p.interface, 828 c = i.controls, 829 cartlink, 830 cur_url = window.location.href, 831 wc_params = '', 832 wc_classes = '', 833 params, // for URL 834 params_str, // for URL 835 ot = false, // timeout 836 notif = $('[data-qtmplayerNotif]'); 837 i.body.on("click", "[data-qtmplayer-addrelease]", function(e){ 838 e.preventDefault(); 839 var that = $(this), 840 url = that.data("qtmplayer-addrelease"), 841 playnow = that.data("playnow"), 842 latestAdded = 'qtmplayer-latestadded'; 843 if(that.data("qtmplayer-addrelease") == '0' || that.hasClass("disabled")){ 844 return; 845 } 846 $.getJSON(url, function( data ) { 847 var newitem, 848 special_action, 849 tn = data.length; 850 $.each( data, function( key, val ) { 851 // WooCommerce 852 cartlink = val.buylink; 853 if (val.buylink.match(/^-?\d+$/)) { // is a numeric ID 854 params = { "add-to-cart":val.buylink }; 855 params_str = jQuery.param( params ); 856 if( cur_url) { 857 if( cur_url.indexOf("?")>= 0 ) { 858 cartlink = cur_url+"&"+params_str; 859 }else{ 860 cartlink = cur_url+"?"+params_str; 861 } 862 } 863 // Extra cart classes and attrs 864 wc_classes = ' product_type_simple add_to_cart_button ajax_add_to_cart '; 865 wc_params = ' data-quantity="1" data-product_id="'+ val.buylink +'" '; 866 } 867 special_action = '<i class="material-icons">'+val.icon+'</i>'; 868 if( typeof(val.price) !== 'undefined'){ 869 if (val.price !== ''){ 870 special_action = '<span class="qtmplayer-price qtmplayer-btn qtmplayer-btn-xs qtmplayer-btn-primary">'+val.price+'</span>'; 871 } 872 } 873 newitem = '<li class="qtmplayer-trackitem dynamic">'; 874 if(val.cover !== ''){ 875 newitem += '<img src="'+val.cover+'">'; 876 } 877 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>'; 878 i.playlist.append(newitem); 879 if(0 === key && playnow){ 880 $.qtPlayerObj.interface.justStop(); 881 $.qtPlayerObj.uniPlayer.pause(); 882 p.songdata = val; 883 $("."+latestAdded).click(); 884 } 885 latestAdded = ''; 886 }); 887 i.showhide(); 888 if(that.data("clickonce") === 1){ 889 that.hide(); 890 891 $(that.data("notificate")).addClass("active"); 892 893 } else { 894 that.addClass('disabled'); 895 896 } 897 notif.addClass("wait").delay(1500).promise().done(function(){ 898 notif.removeClass("wait"); 899 }); 900 // Disable the functionality 901 that.attr("data-qtmplayer-addrelease", '0'); 902 }); 903 }); 904 }, 905 showhide: function(){ 906 var c = $.qtPlayerObj.interface.controls; 907 c.addClass('open'); 908 ot = setTimeout(function() { 909 c.removeClass('open'); 910 clearTimeout(ot); 911 }, 4000); 912 }, 913 prevNext: function(){ 914 $.qtPlayerObj.interface.controls.on("click",".qtmplayer__prev, .qtmplayer__next", function(e){ 915 e.preventDefault(); 916 var t = $(this), b; 917 $.qtPlayerObj.interface.doSpinner(true);
918 if(t.data("control") === "prev"){ 919 b = $(".qtmplayer-played").prev(); 920 } else { 921 b = $(".qtmplayer-played").next(); 922 } 923 b.find(".qtmplayer-play-btn").click(); 924 }); 925 }, 926 next: function(){ 927 var i = $.qtPlayerObj.interface, 928 nt = $(".qtmplayer-played").next(); 929 if(nt !== undefined){ 930 if(nt.length > 0){ 931 nt.find(".qtmplayer-play-btn").click(); 932 } else { 933 i.justStop(); 934 } 935 } else { 936 i.justStop(); 937 } 938 }, 939 justStop: function(){ 940 $.qtPlayerObj.interface.switchicon($(".qtmplayer-played .qtmplayer-play-btn i.material-icons"), 'play'); 941 $.qtPlayerObj.uniPlayer.btnPlay.find("i.material-icons").html("play_arrow"); 942 }, 943 skipCue: function(){ 944 var o = $.qtPlayerObj, 945 i = o.interface; 946 i.body.on('click', '[data-qtplayercue]',function(){ 947 var t = $(this), 948 k = t.data('qttrackurl'), 949 c = t.data('qtplayercue'); 950 if("undefined" === typeof( o.songdata.type )) { 951 return; 952 } 953 if(o.songdata.file === k) { 954 o.uniPlayer.seekTime(c); 955 } 956 }); 957 }, 958 volBtn: function(){ 959 var o = $.qtPlayerObj, 960 i = o.interface, 961 c = $("[data-qtmplayer-vcontrol]"); 962 if( 0 === c.length ){ return; } 963 var ol = c.offset().top, 964 w = c.outerHeight(), 965 ct = $("[data-qtmplayer-vtrack]"), // cue 966 f = $("[data-qtmplayer-vfill]"), // fill 967 m = $("[data-qtmplayer-vball]"), // fill 968 off = c.offset().top, 969 h = c.height(), 970 vi = $('[data-qtmplayer-vicon]'), 971 t, // top 972 p = 100, // percentage 973 tp = 100, // volume before muting to unmute 974 d; // delta 975 c.on("touchstart", vdragStart); 976 c.on("touchend", vdragEnd); 977 c.on("touchmove", vdrag); 978 c.on("mousedown", vdragStart); 979 c.on("mouseup", vdragEnd); 980 c.on("mouseleave", vdragEnd); 981 c.on("mousemove", vdrag); 982 var vactive = false; 983 var vcurrentX; 984 var vcurrentY; 985 var vinitialX; 986 var vinitialY; 987 var vxOffset = 0; 988 var vyOffset = 0; 989 var vdragItem = m; 990 function vdragStart(e) { 991 i.vdragging = true; 992 vactive = true; 993 m.addClass('qtmplayer-touch'); 994 } 995 function vdragEnd(e) { 996 i.vdragging = false; 997 vactive = false; 998 m.removeClass('qtmplayer-touch'); 999 } 1000 function vdrag(e) { 1001 off = c.offset().top - $(window).scrollTop(); 1002 if(vactive){ 1003 ol = c.offset().top; 1004 w = c.outerHeight(); 1005 if (e.type === "touchmove") { 1006 l = off - e.originalEvent.touches[0].pageY; 1007 } else { 1008 l = off - e.clientY; 1009 } 1010 vrelocate(100 - Math.abs(l) ); 1011 } 1012 } 1013 function vrelocate(l){ 1014 if(l < 0 ){ 1015 l = 0; 1016 } 1017 if(l > 95 ){ 1018 l = 100; 1019 } 1020 m.css({'top': 100 -l}); 1021 p = l; 1022 f.css({'height':p+'%'}); 1023 $.qtPlayerObj.uniPlayer.setVolume(p); 1024 if(p > 1){ 1025 if(p < 50){ 1026 vi.html('volume_down'); 1027 } else { 1028 vi.html('volume_up'); 1029 } 1030 } else { 1031 vi.html('volume_off'); 1032 } 1033 } 1034 vi.on('click', function(e){ 1035 e.preventDefault(); 1036 1037 if(p > 1){ 1038 tp = p; 1039 vrelocate(0); 1040 } else { 1041 vrelocate(tp); 1042 } 1043 e.stopPropagation(); 1044 }); 1045 // Boot setup start volume 1046 var mvol = $.qtPlayerObj.masterVolume; 1047 if(mvol !== 100){ 1048 $.qtPlayerObj.uniPlayer.setVolume( mvol ); 1049 vrelocate(mvol); 1050 } 1051 }, 1052 setDuration: function(text){ 1053 if(text === 'NaN:NaN' || text === '00:00'){ 1054 $("#qtmplayerDuration").html(); 1055 return; 1056 } 1057 $("#qtmplayerDuration").html(text); 1058 }, 1059 bufferStart: function(){ 1060 1061 $("#qtmplayerDuration").html('...'); 1062 $("#qtmplayer-buffer").show(); 1063 $('#qtMplayerMiniCue, #qtMplayerTadv').animate({'opacity':0.4}, 'fast' ).css({'pointer-events': 'none'}); 1064 }, 1065 bufferEnd: function(){ 1066 $("#qtmplayer-buffer").hide(); 1067 var returnAlive = setTimeout(function(){ 1068 $('#qtMplayerMiniCue, #qtMplayerTadv').animate({'opacity':1}, 'fast' ).css({'pointer-events': 'all'}); 1069 }, 300); 1070 1071 }, 1072 screenResize: function(){ 1073 var resizeTimer, 1074 o = $.qtPlayerObj, 1075 i = o.interface, 1076 w = i.window, 1077 ww = w.width(), 1078 wh = w.height(); 1079 w.on('resize', function() { 1080 clearTimeout(resizeTimer); 1081 resizeTimer = setTimeout(function() { 1082 if (w.width() !== ww || w.height() !== wh) { 1083 i.seekBtn(); 1084 $.qtMplayerPlaylistCue.init(); 1085 } 1086 1087 }, 100); 1088 }); 1089 }, 1090 initializeAudio: function() { 1091 var o = $.qtPlayerObj, 1092 i = o.interface; 1093 i.doSpinner(true); 1094 if(qtAnalyzer){ 1095 var hasAudioContext = false;
1096 try { 1097 hasAudioContext = window.AudioContext || window.webkitAudioContext; 1098 } catch(e) { 1099 if($.qtSMPO.init()){ 1100 qtInitialized = true; 1101 return true; 1102 }; 1103 } 1104 if(hasAudioContext !== false){ 1105 o.isSoundApi = true; 1106 if($.qtWebApiPlayer.init()){ 1107 qtInitialized = true; 1108 return true; 1109 } 1110 } 1111 } else { 1112 if($.qtSMPO.init()){ 1113 qtInitialized = true; 1114 return true; 1115 }; 1116 } 1117 }, 1118 resumeAudioOld: function(){ 1119 var o = $.qtPlayerObj, 1120 i = o.interface; 1121 i.initializeAudio(); // Appply new fixes 1122 qtPlayIsAllowed = true; 1123 if(i.autoplay){ 1124 setTimeout( 1125 o.uniPlayer.play, 1126 2200 1127 ); 1128 1129 } 1130 document.removeEventListener("click", i.resumeAudio); 1131 }, 1132 resumeAudio: function(){ 1133 // this seems to break the player by creating sometimes a parallel audio instance 1134 // return; 1135 1136 var o = $.qtPlayerObj, 1137 i = o.interface; 1138 i.log("resumeAudio A"); 1139 i.initializeAudio(); // Appply new fixes 1140 qtPlayIsAllowed = true; 1141 if(i.autoplay){ 1142 i.log("resumeAudio B"); 1143 setTimeout( 1144 function(){ 1145 i.btnPlay.click(); 1146 i.log("resumeAudio A1"); 1147 setTimeout( 1148 function(){ 1149 i.log("resumeAudio AB"); 1150 if(false === i.isMobile()){ 1151 i.log("resumeAudio AB 0"); 1152 } else { 1153 i.btnPlay.click(); 1154 i.log("resumeAudio AB 1"); 1155 } 1156 }, 1157 10 1158 ); 1159 }, 1160 2200 1161 ); 1162 } 1163 i.log("resumeAudio C"); 1164 document.removeEventListener("click", i.resumeAudio); 1165 1166 1167 }, 1168 triucco: function(){ 1169 var b = $('body'), 1170 i = $.qtPlayerObj.interface, 1171 t; 1172 $('#qtmusicplayer').addClass('qt-mplayer-mobile'); 1173 i.initializeAudio(); 1174 i.resumeAudio(); 1175 b.addClass("qt-mplayer-enabled"); 1176 i.log('mobile player enabled'); 1177 setTimeout( 1178 function(){ 1179 i.doSpinner(); 1180 }, 1181 1200 1182 ); 1183 1184 }, 1185 log: function(m){ 1186 var c = $("#qtmPlayerDebugger"); 1187 if(c.length > 0){ 1188 c.append(m+'<br>'); 1189 } 1190 }, 1191 1192 }, 1193 initPlayer: function(){ 1194 if(qtPlayDebug){ 1195 $('#qtmplayer-playlist').append('<div class="qtmplayer__debugger" id="qtmPlayerDebugger"><h5>Player Debug</h5></div>'); 1196 } 1197 var o = $.qtPlayerObj, 1198 i = o.interface, 1199 c = i.controls, 1200 b = i.body, 1201 ot; // ot = outTimer 1202 o.songdata = {}; 1203 b.addClass("qtmplayer-enabled"); 1204 $(document).on("click", "[data-playlistopen]", function(){ 1205 b.toggleClass("qtmplayer-openplaylist"); 1206 }); 1207 b.on("click", "[data-playeropen]", function(){ 1208 b.toggleClass("qtmplayer-open"); 1209 }); 1210 c.find('.qtmplayer__cover').html('<img src="">'); 1211 i.qtmplayer.find('.qtmplayer__album').prepend('<img src="">'); 1212 // i.initializeAudio(); // Appply new fixes 1213 // document.addEventListener("click", i.resumeAudio); // trick: if autoplay is enabled and blocked, any click will start audio 1214 1215 if( qtMplayerisMobile ){ 1216 i.triucco(); 1217 1218 } else { 1219 b.addClass("qt-mplayer-enabled"); 1220 } 1221 1222 i.preloadTrack(); 1223 i.prevNext(); 1224 i.appendAlbum(); 1225 i.seekBtn(); 1226 i.volBtn(); 1227 i.bufferEnd(); 1228 i.skipCue(); 1229 i.screenResize(); 1230 c.mouseenter(function(){ 1231 c.addClass('open'); 1232 i.seekBtn(); 1233 clearTimeout(ot); 1234 }).mouseleave(function(){ 1235 ot = setTimeout(function() { 1236 c.removeClass('open'); 1237 }, c.data('hidetimeout')); 1238 }); 1239 }, 1240 }; 1241 $(document).ready(function() { 1242 if(0 === $('#qtmplayer-playlist li').length ){ 1243 return; 1244 } 1245 $.qtPlayerObj.initPlayer(); 1246 }); 1247})(jQuery); 1248 1249 1250 1251
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.