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