j1-template 2024.3.22 → 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 (287) hide show
  1. checksums.yaml +4 -4
  2. data/assets/data/{galeries.html → gallery_app.html} +4 -4
  3. data/assets/theme/bla +0 -0
  4. data/assets/theme/j1/adapter/js/amplitude.js +144 -52
  5. data/assets/theme/j1/adapter/js/gallery.js +1 -1
  6. data/assets/theme/j1/adapter/js/themes.js +41 -69
  7. data/assets/theme/j1/core/css/themes/unolight/bootstrap.css +19 -52
  8. data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css +1 -1
  9. data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.js +466 -396
  10. data/assets/theme/j1/modules/lightGallery/!v2.7.2/css/lg-transitions.css +984 -0
  11. data/assets/theme/j1/modules/lightGallery/!v2.7.2/css/lg-transitions.min.css +26 -0
  12. data/assets/theme/j1/modules/lightGallery/!v2.7.2/css/lightgallery-bundle.css +1627 -0
  13. data/assets/theme/j1/modules/lightGallery/!v2.7.2/css/lightgallery-bundle.min.css +25 -0
  14. data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/uno.css +1 -1
  15. data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/uno.min.css +1 -1
  16. data/assets/theme/j1/modules/lightGallery/!v2.7.2/fonts/lg.svg +54 -0
  17. data/assets/theme/j1/modules/lightGallery/!v2.7.2/fonts/lg.ttf +0 -0
  18. data/assets/theme/j1/modules/lightGallery/!v2.7.2/fonts/lg.woff +0 -0
  19. data/assets/theme/j1/modules/lightGallery/!v2.7.2/fonts/lg.woff2 +0 -0
  20. data/assets/theme/j1/modules/lightGallery/!v2.7.2/images/loading.gif +0 -0
  21. data/assets/theme/j1/modules/lightGallery/!v2.7.2/img/loading.gif +0 -0
  22. data/assets/theme/j1/modules/lightGallery/!v2.7.2/img/video-play.png +0 -0
  23. data/assets/theme/j1/modules/lightGallery/!v2.7.2/img/vimeo-play.png +0 -0
  24. data/assets/theme/j1/modules/lightGallery/!v2.7.2/img/youtube-play.png +0 -0
  25. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/lightgallery.js +2782 -0
  26. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/lightgallery.min.js +26 -0
  27. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/parser/webvtt/LICENSE.md +44 -0
  28. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/parser/webvtt/README.md +37 -0
  29. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/parser/webvtt/parser.js +890 -0
  30. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/parser/webvtt/parser.min.js +8 -0
  31. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/j1/lg-video.1.js +585 -0
  32. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-autoplay.js +275 -0
  33. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-autoplay.min.js +26 -0
  34. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-comment.js +230 -0
  35. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-comment.min.js +26 -0
  36. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-fullscreen.js +160 -0
  37. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-fullscreen.min.js +26 -0
  38. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-hash.js +223 -0
  39. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-hash.min.js +27 -0
  40. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-medium-zoom.js +157 -0
  41. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-medium-zoom.min.js +26 -0
  42. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-pager.js +164 -0
  43. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-pager.min.js +26 -0
  44. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-rotate.js +299 -0
  45. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-rotate.min.js +26 -0
  46. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-share.js +244 -0
  47. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-share.min.js +27 -0
  48. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-thumbnail.js +509 -0
  49. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-thumbnail.min.js +26 -0
  50. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-video.js +909 -0
  51. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-video.min.js +26 -0
  52. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-vimeo-thumbnail.js +207 -0
  53. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-vimeo-thumbnail.min.js +26 -0
  54. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-zoom.js +999 -0
  55. data/assets/theme/j1/modules/lightGallery/!v2.7.2/js/plugins/lg-zoom.min.js +26 -0
  56. data/assets/theme/j1/modules/lightGallery/css/lg-transitions.css +3 -126
  57. data/assets/theme/j1/modules/lightGallery/css/lg-transitions.min.css +3 -10
  58. data/assets/theme/j1/modules/lightGallery/css/lightgallery-bundle.css +70 -237
  59. data/assets/theme/j1/modules/lightGallery/css/lightgallery-bundle.min.css +4 -10
  60. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/animation-w.png +0 -0
  61. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/customize-w.png +0 -0
  62. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/dynamic-w.png +0 -0
  63. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/facebook-icon.svg +10 -0
  64. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/googleplus-icon.svg +30 -0
  65. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/html5-w.png +0 -0
  66. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/linked-in.png +0 -0
  67. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/module-w.png +0 -0
  68. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/play-button-hover.svg +94 -0
  69. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/play-button.png +0 -0
  70. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/play-button.svg +93 -0
  71. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/responsive-w.png +0 -0
  72. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/thumb-w.png +0 -0
  73. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/touch-w.png +0 -0
  74. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/twitter-icon.svg +15 -0
  75. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/twitter.png +0 -0
  76. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/video1-w.png +0 -0
  77. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/zoom-w.png +0 -0
  78. data/assets/theme/j1/modules/lightGallery/css/theme/uno/icons/zoom.png +0 -0
  79. data/assets/theme/j1/modules/lightGallery/css/theme/uno/uno.css +276 -0
  80. data/assets/theme/j1/modules/lightGallery/css/theme/uno/uno.min.css +17 -0
  81. data/assets/theme/j1/modules/lightGallery/js/lightgallery.js +163 -120
  82. data/assets/theme/j1/modules/lightGallery/js/lightgallery.min.js +6 -6
  83. data/assets/theme/j1/modules/lightGallery/js/plugins/j1/lg-thumbnail.0.js +495 -0
  84. data/assets/theme/j1/modules/lightGallery/js/plugins/j1/lg-thumbnail.1.js +513 -0
  85. data/assets/theme/j1/modules/lightGallery/js/plugins/j1/lg-video.0.js +553 -0
  86. data/assets/theme/j1/modules/lightGallery/js/plugins/j1/lg-video.1.js +1 -1
  87. data/assets/theme/j1/modules/lightGallery/js/plugins/j1/lg-video.2.js +914 -0
  88. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-autoplay.js +4 -4
  89. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-autoplay.min.js +5 -5
  90. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-comment.js +5 -5
  91. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-comment.min.js +6 -6
  92. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-fullscreen.js +4 -4
  93. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-fullscreen.min.js +5 -5
  94. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-hash.js +4 -4
  95. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-hash.min.js +5 -6
  96. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-medium-zoom.js +5 -5
  97. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-medium-zoom.min.js +6 -6
  98. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-pager.js +4 -4
  99. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-pager.min.js +5 -5
  100. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-relative-caption.js +179 -0
  101. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-relative-caption.min.js +32 -0
  102. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-rotate.js +4 -4
  103. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-rotate.min.js +6 -6
  104. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-share.js +4 -4
  105. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-share.min.js +6 -7
  106. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-thumbnail.js +27 -20
  107. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-thumbnail.min.js +5 -5
  108. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.js +77 -125
  109. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.min.js +6 -6
  110. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-vimeo-thumbnail.js +4 -4
  111. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-vimeo-thumbnail.min.js +5 -5
  112. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-zoom.js +11 -5
  113. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-zoom.min.js +5 -5
  114. data/assets/theme/j1/modules/themeSwitcher/js/switcher.js +13 -12
  115. data/assets/theme/j1/modules/videoPlayer/tiktoc/README.md +1 -0
  116. data/assets/theme/j1/modules/videojs/!v8.12.0/css/font/README.md +151 -0
  117. data/assets/theme/j1/modules/videojs/!v8.12.0/css/font/VideoJS.svg +150 -0
  118. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/city.css +147 -0
  119. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/city.min.css +5 -0
  120. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/fantasy.css +113 -0
  121. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/fantasy.min.css +5 -0
  122. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/forest.css +166 -0
  123. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/forest.min.css +5 -0
  124. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/sea.css +72 -0
  125. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/sea.min.css +5 -0
  126. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/uno.css +311 -0
  127. data/assets/theme/j1/modules/videojs/!v8.12.0/css/themes/uno.min.css +19 -0
  128. data/assets/theme/j1/modules/videojs/!v8.12.0/css/videojs.css +1686 -0
  129. data/assets/theme/j1/modules/videojs/!v8.12.0/css/videojs.min.css +13 -0
  130. data/assets/theme/j1/modules/videojs/!v8.12.0/js/video.js +65226 -0
  131. data/assets/theme/j1/modules/videojs/!v8.12.0/js/video.min.js +55 -0
  132. data/assets/theme/j1/modules/videojs/assets/README.md +1 -0
  133. data/assets/theme/j1/modules/videojs/assets/icons/speedometer-medium.svg +35 -0
  134. data/assets/theme/j1/modules/videojs/css/font/VideoJS.ttf +0 -0
  135. data/assets/theme/j1/modules/videojs/css/font/VideoJS.woff +0 -0
  136. data/assets/theme/j1/modules/videojs/css/themes/uno.css +157 -22
  137. data/assets/theme/j1/modules/videojs/css/themes/uno.min.css +1 -1
  138. data/assets/theme/j1/modules/videojs/css/videojs.css +674 -316
  139. data/assets/theme/j1/modules/videojs/css/videojs.min.css +4 -3
  140. data/assets/theme/j1/modules/videojs/js/video.js +15893 -12288
  141. data/assets/theme/j1/modules/videojs/js/video.min.js +22 -23
  142. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/!examples/index.html +31 -0
  143. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/LICENSE +19 -0
  144. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/README.md +69 -0
  145. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/css/aspect-ratio-panel.css +2 -0
  146. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/css/aspect-ratio-panel.min.css +2 -0
  147. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/js/aspect-ratio-panel.js +339 -0
  148. data/assets/theme/j1/modules/videojs/plugins/controls/aspect-ratio-panel/js/aspect-ratio-panel.min.js +2 -0
  149. data/assets/theme/j1/modules/videojs/{js/plugins/controls/autocaption → plugins/controls/autocaption/js}/autocaption.js +0 -5
  150. data/assets/theme/j1/modules/videojs/plugins/controls/persist-settings/!examples/index.html +29 -0
  151. data/assets/theme/j1/modules/videojs/plugins/controls/persist-settings/LICENSE +19 -0
  152. data/assets/theme/j1/modules/videojs/plugins/controls/persist-settings/README.md +90 -0
  153. data/assets/theme/j1/modules/videojs/plugins/controls/persist-settings/js/videojs-persist.js +120 -0
  154. data/assets/theme/j1/modules/videojs/plugins/controls/persist-settings/js/videojs-persist.min.js +2 -0
  155. data/assets/theme/j1/modules/videojs/plugins/controls/playbackrate-adjuster/!examples/index.html +37 -0
  156. data/assets/theme/j1/modules/videojs/plugins/controls/playbackrate-adjuster/LICENSE +19 -0
  157. data/assets/theme/j1/modules/videojs/plugins/controls/playbackrate-adjuster/README.md +61 -0
  158. data/assets/theme/j1/modules/videojs/plugins/controls/playbackrate-adjuster/js/playbackrate-adjuster.js +94 -0
  159. data/assets/theme/j1/modules/videojs/plugins/controls/playbackrate-adjuster/js/playbackrate-adjuster.min.js +20 -0
  160. data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/skipbuttons/README.md +25 -11
  161. data/assets/theme/j1/modules/videojs/{css/plugins/controls → plugins/controls/zoom/css}/zoom.css +7 -6
  162. data/assets/theme/j1/modules/videojs/plugins/controls/zoom/css/zoom.min.css +22 -0
  163. data/assets/theme/j1/modules/videojs/{js/plugins/players/dm → plugins/players/dm/js}/dailymotion.js +1 -1
  164. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.0.js +521 -0
  165. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.1.js +605 -0
  166. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.3.js +643 -0
  167. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.4.js +583 -0
  168. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.5.js +665 -0
  169. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.6.js +642 -0
  170. data/assets/theme/j1/modules/videojs/plugins/players/vm/!unused/vimeo.7.js +673 -0
  171. data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/api → plugins/players/vm/api/js}/vimeo.js +1 -1
  172. data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/api → plugins/players/vm/api/js}/vimeo.min.js +1 -1
  173. data/assets/theme/j1/modules/videojs/{js/plugins/players/vm → plugins/players/vm/js}/vimeo.js +4 -5
  174. data/assets/theme/j1/modules/videojs/plugins/players/vm/js/vimeo.min.js +28 -0
  175. data/assets/theme/j1/modules/videojs/plugins/players/wt/!unused/wistia.0.js +395 -0
  176. data/assets/theme/j1/modules/videojs/plugins/players/wt/!unused/wistia.1.js +401 -0
  177. data/lib/j1/version.rb +1 -1
  178. data/lib/starter_web/README.md +5 -5
  179. data/lib/starter_web/_config.yml +1 -1
  180. data/lib/starter_web/_data/modules/amplitude_playlists.yml +16 -1
  181. data/lib/starter_web/_data/modules/defaults/gallery.yml +3 -3
  182. data/lib/starter_web/_data/modules/gallery.yml +83 -87
  183. data/lib/starter_web/_data/modules/navigator_menu.yml +3 -3
  184. data/lib/starter_web/_data/resources.yml +16 -12
  185. data/lib/starter_web/_data/templates/feed.xml +1 -1
  186. data/lib/starter_web/_plugins/asciidoctor/videojs-block.rb +50 -30
  187. data/lib/starter_web/_plugins/asciidoctor/youtube-block.rb +37 -23
  188. data/lib/starter_web/_plugins/index/lunr.rb +1 -1
  189. data/lib/starter_web/assets/video/poster/vimeo/fall_2011.jpg +0 -0
  190. data/lib/starter_web/package.json +1 -1
  191. data/lib/starter_web/pages/public/tools/tester/videojs_macro_tester.adoc +282 -0
  192. data/lib/starter_web/pages/public/tour/video_data.adoc +1 -0
  193. metadata +221 -106
  194. data/assets/data/swiper_app.2.html +0 -757
  195. data/assets/data/swiper_app.4.html +0 -769
  196. data/assets/theme/j1/modules/videojs/css/plugins/controls/skipbuttons.0.css +0 -32
  197. data/assets/theme/j1/modules/videojs/css/plugins/controls/skipbuttons.1.css +0 -31
  198. data/assets/theme/j1/modules/videojs/css/plugins/controls/zoom.min.css +0 -21
  199. data/assets/theme/j1/modules/videojs/js/plugins/players/vm/vimeo.min.js +0 -16
  200. data/assets/theme/j1/modules/videojs/js/plugins/players/wt/api/src/WistiaPlayer.ts +0 -1617
  201. data/lib/starter_web/assets/video/poster/vimeo/stay_colorful.jpg +0 -0
  202. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/animation-w.png +0 -0
  203. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/customize-w.png +0 -0
  204. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/dynamic-w.png +0 -0
  205. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/facebook-icon.svg +0 -0
  206. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/googleplus-icon.svg +0 -0
  207. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/html5-w.png +0 -0
  208. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/linked-in.png +0 -0
  209. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/module-w.png +0 -0
  210. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/play-button-hover.svg +0 -0
  211. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/play-button.png +0 -0
  212. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/play-button.svg +0 -0
  213. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/responsive-w.png +0 -0
  214. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/thumb-w.png +0 -0
  215. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/touch-w.png +0 -0
  216. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/twitter-icon.svg +0 -0
  217. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/twitter.png +0 -0
  218. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/video1-w.png +0 -0
  219. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/zoom-w.png +0 -0
  220. /data/assets/theme/j1/modules/lightGallery/{css → !v2.7.2/css}/themes/uno/icons/zoom.png +0 -0
  221. /data/assets/theme/j1/modules/lightGallery/{js → !v2.7.2/js}/plugins/j1/j1-video.js +0 -0
  222. /data/assets/theme/j1/modules/lightGallery/{js → !v2.7.2/js}/plugins/j1/j1-video.min.js +0 -0
  223. /data/assets/theme/j1/modules/videoPlayer/dailymotion/js/{!readme → README.md} +0 -0
  224. /data/assets/theme/j1/modules/videoPlayer/tiktoc/{js/player.min.js → player.min.js} +0 -0
  225. /data/assets/theme/j1/modules/videoPlayer/vimeo/js/{!readme → README.md} +0 -0
  226. /data/assets/theme/j1/modules/videoPlayer/wistia/js/{!readme → README.md} +0 -0
  227. /data/assets/theme/j1/modules/videojs/{css → !v8.12.0/css}/font/video-js-cdn.css +0 -0
  228. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/autocaption/LICENSE +0 -0
  229. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/autocaption/README.md +0 -0
  230. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/autocaption → plugins/controls/autocaption/js}/autocaption.min.js +0 -0
  231. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/hotkeys/examples → plugins/controls/hotkeys/!examples}/example.html +0 -0
  232. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/hotkeys/LICENSE.md +0 -0
  233. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/hotkeys/README.md +0 -0
  234. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/hotkeys → plugins/controls/hotkeys/js}/hotkeys.js +0 -0
  235. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/hotkeys → plugins/controls/hotkeys/js}/hotkeys.min.js +0 -0
  236. /data/assets/theme/j1/modules/videojs/{css/plugins/controls → plugins/controls/skipbuttons/css}/skipbuttons.css +0 -0
  237. /data/assets/theme/j1/modules/videojs/{css/plugins/controls → plugins/controls/skipbuttons/css}/skipbuttons.min.css +0 -0
  238. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/skipbuttons → plugins/controls/skipbuttons/js}/skipbuttons.js +0 -0
  239. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/skipbuttons → plugins/controls/skipbuttons/js}/skipbuttons.min.js +0 -0
  240. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/zoom/examples → plugins/controls/zoom/!examples}/index.html +0 -0
  241. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/zoom/examples → plugins/controls/zoom/!examples}/index.js +0 -0
  242. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/zoom/examples → plugins/controls/zoom/!examples}/styles.css +0 -0
  243. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/zoom/LICENSE.md +0 -0
  244. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/controls/zoom/README.md +0 -0
  245. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/zoom → plugins/controls/zoom/js}/zoom.js +0 -0
  246. /data/assets/theme/j1/modules/videojs/{js/plugins/controls/zoom → plugins/controls/zoom/js}/zoom.min.js +0 -0
  247. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/dailymotion-controls.html +0 -0
  248. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/dailymotion-javascript.html +0 -0
  249. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/dailymotion-playlist.html +0 -0
  250. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/global-parameters.html +0 -0
  251. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/simple.html +0 -0
  252. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/examples → plugins/players/dm/!examples}/switch.html +0 -0
  253. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/dm/LICENSE +0 -0
  254. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/doc → plugins/players/dm}/README.md +0 -0
  255. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/dm/api/LICENSE +0 -0
  256. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/api/doc → plugins/players/dm/api}/README.md +0 -0
  257. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/api → plugins/players/dm/api/js}/dailymotion.sdk.js +0 -0
  258. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm/api → plugins/players/dm/api/js}/dailymotion.sdk.min.js +0 -0
  259. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/dm/icon/scalable/dailymotion.svg +0 -0
  260. /data/assets/theme/j1/modules/videojs/{js/plugins/players/dm → plugins/players/dm/js}/dailymotion.min.js +0 -0
  261. /data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/examples → plugins/players/vm/!examples}/index.html +0 -0
  262. /data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/examples → plugins/players/vm/!examples}/player/index.html +0 -0
  263. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/vm/LICENSE +0 -0
  264. /data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/doc → plugins/players/vm}/README.md +0 -0
  265. /data/assets/theme/j1/modules/videojs/{js/plugins/players/vm/api/doc → plugins/players/vm/api}/README.md +0 -0
  266. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/vm/api/css/embed.player.css +0 -0
  267. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/vm/api/css/embed.player.uno.css +0 -0
  268. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/vm/api/css/player.css +0 -0
  269. /data/assets/theme/j1/modules/videojs/{js/plugins/players/wt/doc → plugins/players/wt}/README.md +0 -0
  270. /data/assets/theme/j1/modules/videojs/{js/plugins/players/wt/api/doc/Readme.txt → plugins/players/wt/api/README.md} +0 -0
  271. /data/assets/theme/j1/modules/videojs/{js/plugins/players/wt/api → plugins/players/wt/api/js}/wistia.min.js +0 -0
  272. /data/assets/theme/j1/modules/videojs/{js/plugins/players/wt → plugins/players/wt/js}/wistia.js +0 -0
  273. /data/assets/theme/j1/modules/videojs/{js/plugins/players/wt → plugins/players/wt/js}/wistia.min.js +0 -0
  274. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/global-parameters.html +0 -0
  275. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/simple.html +0 -0
  276. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/switch.html +0 -0
  277. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/youtube-controls.html +0 -0
  278. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/youtube-javascript.html +0 -0
  279. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/youtube-list.html +0 -0
  280. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/examples → plugins/players/yt/!examples}/youtube-playlist.html +0 -0
  281. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/v3.0.0 → plugins/players/yt/!v3.0.0}/youtube.js +0 -0
  282. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/v3.0.0 → plugins/players/yt/!v3.0.0}/youtube.min.js +0 -0
  283. /data/assets/theme/j1/modules/videojs/{js/plugins → plugins}/players/yt/LICENSE +0 -0
  284. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/doc → plugins/players/yt}/README.md +0 -0
  285. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt/api → plugins/players/yt/api/js}/youtube.min.js +0 -0
  286. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt → plugins/players/yt/js}/youtube.js +0 -0
  287. /data/assets/theme/j1/modules/videojs/{js/plugins/players/yt → plugins/players/yt/js}/youtube.min.js +0 -0
@@ -6,7 +6,7 @@ regenerate: true
6
6
 
7
7
  {% comment %}
8
8
  # -----------------------------------------------------------------------------
9
- # ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.33.js
9
+ # ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.35.js
10
10
  # AmplitudeJS V5 Tech for J1 Template
11
11
  #
12
12
  # Product/Info:
@@ -60,7 +60,7 @@ regenerate: true
60
60
 
61
61
  /*
62
62
  # -----------------------------------------------------------------------------
63
- # ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.33.js
63
+ # ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.35.js
64
64
  # AmplitudeJS V5 Plugin|Tech for J1 Template
65
65
  #
66
66
  # Product/Info:
@@ -74,6 +74,8 @@ regenerate: true
74
74
  */
75
75
  "use strict";
76
76
 
77
+ const isDev = (j1.env === "development" || j1.env === "dev") ? true : false;
78
+
77
79
  // date|time monitoring
78
80
  //----------------------------------------------------------------------------
79
81
  var startTime;
@@ -130,6 +132,7 @@ regenerate: true
130
132
  // ---------------------------------------------------------------------------
131
133
  var firstScriptTag;
132
134
  var ytPlayer;
135
+ var ytPlayerErrorTest = false;
133
136
  var ytPlayerReady = false;
134
137
  var ytApiReady = false;
135
138
  var logger = log4javascript.getLogger('j1.adapter.amplitude.tech');
@@ -176,10 +179,7 @@ regenerate: true
176
179
  var playerType;
177
180
  var playListTitle;
178
181
  var playListName;
179
- var amplitudePlayerState;
180
-
181
- var ytPlayer;
182
-
182
+ var amplitudePlayerState;
183
183
 
184
184
  var songs;
185
185
  var songMetaData;
@@ -242,10 +242,12 @@ regenerate: true
242
242
  // TODO:
243
243
  // ---------------------------------------------------------------------------
244
244
  function processOnVideoEnd(player) {
245
- var currentVideoTime,
246
- playlist, playerID, songIndex, songs,
245
+ var currentVideoTime, activeSong,
246
+ playlist, playerID, songIndex, songs, playlistRepeat,
247
247
  trackID, activeVideoID, previousVideoID, isVideoChanged;
248
248
 
249
+ activeSong = getActiveSong();
250
+
249
251
  playlist = activeVideoElement.playlist;
250
252
  playerID = playlist + '_large';
251
253
  currentVideoTime = player.getCurrentTime();
@@ -254,6 +256,7 @@ regenerate: true
254
256
  songIndex = activeVideoElement.index;
255
257
  trackID = songIndex + 1;
256
258
  songs = activeVideoElement.songs;
259
+ playlistRepeat = (songs[songIndex].repeat === 'true') ? true : false;
257
260
 
258
261
  // check if video is changed (to detect multiple videoIDs in playlist)
259
262
  if (songIndex > 0) {
@@ -271,13 +274,26 @@ regenerate: true
271
274
  });
272
275
  } // END if playerFadeAudio
273
276
 
274
- // if (!activeVideoElement.audio_single) {
275
277
  if (isVideoChanged) {
276
- // load next video
277
- logger.debug(`LOAD next VIDEO on processOnVideoEnd at trackID|playlist: ${trackID}|${playlist}`);
278
- loadNextVideo(playlist, songIndex);
278
+ if (songIndex === songs.length - 1) {
279
+ // LAST index reached, continue on FIRST index
280
+ songIndex = 0;
281
+
282
+ logger.debug(`LOAD first VIDEO on processOnVideoEnd at trackID|playlist: ${trackID}|${playlist}`);
283
+ loadVideo(playlist, songIndex);
284
+
285
+ // check if REPEAT is enabled on PLAYLIST
286
+ if (!playlistRepeat) {
287
+ // set FIRST song (video) paused if playing is continued
288
+ ytPlayer.pauseVideo();
289
+ }
290
+ } else {
291
+ // load next video
292
+ logger.debug(`LOAD next VIDEO on processOnVideoEnd at trackID|playlist: ${trackID}|${playlist}`);
293
+ loadVideo(playlist, songIndex + 1);
294
+ }
279
295
  } else {
280
- // skip loading next video if a single video is used for playlist
296
+ // skip loading next video if a SINGLE video is used for playlist
281
297
  logger.debug(`LOAD next TRACK in video on processOnVideoEnd at trackID|playlist: ${trackID}|${playlist}`);
282
298
  }
283
299
 
@@ -290,9 +306,9 @@ regenerate: true
290
306
  // ---------------------------------------------------------------------------
291
307
  function doNothingOnStateChange(state) {
292
308
  if (state > 0) {
293
- logger.warn(`DO NOTHING on StateChange for state: ${YT_PLAYER_STATE_NAMES[state]}`);
309
+ isDev && logger.warn(`DO NOTHING on StateChange for state: ${YT_PLAYER_STATE_NAMES[state]}`);
294
310
  } else {
295
- logger.warn(`DO NOTHING on StateChange for state: ${YT_PLAYER_STATE_NAMES[6]}`);
311
+ isDev && logger.warn(`DO NOTHING on StateChange for state: ${YT_PLAYER_STATE_NAMES[6]}`);
296
312
  }
297
313
  } // END doNothingOnStateChange
298
314
 
@@ -302,37 +318,45 @@ regenerate: true
302
318
  // wrapper for processing players on state PLAYING
303
319
  // ---------------------------------------------------------------------------
304
320
  function processOnStateChangePlaying(event, playlist, songIndex) {
305
- var activeSong, activePlaylist, playerID, videoID,
306
- ytPlayer, songs, songIndex,
307
- currentPlayer, previousPlayer, trackID;
308
-
309
- ytPlayer = event.target;
321
+ var activeSong, activePlaylist,
322
+ playerID, videoID, firstVideo,
323
+ ytPlayer, songs, songIndex, previousSongIndex,
324
+ currentPlayer, previousPlayer,
325
+ trackID, isSongIndexChanged;
310
326
 
311
- // update active song settings (manually)
312
- checkActiveVideoElementYTP();
327
+ ytPlayer = event.target;
328
+ firstVideo = (songIndex > 0) ? false : true;
313
329
 
314
- // get active song settings (manually)
315
330
  activeSong = getActiveSong();
316
-
317
331
  activePlaylist = playlist;
318
332
  playerID = activeSong.playerID;
319
333
  videoID = activeSong.videoID;
320
334
  songs = activeSong.songs;
321
- // songIndex = activeSong.index;
335
+ songIndex = activeSong.index;
322
336
  currentPlayer = activeSong.player;
323
337
  previousPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player
324
338
  trackID = songIndex + 1;
325
339
 
326
- logger.debug(`PLAY audio on YTP at playlist|trackID: ${activePlaylist}|${trackID}`);
327
- // logger.debug(`PLAY video on StateChange (playing) at playlist|trackID: ${playList}|${trackID}`);
340
+ logger.debug(`PLAY audio on YT Player at playlist|trackID: ${activePlaylist}|${trackID}`);
328
341
 
329
342
  // save YT player GLOBAL data for later use (e.g. events)
330
343
  j1.adapter.amplitude.data.activePlayer = 'ytp';
331
344
  j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
332
345
  j1.adapter.amplitude.data.ytpGlobals['videoID'] = videoID;
333
346
 
347
+
334
348
  // save YT player data for later use (e.g. events)
335
- j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
349
+ // -------------------------------------------------------------------------
350
+ j1.modules.amplitudejs.data.activePlayer = 'ytp';
351
+ j1.modules.amplitudejs.data.activeIndex = songIndex;
352
+ j1.modules.amplitudejs.data.activePlaylist = playlist;
353
+ j1.modules.amplitudejs.data.ytp.activePlayer = ytPlayer;
354
+ j1.modules.amplitudejs.data.ytp.activeIndex = songIndex;
355
+ j1.modules.amplitudejs.data.ytp.activePlaylist = playlist;
356
+ j1.modules.amplitudejs.data.ytp.players[playerID].activeIndex = songIndex;
357
+ j1.modules.amplitudejs.data.ytp.players[playerID].player = ytPlayer;
358
+ j1.modules.amplitudejs.data.ytp.players[playerID].videoID = videoID;
359
+
336
360
 
337
361
  // update time container for the ACTIVE video
338
362
  // -----------------------------------------------------------------
@@ -435,16 +459,44 @@ regenerate: true
435
459
  //
436
460
  // ---------------------------------------------------------------------------
437
461
  function processOnStateChangeEnded(event, playlist, songIndex) {
438
- var videoID = event.target.options.videoId;
439
- var trackID = songIndex + 1;
462
+ var videoID = event.target.options.videoId;
463
+ var trackID = songIndex + 1;
464
+ var playerID = playlist + '_large';
465
+ var songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
466
+ var songMetaData = songs[songIndex];
467
+ var playlistRepeat = (songMetaData.repeat === 'true') ? true : false;
468
+
469
+ if (songIndex === songs.length - 1) {
470
+ // LAST index reached, continue on FIRST index
471
+ songIndex = 0;
472
+
473
+ // save player current time data for later use
474
+ // ytPlayerCurrentTime = ytPlayer.getCurrentTime();
440
475
 
441
- // save player current time data for later use
442
- ytPlayerCurrentTime = ytPlayer.getCurrentTime();
476
+ // save YT player data for later use (e.g. events)
477
+ // ---------------------------------------------------------------------
478
+ j1.modules.amplitudejs.data.ytp.previousIndex = songIndex;
479
+
480
+ logger.debug(`LOAD first VIDEO on processOnStateChangeEnded at trackID|playlist: ${trackID}|${playlist}`);
481
+ loadVideo(playlist, songIndex);
482
+
483
+ // check if REPEAT is enabled on PLAYLIST
484
+ if (!playlistRepeat) {
485
+ // set FIRST song (video) paused if playing is continued
486
+ ytPlayer.pauseVideo();
487
+ }
488
+ } else {
489
+ // save player current time data for later use
490
+ // ytPlayerCurrentTime = ytPlayer.getCurrentTime();
443
491
 
444
- logger.debug(`NEXT video on StateChange at trackID|VideoID: ${trackID}|${videoID}`);
492
+ // save YT player data for later use (e.g. events)
493
+ // ---------------------------------------------------------------------
494
+ j1.modules.amplitudejs.data.ytp.previousIndex = songIndex;
445
495
 
446
- // load NEXT song (video) in playlist
447
- loadNextVideo(playlist, songIndex);
496
+ // load next video
497
+ logger.debug(`LOAD next VIDEO on processOnStateChangeEnded at trackID|playlist: ${trackID}|${playlist}`);
498
+ loadVideo(playlist, songIndex + 1);
499
+ }
448
500
 
449
501
  } // END processOnStateChangeEnded
450
502
 
@@ -547,7 +599,7 @@ regenerate: true
547
599
  // transition will be
548
600
  const iterationSteps = {
549
601
  'default': 150,
550
- 'slow': 250,
602
+ 'slow': 250,
551
603
  'slower': 350,
552
604
  'slowest': 500
553
605
  };
@@ -558,7 +610,7 @@ regenerate: true
558
610
  currentStep = 1;
559
611
 
560
612
  if (volumeSlider === undefined || volumeSlider === null) {
561
- logger.warn('no volume slider found at playerID: ' + settings.playerID);
613
+ isDev && logger.warn('no volume slider found at playerID: ' + settings.playerID);
562
614
  return;
563
615
  }
564
616
 
@@ -594,7 +646,7 @@ regenerate: true
594
646
  // number of iteration steps to DECREASE the volume
595
647
  const iterationSteps = {
596
648
  'default': 150,
597
- 'slow': 250,
649
+ 'slow': 250,
598
650
  'slower': 350,
599
651
  'slowest': 500
600
652
  };
@@ -606,7 +658,7 @@ regenerate: true
606
658
  currentStep = 0;
607
659
 
608
660
  if (volumeSlider === undefined || volumeSlider === null) {
609
- logger.warn('no volume slider found at playerID: ' + settings.playerID);
661
+ isDev && logger.warn('no volume slider found at playerID: ' + settings.playerID);
610
662
  return;
611
663
  }
612
664
 
@@ -642,92 +694,47 @@ regenerate: true
642
694
  }
643
695
 
644
696
  // ---------------------------------------------------------------------------
645
- // loadNextVideo(list, index)
697
+ // loadVideo(list, index)
646
698
  //
647
699
  // load next video in playlist
648
700
  // ---------------------------------------------------------------------------
649
- function loadNextVideo(currentPlaylist, currentIndex) {
650
- var activeSongSettings, trackID, songName, playlist, playerID, playerIFrame,
651
- songs, songIndex, songMetaData, songURL, ytpVideoID;
652
-
653
- // update active song settings (manually)
654
- checkActiveVideoElementYTP();
701
+ function loadVideo(currentPlaylist, currentIndex) {
702
+ var activeSong, trackID, songName,
703
+ playlist, playerID, playerIFrame,
704
+ songs, songIndex, songMetaData, songURL,
705
+ ytpVideoID, firstVideo, playlistRepeat;
655
706
 
656
- // get active song settings (manually)
657
- activeSongSettings = getActiveSong();
658
-
659
- playlist = currentPlaylist;
660
- playerID = playlist + '_large';
661
- songs = activeSongSettings.songs;
662
- ytPlayer = activeSongSettings.player;
663
- songIndex = currentIndex;
664
- trackID = songIndex + 1;
665
-
666
- songIndex++;
667
-
668
- ytpSongIndex = songIndex;
707
+ activeSong = getActiveSong();
708
+ playlist = currentPlaylist;
709
+ playerID = playlist + '_large';
710
+ songs = activeSong.songs;
711
+ playlistRepeat = (songs[currentIndex].repeat === 'true') ? true : false;
712
+ ytPlayer = activeSong.player;
713
+ songIndex = currentIndex;
714
+ trackID = songIndex + 1;
669
715
 
670
- // play sonng (video) in playlist
716
+ // switch|play to songIndex in playlist
671
717
  if (songIndex <= songs.length - 1) {
672
718
  songMetaData = songs[songIndex];
673
719
  songURL = songMetaData.url;
674
- ytVideoID = songURL.split('=')[1];
720
+ ytpVideoID = songURL.split('=')[1];
675
721
 
676
722
  // save YT player data for later use (e.g. events)
677
723
  j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
678
- j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytVideoID;
679
-
680
- logger.debug(`SWITCH video on loadNextVideo at trackID|VideoID: ${trackID}|${ytVideoID}`);
681
- ytPlayer.loadVideoById(ytVideoID);
682
-
683
- // delay after switch video
684
- if (muteAfterVideoSwitchInterval) {
685
- ytPlayer.mute();
686
- setTimeout(() => {
687
- ytPlayer.unMute();
688
- }, muteAfterVideoSwitchInterval);
689
- }
690
-
691
- // update global song index
692
- ytpSongIndex = songIndex;
693
-
694
- // load the song cover image
695
- loadCoverImage(songMetaData);
696
-
697
- // update meta data
698
- // ytpUpdatMetaContainers(songMetaData);
699
-
700
- // set song (video) active at index in playlist
701
- setSongActive(playlist, songIndex);
702
-
703
- // reset progress bar settings
704
- resetProgressBarYTP();
705
-
706
- // scroll song active at index in player
707
- if (playerAutoScrollSongElement) {
708
- scrollToActiveElement(playlist);
709
- }
710
- } else {
711
- // continue on FIRST track (video) in playlist
712
- //
713
- songIndex = 0;
714
- var songMetaData = songs[songIndex];
715
- var songURL = songMetaData.url;
716
- var ytVideoID = songURL.split('=')[1];
717
-
718
- // update global song index
719
- ytpSongIndex = songIndex;
724
+ j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
720
725
 
721
- // load next video (paused)
722
- // -----------------------------------------------------------------------
723
726
 
724
727
  // save YT player data for later use (e.g. events)
725
- j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
726
- j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
728
+ // -----------------------------------------------------------------------
729
+ j1.modules.amplitudejs.data.ytp.previousSongIndex = songIndex;
730
+ j1.modules.amplitudejs.data.ytp.players[playerID].activeIndex = songIndex;
731
+ j1.modules.amplitudejs.data.ytp.players[playerID].previousIndex = songIndex - 1;
732
+ j1.modules.amplitudejs.data.ytp.players[playerID].videoID = ytpVideoID;
727
733
 
728
- logger.debug(`SWITCH video on loadNextVideo at trackID|VideoID: ${trackID}|${ytVideoID}`);
729
- ytPlayer.loadVideoById(ytVideoID);
730
734
 
735
+ logger.debug(`SWITCH video on loadNextVideo at trackID|VideoID: ${trackID}|${ytpVideoID}`);
736
+ ytPlayer.loadVideoById(ytpVideoID);
737
+
731
738
  // delay after switch video
732
739
  if (muteAfterVideoSwitchInterval) {
733
740
  ytPlayer.mute();
@@ -736,15 +743,17 @@ regenerate: true
736
743
  }, muteAfterVideoSwitchInterval);
737
744
  }
738
745
 
746
+ // save YT player data for later use (e.g. events)
747
+ // -----------------------------------------------------------------------
748
+ ytpSongIndex = songIndex;
749
+ j1.modules.amplitudejs.data.ytp.songIndex = songIndex;
750
+
739
751
  // load the song cover image
740
752
  loadCoverImage(songMetaData);
741
-
753
+
742
754
  // update meta data
743
755
  // ytpUpdatMetaContainers(songMetaData);
744
756
 
745
- var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
746
- togglePlayPauseButton(playPauseButtonClass);
747
-
748
757
  // set song (video) active at index in playlist
749
758
  setSongActive(playlist, songIndex);
750
759
 
@@ -756,12 +765,9 @@ regenerate: true
756
765
  scrollToActiveElement(playlist);
757
766
  }
758
767
 
759
- // TODO: check if SHUFFLE is enabled on PLAYLIST (PLAYER ???)
760
- // set FIRST song (video) paused
761
- ytPlayer.pauseVideo();
762
- }
768
+ } // END if songIndex
763
769
 
764
- } // END loadVideo
770
+ } // END loadNextVideo
765
771
 
766
772
  // ---------------------------------------------------------------------------
767
773
  // initUiEventsForAJS
@@ -833,7 +839,6 @@ regenerate: true
833
839
 
834
840
  // load individual player settings (to manage multiple players in page)
835
841
  //
836
- var ytpVideoID = activeSongMetadata.url.split('=')[1];
837
842
  var ytpAutoPlay = ('{{player.yt_player.autoplay}}'.length > 0) ? '{{player.yt_player.autoplay}}' : '{{amplitude_defaults.player.yt_player.autoplay}}';
838
843
  var ytpLoop = ('{{player.yt_player.loop}}'.length > 0) ? '{{player.yt_player.loop}}' : '{{amplitude_defaults.player.yt_player.loop}}';
839
844
  var ytpHeight = ('{{player.yt_player.height}}'.length > 0) ? '{{player.yt_player.height}}' : '{{amplitude_defaults.player.yt_player.height}}';
@@ -842,17 +847,17 @@ regenerate: true
842
847
  logger.info('AJS YouTube iFrame API: ready');
843
848
  logger.info('configure player on ID: #{{player.id}}');
844
849
 
845
- // create a hidden YT Player iFrame container
850
+ // create a (hidden) ytp iframe container
846
851
  //
847
852
  ytpContainer = document.getElementById('{{player.id}}_video');
848
853
  ytpContainer.innerHTML = '<div id="iframe_{{player.id}}"></div>';
849
854
  ytpContainer.style.cssText = 'display:none';
850
855
 
856
+ var ytpVideoID = (ytPlayerErrorTest) ? 'invalidVideoID' : activeSongMetadata.url.split('=')[1];
851
857
  ytPlayer = new YT.Player('iframe_{{player.id}}', {
852
858
  height: ytpHeight,
853
859
  width: ytpWidth,
854
860
  videoId: ytpVideoID,
855
- // videoId: 'bloedsinn',
856
861
  playerVars: {
857
862
  autoplay: ytpAutoPlay,
858
863
  loop: ytpLoop
@@ -885,7 +890,13 @@ regenerate: true
885
890
 
886
891
  // save YT player GLOBAL data for later use (e.g. events)
887
892
  j1.adapter.amplitude.data.ytpGlobals['ytApiReady'] = ytApiReady;
888
-
893
+
894
+
895
+ // save amplitudejs data for later use (e.g. events)
896
+ // -------------------------------------------------------------------
897
+ j1.modules.amplitudejs.data.ytp.apiReady = ytApiReady;
898
+
899
+
889
900
  // reset current player
890
901
  playerExistsInPage = false;
891
902
 
@@ -905,6 +916,12 @@ regenerate: true
905
916
  // save YT player GLOBAL data for later use (e.g. events)
906
917
  j1.adapter.amplitude.data.ytpGlobals['ytApiError'] = eventData;
907
918
 
919
+
920
+ // save amplitudejs data for later use (e.g. events)
921
+ // ------------------------------------------------------------------
922
+ j1.modules.amplitudejs.data.ytp.apiError = eventData;
923
+
924
+
908
925
  }
909
926
 
910
927
  // AJS YouTube Player initialization fired by the YT API
@@ -918,7 +935,7 @@ regenerate: true
918
935
  ytPlayerReady = true;
919
936
  playerVolumePreset = parseInt({{player.volume_slider.preset_value}});
920
937
 
921
- logger.debug(`FOUND video ready at ID: {{player.id}}`);
938
+ logger.debug(`FOUND video ready at ID: {{player.id}}`);
922
939
 
923
940
  // set video playback quality to a minimum
924
941
  ytPlayer.setPlaybackQuality('small');
@@ -943,12 +960,20 @@ regenerate: true
943
960
  }
944
961
  }
945
962
 
946
- logger.info('AJS YouTube Player on ID {{player.id}}: ready');
963
+ logger.info('yt player on ID {{player.id}}: ready');
947
964
 
948
965
  // save YT player GLOBAL data for later use (e.g. events)
949
966
  j1.adapter.amplitude.data.ytpGlobals['ytPlayerReady'] = ytPlayerReady;
950
967
  j1.adapter.amplitude.data.ytpGlobals['ytApiError'] = 0;
951
968
 
969
+
970
+ // save amplitudejs data for later use (e.g. events)
971
+ // -------------------------------------------------------------------
972
+ j1.modules.amplitudejs.data.ytp.apiError = 0;
973
+ j1.modules.amplitudejs.data.ytp.players.{{player.id}} = {};
974
+ j1.modules.amplitudejs.data.ytp.players.{{player.id}}.playerReady = ytPlayerReady;
975
+
976
+
952
977
  // get duration hours (if configured)
953
978
  if ({{player.display_hours}} ) {
954
979
  hours = ytpGetDurationHours(ytPlayer);
@@ -984,7 +1009,7 @@ regenerate: true
984
1009
  if (playerCounter > 0) {
985
1010
  logger.info('Found players of type video (YTP) in page: ' + playerCounter);
986
1011
  } else {
987
- logger.warn('Found NO players of type video (YTP) in page');
1012
+ isDev && logger.warn('Found NO players of type video (YTP) in page');
988
1013
  }
989
1014
 
990
1015
  // update activeVideoElement data structure for the ACTIVE video
@@ -1034,6 +1059,19 @@ regenerate: true
1034
1059
  j1.adapter.amplitude.data.ytPlayers.{{player.id}}.player = ytPlayer;
1035
1060
  j1.adapter.amplitude.data.ytPlayers.{{player.id}}.activeIndex = songIndex;
1036
1061
 
1062
+
1063
+ // save amplitudejs data for later use (e.g. events)
1064
+ // -------------------------------------------------------------------
1065
+ j1.modules.amplitudejs.data.activePlayer = 'ytp';
1066
+ j1.modules.amplitudejs.data.activeIndex = songIndex;
1067
+ j1.modules.amplitudejs.data.activePlaylist = playlist;
1068
+ j1.modules.amplitudejs.data.ytp.activePlayer = ytPlayer;
1069
+ j1.modules.amplitudejs.data.ytp.activeIndex = songIndex;
1070
+ j1.modules.amplitudejs.data.ytp.activePlaylist = playlist;
1071
+ j1.modules.amplitudejs.data.ytp.players.{{player.id}}.player = ytPlayer;
1072
+ j1.modules.amplitudejs.data.ytp.players.{{player.id}}.activeIndex = songIndex;
1073
+
1074
+
1037
1075
  // reset time container|progressbar for the ACTIVE song (video)
1038
1076
  // -------------------------------------------------------------------
1039
1077
  resetCurrentTimeContainerYTP(ytPlayer, playlist);
@@ -1083,6 +1121,13 @@ regenerate: true
1083
1121
  // ---------------------------------------------------------------------------
1084
1122
  initYtAPI();
1085
1123
 
1124
+ // save YT player data for later use (e.g. events)
1125
+ // ---------------------------------------------------------------------
1126
+ var url = '//youtube.com/iframe_api'
1127
+ if (document.querySelectorAll(`script[src="${url}"]`).length > 0) {
1128
+ j1.modules.amplitudejs.data.ytp.plugin = 'loaded';
1129
+ }
1130
+
1086
1131
  // ---------------------------------------------------------------------------
1087
1132
  // initUiEventsForAJS
1088
1133
  //
@@ -1214,7 +1259,8 @@ regenerate: true
1214
1259
 
1215
1260
  // toggle PlayPause buttons playing => puased
1216
1261
  // ---------------------------------------------------------------------
1217
- if (ytPlayerState === 'playing' || ytPlayerState === 'paused') {
1262
+ var isValidPlayerState = /playing|paused/.test(ytPlayerState);
1263
+ if (isValidPlayerState) {
1218
1264
  logger.debug(`STOP player at ytpStopParallelActivePlayers for id: ${ytPlayerID}`);
1219
1265
  player.stopVideo();
1220
1266
  var ytpButtonPlayerPlayPause = document.getElementsByClassName("large-player-play-pause-" + ytPlayerID);
@@ -1447,25 +1493,13 @@ regenerate: true
1447
1493
  function updateDurationTimeContainerYTP(player, playlist) {
1448
1494
  var hours, minutes, seconds;
1449
1495
  var durationHours, durationMinutes, durationSeconds;
1450
- var activeSongSettings, ytPlayer, activePlaylist;
1451
-
1452
- // update active song settings (manually)
1453
- checkActiveVideoElementYTP();
1454
-
1455
- // get active song settings (manually)
1456
- activeSongSettings = getActiveSong();
1457
- if (!activeSongSettings) {
1458
- return false;
1459
- }
1460
-
1461
- ytPlayer = activeSongSettings.player;
1462
- activePlaylist = activeSongSettings.playlist;
1496
+ var activePlaylist;
1463
1497
 
1464
1498
  // get current hours|minutes|seconds
1465
1499
  // -------------------------------------------------------------------------
1466
- hours = ytpGetDurationHours(ytPlayer);
1467
- minutes = ytpGetDurationMinutes(ytPlayer);
1468
- seconds = ytpGetDurationSeconds(ytPlayer);
1500
+ hours = ytpGetDurationHours(player);
1501
+ minutes = ytpGetDurationMinutes(player);
1502
+ seconds = ytpGetDurationSeconds(player);
1469
1503
 
1470
1504
  // update current duration|hours
1471
1505
  // -------------------------------------------------------------------------
@@ -1473,7 +1507,7 @@ regenerate: true
1473
1507
  if (durationHours.length && !isNaN(hours)) {
1474
1508
  for (var i=0; i<durationHours.length; i++) {
1475
1509
  var currentPlaylist = durationHours[i].dataset.amplitudePlaylist;
1476
- if (currentPlaylist === activePlaylist) {
1510
+ if (currentPlaylist === playlist) {
1477
1511
  durationHours[i].innerHTML = hours;
1478
1512
  }
1479
1513
  }
@@ -1485,7 +1519,7 @@ regenerate: true
1485
1519
  if (durationMinutes.length && !isNaN(minutes)) {
1486
1520
  for (var i=0; i<durationMinutes.length; i++) {
1487
1521
  var currentPlaylist = durationMinutes[i].dataset.amplitudePlaylist;
1488
- if (currentPlaylist === activePlaylist) {
1522
+ if (currentPlaylist === playlist) {
1489
1523
  durationMinutes[i].innerHTML = minutes;
1490
1524
  }
1491
1525
  }
@@ -1497,7 +1531,7 @@ regenerate: true
1497
1531
  if (durationSeconds.length && !isNaN(seconds)) {
1498
1532
  for (var i=0; i<durationSeconds.length; i++) {
1499
1533
  var currentPlaylist = durationSeconds[i].dataset.amplitudePlaylist;
1500
- if (currentPlaylist === activePlaylist) {
1534
+ if (currentPlaylist === playlist) {
1501
1535
  durationSeconds[i].innerHTML = seconds;
1502
1536
  }
1503
1537
  }
@@ -1749,10 +1783,13 @@ regenerate: true
1749
1783
  // Returns the duration of the video
1750
1784
  // ---------------------------------------------------------------------------
1751
1785
  function ytpGetDuration(player) {
1752
- var playerState, duration;
1786
+ var duration;
1753
1787
 
1754
- playerState = player.getPlayerState();
1755
- if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.BUFFERING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.CUED) {
1788
+ var playerState = player.getPlayerState();
1789
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1790
+
1791
+ var isValidPlayerState = /playing|paused|buffering|cued/.test(ytPlayerState);
1792
+ if (isValidPlayerState) {
1756
1793
  duration = player.getDuration();
1757
1794
 
1758
1795
  return duration;
@@ -1767,18 +1804,20 @@ regenerate: true
1767
1804
  // Returns the current time of the video played
1768
1805
  // ---------------------------------------------------------------------------
1769
1806
  function ytpGetCurrentTime(player) {
1770
- var currentTime, playerState;
1807
+ var currentTime;
1808
+
1809
+ var playerState = player.getPlayerState();
1810
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1771
1811
 
1772
- if (player !== undefined && player.getPlayerState !== undefined) {
1773
- playerState = player.getPlayerState();
1774
- if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.CUED) {
1812
+ var isValidPlayerState = /playing|paused|cued|unstarted/.test(ytPlayerState);
1813
+ if (isValidPlayerState) {
1775
1814
  currentTime = player.getCurrentTime();
1776
1815
 
1777
1816
  return currentTime;
1778
- } else {
1817
+ } else {
1779
1818
  return 0;
1780
- }
1781
1819
  }
1820
+
1782
1821
  } // END ytpGetCurrentTime
1783
1822
 
1784
1823
  // ---------------------------------------------------------------------------
@@ -1787,21 +1826,23 @@ regenerate: true
1787
1826
  // Returns the duration hours of the video
1788
1827
  // ---------------------------------------------------------------------------
1789
1828
  function ytpGetDurationHours(player) {
1790
- var playerState, duration, hours, d, h;
1829
+ var duration, hours, d, h;
1830
+
1831
+ var playerState = player.getPlayerState();
1832
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1791
1833
 
1792
- if (player !== undefined && player.getPlayerState !== undefined) {
1793
- playerState = player.getPlayerState();
1794
- if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.CUED ) {
1834
+ var isValidPlayerState = /playing|paused|cued/.test(ytPlayerState);
1835
+ if (isValidPlayerState) {
1795
1836
  duration = ytpGetDuration(player);
1796
1837
  d = Number(duration);
1797
1838
  h = Math.floor(d / 3600);
1798
1839
  hours = h.toString().padStart(2, '0');
1799
1840
 
1800
1841
  return hours;
1801
- } else {
1842
+ } else {
1802
1843
  return '00';
1803
- }
1804
1844
  }
1845
+
1805
1846
  } // END ytpGetDurationHours
1806
1847
 
1807
1848
  // ---------------------------------------------------------------------------
@@ -1810,21 +1851,23 @@ regenerate: true
1810
1851
  // Returns the duration minutes of the video
1811
1852
  // ---------------------------------------------------------------------------
1812
1853
  function ytpGetDurationMinutes(player) {
1813
- var playerState, duration, minutes, d, m;
1854
+ var duration, minutes, d, m;
1814
1855
 
1815
- if (player !== undefined && player.getPlayerState !== undefined) {
1816
- playerState = player.getPlayerState();
1817
- if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.CUED) {
1856
+ var playerState = player.getPlayerState();
1857
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1858
+
1859
+ var isValidPlayerState = /playing|paused|cued/.test(ytPlayerState);
1860
+ if (isValidPlayerState) {
1818
1861
  duration = ytpGetDuration(player);
1819
1862
  d = Number(duration);
1820
1863
  m = Math.floor(d % 3600 / 60);
1821
1864
  minutes = m.toString().padStart(2, '0');
1822
1865
 
1823
1866
  return minutes;
1824
- } else {
1867
+ } else {
1825
1868
  return '00';
1826
- }
1827
1869
  }
1870
+
1828
1871
  } // END ytpGetDurationMinutes
1829
1872
 
1830
1873
  // ---------------------------------------------------------------------------
@@ -1833,21 +1876,23 @@ regenerate: true
1833
1876
  // Returns the duration seconds of the video
1834
1877
  // ---------------------------------------------------------------------------
1835
1878
  function ytpGetDurationSeconds(player) {
1836
- var playerState, duration, seconds, d, s;
1879
+ var duration, seconds, d, s;
1837
1880
 
1838
- if (player !== undefined && player.getPlayerState !== undefined) {
1839
- playerState = player.getPlayerState();
1840
- if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.CUED ) {
1881
+ var playerState = player.getPlayerState();
1882
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1883
+
1884
+ var isValidPlayerState = /playing|paused|cued/.test(ytPlayerState);
1885
+ if (isValidPlayerState) {
1841
1886
  duration = ytpGetDuration(player);
1842
1887
  d = Number(duration);
1843
1888
  s = Math.floor(d % 60);
1844
1889
  seconds = s.toString().padStart(2, '0');
1845
1890
 
1846
1891
  return seconds;
1847
- } else {
1892
+ } else {
1848
1893
  return '00';
1849
- }
1850
1894
  }
1895
+
1851
1896
  } // END ytpGetDurationSeconds
1852
1897
 
1853
1898
  // ---------------------------------------------------------------------------
@@ -1856,21 +1901,23 @@ regenerate: true
1856
1901
  // Returns the current hours the user is into the video
1857
1902
  // ---------------------------------------------------------------------------
1858
1903
  function ytpGetCurrentHours(player) {
1859
- var playerState, currentTime, hours, d, h;
1904
+ var currentTime, hours, d, h;
1905
+
1906
+ var playerState = player.getPlayerState();
1907
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1860
1908
 
1861
- if (player !== undefined && player.getPlayerState !== undefined) {
1862
- playerState = player.getPlayerState();
1863
- if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.CUED) {
1909
+ var isValidPlayerState = /playing|paused/.test(ytPlayerState);
1910
+ if (isValidPlayerState) {
1864
1911
  currentTime = ytpGetCurrentTime(player);
1865
1912
  d = Number(currentTime);
1866
1913
  h = Math.floor(d / 3600);
1867
1914
  hours = h.toString().padStart(2, '0');
1868
1915
 
1869
1916
  return hours;
1870
- } else {
1917
+ } else {
1871
1918
  return '00';
1872
- }
1873
1919
  }
1920
+
1874
1921
  } // END ytpGetCurrentHours
1875
1922
 
1876
1923
  // ---------------------------------------------------------------------------
@@ -1879,21 +1926,23 @@ regenerate: true
1879
1926
  // Returns the current minutes the user is into the video
1880
1927
  // ---------------------------------------------------------------------------
1881
1928
  function ytpGetCurrentMinutes (player) {
1882
- var playerState, currentTime, minutes, d, m;
1929
+ var currentTime, minutes, d, m;
1930
+
1931
+ var playerState = player.getPlayerState();
1932
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1883
1933
 
1884
- if (player !== undefined && player.getPlayerState !== undefined) {
1885
- playerState = player.getPlayerState();
1886
- if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.CUED) {
1934
+ var isValidPlayerState = /playing|paused/.test(ytPlayerState);
1935
+ if (isValidPlayerState) {
1887
1936
  currentTime = ytpGetCurrentTime(player);
1888
1937
  d = Number(currentTime);
1889
1938
  m = Math.floor(d % 3600 / 60);
1890
1939
  minutes = m.toString().padStart(2, '0');
1891
1940
 
1892
1941
  return minutes;
1893
- } else {
1942
+ } else {
1894
1943
  return '00';
1895
- }
1896
1944
  }
1945
+
1897
1946
  } // END ytpGetCurrentMinutes
1898
1947
 
1899
1948
  // ---------------------------------------------------------------------------
@@ -1902,21 +1951,23 @@ regenerate: true
1902
1951
  // Returns the current seconds the user is into the video
1903
1952
  // ---------------------------------------------------------------------------
1904
1953
  function ytpGetCurrentSeconds(player) {
1905
- var playerState, currentTime, seconds, d, s;
1954
+ var currentTime, seconds, d, s;
1955
+
1956
+ var playerState = player.getPlayerState();
1957
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1906
1958
 
1907
- if (player !== undefined && player.getPlayerState !== undefined) {
1908
- playerState = player.getPlayerState();
1909
- if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.CUED ) {
1959
+ var isValidPlayerState = /playing|paused/.test(ytPlayerState);
1960
+ if (isValidPlayerState) {
1910
1961
  currentTime = ytpGetCurrentTime(player);
1911
1962
  d = Number(currentTime);
1912
1963
  s = Math.floor(d % 60);
1913
1964
  seconds = s.toString().padStart(2, '0');
1914
1965
 
1915
1966
  return seconds;
1916
- } else {
1967
+ } else {
1917
1968
  return '00';
1918
- }
1919
1969
  }
1970
+
1920
1971
  } // END ytpGetCurrentSeconds
1921
1972
 
1922
1973
  // ---------------------------------------------------------------------------
@@ -2031,8 +2082,7 @@ regenerate: true
2031
2082
  });
2032
2083
  }
2033
2084
 
2034
- // Overload AJS play_pause button for YT
2035
- // TODO: Fix for multiple players in page
2085
+ // Overload ytp play_pause button for YT
2036
2086
  // ---------------------------------------------------------------------
2037
2087
  var largePlayerPlayPauseButton = document.getElementsByClassName(playerButton);
2038
2088
  for (var i=0; i<largePlayerPlayPauseButton.length; i++) {
@@ -2041,36 +2091,25 @@ regenerate: true
2041
2091
 
2042
2092
  if (classString.includes(ytPlayerID)) {
2043
2093
  largePlayerPlayPauseButton[i].addEventListener('click', function(event) {
2044
- var activeSongSettings, songs, songMetaData, playerData,
2094
+ var activeSong, songs, songMetaData, playerData,
2045
2095
  ytPlayer, playerState, ytPlayerState, playlist,
2046
2096
  playerID, songIndex;
2047
2097
 
2048
- playlist = this.getAttribute("data-amplitude-playlist");
2049
- playerID = playlist + '_large';
2098
+ playlist = this.getAttribute("data-amplitude-playlist");
2099
+ playerID = playlist + '_large';
2100
+ activeSong = getActiveSong();
2050
2101
 
2051
- // update active song settings (manually)
2052
- checkActiveVideoElementYTP();
2053
-
2054
- // get active song settings (manually)
2055
- activeSongSettings = getActiveSong();
2056
- if (!activeSongSettings) {
2102
+ if (!activeSong) {
2057
2103
  songIndex = 0;
2058
2104
  ytpSongIndex = 0;
2059
2105
  } else {
2060
- if (activeSongSettings.playlist !== playlist) {
2106
+ if (activeSong.playlist !== playlist) {
2061
2107
  songIndex = 0;
2062
2108
  ytpSongIndex = 0;
2063
-
2064
- // reset previous player settings
2065
- // if (activeSongSettings.player !== undefined) {
2066
- // activeSongSettings.player.stopVideo();
2067
- // var playPauseButtonClass = `large-player-play-pause-${activeSongSettings.playerID}`;
2068
- // togglePlayPauseButton(playPauseButtonClass);
2069
- // }
2070
2109
  } else {
2071
2110
  songIndex = ytpSongIndex;
2072
2111
  }
2073
- } // END if activeSongSettings
2112
+ } // END if activeSong
2074
2113
 
2075
2114
  if (j1.adapter.amplitude.data.ytpGlobals.ytApiError > 0) {
2076
2115
  // do nothing on API errors
@@ -2080,20 +2119,10 @@ regenerate: true
2080
2119
  return;
2081
2120
  }
2082
2121
 
2083
- // update activeAudio data (manually)
2084
- checkActiveVideoElementYTP();
2085
-
2086
- // get active song settings (manually)
2087
- // activeSongSettings = getActiveSong();
2088
-
2089
2122
  playerData = j1.adapter.amplitude.data.ytPlayers[playerID];
2090
2123
  ytPlayer = playerData.player;
2091
2124
  songIndex = playerData.activeIndex;
2092
- songs = playerData.songs;
2093
-
2094
- // update meta data
2095
- // songMetaData = songs[songIndex];
2096
- // ytpUpdatMetaContainers(songMetaData);
2125
+ songs = playerData.songs;
2097
2126
 
2098
2127
  // save player GLOBAL data for later use (e.g. events)
2099
2128
  j1.adapter.amplitude.data.activePlayer = 'ytp';
@@ -2105,44 +2134,12 @@ regenerate: true
2105
2134
  playerState = ytPlayer.getPlayerState();
2106
2135
  ytPlayerState = (playerState < 0) ? YT_PLAYER_STATE_NAMES[6] : YT_PLAYER_STATE_NAMES[playerState];
2107
2136
 
2108
- // if (playerState < 0) {
2109
- // var ytPlayerState = YT_PLAYER_STATE_NAMES[6];
2110
- // } else {
2111
- // var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
2112
- // }
2113
-
2114
- // TOGGLE state 'playing' => 'paused'
2115
- if (ytPlayerState === 'playing') {
2116
- ytPlayer.pauseVideo();
2117
-
2118
- ytPlayerCurrentTime = ytPlayer.getCurrentTime();
2119
-
2120
- var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2121
- togglePlayPauseButton(playPauseButtonClass);
2122
-
2123
- // reset|update time settings
2124
- resetCurrentTimeContainerYTP(ytPlayer, playlist);
2125
- updateDurationTimeContainerYTP(ytPlayer, playlist);
2126
- }
2127
-
2128
- // TOGGLE state 'paused' => 'playing'
2129
- if (ytPlayerState === 'paused') {
2130
- ytPlayer.playVideo();
2131
- ytpSeekTo(ytPlayer, ytPlayerCurrentTime, true);
2132
-
2133
- var trackID = songIndex + 1;
2134
- logger.debug(`PLAY video for PlayPauseButton on playlist|trackID: ${playlist}|${trackID} at: ${ytPlayerCurrentTime}`);
2135
-
2136
- var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2137
- togglePlayPauseButton(playPauseButtonClass);
2138
-
2139
- // reset|update time settings
2140
- resetCurrentTimeContainerYTP(ytPlayer, playlist);
2141
- updateDurationTimeContainerYTP(ytPlayer, playlist);
2142
- } // if ytPlayerState === 'paused'
2143
-
2137
+ // NOTE:
2138
+ // ---------------------------------------------------------------
2139
+ // unclear why player state 'cued' occurs
2140
+ // ---------------------------------------------------------------
2144
2141
  // load (cued) video
2145
- if (ytPlayerState === 'cued') {
2142
+ if (ytPlayerState === 'cued' || ytPlayerState === 'unstarted' ) {
2146
2143
  ytPlayer.playVideo();
2147
2144
 
2148
2145
  // wait for API error state
@@ -2174,21 +2171,45 @@ regenerate: true
2174
2171
  updateDurationTimeContainerYTP(ytPlayer, playlist);
2175
2172
 
2176
2173
  }, 100);
2177
- } // END if ytPlayerState === 'cued'
2178
-
2179
- // TODO: unclear why state 'unstarted' is generated
2180
- // on LAST item
2181
- // workaround sofar
2182
- // -------------------------------------------------------------
2183
- // if (ytPlayerState === 'unstarted') {
2184
- // ytPlayer.playVideo();
2185
- // // ytPlayer.mute();
2186
- //
2187
- // var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2188
- // togglePlayPauseButton(playPauseButtonClass);
2189
- // resetCurrentTimeContainerYTP(ytPlayer, playlist);
2190
- // updateDurationTimeContainerYTP(ytPlayer, playlist);
2191
- // } // END if ytPlayerState === 'unstarted'
2174
+
2175
+ return;
2176
+ } // END if ytPlayerState === 'cued'
2177
+
2178
+ // NOTE:
2179
+ // ---------------------------------------------------------------
2180
+ // unclear why player state 'cued'
2181
+ // is folloed by 'unstarted'|'buffering' on playing
2182
+ // ---------------------------------------------------------------
2183
+ // TOGGLE state 'playing' => 'paused'
2184
+ var isValidPlayerState = /playing|unstarted|buffering/.test(ytPlayerState);
2185
+ if (isValidPlayerState) {
2186
+ ytPlayer.pauseVideo();
2187
+
2188
+ ytPlayerCurrentTime = ytPlayer.getCurrentTime();
2189
+
2190
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2191
+ togglePlayPauseButton(playPauseButtonClass);
2192
+
2193
+ // reset|update time settings
2194
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2195
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2196
+ }
2197
+
2198
+ // TOGGLE state 'paused' => 'playing'
2199
+ if (ytPlayerState === 'paused') {
2200
+ ytPlayer.playVideo();
2201
+ ytpSeekTo(ytPlayer, ytPlayerCurrentTime, true);
2202
+
2203
+ var trackID = songIndex + 1;
2204
+ logger.debug(`PLAY video for PlayPauseButton on playlist|trackID: ${playlist}|${trackID} at: ${ytPlayerCurrentTime}`);
2205
+
2206
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2207
+ togglePlayPauseButton(playPauseButtonClass);
2208
+
2209
+ // reset|update time settings
2210
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2211
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2212
+ } // if ytPlayerState === 'paused'
2192
2213
 
2193
2214
  // deactivate AJS events (if any)
2194
2215
  event.stopImmediatePropagation();
@@ -2198,7 +2219,6 @@ regenerate: true
2198
2219
  } // END for largePlayerPlayPauseButton
2199
2220
 
2200
2221
  // Overload AJS largePlayerSkipBackward button for YT
2201
- // TODO: Fix for multiple players in page
2202
2222
  // ---------------------------------------------------------------------
2203
2223
  var largePlayerSkipForwardButtons = document.getElementsByClassName("large-player-skip-forward");
2204
2224
  for (var i=0; i<largePlayerSkipForwardButtons.length; i++) {
@@ -2220,17 +2240,15 @@ regenerate: true
2220
2240
  if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) {
2221
2241
  logger.debug(`SKIP forward on Button skipForward for ${skipOffset} seconds`);
2222
2242
  ytpSeekTo(ytPlayer, currentVideoTime + skipOffset, true);
2223
-
2224
2243
  }
2225
2244
 
2226
2245
  // deactivate AJS events (if any)
2227
2246
  event.stopImmediatePropagation();
2228
- }); // END Listener 'click'
2229
- } // END if skip-forward button
2230
- } // END for
2247
+ }); // END eventListener
2248
+ } // END if classString.includes(ytPlayerID
2249
+ } // END for largePlayerSkipForwardButtons
2231
2250
 
2232
2251
  // Overload AJS largePlayerSkipBackward button for YT
2233
- // TODO: Fix for multiple players in page
2234
2252
  // ---------------------------------------------------------------------
2235
2253
  var largePlayerSkipBackwardButtons = document.getElementsByClassName("large-player-skip-backward");
2236
2254
  for (var i=0; i<largePlayerSkipBackwardButtons.length; i++) {
@@ -2261,8 +2279,6 @@ regenerate: true
2261
2279
  } // END for
2262
2280
 
2263
2281
  // Overload AJS largePlayerNext button for YT
2264
- // click on (player) next button
2265
- // TODO: Fix for multiple players in page
2266
2282
  // ---------------------------------------------------------------------
2267
2283
  var largePlayerNextButton = document.getElementsByClassName("large-player-next");
2268
2284
  for (var i=0; i<largePlayerNextButton.length; i++) {
@@ -2321,6 +2337,14 @@ regenerate: true
2321
2337
  j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2322
2338
  j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
2323
2339
 
2340
+ // save amplitudejs data for later use (e.g. events)
2341
+ // ---------------------------------------------------------------
2342
+ j1.modules.amplitudejs.data.ytp.activeIndex = songIndex;
2343
+ j1.modules.amplitudejs.data.ytp.activePlaylist = playlist;
2344
+ j1.modules.amplitudejs.data.ytp.players[playerID].player = ytPlayer;
2345
+ j1.modules.amplitudejs.data.ytp.players[playerID].activeIndex = songIndex;
2346
+
2347
+
2324
2348
  trackID = songIndex + 1;
2325
2349
  logger.debug(`SWITCH video for PlayerNextButton at trackID|VideoID: ${trackID}|${ytpVideoID}`);
2326
2350
  ytPlayer.loadVideoById(ytpVideoID);
@@ -2376,13 +2400,11 @@ regenerate: true
2376
2400
  event.stopImmediatePropagation();
2377
2401
 
2378
2402
  }); // END EventListener 'click' next button
2379
- } // END if
2403
+ } // END if classString.includes(ytPlayerID)
2380
2404
 
2381
2405
  } // END for largePlayerNextButton
2382
2406
 
2383
2407
  // Overload AJS largePlayerPrevious button for YT
2384
- // click on (player) previous button
2385
- // TODO: Fix for multiple players in page
2386
2408
  // -----------------------------------------------------------------------
2387
2409
  var largePlayePreviousButton = document.getElementsByClassName("large-player-previous");
2388
2410
  for (var i=0; i<largePlayePreviousButton.length; i++) {
@@ -2434,6 +2456,19 @@ regenerate: true
2434
2456
  j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
2435
2457
  j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
2436
2458
 
2459
+
2460
+ // save amplitudejs data for later use (e.g. events)
2461
+ // -----------------------------------------------------------------
2462
+ j1.modules.amplitudejs.data.activePlayer = songIndex;
2463
+ j1.modules.amplitudejs.data.activeIndex = songIndex;
2464
+ j1.modules.amplitudejs.data.activePlaylist = songIndex;
2465
+ j1.modules.amplitudejs.data.ytp.activeIndex = songIndex;
2466
+ j1.modules.amplitudejs.data.ytp.activePlaylist = playlist;
2467
+ j1.modules.amplitudejs.data.ytp.players[playerID].player = ytPlayer;
2468
+ j1.modules.amplitudejs.data.ytp.players[playerID].activeIndex = songIndex;
2469
+
2470
+
2471
+
2437
2472
  // load previous video
2438
2473
  // -----------------------------------------------------------------
2439
2474
 
@@ -2497,12 +2532,11 @@ regenerate: true
2497
2532
  event.stopImmediatePropagation();
2498
2533
 
2499
2534
  }); // END EventListener 'click' next button
2500
- } // END if
2535
+ } // END if classString.includes(ytPlayerID)
2501
2536
 
2502
2537
  } // END for largePlayerNextButton
2503
2538
 
2504
2539
  // click on song container
2505
- // TODO: Fix for multiple players in page
2506
2540
  // -------------------------------------------------------------------------
2507
2541
  var largePlayerSongContainer = document.getElementsByClassName("amplitude-song-container");
2508
2542
  for (var i=0; i<largePlayerSongContainer.length; i++) {
@@ -2511,11 +2545,13 @@ regenerate: true
2511
2545
 
2512
2546
  if (classString.includes(ytPlayerID)) {
2513
2547
  largePlayerSongContainer[i].addEventListener('click', function(event) {
2514
- var activeSongSettings, playlist, playerID, playerState,
2548
+ var activeSong, playlist, playerID,
2549
+ playerState, ytPlayerState,
2515
2550
  songs, songIndex, songName, singleAudio, trackID,
2516
2551
  ytPlayer, ytpVideoID, activeSongIndex, isSongIndexChanged;
2517
2552
 
2518
2553
  // set (current) playlist|song data
2554
+ // -------------------------------------------------------------------
2519
2555
  playlist = this.getAttribute("data-amplitude-playlist");
2520
2556
  playerID = playlist + '_large';
2521
2557
  songIndex = parseInt(this.getAttribute("data-amplitude-song-index"));
@@ -2523,37 +2559,69 @@ regenerate: true
2523
2559
  activeSongIndex = j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex;
2524
2560
  isSongIndexChanged = (activeSongIndex !== songIndex) ? true : false;
2525
2561
 
2526
- // update active song settings (manually)
2527
- checkActiveVideoElementYTP();
2528
-
2529
2562
  // set (current) song meta data
2530
- songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
2531
- songMetaData = songs[songIndex];
2532
- songURL = songMetaData.url;
2533
- ytpVideoID = songURL.split('=')[1];
2534
- // ytpVideoID = 'bloedsinn';
2535
- ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
2536
- playerState = ytPlayer.getPlayerState();
2563
+ // -------------------------------------------------------------------
2564
+ songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
2565
+ songMetaData = songs[songIndex];
2566
+ songURL = songMetaData.url;
2567
+ ytpVideoID = (ytPlayerErrorTest) ? 'invalidVideoID' : songURL.split('=')[1];
2568
+ ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
2569
+ playerState = ytPlayer.getPlayerState();
2570
+ ytPlayerState = (playerState < 0) ? YT_PLAYER_STATE_NAMES[6] : YT_PLAYER_STATE_NAMES[playerState];
2571
+
2572
+ // NOTE:
2573
+ // -------------------------------------------------------------------
2574
+ // unclear why player state 'cued' occurs
2575
+ // -------------------------------------------------------------------
2576
+ // load (cued) video
2577
+ if (ytPlayerState === 'cued') {
2578
+ ytPlayer.playVideo();
2579
+
2580
+ // wait for API error state
2581
+ setTimeout(() => {
2582
+ if (j1.adapter.amplitude.data.ytpGlobals.ytApiError > 0) {
2583
+ var trackID = songIndex + 1;
2584
+ logger.error(`DISABLED player for playlist|trackID: ${playlist}|${trackID} on API error '${YT_PLAYER_ERROR_NAMES[j1.adapter.amplitude.data.ytpGlobals.ytApiError]}'`);
2585
+
2586
+ // do nothing on API errors
2587
+ return;
2588
+ }
2589
+
2590
+ // reset progress bar settings
2591
+ resetProgressBarYTP();
2592
+
2593
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2594
+ togglePlayPauseButton(playPauseButtonClass);
2595
+
2596
+ // set song at songIndex active in playlist
2597
+ setSongActive(playlist, songIndex);
2598
+
2599
+ // scroll song active at index in player
2600
+ if (playerAutoScrollSongElement) {
2601
+ scrollToActiveElement(playlist);
2602
+ }
2603
+
2604
+ // reset|update time settings
2605
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2606
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2607
+
2608
+ }, 100);
2609
+
2610
+ return;
2611
+ } // END if ytPlayerState === 'cued'
2537
2612
 
2538
2613
  // TOGGLE state 'playing' => 'paused' if video (audio) NOT changed
2539
- if (playerState === YT_PLAYER_STATE.PLAYING && !isSongIndexChanged) {
2614
+ if (!isSongIndexChanged && ytPlayerState === 'playing') {
2540
2615
  ytPlayer.pauseVideo();
2541
2616
  // get active song settings (manually)
2542
- activeSongSettings = getActiveSong();
2617
+ activeSong = getActiveSong();
2543
2618
 
2544
- if (activeSongSettings) {
2545
- // ytpCurrentTime = activeSongSettings.currentTime;
2546
- if (activeSongSettings.playlist !== playlist) {
2619
+ if (activeSong) {
2620
+ // ytpCurrentTime = activeSong.currentTime;
2621
+ if (activeSong.playlist !== playlist) {
2547
2622
  // set current player settings
2548
2623
  songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
2549
2624
  ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
2550
-
2551
- // reset previous player settings
2552
- // if (activeSongSettings.player !== undefined) {
2553
- // activeSongSettings.player.stopVideo();
2554
- // var playPauseButtonClass = `large-player-play-pause-${activeSongSettings.playerID}`;
2555
- // togglePlayPauseButton(playPauseButtonClass);
2556
- // }
2557
2625
  } else {
2558
2626
  // set current player settings
2559
2627
  songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
@@ -2577,8 +2645,10 @@ regenerate: true
2577
2645
  resetCurrentTimeContainerYTP(ytPlayer, playlist);
2578
2646
  updateDurationTimeContainerYTP(ytPlayer, playlist);
2579
2647
 
2580
- // update global song index (start at 0)
2581
- ytpSongIndex = songIndex;
2648
+ // save YT player data for later use (e.g. events)
2649
+ // ---------------------------------------------------------------
2650
+ ytpSongIndex = songIndex;
2651
+ j1.modules.amplitudejs.data.ytp.songIndex = songIndex;
2582
2652
 
2583
2653
  // save YT player GLOBAL data for later use (e.g. events)
2584
2654
  j1.adapter.amplitude.data.activePlayer = 'ytp';
@@ -2589,6 +2659,19 @@ regenerate: true
2589
2659
  j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2590
2660
  j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
2591
2661
 
2662
+
2663
+ // save amplitudejs data for later use (e.g. events)
2664
+ // -----------------------------------------------------------------
2665
+ j1.modules.amplitudejs.data.activePlayer = ytPlayer;
2666
+ j1.modules.amplitudejs.data.activeIndex = songIndex;
2667
+ j1.modules.amplitudejs.data.activePlaylist = playlist;
2668
+ j1.modules.amplitudejs.data.ytp.activeIndex = songIndex;
2669
+ j1.modules.amplitudejs.data.ytp.activePlaylist = playlist;
2670
+ j1.modules.amplitudejs.data.ytp.players[playerID].player = ytPlayer;
2671
+ j1.modules.amplitudejs.data.ytp.players[playerID].activeIndex = songIndex;
2672
+ j1.modules.amplitudejs.data.ytp.players[playerID].ytpVideoID = ytpVideoID;
2673
+
2674
+
2592
2675
  // reset|update current time settings
2593
2676
  resetCurrentTimeContainerYTP(ytPlayer, playlist);
2594
2677
  updateDurationTimeContainerYTP(ytPlayer, playlist);
@@ -2616,26 +2699,17 @@ regenerate: true
2616
2699
  } // END if playerState === PLAYING
2617
2700
 
2618
2701
  // TOGGLE state 'paused' => 'playing' if video (audio) NOT changed
2619
- if (playerState === YT_PLAYER_STATE.PAUSED && !isSongIndexChanged) {
2702
+ if (!isSongIndexChanged && ytPlayerState === 'paused') {
2620
2703
  ytPlayer.playVideo();
2621
2704
  ytpSeekTo(ytPlayer, ytPlayerCurrentTime, true);
2622
2705
 
2623
- // get active song settings (manually)
2624
- activeSongSettings = getActiveSong();
2625
-
2626
- if (activeSongSettings) {
2627
- // ytpCurrentTime = activeSongSettings.currentTime;
2628
- if (activeSongSettings.playlist !== playlist) {
2706
+ activeSong = getActiveSong();
2707
+ if (activeSong) {
2708
+ // ytpCurrentTime = activeSong.currentTime;
2709
+ if (activeSong.playlist !== playlist) {
2629
2710
  // set current player settings
2630
2711
  songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
2631
2712
  ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
2632
-
2633
- // reset previous player settings
2634
- // if (activeSongSettings.player !== undefined) {
2635
- // activeSongSettings.player.stopVideo();
2636
- // var playPauseButtonClass = `large-player-play-pause-${activeSongSettings.playerID}`;
2637
- // togglePlayPauseButton(playPauseButtonClass);
2638
- // }
2639
2713
  } else {
2640
2714
  // set current player settings
2641
2715
  songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
@@ -2671,7 +2745,7 @@ regenerate: true
2671
2745
  // -------------------------------------------------------------------
2672
2746
  trackID = songIndex + 1;
2673
2747
  logger.debug(`SWITCH video for PlayerSongContainer at trackID|VideoID: ${trackID}|${ytpVideoID}`);
2674
- ytPlayer.loadVideoById(ytpVideoID);
2748
+ loadVideo(playlist, songIndex)
2675
2749
 
2676
2750
  // wait for API error state
2677
2751
  setTimeout(() => {
@@ -2683,18 +2757,34 @@ regenerate: true
2683
2757
  return;
2684
2758
  }
2685
2759
 
2686
- // update global song index (start at 0)
2687
- ytpSongIndex = songIndex;
2760
+ // save YT player data for later use (e.g. events)
2761
+ // -------------------------------------------------------------
2762
+ ytpSongIndex = songIndex;
2763
+ j1.modules.amplitudejs.data.ytp.songIndex = songIndex;
2688
2764
 
2689
2765
  // save YT player GLOBAL data for later use (e.g. events)
2690
- j1.adapter.amplitude.data.activePlayer = 'ytp';
2691
- j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
2766
+ j1.adapter.amplitude.data.activePlayer = 'ytp';
2767
+ j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
2692
2768
  j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
2693
2769
 
2694
2770
  // save YT player data for later use (e.g. events)
2695
2771
  j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2696
2772
  j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
2697
2773
 
2774
+
2775
+ // save amplitudejs data for later use (e.g. events)
2776
+ // -------------------------------------------------------------
2777
+ j1.modules.amplitudejs.data.activePlayer = 'ytp';
2778
+ j1.modules.amplitudejs.data.activeIndex = songIndex;
2779
+ j1.modules.amplitudejs.data.activePlaylist = playlist;
2780
+ j1.modules.amplitudejs.data.ytp.songIndex = songIndex;
2781
+ j1.modules.amplitudejs.data.ytp.activeIndex = songIndex;
2782
+ j1.modules.amplitudejs.data.ytp.activePlaylist = playlist;
2783
+ j1.modules.amplitudejs.data.ytp.players[playerID].player = ytPlayer;
2784
+ j1.modules.amplitudejs.data.ytp.players[playerID].activeIndex = songIndex;
2785
+ j1.modules.amplitudejs.data.ytp.players[playerID].ytpVideoID = ytpVideoID;
2786
+
2787
+
2698
2788
  // reset|update current time settings
2699
2789
  resetCurrentTimeContainerYTP(ytPlayer, playlist);
2700
2790
  updateDurationTimeContainerYTP(ytPlayer, playlist);
@@ -2718,8 +2808,8 @@ regenerate: true
2718
2808
  }
2719
2809
 
2720
2810
  // save YT player data for later use (e.g. events)
2721
- j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2722
- j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
2811
+ // j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2812
+ // j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
2723
2813
 
2724
2814
  // mute sound after next video load
2725
2815
  // -------------------------------------------------------------------
@@ -2729,7 +2819,7 @@ regenerate: true
2729
2819
  ytPlayer.unMute();
2730
2820
  }, muteAfterVideoSwitchInterval);
2731
2821
  }
2732
- }, 100);
2822
+ }, 100); // END timeout
2733
2823
  } // END if isSongIndexChanged
2734
2824
 
2735
2825
  // deactivate AJS events (if any)
@@ -2739,7 +2829,6 @@ regenerate: true
2739
2829
  } // END for largePlayerSongContainer
2740
2830
 
2741
2831
  // add listeners to all progress bars found
2742
- // TODO: Fix for multiple players in page
2743
2832
  // -------------------------------------------------------------------------
2744
2833
  var progressBars = document.getElementsByClassName("large-player-progress");
2745
2834
  if (progressBars.length) {
@@ -2759,30 +2848,24 @@ regenerate: true
2759
2848
  j1.adapter.amplitude.data.ytPlayers[playerID].progressBar = progressBar;
2760
2849
 
2761
2850
  progressBars[i].addEventListener('click', function(event) {
2762
- var activeSongSettings, playlist, ytPlayer,
2763
- playerState, progressBar, percentage, time;
2764
-
2765
- // update active song settings (manually)
2766
- checkActiveVideoElementYTP();
2767
-
2768
- // get active song settings (manually)
2769
- activeSongSettings = getActiveSong();
2851
+ var activeSong, playlist, ytPlayer,
2852
+ playerState, progressBar, percentage, time;
2770
2853
 
2771
- if (!activeSongSettings) {
2772
- // do nothing if current video (audio) item is NOT selected|active
2854
+ activeSong = getActiveSong();
2855
+ if (!activeSong) {
2856
+ // do nothing if activeSong data is missing (failsafe)
2773
2857
  return;
2774
2858
  }
2775
2859
 
2776
2860
  playlist = this.getAttribute("data-amplitude-playlist");
2777
- if (activeSongSettings.playlist !== playlist) {
2778
- // do nothing on PREVIOUS playlist (player)
2861
+ if (activeSong.playlist !== playlist) {
2862
+ // do nothing on PREVIOUS playlist
2779
2863
  return;
2780
2864
  }
2781
2865
 
2782
- ytPlayer = activeSongSettings.player;
2866
+ ytPlayer = activeSong.player;
2783
2867
  playerState = ytPlayer.getPlayerState();
2784
2868
 
2785
- //if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.BUFFERING) {
2786
2869
  if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.BUFFERING) {
2787
2870
  progressBar = this;
2788
2871
  percentage = getProgressBarSelectedPositionPercentage(event, progressBar);
@@ -2807,69 +2890,58 @@ regenerate: true
2807
2890
  } // END if progressBars
2808
2891
 
2809
2892
  // add listeners to all volume sliders found
2810
- // TODO: Fix for multiple players in page
2811
2893
  // -------------------------------------------------------------------------
2812
2894
  var volumeSliders = document.getElementsByClassName("amplitude-volume-slider");
2813
2895
  for (var i=0; i<volumeSliders.length; i++) {
2814
2896
  if (volumeSliders[i].dataset.amplitudeSource === 'audio') {
2815
2897
  // do nothing (managed by adapter)
2816
- var bla = 1;
2817
2898
  } else {
2818
2899
  if (volumeSliders[i]) {
2819
- // for (var i=0; i<volumeSliders.length; i++) {
2820
- var volumeSlider = volumeSliders[i];
2821
- var sliderID = volumeSliders[i].id;
2822
- var playerID = sliderID.split('volume_slider_')[1];
2900
+ var volumeSlider = volumeSliders[i];
2901
+ var sliderID = volumeSliders[i].id;
2902
+ var playerID = sliderID.split('volume_slider_')[1];
2823
2903
 
2824
- // save YT player data for later use (e.g. events)
2825
- if (volumeSlider.dataset.amplitudeSource === 'youtube') {
2826
- j1.adapter.amplitude.data.ytPlayers[playerID].volumeSlider = volumeSlider;
2827
- }
2904
+ // save YT player data for later use (e.g. events)
2905
+ if (volumeSlider.dataset.amplitudeSource === 'youtube') {
2906
+ j1.adapter.amplitude.data.ytPlayers[playerID].volumeSlider = volumeSlider;
2907
+ }
2828
2908
 
2829
- volumeSliders[i].addEventListener('click', function(event) {
2909
+ volumeSliders[i].addEventListener('click', function(event) {
2910
+ var activeSong = getActiveSong();
2830
2911
 
2831
- // update active song settings (manually)
2832
- checkActiveVideoElementYTP();
2833
-
2834
- // get active song settings (manually)
2835
- var activeSongSettings = getActiveSong();
2912
+ if (!activeSong) {
2913
+ // do nothing if activeSong data is missing (failsafe)
2914
+ return;
2915
+ }
2836
2916
 
2837
- if (!activeSongSettings) {
2838
- // do nothing if current video (audio) item is NOT selected|active
2839
- return;
2840
- }
2841
-
2842
- var ytPlayer = activeSongSettings.player;
2843
- var playerState = ytPlayer.getPlayerState();
2917
+ var ytPlayer = activeSong.player;
2918
+ var playerState = ytPlayer.getPlayerState();
2844
2919
 
2845
- if ((playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) && ytPlayer !== undefined) {
2846
- var volumeSlider, volumeValue;
2847
- var currenVolume = ytPlayer.getVolume();
2920
+ if ((playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) && ytPlayer !== undefined) {
2921
+ var volumeSlider, volumeValue;
2922
+ var currenVolume = ytPlayer.getVolume();
2848
2923
 
2849
- volumeSlider = this;
2850
- volumeValue = 50; // default
2924
+ volumeSlider = this;
2925
+ volumeValue = 50; // default
2851
2926
 
2852
- if (volumeSlider !== null) {
2853
- volumeValue = parseInt(volumeSlider.value);
2854
- }
2927
+ if (volumeSlider !== null) {
2928
+ volumeValue = parseInt(volumeSlider.value);
2929
+ }
2855
2930
 
2856
- ytPlayer.setVolume(volumeValue);
2857
- } // END if ytPlayer
2931
+ ytPlayer.setVolume(volumeValue);
2932
+ } // END if ytPlayer
2858
2933
 
2859
- }); // END EventListener 'click'
2860
- // } // END for
2934
+ }); // END EventListener 'click'
2861
2935
  } // END if volumeSliders
2862
2936
  } // END if volumeSliders
2863
2937
  } // END for volumeSliders
2864
2938
 
2865
2939
  // add listeners to all mute buttons found
2866
- // TODO: Fix for multiple buttons in page
2867
2940
  // -------------------------------------------------------------------------
2868
2941
  var volumeMutes = document.getElementsByClassName("amplitude-mute");
2869
2942
  for (var i=0; i<volumeMutes.length; i++) {
2870
2943
  if (volumeMutes[i].dataset.amplitudeSource === 'audio') {
2871
2944
  // do nothing (managed by adapter)
2872
- var bla = 1;
2873
2945
  } else {
2874
2946
  if (volumeMutes[i]) {
2875
2947
  var volumMute = volumeMutes[i];
@@ -2877,25 +2949,23 @@ regenerate: true
2877
2949
  var playerID = sliderID.split('amplitude-mute_')[1];
2878
2950
 
2879
2951
  volumeMutes[i].addEventListener('click', function(event) {
2952
+ var activeSong = getActiveSong();
2880
2953
 
2881
- // update active song settings (manually)
2882
- checkActiveVideoElementYTP();
2883
-
2884
- // get active song settings (manually)
2885
- var activeSongSettings = getActiveSong();
2886
-
2887
- if (!activeSongSettings) {
2888
- // do nothing if current video (audio) item is NOT selected|active
2954
+ if (!activeSong) {
2955
+ // do nothing if activeSong data is missing (failsafe)
2889
2956
  return;
2890
2957
  }
2891
2958
 
2892
- var ytPlayer = activeSongSettings.player;
2959
+ var ytPlayer = activeSong.player;
2893
2960
  var playerState = ytPlayer.getPlayerState();
2894
2961
  var volumeSlider = j1.adapter.amplitude.data.ytPlayers[playerID].volumeSlider;
2895
2962
  var currenVolume = ytPlayer.getVolume();
2896
2963
  var playerVolumePreset = parseInt(j1.adapter.amplitude.data.ytPlayers[playerID].playerSettings.volume_slider.preset_value);
2897
-
2898
- if ((playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) && ytPlayer !== undefined) {
2964
+ var playerState = (ytPlayer.getPlayerState() > 0) ? ytPlayer.getPlayerState() : 6;
2965
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
2966
+
2967
+ var isValidPlayerState = /playing|paused/.test(ytPlayerState);
2968
+ if (isValidPlayerState && ytPlayer !== undefined) {
2899
2969
  if (currenVolume > 0) {
2900
2970
  volumeSlider.value = 0;
2901
2971
  ytPlayer.setVolume(0);