PageSourceSearch

https://rolamix.com/wp-content/plugins/qtmplayer/assets/js/qtmplayer.js

js rolamix.com collected 2026-10-03 00:58:11 UTC 35,320 bytes, 1,250 lines download raw bytes

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.