j1-template 2024.3.20 → 2024.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/_layouts/page.html +1 -0
  3. data/assets/data/amplitude_app.html +28 -23
  4. data/assets/theme/j1/adapter/js/amplitude.js +590 -354
  5. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.css +41 -1
  6. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.min.css +1 -1
  7. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.css +190 -403
  8. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.min.css +1 -2
  9. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.css +36 -33
  10. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.min.css +1 -1
  11. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/mini.css +72 -9
  12. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/mini.min.css +2 -1
  13. data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.js +36 -24
  14. data/lib/j1/version.rb +1 -1
  15. data/lib/starter_web/README.md +5 -5
  16. data/lib/starter_web/_config.yml +1 -1
  17. data/lib/starter_web/_data/modules/amplitude_app.yml +4 -4
  18. data/lib/starter_web/_data/modules/amplitude_playlists.yml +44 -44
  19. data/lib/starter_web/_data/modules/defaults/amplitude.yml +7 -4
  20. data/lib/starter_web/_data/modules/swiper_app.yml +67 -0
  21. data/lib/starter_web/_data/modules/swiper_playlists.yml +26 -0
  22. data/lib/starter_web/_data/templates/feed.xml +1 -1
  23. data/lib/starter_web/_includes/attributes.asciidoc +5 -4
  24. data/lib/starter_web/_plugins/index/lunr.rb +1 -1
  25. data/lib/starter_web/assets/image/icon/bokeh/bokeh-32x32.ico +0 -0
  26. data/lib/starter_web/assets/image/icon/bokeh/bokeh.ico +0 -0
  27. data/lib/starter_web/assets/image/icon/bokeh/logo-160x160.png +0 -0
  28. data/lib/starter_web/assets/image/icon/hyvor-talk/hyvore-talk.ico +0 -0
  29. data/lib/starter_web/assets/image/icon/hyvor-talk/jpg/hyvor-logo.512x512.jpg +0 -0
  30. data/lib/starter_web/assets/image/icon/hyvor-talk/png/hyvor-logo.24x24.jpg +0 -0
  31. data/lib/starter_web/assets/image/icon/hyvor-talk/png/hyvor-logo.24x24.png +0 -0
  32. data/lib/starter_web/assets/image/icon/hyvor-talk/png/hyvor-logo.512x512.png +0 -0
  33. data/lib/starter_web/assets/image/icon/hyvor-talk/scalable/hyvor-logo.svg +81 -0
  34. data/lib/starter_web/assets/image/icon/jupyter/jupyter-32x32.ico +0 -0
  35. data/lib/starter_web/assets/image/icon/jupyter/jupyter.ico +0 -0
  36. data/lib/starter_web/assets/image/icon/jupyter/logo.png +0 -0
  37. data/lib/starter_web/assets/image/icon/mdi/mdi.svg +1 -0
  38. data/lib/starter_web/assets/image/icon/mdi/mdil.svg +1 -0
  39. data/lib/starter_web/assets/image/icon/scalable/facebook.svg +34 -0
  40. data/lib/starter_web/assets/image/icon/scalable/google.svg +35 -0
  41. data/lib/starter_web/assets/image/icon/scalable/ibm.svg +24 -0
  42. data/lib/starter_web/assets/image/icon/scalable/microsoft.svg +42 -0
  43. data/lib/starter_web/assets/image/module/swiper/simple/test/image/diana_krall.jpg +0 -0
  44. data/lib/starter_web/index.html +3 -3
  45. data/lib/starter_web/package.json +1 -1
  46. data/lib/starter_web/pages/public/learn/where_to_go.adoc +1 -1
  47. data/lib/starter_web/pages/public/tools/previewer/preview_amplitudejs.adoc +3 -18
  48. data/lib/starter_web/pages/public/tools/tester/app_tester_amplitudejs_yt.adoc +6 -6
  49. data/lib/starter_web/pages/public/tools/tester/app_tester_swiper.adoc +87 -0
  50. data/lib/starter_web/pages/public/tour/_includes/attributes.asciidoc +3 -3
  51. data/lib/starter_web/pages/public/tour/{play_audio.adoc → audio_data.adoc} +30 -55
  52. data/lib/starter_web/pages/public/tour/{present_images.adoc → image_data.adoc} +4 -5
  53. data/lib/starter_web/pages/public/tour/{play_video.adoc → video_data.adoc} +17 -16
  54. metadata +25 -5
@@ -6,7 +6,7 @@ regenerate: true
6
6
 
7
7
  {% comment %}
8
8
  # -----------------------------------------------------------------------------
9
- # ~/assets/theme/j1/adapter/js/amplitude.38.js
9
+ # ~/assets/theme/j1/adapter/js/amplitude.40.js
10
10
  # Liquid template to adapt J1 AmplitudeJS Apps
11
11
  #
12
12
  # Product/Info:
@@ -63,7 +63,7 @@ regenerate: true
63
63
 
64
64
  /*
65
65
  # -----------------------------------------------------------------------------
66
- # ~/assets/theme/j1/adapter/js/amplitude.38.js
66
+ # ~/assets/theme/j1/adapter/js/amplitude.40.js
67
67
  # J1 Adapter for the amplitude module
68
68
  #
69
69
  # Product/Info:
@@ -164,27 +164,29 @@ j1.adapter.amplitude = ((j1, window) => {
164
164
  var playersHtmlLoaded = false;
165
165
  var processingPlayersFinished = false;
166
166
 
167
- var playerSongElementHeigthDesktop = {{amplitude_defaults.player.song_element_heigt_desktop}};
168
- var playerSongElementHeigthMobile = {{amplitude_defaults.player.song_element_heigth_mobile}};
169
- var playerAutoScrollSongElement = {{amplitude_defaults.player.player_auto_scroll_song_element}};
170
-
171
167
  var playerAudioInfo = ('{{amplitude_defaults.playlist.audio_info}}' === 'true') ? true : false;
172
168
  var playerDefaultPluginManager = ('{{amplitude_defaults.player.plugin_manager.enabled}}' === 'true') ? true : false;
173
169
  var playerDefaultType = '{{amplitude_defaults.player.type}}';
174
- var playerVolumeValue = '{{amplitude_defaults.player.volume_slider.preset_value}}';
175
- var playerVolumeSliderStep = '{{amplitude_defaults.player.volume_slider.slider_step}}';
176
- var playerRepeat = ('{{amplitude_defaults.player.repeat}}' === 'true') ? true : false;
177
- var playerShuffle = ('{{amplitude_defaults.player.shuffle}}' === 'true') ? true : false;
170
+ var playerDefaultVolume = {{amplitude_defaults.player.volume_slider.preset_value}};
171
+ var playerVolumeSliderStep = {{amplitude_defaults.player.volume_slider.slider_step}};
172
+ var playerRepeat = ('{{amplitude_defaults.player.player_repeat}}' === 'true') ? true : false;
173
+ var playerShuffle = ('{{amplitude_defaults.player.player_shuffle}}' === 'true') ? true : false;
178
174
  var playerPlayNextTitle = ('{{amplitude_defaults.player.play_next_title}}' === 'true') ? true : false;
179
175
  var playerPauseNextTitle = ('{{amplitude_defaults.player.pause_next_title}}' === 'true') ? true : false;
180
- var playerDelayNextTitle = '{{amplitude_defaults.player.delay_next_title}}';
181
- var playerForwardBackwardSkipSeconds = '{{amplitude_defaults.player.forward_backward_skip_seconds}}';
176
+ var playerDelayNextTitle = {{amplitude_defaults.player.delay_next_title}};
177
+ var playerForwardBackwardSkipSeconds = {{amplitude_defaults.player.forward_backward_skip_seconds}};
178
+
179
+ var playerSongElementHeigthMobile = {{amplitude_defaults.player.song_element_heigth_mobile}};
180
+ var playerSongElementHeigthDesktop = {{amplitude_defaults.player.song_element_heigt_desktop}};
181
+ var playerScrollerSongElementMin = {{amplitude_defaults.player.player_scroller_song_element_min}};
182
+ var playerScrollControl = {{amplitude_defaults.player.player_scroll_control}};
183
+ var playerAutoScrollSongElement = {{amplitude_defaults.player.player_auto_scroll_song_element}};
182
184
 
183
185
  // AmplitudeJS settings curently NOT used
184
186
  // ---------------------------------------------------------------------------
185
- var playerWaveformsEnabled = '{{amplitude_defaults.player.waveforms.enabled}}';
186
- var playerWaveformsSampleRate = '{{amplitude_defaults.player.waveforms.sample_rate}}';
187
- var playerVisualizationEnabled = '{{amplitude_defaults.player.visualization.enabled}}';
187
+ var playerWaveformsEnabled = {{amplitude_defaults.player.waveforms.enabled}};
188
+ var playerWaveformsSampleRate = {{amplitude_defaults.player.waveforms.sample_rate}};
189
+ var playerVisualizationEnabled = {{amplitude_defaults.player.visualization.enabled}};
188
190
  var playerVisualizationName = '{{amplitude_defaults.player.visualization.name}}';
189
191
 
190
192
  // ---------------------------------------------------------------------------
@@ -217,6 +219,11 @@ j1.adapter.amplitude = ((j1, window) => {
217
219
  amplitudePlaylists = $.extend({}, {{amplitude_playlists | replace: 'nil', 'null' | replace: '=>', ':' }});
218
220
  amplitudeOptions = $.extend(true, {}, amplitudeDefaults, amplitudePlayers, amplitudePlaylists);
219
221
 
222
+ // save AJS player setiings for later use (e.g. the AJS plugins)
223
+ // j1.adapter.amplitude['amplitudeDefaults'] = amplitudeDefaults;
224
+ // j1.adapter.amplitude['amplitudeSettings'] = amplitudeSettings;
225
+ // j1.adapter.amplitude['amplitudeOptions'] = amplitudeOptions;
226
+
220
227
  // -----------------------------------------------------------------------
221
228
  // control|logging settings
222
229
  // -----------------------------------------------------------------------
@@ -230,8 +237,8 @@ j1.adapter.amplitude = ((j1, window) => {
230
237
  j1.adapter.amplitude.data.ytPlayers = {};
231
238
 
232
239
  // (initial) YT player data for later use (e.g. events)
240
+ j1.adapter.amplitude.data.playerSongElementHeigth = playerSongElementHeigthDesktop;
233
241
  j1.adapter.amplitude.data.activePlayer = 'not_set';
234
- j1.adapter.amplitude.data.playerSongElementHeigth = 'not_set';
235
242
  j1.adapter.amplitude.data.atpGlobals.activePlayerType = 'not_set';
236
243
  j1.adapter.amplitude.data.atpGlobals.ytpInstalled = false;
237
244
  j1.adapter.amplitude.data.ytpGlobals.activePlayerType = 'not_set';
@@ -252,8 +259,10 @@ j1.adapter.amplitude = ((j1, window) => {
252
259
  logger.debug('\n' + 'module state: ' + _this.getState());
253
260
  logger.info('\n' + 'module is being initialized');
254
261
 
255
- // set default viewport setting
256
- j1.adapter.amplitude.data.playerSongElementHeigth = playerSongElementHeigthDesktop;
262
+ // window.addEventListener('resize',(e)=>{
263
+ // console.log( `resize: width: ${e.target.visualViewport.width}px`);
264
+ // console.log( `resize: height: ${e.target.visualViewport.height}px`);
265
+ // });
257
266
 
258
267
  // -------------------------------------------------------------------
259
268
  // create global playlist (songs)
@@ -292,20 +301,20 @@ j1.adapter.amplitude = ((j1, window) => {
292
301
  // initialize viewPort specific (GLOBAL) settings
293
302
  $(window).bind('resizeEnd', function() {
294
303
  var viewPortSize = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
295
- //do something, window hasn't changed size in 500ms
296
- if (viewPortSize > 578) {
297
- j1.adapter.amplitude.data.playerSongElementHeigth = playerSongElementHeigthDesktop;
298
- } else {
299
- j1.adapter.amplitude.data.playerSongElementHeigth = playerSongElementHeigthMobile;
300
- }
304
+ //do something, window hasn't changed size in 500ms
305
+ if (viewPortSize > 578) {
306
+ j1.adapter.amplitude.data.playerSongElementHeigth = playerSongElementHeigthDesktop;
307
+ } else {
308
+ j1.adapter.amplitude.data.playerSongElementHeigth = playerSongElementHeigthMobile;
309
+ }
301
310
  });
302
311
 
303
312
  $(window).resize(function() {
304
- if(this.resizeTO) clearTimeout(this.resizeTO);
305
- this.resizeTO = setTimeout(function() {
306
- $(this).trigger('resizeEnd');
307
- }, 500);
308
- });
313
+ if (this.resizeTO) clearTimeout(this.resizeTO);
314
+ this.resizeTO = setTimeout(function() {
315
+ $(this).trigger('resizeEnd');
316
+ }, 500);
317
+ });
309
318
 
310
319
  clearInterval(dependencies_met_page_ready);
311
320
  } // END pageVisible
@@ -354,7 +363,10 @@ j1.adapter.amplitude = ((j1, window) => {
354
363
  continue;
355
364
  } else if (key === 'rating') {
356
365
  song.rating = item[key];
357
- continue;
366
+ continue;
367
+ } else if (key === 'audio_single') {
368
+ song.audio_single = item[key];
369
+ continue;
358
370
  } else if (key === 'shuffle') {
359
371
  song.shuffle = item[key];
360
372
  continue;
@@ -479,6 +491,7 @@ j1.adapter.amplitude = ((j1, window) => {
479
491
  "end": "{{item.end}}",
480
492
  "shuffle": "{{item.shuffle}}",
481
493
  "duration": "{{item.duration}}",
494
+ "audio_single": "{{item.audio_single}}",
482
495
  // "audio_fade_in": "{{item.audio_fade_in}}",
483
496
  // "audio_fade_out": "{{item.audio_fade_out}}",
484
497
  "cover_art_url": "{{item.cover_image}}"
@@ -618,7 +631,7 @@ j1.adapter.amplitude = ((j1, window) => {
618
631
  // },
619
632
 
620
633
  continue_next: playerPlayNextTitle,
621
- volume: playerVolumeValue,
634
+ volume: playerDefaultVolume,
622
635
  volume_decrement: playerVolumeSliderStep,
623
636
  volume_increment: playerVolumeSliderStep
624
637
 
@@ -798,196 +811,186 @@ j1.adapter.amplitude = ((j1, window) => {
798
811
  } // END atpFadeAudioOut
799
812
 
800
813
  // -----------------------------------------------------------------------
801
- // onPlayerStateChange
814
+ // doNothingOnStateChange(state)
802
815
  //
803
- // update AT player on state change
816
+ // wrraper for states that are not processed
804
817
  // -----------------------------------------------------------------------
805
- function onPlayerStateChange(state) {
806
- var playerID, playlist, songs, songIndex, songIndex, trackID,
807
- songStart, songEnd, songStartSec, songEndSec,
808
- songStartTS, songEndTS, songMetaData, currentVolume,
809
- activeSongMetadata, fadeAudio;
810
-
811
- activeSongMetadata = Amplitude.getActiveSongMetadata();
818
+ function doNothingOnStateChange(state) {
819
+ var playlist, songMetaData, songIndex, trackID;
820
+
812
821
  playlist = Amplitude.getActivePlaylist();
813
- // playlist = activeSongMetadata.playlist
814
- playerID = playlist + '_large';
815
- songs = Amplitude.getSongsInPlaylist(playlist);
816
822
  songMetaData = Amplitude.getActiveSongMetadata();
817
823
  songIndex = songMetaData.index;
818
824
  trackID = songIndex + 1;
819
825
 
820
- if (state === AT_PLAYER_STATE.UNSTARTED) {
821
- // logger.debug('\n' + 'current audio state: unstarted');
822
- return;
823
- }
824
-
825
- if (state === AT_PLAYER_STATE.STOPPED) {
826
- logger.debug('\n' + 'audio player on playlist: ' + playlist + ' at trackID|state: ' + trackID + '|' + AT_PLAYER_STATE_NAMES[state]);
827
- return;
828
- }
826
+ logger.warn('\n' + `DO NOTHING on StateChange for playlist: ${playlist} at trackID|state: ${trackID}|${AT_PLAYER_STATE_NAMES[state]}`);
829
827
 
830
- if (state === AT_PLAYER_STATE.PAUSED) {
831
- logger.debug('\n' + 'audio player on playlist: ' + playlist + ' at trackID|state: ' + trackID + '|' + AT_PLAYER_STATE_NAMES[state]);
832
- return;
833
- }
828
+ } // END doNothingOnStateChange
834
829
 
835
- if (state === AT_PLAYER_STATE.PREVIOUS) {
836
- logger.debug('\n' + 'audio player on playlist: ' + playlist + ' at trackID|state: ' + trackID + '|' + AT_PLAYER_STATE_NAMES[state]);
837
- return;
838
- }
830
+ // -----------------------------------------------------------------------
831
+ // processOnStateChangePlaying()
832
+ //
833
+ // wrraper to update the ACTIVE player on state PLAYING
834
+ // -----------------------------------------------------------------------
835
+ function processOnStateChangePlaying(state) {
836
+ var playList, activePlayist, playerID, playerType,
837
+ activePlayerType, startVolume, songIndex, trackID,
838
+ ratingIndex, rating, ratingElement, songMetaData,
839
+ songStartTS, songEndTS, songStartSec, songEndSec,
840
+ screenControlRatingElements, screenControlRating;
839
841
 
840
- if (state === AT_PLAYER_STATE.NEXT) {
841
- logger.debug('\n' + 'audio player on playlist: ' + playlist + ' at trackID|state: ' + trackID + '|' + AT_PLAYER_STATE_NAMES[state]);
842
- return;
843
- }
842
+ songMetaData = Amplitude.getActiveSongMetadata();
843
+ songIndex = songMetaData.index;
844
+ playList = Amplitude.getActivePlaylist();
845
+ trackID = songIndex + 1;
846
+ songStartTS = songMetaData.start;
847
+ songEndTS = songMetaData.end;
848
+ songStartSec = timestamp2seconds(songStartTS);
849
+ songEndSec = timestamp2seconds(songEndTS);
850
+ startVolume = Amplitude.getVolume();
844
851
 
845
- if (state === AT_PLAYER_STATE.CHANGED) {
846
- logger.debug('\n' + 'audio player on playlist: ' + playlist + ' at trackID|state: ' + trackID + '|' + AT_PLAYER_STATE_NAMES[state]);
847
- return;
852
+ logger.debug('\n' + `PLAY audio on processOnStateChangePlaying for playlist \'${playList}\' at trackID|state: ${trackID}|${AT_PLAYER_STATE_NAMES[state]}`);
853
+
854
+ // update song rating in playlist-screen|meta-container
855
+ // -------------------------------------------------------------------
856
+ j1.adapter.amplitude.atUpdateSongRating(Amplitude.getActiveSongMetadata());
857
+
858
+ // scroll active song in players playlist
859
+ // ---------------------------------------------------------------------
860
+ j1.adapter.amplitude.atPlayerScrollToActiveElement(Amplitude.getActiveSongMetadata());
861
+
862
+ // stop active YT players
863
+ // -----------------------------------------------
864
+ const ytPlayers = Object.keys(j1.adapter.amplitude.data.ytPlayers);
865
+ for (let i=0; i<ytPlayers.length; i++) {
866
+ const playerID = ytPlayers[i];
867
+ const playerProperties = j1.adapter.amplitude.data.ytPlayers[playerID];
868
+ logger.debug('\n' + 'process player id: ' + playerID);
869
+ var ytpPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
870
+ var playerState = ytpPlayer.getPlayerState();
871
+ var ytpPlayerState = YT_PLAYER_STATE_NAMES[playerState];
872
+
873
+ if (ytpPlayerState === 'playing' || ytpPlayerState === 'paused' || ytpPlayerState === 'buffering') {
874
+ logger.debug('\n' + 'process player id: ' + playerID + ' stopped');
875
+ ytpPlayer.stopVideo();
876
+ }
848
877
  }
849
878
 
850
- if (state === AT_PLAYER_STATE.PLAYING) {
851
- var playList, activePlayist, playerID, playerType,
852
- activePlayerType, startVolume, songIndex,
853
- ratingIndex, rating, ratingElement,
854
- screenControlRatingElements, screenControlRating;
855
-
856
- songMetaData = Amplitude.getActiveSongMetadata();
857
- songIndex = songMetaData.index;
858
- playList = songMetaData.playlist;
859
- playList = Amplitude.getActivePlaylist();
860
- trackID = songIndex + 1;
861
-
862
- songStartTS = songMetaData.start;
863
- songEndTS = songMetaData.end;
864
- songStartSec = timestamp2seconds(songStartTS);
865
- songEndSec = timestamp2seconds(songEndTS);
866
- startVolume = Amplitude.getVolume();
867
-
868
- logger.debug('\n' + 'audio player on playlist: ' + playList + ' at trackID|state: ' + trackID + '|' + AT_PLAYER_STATE_NAMES[state]);
869
-
870
- // update song rating in playlist-screen|meta-container
871
- // -------------------------------------------------------------------
872
-
873
- // search for ACTIVE screenControlRatingElement
874
- screenControlRating = null;
875
- screenControlRatingElements = document.getElementsByClassName('audio-rating-screen-controls');
876
- for (let i=0; i<screenControlRatingElements.length; i++) {
877
- ratingElement = screenControlRatingElements[i];
878
- rating = parseInt(songMetaData.rating);
879
- playerType = ratingElement.dataset.playerType;
880
- activePlayerType = j1.adapter.amplitude.data.atpGlobals.activePlayerType;
881
- activePlayist = songMetaData.playlist
882
-
883
- if (ratingElement.dataset.amplitudePlaylist === activePlayist && playerType === activePlayerType) {
884
- ratingIndex = i;
885
- screenControlRating = ratingElement;
886
- break;
887
- }
879
+ // process audio for configured START position
880
+ // -------------------------------------------------------------------
881
+ var checkIsFading = setInterval (() => {
882
+ if (!isFadingIn) {
883
+ var currentAudioTime = Amplitude.getSongPlayedSeconds();
884
+ if (songStartSec && currentAudioTime <= songStartSec) {
885
+ var songDurationSec = timestamp2seconds(songMetaData.duration);
886
+
887
+ // seek audio to configured START position
888
+ // NOTE: use setSongPlayedPercentage for seeking to NOT
889
+ // generation any addition state changes like stopped
890
+ // or playing
891
+ logger.debug('\n' + 'seek audio in on playlist: ' + playList + ' at|to trackID|timestamp: ' + trackID + '|' + songStartTS);
892
+ Amplitude.setSongPlayedPercentage((songStartSec / songDurationSec) * 100);
893
+
894
+ // fade-in audio (if enabled)
895
+ var fadeAudioIn = (songMetaData.audio_fade_in === 'true') ? true : false;
896
+ if (fadeAudioIn) {
897
+ logger.debug('\n' + 'faden audio in on playlist: ' + playList + ' at|to trackID|timestamp: ' + trackID + '|' + songStartTS);
898
+ atpFadeInAudio({ playerID: playerID });
899
+ } // END if fadeAudio
900
+
901
+ } // END if songStartSec
902
+
903
+ clearInterval(checkIsFading);
888
904
  }
905
+ }, 100); // END checkIsFading
889
906
 
890
- // set the rating for ACTIVE screenControlRatingElements
891
- if (screenControlRating) {
892
- if (rating) {
893
- screenControlRatingElements[ratingIndex].innerHTML = '<img src="/assets/image/pattern/rating/scalable/' + rating + '-star.svg"' + 'alt="song rating">';
894
- } else {
895
- screenControlRatingElements[ratingIndex].innerHTML = '';
896
- }
897
- } // END if screenControlRating
907
+ // check|process audio for configured END position
908
+ // -------------------------------------------------------------------
909
+ if (songEndSec > songStartSec) {
910
+ var checkIsOnVideoEnd = setInterval(() => {
898
911
 
899
- // process audio for configured START position
900
- // -------------------------------------------------------------------
901
- var checkIsFading = setInterval (() => {
902
- if (!isFadingIn) {
903
- var currentAudioTime = Amplitude.getSongPlayedSeconds();
904
- if (songStartSec && currentAudioTime <= songStartSec) {
905
- var songDurationSec = timestamp2seconds(songMetaData.duration);
912
+ if (!isFadingOut) {
913
+ var currentAudioTime = Amplitude.getSongPlayedSeconds();
914
+ var songMetaData = Amplitude.getActiveSongMetadata();
915
+ var songEndTS = songMetaData.end;
916
+ var songEndSec = timestamp2seconds(songEndTS);
917
+
918
+ if (currentAudioTime > songEndSec) {
919
+ songMetaData = Amplitude.getActiveSongMetadata();
920
+ songIndex = songMetaData.index;
921
+ trackID = songIndex + 1;
906
922
 
907
- // seek audio to configured START position
923
+ // seek audio out to total end END position
908
924
  // NOTE: use setSongPlayedPercentage for seeking to NOT
909
925
  // generation any addition state changes like stopped
910
- // or playing
911
- logger.debug('\n' + 'seek audio in on playlist: ' + playList + ' at|to trackID|timestamp: ' + trackID + '|' + songStartTS);
912
- Amplitude.setSongPlayedPercentage((songStartSec / songDurationSec) * 100);
913
-
914
- // fade-in audio (if enabled)
915
- var fadeAudioIn = (songMetaData.audio_fade_in === 'true') ? true : false;
916
- if (fadeAudioIn) {
917
- logger.debug('\n' + 'faden audio in on playlist: ' + playList + ' at|to trackID|timestamp: ' + trackID + '|' + songStartTS);
918
- atpFadeInAudio({ playerID: playerID });
926
+ // or playing
927
+ logger.debug('\n' + 'seek audio out to end on playlist: ' + playList + ' at trackID|timestamp: ' + trackID + '|' + songEndTS);
928
+ Amplitude.setSongPlayedPercentage(99.99);
929
+
930
+ // fade-out audio (if enabled)
931
+ var fadeAudioOut = (songMetaData.audio_fade_out === 'true') ? true : false;
932
+ if (fadeAudioOut) {
933
+ logger.debug('\n' + 'fade audio out on playlist: ' + playList + ' at|to trackID|timestamp: ' + trackID + '|' + songEndTS);
934
+ atpFadeAudioOut({ playerID: playerID });
919
935
  } // END if fadeAudio
920
936
 
921
- } // END if songStartSec
937
+ clearInterval(checkIsOnVideoEnd);
938
+ } // END if currentAudioTime
922
939
 
923
- clearInterval(checkIsFading);
924
- }
925
- }, 100); // END checkIsFading
940
+ } // END if !isFading
926
941
 
927
- // check|process audio for configured END position
928
- // -------------------------------------------------------------------
929
- if (songEndSec > songStartSec) {
930
- var checkIsOnVideoEnd = setInterval(() => {
931
-
932
- if (!isFadingOut) {
933
- var currentAudioTime = Amplitude.getSongPlayedSeconds();
934
- var songMetaData = Amplitude.getActiveSongMetadata();
935
- var songEndTS = songMetaData.end;
936
- var songEndSec = timestamp2seconds(songEndTS);
937
-
938
- if (currentAudioTime > songEndSec) {
939
- songMetaData = Amplitude.getActiveSongMetadata();
940
- songIndex = songMetaData.index;
941
- trackID = songIndex + 1;
942
-
943
- // seek audio out to total end END position
944
- // NOTE: use setSongPlayedPercentage for seeking to NOT
945
- // generation any addition state changes like stopped
946
- // or playing
947
- logger.debug('\n' + 'seek audio out to end on playlist: ' + playList + ' at trackID|timestamp: ' + trackID + '|' + songEndTS);
948
- Amplitude.setSongPlayedPercentage(99.99);
949
-
950
- // fade-out audio (if enabled)
951
- var fadeAudioOut = (songMetaData.audio_fade_out === 'true') ? true : false;
952
- if (fadeAudioOut) {
953
- logger.debug('\n' + 'fade audio out on playlist: ' + playList + ' at|to trackID|timestamp: ' + trackID + '|' + songEndTS);
954
- atpFadeAudioOut({ playerID: playerID });
955
- } // END if fadeAudio
956
-
957
- clearInterval(checkIsOnVideoEnd);
958
- } // END if currentAudioTime
959
-
960
- } // END if !isFading
961
-
962
- }, 100); // END checkIsOnVideoEnd
963
- } // END if songEndSec
964
-
965
- // stop active YT players running in parallel
966
- // -------------------------------------------------------------------
967
- const ytPlayers = Object.keys(j1.adapter.amplitude.data.ytPlayers);
968
- for (let i=0; i<ytPlayers.length; i++) {
969
- const ytPlayerID = ytPlayers[i];
970
- const playerProperties = j1.adapter.amplitude.data.ytPlayers[ytPlayerID];
971
-
972
- var player = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID]['player'];
973
- var playerState = (player.getPlayerState() > 0) ? player.getPlayerState() : 6;
974
- var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
975
-
976
- // if (ytPlayerState === 'playing' || ytPlayerState === 'paused' || ytPlayerState === 'buffering' || ytPlayerState === 'cued' || ytPlayerState === 'unstarted') {
977
- if (ytPlayerState === 'playing' || ytPlayerState === 'paused') {
978
- logger.debug('\n' + `STOP YT player at onPlayerStateChange for id: ${ytPlayerID}`);
979
- player.stopVideo();
980
- j1.adapter.amplitude.data.ytpGlobals.activeIndex = 0;
981
- }
942
+ }, 100); // END checkIsOnVideoEnd
943
+ } // END if songEndSec
982
944
 
983
- } // END stop active YT players
945
+ // save YT player data for later use (e.g. events)
946
+ // ---------------------------------------------------------------------
947
+ j1.adapter.amplitude.data.activePlayer = 'atp';
948
+ j1.adapter.amplitude.data.atpGlobals.activePlayerType = 'large';
984
949
 
985
- } // END state AT_PLAYER_STATE PLAYING
950
+ }; // END processOnStateChangePlaying
986
951
 
987
- if (state === AT_PLAYER_STATE.ENDED) {
988
- // Amplitude.setVolume(50);
989
- } // END state AT_PLAYER_STATE.ENDED
952
+ // -----------------------------------------------------------------------
953
+ // onPlayerStateChange
954
+ //
955
+ // process all AT Player specific state changes
956
+ // -----------------------------------------------------------------------
957
+ // NOTE:
958
+ // The AT API fires a lot of INTERMEDIATE states. MOST of them gets
959
+ // ignored (do nothing). Currently, only state PLAYING is actively
960
+ // processed.
961
+ // -----------------------------------------------------------------------
962
+ function onPlayerStateChange(state) {
990
963
 
964
+ // process all state changes fired by AT API
965
+ // ---------------------------------------------------------------------
966
+ switch(state) {
967
+ case AT_PLAYER_STATE.UNSTARTED:
968
+ doNothingOnStateChange(AT_PLAYER_STATE.UNSTARTED);
969
+ break;
970
+ case AT_PLAYER_STATE.STOPPED:
971
+ doNothingOnStateChange(AT_PLAYER_STATE.STOPPED);
972
+ break;
973
+ case AT_PLAYER_STATE.PAUSED:
974
+ doNothingOnStateChange(AT_PLAYER_STATE.PAUSED);
975
+ break;
976
+ case AT_PLAYER_STATE.PREVIOUS:
977
+ doNothingOnStateChange(AT_PLAYER_STATE.PREVIOUS);
978
+ break;
979
+ case AT_PLAYER_STATE.NEXT:
980
+ doNothingOnStateChange(AT_PLAYER_STATE.NEXT);
981
+ break;
982
+ case AT_PLAYER_STATE.CHANGED:
983
+ doNothingOnStateChange(AT_PLAYER_STATE.CHANGED);
984
+ break;
985
+ case AT_PLAYER_STATE.PLAYING:
986
+ processOnStateChangePlaying(AT_PLAYER_STATE.PLAYING);
987
+ break;
988
+ case AT_PLAYER_STATE.ENDED:
989
+ doNothingOnStateChange(AT_PLAYER_STATE.ENDED);
990
+ break;
991
+ default:
992
+ logger.error('\n' + `UNKNOWN state on StateChange fired: ${state}`);
993
+ } // END switch state
991
994
  } // END onPlayerStateChange
992
995
 
993
996
  }, // END initApi
@@ -996,30 +999,30 @@ j1.adapter.amplitude = ((j1, window) => {
996
999
  // monitorPlayerActiveElementChanges
997
1000
  //
998
1001
  // -------------------------------------------------------------------------
999
- monitorPlayerActiveElementChanges: () => {
1000
- // var playerSongContainers = document.getElementsByClassName("large-player-title-list");
1001
- var playerSongContainers = document.getElementsByClassName("large-player-title-list");
1002
- for (var i=0; i<playerSongContainers.length; i++) {
1003
- var scrollableList = document.getElementById(playerSongContainers[0].id);
1004
- var observer = new MutationObserver((mutationsList, observer) => {
1005
- for (const mutation of mutationsList) {
1006
- if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
1007
- // Überprüfen, ob das geänderte Element jetzt die aktive Klasse besitzt
1008
- if (mutation.target.classList.contains('amplitude-active-song-container')) {
1009
- scrollableList.scrollTop = mutation.target.offsetTop;
1010
- }
1011
- }
1012
- }
1013
- }); // END observer
1014
-
1015
- // Optionen für den Observer: Nur Änderungen an Attributen beobachten
1016
- observer.observe(scrollableList, {
1017
- attributes: true,
1018
- subtree: true
1019
- }); // END observer options
1020
-
1021
- } // END for playerSongContainers
1022
- }, // END monitorPlayerActiveElementChanges
1002
+ // monitorPlayerActiveElementChanges: () => {
1003
+ // // var playerSongContainers = document.getElementsByClassName("large-player-title-list");
1004
+ // var playerSongContainers = document.getElementsByClassName("large-player-title-list");
1005
+ // for (var i=0; i<playerSongContainers.length; i++) {
1006
+ // var scrollableList = document.getElementById(playerSongContainers[0].id);
1007
+ // var observer = new MutationObserver((mutationsList, observer) => {
1008
+ // for (const mutation of mutationsList) {
1009
+ // if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
1010
+ // // Überprüfen, ob das geänderte Element jetzt die aktive Klasse besitzt
1011
+ // if (mutation.target.classList.contains('amplitude-active-song-container')) {
1012
+ // scrollableList.scrollTop = mutation.target.offsetTop;
1013
+ // }
1014
+ // }
1015
+ // }
1016
+ // }); // END observer
1017
+
1018
+ // // Optionen für den Observer: Nur Änderungen an Attributen beobachten
1019
+ // observer.observe(scrollableList, {
1020
+ // attributes: true,
1021
+ // subtree: true
1022
+ // }); // END observer options
1023
+
1024
+ // } // END for playerSongContainers
1025
+ // }, // END monitorPlayerActiveElementChanges
1023
1026
 
1024
1027
  // -------------------------------------------------------------------------
1025
1028
  // initPlayerUiEvents
@@ -1073,19 +1076,42 @@ j1.adapter.amplitude = ((j1, window) => {
1073
1076
  if (apiInitialized.state) {
1074
1077
  amplitudePlayerState = Amplitude.getPlayerState();
1075
1078
 
1079
+ {% comment %} process UI events for all MINI Players
1080
+ ============================================================ {% endcomment %}
1076
1081
  {% if player.id contains 'mini' %}
1077
- // ---------------------------------------------------------
1078
- // START mini player UI events
1079
- //
1080
1082
  if (document.getElementById('{{player.id}}') !== null) {
1081
1083
 
1082
- // add listeners to all progress bars found (mini-player)
1083
- // getElementsByClassName returns an Array-like object
1084
+ {% comment %} PREPARED event listener for LATER use
1085
+ ----------------------------------------------------------
1086
+ // click on play_pause button (MINI player)
1087
+ var miniPlayerPlayPauseButton = document.getElementsByClassName('mini-player-play-pause');
1088
+ for (var i=0; i<miniPlayerPlayPauseButton.length; i++) {
1089
+ if (miniPlayerPlayPauseButton[i].dataset.amplitudeSource === 'youtube') {
1090
+ // do nothing (managed by plugin)
1091
+ } else {
1092
+ // var currentPlaylist = compactPlayerPlayPauseButton[i].dataset.amplitudePlaylist;
1093
+ // if (currentPlaylist === playListName) {
1094
+ if (miniPlayerPlayPauseButton[i].id === 'mini_player_play_pause_{{player.id}}') {
1095
+ miniPlayerPlayPauseButton[i].addEventListener('click', function(event) {
1096
+ var ytpPlayer;
1097
+
1098
+ // save YT player data for later use (e.g. events)
1099
+ j1.adapter.amplitude.data.activePlayer = 'atp';
1100
+ j1.adapter.amplitude.data.atpGlobals.activePlayerType = 'mini';
1101
+
1102
+ }); // addEventListener END
1103
+ } // END if miniPlayerPlayPauseButton
1104
+ } // END if ATP
1105
+ } // END for miniPlayerPlayPauseButton
1106
+ ----------------------------------------------------------
1107
+ {% endcomment %}
1108
+
1109
+ // add listeners to all progress bars found (MINI Player)
1084
1110
  // -------------------------------------------------------
1085
1111
  var progressBars = document.getElementsByClassName("mini-player-progress");
1086
1112
  for (var i=0; i<progressBars.length; i++) {
1087
1113
  if (progressBars[i].dataset.amplitudeSource === 'youtube') {
1088
- // do nothing
1114
+ // do nothing for YTP (managed by plugin)
1089
1115
  } else {
1090
1116
  progressBars[i].addEventListener('click', function(event) {
1091
1117
  var offset = this.getBoundingClientRect();
@@ -1093,43 +1119,29 @@ j1.adapter.amplitude = ((j1, window) => {
1093
1119
 
1094
1120
  Amplitude.setSongPlayedPercentage(
1095
1121
  (parseFloat(xpos)/parseFloat(this.offsetWidth))*100);
1096
- }); // END EventListener 'click'
1097
- }
1098
- } // END for
1099
1122
 
1100
- // click on play_pause button (MINI player)
1101
- var miniPlayerPlayPauseButton = document.getElementsByClassName('mini-player-play-pause');
1102
- for (var i=0; i<miniPlayerPlayPauseButton.length; i++) {
1103
- if (miniPlayerPlayPauseButton[i].dataset.amplitudeSource === 'youtube') {
1104
- // do nothing
1105
- } else {
1106
- var currentPlaylist = miniPlayerPlayPauseButton[i].dataset.amplitudePlaylist;
1107
- if (currentPlaylist === playList) {
1108
- miniPlayerPlayPauseButton[i].addEventListener('click', function(event) {
1109
- // do nothing
1110
- });
1111
- }
1112
- }
1113
- } // END play_pause button (MINI player)
1123
+ }); // END addEventListener
1124
+ } // END if progressBars
1125
+ } // END for progressBars
1114
1126
 
1115
1127
  } // END mini player UI events
1116
1128
  {% endif %}
1117
1129
 
1118
- {% if player.id contains 'compact' %}
1119
- // ---------------------------------------------------------
1120
- // START compact player UI events
1121
- //
1130
+
1131
+ {% comment %} process UI events for all COMPACT Players
1132
+ ============================================================ {% endcomment %}
1133
+ {% if player.id contains 'compact' %}
1122
1134
  if (document.getElementById('{{player.id}}') !== null) {
1123
1135
 
1124
1136
  // show|hide scrollbar in playlist (compact player)
1125
1137
  // -------------------------------------------------------
1126
1138
  const songsInPlaylist = Amplitude.getSongsInPlaylist(playListName);
1127
- if (songsInPlaylist.length <= 8) {
1139
+ if (songsInPlaylist.length <= playerScrollerSongElementMin) {
1128
1140
  const titleListCompactPlayer = document.getElementById('compact_player_title_list_' + playListName);
1129
1141
  if (titleListCompactPlayer !== null) {
1130
1142
  titleListCompactPlayer.classList.add('hide-scrollbar');
1131
1143
  }
1132
- }
1144
+ } // END if songsInPlaylist
1133
1145
 
1134
1146
  // show playlist
1135
1147
  // -------------------------------------------------------
@@ -1159,7 +1171,8 @@ j1.adapter.amplitude = ((j1, window) => {
1159
1171
  $('body').addClass('stop-scrolling');
1160
1172
  }
1161
1173
  }
1162
- }); // END EventListener 'click' (compact player|show playlist)
1174
+
1175
+ }); // END EventListener
1163
1176
  } // END if showPlaylist
1164
1177
 
1165
1178
  // hide playlist
@@ -1170,7 +1183,7 @@ j1.adapter.amplitude = ((j1, window) => {
1170
1183
  var playlistScreen = document.getElementById("playlist_screen_{{player.id}}");
1171
1184
 
1172
1185
  playlistScreen.classList.remove('slide-in-top');
1173
- playlistScreen.classList.add('slislide-out-top');
1186
+ playlistScreen.classList.add('slide-out-top');
1174
1187
  playlistScreen.style.display = "none";
1175
1188
  playlistScreen.style.zIndex = "1";
1176
1189
 
@@ -1178,17 +1191,16 @@ j1.adapter.amplitude = ((j1, window) => {
1178
1191
  if ($('body').hasClass('stop-scrolling')) {
1179
1192
  $('body').removeClass('stop-scrolling');
1180
1193
  }
1181
- }); // END EventListener 'click' (compact player|show playlist)
1182
- } // END if hidePlaylist
1183
1194
 
1195
+ }); // END addEventListener
1196
+ } // END if hidePlaylist
1184
1197
 
1185
1198
  // add listeners to all progress bars found (compact-player)
1186
- // getElementsByClassName returns an Array-like object
1187
1199
  // -------------------------------------------------------
1188
1200
  var progressBars = document.getElementsByClassName("compact-player-progress");
1189
1201
  for (var i=0; i<progressBars.length; i++) {
1190
1202
  if (progressBars[i].dataset.amplitudeSource === 'youtube') {
1191
- // do nothing
1203
+ // do nothing for YTP (managed by plugin)
1192
1204
  } else {
1193
1205
  progressBars[i].addEventListener('click', function(event) {
1194
1206
  var offset = this.getBoundingClientRect();
@@ -1196,56 +1208,99 @@ j1.adapter.amplitude = ((j1, window) => {
1196
1208
 
1197
1209
  Amplitude.setSongPlayedPercentage(
1198
1210
  (parseFloat(xpos)/parseFloat(this.offsetWidth))*100);
1199
- }); // END EventListener 'click'
1200
- }
1201
- } // END for
1202
1211
 
1212
+ }); // END EventListener 'click'
1213
+ } // END if progressBars
1214
+ } // END for progressBars
1203
1215
 
1204
- // click on Next|Previous Buttons (COMPACT player)
1216
+ // add listeners to all Next Buttons found (COMPACT player)
1205
1217
  // -------------------------------------------------------
1206
1218
 
1207
- // add listeners to all Next Buttons found
1208
- var largeNextButtons = document.getElementsByClassName("compact-player-next");
1209
- for (var i=0; i<largeNextButtons.length; i++) {
1210
- if (largeNextButtons[i].dataset.amplitudeSource === 'youtube') {
1211
- // do nothing
1219
+ {% comment %} PREPARED event listener for LATER use
1220
+ ----------------------------------------------------------
1221
+ var compactNextButtons = document.getElementsByClassName("compact-player-next");
1222
+ for (var i=0; i<compactNextButtons.length; i++) {
1223
+ if (compactNextButtons[i].dataset.amplitudeSource === 'youtube') {
1224
+ // do nothing for YTP (managed by plugin)
1212
1225
  } else {
1213
- if (largeNextButtons[i].id === 'compact_player_next_{{player.id}}') {
1214
- largeNextButtons[i].addEventListener('click', function(event) {
1215
- // do nothing
1226
+ if (compactNextButtons[i].id === 'compact_player_next_{{player.id}}' || compactNextButtons[i].id === 'compact_player_list_next_{{player.id}}') {
1227
+ compactNextButtons[i].addEventListener('click', function(event) {
1228
+ var atpPlayerID = this.id;
1229
+ var atpPlayerActive = atpPlayerID.split('_');
1230
+
1231
+ j1.adapter.amplitude.data.atpGlobals.activePlayerType = 'compact';
1232
+
1216
1233
  }); // END EventListener 'click'
1217
1234
  } // END if ID
1218
1235
  }
1219
1236
  } // END Next Buttons (COMPACT player)
1237
+ ----------------------------------------------------------
1238
+ {% endcomment %}
1220
1239
 
1240
+ {% comment %} PREPARED event listener for LATER use
1241
+ ----------------------------------------------------------
1221
1242
  // add listeners to all Previous Buttons found
1222
1243
  var compactPreviousButtons = document.getElementsByClassName("compact-player-previous");
1223
1244
  for (var i=0; i<compactPreviousButtons.length; i++) {
1224
1245
  if (compactPreviousButtons[i].dataset.amplitudeSource === 'youtube') {
1225
- // do nothing
1246
+ // do nothing for YTP (managed by plugin)
1226
1247
  } else {
1227
- if (compactPreviousButtons[i].id === 'compact_player_previous_{{player.id}}') {
1248
+ if (compactPreviousButtons[i].id === 'compact_player_previous_{{player.id}}' || compactPreviousButtons[i].id === 'compact_player_list_previous_{{player.id}}') {
1228
1249
  compactPreviousButtons[i].addEventListener('click', function(event) {
1229
- // do nothing
1250
+ var atpPlayerID = this.id;
1251
+ var atpPlayerActive = atpPlayerID.split('_');
1252
+
1253
+ j1.adapter.amplitude.data.atpGlobals.activePlayerType = 'compact';
1254
+
1230
1255
  }); // END EventListener 'click'
1231
1256
  } // END if ID
1232
1257
  }
1233
1258
  } // END Previous Buttons (COMPACT player)
1259
+ ----------------------------------------------------------
1260
+ {% endcomment %}
1234
1261
 
1262
+ {% comment %} PREPARED event listener for LATER use
1263
+ ----------------------------------------------------------
1235
1264
  // click on play_pause button (COMPACT player)
1236
1265
  var compactPlayerPlayPauseButton = document.getElementsByClassName('compact-player-play-pause');
1237
1266
  for (var i=0; i<compactPlayerPlayPauseButton.length; i++) {
1238
1267
  if (compactPlayerPlayPauseButton[i].dataset.amplitudeSource === 'youtube') {
1239
1268
  // do nothing (managed by plugin)
1240
1269
  } else {
1241
- var currentPlaylist = compactPlayerPlayPauseButton[i].dataset.amplitudePlaylist;
1242
- if (currentPlaylist === playList) {
1270
+ // var currentPlaylist = compactPlayerPlayPauseButton[i].dataset.amplitudePlaylist;
1271
+ // if (currentPlaylist === playListName) {
1272
+ if (compactPlayerPlayPauseButton[i].id === 'compact_player_play_pause_{{player.id}}' || compactPlayerPlayPauseButton[i].id === 'compact_player_list_play_pause_{{player.id}}') {
1243
1273
  compactPlayerPlayPauseButton[i].addEventListener('click', function(event) {
1244
- // do nothing
1245
- });
1274
+ var ytpPlayer;
1275
+ var ytpPlayerState;
1276
+ var playerState;
1277
+
1278
+ // stop active YT players
1279
+ const ytPlayers = Object.keys(j1.adapter.amplitude.data.ytPlayers);
1280
+ for (let i=0; i<ytPlayers.length; i++) {
1281
+ const playerID = ytPlayers[i];
1282
+ const playerProperties = j1.adapter.amplitude.data.ytPlayers[playerID];
1283
+ logger.debug('\n' + 'process player id: ' + playerID);
1284
+ ytpPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
1285
+ playerState = ytpPlayer.getPlayerState();
1286
+ ytpPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1287
+
1288
+ if (ytpPlayerState === 'playing' || ytpPlayerState === 'paused' || ytpPlayerState === 'buffering') {
1289
+ logger.debug('\n' + 'process player id: ' + playerID + ' stopped');
1290
+ ytpPlayer.stopVideo();
1291
+ }
1292
+ }
1293
+
1294
+ // save YT player data for later use (e.g. events)
1295
+ j1.adapter.amplitude.data.activePlayer = 'atp';
1296
+ j1.adapter.amplitude.data.atpGlobals.activePlayerType = 'compact';
1297
+
1298
+ });
1246
1299
  }
1247
1300
  }
1248
1301
  } // END play_pause button (COMPACT player)
1302
+ ----------------------------------------------------------
1303
+ {% endcomment %}
1249
1304
 
1250
1305
  // click on skip forward|backward (COMPACT player)
1251
1306
  // See: https://github.com/serversideup/amplitudejs/issues/384
@@ -1255,10 +1310,14 @@ j1.adapter.amplitude = ((j1, window) => {
1255
1310
  var compactPlayerSkipForwardButtons = document.getElementsByClassName("compact-player-skip-forward");
1256
1311
  for (var i=0; i<compactPlayerSkipForwardButtons.length; i++) {
1257
1312
  if (compactPlayerSkipForwardButtons[i].dataset.amplitudeSource === 'youtube') {
1258
- // do nothing
1313
+ // do nothing for YTP (managed by plugin)
1259
1314
  } else {
1260
1315
  if (compactPlayerSkipForwardButtons[i].id === 'skip-forward_{{player.id}}') {
1261
1316
  compactPlayerSkipForwardButtons[i].addEventListener('click', function(event) {
1317
+
1318
+ // load player settings
1319
+ // playerForwardBackwardSkipSeconds = (playerSettings.forward_backward_skip_seconds === undefined) ? playerForwardBackwardSkipSeconds: playerSettings.forward_backward_skip_seconds;
1320
+
1262
1321
  const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
1263
1322
  const duration = Amplitude.getSongDuration();
1264
1323
  const currentTime = parseFloat(Amplitude.getSongPlayedSeconds());
@@ -1267,6 +1326,7 @@ j1.adapter.amplitude = ((j1, window) => {
1267
1326
  if (currentTime > 0) {
1268
1327
  Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
1269
1328
  }
1329
+
1270
1330
  }); // END EventListener 'click'
1271
1331
  } // END if ID
1272
1332
  }
@@ -1276,10 +1336,14 @@ j1.adapter.amplitude = ((j1, window) => {
1276
1336
  var compactPlayerSkipBackwardButtons = document.getElementsByClassName("compact-player-skip-backward");
1277
1337
  for (var i=0; i<compactPlayerSkipBackwardButtons.length; i++) {
1278
1338
  if (compactPlayerSkipBackwardButtons[i].dataset.amplitudeSource === 'youtube') {
1279
- // do nothing
1339
+ // do nothing for YTP (managed by plugin)
1280
1340
  } else {
1281
1341
  if (compactPlayerSkipBackwardButtons[i].id === 'skip-backward_{{player.id}}') {
1282
1342
  compactPlayerSkipBackwardButtons[i].addEventListener('click', function(event) {
1343
+
1344
+ // load player settings
1345
+ // playerForwardBackwardSkipSeconds = (playerSettings.forward_backward_skip_seconds === undefined) ? playerForwardBackwardSkipSeconds: playerSettings.forward_backward_skip_seconds;
1346
+
1283
1347
  const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
1284
1348
  const duration = Amplitude.getSongDuration();
1285
1349
  const currentTime = parseFloat(Amplitude.getSongPlayedSeconds());
@@ -1288,6 +1352,7 @@ j1.adapter.amplitude = ((j1, window) => {
1288
1352
  if (currentTime > 0) {
1289
1353
  Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
1290
1354
  }
1355
+
1291
1356
  }); // END EventListener 'click'
1292
1357
  } // END if ID
1293
1358
  }
@@ -1300,6 +1365,7 @@ j1.adapter.amplitude = ((j1, window) => {
1300
1365
  var shuffleState = (document.getElementById('compact_player_shuffle').className.includes('amplitude-shuffle-on')) ? true : false;
1301
1366
 
1302
1367
  Amplitude.setShuffle(shuffleState)
1368
+
1303
1369
  }); // END EventListener 'click'
1304
1370
  } // END PlayerShuffleButton (COMPACT player)
1305
1371
 
@@ -1310,73 +1376,145 @@ j1.adapter.amplitude = ((j1, window) => {
1310
1376
  var repeatState = (document.getElementById('compact_player_repeat').className.includes('amplitude-repeat-on')) ? true : false;
1311
1377
 
1312
1378
  Amplitude.setRepeat(repeatState)
1379
+
1313
1380
  }); // END EventListener 'click'
1314
1381
  } // END PlayerRepeatButton (COMPACT player)
1315
1382
 
1316
1383
  } // END compact player UI events
1317
1384
  {% endif %}
1318
1385
 
1386
+
1387
+ {% comment %} process UI events for all LARGE Players
1388
+ ============================================================ {% endcomment %}
1319
1389
  {% if player.id contains 'large' %}
1320
- // START large player UI events
1321
- // ---------------------------------------------------------
1390
+
1322
1391
  if (document.getElementById('{{player.id}}') !== null) {
1323
1392
  // var playlist = '{{player.id}}_yt';
1324
1393
  var playlistInfo = {{player.playlist | replace: 'nil', 'null' | replace: '=>', ':'}};
1325
1394
  var playList = playlistInfo.name;
1326
1395
 
1327
- // NOTE: listener overloads for video managed by plugin
1396
+ // add listeners to all SongContainers found (LARGE player)
1328
1397
  // -------------------------------------------------------
1329
- var largetPlayerSongContainer = document.getElementsByClassName("amplitude-song-container");
1330
- for (var i=0; i<largetPlayerSongContainer.length; i++) {
1331
- if (largetPlayerSongContainer[i].dataset.amplitudeSource === 'youtube') {
1332
- // do nothing
1398
+ var largePlayerSongContainer = document.getElementsByClassName("amplitude-song-container");
1399
+ for (var i=0; i<largePlayerSongContainer.length; i++) {
1400
+ if (largePlayerSongContainer[i].dataset.amplitudeSource === 'youtube') {
1401
+ // do nothing for YTP (managed by plugin)
1333
1402
  } else {
1334
- var currentPlaylist = largetPlayerSongContainer[i].dataset.amplitudePlaylist;
1403
+ var currentPlaylist = largePlayerSongContainer[i].dataset.amplitudePlaylist;
1335
1404
  if (currentPlaylist === playList) {
1336
- largetPlayerSongContainer[i].addEventListener('click', function(event) {
1337
- var ytpPlayer, ytpPlayerState, ytpPlayerState, playerState,
1338
- classArray, atpPlayerActive, playlist;
1405
+ // if (largePlayerSongContainer[i].id === 'large-player-play-pause_{{player.id}}' || largePlayerSongContainer[i].id === 'large-player-play-pause_{{player.id}}') {
1406
+ largePlayerSongContainer[i].addEventListener('click', function(event) {
1407
+ var ytpPlayer, ytpPlayerState, ytpPlayerState, atpPlayerState,
1408
+ playerState, classArray, atpPlayerActive, metaData,
1409
+ playlist, playlistIndex;
1339
1410
 
1340
1411
  classArray = [].slice.call(this.classList, 0);
1341
1412
  atpPlayerActive = classArray[0].split('-');
1342
1413
  playlist = this.getAttribute("data-amplitude-playlist");
1414
+ playlistIndex = parseInt(this.getAttribute("data-amplitude-song-index"));
1415
+ metaData = Amplitude.getActiveSongMetadata();
1416
+ atpPlayerState = Amplitude.getPlayerState();
1417
+
1418
+ // update song rating in screen controls
1419
+ // -----------------------------------------------
1420
+ // updateSongRating(playlist, metaData.index, metaData.rating);
1421
+
1422
+ // var largePlayerSongAudioRating = document.getElementsByClassName("audio-rating-screen-controls");
1423
+ // if (largePlayerSongAudioRating.length) {
1424
+ // for (var i=0; i<largePlayerSongAudioRating.length; i++) {
1425
+ // var currentPlaylist = largePlayerSongAudioRating[i].dataset.amplitudePlaylist;
1426
+ // if (currentPlaylist === playlist) {
1427
+ // if (metaData.rating) {
1428
+ // var trackID = metaData.index + 1;
1429
+ // logger.debug('\n' + `UPDATE song rating on updatMetaContainers for trackID|playlist at: ${trackID}|${playlist} with a value of: ${metaData.rating}`);
1430
+ // largePlayerSongAudioRating[i].innerHTML = '<img src="/assets/image/pattern/rating/scalable/' + metaData.rating + '-star.svg"' + 'alt="song rating">';
1431
+ // } else {
1432
+ // largePlayerSongAudioRating[i].innerHTML = '';
1433
+ // }
1434
+ // }
1435
+ // }
1436
+ // } // END if largePlayerSongAudioRating
1343
1437
 
1344
1438
  // scroll song active at index in player
1345
- if (playerAutoScrollSongElement) {
1346
- j1.adapter.amplitude.atPlayerScrollToActiveElement(playlist);
1439
+ // -----------------------------------------------
1440
+ // if (playerAutoScrollSongElement) {
1441
+ // j1.adapter.amplitude.atPlayerScrollToActiveElement(playlist);
1442
+ // }
1443
+
1444
+ // toggle active AT players
1445
+ // -----------------------------------------------
1446
+ // if (atpPlayerState === 'playing') {
1447
+ // // start|pause active player
1448
+ // // logger.debug('\n' + 'process player id: ' + atpPlayerActive[0] + ' stopped');
1449
+ // Amplitude.pause();
1450
+ // } else {
1451
+ // Amplitude.playPlaylistSongAtIndex(playlistIndex, playlist);
1452
+ // }
1453
+
1454
+ // stop active YT players
1455
+ // -----------------------------------------------
1456
+ const ytPlayers = Object.keys(j1.adapter.amplitude.data.ytPlayers);
1457
+ for (let i=0; i<ytPlayers.length; i++) {
1458
+ const playerID = ytPlayers[i];
1459
+ const playerProperties = j1.adapter.amplitude.data.ytPlayers[playerID];
1460
+ logger.debug('\n' + 'process player id: ' + playerID);
1461
+ ytpPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
1462
+ playerState = ytpPlayer.getPlayerState();
1463
+ ytpPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1464
+
1465
+ if (ytpPlayerState === 'playing' || ytpPlayerState === 'paused' || ytpPlayerState === 'buffering') {
1466
+ logger.debug('\n' + 'process player id: ' + playerID + ' stopped');
1467
+ ytpPlayer.stopVideo();
1468
+ }
1347
1469
  }
1348
- });
1349
- }
1350
- }
1351
- } // END player SongContainer
1470
+
1471
+ // save YT player data for later use (e.g. events)
1472
+ // -----------------------------------------------
1473
+ j1.adapter.amplitude.data.activePlayer = 'atp';
1474
+ j1.adapter.amplitude.data.atpGlobals.activePlayerType = atpPlayerActive[3];
1475
+
1476
+ }); // END add EventListener
1477
+ } // END if currentPlaylist
1478
+ } // ENF if largePlayerSongContainer
1479
+ } // END for largePlayerSongContainer
1352
1480
 
1353
1481
  // click on prev button
1354
1482
  var largePlayerPreviousButton = document.getElementById('large_player_previous');
1355
1483
  if (largePlayerPreviousButton && largePlayerPreviousButton.getAttribute("data-amplitude-source") === 'youtube') {
1356
- // do nothing (managed by plugin)
1484
+ // do nothing for YTP (managed by plugin)
1357
1485
  }
1358
1486
 
1359
- // click on play_pause button (LARGE player)
1487
+ // add listeners to all PlayPause Buttons found (LARGE player)
1488
+ // -------------------------------------------------------
1489
+
1490
+ {% comment %} PREPARED event listener for LATER use
1491
+ ----------------------------------------------------------
1360
1492
  var largePlayerPlayPauseButton = document.getElementsByClassName('large-player-play-pause');
1361
1493
  for (var i=0; i<largePlayerPlayPauseButton.length; i++) {
1362
1494
  if (largePlayerPlayPauseButton[i].dataset.amplitudeSource === 'youtube') {
1363
- // do nothing (managed by YTP plugin)
1495
+ // do nothing for YTP (managed by plugin)
1364
1496
  } else {
1365
- var currentPlaylist = largePlayerPlayPauseButton[i].dataset.amplitudePlaylist;
1366
- if (currentPlaylist === playList) {
1497
+ var currentPlaylist = largePlayerPlayPauseButton[i].dataset.amplitudePlaylist;
1498
+ if (currentPlaylist === playList) {
1367
1499
  largePlayerPlayPauseButton[i].addEventListener('click', function(event) {
1368
- // do nothing
1500
+ var ytpPlayer, ytpPlayerState, playlist, metaData, playerState;
1501
+
1502
+ metaData = Amplitude.getActiveSongMetadata();
1503
+ playlist = this.getAttribute("data-amplitude-playlist");
1504
+
1369
1505
  });
1370
1506
  }
1371
1507
  }
1372
1508
  } // END play_pause button (LARGE player)
1509
+ ----------------------------------------------------------
1510
+ {% endcomment %}
1373
1511
 
1374
1512
  // add listeners to all progress bars found (LARGE player)
1375
1513
  // -------------------------------------------------------
1376
1514
  var progressBars = document.getElementsByClassName("large-player-progress");
1377
1515
  for (var i=0; i<progressBars.length; i++) {
1378
1516
  if (progressBars[i].dataset.amplitudeSource === 'youtube') {
1379
- // do nothing (managed by plugin)
1517
+ // do nothing for YTP (managed by plugin)
1380
1518
  } else {
1381
1519
  progressBars[i].addEventListener('click', function(event) {
1382
1520
  var offset = this.getBoundingClientRect();
@@ -1385,50 +1523,97 @@ j1.adapter.amplitude = ((j1, window) => {
1385
1523
  if (Amplitude.getPlayerState() === 'playing') {
1386
1524
  Amplitude.setSongPlayedPercentage((parseFloat(xpos)/parseFloat(this.offsetWidth))*100);
1387
1525
  }
1526
+
1388
1527
  }); // END EventListener 'click'
1389
1528
  }
1390
1529
  } // END for
1391
1530
 
1392
-
1393
- // click on Next|Previous Buttons (LARGE player)
1531
+ // add listeners to all Next Buttons found (LARGE player)
1394
1532
  // -------------------------------------------------------
1395
-
1396
- // add listeners to all Next Buttons found
1397
1533
  var largeNextButtons = document.getElementsByClassName("large-player-next");
1398
1534
  for (var i=0; i<largeNextButtons.length; i++) {
1399
1535
  if (largeNextButtons[i].dataset.amplitudeSource === 'youtube') {
1400
- // do nothing (managed by plugin)
1536
+ // do nothing for YTP (managed by plugin)
1401
1537
  } else {
1402
1538
  if (largeNextButtons[i].id === 'large_player_next_{{player.id}}') {
1403
1539
  largeNextButtons[i].addEventListener('click', function(event) {
1404
- var atpPlayerID = this.id;
1405
- var atpPlayerActive = atpPlayerID.split('_');
1406
- var playlist = this.getAttribute("data-amplitude-playlist");
1540
+ var atpPlayerID, atpPlayerActive, metaData, playlist;
1541
+
1542
+ atpPlayerID = this.id;
1543
+ atpPlayerActive = atpPlayerID.split('_');
1544
+ playlist = this.getAttribute("data-amplitude-playlist");
1545
+ metaData = Amplitude.getActiveSongMetadata();
1546
+
1547
+ // update song rating in screen controls
1548
+ var largePlayerSongAudioRating = document.getElementsByClassName("audio-rating-screen-controls");
1549
+ if (largePlayerSongAudioRating.length) {
1550
+ for (var i=0; i<largePlayerSongAudioRating.length; i++) {
1551
+ var currentPlaylist = largePlayerSongAudioRating[i].dataset.amplitudePlaylist;
1552
+ if (currentPlaylist === playlist) {
1553
+ if (metaData.rating) {
1554
+ var trackID = metaData.index + 1;
1555
+ logger.debug('\n' + `UPDATE song rating on updatMetaContainers for trackID|playlist at: ${trackID}|${playlist} with a value of: ${metaData.rating}`);
1556
+ largePlayerSongAudioRating[i].innerHTML = '<img src="/assets/image/pattern/rating/scalable/' + metaData.rating + '-star.svg"' + 'alt="song rating">';
1557
+ } else {
1558
+ largePlayerSongAudioRating[i].innerHTML = '';
1559
+ }
1560
+ }
1561
+ }
1562
+ } // END if largePlayerSongAudioRating
1407
1563
 
1408
1564
  // scroll song active at index in player
1565
+ // -----------------------------------------------
1409
1566
  if (playerAutoScrollSongElement) {
1410
1567
  j1.adapter.amplitude.atPlayerScrollToActiveElement(playlist);
1411
1568
  }
1412
1569
 
1413
1570
  // save YT player data for later use (e.g. events)
1571
+ // -----------------------------------------------
1414
1572
  j1.adapter.amplitude.data.activePlayer = 'atp';
1415
1573
  j1.adapter.amplitude.data.atpGlobals.activePlayerType = atpPlayerActive[0];
1574
+
1416
1575
  }); // END EventListener 'click'
1417
- } // END if ID
1418
- }
1576
+ } // END addEventListener
1577
+ } // END if largeNextButtons
1419
1578
  } // END for Next Buttons
1420
1579
 
1421
1580
  // add listeners to all Previous Buttons found
1581
+ // -------------------------------------------------------
1422
1582
  var largePreviousButtons = document.getElementsByClassName("large-player-previous");
1423
1583
  for (var i=0; i<largePreviousButtons.length; i++) {
1424
1584
  if (largePreviousButtons[i].dataset.amplitudeSource === 'youtube') {
1425
- // do nothing (managed by plugin)
1585
+ // do nothing for YTP (managed by plugin)
1426
1586
  } else {
1427
1587
  if (largePreviousButtons[i].id === 'large_player_previous_{{player.id}}') {
1428
1588
  largePreviousButtons[i].addEventListener('click', function(event) {
1429
- var atpPlayerID = this.id;
1430
- var atpPlayerActive = atpPlayerID.split('_');
1431
- var playlist = this.getAttribute("data-amplitude-playlist");
1589
+ var atpPlayerID, atpPlayerActive, metaData, playlist;
1590
+
1591
+ atpPlayerID = this.id;
1592
+ atpPlayerActive = atpPlayerID.split('_');
1593
+ playlist = this.getAttribute("data-amplitude-playlist");
1594
+ metaData = Amplitude.getActiveSongMetadata();
1595
+
1596
+ // update song rating in screen controls
1597
+ var largePlayerSongAudioRating = document.getElementsByClassName("audio-rating-screen-controls");
1598
+ if (largePlayerSongAudioRating.length) {
1599
+ for (var i=0; i<largePlayerSongAudioRating.length; i++) {
1600
+ var currentPlaylist = largePlayerSongAudioRating[i].dataset.amplitudePlaylist;
1601
+ if (currentPlaylist === playlist) {
1602
+ if (metaData.rating) {
1603
+ var trackID = metaData.index + 1;
1604
+ logger.debug('\n' + `UPDATE song rating on updatMetaContainers for trackID|playlist at: ${trackID}|${playlist} with a value of: ${metaData.rating}`);
1605
+ largePlayerSongAudioRating[i].innerHTML = '<img src="/assets/image/pattern/rating/scalable/' + metaData.rating + '-star.svg"' + 'alt="song rating">';
1606
+ } else {
1607
+ largePlayerSongAudioRating[i].innerHTML = '';
1608
+ }
1609
+ }
1610
+ }
1611
+ } // END if largePlayerSongAudioRating
1612
+
1613
+ // scroll song active at index in player
1614
+ if (playerAutoScrollSongElement) {
1615
+ j1.adapter.amplitude.atPlayerScrollToActiveElement(playlist);
1616
+ }
1432
1617
 
1433
1618
  // scroll song active at index in player
1434
1619
  if (playerAutoScrollSongElement) {
@@ -1438,22 +1623,20 @@ j1.adapter.amplitude = ((j1, window) => {
1438
1623
  // save YT player data for later use (e.g. events)
1439
1624
  j1.adapter.amplitude.data.activePlayer = 'atp';
1440
1625
  j1.adapter.amplitude.data.atpGlobals.activePlayerType = atpPlayerActive[0];
1441
- }); // END EventListener 'click'
1442
- } // END if ID
1443
- }
1444
- } // END for Previous Buttons
1445
1626
 
1627
+ }); // END addEventListener
1628
+ } // END if largePreviousButtons
1629
+ } // END if largePreviousButtons
1630
+ } // END for Previous Buttons
1446
1631
 
1447
- // click on skip forward|backward (large player)
1632
+ // add listeners to all SkipForward Buttons found
1448
1633
  // See: https://github.com/serversideup/amplitudejs/issues/384
1449
1634
  // -------------------------------------------------------
1450
-
1451
- // add listeners to all SkipForwardButtons found
1452
1635
  var largePlayerSkipForwardButtons = document.getElementsByClassName("large-player-skip-forward");
1453
1636
  for (var i=0; i<largePlayerSkipForwardButtons.length; i++) {
1454
1637
  if (largePlayerSkipForwardButtons[i].id === 'skip-forward_{{player.id}}') {
1455
1638
  if (largePlayerSkipForwardButtons[i].dataset.amplitudeSource === 'youtube') {
1456
- // do nothing (managed by plugin)
1639
+ // do nothing for YTP (managed by plugin)
1457
1640
  } else {
1458
1641
  largePlayerSkipForwardButtons[i].addEventListener('click', function(event) {
1459
1642
  const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
@@ -1462,19 +1645,21 @@ j1.adapter.amplitude = ((j1, window) => {
1462
1645
  const targetTime = parseFloat(currentTime + skipOffset);
1463
1646
 
1464
1647
  if (currentTime > 0) {
1648
+ logger.debug('\n' + `SKIP forward on Button skipForward for ${skipOffset} seconds`);
1465
1649
  Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
1466
1650
  }
1467
- }); // END EventListener 'click'
1468
- } // END else
1469
- } // END if ID
1651
+ }); // END addEventListener
1652
+ } // END largePlayerSkipForwardButtons
1653
+ } // END if largePlayerSkipForwardButtons
1470
1654
  } // END for SkipForwardButtons
1471
1655
 
1472
- // add listeners to all SkipBackwardButtons found
1656
+ // add listeners to all SkipBackward Buttons found
1657
+ // -------------------------------------------------------
1473
1658
  var largePlayerSkipBackwardButtons = document.getElementsByClassName("large-player-skip-backward");
1474
1659
  for (var i=0; i<largePlayerSkipBackwardButtons.length; i++) {
1475
1660
  if (largePlayerSkipBackwardButtons[i].id === 'skip-backward_{{player.id}}') {
1476
1661
  if (largePlayerSkipBackwardButtons[i].dataset.amplitudeSource === 'youtube') {
1477
- // do nothing (managed by plugin)
1662
+ // do nothing for YTP (managed by plugin)
1478
1663
  } else {
1479
1664
  largePlayerSkipBackwardButtons[i].addEventListener('click', function(event) {
1480
1665
  const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
@@ -1483,11 +1668,12 @@ j1.adapter.amplitude = ((j1, window) => {
1483
1668
  const targetTime = parseFloat(currentTime - skipOffset);
1484
1669
 
1485
1670
  if (currentTime > 0) {
1671
+ logger.debug('\n' + `SKIP backward on Button skipForward for ${skipOffset} seconds`);
1486
1672
  Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
1487
1673
  }
1488
- }); // END EventListener 'click'
1674
+ }); // END addEventListener
1489
1675
  } // END else
1490
- } // END if ID
1676
+ } // END if largePlayerSkipBackwardButtons
1491
1677
  } // END for SkipBackwardButtons
1492
1678
 
1493
1679
  // click on shuffle button
@@ -1495,34 +1681,36 @@ j1.adapter.amplitude = ((j1, window) => {
1495
1681
  if (largePlayerShuffleButton) {
1496
1682
  largePlayerShuffleButton.addEventListener('click', function(event) {
1497
1683
  var shuffleState = (document.getElementById('large_player_shuffle').className.includes('amplitude-shuffle-on')) ? true : false;
1684
+ logger.debug('\n' + `Set shuffle state to: ${shuffleState}`);
1498
1685
  Amplitude.setShuffle(shuffleState)
1499
- }); // END EventListener 'click'
1500
- } // END largePlayerShuffleButton
1686
+ }); // END addEventListener
1687
+ } // END if largePlayerShuffleButton
1501
1688
 
1502
1689
  // click on repeat button
1503
1690
  var largePlayerRepeatButton = document.getElementById('large_player_repeat');
1504
1691
  if (largePlayerRepeatButton) {
1505
1692
  largePlayerRepeatButton.addEventListener('click', function(event) {
1506
1693
  var repeatState = (document.getElementById('large_player_repeat').className.includes('amplitude-repeat-on')) ? true : false;
1694
+ logger.debug('\n' + `Set repeat state to: ${repeatState}`);
1507
1695
  Amplitude.setRepeat(repeatState)
1508
- }); // END EventListener 'click'
1696
+ }); // END addEventListener
1509
1697
  } // END if largePlayerRepeatButton
1510
1698
 
1511
- // enable|disable scrolling on playlist (large player)
1699
+ // enable|disable scrolling on playlist (LARGE player)
1512
1700
  // -------------------------------------------------------
1513
1701
  if (document.getElementById('large_player_right') !== null) {
1514
1702
 
1515
1703
  // show|hide scrollbar in playlist
1516
1704
  // -----------------------------------------------------
1517
1705
  var songsInPlaylist = Amplitude.getSongsInPlaylist(playListName);
1518
- if (songsInPlaylist.length <= 8) {
1706
+ if (songsInPlaylist.length <= playerScrollerSongElementMin) {
1519
1707
  const titleListLargePlayer = document.getElementById('large_player_title_list_' + playListName);
1520
1708
  if (titleListLargePlayer !== null) {
1521
1709
  titleListLargePlayer.classList.add('hide-scrollbar');
1522
1710
  }
1523
- }
1711
+ } // END show|hide scrollbar in playlist
1524
1712
 
1525
- // scroll to player top position (large player)
1713
+ // scroll player to top position (LARGE player)
1526
1714
  //
1527
1715
  // Bootstrap grid breakpoints
1528
1716
  // SN: 576px Mobile
@@ -1538,21 +1726,21 @@ j1.adapter.amplitude = ((j1, window) => {
1538
1726
  var playlistHeader = document.getElementById("playlist_header_{{player.id}}");
1539
1727
  var scrollOffset = (window.innerWidth >= 992) ? -130 : -44;
1540
1728
 
1541
- // scroll player|playlist to top position (large player)
1542
- //
1729
+ // scroll player|playlist to top position (LARGE player)
1730
+ // NOTE: depending on WINDOW SIZE the relation changes to TOP POSITION (targetDivPosition)
1731
+ // -- ------------------------------------------------
1543
1732
  const targetDivPlayerRight = playerRight;
1544
1733
  const targetDivPositionPlayerRight = targetDivPlayerRight.offsetTop;
1545
1734
  const targetDivPlaylistHeader = playlistHeader;
1546
1735
  const targetDivPositionplaylistHeader = targetDivPlaylistHeader.offsetTop;
1547
1736
 
1548
- // NOTE: depending on WINDOW SIZE the relation changes to TOP POSITION (targetDivPosition)
1549
- //
1550
1737
  if (targetDivPositionPlayerRight > targetDivPositionplaylistHeader) {
1551
1738
  window.scrollTo(0, targetDivPositionPlayerRight + targetDivPlaylistHeader.offsetParent.firstElementChild.clientHeight + scrollOffset);
1552
1739
  } else {
1553
1740
  window.scrollTo(0, targetDivPositionplaylistHeader + scrollOffset);
1554
1741
  }
1555
- }); // END EventListener 'click' largePlayerTitleHeader
1742
+
1743
+ }); // END addEventListener
1556
1744
 
1557
1745
  var largePlayerPlaylistHeader = document.getElementById("playlist_header_{{player.id}}");
1558
1746
  largePlayerPlaylistHeader.addEventListener('click', function(event) {
@@ -1560,7 +1748,7 @@ j1.adapter.amplitude = ((j1, window) => {
1560
1748
  var playlistHeader = document.getElementById("playlist_header_{{player.id}}");
1561
1749
  var scrollOffset = (window.innerWidth >= 992) ? -130 : -44;
1562
1750
 
1563
- // scroll player|playlist to top position (large player)
1751
+ // scroll player|playlist to top position (LARGE player)
1564
1752
  //
1565
1753
  const targetDivPlayerRight = playerRight;
1566
1754
  const targetDivPositionPlayerRight = targetDivPlayerRight.offsetTop;
@@ -1575,7 +1763,7 @@ j1.adapter.amplitude = ((j1, window) => {
1575
1763
  window.scrollTo(0, targetDivPositionplaylistHeader + scrollOffset);
1576
1764
  }
1577
1765
 
1578
- }); // END EventListener 'click' largePlayerPlaylistHeader
1766
+ }); // END addEventListener
1579
1767
 
1580
1768
  // disable scrolling (if window viewport >= BS Medium and above)
1581
1769
  document.getElementById('large_player_right').addEventListener('mouseenter', function() {
@@ -1586,14 +1774,14 @@ j1.adapter.amplitude = ((j1, window) => {
1586
1774
  $('body').addClass('stop-scrolling');
1587
1775
  }
1588
1776
  }
1589
- }); // END EventListener 'mouseenter'
1777
+ }); // END addEventListener
1590
1778
 
1591
1779
  // enable scrolling
1592
1780
  document.getElementById('large_player_right').addEventListener('mouseleave', function() {
1593
1781
  if ($('body').hasClass('stop-scrolling')) {
1594
1782
  $('body').removeClass('stop-scrolling');
1595
1783
  }
1596
- }); // END EventListener 'mouseleave'
1784
+ }); // END addEventListener
1597
1785
 
1598
1786
  } // END enable|disable scrolling on playlist
1599
1787
 
@@ -1759,30 +1947,78 @@ j1.adapter.amplitude = ((j1, window) => {
1759
1947
  }, // END pluginManager
1760
1948
 
1761
1949
  // -------------------------------------------------------------------------
1762
- // atPlayerScrollToActiveElement(activePlaylist)
1950
+ // atPlayerScrollToActiveElement(metaData)
1763
1951
  // -------------------------------------------------------------------------
1764
- atPlayerScrollToActiveElement: (activePlaylist) => {
1952
+ atPlayerScrollToActiveElement: (metaData) => {
1765
1953
  var scrollableList, songIndex,
1766
- activeElement, activeElementOffsetTop;
1954
+ activeElement, activeElementOffsetTop,
1955
+ songElementMin, numSongs;
1956
+
1957
+ if (!playerAutoScrollSongElement) {
1958
+ // do nothing if playerAutoScrollSongElement is false
1959
+ return;
1960
+ }
1767
1961
 
1768
- scrollableList = document.getElementById('large_player_title_list_' + activePlaylist);
1962
+ songIndex = metaData.index;
1963
+ songElementMin = playerScrollerSongElementMin;
1964
+ numSongs = Amplitude.getSongsInPlaylist(metaData.playlist).length;
1965
+ scrollableList = document.getElementById('large_player_title_list_' + metaData.playlist);
1769
1966
  activeElement = scrollableList.querySelector('.amplitude-active-song-container');
1770
1967
 
1771
1968
  if (activeElement === null || scrollableList === null) {
1772
- // do nothing if NO scrollableList or active element found (failsafe)
1969
+ // do nothing if NO scrollableList or ACTIVE element found (failsafe)
1773
1970
  return;
1774
1971
  }
1775
1972
 
1776
- songIndex = parseInt(activeElement.getAttribute("data-amplitude-song-index"));
1777
- activeElementOffsetTop = songIndex * j1.adapter.amplitude.data.playerSongElementHeigth;
1778
- scrollableList.scrollTop = activeElementOffsetTop;
1779
-
1780
- if (songIndex === 0) {
1781
- var bla = 'puups';
1973
+ if (songIndex > 0 && numSongs >= songElementMin) {
1974
+ scrollableList = document.getElementById('large_player_title_list_' + metaData.playlist);
1975
+ activeElement = scrollableList.querySelector('.amplitude-active-song-container');
1976
+ activeElementOffsetTop = songIndex * j1.adapter.amplitude.data.playerSongElementHeigth;
1977
+ scrollableList.scrollTop = activeElementOffsetTop;
1978
+ } else {
1979
+ // do nothing if songIndex is 0 or less than songElementMin
1980
+ return;
1782
1981
  }
1783
1982
 
1784
1983
  }, // END atPlayerScrollToActiveElement
1785
1984
 
1985
+ // -------------------------------------------------------------------------
1986
+ // atUpdateSongRating(playlist, rating)
1987
+ //
1988
+ // update song rating in playlist-screen|meta-container
1989
+ // -------------------------------------------------------------------------
1990
+ atUpdateSongRating: (metaData) => {
1991
+ var screenControlRating = null;
1992
+ var screenControlRatingElements = document.getElementsByClassName('audio-rating-screen-controls');
1993
+ var ratingIndex;
1994
+
1995
+ for (let i=0; i<screenControlRatingElements.length; i++) {
1996
+ var ratingElement = screenControlRatingElements[i];
1997
+ var rating = parseInt(metaData.rating);
1998
+ var playerType = ratingElement.dataset.playerType;
1999
+ var activePlayerType = j1.adapter.amplitude.data.atpGlobals.activePlayerType;
2000
+ var activePlayist = metaData.playlist;
2001
+
2002
+ if (ratingElement.dataset.amplitudePlaylist === activePlayist && playerType === activePlayerType) {
2003
+ ratingIndex = i;
2004
+ screenControlRating = ratingElement;
2005
+ break;
2006
+ }
2007
+
2008
+ }
2009
+
2010
+ // set the rating for ACTIVE screenControlRatingElement
2011
+ // -----------------------------------------------------------------------
2012
+ if (screenControlRating) {
2013
+ if (rating) {
2014
+ ratingElement.innerHTML = '<img src="/assets/image/pattern/rating/scalable/' + rating + '-star.svg"' + 'alt="song rating">';
2015
+ } else {
2016
+ ratingElement.innerHTML = '';
2017
+ }
2018
+ }
2019
+
2020
+ }, // END atUpdateSongRating
2021
+
1786
2022
  // -------------------------------------------------------------------------
1787
2023
  // messageHandler()
1788
2024
  // manage messages send from other J1 modules