1$ = jQuery; 2 IRON.data = { 3 4 list: { 5 playlist_name: false, 6 tracks: false, 7 type: false, 8 random_order: "", 9 }, 10 currentTrack: 0, 11 continuous: false, //if the player has been loaded from cookies. 12 favoriteTackList: false, 13 playlistID: "", 14 showList: false, 15 isPlaying: false, 16 audioplayerPlaying: null, //Which Audioplayer instance is playing. 17 loading: 0, 18 minimize: true, 19 extendedPlayerOpened: false, 20 extendedPlayerOverlayOpened: false, 21 audioCtx: false, 22 audioElement: false, 23 audioSrc: false, 24 analyser: false, 25 frequencyData: false, 26 userPref: { 27 pause: false, 28 minimize: false, 29 autoplay: true, 30 }, 31 storeButtonCount: 0, 32 unlock: false, 33 playerStatus: "", 34 currentTime: "", 35 totalTime: "", 36 shuffle: false, 37 repeatButton: (sonaar_music.option.sticky_show_repeat_bt == 'true') ? true : false, 38 repeatStatus: IRON.repeatStatus, 39 mute: false, 40 volume: null, 41 elWidgetId: false, //Only has value when the playlist is built with the elementor widget 42 postId: false, //Used by the continous player when the playlist is generated by a elementor widget 43 isSmallDevice:( $('body').width() > 768 )? false: true, 44 classes: { 45 enable: false, 46 waveEnable: false, 47 continuousPlayer: Boolean(sonaar_music.option.enable_continuous_player === "true"), 48 show_nextprevious_bt: (sonaar_music.option.sticky_show_nextprevious_bt != "false") ? true : false, 49 show_album_title: (sonaar_music.option.sticky_show_album_title != "false") ? true : false, 50 show_speed_bt: Boolean(sonaar_music.option.sticky_show_speed_bt === "true"), 51 show_skip_bt: Boolean(sonaar_music.option.sticky_show_skip_bt === "true"), 52 show_tracklist_bt: (sonaar_music.option.sticky_show_tracklist_bt != "false") ? true : false, 53 show_shuffle_bt: (sonaar_music.option.sticky_show_shuffle_bt != "false") ? true : false, 54 show_mobile_next_bt: Boolean(sonaar_music.option.sticky_mobile_show_next === "true"), 55 show_mobile_previous_bt: Boolean(sonaar_music.option.sticky_mobile_show_previous === "true"), 56 show_mobile_tracklist_bt: Boolean(sonaar_music.option.sticky_mobile_show_tracklist === "true"), 57 display_description: (sonaar_music.option.sticky_show_description != "false") ? true : false, 58 template: sonaar_music.option.sticky_preset, 59 floatpos: sonaar_music.option.float_pos, 60 show_controls_hover: sonaar_music.option.show_controls_hover, 61 isPlaying: false, 62 author: srp_vars.sonaar_music.continuous_artist_name, 63 feedUrl: false, 64 noLoopTracklist: (srp_vars.sonaar_music.no_loop_tracklist == 'on') ? 'on' : false, 65 notrackskip: (srp_vars.sonaar_music.no_track_skip == 'on') ? 'on' : false, 66 continued: false, //Player settings come from the cookie (continuous player) 67 dontCountContinuous: false, //For statistic. Dont count stats from the continuous player 68 emptyPlayer: true, 69 skipForward: 30, 70 skipBackward: 15, 71 speedRate: 1, 72 wc_ajax_add_to_cart: (sonaar_music.option.wc_enable_ajax_addtocart == 'true') ? true : false, 73 wc_variation_lb: (sonaar_music.option.wc_variation_lb != 'false') ? true : false, 74 }, 75 selectedPlayer: null, 76 cookieSetting: { 77 mute: false, 78 volume: 1, 79 isPlaying: false, 80 currentTime: 0, 81 json: false, //Required for the continuous player with Post Related or "audio_meta_field" shorcode attribute as source 82 }, 83}; 84 85var srp_seekTime = false; 86 87 88Vue.component('control', { 89 props: ["player"], 90 template: ` 91 <div class="control" 92 :style="(player.isSmallDevice && (player.classes.show_mobile_previous_bt || player.classes.show_mobile_next_bt || player.classes.show_mobile_tracklist_bt)) 93 ? { 'margin-right': '10px !important', 'column-gap': '15px' } 94 : {}"> 95 <div role="button" tabindex="0" aria-label="View Tracklist" 96 :title="sonaar_music.option.tooltip_tracklist_btn" 97 class="list control--item sricon-list" 98 @click="player.setshowList" 99 v-if="player.list.tracks.length > 1 && (!player.isSmallDevice && player.classes.show_tracklist_bt || (player.isSmallDevice && player.classes.show_mobile_tracklist_bt))"> 100 </div> 101 <div role="button" tabindex="0" aria-label="Rewind 15 seconds" :title="sonaar_music.option.tooltip_rwd_btn" class="sr_skipBackward sricon-15s" @click="sr_audioSkipTo(-1 * player.classes.skipBackward)" v-if="player.classes.show_skip_bt && !player.isSmallDevice"></div> 102 <div role="button" tabindex="0" aria-label="Previous Track" :title="sonaar_music.option.tooltip_prev_btn" class="previous control--item sricon-back" @click="player.previous" v-if="player.list.tracks.length > 1 && (!player.isSmallDevice && player.classes.show_nextprevious_bt || (player.isSmallDevice && player.classes.show_mobile_previous_bt))"></div> 103 <div role="button" tabindex="0" aria-label="Play / Pause" :title="sonaar_music.option.tooltip_play_btn" class="play control--item sricon-play" @click="player.play" :class="{'audio-playing': player.isPlaying }"></div> 104 <div role="button" tabindex="0" aria-label="Next Track" :title="sonaar_music.option.tooltip_next_btn" class="next control--item sricon-forward" @click="player.next" v-if="player.list.tracks.length > 1 && (!player.isSmallDevice && player.classes.show_nextprevious_bt || (player.isSmallDevice && player.classes.show_mobile_next_bt))"></div> 105 <div role="button" tabindex="0" aria-label="Forward 30 seconds" :title="sonaar_music.option.tooltip_fwrd_btn" class="sr_skipForward control--item sricon-30s" @click="sr_audioSkipTo(player.classes.skipForward)" v-if="player.classes.show_skip_bt && !player.isSmallDevice"></div> 106 <div role="button" tabindex="0" aria-label="Speed Rates" :title="sonaar_music.option.tooltip_speed_btn"class="sr_speedRate control--item " :class="player.classes.speedRate != 1 ? 'active' : '' " @click="sr_setSpeedRate" v-if="player.classes.show_speed_bt && !player.isSmallDevice"><div>{{player.classes.speedRate}}X</div></div> 107 <div role="button" tabindex="0" aria-label="Shuffle Track" :title="sonaar_music.option.tooltip_shuffle_btn"class="shuffle control--item sricon-shuffle" :class="player.shuffle ? 'active' : '' " @click="sr_shuffleToggle" v-if="player.list.tracks.length > 1 && player.classes.show_shuffle_bt && !player.isSmallDevice"></div> 108 <div role="button" tabindex="0" aria-label="Repeat" :title="IRON.repeatToolTipLabel()" class="srp_repeat sricon-repeat control--item" @click="IRON.repeatButtonToggle" :data-repeat-status="player.repeatStatus" v-if="player.repeatButton && !player.isSmallDevice && !player.classes.notrackskip"></div> 109 </div>` 110}) 111 112Vue.component('waveform', { 113 props: ["player"], 114 template: ` 115 <div class="sr_progressbar_sticky"> 116 <div class="timing"> 117 <div class="time timing_currentTime">{{ player.currentTime }}</div> 118 <div class="time timing_totalTime">{{ player.totalTime }}</div> 119 </div> 120 <div id="sPlayer" class="wave sonaar_fake_wave" :class="{reveal: player.classes.waveEnable, sr_hide: !player.classes.waveEnable}"> 121 <div class="sonaar_wave_base"><svg></svg>
122 <canvas id="splayer-wave-container" :height="player.setWaveHeight" width="2540"></canvas> 123 </div> 124 <div class="sonaar_wave_cut"><svg></svg> 125 <canvas id="splayer-wave-progress" :height="player.setWaveHeight" width="2540"></canvas> 126 </div> 127 </div> 128 </div>`, 129 mounted () { 130 IRON.audioPlayer.fakeWaveClick('sticky'); 131 } 132}) 133 134Vue.component('sonaar-extend-button', { 135 props: ["player"], 136 template: ` 137 <div role="button" tabindex="0" aria-label="Show Call-to-action buttons" class="sonaar-extend-button" @click="player.showCTA" v-if="player.list.tracks.length >= 1 && player.albumStoreList.length >= 1"> 138 <i class="fas fa-ellipsis-v"></i> 139 </div> 140 ` 141}); 142Vue.component('store', { 143 props: ["player"], 144 template: ` 145 <transition name="sonaar-player-storefade"> 146 <div class="store" v-if="player.list.tracks.length >= 1 && player.albumStoreList.length >= 1"> 147 148 <ul class="track-store" v-if="player.albumStoreList.length >= 1"> 149 <li v-for="(store, storeIndex) in player.albumStoreList"> 150 <cta :player=player :storeid=storeIndex label=true></cta> 151 </li> 152 </ul> 153 </div> 154 </transition> 155 ` 156}); 157Vue.component('cta', { 158 props: ["player","storeid","label"], 159 computed: { 160 store () { 161 var index; 162 if( typeof this.storeid == 'number'){ 163 index= this.storeid; 164 }else{ 165 var storeId = this.storeid; 166 index = IRON.sonaar.player.albumStoreList.findIndex(function(element) { 167 var storeIdKey = (typeof element['cta-class'] !== "undefined" && element['cta-class'] !== '')?'cta-class':'store-icon'; //Some CTA can be identify by using the "cta-class" key and other "store-icon" 168 return typeof element[storeIdKey] === "string" && element[storeIdKey].includes(storeId); 169 }); 170 } 171 return IRON.sonaar.player.albumStoreList[index]; 172 }, 173 }, 174 template: ` 175 <span v-if="(typeof store !== 'undefined')"> 176 <a 177 :href="store['link-option'] == 'popup' || (store['has-variation'] == true && player.classes.wc_variation_lb) ? '#!': store['store-link']" 178 :target="store['store-target'] || store['link-option'] === 'popup' ? '_self' : '_blank'" 179 v-bind:class="[ 180 { 181 'sr_store_round_bt': store['store-type'] === 'wc', 182 'srp-make-offer-bt': store['make-offer-bt'], 183 'sr_store_ask_email': store['store-link'] === '#srp_ask_email', 184 'add_to_cart_button ajax_add_to_cart': !store['make-offer-bt'] && player.classes.wc_ajax_add_to_cart && !store['has-variation'] && store['store-link'] !== '#srp_ask_email', // Prevent add_to_cart_button if store-link is #srp_ask_email 185 'sr_store_force_share_bt--sticky': store['cta-class'] === 'sr_store_force_share_bt' 186 }, 187 store['cta-class'] // Bind the store['cta-class'] directly to the class attribute 188 ]" 189 :download="player.ifDownloadAttribute(store)" 190 :data-product_id="store['product-id'] !== undefined ? store['product-id'] : false" 191 :data-barba-prevent="['sr_store_force_share_bt', 'srp-fav-bt'].includes(store['cta-class']) ? 'all' : null" 192 @click="player.ctaClick(store, $(event.target))" 193 > 194 <i :class="store['store-icon']"></i> 195 <span>{{ store['store-link'] === '#srp_ask_email' ? sonaar_music.option.download_settings_afe_button_label : (label ? store['store-name'] : '') }}</span> 196 </a> 197 </span> 198 ` 199}); 200 201IRON.sonaar = { 202 player: new Vue({ 203 el: "#sonaar-player", 204 data: IRON.data, 205 methods: { 206 play: function () { 207 this.userPref.autoplay = true; 208 if (this.isPlaying) { 209 document.getElementById("sonaar-audio").pause(); // -- Audio MediaElement 210 } else { 211 this.playAudio(); 212 } 213 }, 214 playAudio: function () { 215 var promise = document.getElementById("sonaar-audio").play(); 216 if (promise !== undefined) { 217 promise 218 .then((_) => { 219 //console.log('play started! yeah'); 220 // Autoplay started! 221 }) 222 .catch((error) => { 223 console.log("Warning = " + error); 224 // Autoplay was prevented. 225 // Show a "Play" button so that user can start playback. 226 }); 227 } 228 if(typeof sonaar_music.option.sticky_spectro_style !== "undefined" && sonaar_music.option.sticky_spectro_style != "none"){ 229 startAudioSpectrum( '#sonaar-player' ) 230 } 231 }, 232 previous: function () { 233 if( document.getElementById('sonaar-audio').currentTime > IRON.previousTrackThreshold ){ //Resets the track to the beginning Or go to the previous track. 234 document.getElementById('sonaar-audio').currentTime = 0; 235 return; 236 } 237 if (this.shuffle) { 238 var i; 239 for (i = 0; i < this.list.random_order.length; i++) { 240 if (this.list.random_order[i] == this.currentTrack) { 241 if (i == 0) { 242 this.currentTrack = this.list.random_order[this.list.random_order.length - 1]; 243 } else { 244 this.currentTrack = this.list.random_order[i - 1]; 245 } 246 break; 247 } 248 } 249 } else { 250 if (this.currentTrack - 1 < 0) return (this.currentTrack = this.list.tracks.length - 1); 251 252 this.currentTrack--; 253 } 254 }, 255 next: function () { 256 if (this.playerStatus == "next") return; 257 258 if (this.shuffle) { 259 var i; 260 for (i = 0; i < this.list.random_order.length; i++) { 261 if (this.list.random_order[i] == this.currentTrack) { 262 if (i == this.list.random_order.length - 1) { 263 if (this.classes.noLoopTracklist == "on"){ 264 return; 265 } 266 this.currentTrack = this.list.random_order[0]; 267 } else { 268 this.currentTrack = this.list.random_order[i + 1]; 269 } 270 break; 271 } 272 } 273 } else { 274 if (this.list.tracks.length == 1) { //handleTrackChange() run automaticly when the currentTrack value change. When the playlist has only one track, the currenttrack value never change so we have to trig it here. 275 if (this.classes.noLoopTracklist == "on") return; //Do nothing if the "No loop tracklist" is enable" 276 this.handleTrackChange(); 277 return; 278 } 279 if (this.currentTrack + 1 >= this.list.tracks.length) { //At the end of the playlist 280 if (this.classes.noLoopTracklist == "on") return; //Do nothing if the "No loop tracklist" is enable" 281 return (this.currentTrack = 0); 282 } 283 284 this.currentTrack++; 285 } 286 }, 287 skipBackward: function () { 288 sr_audioSkipTo(-1 * this.classes.skipBackward); 289 }, 290 skipForward: function () { 291 sr_audioSkipTo(this.classes.skipForward); 292 }, 293 start: function () { //Created for custom JS | not used by the plugin code 294 document.getElementById("sonaar-audio").play(); 295 }, 296 pause: function () { //Created for custom JS | not used by the plugin code 297 document.getElementById("sonaar-audio").pause(); 298 }, 299 toggleStartPause: function () { //Created for custom JS | not used by the plugin code 300 IRON.sonaar.player.play(); 301 }, 302 303 304 setPlaylist: function (audioPlayer, eq, time = 0) { 305 if ($(audioPlayer).attr("trackselected") == eq || ($(audioPlayer).attr("trackselected") == null && eq == 0)) { 306 $(audioPlayer).attr("duplicating_wave", true); 307 } 308 $(audioPlayer).attr("trackselected", eq); 309 var params = audioPlayer.data("url-playlist").slice(audioPlayer.data("url-playlist").indexOf("title")).split("&"); 310 let newParams = [];
311 params.forEach(function (el) { 312 let paramName; 313 let paramValue; 314 [paramName, paramValue] = el.split('=') 315 newParams[paramName] = paramValue; 316 }); 317 if (newParams.feed.length || newParams.audio_meta_field.length) { 318 var id = $(audioPlayer).attr("id"); //Use the elementor widget ID as the player ID. This param is only available the FEED option. 319 } else { 320 var id = newParams.albums; 321 } 322 this.setPlayer({ 323 id: id, 324 category: newParams.category || '', 325 title: newParams.title, 326 trackid: eq, 327 shuffle: audioPlayer.data("shuffle"), 328 audioPlayer: audioPlayer, 329 time: time 330 }); 331 }, 332 333 preventContinuousUrl: function () { 334 var preventURL = false; 335 if (typeof sonaar_music.option.sr_prevent_continuous_url !== "undefined") { 336 if (sonaar_music.option.sr_prevent_continuous_url.includes(sonaar_music.postID)) { 337 preventURL = true; 338 } 339 } 340 return preventURL; 341 }, 342 343 setPlayerAndPlay: function (args) { 344 if (IRON.sonaar.player.playlistID != args.id || this.currentTrack != args.trackid) { 345 IRON.audioPlayer.stickyEnable = true; 346 this.setPlayer(args); 347 this.playAudio(); 348 } else { 349 if (!this.isPlaying) { 350 this.playAudio(); 351 } 352 if (args.time) { 353 this.seekTime(convertTime(args.time)) 354 } 355 if (args.trackid && this.currentTrack != args.trackid) { 356 this.currentTrack = args.trackid; 357 } 358 } 359 360 if(args.nolooptracklist == "on"){ 361 IRON.sonaar.player.classes.noLoopTracklist = "on"; 362 } 363 if(args.notrackskip == "on"){ 364 IRON.sonaar.player.classes.notrackskip = "on"; 365 } 366 }, 367 368 getPlaylistbyID: function (id, category, title, elwidget, jsonFromCookie = false) { 369 var playlistID = id || false; 370 var title = title || ""; 371 var elwidget = elwidget ? elwidget + "&feed=1" : null; 372 if (this.selectedPlayer === null && playlistID) { 373 if (jsonFromCookie) { 374 return jsonFromCookie; 375 } else { 376 return srp_vars.site_url + "?load=playlist.json&title=" + title + "&albums=" + playlistID + "&category=" + category + "&el_widget_id=" + elwidget + "&posts_per_pages=-1"; 377 } 378 } else { 379 json_url = this.selectedPlayer.attr("data-url-playlist"); 380 return json_url; 381 } 382 }, 383 384 seekTime: function (time) { 385 if (time) { 386 if (document.getElementById("sonaar-audio").duration !== Infinity) { 387 document.getElementById("sonaar-audio").currentTime = convertTime(time); 388 } 389 srp_seekTime = false; 390 } 391 }, 392 393 setPlayer: function (args) { 394 var newTracklistIsFavoriteList = (typeof args.audioPlayer != 'undefined' && args.audioPlayer.hasClass('srp_player_is_favorite'))? true : false; 395 IRON.audioPlayer.stickyEnable = true; 396 397 sanitized_id = args.id 398 sanitized_id = sanitized_id.toString(); 399 sanitized_id = sanitized_id.split(" ").join(""); // prevent blank space 400 args.id = sanitized_id.replace(/latest/i, srp_vars.sonaar_music.mostRecentId); // if latest string is used, replace it by the most recent id 401 402 if(typeof sonaar_music.option.sticky_spectro_style !== "undefined" && sonaar_music.option.sticky_spectro_style != "none" && $('#sonaar-audio').length){ // if sticky spectro is enabled 403 document.getElementById("sonaar-audio").crossOrigin = "anonymous"; 404 } 405 406 this.classes.emptyPlayer = false; 407 var args = args || {}; 408 var params = { 409 id: args.id, 410 category: args.category || '', 411 title: args.title || null, 412 trackid: args.trackid || 0, 413 autoplay: typeof args.autoplay == "boolean" ? args.autoplay : true, 414 el_widget_id: args.elwidgetid || false, 415 jsonFromCookie: args.json || false // Used to conserved postrelated playlist from single post 416 }; 417 params.id = (params.id == '' && params.category != '') ? srp_vars.sonaar_music.currentPostId : params.id; 418 srp_seekTime = args.time || false; 419 this.selectedPlayer = args.audioPlayer || null; 420 421 if( this.continuous ){ 422 this.playlistID = false;
423 } 424 if(typeof args.continuous != 'undefined' && args.continuous){ 425 this.continuous = true; 426 }else{ 427 this.continuous = false; 428 } 429 430 this.elWidgetId = params.el_widget_id; 431 this.shuffle = args.shuffle == true || args.shuffle == "true" || args.shuffle == "1" || (this.selectedPlayer && this.selectedPlayer.attr('data-shuffle') == 'true') ? true : false; 432 var samePlaylist = false; 433 if(this.selectedPlayer && this.selectedPlayer.hasClass('sr_selectedPlayer')){ //If the player is already selected 434 samePlaylist = true; 435 }else{ 436 $(".sr_selectedPlayer").removeClass("sr_selectedPlayer"); 437 $(this.selectedPlayer).addClass("sr_selectedPlayer"); 438 } 439 440 if (!this.classes.wavesurferEnable) { 441 IRON.audioPlayer.fakeWaveClick("sticky"); 442 } 443 this.userPref.autoplay = params.autoplay; 444 445 //const samePlaylist = (params.id && params.id === this.playlistID && this.favoriteTackList == newTracklistIsFavoriteList)? true : false; 446 447 if (samePlaylist && params.trackid == this.currentTrack) { //If the track is already the current track. 448 this.seekTime(srp_seekTime); 449 return this.play(); 450 } 451 if ( samePlaylist && params.trackid !== this.currentTrack ) { 452 this.currentTrack = params.trackid; 453 } 454 455 //Load tracklist from th Json file only if the playlist ID has changed or if the playlist is a favorite playlist. 456 if ( 457 !samePlaylist || 458 newTracklistIsFavoriteList !== this.favoriteTackList || 459 params.category !== this.categoryID 460 ) { 461 const endingTrack = this.currentTrack; 462 $.when($.getJSON(this.getPlaylistbyID(params.id, params.category, params.title, params.el_widget_id, params.jsonFromCookie))).done( 463 function (data) { 464 if(data.length == 0){ return; } //If the playlist is empty 465 if (!$("body").hasClass("artistPlayer-enable")) { 466 this.classes.enable = true; 467 if (!IRON.sonaar.player.classes.continued) { 468 this.minimize = false; 469 } 470 this.animatePlayer(); 471 $("body").addClass("continuousPlayer-enable"); 472 } 473 this.list = data; 474 if (IRON.players.length && this.selectedPlayer && this.selectedPlayer.hasClass('srp_reordered')) { 475 for (var playerIndex = 0; playerIndex < IRON.players.length && IRON.players[playerIndex].audioPlayer.attr('id') != $(this.selectedPlayer).attr('id'); playerIndex++) { }; //Set playerIndex 476 this.reOrderTacklist(playerIndex) 477 } 478 479 if (this.shuffle) { 480 this.setRandomList(); 481 if (typeof args.trackid == "undefined") { 482 params.trackid = Math.floor(Math.random() * this.list.tracks.length); 483 } 484 } 485 486 this.playlistID = params.id; 487 this.categoryID = params.category; 488 489 if(typeof sonaar_music.option.general_volume != 'undefined' && this.volume == null){ 490 sr_setVolume(sonaar_music.option.general_volume/100); 491 } 492 493 if (this.list.type == "podcast") { 494 for (var i = 0; i < this.list.tracks.length; i++) { 495 var element = this.list.tracks[i]; 496 497 if (element.id == params.id) { 498 this.currentTrack = i; 499 } 500 } 501 } else { 502 this.currentTrack = params.trackid; 503 } 504 505 if (this.currentTrack == 0 || //If the currentTrack still has the default value, execute handleTrackChange. 506 endingTrack == this.currentTrack //HandletrackChange function is automatically triggered when the currentTrack value is changed. Here we execute it if the currentTrack value is the same but the playlist ID has been changed. 507 ) { 508 this.handleTrackChange(); 509 } 510 511 if(typeof IRON.sonaar.player.list.tracks === 'object' && typeof IRON.localStorageTrackMemory === 'object'){ //Verify if the track has been completed 512 IRON.sonaar.player.list.tracks.forEach((track, index) => { 513 const trackMemoryKey = IRON.getTrackMemoryKeyFormat(track.mp3); 514 if (trackMemoryKey && IRON.localStorageTrackMemory.hasOwnProperty(trackMemoryKey)) { 515 const trackMemoryData = IRON.localStorageTrackMemory[trackMemoryKey]; 516 if (Array.isArray(trackMemoryData) && trackMemoryData.length >= 3) { 517 track.hasCompleted = trackMemoryData[2]; 518 } 519 } 520 }); 521 } 522 523 }.bind(this) 524 ); 525 this.favoriteTackList = newTracklistIsFavoriteList; 526 } 527 528 if (this.selectedPlayer != null) { 529 this.classes.feedUrl = this.selectedPlayer.data("feedurl"); 530 this.classes.noLoopTracklist = this.selectedPlayer.data("no-loop-tracklist"); 531 this.classes.notrackskip = this.selectedPlayer.data("notrackskip"); 532 this.cookieSetting.json = this.selectedPlayer.attr('data-url-playlist'); 533 } 534 this.postId = srp_vars.sonaar_music.currentPostId; 535 536 IRON.sonaar.player.selectedTimeStamp = null; 537 if (typeof args.ts_id != 'undefined') { //set selected time stamp shortcode 538 IRON.sonaar.player.selectedTimeStamp = $('#sonaar_ts-' + args.ts_id); 539 } else { 540 let selector = '.srmp3_sonaar_ts_shortcode'; 541 if (this.selectedPlayer != null && typeof this.selectedPlayer.data('ts-sync') != 'undefined') { 542 IRON.sonaar.player.selectedTimeStamp = $('#sonaar_ts-' + this.selectedPlayer.data('ts-sync')); 543 selector += ':not(#sonaar_ts-' + this.selectedPlayer.data('ts-sync') + ')'; 544 } 545 $(selector).removeClass('sr_selected audio-playing'); 546 } 547 548 if($('#srmp3_settings_shortcodebuilder').length && $('#adminmenuback').length){ //If we are in the shortcode builder, resize the player to fit the screen 549 $('#sonaar-player').css('width', 'calc(100% - ' + $('#adminmenuback').width() + 'px)'); 550 $('#sonaar-player').css('right', 0); 551 } 552 }, 553 554 setAudio: function () { 555 //Set to "audioplayerPlaying" which audioplayer is playing. ( 0 for the first audioplayer) 556 var audioplayerPlayingID = null; 557 $.each(IRON.players, function (index) { 558 if ($(IRON.players[index].audioPlayer).hasClass("sr_selectedPlayer")) { 559 audioplayerPlayingID = index; 560 } 561 }); 562 this.audioplayerPlaying = audioplayerPlayingID; 563 this.setPlayerType(); 564 //---------------------------------------------------------------------- 565 566 if (this.list.tracks[this.currentTrack].mp3 === null || this.list.tracks[this.currentTrack].mp3 === "") { 567 // feed url is used in the shortcode instead of post id 568 this.list.tracks[this.currentTrack].mp3 = $(".iron-audioplayer.sr_selectedPlayer .sr-playlist-item").attr("data-audiopath"); 569 this.list.tracks[this.currentTrack].track_title = $(".iron-audioplayer.sr_selectedPlayer .sr-playlist-item").attr("data-tracktitle"); 570 this.list.tracks[this.currentTrack].album_title = $(".iron-audioplayer.sr_selectedPlayer .sr-playlist-item").attr("data-albumtitle"); 571 this.list.tracks[this.currentTrack].track_artist = $(".iron-audioplayer.sr_selectedPlayer .sr-playlist-item").attr("data-trackartist"); 572 } 573 if(IRON.sonaar.player.hasPlayed == false){ // Register the audio object a first time for iOS to continue to next track on lock mode. 574 elementAudio.src = this.list.tracks[this.currentTrack].mp3; 575 } 576 $("#sonaar-player").attr("data-tracktitle", this.list.tracks[this.currentTrack].track_title); 577 $("#sonaar-player").attr("data-albumtitle", this.list.tracks[this.currentTrack].album_title); 578 $("#sonaar-player").attr("data-trackartist", this.list.tracks[this.currentTrack].track_artist); 579 $("#sonaar-player").attr("data-audiopath", this.list.tracks[this.currentTrack].mp3); 580 if (this.list.tracks[this.currentTrack].id != null) { 581 $("#sonaar-player").attr("data-trackid", this.list.tracks[this.currentTrack].id); 582 } 583 currentTrackTitle = this.list.tracks[this.currentTrack].track_title; 584 currentAlbumTitle = this.list.tracks[this.currentTrack].album_title; 585 currentArtistName = this.list.tracks[this.currentTrack].track_artist; 586 currentAlbumArt = this.list.tracks[this.currentTrack].poster; 587 588 IRON.audioPlayer.currentTrackData = { 589 trackTitle: currentTrackTitle, 590 albumTitle: currentAlbumTitle, 591 artistName: currentArtistName, 592 albumArt: currentAlbumArt 593 } 594 IRON.audioPlayer.setMediaSessionAPI(currentTrackTitle, currentAlbumTitle, currentArtistName, currentAlbumArt); 595 596 sr_addTrackToPlaylist(this.list.tracks[this.currentTrack]); 597 598 if (!IRON.sonaar.player.selectedPlayer || !IRON.sonaar.player.selectedPlayer.trackMemory) { //if player is not sync
598with a widget player set with the track memory 599 $("#sonaar-player .sonaar_wave_cut, .sr_selectedPlayer .album-player .sonaar_wave_cut, .sr_selectedPlayer .current .sonaar_wave_cut, #sonaar-player .mobileProgressing").width(0); 600 } 601 var trackHasEnded = document.getElementById("sonaar-audio").ended; 602 var isPlaying = !document.getElementById("sonaar-audio").paused; 603 $("#sonaar-audio").attr("src", this.list.tracks[this.currentTrack].mp3); //Load Audio MediaElement to the Sticky player 604 $("#sonaar-audio").attr("title", currentTrackTitle); //set title for analytics reports (eg: matomo) 605 //document.getElementById("sonaar-audio").crossOrigin = "anonymous"; 606 document.getElementById("sonaar-audio").load(); 607 if ($(".sr_selectedPlayer").length || isPlaying || trackHasEnded) { 608 // if the sticky player is sync with a widget player OR is already playing 609 this.playAudio(); 610 $("#sonaar-player .play").addClass("audio-playing"); 611 } 612 this.classes.waveEnable = true; 613 IRON.audioPlayer.checkArtWorkFullBg(this.selectedPlayer, false); 614 615 616 if (IRON.players.length != 0 && this.selectedPlayer != null) { //If Widget Player is selected 617 IRON.createFakeWave(this.selectedPlayer); 618 } 619 IRON.createFakeWave(false, true); 620 621 $(document).trigger("sonaarStats", $("#sonaar-player")); 622 if (IRON.players.length != 0 && this.classes.feedUrl && !this.elWidgetId && this.audioplayerPlaying != null) { 623 //Set "elWidgetId" only when the playlist is built with the elementor widget 624 this.elWidgetId = $(IRON.players[this.audioplayerPlaying].audioPlayer).parents(".elementor-widget-music-player").attr("data-id"); 625 } 626 627 628 629 if (this.classes.continuousPlayer) { 630 sr_setCookieSettings(); 631 } 632 633 634 function ifHaveStoreContent() { //Check if the current player has store-content in the store list 635 let value = false; 636 $.each(IRON.sonaar.player.list.tracks, function () { 637 if (typeof (this.song_store_list) != 'undefined') { 638 $.each(this.song_store_list, function () { 639 if (typeof (this['store-content']) != 'undefined') { 640 value = true; 641 } 642 }); 643 }; 644 }); 645 return value; 646 } 647 if (ifHaveStoreContent()) { //Load Modal reurired for store content popup 648 sr_setPopUp(); 649 } 650 651 this.seekTime(srp_seekTime); 652 653 IRON.audioPlayer.sr_loadLyricsAjax(this.list.tracks[this.currentTrack].sourcePostID, this.list.tracks[this.currentTrack].track_pos); 654 document.getElementById("sonaar-audio").playbackRate = IRON.sonaar.player.classes.speedRate;//set SpeedRate 655 656 //set time from memory 657 if(typeof IRON.sonaar.player.selectedPlayer?.find('.sr-playlist-item').eq(this.currentTrack).data('current-time') != 'undefined'){ 658 sr_setTrackCurrentTime(IRON.sonaar.player.selectedPlayer.find('.sr-playlist-item').eq(this.currentTrack).data('current-time')); 659 } 660 }, 661 clickPlayer: function () { 662 if (!$('.control:hover').length) { 663 this.openMobileControl(); 664 } 665 }, 666 extendedScrolldown: function () { 667 const extendedPlayer = document.querySelector(".srp_extendedPlayer_scrolling_box") 668 if(extendedPlayer.scrollTop === 0){ 669 extendedPlayer.scrollTo({ 670 top: extendedPlayer.scrollTop + 200, 671 behavior: "smooth" 672 }); 673 } 674 }, 675 clickTrackList: function (index) { 676 if(this.currentTrack == index){ 677 this.play(); 678 }else{ 679 this.currentTrack = index; 680 this.playAudio(); 681 } 682 }, 683 /*Close and Open the sticky mobile control Panel*/ 684 /* the "cmd" parameter can be use if we only want to "open" or "close" the panel. By default it is toggling between each state.*/ 685 openMobileControl: function (cmd = false) { 686 if ( this.isSmallDevice ) { 687 this.extendedPlayerOpened = true; 688 $('body').addClass('srp_sticky_ext_opened'); 689 } 690 }, 691 setshowList: function () { 692 if (this.showList == false) { 693 $("#pusher-wrap").addClass("sonaar-list-active"); 694 return (this.showList = true); 695 } 696 $("#pusher-wrap").removeClass("sonaar-list-active"); 697 return (this.showList = false); 698 }, 699 setPlayerType: function () { 700 this.list.type = sonaar_music.option.player_type; //from plugin settings 701 if (this.audioplayerPlaying != null) { 702 this.list.type = IRON.players[this.audioplayerPlaying].audioPlayer.playerType; //from widget 703 } 704 if (srp_vars.sonaar_music.post_player_type != '' && srp_vars.sonaar_music.post_player_type != 'default') { 705 this.list.type = srp_vars.sonaar_music.post_player_type //from playlist post settings selected in the page settings 706 } 707 }, 708 closePlayer: function () { 709 if (this.showList) { 710 $("#pusher-wrap").removeClass("sonaar-list-active"); 711 this.showList = false;
712 } 713 this.minimize = !this.minimize; 714 this.classes.enable = !this.classes.enable; 715 this.animatePlayer(); 716 }, 717 extendedPlayerClickOutside: function () { 718 if($('.srp_extendedPlayer > *:hover').length == 0){ 719 this.closeExtendedPlayer() 720 } 721 }, 722 closeExtendedPlayer: function () { 723 this.extendedPlayerOpened = false; 724 $('body').removeClass('srp_sticky_ext_opened'); 725 }, 726 openExtendedPlayerOverlay: function () { 727 this.extendedPlayerOverlayOpened = true; 728 }, 729 closeExtendedPlayerOverlay: function () { 730 this.extendedPlayerOverlayOpened = false; 731 }, 732 getIndexFromStoreList: function (store, inputName, storeList) { 733 const valueToSearch = store[inputName]; 734 var index = -1; //Default 735 for (var i = 0; i < storeList.length; i++) { 736 if (storeList[i][inputName] === valueToSearch) { 737 index = i; 738 return index; 739 } 740 } 741 return index; 742 }, 743 744 745 playlistAfterEnter: function () { 746 var ps = new PerfectScrollbar("#sonaar-player .playlist .scroll", { 747 wheelSpeed: 0.7, 748 swipeEasing: true, 749 wheelPropagation: false, 750 minScrollbarLength: 20, 751 suppressScrollX: true, 752 }); 753 /*$('#sonaar-player .playlist .scroll').perfectScrollbar({ 754 'suppressScrollX': true 755 })*/ 756 }, 757 scroll: function (event) { 758 var el = event.target; 759 var parent = el.offsetParent; 760 761 if (el.offsetWidth > parent.offsetWidth && !el.classList.contains("scrolling")) { 762 el.classList.add("scrolling"); 763 var transformWidth = el.offsetWidth + 10; 764 el.insertAdjacentHTML("beforeend", '<span class="duplicate">' + el.innerText + "</span>"); 765 el.style.transform = "translate( -" + transformWidth + "px )"; 766 setTimeout(function () { 767 el.classList.remove("scrolling"); 768 el.style.transform = ""; 769 el.removeChild(el.firstElementChild); 770 }, 6000); 771 } 772 }, 773 updatePlayers: function () { 774 $(".iron-audioplayer").removeClass("audio-playing"); 775 776 if (IRON.players.length != 0 && this.selectedPlayer != null) { //If Widget Player is selected 777 778 this.selectedPlayer.find("li.current").removeClass("current"); 779 780 if (this.isPlaying) { 781 var currentTrackPlaying = this.currentTrack; 782 //var currentTrackTitle; 783 this.selectedPlayer.addClass("audio-playing"); 784 this.selectedPlayer.find('.currentTime, .totalTime').show(); 785 this.selectedPlayer.find(".sr-playlist-item").eq(currentTrackPlaying).addClass("current"); 786 787 if (this.selectedPlayer.data('hide-artwork') != '1' && this.selectedPlayer.data('hide-artwork') != 'true' && typeof this.selectedPlayer.data('albumart') == 'undefined') { 788 if (this.list.tracks[this.currentTrack].poster == '') { 789 this.selectedPlayer.addClass('sonaar-no-artwork'); 790 } else { 791 this.selectedPlayer.removeClass('sonaar-no-artwork'); 792 this.selectedPlayer.find('.album-art img').attr("src", this.selectedPlayer.find(".sr-playlist-item").eq(currentTrackPlaying).data('albumart') ); 793 } 794 srp_getColorsFromImage(this.selectedPlayer, this.selectedPlayer.find(".sr-playlist-item").eq(currentTrackPlaying).data('albumart')) 795 } 796 //currentTrackTitle = this.selectedPlayer.find(".sr-playlist-item").eq(this.currentTrack).attr("data-tracktitle"); 797 IRON.audioPlayer.updateMiniPlayer(this.selectedPlayer, this.selectedPlayer.find(".sr-playlist-item").eq(this.currentTrack)); 798 /* if (this.audioplayerPlaying != null) { 799 $(IRON.players[this.audioplayerPlaying].audioPlayer).find(".track-title").html(currentTrackTitle); 800 }*/ 801 } 802 } 803 if (this.selectedTimeStamp != null) { //If Time Stamp shortcode is selected 804 $('.srmp3_sonaar_ts_shortcode').removeClass('audio-playing'); 805 if (this.isPlaying) { 806 this.selectedTimeStamp.addClass('audio-playing'); 807 } 808 } 809 810 startAudioSpectrum(this.selectedPlayer); 811 IRON.setExtendedPlayerHeightVar(); 812 }, 813 814 scrollingProgressBar: function (event) { 815 var progressedAudio = event.target.clientWidth / event.touches[0].clientX; 816 document.getElementById("sonaar-audio").currentTime = document.getElementById("sonaar-audio").duration / progressedAudio; 817 }, 818 819 setSlideVolume: function () { 820 sr_initSlider($(this.$el).find(".volume .slide")); 821 }, 822 823 showCTA: function () { 824 if ($("#sonaar-player.enable .store").hasClass("opened")) { 825 $("#sonaar-player.enable .store").removeClass("opened"); 826 } else { 827 $("#sonaar-player.enable .store").addClass("opened"); 828 } 829 }, 830 831 setRandomList: function () { 832 //If the player is selected set the currentTrack to the first track of the random list set firstTrackIndex to the currentTrack value. Otherwise set firstTrackIndex to
832null. 833 firstTrackIndex = (typeof IRON.sonaar.player.selectedPlayer != 'undefined' && IRON.sonaar.player.selectedPlayer != null)? IRON.sonaar.player.selectedPlayer.data('currentTrack') : null; 834 this.list.random_order = IRON.audioPlayer.setRandomList(this.list.tracks, firstTrackIndex); 835 }, 836 837 setIsPlaying: function (value) { 838 this.isPlaying = value; 839 if (this.classes.continuousPlayer) { 840 sr_setCookieSettings(); 841 } 842 }, 843 844 handleTrackChange: function () { //This function is automatically triggered when the currentTrack value is changed. 845 //console.log('handleTrackChange', this.selectedPlayer.currentTrack, this.currentTrack); 846 847 IRON.favorites.setStickyFavButtons(); 848 IRON.swiper.update(IRON.sonaar.player.selectedPlayer, IRON.sonaar.player.currentTrack); 849 IRON.getIceCastInfo(IRON.sonaar.player.selectedPlayer); 850 this.isPlaying = false; 851 this.classes.waveEnable = false; 852 853 854 855 856 if (this.selectedPlayer) { 857 this.selectedPlayer.currentTrack = this.currentTrack; 858 } 859 860 /*Convert html entities to string. Eg: ' to ' */ 861 if(typeof this.currentTrack != 'undefined' && typeof this.list.tracks[this.currentTrack].track_title != 'undefined'){ 862 const txt = document.createElement('textarea'); 863 txt.innerHTML = this.list.tracks[this.currentTrack].track_title; 864 this.list.tracks[this.currentTrack].track_title = txt.value; 865 } 866 867 this.setAudio(); 868 869 870 871 IRON.init_generatePeaks(); 872 873 this.updatePlayers(); 874 }, 875 876 animatePlayer: function () { 877 //animation when we click on the close button or when the player is loaded 878 if (this.classes.continued) { 879 if (this.minimize) { 880 $("#sonaar-player").css("bottom", '-' + ($('#sonaar-player').height() + 6) + 'px'); 881 }else{ 882 $("#sonaar-player").css("bottom", "0"); 883 } 884 this.classes.continued = false; 885 } else { 886 if (this.minimize) { 887 bottomPosition = '-' + ($('#sonaar-player').height() + 6) + 'px'; 888 } else { 889 bottomPosition = "0"; 890 } 891 // replace #sonaar-player sricon-down-arrow by sricon-up-arrow 892 893 $("#sonaar-player").animate({ 894 bottom: bottomPosition, 895 }); 896 } 897 }, 898 899 ctaClick: function (store, el) { 900 var storeIndex; 901 if (store['link-option'] == 'popup') { // Open Popup 902 storeIndex = this.getIndexFromStoreList(store, 'store-content', this.list.tracks[this.currentTrack].song_store_list ); 903 this.storePopUp(this.currentTrack, storeIndex, el) 904 } else if (store['has-variation'] == true && this.classes.wc_variation_lb) { // Open variation Lighbox 905 srp_variation_button(el, store['product-id']); 906 } else if (this.classes.wc_ajax_add_to_cart && store['has-variation'] == false) { // Ajax add to cart 907 srp_add_to_cart_loadspinner(el); 908 } 909 if(store['cta-class'] == 'srp-fav-bt'){ 910 storeIndex = this.getIndexFromStoreList(store, 'cta-class', this.list.tracks[this.currentTrack].optional_storelist_cta ); 911 IRON.favorites.clickStickyFavButton( storeIndex ); 912 } 913 if(store['make-offer-bt']){ 914 el = $(el).closest('a'); 915 srp_variation_button(el); 916 } 917 if(store['store-link']=='#srp_ask_email'){ 918 handleAskEmailClick($(el)); 919 } 920 }, 921 922 ifDownloadAttribute: function (store) { 923 if( 924 store['store-icon'] === 'fas fa-download' && store['link-option'] !== 'popup' && (typeof store['store-link'] != 'undefined' && !store['store-link']?.startsWith('#') || typeof store['store-link'] == 'undefined' ) && 925 (typeof store['download-attr'] == 'undefined' || typeof store['download-attr'] != 'undefined' && store['download-attr']) //dont set the download attribute if "condition NOT met" and force download CTA redirection is enabled 926 ){ 927 return ''; 928 }else{ 929 return false;
930 } 931 }, 932 933 storePopUp: function (trackNumber, storeNumber, el) { 934 const playlistPostId = this.list.tracks[trackNumber].sourcePostID; 935 let postTrackIndex = 0; 936 let postTrackCount = 0; 937 $.each(this.list.tracks, function (index) { 938 if (this.sourcePostID == playlistPostId) { 939 if (index == trackNumber) { 940 postTrackIndex = postTrackCount; 941 } 942 postTrackCount++ 943 } 944 }); 945 const storeId = postTrackIndex + '-' + storeNumber; 946 sr_popUp(playlistPostId, storeId, null, null, el) 947 }, 948 949 /* Re Order the tracklist when the sticky player plays a re-organized(filter/order) playlist by list.js */ 950 reOrderTacklist: function (playerIndex) { 951 if (!IRON.sonaar.player.list.tracks) 952 return; 953 954 let newTrackOrder = []; 955 $(IRON.players[playerIndex].audioPlayer.find('.sr-playlist-item')).each(function () { 956 mp3ToSeek = $(this).data('audiopath'); 957 titleToSeek = $(this).data('tracktitle'); 958 postIdToSeek = $(this).data('post-id'); 959 let trackFound = ''; 960 IRON.sonaar.player.list.tracks.forEach(function (e, i) { 961 962 e.mp3 = (typeof e.mp3 == 'string') ? e.mp3.replace(/&/g, '&') : e.mp3; 963 if (decodeURIComponent(e.mp3) == decodeURIComponent(mp3ToSeek) && srp_decodeHTMLEntities(titleToSeek).includes(srp_decodeHTMLEntities(e.track_title)) && postIdToSeek == e.sourcePostID ) { 964 trackFound = IRON.sonaar.player.list.tracks[i]; 965 trackFound['track_index'] = i; //useful for the continuous player. 966 newTrackOrder.push(trackFound); 967 } 968 }) 969 }) 970 971 if( newTrackOrder.length ){ 972 IRON.sonaar.player.list.tracks = newTrackOrder 973 } 974 }, 975 unsyncWidgetPlayers: function () { 976 IRON.sonaar.player.selectedPlayer = null; 977 $('.sr_selectedPlayer').removeClass('sr_selectedPlayer audio-playing'); 978 IRON.sonaar.player.playlistID = null; 979 }, 980 }, 981 982 computed: { 983 templateType: function () { 984 return "sr-" + this.classes.template; 985 }, 986 setWaveHeight: function () { 987 if (this.classes.template == 'mini_fullwidth') { 988 return '27'; 989 } else { 990 return '40'; 991 } 992 }, 993 floatPos: function () { 994 return "sr-pos--" + this.classes.floatpos; 995 }, 996 showControlsHover: function () { 997 if (this.classes.show_controls_hover === "true") { 998 return "sr-show_controls_hover"; 999 } 1000 }, 1001 isDraggable: function () { 1002 if (sonaar_music.option.make_draggable === "true") { 1003 return "sr-draggable"; 1004 } 1005 }, 1006 stickyProgressBar: function () { 1007 if (sonaar_music.option.sticky_hide_progress_bar === "true") { 1008 return false; 1009 } else { 1010 return true; 1011 } 1012 }, 1013 classType: function () { 1014 return "list-type-" + this.list.type; 1015 }, 1016 playerCallToAction: function () { 1017 if (this.list.type == "podcast") { 1018 return this.list.tracks[this.currentTrack].podcast_calltoaction; 1019 } else { 1020 return this.list.tracks[this.currentTrack].song_store_list; 1021 } 1022 }, 1023 albumStoreList: function () { 1024 var song_store = this.list.tracks[this.currentTrack].song_store_list; 1025 var album_store = this.list.tracks[this.currentTrack].album_store_list; 1026 var optional_cta = this.list.tracks[this.currentTrack].optional_storelist_cta; 1027 1028 if (this.selectedPlayer) { 1029 // For dynamic visiblity buttons. Check if optional CTA is available in the current track. If not, remove it from the array, otherwise change the href to reflect the current track button href. 1030 var $currentTrackfromWidget = this.selectedPlayer.find(".sr-playlist-item").eq(this.currentTrack); 1031 //check if $currentTrackfromWidget exists 1032 if ($currentTrackfromWidget.length > 0) { 1033 1034 var storeElements = $currentTrackfromWidget[0].querySelectorAll('.song-store-list-container .song-store'); 1035 var domDataArray = [];
1036 storeElements.forEach(function(storeElement) { 1037 // if class is includes srp-fav-bt or sr_store_force_share_bt or sr_store_force_dl_bt or sr_store_force_pl_bt and is not part of optional_cta, maybe its set by the shortcode 1038 var classAttribute = storeElement.getAttribute('class'); 1039 // Check if class includes any of the specified strings 1040 var shouldInclude = ['srp-fav-bt', 'sr_store_force_share_bt', 'sr_store_force_dl_bt', 'sr_store_force_pl_bt'].some(str => classAttribute.includes(str)); 1041 // Breakdown classAttribute into individual classes 1042 var classList = classAttribute.split(' '); 1043 // Check if any class from classList is part of optional_cta 1044 var isInOptionalCta = (optional_cta) ? classList.some(cls => optional_cta.some(item => item['cta-class'] === cls)) : ''; 1045 1046 // Only proceed if the class is one of the desired ones and not in optional_cta 1047 if (shouldInclude && !isInOptionalCta) { 1048 // Extract data for each store 1049 var storeData = { 1050 "store-icon": storeElement.querySelector('i').className, 1051 "store-link": storeElement.getAttribute('href'), 1052 "store-name": storeElement.getAttribute('title'), 1053 "store-target": storeElement.getAttribute('target'), 1054 "cta-class": storeElement.getAttribute('class') 1055 .replace('song-store', '') // Remove 'song-store' 1056 .replace('sr_store_wc_round_bt', '') // Remove 'sr_store_wc_round_bt' 1057 .replace('srp_hidden', '') // Remove 'srp_hidden' if it exists 1058 .trim(), // Trim any extra spaces 1059 "show-label": storeElement.querySelector('.srp_cta_label') !== null, 1060 "download-attr": (storeElement.getAttribute('download') === null)? false : true, 1061 }; 1062 1063 domDataArray.push(storeData); 1064 }; 1065 }); 1066 1067 if (Array.isArray(optional_cta)) { 1068 optional_cta.forEach(function (ctaItem) { 1069 $trackButton = $currentTrackfromWidget.find('.' + ctaItem['cta-class']); 1070 if( $trackButton.length === 0 ){ 1071 //remove this item from this array 1072 optional_cta.splice(optional_cta.indexOf(ctaItem), 1); 1073 } 1074 if( $trackButton.length === 1 ){ 1075 // modify the store-link 1076 ctaItem['store-link'] = $trackButton.attr('href'); 1077 } 1078 }); 1079 } 1080 } 1081 }; 1082 var storesObjects = []; 1083 if (song_store.length < 1 || song_store.length === false) { 1084 storesObjects = album_store !== undefined ? album_store : []; 1085 } else { 1086 storesObjects = album_store === false ? song_store : song_store.concat(album_store); 1087 } 1088 1089 if (!Array.isArray(storesObjects)) { 1090 storesObjects = []; 1091 } 1092 1093 if (Array.isArray(domDataArray)) { // Only concat if domDataArray is an array 1094 storesObjects = storesObjects.concat(domDataArray); 1095 } 1096 if(typeof optional_cta != 'undefined' && optional_cta !== false){ 1097 if( storesObjects !== false ){ 1098 storesObjects = storesObjects.concat(optional_cta); 1099 }else{ 1100 storesObjects = optional_cta; 1101 } 1102 } 1103 storeButtonCount = storesObjects.length; 1104 1105 return storesObjects; 1106 }, 1107 hasArtwork: function () { 1108 var strURL = (typeof this.list.tracks[this.currentTrack] != 'undefined')? this.list.tracks[this.currentTrack].poster : false; 1109 if (strURL != null && strURL != false) { 1110 return !strURL.endsWith("default.png"); 1111 }else{ 1112 return false; 1113 } 1114 }, 1115 1116 playLabelButton: function () { 1117 return this.isPlaying ? srp_vars.sonaar_music.play_button_label.pause : srp_vars.sonaar_music.play_button_label.play; 1118 }, 1119 playListTitle: function () { 1120 if (this.selectedPlayer && this.selectedPlayer.attr("data-playlist_title").length) { 1121 this.list.playlist_name = this.selectedPlayer.attr("data-playlist_title"); 1122 } 1123 if (this.list.playlist_name == "") { 1124 return this.list.tracks[this.currentTrack].album_title; 1125 } else { 1126 return this.list.playlist_name; 1127 } 1128 }, 1129 outputTrackDescription: function () { 1130 if(this.classes.display_description){ 1131 return this.list.tracks[this.currentTrack].description; 1132 }else{ 1133 return false;
1134 } 1135 }, 1136 sr_countUIitems: function () { 1137 let countItem = 1; 1138 if (this.list.tracks.length > 1 && this.classes.show_nextprevious_bt) { 1139 countItem++; 1140 } 1141 if (this.list.tracks.length > 1 && this.classes.show_tracklist_bt) { 1142 countItem++; 1143 } 1144 if (this.list.tracks.length >= 1 && this.albumStoreList.length >= 1) { 1145 countItem++; 1146 } 1147 return (countItem); 1148 }, 1149 }, 1150 mounted: function () { 1151 this.$nextTick(function () { 1152 IRON.sonaar.player.hasPlayed = false; 1153 $("#sonaar-audio").on("ended", function () { 1154 if(IRON.sonaar.player.selectedPlayer){ 1155 IRON.setTracksTimeMemories(IRON.sonaar.player.selectedPlayer, 0, true); //Reset the track time memory when the track is ended 1156 IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].hasCompleted = true 1157 IRON.sonaar.player.selectedPlayer.list.tracks[IRON.sonaar.player.currentTrack].hasCompleted = true; 1158 } 1159 if(IRON.repeatStatus !== false){ 1160 if( IRON.sonaar.player.repeatStatus === 'track' && IRON.sonaar.player.classes.notrackskip !== "on"){ 1161 IRON.sonaar.player.currentTime = 0; 1162 IRON.sonaar.player.playAudio(); 1163 return; 1164 } 1165 1166 if(IRON.sonaar.player.currentTrack + 1 >= IRON.sonaar.player.list.tracks.length && IRON.sonaar.player.repeatStatus !== 'playlist'){ 1167 return; 1168 } 1169 } 1170 1171 if (IRON.sonaar.player.classes.notrackskip !== "on") { 1172 IRON.sonaar.player.hasPlayed = true; 1173 IRON.sonaar.player.next(); 1174 } 1175 1176 }); 1177 1178 $("#sonaar-audio").on("timeupdate", function () { 1179 const duration = (this.duration == 'Infinity')? this.buffered.end(this.buffered.length-1) : this.duration; 1180 $("#sonaar-player .sonaar_wave_cut, .sr_selectedPlayer .album-player .sonaar_wave_cut, .sr_selectedPlayer .current .sonaar_wave_cut, #sonaar-player .mobileProgressing").width(((this.currentTime + 0.35) / duration) * 100 + "%"); 1181 $("#sonaar-player .progressDot").css("left", (this.currentTime / duration) * 100 + "%"); 1182 var sonaarAudio = document.getElementById("sonaar-audio"); 1183 var currentTime = sonaarAudio.currentTime; 1184 var time = moment.duration(currentTime, "seconds"); 1185 // Update the Sticky player currentTime 1186 if (time.hours() >= 12 || time.hours() <= 0) { 1187 IRON.sonaar.player.currentTime = moment(time.minutes() + ":" + time.seconds(), "m:s").format("mm:ss"); 1188 } else { 1189 IRON.sonaar.player.currentTime = moment(time.hours() + ":" + time.minutes() + ":" + time.seconds(), "h:m:s").format("h:mm:ss"); 1190 } 1191 1192 if (sonaarAudio.duration !== Infinity) { 1193 var timeLeft = moment.duration(sonaarAudio.duration - sonaarAudio.currentTime, "seconds"); 1194 // Update the Sticky player timeLeft 1195 if(timeLeft.milliseconds() > 0){ 1196 if ( timeLeft.hours() >= 12 || timeLeft.hours() <= 0 ) { 1197 IRON.sonaar.player.totalTime = "-" + moment(timeLeft.minutes() + ":" + timeLeft.seconds(), "m:s").format("mm:ss"); 1198 } else { 1199 IRON.sonaar.player.totalTime = "-" + moment(timeLeft.hours() + ":" + timeLeft.minutes() + ":" + timeLeft.seconds(), "h:m:s").format("h:mm:ss"); 1200 } 1201 }else{ 1202 IRON.sonaar.player.totalTime = "" 1203 } 1204 } else { 1205 IRON.sonaar.player.totalTime = ""; 1206 } 1207 1208 IRON.audioPlayer.karaokeMode($(".sr_selectedPlayer"), this.currentTime); 1209 $(".sr_selectedPlayer .currentTime").html(IRON.sonaar.player.currentTime); // Update the widget player currentTime 1210 $(".sr_selectedPlayer .totalTime").html(IRON.sonaar.player.totalTime); // Update the widget player timeLeft 1211 sr_setCookieTime(); 1212 if(IRON.sonaar.player.selectedPlayer){ 1213 IRON.setTracksTimeMemories(IRON.sonaar.player.selectedPlayer); 1214 } 1215 }); 1216 1217 $("#sonaar-audio").on( 1218 "play", 1219 function () { 1220 this.playerStatus = "play"; 1221 this.setIsPlaying(true); 1222 }.bind(this) 1223 ); 1224 1225 $("#sonaar-audio").on( 1226 "pause", 1227 function () { 1228 this.setIsPlaying(false); 1229 this.userPref.pause = true; 1230 }.bind(this) 1231 ); 1232 1233 1234 this.frequencyData = new Uint8Array(170); 1235 this.setSlideVolume(); 1236 }); 1237 }, 1238 watch: { 1239 currentTrack: function () { 1240 if( typeof this.classes.preventHandleTrackChange != 'undefined' && this.classes.preventHandleTrackChange == true ){ 1241 this.classes.preventHandleTrackChange = false; //set preventHandleTrackChange to true if we dont wanna trigger the handleTrackChange function: used for Favorite feature 1242 return; 1243 } 1244 1245 this.handleTrackChange(); 1246 }, 1247 isPlaying: function () { 1248 this.updatePlayers(); 1249 }, 1250 minimize: function () { 1251 if (this.classes.continuousPlayer) {
1252 sr_setCookieSettings(); 1253 } 1254 this.userPref.minimize = this.minimize; 1255 if (this.minimize) { 1256 $("body").removeClass("continuousPlayer-enable"); 1257 } else { 1258 $("body").addClass("continuousPlayer-enable"); 1259 } 1260 }, 1261 }, 1262 }), 1263}; 1264if (window.matchMedia('(min-width: 861px)').matches) { 1265 $('#sonaar-player.sr-float .player.sr-draggable').draggable(); 1266 $('#sonaar-player.sr-float .player.sr-draggable').css('cursor', 'grab'); 1267} 1268 1269/*FLOAT template, extra JQuery*/ 1270$('#sonaar-player.sr-float .player.sr-show_controls_hover').hover(function () { 1271 let playerWidth = $(this).outerWidth() + $(this).find('.player-row .control').outerWidth() + $(this).find('.volume').outerWidth(); 1272 playerWidth = ($(this).find('.sonaar-extend-button').length) ? playerWidth + $(this).find('.sonaar-extend-button').outerWidth() : playerWidth; 1273 $(this).width(playerWidth); 1274 1275}, function () { 1276 $(this).width(342) 1277});
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.