1$ = jQuery; 2var elementAudio = document.createElement("audio"); // Object for iOS audio 3elementAudio.crossOrigin = "anonymous"; 4 5var elementAudioSingle = document.createElement("audio"); 6elementAudioSingle.crossOrigin = "anonymous"; 7 8var srp_startingTime = 0; // Used by the sonaar_ts (time stamp) shortcode 9var srp_lyricsAreScrolling = false; 10var myVueAr = []; 11var myVueTag = []; 12var myVueRange = []; 13var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent); 14var webAudioNotSupported; 15 16IRON.canvasAnimation = []; 17IRON.rangeSelector = []; 18IRON.previousTrackThreshold = 2; //The number of seconds a track must play before the "Previous" button resets the track to the beginning. 19 20sonaar_music.option.tooltip_tracklist_btn = (typeof sonaar_music.option.tooltip_tracklist_btn === 'undefined') ? 'View Tracklist' : sonaar_music.option.tooltip_tracklist_btn; 21sonaar_music.option.tooltip_rwd_btn = (typeof sonaar_music.option.tooltip_rwd_btn === 'undefined') ? 'Rewind 15 seconds' : sonaar_music.option.tooltip_rwd_btn; 22sonaar_music.option.tooltip_prev_btn = (typeof sonaar_music.option.tooltip_prev_btn === 'undefined') ? 'Previous' : sonaar_music.option.tooltip_prev_btn; 23sonaar_music.option.tooltip_play_btn = (typeof sonaar_music.option.tooltip_play_btn === 'undefined') ? 'Play/Pause' : sonaar_music.option.tooltip_play_btn; 24sonaar_music.option.tooltip_next_btn = (typeof sonaar_music.option.tooltip_next_btn === 'undefined') ? 'Next' : sonaar_music.option.tooltip_next_btn; 25sonaar_music.option.tooltip_fwrd_btn = (typeof sonaar_music.option.tooltip_fwrd_btn === 'undefined') ? 'Forward 30 seconds' : sonaar_music.option.tooltip_fwrd_btn; 26sonaar_music.option.tooltip_speed_btn = (typeof sonaar_music.option.tooltip_speed_btn === 'undefined') ? 'Speed Rates' : sonaar_music.option.tooltip_speed_btn; 27sonaar_music.option.tooltip_shuffle_btn = (typeof sonaar_music.option.tooltip_shuffle_btn === 'undefined') ? 'Shuffle' : sonaar_music.option.tooltip_shuffle_btn; 28sonaar_music.option.tooltip_repeat_playlist_btn = (typeof sonaar_music.option.tooltip_repeat_playlist_btn === 'undefined') ? 'Enable Repeat' : sonaar_music.option.tooltip_repeat_playlist_btn; 29sonaar_music.option.tooltip_repeat_track_btn = (typeof sonaar_music.option.tooltip_repeat_track_btn === 'undefined') ? 'Enable Repeat Track' : sonaar_music.option.tooltip_repeat_track_btn; 30sonaar_music.option.tooltip_repeat_disable_btn = (typeof sonaar_music.option.tooltip_repeat_disable_btn === 'undefined') ? 'Disable Repeat' : sonaar_music.option.tooltip_repeat_disable_btn; 31sonaar_music.option.tooltip_volume_btn = (typeof sonaar_music.option.tooltip_volume_btn === 'undefined') ? 'Volume' : sonaar_music.option.tooltip_volume_btn; 32 33// iOS 14 and 15 has a bug when using createMediaElementSource.the audio is distorted. Dont use webaudioapi on these versions. Audio Spectrum wont work with iOS 14 and 15. 34if (iOS) { 35 var iOSVersion; 36 var match = navigator.userAgent.match(/OS (\d+)_(\d+)_?(\d+)?/); 37 iOSVersion = [parseInt(match[1], 10), parseInt(match[2], 10), parseInt(match[3] || 0, 10)]; 38 if (iOSVersion[0] < 16) { 39 webAudioNotSupported = true; 40 } 41} 42 43// Set a css varaible for the window height as vh units are not usable on mobile browsers 44IRON.setExtendedPlayerHeightVar = function() { 45 if ( document.getElementById('srp-extendedPlayer-height')) { 46 document.getElementById('srp-extendedPlayer-height').remove(); 47 } 48 var windowHeight = window.innerHeight; 49 var styleTag = document.createElement('style'); 50 styleTag.id = 'srp-extendedPlayer-height'; 51 styleTag.innerHTML = ':root { --srp-extendedPlayer-height: ' + (windowHeight - $('.srp_ext_primary').innerHeight() ) + 'px; }'; 52 document.body.appendChild(styleTag); 53} 54 55IRON.setLimitedSizeObject = function(obj, key, value, maxSize) { // Set a new key value pair in an object and limit the object size 56 obj[key] = value; 57 const keys = Object.keys(obj); 58 if (keys.length > maxSize) { 59 const oldestKey = keys[0]; 60 delete obj[oldestKey]; 61 } 62} 63 64IRON.setTracksTimeMemories = function(audioPlayer, newTime = null, completed = false) { 65 if(audioPlayer.trackMemory){ 66 if( IRON.audioPlayer.stickyEnable && IRON.sonaar.player.waitingAudio ){ // Avoid setting the time memory before the MP3 audio is fully loaded when the sticky player is enabled, to prevent storing an incorrect time. 67 return; 68 } 69 var time = (newTime != null)? newTime : sr_getTrackCurrentTime(audioPlayer); 70 const $currentTrack = audioPlayer.find('.sr-playlist-item').eq(audioPlayer.currentTrack); 71 var trackDuration = sr_setAudioElementInstance(audioPlayer).duration; 72 trackDuration = isNaN(trackDuration) ? 0 : trackDuration; 73 $currentTrack.data('current-time', time); 74 if (IRON.localStorageTrackMemory[$currentTrack.data('track-memory-key')]?.[2] === true) { 75 completed = true; 76 } 77 IRON.setLimitedSizeObject(IRON.localStorageTrackMemory, $currentTrack.data('track-memory-key'), [time, trackDuration, completed], 50); 78 localStorage.setItem('srp_tracks_memories', JSON.stringify(IRON.localStorageTrackMemory) ); 79 } 80} 81 82IRON.fetchThumnbnailsFromItunes = { 83 cachedThumbsArray: [], 84 displayThumbnail: function(img, audioPlayer, track, pos){ 85 const $audioPlayer = $(audioPlayer); 86 const $track = $(track); 87 const isFirstTrackAndNotPlaying = pos === 0 && !$audioPlayer.hasClass('audio-playing'); 88 const isCurrentTrack = $track.hasClass('current');
89 const showArtwork = $audioPlayer.data('hide-artwork') !== '1' && $audioPlayer.data('hide-artwork') !== 'true'; 90 const $albumArtImg = $audioPlayer.find('.album-art img'); 91 92 if (img) { 93 94 if (IRON.sonaar.player.list.tracks ) { 95 if(IRON.sonaar.player.selectedPlayer == audioPlayer || !audioPlayer) { 96 IRON.sonaar.player.list.tracks[pos].poster = img; 97 } 98 } 99 100 if (!audioPlayer) return; 101 102 if (isFirstTrackAndNotPlaying || isCurrentTrack) { 103 if (showArtwork) { 104 $audioPlayer.removeClass('sonaar-no-artwork'); 105 if ($albumArtImg.length) { 106 $albumArtImg.attr('src', img); 107 } else { 108 $audioPlayer.find('.album-art').append('<img src="' + img + '">'); 109 } 110 srp_getColorsFromImage(audioPlayer, img); 111 } 112 } 113 114 $track.data('albumart', img); // Save the img in the track data for setMediaSessionAPI 115 116 if ($audioPlayer.hasClass('show-trackartwork')) { 117 const $trackImg = $track.find('img'); 118 if (!$trackImg.length) { 119 $track.prepend($('<img>', { src: img, class: 'sr_track_cover' })); 120 } else { 121 $trackImg.attr('src', img); 122 } 123 } 124 125 126 } else { 127 // No img set 128 129 if (IRON.sonaar.player.list.tracks && !IRON.sonaar.player.list.tracks[pos].optional_poster ) { 130 IRON.sonaar.player.list.tracks[pos].poster = ''; 131 } 132 133 if (!audioPlayer) return; 134 if($track.data('optional_poster') != true){ 135 if ( isFirstTrackAndNotPlaying || isCurrentTrack ) { 136 $audioPlayer.addClass('sonaar-no-artwork'); 137 $audioPlayer.find('.album-art img').remove(); 138 } 139 $track.data('albumart', ''); 140 if ($track.find('.sr_track_cover').length) { 141 $track.find('.sr_track_cover').remove(); 142 } 143 } 144 145 } 146 }, 147 init: function(that, termArray, audioPlayer, track, pos){ 148 149 termArray = termArray.split(' - ').join('-').split(' ').join('+'); 150 //termArray='NOFX Linoleum'; 151 var thumb; // image from itunes 152 var apiUrl = 'https://itunes.apple.com/search?media=music&entity=song&term='+termArray; 153 if(termArray == 'Song title unavailable' || termArray == 'No Titles Available'){ 154 // thumb = $.qtmplayerRadioFeedObj.qtFeedData.cover; 155 that.cachedThumbsArray[termArray] = false; 156 that.displayThumbnail(false, audioPlayer, track, pos); 157 return; 158 } 159 if( undefined === that.cachedThumbsArray[termArray] ) { 160 //console.log("Calling iTunes Search API: ", termArray); 161 $.ajax({ 162 type: 'GET', 163 cache: true, 164 url: apiUrl, 165 async: true, 166 context: this, 167 jsonp: false, 168 success: function(json) { 169 if('object' !== typeof( json )){ 170 json = JSON.parse(json); 171 } 172 if(json.resultCount > 0){ 173 174 thumb = json.results[0].artworkUrl100.split('100x100bb.jpg').join('500x500bb.jpg'); 175 that.cachedThumbsArray[termArray] = thumb; 176 that.displayThumbnail(thumb, audioPlayer, track, pos); 177 return; 178 }else{ 179 that.cachedThumbsArray[termArray] = false; 180 } 181 } 182 }); 183 } else { 184 // return cached image 185 that.displayThumbnail( that.cachedThumbsArray[termArray], audioPlayer, track, pos); 186 return; 187 } 188 }, 189} 190 191IRON.getIceCastInfo = function(audioPlayer = false) { 192 function fetchIcecastInfo(data, icecast_mount, track, trackDataPos, audioPlayer) { 193 if (audioPlayer){ 194 if (track.data('icecast-error') === 1){ 195 return; 196 } 197 } 198 return new Promise(function(resolve, reject) { 199 jQuery.ajax({ 200 type: 'GET', 201 url: data, 202 async: true, 203 dataType: 'json', 204 jsonp: false, 205 success: function(json) { 206 var resultArray = []; 207 var title = ''; 208 var artist = ''; 209 var artwork = ''; 210 var server_name = ''; 211 if('object' === typeof( json )){ 212 213 214 if (json.hasOwnProperty('id')) { 215 // Handle the specific JSON structure 216 if(json['title']){ 217 title = json['title']; 218 } 219 220 if(json['artist']){ 221 artist = json['artist']; 222 } 223 224 if(json['cover']){ 225 artwork = json['cover']; 226 } 227 228 } else if (json.hasOwnProperty('current_track')){ 229 // radio.co 230 if(json.current_track.title){ 231 title = json.current_track.title; 232 } 233 if(json.current_track.artist){ 234 artist = json.current_track.artist; 235 } 236 if(json.current_track.artwork_url){ 237 artwork = json.current_track.artwork_url; 238 } 239 if(json.current_track.artwork_url_large){ 240 artwork = json.current_track.artwork_url_large; 241 } 242 243 } else if (icecast_mount !== '') { 244 // based on https://stream.p-node.org/json.xsl 245 var source = json.mounts[icecast_mount];
246 title = source['title']; 247 if(source['artist']){ 248 artist = source['artist']; 249 } 250 if(source['server_name']){ 251 server_name = source['server_name']; 252 } 253 } else if (json.hasOwnProperty('now_playing')) { 254 // Handle Azuracast radio 255 title = json.now_playing.song.title; 256 artist = json.now_playing.song.artist; 257 artwork = json.now_playing.song.art; 258 server_name = json.station.name; 259 } else if (json.hasOwnProperty('nowplaying')) { 260 // Handle Citrus Stream 261 title = json.nowplaying; 262 artwork = json.coverart || artwork; 263 } else if (json.hasOwnProperty('icestats')) { 264 var source = json.icestats.source; 265 if('undefined' === typeof(source)){ return; } 266 if(source[0]){ 267 title = source[0]['title']; 268 if(source[0]['artist']){ 269 artist = source[0]['artist']; 270 } 271 if(source[0]['server_name']){ 272 server_name = source[0]['server_name']; 273 } 274 } else if( source['title'] ){ 275 title = source['title']; 276 if(source['artist']){ 277 artist = source['artist']; 278 } 279 if(source['server_name']){ 280 server_name = source['server_name']; 281 } 282 } 283 } else if (json.hasOwnProperty('data')) { 284 // from https://public.radio.co/api/v2 285 var data = json.data; 286 287 if('undefined' !== typeof(data.track_title)){ 288 title = data.track_title; 289 } 290 if('undefined' !== typeof(data.track_artist)){ 291 artist = data.track_artist; 292 } 293 if('undefined' !== typeof(data.artwork_urls)){ 294 artwork = data.artwork_urls.large; 295 } 296 if('undefined' !== typeof(data.title)){ 297 server_name = data.title; 298 } 299 } else if (json.hasOwnProperty('current')) { //airtime.pro 300 var data = json.current; 301 if('undefined' !== typeof(data.name)){ 302 title = data.name; 303 server_name = data.name; 304 } 305 if('undefined' !== typeof(data.album_artwork_image)){ 306 artwork = data.album_artwork_image; 307 } 308 if('object' === typeof(data.metadata)){ 309 if('undefined' !== typeof(data.metadata.track_title)){ 310 title = data.metadata.track_title; 311 } 312 if('undefined' !== typeof(data.metadata.artist_name)){ 313 artist = data.metadata.artist_name; 314 } 315 if('undefined' !== typeof(data.metadata.radio_station_name)){ 316 server_name = data.metadata.radio_station_name; 317 } 318 } 319 } 320 } else if('array' === typeof( json )){ 321 if(icecast_mount !== '') { 322 if("undefined" !== typeof( json[icecast_mount]) ){ 323 title = json[icecast_mount]['title']; 324 } else if( "undefined" !== typeof( json['source'][icecast_mount] ) ){ 325 title = json['source'][icecast_mount]['title']; 326 } 327 } else if(json['icestats']['source']['title']){ 328 title = (json['icestats']['source']['title']); 329 if(json['icestats']['source']['artist']){ 330 artist = json['icestats']['source']['artist']; 331 } 332 if(json['icestats']['source']['server_name']){ 333 server_name = json['icestats']['source']['server_name']; 334 } 335 } else if(json['icestats']['source'][0]['title']){ 336 title = (json['icestats']['source'][0]['title']); 337 if(json['icestats']['source']['artist']){ 338 artist = json['icestats']['source']['artist']; 339 } 340 if(json['icestats']['source']['server_name']){ 341 server_name = json['icestats']['source']['server_name']; 342 } 343 } 344 } 345 //title = "Em & Katie - Date Night Collective"; //test...should display an image from itunes 346 //artwork = ''; 347 resultArray['title'] = title; 348 resultArray['artist'] = artist; 349 resultArray['server_name'] = server_name; 350 resultArray['artwork'] = artwork; 351 printResult(resultArray, track, trackDataPos); 352 }, 353 error: function(xhr, status, error) { 354 355 if(audioPlayer){ 356 audioPlayer.icecastLoaded = true; 357 track.data('icecast-error', 1); 358 $(track).find('.tracklist-item-title').text(track.originalText); 359 360 } 361 setOriginalTracksonSticky(trackDataPos); 362 } 363 }); 364 }); 365 } 366 function printResult(result, track, trackDataPos){ 367 368 lookfortitle = result['title'].replace(result['server_name'], ''); 369 if(result['artwork'] !== ''){ 370 // there is an image set in the JSON so we use it instead of the iTunes API 371 IRON.fetchThumnbnailsFromItunes.displayThumbnail(result['artwork'], audioPlayer, track, trackDataPos); 372 }else{ 373 IRON.fetchThumnbnailsFromItunes.init(IRON.fetchThumnbnailsFromItunes, lookfortitle, audioPlayer, track, trackDataPos); 374 } 375 setStickyTracks(result, trackDataPos); 376 377 if(sonaar_music.option.show_artist_name === "on"){
378 artist_string = (result['artist']) ? '<span class="srp_trackartist"> ' + sonaar_music.option.artist_separator + ' ' + result['artist'] + '</span>': ''; 379 result['title'] = result['title'] + artist_string; 380 } 381 if(audioPlayer){ 382 audioPlayer.icecastLoaded = true; 383 if(trackDataPos == 0 && !$(audioPlayer).find('.playlist li.current').length){ 384 $(audioPlayer).find('.sr_it-playlist-title').text(result['server_name']); 385 $(audioPlayer).find('.album-title').text(result['server_name']); 386 $(audioPlayer).find('.track-title').html(result['title']); 387 } 388 389 if ($(audioPlayer).find('.playlist li').length == 1) { 390 $(audioPlayer).find('.album-title').text(result['server_name']); 391 $(audioPlayer).find('.srp_player_boxed .album-title').html(result['title']); //Yes, we show the track title in the album-title field in this case 392 $(audioPlayer).find('.track-title').html(result['title']); 393 } else { 394 if($(track).hasClass('current')){ 395 $(audioPlayer).find('.sr_it-playlist-title').text(result['server_name']); 396 $(audioPlayer).find('.album-title').text(result['server_name']); 397 $(audioPlayer).find('.track-title').html(result['title']); 398 } 399 } 400 $(track).find('.tracklist-item-title').html(result['title']); 401 402 } 403 } 404 function startICInterval(audioPlayer = false){ 405 406 if (this.icecastInterval) { 407 clearInterval(this.icecastInterval); 408 this.icecastInterval = null; 409 } 410 411 //start audioplayer interval to fetch every 15 seconds 412 this.icecastInterval = setInterval(function() { 413 IRON.getIceCastInfo(audioPlayer); 414 }, 15000); 415 416 } 417 function convertTrackURLtoJson(url){ 418 let parsedUrl = new URL(url); 419 url = parsedUrl.origin + parsedUrl.pathname.replace(/\/[^/]*$/, "/status-json.xsl"); 420 return url; 421 } 422 function setLoadStatus(pos, track = null, audioPlayer){ 423 if (IRON.sonaar.player.list.tracks && !IRON.sonaar.player.icecastLoaded) { 424 if(typeof IRON.sonaar.player.list.tracks[pos] !== 'undefined'){ 425 IRON.sonaar.player.list.tracks[pos].trackTitleOriginalText = IRON.sonaar.player.list.tracks[pos].track_title; 426 IRON.sonaar.player.list.tracks[pos].albumTitleOriginalText = IRON.sonaar.player.list.tracks[pos].album_title; 427 IRON.sonaar.player.list.tracks[pos].track_title = 'Retrieving info...'; 428 IRON.sonaar.player.list.tracks[pos].album_title = 'Retrieving info...'; 429 } 430 } 431 if(audioPlayer){ 432 if(!audioPlayer.icecastLoaded){ 433 track.originalText = $(track).find('.tracklist-item-title').text(); 434 $(track).find('.tracklist-item-title').text('Retrieving info...'); 435 } 436 } 437 } 438 function setStickyTracks(result, pos){ 439 if (IRON.sonaar.player.list.tracks && typeof IRON.sonaar.player.list.tracks[pos] !== 'undefined') { 440 if(IRON.sonaar.player.selectedPlayer == audioPlayer || !audioPlayer) { // make sure the sticky is related to the current player widget selected. 441 IRON.sonaar.player.icecastLoaded = true; 442 IRON.sonaar.player.list.tracks[pos].track_title = result['title']; 443 IRON.sonaar.player.list.tracks[pos].album_title = result['server_name']; 444 if(result['artist']){ 445 IRON.sonaar.player.list.tracks[pos].track_artist = result['artist']; 446 } 447 } 448 } 449 450 } 451 function setOriginalTracksonSticky(pos){ 452 if (IRON.sonaar.player.list.tracks) { 453 IRON.sonaar.player.icecastLoaded = true; 454 IRON.sonaar.player.list.tracks[pos].track_title = IRON.sonaar.player.list.tracks[pos].trackTitleOriginalText; 455 IRON.sonaar.player.list.tracks[pos].album_title = IRON.sonaar.player.list.tracks[pos].albumTitleOriginalText; 456 } 457 } 458 459 if(!audioPlayer){ 460 IRON.sonaar.player.list.tracks.forEach(function(track) { 461 if (!track.icecast_json) { 462 return; 463 } 464 const icecast_mount = (track.icecast_mount == false) ? '' : track.icecast_mount; 465 const jsonFile = track.icecast_json; 466 if (jsonFile) { 467 const trackDataPos = track.track_pos;
468 setLoadStatus(trackDataPos, track, audioPlayer); 469 fetchIcecastInfo(jsonFile, icecast_mount, track, trackDataPos, audioPlayer); 470 } 471 }); 472 } 473 474 if(audioPlayer){ 475 const playlistItems = $(audioPlayer).find('.playlist li[data-icecast_json!=""]'); 476 playlistItems.each(function() { 477 const jsonFile = $(this).data('icecast_json'); 478 if (jsonFile) { 479 const track = $(this); 480 const trackDataPos = $(this).index(); 481 const icecast_mount = $(this).data('icecast_mount') 482 setLoadStatus(trackDataPos, track, audioPlayer); 483 fetchIcecastInfo(jsonFile, icecast_mount, track, trackDataPos, audioPlayer); 484 } 485 }); 486 } 487 488 startICInterval(audioPlayer); 489 490} 491function startAudioSpectrum( audioPlayer, location = false, restart = false ){ 492 493 if( audioPlayer == null ) return; 494 // Check if is the sticky player spectrum 495 let isStickyPlayer ; 496 if( audioPlayer == '#sonaar-player' ){ 497 isStickyPlayer = true; 498 audioPlayer = $('#sonaar-player'); 499 }else{ 500 isStickyPlayer = false; 501 } 502 503 504 if(! audioPlayer.hasClass('srp_player_spectrum') && !isStickyPlayer){ //Exit if spectrum is not enabled 505 return; 506 } 507 508 509 if( // Avoid to start the spectrum before user gesture when continuous player is enabled 510 webAudioNotSupported || 511 isStickyPlayer && //If the spectrum is from the sticky 512 IRON.audioPlayer.stickyEnable && // If the sticky is enabled 513 document.getElementById("sonaar-audio").paused //if the player is not playing yet 514 ){ 515 return; 516 } 517 var player; 518 // Create spectrum container 519 const container = document.createElement('div'); 520 container.className = 'srp_spectrum_container srp_hidden'; 521 522 //SET SPECTRUM CANVAS LOCATION 523 const playerNum = srp_convertPlayerIdToPlayerNum(audioPlayer.attr('id')); 524 if(playerNum){ 525 audioPlayer = IRON.players[playerNum].audioPlayer; // Get the audio player from the IRON.players array to reach audioPlayer attributes Eq:"adaptiveColors" 526 } 527 audioPlayer.spectrumAnimation = true; 528 IRON.sonaar.spectrumAnimation = true; 529 530 if( 531 ! IRON.audioPlayer.stickyEnable && isStickyPlayer || // If the sticky is disabled and the spectrum is from the sticky 532 ! isStickyPlayer && playerNum == null //return if the player is not found 533 ){ 534 return; 535 } 536 537 if(isStickyPlayer){ 538 if(sonaar_music.option.sticky_spectro_responsive === 'hide_tablet'){ 539 audioPlayer.addClass('srp_hide_spectro_tablet'); 540 audioPlayer.addClass('srp_hide_spectro_mobile'); 541 }else if(sonaar_music.option.sticky_spectro_responsive === 'hide_mobile'){ 542 audioPlayer.addClass('srp_hide_spectro_mobile'); 543 } 544 } 545 546 if( 547 window.matchMedia("(max-width: 768px)").matches && audioPlayer.hasClass('srp_hide_spectro_tablet') || //Disable on tablet enabled 548 window.matchMedia("(max-width: 480px)").matches && audioPlayer.hasClass('srp_hide_spectro_mobile') //Disable on Mobile enabled 549 ){ 550 if(isStickyPlayer){ 551 IRON.sonaar.spectrumAnimation = false; 552 } 553 554 audioPlayer.spectrumAnimation = false; 555 556 return; 557 } 558 559 // spectro ="color1:#FF0064|color2:#0073FF|shadow:|barCount:500|barWidth:10|barGap:1|canvasHeight:100|halign:center|valign:bottom|spectroStyle:bars|sharpFx:|reflectFx:|gradientDirection:vertical|enableOnTracklist:|bounceClass:.control, .menu-item-1273, .elementor-element-377841ec|bounceVibrance:58|bounceBlur:true" 560 const spectro = (IRON.sonaar.player.selectedPlayer != null)? IRON.sonaar.player.selectedPlayer.data("spectro"): audioPlayer.data("spectro"); 561 const spectroValues = ( typeof spectro === 'string') ? spectro.split('|').reduce((obj, item) => { 562 const parts = item.split(':'); 563 obj[parts[0]] = !isNaN(parts[1]) && parts[1] !== "" ? parseInt(parts[1]) : parts[1]; 564 return obj; 565 }, {}) : false; 566 if(spectroValues['color1'] == '' && spectroValues['color2'] != ''){ 567 spectroValues['color1'] = spectroValues['color2']; 568 spectroValues['color2'] = ''; 569 } 570 571 if (isStickyPlayer){ 572 if(IRON.sonaar.player.selectedPlayer != null && IRON.sonaar.player.selectedPlayer.adaptiveColors){ 573 var color1 = (spectroValues['color1'] == '')? 'rgba(0,0,0,0)' : spectroValues['color1'];// Set transparent color as default color if adaptive colors is enabled so the spectrum will be transparent until adaptive colors is applied 574 }else{ 575 var color1 = sonaar_music.option.sticky_spectro_color1 || false; 576 } 577 var color2 = (IRON.sonaar.player.selectedPlayer != null && IRON.sonaar.player.selectedPlayer.adaptiveColors)? spectroValues['color2'] : sonaar_music.option.sticky_spectro_color2 || false; // Set transparent color as default color if adaptive colors is enabled so the spectrum will be transparent until adaptive colors is applied 578 var barCount = parseInt(sonaar_music.option.sticky_spectro_barcount) || 60; 579 var barWidth = parseInt(sonaar_music.option.sticky_spectro_barwidth) || 4; 580 var barGap = sonaar_music.option.sticky_spectro_bargap !== undefined && sonaar_music.option.sticky_spectro_bargap !== null ? parseInt(sonaar_music.option.sticky_spectro_bargap) : 2; 581 var canvasHeight = sonaar_music.option.sticky_spectro_canvasheight || 70; 582 var barsAlignment = sonaar_music.option.sticky_spectro_halign || 'left'; 583 var barsVerticalAlignment = sonaar_music.option.sticky_spectro_valign || 'bottom'; 584 var spectroStyle = sonaar_music.option.sticky_spectro_style || 'bars'; 585 var blockPointu = (sonaar_music.option.sticky_spectro_sharpends === "true") ? true : false;
586 var shockWaveVibrance = parseInt(sonaar_music.option.sticky_spectro_vibrance) || 40; 587 var blockHeight = parseInt(sonaar_music.option.sticky_spectro_blocheight) || 2; 588 var blockGap = parseInt(sonaar_music.option.sticky_spectro_blockgap) || 2; 589 var spectroReflect = (sonaar_music.option.sticky_spectro_reflect === "true") ? true : false; 590 var spectroShadow = (sonaar_music.option.sticky_spectro_shadow === "true") ? true : false; 591 var spectroGradientDir = sonaar_music.option.sticky_spectro_gradientdir || 'vertical'; 592 var stickyContainer = sonaar_music.option.sticky_spectro_container || 'inside'; 593 var stickyPosBottom = sonaar_music.option.sticky_spectro_posbottom || '50'; 594 var stickyPosLeft = sonaar_music.option.sticky_spectro_posleft || '0'; 595 var mobileStickyPosBottom = sonaar_music.option.mobile_sticky_spectro_posbottom || '10'; 596 var mobileStickyPosLeft = sonaar_music.option.mobile_sticky_spectro_posleft || '0'; 597 var tracklistSpectrum = false; 598 }else{ 599 var color1 = spectroValues['color1'] || false; 600 var color2 = spectroValues['color2'] || false; 601 var spectroShadow = (spectroValues['shadow'] !== "true") ? false : true; 602 var barCount = spectroValues['barCount'] || 60; 603 var barWidth = spectroValues['barWidth'] || 4; 604 var barGap = spectroValues['barGap'] || 2; 605 var canvasHeight = spectroValues['canvasHeight'] || 100; 606 var barsAlignment = spectroValues['halign'] || 'left'; 607 var barsVerticalAlignment = spectroValues['valign'] || 'bottom'; 608 var spectroStyle = spectroValues['spectroStyle'] || 'bars'; 609 var blockPointu = spectroValues['sharpFx'] || false; 610 var shockWaveVibrance = spectroValues['shockwaveVibrance']/100 || 0.4; 611 var blockHeight = spectroValues['blockHeight'] || '2'; 612 var blockGap = spectroValues['blockGap'] || '2'; 613 var spectroReflect = spectroValues['reflectFx'] || false; 614 var spectroGradientDir = spectroValues['gradientDirection'] || 'vertical'; 615 var tracklistSpectrum = spectroValues['enableOnTracklist'] || false; 616 var selectors = spectroValues['bounceClass'] || false; 617 var selectorMaxScale = spectroValues['bounceVibrance'] || 100; 618 var selectorBlur = spectroValues['bounceBlur'] || false; 619 } 620 if (selectors){ 621 selectors = selectors.split(','); 622 selectors = selectors.map((val) => val.trim()); 623 } 624 spectroReflect = ( spectroReflect == 'false' || spectroReflect == '' ) ? false : true; 625 audioPlayer.spectroReflect = spectroReflect; 626 tracklistSpectrum = ( tracklistSpectrum == 'true' ) ? true : false; 627 tracklistSpectrum = ( audioPlayer != '#sonaar-player' )? tracklistSpectrum : false; 628 if( playerNum != null && !audioPlayer.parents('.playlist_enabled').length && tracklistSpectrum){ 629 return; 630 } 631 const pixelFx = (spectroStyle === 'bricks') ? true : false; 632 633 if( !location && playerNum != null && !tracklistSpectrum || !location && playerNum != null && tracklistSpectrum && $(audioPlayer).filter('.show-playlist').length == 0){ 634 location = (audioPlayer.find('.srp_spectrum_box').length)? audioPlayer.find('.srp_spectrum_box') : audioPlayer.find('.player'); 635 }else if( !location && playerNum != null && tracklistSpectrum ){ 636 location = audioPlayer.find('.sr-playlist-item.current .tracklist-item-title'); 637 }else{ 638 if(isStickyPlayer){ 639 if (stickyContainer === "outside"){ 640 location = ( IRON.sonaar.player.isSmallDevice )? audioPlayer.find('.srp_extendedPlayer .sr_progressbar_sticky') : audioPlayer; 641 642 }else{ 643 location = audioPlayer.find('#sPlayer'); 644 } 645 }else{ 646 647 location = audioPlayer; 648 } 649 } 650 651 var totalWidth = (barWidth + barGap) * barCount; 652 653 //CANVAS CREATION 654 let canvas; 655 let idIndex = (playerNum != null)? '-' + playerNum : ''; 656 let trackIndex = audioPlayer.find('.sr-playlist-item.current').index(); 657 idIndex = ( tracklistSpectrum && audioPlayer.find('.sr-playlist-item.current').length )? idIndex + '-' + trackIndex : idIndex ; 658 idIndex = (isStickyPlayer)? '-sticky' : idIndex ; 659 660 const canvasId = 'srp_spectrum' + idIndex; 661 if( $( '#' + canvasId ).length ){ 662 canvas = $('#' + canvasId)[0]; 663 }else{ 664 canvas = document.createElement('canvas'); 665 location.prepend(container); 666 667 canvas.id = canvasId; 668 669 canvas.classList = 'srp_spectrum'; 670 container.appendChild(canvas); 671 } 672 const ctx = canvas.getContext('2d'); 673 674if(isStickyPlayer){ 675 if (stickyContainer === "outside"){ 676 $('#sonaar-player .srp_spectrum_container').css('bottom', stickyPosBottom + 'px').css('left', stickyPosLeft + 'px'); 677 $('#sonaar-player .srp_extendedPlayer .srp_spectrum_container').css('bottom', mobileStickyPosBottom + 'px').css('left', mobileStickyPosLeft + 'px'); 678 }else{ 679 audioPlayer.find('.mobileProgress').css('display', 'block'); 680 audioPlayer.find('wave').css('display', 'none'); 681 audioPlayer.find('.sonaar_wave_cut').css('display', 'none'); 682 audioPlayer.find('.sonaar_wave_base').css('display', 'none'); 683 } 684} 685if(spectroStyle == 'selectors'){ 686 audioPlayer.find('.srp_spectrum_container').css('display', 'none'); 687} 688 689let maxCanvasWidth = location.width(); 690if( 691 tracklistSpectrum && //If tracklist spectrum is enabled 692 $(audioPlayer).hasClass('srp_tracklist_grid') && //If tracklist is grid 693 audioPlayer.find('.srp_spectrum_container').length && window.getComputedStyle( audioPlayer.find('.srp_spectrum_container')[0] ).getPropertyValue("position") == 'absolute' //If spectrum is set to absolute position 694){ 695 maxCanvasWidth = 999999; 696} 697 698 totalWidth = totalWidth > maxCanvasWidth ? maxCanvasWidth : totalWidth; 699 if((barWidth + barGap) * barCount > maxCanvasWidth){ 700 barsAlignment = 'left'; 701 } 702 canvas.width = totalWidth; 703 canvas.height = canvasHeight; 704 container.style.height = canvasHeight + 'px'; 705 706 audioPlayer.spectrumColor1 = color1; 707 audioPlayer.spectrumColor2 = color2; 708 709 if(audioPlayer.adaptiveColors && !color2 ){ 710 color2 = (color1 === false)? audioPlayer.paletteColorsHex[0]: false; 711 audioPlayer.spectrumColor2 = false;
712 } 713 714 if(audioPlayer.adaptiveColors && !color1){ 715 color1 = audioPlayer.paletteColorsHex[1]; 716 audioPlayer.spectrumColor1 = false; 717 } 718 719 if (color2) { 720 // make the spectrum gradient colorized! 721 if (spectroGradientDir === 'vertical'){ 722 var gradient = ctx.createLinearGradient(0, 0, 0, canvasHeight); // vertical 723 }else{ 724 const startPos = barsAlignment === 'left' ? 1 * (barWidth + barGap) : (canvas.width / 2) - ((barCount * (barWidth + barGap)) / 2) + (1 * (barWidth + barGap)) + (barGap/2); 725 var gradient = ctx.createLinearGradient(startPos, 0, totalWidth+startPos, 0); // horizontal 726 } 727 gradient.addColorStop(0.25, color1); 728 gradient.addColorStop(1, color2); 729 } 730 if (color1){ 731 spectrumColor = color1; 732 }else{ 733 // make a rainbow gradient without any dynamic values 734 var gradient = ctx.createLinearGradient(0, 0, canvas.width, 0); 735 var hues = [0, 60, 120, 180, 240, 300, 360]; 736 hues.forEach(function(hue, i) { 737 gradient.addColorStop(i/hues.length, 'hsl(' + hue + ', 100%, 50%)'); 738 }); 739 spectrumColor = gradient; 740 741 //define a default color1 for the spectroReflect below because its not defined yet 742 color1 = '#ffffff'; 743 } 744 745 746 // barsVerticalAlignment = 'middle'; 747 if (spectroReflect){ 748 barsVerticalAlignment = 'middle'; 749 srp_spectroReflect(ctx, canvas, 2.5, color1, color2 ); 750 ctx.lineWidth = barWidth; 751 }else{ 752 if(color2 || spectroReflect){ 753 spectrumColor = gradient; 754 } 755 756 ctx.strokeStyle = spectrumColor; 757 ctx.fillStyle = spectrumColor; 758 ctx.imageSmoothingEnabled = true; 759 ctx.lineWidth = barWidth; 760 } 761 762 if(spectroShadow){ 763 ctx.shadowColor = color1; 764 ctx.shadowBlur = 10; 765 } 766 767 if(restart){ 768 initRenderFrame(); 769 return; 770 } 771 772 //GET THE MEDIA ELEMENT 773 if(IRON.audioPlayer.stickyEnable){ 774 if (typeof myaudioElement !== 'undefined'){ 775 initRenderFrame(); 776 return; 777 } 778 myaudioElement = document.getElementById('sonaar-audio') 779 }else{ 780 if (typeof IRON.players[playerNum].audioElement !== 'undefined'){ 781 IRON.players[playerNum].audioElement = audioPlayer.find('audio')[0]; 782 initRenderFrame(); 783 return; 784 } 785 IRON.players[playerNum].audioElement = audioPlayer.find('audio')[0]; 786 myaudioElement = IRON.players[playerNum].audioElement; 787 } 788 789 myaudioElement.crossOrigin = 'anonymous' 790 791 //SET THE MEDIA ELEMENT AS THE SOURCE OF THE AUDIO CONTEXT AND CONNECT IT TO THE ANALYSER 792 var sonaarAudioContext = new AudioContext(); 793 sonaarAudioContext.onstatechange = function() { 794 if (sonaarAudioContext.state === 'suspended' || sonaarAudioContext.state === 'interrupted') { // Fix iOS Lockscreen issue 795 sonaarAudioContext.resume(); 796 } 797 }; 798 var analyser; 799 800 player = IRON.audioPlayer.stickyEnable ? IRON.sonaar.player : IRON.players[playerNum]; 801 player.sonaarAnalyser = sonaarAudioContext.createAnalyser(); 802 analyser = player.sonaarAnalyser; 803 804 var sonaarTrack = sonaarAudioContext.createMediaElementSource(myaudioElement); 805 sonaarTrack.connect(analyser) 806 sonaarTrack.connect(sonaarAudioContext.destination) 807 808 function initRenderFrame() { 809 var frameAnimationCount = 0; 810 player = IRON.audioPlayer.stickyEnable ? IRON.sonaar.player : IRON.players[playerNum]; 811 setTimeout(function(){ 812 $( '#' + canvasId ).parents('.srp_spectrum_container').removeClass('srp_hidden'); 813 }, 450); 814 function renderFrame() { 815 const frequencyBinCount = 1024; 816 let data = new Uint8Array(frequencyBinCount); 817 player.sonaarAnalyser.frequencyBinCount = frequencyBinCount; 818 819 820 const canvasAnimation = requestAnimationFrame(renderFrame); 821 822 if (spectroStyle !== 'string' && spectroStyle !== 'selectors') { 823 player.sonaarAnalyser.getByteFrequencyData(data); 824 } else { 825 player.sonaarAnalyser.getByteTimeDomainData(data); 826 } 827 828 ctx.clearRect(0, 0, canvas.width, canvas.height); 829 ctx.save(); 830 ctx.beginPath(); 831 ctx.rect(0, 0, canvas.width, canvas.height); 832 ctx.clip(); 833 834 function scaleElements(data){ 835 // Function to scale the elements based on the frequency 836 837 if (!selectors) return; 838 839 for ( j = 0; j < selectors.length; j++) { 840 let minOriginalScale; 841 let maxScalePercent = selectorMaxScale; // adjust this value to control the maximum scale amount (10-100) 842 let maxScale = 1 + (maxScalePercent / 100) * 0.2; // Calculate the maximum scale based on the percentage 1.12 843 844 let originalScaleAmount = data[0]; 845 846 if(spectroStyle=='string' || spectroStyle=='selectors'){ 847 minOriginalScale = 128; // depending the spectro, they dont output the same frequency range so we need to adjust the minimum scale 848 }else{ 849 minOriginalScale = 0; 850 } 851 let maxOriginalScale = 200; 852 let minDesiredScale = 1; 853 let maxDesiredScale = maxScale; 854 let desiredScaleAmount = minDesiredScale + (originalScaleAmount - minOriginalScale) * (maxDesiredScale - minDesiredScale) / (maxOriginalScale - minOriginalScale); 855 856 let newTransform = "scale(" + desiredScaleAmount + ")"; 857 document.querySelector(selectors[j]).style.transform = newTransform; 858 859 if (selectorBlur === 'true'){ 860 let maxBlur = 1.1; // adjust this value to control the maximum blur amount 861 let blurAmount = data[0] / 128 * maxBlur; 862 if(data[0] < 129) { 863 document.querySelector(selectors[j]).style.filter = 'blur(0px)'; 864 }else{ 865 document.querySelector(selectors[j]).style.filter = `blur(${blurAmount}px)`; 866 } 867 } 868 } 869 870 } 871 872 scaleElements(data) 873 874 if(spectroStyle === 'string'){ 875 /* 876 // 877 // START OF STRINGGG SOUNDWAVE STYLE 878 // 879 */ 880 let vibration = 0.06 // adjust this value to control the amount of smoothing 881 let previousX = 0; // keep track of the previous x value 882 let previousY = (data[0] / 128) * canvas.height / 2; // keep track of the previous y value 883 ctx.beginPath(); 884 885 ctx.lineWidth = barWidth; 886 887 for(let i = 0; i < frequencyBinCount; i++) { 888 let x = i / frequencyBinCount * canvas.width; 889 let y = (data[i] / 128) * canvas.height / 2; 890 x = previousX + vibration * (x - previousX); // apply exponential moving average to x 891 y = previousY + vibration * (y - previousY); // apply exponential moving average to y 892 previousX = x; 893 previousY = y; 894 895 if(i === 0) { 896 ctx.moveTo(x, y); 897 } else { 898 ctx.lineTo(x, y); 899 } 900 } 901 ctx.stroke(); 902 903 } 904 905 906 if (spectroStyle === 'bars' || spectroStyle === 'bricks') { 907 /* 908 // 909 // START OF BARS/BRICKS SOUNDWAVE STYLE 910 // 911 */ 912 for (let i = 0; i < barCount; i++) { 913 const amplitude = data[i]; 914 const percent = (pixelFx && barsVerticalAlignment !== 'middle' ) ? amplitude / 128 : amplitude / 256; 915 const height = canvas.height * percent; 916 if (barsVerticalAlignment === 'bottom') { 917 var offset = (pixelFx) ? canvas.height : canvas.height - height - 1; 918 } else if (barsVerticalAlignment === 'middle') { 919 var offset = (pixelFx) ? canvas.height/2 : (canvas.height - height) / 2;; 920 } else { 921 var offset = 0; 922 } 923 924 if (barsAlignment === 'left') { 925 var barX = i * (barWidth + barGap); 926 } else if (barsAlignment === 'right') {
927 var barX = canvas.width - ((barCount - i) * (barWidth + barGap)) - barWidth; 928 } else { 929 var barX = (canvas.width / 2) - ((barCount * (barWidth + barGap)) / 2) + (i * (barWidth + barGap)); 930 } 931 932 if (pixelFx){ 933 blockHeight = blockHeight; 934 for (let j = 0; j < height/2; j += blockHeight+blockGap) { 935 const dotSize = (blockPointu) ? barWidth - (j * (barWidth / (height/2))) : barWidth; 936 if(barsVerticalAlignment === 'bottom'){ 937 938 ctx.fillRect(barX + (barWidth / 2) - (dotSize / 2), offset - j - blockHeight - blockGap, dotSize, blockHeight); 939 940 }else{ 941 942 ctx.fillRect(barX + (barWidth / 2) - (dotSize / 2), offset + j, dotSize, blockHeight); 943 ctx.fillRect(barX + (barWidth / 2) - (dotSize / 2), offset - j - blockHeight - blockGap, dotSize, blockHeight); 944 945 } 946 947 } 948 949 }else{ 950 ctx.fillRect(barX, offset, barWidth, height); 951 } 952 } 953 } else if (spectroStyle === 'shockwave') { 954 /* 955 // 956 // START OF Shockwave style 957 // 958 */ 959 let maxAmplitude = Math.max(...data); 960 let amplitudeFactor = canvas.height / (2 * maxAmplitude) *10; 961 ctx.beginPath(); 962 ctx.moveTo(0, canvas.height/2); 963 for (let i = 0; i < frequencyBinCount; i++) { 964 const amplitude = data[i]; 965 const y = canvas.height/2 + (amplitude * amplitudeFactor) * 0.1 * Math.sin(i * shockWaveVibrance ); 966 ctx.lineTo(i, y); 967 968 } 969 ctx.stroke(); 970 } 971 972 // Hide and Stop the animation according to the plugin sticky player settings 973 if(isStickyPlayer && !IRON.sonaar.spectrumAnimation){ 974 audioPlayer.find('.srp_spectrum_container').addClass('srp_hidden'); 975 IRON.canvasAnimation = IRON.canvasAnimation.filter(function(el) { 976 return el !== canvas.id; 977 }); 978 cancelAnimationFrame(canvasAnimation) 979 } 980 981 if( ! isStickyPlayer && $('.iron-audioplayer').length && ( 982 (! audioPlayer.hasClass('sr_selectedPlayer') && IRON.audioPlayer.stickyEnable) || 983 (! audioPlayer.hasClass('sr_selected') && !IRON.audioPlayer.stickyEnable) || 984 (tracklistSpectrum && trackIndex >= 0 && audioPlayer.find('.sr-playlist-item.current').index() >= 0 && trackIndex != audioPlayer.find('.sr-playlist-item.current').index()) || 985 ! audioPlayer.spectrumAnimation || 986 ! $('#' + audioPlayer.attr('id') ).length // if the player is removed from the DOM 987 ) 988 ){ 989 if(tracklistSpectrum){ 990 audioPlayer.find('.sr-playlist-item').eq(trackIndex).find('.srp_spectrum_container').addClass('srp_hidden') 991 }else{ 992 audioPlayer.find('.srp_spectrum_container').addClass('srp_hidden'); 993 } 994 995 IRON.canvasAnimation = IRON.canvasAnimation.filter(function(el) { 996 return el !== canvas.id; 997 }); 998 cancelAnimationFrame(canvasAnimation) 999 } 1000 1001 if ( myaudioElement.paused ) {//if media is paused during the animation during 50 frames, stop the animation 1002 frameAnimationCount++; 1003 if ( frameAnimationCount > 50 ) { 1004 if (myaudioElement.paused) { 1005 IRON.canvasAnimation = IRON.canvasAnimation.filter(function(el) { 1006 return el !== canvas.id; 1007 }); 1008 cancelAnimationFrame(canvasAnimation); 1009 } 1010 frameAnimationCount = 0; 1011 } 1012 } 1013 } 1014 1015 if (! IRON.canvasAnimation.includes(canvas.id) ) { 1016 IRON.canvasAnimation.push(canvas.id); 1017 renderFrame(); 1018 } 1019 1020 } 1021 1022 ctx.restore(); 1023 initRenderFrame(); 1024} 1025 1026function srp_spectroReflect(ctx, canvas, gapDistance, color1, color2 ){ 1027 1028 let objectHeight = canvas.height; // height of the object 1029 let colorStop1 = (gapDistance / objectHeight) + 0.5; 1030 var gradient = ctx.createLinearGradient(0, 0, 0, canvas.height); // vertical 1031 gradient.addColorStop(0, color1); 1032 if (color2) {
1033 gradient.addColorStop(0.5, color2); 1034 gradient.addColorStop(0.5, srp_parseColor(color2, 0)); 1035 gradient.addColorStop(colorStop1, srp_parseColor(color2, 0)); 1036 gradient.addColorStop(colorStop1, srp_parseColor(color2, 0.4)); 1037 }else{ 1038 gradient.addColorStop(0.5, color1); 1039 gradient.addColorStop(0.5, srp_parseColor(color1, 0)); 1040 gradient.addColorStop(colorStop1, srp_parseColor(color1, 0)); 1041 gradient.addColorStop(colorStop1, srp_parseColor(color1, 0.4)); 1042 } 1043 gradient.addColorStop(1, srp_parseColor(color1, 0)); 1044 1045 ctx.strokeStyle = gradient; 1046 ctx.fillStyle = gradient; 1047} 1048function srp_parseColor(color, alpha) { 1049 // Ensure that alpha is a value between 0 and 1 1050 alpha = Math.min(Math.max(alpha, 0), 1); 1051 if (color.startsWith("#")) { 1052 if (color.length === 9) { 1053 // extract the original alpha value 1054 let original_alpha = parseInt(color.slice(-2), 16); 1055 // calculate the new alpha value 1056 alpha = (Math.round(original_alpha * alpha) * 100 / 25500).toFixed(2); 1057 } 1058 }else if(color.startsWith("rgba(")) { 1059 // RGBA color code 1060 let values = color.slice(5, -1).split(","); 1061 values[3] = (values[3] * alpha).toFixed(2); 1062 return "rgba(" + values.join(",") + ")"; 1063 } else { 1064 throw new Error("Unsupported color format: " + color); 1065 } 1066 result = "rgba(" + parseInt(color.slice(1, 3), 16) + ", " + parseInt(color.slice(3, 5), 16) + ", " + parseInt(color.slice(5, 7), 16) + ", " + alpha + ")"; 1067 return result; 1068} 1069function srp_getColorsFromImage(audioPlayer,artworkUrl) { 1070 var affectSticky = (sonaar_music.option.sticky_player_disable_adaptive_colors === 'true') ? false : true; // Set to true or false based on your requirement 1071 1072 1073 if(!audioPlayer.adaptiveColors){ 1074 $('#srp_stickyplayer').remove(); 1075 1076 audioPlayer.prevAll('style:not(#srp-widget-player-style)').remove(); 1077 return; 1078 } 1079 1080 if(artworkUrl == null || artworkUrl == ''){ 1081 setTimeout(function() { 1082 $(audioPlayer).css("opacity", 1); 1083 return; 1084 }, 1000); 1085 } 1086 1087 1088 const colorThief = new ColorThief(); 1089 const img = new Image(); 1090 1091 img.addEventListener('load', function() { 1092 1093 paletteColors = colorThief.getPalette(img, 5); 1094 1095 const rgbToHex = (r, g, b) => '#' + [r, g, b].map(x => { 1096 const hex = x.toString(16) 1097 return hex.length === 1 ? '0' + hex : hex 1098 }).join('') 1099 1100 //convert all palette colors to hex 1101 audioPlayer.paletteColorsHex = []; 1102 for (var i = 0; i < paletteColors.length; i++) { 1103 var color = rgbToHex(paletteColors[i][0], paletteColors[i][1], paletteColors[i][2]); 1104 audioPlayer.paletteColorsHex.push(color); 1105 } 1106 1107 if(audioPlayer.adaptiveColors == 'random'){ 1108 // randomize the paletteColorsHex array 1109 audioPlayer.paletteColorsHex = audioPlayer.paletteColorsHex.sort(function() { return 0.5 - Math.random() }); 1110 }else if(audioPlayer.adaptiveColors == '2'){ 1111 // reverse the colors 1112 audioPlayer.paletteColorsHex = audioPlayer.paletteColorsHex.reverse(); 1113 }else if(audioPlayer.adaptiveColors == '3'){ 1114 //move the first color to the last position 1115 audioPlayer.paletteColorsHex.push(audioPlayer.paletteColorsHex.shift()); 1116 }else if(audioPlayer.adaptiveColors == '4'){ 1117 // move second color to the first position 1118 audioPlayer.paletteColorsHex.unshift(audioPlayer.paletteColorsHex[1]); 1119 } 1120 1121 function getContrastColor(color) { 1122 var luma = (color.charAt(0) === '#') 1123 ? (0.2126 * parseInt(color.slice(1, 3), 16) + 0.7152 * parseInt(color.slice(3, 5), 16) + 0.0722 * parseInt(color.slice(5, 7), 16)) 1124 : (0.2126 * parseInt(color.slice(0, 2), 16) + 0.7152 * parseInt(color.slice(2, 4), 16) + 0.0722 * parseInt(color.slice(4, 6), 16)); 1125 return (luma < 130) ? '#fff' : '#000'; 1126 } 1127 1128 var foregroundColor = getContrastColor(audioPlayer.paletteColorsHex[0]); 1129 var paletteColorsHex_1_contrast = getContrastColor(audioPlayer.paletteColorsHex[1]); 1130 1131 //create a darker color function 1132 function darkerColor(color, percent) { 1133 var num = parseInt(color.replace("#",""),16), 1134 amt = Math.round(2.55 * percent), 1135 R = (num >> 16) - amt, 1136 G = (num >> 8 & 0x00FF) - amt, 1137 B = (num & 0x0000FF) - amt; 1138 return "#" + (0x1000000 + (R<255?R<1?0:R:255)*0x10000 + (G<255?G<1?0:G:255)*0x100 + (B<255?B<1?0:B:255)).toString(16).slice(1); 1139 } 1140 //create a lighter color function 1141 function lighterColor(color, percent) { 1142 var num = parseInt(color.replace("#",""),16), 1143 amt = Math.round(2.55 * percent), 1144 R = (num >> 16) + amt, 1145 G = (num >> 8 & 0x00FF) + amt, 1146 B = (num & 0x0000FF) + amt; 1147 return "#" + (0x1000000 + (R<255?R<1?0:R:255)*0x10000 + (G<255?G<1?0:G:255)*0x100 + (B<255?B<1?0:B:255)).toString(16).slice(1); 1148 } 1149 1150 /* 1151 //---------------- 1152 // START DEBUG // 1153 //---------------- 1154 //delete color-square 1155 audioPlayer.find('.color-square').remove(); 1156 // create small square color from paletteColorsHex and display them relative to the audioplayer 1157 var colorSquare = ''; 1158 for (var i = 0; i < audioPlayer.paletteColorsHex.length; i++) { 1159 colorSquare += '<div class="color-square" style="display:inline-block;z-index:1000;width:25px;height:25px;top:-100px;background-color:'+audioPlayer.paletteColorsHex[i]+'"></div>'; 1160 } 1161 // add colorsquare in iron_widget_radio 1162 audioPlayer.prepend(colorSquare); 1163 //---------------- 1164 // END DEBUG // 1165 //---------------- 1166 */ 1167 1168 if (! (audioPlayer.adaptiveColorsFreeze == true && $('#srp_stickyplayer').attr('data-player-source') == audioPlayer.id) ){ 1169 $('#srp_stickyplayer').remove(); 1170 audioPlayer.prevAll('style').not('#srp-widget-player-style').remove(); 1171 1172 //create style in the head 1173 $('head').append('<style id="srp_stickyplayer" data-player-source="' + audioPlayer.id + '"></style>'); 1174 audioPlayer.before('<style></style>'); 1175 } 1176 1177 player_uid = '[data-id="' + audioPlayer.data('id') + '"] '; 1178 player_floated = (audioPlayer.data('playertemplate') == 'skin_float_tracklist') ? true : false;
1179 1180 const cssColor = [ 1181 { 1182 target: '\ 1183 div#sonaar-player .control div,\ 1184 div#sonaar-player .playlist,\ 1185 div#sonaar-player .playlist .tracklist li.active span,\ 1186 div#sonaar-player .playlist .title,\ 1187 div#sonaar-player .playlist .tracklist li a,\ 1188 div#sonaar-player .sricon-volume,\ 1189 div#sonaar-player .player .sr_progressbar_sticky .timing,\ 1190 div#sonaar-player .player .store .track-store li a,\ 1191 div#sonaar-player .sonaar-extend-button,\ 1192 .srmp3_singning p[begin]:not(.srmp3_lyrics_read ~ p),\ 1193 .playlist .audio-track .sricon-play,\ 1194 .playlist li.current .audio-track,\ 1195 .playlist li.current .track-number,\ 1196 .playlist li.current .audio-track .srp_trackartist,\ 1197 .srp-play-button .sricon-play,\ 1198 .sr_progressbar .currentTime,\ 1199 .sr_progressbar .totalTime,\ 1200 .srp_player_boxed .srp_noteButton,\ 1201 .playlist .srp_pagination, .srp_ellipsis,\ 1202 .srp_pagination_container .srp_pagination_arrows,\ 1203 .album-store,\ 1204 .album-player .album-title, .album-player .track-title,\ 1205 div#sonaar-player .srp_ext_control,\ 1206 div#sonaar-player .srp_ellipsis_btn, div#sonaar-player .srp_collapse_btn,\ 1207 .control', 1208 css: 'color', 1209 value: audioPlayer.paletteColorsHex[1] 1210 }, 1211 { 1212 target: '\ 1213 div#sonaar-player,\ 1214 div#sonaar-player .playlist,\ 1215 div#sonaar-player .player .sr_progressbar_sticky .volume .slider-container,\ 1216 div#sonaar-player.sr-float .playlist,\ 1217 div#sonaar-player.sr-float .close.btn-player,\ 1218 div#sonaar-player.sr-float .player.sr-show_controls_hover .playerNowPlaying,\ 1219 div#sonaar-player .srp_extendedPlayer_container .srp_extendedPlayer,\ 1220 div#sonaar-player .srp_extendedPlayer_container .srp_ext_overlay_panel,\ 1221 div#sonaar-player .srp_extendedPlayer_container .srp_ext_section,\ 1222 .srp_note', 1223 css: 'background-color', 1224 value: audioPlayer.paletteColorsHex[0] 1225 }, 1226 { 1227 target: '\ 1228 .album-player,\ 1229 .srp_track_description,\ 1230 .playlist li .audio-track,\ 1231 .playlist li .audio-track .srp_trackartist,\ 1232 .playlist li .track-number,\ 1233 .srp_search_container .fa-search,\ 1234 .srp_search_container .srp_search,\ 1235 .sr_it-playlist-publish-date,\ 1236 .srp_playlist_duration,\ 1237 .srp_trackCount,\ 1238 .srp_note,\ 1239 div#sonaar-player,\ 1240 #sonaar-modal div.sr_popup-content,\ 1241 div#sonaar-player .playlist .tracklist li span,\ 1242 div#sonaar-player .srp_ext_overlay_panel,\ 1243 div#sonaar-player .srp_extendedPlayer_container .srp_ext_overlay_panel .srp-fav-bt,\ 1244 div#sonaar-player .srp_extendedPlayer_container .srp-fav-bt,\ 1245 div#sonaar-player .srp_ext_featured_cta,\ 1246 div#sonaar-player .metadata-inner', 1247 css: 'color', 1248 value: foregroundColor 1249 }, 1250 { 1251 target: '#sonaar-modal .srp-modal-variation-list .srp-modal-variant-selector', 1252 css: 'background-color', 1253 value: darkerColor(audioPlayer.paletteColorsHex[0],5) 1254 }, 1255 { 1256 target: '.srp_player_boxed, .playlist .sr-playlist-item,div#sonaar-player .player, #sonaar-player .mobilePanel, div#sonaar-player .player .player-row:before, div#sonaar-modal div.sr_popup-content', 1257 css: 'background-color', 1258 value: darkerColor(audioPlayer.paletteColorsHex[0],15) 1259 }, 1260 { 1261 target: '\ 1262 @media only screen and (max-width: 1025px){div#sonaar-player .store}', 1263 css: 'background-color', 1264 value: darkerColor(audioPlayer.paletteColorsHex[0],15) 1265 }, 1266 { 1267 target: '.srp_note', 1268 css: 'background-color', 1269 value: darkerColor(audioPlayer.paletteColorsHex[0],18) 1270 }, 1271 { 1272 target: '.sr-cf-heading', 1273 css: 'background-color', 1274 value: darkerColor(audioPlayer.paletteColorsHex[0],30) 1275 }, 1276 { 1277 target: '.sr-cf-heading', 1278 css: 'border-color', 1279 value: darkerColor(audioPlayer.paletteColorsHex[0],30) 1280 }, 1281 { 1282 target: '.sr-playlist-heading-child', 1283 css: 'color', 1284 value: lighterColor(audioPlayer.paletteColorsHex[0],10) 1285 }, 1286 { 1287 target: '.playlist .sr-playlist-item:hover, .playlist .sr-playlist-item.current', 1288 css: 'background-color', 1289 value: darkerColor(audioPlayer.paletteColorsHex[0],20) 1290 }, 1291 { 1292 target: '.srp_search_container .srp_search', 1293 css: 'background-color', 1294 value: lighterColor(audioPlayer.paletteColorsHex[0],15) 1295 }, 1296 { 1297 target: '.sr-playlist-cf-container', 1298 css: 'color', 1299 value: foregroundColor 1300 }, 1301 { 1302 target: '.sr-playlist-cf-container', 1303 css: 'opacity', 1304 value: 0.6 1305 }, 1306 { 1307 target: 'div.srp-play-circle,.srp_pagination_container .srp_pagination_arrows,.control .sr_speedRate div,div#sonaar-player div.sr_speedRate div,div#sonaar-player .close.btn_playlist:before,div#sonaar-player .close.btn_playlist:after,\ 1308 div#sonaar-player .srp_extendedPlayer_container .srp_ext_overlay_panel .close', 1309 css: 'border-color', 1310 value: audioPlayer.paletteColorsHex[1] 1311 }, 1312 1313 { 1314 target: '\ 1315 .playlist a.song-store:not(.sr_store_wc_round_bt),\ 1316 .srp_noteButton .sricon-info', 1317 css: 'color', 1318 value: audioPlayer.paletteColorsHex[2] 1319 }, 1320 { 1321 target: '.srp_track_description', 1322 css: 'opacity', 1323 value: 0.5 1324 }, 1325 { 1326 target: '\ 1327 .sr_it-playlist-title, div#sonaar-player .playlist button.play, div#sonaar-player .close.btn-player,div#sonaar-player div.sr_speedRate div,.control .sr_speedRate div,.srp_pagination_container .srp_pagination .active span,.srp-play-button-label-container,\ 1328 #sonaar-player .srp_extendedPlayer_container .srp_extendedPlayer .srp_ext_featured_cta .srp_ext_cta_addtocart, #sonaar-player .srp_extendedPlayer_container .srp_extendedPlayer .srp_ext_featured_cta .srp_ext_cta_buynow', 1329 css: 'color', 1330 value: audioPlayer.paletteColorsHex[0] 1331 }, 1332 { 1333 target: '\ 1334 #sonaar-modal .srp_button, #sonaar-modal .srp-modal-variation-list .srp-modal-variant-selector:hover,\ 1335 #sonaar-modal .srp-modal-variation-list .srp-modal-variant-selector.srp_selected,\ 1336 .srp_pagination_container .srp_pagination .active span,.srp-play-button-label-container,\ 1337 div#sonaar-player .playlist button.play,div#sonaar-player .mobileProgressing:after,\ 1338 div#sonaar-player .progressDot,div#sonaar-player div.sr_speedRate div,\ 1339 .control .sr_speedRate div,\ 1340 #sonaar-player .srp_extendedPlayer_container .srp_extendedPlayer .srp_ext_featured_cta .srp_ext_cta_addtocart,\ 1341 #sonaar-player .srp_extendedPlayer_container .srp_extendedPlayer .srp_ext_featured_cta .srp_ext_cta_buynow', 1342 css: 'background-color', 1343 value: audioPlayer.paletteColorsHex[1] 1344 }, 1345 { 1346 target: '#sonaar-modal .srp_button, #sonaar-modal .srp-modal-variation-list .srp-modal-variant-selector:hover, #sonaar-modal .srp-modal-variation-list .srp-modal-variant-selector.srp_selected', 1347 css: 'color', 1348 value: paletteColorsHex_1_contrast 1349 }, 1350 { 1351 target: '.buttons-block .store-list li .button, .song-store.sr_store_wc_round_bt', 1352 css: 'color', 1353 value: paletteColorsHex_1_contrast 1354 1355 }, 1356 { 1357 target: '.buttons-block .store-list li .button,.song-store.sr_store_wc_round_bt', 1358 css: 'background-color', 1359 value: audioPlayer.paletteColorsHex[1] 1360 }, 1361 { 1362 target: 'div#sonaar-player .close.btn-player,div#sonaar-player .mobileProgress', 1363 css: 'background-color', 1364 value: audioPlayer.paletteColorsHex[3] 1365 }, 1366 { 1367 target: 'div#sonaar-player .player', 1368 css: 'border-color', 1369 value: audioPlayer.paletteColorsHex[3] 1370 }, 1371 { 1372 target: 'div#sonaar-player .player div.mobilePanel', 1373 css: 'border-color', 1374 value: darkerColor(audioPlayer.paletteColorsHex[0],15) 1375 }, 1376 ]; 1377 1378 if( Boolean(sonaar_music.option.waveformType === 'simplebar') ){ 1379 cssColor.push( 1380 { 1381 target: 'div#sonaar-player .sonaar_fake_wave .sonaar_wave_cut', 1382 css: 'background-color', 1383 value: audioPlayer.paletteColorsHex[3] 1384 }, 1385 { 1386 target: 'div#sonaar-player .sonaar_fake_wave .sonaar_wave_base', 1387 css: 'background-color', 1388 value: audioPlayer.paletteColorsHex[1] 1389 }, 1390 ) 1391 } 1392 1393 if(player_floated){ 1394 cssColor.push( 1395 { 1396 target: '.playlist, .playlist .sr-playlist-item', 1397 css: 'background-color', 1398 value: 'unset', 1399 skin: 'floated' 1400 }, 1401 { 1402 target: '.album-player .album-title, .album-player .srp_trackartist, .sr_progressbar .currentTime, .sr_progressbar .totalTime', 1403 css: 'color', 1404 value: audioPlayer.paletteColorsHex[3], 1405 skin: 'floated' 1406 }, 1407 { 1408 target: '.album-player .track-title, .control, .control .sricon-play', 1409 css: 'color', 1410 value: lighterColor(audioPlayer.paletteColorsHex[3],25), 1411 skin: 'floated' 1412 }, 1413 { 1414 target: '.sr_it-playlist-title, .srp_subtitle, .srp_noteButton .sricon-info, .playlist li .audio-track, .playlist li .audio-track .srp_trackartist, .playlist li .track-number, .srp_track_description', 1415 css: 'color', 1416 value: audioPlayer.paletteColorsHex[1], 1417 skin: 'floated' 1418 }, 1419 { 1420 target: '.playlist .audio-track .sricon-play', 1421 css: 'color', 1422 value: lighterColor(audioPlayer.paletteColorsHex[1],20), 1423 skin: 'floated' 1424 }, 1425 { 1426 target: '', 1427 css: 'background-color', 1428 value: 'unset', 1429 skin: 'floated' 1430 }, 1431 ); 1432 } 1433 1434 for (let i = 0; i < cssColor.length; i++) { 1435 var skin_prefix = ''; 1436 if(cssColor[i]['skin'] === 'floated'){ 1437 skin_prefix = '[data-playertemplate="skin_float_tracklist"]'; 1438 } 1439 //Check if cssColor[i] contains value with , if yes, split it and add it to the array 1440 if(cssColor[i]['target'].indexOf(',') != -1){ 1441 var cssColorValue = cssColor[i]['target'].split(','); 1442 for (let j = 0; j < cssColorValue.length; j++) { 1443 if(affectSticky && cssColorValue[j].indexOf('#sonaar-') != -1 ){ 1444 $('#srp_stickyplayer').append(cssColorValue[j] + '{' + cssColor[i]['css'] + ':' + cssColor[i]['value'] + ';transition: all 600ms;}'); 1445 }else{ 1446 audioPlayer.prev('style').append(skin_prefix + player_uid + cssColorValue[j] + '{' + cssColor[i]['css'] + ':' + cssColor[i]['value'] + ';transition:' + cssColor[i]['css'] + ' 600ms;}'); 1447 } 1448 } 1449 }else{ 1450 if(affectSticky && cssColor[i]['target'].indexOf('#sonaar-') != -1){ 1451 $('#srp_stickyplayer').append(cssColor[i]['target'] + '{' + cssColor[i]['css'] + ':' + cssColor[i]['value'] + ';transition: all 600ms;}'); 1452 }else{ 1453 audioPlayer.prev('style').append(skin_prefix + player_uid + cssColor[i]['target'] + '{' + cssColor[i]['css'] + ':' + cssColor[i]['value'] + ';transition:' + cssColor[i]['css'] + ' 600ms;}'); 1454 } 1455 } 1456 } 1457 if( !$(audioPlayer).hasClass('srp_tracklist_grid') ){ 1458 audioPlayer.prev('style').append(player_uid + '.playlist{background-color:' + darkerColor(audioPlayer.paletteColorsHex[0],10) + ';}'); 1459 } 1460 1461 //check if audioPlayer contains a gradient (set with background-image) but not an image url 1462 if (audioPlayer.find('.srp_player_boxed').length && audioPlayer.find('.srp_player_boxed').css('background-image') != 'none' && audioPlayer.find('.srp_player_boxed').css('background-image').indexOf('url') == -1) { 1463 audioPlayer.prev('style').append(player_uid + '.srp_player_boxed{background-image:linear-gradient(0deg,' + darkerColor(audioPlayer.paletteColorsHex[4], 25) + ' 0%, ' + darkerColor(audioPlayer.paletteColorsHex[0],20) + ' 100%)!important;'); 1464 if(affectSticky){ 1465 $('#srp_stickyplayer').append('#sonaar-player .player{background-image:linear-gradient(45deg,' + darkerColor(audioPlayer.paletteColorsHex[4], 25) + ' 0%, ' + darkerColor(audioPlayer.paletteColorsHex[0],20) + ' 100%)'); 1466 } 1467 } 1468 1469 if(typeof audioPlayer.spectrumColor1 !== 'undefined' && !audioPlayer.spectrumColor1 && typeof audioPlayer.spectrumColor2 !== 'undefined' && !audioPlayer.spectrumColor2){ 1470 1471 let color1 = (audioPlayer.spectrumColor1) ? audioPlayer.spectrumColor1 : audioPlayer.paletteColorsHex[0]; 1472 let color2 = (audioPlayer.spectrumColor2) ? audioPlayer.spectrumColor2 : audioPlayer.paletteColorsHex[2]; 1473 1474 $('.srp_spectrum').each(function () { 1475 const canvas = this; 1476 const ctx = canvas.getContext('2d'); 1477 const gradient = ctx.createLinearGradient(0, 0, 0, canvas.height); // vertical 1478 gradient.addColorStop(0.25, color1); 1479 gradient.addColorStop(1, color2); 1480 ctx.fillStyle = gradient; 1481 ctx.strokeStyle = gradient; 1482 if( 1483 $(this).parents('#sonaar-player').length && sonaar_music.option.sticky_spectro_reflect === "true" || 1484 ! $(this).parents('#sonaar-player').length && audioPlayer.spectroReflect 1485 ){ 1486 srp_spectroReflect(ctx, canvas, 2.5, color1, color2); 1487 } 1488 1489 }) 1490 } 1491 1492 if(audioPlayer.attr('data-wave-color') == false){ 1493 audioPlayer.soundwaveColorBG = audioPlayer.paletteColorsHex[2]; 1494 // audioPlayer.find('.sonaar_wave_base').css('background-color',audioPlayer.paletteColorsHex[2]); 1495 } 1496 if(audioPlayer.attr('data-wave-progress-color') == false){ 1497 audioPlayer.soundwaveProgressColor = audioPlayer.paletteColorsHex[1]; 1498 //audioPlayer.find('.sonaar_wave_cut').css('background-color',audioPlayer.paletteColorsHex[1]); 1499 } 1500 1501 IRON.createFakeWave(audioPlayer, false); 1502 1503 if(IRON.audioPlayer.stickyEnable && IRON.sonaar.player.list.tracks.length) IRON.createFakeWave(false, true); 1504 1505 if(audioPlayer.adaptiveColorsFreeze == true){ 1506 audioPlayer.adaptiveColorsSet = true; 1507 } 1508 // set timeout of 1 second to allow the image and colors to be loaded because of the color transition effect. 1509 setTimeout(function() { 1510 $(audioPlayer).css("opacity", 1); 1511 }, 1000); 1512 }); 1513 1514 img.crossOrigin = 'anonymous'; 1515 img.src = artworkUrl; 1516} 1517IRON.audioPlayer = (function ($) { 1518 "use strict"; 1519 var seekTimeOut; 1520 var autoplayEnable; 1521 var audioPlayer; 1522 var playlist; 1523 var stickyEnable = false;
1524 var random_order = false; 1525 1526 function setMediaSessionAPI(trackTitle, albumTitle, artistName, albumArt) { 1527 //WIP: Does not work with the mini-player play button. Works only when click in the tracklist. 1528 if ('mediaSession' in navigator) { 1529 navigator.mediaSession.metadata = new MediaMetadata({ 1530 title: trackTitle, 1531 artist: albumTitle, // We want to show album Title instead of artist name in the Notification 1532 album: albumTitle, 1533 artwork: [ 1534 { src: albumArt, sizes: '512x512', type: 'image/jpeg' }, 1535 ] 1536 }); 1537 } 1538 } 1539 function initPlayer(player) { 1540 audioPlayer = player; 1541 1542 if(typeof player.params == 'undefined'){ 1543 player.params = {}; 1544 } 1545 this.audioPlayer = player; 1546 1547 1548 var waveContainer = this.audioPlayer.find(".player .wave").attr("id"); 1549 playlist = audioPlayer.find(".playlist .srp_list") 1550 playlist.children(":not(li)").remove(); // woocommerce shop page insert a unwanted <a> tag in the playlist who cause a bug with the track index. 1551 this.playlist = playlist; 1552 this.autoplayEnable = audioPlayer.data("autoplay"); 1553 audioPlayer.spectrumColor1 = false; 1554 audioPlayer.spectrumColor2 = false;
1555 audioPlayer.id = audioPlayer.data("id"); 1556 audioPlayer.pagination_offset = parseInt(audioPlayer.attr("data-pagination_scroll_offset"), 10); 1557 audioPlayer.albums = audioPlayer.data("albums"); 1558 audioPlayer.remove_wave = audioPlayer.data("no-wave"); 1559 audioPlayer.shuffle = audioPlayer.data("shuffle") || false; 1560 audioPlayer.stickyPlayer = IRON.audioPlayer.stickyEnable; 1561 audioPlayer.notrackskip = audioPlayer.data("notrackskip"); 1562 audioPlayer.playerType = audioPlayer.data("playertemplate"); 1563 audioPlayer.hide_progressbar = audioPlayer.data("hide-progressbar") ? true : false; 1564 audioPlayer.adaptiveColors = audioPlayer.data("adaptive-colors"); 1565 audioPlayer.adaptiveColorsFreeze = audioPlayer.data("adaptive-colors-freeze"); 1566 audioPlayer.lazy_load = audioPlayer.data("lazyload"); 1567 audioPlayer.progressType = audioPlayer.data("progress-bar-style"); 1568 audioPlayer.setTrackSoundwaveCursor = audioPlayer.data("track-sw-cursor"); 1569 audioPlayer.trackMemory = audioPlayer.hasClass('srp_track_memory'); 1570 1571 // Define an async function for the fetch operation 1572 const urlParams = new URLSearchParams(document.location.search); 1573 audioPlayer.listJs = (audioPlayer.hasClass('srp_linked') || audioPlayer.find('.srp_search_container').length || document.querySelectorAll('[data-sr-dropdown-atts]').length || audioPlayer.find('.sr-cf-heading').length || audioPlayer.find('.srp_pagination').length || urlParams.has('srp_search')); //If Linked to a search or filter widget || If the current Player has a Search Input || If the current Player has CF Columns || Pagination is acitvated || if srp_search URL parameter 1574 audioPlayer.list = {}; 1575 audioPlayer.list.tracks = []; 1576 1577 if(audioPlayer.trackMemory){ 1578 IRON.localStorageTrackMemory = (localStorage.getItem('srp_tracks_memories') == null) ? {} : JSON.parse(localStorage.getItem('srp_tracks_memories')); 1579 } 1580 1581 playlist.find(".sr-playlist-item").each(function () { 1582 var $track = $(this); 1583 var trackData = { 1584 peakFile: $track.data("peakfile"), 1585 mp3: $track.data("audiopath"), 1586 sourcePostID: $track.data("post-id"), 1587 id: $track.data("trackid"), // Its the media attachment ID if set. 1588 track_pos: $track.data("track-pos"), 1589 isPreview: $track.data("is-preview"), 1590 peak_allow_frontend: $track.data("peakfile-allow"), 1591 artwork: $track.data("artwork"), 1592 }; 1593 audioPlayer.list.tracks.push(trackData); 1594 }); 1595 1596 $('.iron-audioplayer .srp_repeat').attr('data-repeat-status', IRON.repeatStatus); 1597 $('.iron-audioplayer .srp_repeat').attr('title', IRON.repeatToolTipLabel()); 1598 1599 setTrackSoundwaveCursor(audioPlayer); 1600 1601 if(!audioPlayer.adaptiveColors){ 1602 $(audioPlayer).css("opacity", 1); 1603 } 1604 sr_setPopUp();//set Popup, required for the store-content popup 1605 if (audioPlayer.shuffle) { 1606 var trackNumber = Math.floor(Math.random() * playlist.find("li").length); 1607 } else { 1608 var trackNumber = playlist.find("li").not('[data-relatedtrack="1"]').index(); 1609 } 1610 random_order = setRandomList(playlist.find("li"), trackNumber); 1611 1612 if (audioPlayer.data("scrollbar")) { 1613 var scrollItem = $(audioPlayer).find(".playlist .srp_list")[0]; 1614 1615 var ps = new PerfectScrollbar(scrollItem, { 1616 wheelSpeed: 0.7, 1617 swipeEasing: true, 1618 wheelPropagation: false, 1619 minScrollbarLength: 20, 1620 suppressScrollX: true, 1621 maxScrollbarLength: 100, 1622 }); 1623 //$('.iron-audioplayer .playlist ul').perfectScrollbar({'suppressScrollX': true}); 1624 } 1625 if (audioPlayer.data("wave-color") == false) { 1626 audioPlayer.soundwaveColorBG = (audioPlayer.soundwaveColorBG === '' || typeof audioPlayer.soundwaveColorBG == 'undefined') ? sonaar_music.option.music_player_timeline_color : audioPlayer.soundwaveColorBG; 1627 } else { 1628 audioPlayer.soundwaveColorBG = (audioPlayer.soundwaveColorBG === '' || typeof audioPlayer.soundwaveColorBG == 'undefined') ? audioPlayer.data("wave-color") : audioPlayer.soundwaveColorBG; 1629 } 1630 if (audioPlayer.data("wave-progress-color") == false) { 1631 audioPlayer.soundwaveProgressColor = (audioPlayer.soundwaveProgressColor === '' || typeof audioPlayer.soundwaveProgressColor == 'undefined') ? sonaar_music.option.music_player_progress_color : audioPlayer.soundwaveProgressColor; 1632 } else { 1633 audioPlayer.soundwaveProgressColor = (audioPlayer.soundwaveProgressColor === '' || typeof audioPlayer.soundwaveProgressColor == 'undefined') ? audioPlayer.data("wave-progress-color") : audioPlayer.soundwaveProgressColor; 1634 } 1635 1636 this.$audio_el = $("#" + waveContainer).find(".sonaar_media_element")[0]; 1637 fakeWaveUpdate(this.$audio_el, audioPlayer, playlist); 1638 $(audioPlayer).find(".wave").css("opacity", "1"); 1639 1640 setPlaylist(playlist, this.$audio_el, audioPlayer); 1641 1642 var trackNumber; 1643 if (audioPlayer.shuffle) { 1644 const tracksPerPage = audioPlayer.data('tracks-per-page'); 1645 if (typeof tracksPerPage === 'number' && !isNaN(tracksPerPage)) { //ifpagination is enabled 1646 trackNumber = Math.floor(Math.random() * playlist.find('.sr-playlist-item').length); 1647 } else {; 1648 trackNumber = random_order[0]; 1649 } 1650 } else { 1651 trackNumber = playlist.find("li").not('[data-relatedtrack="1"]').index(); 1652 } 1653 var track = playlist.find("li").eq(trackNumber); 1654 $(audioPlayer).attr("trackselected", trackNumber); 1655 1656 if(!IRON.audioPlayer.stickyEnable && !audioPlayer.hasClass('audio-playing') || IRON.audioPlayer.stickyEnable){ //Dont update the mini player if the player is already playing a track from another ajax page 1657 setCurrentTrack(track, trackNumber, audioPlayer, this.$audio_el); 1658 updateMiniPlayer(audioPlayer, track); 1659 } 1660 audioPlayer.find('.sr_it-playlist-publish-date').text(track.data('date')); 1661 if(track.data('tracktime')){ 1662 audioPlayer.find('.totalTime').text('-' + track.data('tracktime')); 1663 } 1664 setControl(this.$audio_el, audioPlayer, playlist); 1665 1666 if (audioPlayer.data("autoplay")) { 1667 autoplayEnable = true; 1668 } 1669 1670 sr_playerCTAresponsive(); 1671 sr_initSlider(audioPlayer.find('.slider-container .slide'), audioPlayer, this.$audio_el);
1672 srp_js_dynamic_style(audioPlayer); 1673 IRON.favorites.setFavButtons(audioPlayer); 1674 1675 srp_setTrackListColumns(audioPlayer); 1676 1677 if(typeof sonaar_music.option.general_volume != 'undefined' ){ 1678 if( getCookieValue("sonaar_mp3_player_volume") != '' && IRON.audioPlayer.stickyEnable){ 1679 sr_getCookieVolume(); 1680 }else{ 1681 sr_setVolume(sonaar_music.option.general_volume/100, audioPlayer, this.$audio_el); 1682 } 1683 }else{ 1684 sr_setVolume(1, audioPlayer, this.$audio_el); 1685 } 1686 1687 if( audioPlayer.find('.srp_swiper').length && typeof audioPlayer.swiper == 'undefined' && typeof Swiper != 'undefined' ){ 1688 const numberOfSlidesRequiredForVirtual = 20; 1689 const selectedTrack = function(){ 1690 if( audioPlayer.find('.srp_swiper').data('swiper-source') == 'track' ){ 1691 var slideId = audioPlayer.attr('trackselected'); 1692 }else{ 1693 var slideId = $(audioPlayer).find('.sr-playlist-item').eq(audioPlayer.attr('trackselected')).data('post-id'); 1694 } 1695 var initialSlideIndex = $(audioPlayer).find('.swiper-slide[data-slide-id="' + slideId + '"]').index(); 1696 return initialSlideIndex; 1697 } 1698 1699 const setVirtualExtraSlides = function(){ 1700 var extraSlidestValue = 3; //default value for ['virtual']['addSlidesAfter'] and ['virtual']['addSlidesAfter'] 1701 if( typeof parameters['slidesPerView'] != 'undefined' && typeof parameters['loop'] != 'undefined' && parameters['loop'] == true){ 1702 const numberOfSlide = $(audioPlayer).find('.swiper-slide').length; 1703 while (numberOfSlide < (parameters['slidesPerView'] + (extraSlidestValue*3))*2 && extraSlidestValue > 0 ) { 1704 extraSlidestValue--; 1705 } 1706 } 1707 return extraSlidestValue; 1708 } 1709 1710 1711 var parameters = eval('(' +audioPlayer.find('.srp_swiper').data('params')+ ')') 1712 if( typeof parameters['navigation'] != 'undefined' && parameters['navigation'] != false ){ 1713 if( parameters['navigation'] == true ){ 1714 parameters['navigation'] = {}; 1715 } 1716 if( typeof parameters['navigation']['nextEl'] == 'undefined' || typeof parameters['navigation']['nextEl'] != 'undefined' && parameters['navigation']['nextEl'] == '.srp_swiper-button-next'){ 1717 parameters['navigation']['nextEl'] = '.iron-audioplayer[data-id="' + audioPlayer.id + '"] .srp_swiper-button-next'; //Add the player id to the next button 1718 } 1719 if( typeof parameters['navigation']['prevEl'] == 'undefined' || typeof parameters['navigation']['prevEl'] != 'undefined' && parameters['navigation']['prevEl'] == '.srp_swiper-button-prev'){ 1720 parameters['navigation']['prevEl'] = '.iron-audioplayer[data-id="' + audioPlayer.id + '"] .srp_swiper-button-prev'; //Add the player id to the prev button 1721 } 1722 } 1723 if( typeof parameters['pagination'] != 'undefined' && typeof parameters['pagination']['el'] != 'undefined' && parameters['pagination']['el'] == '.swiper-pagination'){ 1724 parameters['pagination']['el'] = '.iron-audioplayer[data-id="' + audioPlayer.id + '"] .swiper-pagination'; //Add the player id to the pagination 1725 } 1726 if( typeof parameters['initialSlide'] == 'undefined' ){ 1727 parameters['initialSlide'] = selectedTrack(); 1728 } 1729 1730 if( $(audioPlayer).find('.swiper-slide').length > numberOfSlidesRequiredForVirtual && audioPlayer.shuffle != true){ 1731 if( typeof parameters['virtual'] == 'undefined' ){ 1732 parameters['virtual'] = {};
1733 parameters['virtual']['enabled'] = true; 1734 parameters['virtual']['addSlidesAfter'] = setVirtualExtraSlides(); 1735 parameters['virtual']['addSlidesBefore'] = setVirtualExtraSlides(); 1736 } 1737 }else{ 1738 parameters['virtual'] = false; 1739 } 1740 1741 if( audioPlayer.find('.srp_swiper').data('init') !== 'true' ){ 1742 1743 audioPlayer.swiper = new Srp_swiper(audioPlayer.find('.srp_swiper')[0], parameters); 1744 1745 const playerEl = audioPlayer; 1746 audioPlayer.swiper.on('transitionEnd', function() { 1747 if (!IRON.swiper.isTransitionEnd) { 1748 IRON.swiper.isTransitionEnd = true; 1749 IRON.swiper.showHiddenSlide( playerEl); 1750 } 1751 }); 1752 IRON.swiper.showHiddenSlide( audioPlayer); 1753 audioPlayer.find('.srp_swiper').data('init', 'true'); 1754 if( typeof parameters['autoplay'] != 'undefined' && parameters['autoplay'] !== false){ 1755 audioPlayer.swiper.autoplay.start(); //Force autoplay to start when the player is loaded and the params autoplay is set to true. The autoplay is not working when we change player option in the elementor editor 1756 } 1757 } 1758 } 1759 if(typeof IRON.favorites.favoritesEnabled != 'undefined' && IRON.favorites.favoritesEnabled){ //If favorites list is already loaded 1760 audioPlayer.removeClass('srp_favorites_loading'); 1761 } 1762 1763 if(audioPlayer.trackMemory){ 1764 const singleTrack = audioPlayer.find('.sr-playlist-item').eq(Number(audioPlayer.attr('trackselected'))); 1765 if(singleTrack.length){ 1766 const trackMemoryKey = IRON.getTrackMemoryKeyFormat(singleTrack.data('audiopath')); 1767 if(typeof IRON.localStorageTrackMemory[trackMemoryKey] == 'object'){ 1768 const [currentTime, duration] = IRON.localStorageTrackMemory[trackMemoryKey]; 1769 var $audio_el = audioPlayer.find('.album-player .sonaar_media_element')[0]; 1770 $audio_el.currentTime = currentTime; 1771 1772 audioPlayer.find('.album-player .sonaar_wave_cut').width((currentTime / duration) * 100 + "%"); 1773 setTimeCurrentTime(audioPlayer, $audio_el.currentTime) 1774 } 1775 singleTrack.data( 'track-memory-key', trackMemoryKey ); 1776 } 1777 } 1778 1779 $(audioPlayer).find('.srp_track_purchased .add_to_cart_button, .srp_track_purchased .srp_wc_variation_button').each(function () { 1780 const $btn = $(this); 1781 1782 if($btn.hasClass('sr_cta_disabled')){ 1783 $btn.css({ 1784 pointerEvents: 'none', 1785 cursor: 'default', 1786 }); 1787 $btn.attr('href', 'javascript:void(0)'); 1788 $btn.attr('onclick', ''); 1789 } 1790 1791 if($btn.hasClass('sr_cta_download')){ 1792 $btn.removeClass('srp_wc_variation_button'); 1793 $btn.attr('download', ''); 1794 $btn.removeAttr('data-store-id'); 1795 $btn.removeAttr('data-source-post-id'); 1796 $btn.removeAttr('data-product_id'); 1797 1798 1799 } 1800 1801 if(sonaar_music.option.wc_bt_purchased_bg_color != ''){ 1802 $btn.css('background-color', sonaar_music.option.wc_bt_purchased_bg_color); 1803 } 1804 if(sonaar_music.option.wc_bt_purchased_txt_color != ''){ 1805 $btn.css('color', sonaar_music.option.wc_bt_purchased_txt_color); 1806 } 1807 }); 1808 1809 1810 1811 checkIfResult(audioPlayer); 1812 } 1813 1814 /* triggerPlay is called everytime NEW track (only) is clicked to play, and NOT on page load */ 1815 var triggerPlay = function (audioPlayer) { 1816 if(audioPlayer.hasClass('srp_player_spectrum') && !IRON.audioPlayer.stickyEnable){ 1817 const playerNum = srp_convertPlayerIdToPlayerNum(audioPlayer.attr('id')) 1818 if(typeof IRON.players[playerNum].audioElement == 'undefined'){ 1819 startAudioSpectrum(audioPlayer); 1820 }else{ 1821 startAudioSpectrum(audioPlayer, false, true); 1822 } 1823 } 1824 }; 1825 1826 function setSingleMetaHeadingInMiniplayer($source, $target) { 1827 if ($target.length) { 1828 $target.html('').hide(); // Empty the current field when we switch track 1829 if ((typeof $source !== 'undefined') && $source.length) { 1830 $target.html( $target.attr('data-prefix') + ' ' + $source).show(); 1831 } 1832 } 1833 } 1834 1835 /* setCurrentTrack is called on load before audio playing AND on play */ 1836 function setCurrentTrack(track, index, audioPlayer, $audio_el) { 1837 1838 audioPlayer.currentTrack = index; 1839 1840 if(typeof IRON.sonaar.player.selectedPlayer === 'undefined' || IRON.sonaar.player.selectedPlayer === null){ 1841 IRON.getIceCastInfo(audioPlayer); 1842 } 1843 1844 var albumArt = audioPlayer.find(".album .album-art"); 1845 var albumReleaseDate = audioPlayer.find(".srp_subtitle"); 1846 var artworkUrl = (typeof audioPlayer.data('albumart') != 'undefined')? audioPlayer.data('albumart'): track.data('albumart'); 1847
1848 if (audioPlayer.data('hide-artwork') != '1' && audioPlayer.data('hide-artwork') != 'true') { 1849 if (artworkUrl) { 1850 audioPlayer.removeClass('sonaar-no-artwork'); 1851 if (albumArt.find("img").length) { 1852 albumArt.find("img").attr("src", artworkUrl); 1853 } else { 1854 albumArt.css("background-image", "url(" + artworkUrl + ")"); 1855 } 1856 } else { 1857 audioPlayer.addClass('sonaar-no-artwork'); 1858 } 1859 1860 } 1861 1862 1863 1864 srp_getColorsFromImage(audioPlayer,artworkUrl); 1865 1866 1867 1868 if (!audioPlayer.hasClass("show-playlist")) { 1869 albumArt.css("cursor", "pointer"); 1870 } 1871 audioPlayer.data("currentTrack", index); 1872 1873 albumReleaseDate.text(track.data("releasedate")); 1874 1875 audioPlayer.find(".player").removeClass("hide"); 1876 audioPlayer.find(".wave").removeClass("reveal"); 1877 1878 if (!track.data("showloading")) { 1879 audioPlayer.find(".player").addClass("hide"); 1880 } else { 1881 audioPlayer.find(".progressLoading").css("opacity", "0.75"); 1882 } 1883 1884 //set time from memory 1885 if( audioPlayer.trackMemory && typeof audioPlayer.find('.sr-playlist-item').eq(index).data('current-time') != 'undefined' && !audioPlayer.stickyPlayer ){ 1886 const audioInstance = sr_setAudioElementInstance(audioPlayer); 1887 audioInstance.currentTime = (audioPlayer.find('.sr-playlist-item').eq(index).data('current-time')); 1888 } 1889 1890 1891 1892 1893 1894 setTime(audioPlayer, $audio_el); 1895 1896 hideEmptyAttribut(track.data("releasedate"), audioPlayer.find(".srp_subtitle")); 1897 1898 if (!audioPlayer.hasClass('sr_selectedPlayer') || !audioPlayer.stickyPlayer) { 1899 IRON.audioPlayer.checkArtWorkFullBg(audioPlayer, artworkUrl); 1900 IRON.createFakeWave(audioPlayer); 1901 } 1902 1903 if (!audioPlayer.stickyPlayer) { 1904 updateMiniPlayer(audioPlayer, track); 1905 IRON.swiper.update(audioPlayer, index); 1906 } 1907 audioPlayer.find('.sr_it-playlist-publish-date').text(track.data('date')); 1908 if (! IRON.audioPlayer.stickyEnable) { 1909 audioPlayer.find('.sonaar_media_element')[0].playbackRate = audioPlayer.attr('data-speedrate'); 1910 } 1911 } 1912 1913 function updateMiniPlayer(audioPlayer, track) { 1914 audioPlayer.find('.srp_player_boxed, .album-player, .album-store').removeClass('srp_hidden'); 1915 $(audioPlayer).attr("trackselected", track.index()); 1916 if(track.attr('data-icecast_json') == '' || typeof track.attr('data-icecast_json') == 'undefined'){ 1917 var playlistTitleElement = audioPlayer.find(".sr_it-playlist-title, .album-title"); 1918 var prefixTitle = (typeof audioPlayer.find(".album-title").attr('data-prefix') === 'undefined')? '' : audioPlayer.find(".album-title").attr('data-prefix'); 1919 if (typeof audioPlayer.data("playlist_title") !== "undefined" && audioPlayer.data("playlist_title").length) { 1920 playlistTitleElement.text(prefixTitle + ' ' + audioPlayer.data("playlist_title")); 1921 } else if(typeof track.attr('data-albumtitle') != 'undefined'){ 1922 playlistTitleElement.text(prefixTitle + ' ' + track.attr('data-albumtitle')); 1923 }else{ 1924 audioPlayer.find('.srp_player_boxed, .album-player, .album-store').addClass('srp_hidden'); 1925 } 1926 1927 var trackTitleSource = (typeof track.data("tracktitle") != 'undefined')? track.data("tracktitle").toString().split('<span class="srp_trackartist">')[0] : ''; 1928 setSingleMetaHeadingInMiniplayer( trackTitleSource, audioPlayer.find('.track-title') ); 1929 } 1930 setSingleMetaHeadingInMiniplayer( track.data("artist"), audioPlayer.find('.album-player .srp_artistname') ); 1931 setSingleMetaHeadingInMiniplayer( track.data("tracktime"), audioPlayer.find('.album-player .srp_duration') ); 1932 setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--description').text(), audioPlayer.find('.album-player .srp_description')); 1933 setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--product_cat').text(), audioPlayer.find('.album-player .srp_category')); 1934 setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--playlist-category').text(), audioPlayer.find('.album-player .srp_category')); 1935 setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--product_tag').text(), audioPlayer.find('.album-player .srp_tag')); 1936 setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--playlist-tag').text(), audioPlayer.find('.album-player .srp_tag')); 1937 setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--podcast-show').text(), audioPlayer.find('.album-player .srp_podcast_show')); 1938 audioPlayer.find('.srp_meta_cf').each(function(){ 1939 setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--' + $(this).data('cf')).html(), $(this)); 1940 }) 1941 1942 if (audioPlayer.data('playertemplate') == 'skin_boxed_tracklist' && audioPlayer.find('.srp_track_cta').length) { 1943 audioPlayer.find('.srp_track_cta .song-store-list-container').remove(); 1944 audioPlayer.find('.srp_track_cta').append(track.find('.song-store-list-container').clone()); 1945 } 1946 const $currentTrack = audioPlayer.find('.sr-playlist-item:not(.srp_related_track)').eq(track.index()); 1947 /*Miniplayer Note Button*/ 1948 if($currentTrack.find('.srp_noteButton').length || 1949 $currentTrack.find('.srp_track_description').length && $currentTrack.find('.srp_track_description').html().length 1950 ){ 1951 audioPlayer.find('.album-player .srp_noteButton').removeClass('srp_hide'); 1952 audioPlayer.find('.album-player .srp_noteButton .sricon-info').attr('data-source-post-id', $currentTrack.attr('data-post-id')); 1953 audioPlayer.find('.album-player .srp_noteButton .sricon-info').attr('data-track-position', $currentTrack.attr('data-track-pos')); 1954 audioPlayer.find('.album-player .srp_noteButton .sricon-info').attr('data-track-title', $currentTrack.attr('data-tracktitle')); 1955 }else{ 1956 audioPlayer.find('.album-player .srp_noteButton').addClass('srp_hide'); 1957 } 1958 audioPlayer.find('.srp_player_boxed .srp_note').remove(); 1959 /*End Miniplayer Note Button*/ 1960 } 1961 1962 function checkArtWorkFullBg(audioPlayer, artwork) { 1963 var hasArtworkBgClass = (null !== audioPlayer) ? audioPlayer.closest('.srp_artwork_fullbackground_yes').length > 0 : false;
1964 if (hasArtworkBgClass) { 1965 if (audioPlayer.data('hide-artwork') != '1' && audioPlayer.data('hide-artwork') != 'true') { 1966 // Determine if this is the first call for this audio player 1967 var isFirstCall = typeof audioPlayer.data('firstCall') === 'undefined' || audioPlayer.data('firstCall') === false; 1968 audioPlayer.data('firstCall', true); 1969 1970 var hasArtworkBgClass_Gradient = audioPlayer.closest('.srp_artwork_fullbackground_wgradient_yes').length > 0; 1971 if (hasArtworkBgClass_Gradient) { 1972 audioPlayer.find('.srp-artworkbg-gradient').remove(); 1973 var backgroundDiv = document.createElement('div'); 1974 backgroundDiv.className = 'srp-artworkbg-gradient'; 1975 audioPlayer[0].appendChild(backgroundDiv); 1976 } 1977 1978 if (artwork === false) { 1979 var currentTrackIndex = audioPlayer.currentTrack; 1980 artwork = $(audioPlayer).find('.sr-playlist-item').eq(currentTrackIndex).data('albumart'); 1981 } 1982 1983 if (artwork) { 1984 // Find existing background divs and fade them out
1985 var existingBackgrounds = audioPlayer.find('.srp-artworkbg'); 1986 existingBackgrounds.addClass('srp-fade-out'); 1987 setTimeout(function() { 1988 existingBackgrounds.remove(); 1989 }, 2500); // Corresponds to the animation duration 1990 1991 // Create new background div and append it 1992 var newBackgroundDiv = document.createElement('div'); 1993 newBackgroundDiv.className = 'srp-artworkbg'; 1994 1995 if (!isFirstCall) { 1996 newBackgroundDiv.className += ' srp-fade-in'; 1997 } 1998 1999 newBackgroundDiv.style.backgroundImage = 'url(' + artwork + ')'; 2000 audioPlayer[0].appendChild(newBackgroundDiv); 2001 } else { 2002 // Next track has no artwork, remove the previous image with fade-out effect 2003 var backgrounds = audioPlayer.find('.srp-artworkbg'); 2004 backgrounds.addClass('srp-fade-out'); 2005 setTimeout(function() { 2006 backgrounds.remove(); 2007 }, 2500); // Corresponds to the animation duration 2008 } 2009 } 2010 } 2011 } 2012 2013 2014 function setRandomList(tracks, firstTrackIndex = null) { 2015 var poolTrack = new Array(); 2016 var i = 0; 2017 $(tracks).each(function () { 2018 poolTrack.push(i); 2019 i++; 2020 poolTrack = poolTrack.sort(function (a, b) { 2021 return 0.5 - Math.random(); 2022 }); 2023 }); 2024 2025 if (firstTrackIndex != null) { 2026 const indexTrack = poolTrack.indexOf(firstTrackIndex); 2027 if (indexTrack !== -1) { 2028 poolTrack.splice(indexTrack, 1); 2029 poolTrack.unshift(firstTrackIndex); 2030 } 2031 } 2032 return poolTrack; 2033 } 2034 2035 function setPlaylist(playlist, $audio_el, audioPlayer) { 2036 2037 let playlistTimeDuration = 0; 2038 let trackNumberArray = []; 2039 2040 playlist.find('li').each(function (i) { 2041 if( ! $(this).data('relatedtrack') ){ 2042 trackNumberArray.push(i+1); 2043 }else{ 2044 trackNumberArray.push(''); 2045 } 2046 preSetSingleTrack($(this)); 2047 if ($(this).data('relatedtrack') != '1') { //Count playlist time duration 2048 if ($(this).data('tracktime')) { 2049 convertTime($(this).data('tracktime')); 2050 playlistTimeDuration = playlistTimeDuration + convertTime($(this).data('tracktime')); 2051 } 2052 } 2053 2054 }); 2055 2056 //Output playlist time duration 2057 playlistTimeDuration = Math.round(playlistTimeDuration / 60) * 60; //Round to minutes 2058 playlistTimeDuration = moment.duration(playlistTimeDuration, "seconds"); 2059 let durationOutput = ''; 2060 let timeDurationMinutes = playlistTimeDuration._milliseconds / 60000; 2061 let timeDurationHours = Math.floor(timeDurationMinutes / 60); 2062 if (timeDurationHours > 0) { 2063 timeDurationMinutes = timeDurationMinutes - (timeDurationHours * 60); 2064 durationOutput += timeDurationHours + ' ' + audioPlayer.find('.srp_playlist_duration').data('hours-label') + ' '; 2065 } 2066 durationOutput += timeDurationMinutes + ' ' + audioPlayer.find('.srp_playlist_duration').data('minutes-label'); 2067 audioPlayer.find('.srp_playlist_duration').html(durationOutput); 2068 2069 if (!audioPlayer.hasClass('srp_reordered') && audioPlayer.listJs) { 2070 listJsInit(audioPlayer); 2071 } 2072 2073 playlist.find('li').each(function () { //have to be loaded after listJsInit 2074 setFrontendSingleTrack($(this), $(this).index(), trackNumberArray[$(this).index()], $audio_el, audioPlayer); 2075 if( audioPlayer.hasClass('srp_has_customfields') ){ 2076 setColumnCta(this); 2077 } 2078 }); 2079 2080 } 2081 2082 // Debounce function 2083 function debounce(func, wait) { 2084 let timeout; 2085 return function(...args) { 2086 const context = this; 2087 clearTimeout(timeout); 2088 timeout = setTimeout(() => func.apply(context, args), wait); 2089 }; 2090 } 2091 2092 var srmp3ResizeHandler = debounce(function() { 2093 if(IRON.audioPlayer.activePlayer){ 2094 startAudioSpectrum(IRON.audioPlayer.activePlayer); 2095 } 2096 if(typeof sonaar_music.option.sticky_spectro_style !== "undefined" && sonaar_music.option.sticky_spectro_style != "none"){ 2097 startAudioSpectrum('#sonaar-player') 2098 } 2099 $('.iron-audioplayer').each(function(){ 2100 srp_setTrackListColumns(this , true); 2101 }) 2102 if(typeof IRON.sonaar != 'undefined' && typeof IRON.sonaar.player != 'undefined'){ 2103 if ($(window).outerWidth() > 540) { 2104 IRON.sonaar.player.isSmallDevice = false;
2105 } else { 2106 IRON.sonaar.player.isSmallDevice = true; 2107 } 2108 } 2109 IRON.setExtendedPlayerHeightVar(); 2110 }, 500); // 250ms debounce time 2111 2112 $(window).on('resize', srmp3ResizeHandler); 2113 2114 function updatePaginationAjax(player) { 2115 2116 let currentPage = parseInt(player.srp_player_param['srp_page'], 10); 2117 if (isNaN(currentPage)) { 2118 currentPage = 1; 2119 } 2120 let postperpage = parseInt(player.srp_player_param['posts_per_page'], 10); 2121 let totalPages = parseInt(player.attr('data-total_pages'), 10); 2122 2123 let output = ''; 2124 2125 const ellipsis = '<li class="disabled"><span class="page">...</span></li>'; 2126 2127 if (totalPages == 1){ 2128 player.find('.srp_pagination_container').remove(); 2129 } 2130 if (totalPages <= 5) { 2131 for (let i = 1; i <= totalPages; i++) { 2132 output += `<li${i === currentPage ? ' class="active"' : ''}><span class="page" data-i="${i}" data-page="${postperpage}">${i}</span></li>`; 2133 } 2134 } else { 2135 // Always display the first page 2136 output += `<li${currentPage === 1 ? ' class="active"' : ''}><span class="page" data-i="1" data-page="${postperpage}">1</span></li>`; 2137 2138 if (currentPage === 1) { 2139 output += `<li><span class="page" data-i="2" data-page="${postperpage}">2</span></li>`; 2140 output += ellipsis; 2141 2142 } else if (currentPage === 2) { 2143 output += `<li class="active"><span class="page" data-i="2" data-page="${postperpage}">2</span></li>`; 2144 output += `<li><span class="page" data-i="3" data-page="${postperpage}">3</span></li>`; 2145 output += ellipsis; 2146 2147 } else if (currentPage === 3) { 2148 for (let i = 2; i <= 4; i++) { 2149 output += `<li${i === currentPage ? ' class="active"' : ''}><span class="page" data-i="${i}" data-page="${postperpage}">${i}</span></li>`; 2150 } 2151 output += ellipsis; 2152 2153 } else if (currentPage >= 4 && currentPage <= totalPages-3) { 2154 output += ellipsis; 2155 for (let i = currentPage - 1; i <= currentPage + 1; i++) { 2156 output += `<li${i === currentPage ? ' class="active"' : ''}><span class="page" data-i="${i}" data-page="${postperpage}">${i}</span></li>`; 2157 } 2158 output += ellipsis; 2159 2160 } else if (currentPage >= totalPages-2 && currentPage <= totalPages) { 2161 output += ellipsis; 2162 for (let i = totalPages - 3; i <= totalPages - 1; i++) { 2163 output += `<li${i === currentPage ? ' class="active"' : ''}><span class="page" data-i="${i}" data-page="${postperpage}">${i}</span></li>`; 2164 } 2165 } 2166 2167 // Always display the last page 2168 output += `<li${currentPage === totalPages ? ' class="active"' : ''}><span class="page" data-i="${totalPages}" data-page="${postperpage}">${totalPages}</span></li>`; 2169 } 2170 2171 player.find('.srp_pagination').html(output); 2172 player.find('.srp_pagination').off('click'); 2173 player.find('.srp_pagination--prev').off('click'); 2174 player.find('.srp_pagination--next').off('click'); 2175 2176 player.find('.srp_pagination').on('click', '.page', function() { 2177 let pageNumber = $(this).data('i'); // Get the page number from the data-i attribute 2178 $(this).parents('li').addClass('active').siblings().removeClass('active'); 2179 srp_updatePage(pageNumber, player); 2180 IRON.audioPlayer.reloadAjax(player, true); 2181 }); 2182 2183 player.find('.srp_pagination--prev').on('click', function(){ 2184 if(player.find('.srp_pagination').find('.active').prev().length > 0){ 2185 player.find('.srp_pagination').find('.active').prev().find('span')[0].click() 2186 } 2187 }) 2188 player.find('.srp_pagination--next').on('click', function(){ 2189 if(player.find('.srp_pagination').find('.active').next().length > 0){ 2190 player.find('.srp_pagination').find('.active').next().find('span')[0].click() 2191 } 2192 }); 2193 2194 let elements = player[0].querySelectorAll('.srp_sort'); 2195 2196 const unwantedValues = [ 2197 'srmp3_cf_album_title', 2198 'srmp3_cf_album_img', 2199 'srmp3_cf_audio_title', 2200 'srmp3_cf_description', 2201 'srmp3_cf_artist', 2202 'podcast-show', 2203 'product_tag', 2204 'product_cat', 2205 'playlist-category', 2206 'playlist-tag' 2207 ]; 2208 function handleElementClick(sortValue, e) { 2209 e.preventDefault(); 2210 // Special condition for tracklist-item-title 2211 if (sortValue === 'tracklist-item-title') { 2212 sortValue = 'title'; 2213 } 2214 if (sortValue === 'post_id') { 2215 sortValue = 'ID'; 2216 } 2217 if (sortValue === 'post_date') { 2218 sortValue = 'date'; 2219 } 2220 if (sortValue === 'post_modified') { 2221 sortValue = 'modified'; 2222 } 2223 2224 // Check current URL for srp_order value and decide on ascending or descending 2225 const currentOrder = new URLSearchParams(window.location.search).get('srp_order'); 2226 if (currentOrder === `${sortValue}_asc`) { 2227 sortValue += '_desc'; 2228 } else { 2229 sortValue += '_asc'; 2230 } 2231 srp_updatePage(1, player); 2232 srp_updateOrder(sortValue, player); 2233 IRON.audioPlayer.reloadAjax(player, true) 2234 } 2235
2236 elements.forEach(element => { 2237 if (element._clickHandler) { 2238 element.removeEventListener('click', element._clickHandler); 2239 } 2240 let sortValue = element.getAttribute('data-sort').replace('sr-playlist-cf--', ''); 2241 // Skip unwanted values 2242 if (unwantedValues.includes(sortValue)) { 2243 $(element).removeClass('srp_sort'); 2244 $(element).css('pointer-events', 'none'); 2245 return; 2246 } 2247 const boundClickHandler = handleElementClick.bind(null, sortValue); 2248 element.addEventListener('click', boundClickHandler); 2249 element._clickHandler = boundClickHandler; // store the reference for later removal 2250 2251 }); 2252 2253 } 2254 2255 2256 //Reset the tracklist when is has been modified by the search/filter options 2257 var srp_wait = false; 2258 function listJsInit(audioPlayer) { 2259 2260 if(audioPlayer.lazy_load){ 2261 return; 2262 } 2263 //return; //should do this if we are in lazyload...but the search seems to stop working (not added in the query url) 2264 if( !audioPlayer.find('.srp_list li').length ) 2265 return; 2266 2267 2268 if( typeof List == 'undefined') 2269 return; 2270 2271 const sortItems = ['srp_cf_data', 'tracklist-item-title', 'srp_track_description','tracklist-item-time', { name: 'srp_tracklist-item-date', attr: 'date' }]; // add default values 2272 const sortItemsFromCF = audioPlayer.find('.srp_list').data('filters').split(',').map(function(el) { return "sr-playlist-cf--" + el}); //get all elements from data-sortby, convert them to array and add prefix "sr-playlist-cf--" to all element. 2273 2274 let sortOptions = sortItems.concat(sortItemsFromCF); //['tracklist-item-title', 'sr-playlist-cf--artist_name', 'sr-playlist-cf--acf_category', 'sr-playlist-cf--acf_beats_per_minutes', 'sr-playlist-cf--has_drum', 'srp_track_description', 'tracklist-item-time', { name: 'srp_tracklist-item-date', attr: 'date' }]; //Set searching area 2275 2276 var options = { 2277 valueNames: sortOptions, 2278 listClass: 'srp_list', 2279 searchClass: 'srp_search', 2280 sortClass: 'srp_sort', 2281 //page: audioPlayer.data("tracks-per-page"), 2282 /*pagination: [{ 2283 name: "srp_pagination", 2284 paginationClass: "srp_pagination", 2285 outerWindow: 1 2286 }],*/ 2287 //indexAsync: true, 2288 searchDelay: 1000, 2289 2290 // pagination: true 2291 }; 2292 2293 if(audioPlayer.data("tracks-per-page")){ 2294 options.page = audioPlayer.data("tracks-per-page"); 2295 options.pagination = [{ 2296 name: "srp_pagination", 2297 item: '<li><span class="page" onclick="srp_scrollToTrackListTop(\''+audioPlayer.id+'\')"></span></li>', 2298 paginationClass: "srp_pagination", 2299 outerWindow: 1, 2300 innerWindow: 1 2301 }] 2302 audioPlayer.find('.srp_pagination--prev').on('click', function(){ 2303 if(audioPlayer.find('.srp_pagination').find('.active').prev().length > 0){ 2304 audioPlayer.find('.srp_pagination').find('.active').prev().find('span')[0].click() 2305 } 2306 }) 2307 audioPlayer.find('.srp_pagination--next').on('click', function(){ 2308 if(audioPlayer.find('.srp_pagination').find('.active').next().length > 0){ 2309 audioPlayer.find('.srp_pagination').find('.active').next().find('span')[0].click() 2310 } 2311 }) 2312 audioPlayer.addClass('srp_reordered'); 2313 } 2314 2315 2316 2317 2318 2319 const tracklistID = audioPlayer.find('.playlist').attr('id'); 2320 for (var playerIndex = 0; playerIndex < IRON.players.length && IRON.players[playerIndex].audioPlayer.attr('id') != tracklistID; playerIndex++) { }; //Set playerIndex 2321 audioPlayer.orderedList = new List(tracklistID, options); 2322 audioPlayer.orderedList.on('updated', function () { 2323 2324 if (IRON.audioPlayer.stickyEnable && IRON.sonaar.player.selectedPlayer == audioPlayer) { //if Sticky is sync to this widget player, unsync them before modifying the tracklist. 2325 IRON.sonaar.player.selectedPlayer = null; 2326 audioPlayer.removeClass('sr_selectedPlayer'); 2327 audioPlayer.removeClass('audio-playing'); 2328 IRON.sonaar.player.playlistID = null; 2329 } 2330 audioPlayer.addClass('srp_reordered'); 2331 if (IRON.audioPlayer.stickyEnable || ! audioPlayer.hasClass('sr_selectedPlayer')) { //Reset the player if sticky is enabled or when the page is loaded with filterOrSearch parameter in the URL 2332 2333 var player = Object.create(IRON.audioPlayer); // pour reloader avec pagnination (sans ajax) 2334 player.init(audioPlayer); 2335 IRON.players[playerIndex] = player; 2336 }else{ //keep the current track playing and unselect the current track from the track list 2337 audioPlayer.find('.srp_list .current').removeClass('current'); 2338 audioPlayer.data('currentTrack', 999999);// CurrentTrack equal 999999 when we dont want a track selected in the tracklist 2339 var relatedtrackCount = 0; 2340 audioPlayer.find('.playlist li').each(function () { //initialize new tracklist 2341 if( $(this).data('relatedtrack') ){ 2342 relatedtrackCount++; 2343 } 2344 var trackNumber = $(this).index() + 1 - relatedtrackCount; 2345 if($(this).data('init') !== true){ //Dont init twice the same track 2346 setFrontendSingleTrack($(this), $(this).index(), trackNumber, IRON.players[playerIndex].$audio_el, audioPlayer); 2347 } 2348 }) 2349 2350 } 2351 srp_setTrackListColumns(audioPlayer); 2352 2353 if (audioPlayer.shuffle && !IRON.audioPlayer.stickyEnable) { //Reset random order if shuffle is enabled and sticky is not enabled 2354 random_order = setRandomList(audioPlayer.orderedList.visibleItems, 0); 2355 } 2356 2357 }) 2358 } 2359 2360 function checkIfResult(audioPlayer){ 2361 2362 if( $(audioPlayer).find(".srp_list li").length){ 2363 audioPlayer.find('.srp_notfound').css('display', 'none'); 2364 audioPlayer.find('.sr-cf-heading').css('display', 'flex'); 2365 audioPlayer.find('.srp_pagination_container').css('display', 'flex'); 2366 //audioPlayer.find('.playlist').css('display', ''); 2367 } else { 2368 if( typeof audioPlayer.attr('data-total_items') != 'undefined' || audioPlayer.hasClass('srp_player_is_recentlyPlayed') || audioPlayer.hasClass('srp_player_is_purchased_track') || audioPlayer.hasClass('srp_player_is_favorite') ){
2369 // No track found and its from a search filters or from a specific player type. We want to display a not found notice. 2370 audioPlayer.find('.srp_notfound').css('display', 'block'); 2371 }else{ 2372 // No track found. We dont want to display the tracklist at all. (eg: a single widget player) we may want to keep the player tho because it may contains usefull admin notice (WIP). 2373 // audioPlayer.find('.playlist').css('display', 'none'); 2374 } 2375 audioPlayer.find('.sr-cf-heading').css('display', 'none'); 2376 audioPlayer.find('.srp_pagination_container').css('display', 'none'); 2377 } 2378 2379 2380 } 2381 2382 $('.srp_search').keydown(function(e) { //Trigger search on keyup - we are inittiating search field inside the player seperatly for ajax. 2383 if( !$(this).parents('.iron-audioplayer').length ){ 2384 IRON.searchField.search(this, e); 2385 } 2386 }); 2387 2388 $('.srp_search_container .srp_reset_search').click(function() { 2389 //delete search keywords on icon click 2390 const metaValue = $(this).parents('.srp_search_container').find('input')[0].value; 2391 const playerId = $(this).parents('.srp_search_container').data('player-id'); 2392 srp_removeMeta('search', metaValue, playerId); 2393 }); 2394 2395 function setTime(audioPlayer, $audio_el) { 2396 $($audio_el).on("timeupdate", function () { 2397 karaokeMode(audioPlayer, $audio_el.currentTime); 2398 setTimeCurrentTime(audioPlayer, $audio_el.currentTime); 2399 setTimeTotalTime(audioPlayer, $audio_el) 2400 IRON.setTracksTimeMemories(audioPlayer); 2401 }); 2402 } 2403 2404 function setTimeCurrentTime(audioPlayer, currentTime) {; 2405 var time = moment.duration(currentTime, "seconds"); 2406 if (time.hours() >= 12 || time.hours() <= 0) { 2407 audioPlayer.find(".currentTime").html(moment(time.minutes() + ":" + time.seconds(), "m:s").format("mm:ss")); 2408 } else { 2409 audioPlayer.find(".currentTime").html(moment(time.hours() + ":" + time.minutes() + ":" + time.seconds(), "h:m:s").format("h:mm:ss")); 2410 } 2411 } 2412 2413 function setTimeTotalTime(audioPlayer, $audio_el) { 2414 if ($audio_el.duration !== Infinity) { 2415 var timeLeft = moment.duration($audio_el.duration - $audio_el.currentTime, "seconds"); 2416 if(timeLeft.milliseconds() > 0){ 2417 if (timeLeft.hours() >= 12 || timeLeft.hours() <= 0) { 2418 audioPlayer.find(".totalTime").html("-" + moment(timeLeft.minutes() + ":" + timeLeft.seconds(), "m:s").format("mm:ss")); 2419 } else { 2420 audioPlayer.find(".totalTime").html("-" + moment(timeLeft.hours() + ":" + timeLeft.minutes() + ":" + timeLeft.seconds(), "h:m:s").format("h:mm:ss")); 2421 } 2422 }else{ 2423 audioPlayer.find(".totalTime").html(""); 2424 } 2425 } else { 2426 audioPlayer.find(".totalTime").html(""); 2427 } 2428 } 2429 2430 function seekTime(time) { 2431 if (IRON.audioPlayer.stickyEnable) { 2432 IRON.sonaar.player.seekTime(time); 2433 } else { 2434 if (time) { 2435 if (this.audioPlayer.find('.sonaar_media_element')[0].duration !== Infinity) { 2436 this.audioPlayer.find('.sonaar_media_element')[0].currentTime = convertTime(time); 2437 } 2438 } 2439 } 2440 } 2441 /* 2442 setControl is called on load before audio playing 2443 */ 2444 function setControl($audio_el, audioPlayer, playlist) { 2445 audioPlayer.unbind('click'); 2446 if (audioPlayer.stickyPlayer) { 2447 audioPlayer.on("click", ".play, .album .album-art", function (event) { 2448 if ($(audioPlayer).hasClass("sr_selectedPlayer")) { 2449 IRON.sonaar.player.play(); 2450 } else { 2451 if(audioPlayer.id == 'popup_player'){ 2452 var playButton = IRON.bt_that_launched_the_popup.closest('li.sr-playlist-item').find('.srp_audio_trigger'); 2453 var singlePlayerButton = IRON.bt_that_launched_the_popup.closest('.srp_control_box').find('.srp-play-button'); 2454 if (playButton.length > 0) { // popup has been triggered from a widget player 2455 playButton.click(); 2456 } else if(singlePlayerButton.length > 0){ // popup has been triggered from a single player 2457 singlePlayerButton.click(); 2458 } else if(IRON.sonaar.player.selectedPlayer){ // popup has been triggered from a sticky player 2459 var selectedPlayerWidget = IRON.sonaar.player.selectedPlayer[0]; 2460 var postId = audioPlayer.list.tracks[0].sourcePostID; 2461 var trackPos = audioPlayer.list.tracks[0].track_pos; 2462 playButton = $(selectedPlayerWidget).find('.sr-playlist-item[data-post-id="'+postId+'"][data-track-pos="'+trackPos+'"] .srp_audio_trigger'); 2463 if(playButton.length > 0){ 2464 playButton.click(); 2465 }else{ 2466 play(audioPlayer, $audio_el, playlist); 2467 } 2468 }else{ // condition cta wont work but the track will still be able to play 2469 play(audioPlayer, $audio_el, playlist); 2470 } 2471 }else{ 2472 play(audioPlayer, $audio_el, playlist); 2473 } 2474 } 2475 event.preventDefault(); 2476 }); 2477 audioPlayer.on("click", ".previous", function (event) { 2478 previous(audioPlayer, playlist); 2479 event.preventDefault(); 2480 }); 2481 audioPlayer.on("click", ".next", function (event) { 2482 next(audioPlayer, $audio_el, playlist); 2483 event.preventDefault(); 2484 }); 2485 } else { 2486 audioPlayer.on("click", ".play, .album .album-art", function (event) { 2487 2488 if(!audioPlayer.hasClass('sr_selected') && !audioPlayer.hasClass('audio-playing')){ 2489 sr_addTrackToPlaylist( $(audioPlayer).find('.playlist li').eq($(audioPlayer).attr('trackselected')), audioPlayer); 2490 } 2491 togglePause(audioPlayer); 2492 2493 if (!audioPlayer.hasClass("audio-playing")) { 2494 play(audioPlayer, $audio_el); 2495 triggerPlay(audioPlayer); 2496 } else { 2497 togglePause(audioPlayer); 2498 } 2499 togglePlaying(audioPlayer, $audio_el); 2500 event.preventDefault(); 2501 }); 2502 audioPlayer.on("click", ".previous", function (event) { 2503 previous(audioPlayer, playlist); 2504 event.preventDefault(); 2505 }); 2506 audioPlayer.on("click", ".next", function (event) { 2507 next(audioPlayer, $audio_el, playlist); 2508 event.preventDefault(); 2509 }); 2510 } 2511 audioPlayer.on("click", ".sr_skipForward", function () { 2512 sr_audioSkipTo(30, $audio_el); 2513 }); 2514 audioPlayer.on("click", ".sr_skipBackward", function () { 2515 sr_audioSkipTo(-15, $audio_el); 2516 }); 2517 audioPlayer.on("click", ".sr_shuffle", function (event) { 2518 sr_shuffleToggle(event, audioPlayer); 2519 }); 2520 audioPlayer.on("click", ".srp_repeat", function () {
2521 IRON.repeatButtonToggle(); 2522 }); 2523 audioPlayer.on("click", ".sr_speedRate", function (event) { 2524 sr_setSpeedRate(event, audioPlayer, $audio_el); 2525 }); 2526 audioPlayer.on("click", ".volume .sricon-volume", function (event) { 2527 sr_muteTrigger(event, audioPlayer, $audio_el); 2528 }); 2529 audioPlayer.on("mouseenter", ".volume .sricon-volume", function (event) { 2530 sr_updateSlider(event, audioPlayer); 2531 }); 2532 audioPlayer.on('click', '.srp_swiper-control .srp_play', function (event) { 2533 IRON.swiper.play(this, audioPlayer); 2534 }); 2535 2536 audioPlayer.on("click", ".srp_noteButton i", function () { 2537 let noteParent; 2538 if ($(this).parents('.sr-playlist-item').length) { 2539 noteParent = $(this).parents('.sr-playlist-item'); 2540 } else { 2541 noteParent = $(this).parents('.srp_player_boxed'); 2542 } 2543 if (noteParent.find('.srp_note').length == 0) { 2544 const el = $(this); 2545 srp_wc_loadspinner(el); 2546 var data = { 2547 'action': 'load_track_note_ajax', 2548 'post-id': $(this).attr('data-source-post-id'), 2549 'track-position': $(this).attr('data-track-position'), 2550 'track-title': $(this).attr('data-track-title'), 2551 'track-desc-postcontent': $(this).attr('data-track-use-postcontent'), 2552 'nonce': sonaar_music.ajax.ajax_nonce 2553 }; 2554 2555 $.post(sonaar_music.ajax.ajax_url, data, function (response) { 2556 srp_wc_unloadspinner(el); 2557 response = JSON.parse(response); 2558 const notePopup = $('<article/>', { class: 'srp_note' }); 2559 $(notePopup).hide(); 2560 $(notePopup).prepend('<div class="sr_close">' + closeSvg + '</div>' + response); 2561 if (el.parents('.sr-playlist-item').length) { 2562 if (el.parents('.sr-playlist-item').find('.srp_note').length == 0) { //not insert the note if it is already append 2563 if(el.parents('.srp_tracklist_grid').length){ 2564 el.parents('.sr-playlist-item').find('.store-list').before(notePopup); 2565 }else{ 2566 el.parents('.sr-playlist-item').append(notePopup); 2567 } 2568 } 2569 toggleNote(el); 2570 } else { 2571 $(audioPlayer).find('.srp_player_boxed').prepend(notePopup); 2572 toggleNote(el); 2573 } 2574 }) 2575 } else { 2576 toggleNote($(this)); 2577 } 2578 }); 2579 2580 audioPlayer.on('click', '.sr_track_cover', function (event) { 2581 if( !audioPlayer.hasClass('srp_tracklist_grid') ) return; 2582 if ( $(event.target).is('.srp_play')) return; 2583 if( $('.srp_play:hover').length ) return; //if the play button is hovered, do nothing 2584 2585 if ($(this).parents('.sr-playlist-item').data('post-url')) { 2586 // l'option to link the tracklist title is enable 2587 // go to the post url 2588 window.location.href = $(this).parents('.sr-playlist-item').data('post-url'); 2589 } 2590 }); 2591 audioPlayer.on('click', '.sr_track_cover .srp_play', function () { 2592 $(this).parents('.sr-playlist-item').find('.srp_audio_trigger').click(); 2593 }); 2594 audioPlayer.on("click", ".srp_note .sr_close", function () { 2595 toggleNote($(this)); 2596 }); 2597 audioPlayer.on('mouseenter', '.sr-playlist-item:not(.srp_extendable) .song-store-list-menu', function () { 2598 openStoreListContainer(this); 2599 }); 2600 audioPlayer.on('mouseleave', '.sr-playlist-item:not(.srp_extendable) .song-store-list-container', function () { 2601 closeStoreListContainer(this); 2602 }); 2603 2604 audioPlayer.on('mouseenter', '.srp_extendable, .song-store-list-menu, .srp_ellipsis', function () { 2605 if( 2606 ($(audioPlayer).hasClass('srp_responsive') && $('.song-store-list-menu:hover, .srp_ellipsis:hover').length ) || 2607 ! audioPlayer.hasClass('srp_responsive') 2608 ){ 2609 const el = ( $(this).hasClass('srp_extendable') )? $(this) : $(this).parents('.srp_extendable'); 2610 el.find('.song-store-list-menu').width('fit-content'); 2611 el.addClass('srp_extended') 2612 } 2613 }); 2614 audioPlayer.on('mouseleave', '.srp_extendable', function () { 2615 let width; 2616 if(audioPlayer.hasClass('srp_responsive')){ 2617 width = ( $(this).find('.song-store-list-menu').data('mobile-width') )? $(this).find('.song-store-list-menu').data('mobile-width') : 100 ; 2618 }else{ 2619 width = ( $(this).find('.song-store-list-menu').data('width') )? $(this).find('.song-store-list-menu').data('width') : 200 ; 2620 } 2621 $(this).find('.song-store-list-menu').width(width); 2622 $(this).removeClass('srp_extended') 2623 }); 2624 2625 audioPlayer.on('click', '.srp_wc_variation_button', function () { 2626 if($(this).find('.sricon-spinner-wrap').length) return; //if the button is already loading, do nothing 2627 srp_variation_button(this); 2628 return false;
2629 }) 2630 audioPlayer.on('click', '.srp-make-offer-bt', function () { 2631 if($(this).find('.sricon-spinner-wrap').length) return; //if the button is already loading, do nothing 2632 srp_variation_button(this); 2633 return false; 2634 }) 2635 2636 // Event listener for the regular audio player 2637 audioPlayer.on('click', '.sr_store_ask_email', function(e) { 2638 e.preventDefault(); 2639 handleAskEmailClick($(this)); 2640 }); 2641 2642 audioPlayer.find('.playlist .ajax_add_to_cart').on('click', function () { 2643 srp_add_to_cart_loadspinner($(this)); 2644 }) 2645 2646 //Store button ajax call for popup 2647 audioPlayer.off('click', '.sr-store-popup'); 2648 audioPlayer.on('click', '.sr-store-popup', function () { 2649 let playerId = 0; 2650 const el = this; 2651 $(IRON.players).each(function () { 2652 if (this.audioPlayer.id == $(el).parents('.iron-audioplayer').data('id')) { 2653 playerId = this.audioPlayer.id; 2654 return; 2655 } 2656 }) 2657 const id = $(this).data('source-post-id'); 2658 const storeId = $(this).data('store-id'); 2659 const trackNumber = $(this).parents('.sr-playlist-item').index(); 2660 sr_popUp(id, storeId, trackNumber, playerId, $(this)); 2661 }) 2662 audioPlayer.find('.srp_search').keydown(function(e) { //Trigger search on keyup 2663 IRON.searchField.search(this, e); 2664 }); 2665 } 2666 2667 2668 function toggleNote(el) { 2669 let noteParent; 2670 if (el.parents('.sr-playlist-item').length) { 2671 noteParent = el.parents('.sr-playlist-item'); 2672 } else { 2673 noteParent = el.parents('.srp_player_boxed'); 2674 } 2675 const currentOpened = (noteParent.find('.srp_note').attr('data-note') == 'opened') ? true : false; 2676 el.parents('.iron-audioplayer').find('.srp_note_opened').each(function () { 2677 const item = $(this); 2678 $(this).removeClass('srp_note_opened'); 2679 $(this).find('.srp_note').attr('data-note', 'closed') 2680 if (el.parents('.sr-playlist-item').length) { 2681 $(this).find('.srp_noteButton i.sricon-close-circle').removeClass('sricon-close-circle').addClass('sricon-info'); 2682 $(this).find('.srp_note').css('opacity', 1).slideUp(125, function () { 2683 if (item.find('.srp_track_description').length) { 2684 item.find('.srp_track_description').fadeIn(75); 2685 } 2686 }).animate( 2687 { opacity: 0 }, 2688 { queue: false, duration: 125 } 2689 ); 2690 } else { 2691 $(this).find('.srp_note').fadeOut(125); 2692 } 2693 }); 2694 if (!currentOpened) { 2695 noteParent.find('.srp_note').attr('data-note', 'opened'); 2696 if (el.parents('.sr-playlist-item').length) { 2697 noteParent.find('.srp_noteButton i.sricon-info').removeClass('sricon-info').addClass('sricon-close-circle'); 2698 if (noteParent.find('.srp_track_description').length) { 2699 noteParent.find('.srp_track_description').fadeOut(75, function () { 2700 noteParent.find('.srp_note').css('opacity', 0).slideDown(125).animate( 2701 { opacity: 1 }, 2702 { queue: false, duration: 250 } 2703 ); 2704 }); 2705 } else { 2706 noteParent.find('.srp_note').css('opacity', 0).slideDown(125).animate( 2707 { opacity: 1 }, 2708 { queue: false, duration: 250 } 2709 ); 2710 } 2711 } else { 2712 noteParent.find('.srp_note').fadeIn(125); 2713 } 2714 noteParent.addClass('srp_note_opened'); 2715 } 2716 } 2717 /* 2718 Set Lyrics of what is currently playing 2719 */ 2720 function karaokeMode(audioPlayer, currentTime) { 2721 var selectedLyricLine = ''; 2722 var i = 0 2723 if ($(audioPlayer).length == 0 && IRON?.sonaar?.player?.currentTrack != null) { 2724 //Sticky player is loaded on page load setting. Check if it has lyrics. 2725 var currentTrack = IRON.sonaar.player.currentTrack; 2726 if(!IRON.sonaar.player.list.tracks[currentTrack].has_lyric) return; 2727 var playerId = 0; 2728 }else if (audioPlayer.stickyPlayer) { 2729 var currentTrack = IRON.sonaar.player.currentTrack; 2730 if(!IRON.sonaar.player.list.tracks[currentTrack].has_lyric) return; 2731 var playerId = IRON.sonaar.player.selectedPlayer.id; 2732 } else { 2733 if($(audioPlayer).find('.sr-playlist-item.current').data('track-lyric') != '1') return; 2734 var currentTrack = $(audioPlayer).find('.sr-playlist-item.current').index(); 2735 var playerId = $('.iron-audioplayer.sr_selectedPlayer').data('id'); 2736 } 2737 2738 $('.srp_selected_player').removeClass('srp_selected_player'); 2739 2740 $('#sonaar-modal[data-track-number="' + currentTrack + '"][data-player-id="' + playerId + '"]').addClass("srp_
2740selected_player"); 2741 while (i < 3 && selectedLyricLine.length == 0) { 2742 selectedLyricLine = $('#srmp3_lyrics_container p[begin="' + (currentTime - i) + '"], #srmp3_lyrics_container p[begin^="' + Math.floor(currentTime - i) + '."], #sonaar-modal.srp_selected_player p[begin="' + (currentTime - i) + '"], #sonaar-modal.srp_selected_player p[begin^="' + Math.floor(currentTime - i) + '."]') 2743 i++; 2744 } 2745 2746 if (selectedLyricLine.length) { 2747 selectedLyricLine.parents('.srmp3_lyrics, #sonaar-modal.srp_selected_player').addClass("srmp3_singning"); 2748 2749 $(".srmp3_lyrics_read").removeClass("srmp3_lyrics_read"); 2750 selectedLyricLine.addClass("srmp3_lyrics_read"); 2751 jQuery('#srmp3_sticky_lyrics').replaceWith( 2752 jQuery('<span>', { 2753 id: 'srmp3_sticky_lyrics', 2754 class: 'srmp3_lyrics_container', 2755 title: $(selectedLyricLine[0]).text(), 2756 text: $(selectedLyricLine[0]).text() 2757 }).appendTo('#srmp3_lyricsplaying_container')); 2758 2759 // keep lyrics centered in the modal 2760 if (!document.getElementById('srmp3_lyrics_container').classList.contains('srp_lyric_unlock')) { 2761 srp_lyricsAreScrolling = true; 2762 var element = document.querySelector("#srmp3_lyrics_container .srmp3_lyrics_read"); 2763 element.scrollIntoView({ behavior: "auto", block: "center", inline: "nearest" }); 2764 } 2765 } 2766 2767 } 2768 function fakeWaveClick(from) { 2769 $(".sr_selectedPlayer .sonaar_fake_wave, #sonaar-player .sonaar_fake_wave, .mobileProgress").off("click"); 2770 $(".sr_selectedPlayer .sonaar_fake_wave, #sonaar-player .sonaar_fake_wave, .mobileProgress").on("click", function (event) { 2771 if( $(this).parents('.iron-audioplayer').length && ! $(this).parents('.sr_selectedPlayer').length){ 2772 return; 2773 } 2774 if($(this).parents('.sr-playlist-item:not(.current)').length){ 2775 $(this).parents('.sr-playlist-item').find('.srp_audio_trigger').trigger('click'); 2776 } 2777 if (from == "sticky") { 2778 var currentAudio = document.getElementById("sonaar-audio"); 2779 } else { 2780 var currentAudio = $(this).parents('.iron-audioplayer').find('.album-player .sonaar_media_element')[0]; 2781 } 2782 var progressedAudio = $(this).width() / event.offsetX; 2783 2784 function waitUntilNewTrackIsloaded() { //when we click on waveform from the tracklist, we need to wait until the new track is loaded before seeking to the right position 2785 if( !isNaN(currentAudio.duration) ) { 2786 const duration = (currentAudio.duration == 'Infinity')? currentAudio.buffered.end(currentAudio.buffered.length-1) : currentAudio.duration; 2787 currentAudio.currentTime = duration / progressedAudio; 2788 event.preventDefault(); 2789 clearInterval(intervalId); 2790 } 2791 } 2792 const intervalId = setInterval(waitUntilNewTrackIsloaded, 50); 2793 setTimeout(() => { 2794 clearInterval(intervalId); 2795 }, 3000); 2796 }); 2797 } 2798 2799 function preSetSingleTrack(singleTrack) { 2800 var soundwaveWrapper = singleTrack.find('.srp_soundwave_wrapper'); 2801 var storeList = singleTrack.find('.store-list'); 2802 var costumFieldColumns = singleTrack.find('.sr-playlist-cf-container'); 2803 var noteButton = singleTrack.find('.srp_noteButton'); 2804 const date = (typeof singleTrack.data('date-formated'))? singleTrack.data('date-formated') : ''; 2805 singleTrack.removeAttr('data-date-formated'); 2806 2807 singleTrack.find('.srp_soundwave_wrapper, .store-list, .sr-playlist-cf-container, .srp_noteButton').remove(); 2808 singleTrack.find(".audio-track").remove(); 2809 2810 $(""); 2811 var audioTrigger = $("<div/>", { 2812 class: 'srp_audio_trigger' 2813 }) 2814 2815 singleTrack.find('.srp_tracklist-item-date').remove(); 2816 let tracklistItemMeta = '<span class="srp_tracklist-item-date" date="' + singleTrack.data('date') + '"'; 2817 if (singleTrack.data('show-date') != '1') { 2818 tracklistItemMeta += ' style="display:none;"' 2819 } 2820 tracklistItemMeta += '>' + date + '</span>'; 2821 tracklistItemMeta += '<span class="tracklist-item-time">' + singleTrack.data("tracktime") + '</span>'; 2822 2823 if (singleTrack.data('post-url')) { // l'option to link the tracklist title is enable 2824 var tracklistItemContentBox = $("<div/>", { class: 'audio-track' }); 2825 var playAndNumber = audioTrigger; 2826 var tracklistItemTitle = $("<a/>", { class: 'tracklist-item-title', href: singleTrack.data('post-url') }).append(singleTrack.data('tracktitle')); 2827 } else { 2828 var tracklistItemContentBox = $(audioTrigger).addClass('audio-track'); 2829 var tracklistItemTitle = $("<div/>", { class: 'tracklist-item-title' }).append(singleTrack.data('tracktitle')); 2830 var playAndNumber = $("<span/>", { 2831 class: 'track-number', 2832 html: 2833 '<span class="number"></span><i class="sricon-play" aria-label="Play Track"></i>', 2834 }); 2835 } 2836 2837 tracklistItemContentBox 2838 .append(playAndNumber) 2839 .append(tracklistItemTitle) 2840 .append(soundwaveWrapper) 2841 .append(tracklistItemMeta); 2842 2843 var playlistItemFlex = singleTrack.find('.sr-playlist-item-flex').length ? singleTrack.find('.sr-playlist-item-flex') : singleTrack; 2844 2845 playlistItemFlex 2846 .append(tracklistItemContentBox) 2847 .append(costumFieldColumns) 2848 .append(storeList) 2849 .append(noteButton); 2850 } 2851 2852 function setFrontendSingleTrack(singleTrack, eq, trackNumber, $audio_el, audioPlayer) { 2853 singleTrack.data('init', true); //Dont init twice the same track with listjs 2854 singleTrack.find('.srp_audio_trigger').on("click", function (event) { 2855 if ($(event.target).closest('.srp_soundwave_wrapper').length) { 2856 return; 2857 } 2858 if ($(this).find('.srp_noteButton:hover').length ) { //if we click on the note button: Note button could be inside the srp_audio_trigger in the tracklist grid layout 2859 return; 2860 } 2861 2862 if ($(this).parents('.sr-playlist-item').attr("data-audiopath").length == 0) { 2863 return; 2864 } 2865 2866 if ( !IRON.audioPlayer.stickyEnable && audioPlayer.hasClass('srp_reordered') || audioPlayer.hasClass('srp_player_is_favorite')) { 2867 eq = $(this).parents('.sr-playlist-item').index(); //Base the EQ value on the tracklist order when the track list has been manipulated by filter or favorite 2868 } 2869 2870 if (audioPlayer.stickyPlayer && $(audioPlayer).hasClass('sr_selectedPlayer') && IRON.sonaar.player.currentTrack == eq) { //IF track already loaded in the sticky player 2871 IRON.sonaar.player.play(); 2872 return; 2873 } 2874 2875 if (audioPlayer.stickyPlayer) { 2876 IRON.sonaar.player.setPlaylist(audioPlayer, eq, srp_startingTime); 2877 srp_startingTime = 0; 2878 audioPlayer.data("currentTrack", eq); 2879 } 2880 2881 if (ifTrackIsPlaying($audio_el) && singleTrack.hasClass("current") && $(audioPlayer).hasClass('sr_selected')) { 2882 if (audioPlayer.stickyPlayer) { 2883 play(audioPlayer, $audio_el); 2884 } else { 2885 2886 togglePause(audioPlayer); 2887 togglePlaying(audioPlayer, $audio_el); 2888 } 2889 } else if (singleTrack.hasClass("current") && $(audioPlayer).hasClass('sr_selected')) { 2890 play(audioPlayer, $audio_el); 2891 } else { 2892 if (!audioPlayer.stickyPlayer) { 2893 togglePause(audioPlayer); 2894 setAudio(singleTrack.data("audiopath"), $audio_el); 2895 $audio_el.play(); 2896 } 2897 2898 setCurrentTrack(singleTrack, eq, audioPlayer, $audio_el); 2899 $(document).trigger("sonaarStats", [audioPlayer]); 2900 audioPlayer.find(".playlist li").removeClass("current"); 2901 singleTrack.addClass("current"); 2902 2903 2904 if (!audioPlayer.stickyPlayer) { 2905 sr_addTrackToPlaylist(singleTrack, audioPlayer); 2906 IRON.audioPlayer.sr_loadLyricsAjax(singleTrack.attr("data-post-id"), singleTrack.attr("data-track-pos")); 2907 } 2908 triggerPlay(audioPlayer); 2909 togglePlaying(audioPlayer, $audio_el); 2910 IRON.audioPlayer.activePlayer = audioPlayer; 2911 var trackTitle = String(singleTrack.data("tracktitle")).replace(/<span.*?span>/g, ''); 2912 var albumTitle = singleTrack.data("albumtitle"); 2913 var artistName = singleTrack.data("artist"); 2914 var albumArt = singleTrack.data("albumart"); 2915 2916 IRON.audioPlayer.currentTrackData = { 2917 trackTitle: trackTitle, 2918 albumTitle: albumTitle, 2919 artistName: artistName, 2920 albumArt: albumArt 2921 } 2922 2923 setMediaSessionAPI(trackTitle, albumTitle, artistName, albumArt); 2924 } 2925 if(audioPlayer.hasClass('srp_player_spectrum') && !audioPlayer.stickyPlayer){ 2926 startAudioSpectrum(audioPlayer); 2927 } 2928 2929 IRON.init_generatePeaks(audioPlayer); 2930 2931 event.preventDefault(); 2932 }); 2933 2934 if (singleTrack.data('post-url')) { // l'option to link the tracklist title is enable 2935 singleTrack.find('.srp_audio_trigger').addClass('track-number').html('<span class="number">' + trackNumber + '</span><i class="sricon-play" aria-label="Play Track"></i>'); 2936 }else{ 2937 singleTrack.find('.track-number .number').html(trackNumber); 2938 } 2939 2940 singleTrack.find('.store-list').before(singleTrack.find('.audio-track')); 2941 if( $(audioPlayer).hasClass('srp_tracklist_grid') ){ 2942 singleTrack.find('.audio-track').after(singleTrack.find('.srp_soundwave_wrapper')); 2943 singleTrack.find('.store-list').before(singleTrack.find('.srp_tracklist-item-date')); 2944 singleTrack.find('.store-list').before(singleTrack.find('.srp_track_description')); 2945 singleTrack.find('.audio-track').append(singleTrack.find('.srp_noteButton')); 2946 } 2947 2948 singleTrack.find('.sr-playlist-cf-container').before(singleTrack.find('.audio-track')); 2949 singleTrack.find('.sr-playlist-cf-container').before(singleTrack.find('.sr_track_cover.srp_spacer')); 2950 if(singleTrack.find('.srp_soundwave_wrapper').length){ 2951 IRON.createFakeWave(audioPlayer, false, singleTrack); 2952 } 2953 2954 if(audioPlayer.trackMemory){ 2955 const trackMemoryKey = IRON.getTrackMemoryKeyFormat(singleTrack.data('audiopath')); 2956 if(typeof IRON.localStorageTrackMemory[trackMemoryKey] == 'object'){ 2957 const [currentTime, duration] = IRON.localStorageTrackMemory[trackMemoryKey]; 2958 singleTrack.data( 'current-time', IRON.localStorageTrackMemory[trackMemoryKey][0] ); 2959 singleTrack.find('.sonaar_wave_cut').width((currentTime / duration) * 100 + "%"); 2960 audioPlayer.list.tracks[eq].hasCompleted = (typeof IRON.localStorageTrackMemory[trackMemoryKey][2] != 'undefined' && IRON.localStorageTrackMemory[trackMemoryKey][2] == true)? true : false;
2961 } 2962 singleTrack.data( 'track-memory-key', trackMemoryKey ); 2963 } 2964 } 2965 2966 function trackListItemResize() { 2967 $(".playlist li").each(function () { 2968 var storeWidth = $(this).find(".store-list").outerWidth(); 2969 var trackWidth = $(this).find(".track-number").outerWidth(); 2970 $(this) 2971 .find(".tracklist-item-title") 2972 .css("max-width", $(this).outerWidth() - storeWidth - trackWidth - 10); 2973 }); 2974 } 2975 2976 var setAudio = function (audio, $audio_el) { 2977 // setAudio function is not called when sticky player is enable 2978 2979 if(typeof audioPlayer.hasPlayed == 'undefined'){ // Register the audio object a first time for iOS to continue to next track on lock mode. 2980 elementAudio.src = audio; 2981 } 2982 jQuery($audio_el).attr("src", audio); 2983 $audio_el.load(); 2984 if (!audioPlayer.stickyPlayer) { 2985 $(".sr_selectedPlayer").removeClass("sr_selectedPlayer"); 2986 $($audio_el).parents(".iron-audioplayer").addClass("sr_selectedPlayer"); 2987 } 2988 fakeWaveClick("widget"); 2989 audioPlayer.removeData('track_from_outer_page'); //'track_from_outer_page' is true when player play a track from another ajax page(pagination) 2990 }; 2991 2992 function getTime($audio_el) { 2993 return $audio_el.getCurrentTime(); 2994 } 2995 2996 function togglePlaying(audioPlayer, $audio_el) { 2997 $(".iron-audioplayer").removeClass("sr_selected"); 2998 audioPlayer.addClass("sr_selected"); 2999 3000 $(".iron-audioplayer, .srmp3_sonaar_ts_shortcode").removeClass("audio-playing"); 3001 3002 3003 if (ifTrackIsPlaying($audio_el)) { 3004 audioPlayer.addClass("audio-playing"); 3005 if (typeof audioPlayer.data('ts-sync') != 'undefined') { 3006 $('#sonaar_ts-' + audioPlayer.data('ts-sync')).addClass("audio-playing"); 3007 } 3008 audioPlayer.find('.currentTime, .totalTime').show(); 3009 return; 3010 } 3011 3012 $("#sonaar-player .play").removeClass("audio-playing"); 3013 3014 } 3015 3016 function togglePause(audioPlayer) { 3017 $.each(IRON.players, function (index) { 3018 if (IRON.players[index] != audioPlayer) { 3019 IRON.players[index].audioPlayer.find(".album-player .sonaar_media_element")[0].pause() 3020 } 3021 }); 3022 } 3023 3024 function play(audioPlayer, $audio_el, playlist) { 3025 var currentTrack = audioPlayer.data("currentTrack"); 3026 IRON.init_generatePeaks(audioPlayer); 3027 if (audioPlayer.stickyPlayer) { 3028 $audio_el.pause(); 3029 if (typeof playlist !== "undefined") { 3030 playlist.find("li").eq(currentTrack).find('.srp_audio_trigger').click(); 3031 } 3032 } else { 3033 if(currentTrack != 999999){ // CurrentTrack equal 999999 when the track is not in a playlist caused by list.js 3034 if($($audio_el).attr('src') == ''){ 3035 setAudio($(audioPlayer).find('.playlist li').eq($(audioPlayer).attr('trackselected')).data("audiopath"), $audio_el); 3036 $(document).trigger("sonaarStats", [audioPlayer]); 3037 } 3038 if (!audioPlayer.find(".playlist li").hasClass("current") && audioPlayer.data('track_from_outer_page') !== true) { //'track_from_outer_page' is true when player play a track from another ajax page(pagination), so dont set the current class to a track from the tracklist 3039 var trackListElement = $(audioPlayer).find('.playlist li').eq($(audioPlayer).attr('trackselected')); 3040 trackListElement.addClass("current"); 3041 if (!audioPlayer.stickyPlayer) { 3042 IRON.audioPlayer.sr_loadLyricsAjax(trackListElement.attr("data-post-id"), trackListElement.attr("data-track-pos")); 3043 } 3044 } 3045 } 3046 if (ifTrackIsPlaying($audio_el)) { 3047 $audio_el.pause(); 3048 } else { 3049 $audio_el.play(); 3050 } 3051 togglePlaying(audioPlayer, $audio_el); 3052 } 3053 } 3054 3055 function previous(audioPlayer, playlist) { 3056 3057 var audio_el = ( IRON.audioPlayer.stickyPlayer )? document.getElementById('sonaar-audio') : audioPlayer.find('.sonaar_media_element')[0]; 3058 if( audio_el.currentTime > IRON.previousTrackThreshold ){ //Resets the track to the beginning Or go to the previous track. 3059 audio_el.currentTime = 0; 3060 return; 3061 } 3062 3063 if (IRON.audioPlayer.stickyEnable && audioPlayer.hasClass('sr_selectedPlayer')) { 3064 IRON.sonaar.player.previous() 3065 } else { 3066 var currentTrack = audioPlayer.data("currentTrack"); 3067 var nextTrack; 3068 if (audioPlayer.shuffle) { 3069 $(random_order).each(function (index) { 3070 if (this == currentTrack) { 3071 if (index == 0 && ! audioPlayer.hasClass('srp_noLoopTracklist')) { 3072 //if it is the first track form the shuffle order 3073 nextTrack = random_order[random_order.length - 1]; 3074 } else { 3075 nextTrack = random_order[index - 1]; 3076 } 3077 } 3078 }); 3079 } else { 3080 nextTrack = currentTrack - 1; 3081 } 3082 3083 playlist.find("li").eq(nextTrack).find('.srp_audio_trigger').click(); 3084 } 3085 } 3086 3087 function next(audioPlayer, $audio_el, playlist) { 3088 if (IRON.audioPlayer.stickyEnable && audioPlayer.hasClass('sr_selectedPlayer')) { 3089 IRON.sonaar.player.next() 3090 } else { 3091 var currentTrack = audioPlayer.data("currentTrack"); 3092 var nextTrack; 3093 3094 if (audioPlayer.shuffle) { 3095 $(random_order).each(function (index) { 3096 if (this == currentTrack) { 3097 if (index >= random_order.length - 1 && ! audioPlayer.hasClass('srp_noLoopTracklist')) { 3098 //if it is the last track form the shuffle order 3099 nextTrack = random_order[0]; 3100 } else { 3101 nextTrack = random_order[index + 1]; 3102 } 3103 } 3104 }); 3105 } else { 3106 nextTrack = currentTrack + 1; 3107 } 3108 3109 if(!playlist.find("li").eq(nextTrack).length && audioPlayer.hasClass('srp_noLoopTracklist') && !IRON.audioPlayer.stickyEnable){ 3110 wavesurfer.pause(); 3111 audioPlayer.removeClass("audio-playing"); 3112 $('.srmp3_sonaar_ts_shortcode').removeClass("audio-playing"); 3113 }else{ 3114 if (!playlist.find("li").eq(nextTrack).length) { 3115 nextTrack = 0; 3116 } 3117 $audio_el.pause(); 3118 playlist.find("li").eq(nextTrack).find('.srp_audio_trigger').click(); 3119 } 3120 } 3121 } 3122 3123 function getPlayer() { 3124 return this; 3125 } 3126 function getplay() { 3127 play(this.audioPlayer, this.$audio_el); 3128 } 3129 3130 function ifTrackIsPlaying($audio_el) { 3131 return !$audio_el.paused; 3132 } 3133 3134 var fakeWaveUpdate = function ($audio_el, audioPlayer, playlist) { 3135 $($audio_el).off("ended"); 3136 $($audio_el).on("ended", function () { 3137 IRON.setTracksTimeMemories(audioPlayer, 0, true); //Reset the track time memory when the track is ended 3138 audioPlayer.list.tracks[audioPlayer.data('currentTrack')].hasCompleted = true; 3139 if(IRON.repeatStatus !== false){ 3140 //console.log(audioPlayer.notrackskip); 3141 if(IRON.repeatStatus === 'track' && audioPlayer.notrackskip !== "on"){ 3142 sr_setTrackCurrentTime(0); 3143 $audio_el.play(); 3144 return; 3145 } 3146 3147 if(audioPlayer.data('currentTrack') + 1 >= audioPlayer.find('li').not('[data-relatedtrack="1"]').length && IRON.repeatStatus !== 'playlist' ){ 3148 return; 3149 } 3150 } 3151 3152 if (audioPlayer.notrackskip !== "on") { 3153 audioPlayer.hasPlayed = true; 3154 next(audioPlayer, $audio_el, playlist); 3155 } else { 3156 audioPlayer.removeClass("audio-playing"); 3157 $('.srmp3_sonaar_ts_shortcode').removeClass("audio-playing"); 3158 } 3159 }); 3160 $($audio_el).on("timeupdate", function () { 3161 const duration = (this.duration == 'Infinity')? this.buffered.end(this.buffered.length-1) : this.duration; 3162 $(audioPlayer) 3163 .find('.album-player .sonaar_wave_cut, .sr-playlist-item.current .sonaar_wave_cut') 3164 .width(((this.currentTime + 0.35) / duration) * 100 + "%"); 3165 }); 3166 }; 3167 3168 function setTrackSoundwaveCursor($audioPlayer){ 3169 if(!$audioPlayer.setTrackSoundwaveCursor || ! $audioPlayer.find('.srp_soundwave_wrapper').length) return; 3170 3171 var player = $audioPlayer[0]; 3172 var tooltip; 3173 var verticalLine; 3174 if (! $audioPlayer.find('.sr_tracklenght_tooltip').length){ 3175 tooltip = document.createElement('div'); 3176 tooltip.className = 'sr_tracklenght_tooltip'; 3177 player.appendChild(tooltip); 3178 3179 verticalLine = document.createElement('div'); 3180 verticalLine.className = 'sr_tracklenght_tooltip_vertical'; 3181 player.appendChild(verticalLine); 3182 }else{ 3183 tooltip = document.querySelector('.sr_tracklenght_tooltip'); 3184 verticalLine = document.querySelector('.sr_tracklenght_tooltip_vertical'); 3185 } 3186 3187 player.querySelectorAll('.srp_soundwave_wrapper .sonaar_fake_wave').forEach(function (element) { 3188 element.addEventListener('mousemove', function(e) { 3189 const timelineWidth = this.offsetWidth; 3190 const rect = this.getBoundingClientRect(); 3191 const offsetX = e.clientX - rect.left; 3192 const trackLength = $(element).parents('.sr-playlist-item').data('tracktime'); 3193 const duration = convertTime(trackLength); 3194 const time = (offsetX / timelineWidth) * duration; 3195 const fixedTooltipTopPosition = $(element).offset().top - $(player).offset().top; 3196 if (isNaN(time)) { 3197 return; 3198 } 3199 tooltip.innerText = formatTime(time); 3200 tooltip.style.transform = 'translateY(5px) scale(1)'; 3201 tooltip.style.opacity = '1'; 3202 tooltip.style.left = `${e.pageX - $(player).offset().left - 59}px`; 3203 tooltip.style.top = `${fixedTooltipTopPosition - 30}
3203px`; 3204 3205 verticalLine.style.display = 'block'; 3206 verticalLine.style.height = `${this.offsetHeight+20}px`; 3207 verticalLine.style.left = `${e.pageX - $(player).offset().left}px`; 3208 verticalLine.style.top = `${fixedTooltipTopPosition-10}px`; 3209 }); 3210 3211 element.addEventListener('mouseout', function() { 3212 tooltip.style.transform = 'translateY(20px) scale(0.5)'; 3213 tooltip.style.opacity = '0'; 3214 verticalLine.style.display = 'none'; 3215 }); 3216 }); 3217 3218 function convertTime(time) { 3219 const parts = time.split(':'); 3220 return (+parts[0]) * 60 + (+parts[1]); 3221 } 3222 function formatTime(seconds) { 3223 const date = new Date(0); 3224 date.setSeconds(seconds); 3225 return date.toISOString().slice(11, 19); 3226 } 3227 3228 } 3229 3230 3231 function ajaxInitPage() { 3232 setIronAudioplayers(); 3233 resetsrp_vars(); 3234 setStickyPlayer(); 3235 stickyPlayerFromPageOption(); 3236 } 3237 function startAjaxPreloaderAnim(player){ 3238 player.find('.srp_shimmer_container').remove(); 3239 player.find('.srp_notfound').css('display', 'none'); 3240 const container = document.createElement('div'); 3241 container.className = 'srp_shimmer_container'; 3242 var cardWidthPercentage; 3243 var shimmerNum = player.find('.srp_list .sr-playlist-item').length; 3244 if(player.find('.srp_list .sr-playlist-item').length < 1){ 3245 shimmerNum = player.srp_player_param.posts_per_page; 3246 } 3247 const gridColumns = (typeof player.srp_player_param.grid_column_number != 'undefined') ? player.srp_player_param.grid_column_number[0]: false; 3248 let playerlayout = 'list'; 3249 if(gridColumns) { 3250 playerlayout = 'grid'; 3251 } 3252 3253 if (playerlayout === 'list') { 3254 const widths = ['40px', '50%', '10%', '10%', '10%', '2%' ,'2%']; 3255 for (let i = 0; i < shimmerNum; i++) { 3256 const rowContainer = document.createElement('div'); 3257 rowContainer.className = 'srp_shimmer_row'; 3258 3259 for (let j = 0; j < widths.length; j++) { 3260 const placeholder = document.createElement('div'); 3261 placeholder.className = 'srp_shimmer_row_el'; 3262 placeholder.style.flex = `0 0 ${widths[j]}`; 3263 3264 if (j == 0){ 3265 placeholder.style.height = '40px'; 3266 } 3267 3268 if( j>= widths.length-2){ // second last and last to be grow 3269 placeholder.style.flex = `1 0 ${widths[j]}`; 3270 } 3271 rowContainer.appendChild(placeholder); 3272 } 3273 3274 container.appendChild(rowContainer); 3275 } 3276 3277 } else if (playerlayout === 'grid') { 3278 3279 cardWidthPercentage = 100 / player.srp_player_param.grid_column_number[0] - 0.5 + "%"; // Subtracting 2% for margins 3280 for (let i = 0; i < shimmerNum; i++) { 3281 const cardContainer = document.createElement('div'); 3282 cardContainer.className = 'srp_shimmer_card'; 3283 cardContainer.style.width = cardWidthPercentage; // Set card width based on columns per row 3284 3285 const imagePlaceholder = document.createElement('div'); 3286 imagePlaceholder.className = 'srp_shimmer_row_el'; 3287 cardContainer.appendChild(imagePlaceholder); 3288 3289 const shimmerHeights = ['30px', '20px', '20px']; 3290 for (const height of shimmerHeights) { 3291 const placeholder = document.createElement('div'); 3292 placeholder.className = 'srp_shimmer_row_el'; 3293 placeholder.style.height = height; 3294 cardContainer.appendChild(placeholder); 3295 } 3296 3297 container.appendChild(cardContainer); 3298 } 3299 3300 } 3301 // Append the container to the desired location 3302 player.find('.srp_list').css('display', 'none'); 3303 player.find('.srp_list').before(container); 3304 if (playerlayout === 'grid'){ 3305 var cardWidth = $('.srp_tracklist_grid .srp_shimmer_card').width()-50; 3306 $('.srp_tracklist_grid .srp_shimmer_card > .srp_shimmer_row_el:first-child').css('height', cardWidth + 'px'); 3307 $('.srp_tracklist_grid .srp_shimmer_card').css('width', `calc(${cardWidthPercentage}
3307 - 10px)`); 3308 } 3309 3310 } 3311 3312 3313 function reloadAjax(player = null, transition = false, forced = false, unsync = true){ 3314 3315 if(!player.lazy_load && !forced){ 3316 return; 3317 } 3318 console.log('reload Ajax') 3319 if(typeof player.params == 'undefined'){ 3320 player.params = {}; // this seems undefined when loading an initial player... 3321 } 3322 //return 3323 if (typeof IRON.removePlayerResizeListeners === 'function') { 3324 IRON.removePlayerResizeListeners(player.attr('data-id')); 3325 } 3326 3327 var num = srp_convertPlayerIdToPlayerNum(player.attr('data-id')); 3328 3329 var maxDuration = 4000; 3330 var interval = 100; 3331 var elapsedTime = 0; 3332 var intervalId = setInterval(function() { //Set interval to wait for the player to be loaded: required for player inside a popup 3333 var playerIndex = srp_convertPlayerIdToPlayerNum(player.attr('data-id')); 3334 3335 if (playerIndex !== null) { 3336 3337 var playerId = player.attr('data-id').split('-'); 3338 playerId = playerId[playerId.length - 1]; // get last element of the array 3339 if( (typeof window['srp_player_params_' + playerId] == 'undefined' || typeof window['srp_player_params_args_' + playerId] == 'undefined') && $('#srp_js_params_' + playerId).length){ //if player params are not set yet (for gutenberg block editor) 3340 const scriptElement = document.getElementById('srp_js_params_' + playerId).textContent; 3341 const parts = scriptElement.split('var ').map(part => part.trim().replace(';', '')); 3342 const jsonObjects = parts.map(part => { 3343 const match = part.match(/(\w+)\s*=\s*(\{[^{}]+\})/); 3344 return match ? { variable: match[1], json: match[2] } : null; 3345 }).filter(Boolean); 3346 3347 jsonObjects.forEach(obj => { 3348 window[`${obj.variable}`] = JSON.parse(`${obj.json}`); 3349 }); 3350 } 3351 3352 var srp_player_param_args= window['srp_player_params_args_' + playerId]; 3353 player.srp_player_param = window['srp_player_params_' + playerId]; 3354 3355 if(player.data("tracks-per-page")){ 3356 player.srp_player_param['posts_per_page'] = player.data("tracks-per-page"); 3357 }else{ 3358 if(!player.hasClass('srp_player_is_recentlyPlayed')){ 3359 player.srp_player_param['posts_per_page'] = 50; //if keep this low IF Ajax is activated and we dont have a tracks per page to prevent loading too many tracks. It can crash elementor editor. 3360 } 3361 } 3362 3363 player.srp_player_param['srp_callFromAjax'] = 'true'; 3364 3365 let reformat_meta; 3366 if (player.params['meta'] && typeof player.params['meta'] === 'object') { 3367 reformat_meta = Object.entries(player.params['meta']).map(([key, value]) => `${key}:${value}`).join(';'); 3368 } 3369 3370 // meta 3371 player.srp_player_param['srp_meta'] = reformat_meta || ''; 3372 3373 // page 3374 player.srp_player_param['srp_page'] = player.params['page'] 3375 3376 //order 3377 player.srp_player_param['srp_order'] = player.params['order'] 3378 3379 // player id 3380 player.srp_player_param['srp_player_id'] = player.params['playerId'] 3381 3382 // search 3383 player.srp_player_param['srp_search'] = player.params['search'] 3384 //console.log(player.srp_player_param); 3385 player.srp_player_param['category'] = player.data('category'); 3386 3387 if(transition){ 3388 var $playlist = player.find('.srp_list'); 3389 $playlist.css({ 'opacity': 0, 'transition': 'opacity 0.15s ease' }); 3390 startAjaxPreloaderAnim(player); 3391 } 3392 var data = { 3393 'action': 'load_ajax_player', 3394 'nonce': sonaar_music.ajax.ajax_nonce, 3395 'args': srp_player_param_args, 3396 'parameters': player.srp_player_param, 3397 }; 3398 //return; 3399 if (player.currentRequest) { 3400 player.currentRequest.abort(); // Abort the previous request 3401 } 3402 var isPlaying = player.hasClass('audio-playing'); 3403 player.currentRequest = $.post(sonaar_music.ajax.ajax_url, data, function (response) { 3404 var parsedResponse = $(response); 3405 3406 var newClassList = parsedResponse.find('.iron-audioplayer').attr('class'); 3407 player.attr('class', newClassList); 3408 3409 // Update the id and data-id attributes of .iron-audioplayer 3410 var newAudioPlayerId = parsedResponse.find('.iron-audioplayer').attr('id'); 3411 var newAudioPlayerDataId = parsedResponse.find('.iron-audioplayer').attr('data-id'); 3412 var newAudioPlayerUrlPlaylist = parsedResponse.find('.iron-audioplayer').attr('data-url-playlist'); 3413 var newAudioPlayerTotalItems= parsedResponse.find('.iron-audioplayer').attr('data-total_items'); 3414 var newAudioPlayerTotalPages = parsedResponse.find('.iron-audioplayer').attr('data-total_pages'); 3415 player.attr('id', newAudioPlayerId); 3416 player.attr('data-id', newAudioPlayerDataId); 3417 player.attr('data-url-playlist', newAudioPlayerUrlPlaylist); 3418 player.attr('data-total_items', newAudioPlayerTotalItems); 3419 player.attr('data-total_pages', newAudioPlayerTotalPages); 3420 3421 if (unsync){ 3422 IRON.sonaar.player.unsyncWidgetPlayers(); 3423 } 3424 3425 // Replace the content of the .srp_list div 3426 3427 var newTracklistContent = parsedResponse.find('.srp_tracklist'); 3428 player.find('.srp_tracklist').replaceWith(newTracklistContent); 3429 3430 var newMiniPlayerMeta = parsedResponse.find('.album-player'); 3431 player.find('.album-player').replaceWith(newMiniPlayerMeta); 3432 3433 // Insert columnHeadings before srp_tracklist in the player 3434 var columnHeadings = parsedResponse.find('.sr-cf-heading'); 3435 // Check if .sr-cf-heading exists within the player 3436 if (player.find('.sr-cf-heading').length == 0) { 3437 player.find('.srp_tracklist').before(columnHeadings); 3438 3439 } 3440 3441 if(isPlaying && ! IRON.audioPlayer.stickyEnable){ 3442 player.addClass('audio-playing'); 3443 player.data('track_from_outer_page',true); //'track_from_outer_page' is true when player play a track from another ajax page(pagination) 3444 } 3445 3446 var playerObj = Object.create(IRON.audioPlayer); 3447 playerObj.init(player); 3448 3449 IRON.players[num] = playerObj; 3450 3451 updatePaginationAjax(player); 3452 3453 if (typeof IRON.advancedTriggers !== 'undefined') { 3454 IRON.advancedTriggers.applyAllScenarios(); 3455 } 3456 3457 if(transition){ 3458 player.find('.srp_shimmer_container').remove(); // remove animation 3459 $playlist.css('opacity',1); //show the playlist 3460 } 3461 }).fail(function() { 3462 console.log('An error occurred during the post operation.'); 3463 }).always(function() { 3464 player.currentRequest = null; // Reset the request when it's complete. 3465 }); 3466 3467 clearInterval(intervalId); 3468 } else { 3469 if(transition){ 3470 player.find('.srp_shimmer_container').remove(); 3471 $playlist.css('opacity',1); 3472 } 3473 elapsedTime += interval; 3474 if (elapsedTime >= maxDuration) { 3475 clearInterval(intervalId); 3476 } 3477 } 3478 }, interval); 3479 } 3480 3481//Make these functions accessible from IRON.audioPlayer 3482 return { 3483 init: initPlayer, 3484 getPlayer: getPlayer, 3485 play: getplay, 3486 autoplayEnable: autoplayEnable, 3487 triggerPlay: triggerPlay, 3488 stickyEnable: stickyEnable, 3489 ajaxInitPage: ajaxInitPage, 3490 setIronAudioplayers: setIronAudioplayers, 3491 fakeWaveClick: fakeWaveClick, 3492 karaokeMode: karaokeMode, 3493 sr_loadLyricsAjax: sr_loadLyricsAjax, 3494 updateMiniPlayer: updateMiniPlayer, 3495 setRandomList: setRandomList, 3496 setMediaSessionAPI: setMediaSessionAPI, 3497 checkArtWorkFullBg: checkArtWorkFullBg, 3498 seekTime: seekTime, 3499 reloadAjax: reloadAjax, 3500 next: next, 3501 }; 3502 3503})(jQuery); 3504 3505function hideEmptyAttribut(string, selector) { 3506 if (string == "") { 3507 selector.css("display", "none"); 3508 } else { 3509 selector.css("display", "block"); 3510 } 3511} 3512 3513//Set Sticky player if it is enable once 3514function setStickyPlayer() { 3515 if (isGutenbergActive()) { //Dont load the sticky player if we are in the guttenberg editor
3516 return; 3517 } 3518 var cookieSettingsValue = getCookieValue("sonaar_mp3_player_settings"); 3519 if ( 3520 (typeof srp_vars !== 'undefined' && srp_vars.sonaar_music.footer_albums != "" && srp_vars.sonaar_music.footer_albums != [""]) || 3521 (sonaar_music.option.overall_sticky_playlist != null && sonaar_music.option.overall_sticky_playlist != [""]) || 3522 cookieSettingsValue != "" 3523 ) { 3524 IRON.audioPlayer.stickyEnable = true; 3525 } else { 3526 jQuery(".iron-audioplayer").each(function () { 3527 if (jQuery(this).data("sticky-player")) { 3528 IRON.audioPlayer.stickyEnable = true; 3529 } 3530 }); 3531 } 3532} 3533 3534//Reset srp_vars on the ajaxify navigation 3535function resetsrp_vars() { 3536 var str = jQuery('script:contains("var srp_vars")').text(); 3537 if (str !== "") { 3538 str = str.split("var srp_vars =")[1]; 3539 srp_vars = JSON.parse(str.split(";")[0]); 3540 } 3541} 3542 3543//Load Music player Content 3544function setIronAudioplayers(specificParentSelector) { 3545 $ = jQuery; 3546 3547 //Set srp_linked to the audioplayer if a search or a selector widget interact with it 3548 $('.srp_search_container, .srp-filters-widget, .srp-tags-widget').each(function () { 3549 if( $(this).data('player-id') && $('#'+ $(this).data('player-id') + '.iron-audioplayer, #'+ $(this).data('player-id') + ' .iron-audioplayer' ).length ){ 3550 $('#'+ $(this).data('player-id') + '.iron-audioplayer, #'+ $(this).data('player-id') + ' .iron-audioplayer' ).addClass('srp_linked'); 3551 }else{ 3552 $('.iron-audioplayer' ).eq(0).addClass('srp_linked'); 3553 } 3554 }) 3555 3556 if (typeof IRON === 'undefined' || (typeof IRON !== 'undefined' && typeof IRON.audioPlayer === 'undefined')) 3557 return; 3558 3559 if (typeof specificParentSelector !== "undefined") { 3560 if( $('#shortcode_builder').length ){ 3561 return; //Avoid to set the player twice if we are in the shortcode builder. specificParentSelector is set when setIronAudioplayers is called from the widget inline script. 3562 } 3563 // set all audioplayers or only players inside a specific selector 3564 if (!specificParentSelector.includes('"') && !specificParentSelector.includes("'") && $('[data-id="' + specificParentSelector + '"]').hasClass('iron-audioplayer')) { //if specificParentSelector is the iron-audioplayer element (not parent) 3565 var playerSelector = $('[data-id="' + specificParentSelector + '"]'); 3566 } else { 3567 var playerSelector = $(specificParentSelector + " .iron-audioplayer"); 3568 } 3569 if (typeof IRON.players == "undefined") { 3570 IRON.players = []; //dont reset the IRON.players if they already exist and the setIronAudioplayers function is executed from sr-scripts.js 3571 } 3572 } else { 3573 var playerSelector = $(".iron-audioplayer"); 3574 let protectedPlayer = []; 3575 if( typeof IRON.players != 'undefined'){ 3576 for(const i in IRON.players) { 3577 if( 3578 $(IRON.players[i].audioPlayer).parents(".elementor-widget-music-player").length || 3579 $(IRON.players[i].audioPlayer).parents(".elementor-widget-woocommerce-products").length 3580 ){ 3581 protectedPlayer.push(IRON.players[i]); 3582 } 3583 } 3584 } 3585 IRON.players = protectedPlayer; 3586 } 3587 3588 playerSelector.each(function () { 3589 3590 if (typeof specificParentSelector == "undefined" && $(this).parents(".elementor-widget-woocommerce-products").length) return; 3591 3592 if (typeof specificParentSelector == "undefined" && $(this).parents(".elementor-widget-music-player").length) return; 3593 3594 var player = Object.create(IRON.audioPlayer); 3595 player.init($(this)); 3596 IRON.players.push(player); 3597 3598 if ($('.iron-audioplayer').parents('#sonaar-modal').length) { 3599 //if player is in a modal we dont want to continue because it creates a bug if its parent is ajax. 3600 return; 3601 } 3602 3603 if ( $('.iron-audioplayer').length - $('.elementor-location-popup').find('.iron-audioplayer').length == IRON.players.length){ //When is the last player to be init 3604 var urlParams = new URLSearchParams(document.location.search); 3605 if( 3606 document.querySelectorAll('[data-sr-dropdown-atts]').length || //filter dropdown widget 3607 $('.srp_filters_container').length || //filter tag widget 3608 $('.iron-audioplayer').find('.srp_search_container').length || 3609 $('.iron-audioplayer').find('.sr-cf-heading').length || 3610 $('.iron-audioplayer').find('.srp_pagination').length ||
3611 urlParams.has('srp_search') 3612 ){ 3613 srp_setSearchFiltersFromUrl(); 3614 } 3615 } 3616 }); 3617} 3618//Display stickyplayer from the page option 3619function stickyPlayerFromPageOption() { 3620 if (srp_vars.sonaar_music.footer_albums != "" && !IRON.sonaar.player.isPlaying && !IRON.sonaar.player.classes.continued) { 3621 if (Array.isArray(IRON.sonaar.player.playlistID)) { 3622 var currentPlaylist = IRON.sonaar.player.playlistID[0]; 3623 } else { 3624 var currentPlaylist = IRON.sonaar.player.playlistID; 3625 } 3626 if (Array.isArray(srp_vars.sonaar_music.footer_albums)) { 3627 var newPlaylist = srp_vars.sonaar_music.footer_albums[0]; 3628 } else { 3629 var newPlaylist = srp_vars.sonaar_music.footer_albums; 3630 } 3631 3632 if (newPlaylist != currentPlaylist) { 3633 IRON.sonaar.player.currentTime = ""; 3634 IRON.sonaar.player.totalTime = ""; 3635 IRON.sonaar.player.setPlayer({ 3636 id: srp_vars.sonaar_music.footer_albums, 3637 autoplay: false, 3638 soundwave: true, 3639 shuffle: srp_vars.sonaar_music.footer_albums_shuffle, 3640 }); 3641 } 3642 return; 3643 } 3644 3645 //Play from overall settings 3646 if (sonaar_music.option.overall_sticky_playlist != null && !IRON.sonaar.player.isPlaying && !IRON.sonaar.player.classes.continued) { 3647 if ( sonaar_music.option.sr_prevent_continuous_sticky_to_show === "true") 3648 return; 3649 3650 // return if current page is edit post page 3651 if (window.location.href.indexOf('post.php') > -1 || window.location.href.indexOf('post-new.php') > -1) 3652 return; 3653 3654 IRON.sonaar.player.currentTime = ""; 3655 IRON.sonaar.player.totalTime = ""; 3656 IRON.sonaar.player.setPlayer({ 3657 id: sonaar_music.option.overall_sticky_playlist, 3658 autoplay: false, 3659 soundwave: true, 3660 shuffle: sonaar_music.option.overall_shuffle === "on" ? "1" : "", 3661 }); 3662 } 3663} 3664 3665var sonaarStatsTimeOut; 3666jQuery(document).on("sonaarStats", function (event, audioPlayer) { 3667 3668 if( $('.elementor-editor-active').length ) return; 3669 3670 if ($(audioPlayer).attr("id") == "sonaar-player") { 3671 var currentTrack = $(audioPlayer); 3672 } else { 3673 var currentTrackEQ = audioPlayer.data("currentTrack"); 3674 var currentTrack = audioPlayer.find(".playlist .srp_list li").eq(currentTrackEQ); 3675 } 3676 clearTimeout(sonaarStatsTimeOut); 3677 3678 sonaarStatsTimeOut = setTimeout(function () { 3679 if (!IRON.sonaar.player.classes.dontCountContinuous) { 3680 var trackTitle = currentTrack.attr("data-tracktitle"); 3681 trackTitle = trackTitle.replace(/<span class="srp_trackartist">.*?<\/span>/g, '').trim(); 3682 albumTitle = currentTrack.attr("data-albumtitle"); 3683 fileURL = currentTrack.attr("data-audiopath"); 3684 3685 if (window['Matomo'] && sonaar_music.option.srmp3_use_matomo_mediaanalytics !== 'true'){ 3686 console.log('send matomo stats for play'); 3687 _paq.push(['trackEvent', 'MediaAudio', 'play', trackTitle ]); 3688 } 3689 3690 if (typeof gtag === 'function' && srp_vars.sonaar_music.ga_tag) { 3691 gtag('event', 'played', { 3692 'event_category': '[Playlist Played] ' + albumTitle, 3693 'event_label': '[Track Played] ' + trackTitle, 3694 'non_interaction': true 3695 }); 3696 } 3697 3698 if (sonaar_music.option.srmp3_use_built_in_stats === 'true' || sonaar_music.option.srmp3_use_built_in_stats === true ) { 3699 var target = currentTrack.attr("data-trackid") !== "" ? currentTrack.attr("data-trackid") : fileURL; 3700 var data = { 3701 action: "post_stats", 3702 nonce: sonaar_music.ajax.ajax_nonce, 3703 post_stats: { 3704 action: "play", 3705 target_title: trackTitle, 3706 target_url: target, 3707 page_title: sonaar_music.current_page.title, 3708 page_url: sonaar_music.current_page.url, 3709 }, 3710 }; 3711 3712 jQuery.post(sonaar_music.ajax.ajax_url, data, function (response) { }); // this send stats in the wp db 3713 } 3714 3715 } 3716 IRON.sonaar.player.classes.dontCountContinuous = false; 3717 }, 3000); 3718}); 3719 3720jQuery(document).on("click", ".iron-audioplayer .playlist .store-list a[download], #sonaar-player .track-store a[download]", function (event) { 3721 jQuery(document).trigger("sonaarTrackDownload", jQuery(this)); 3722}); 3723 3724jQuery(document).on("sonaarTrackDownload", function (event, target) { 3725 if( $('.elementor-editor-active').length ) return; 3726 3727 if ($(target).parents("#sonaar-player").length) { 3728 var currentTrack = jQuery(target).parents("#sonaar-player"); 3729 } else { 3730 var currentTrack = jQuery(target).parents("li"); 3731 } 3732 3733 var trackTitle = currentTrack.attr("data-tracktitle"); 3734 trackTitle = trackTitle.replace(/<span class="srp_trackartist">.*?<\/span>/g, '').trim(); 3735 albumTitle = currentTrack.attr("data-albumtitle"); 3736 fileURL = currentTrack.attr("data-audiopath"); 3737 3738 if (window['Matomo'] && sonaar_music.option.srmp3_use_matomo_mediaanalytics !== 'true'){ 3739 console.log('send matomo stats for download'); 3740 _paq.push(['trackEvent', 'MediaAudio', 'download', trackTitle + '[' + target_id + ']']); 3741 } 3742 3743 if (typeof gtag === 'function' && srp_vars.sonaar_music.ga_tag) { 3744 console.log("GA - Download Tracked++"); 3745 gtag('event', 'downloaded', { 3746 'event_category': '[Playlist Downloads] ' + albumTitle, 3747 'event_label': '[Track Download] ' + trackTitle, 3748 'non_interaction': true 3749 }); 3750 } 3751 3752 if (sonaar_music.option.srmp3_use_built_in_stats) { 3753 var target_id = currentTrack.data("trackid") !== "" ? currentTrack.data("trackid") : fileURL; 3754 var data = { 3755 action: "post_stats", 3756 nonce: sonaar_music.ajax.ajax_nonce, 3757 post_stats: { 3758 nonce: sonaar_music.ajax.ajax_nonce, 3759 target_title: trackTitle, 3760 target_url: target_id, 3761 page_title: sonaar_music.current_page.title, 3762 page_url: sonaar_music.current_page.url, 3763 }, 3764 }; 3765 3766 jQuery.post(sonaar_music.ajax.ajax_url, data, function (response) { }); // this send stats in the wp db 3767 } 3768}); 3769 3770jQuery(document).ready(function () { 3771 setStickyPlayer(); 3772 IRON.favorites.init(); 3773 setIronAudioplayers(); 3774 if (Boolean(sonaar_music.option.enable_continuous_player === "true") && !$("body").hasClass("wp-admin")) { 3775 if (!IRON.sonaar.player.preventContinuousUrl()) { 3776 sr_getCookieSettings(); 3777 } 3778 } else if (IRON.audioPlayer.stickyEnable) { 3779 sr_getCookieVolume(); 3780 } 3781 stickyPlayerFromPageOption(); 3782 sr_filterInit(); 3783 srp_getParamFromUrl(); 3784 srp_initWC_JS(); 3785 3786}); 3787 3788 3789// Function to handle the Ask for Email click on the CTA 3790function handleAskEmailClick(element, scenario = null, playerID = null, trackIdToSave = null) { 3791 //srp_wc_loadspinner(element); 3792 sr_setPopUp(); 3793 3794 // Initialize variables to hold the values 3795 var postId, trackPos, trackTitle, image_src, trackId, dataAudioPath; 3796 3797 var playlistItem = element.closest('li.sr-playlist-item'); 3798 var swiperSlide = element.closest('.swiper-slide'); 3799 3800 if(element.parents('.album-player').length){ // If the click is from the mini player, get the tracklist item 3801 const trackselected = (typeof element.parents('.iron-audioplayer').attr('trackselected') !== 'undefined') ? element.parents('.iron-audioplayer').attr('trackselected') : 0; 3802 playlistItem = element.parents('.iron-audioplayer').find('li.sr-playlist-item').eq(trackselected); 3803 } 3804 3805 if (playlistItem.length) { 3806 postId = playlistItem.data('post-id'); 3807 trackPos = playlistItem.data('track-pos'); 3808 trackTitle = playlistItem.data('tracktitle'); 3809 if(!postId){ 3810 trackId = playlistItem.data('trackid'); 3811 if(!trackId){ 3812 dataAudioPath = playlistItem.data('audiopath'); 3813 } 3814 } 3815 image_src = playlistItem.find('.sr_track_cover img').attr('src'); 3816 } else if (swiperSlide.length) { 3817 postId = swiperSlide.data('post-id'); 3818 trackPos = swiperSlide.data('track-pos'); 3819 trackTitle = swiperSlide.find('.srp_swiper-track-title').text(); 3820 image_src = swiperSlide.find('.srp_swiper-album-art').css('background-image').replace(/^url\(["']?/, '').replace(/["']?\)$/, ''); // Extract image URL 3821 } else { 3822 currentTrack = IRON.sonaar.player.currentTrack; 3823 postId = IRON.sonaar.player.list.tracks[currentTrack].sourcePostID; 3824 trackPos = IRON.sonaar.player.list.tracks[currentTrack].track_pos; 3825 trackTitle = IRON.sonaar.player.list.tracks[currentTrack].track_title; 3826 image_src = IRON.sonaar.player.list.tracks[currentTrack].poster; 3827 } 3828 3829 //console.log("Values extracted:", { postId, trackPos, trackTitle, image_src, trackId, dataAudioPath }); 3830 3831 var nonce = sonaar_music.ajax.ajax_nonce; 3832 3833 var data = { 3834 action: 'load_ask_for_email_popup_ajax', 3835 post_id: postId, 3836 track_pos: trackPos, 3837 track_title: trackTitle, 3838 image_src: image_src, 3839 nonce: nonce 3840 }; 3841 3842 3843 //If a scenario is defined, add its id to the data object 3844 if (scenario) { 3845 data.scenario_id = scenario.id; 3846 } 3847 3848 //console.log("AJAX request data for loading popup:", data); 3849 3850 $.post(sonaar_music.ajax.ajax_url, data, function(response) { 3851 //console.log("AJAX response for loading popup:", response); 3852 response = JSON.parse(response); 3853 $('#sonaar-modal .sr_popup-body').html(response.html); 3854 3855 if (!response.has_image) { 3856 $('.sr_popup-body').addClass('srp_popup_no_image'); 3857 } else { 3858 $('.sr_popup-body').removeClass('srp_popup_no_image'); 3859 } 3860 srp_askForEmailForm(postId, trackPos, trackId, dataAudioPath, scenario, playerID, element, trackIdToSave); 3861 sr_openPopUp(); 3862 srp_wc_unloadspinner(element); 3863 }).fail(function() { 3864 console.error("Failed to load ask-for-email popup."); 3865 }); 3866} 3867function srp_initWC_JS() { 3868 // Your existing logic 3869 $('.srp-make-offer-bt').on('click', function(event) { 3870 event.preventDefault(); 3871 }); 3872 3873 // Check if we are in a single product page 3874 if (!$('.single-product').length) return; 3875 3876 var form = document.querySelector(".variations_form"); 3877 3878 if (form && typeof srp_make_offer_variations !== 'undefined') { 3879 var variations = srp_make_offer_variations; // Use the global variable injected by PHP 3880 3881 function handleVisibility(variationId) { 3882 var priceElement = form.querySelector(".woocommerce-variation-
3882price"); 3883 var addToCartButton = form.querySelector(".single_add_to_cart_button"); 3884 var makeOfferButtons = document.querySelectorAll(".srp-make-offer-bt:not(.related .srp-make-offer-bt)"); 3885 var variationsElement = form.querySelector(".woocommerce-variation-add-to-cart"); // Get the variations element 3886 3887 var selectedVariation = variations.find(function(variation) { 3888 return variation.variation_id == variationId; 3889 }); 3890 if (selectedVariation) { 3891 if (selectedVariation.make_offer_hide_price === "yes") { 3892 if (priceElement) priceElement.style.display = "none"; 3893 if (addToCartButton) addToCartButton.style.display = "none"; 3894 } else { 3895 if (priceElement) priceElement.style.display = ""; 3896 if (addToCartButton) addToCartButton.style.display = ""; 3897 } 3898 } else { 3899 if (priceElement) priceElement.style.display = ""; 3900 if (addToCartButton) addToCartButton.style.display = ""; 3901 } 3902 3903 // Disconnect observer before DOM manipulation to prevent infinite loop 3904 observer.disconnect(); 3905 3906 makeOfferButtons.forEach(function(button) { 3907 var wrapper = button.closest(".srp-make-offer-btn-wrapper"); 3908 3909 // Move the "Make Offer" button before the "woocommerce-variation-add-to-cart" element 3910 if (variationsElement && wrapper && wrapper.parentNode !== variationsElement) { 3911 variationsElement.parentNode.insertBefore(wrapper, variationsElement); 3912 } 3913 3914 if (button.getAttribute("data-variation") == variationId) { 3915 wrapper.style.display = "block"; // Show correct wrapper with Make Offer button 3916 } else { 3917 wrapper.style.display = "none"; // Hide other wrappers 3918 } 3919 }); 3920 3921 // Reconnect observer after DOM manipulation 3922 observer.observe(form.querySelector(".single_variation_wrap"), { childList: true, subtree: true }); 3923 } 3924 3925 var observer = new MutationObserver(function() { 3926 var variationId = form.querySelector(".variation_id").value; 3927 handleVisibility(variationId); 3928 }); 3929 3930 observer.observe(form.querySelector(".single_variation_wrap"), { childList: true, subtree: true }); 3931 3932 // Triggered when a variation is selected 3933 jQuery(form).on("found_variation", function(event, variation) { 3934 handleVisibility(variation.variation_id); 3935 }); 3936} 3937 3938} 3939 3940 3941 3942 3943function sr_filterInit(){ 3944 setTimeout(function(){ 3945 initFilterDropdowns(); 3946 initFilterTags(); 3947 initFilterRange(); 3948 }, 0); // pushes the function execution to the end of the browser's event queue to allows filters in the popup working correctly 3949}; 3950 3951function initFilterDropdowns(){ 3952 /*------------------------------ 3953 START: FILTER DROPDOWNS 3954 ------------------------------*/ 3955 var filterDropdown = document.querySelectorAll('[data-sr-dropdown-atts]'); 3956 if(filterDropdown.length){ 3957 sonaarFilter = Vue.component('sonaar-filters',{ 3958 components: { 3959 Multiselect: window.VueMultiselect.default 3960 }, 3961 template: ` 3962 <div class="srp-filters-widget" :data-player-id="atts.playerid"> 3963 <!--<label class="typo__label">{{atts.metakey}}</label>--> 3964 <multiselect :data-catid="atts.catid" :key="componentKey" :ref="atts.metakey" 3965 v-model="value" 3966 :options="atts.options" 3967 placeholder="Pick some" 3968 :multiple="(atts.selecttype == 'singleselect') ? false : true" 3969 :close-on-select="(atts.close_on_select) ? true : false" 3970 :clear-on-select="false" 3971 :preserve-search="false" 3972 :placeholder="atts.label" 3973 :hide-selected="false" 3974 :show-labels="false" 3975 :searchable="(atts.searchable) ? true : false" 3976 :readonly="true" 3977 label="" 3978 track-by="" 3979 :preselect-first="false" 3980 @remove="removeTag" 3981 @input="listAllAction" 3982 @select="dispatchAction" 3983 @close="closeEventHandler" 3984 :data-metakey="atts.metakey" 3985 :data-label="atts.label" 3986 >
3987 <span slot="noResult"> 3988 No matching options. 3989 </span> 3990 3991 <template slot="selection" slot-scope="{ values, search, isOpen }"> 3992 <span class="multiselect__multiple" v-if="values.length">{{ atts.label }} ({{ values.length }}+)</span> 3993 </template> 3994 <template slot="tag">{{ "" }}</template> 3995 </multiselect> 3996 </div> 3997 `, 3998 props: ['atts'], 3999 data: function() { return { 4000 componentKey: 0, 4001 value:this.initializeFilter(), 4002 4003 } }, 4004 mounted: function() { 4005 // open-on-init-only (can close after) 4006 // move content down when open (position relative vs position absolute) 4007 4008 if(this.atts.open_on_init || this.atts.open_always){ 4009 this.$refs[this.atts.metakey].$el.querySelector('.multiselect__content-wrapper').style.position = 'relative'; 4010 this.$refs[this.atts.metakey].isOpen = true; 4011 } 4012 }, 4013 methods: { 4014 closeEventHandler(){ 4015 // open-always (cannot close) 4016 if(this.atts.open_always){ 4017 this.$refs[this.atts.metakey].isOpen = true; 4018 } 4019 }, 4020 initializeFilter(){ 4021 const playerId = srp_getPlayerIdParamFromUrl(); 4022 if( 4023 this.atts.playerid == '' && playerId === null || 4024 playerId == this.atts.playerid 4025 ){ 4026 return srp_getMetaParams(this.atts.metakey); 4027 } 4028 }, 4029 dispatchAction (value) { 4030 if (this.atts.selecttype == "singleselect"){ 4031 // when dealing with single select 4032 this.removeTag(); 4033 } 4034 4035 srp_addMeta( this.atts.playerid, this.atts.metakey, value, this.atts.selecttype ); 4036 4037 }, 4038 removeTag(value){ 4039 srp_removeMeta( this.atts.metakey, value, this.atts.playerid, this.atts.selecttype); 4040 }, 4041 listAllAction (values) { 4042 } 4043 }, 4044 }); 4045 4046 filterDropdown.forEach(function(element) { 4047 var atts = JSON.parse(element.getAttribute('data-sr-dropdown-atts')); 4048 if (atts.options.length == 0) 4049 return; 4050 4051 var playerId = atts.options[0].playerid; 4052 var player_cat_ids = []; 4053 4054 if(playerId){ 4055 var player = document.getElementById(playerId); 4056 if(player){ 4057 var audioPlayer = player.querySelector('.iron-audioplayer'); 4058 if (audioPlayer) { 4059 player_cat_ids = audioPlayer.getAttribute('data-category'); 4060 player_cat_ids = player_cat_ids.split(',').map(Number); 4061 } 4062 } 4063 } 4064 4065 if (player_cat_ids.length > 0 && atts.options) { // Added the check for showOnlyIds.length > 0 4066 atts.options.forEach(filter => { 4067 if (filter.term_ids) { 4068 const filteredOptions = []; 4069 const filteredTermIds = []; 4070 filter.term_ids.forEach((id, index) => { 4071 if (player_cat_ids.includes(id)) { 4072 filteredOptions.push(filter.options[index]); 4073 filteredTermIds.push(id); 4074 } 4075 }); 4076 4077 // Update filter with the filtered values only if there were matching IDs 4078 if (filteredOptions.length > 0) { 4079 filter.options = filteredOptions; 4080 filter.term_ids = filteredTermIds; 4081 } 4082 } 4083 }); 4084 } 4085 const vm = new Vue({ 4086 el: element, 4087 data: {}, 4088 template: '<div :id="atts.id" class="srp-filters-container">' + 4089 '<sonaar-filters v-for="(filter, index) in atts.options" :atts="filter"/>' + 4090 '</div>', 4091 created: function() { 4092 this.atts = atts; 4093 } 4094 }); 4095 myVueAr.push(vm); 4096 }); 4097 4098 }else{ 4099 myVueAr.forEach(function(vm){ //replacing the filter dropdowns with the new ones 4100 $('#'+ $(vm.$el).attr('id') ).replaceWith( vm.$el ) 4101 }) 4102 } 4103 /*------------------------------ 4104 END: FILTER DROPDOWNS 4105 ------------------------------*/ 4106} 4107function initFilterTags(){ 4108 /*------------------------------ 4109 START: FILTER TAGS 4110 ------------------------------*/ 4111 var filterTags = document.querySelectorAll('[data-sr-tags-atts]'); 4112 4113 if(!filterTags.length){ 4114 myVueTag.forEach(function(vm){ //replacing the filter tags with the new ones 4115 $('#'+ $(vm.$el).attr('id') ).replaceWith( vm.$el ) 4116 }) 4117 return; 4118 } 4119 4120 var filterButtonColors=['#E2675A','#FFA374', '#FDECB3','#FACA83','#FFCFD7', '#7E69FF','#EDFFAE','#9BC48D', '#D4FDE1','#CDF1F8','#B9C1E3', '#AE98E5','#7DB04D','#CCE780', '#8393CC','#00BFAF','#10A4EE', '#BFFB00','#FF94A6','#F7F47C', '#5171E4']; 4121 filterButtonColors = [...Array(3)].flatMap(() => filterButtonColors); 4122 4123 4124 4125 Vue.component('sonaar-tags', { 4126 template: ` 4127 <div class="srp-tags-widget"> 4128 <div v-for="tagGroup in atts.options" class="srp_filter_container" :key="tagGroup.label" :data-randomcolor="tagGroup.randomcolor"> 4129 <div class="srp_filter_button_label">{{ tagGroup.label }}</div> 4130 <transition-group name="list" tag="ul" class="srp_filter_buttons_list"> 4131 <li v-for="(tagValue, index) in (showAllTags[tagGroup.label] ? tagGroup.options : limitedOptions(tagGroup))" 4132 :key="tagValue"> 4133 <div 4134 :class="['srp_filter_button', isActive(tagGroup, tagValue) ? 'srp_filter_button--active' : '']" 4135 :style="getTagColor(tagGroup, index)" 4136 :data-selecttype="tagGroup.selecttype" 4137 :data-label="tagGroup.label" 4138 :data-metakey="tagGroup.metakey" 4139 :data-playerid="tagGroup.playerid" 4140 :data-value="tagValue" 4141 :data-cat="tagGroup.term_ids[index]" 4142 @click="tagClicked(tagGroup, tagValue)">{{ tagValue }}</div> 4143 </li> 4144 </transition-group> 4145 <div v-if="!showAllTags[tagGroup.label] && tagGroup.options.length > getItemsPerPage(tagGroup)"> 4146 <a href="#" @click.prevent="toggleShowAll(tagGroup)" class="srp-filter-more-link">{{ tagGroup.show_more_label }}</a> 4147 </div> 4148 <div v-if="showAllTags[tagGroup.label] && tagGroup.options.length > getItemsPerPage(tagGroup)"> 4149 <a href="#" @click.prevent="toggleShowAll(tagGroup)" class="srp-filter-more-link">{{ tagGroup.show_less_label }}</a> 4150 </div> 4151 </div> 4152 </div> 4153 `, 4154 4155 props: ['atts'], 4156 data: function() { 4157 const state = this.initializeState(); 4158 return { 4159 showAllTags: state.showAllTags, 4160 activeTags: state.activeTags, 4161 filterButtonColors: filterButtonColors 4162 }; 4163 }, 4164 4165 methods: { 4166 initializeState() { 4167 const initialState = { 4168 showAllTags: {}, 4169 activeTags: [] 4170 }; 4171 const playerId = srp_getPlayerIdParamFromUrl(); 4172 4173 if (this.atts && this.atts.options) { 4174 this.atts.options.forEach(tagGroup => { 4175 initialState.showAllTags[tagGroup.label] = false; // Initialize showAllTags for each group 4176 4177 if ((tagGroup.playerid === '' && playerId === null) || playerId == tagGroup.playerid) { 4178 let groupActiveTagsValues = srp_getMetaParams(tagGroup.metakey); 4179 4180 if (groupActiveTagsValues) { 4181 // Convert tag values to identifiers 4182 let groupActiveTags = groupActiveTagsValues.map(tagV
4182alue => this.getTagIdentifier(tagGroup, tagValue)); 4183 initialState.activeTags = [...initialState.activeTags, ...groupActiveTags]; // Populate activeTags array 4184 } 4185 } 4186 }); 4187 } 4188 4189 return initialState; 4190 }, 4191 getItemsPerPage(tagGroup) { 4192 if (tagGroup.items_per_page === "all" || tagGroup.options.length <= Number(tagGroup.items_per_page)) { 4193 return Infinity; 4194 } else { 4195 return Number(tagGroup.items_per_page); 4196 } 4197 }, 4198 toggleShowAll(tagGroup) { 4199 this.$set(this.showAllTags, tagGroup.label, !this.showAllTags[tagGroup.label]); 4200 }, 4201 limitedOptions: function(tagGroup) { 4202 if (tagGroup.items_per_page === "all") { 4203 return tagGroup.options; 4204 } else { 4205 return tagGroup.options.slice(0, tagGroup.items_per_page); 4206 } 4207 }, 4208 tagClicked(tagGroup, tagValue) { 4209 let tagIdentifier = this.getTagIdentifier(tagGroup, tagValue); 4210 4211 if (this.isActive(tagGroup, tagValue)) { 4212 // Remove the tagIdentifier from the activeTags list 4213 this.activeTags = this.activeTags.filter(tag => tag !== tagIdentifier); 4214 srp_removeMeta(tagGroup.metakey, tagValue, tagGroup.playerid, tagGroup.selecttype); 4215 } else { 4216 if (tagGroup.selecttype === 'singleselect') { 4217 this.activeTags= []; 4218 srp_removeMeta(tagGroup.metakey, null, tagGroup.playerid, tagGroup.selecttype); 4219 } 4220 this.activeTags.push(tagIdentifier); 4221 srp_addMeta(tagGroup.playerid, tagGroup.metakey, tagValue, tagGroup.selecttype); 4222 } 4223 }, 4224 isActive(tagGroup, tagValue) { 4225 let tagIdentifier = this.getTagIdentifier(tagGroup, tagValue); 4226 return this.activeTags.includes(tagIdentifier); 4227 }, 4228 getTagIdentifier(tagGroup, tagValue) { 4229 return tagGroup.metakey + "_" + tagValue; 4230 }, 4231 getTagColor(tagGroup, index) { 4232 const isActive = this.isActive(tagGroup, tagGroup.options[index]); 4233 const color = filterButtonColors[index % filterButtonColors.length]; 4234 4235 return tagGroup.randomcolor === 'true' && isActive ? { backgroundColor: color, borderColor: color } : {}; 4236 }, 4237 } 4238 }); 4239 4240 4241 filterTags.forEach(element => { 4242 const atts = JSON.parse(element.getAttribute('data-sr-tags-atts')); 4243 4244 if (atts.options.length == 0) 4245 return; 4246 4247 var playerId = atts.options[0].playerid; 4248 var player_cat_ids = []; 4249 4250 if(playerId){ 4251 var player = document.getElementById(playerId); 4252 if(player){ 4253 var audioPlayer = player.querySelector('.iron-audioplayer'); 4254 if (audioPlayer) { 4255 player_cat_ids = audioPlayer.getAttribute('data-category'); 4256 player_cat_ids = player_cat_ids.split(',').map(Number); 4257 } 4258 } 4259 } 4260 4261 if (player_cat_ids.length > 0 && atts.options) { // Added the check for showOnlyIds.length > 0 4262 atts.options.forEach(filter => { 4263 if (filter.term_ids) { 4264 const filteredOptions = []; 4265 const filteredTermIds = []; 4266 filter.term_ids.forEach((id, index) => { 4267 if (player_cat_ids.includes(id)) { 4268 filteredOptions.push(filter.options[index]); 4269 filteredTermIds.push(id); 4270 } 4271 }); 4272 4273 // Update filter with the filtered values only if there were matching IDs 4274 if (filteredOptions.length > 0) { 4275 filter.options = filteredOptions; 4276 filter.term_ids = filteredTermIds; 4277 } 4278 } 4279 }); 4280 } 4281 4282 const vm = new Vue({ 4283 el: element, 4284 data: { atts }, 4285 template: '<sonaar-tags :id="atts.id" :atts="atts"/>' 4286 }); 4287 4288 myVueTag.push(vm); 4289 }); 4290 4291 4292 /*------------------------------ 4293 END: FILTER TAGS 4294 ------------------------------*/ 4295} 4296 4297function initFilterRange(){ 4298 /*------------------------------ 4299 START: DOUBLE RANGE SELECTOR 4300 ------------------------------*/ 4301 Vue.component('vue-slider', window['vue-slider-component']); 4302 4303 const sonaarDoubleRangeSelector = Vue.component('sonaar-double-range-selector', { 4304 template: ` 4305 <div class="srp_range_container"> 4306 <div class="srp_range_header"> 4307 <div class="srp_filter_button_label">{{ sliderData.label }}</div> 4308 <div class="srp_range_value">{{ formattedSliderValue[0] }} - {{ formattedSliderValue[1] }} {{ sliderData.unit }}</div> 4309 </div> 4310 <vue-slider 4311 v-model="sliderValue" 4312 :tooltip="'focus'" 4313 :marks="marks" 4314 :min="computedMin" 4315 :max="computedMax" 4316 :lazy="true" 4317 @change="updateRange" 4318 :data-metakey="sliderData.metakey" 4319 :data-label="sliderData.label" 4320 > 4321 <template v-slot:tooltip="{ value }"> 4322 <div class="vue-slider-dot-tooltip-inner vue-slider-dot-tooltip-inner-top">
4323 <span v-if="option.selecttype === 'time'" class="vue-slider-dot-tooltip-text">{{ secondsToTime(value) }}</span> 4324 <span v-else class="vue-slider-dot-tooltip-text">{{ value }}</span> 4325 </div> 4326 </template> 4327 </vue-slider> 4328 <div class="srp_range_buttons" v-if="option.selecttype === 'tempo'"> 4329 <button class="srp_filter_button" @click="setTempoRange('slow')">Slow</button> 4330 <button class="srp_filter_button" @click="setTempoRange('medium')">Medium</button> 4331 <button class="srp_filter_button" @click="setTempoRange('fast')">Fast</button> 4332 </div> 4333 </div> 4334 `, 4335 props: ['option'], 4336 computed: { 4337 sliderValue: function() { 4338 //console.log(this.computedMin, this.computedMax); 4339 return [this.computedMin, this.computedMax]; 4340 }, 4341 computedMin: function() { 4342 if (this.option.selecttype === 'time') { 4343 return timeToSeconds(this.option.min); 4344 } 4345 let minVal = (!isNaN(this.option.min) && this.option.min !== null && this.option.min !== "") ? Number(this.option.min) : 0; 4346 return minVal; 4347 }, 4348 computedMax: function() { 4349 if (this.option.selecttype === 'time') { 4350 return timeToSeconds(this.option.max); 4351 } 4352 let maxVal = (!isNaN(this.option.max) && this.option.max !== null && this.option.max !== "") ? Number(this.option.max) : 100; 4353 return maxVal; 4354 }, 4355 formattedSliderValue: function() { 4356 if (this.option.selecttype === 'time') { 4357 return this.sliderValue.map(value => secondsToTime(value)); 4358 } else { 4359 return this.sliderValue; 4360 } 4361 }, 4362 marks: function() { 4363 function customRound(n) { 4364 n = Math.round(n); 4365 let lastDigit = n % 10; 4366 if (lastDigit < 3) { 4367 return n - lastDigit; 4368 } else if (lastDigit < 8) { 4369 return n + (5 - lastDigit); 4370 } else { 4371 return n + (10 - lastDigit); 4372 } 4373 } 4374 let interval = (this.computedMax - this.computedMin) / 4; 4375 let rawMarks = Array.from({ length: 5 }).map((_, idx) => customRound(this.computedMin + interval * idx)); 4376 4377 // If select type is 'time', convert the marks from seconds to HH:MM:SS format 4378 if (this.option.selecttype === 'time') { 4379 return rawMarks.reduce((acc, mark) => { 4380 acc[mark] = secondsToTime(mark); 4381 return acc; 4382 }, {}); 4383 } 4384 return rawMarks.reduce((acc, mark) => { 4385 acc[mark] = mark.toString(); 4386 return acc; 4387 }, {}); 4388 } 4389 }, 4390 data: function() { 4391 //console.log(this.option); 4392 return { 4393 // sliderValue: [null, null], // Temporary values 4394 sliderValue: this.option.selecttype === 'time' ? 4395 [timeToSeconds(this.option.min), timeToSeconds(this.option.max)] : 4396 [null, null], 4397 sliderData: { 4398 label: this.option.label, 4399 metakey: this.option.metakey, 4400 playerid: this.option.playerid, 4401 unit: this.option.unit 4402 } 4403 }; 4404 }, 4405 mounted: function() { 4406 this.sliderValue = [Number(this.computedMin), Number(this.computedMax)]; 4407 4408 let searchParams = new URLSearchParams(window.location.search); 4409 let playerIdQuery = searchParams.get('srp_player_id'); 4410 4411 if (playerIdQuery === this.sliderData.playerid) { 4412 let metaKeyQuery = searchParams.get('srp_meta'); 4413 let decodedMetaKeyQuery = decodeURIComponent(metaKeyQuery); 4414 let metas = decodedMetaKeyQuery.split(';'); 4415 metas.forEach((meta) => { 4416 let [key, value] = meta.split(':'); 4417 if (key.endsWith('_minmax') && key.slice(0, -7) === this.sliderData.metakey) { 4418 this.sliderValue = value.split('_').map(val => Number(val)); 4419 } 4420 }); 4421 } 4422 IRON.rangeSelector.push(this); 4423 }, 4424 4425 methods: { 4426 setTempoRange(tempo) { 4427 switch (tempo) { 4428 case 'slow': 4429 this.sliderValue = [this.computedMin, 64]; 4430 break; 4431 case 'medium': 4432 this.sliderValue = [65, 115]; 4433 break; 4434 case 'fast': 4435 this.sliderValue = [116, this.computedMax]; 4436 break; 4437 } 4438 this.updateRange(); 4439 }, 4440 getUrlParams() { 4441 let vars = {}; 4442 window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) { 4443 vars[key] = value; 4444 }); 4445 return vars; 4446 }, 4447 updateRange() { 4448 srp_removeMeta(this.sliderData.metakey, null, this.sliderData.playerid, 'range'); 4449 srp_addMeta(this.sliderData.playerid, this.sliderData.metakey, this.sliderValue.join('_'), 'range'); // This will now use the updated slider values 4450 } 4451 } 4452}); 4453 4454 4455 4456var rangeSelectors = document.querySelectorAll('[data-sr-range-atts]'); 4457 4458if(!rangeSelectors.length){ 4459 myVueRange.forEach(function(vm){ //replacing the filter Range with the new ones 4460 $('#'+ $(vm.$el).attr('id') ).replaceWith( vm.$el ) 4461 }) 4462 return; 4463} 4464
4465rangeSelectors.forEach(function(element) { 4466 var atts = JSON.parse(element.getAttribute('data-sr-range-atts')); 4467 const vm = new Vue({ 4468 el: element, 4469 data: { 4470 atts 4471 }, 4472 template: ` 4473 <div :id="atts.id" class="srp_range_wrapper"> 4474 <sonaar-double-range-selector 4475 v-for="option in atts.options" 4476 :key="option.metakey" 4477 :option="option"> 4478 </sonaar-double-range-selector> 4479 </div> 4480 ` 4481 }); 4482 myVueRange.push(vm); 4483}); 4484 4485} 4486// Helper function to convert second string to time format 4487function secondsToTime(seconds) { 4488 const hours = Math.floor(seconds / 3600); 4489 seconds %= 3600; 4490 const minutes = Math.floor(seconds / 60); 4491 const secs = seconds % 60; 4492 4493 let result; 4494 if (hours > 0) { 4495 result = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; 4496 } else if (minutes > 0) { 4497 result = `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; 4498 } else { 4499 result = `00:${secs.toString().padStart(2, '0')}`; 4500 } 4501 //console.log(`Input seconds: ${seconds}, Formatted time: ${result}`); 4502 return result; 4503} 4504 4505// Helper function to convert time string to seconds 4506function timeToSeconds(timeStr) { 4507 const parts = timeStr.split(":").map(part => parseInt(part, 10)); 4508 4509 if (parts.length === 3) { // HH:MM:SS format 4510 return parts[0] * 3600 + parts[1] * 60 + parts[2]; 4511 } else if (parts.length === 2) { // MM:SS format 4512 return parts[0] * 60 + parts[1]; 4513 } else { 4514 return 0; 4515 } 4516} 4517 4518function updateFilterSelector(metaParams, playerId = null){ 4519 // updates options from filters dropdown 4520 for (const myVue in myVueAr){ 4521 const vm = myVueAr[myVue]; 4522 if( typeof vm != 'undefined'){ 4523 if($(vm.$el).find('.srp-filters-widget').data('playerId') == playerId){ 4524 for(const i in vm.$children){ 4525 let params = metaParams[vm.$children[i].atts.metakey] 4526 if(typeof params == 'string'){ 4527 vm.$children[i].value = params.split(','); 4528 }else{ 4529 vm.$children[i].value = []; 4530 } 4531 } 4532 } 4533 } 4534 } 4535} 4536 4537let debounceTimeout; 4538 4539function sr_addTrackToPlaylist(track, $player, playlistName = 'RecentlyPlayed', mustPlayToProceed = true, maxPlaylistSize = 50, playerStateClass = 'srp_player_is_recentlyPlayed', debounceDelay = 3000) { 4540 if(sonaar_music.option.is_user_history_usermeta_enabled !== "true") return; 4541 4542 isSrcLoaded = (typeof $("#sonaar-audio").attr("src") == "undefined") ? false : true; 4543 4544 function executeTrackLogic() { 4545 let trackId; 4546 let trackPos; 4547 4548 // Determine if the player is in the specified state 4549 if (typeof IRON.sonaar.player.list.tracks[0] !== 'undefined') { 4550 4551 if(IRON.sonaar.player.continuous && isSrcLoaded === false) return; // if continuous player is loaded from Cookie and track is not set yet 4552 4553 if(mustPlayToProceed && !IRON.sonaar.player.isPlaying) return; 4554 4555 if (IRON.sonaar.player.selectedPlayer !== null && IRON.sonaar.player.selectedPlayer !== undefined) { 4556 if (IRON.sonaar.player.selectedPlayer.hasClass(playerStateClass)) { 4557 return; // if we want to prevent the current player from auto-adding its track 4558 } 4559 } 4560 //console.log("here"); // This will only log if the above condition is false 4561 if (typeof track !== 'undefined') { 4562 if (typeof track.sourcePostID !== 'undefined') { 4563 trackId = track.sourcePostID; 4564 trackPos = track.track_pos; 4565 } 4566 } else { 4567 console.error('No track information available'); 4568 return; 4569 } 4570 } else if (typeof $player !== 'undefined' && !$player.hasClass(playerStateClass)) { 4571 if (mustPlayToProceed && track.length === 0) return; 4572 trackId = $(track).data('post-id'); 4573 trackPos = $(track).data('track-pos'); 4574 } else { 4575 return; 4576 } 4577 4578 if (!trackId) { 4579 console.error('Track ID is undefined'); 4580 return; 4581 } 4582 4583 // Construct trackInfo object 4584 const trackInfo = { 4585 postId: trackId.toString(), 4586 trackPos: trackPos ? trackPos.toString() : '0', 4587 }; 4588 4589 // Handle the playlist 4590 let playlistIndex = IRON.userPlaylists.findIndex(playlist => playlist.playlistName === playlistName); 4591 if (playlistIndex === -1) { 4592 IRON.userPlaylists.push({ 4593 playlistName: playlistName, 4594 tracks: [trackInfo] 4595 }); 4596 } else { 4597 let tracks = (typeof IRON.userPlaylists[playlistIndex].tracks === 'undefined') ? [] : IRON.userPlaylists[playlistIndex].tracks; 4598 tracks.unshift(trackInfo); 4599 IRON.userPlaylists[playlistIndex].tracks = tracks.slice(0, maxPlaylistSize); 4600 } 4601 4602 // Update server or cookies based on system setup 4603 updatePlaylistStorage(); 4604 } 4605 4606 if (debounceDelay > 0) { 4607 clearTimeout(debounceTimeout); // Clear existing timeout 4608 debounceTimeout = setTimeout(() => { 4609 executeTrackLogic(); 4610 }, debounceDelay); 4611 } else { 4612 executeTrackLogic(); 4613 } 4614} 4615 4616 4617 4618 4619function updatePlaylistStorage() { 4620 if (srp_vars.is_logged_in === 'no' && sonaar_music.option.is_user_history_cookie_enabled === "true" ) { 4621 document.cookie = "sonaar_mp3_playlists=" + encodeURIComponent(JSON.stringify(IRON.userPlaylists)) + "; max-age=31536000; path=/;"; 4622 //check if $('.srp_player_is_recentlyPlayed') exist 4623 if ($('.srp_player_is_recentlyPlayed').length) { 4624 IRON.audioPlayer.reloadAjax($('.srp_player_is_recentlyPlayed'), false, true, false); 4625 } 4626 } else if (srp_vars.is_logged_in === 'yes') { 4627 $.ajax({ 4628 url: sonaar_music.ajax.ajax_url, 4629 type: 'POST', 4630 dataType: 'json', 4631 data: { 4632 action: 'update_user_playlist', 4633 nonce: sonaar_music.ajax.ajax_nonce, 4634 playlists: IRON.userPlaylists 4635 }, 4636 success: function (response) { 4637 //console.log(response); 4638 //console.log(IRON.userPlaylists); 4639 if ($('.srp_player_is_recentlyPlayed').length) { 4640 IRON.audioPlayer.reloadAjax($('.srp_player_is_recentlyPlayed'), false, true, false); 4641 } 4642 } 4643 }); 4644 } 4645} 4646
4647function sr_setCookieSettings() { 4648 if (IRON.sonaar.player.classes.feedUrl && !IRON.sonaar.player.elWidgetId) { 4649 // Escape and delete cookies if the player is not playing a playlist post 4650 document.cookie = "sonaar_mp3_player_settings" + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; 4651 document.cookie = "sonaar_mp3_player_time" + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; 4652 return; 4653 } 4654 4655 let track_Id; 4656 if(typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack] != 'undefined' && typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].track_index != 'undefined'){ 4657 track_Id = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].track_index; 4658 }else{ 4659 track_Id = IRON.sonaar.player.currentTrack; 4660 } 4661 4662 var playlistID, categoryID; 4663 4664 if( IRON.sonaar.player.playlistID != null){ 4665 playlistID = IRON.sonaar.player.playlistID.toString().split(", "); 4666 }else{ 4667 playlistID = ''; 4668 } 4669 if( IRON.sonaar.player.categoryID != null){ 4670 categoryID = IRON.sonaar.player.categoryID.toString().split(", "); 4671 }else{ 4672 categoryID = ''; 4673 } 4674 4675 cvalue = { 4676 playlistID: IRON.sonaar.player.elWidgetId ? IRON.sonaar.player.postId : playlistID, 4677 category: categoryID, 4678 trackID: track_Id , 4679 elWidgetId: IRON.sonaar.player.elWidgetId, 4680 shuffle: IRON.sonaar.player.shuffle, 4681 mute: IRON.sonaar.player.mute, 4682 isPlaying: IRON.sonaar.player.isPlaying, 4683 minimize: IRON.sonaar.player.minimize, 4684 json: IRON.sonaar.player.cookieSetting.json, //Required for the continuous player with Post Related or "audio_meta_field" shorcode attribute as source 4685 }; 4686 4687 if (cvalue.playlistID == "" && cvalue.category == "") { 4688 //Verify cookie value 4689 return; 4690 } 4691 4692 var now = new Date(); 4693 var expires = (typeof sonaar_music.option.srmp3_cookie_expiration !== 'undefined') ? sonaar_music.option.srmp3_cookie_expiration : 3600; 4694 if(expires !=='default'){ 4695 now.setTime(now.getTime() + expires * 1000); // Set the expiration time to 10 seconds from now 4696 expires = "expires=" + now.toUTCString(); 4697 } 4698 document.cookie = "sonaar_mp3_player_settings" + "=" + JSON.stringify(cvalue) + ";" + expires + ";path=/"; 4699} 4700 4701function sr_setCookieVolume() { 4702 document.cookie = "sonaar_mp3_player_volume" + "=" + IRON.sonaar.player.volume + ";default;path=/"; 4703} 4704 4705function sr_setCookieTime() { 4706 if (IRON.sonaar.player.classes.continuousPlayer && ((IRON.sonaar.player.elWidgetId && IRON.sonaar.player.classes.feedUrl) || !IRON.sonaar.player.classes.feedUrl)) { 4707 // If Continuous player is enable AND if playlist is not built through a shortcode. 4708 var cvalue = sr_getTrackCurrentTime(); 4709 document.cookie = "sonaar_mp3_player_time" + "=" + cvalue + ";default;path=/"; 4710 } 4711} 4712 4713function sr_getCookieSettings() { 4714 var cookieSettingsValue = getCookieValue("sonaar_mp3_player_settings"); 4715 var cookieVolumeValue = getCookieValue("sonaar_mp3_player_volume"); 4716 var cookieTimeValue = getCookieValue("sonaar_mp3_player_time"); 4717 4718 if (cookieSettingsValue != "") { 4719 cookieSettingsValue = JSON.parse(cookieSettingsValue); 4720 sr_setPlayerfromCookieSettings(cookieSettingsValue, cookieVolumeValue); 4721 } else { 4722 sr_setVolume(cookieVolumeValue); 4723 } 4724 if (cookieTimeValue != "") { 4725 sr_setTrackCurrentTime(cookieTimeValue); 4726 } 4727} 4728 4729function sr_getCookieVolume() { 4730 const cookieVolumeValue = getCookieValue("sonaar_mp3_player_volume"); 4731 sr_setVolume(cookieVolumeValue); 4732} 4733 4734function getCookieValue(cname) { 4735 var name = cname + "="; 4736 var decodedCookie = decodeURIComponent(document.cookie); 4737 var ca = decodedCookie.split(";"); 4738 for (var i = 0; i < ca.length; i++) { 4739 var c = ca[i]; 4740 while (c.charAt(0) == " ") { 4741 c = c.substring(1); 4742 } 4743 if (c.indexOf(name) == 0) { 4744 return c.substring(name.length, c.length); 4745 } 4746 } 4747 return ""; 4748} 4749 4750function sr_setPlayerfromCookieSettings(playerSetting, cookieVolumeValue) { 4751 IRON.sonaar.player.setPlayer({ 4752 id: playerSetting.playlistID, 4753 category: playerSetting.category, 4754 elwidgetid: playerSetting.elWidgetId, 4755 trackid: playerSetting.trackID, 4756 shuffle: playerSetting.shuffle, 4757 json: playerSetting.json, 4758 continuous: true 4759 }); 4760 var firstLoad = true; 4761 4762 sr_setVolume(cookieVolumeValue); 4763 sr_setMute(playerSetting.mute); 4764 if (playerSetting.isPlaying) { 4765 $("#sonaar-audio").on("loadeddata", function () { 4766 //when the audio element is loaded 4767 if (firstLoad) { 4768 //Dont want to SET current time on the second audio loading. 4769 firstLoad = false;
4770 IRON.sonaar.player.playAudio(); 4771 } 4772 }); 4773 } 4774 4775 IRON.sonaar.player.classes.dontCountContinuous = true; 4776 IRON.sonaar.player.classes.continued = true; 4777 IRON.sonaar.player.minimize = playerSetting.minimize; 4778 IRON.sonaar.player.postId = playerSetting.playlistID; 4779 IRON.sonaar.player.elWidgetId = playerSetting.elWidgetId; 4780 IRON.sonaar.player.classes.feedUrl = IRON.sonaar.player.elWidgetId ? true : false; 4781 IRON.sonaar.player.cookieSetting.json = playerSetting.json; //Required for the continuous player with Post Related or "audio_meta_field" shorcode attribute as source 4782} 4783 4784function sr_getTrackCurrentTime(audioPlayer = null) { 4785 if (IRON.audioPlayer.stickyEnable){ 4786 return document.getElementById("sonaar-audio").currentTime; 4787 }else if(audioPlayer != null){ 4788 const audioInstance = sr_setAudioElementInstance(audioPlayer); 4789 return audioInstance.currentTime; 4790 } 4791} 4792 4793function sr_getTrackDuration() { 4794 return document.getElementById("sonaar-audio").duration; 4795} 4796 4797function sr_setTrackCurrentTime(value) { 4798 IRON.sonaar.player.cookieSetting.currentTime = value; 4799 4800 var firstLoad = true; 4801 $("#sonaar-audio").on("loadeddata", function () { 4802 //when the audio element is loaded 4803 if (firstLoad) { 4804 //Dont want to SET current time on the second audio loading. 4805 firstLoad = false; 4806 4807 if (value > sr_getTrackDuration() || sr_getTrackDuration() == "Infinity") return; 4808 4809 document.getElementById("sonaar-audio").currentTime = value; 4810 } 4811 }); 4812 4813} 4814 4815//Set Modal Popup 4816let sr_modal_loaded = false; 4817const closeSvg = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve"><g><rect x="15.5" y="3.3" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -6.6274 16)" width="2" height="25.5"></rect><rect x="3.3" y="15.5" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -6.6274 16)" width="25.5" height="2"></rect></g></svg>'; 4818function sr_setPopUp() { 4819 4820 if (sr_modal_loaded !== true) { 4821 const popUp = '<div id="sonaar-modal" onclick="sr_closePopUp(this);"><div class="sr_popup-dialog"><div class="sr_popup-content"><div class="sr_close" onclick="sr_closePopUp(this)">' + closeSvg + '</div><div class="sr_popup-body"></div></div></div></div><div class="sr_popup-backdrop"></div>'; 4822 jQuery('body').append(popUp); 4823 sr_modal_loaded = true; 4824 } 4825} 4826 4827 4828function sr_popUp(id, storeId, trackNumber = null, playerId = null, el) { 4829 srp_wc_loadspinner($(el)) 4830 var data = { 4831 'action': 'load_post_by_ajax', 4832 'id': id, 4833 'store-id': storeId, 4834 'nonce': sonaar_music.ajax.ajax_nonce 4835 }; 4836 $.post(sonaar_music.ajax.ajax_url, data, function (response) { 4837 srp_wc_unloadspinner($(el)) 4838 response = srp_convertTTMLTime(JSON.parse(response)); 4839 $('#sonaar-modal .sr_popup-body').html(response); 4840 $('#sonaar-modal').attr('data-track-number', trackNumber); 4841 $('#sonaar-modal').attr('data-player-id', playerId); 4842 sr_openPopUp(); 4843 }) 4844} 4845function sr_openPopUp() { 4846 $(document).keyup(function (e) { 4847 if (e.key === "Escape") { 4848 sr_closePopUp(); 4849 } 4850 }); 4851 sr_popup_maybe_apply_bg_img(); 4852 $('body').addClass('sr_popup-open'); 4853 $('#sonaar-modal, .sr_popup-backdrop').addClass('sr_show'); 4854} 4855function sr_popup_maybe_apply_bg_img() { 4856 // Find the first image in the modal 4857 var $img = $('#sonaar-modal').find('img').first(); 4858 if ($img.length > 0) { 4859 if(sonaar_music.option.cta_popup_background_image !== 'true') return; 4860 var imgUrl = $img.attr('src'); 4861 4862 // Add the has-bg-image class and dynamically inject the background image 4863 $('#sonaar-modal').addClass('has-bg-image'); 4864 4865 // Inject CSS to the ::before pseudo-element 4866 var styleTag = $('#sr-popup-bg-style'); 4867 if (styleTag.length === 0) { 4868 $('head').append('<style id="sr-popup-bg-style"></style>'); 4869 styleTag = $('#sr-popup-bg-style'); 4870 } 4871 4872 styleTag.html(` 4873 #sonaar-modal.has-bg-image .sr_popup-content::before { 4874 background-image: url('${imgUrl}'); 4875 } 4876 `); 4877 } else { 4878 // Remove the background image if no image is found 4879 $('#sonaar-modal').removeClass('has-bg-image'); 4880 4881 // Remove the injected style if there's no background image 4882 $('#sr-popup-bg-style').remove(); 4883 } 4884} 4885 4886function sr_closePopUp(el) { 4887 4888 // Prevent popup to be clicked outside and close if contain a form 4889 if (el !== undefined) { 4890 if (!$(el).hasClass('sr_close') && $('#sonaar-modal').find('input').length > 0) { 4891 return; // Exit the function and don't close the modal if it's a "Make Offer" form 4892 } 4893 } 4894 if ($(el).attr('id') == 'sonaar-modal' && $(".sr_popup-dialog:hover").length != 0) { //When "sr_closePopUp" function is cast from a click on 'sonaar-modal' we want exit the fucntion if the cursor is over the popup content. 4895 return; 4896 } 4897 //$(document).off(); // this conflict with Elementor Popup that does not open once our popup has been opened. 4898 $('body').removeClass('sr_popup-open'); 4899 $('#sonaar-modal, .sr_popup-backdrop').removeClass('sr_show'); 4900} 4901 4902function sr_audioSkipTo(seconds = 30, $audio_el = null) { 4903 const audioInstance = sr_setAudioElementInstance(); 4904 audioInstance.currentTime = audioInstance.currentTime + seconds; 4905} 4906 4907function srp_toggleLyricsContainer() { 4908 if ($('#srmp3_lyrics_container').hasClass("open")) { 4909 $('#srmp3_lyrics_container').toggleClass("open"); 4910 $('#srmp3_lyrics_container').toggle(); 4911 } 4912} 4913 4914// embed Lyrics 4915//let sr_lyric_loaded = false;
4916 4917function sr_setLyricsPlayingContainer() { 4918 4919 if (sr_lyric_loaded !== true) { 4920 const popUp = '<!-- Lyrics Now Playing --><div id="srmp3_lyricsplaying_container"></div><div id="srmp3_lyrics_container" style="display:none;"><i class="sricon-close-circle"></i><div class="srmp3_lyrics"></div></div>'; 4921 jQuery('body').append(popUp); 4922 document.getElementById("srmp3_lyricsplaying_container").addEventListener("click", toggleLyrics); 4923 function toggleLyrics() { 4924 $('#srmp3_lyrics_container').toggle(); 4925 $('#srmp3_lyrics_container').toggleClass("open"); 4926 } 4927 4928 var scrollItem = $('#srmp3_lyrics_container .srmp3_lyrics')[0]; 4929 var ps = new PerfectScrollbar(scrollItem, { 4930 wheelSpeed: 1, 4931 swipeEasing: true, 4932 wheelPropagation: false, 4933 minScrollbarLength: 20, 4934 suppressScrollX: true, 4935 maxScrollbarLength: 100, 4936 }); 4937 4938 $('#srmp3_lyrics_container .srmp3_lyrics').on('scroll', function () { 4939 if (!srp_lyricsAreScrolling) { 4940 if ($('#srmp3_lyrics_container').hasClass('srp_lyric_unlock')) { 4941 const srmp_lyrics_pos = $('#srmp3_lyrics_container .srmp3_lyrics_read').offset().top - $('#srmp3_lyrics_container').offset().top 4942 if (srmp_lyrics_pos < $('#srmp3_lyrics_container').height() && srmp_lyrics_pos > 50) { // if element is visible after scrolling 4943 $('#srmp3_lyrics_container').removeClass('srp_lyric_unlock'); 4944 } 4945 } else { 4946 $('#srmp3_lyrics_container').addClass('srp_lyric_unlock'); 4947 } 4948 } 4949 srp_lyricsAreScrolling = false; 4950 }); 4951 sr_lyric_loaded = true; 4952 } 4953 $(document).keydown(function (event) { 4954 if (event.keyCode == 27) { 4955 srp_toggleLyricsContainer(); 4956 } 4957 }); 4958 $('#srmp3_lyrics_container .sricon-close-circle').on('click', function () { 4959 srp_toggleLyricsContainer(); 4960 }) 4961} 4962var sr_lyric_loaded = false; 4963function sr_loadLyricsAjax(postid, track_pos) { 4964 $('.srmp3_lyrics_title').empty(); 4965 $('.srmp3_lyrics_album').empty(); 4966 $('.srmp3_lyrics').empty(); 4967 $('.srmp3_lyrics').removeClass('srmp3_singning'); 4968 $('.srmp3_lyrics_container').empty(); 4969 $('#srmp3_lyricsplaying_container').empty(); 4970 4971 4972 if (typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack] != 'undefined' && IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].has_lyric || 4973 $($('.sr-playlist-item[data-post-id="' + postid + '"][data-track-pos="' + track_pos + '"]')[0]).attr('data-track-lyric') 4974 ) { 4975 4976 if (!$('#srmp3_lyricsplaying_container').length) 4977 sr_setLyricsPlayingContainer(); 4978 4979 if (typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack] != 'undefined') { 4980 track_title = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].track_title; 4981 album = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].album_title; 4982 } else { 4983 track_title = document.querySelector('.sr-playlist-item[data-post-id="' + postid + '"][data-track-pos="' + track_pos + '"]').getAttribute('data-tracktitle'); 4984 album = document.querySelector('.sr-playlist-item[data-post-id="' + postid + '"][data-track-pos="' + track_pos + '"]').getAttribute('data-albumtitle'); 4985 } 4986 4987 jQuery('.srmp3_lyrics_album').replaceWith($('<div>', { 4988 class: 'srmp3_lyrics_album', 4989 text: album 4990 }).prependTo('#srmp3_lyrics_container')); 4991 jQuery('.srmp3_lyrics_title').replaceWith($('<div>', { 4992 class: 'srmp3_lyrics_title', 4993 text: track_title 4994 }).prependTo('#srmp3_lyrics_container')); 4995 4996 4997 var data = { 4998 'action': 'load_lyrics_ajax', 4999 'post-id': postid, 5000 'track-position': track_pos, 5001 'nonce': sonaar_music.ajax.ajax_nonce 5002 }; 5003 5004 $.post(sonaar_music.ajax.ajax_url, data, function (response) { 5005 response = srp_convertTTMLTime(JSON.parse(response)); 5006 $('.srmp3_lyrics').html($(response).html()); 5007 }) 5008 5009 } 5010} 5011 5012function srp_convertTTMLTime(ttml) { 5013 ttml = $('<div>' + ttml + '</div>'); 5014 $(ttml).find('p[begin]').each(function () { 5015 var nodeTimeRaw_begin = $(this).attr('begin'); 5016 var nodeTimeRaw_end = $(this).attr('end'); 5017 5018 // Check if the time format is in seconds and convert to hh:mm:ss.mmm 5019 if (nodeTimeRaw_begin.includes('s')) { 5020 var seconds = parseFloat(nodeTimeRaw_begin.slice(0, -1)); 5021 var time = new Date(seconds * 1000).toISOString().substr(11, 12); 5022 $(this).attr('begin', time); 5023 nodeTimeRaw_begin = time; 5024 } 5025 if (nodeTimeRaw_end.includes('s')) { 5026 var seconds = parseFloat(nodeTimeRaw_end.slice(0, -1)); 5027 var time = new Date(seconds * 1000).toISOString().substr(11, 12); 5028 $(this).attr('end', time); 5029 nodeTimeRaw_end = time; 5030 } 5031 5032 5033 var a = nodeTimeRaw_begin.split(':'); 5034 var b = nodeTimeRaw_end.split(':'); 5035 $(this).attr('begin', (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2])); 5036 $(this).attr('end', (+b[0]) * 60 * 60 + (+b[1]) * 60 + (+b[2])); 5037 }); 5038 return ttml; 5039} 5040 5041function sr_shuffleToggle(event = null, audioPlayer = $('.iron-audioplayer.sr_selected')) { 5042 let shuffleValue 5043 if (IRON.audioPlayer.stickyEnable) { 5044 if (IRON.sonaar.player.shuffle) { 5045 IRON.sonaar.player.shuffle = false;
5046 } else { 5047 IRON.sonaar.player.shuffle = true; 5048 IRON.sonaar.player.setRandomList(); 5049 } 5050 if (IRON.sonaar.player.classes.continuousPlayer) { 5051 sr_setCookieSettings(); 5052 } 5053 shuffleValue = IRON.sonaar.player.shuffle; 5054 } else { 5055 if (audioPlayer.shuffle) { 5056 audioPlayer.shuffle = false; 5057 } else { 5058 audioPlayer.shuffle = true; 5059 } 5060 shuffleValue = audioPlayer.shuffle; 5061 } 5062 audioPlayer.attr('data-shuffle', shuffleValue); 5063} 5064 5065function sr_setSpeedRate(event = null, audioPlayer = $('.iron-audioplayer.sr_selected'), $audio_el = null) { 5066 var rateSpeed = [0.5, 1, 1.2, 1.5, 2]; // default speed rate 5067 if(typeof sonaar_music.option.playback_speed != 'undefined'){ 5068 rateSpeed = sonaar_music.option.playback_speed.split(',').map(function (item) { 5069 item = parseFloat(item, 10); // convert to number 5070 return item; 5071 }); 5072 rateSpeed = rateSpeed.filter(function (el) { 5073 return !isNaN(el); // filter out NaN 5074 }); 5075 rateSpeed = rateSpeed.sort(); // sort 5076 } 5077 if (IRON.audioPlayer.stickyEnable) { 5078 var currentRateSpeed = IRON.sonaar.player.classes.speedRate; 5079 } else { 5080 var currentRateSpeed = audioPlayer.attr('data-speedrate'); 5081 } 5082 if (currentRateSpeed == rateSpeed[rateSpeed.length - 1]) { 5083 currentRateSpeed = rateSpeed[0] 5084 } else { 5085 $.each(rateSpeed, function () { 5086 if (this > currentRateSpeed) { 5087 currentRateSpeed = this 5088 return false 5089 } 5090 }) 5091 } 5092 if (IRON.audioPlayer.stickyEnable) { 5093 document.getElementById("sonaar-audio").playbackRate = currentRateSpeed; 5094 IRON.sonaar.player.classes.speedRate = currentRateSpeed; 5095 } else { 5096 sr_setAudioElementInstance().playbackRate = currentRateSpeed; 5097 } 5098 audioPlayer.attr('data-speedrate', currentRateSpeed); 5099 audioPlayer.find('.sr_speedRate div').html(currentRateSpeed + 'x'); 5100} 5101 5102function sr_setVolume(value, audioPlayer = null, $audio_el = null) { 5103 5104 if (value == '') { 5105 return; 5106 } 5107 5108 value = parseFloat(value); 5109 5110 if(value > 1){ 5111 value = 1; 5112 } 5113 if(value < 0){ 5114 value = 0; 5115 } 5116 5117 if (audioPlayer) { 5118 audioPlayer.attr('data-volume', value) 5119 } 5120 if (IRON.audioPlayer.stickyEnable) { 5121 IRON.sonaar.player.volume = value; 5122 sr_setCookieVolume(); 5123 } 5124 if ( audioPlayer || IRON.audioPlayer.stickyEnable ){ 5125 sr_setAudioElementInstance(audioPlayer).volume = value; 5126 } 5127} 5128 5129function sr_setMute(value, $audio_el = null) { 5130 sr_setAudioElementInstance().muted = value; 5131 5132 if (IRON.audioPlayer.stickyEnable) { 5133 IRON.sonaar.player.mute = value; 5134 if (IRON.sonaar.player.classes.continuousPlayer) { 5135 sr_setCookieSettings(); 5136 } 5137 } 5138} 5139 5140function sr_muteTrigger(event = null, audioPlayer = $('.iron-audioplayer.sr_selected'), $audio_el = null) { 5141 if($('.slider-container:hover').length) 5142 return; 5143 5144 if (IRON.audioPlayer.stickyEnable && IRON.sonaar.player.mute || !IRON.audioPlayer.stickyEnable && audioPlayer.attr('data-mute') == 'true') { 5145 sr_setMute(false, $audio_el); 5146 if (audioPlayer) { 5147 audioPlayer.attr('data-mute', 'false'); 5148 } 5149 } else { 5150 sr_setMute(true, $audio_el); 5151 if (audioPlayer) { 5152 audioPlayer.attr('data-mute', 'true'); 5153 } 5154 } 5155 5156} 5157 5158function sr_initSlider(el, audioPlayer = null, $audio_el = null) { 5159 el.slider({ 5160 orientation: "vertical", 5161 range: "min", 5162 min: 0, 5163 max: 100, 5164 value: 100, 5165 slide: function (event, ui) { 5166 sr_setVolume(ui.value / 100, audioPlayer, $audio_el); 5167 sr_setMute(false, $audio_el); 5168 }, 5169 }); 5170} 5171 5172function srp_js_dynamic_style(audioPlayer) { 5173 /*Add margin bottom to the DIV"audio-track" related to the text-size. Reomove unwanted avsolut behavior on Mobile*/ 5174 const newMarge = $(audioPlayer).find('.srp_tracklist-item-date').css('font-size'); 5175 $(audioPlayer).find('.sr-playlist-item[data-show-date="1"] .audio-track').css('margin-bottom', newMarge); 5176} 5177 5178function sr_updateSlider(event = null, audioPlayer = $('#sonaar-player')) { //update Volume slider when the volume has been set to another slider(widget or sticky) 5179 let volume; 5180 if (IRON.audioPlayer.stickyEnable) { 5181 volume = IRON.sonaar.player.volume; 5182 } else {
5183 volume = (audioPlayer.attr('data-volume') == NaN) ? 100 : audioPlayer.attr('data-volume'); 5184 } 5185 volume = Math.floor(volume * 100) + '%'; 5186 audioPlayer.find('.ui-slider-range').height(volume); 5187 audioPlayer.find('.ui-slider-handle ').css('bottom', volume); 5188} 5189 5190function sr_setAudioElementInstance(audioPlayer = null) { 5191 if (IRON.audioPlayer.stickyEnable) { 5192 return document.getElementById("sonaar-audio"); 5193 } else { 5194 if( !$('.sr_selected .player audio').length && audioPlayer !==null ){ 5195 return audioPlayer.find('audio')[0]; 5196 }else{ 5197 return document.querySelector('.sr_selected .player audio'); 5198 } 5199 } 5200} 5201 5202 5203/*Function call from the shortcode [sonaar_ts] (Time Stamp)*/ 5204function sonaar_ts_shortcode(params) { //eq: params = "{ id:'19', time: '0:10'}" 5205 //params list: "id", "widget_id", "trackid", "time", "ts_id", "play_icon" 5206 5207 const el = '#sonaar_ts-' + params.ts_id; 5208 let newSonaarTS_selected = true; 5209 srp_startingTime = params.time; 5210 if (typeof params.trackid == 'undefined') { 5211 params.trackid = 0; 5212 } 5213 5214 $('.srmp3_sonaar_ts_shortcode:not(#sonaar_ts-' + params.ts_id).removeClass('sr_selected audio-playing'); //clear all other sonaar_ts 5215 5216 if ($(el).hasClass('sr_selected')) { // Add and remove "sr_selected" Class 5217 newSonaarTS_selected = false; 5218 if (params.play_icon == 'true' && $(el).hasClass('sr_selected')) { // When PLAY icon is enable, Only skip to the time parameter on the first click 5219 delete params.time; 5220 } 5221 } else { 5222 $('.srmp3_sonaar_ts_shortcode ').removeClass('sr_selected'); 5223 $(el).addClass('sr_selected'); 5224 if (IRON.audioPlayer.stickyEnable) { 5225 IRON.sonaar.player.selectedTimeStamp = $(el); 5226 } 5227 } 5228 5229 if ($(el).hasClass('audio-playing')) { // Add and remove "audio-playing" Class 5230 $(el).removeClass('audio-playing'); 5231 } else { 5232 $(el).addClass('audio-playing'); 5233 } 5234 5235 if (params.play_icon == 'true') { // Special Behaviors with the PLAY/PAUSE Button 5236 if (IRON.audioPlayer.stickyEnable && !$(el).hasClass('audio-playing')) { // Sync with the sticky player 5237 IRON.sonaar.player.pause(); 5238 return; 5239 } 5240 if (!IRON.audioPlayer.stickyEnable && typeof $(el).data('ts-sync') != 'undefined' && !newSonaarTS_selected) { // If Sync with a widget when sticky disable and it is a new selected sonaar_ts: toggle between play and pause 5241 IRON.players[$(el).data('ts-sync')].play(); 5242 return; 5243 } 5244 } 5245 5246 5247 if (typeof params.id == 'undefined') { //if no playlist post ID is targeted 5248 5249 /* WIDGET PLAYER INTERACTION */ 5250 if (typeof IRON.players != 'undefined' && IRON.players.length > 0) { 5251 5252 /* Find the widget player linked to the sonaar_ts */ 5253 let player = 0; 5254 if (typeof params.widget_id != 'undefined') { //if sonaar_ts has widget_id parameters 5255 let playerID; 5256 if ($('#' + params.widget_id + ' .iron-audioplayer').length) { //if widget_id is an CSS id from a parent (eq: custom css id from elementor https://d.pr/i/kybO21) 5257 playerID = $('#' + params.widget_id + ' .iron-audioplayer').data('id'); 5258 } 5259 if ($('#' + params.widget_id + '.iron-audioplayer').length) { //if widget_id is an CSS id from the iron-audioplayer itself (this should not happen because its ID is always different(regenerated), but who knows...) 5260 playerID = $('#' + params.widget_id + '.iron-audioplayer').data('id'); 5261 } 5262 if ($('[data-id="' + params.widget_id + '"] .iron-audioplayer').length) { //if widget_id is the data-id from a parent (eq: the default elementor widget ID) 5263 playerID = $('[data-id="' + params.widget_id + '"] .iron-audioplayer').data('id'); 5264 } 5265 if ($('[data-id="' + params.widget_id + '"].iron-audioplayer').length) {//if widget_id is the data-id from the iron-audioplayer itself (The id can be set through the sonaar_audioplayer shortcode "id" parameter. Eq:[sonaar_audioplayer id="player1"]) 5266 playerID = $('[data-id="' + params.widget_id + '"].iron-audioplayer').data('id'); 5267 } 5268 5269 $(IRON.players).each(function (index) { // looking for the audioplayer ID 5270 if (IRON.players[index].audioPlayer.data('id') == playerID) { 5271 player = index; 5272 return; 5273 } 5274 }) 5275 } else { 5276 $(IRON.players).each(function (index) { // looking for the audioplayer before the shortcode 5277 if (IRON.players[index].audioPlayer.offset().top > $(el).offset().top) { 5278 return; 5279 } 5280 player = index; 5281 }) 5282 } 5283 5284 5285 IRON.players[player].audioPlayer.data('ts-sync', params.ts_id); // mark the sonaar_ts id to the player widget 5286 $(el).data('ts-sync', player); // mark the player id to the sonaar_ts button 5287 const trackIsPlaying = IRON.players[player].audioPlayer.hasClass('audio-playing') && IRON.players[player].audioPlayer.find('.sr-playlist-item').eq(params.trackid).hasClass('current') 5288 5289 5290 /* WIDGET PLAYER Behavior: Play, Pause or seektime */ 5291 if (!trackIsPlaying) { //if the track is not currently playing 5292 IRON.players[player].audioPlayer.find('.srp_audio_trigger').eq(params.trackid).trigger('click'); //Play from widget 5293 } else { 5294 srp_startingTime = 0; 5295 } 5296 if ( 5297 !IRON.audioPlayer.stickyEnable || 5298 (IRON.audioPlayer.stickyEnable && trackIsPlaying) || // Always seekTime when the track already playing and the sonaar_ts play/pause icon feature is disable 5299 (!IRON.players[player].audioPlayer.find('.sr-playlist-item').eq(params.trackid).hasClass('current') && newSonaarTS_selected) //always seekTime when we click on a new sonaar_ts and we targeted a new track 5300 ) { 5301 IRON.players[player].seekTime(params.time); 5302 } 5303 return; 5304 5305 } else {
5306 /* If no widget and no ID has been set, play tracks from the current post. */ 5307 params.id = srp_vars.sonaar_music.currentPostId; 5308 } 5309 } 5310 /* STICKY play playlist from POST ID*/ 5311 IRON.sonaar.player.setPlayerAndPlay(params); 5312} 5313 5314 5315$(document.body).on('click', '.view-license-button', function (event) { 5316 sr_setPopUp(); 5317 srp_wc_loadspinner($(event.target)); 5318 5319 var data = { 5320 'action': 'load_license_preview_ajax', 5321 'variationId': event.currentTarget.getAttribute('data-variation-id'), 5322 'licenseId': event.currentTarget.getAttribute('data-license-id'), 5323 'productName': event.currentTarget.getAttribute('data-product-name'), 5324 'nonce': sonaar_music.ajax.ajax_nonce 5325 }; 5326 $.post(sonaar_music.ajax.ajax_url, data, function (response) { 5327 $('#sonaar-modal .sr_popup-body').html(response); 5328 sr_openPopUp(); 5329 srp_wc_unloadspinner($(event.target)); 5330 }) 5331}); 5332 5333/* 5334***************************************************** 5335START OF SHARE POPUP 5336***************************************************** 5337*/ 5338$(document).on('click', '.sr_store_force_share_bt', function () { 5339 const link = $(this).attr('href'); 5340 let id = (typeof $(this).data('source-post-id') != 'undefined') ? $(this).data('source-post-id') : ''; 5341 let track_title, image_src, track_pos, current_time; 5342 let reverse_post_tracklist = false; 5343 let post_track_count = null; 5344 5345 // Check if this is within sticky player 5346 if ($(this).closest('.player').length > 0) { 5347 track_title = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].track_title; 5348 image_src = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].poster; 5349 id = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].sourcePostID; 5350 track_pos = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].track_pos 5351 if (typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].reverse_post_tracklist !== 'undefined' && IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].reverse_post_tracklist === true && typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].post_track_count !== 'undefined') { 5352 post_track_count = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].post_track_count; 5353 reverse_post_tracklist = true; 5354 } 5355 5356 // if this is within the mini player 5357 } else if ($(this).parents('.album-player').length > 0) { 5358 const trackIndex = $(this).parents('.iron-audioplayer').attr('trackselected'); 5359 const $track = $(this).parents('.iron-audioplayer').find('.sr-playlist-item').eq(trackIndex); 5360 track_pos = $track.data('track-pos'); 5361 track_title = $track.find('.tracklist-item-title').text(); 5362 image_src = $track.data('albumart'); 5363 if (typeof $track.data('reverse') !== 'undefined' && $track.data('reverse') === true && typeof $track.data('post_track_count') !== 'undefined') { 5364 post_track_count = $track.data('post_track_count'); 5365 reverse_post_tracklist = true; 5366 } 5367 5368 5369 5370 // Or if this is within .sr-playlist-item-flex 5371 } else if ($(this).closest('.sr-playlist-item').length > 0) { 5372 track_pos = $(this).closest('.sr-playlist-item').data('track-pos'); 5373 track_title = $(this).closest('.sr-playlist-item').find('.tracklist-item-title').text(); 5374 image_src = $(this).closest('.sr-playlist-item').data('albumart'); 5375 if (typeof $(this).closest('.sr-playlist-item').data('reverse') !== 'undefined' && $(this).closest('.sr-playlist-item').data('reverse') == true && typeof $(this).closest('.sr-playlist-item').data('post_track_count') !== 'undefined') { 5376 post_track_count = $(this).closest('.sr-playlist-item').data('post_track_count'); 5377 reverse_post_tracklist = true; 5378 } 5379 5380 // Or within .srp_swiper-album-art 5381 } else if ($(this).closest('.srp_swiper-album-art').length > 0) { 5382 track_title = $(this).closest('.srp_swiper-album-art').find('.srp_swiper-track-title').text(); 5383 // Extract the image url from the 'background-image' CSS property 5384 const backgroundImage = $(this).closest('.srp_swiper-album-art').css('background-image'); 5385 image_src = backgroundImage.slice(4, -1).replace(/"/g, ""); 5386 }
5387 current_time = (IRON.sonaar.player.currentTime != '' && typeof IRON.sonaar.player.currentTime != 'undefined') ? IRON.sonaar.player.currentTime : '00:00'; 5388 5389 if( reverse_post_tracklist && post_track_count !== null ){ 5390 track_pos = post_track_count - track_pos - 1; 5391 } 5392 5393 srp_share_popup(id, $(this), link, track_title, image_src, track_pos,current_time); 5394 5395 return false; 5396}); 5397 5398function srp_share_popup(id, el, link, track_title, image_src, track_pos, current_time = '00:00') { 5399 track_pos = (typeof track_pos != 'undefined') ? track_pos + 1 : ''; 5400 var separator = link.includes('?') ? '&' : '?'; 5401 var link = (link + separator + 'ts_post_id=' + id + '&ts_track_num=' + track_pos).replace(/([^:]\/)\/+/g, "$1"); 5402 link = link.replace('#!', ''); // remove #! from 5403 5404 sr_setPopUp(); 5405 var data = { 5406 'action': 'load_share_by_ajax', 5407 'id': id, 5408 'link': link, 5409 'track_title': track_title, 5410 'image_src': image_src, 5411 'current_time': current_time, 5412 'nonce': sonaar_music.ajax.ajax_nonce 5413 }; 5414 5415 $.post(sonaar_music.ajax.ajax_url, data, function (response) { 5416 5417 response = JSON.parse(response); 5418 $('#sonaar-modal .sr_popup-body').html(response); 5419 5420 // add more button on mobile 5421 function isSmallDevice() { 5422 return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); 5423 } 5424 $('.srp-share-mobile-more').hide(); 5425 if (navigator.share && isSmallDevice()) { 5426 $('.srp-share-mobile-more').show(); 5427 $(document).on('click', '.srp-share-mobile-more', function (e) { 5428 navigator.share({ 5429 url: link 5430 }) 5431 .then(() => console.log('Successful share')) 5432 .catch((error) => console.log('Error sharing', error)); 5433 }); 5434 } 5435 5436 5437 $('.srp-modal-sticky-player--time').hide(); 5438 sr_openPopUp(); 5439 5440 var input = $('#myInput'); 5441 5442 // Store the initial url value 5443 var initialUrl = input.val(); 5444 const domain = window.location.hostname; 5445 if (sonaar_music.option.share_email_body.includes("{{website_domain}}")) { 5446 sonaar_music.option.share_email_body = sonaar_music.option.share_email_body.replace("{{website_domain}}", domain); 5447 } 5448 // Function to update the social media share links 5449 function updateShareLinks() { 5450 link = input.val(); 5451 // Now update the share URLs for each of the social media buttons 5452 $('.fab.fa-facebook').attr('href', 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(input.val())); 5453 $('.fab.fa-twitter').attr('href', 'https://twitter.com/intent/tweet?url=' + encodeURIComponent(input.val())); 5454 $('.fab.fa-whatsapp').attr('href', 'https://api.whatsapp.com/send?text=' + encodeURIComponent(input.val())); 5455 5456 var mailto_link = 'mailto:?subject=' + encodeURIComponent(sonaar_music.option.share_email_subject) + '&body=' + encodeURIComponent(sonaar_music.option.share_email_body) + '%0D%0A%0D%0A' + encodeURIComponent(input.val()); 5457 $('.fas.fa-envelope').attr('href', mailto_link); 5458 5459 var sms_link = 'sms:?body=' + encodeURIComponent(sonaar_music.option.share_email_body) + '%0D%0A%0D%0A' + encodeURIComponent(input.val()); 5460 $('.fas.fa-sms').attr('href', sms_link); 5461 } 5462 5463 // Add an event listener to the checkbox 5464 $('#stickyPlayerCheckbox').on('change', function () { 5465 if (this.checked) { 5466 $('.srp-modal-sticky-player--time').show(); 5467 var separator = window.location.href.includes('?') ? '&' : '?'; 5468 var updatedUrl = (window.location.href + separator + 'ts_post_id=' + id + '&ts_track_num=' + track_pos).replace(/([^:]\/)\/+/g, "$1"); 5469 updatedUrl = updatedUrl.replace('#!', ''); // remove #! from the url 5470 5471 var url = new URL(updatedUrl); 5472 5473 if ($('#stickyPlayerTimeCheckbox').is(':checked')) { 5474 var newTime = $('#stickyPlayerCurrentTime').val(); 5475 url.searchParams.set('ts_time', newTime); 5476 } else { 5477 url.searchParams.set('ts_time', '00:00'); 5478 } 5479 5480 input.val(url.toString().replace(/%3A/g, ':')); 5481 } else { 5482 $('.srp-modal-sticky-player--time').hide(); 5483 input.val(initialUrl); 5484 } 5485 5486 updateShareLinks(); 5487 }); 5488 // Add an event listener to the checkbox 5489 // Add an event listener to the checkbox 5490 $('#stickyPlayerCurrentTime').on('keypress', function (e) { 5491 var key = String.fromCharCode(!e.charCode ? e.which : e.charCode); 5492 if (!/^[0-9:]$/.test(key)) { 5493 e.preventDefault(); 5494 } 5495 }).on('input', function () { 5496 var input = $(this); 5497 var newTime = input.val(); 5498 5499 // Check if newTime contains only numbers and ":" character 5500 if (!/^[0-9:]*$/.test(newTime)) { 5501 // Invalid input, revert to previous value 5502 input.val(input.data('oldValue') || ''); 5503 return; 5504 } 5505 5506 // Update old value 5507 input.data('oldValue', newTime); 5508 5509 // Get the current URL from the myInput field 5510 var url = new URL($('#myInput').val()); 5511 5512 // Check if the stickyPlayerTimeCheckbox is checked 5513 if ($('#stickyPlayerTimeCheckbox').is(':checked')) { 5514 // Set the new ts_time value 5515 url.searchParams.set('ts_time', newTime); 5516 } else { 5517 // If the checkbox is not checked, reset ts_time to 00:00 5518 url.searchParams.set('ts_time', '00:00'); 5519 } 5520 5521 // Update the myInput field with the new URL, and replace the encoded ":" character 5522 $('#myInput').val(url.toString().replace(/%3A/g, ':')); 5523 updateShareLinks(); 5524 }); 5525 5526 $('#stickyPlayerTimeCheckbox').on('change', function () { 5527 var url = new URL($('#myInput').val()); 5528 5529 if ($(this).is(':checked')) { 5530 // Checkbox is checked, grab the current time and update the ts_time value 5531 var newTime = $('#stickyPlayerCurrentTime').val(); 5532 5533 // Check if newTime contains only numbers and ":" character 5534 if (/^[0-9:]*$/.test(newTime)) { 5535 url.searchParams.set('ts_time', newTime); 5536 } 5537 } else { 5538 // Checkbox is unchecked, reset ts_time to 00:00 5539 url.searchParams.set('ts_time', '00:00'); 5540 } 5541 5542 // Update the myInput field with the new URL, and replace the encoded ":" character 5543 $('#myInput').val(url.toString().replace(/%3A/g, ':')); 5544 updateShareLinks(); 5545 }); 5546 5547 }) 5548 5549} 5550 5551async function srp_share_popup_CopyToClipboard() { 5552 const copyText = document.getElementById('myInput'); 5553 const copyButton = document.getElementById('copyButton'); // You'll need to add an ID to your Copy button for this to work 5554 copyTxt = (typeof sonaar_music.option.share_label_copy != 'undefined') ? sonaar_music.option.share_label_copy : 'Copy'; 5555 copiedTxt = (typeof sonaar_music.option.share_label_copied != 'undefined') ? sonaar_music.option.share_label_copied
5555: 'Copied'; 5556 try { 5557 await navigator.clipboard.writeText(copyText.value); 5558 // Change button text 5559 copyButton.innerText = copiedTxt; 5560 // Reset button text back to 'Copy' after some time 5561 setTimeout(() => copyButton.innerText = copyTxt, 3000); 5562 } catch (err) { 5563 console.error('Failed to copy text to clipboard', err); 5564 copyButton.innerText = 'Failed to copy'; 5565 } 5566} 5567 5568/* 5569***************************************************** 5570END OF SHARE POPUP 5571***************************************************** 5572*/ 5573 5574// Ensure to include this outside the object if jQuery is required globally 5575IRON.favorites = { 5576 /* 5577 ***************************************************** 5578 ADD TO FAVORITE 5579 ***************************************************** 5580 */ 5581 init: function() { 5582 $ = jQuery; 5583 var self = this; 5584 5585 if (srp_vars.is_logged_in === 'yes') { 5586 // If the user is logged in, fetch their playlists. 5587 5588 self.initRightClick(); 5589 5590 IRON.favorites.dataType = 'user_meta'; 5591 IRON.userPlaylists = sonaar_music.playlists || []; 5592 5593 self.processPlaylists(); 5594 5595 } else if(sonaar_music.option.enable_favorites_for_anonymous ==='true'){ 5596 // If the user is not logged in, use cookies 5597 5598 self.initRightClick(); 5599 5600 IRON.favorites.dataType = 'cookies'; 5601 IRON.userPlaylists = sonaar_music.playlists || []; 5602 5603 $('.srp_player_is_favorite').parent('.iron_widget_radio').css('opacity', 0); // Hide the player until the cookie is loaded by ajax 5604 $('.iron-audioplayer').each(function(index) { 5605 if($(this).hasClass('srp_player_is_favorite')){ 5606 IRON.favorites.reloadPlayerAjax(this, index, true); 5607 } 5608 }); 5609 self.processPlaylists(); 5610 $(IRON.favorites.favoriteTracks).each(function() { 5611 $('[data-post-id="' + this.postId + '"][data-track-pos="' + this.trackPos+ '"] .srp-fav-bt i').addClass(sonaar_music.option.srp_fav_remove_icon).removeClass(sonaar_music.option.srp_fav_add_icon); 5612 }); 5613 } 5614 }, 5615 5616 processPlaylists: function() { 5617 IRON.favorites.favoritesEnabled = true; 5618 $('.srp_favorites_loading').removeClass('srp_favorites_loading'); 5619 // Find 'Favorites' playlist 5620 for (var i = 0; i < IRON.userPlaylists.length; i++) { 5621 if (IRON.userPlaylists[i].playlistName === 'Favorites') { 5622 //console.log("you have a playlist named 'Favorites'", IRON.userPlaylists[i].tracks); 5623 if (!IRON.userPlaylists[i].tracks) { 5624 IRON.userPlaylists[i].tracks = []; 5625 } 5626 IRON.favorites.favoriteTracks = IRON.userPlaylists[i].tracks; 5627 IRON.favorites.favoritePlaylistIndex = i; 5628 break; 5629 } 5630 } 5631 this.hideShowPlayer(); 5632 if(IRON.audioPlayer.stickyEnable && IRON.sonaar.player.list.tracks){//Verify if the sticky player is enable and if the playlist is loaded 5633 this.setStickyFavButtons(); //reset the sticky player favorite buttons after the ajax call: Fix issue with the favorite button from the CONTINUOUS sticky player 5634 } 5635 }, 5636 5637 reloadPlayerAjax: function(currentplayer, num = null, transition = false){ 5638 // transition means that the player is being loaded in a popup and we want a smooth fade in 5639 if(transition && $('.elementor-editor-active').length) 5640 return; 5641 5642 var $currentplayer = $(currentplayer); 5643 var playerParent = $currentplayer.parent('.iron_widget_radio'); 5644 if(num === null){ 5645 num = 0; 5646 $('.iron-audioplayer').each(function(){ 5647 if($(this).data('id')=== $currentplayer.data('id')){ 5648 return; 5649 } 5650 num++; 5651 }); 5652 } 5653 5654 var maxDuration = 4000; 5655 var interval = 100; 5656 var elapsedTime = 0; 5657 if(transition){ 5658 playerParent.css({ 'opacity': 0, 'transition': 'opacity 0.15s ease' }); 5659 } 5660 5661 var intervalId = setInterval(function() { //Set interval to wait for the player to be loaded: required for player inside a popup 5662 var playerIndex = srp_convertPlayerIdToPlayerNum($currentplayer.data('id')); 5663 if (playerIndex !== null) { 5664 var playerId = IRON.players[playerIndex].audioPlayer.id.split('-'); 5665 playerId = playerId[playerId.length - 1]; 5666 var srp_fav_player_param_args = window['srp_player_params_args_' + playerId]; 5667 var srp_fav_player_param = window['srp_player_params_' + playerId]; 5668 var data = { 5669 'action': 'load_ajax_player', 5670 'nonce': sonaar_music.ajax.ajax_nonce, 5671 'args': srp_fav_player_param_args, 5672 'parameters': srp_fav_player_param, 5673 }; 5674 5675 $.post(sonaar_music.ajax.ajax_url, data, function (response) { 5676 var parsedResponse = $(response); 5677 var newDiv = parsedResponse.find('.iron-audioplayer.srp_player_is_favorite'); 5678 $currentplayer.replaceWith(newDiv); 5679 5680 var player = Object.create(IRON.audioPlayer); 5681 player.init($($('.iron-audioplayer')[num])); 5682 IRON.players[num] = player; 5683 5684 if($('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').length === 0) { // If no items left, show the "not found" message 5685 $('.srp-fav-removeall-bt').hide(); 5686 }else{ 5687 $('.srp-fav-removeall-bt').show(); 5688 } 5689 if(transition){ 5690 playerParent.css('opacity',1); 5691 } 5692 }).fail(function() { 5693 console.log('An error occurred during the post operation.'); 5694 }); 5695 5696 clearInterval(intervalId); 5697 } else { 5698 if(transition){ 5699 playerParent.css('opacity',1); 5700 } 5701 elapsedTime += interval; 5702 if (elapsedTime >= maxDuration) { 5703 clearInterval(intervalId); 5704 } 5705 } 5706 }, interval); 5707 }, 5708 5709 removeTrackFromFavorites: function(postId, trackPos) { 5710 const existingIndex = IRON.favorites.favoriteTracks.findIndex(track => Number(track.postId) === Number(postId) && Number(track.trackPos) === Number(trackPos)); 5711 if (existingIndex !== -1) { 5712 IRON.favorites.favoriteTracks.splice(existingIndex, 1); 5713 } 5714 5715 const $favoritePlayer = $('.iron-audioplayer.srp_player_is_favorite'); 5716 if($favoritePlayer.length > 0) { 5717 $favoritePlayer.find('.sr-playlist-item').each(function() { 5718 const $track = $(this); 5719 const trackData = $track.data(); 5720 if(trackData.postId === parseInt(postId, 10) && trackData.trackPos === parseInt(trackPos,10)) { 5721 if($track.hasClass('current')) { 5722 IRON.sonaar.player.next(); 5723 } 5724 $track.fadeOut(400, function() { 5725 if($track.parents('.iron-audioplayer').hasClass('sr_selectedPlayer') && IRON.audioPlayer.stickyEnable && typeof IRON.sonaar.player.list.tracks[$track.index()] != 'undefined') { 5726 IRON.sonaar.player.list.tracks.splice($track.index(), 1) //Remove track from playlist 5727 if($track.index() <= IRON.sonaar.player.currentTrack) { 5728 IRON.sonaar.player.classes.preventHandleTrackChange = true; //Prevent to reinit the currentrack 5729 IRON.sonaar.player.currentTrack--; //Reduce currentTrack index if the track is before the currentTrack 5730 } 5731 } 5732 $track.remove(); 5733 IRON.favorites.hideShowPlayer(); 5734 }); 5735 } 5736 }); 5737 } 5738 }, 5739 5740 clearFavoriteList: function(){ 5741 IRON.favorites.favoriteTracks = []; // Clear the favoriteTracks array 5742 IRON.userPlaylists[IRON.favorites.favoritePlaylistIndex].tracks = []; 5743 // Clear the tracks from the 'Favorites' playlist 5744 5745 if( IRON.favorites.dataType === 'cookies' ){ 5746 document.cookie = "sonaar_mp3_playlists=; path=/;"; // Update the cookie with the modified playlists 5747 }else{ 5748 $.ajax({ 5749 url: sonaar_music.ajax.ajax_url, // WordPress AJAX URL 5750 type: 'POST', 5751 dataType: 'json', 5752 data: { 5753 action: 'update_user_playlist', // PHP function name 5754 nonce: sonaar_music.ajax.ajax_nonce, 5755 playlists: IRON.userPlaylists // Playlist data 5756 }, 5757 success: function(response) { 5758 //console.log(response); 5759 } 5760 }); 5761 } 5762 $('.iron-audioplayer:not(.srp_player_is_favorite) .' + sonaar_music.option.srp_fav_remove_icon).addClass(sonaar_music.option.srp_fav_add_icon).removeClass(sonaar_music.option.srp_fav_remove_icon); 5763
5764 var delay = 200; 5765 5766 $('.iron-audioplayer.srp_player_is_favorite').each(function() { 5767 var favoriteList = $(this).find('.sr-playlist-item'); 5768 favoriteList.each(function(index) { 5769 var track = this; 5770 setTimeout(function() { 5771 $(track).fadeOut(delay, function() { 5772 $(track).remove(); 5773 if(index + 1 >= favoriteList.length){ 5774 IRON.favorites.hideShowPlayer(); 5775 } 5776 }); 5777 }, index * delay); 5778 }); 5779 }); 5780 }, 5781 5782 hideShowPlayer: function(){ 5783 if($('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').length === 0) { 5784 // If no items left, show the "not found" message 5785 $('.srp-fav-removeall-bt').hide(); 5786 $('.srp-fav-notfound').show(); 5787 $('.iron-audioplayer.srp_player_is_favorite').hide(); 5788 }else{ 5789 $('.srp-fav-removeall-bt').show(); 5790 } 5791 }, 5792 5793 setStickyFavButtons: function(){ 5794 if(!IRON.favorites.favoritesEnabled) 5795 return; 5796 5797 var currentTrackIndex = IRON.sonaar.player.currentTrack; 5798 5799 $('#sonaar-player').data('trackPos', IRON.sonaar.player.list.tracks[currentTrackIndex].track_pos); 5800 $('#sonaar-player').data('postId', IRON.sonaar.player.list.tracks[currentTrackIndex].sourcePostID); 5801 5802 var isFavorite = IRON.favorites.favoriteTracks.some(function(track) { 5803 return track.postId == IRON.sonaar.player.list.tracks[currentTrackIndex].sourcePostID && track.trackPos == IRON.sonaar.player.list.tracks[currentTrackIndex].track_pos; 5804 }); 5805 5806 var favButtonIndex = -1; 5807 for (var i = 0; i < IRON.sonaar.player.albumStoreList.length; i++) { 5808 if (IRON.sonaar.player.albumStoreList[i]['cta-class'] === 'srp-fav-bt') { 5809 favButtonIndex = i; 5810 break; 5811 } 5812 } 5813 if( favButtonIndex === -1 ) return; 5814 5815 // Depending on isFavorite, set the appropriate icon class 5816 if (isFavorite) { 5817 IRON.sonaar.player.albumStoreList[favButtonIndex]['store-icon'] = sonaar_music.option.srp_fav_remove_icon; 5818 } else { 5819 IRON.sonaar.player.albumStoreList[favButtonIndex]['store-icon'] = sonaar_music.option.srp_fav_add_icon; 5820 } 5821 }, 5822 5823 clickStickyFavButton: function(favButtonIndex){ 5824 if(!IRON.favorites.favoritesEnabled) 5825 return; 5826 5827 event.preventDefault(); 5828 5829 const $sonaarPlayer = $('#sonaar-player'); 5830 const postId = $sonaarPlayer.data('postId'); 5831 const trackPos = $sonaarPlayer.data('trackPos'); 5832 const action = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].optional_storelist_cta[favButtonIndex]['store-icon'] == sonaar_music.option.srp_fav_remove_icon ? 'remove' : 'add'; 5833 this.addRemoveFavorite(postId, trackPos, action); 5834 }, 5835 5836 addRemoveFavorite: function(postId, trackPos, action){ //action = 'add' or 'remove' 5837 if(typeof postId === 'undefined' || typeof trackPos === 'undefined' || typeof action === 'undefined') 5838 return; 5839 5840 if(IRON.audioPlayer.stickyEnable && $('#sonaar-player .srp-fav-bt').length){ 5841 var favButtonIndex = -1; 5842 for (var i = 0; i < IRON.sonaar.player.albumStoreList.length; i++) { 5843 if (IRON.sonaar.player.albumStoreList[i]['cta-class'] === 'srp-fav-bt') { 5844 favButtonIndex = i; 5845 break; 5846 } 5847 } 5848 5849 //toggle Sticky favorite icon 5850 IRON.sonaar.player.albumStoreList[favButtonIndex]['store-icon'] = action === 'remove' ? sonaar_music.option.srp_fav_add_icon : sonaar_music.option.srp_fav_remove_icon; 5851 IRON.sonaar.player.albumStoreList[favButtonIndex]['store-name'] = action === 'remove' ? sonaar_music.option.fav_label_add_action : sonaar_music.option.fav_label_remove_action; 5852 5853 } 5854 //toggle widget favorite icon 5855 const selector = `.srp-fav-bt[data-source-post-id="${postId}"][data-store-id^="${trackPos}-"] i`; 5856 const selectorParent = `[data-post-id="${postId}"][data-track-pos="${trackPos}"] .srp-fav-bt`; 5857 const addClass = action === 'remove' ? sonaar_music.option.srp_fav_add_icon : sonaar_music.option.srp_fav_remove_icon; 5858 const removeClass = action === 'remove' ? sonaar_music.option.srp_fav_remove_icon : sonaar_music.option.srp_fav_add_icon; 5859 const title = action === 'remove' ? sonaar_music.option.fav_label_add_action : sonaar_music.option.fav_label_remove_action; 5860 5861 $(selector).each(function() { 5862 if( ! $(this).parents('.srp_player_is_favorite').length){ 5863 $(this).addClass(addClass).removeClass(removeClass); 5864 $(this).attr('title', title).attr('aria-label', title); 5865 } 5866 }) 5867 5868 5869 //Update favoriteList 5870 let existingIndex = -1; 5871 if(Array.isArray(IRON.favorites.favoriteTracks)) { 5872 existingIndex = IRON.favorites.favoriteTracks.findIndex(function(track) { 5873 return Number(track.postId) === Number(postId) && Number(track.trackPos) === Number(trackPos); 5874 }); 5875 } 5876 if(existingIndex === -1) { 5877 // If track doesn't exist in favorites, add it 5878 IRON.favorites.favoriteTracks.push({ 5879 postId: postId.toString(), 5880 trackPos: trackPos.toString() 5881 }); 5882 } else { 5883 IRON.favorites.removeTrackFromFavorites(postId, trackPos); 5884 } 5885 // Set the updated favorites list as a cookie 5886 if(IRON.favorites.favoritePlaylistIndex !== -1) { 5887 IRON.userPlaylists[IRON.favorites.favoritePlaylistIndex].tracks = IRON.favorites.favoriteTracks; 5888 } 5889 5890 if( IRON.favorites.dataType === 'cookies' ){ 5891 // Set the updated playlists as a cookie 5892 document.cookie = "sonaar_mp3_playlists=" + encodeURIComponent(JSON.stringify(IRON.userPlaylists)) + "; max-age=31536000; path=/;"; 5893 IRON.favorites.showNotificationAndReloadPlayer(action); 5894 }else{ 5895 $.ajax({ 5896 url: sonaar_music.ajax.ajax_url, // WordPress AJAX URL 5897 type: 'POST', 5898 dataType: 'json', 5899 data: { 5900 action: 'update_user_playlist', // PHP function name 5901 nonce: sonaar_music.ajax.ajax_nonce, 5902 playlists: IRON.userPlaylists // Playlist data 5903 }, 5904 success: function(response) { 5905 //console.log(response); 5906 IRON.favorites.showNotificationAndReloadPlayer(action); 5907 5908 } 5909 }); 5910 } 5911 5912 }, 5913 5914 showNotificationAndReloadPlayer: function(action){ 5915 // Create and append the notification div to the body 5916 $('<div>') 5917 .addClass('srp-fav-notification') 5918 .text(sonaar_music.option[`fav_label_${action}`]) 5919 .appendTo('body') 5920 .animate({ bottom: '100px', opacity: 1 }, 500) 5921 .delay(3000) 5922 .animate({ bottom: '80px', opacity: 0 }, 500, function() { 5923 $(this).remove(); 5924 }); 5925 5926 if(action === "add") { 5927 $('.iron-audioplayer').each(function(index) { 5928 if($(this).hasClass('srp_player_is_favorite')){ 5929 IRON.favorites.reloadPlayerAjax(this, index); 5930 } 5931 }); 5932 } 5933 }, 5934 setFavButtons: function(audioPlayer){ 5935 if(srp_vars.is_logged_in === "no" && sonaar_music.option.cta_favorites_dv_enable_redirect_main_settings === "true"){ 5936 return; 5937 } 5938 5939 const $audioPlayer = $(audioPlayer); 5940 const $favRemoveAllBtn = $('.srp-fav-removeall-bt'); 5941 5942 $favRemoveAllBtn.each(function(){ 5943 const $this = $(this); 5944 if(!$this.data('ready')) { 5945 $this.data('ready', true).on('click', IRON.favorites.clearFavoriteList); 5946 } 5947 }); 5948 5949 5950 if($audioPlayer.hasClass('srp_player_is_favorite')){ 5951 $('.srp-fav-notfound').toggle(!$audioPlayer.find('.sr-playlist-item, .swiper-slide').length); 5952 } 5953 5954 const $favBtn = $audioPlayer.find('.srp-fav-bt'); 5955 if($favBtn.data('event') != 'click'){ 5956 $favBtn.data('event', 'click'); 5957 $audioPlayer.on('click', '.srp-fav-bt', function () { 5958 event.preventDefault(); 5959 const $this = $(this); 5960 if($this.parents('.srp_favorites_loading').length) 5961 return; 5962 5963 const postId = $(this).attr('data-source-post-id'); 5964 if($audioPlayer.hasClass('srp_player_is_favorite')){ 5965 var trackPos = $(this).parents('.sr-playlist-item').data('track-pos'); 5966 }else{ 5967 var trackPos = $(this).attr('data-store-id').split('-')[0]; 5968 } 5969 const action = $this.find('i').hasClass(sonaar_music.option.srp_fav_remove_icon) ? 'remove' : 'add'; 5970 IRON.favorites.addRemoveFavorite(postId, trackPos, action); 5971 }); 5972 } 5973 5974 $audioPlayer.find('.srp-fav-notfound').each(function() { 5975 const $this = $(this); 5976 $this.text($this.data('label')); 5977 }); 5978 }, 5979 initRightClick: function(){ 5980 if(sonaar_music.option.fav_enable_contextual_menu !== "true") 5981 return; 5982 5983 var lastSelectedTrack = null; 5984 5985 var style = document.createElement('style'); 5986 style.innerHTML = ` 5987 #contextMenu { 5988 display: none; 5989 position: absolute; 5990 z-index: 1000; 5991 background: #343a40; 5992 border-radius: 5px; 5993 padding: 4px; 5994 } 5995 #contextMenu ul { 5996 padding-left: 0; 5997 } 5998 #deleteFromFavorite { 5999 color: #fff; 6000 border-radius: 5px; 6001 font-size: 14px; 6002 padding: 5px 10px; 6003 cursor: pointer; 6004 list-style: none; 6005 } 6006 #deleteFromFavorite:hover { 6007 background-color: #6c757d; 6008 } 6009 `; 6010 document.head.appendChild(style); 6011 6012 // Create context menu 6013 $('<div>', { id: 'contextMenu' }) 6014 .append($('<ul>').append($('<li>
6014', { id: 'deleteFromFavorite', text: sonaar_music.option.fav_label_rightclick_remove }))) 6015 .appendTo('body'); 6016 6017 6018 6019 $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').css({ 6020 '-webkit-user-select': 'none', /* Safari 3.1+ */ 6021 '-moz-user-select': 'none', /* Firefox 2+ */ 6022 '-ms-user-select': 'none', /* IE 10+ */ 6023 'user-select': 'none' /* Standard syntax */ 6024 }); 6025 6026 $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').click(function(e) { 6027 if (e.shiftKey && lastSelectedTrack != null) { 6028 var start = $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').index(this); 6029 var end = $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').index(lastSelectedTrack); 6030 $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').slice(Math.min(start, end), Math.max(start, end) + 1) 6031 .addClass('selected') 6032 .css('background-color', '#ccc'); 6033 } else if (e.ctrlKey || e.metaKey) { 6034 $(this).toggleClass('selected') 6035 .css('background-color', function(index, value) { 6036 return $(this).hasClass('selected') ? '#ccc' : ''; 6037 }); 6038 } else { 6039 $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').removeClass('selected') 6040 .css('background-color', ''); 6041 $(this).addClass('selected') 6042 .css('background-color', '#ccc'); 6043 } 6044 6045 lastSelectedTrack = $(this).hasClass('selected') ? this : null; 6046 }).contextmenu(function(e) { 6047 e.preventDefault(); 6048 6049 if ($(this).hasClass('selected')) { 6050 $('#contextMenu').css({ 6051 display: 'block', 6052 left: e.pageX, 6053 top: e.pageY 6054 }); 6055 } 6056 }); 6057 6058 $(document).click(function() { 6059 $('#contextMenu').hide(); 6060 }); 6061 6062 $('#deleteFromFavorite').click(function() { 6063 $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item.selected').each(function() { 6064 var postId = $(this).data('post-id'); 6065 var trackPos = $(this).data('track-pos'); 6066 IRON.favorites.addRemoveFavorite(postId, trackPos, 'remove'); 6067 //IRON.favorites.removeTrackFromFavorites(postId, trackPos); 6068 $(this).removeClass('selected') 6069 .css('background-color', ''); 6070 }); 6071 6072 lastSelectedTrack = null; 6073 }); 6074 6075 }, 6076} 6077 6078function srp_variation_button(el, productId) { 6079 6080 // can be a variation lightbox or a make an offer button 6081 if( $(el).find('a').length){ 6082 el = $(el).find('a')[0]; 6083 } 6084 // Check if this is within .sr-playlist-item-flex or .srp_swiper-album-art 6085 if ($(el).closest('.sr-playlist-item').find('.sr_track_cover img').length > 0) { 6086 image_src = $(el).closest('.sr-playlist-item').find('.sr_track_cover img').attr('src'); 6087 } else if ($(el).closest('.sr-playlist-item').find('img.sr_track_cover').length > 0) { 6088 image_src = $(el).closest('.sr-playlist-item').find('img.sr_track_cover').attr('src'); 6089 } else if ($(el).closest('.srp_swiper-album-art').length > 0) { 6090 // Extract the image url from the 'background-image' CSS property 6091 const backgroundImage = $(el).closest('.srp_swiper-album-art').css('background-image'); 6092 image_src = backgroundImage.slice(4, -1).replace(/"/g, ""); 6093 } else if ($(el).closest('.srmp3-product').length > 0){ 6094 image_src = $(el).closest('.srmp3-product').find('img').attr('src'); 6095 } else if ($(el).closest('#sonaar-player').find('.album-art img').length > 0) { 6096 // Check within #sonaar-player for the image inside .album-art 6097 image_src = $(el).closest('#sonaar-player').find('.album-art img').attr('src'); 6098 } else if ($(el).closest('.srp_player_boxed').find('.sonaar-Artwort-box').find('img').length > 0) { 6099 image_src = $(el).closest('.srp_player_boxed').find('.sonaar-Artwort-box').find('img').attr('src'); 6100 } else { 6101 // Fallback. 6102 image_src = ''; 6103 } 6104 6105 if(productId == undefined){ 6106 productId = (typeof $(el).data('product_id') != 'undefined') ? $(el).data('product_id') : $(el).data('source-post-id'); 6107 }else{ 6108 productId = productId; 6109 } 6110 6111 srp_wc_variation_popup(productId, $(el), image_src); 6112} 6113 6114function srp_wc_variation_popup(productId, el, image_src) { 6115 el = $(el); 6116 IRON.bt_that_launched_the_popup = el; 6117 srp_wc_loadspinner(el); 6118 sr_setPopUp(); 6119 // Determine the action based on whether the element has the .srp-make-offer-bt class 6120 var action = $(el).hasClass('srp-make-offer-bt') ? 'load_make_offer_lightbox' : 'load_wc_variation_by_ajax'; 6121 var variation_id = $('.srp-modal-variant-selector.srp_selected').data('variant_id'); 6122 if (!variation_id) { 6123 if ($(el).hasClass('srp-make-offer-bt')) { 6124 variation_id = $(el).data('variation'); 6125 } 6126 } 6127 6128 var data = { 6129 'action': action, 6130 'image_src': image_src, 6131 'product-id': productId, 6132 'variation-id': variation_id, 6133 'nonce': sonaar_music.ajax.ajax_nonce 6134 }; 6135 $.post(sonaar_music.ajax.ajax_url, data, function (response) { 6136 6137 6138 // Ensure that the response is in the correct format and check for success 6139 if (response.success) { 6140 $('#sonaar-modal .sr_popup-body').html(response.data.html); 6141 6142 // Check if the image exists and add/remove the body class accordingly
6143 if (!response.data.has_image) { 6144 $('.sr_popup-body').addClass('srp_popup_no_image'); 6145 } else { 6146 $('.sr_popup-body').removeClass('srp_popup_no_image'); 6147 } 6148 6149 srp_makeOfferForm(productId, variation_id); 6150 sr_openPopUp(); 6151 srp_wc_unloadspinner(el); 6152 } 6153 }); 6154} 6155function srp_makeOfferForm(product_id, variation_id) { 6156 $('#make-offer-form').on('submit', function(e) { 6157 e.preventDefault(); // Prevent the default form submission 6158 6159 $('#srp-make-offer-error').hide().text(''); 6160 6161 // Get the selected variation's ID from the dropdown 6162 var selected_variation_id = $('#offer-variation').val(); 6163 // Fallback: If no variation is selected, use the one provided in the function (variation_id) 6164 variation_id = selected_variation_id ? selected_variation_id : variation_id; 6165 6166 // Serialize the form data 6167 var formData = $(this).serialize(); 6168 6169 // Add the action and nonce to the serialized form data 6170 formData += '&action=send_offer_to_admin'; 6171 formData += '&nonce=' + sonaar_music.ajax.ajax_nonce; 6172 formData += '&product_id=' + product_id; // Add product_id to form data 6173 formData += '&variation_id=' + variation_id; 6174 6175 // Send the AJAX request 6176 $.post(sonaar_music.ajax.ajax_url, formData, function(response) { 6177 if (response.success) { 6178 $('#make-offer-form')[0].reset(); // Reset the form 6179 sr_closePopUp(); 6180 6181 // Use the server-provided formatted notice 6182 var formatted_content = response.data.formatted_notice; 6183 $('#sonaar-modal .sr_popup-body').html(formatted_content); 6184 sr_openPopUp(); 6185 6186 } else { 6187 $('#srp-make-offer-error').text(response.data).css('color', 'red').show(); // Display error message from server 6188 } 6189 }); 6190 }); 6191} 6192 6193 6194 6195 6196function srp_askForEmailForm(post_id, track_pos, track_id, data_audio_path, scenario = null, playerID = 'allPlayers', element, trackIdToSave = null) { 6197 $('#ask-for-email-form').on('submit', function(e) { 6198 e.preventDefault(); // Prevent the default form submission 6199 //console.log("Form submitted, preparing AJAX request..."); 6200 6201 $('#srp-dialog-error').hide().text(''); 6202 6203 var form_title = (typeof sonaar_music.option.download_settings_afe_form_title !== 'undefined') ? sonaar_music.option.download_settings_afe_form_title : 'Free Download'; 6204 6205 // Serialize the form data 6206 var formData = $(this).serialize(); 6207 6208 // Add the action and nonce to the serialized form data 6209 formData += '&action=srp_ask_for_email_sender'; 6210 formData += '&nonce=' + sonaar_music.ajax.ajax_nonce; 6211 formData += '&post_id=' + post_id; // Add product_id to form data 6212 formData += '&track_pos=' + track_pos; 6213 formData += '&track_id=' + track_id; 6214 formData += '&data_audio_path=' + data_audio_path; 6215 6216 // If a scenario is provided, add the scenario ID to the data 6217 if (scenario) { 6218 formData += '&scenario_id=' + scenario.id; 6219 6220 if(scenario.action_when.downloadButtonClicked){ 6221 formData += '&scenario_action=download'; 6222 }else{ 6223 formData += '&scenario_action=play'; 6224 } 6225 } 6226 6227 //console.log("Form Data being sent:", formData); 6228 6229 // Send the AJAX request 6230 $.post(sonaar_music.ajax.ajax_url, formData, function(response) { 6231 //console.log("AJAX response received:", response); 6232 6233 if (response.success) { 6234 //console.log("Form submission successful:", response.data); 6235 $('#ask-for-email-form')[0].reset(); // Reset the form 6236 sr_closePopUp(); 6237 6238 // Use the server-provided formatted notice 6239 var formatted_content = response.data.formatted_notice; 6240 $('#sonaar-modal .sr_popup-body').html(formatted_content); 6241 sr_openPopUp(); 6242 6243 if (typeof IRON.advancedTriggers !== 'undefined') { 6244 IRON.advancedTriggers.markTrackAsActioned(scenario, playerID, `track_${trackIdToSave}`, 'popup'); 6245 } 6246 // Update the element's href attribute with the provided download link 6247 if (response.data.download_link) { 6248 if (IRON.advancedTriggers) { 6249 const player = $(element).closest('.iron-audioplayer'); 6250 const targetPlayer = player.length ? player[0] : IRON.audioPlayer.activePlayer?.[0]; 6251 6252 if (targetPlayer) { 6253 IRON.advancedTriggers.attachDownloadButtonListener(targetPlayer, scenario, true); 6254 6255 if (!player.length) { 6256 $('#sonaar-player') 6257 .find('.sr_store_force_dl_bt') 6258 .attr('href', response.data.download_link); 6259 } 6260 } 6261 } 6262 //check if element has class sr_store_force_dl_bt 6263 /* if($(element).hasClass('sr_store_force_dl_bt')){ 6264 $(element).attr('href', response.data.download_link); // WIP: if Element is from widget, it wont get added to sticky player or vice versa. 6265 }else{ 6266 $(element).find('.sr_store_force_dl_bt').attr('href', response.data.download_link); 6267 } 6268 6269 //check if sticky player is present on the page 6270 if($('#sonaar-player').length){ 6271 $('#sonaar-player').find('.sr_store_force_dl_bt').attr('href', response.data.download_link); 6272 } 6273 6274 //check if closest has class sr_store_force_dl_bt 6275 if($(element).closest('#sonaar-player').length){ 6276 $(element).attr('href', response.data.download_link); 6277 //check its active player widget 6278 if(IRON.audioPlayer.activePlayer){ 6279 $(IRON.audioPlayer.activePlayer).find('li.current .sr_store_force_dl_bt').attr('href', response.data.download_link); 6280 } 6281 }*/ 6282 } 6283 6284 if(srp_isPausedFromPopup && IRON.audioPlayer.activePlayer){ 6285 // In some cases, the audio has been paused from the popup, we need to play it again to gain access 6286 const audioElement = sr_setAudioElementInstance(IRON.audioPlayer.activePlayer); 6287 audioElement.muted = false;
6288 srp_isPausedFromPopup = false; 6289 audioElement.play(); 6290 } 6291 6292 } else { 6293 console.error("Error in response:", response.data); 6294 $('#srp-dialog-error').text(response.data).show(); // Display error message from server 6295 } 6296 }).fail(function() { 6297 console.error("AJAX request failed."); 6298 var formatted_content = '<h3 style="font-size:18px;font-weight:600;">' + form_title + '</h3><p style="color: var(--srp-global-modal-btn-bg-color);">Failed to send. Please contact support with code 91053</p>'; 6299 $('#sonaar-modal .sr_popup-body').html(formatted_content); 6300 sr_openPopUp(); 6301 }).always(function() { 6302 //console.log("AJAX request completed."); 6303 }); 6304 }); 6305} 6306 6307 6308function srp_add_to_cart_loadspinner(el) { //Add spinner animation from sonaar on the Add to Cart button from the variation modal. 6309 srp_wc_loadspinner(el); 6310 setInterval(function () { 6311 if (!el.hasClass('loading')) { 6312 clearInterval(); 6313 srp_wc_unloadspinner(el); 6314 } 6315 }, 5); 6316} 6317 6318function srp_wc_loadspinner(el) { 6319 6320 if (el.closest('#sonaar-player .track-store').length > 0 || el.parents('.srp_ext_featured_cta').length || el.parents('.srp_ext_cta').length) { // Button is in the sticky player 6321 el = el.closest('a'); // Replace el with the <a> element or its closest ancestor <a> 6322 6323 el.parent().addClass('sricon-spinner'); 6324 el.parent().css({ 6325 width: el.parent().css("width"), 6326 fontSize: '16px', 6327 textAlign: 'center', 6328 }); 6329 el.css({ 6330 display: "none", 6331 }); 6332 return; 6333 } 6334 var trigger_html = el.html(); 6335 var computedStyles = window.getComputedStyle(el.get(0)); 6336 6337 var trigger_bgcolor = computedStyles.backgroundColor; 6338 var trigger_color = computedStyles.color; 6339 var trigger_width = computedStyles.width; 6340 var trigger_height = computedStyles.height; 6341 el.data('html', trigger_html); 6342 el.css("pointer-events", "none"); 6343 el.css({ 6344 backgroundColor: trigger_bgcolor, 6345 color: trigger_color, 6346 width: trigger_width, 6347 height: trigger_height 6348 }); 6349 if (el.attr('class') === 'sricon-info') { 6350 el.data('class', el.attr('class')); 6351 el.removeClass('sricon-info'); 6352 } 6353 $spinnerWrap = $('<span class="sricon-spinner-wrap"></span>'); 6354 $spinner = $('<span class="sricon-spinner"></span>'); 6355 $spinnerWrap.html($spinner); 6356 el.html($spinnerWrap); 6357 6358 startButtonLoaderTimeout = setTimeout(function () { 6359 $spinnerWrap.addClass('sricon-spinner-wrap-ready'); 6360 }, 5); 6361} 6362function srp_wc_unloadspinner(el) { 6363 if (el.closest('#sonaar-player .track-store').length > 0 || el.parents('.srp_ext_featured_cta').length || el.parents('.srp_ext_cta').length ) { // Button is in the sticky player 6364 el = el.closest('a'); // Replace el with the <a> element or its closest ancestor <a> 6365 el.parent().removeClass('sricon-spinner'); 6366 el.parent().css({ 6367 width: "initial", 6368 fontSize: 'initial', 6369 textAlign: 'initial', 6370 }); 6371 el.css("display", ""); 6372 return; 6373 } 6374 6375 if (el.data('class') === 'sricon-info') { 6376 el.addClass(el.data('class')); 6377 } 6378 6379 el.html(el.data('html')); 6380 var resetStyles = { 6381 backgroundColor: '', 6382 color: '', 6383 width: '', 6384 height: '' 6385 }; 6386 el.css("pointer-events", "auto"); 6387 el.css(resetStyles); 6388}; 6389function srp_selectVariation(el) { 6390 $('.srp-modal-product-variation .srp_selected').removeClass('srp_selected'); 6391 $(el).addClass('srp_selected'); 6392 $('.srp-modal-variation-details[data-variant_id="' + $(el).data('variant_id') + '"]').addClass('srp_selected'); 6393 6394 // Display Price from the selected variation 6395 $('.srp-modal-variant-main .srp-modal-variant-price .woocommerce-Price-amount').html($(el).find('.srp-modal-variant-price>.woocommerce-Price-amount').html()); 6396 6397 // Set the selected variation URL to the "Add to cart" button 6398 var variationId = $(el).data('variant_id'); 6399 var productId = $('.srp-modal-product-variation').data('product_id'); 6400 $('#srp-add-to-cart-btn').attr('href', '?add-to-cart=' + productId + '&variation_id=' + variationId); 6401 $('#srp-add-to-cart-btn').attr('data-product_id', variationId); 6402 6403 // Toggle between "Make an Offer" button and "Add to Cart" button 6404 var makeOfferEnabled = $(el).data('make_offer_enabled'); 6405 var hideAddToCart = $(el).data('make_offer_hide_addtocart'); 6406 if (makeOfferEnabled === 'yes' && hideAddToCart === 'yes') { 6407 $('.srp-modal-product-variation #srp-add-to-cart-btn').hide(); // Hide Add to Cart button 6408 $('.srp-modal-product-variation #make-offer-btn').show(); // Show Make an Offer button 6409 $('.srp-modal-product-variation #srp-total-price').hide(); // Hide the total price 6410 } else if (makeOfferEnabled === 'yes' && hideAddToCart !== 'yes') { 6411 $('.srp-modal-product-variation #srp-add-to-cart-btn').show(); // Show Add to Cart button 6412 $('.srp-modal-product-variation #make-offer-btn').show(); // Show Make an Offer button 6413 $('.srp-modal-product-variation #srp-total-price').show(); // Show the total price 6414 } else { 6415 $('.srp-modal-product-variation #make-offer-btn').hide(); // Hide Make an Offer button 6416 $('.srp-modal-product-variation #srp-add-to-cart-btn').show(); // Show Add to Cart button 6417 $('.srp-modal-product-variation #srp-total-price').show(); // Show the total price 6418 } 6419 } 6420 6421 6422 6423 6424function srp_setTrackListColumns(player, fromResize = false){ 6425 if( !$(player).hasClass('srp_has_customfields') || $(player).hasClass('srp_tracklist_grid')) 6426 return 6427 6428 if($(player).find('.playlist').width() < 500 && ! $(player).hasClass('srp_responsive') ){ 6429 $(player).addClass('srp_responsive'); 6430 $(player).find('.sr-playlist-item').each(function () { 6431 setColumnCta(this) 6432 }) 6433 }else if( $(player).find('.playlist').width() >= 500 && $(player).hasClass('srp_responsive') ){ 6434 $(player).removeClass('srp_responsive'); 6435 $(player).find('.sr-playlist-item').each(function () { 6436 setColumnCta(this) 6437 }) 6438 } 6439
6440 const gabBetweenItem = 10; //Flex Gab value 6441 let responsiveHiddenSection = []; 6442 6443 const track = $(player).find('.sr-playlist-item:not([data-relatedtrack="1"])').eq(0); 6444 const ifSoundwaveWidthNotSet = Boolean(track.find('.srp_soundwave_wrapper').length && track.find('.srp_soundwave_wrapper').css('flex-basis') == '100%'); 6445 var playlistItemElementsWidth = 0; 6446 if(!fromResize){ 6447 /*Insert Spacer if doesnt have info button*/ 6448 const noteButtonWidth = ($(player).find('.sr-playlist-item:not([data-relatedtrack="1"]) .srp_noteButton').length)? $(player).find('.sr-playlist-item:not([data-relatedtrack="1"]) .srp_noteButton').width() : 0; 6449 $(player).find('.srp_info_spacer').remove(); 6450 $(player).find('.sr-playlist-item:not([data-relatedtrack="1"])').each(function(){ 6451 if(noteButtonWidth && ! $(this).find('.srp_noteButton').length){ 6452 let spacer = $('<div/>', { class: 'srp_info_spacer' }).css('min-width', noteButtonWidth); 6453 $(this).find('.store-list').after(spacer); 6454 } 6455 }); 6456 6457 6458 track.find('.audio-track > *').each(function () { 6459 6460 playlistItemElementsWidth += this.getBoundingClientRect().width 6461 }); 6462 if(track.find('.sr_track_cover').length){ 6463 playlistItemElementsWidth += track.find('.sr_track_cover').width() - 12;//12px gap 6464 } 6465 if(track.find('.store-list').length){ 6466 playlistItemElementsWidth += track.find('.store-list').width() - 12;//12px gap 6467 } 6468 $(player).data('playlistItemElementsWidth' , playlistItemElementsWidth); 6469 }else if(typeof $(player).data('playlistItemElementsWidth') != 'undefined' && ! ifSoundwaveWidthNotSet){ 6470 playlistItemElementsWidth = $(player).data('playlistItemElementsWidth'); 6471 } 6472 6473 if(playlistItemElementsWidth !== 0 && $(player).find('.srp_soundwave_wrapper').length){ 6474 if( typeof track.data('track-width') == 'undefined'){ 6475 columnTotalWidth = track.width() - playlistItemElementsWidth; 6476 track.data('track-width', columnTotalWidth) 6477 }else{ 6478 columnTotalWidth = track.data('track-width'); 6479 } 6480 $(player).find('.sr-playlist-cf-container').css('flex', '0 1 ' + columnTotalWidth + 'px');///When soundwave width is set, the CF column container width is based on the available space. 6481 } 6482 6483 var biggestColumnContainer = 0 6484 track.find('.sr-playlist-cf-child').each(function(index){ 6485 const sectionClass = $(this).data('id'); 6486 let cfWidth = 0; 6487 for (let i = index; i < track.find('.sr-playlist-cf-child').length; i++) { 6488 let ii = track.find('.sr-playlist-cf-child').length - i -1; 6489 if( track.find('.sr-playlist-cf-child').eq(ii).attr('data-width')){ 6490 cfWidth += parseInt(track.find('.sr-playlist-cf-child').eq(ii).attr('data-width'), 10) + gabBetweenItem; 6491 }else{ 6492 track.find('.sr-playlist-cf-child').eq(ii).attr('data-width', track.find('.sr-playlist-cf-child').eq(ii).width() ) 6493 cfWidth += track.find('.sr-playlist-cf-child').eq(ii).width() + gabBetweenItem; 6494 } 6495 if(ifSoundwaveWidthNotSet && i == track.find('.sr-playlist-cf-child').length - 1 && cfWidth > biggestColumnContainer){ 6496 biggestColumnContainer = cfWidth; 6497 $(player).find('.sr-playlist-cf-container').css('flex', '0 1 ' + cfWidth + 'px') //When no soundwave width is set (100% by default), set the width of the columns container based on its requirements. 6498 } 6499 } 6500 if( track.find('.sr-playlist-cf-container').width() < cfWidth ){ //If no enough space for the custom heading 6501 responsiveHiddenSection.push(sectionClass); 6502 } 6503 6504 }); 6505 6506 responsiveHiddenSection = responsiveHiddenSection.filter(function(item, pos) { // Remove duplicated item from array 6507 return responsiveHiddenSection.indexOf(item) == pos; 6508 }) 6509 6510 $(player).find('.sr-cf-heading .sr-playlist-heading-child').each(function(){ 6511 const sectionClass = $(this).data('sort'); 6512 6513 if( $(this).index() > $(player).find('.sr-cf-heading .sr-playlist-heading-child').length - responsiveHiddenSection.length ){ 6514 $(this).addClass('srp_hidden'); 6515 $(player).find('.'+sectionClass).addClass('srp_hidden'); 6516 srp_setTrackListColumns_headerPosition(player); 6517 }else{ 6518 $(this).removeClass('srp_hidden'); 6519 $(player).find('.'+sectionClass).removeClass('srp_hidden'); 6520 } 6521 }); 6522 6523 /*Set Header Custom field Position*/ 6524 srp_setTrackListColumns_headerPosition(player); 6525} 6526 6527function setColumnCta(trackListItem) { 6528 if( !$(trackListItem).find('.store-list').length || $(trackListItem).parents('.srp_tracklist_grid').length ) 6529 return; 6530 6531 const storeListCurrentWidth = parseInt($(trackListItem).find('.store-list').css('flex').split(' ')[2], 10); 6532 const storeList = $(trackListItem).find('.store-list'); 6533 let storeListWidth = 0; 6534 const dataWidth = ($(trackListItem).parents('.srp_responsive').length)? 'mobile-width' : 'width'; 6535 if( typeof storeList.find('.song-store-list-menu').data( dataWidth ) == 'undefined' || $('.elementor-editor-active').length ){ 6536 let storeListMinusWidth = 0; 6537 let extendable = false;
6538 let dotsPosition = 'right: 10px;' 6539 $(trackListItem).find('.song-store:not(.srp_hidden)').each(function () { 6540 if( $(this).offset().left < storeList.offset().left ){ 6541 extendable = true; 6542 }else if( storeListMinusWidth == 0 && extendable){ 6543 storeListMinusWidth = $(this).offset().left - storeList.offset().left 6544 storeListWidth = Math.ceil(storeListCurrentWidth - storeListMinusWidth); 6545 dotsPosition = 'left:'+ ( storeListMinusWidth - 25 ) + 'px;' 6546 } 6547 }) 6548 if( extendable ){ 6549 $(trackListItem).addClass('srp_extendable'); 6550 storeList.find('.song-store-list-menu').width( storeListWidth ); 6551 storeList.find('.song-store-list-menu').data( dataWidth, storeListWidth + ''); 6552 const dots = $('<i/>', { class: 'fas fa-ellipsis-h srp_ellipsis', style: 'position: absolute; ' + dotsPosition }); 6553 if(storeList.find('.srp_ellipsis').length){ 6554 storeList.find('.srp_ellipsis').replaceWith(dots); 6555 }else{ 6556 storeList.append(dots); 6557 } 6558 }else{ 6559 storeList.find('.song-store-list-menu').data( dataWidth, 'none' ) 6560 } 6561 }else{ 6562 if( storeList.find('.song-store-list-menu').data( dataWidth ) == 'none' ){ 6563 $(trackListItem).removeClass('srp_extendable'); 6564 storeList.find('.song-store-list-menu').width( 'inherit' ); 6565 }else{ 6566 $(trackListItem).addClass('srp_extendable'); 6567 storeListWidth = parseInt(storeList.find('.song-store-list-menu').data( dataWidth ), 10); 6568 dotsPosition = (storeListWidth == 0 )? (storeListWidth + 10) + 'px' : (storeListWidth + 10) + 'px'; 6569 storeList.find('.song-store-list-menu').width( storeListWidth ); 6570 storeList.find('.srp_ellipsis').css({'left':'unset','right': dotsPosition }) 6571 } 6572 } 6573} 6574 6575function srp_setTrackListColumns_headerPosition(player){ 6576 /*Set Header Custom field Position*/ 6577 setTimeout(function(){ 6578 $(player).find('.sr-playlist-item:not([data-relatedtrack="1"])').each(function(){ 6579 $(this).find('.sr-playlist-cf-child').each(function(){ 6580 const sectionClass = $(this).data('id'); 6581 const sectionPosition = $(this)[0].offsetLeft; 6582 const sectionWidth = $(this).width(); 6583 const elIndex = $(this).parents('.sr-playlist-cf-container').find('.'+sectionClass).index(this);//Use elIndex to select the right heading when many columns have the same data-id. 6584 $(player).find('[data-sort="'+ sectionClass +'"]').eq(elIndex).css({'position':'absolute','left': sectionPosition+'px', 'width': sectionWidth + 'px'}); 6585 }); 6586 }); 6587 }, 60);//Requried a delai when we have many CTA 6588} 6589 6590 6591 6592/*------------------------------ 6593Search & filter Parameters 6594------------------------------*/ 6595function srp_getPlayerId(player){ 6596 if( $(player).parents('.elementor-widget-music-player').length && typeof $(player).parents('.elementor-widget-music-player').attr('id') != 'undefined'){ //if mp3 player has id from elementor 6597 playerId = ( $(player).parents('.elementor-widget-music-player').attr('id') ) 6598 }else if( ! $(player).parents('.iron_widget_radio').attr('id').startsWith('arbitrary-instance-') ){ //if mp3 player has id from shortcode parameter 6599 playerId = $(player).parents('.iron_widget_radio').attr('id'); 6600 }else{ 6601 playerId = $(player).parents('.iron-audioplayer').attr('id'); 6602 } 6603 if(typeof playerId == 'undefined'){ 6604 playerId = player.id; 6605 } 6606 return playerId; 6607 6608} 6609function srp_scrollTo(player, offset){ 6610 var element = player[0].querySelector('.playlist'); 6611 var rect = element.getBoundingClientRect(); 6612 var viewportTopPosition = rect.top; 6613 window.scroll({ 6614 top: window.scrollY + viewportTopPosition - offset, 6615 left: 0, 6616 behavior: 'smooth' 6617 }); 6618} 6619function srp_updatePage(pageNumber, player){ 6620 6621 if(player.pagination_offset >= 0){ 6622 srp_scrollTo(player, player.pagination_offset); 6623 } 6624 6625 6626 player.params.page = pageNumber; 6627 srp_updateURLParameter( 'srp_player_id', srp_getPlayerId(player) ); 6628 srp_updateURLParameter('srp_page', pageNumber); 6629} 6630function srp_updateOrder(sortValue, player){ 6631 player.params.order = sortValue; 6632 srp_updateURLParameter( 'srp_player_id', srp_getPlayerId(player) ); 6633 srp_updateURLParameter('srp_order', sortValue); 6634} 6635//Add parameter to the URL 6636function srp_updateURLParameter(param, paramVal = null){ 6637 if(paramVal === null) 6638 return 6639 6640 const url = window.location.href; 6641 let newAdditionalURL = ''; 6642 let tempArray = url.split('?'); 6643 const baseURL = tempArray[0]; 6644 const additionalURL = (typeof tempArray[1] != 'undefined')? tempArray[1] : ''; 6645 let temp = ''; 6646 if (additionalURL != '') { 6647 tempArray = additionalURL.split('&'); 6648 for (var i=0; i<tempArray.length; i++){ 6649 if(tempArray[i].split('=')[0] != param){ 6650 newAdditionalURL += temp + tempArray[i]; 6651 temp = '&'; 6652 } 6653 } 6654 } 6655 const newParam = (paramVal != '')? encodeURIComponent(param) + '=' + encodeURIComponent(paramVal) : ''; 6656 const rows_txt = temp + '' + newParam; 6657 newAdditionalURL += rows_txt; 6658 newAdditionalURL = (newAdditionalURL != '')? '?' + newAdditionalURL : ''; 6659 if( newAdditionalURL.charAt(0) == '&'){ 6660 newAdditionalURL = newAdditionalURL.substring(1); 6661 }
6662 if( newAdditionalURL.charAt(newAdditionalURL.length - 1) == '&'){ 6663 newAdditionalURL = newAdditionalURL.slice(0, -1) 6664 } 6665 if( newAdditionalURL.replace('?','') != additionalURL){ 6666 window.history.pushState(null, '', baseURL + newAdditionalURL ) 6667 } 6668} 6669 6670function srp_removeMeta(metaName, metaValue = null, playerId, selecttype = 'singleselect') { 6671 if (selecttype == 'multiselect_or') { 6672 metaName = metaName + '_or'; 6673 } 6674 if (selecttype == 'range') { 6675 metaName = metaName + '_minmax'; 6676 } 6677 const playerNum = srp_convertPlayerIdToPlayerNum(playerId) !== null ? srp_convertPlayerIdToPlayerNum(playerId) : 0; 6678 6679 if (typeof IRON.players[playerNum].audioPlayer.params === 'undefined') { 6680 return; 6681 } 6682 6683 const clearSearch = () => { 6684 const searchBoxSelector = playerId != null ? `.srp_search_container[data-player-id="${playerId}"]` : '.srp_search_container:not([data-player-id])'; 6685 $(searchBoxSelector).find('.srp_reset_search').css('display', 'none'); 6686 $(searchBoxSelector).each(function() { 6687 $(this).find('.srp_search')[0].value = ''; 6688 }); 6689 IRON.players[playerNum].audioPlayer.params.search = ''; 6690 }; 6691 6692 const clearMetaFilter = (key) => { 6693 if(typeof IRON.players[playerNum].audioPlayer.params.meta != 'undefined'){ 6694 IRON.players[playerNum].audioPlayer.params.meta[key] = ''; 6695 } 6696 key = key.replace('_or', ''); 6697 const activeButtons = $(document).find(`.srp_filter_button.srp_filter_button--active[data-metakey="${key}"]`); 6698 activeButtons.removeClass('srp_filter_button--active').removeAttr('style'); 6699 }; 6700 6701 if (metaName === 'all') { 6702 //usage : srp_removeMeta('all', null, 'myplayer01'); 6703 clearSearch(); 6704 if (typeof IRON.players[playerNum].audioPlayer.params.meta !== 'undefined') { 6705 Object.keys(IRON.players[playerNum].audioPlayer.params.meta).forEac
6705h(clearMetaFilter); 6706 } 6707 } else if (metaName === 'search') { 6708 clearSearch(); 6709 } else { 6710 if (metaValue == null) { 6711 clearMetaFilter(metaName); 6712 } else if (typeof IRON.players[playerNum].audioPlayer.params.meta !== 'undefined' && typeof IRON.players[playerNum].audioPlayer.params.meta[metaName] !== 'undefined') { 6713 const metaString = IRON.players[playerNum].audioPlayer.params.meta[metaName].split(','); 6714 const index = metaString.indexOf(metaValue); 6715 if (index > -1) { 6716 metaString.splice(index, 1); 6717 IRON.players[playerNum].audioPlayer.params.meta[metaName] = metaString.join(','); 6718 const dataPlayerId = playerId ? `[data-playerid="${playerId}"]` : ''; 6719 const activeButtons = $(document).find(`.srp_filter_button--active[data-value="${metaValue}"]${dataPlayerId}`); 6720 activeButtons.removeClass('srp_filter_button--active').removeAttr('style'); 6721 } 6722 } 6723 } 6724 6725 srp_updatePage(1, IRON.players[playerNum].audioPlayer); 6726 srp_updateList(playerNum); 6727} 6728 6729 6730function srp_addMeta( playerId, metaName, metaValue, selecttype = null ){ 6731 if(selecttype == 'multiselect_or' ){ 6732 metaName = metaName + '_or'; 6733 } 6734 if(selecttype == 'range'){ 6735 metaName = metaName + '_minmax'; 6736 }else{ 6737 metaValue = metaValue.replace(',', 'ii44'); 6738 6739 } 6740 const playerNum = ( srp_convertPlayerIdToPlayerNum(playerId) !== null)? srp_convertPlayerIdToPlayerNum(playerId) : 0 ; 6741 6742 if( typeof IRON.players[playerNum].audioPlayer.params == 'undefined'){ 6743 IRON.players[playerNum].audioPlayer.params = {}; 6744 } 6745 if( typeof IRON.players[playerNum].audioPlayer.params.meta == 'undefined'){ 6746 IRON.players[playerNum].audioPlayer.params.meta = false; 6747 } 6748 if( IRON.players[playerNum].audioPlayer.params.meta === false){ 6749 let newValue = []; 6750 newValue[metaName] = metaValue; 6751 IRON.players[playerNum].audioPlayer.params.meta = newValue; 6752 }else if( metaName in IRON.players[playerNum].audioPlayer.params.meta ){ 6753 const paramArray = IRON.players[playerNum].audioPlayer.params.meta[metaName].split(',') 6754 if( ! paramArray.includes(metaValue) ){ 6755 IRON.players[playerNum].audioPlayer.params.meta[metaName] += ','+ metaValue; 6756 } 6757 }else{ 6758 IRON.players[playerNum].audioPlayer.params.meta[metaName] = metaValue 6759 } 6760 IRON.players[playerNum].audioPlayer.params.playerId = playerId; 6761 srp_updatePage(1, IRON.players[playerNum].audioPlayer); 6762 //srp_updateURLParameter( 'srp_page', 1 ); 6763 srp_updateList( playerNum ); 6764} 6765 6766 6767/*Listener on the URL change*/ 6768//Source: https://itsopensource.com/how-to-call-a-function-on-URL-change-in-javascript/ 6769/* 6770(function(history){ 6771 var pushState = history.pushState; 6772 history.pushState = function() { 6773 pushState.apply(history, arguments); 6774 srp_updateList() 6775 }; 6776})(window.history); 6777*/ 6778 6779function srp_setSearchFiltersFromUrl(){ 6780 6781 const urlParams = new URLSearchParams(document.location.search); 6782 const playerId = srp_getPlayerIdParamFromUrl(); 6783 const playerNum = ( srp_convertPlayerIdToPlayerNum(playerId) !== null)? srp_convertPlayerIdToPlayerNum(playerId) : 0 ; 6784 var verifyParams = false; 6785 for (const key of urlParams.keys()) { 6786 if (key.startsWith('srp_')) { 6787 verifyParams = true; 6788 } 6789 } 6790 6791 6792 6793 6794 IRON.players[playerNum].audioPlayer.params = { //Save parameter 6795 playerId: playerId, 6796 search: urlParams.get('srp_search'), 6797 meta: srp_getAllMetaParams(), 6798 page: urlParams.get('srp_page'), 6799 order: urlParams.get('srp_order'), 6800 } 6801 for (let i = 0; i < IRON.players.length; i++) { 6802 if(i == playerNum){ 6803 if(verifyParams || IRON.players[playerNum].audioPlayer.lazy_load){ //If no srp_ param in the URL 6804 srp_updateList( playerNum ) 6805 } 6806 }else{ 6807 IRON.audioPlayer.reloadAjax(IRON.players[i].audioPlayer, true); 6808 } 6809 } 6810} 6811 6812function srp_getPlayerIdParamFromUrl(){ 6813 const urlParams = new URLSearchParams(document.location.search); 6814 let playerId = urlParams.get('srp_player_id'); 6815 if( playerId != null && playerId.startsWith('playernum-') ){ //eq: playernum-1 target the first player even without ID. Used by the search f
6815ield from the mp3 player. 6816 const playerNum = playerId.split('playernum-')[1]-1; 6817 playerId = $('.iron-audioplayer').eq(playerNum).attr('id'); 6818 } 6819 return playerId; 6820} 6821 6822function srp_getAllMetaParams(){ 6823 const urlParams = new URLSearchParams(document.location.search); 6824 let metaParams = urlParams.get('srp_meta'); 6825 if( metaParams ){ 6826 metaParams = metaParams.split(';'); 6827 metaParams = metaParams.filter((_, index) => index != metaParams.indexOf('')); //Remove Empty array element 6828 let newmetaParamsArray = []; 6829 metaParams.map(function(el){ 6830 const metaName = el.split(':', 1)[0]; 6831 const metaValue = el.replace(metaName + ':', ''); 6832 newmetaParamsArray[decodeURIComponent(metaName)] = decodeURIComponent(metaValue); 6833 }) 6834 return newmetaParamsArray; 6835 } 6836 return false; 6837} 6838 6839function srp_getMetaParams(metaName){ 6840 let meta = srp_getAllMetaParams(); 6841 meta = meta[metaName]; 6842 if(typeof meta == 'string'){ 6843 meta = meta.split(','); 6844 meta = meta.map( el => { return el.replace('ii44',','); }); 6845 return meta; 6846 }else{ 6847 return null; 6848 } 6849} 6850 6851function srp_insertChips( playerNum = 0){ 6852 6853 const metaParams = (typeof IRON.players[playerNum].audioPlayer.params.meta == 'object')? IRON.players[playerNum].audioPlayer.params.meta : []; 6854 let chipsSelector = '.srp_chips:not([data-player-id])'; 6855 let chipsSelectorToRemove = chipsSelector; 6856 let playerId = ( typeof IRON.players[playerNum].audioPlayer.params.playerId !== 'undefined' )? IRON.players[playerNum].audioPlayer.params.playerId : null; 6857 if( playerId !== null ){ 6858 if( $('.srp_chips[data-player-id="' + IRON.players[playerNum].audioPlayer.params.playerId + '"]').length ){ 6859 chipsSelector = '.srp_chips[data-player-id="' + IRON.players[playerNum].audioPlayer.params.playerId + '"]' 6860 chipsSelectorToRemove = chipsSelector; 6861 if( playerNum == 0 ){ 6862 chipsSelectorToRemove += ', .srp_chips:not([data-player-id])' 6863 } 6864 } 6865 } 6866 6867 $( chipsSelectorToRemove ).find('.srp_chip').remove(); 6868 if( IRON.players[playerNum].audioPlayer.params.search != null){ 6869 metaParams['search'] = IRON.players[playerNum].audioPlayer.params.search; 6870 } 6871 updateFilterSelector(metaParams, playerId); 6872 for (const property in metaParams) { 6873 const metaMultiParams = metaParams[property].split(','); 6874 6875 if(property.endsWith('_or')){ 6876 var title = $('[data-metakey="' + property.slice(0, -3) + '"]').data('label'); 6877 }else if(property.endsWith('_minmax')){ 6878 var title = $('[data-metakey="' + property.slice(0, -7) + '"]').data('label'); 6879 }else{ 6880 var title = $('[data-metakey="' + property + '"]').data('label'); 6881 } 6882 6883 const playerWidgetId = (typeof IRON.players[playerNum] != 'undefined')? IRON.players[playerNum].audioPlayer.id : null ; 6884 const valueForHuman = []; 6885 for (let i = 0; i < metaMultiParams.length; i++) { 6886 valueForHuman[i] = metaMultiParams[i]; 6887 if(metaMultiParams[i] != ''){ 6888 // if metamultiparams[i] contains _ then it's a range so rename the param min > max 6889 if(metaMultiParams[i].includes('_')){ 6890 // metaMultiParams[i] = metaMultiParams[i].replace('_', ' > '); 6891 } 6892 if(property == 'track_length_minmax'){ 6893 const times = metaMultiParams[0].split('_'); 6894 const startTime = secondsToTime(parseInt(times[0])); 6895 const endTime = secondsToTime(parseInt(times[1])); 6896 valueForHuman[i] = startTime + ' - ' + endTime; 6897 } 6898 6899 metaMultiParams[i] = metaMultiParams[i].replace('ii44', ','); 6900 chip = $('<div/>', { 6901 class: 'srp_chip', 6902 data: { meta: property, playerid: playerWidgetId }, 6903 html: title + ': ' + valueForHuman[i].replace('_', ' - ') + '<i class="sricon-close-circle"></i>' 6904 }); 6905 6906 function compareSliderValue(array1, array2) { 6907 if (array1.length !== array2.length) { 6908 return false; 6909 } 6910 for (let i = 0; i < array1.length; i++) { 6911 const element1 = array1[i]; 6912 const element2 = array2[i]; 6913 if (element1 != element2) { 6914 return false;
6915 } 6916 } 6917 return true; 6918 } 6919 6920 function resetSliderValue(currentMinMaxValue){ 6921 IRON.rangeSelector.forEach(function (slider) { 6922 if(compareSliderValue(slider.sliderValue, currentMinMaxValue)){ 6923 slider.sliderValue = slider.sliderValue = [ Number(slider.computedMin), Number(slider.computedMax) ]; 6924 } 6925 }) 6926 } 6927 6928 $(chip).on('click', function(){ 6929 if(property.includes('_minmax')){ 6930 resetSliderValue(metaMultiParams[0].split('_')); 6931 } 6932 const metaName = $(this).data('meta'); 6933 srp_removeMeta( metaName, metaMultiParams[i], playerId); 6934 }) 6935 $(chip).appendTo( chipsSelector ); 6936 } 6937 } 6938 } 6939 if ($(chipsSelector).find('.srp_chip').length > 1 && !$(chipsSelector).data('hideclear')){ 6940 // Retrieve the value of the data-clearall attribute 6941 const clearAllText = $(chipsSelector).data('clearall') || 'Clear All'; 6942 6943 const clearAllChip = $('<div/>', { 6944 class: 'srp_chip srp_chip_clear_all', 6945 data: { playerid: playerId }, 6946 html: clearAllText + '<i class="sricon-close-circle"></i>', 6947 }); 6948 6949 $(clearAllChip).on('click', function() { 6950 6951 6952 for (const property in metaParams) { 6953 if(property.includes('_minmax')){ 6954 resetSliderValue(metaParams[property].split('_')); 6955 } 6956 } 6957 6958 6959 srp_removeMeta('all', null, playerId); 6960 }); 6961 6962 $(clearAllChip).appendTo(chipsSelector); 6963 } 6964} 6965 6966function srp_updateList( playerNum ){ 6967 if( typeof IRON.players[playerNum].audioPlayer.params != 'undefined' ) { 6968 let playerId = IRON.players[playerNum].audioPlayer.params.playerId; 6969 /* Playerid Param*/ 6970 if( typeof IRON.players[playerNum].audioPlayer.params.playerId != 'undefined' ) { 6971 6972 target_playerId = IRON.players[playerNum].audioPlayer.params.playerId; 6973 if(playerId != null && playerId.startsWith('arbitrary-instance-')){ //ID is provide the embed search 6974 playerId = 'playernum-' + ( parseInt(playerNum, 10) + 1); 6975 } 6976 srp_updateURLParameter( 'srp_player_id', playerId ); 6977 6978 }else{ 6979 target_playerId = null; 6980 srp_updateURLParameter( 'srp_player_id', ''); 6981 } 6982 6983 /* Search Param*/ 6984 if( 6985 typeof IRON.players[playerNum].audioPlayer.params.search != 'undefined' && 6986 (typeof IRON.players[playerNum].audioPlayer.orderedList != 'undefined' || IRON.players[playerNum].audioPlayer.lazy_load) 6987 ) { 6988 srp_updateURLParameter( 'srp_search', IRON.players[playerNum].audioPlayer.params.search ); 6989 if( target_playerId ){ 6990 if(target_playerId.startsWith('arbitrary-instance-')){ //ID is provide the embed search 6991 searchDiv = $(document).find('#' + target_playerId + ' .srp_search'); 6992 }else{ 6993 searchDiv = $(document).find('.srp_search_container[data-player-id=' + target_playerId + '] .srp_search'); 6994 } 6995 }else{ 6996 searchDiv = $(document).find('.srp_search_container:not([data-player-id]) .srp_search'); 6997 } 6998 searchDiv.val(IRON.players[playerNum].audioPlayer.params.search); 6999 if(typeof IRON.players[playerNum].audioPlayer.orderedList != 'undefined'){ 7000 IRON.players[playerNum].audioPlayer.orderedList.search(IRON.players[playerNum].audioPlayer.params.search); 7001 } 7002 7003 }else{ 7004 srp_updateURLParameter( 'srp_search', ''); 7005 } 7006 /* Meta Param*/ 7007 if( typeof IRON.players[playerNum].audioPlayer.params.meta == 'object' ) { 7008 const metaParamsArray = IRON.players[playerNum].audioPlayer.params.meta; 7009 let metaParamsString = ''; 7010 for (const property in metaParamsArray) { 7011 if(metaParamsArray[property] != ''){ 7012 metaParamsString += property + ':' + metaParamsArray[property] + ';' 7013 7014 // Set active filter buttons from URL strings 7015 metaValues = metaParamsArray[property].split(','); 7016 for(value in metaValues){ 7017 activeBt = document.querySelectorAll('.srp_filter_button[data-metakey="' + property + '"][data-value="' + metaValues[value] + '"][data-playerid="' + target_playerId + '"]'); 7018 activeBt.forEach( function(el) { 7019 el.classList.add('srp_filter_button--active'); 7020 el.style.backgroundColor = el.dataset.color; 7021 el.style.borderColor = el.dataset.color; 7022 }) 7023 } 7024 }else{ 7025 delete IRON.players[playerNum].audioPlayer.params.meta[property]; 7026 } 7027 } 7028 srp_updateURLParameter( 'srp_meta', metaParamsString ); 7029 7030 if( typeof IRON.players[playerNum].audioPlayer.orderedList != 'undefined' ){ 7031 let paramName = ''; 7032 let newMetaParamsArray = []; 7033 for (const property in metaParamsArray) { 7034 paramName = srp_addPrefixToParams(property); 7035 newMetaParamsArray[paramName] = metaParamsArray[property]; 7036 } 7037 IRON.players[playerNum].audioPlayer.orderedList.filter(function (item) { 7038 var queryCondition = true; 7039 for (const property in newMetaParamsArray) { 7040 let stripProperty = property.replace('_or', ''); 7041 if( typeof item.values()[stripProperty] != 'undefined'){ 7042 let valueToSearch = newMetaParamsArray[property].split(','); 7043 valueToSearch = valueToSearch.map( el => { return el.toLowerCase().replace('ii44',','); }); 7044 let itemValue = item.values()[stripProperty].toLowerCase().split(', '); 7045 let alreadyMatched = false;
7046 for (const i in itemValue) { 7047 if( valueToSearch.includes( srp_decodeHTMLEntities(itemValue[i])) && !alreadyMatched ){ 7048 alreadyMatched = true; 7049 } 7050 } 7051 if(!alreadyMatched){ 7052 queryCondition = false; 7053 } 7054 } 7055 } 7056 return queryCondition; 7057 }); 7058 } 7059 } 7060 7061 srp_insertChips(playerNum); 7062 IRON.audioPlayer.reloadAjax(IRON.players[playerNum].audioPlayer, true); 7063 7064 } 7065 7066} 7067 7068function srp_addPrefixToParams(param){ 7069 switch(param) { 7070 case 'title': 7071 return 'tracklist-item-title'; 7072 case 'description': 7073 return 'srp_track_description'; 7074 case 'time': 7075 return 'tracklist-item-time'; 7076 default: 7077 return 'sr-playlist-cf--' + param; 7078 } 7079} 7080 7081function srp_scrollToTrackListTop(id){ 7082 if ($('#' + id).closest('.srp-scrolltotracklisttop-disable').length) { //Avoid scrolling to top when the class is present. Add the srp-scrolltotracklisttop-disable class to the player or to a parent to disable the scroll to top feature) 7083 return; 7084 } 7085 const yOffset = -30; 7086 const element = document.getElementById(id); 7087 const y = element.getBoundingClientRect().top + window.pageYOffset + yOffset; 7088 7089 window.scrollTo({top: y, behavior: 'smooth'}); 7090 7091 // $('#'+id)[0].scrollIntoView(); 7092 $('#'+id).find('.srp_list').addClass('srp_contentLoading'); //prevent transiton width animation on Cta when a new content appears. 7093 setTimeout(function(){ 7094 $('#'+id).find('.srp_list').removeClass('srp_contentLoading'); 7095 }, 1000); 7096} 7097 7098/*------------------------------ 7099END: Search & filter Parameters 7100------------------------------*/ 7101 7102IRON.repeatButtonToggle = function(){ 7103 const nextRepeatStatus = IRON.repeatNextStatus(); 7104 IRON.repeatStatus = nextRepeatStatus; 7105 document.cookie = "sonaar_mp3_player_repeat" + "=" + nextRepeatStatus + ";default;path=/"; 7106 $('.iron-audioplayer .srp_repeat').attr('data-repeat-status', nextRepeatStatus); 7107 $('.iron-audioplayer .srp_repeat').attr('title', IRON.repeatToolTipLabel()); 7108 if( IRON.audioPlayer.stickyEnable ){ 7109 IRON.sonaar.player.repeatStatus = nextRepeatStatus; //Update sticky player vue js variable 7110 } 7111} 7112 7113IRON.repeatNextStatus = function(){ 7114 const repeatStatusList = ['playlist', 'track', 'null']; 7115 const currentRepeatIndex = repeatStatusList.indexOf(IRON.repeatStatus); 7116 const nextRepeatIndex = (currentRepeatIndex + 1) % repeatStatusList.length; 7117 const nextRepeatStatus = repeatStatusList[nextRepeatIndex]; 7118 return nextRepeatStatus; 7119} 7120 7121IRON.repeatToolTipLabel = function(){ 7122 const nextRepeatStatus = IRON.repeatNextStatus(); 7123 switch (nextRepeatStatus) { 7124 case 'playlist': 7125 return sonaar_music.option.tooltip_repeat_playlist_btn; 7126 break; 7127 case 'track': 7128 return sonaar_music.option.tooltip_repeat_track_btn; 7129 break; 7130 case 'null': 7131 return sonaar_music.option.tooltip_repeat_disable_btn; 7132 break; 7133 default: 7134 return ''; 7135 } 7136} 7137 7138function srp_decodeHTMLEntities(str) { 7139 return str 7140 .replace(/&/g, '&') 7141 .replace(/>/g, '>') 7142 .replace(/</g, '<') 7143 .replace(/"/g, '"') 7144 .replace(/'/g, "'") 7145 .replace(/'/g, "'") 7146} 7147 7148/* Get PlayeNum */ 7149function srp_convertPlayerIdToPlayerNum(playerID, playerToCheck = null) { 7150 let player = null 7151 let playerNum = null; 7152 if( playerID !== null && playerID !== ''){ 7153 if( $('#' + playerID + '.iron-audioplayer').length ){ 7154 player = $('#' + playerID + '.iron-audioplayer'); 7155 }else if($('#' + playerID + ' .iron-audioplayer').length){ 7156 player = $('#' + playerID + ' .iron-audioplayer'); 7157 } 7158 } 7159 if(player !== null){ 7160 if(playerToCheck === null ){ 7161 for(const i in IRON.players){ 7162 if( player.data('id') == IRON.players[i].audioPlayer.data('id')){ 7163 playerNum = i; 7164 } 7165 } 7166 }else{ 7167 if( player.data('id') == IRON.players[playerToCheck].audioPlayer.data('id')){ 7168 playerNum = playerToCheck; 7169 } 7170 } 7171 } 7172 return playerNum; 7173} 7174 7175function srp_getParamFromUrl(){ 7176 //params list: "id", "widget_id", "trackid", "time", "ts_id", "play_icon" 7177
7178 const urlParams = new URLSearchParams(document.location.search); 7179 let params = {}; 7180 if(urlParams.get('ts_post_id')){ params.id = urlParams.get('ts_post_id') ; } 7181 if(urlParams.get('ts_time')){ params.time = urlParams.get('ts_time') ; } 7182 if(urlParams.get('ts_track_num')){ params.trackid = urlParams.get('ts_track_num') - 1 ; } 7183 if(urlParams.get('ts_player_index')){ //Seclect player 7184 setTimeout(function(){ 7185 console.log('Change player'); 7186 IRON.sonaar.player.selectedPlayer = $('.iron-audioplayer').eq( parseInt( urlParams.get('ts_player_index') ) - 1); 7187 IRON.sonaar.player.selectedPlayer.addClass('sr_selectedPlayer') 7188 }, 1000); 7189 } 7190 7191 if(Object.keys(params).length && typeof params.id != 'undefined' ){ 7192 sonaar_ts_shortcode( params ); 7193 } 7194 7195} 7196 7197 7198function srp_setPlayerParamUrl(){ 7199 7200 if(typeof IRON.sonaar.player.currentTime == 'undefined' || IRON.sonaar.player.currentTime == ''){ 7201 return false; 7202 } 7203 7204 const params = new URLSearchParams({ 7205 ts_post_id: IRON.sonaar.player.elWidgetId ? IRON.sonaar.player.postId : IRON.sonaar.player.playlistID.toString().split(", "), 7206 ts_track_num: IRON.sonaar.player.currentTrack + 1, 7207 ts_player_index: (typeof IRON.sonaar.player.selectedPlayer != 'undefined')? parseInt( srp_convertPlayerIdToPlayerNum(IRON.sonaar.player.selectedPlayer.id) ) + 1 : null, 7208 ts_time: IRON.sonaar.player.currentTime 7209 }); 7210 7211 const queryString = params.toString(); 7212 let urlParams = window.location.origin + window.location.pathname + '?' + queryString; 7213 7214 return urlParams; 7215} 7216 7217IRON.swiper = {}; //Directory of custom functions for the swiper/slider 7218 7219IRON.swiper.isTransitionEnd = true; 7220 7221IRON.swiper.update = function(audioplayer, currentTrack) { 7222 if(typeof audioplayer == 'undefined') 7223 return; 7224 7225 if( audioplayer == null ) 7226 return; 7227 7228 if( typeof audioplayer.swiper == 'undefined' ) 7229 return; 7230 7231 if( audioplayer.find('.srp_swiper').data('swiper-source') == 'track' ){ 7232 var slideIndex = currentTrack; 7233 var slidePostId = slideIndex; 7234 }else{ 7235 var slidePostId = $(audioplayer).find('.sr-playlist-item').eq(currentTrack).data('post-id'); 7236 var slideIndex = -1; 7237 var trackPostId = ''; 7238 $(audioplayer).find('.sr-playlist-item').each( function(){ 7239 if( trackPostId != $(this).data('post-id')){ 7240 trackPostId = $(this).data('post-id'); 7241 slideIndex++; 7242 } 7243 if(trackPostId == slidePostId){ 7244 return false; 7245 } 7246 }) 7247 } 7248 if( typeof audioplayer.swiper.params.centeredSlides != 'undefined' && audioplayer.swiper.params.centeredSlides === true ){ 7249 audioplayer.swiper.slideToLoop(slideIndex); //If "centeredSlides", always "slideTo" 7250 }else{ 7251 var visibleSlidesStartIndex = audioplayer.find('.swiper-slide-active').data('slide-index'); 7252 var visibleSlidesEndIndex = visibleSlidesStartIndex + audioplayer.swiper.params.slidesPerView - 1; 7253 if (slideIndex < visibleSlidesStartIndex || slideIndex > visibleSlidesEndIndex) { 7254 audioplayer.swiper.slideToLoop(slideIndex); //If not "centeredSlides", "slideTo" only when the slide is not visible 7255 } 7256 } 7257 7258 $(audioplayer).find('.swiper-slide.srp_current').removeClass('srp_current'); 7259 $(audioplayer).find('.swiper-slide[data-slide-id="' + slidePostId + '"]').addClass('srp_current'); 7260 if( $(audioplayer).find('.srp_swiper').data('swiper-source') == 'post' ){ //Only update track info when the swiper is from post. 7261 const titleAndArtistName = $(audioplayer).find('.sr-playlist-item').eq(currentTrack).data("tracktitle").split('<span class="srp_trackartist">'); 7262 $(audioplayer).find('.swiper-slide[data-slide-id="' + slidePostId + '"] .srp_swiper-track-title').html(titleAndArtistName[0]); 7263 if( $(audioplayer).find('.srp_swiper-track-artist').length && titleAndArtistName.length > 1){ 7264 var artistName = titleAndArtistName[1].split('</span>')[0]; 7265 $(audioplayer).find('.swiper-slide[data-slide-id="' + slidePostId + '"] .srp_swiper-track-artist').html(artistName); 7266 } 7267 } 7268 IRON.swiper.isTransitionEnd = false; 7269} 7270 7271 7272IRON.swiper.play = function(el, audioPlayer){ 7273 const playlistID = $(el).parents('.swiper-slide').data('slide-id'); 7274 if( audioPlayer.find('.srp_swiper').data('swiper-source') == 'track' ){ 7275 audioPlayer.find('.sr-playlist-item').eq(playlistID).find('.srp_audio_trigger').trigger('click'); 7276 }else{ 7277 const currentTrackIndex = (IRON.audioPlayer.stickyEnable)? IRON.sonaar.player.currentTrack : $('.sr-playlist-item.current').index(); 7278 if( audioPlayer.find('.sr-playlist-item').eq(currentTrackIndex).data('post-id') == playlistID ){ 7279 audioPlayer.find('.sr-playlist-item .srp_audio_trigger').eq(currentTrackIndex).trigger('click'); 7280 }else{ 7281 audioPlayer.find('.sr-playlist-item[data-post-id="' + playlistID + '"] .srp_audio_trigger').eq(0).trigger('click'); 7282 } 7283 } 7284} 7285 7286IRON.swiper.showHiddenSlide = function(audioPlayer){ //Do slideNext and slidePrev to make appearing the missing slide when we slideto the slider end and loop is enable. 7287 if(typeof audioPlayer.swiper.params != 'undefined' && audioPlayer.swiper.params.loop && typeof audioPlayer.swiper.params.centeredSlides != 'undefined' && audioPlayer.swiper.params.centeredSlides === true ){ 7288 if(typeof IRON.players[0] != 'undefined'){ 7289 audioPlayer.swiper.slideNext(0); 7290 audioPlayer.swiper.slidePrev(0); 7291 } 7292 } 7293} 7294IRON.searchField = {};
7294 //Directory of custom functions for the search field 7295IRON.searchField.wait = false; //Prevent multiple search when user type fast 7296IRON.searchField.search = function(field, e){ //Search field listener. field = input field, e = event 7297 if (e.ctrlKey || e.altKey || e.metaKey ) { 7298 return; 7299 } 7300 7301 let playerId = $(field).parents('.srp_search_container').data('player-id'); 7302 7303 if($(field).parents('.iron-audioplayer').length){ 7304 if( $(field).parents('.elementor-widget-music-player').length && typeof $(field).parents('.elementor-widget-music-player').attr('id') != 'undefined'){ //if mp3 player has id from elementor 7305 playerId = ( $(field).parents('.elementor-widget-music-player').attr('id') ) 7306 }else if( ! $(field).parents('.iron_widget_radio').attr('id').startsWith('arbitrary-instance-') ){ //if mp3 player has id from shortcode parameter 7307 playerId = $(field).parents('.iron_widget_radio').attr('id'); 7308 }else{ 7309 playerId = $(field).parents('.iron-audioplayer').attr('id'); 7310 } 7311 $(field).parents('.srp_search_container').attr('data-player-id', playerId); 7312 } 7313 if (e.keyCode === 13) { 7314 if($(field).parents('.srp_search_container').data('url')){ 7315 var url = $(field).parents('.srp_search_container').data('url') + "?srp_search=" + $(field).val(); 7316 if( playerId != undefined){ 7317 url = url+'&srp_player_id='+playerId; 7318 } 7319 $(location).prop('href', url) 7320 } 7321 $('.srp_search').blur(); 7322 e.preventDefault(); 7323 } 7324 let searchBox = '.srp_search_container:not([data-player-id]) .srp_reset_search'; 7325 if( playerId != undefined){ 7326 searchBox = '.srp_search_container[data-player-id="' + playerId + '"] .srp_reset_search'; 7327 } 7328 $(searchBox).css('display', 'initial'); 7329 if($(field).val() ==''){ 7330 $(field).parents('.srp_search_container').find('.srp_reset_search').css('display', 'none'); 7331 } 7332 const el = field; 7333 if( IRON.searchField.wait === false ){ 7334 IRON.searchField.wait = true; 7335 setTimeout(function(){ 7336 const playerNum = ( srp_convertPlayerIdToPlayerNum(playerId) !== null)? srp_convertPlayerIdToPlayerNum(playerId) : 0 ; 7337 if( playerNum == 0 && playerId != undefined && $('.srp_search_container:not([data-player-id]) .srp_search').length && ! $(el).parents('.iron-audioplayer').length ){ 7338 document.querySelector('.srp_search_container:not([data-player-id]) .srp_search').value = ''; 7339 } 7340 if(typeof IRON.players[playerNum] != 'undefined'){ 7341 if( typeof IRON.players[playerNum].audioPlayer.params == 'undefined'){ 7342 IRON.players[playerNum].audioPlayer.params = { playerId: playerId, search: $(el).val() }; 7343 }else{ 7344 IRON.players[playerNum].audioPlayer.params.playerId = playerId; 7345 IRON.players[playerNum].audioPlayer.params.search = $(el).val(); 7346 } 7347 srp_updateURLParameter( 'srp_page', 1 ); 7348 IRON.players[playerNum].audioPlayer.params['page'] = 1; 7349 srp_updateList(playerNum); 7350 } 7351 IRON.searchField.wait = false; 7352 }, 700); 7353 } 7354} 7355 7356if(IRON.audioPlayer.stickyEnable && sonaar_music.option.sticky_show_repeat_bt === 'true' || $('.iron-audioplayer .srp_repeat').length){//If a repeat button is visible use the cookie to set the repeat status 7357 IRON.repeatStatus = ($('.srp_noLoopTracklist').length)? 'null' : 'playlist'; //Set the default repeat status 7358 IRON.repeatStatus = ( getCookieValue("sonaar_mp3_player_repeat") )? getCookieValue("sonaar_mp3_player_repeat") : IRON.repeatStatus; //Get the repeat status from cookie if exist 7359}else{ 7360 IRON.repeatStatus = false; 7361} 7362 7363IRON.getTrackMemoryKeyFormat = function($mp3Url){ //Reformat the mp3 url to be used as a key in the track memory 7364 return $mp3Url.replace(/[^a-zA-Z0-9]|https|http|/g, ''); 7365}
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.