j1-template 2024.3.21 → 2024.3.23

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 (383) hide show
  1. checksums.yaml +4 -4
  2. data/assets/data/amplitude_app.html +60 -51
  3. data/assets/data/{galeries.html → gallery_app.html} +4 -4
  4. data/assets/theme/bla +0 -0
  5. data/assets/theme/j1/adapter/js/advertising.js +40 -38
  6. data/assets/theme/j1/adapter/js/algolia.js +13 -11
  7. data/assets/theme/j1/adapter/js/amplitude.js +628 -380
  8. data/assets/theme/j1/adapter/js/analytics.js +19 -17
  9. data/assets/theme/j1/adapter/js/asciidoctor.js +10 -8
  10. data/assets/theme/j1/adapter/js/attic.js +24 -22
  11. data/assets/theme/j1/adapter/js/bmd.js +10 -8
  12. data/assets/theme/j1/adapter/js/carousel.js +12 -9
  13. data/assets/theme/j1/adapter/js/chatbot.js +106 -104
  14. data/assets/theme/j1/adapter/js/clipboard.js +16 -14
  15. data/assets/theme/j1/adapter/js/comments.js +24 -22
  16. data/assets/theme/j1/adapter/js/cookieConsent.js +5 -1
  17. data/assets/theme/j1/adapter/js/customFunctions.js +12 -10
  18. data/assets/theme/j1/adapter/js/customModule.js +10 -8
  19. data/assets/theme/j1/adapter/js/docsearch.js +33 -31
  20. data/assets/theme/j1/adapter/js/dropdowns.js +16 -14
  21. data/assets/theme/j1/adapter/js/fab.js +34 -32
  22. data/assets/theme/j1/adapter/js/gallery.js +22 -20
  23. data/assets/theme/j1/adapter/js/gemini.js +66 -64
  24. data/assets/theme/j1/adapter/js/iconPicker.js +31 -29
  25. data/assets/theme/j1/adapter/js/iconPickerPage.js +11 -9
  26. data/assets/theme/j1/adapter/js/iframer.js +17 -15
  27. data/assets/theme/j1/adapter/js/j1.js +146 -143
  28. data/assets/theme/j1/adapter/js/lazyLoader.js +33 -31
  29. data/assets/theme/j1/adapter/js/lightbox.js +9 -7
  30. data/assets/theme/j1/adapter/js/logger.js +11 -9
  31. data/assets/theme/j1/adapter/js/lunr.js +37 -35
  32. data/assets/theme/j1/adapter/js/masonry.js +23 -21
  33. data/assets/theme/j1/adapter/js/masterslider.js +31 -29
  34. data/assets/theme/j1/adapter/js/mmenu.js +25 -23
  35. data/assets/theme/j1/adapter/js/navigator.js +43 -41
  36. data/assets/theme/j1/adapter/js/particles.js +12 -10
  37. data/assets/theme/j1/adapter/js/rangeSlider.js +21 -19
  38. data/assets/theme/j1/adapter/js/rouge.js +10 -8
  39. data/assets/theme/j1/adapter/js/rtable.js +14 -12
  40. data/assets/theme/j1/adapter/js/rtextResizer.js +10 -8
  41. data/assets/theme/j1/adapter/js/scroller.js +15 -13
  42. data/assets/theme/j1/adapter/js/slick.js +18 -16
  43. data/assets/theme/j1/adapter/js/slimSelect.js +30 -28
  44. data/assets/theme/j1/adapter/js/speak2me.js +25 -23
  45. data/assets/theme/j1/adapter/js/swiper.js +13 -11
  46. data/assets/theme/j1/adapter/js/themeToggler.js +11 -9
  47. data/assets/theme/j1/adapter/js/themes.js +60 -86
  48. data/assets/theme/j1/adapter/js/toccer.js +13 -11
  49. data/assets/theme/j1/adapter/js/translator.js +19 -16
  50. data/assets/theme/j1/adapter/js/videojs.js +9 -7
  51. data/assets/theme/j1/adapter/js/waves.js +18 -16
  52. data/assets/theme/j1/core/css/themes/unolight/bootstrap.css +19 -52
  53. data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css +1 -1
  54. data/assets/theme/j1/core/js/template.js +11180 -10968
  55. data/assets/theme/j1/core/js/template.min.js +13 -18
  56. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.css +10 -4
  57. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.min.css +1 -1
  58. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.css +15 -8
  59. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.min.css +2 -1
  60. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.css +35 -14
  61. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.min.css +1 -1
  62. data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.js +817 -695
  63. data/assets/theme/j1/modules/backstretch/js/backstretch.js +2 -2
  64. data/assets/theme/j1/modules/backstretch/js/backstretch.min.js +1 -1
  65. data/assets/theme/j1/modules/cookieConsent/js/cookieConsent.js +11 -11
  66. data/assets/theme/j1/modules/cookieConsent/js/cookieConsent.min.js +2 -1
  67. data/assets/theme/j1/modules/dropdowns/js/dropdowns.js +2 -2
  68. data/assets/theme/j1/modules/dropdowns/js/dropdowns.min.js +1 -1
  69. data/assets/theme/j1/modules/fab/js/fab.js +2 -2
  70. data/assets/theme/j1/modules/fab/js/fab.min.js +1 -1
  71. data/assets/theme/j1/modules/lightGallery/!v2.7.2/css/lg-transitions.css +984 -0
  72. data/assets/theme/j1/modules/lightGallery/!v2.7.2/css/lg-transitions.min.css +26 -0
  73. data/assets/theme/j1/modules/lightGallery/!v2.7.2/css/lightgallery-bundle.css +1627 -0
  74. data/assets/theme/j1/modules/lightGallery/!v2.7.2/css/lightgallery-bundle.min.css +25 -0
  75. data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/uno.css +1 -1
  76. data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/uno.min.css +1 -1
  77. data/assets/theme/j1/modules/lightGallery/!v2.7.2/fonts/lg.svg +54 -0
  78. data/assets/theme/j1/modules/lightGallery/!v2.7.2/fonts/lg.ttf +0 -0
  79. data/assets/theme/j1/modules/lightGallery/!v2.7.2/fonts/lg.woff +0 -0
  80. data/assets/theme/j1/modules/lightGallery/!v2.7.2/fonts/lg.woff2 +0 -0
  81. data/assets/theme/j1/modules/lightGallery/!v2.7.2/images/loading.gif +0 -0
  82. data/assets/theme/j1/modules/lightGallery/!v2.7.2/img/loading.gif +0 -0
  83. data/assets/theme/j1/modules/lightGallery/!v2.7.2/img/video-play.png +0 -0
  84. data/assets/theme/j1/modules/lightGallery/!v2.7.2/img/vimeo-play.png +0 -0
  85. data/assets/theme/j1/modules/lightGallery/!v2.7.2/img/youtube-play.png +0 -0
  86. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/lightgallery.js +2782 -0
  87. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/lightgallery.min.js +26 -0
  88. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/parser/webvtt/LICENSE.md +44 -0
  89. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/parser/webvtt/README.md +37 -0
  90. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/parser/webvtt/parser.js +890 -0
  91. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/parser/webvtt/parser.min.js +8 -0
  92. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/j1/lg-video.1.js +585 -0
  93. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-autoplay.js +275 -0
  94. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-autoplay.min.js +26 -0
  95. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-comment.js +230 -0
  96. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-comment.min.js +26 -0
  97. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-fullscreen.js +160 -0
  98. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-fullscreen.min.js +26 -0
  99. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-hash.js +223 -0
  100. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-hash.min.js +27 -0
  101. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-medium-zoom.js +157 -0
  102. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-medium-zoom.min.js +26 -0
  103. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-pager.js +164 -0
  104. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-pager.min.js +26 -0
  105. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-rotate.js +299 -0
  106. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-rotate.min.js +26 -0
  107. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-share.js +244 -0
  108. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-share.min.js +27 -0
  109. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-thumbnail.js +509 -0
  110. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-thumbnail.min.js +26 -0
  111. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-video.js +909 -0
  112. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-video.min.js +26 -0
  113. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-vimeo-thumbnail.js +207 -0
  114. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-vimeo-thumbnail.min.js +26 -0
  115. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-zoom.js +999 -0
  116. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-zoom.min.js +26 -0
  117. data/assets/theme/j1/modules/lightGallery/css/lg-transitions.css +3 -126
  118. data/assets/theme/j1/modules/lightGallery/css/lg-transitions.min.css +3 -10
  119. data/assets/theme/j1/modules/lightGallery/css/lightgallery-bundle.css +70 -237
  120. data/assets/theme/j1/modules/lightGallery/css/lightgallery-bundle.min.css +4 -10
  121. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/animation-w.png +0 -0
  122. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/customize-w.png +0 -0
  123. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/dynamic-w.png +0 -0
  124. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/facebook-icon.svg +10 -0
  125. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/googleplus-icon.svg +30 -0
  126. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/html5-w.png +0 -0
  127. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/linked-in.png +0 -0
  128. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/module-w.png +0 -0
  129. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/play-button-hover.svg +94 -0
  130. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/play-button.png +0 -0
  131. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/play-button.svg +93 -0
  132. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/responsive-w.png +0 -0
  133. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/thumb-w.png +0 -0
  134. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/touch-w.png +0 -0
  135. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/twitter-icon.svg +15 -0
  136. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/twitter.png +0 -0
  137. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/video1-w.png +0 -0
  138. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/zoom-w.png +0 -0
  139. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/zoom.png +0 -0
  140. data/assets/theme/j1/modules/lightGallery/css/theme/uno/uno.css +276 -0
  141. data/assets/theme/j1/modules/lightGallery/css/theme/uno/uno.min.css +17 -0
  142. data/assets/theme/j1/modules/lightGallery/js/lightgallery.js +163 -120
  143. data/assets/theme/j1/modules/lightGallery/js/lightgallery.min.js +6 -6
  144. data/assets/theme/j1/modules/lightGallery/js/plugins/j1/lg-thumbnail.0.js +495 -0
  145. data/assets/theme/j1/modules/lightGallery/js/plugins/j1/lg-thumbnail.1.js +513 -0
  146. data/assets/theme/j1/modules/lightGallery/js/plugins/j1/lg-video.0.js +553 -0
  147. data/assets/theme/j1/modules/lightGallery/js/plugins/j1/lg-video.1.js +1 -1
  148. data/assets/theme/j1/modules/lightGallery/js/plugins/j1/lg-video.2.js +914 -0
  149. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-autoplay.js +4 -4
  150. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-autoplay.min.js +5 -5
  151. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-comment.js +5 -5
  152. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-comment.min.js +6 -6
  153. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-fullscreen.js +4 -4
  154. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-fullscreen.min.js +5 -5
  155. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-hash.js +4 -4
  156. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-hash.min.js +5 -6
  157. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-medium-zoom.js +5 -5
  158. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-medium-zoom.min.js +6 -6
  159. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-pager.js +4 -4
  160. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-pager.min.js +5 -5
  161. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-relative-caption.js +179 -0
  162. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-relative-caption.min.js +32 -0
  163. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-rotate.js +4 -4
  164. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-rotate.min.js +6 -6
  165. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-share.js +4 -4
  166. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-share.min.js +6 -7
  167. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-thumbnail.js +27 -20
  168. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-thumbnail.min.js +5 -5
  169. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.js +77 -125
  170. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.min.js +6 -6
  171. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-vimeo-thumbnail.js +4 -4
  172. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-vimeo-thumbnail.min.js +5 -5
  173. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-zoom.js +11 -5
  174. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-zoom.min.js +5 -5
  175. data/assets/theme/j1/modules/lunr/js/j1.js +1 -1
  176. data/assets/theme/j1/modules/lunr/js/j1.min.js +2 -1
  177. data/assets/theme/j1/modules/rtable/js/rtable.js +2 -2
  178. data/assets/theme/j1/modules/rtable/js/rtable.min.js +2 -1
  179. data/assets/theme/j1/modules/scroller/js/scroller.js +31 -29
  180. data/assets/theme/j1/modules/scroller/js/scroller.min.js +2 -1
  181. data/assets/theme/j1/modules/themeSwitcher/js/switcher.js +38 -37
  182. data/assets/theme/j1/modules/themeSwitcher/js/switcher.min.js +2 -1
  183. data/assets/theme/j1/modules/translator/js/translator.js +17 -17
  184. data/assets/theme/j1/modules/translator/js/translator.min.js +1 -1
  185. data/assets/theme/j1/modules/videoPlayer/tiktoc/README.md +1 -0
  186. data/assets/theme/j1/modules/videojs/!v8.12.0/css/font/README.md +151 -0
  187. data/assets/theme/j1/modules/videojs/!v8.12.0/css/font/VideoJS.svg +150 -0
  188. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/city.css +147 -0
  189. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/city.min.css +5 -0
  190. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/fantasy.css +113 -0
  191. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/fantasy.min.css +5 -0
  192. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/forest.css +166 -0
  193. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/forest.min.css +5 -0
  194. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/sea.css +72 -0
  195. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/sea.min.css +5 -0
  196. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/uno.css +311 -0
  197. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/uno.min.css +19 -0
  198. data/assets/theme/j1/modules/videojs/!v8.12.0/css/videojs.css +1686 -0
  199. data/assets/theme/j1/modules/videojs/!v8.12.0/css/videojs.min.css +13 -0
  200. data/assets/theme/j1/modules/videojs/!v8.12.0/js/video.js +65226 -0
  201. data/assets/theme/j1/modules/videojs/!v8.12.0/js/video.min.js +55 -0
  202. data/assets/theme/j1/modules/videojs/assets/README.md +1 -0
  203. data/assets/theme/j1/modules/videojs/assets/icons/speedometer-medium.svg +35 -0
  204. data/assets/theme/j1/modules/videojs/css/font/VideoJS.ttf +0 -0
  205. data/assets/theme/j1/modules/videojs/css/font/VideoJS.woff +0 -0
  206. data/assets/theme/j1/modules/videojs/css/themes/uno.css +157 -22
  207. data/assets/theme/j1/modules/videojs/css/themes/uno.min.css +1 -1
  208. data/assets/theme/j1/modules/videojs/css/videojs.css +674 -316
  209. data/assets/theme/j1/modules/videojs/css/videojs.min.css +4 -3
  210. data/assets/theme/j1/modules/videojs/js/video.js +15893 -12288
  211. data/assets/theme/j1/modules/videojs/js/video.min.js +22 -23
  212. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/!examples/index.html +31 -0
  213. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/LICENSE +19 -0
  214. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/README.md +69 -0
  215. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/css/aspect-ratio-panel.css +2 -0
  216. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/css/aspect-ratio-panel.min.css +2 -0
  217. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/js/aspect-ratio-panel.js +339 -0
  218. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/js/aspect-ratio-panel.min.js +2 -0
  219. data/assets/theme/j1/modules/videojs/{js/plugins/controls/autocaption → plugins/controls/autocaption/js}/autocaption.js +0 -5
  220. data/assets/theme/j1/modules/videojs/plugins/controls/persist-settings/!examples/index.html +29 -0
  221. data/assets/theme/j1/modules/videojs/plugins/controls/persist-settings/LICENSE +19 -0
  222. data/assets/theme/j1/modules/videojs/plugins/controls/persist-settings/README.md +90 -0
  223. data/assets/theme/j1/modules/videojs/plugins/controls/persist-settings/js/videojs-persist.js +120 -0
  224. data/assets/theme/j1/modules/videojs/plugins/controls/persist-settings/js/videojs-persist.min.js +2 -0
  225. data/assets/theme/j1/modules/videojs/plugins/controls/playbackrate-adjuster/!examples/index.html +37 -0
  226. data/assets/theme/j1/modules/videojs/plugins/controls/playbackrate-adjuster/LICENSE +19 -0
  227. data/assets/theme/j1/modules/videojs/plugins/controls/playbackrate-adjuster/README.md +61 -0
  228. data/assets/theme/j1/modules/videojs/plugins/controls/playbackrate-adjuster/js/playbackrate-adjuster.js +94 -0
  229. data/assets/theme/j1/modules/videojs/plugins/controls/playbackrate-adjuster/js/playbackrate-adjuster.min.js +20 -0
  230. data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/skipbuttons/README.md +25 -11
  231. data/assets/theme/j1/modules/videojs/{css/plugins/controls → plugins/controls/zoom/css}/zoom.css +7 -6
  232. data/assets/theme/j1/modules/videojs/plugins/controls/zoom/css/zoom.min.css +22 -0
  233. data/assets/theme/j1/modules/videojs/{js/plugins/players/dm → plugins/players/dm/js}/dailymotion.js +11 -9
  234. data/assets/theme/j1/modules/videojs/plugins/players/dm/js/dailymotion.min.js +19 -0
  235. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.0.js +521 -0
  236. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.1.js +605 -0
  237. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.3.js +643 -0
  238. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.4.js +583 -0
  239. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.5.js +665 -0
  240. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.6.js +642 -0
  241. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.7.js +673 -0
  242. data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/api → plugins/players/vm/api/js}/vimeo.js +1 -1
  243. data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/api → plugins/players/vm/api/js}/vimeo.min.js +1 -1
  244. data/assets/theme/j1/modules/videojs/{js/plugins/players/vm → plugins/players/vm/js}/vimeo.js +13 -12
  245. data/assets/theme/j1/modules/videojs/plugins/players/vm/js/vimeo.min.js +28 -0
  246. data/assets/theme/j1/modules/videojs/plugins/players/wt/!unused/wistia.0.js +395 -0
  247. data/assets/theme/j1/modules/videojs/plugins/players/wt/!unused/wistia.1.js +401 -0
  248. data/assets/theme/j1/modules/videojs/{js/plugins/players/wt → plugins/players/wt/js}/wistia.js +13 -11
  249. data/assets/theme/j1/modules/videojs/plugins/players/wt/js/wistia.min.js +21 -0
  250. data/assets/theme/j1/modules/videojs/{js/plugins/players/yt → plugins/players/yt/js}/youtube.js +10 -8
  251. data/assets/theme/j1/modules/videojs/plugins/players/yt/js/youtube.min.js +21 -0
  252. data/lib/j1/version.rb +1 -1
  253. data/lib/starter_web/README.md +5 -5
  254. data/lib/starter_web/_config.yml +1 -1
  255. data/lib/starter_web/_data/modules/amplitude_playlists.yml +140 -80
  256. data/lib/starter_web/_data/modules/defaults/amplitude.yml +5 -3
  257. data/lib/starter_web/_data/modules/defaults/gallery.yml +3 -3
  258. data/lib/starter_web/_data/modules/gallery.yml +83 -87
  259. data/lib/starter_web/_data/modules/navigator_menu.yml +3 -3
  260. data/lib/starter_web/_data/resources.yml +16 -12
  261. data/lib/starter_web/_data/templates/feed.xml +1 -1
  262. data/lib/starter_web/_plugins/asciidoctor/videojs-block.rb +50 -22
  263. data/lib/starter_web/_plugins/asciidoctor/youtube-block.rb +37 -16
  264. data/lib/starter_web/_plugins/index/lunr.rb +1 -1
  265. data/lib/starter_web/assets/audio/album/emancipator/Alligator.mp3 +0 -0
  266. data/lib/starter_web/assets/audio/album/emancipator/DabCity.mp3 +0 -0
  267. data/lib/starter_web/assets/audio/album/emancipator/SeaToSky.mp3 +0 -0
  268. data/lib/starter_web/assets/audio/album/emancipator/TimeForSpace.mp3 +0 -0
  269. data/lib/starter_web/assets/audio/cover/emancipator/alligator.jpg +0 -0
  270. data/lib/starter_web/assets/audio/cover/emancipator/anthem.jpg +0 -0
  271. data/lib/starter_web/assets/audio/cover/emancipator/dab-city.jpg +0 -0
  272. data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn.jpg +0 -0
  273. data/lib/starter_web/assets/audio/cover/emancipator/safe-in-the-steep-cliffs.jpg +0 -0
  274. data/lib/starter_web/assets/audio/cover/emancipator/sea-to-sky.jpg +0 -0
  275. data/lib/starter_web/assets/audio/cover/emancipator/soon-it-will-be-cold-enough.jpg +0 -0
  276. data/lib/starter_web/assets/audio/cover/emancipator/tine-for-space.jpg +0 -0
  277. data/lib/starter_web/assets/video/poster/vimeo/fall_2011.jpg +0 -0
  278. data/lib/starter_web/package.json +1 -1
  279. data/lib/starter_web/pages/public/tools/tester/videojs_macro_tester.adoc +282 -0
  280. data/lib/starter_web/pages/public/tour/audio_data.adoc +11 -6
  281. data/lib/starter_web/pages/public/tour/video_data.adoc +1 -0
  282. metadata +238 -115
  283. data/assets/data/swiper_app.2.html +0 -757
  284. data/assets/data/swiper_app.4.html +0 -769
  285. data/assets/theme/j1/modules/videojs/css/plugins/controls/skipbuttons.0.css +0 -32
  286. data/assets/theme/j1/modules/videojs/css/plugins/controls/skipbuttons.1.css +0 -31
  287. data/assets/theme/j1/modules/videojs/css/plugins/controls/zoom.min.css +0 -21
  288. data/assets/theme/j1/modules/videojs/js/plugins/players/dm/dailymotion.min.js +0 -19
  289. data/assets/theme/j1/modules/videojs/js/plugins/players/vm/vimeo.min.js +0 -16
  290. data/assets/theme/j1/modules/videojs/js/plugins/players/wt/api/src/WistiaPlayer.ts +0 -1617
  291. data/assets/theme/j1/modules/videojs/js/plugins/players/wt/wistia.min.js +0 -21
  292. data/assets/theme/j1/modules/videojs/js/plugins/players/yt/youtube.min.js +0 -21
  293. data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/anthem.jpg +0 -0
  294. data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/from-dusk-to-dawn.jpg +0 -0
  295. data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/safe-in-the-steep-cliffs.jpg +0 -0
  296. data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/soon-it-will-be-cold-enough.jpg +0 -0
  297. data/lib/starter_web/assets/video/poster/vimeo/stay_colorful.jpg +0 -0
  298. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/animation-w.png +0 -0
  299. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/customize-w.png +0 -0
  300. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/dynamic-w.png +0 -0
  301. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/facebook-icon.svg +0 -0
  302. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/googleplus-icon.svg +0 -0
  303. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/html5-w.png +0 -0
  304. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/linked-in.png +0 -0
  305. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/module-w.png +0 -0
  306. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/play-button-hover.svg +0 -0
  307. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/play-button.png +0 -0
  308. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/play-button.svg +0 -0
  309. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/responsive-w.png +0 -0
  310. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/thumb-w.png +0 -0
  311. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/touch-w.png +0 -0
  312. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/twitter-icon.svg +0 -0
  313. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/twitter.png +0 -0
  314. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/video1-w.png +0 -0
  315. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/zoom-w.png +0 -0
  316. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/zoom.png +0 -0
  317. /data/assets/theme/j1/modules/lightGallery/{js → !v2.7.2/js}/plugins/j1/j1-video.js +0 -0
  318. /data/assets/theme/j1/modules/lightGallery/{js → !v2.7.2/js}/plugins/j1/j1-video.min.js +0 -0
  319. /data/assets/theme/j1/modules/videoPlayer/dailymotion/js/{!readme → README.md} +0 -0
  320. /data/assets/theme/j1/modules/videoPlayer/tiktoc/{js/player.min.js → player.min.js} +0 -0
  321. /data/assets/theme/j1/modules/videoPlayer/vimeo/js/{!readme → README.md} +0 -0
  322. /data/assets/theme/j1/modules/videoPlayer/wistia/js/{!readme → README.md} +0 -0
  323. /data/assets/theme/j1/modules/videojs/{css → !v8.12.0/css}/font/video-js-cdn.css +0 -0
  324. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/autocaption/LICENSE +0 -0
  325. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/autocaption/README.md +0 -0
  326. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/autocaption → plugins/controls/autocaption/js}/autocaption.min.js +0 -0
  327. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/hotkeys/examples → plugins/controls/hotkeys/!examples}/example.html +0 -0
  328. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/hotkeys/LICENSE.md +0 -0
  329. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/hotkeys/README.md +0 -0
  330. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/hotkeys → plugins/controls/hotkeys/js}/hotkeys.js +0 -0
  331. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/hotkeys → plugins/controls/hotkeys/js}/hotkeys.min.js +0 -0
  332. /data/assets/theme/j1/modules/videojs/{css/plugins/controls → plugins/controls/skipbuttons/css}/skipbuttons.css +0 -0
  333. /data/assets/theme/j1/modules/videojs/{css/plugins/controls → plugins/controls/skipbuttons/css}/skipbuttons.min.css +0 -0
  334. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/skipbuttons → plugins/controls/skipbuttons/js}/skipbuttons.js +0 -0
  335. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/skipbuttons → plugins/controls/skipbuttons/js}/skipbuttons.min.js +0 -0
  336. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/zoom/examples → plugins/controls/zoom/!examples}/index.html +0 -0
  337. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/zoom/examples → plugins/controls/zoom/!examples}/index.js +0 -0
  338. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/zoom/examples → plugins/controls/zoom/!examples}/styles.css +0 -0
  339. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/zoom/LICENSE.md +0 -0
  340. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/zoom/README.md +0 -0
  341. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/zoom → plugins/controls/zoom/js}/zoom.js +0 -0
  342. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/zoom → plugins/controls/zoom/js}/zoom.min.js +0 -0
  343. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/dailymotion-controls.html +0 -0
  344. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/dailymotion-javascript.html +0 -0
  345. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/dailymotion-playlist.html +0 -0
  346. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/global-parameters.html +0 -0
  347. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/simple.html +0 -0
  348. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/switch.html +0 -0
  349. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/dm/LICENSE +0 -0
  350. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/doc → plugins/players/dm}/README.md +0 -0
  351. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/dm/api/LICENSE +0 -0
  352. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/api/doc → plugins/players/dm/api}/README.md +0 -0
  353. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/api → plugins/players/dm/api/js}/dailymotion.sdk.js +0 -0
  354. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/api → plugins/players/dm/api/js}/dailymotion.sdk.min.js +0 -0
  355. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/dm/icon/scalable/dailymotion.svg +0 -0
  356. /data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/examples → plugins/players/vm/!examples}/index.html +0 -0
  357. /data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/examples → plugins/players/vm/!examples}/player/index.html +0 -0
  358. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/vm/LICENSE +0 -0
  359. /data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/doc → plugins/players/vm}/README.md +0 -0
  360. /data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/api/doc → plugins/players/vm/api}/README.md +0 -0
  361. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/vm/api/css/embed.player.css +0 -0
  362. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/vm/api/css/embed.player.uno.css +0 -0
  363. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/vm/api/css/player.css +0 -0
  364. /data/assets/theme/j1/modules/videojs/{js/plugins/players/wt/doc → plugins/players/wt}/README.md +0 -0
  365. /data/assets/theme/j1/modules/videojs/{js/plugins/players/wt/api/doc/Readme.txt → plugins/players/wt/api/README.md} +0 -0
  366. /data/assets/theme/j1/modules/videojs/{js/plugins/players/wt/api → plugins/players/wt/api/js}/wistia.min.js +0 -0
  367. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/global-parameters.html +0 -0
  368. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/simple.html +0 -0
  369. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/switch.html +0 -0
  370. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/youtube-controls.html +0 -0
  371. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/youtube-javascript.html +0 -0
  372. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/youtube-list.html +0 -0
  373. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/youtube-playlist.html +0 -0
  374. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/v3.0.0 → plugins/players/yt/!v3.0.0}/youtube.js +0 -0
  375. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/v3.0.0 → plugins/players/yt/!v3.0.0}/youtube.min.js +0 -0
  376. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/yt/LICENSE +0 -0
  377. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/doc → plugins/players/yt}/README.md +0 -0
  378. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/api → plugins/players/yt/api/js}/youtube.min.js +0 -0
  379. /data/lib/starter_web/assets/audio/album/emancipator/{from-dusk-to-dawn → !info}/!sound.links.txt +0 -0
  380. /data/lib/starter_web/assets/audio/album/emancipator/{from-dusk-to-dawn/Anthem.mp3 → Anthem.mp3} +0 -0
  381. /data/lib/starter_web/assets/audio/album/emancipator/{from-dusk-to-dawn/DuskToDawn.mp3 → DuskToDawn.mp3} +0 -0
  382. /data/lib/starter_web/assets/audio/album/emancipator/{from-dusk-to-dawn/FirstSnow.mp3 → FirstSnow.mp3} +0 -0
  383. /data/lib/starter_web/assets/audio/album/emancipator/{from-dusk-to-dawn/SafeInTheSteepCliffs.mp3 → SafeInTheSteepCliffs.mp3} +0 -0
@@ -6,7 +6,7 @@ regenerate: true
6
6
 
7
7
  {% comment %}
8
8
  # -----------------------------------------------------------------------------
9
- # ~/assets/theme/j1/adapter/js/amplitude.40.js
9
+ # ~/assets/theme/j1/adapter/js/amplitude.41.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.40.js
66
+ # ~/assets/theme/j1/adapter/js/amplitude.41.js
67
67
  # J1 Adapter for the amplitude module
68
68
  #
69
69
  # Product/Info:
@@ -87,34 +87,57 @@ regenerate: true
87
87
 
88
88
  j1.adapter.amplitude = ((j1, window) => {
89
89
 
90
- // global settings
90
+ const isDev = (j1.env === "development" || j1.env === "dev") ? true : false;
91
+
92
+ // Adapter GLOBAL settings
91
93
  // ---------------------------------------------------------------------------
92
94
  var environment = '{{environment}}';
93
95
  var cookie_names = j1.getCookieNames();
94
96
  var user_state = j1.readCookie(cookie_names.user_state);
95
97
  var state = 'not_started';
96
98
 
97
- // module settings
98
99
  // ---------------------------------------------------------------------------
99
-
100
100
  // control|logging
101
- // ---------------------------------------------------------------------------
101
+ // ------------------------------------
102
+ var consoleFilterSettings = {};
102
103
  var _this;
103
104
  var logger;
104
105
  var logText;
105
106
  var toJSON;
106
107
  var toText;
107
108
 
109
+ // --------------------------------------------------------------------------
108
110
  // date|time monitoring
109
- //----------------------------------------------------------------------------
111
+ // ------------------------------------
110
112
  var startTime;
111
113
  var endTime;
112
114
  var startTimeModule;
113
115
  var endTimeModule;
114
116
  var timeSeconds;
115
117
 
116
- // AmplitudeJS API settings
117
- // ---------------------------------------------------------------------------
118
+ // --------------------------------------------------------------------------
119
+ // AmplitudeJS GLOBAL settings
120
+ // ----------------------------------
121
+ const requiredForATP = false;
122
+
123
+ var AUDIO_ERROR = {
124
+ SUCCESSFUL: 0,
125
+ ABORTED: 1,
126
+ NETWORK_ERROR: 2,
127
+ DECODE_ERROR: 3,
128
+ SRC_NOT_SUPPORTED: 4,
129
+ GENERIC_ERROR: 5
130
+ };
131
+
132
+ var AUDIO_ERROR_NAMES = {
133
+ 0: "successful",
134
+ 1: "aborted",
135
+ 2: "network error",
136
+ 3: "decode error",
137
+ 4: "not supported",
138
+ 5: "generic error",
139
+ };
140
+
118
141
  const AT_PLAYER_STATE = {
119
142
  ENDED: 0,
120
143
  PLAYING: 1,
@@ -135,18 +158,20 @@ j1.adapter.amplitude = ((j1, window) => {
135
158
  6: "changed",
136
159
  };
137
160
 
138
- var playLists = {};
139
- var playersUILoaded = { state: false };
140
- var apiInitialized = { state: false };
141
-
142
- var isFadingIn = false;
143
- var isFadingOut = false;
161
+ // var playLists = {};
162
+ var playersUILoaded = { state: false };
163
+ var apiInitialized = { state: false };
164
+ var playerCounter = 0;
165
+ var load_dependencies = {};
166
+ var playersProcessed = [];
167
+ var playersHtmlLoaded = false;
168
+ var processingPlayersFinished = false;
169
+ var isFadingIn = false;
170
+ var isFadingOut = false;
144
171
 
145
172
  var amplitudePlayerState;
146
173
  var amplitudeDefaults;
147
174
  var amplitudePlayers
148
- var amplitudePlaylists
149
- var amplitudeOptions;
150
175
 
151
176
  var ytPlayer;
152
177
  var ytpPlaybackRate
@@ -156,42 +181,49 @@ j1.adapter.amplitude = ((j1, window) => {
156
181
  var pluginManagerEnabled;
157
182
  var playerExistsInPage;
158
183
 
159
- // AmplitudeJS Player DEFAULT settings
184
+
185
+ // AmplitudeJS DEFAULT settings
160
186
  // ---------------------------------------------------------------------------
161
- var playerCounter = 0;
162
- var load_dependencies = {};
163
- var playersProcessed = [];
164
- var playersHtmlLoaded = false;
165
- var processingPlayersFinished = false;
166
187
 
167
- var playerAudioInfo = ('{{amplitude_defaults.playlist.audio_info}}' === 'true') ? true : false;
168
- var playerDefaultPluginManager = ('{{amplitude_defaults.player.plugin_manager.enabled}}' === 'true') ? true : false;
188
+ // PLAYER settings
189
+ // ------------------------------------
190
+ var playerDefaultPluginManager = {{amplitude_defaults.player.plugin_manager.enabled}};
169
191
  var playerDefaultType = '{{amplitude_defaults.player.type}}';
170
192
  var playerDefaultVolume = {{amplitude_defaults.player.volume_slider.preset_value}};
171
193
  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;
174
- var playerPlayNextTitle = ('{{amplitude_defaults.player.play_next_title}}' === 'true') ? true : false;
175
- var playerPauseNextTitle = ('{{amplitude_defaults.player.pause_next_title}}' === 'true') ? true : false;
194
+ var playerRepeat = {{amplitude_defaults.player.player_repeat}};
195
+ var playerShuffle = {{amplitude_defaults.player.player_shuffle}};
196
+ var playerPlayNextTitle = {{amplitude_defaults.player.play_next_title}};
197
+ var playerPauseNextTitle = {{amplitude_defaults.player.pause_next_title}};
176
198
  var playerDelayNextTitle = {{amplitude_defaults.player.delay_next_title}};
177
199
  var playerForwardBackwardSkipSeconds = {{amplitude_defaults.player.forward_backward_skip_seconds}};
200
+ var playerHoverPageScrollDisabled = {{amplitude_defaults.player.player_hover_page_scroll_disabled}};
178
201
 
179
- var playerSongElementHeigthMobile = {{amplitude_defaults.player.song_element_heigth_mobile}};
180
- var playerSongElementHeigthDesktop = {{amplitude_defaults.player.song_element_heigt_desktop}};
202
+ var playerSongElementHeigthMobile = {{amplitude_defaults.player.player_song_element_heigth_mobile}};
203
+ var playerSongElementHeigthDesktop = {{amplitude_defaults.player.player_song_element_heigt_desktop}};
181
204
  var playerScrollerSongElementMin = {{amplitude_defaults.player.player_scroller_song_element_min}};
182
205
  var playerScrollControl = {{amplitude_defaults.player.player_scroll_control}};
183
206
  var playerAutoScrollSongElement = {{amplitude_defaults.player.player_auto_scroll_song_element}};
184
207
 
185
- // AmplitudeJS settings curently NOT used
186
208
  // ---------------------------------------------------------------------------
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}};
190
- var playerVisualizationName = '{{amplitude_defaults.player.visualization.name}}';
209
+ // PLAYLIST settings
210
+ // ------------------------------------
211
+ var playlistAudioInfo = {{amplitude_defaults.playlist.audio_info}};
212
+
213
+ // ---------------------------------------------------------------------------
214
+ // UNUSED settings
215
+ // ------------------------------------
216
+ var playerWaveformsEnabled = {{amplitude_defaults.player.waveforms.enabled}};
217
+ var playerWaveformsSampleRate = {{amplitude_defaults.player.waveforms.sample_rate}};
218
+ var playerVisualizationEnabled = {{amplitude_defaults.player.visualization.enabled}};
219
+ var playerVisualizationName = '{{amplitude_defaults.player.visualization.name}}';
191
220
 
192
221
  // ---------------------------------------------------------------------------
193
222
  // helper functions
194
223
  // ---------------------------------------------------------------------------
224
+ function forceJsError() {
225
+ throw new Error("GENERATED JavaScript error!");
226
+ }
195
227
 
196
228
  // ---------------------------------------------------------------------------
197
229
  // main
@@ -203,6 +235,20 @@ j1.adapter.amplitude = ((j1, window) => {
203
235
  // -------------------------------------------------------------------------
204
236
  init: (options) => {
205
237
 
238
+ // -----------------------------------------------------------------------
239
+ // set console log filters (early)
240
+ // -----------------------------------------------------------------------
241
+ // consoleFilterSettings = {
242
+ // debug: false,
243
+ // };
244
+ // j1.api.consoleFilters.filter(consoleFilterSettings);
245
+ j1.api.consoleFilters.filter();
246
+
247
+ // -----------------------------------------------------------------------
248
+ // set error log filters (JS early)
249
+ // -----------------------------------------------------------------------
250
+ // j1.api.errorFilters.filter();
251
+
206
252
  // -----------------------------------------------------------------------
207
253
  // default module settings
208
254
  // -----------------------------------------------------------------------
@@ -214,15 +260,33 @@ j1.adapter.amplitude = ((j1, window) => {
214
260
  // -----------------------------------------------------------------------
215
261
  // global variable settings
216
262
  // -----------------------------------------------------------------------
217
- amplitudeDefaults = $.extend({}, {{amplitude_defaults | replace: 'nil', 'null' | replace: '=>', ':' }});
218
- amplitudePlayers = $.extend({}, {{amplitude_players | replace: 'nil', 'null' | replace: '=>', ':' }});
219
- amplitudePlaylists = $.extend({}, {{amplitude_playlists | replace: 'nil', 'null' | replace: '=>', ':' }});
220
- amplitudeOptions = $.extend(true, {}, amplitudeDefaults, amplitudePlayers, amplitudePlaylists);
263
+ amplitudeDefaults = $.extend({}, {{amplitude_defaults | replace: 'nil', 'null' | replace: '=>', ':' }});
264
+ amplitudePlayers = $.extend({}, {{amplitude_players | replace: 'nil', 'null' | replace: '=>', ':' }});
221
265
 
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;
266
+ // set AmplitudeJS data for later use (e.g events)
267
+ // -----------------------------------------------------------------------
268
+ j1.modules.amplitudejs = {};
269
+ j1.modules.amplitudejs.songIndex = false;
270
+ j1.modules.amplitudejs.defaults = amplitudeDefaults;
271
+ j1.modules.amplitudejs.players = amplitudePlayers || {};
272
+ j1.modules.amplitudejs.data = {};
273
+ j1.modules.amplitudejs.data.activePlayer = 'not_set';
274
+ j1.modules.amplitudejs.data.playerSongElementHeigth = playerSongElementHeigthDesktop;
275
+ j1.modules.amplitudejs.data.atp = {};
276
+ j1.modules.amplitudejs.data.ytp = {};
277
+
278
+ // set INITIAL AmplitudeJS data
279
+ // -----------------------------------------------------------------------
280
+ j1.modules.amplitudejs.data.atp.activeIndex = false;
281
+ j1.modules.amplitudejs.data.atp.playlist = false
282
+ j1.modules.amplitudejs.data.atp.apiError = false;
283
+ j1.modules.amplitudejs.data.atp.apiReady = false ;
284
+ j1.modules.amplitudejs.data.atp.playlist = false;
285
+ j1.modules.amplitudejs.data.atp.players = {};
286
+ j1.modules.amplitudejs.data.ytp.apiError = false;
287
+ j1.modules.amplitudejs.data.ytp.apiReady = false;
288
+ j1.modules.amplitudejs.data.ytp.players = {};
289
+ j1.modules.amplitudejs.data.ytp.plugin = false;
226
290
 
227
291
  // -----------------------------------------------------------------------
228
292
  // control|logging settings
@@ -230,13 +294,15 @@ j1.adapter.amplitude = ((j1, window) => {
230
294
  _this = j1.adapter.amplitude;
231
295
  logger = log4javascript.getLogger('j1.adapter.amplitude');
232
296
 
233
- // prepare data element for later use
297
+ // save amplitudejs data for later use (e.g. events)
298
+ // -----------------------------------------------------------------------
234
299
  j1.adapter.amplitude.data = {};
235
300
  j1.adapter.amplitude.data.atpGlobals = {};
236
301
  j1.adapter.amplitude.data.ytpGlobals = {};
237
302
  j1.adapter.amplitude.data.ytPlayers = {};
238
303
 
239
- // (initial) YT player data for later use (e.g. events)
304
+ // initial amplitudejs data
305
+ // -----------------------------------------------------------------------
240
306
  j1.adapter.amplitude.data.playerSongElementHeigth = playerSongElementHeigthDesktop;
241
307
  j1.adapter.amplitude.data.activePlayer = 'not_set';
242
308
  j1.adapter.amplitude.data.atpGlobals.activePlayerType = 'not_set';
@@ -256,13 +322,19 @@ j1.adapter.amplitude = ((j1, window) => {
256
322
  startTimeModule = Date.now();
257
323
 
258
324
  _this.setState('started');
259
- logger.debug('\n' + 'module state: ' + _this.getState());
260
- logger.info('\n' + 'module is being initialized');
325
+ logger.debug('module state: ' + _this.getState());
326
+ logger.info('module is being initialized');
327
+
328
+ // test data for console filters
329
+ // -------------------------------------------------------------------
330
+ // console.warn("consoleFilters: Diese WARNUNG wird gefiltert.");
331
+ // isDev && logger.warn("consoleFilters: Diese WARNUNG wird gefiltert.");
332
+ // console.warn("consoleFilters: Diese Meldung wird nicht gefiltert.");
333
+ // isDev && logger.warn("consoleFilters: Diese Meldung wird nicht gefiltert.");
261
334
 
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
- // });
335
+ // test data for error filters
336
+ // -------------------------------------------------------------------
337
+ // forceJsError();
266
338
 
267
339
  // -------------------------------------------------------------------
268
340
  // create global playlist (songs)
@@ -327,7 +399,7 @@ j1.adapter.amplitude = ((j1, window) => {
327
399
  // -------------------------------------------------------------------------
328
400
  songLoader: (songs) => {
329
401
 
330
- logger.info('\n' + 'creating global playlist (API): started');
402
+ logger.info('creating global playlist (API): started');
331
403
 
332
404
  // -----------------------------------------------------------------------
333
405
  // initialize amplitude songs
@@ -363,12 +435,21 @@ j1.adapter.amplitude = ((j1, window) => {
363
435
  continue;
364
436
  } else if (key === 'rating') {
365
437
  song.rating = item[key];
366
- continue;
367
- } else if (key === 'audio_single') {
368
- song.audio_single = item[key];
369
- continue;
438
+ continue;
439
+ } else if (key === 'playlist') {
440
+ song.playlist = item[key];
441
+ continue;
370
442
  } else if (key === 'shuffle') {
371
- song.shuffle = item[key];
443
+ song.shuffle = ((!!item[key]) === false) ? playerShuffle : item[key];
444
+ continue;
445
+ } else if (key === 'repeat') {
446
+ song.repeat = ((!!item[key]) === false) ? playerRepeat : item[key];
447
+ continue;
448
+ } else if (key === 'start') {
449
+ song.start = ((!!item[key]) === false) ? '00:00:00' : item[key];
450
+ continue;
451
+ } else if (key === 'end') {
452
+ song.end = ((!!item[key]) === false) ? '00:00:00' : item[key];
372
453
  continue;
373
454
  } else {
374
455
  song[key] = item[key];
@@ -381,7 +462,7 @@ j1.adapter.amplitude = ((j1, window) => {
381
462
 
382
463
  {% endif %} {% endfor %}
383
464
 
384
- logger.info('\n' + 'creating global playlist (API): finished');
465
+ logger.info('creating global playlist (API): finished');
385
466
  }, // END songLoader
386
467
 
387
468
  // -------------------------------------------------------------------------
@@ -393,7 +474,7 @@ j1.adapter.amplitude = ((j1, window) => {
393
474
  // -----------------------------------------------------------------------
394
475
  // initialize HTML portion (UI) for all players configured|enabled
395
476
  // -----------------------------------------------------------------------
396
- logger.info('\n' + 'loading player HTML components (UI): started');
477
+ logger.info('loading player HTML components (UI): started');
397
478
 
398
479
  {% for player in amplitude_options.players %} {% if player.enabled %}
399
480
  {% assign xhr_data_path = amplitude_options.xhr_data_path %}
@@ -404,7 +485,7 @@ j1.adapter.amplitude = ((j1, window) => {
404
485
  playerExistsInPage = ($('#' + '{{xhr_container_id}}')[0] !== undefined) ? true : false;
405
486
  if (playerExistsInPage) {
406
487
  playerCounter++;
407
- logger.debug('\n' + 'load player UI on ID #{{player.id}}: started');
488
+ logger.debug('load player UI on ID #{{player.id}}: started');
408
489
 
409
490
  j1.loadHTML({
410
491
  xhr_container_id: '{{xhr_container_id}}',
@@ -428,7 +509,7 @@ j1.adapter.amplitude = ((j1, window) => {
428
509
 
429
510
  if (xhrLoadState === 'success') {
430
511
  playersProcessed.push('{{xhr_container_id}}');
431
- logger.debug('\n' + 'load player UI on ID #{{player.id}}: finished');
512
+ logger.debug('load player UI on ID #{{player.id}}: finished');
432
513
 
433
514
  clearInterval(load_dependencies['dependencies_met_html_loaded_{{player.id}}']);
434
515
  }
@@ -444,7 +525,7 @@ j1.adapter.amplitude = ((j1, window) => {
444
525
  }
445
526
 
446
527
  if (processingPlayersFinished) {
447
- logger.info('\n' + 'loading player HTML components (UI): finished');
528
+ logger.info('loading player HTML components (UI): finished');
448
529
 
449
530
  clearInterval(load_dependencies['dependencies_met_players_loaded']);
450
531
  playersLoaded.state = true;
@@ -458,7 +539,7 @@ j1.adapter.amplitude = ((j1, window) => {
458
539
  // -------------------------------------------------------------------------
459
540
  initApi: (songlist) => {
460
541
 
461
- logger.info('\n' + 'initialze API: started');
542
+ logger.info('initialze API: started');
462
543
 
463
544
  {% comment %} collect playlists
464
545
  -------------------------------------------------------------------------- {% endcomment %}
@@ -480,7 +561,6 @@ j1.adapter.amplitude = ((j1, window) => {
480
561
  {% capture song_item %}
481
562
  {
482
563
  "name": "{{item.title}}",
483
- // "track": "{{item.track}}",
484
564
  "artist": "{{item.artist}}",
485
565
  "playlist": "{{item.playlist}}",
486
566
  "album": "{{item.name}}",
@@ -490,8 +570,8 @@ j1.adapter.amplitude = ((j1, window) => {
490
570
  "start": "{{item.start}}",
491
571
  "end": "{{item.end}}",
492
572
  "shuffle": "{{item.shuffle}}",
573
+ "repeat": "{{item.repeat}}",
493
574
  "duration": "{{item.duration}}",
494
- "audio_single": "{{item.audio_single}}",
495
575
  // "audio_fade_in": "{{item.audio_fade_in}}",
496
576
  // "audio_fade_out": "{{item.audio_fade_out}}",
497
577
  "cover_art_url": "{{item.cover_image}}"
@@ -541,15 +621,14 @@ j1.adapter.amplitude = ((j1, window) => {
541
621
  },
542
622
  callbacks: {
543
623
  initialized: function() {
544
- var amplitudeConfig = Amplitude.getConfig();
545
- logger.info('\n' + 'initialze API: finished');
546
- // indicate api successfully initialized
547
- apiInitialized.state = true;
624
+ onInitialized();
548
625
  },
549
- onInitError: function() {
550
- // indicate api failed on initialization
551
- apiInitialized.state = false;
552
- console.error('\n' + 'Amplitude API failed on initialization');
626
+ error: function(event) {
627
+ if (event === undefined) {
628
+ onAudioError(0);
629
+ } else {
630
+ onAudioError(event);
631
+ }
553
632
  },
554
633
  play: function() {
555
634
  // make sure the player is playing
@@ -585,7 +664,7 @@ j1.adapter.amplitude = ((j1, window) => {
585
664
  var currentState = Amplitude.getPlayerState();
586
665
  onPlayerStateChange(4);
587
666
  if (playerDelayNextTitle) {
588
- logger.debug('\n' + 'delay on previous title: ' + songMetaData.name + ' with titleIndex ' + songMetaData.index);
667
+ logger.debug('delay on previous title: ' + songMetaData.name + ' with titleIndex ' + songMetaData.index);
589
668
  }
590
669
 
591
670
  if (playerPauseNextTitle) {
@@ -593,7 +672,7 @@ j1.adapter.amplitude = ((j1, window) => {
593
672
  if (amplitudePlayerState === 'playing' || amplitudePlayerState === 'stopped' ) {
594
673
  setTimeout(() => {
595
674
  // pause playback of next title
596
- logger.debug('\n' + 'paused on next title: ' + songMetaData.name);
675
+ logger.debug('paused on next title: ' + songMetaData.name);
597
676
  Amplitude.pause();
598
677
  }, 150);
599
678
  } // END if playing
@@ -604,7 +683,7 @@ j1.adapter.amplitude = ((j1, window) => {
604
683
  next: function() {
605
684
  onPlayerStateChange(5);
606
685
  if (playerDelayNextTitle) {
607
- logger.debug('\n' + 'delay on next title: ' + songMetaData.name + ' with titleIndex ' + songMetaData.index);
686
+ logger.debug('delay on next title: ' + songMetaData.name + ' with titleIndex ' + songMetaData.index);
608
687
  }
609
688
 
610
689
  if (playerPauseNextTitle) {
@@ -612,7 +691,7 @@ j1.adapter.amplitude = ((j1, window) => {
612
691
  if (amplitudePlayerState === 'playing' || amplitudePlayerState === 'stopped' ) {
613
692
  setTimeout(() => {
614
693
  // pause playback of next title
615
- logger.debug('\n' + 'paused on next title: ' + songMetaData.name);
694
+ logger.debug('paused on next title: ' + songMetaData.name);
616
695
  Amplitude.pause();
617
696
  }, 150);
618
697
  } // END if playing
@@ -637,58 +716,6 @@ j1.adapter.amplitude = ((j1, window) => {
637
716
 
638
717
  }); // END Amplitude init
639
718
 
640
- // -----------------------------------------------------------------------
641
- // timestamp2seconds
642
- //
643
- // TODO: Add support for timestamp w/o hours like mm:ss
644
- // -----------------------------------------------------------------------
645
- function timestamp2seconds(timestamp) {
646
- // split timestamp
647
- const parts = timestamp.split(':');
648
-
649
- // check timestamp format
650
- if (parts.length !== 3) {
651
- // return "invalid timestamp";
652
- return false;
653
- }
654
-
655
- // convert parts to integers
656
- const hours = parseInt(parts[0], 10);
657
- const minutes = parseInt(parts[1], 10);
658
- const seconds = parseInt(parts[2], 10);
659
-
660
- // check valid timestamp values
661
- if (isNaN(hours) || isNaN(minutes) || isNaN(seconds) ||
662
- hours < 0 || hours > 23 ||
663
- minutes < 0 || minutes > 59 ||
664
- seconds < 0 || seconds > 59) {
665
- return "invalid timestamp";
666
- }
667
-
668
- const totalSeconds = (hours * 3600) + (minutes * 60) + seconds;
669
-
670
- return totalSeconds;
671
- } // END timestamp2seconds
672
-
673
- // -----------------------------------------------------------------------
674
- // seconds2timestamp
675
- // -----------------------------------------------------------------------
676
- function seconds2timestamp(seconds) {
677
-
678
- if (isNaN(seconds)) {
679
- return false;
680
- }
681
-
682
- const hours = Math.floor(seconds / 3600);
683
- const minutes = Math.floor((seconds % 3600) / 60);
684
- const remainSeconds = seconds % 60;
685
- const tsHours = hours.toString().padStart(2, '0');
686
- const tsMinutes = minutes.toString().padStart(2, '0');
687
- const tsSeconds = remainSeconds.toString().padStart(2, '0');
688
-
689
- return `${tsHours}:${tsMinutes}:${tsSeconds}`;
690
- } // END seconds2timestamp
691
-
692
719
  // -----------------------------------------------------------------------
693
720
  // atpFadeInAudio
694
721
  // -----------------------------------------------------------------------
@@ -710,7 +737,7 @@ j1.adapter.amplitude = ((j1, window) => {
710
737
  // transition will be
711
738
  const iterationSteps = {
712
739
  'default': 150,
713
- 'slow': 250,
740
+ 'slow': 250,
714
741
  'slower': 350,
715
742
  'slowest': 500
716
743
  };
@@ -721,7 +748,7 @@ j1.adapter.amplitude = ((j1, window) => {
721
748
  currentStep = 1;
722
749
 
723
750
  if (volumeSlider === undefined || volumeSlider === null) {
724
- logger.warn('\n' + 'no volume slider found at playerID: ' + settings.playerID);
751
+ isDev && logger.warn('no volume slider found at playerID: ' + settings.playerID);
725
752
  return;
726
753
  }
727
754
 
@@ -767,7 +794,7 @@ j1.adapter.amplitude = ((j1, window) => {
767
794
  // transition will be
768
795
  const iterationSteps = {
769
796
  'default': 150,
770
- 'slow': 250,
797
+ 'slow': 250,
771
798
  'slower': 350,
772
799
  'slowest': 500
773
800
  };
@@ -783,7 +810,12 @@ j1.adapter.amplitude = ((j1, window) => {
783
810
  var songEndTS = songMetaData.end;
784
811
  var playlist = songMetaData.playlist;
785
812
  var songIndex = songMetaData.index;
786
- var trackID = songIndex + 1;
813
+ var trackID = songIndex + 1;
814
+
815
+ // save AT player data for later use (e.g. events)
816
+ // ---------------------------------------------------------------------
817
+ j1.modules.amplitudejs.data.atp.activeIndex = songIndex;
818
+ j1.modules.amplitudejs.data.atp.playlist = playlist;
787
819
 
788
820
  if (volumeSlider !== null) {
789
821
  const fadeOutInterval = setInterval(() => {
@@ -798,7 +830,7 @@ j1.adapter.amplitude = ((j1, window) => {
798
830
  songs = Amplitude.getSongsInPlaylist(playlist);
799
831
 
800
832
  if (songIndex === songs.length-1) {
801
- logger.debug('\n' + 'restore player volume on last trackID|volume at: ' + trackID + '|' + defaultVolume);
833
+ logger.debug('restore player volume on last trackID|volume at: ' + trackID + '|' + defaultVolume);
802
834
  volumeSlider.value = defaultVolume;
803
835
  }
804
836
 
@@ -816,131 +848,69 @@ j1.adapter.amplitude = ((j1, window) => {
816
848
  // wrraper for states that are not processed
817
849
  // -----------------------------------------------------------------------
818
850
  function doNothingOnStateChange(state) {
819
- var playlist, songMetaData, songIndex, trackID;
851
+ var playlist, playerID, songMetaData,
852
+ songIndex, trackID;
820
853
 
821
854
  playlist = Amplitude.getActivePlaylist();
855
+ playerID = playlist + '_large';
822
856
  songMetaData = Amplitude.getActiveSongMetadata();
823
857
  songIndex = songMetaData.index;
824
858
  trackID = songIndex + 1;
825
859
 
826
- logger.warn('\n' + `DO NOTHING on StateChange for playlist: ${playlist} at trackID|state: ${trackID}|${AT_PLAYER_STATE_NAMES[state]}`);
860
+ // save AT player data for later use (e.g. events)
861
+ // ---------------------------------------------------------------------
862
+ j1.modules.amplitudejs.data.atp.activeIndex = songIndex;
863
+ j1.modules.amplitudejs.data.atp.playlist = playlist;
864
+
865
+ isDev && logger.warn(`DO NOTHING on StateChange for playlist: ${playlist} at trackID|state: ${trackID}|${AT_PLAYER_STATE_NAMES[state]}`);
827
866
 
828
867
  } // END doNothingOnStateChange
829
868
 
830
869
  // -----------------------------------------------------------------------
831
870
  // processOnStateChangePlaying()
832
871
  //
833
- // wrraper to update the ACTIVE player on state PLAYING
872
+ // wrraper to process the ACTIVE player on state PLAYING
834
873
  // -----------------------------------------------------------------------
835
874
  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;
875
+ var songMetaData, songIndex, playlist, trackID;
841
876
 
842
877
  songMetaData = Amplitude.getActiveSongMetadata();
843
878
  songIndex = songMetaData.index;
844
- playList = Amplitude.getActivePlaylist();
879
+ playlist = Amplitude.getActivePlaylist();
845
880
  trackID = songIndex + 1;
846
- songStartTS = songMetaData.start;
847
- songEndTS = songMetaData.end;
848
- songStartSec = timestamp2seconds(songStartTS);
849
- songEndSec = timestamp2seconds(songEndTS);
850
- startVolume = Amplitude.getVolume();
851
881
 
852
- logger.debug('\n' + `PLAY audio on processOnStateChangePlaying for playlist \'${playList}\' at trackID|state: ${trackID}|${AT_PLAYER_STATE_NAMES[state]}`);
882
+ // save AT player data for later use (e.g. events)
883
+ // ---------------------------------------------------------------------
884
+ j1.modules.amplitudejs.data.atp.activeIndex = songIndex;
885
+ j1.modules.amplitudejs.data.atp.playlist = playlist;
853
886
 
854
- // update song rating in playlist-screen|meta-container
855
- // -------------------------------------------------------------------
856
- j1.adapter.amplitude.atUpdateSongRating(Amplitude.getActiveSongMetadata());
887
+ logger.debug(`PLAY audio on AT Player at playlist|trackID: ${playlist}|${trackID}`);
857
888
 
858
- // scroll active song in players playlist
859
- // ---------------------------------------------------------------------
860
- j1.adapter.amplitude.atPlayerScrollToActiveElement(Amplitude.getActiveSongMetadata());
889
+ // save player GLOBAL data for later use (e.g. events)
890
+ j1.adapter.amplitude.data.activePlayer = 'atp';
891
+
892
+ // set song (manually) active at index in playlist
893
+ _this.setSongActive(playlist, songIndex);
861
894
 
862
895
  // 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
- }
877
- }
896
+ // ---------------------------------------------------------------------
897
+ _this.atpStopParallelActivePlayers(j1.adapter.amplitude.data.ytPlayers);
878
898
 
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
899
+ // update song rating in playlist-screen|meta-container
900
+ // ---------------------------------------------------------------------
901
+ _this.atpUpdatMetaContainers(songMetaData);
900
902
 
901
- } // END if songStartSec
903
+ // scroll active song in players playlist
904
+ // ---------------------------------------------------------------------
905
+ _this.atPlayerScrollToActiveElement(songMetaData);
902
906
 
903
- clearInterval(checkIsFading);
904
- }
905
- }, 100); // END checkIsFading
906
-
907
- // check|process audio for configured END position
908
- // -------------------------------------------------------------------
909
- if (songEndSec > songStartSec) {
910
- var checkIsOnVideoEnd = setInterval(() => {
911
-
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;
922
-
923
- // seek audio out to total end END position
924
- // NOTE: use setSongPlayedPercentage for seeking to NOT
925
- // generation any addition state changes like stopped
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 });
935
- } // END if fadeAudio
936
-
937
- clearInterval(checkIsOnVideoEnd);
938
- } // END if currentAudioTime
939
-
940
- } // END if !isFading
941
-
942
- }, 100); // END checkIsOnVideoEnd
943
- } // END if songEndSec
907
+ // process audio for AT players at configured START position
908
+ // ---------------------------------------------------------------------
909
+ _this.atpProcessAudioStartPosition();
910
+
911
+ // process audio for AT players at configured END position
912
+ // ---------------------------------------------------------------------
913
+ _this.atpProcessAudioEndPosition();
944
914
 
945
915
  // save YT player data for later use (e.g. events)
946
916
  // ---------------------------------------------------------------------
@@ -949,6 +919,28 @@ j1.adapter.amplitude = ((j1, window) => {
949
919
 
950
920
  }; // END processOnStateChangePlaying
951
921
 
922
+ // -----------------------------------------------------------------------
923
+ // onInitialized
924
+ //
925
+ // Errors fired by the YT API
926
+ // -----------------------------------------------------------------------
927
+ function onInitialized() {
928
+ // indicate api failed on initialization
929
+ apiInitialized.state = true;
930
+ j1.modules.amplitudejs.data.atp.apiReady = apiInitialized.state;
931
+ } // END onInitialized
932
+
933
+ // -----------------------------------------------------------------------
934
+ // onAudioError
935
+ //
936
+ // Errors fired by the YT API
937
+ // -----------------------------------------------------------------------
938
+ function onAudioError(event) {
939
+ if (event > 0) {
940
+ logger.warn(`Audio API error occured: ${AUDIO_ERROR_NAMES[event]}`);
941
+ }
942
+ } // END onAudioError
943
+
952
944
  // -----------------------------------------------------------------------
953
945
  // onPlayerStateChange
954
946
  //
@@ -989,7 +981,7 @@ j1.adapter.amplitude = ((j1, window) => {
989
981
  doNothingOnStateChange(AT_PLAYER_STATE.ENDED);
990
982
  break;
991
983
  default:
992
- logger.error('\n' + `UNKNOWN state on StateChange fired: ${state}`);
984
+ logger.error(`UNKNOWN state on StateChange fired: ${state}`);
993
985
  } // END switch state
994
986
  } // END onPlayerStateChange
995
987
 
@@ -1034,7 +1026,7 @@ j1.adapter.amplitude = ((j1, window) => {
1034
1026
  var parentContainer = (document.getElementById('{{xhr_container_id}}') !== null) ? true : false;
1035
1027
  var parentContainerExist = ($('#' + '{{xhr_container_id}}')[0] !== undefined) ? true : false;
1036
1028
 
1037
- logger.info('\n' + 'initialize player specific UI events: started');
1029
+ logger.info('initialize player specific UI events: started');
1038
1030
 
1039
1031
  {% for player in amplitude_options.players %} {% if player.enabled %}
1040
1032
  {% assign xhr_data_path = amplitude_options.xhr_data_path %}
@@ -1055,22 +1047,22 @@ j1.adapter.amplitude = ((j1, window) => {
1055
1047
  if (xhrDataLoaded && playerExistsInPage) {
1056
1048
  var playerID = '{{player.id}}';
1057
1049
  var playerType = '{{player.type}}';
1058
- var playList = '{{player.playlist}}';
1059
- var playListName = '{{player.playlist.name}}';
1060
- var playListTitle = '{{player.playlist.title}}';
1050
+ var playlist = '{{player.playlist}}';
1051
+ var playlistName = '{{player.playlist.name}}';
1052
+ var playlistTitle = '{{player.playlist.title}}';
1061
1053
 
1062
- logger.debug('\n' + 'initialize audio player instance on id: {{player.id}}');
1054
+ logger.debug('initialize audio player instance on id: {{player.id}}');
1063
1055
 
1064
1056
  // set song (title) specific audio info links
1065
1057
  // -------------------------------------------------------------
1066
- if (playerAudioInfo) {
1058
+ if (playlistAudioInfo) {
1067
1059
  var infoLinks = document.getElementsByClassName('audio-info-link');
1068
1060
  _this.setAudioInfo(infoLinks);
1069
1061
  }
1070
1062
 
1071
1063
  // set player specific UI events
1072
1064
  // -------------------------------------------------------------
1073
- logger.debug('\n' + 'setup audio player specific UI events on ID #{{player.id}}: started');
1065
+ logger.debug('setup audio player specific UI events on ID #{{player.id}}: started');
1074
1066
 
1075
1067
  var dependencies_met_api_initialized = setInterval (() => {
1076
1068
  if (apiInitialized.state) {
@@ -1090,7 +1082,7 @@ j1.adapter.amplitude = ((j1, window) => {
1090
1082
  // do nothing (managed by plugin)
1091
1083
  } else {
1092
1084
  // var currentPlaylist = compactPlayerPlayPauseButton[i].dataset.amplitudePlaylist;
1093
- // if (currentPlaylist === playListName) {
1085
+ // if (currentPlaylist === playlistName) {
1094
1086
  if (miniPlayerPlayPauseButton[i].id === 'mini_player_play_pause_{{player.id}}') {
1095
1087
  miniPlayerPlayPauseButton[i].addEventListener('click', function(event) {
1096
1088
  var ytpPlayer;
@@ -1135,9 +1127,9 @@ j1.adapter.amplitude = ((j1, window) => {
1135
1127
 
1136
1128
  // show|hide scrollbar in playlist (compact player)
1137
1129
  // -------------------------------------------------------
1138
- const songsInPlaylist = Amplitude.getSongsInPlaylist(playListName);
1130
+ const songsInPlaylist = Amplitude.getSongsInPlaylist(playlistName);
1139
1131
  if (songsInPlaylist.length <= playerScrollerSongElementMin) {
1140
- const titleListCompactPlayer = document.getElementById('compact_player_title_list_' + playListName);
1132
+ const titleListCompactPlayer = document.getElementById('compact_player_title_list_' + playlistName);
1141
1133
  if (titleListCompactPlayer !== null) {
1142
1134
  titleListCompactPlayer.classList.add('hide-scrollbar');
1143
1135
  }
@@ -1268,7 +1260,7 @@ j1.adapter.amplitude = ((j1, window) => {
1268
1260
  // do nothing (managed by plugin)
1269
1261
  } else {
1270
1262
  // var currentPlaylist = compactPlayerPlayPauseButton[i].dataset.amplitudePlaylist;
1271
- // if (currentPlaylist === playListName) {
1263
+ // if (currentPlaylist === playlistName) {
1272
1264
  if (compactPlayerPlayPauseButton[i].id === 'compact_player_play_pause_{{player.id}}' || compactPlayerPlayPauseButton[i].id === 'compact_player_list_play_pause_{{player.id}}') {
1273
1265
  compactPlayerPlayPauseButton[i].addEventListener('click', function(event) {
1274
1266
  var ytpPlayer;
@@ -1280,13 +1272,13 @@ j1.adapter.amplitude = ((j1, window) => {
1280
1272
  for (let i=0; i<ytPlayers.length; i++) {
1281
1273
  const playerID = ytPlayers[i];
1282
1274
  const playerProperties = j1.adapter.amplitude.data.ytPlayers[playerID];
1283
- logger.debug('\n' + 'process player id: ' + playerID);
1275
+ logger.debug('process player id: ' + playerID);
1284
1276
  ytpPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
1285
1277
  playerState = ytpPlayer.getPlayerState();
1286
1278
  ytpPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1287
1279
 
1288
1280
  if (ytpPlayerState === 'playing' || ytpPlayerState === 'paused' || ytpPlayerState === 'buffering') {
1289
- logger.debug('\n' + 'process player id: ' + playerID + ' stopped');
1281
+ logger.debug('process player id: ' + playerID + ' stopped');
1290
1282
  ytpPlayer.stopVideo();
1291
1283
  }
1292
1284
  }
@@ -1391,17 +1383,19 @@ j1.adapter.amplitude = ((j1, window) => {
1391
1383
  if (document.getElementById('{{player.id}}') !== null) {
1392
1384
  // var playlist = '{{player.id}}_yt';
1393
1385
  var playlistInfo = {{player.playlist | replace: 'nil', 'null' | replace: '=>', ':'}};
1394
- var playList = playlistInfo.name;
1386
+ var playlist = playlistInfo.name;
1395
1387
 
1388
+ {% comment %} PREPARED event listener for LATER use
1389
+ ----------------------------------------------------------
1396
1390
  // add listeners to all SongContainers found (LARGE player)
1397
- // -------------------------------------------------------
1391
+ // -------------------------------------------------------
1398
1392
  var largePlayerSongContainer = document.getElementsByClassName("amplitude-song-container");
1399
1393
  for (var i=0; i<largePlayerSongContainer.length; i++) {
1400
1394
  if (largePlayerSongContainer[i].dataset.amplitudeSource === 'youtube') {
1401
1395
  // do nothing for YTP (managed by plugin)
1402
1396
  } else {
1403
1397
  var currentPlaylist = largePlayerSongContainer[i].dataset.amplitudePlaylist;
1404
- if (currentPlaylist === playList) {
1398
+ if (currentPlaylist === playlist) {
1405
1399
  // if (largePlayerSongContainer[i].id === 'large-player-play-pause_{{player.id}}' || largePlayerSongContainer[i].id === 'large-player-play-pause_{{player.id}}') {
1406
1400
  largePlayerSongContainer[i].addEventListener('click', function(event) {
1407
1401
  var ytpPlayer, ytpPlayerState, ytpPlayerState, atpPlayerState,
@@ -1415,55 +1409,19 @@ j1.adapter.amplitude = ((j1, window) => {
1415
1409
  metaData = Amplitude.getActiveSongMetadata();
1416
1410
  atpPlayerState = Amplitude.getPlayerState();
1417
1411
 
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
1437
-
1438
- // scroll song active at index in player
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
1412
  // stop active YT players
1455
1413
  // -----------------------------------------------
1456
1414
  const ytPlayers = Object.keys(j1.adapter.amplitude.data.ytPlayers);
1457
1415
  for (let i=0; i<ytPlayers.length; i++) {
1458
1416
  const playerID = ytPlayers[i];
1459
1417
  const playerProperties = j1.adapter.amplitude.data.ytPlayers[playerID];
1460
- logger.debug('\n' + 'process player id: ' + playerID);
1418
+ logger.debug('process player id: ' + playerID);
1461
1419
  ytpPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
1462
1420
  playerState = ytpPlayer.getPlayerState();
1463
1421
  ytpPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1464
1422
 
1465
1423
  if (ytpPlayerState === 'playing' || ytpPlayerState === 'paused' || ytpPlayerState === 'buffering') {
1466
- logger.debug('\n' + 'process player id: ' + playerID + ' stopped');
1424
+ logger.debug('process player id: ' + playerID + ' stopped');
1467
1425
  ytpPlayer.stopVideo();
1468
1426
  }
1469
1427
  }
@@ -1477,6 +1435,8 @@ j1.adapter.amplitude = ((j1, window) => {
1477
1435
  } // END if currentPlaylist
1478
1436
  } // ENF if largePlayerSongContainer
1479
1437
  } // END for largePlayerSongContainer
1438
+ ----------------------------------------------------------
1439
+ {% endcomment %}
1480
1440
 
1481
1441
  // click on prev button
1482
1442
  var largePlayerPreviousButton = document.getElementById('large_player_previous');
@@ -1484,18 +1444,17 @@ j1.adapter.amplitude = ((j1, window) => {
1484
1444
  // do nothing for YTP (managed by plugin)
1485
1445
  }
1486
1446
 
1487
- // add listeners to all PlayPause Buttons found (LARGE player)
1488
- // -------------------------------------------------------
1489
-
1490
1447
  {% comment %} PREPARED event listener for LATER use
1491
- ----------------------------------------------------------
1448
+ ----------------------------------------------------------
1449
+ // add listeners to all PlayPause Buttons found (LARGE player)
1450
+ // -------------------------------------------------------
1492
1451
  var largePlayerPlayPauseButton = document.getElementsByClassName('large-player-play-pause');
1493
1452
  for (var i=0; i<largePlayerPlayPauseButton.length; i++) {
1494
1453
  if (largePlayerPlayPauseButton[i].dataset.amplitudeSource === 'youtube') {
1495
1454
  // do nothing for YTP (managed by plugin)
1496
1455
  } else {
1497
1456
  var currentPlaylist = largePlayerPlayPauseButton[i].dataset.amplitudePlaylist;
1498
- if (currentPlaylist === playList) {
1457
+ if (currentPlaylist === playlist) {
1499
1458
  largePlayerPlayPauseButton[i].addEventListener('click', function(event) {
1500
1459
  var ytpPlayer, ytpPlayerState, playlist, metaData, playerState;
1501
1460
 
@@ -1528,8 +1487,10 @@ j1.adapter.amplitude = ((j1, window) => {
1528
1487
  }
1529
1488
  } // END for
1530
1489
 
1490
+ {% comment %} PREPARED event listener for LATER use
1491
+ ----------------------------------------------------------
1531
1492
  // add listeners to all Next Buttons found (LARGE player)
1532
- // -------------------------------------------------------
1493
+ // -------------------------------------------------------
1533
1494
  var largeNextButtons = document.getElementsByClassName("large-player-next");
1534
1495
  for (var i=0; i<largeNextButtons.length; i++) {
1535
1496
  if (largeNextButtons[i].dataset.amplitudeSource === 'youtube') {
@@ -1544,39 +1505,15 @@ j1.adapter.amplitude = ((j1, window) => {
1544
1505
  playlist = this.getAttribute("data-amplitude-playlist");
1545
1506
  metaData = Amplitude.getActiveSongMetadata();
1546
1507
 
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
1563
-
1564
- // scroll song active at index in player
1565
- // -----------------------------------------------
1566
- if (playerAutoScrollSongElement) {
1567
- j1.adapter.amplitude.atPlayerScrollToActiveElement(playlist);
1568
- }
1569
-
1570
- // save YT player data for later use (e.g. events)
1571
- // -----------------------------------------------
1572
- j1.adapter.amplitude.data.activePlayer = 'atp';
1573
- j1.adapter.amplitude.data.atpGlobals.activePlayerType = atpPlayerActive[0];
1574
-
1575
1508
  }); // END EventListener 'click'
1576
1509
  } // END addEventListener
1577
1510
  } // END if largeNextButtons
1578
1511
  } // END for Next Buttons
1512
+ ----------------------------------------------------------
1513
+ {% endcomment %}
1579
1514
 
1515
+ {% comment %} PREPARED event listener for LATER use
1516
+ ----------------------------------------------------------
1580
1517
  // add listeners to all Previous Buttons found
1581
1518
  // -------------------------------------------------------
1582
1519
  var largePreviousButtons = document.getElementsByClassName("large-player-previous");
@@ -1601,7 +1538,7 @@ j1.adapter.amplitude = ((j1, window) => {
1601
1538
  if (currentPlaylist === playlist) {
1602
1539
  if (metaData.rating) {
1603
1540
  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}`);
1541
+ logger.debug(`UPDATE song rating on updatMetaContainers for trackID|playlist at: ${trackID}|${playlist} with a value of: ${metaData.rating}`);
1605
1542
  largePlayerSongAudioRating[i].innerHTML = '<img src="/assets/image/pattern/rating/scalable/' + metaData.rating + '-star.svg"' + 'alt="song rating">';
1606
1543
  } else {
1607
1544
  largePlayerSongAudioRating[i].innerHTML = '';
@@ -1612,12 +1549,12 @@ j1.adapter.amplitude = ((j1, window) => {
1612
1549
 
1613
1550
  // scroll song active at index in player
1614
1551
  if (playerAutoScrollSongElement) {
1615
- j1.adapter.amplitude.atPlayerScrollToActiveElement(playlist);
1552
+ j1.adapter.amplitude.atPlayerScrollToActiveElement(Amplitude.getActiveSongMetadata());
1616
1553
  }
1617
1554
 
1618
1555
  // scroll song active at index in player
1619
1556
  if (playerAutoScrollSongElement) {
1620
- j1.adapter.amplitude.atPlayerScrollToActiveElement(playlist);
1557
+ j1.adapter.amplitude.atPlayerScrollToActiveElement(Amplitude.getActiveSongMetadata());
1621
1558
  }
1622
1559
 
1623
1560
  // save YT player data for later use (e.g. events)
@@ -1628,6 +1565,8 @@ j1.adapter.amplitude = ((j1, window) => {
1628
1565
  } // END if largePreviousButtons
1629
1566
  } // END if largePreviousButtons
1630
1567
  } // END for Previous Buttons
1568
+ ----------------------------------------------------------
1569
+ {% endcomment %}
1631
1570
 
1632
1571
  // add listeners to all SkipForward Buttons found
1633
1572
  // See: https://github.com/serversideup/amplitudejs/issues/384
@@ -1645,7 +1584,7 @@ j1.adapter.amplitude = ((j1, window) => {
1645
1584
  const targetTime = parseFloat(currentTime + skipOffset);
1646
1585
 
1647
1586
  if (currentTime > 0) {
1648
- logger.debug('\n' + `SKIP forward on Button skipForward for ${skipOffset} seconds`);
1587
+ logger.debug(`SKIP forward on Button skipForward for ${skipOffset} seconds`);
1649
1588
  Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
1650
1589
  }
1651
1590
  }); // END addEventListener
@@ -1668,7 +1607,7 @@ j1.adapter.amplitude = ((j1, window) => {
1668
1607
  const targetTime = parseFloat(currentTime - skipOffset);
1669
1608
 
1670
1609
  if (currentTime > 0) {
1671
- logger.debug('\n' + `SKIP backward on Button skipForward for ${skipOffset} seconds`);
1610
+ logger.debug(`SKIP backward on Button skipForward for ${skipOffset} seconds`);
1672
1611
  Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
1673
1612
  }
1674
1613
  }); // END addEventListener
@@ -1681,7 +1620,7 @@ j1.adapter.amplitude = ((j1, window) => {
1681
1620
  if (largePlayerShuffleButton) {
1682
1621
  largePlayerShuffleButton.addEventListener('click', function(event) {
1683
1622
  var shuffleState = (document.getElementById('large_player_shuffle').className.includes('amplitude-shuffle-on')) ? true : false;
1684
- logger.debug('\n' + `Set shuffle state to: ${shuffleState}`);
1623
+ logger.debug(`Set shuffle state to: ${shuffleState}`);
1685
1624
  Amplitude.setShuffle(shuffleState)
1686
1625
  }); // END addEventListener
1687
1626
  } // END if largePlayerShuffleButton
@@ -1691,20 +1630,21 @@ j1.adapter.amplitude = ((j1, window) => {
1691
1630
  if (largePlayerRepeatButton) {
1692
1631
  largePlayerRepeatButton.addEventListener('click', function(event) {
1693
1632
  var repeatState = (document.getElementById('large_player_repeat').className.includes('amplitude-repeat-on')) ? true : false;
1694
- logger.debug('\n' + `Set repeat state to: ${repeatState}`);
1633
+ logger.debug(`Set repeat state to: ${repeatState}`);
1695
1634
  Amplitude.setRepeat(repeatState)
1696
1635
  }); // END addEventListener
1697
1636
  } // END if largePlayerRepeatButton
1698
1637
 
1699
- // enable|disable scrolling on playlist (LARGE player)
1638
+ // enable|disable PAGE scrolling on players playlist (LARGE player)
1700
1639
  // -------------------------------------------------------
1701
- if (document.getElementById('large_player_right') !== null) {
1640
+ // if (playerHoverPageScrollDisabled && document.getElementById('large_player_right') !== null) {
1641
+ if (playerHoverPageScrollDisabled) {
1702
1642
 
1703
1643
  // show|hide scrollbar in playlist
1704
1644
  // -----------------------------------------------------
1705
- var songsInPlaylist = Amplitude.getSongsInPlaylist(playListName);
1645
+ const songsInPlaylist = Amplitude.getSongsInPlaylist(playlistName);
1706
1646
  if (songsInPlaylist.length <= playerScrollerSongElementMin) {
1707
- const titleListLargePlayer = document.getElementById('large_player_title_list_' + playListName);
1647
+ const titleListLargePlayer = document.getElementById('large_player_title_list_' + playlistName);
1708
1648
  if (titleListLargePlayer !== null) {
1709
1649
  titleListLargePlayer.classList.add('hide-scrollbar');
1710
1650
  }
@@ -1783,7 +1723,7 @@ j1.adapter.amplitude = ((j1, window) => {
1783
1723
  }
1784
1724
  }); // END addEventListener
1785
1725
 
1786
- } // END enable|disable scrolling on playlist
1726
+ } // END enable|disable PAGE scrolling on players playlist
1787
1727
 
1788
1728
  // set volume slider presets (for the player when exists|enabled)
1789
1729
  //
@@ -1804,14 +1744,16 @@ j1.adapter.amplitude = ((j1, window) => {
1804
1744
 
1805
1745
  } // END large player UI events
1806
1746
  {% endif %}
1747
+ {% comment %} END process UI events for all LARGE Players
1748
+ ============================================================ {% endcomment %}
1807
1749
 
1808
1750
  // ---------------------------------------------------------
1809
1751
  // START configured player features
1810
1752
 
1811
- logger.debug('\n' + 'set play next title: ' + playerPlayNextTitle);
1812
- logger.debug('\n' + 'set delay between titles: ' + playerDelayNextTitle + 'ms');
1813
- logger.debug('\n' + 'set repeat (album): ' + playerRepeat);
1814
- logger.debug('\n' + 'set shuffle (album): ' + playerShuffle);
1753
+ logger.debug('set play next title: ' + playerPlayNextTitle);
1754
+ logger.debug('set delay between titles: ' + playerDelayNextTitle + 'ms');
1755
+ logger.debug('set repeat (album): ' + playerRepeat);
1756
+ logger.debug('set shuffle (album): ' + playerShuffle);
1815
1757
 
1816
1758
  // set delay between titles (songs)
1817
1759
  Amplitude.setDelay(playerDelayNextTitle);
@@ -1825,8 +1767,8 @@ j1.adapter.amplitude = ((j1, window) => {
1825
1767
 
1826
1768
  // finished messages
1827
1769
  // ---------------------------------------------------------
1828
- logger.debug('\n' + 'current player state: ' + amplitudePlayerState);
1829
- logger.debug('\n' + 'setup player specific UI events on ID #{{player.id}}: finished');
1770
+ logger.debug('current player state: ' + amplitudePlayerState);
1771
+ logger.debug('setup player specific UI events on ID #{{player.id}}: finished');
1830
1772
 
1831
1773
  clearInterval(dependencies_met_api_initialized);
1832
1774
  } // END if apiInitialized
@@ -1846,14 +1788,14 @@ j1.adapter.amplitude = ((j1, window) => {
1846
1788
 
1847
1789
  {% endif %} {% endfor %}
1848
1790
 
1849
- logger.info('\n' + 'initialize player specific UI events: finished');
1791
+ logger.info('initialize player specific UI events: finished');
1850
1792
 
1851
1793
  _this.setState('finished');
1852
- logger.debug('\n' + 'module state: ' + _this.getState());
1853
- logger.info('\n' + 'module initialized successfully');
1794
+ logger.debug('module state: ' + _this.getState());
1795
+ logger.info('module initialized successfully');
1854
1796
 
1855
1797
  endTimeModule = Date.now();
1856
- logger.info('\n' + 'module initializing time: ' + (endTimeModule-startTimeModule) + 'ms');
1798
+ logger.info('module initializing time: ' + (endTimeModule-startTimeModule) + 'ms');
1857
1799
 
1858
1800
  clearInterval(dependencies_met_player_instances_initialized);
1859
1801
  } // END if apiInitialized
@@ -1877,7 +1819,7 @@ j1.adapter.amplitude = ((j1, window) => {
1877
1819
  // songEvents
1878
1820
  // -------------------------------------------------------------------------
1879
1821
  songEvents: (songs) => {
1880
- logger.debug('\n' + 'initializing title events for player on ID ' + '#' + playerID + ': started');
1822
+ logger.debug('initializing title events for player on ID ' + '#' + playerID + ': started');
1881
1823
 
1882
1824
  for (var i = 0; i < songs.length; i++) {
1883
1825
  // ensure that on mouseover, CSS styles don't get messed up for active songs
@@ -1905,7 +1847,7 @@ j1.adapter.amplitude = ((j1, window) => {
1905
1847
  }); // END EventListener 'click' (songlist)
1906
1848
  }
1907
1849
 
1908
- logger.debug('\n' + 'initializing title events for player on ID ' + '#' + playerID + ': finished');
1850
+ logger.debug('initializing title events for player on ID ' + '#' + playerID + ': finished');
1909
1851
  }, // END songEvents
1910
1852
 
1911
1853
  // -------------------------------------------------------------------------
@@ -1939,7 +1881,7 @@ j1.adapter.amplitude = ((j1, window) => {
1939
1881
  }
1940
1882
 
1941
1883
  if (plugin !== '' && isPluginLoaded(plugin)) {
1942
- logger.debug('\n' + 'plugin loaded: ' + plugin);
1884
+ logger.debug('plugin loaded: ' + plugin);
1943
1885
 
1944
1886
  // make sure the plugin installed only ONCE
1945
1887
  j1.adapter.amplitude.data.atpGlobals.ytpInstalled = true;
@@ -1950,9 +1892,9 @@ j1.adapter.amplitude = ((j1, window) => {
1950
1892
  // atPlayerScrollToActiveElement(metaData)
1951
1893
  // -------------------------------------------------------------------------
1952
1894
  atPlayerScrollToActiveElement: (metaData) => {
1953
- var scrollableList, songIndex,
1954
- activeElement, activeElementOffsetTop,
1955
- songElementMin, numSongs;
1895
+ var scrollableList, songIndex, playlist,
1896
+ activeElement, activeElementOffsetTop, numSongs,
1897
+ songElementMin, playerSongElementHeigthCompact;
1956
1898
 
1957
1899
  if (!playerAutoScrollSongElement) {
1958
1900
  // do nothing if playerAutoScrollSongElement is false
@@ -1961,18 +1903,19 @@ j1.adapter.amplitude = ((j1, window) => {
1961
1903
 
1962
1904
  songIndex = metaData.index;
1963
1905
  songElementMin = playerScrollerSongElementMin;
1964
- numSongs = Amplitude.getSongsInPlaylist(metaData.playlist).length;
1965
- scrollableList = document.getElementById('large_player_title_list_' + metaData.playlist);
1906
+ playlist = metaData.playlist;
1907
+ scrollableList = document.getElementById('large_player_title_list_' + playlist);
1966
1908
  activeElement = scrollableList.querySelector('.amplitude-active-song-container');
1909
+ numSongs = Amplitude.getSongsInPlaylist(playlist).length;
1967
1910
 
1968
1911
  if (activeElement === null || scrollableList === null) {
1969
1912
  // do nothing if NO scrollableList or ACTIVE element found (failsafe)
1970
1913
  return;
1971
1914
  }
1972
1915
 
1916
+ // LARGE players
1917
+ // -----------------------------------------------------------------------
1973
1918
  if (songIndex > 0 && numSongs >= songElementMin) {
1974
- scrollableList = document.getElementById('large_player_title_list_' + metaData.playlist);
1975
- activeElement = scrollableList.querySelector('.amplitude-active-song-container');
1976
1919
  activeElementOffsetTop = songIndex * j1.adapter.amplitude.data.playerSongElementHeigth;
1977
1920
  scrollableList.scrollTop = activeElementOffsetTop;
1978
1921
  } else {
@@ -1980,44 +1923,349 @@ j1.adapter.amplitude = ((j1, window) => {
1980
1923
  return;
1981
1924
  }
1982
1925
 
1926
+ // save AT player data for later use (e.g. events)
1927
+ // -----------------------------------------------------------------------
1928
+ j1.modules.amplitudejs.data.atp.activeIndex = songIndex;
1929
+ j1.modules.amplitudejs.data.atp.playlist = playlist;
1930
+
1931
+ // COMPACT players (WIP)
1932
+ // -----------------------------------------------------------------------
1933
+ // playerSongElementHeigthCompact = 74.00;
1934
+ // if (songIndex > 0 && numSongs >= songElementMin) {
1935
+ // // scrollableList = document.getElementById('compact_player_title_list_' + metaData.playlist);
1936
+ // // activeElement = scrollableList.querySelector('.amplitude-active-song-container');
1937
+ // activeElementOffsetTop = (songIndex * playerSongElementHeigthCompact);
1938
+ // scrollableList.scrollTop = activeElementOffsetTop;
1939
+ // } else {
1940
+ // // do nothing if songIndex is 0 or less than songElementMin
1941
+ // return;
1942
+ // }
1943
+
1983
1944
  }, // END atPlayerScrollToActiveElement
1984
1945
 
1985
1946
  // -------------------------------------------------------------------------
1986
- // atUpdateSongRating(playlist, rating)
1947
+ // atpUpdatMetaContainers(playlist, rating)
1987
1948
  //
1988
1949
  // update song rating in playlist-screen|meta-container
1950
+ // for all (compact|large) players
1989
1951
  // -------------------------------------------------------------------------
1990
- atUpdateSongRating: (metaData) => {
1991
- var screenControlRating = null;
1952
+ atpUpdatMetaContainers: (metaData) => {
1953
+ var activePlayist = metaData.playlist;
1954
+ var rating = parseInt(metaData.rating);
1955
+ var trackID = metaData.index + 1;
1956
+ const notRequiredForATP = true
1957
+
1958
+ logger.debug(`UPDATE metadata on atpUpdatMetaContainers for trackID|playlist at: ${trackID}|${activePlayist}`);
1959
+
1960
+ // properties automatically set by AT API
1961
+ if (requiredForATP) {
1962
+ // update SONG NAME in meta-containers
1963
+ var songName = document.getElementsByClassName("song-name");
1964
+ if (songName.length) {
1965
+ for (var i=0; i<songName.length; i++) {
1966
+ var currentPlaylist = songName[i].dataset.amplitudePlaylist;
1967
+ if (currentPlaylist === activePlayist) {
1968
+ songName[i].innerHTML = metaData.name;
1969
+ }
1970
+ }
1971
+ }
1972
+ }
1973
+
1974
+ // properties automatically set by AT API
1975
+ if (requiredForATP) {
1976
+ // update SONG ARTIST name in meta-containers
1977
+ var artistName = document.getElementsByClassName("artist");
1978
+ if (artistName.length) {
1979
+ for (var i=0; i<artistName.length; i++) {
1980
+ var currentPlaylist = songName[i].dataset.amplitudePlaylist;
1981
+ if (currentPlaylist === activePlayist) {
1982
+ artistName[i].innerHTML = metaData.artist;
1983
+ }
1984
+ }
1985
+ }
1986
+ }
1987
+
1988
+ // properties automatically set by AT API
1989
+ if (requiredForATP) {
1990
+ // update SONG ALBUM name in meta-containers
1991
+ var albumName = document.getElementsByClassName("album");
1992
+ if (albumName.length) {
1993
+ for (var i=0; i<albumName.length; i++) {
1994
+ var currentPlaylist = albumName[i].dataset.amplitudePlaylist;
1995
+ if (currentPlaylist === activePlayist) {
1996
+ albumName[i].innerHTML = metaData.album;
1997
+ }
1998
+ }
1999
+ }
2000
+ }
2001
+
2002
+ // update SONG RATING in screen controls
1992
2003
  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;
2004
+ if (rating) {
2005
+ for (let i=0; i<screenControlRatingElements.length; i++) {
2006
+ var ratingElement = screenControlRatingElements[i];
2007
+ if (ratingElement.dataset.amplitudePlaylist === activePlayist && ratingElement.classList.contains('audio-rating-screen-controls')) {
2008
+ ratingElement.innerHTML = '<img src="/assets/image/pattern/rating/scalable/' + rating + '-star.svg"' + 'alt="song rating">';
2009
+ }
2010
+ }
2011
+ }
2012
+
2013
+ // update SONG INFO in screen controls
2014
+ var songAudioInfo = document.getElementsByClassName("audio-info-link-screen-controls");
2015
+ if (songAudioInfo.length) {
2016
+ for (var i=0; i<songAudioInfo.length; i++) {
2017
+ var currentPlaylist = songAudioInfo[i].dataset.amplitudePlaylist;
2018
+ if (currentPlaylist === activePlayist) {
2019
+ if (metaData.audio_info) {
2020
+ songAudioInfo[i].setAttribute("href", metaData.audio_info);
2021
+ }
2022
+ }
2006
2023
  }
2024
+ } // END if songAudioInfo
2025
+
2026
+ }, // END atpUpdatMetaContainers
2007
2027
 
2028
+ // -------------------------------------------------------------------------
2029
+ // atpStopParallelActivePlayers(players)
2030
+ //
2031
+ // stop active YT players (running in parallel to AT players)
2032
+ // -------------------------------------------------------------------------
2033
+ atpStopParallelActivePlayers: (players) => {
2034
+ var ytPlayer, playerState, ytPlayerState;
2035
+
2036
+ const ytPlayers = Object.keys(players);
2037
+ for (var i=0; i<ytPlayers.length; i++) {
2038
+ const ytPlayerID = ytPlayers[i];
2039
+
2040
+ ytPlayer = players[ytPlayerID].player;
2041
+ playerState = ytPlayer.getPlayerState();
2042
+ ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
2043
+
2044
+ // stop YT players running in parallel
2045
+ // ---------------------------------------------------------------------
2046
+ var isValidPlayerState = /playing|paused|buffering/.test(ytPlayerState);
2047
+ if (isValidPlayerState) {
2048
+ logger.debug(`STOP YT player on id: ${playerID}`);
2049
+ ytPlayer.stopVideo();
2050
+ }
2051
+
2052
+ // toggle PlayPause buttons playing => puased
2053
+ // ---------------------------------------------------------------------
2054
+ var ytpButtonPlayerPlayPause = document.getElementsByClassName("large-player-play-pause-" + ytPlayerID);
2055
+ for (var j=0; j<ytpButtonPlayerPlayPause.length; j++) {
2056
+
2057
+ var htmlElement = ytpButtonPlayerPlayPause[j];
2058
+ if (htmlElement.dataset.amplitudeSource === 'youtube') {
2059
+ if (htmlElement.classList.contains('amplitude-playing')) {
2060
+ htmlElement.classList.remove('amplitude-playing');
2061
+ htmlElement.classList.add('amplitude-paused');
2062
+ }
2063
+ }
2064
+ } // END for ytpButtonPlayerPlayPause
2065
+
2066
+ } // END for ytPlayers
2067
+ }, // END atpStopParallelActivePlayers
2068
+
2069
+ // -------------------------------------------------------------------------
2070
+ // atpProcessAudioStartPosition()
2071
+ //
2072
+ // process audio for configured START position
2073
+ // -------------------------------------------------------------------------
2074
+ atpProcessAudioStartPosition: () => {
2075
+ var songMetaData, songIndex, playlist,
2076
+ songStartSec, songStartTS, trackID;
2077
+
2078
+ songMetaData = Amplitude.getActiveSongMetadata();
2079
+ songIndex = songMetaData.index;
2080
+ songStartTS = songMetaData.start;
2081
+ songStartSec = _this.timestamp2seconds(songStartTS);
2082
+ playlist = Amplitude.getActivePlaylist();
2083
+ trackID = songIndex + 1;
2084
+
2085
+ if (!songStartSec) {
2086
+ return;
2008
2087
  }
2009
2088
 
2010
- // set the rating for ACTIVE screenControlRatingElement
2089
+ // save AT player data for later use (e.g. events)
2011
2090
  // -----------------------------------------------------------------------
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 = '';
2091
+ j1.modules.amplitudejs.data.atp.activeIndex = songIndex;
2092
+ j1.modules.amplitudejs.data.atp.playlist = playlist;
2093
+
2094
+ var checkIsFading = setInterval (() => {
2095
+ if (!isFadingIn) {
2096
+ var currentAudioTime = Amplitude.getSongPlayedSeconds();
2097
+ if (songStartSec && currentAudioTime <= songStartSec) {
2098
+ var songDurationSec = _this.timestamp2seconds(songMetaData.duration);
2099
+
2100
+ // seek audio to configured START position
2101
+ // NOTE: use setSongPlayedPercentage for seeking to NOT
2102
+ // generation any addition state changes like stopped
2103
+ // or playing
2104
+ logger.debug('seek audio in on playlist: ' + playlist + ' at|to trackID|timestamp: ' + trackID + '|' + songStartTS);
2105
+ Amplitude.setSongPlayedPercentage((songStartSec / songDurationSec) * 100);
2106
+
2107
+ // fade-in audio (if enabled)
2108
+ var fadeAudioIn = (songMetaData.audio_fade_in === 'true') ? true : false;
2109
+ if (fadeAudioIn) {
2110
+ logger.debug('faden audio in on playlist: ' + playlist + ' at|to trackID|timestamp: ' + trackID + '|' + songStartTS);
2111
+ atpFadeInAudio({ playerID: playerID });
2112
+ } // END if fadeAudio
2113
+
2114
+ } // END if songStartSec
2115
+
2116
+ clearInterval(checkIsFading);
2017
2117
  }
2118
+ }, 100); // END checkIsFading
2119
+ }, // END atpProcessAudioStartPosition
2120
+
2121
+ // -------------------------------------------------------------------------
2122
+ // atpProcessAudioEndPosition()
2123
+ //
2124
+ // process audio for configured END position
2125
+ // -------------------------------------------------------------------------
2126
+ atpProcessAudioEndPosition: () => {
2127
+ var songMetaData, songIndex, playlist,
2128
+ songStartSec, songStartTS, songEndSec, songEndTS,
2129
+ trackID;
2130
+
2131
+ songMetaData = Amplitude.getActiveSongMetadata();
2132
+ songIndex = songMetaData.index;
2133
+ songStartTS = songMetaData.start;
2134
+ songStartSec = _this.timestamp2seconds(songStartTS);
2135
+ songEndTS = songMetaData.end;
2136
+ songEndSec = _this.timestamp2seconds(songEndTS);
2137
+ playlist = Amplitude.getActivePlaylist();
2138
+ trackID = songIndex + 1;
2139
+
2140
+ // save AT player data for later use (e.g. events)
2141
+ // -----------------------------------------------------------------------
2142
+ j1.modules.amplitudejs.data.atp.activeIndex = songIndex;
2143
+ j1.modules.amplitudejs.data.atp.playlist = playlist;
2144
+
2145
+ if (songEndSec > songStartSec) {
2146
+ var checkIsOnVideoEnd = setInterval(() => {
2147
+ if (!isFadingOut) {
2148
+ var currentAudioTime = Amplitude.getSongPlayedSeconds();
2149
+ if (currentAudioTime >= songEndSec) {
2150
+ songMetaData = Amplitude.getActiveSongMetadata();
2151
+ songIndex = songMetaData.index;
2152
+ trackID = songIndex + 1;
2153
+
2154
+ // seek audio out to END position
2155
+ // NOTE:
2156
+ // ---------------------------------------------------------------
2157
+ // use setSongPlayedPercentage for seeking to NOT
2158
+ // generation any addition state changes like stopped
2159
+ // or playing
2160
+ logger.debug('seek audio to end on playlist: ' + playlist + ' at trackID|timestamp: ' + trackID + '|' + songEndTS);
2161
+ Amplitude.setSongPlayedPercentage(99.99);
2162
+
2163
+ // fade-out audio (if enabled)
2164
+ var fadeAudioOut = (songMetaData.audio_fade_out === 'true') ? true : false;
2165
+ if (fadeAudioOut) {
2166
+ logger.debug('fade audio out on playlist: ' + playlist + ' at|to trackID|timestamp: ' + trackID + '|' + songEndTS);
2167
+ atpFadeAudioOut({ playerID: playerID });
2168
+ } // END if fadeAudio
2169
+
2170
+ clearInterval(checkIsOnVideoEnd);
2171
+ } // END if currentAudioTime
2172
+ } // END if !isFading
2173
+ }, 100); // END checkIsOnVideoEnd
2174
+ } // END if songEndSec
2175
+
2176
+ }, // END atpProcessAudioEndPosition
2177
+
2178
+ // -------------------------------------------------------------------------
2179
+ // setSongActive(currentPlayList, currentIndex)
2180
+ //
2181
+ // set song active at index in playlist
2182
+ // -------------------------------------------------------------------------
2183
+ setSongActive: (currentPlayList, currentIndex) => {
2184
+ var playlist, songContainers, songIndex;
2185
+
2186
+ songIndex = currentIndex;
2187
+
2188
+ // clear ALL active song containers
2189
+ // -----------------------------------------------------------------------
2190
+ songContainers = document.getElementsByClassName("amplitude-song-container");
2191
+ for (var i=0; i<songContainers.length; i++) {
2192
+ songContainers[i].classList.remove("amplitude-active-song-container");
2193
+ }
2194
+
2195
+ // find current song container and activate the element
2196
+ // -------------------------------------------------------------------------
2197
+ songContainers = document.querySelectorAll('.amplitude-song-container[data-amplitude-song-index="' + songIndex + '"]');
2198
+ for (var i=0; i<songContainers.length; i++) {
2199
+ if (songContainers[i].hasAttribute("data-amplitude-playlist")) {
2200
+ playlist = songContainers[i].getAttribute("data-amplitude-playlist");
2201
+ if (playlist === currentPlayList) {
2202
+ songContainers[i].classList.add("amplitude-active-song-container");
2203
+
2204
+ // save AT player data for later use (e.g. events)
2205
+ // -----------------------------------------------------------------
2206
+ j1.modules.amplitudejs.data.atp.activeIndex = songIndex;
2207
+ j1.modules.amplitudejs.data.atp.playlist = playlist;
2208
+ }
2209
+ }
2210
+ }
2211
+
2212
+ }, // END setSongActive
2213
+
2214
+ // -------------------------------------------------------------------------
2215
+ // timestamp2seconds(timestamp)
2216
+ //
2217
+ // converts a timestamp of hh:mm:ss into seconds
2218
+ // -------------------------------------------------------------------------
2219
+ // TODO:
2220
+ // Add support for timestamp w/o hours like mm:ss
2221
+ // -------------------------------------------------------------------------
2222
+ timestamp2seconds: (timestamp) => {
2223
+ // split timestamp
2224
+ const parts = timestamp.split(':');
2225
+
2226
+ // check timestamp format
2227
+ if (parts.length !== 3) {
2228
+ // return "invalid timestamp";
2229
+ return false;
2230
+ }
2231
+
2232
+ // convert parts to integers
2233
+ const hours = parseInt(parts[0], 10);
2234
+ const minutes = parseInt(parts[1], 10);
2235
+ const seconds = parseInt(parts[2], 10);
2236
+
2237
+ // check valid timestamp values
2238
+ if (isNaN(hours) || isNaN(minutes) || isNaN(seconds) ||
2239
+ hours < 0 || hours > 23 ||
2240
+ minutes < 0 || minutes > 59 ||
2241
+ seconds < 0 || seconds > 59) {
2242
+ return "invalid timestamp";
2243
+ }
2244
+
2245
+ const totalSeconds = (hours * 3600) + (minutes * 60) + seconds;
2246
+
2247
+ return totalSeconds;
2248
+ }, // END timestamp2seconds
2249
+
2250
+ // -------------------------------------------------------------------------
2251
+ // seconds2timestamp(seconds)
2252
+ //
2253
+ // converts seconds into a timestamp of hh:mm:ss
2254
+ // -------------------------------------------------------------------------
2255
+ seconds2timestamp: (seconds) => {
2256
+ if (isNaN(seconds)) {
2257
+ return false;
2018
2258
  }
2019
2259
 
2020
- }, // END atUpdateSongRating
2260
+ const hours = Math.floor(seconds / 3600);
2261
+ const minutes = Math.floor((seconds % 3600) / 60);
2262
+ const remainSeconds = seconds % 60;
2263
+ const tsHours = hours.toString().padStart(2, '0');
2264
+ const tsMinutes = minutes.toString().padStart(2, '0');
2265
+ const tsSeconds = remainSeconds.toString().padStart(2, '0');
2266
+
2267
+ return `${tsHours}:${tsMinutes}:${tsSeconds}`;
2268
+ }, // END seconds2timestamp
2021
2269
 
2022
2270
  // -------------------------------------------------------------------------
2023
2271
  // messageHandler()
@@ -2026,7 +2274,7 @@ j1.adapter.amplitude = ((j1, window) => {
2026
2274
  messageHandler: (sender, message) => {
2027
2275
  var json_message = JSON.stringify(message, undefined, 2);
2028
2276
 
2029
- logText = '\n' + 'received message from ' + sender + ': ' + json_message;
2277
+ logText = 'received message from ' + sender + ': ' + json_message;
2030
2278
  logger.debug(logText);
2031
2279
 
2032
2280
  // -----------------------------------------------------------------------
@@ -2038,7 +2286,7 @@ j1.adapter.amplitude = ((j1, window) => {
2038
2286
  // place handling of command|action here
2039
2287
  //
2040
2288
 
2041
- logger.info('\n' + message.text);
2289
+ logger.info(message.text);
2042
2290
  }
2043
2291
 
2044
2292
  //