j1-template 2024.3.18 → 2024.3.20
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.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/_includes/themes/j1/modules/searcher/procedures/topsearch.proc +1 -1
- data/assets/data/{amplitude.html → amplitude_app.html} +176 -152
- data/assets/data/masonry.html +1 -1
- data/assets/data/swiper_app.2.html +757 -0
- data/assets/data/swiper_app.4.html +769 -0
- data/assets/data/swiper_app.html +901 -0
- data/assets/data/{swiper.json → swiper_app.json} +10 -7
- data/assets/theme/j1/adapter/js/amplitude.js +821 -169
- data/assets/theme/j1/adapter/js/carousel.js +1 -1
- data/assets/theme/j1/adapter/js/swiper.js +92 -43
- data/assets/theme/j1/core/css/animate.css +2 -4
- data/assets/theme/j1/core/css/animate.min.css +1 -2
- data/assets/theme/j1/core/css/icon-fonts/fontawesome.css +2 -4
- data/assets/theme/j1/core/css/icon-fonts/fontawesome.min.css +1 -2
- data/assets/theme/j1/core/css/icon-fonts/iconify.css +5 -7
- data/assets/theme/j1/core/css/icon-fonts/iconify.min.css +1 -2
- data/assets/theme/j1/core/css/icon-fonts/mdi.css +9 -11
- data/assets/theme/j1/core/css/icon-fonts/mdi.min.css +1 -2
- data/assets/theme/j1/core/css/icon-fonts/mdib.css +7 -9
- data/assets/theme/j1/core/css/icon-fonts/mdib.min.css +1 -2
- data/assets/theme/j1/core/css/icon-fonts/mdil.css +10 -10
- data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.css +112 -104
- data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.min.css +1 -2
- data/assets/theme/j1/core/css/themes/unodark/bootstrap.css +150 -142
- data/assets/theme/j1/core/css/themes/unodark/bootstrap.min.css +1 -2
- data/assets/theme/j1/core/css/themes/unolight/bootstrap.css +210 -202
- data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css +1 -2
- data/assets/theme/j1/core/css/vendor.css +10 -12
- data/assets/theme/j1/core/css/vendor.min.css +1 -2
- data/assets/theme/j1/core/js/template.js +10669 -10669
- data/assets/theme/j1/core/js/template.min.js +25 -25
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.css +141 -212
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.min.css +1 -1
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.css +117 -23
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.min.css +1 -1
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.css +323 -493
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.min.css +1 -2
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/mini.css +20 -73
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/mini.min.css +1 -1
- data/assets/theme/j1/modules/amplitudejs/js/amplitude.js +1 -2
- data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.js +2063 -844
- data/assets/theme/j1/modules/amplitudejs/scss/theme/uno/dark/player/large.scss +439 -264
- data/assets/theme/j1/modules/bootstrap/js/bootstrap.js +0 -1
- data/assets/theme/j1/modules/bootstrap/js/bootstrap.min.js +0 -1
- data/assets/theme/j1/modules/gemini/js/gemini.js +1 -1
- data/assets/theme/j1/modules/gemini/js/geo/geocoder.js +1975 -0
- data/assets/theme/j1/modules/gemini/js/geo/geocoder.min.js +15 -1975
- data/assets/theme/j1/modules/gemini/js/geo/leaflet.min.js +4 -3
- data/assets/theme/j1/modules/swiperjs/css/modules/layoutBase.css +16 -0
- data/assets/theme/j1/modules/swiperjs/css/modules/layoutBase.min.css +16 -0
- data/assets/theme/j1/modules/swiperjs/css/modules/layoutExpanding.css +252 -0
- data/assets/theme/j1/modules/swiperjs/css/modules/layoutExpanding.min.css +17 -0
- data/assets/theme/j1/modules/{swiper/css/modules/effectNeighbor.css → swiperjs/css/modules/layoutNeighbor.css} +12 -11
- data/assets/theme/j1/modules/{swiper/css/modules/effectNeighbor.min.css → swiperjs/css/modules/layoutNeighbor.min.css} +3 -3
- data/assets/theme/j1/modules/{swiper/css/modules/effectPanorama.css → swiperjs/css/modules/layoutPanorama.css} +2 -2
- data/assets/theme/j1/modules/{swiper/css/modules/effectPanorama.min.css → swiperjs/css/modules/layoutPanorama.min.css} +2 -2
- data/assets/theme/j1/modules/swiperjs/css/modules/layoutParallax.css +16 -0
- data/assets/theme/j1/modules/swiperjs/css/modules/layoutParallax.min.css +16 -0
- data/assets/theme/j1/modules/swiperjs/css/modules/layoutStacked.css +97 -0
- data/assets/theme/j1/modules/swiperjs/css/modules/layoutStacked.min.css +17 -0
- data/assets/theme/j1/modules/{swiper/css/modules/effectThumbs.min.css → swiperjs/css/modules/layoutThumbs.css} +2 -2
- data/assets/theme/j1/modules/swiperjs/css/modules/layoutThumbs.min.css +17 -0
- data/assets/theme/j1/modules/{swiper → swiperjs}/css/swiper-bundle.css +1 -0
- data/assets/theme/j1/modules/{swiper → swiperjs}/css/theme/uno.css +97 -37
- data/assets/theme/j1/modules/swiperjs/css/theme/uno.min.css +17 -0
- data/assets/theme/j1/modules/swiperjs/js/modules/layoutBase.js +25 -0
- data/assets/theme/j1/modules/{swiper/js/modules/effectThumbs.min.js → swiperjs/js/modules/layoutBase.min.js} +10 -18
- data/assets/theme/j1/modules/swiperjs/js/modules/layoutExpanding.js +25 -0
- data/assets/theme/j1/modules/swiperjs/js/modules/layoutExpanding.min.js +25 -0
- data/assets/theme/j1/modules/swiperjs/js/modules/layoutNeighbor.js +107 -0
- data/assets/theme/j1/modules/swiperjs/js/modules/layoutNeighbor.min.js +17 -0
- data/assets/theme/j1/modules/{swiper/js/modules/effectPanorama.js → swiperjs/js/modules/layoutPanorama.js} +4 -5
- data/assets/theme/j1/modules/{swiper/js/modules/effectPanorama.min.js → swiperjs/js/modules/layoutPanorama.min.js} +2 -2
- data/assets/theme/j1/modules/{swiper/js/modules/effectNeighbor.js → swiperjs/js/modules/layoutParallax.js} +10 -18
- data/assets/theme/j1/modules/{swiper/js/modules/effectNeighbor.min.js → swiperjs/js/modules/layoutParallax.min.js} +10 -18
- data/assets/theme/j1/modules/swiperjs/js/modules/layoutStacked.0.js +114 -0
- data/assets/theme/j1/modules/swiperjs/js/modules/layoutStacked.1.js +93 -0
- data/assets/theme/j1/modules/swiperjs/js/modules/layoutStacked.js +104 -0
- data/assets/theme/j1/modules/swiperjs/js/modules/layoutStacked.min.js +17 -0
- data/assets/theme/j1/modules/{swiper/js/modules/effectThumbs.js → swiperjs/js/modules/layoutThumbs.js} +79 -28
- data/assets/theme/j1/modules/swiperjs/js/modules/layoutThumbs.min.js +17 -0
- data/assets/theme/j1/modules/swiperjs/js/swiper-bundle.js +9812 -0
- data/assets/theme/j1/modules/swiperjs/js/swiper-bundle.min.js +23 -0
- data/assets/theme/j1/modules/videojs/css/plugins/controls/zoom.css +1 -1
- data/assets/theme/j1/modules/videojs/css/plugins/controls/zoom.min.css +1 -1
- data/assets/theme/j1/modules/videojs/js/plugins/controls/zoom/zoom.js +1 -1
- data/assets/theme/j1/modules/videojs/js/plugins/controls/zoom/zoom.min.js +1 -1
- data/lib/j1/version.rb +1 -1
- data/lib/j1_app/j1_auth_manager/auth_manager.rb +2 -2
- data/lib/j1_app/j1_auth_manager/error_pages.rb +1 -1
- data/lib/j1_app/j1_auth_manager/helpers_disqus.rb +1 -1
- data/lib/j1_app/j1_auth_manager/helpers_facebook.rb +1 -1
- data/lib/j1_app/j1_auth_manager/helpers_github.rb +1 -1
- data/lib/j1_app/j1_auth_manager/helpers_patreon.rb +1 -1
- data/lib/j1_app/j1_auth_manager/helpers_twitter.rb +1 -1
- data/lib/j1_app/j1_auth_manager/warden_omniauth.rb +1 -1
- data/lib/j1_app/omniauth/strategies/disqus.rb +1 -1
- data/lib/j1_app/omniauth/strategies/facebook.rb +1 -1
- data/lib/j1_app/omniauth/strategies/github.rb +1 -1
- data/lib/j1_app/omniauth/strategies/patreon.rb +1 -1
- data/lib/j1_app/omniauth/strategies/twitter.rb +1 -1
- data/lib/starter_web/README.md +5 -5
- data/lib/starter_web/_config.yml +8 -8
- data/lib/starter_web/_data/_defaults/categories.yml +1 -1
- data/lib/starter_web/_data/_defaults/colors.yml +1 -1
- data/lib/starter_web/_data/_defaults/font_sizes.yml +1 -1
- data/lib/starter_web/_data/_defaults/j1_config.yml +2 -2
- data/lib/starter_web/_data/_defaults/resources.yml +1 -1
- data/lib/starter_web/_data/apps/defaults/justifiedGalleryCustomizer.yml +1 -1
- data/lib/starter_web/_data/apps/justifiedGalleryCustomizer.yml +1 -1
- data/lib/starter_web/_data/asciidoc2pdf/themes/j1-theme.yml +1 -1
- data/lib/starter_web/_data/blocks/banner.yml +3 -3
- data/lib/starter_web/_data/blocks/defaults/banner.yml +4 -4
- data/lib/starter_web/_data/blocks/defaults/footer.yml +1 -1
- data/lib/starter_web/_data/blocks/defaults/panel.yml +1 -1
- data/lib/starter_web/_data/blocks/footer.yml +1 -1
- data/lib/starter_web/_data/categories.yml +1 -1
- data/lib/starter_web/_data/colors.yml +1 -1
- data/lib/starter_web/_data/font_sizes.yml +1 -1
- data/lib/starter_web/_data/j1_config.yml +1 -1
- data/lib/starter_web/_data/layouts/collection.yml +1 -1
- data/lib/starter_web/_data/layouts/default.yml +1 -1
- data/lib/starter_web/_data/layouts/home.yml +1 -1
- data/lib/starter_web/_data/layouts/news_panel_posts.yml +1 -1
- data/lib/starter_web/_data/layouts/page.yml +1 -1
- data/lib/starter_web/_data/layouts/post.yml +1 -1
- data/lib/starter_web/_data/layouts/raw.yml +1 -1
- data/lib/starter_web/_data/modules/advertising.yml +7 -2
- data/lib/starter_web/_data/modules/{amplitude_players.yml → amplitude_app.yml} +207 -24
- data/lib/starter_web/_data/modules/amplitude_playlists.yml +1140 -37
- data/lib/starter_web/_data/modules/analytics.yml +7 -2
- data/lib/starter_web/_data/modules/attics.yml +8 -2
- data/lib/starter_web/_data/modules/blog_navigator.yml +8 -2
- data/lib/starter_web/_data/modules/carousel.yml +12 -8
- data/lib/starter_web/_data/modules/chatbots.yml +7 -2
- data/lib/starter_web/_data/modules/comments.yml +9 -7
- data/lib/starter_web/_data/modules/cookieconsent.yml +6 -5
- data/lib/starter_web/_data/modules/cookies.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/advertising.yml +7 -3
- data/lib/starter_web/_data/modules/defaults/amplitude.yml +77 -31
- data/lib/starter_web/_data/modules/defaults/analytics.yml +6 -3
- data/lib/starter_web/_data/modules/defaults/attics.yml +7 -6
- data/lib/starter_web/_data/modules/defaults/authentication.yml +8 -3
- data/lib/starter_web/_data/modules/defaults/blog_navigator.yml +9 -3
- data/lib/starter_web/_data/modules/defaults/carousel.yml +7 -3
- data/lib/starter_web/_data/modules/defaults/chatbots.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/comments.yml +6 -2
- data/lib/starter_web/_data/modules/defaults/cookieconsent.de.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/cookieconsent.en.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/cookieconsent.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/cookies.yml +7 -3
- data/lib/starter_web/_data/modules/defaults/docsearch.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/dropdowns.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/fab.yml +7 -5
- data/lib/starter_web/_data/modules/defaults/gallery.yml +2 -2
- data/lib/starter_web/_data/modules/defaults/gemini.yml +3 -3
- data/lib/starter_web/_data/modules/defaults/icon_picker.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/iframer.yml +7 -3
- data/lib/starter_web/_data/modules/defaults/lazyLoader.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/lightbox.yml +8 -23
- data/lib/starter_web/_data/modules/defaults/log4javascript.yml +8 -3
- data/lib/starter_web/_data/modules/defaults/log4r.yml +2 -2
- data/lib/starter_web/_data/modules/defaults/lunr.yml +3 -3
- data/lib/starter_web/_data/modules/defaults/masonry.yml +7 -3
- data/lib/starter_web/_data/modules/defaults/masterslider.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/navigator.yml +9 -4
- data/lib/starter_web/_data/modules/defaults/particles.yml +5 -4
- data/lib/starter_web/_data/modules/defaults/rangeSlider.yml +8 -3
- data/lib/starter_web/_data/modules/defaults/rtable.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/scroller.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/slick.yml +8 -5
- data/lib/starter_web/_data/modules/defaults/slim_select.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/speak2me.yml +7 -4
- data/lib/starter_web/_data/modules/defaults/swiper_app.yml +153 -0
- data/lib/starter_web/_data/modules/defaults/theme_toggler.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/themes.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/toccer.yml +8 -5
- data/lib/starter_web/_data/modules/defaults/translator.en.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/translator.yml +7 -2
- data/lib/starter_web/_data/modules/defaults/videojs.yml +8 -2
- data/lib/starter_web/_data/modules/defaults/waves.yml +5 -4
- data/lib/starter_web/_data/modules/docsearch.yml +7 -2
- data/lib/starter_web/_data/modules/dropdowns.yml +7 -2
- data/lib/starter_web/_data/modules/fab.yml +7 -2
- data/lib/starter_web/_data/modules/gallery.yml +14 -8
- data/lib/starter_web/_data/modules/gallery_app.yml +1002 -0
- data/lib/starter_web/_data/modules/gallery_playlists.yml +534 -0
- data/lib/starter_web/_data/modules/gemini.yml +4 -5
- data/lib/starter_web/_data/modules/icon_picker.yml +7 -2
- data/lib/starter_web/_data/modules/iframer.yml +8 -3
- data/lib/starter_web/_data/modules/lazyLoader.yml +7 -2
- data/lib/starter_web/_data/modules/lightbox.yml +8 -3
- data/lib/starter_web/_data/modules/log4r.yml +2 -2
- data/lib/starter_web/_data/modules/lunr.yml +4 -5
- data/lib/starter_web/_data/modules/masonry.yml +45 -23
- data/lib/starter_web/_data/modules/masterslider.yml +65 -59
- data/lib/starter_web/_data/modules/particles.yml +7 -2
- data/lib/starter_web/_data/modules/rangeSlider.yml +8 -3
- data/lib/starter_web/_data/modules/rtable.yml +7 -2
- data/lib/starter_web/_data/modules/scroller.yml +8 -3
- data/lib/starter_web/_data/modules/slick.yml +33 -16
- data/lib/starter_web/_data/modules/slim_select.yml +13 -10
- data/lib/starter_web/_data/modules/speak2me.yml +7 -2
- data/lib/starter_web/_data/modules/swiper_app.yml +1047 -0
- data/lib/starter_web/_data/modules/swiper_playlists.yml +278 -203
- data/lib/starter_web/_data/modules/theme_toggler.yml +7 -2
- data/lib/starter_web/_data/modules/themes.yml +7 -2
- data/lib/starter_web/_data/modules/toccer.yml +7 -2
- data/lib/starter_web/_data/modules/translator.yml +7 -2
- data/lib/starter_web/_data/modules/videojs.yml +7 -1
- data/lib/starter_web/_data/modules/waves.yml +8 -3
- data/lib/starter_web/_data/plugins/defaults/feed.yml +1 -1
- data/lib/starter_web/_data/plugins/defaults/paginator.yml +1 -1
- data/lib/starter_web/_data/plugins/defaults/seo-tags.yml +1 -1
- data/lib/starter_web/_data/plugins/defaults/sitemap.yml +1 -1
- data/lib/starter_web/_data/plugins/feed.yml +1 -1
- data/lib/starter_web/_data/plugins/paginator.yml +1 -1
- data/lib/starter_web/_data/plugins/seo-tags.yml +1 -1
- data/lib/starter_web/_data/plugins/sitemap.yml +1 -1
- data/lib/starter_web/_data/resources.yml +50 -42
- data/lib/starter_web/_data/templates/feed.xml +2 -2
- data/lib/starter_web/_data/templates/robots.txt +1 -1
- data/lib/starter_web/_data/templates/seo-tags.html +1 -1
- data/lib/starter_web/_data/templates/sitemap.xml +1 -1
- data/lib/starter_web/_data/utilities/defaults/util_srv.yml +1 -1
- data/lib/starter_web/_data/utilities/util_srv.yml +1 -1
- data/lib/starter_web/_includes/attributes.asciidoc +44 -44
- data/lib/starter_web/_includes/custom/templates/collection_panel.html +1 -1
- data/lib/starter_web/_includes/tables/jekyll_variables.asciidoc +1 -1
- data/lib/starter_web/_plugins/asciidoctor/amplitude-block.rb +2 -2
- data/lib/starter_web/_plugins/asciidoctor/lightbox-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/swiper-block.rb +2 -3
- data/lib/starter_web/_plugins/asciidoctor/wistia-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/youtube-block.rb +2 -2
- data/lib/starter_web/_plugins/filter/filters.rb +1 -11
- data/lib/starter_web/_plugins/index/lunr.rb +1 -1
- data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/anthem.jpg +0 -0
- data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/from-dusk-to-dawn.jpg +0 -0
- data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/safe-in-the-steep-cliffs.jpg +0 -0
- data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/soon-it-will-be-cold-enough.jpg +0 -0
- data/lib/starter_web/assets/image/block/image/!readme +0 -0
- data/lib/starter_web/assets/image/custom/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/attic/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/attic/1920x1280/alexey-ruban.jpg +0 -0
- data/lib/starter_web/assets/image/module/attic/1920x1280/markus-spiske.jpg +0 -0
- data/lib/starter_web/assets/image/module/attic/1920x1280/tiny_desk.jpg +0 -0
- data/lib/starter_web/assets/image/module/attic/alice-donovan-rouse-2.jpg +0 -0
- data/lib/starter_web/assets/image/module/carousel/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/gallery/free_animal/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-1.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-2.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-3.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-4.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-5.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-6.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/295683517.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/andreas-brucker_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/banter-snaps_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/chicago-us.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/denys-nevozhai-1_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/denys-nevozhai-1_c.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/denys-nevozhai-2-bw.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/denys-nevozhai-2_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/denys-nevozhai-3_b.jpg +0 -0
- data/lib/starter_web/assets/image/{modules/gallery/mega_cities → module/gallery/mega_citiy/image}/emmad-mazhari_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/emmad-mazhari_c.jpg +0 -0
- data/lib/starter_web/assets/image/{modules/gallery/mega_cities → module/gallery/mega_citiy/image}/ethan-brooke_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/federico-rizzarelli_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/federico-rizzarelli_c.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/gints-gailis_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/jakarta_indonesia.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/jakarta_indonesia_2.jpg +0 -0
- data/lib/starter_web/assets/image/{modules/gallery/mega_cities → module/gallery/mega_citiy/image}/johan-mouchet_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/luca-bravo_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/melbourne_australia.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/queen_bees_at_eureka_tower.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/shanghai_china.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/steven-diaz_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/thomas-tucker_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/tokyo_japan.jpg +0 -0
- data/lib/starter_web/assets/image/module/gallery/old_time/image/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/lightbox/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/audio/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/audio/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/avatar/avatar-1.png +0 -0
- data/lib/starter_web/assets/image/module/swiper/avatar/avatar-2.png +0 -0
- data/lib/starter_web/assets/image/module/swiper/avatar/avatar-3.png +0 -0
- data/lib/starter_web/assets/image/module/swiper/avatar/avatar-4.png +0 -0
- data/lib/starter_web/assets/image/module/swiper/avatar/avatar-5.png +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/avatar/avatar-1.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/avatar/avatar-2.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/avatar/avatar-3.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/avatar/avatar-4.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/london.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/moscow.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/san-francisco.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/tokyo.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/1-star.svg +88 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/2-star.svg +88 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/3-star.svg +88 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/4-star.svg +88 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/5-star.svg +88 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/elements/star-gray.svg +55 -0
- data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/elements/star-orange.svg +55 -0
- data/lib/starter_web/assets/image/module/swiper/extended/neighbor/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/neighbor/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-1.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-2.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-3.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-4.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-5.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-6.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/1.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/10.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/11.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/12.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/2.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/3.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/4.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/5.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/6.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/7.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/8.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/9.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/stacked/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/1.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/2.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/3.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/4.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/5.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/6.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/free_animal/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-1.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-2.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-3.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-4.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-5.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-6.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/295683517.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/andreas-brucker_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/banter-snaps_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/chicago-us.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/denys-nevozhai-1_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/denys-nevozhai-1_c.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/denys-nevozhai-2-bw.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/denys-nevozhai-2_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/denys-nevozhai-3_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/emmad-mazhari_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/emmad-mazhari_c.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/ethan-brooke_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/federico-rizzarelli_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/federico-rizzarelli_c.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/gints-gailis_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/jakarta_indonesia.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/jakarta_indonesia_2.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/johan-mouchet_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/luca-bravo_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/melbourne_australia.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/queen_bees_at_eureka_tower.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/shanghai_china.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/steven-diaz_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/thomas-tucker_b.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/tokyo_japan.jpg +0 -0
- data/lib/starter_web/assets/image/module/swiper/simple/mega_city/info/authors.txt +78 -0
- data/lib/starter_web/assets/image/module/swiper/video/!info/!readme +0 -0
- data/lib/starter_web/assets/image/module/swiper/video/!readme +0 -0
- data/lib/starter_web/assets/image/pattern/rating/scalable/1-star.svg +88 -0
- data/lib/starter_web/assets/image/pattern/rating/scalable/2-star.svg +88 -0
- data/lib/starter_web/assets/image/pattern/rating/scalable/3-star.svg +88 -0
- data/lib/starter_web/assets/image/pattern/rating/scalable/4-star.svg +88 -0
- data/lib/starter_web/assets/image/pattern/rating/scalable/5-star.svg +88 -0
- data/lib/starter_web/assets/image/pattern/rating/scalable/elements/star-gray.svg +55 -0
- data/lib/starter_web/assets/image/pattern/rating/scalable/elements/star-orange.svg +55 -0
- data/lib/starter_web/assets/video/poster/dailymotion/meditation.jpg +0 -0
- data/lib/starter_web/assets/video/poster/dailymotion/pilates.jpg +0 -0
- data/lib/starter_web/assets/video/poster/html5/peck_pocketed.jpg +0 -0
- data/lib/starter_web/assets/video/poster/html5/rolling_wild.jpg +0 -0
- data/lib/starter_web/assets/video/poster/tiktoc/einhorn.jpg +0 -0
- data/lib/starter_web/assets/video/poster/tiktoc/gianna_1.jpg +0 -0
- data/lib/starter_web/assets/video/poster/tiktoc/gianna_2.jpg +0 -0
- data/lib/starter_web/assets/video/poster/tiktoc/gianna_3.jpg +0 -0
- data/lib/starter_web/assets/video/poster/tiktoc/waluschka.jpg +0 -0
- data/lib/starter_web/assets/video/poster/vimeo/amazing_nature.jpg +0 -0
- data/lib/starter_web/assets/video/poster/vimeo/kick_it_old_school.jpg +0 -0
- data/lib/starter_web/assets/video/poster/vimeo/stay_colorful.jpg +0 -0
- data/lib/starter_web/assets/video/poster/wistia/thank_you.jpg +0 -0
- data/lib/starter_web/assets/video/poster/wistia/wistia_black.jpg +0 -0
- data/lib/starter_web/assets/video/poster/wistia/wistia_blue.jpg +0 -0
- data/lib/starter_web/assets/video/poster/wistia/wistia_intro.jpg +0 -0
- data/lib/starter_web/assets/video/poster/youtube/faelle_des_bnd/der_unverzichtbare_feind.jpg +0 -0
- data/lib/starter_web/assets/video/poster/youtube/faelle_des_bnd/ein_diener_vieler_herren.jpg +0 -0
- data/lib/starter_web/assets/video/poster/youtube/taylor_swift/cover-1.jpg +0 -0
- data/lib/starter_web/assets/video/poster/youtube/taylor_swift/cover-2.jpg +0 -0
- data/lib/starter_web/assets/video/poster/youtube/the_piano/the-piano.jpg +0 -0
- data/lib/starter_web/assets/video/poster/youtube/voice_kids/banner/best_of.jpg +0 -0
- data/lib/starter_web/assets/video/poster/youtube/voice_kids/banner/generic.jpg +0 -0
- data/lib/starter_web/collections/_biography/a-life-in-questions.adoc +3 -3
- data/lib/starter_web/collections/_biography/becoming.adoc +3 -3
- data/lib/starter_web/collections/_biography/born-to-run.adoc +3 -3
- data/lib/starter_web/collections/_biography/forty-autumns.adoc +3 -3
- data/lib/starter_web/collections/_biography/not-dead-yet.adoc +3 -3
- data/lib/starter_web/collections/_biography/princess-diarist-the.adoc +3 -3
- data/lib/starter_web/collections/_biography/when-breath-becomes-air.adoc +3 -3
- data/lib/starter_web/collections/_fantasy/harry-potter-deathly-hallows.adoc +3 -3
- data/lib/starter_web/collections/_fantasy/harry-potter-philosophers-stone.adoc +3 -3
- data/lib/starter_web/collections/_fantasy/mistborn-trilogy.adoc +3 -3
- data/lib/starter_web/collections/_fantasy/ready-player-one.adoc +3 -3
- data/lib/starter_web/collections/_fantasy/sword-of-destiny.adoc +3 -3
- data/lib/starter_web/collections/_fantasy/terry-pratchet-diary.adoc +3 -3
- data/lib/starter_web/collections/_portfolio/branding.adoc +2 -2
- data/lib/starter_web/collections/_portfolio/graphic_design.adoc +2 -2
- data/lib/starter_web/collections/_portfolio/identity.adoc +2 -2
- data/lib/starter_web/collections/_portfolio/illustration.adoc +2 -2
- data/lib/starter_web/collections/_portfolio/photography.adoc +2 -2
- data/lib/starter_web/collections/_portfolio/web_design.adoc +2 -2
- data/lib/starter_web/collections/_romance/breath-of-snow-and-ashes.adoc +3 -3
- data/lib/starter_web/collections/_romance/it-ends-with-us.adoc +3 -3
- data/lib/starter_web/collections/_romance/outlander-novel.adoc +3 -3
- data/lib/starter_web/collections/_romance/outlander-virgins-short-story.adoc +3 -3
- data/lib/starter_web/collections/_romance/the-dressmaker.adoc +3 -3
- data/lib/starter_web/collections/_romance/the-fiery-cross.adoc +3 -3
- data/lib/starter_web/collections/asciidoc_skeletons/simple-post/_posts/yyyy-mm-dd-your-post-name.asciidoc +3 -3
- data/lib/starter_web/collections/posts/public/featured/_posts/0000-00-00-welcome-to-j1.adoc.erb +2 -2
- data/lib/starter_web/collections/posts/public/featured/_posts/2021-01-01-about-cookies.adoc +2 -2
- data/lib/starter_web/collections/posts/public/featured/_posts/2021-02-01-static-site-generators.adoc +3 -3
- data/lib/starter_web/collections/posts/public/featured/_posts/2022-02-01-about-j1.adoc +2 -2
- data/lib/starter_web/collections/posts/public/featured/_posts/2023-10-18-url-types.adoc +2 -2
- data/lib/starter_web/collections/posts/public/featured/_posts/_includes/attributes.asciidoc +2 -2
- data/lib/starter_web/index.html +2 -2
- data/lib/starter_web/package.json +1 -1
- data/lib/starter_web/pages/public/about/features.adoc +2 -2
- data/lib/starter_web/pages/public/about/reporting_issues.adoc +2 -2
- data/lib/starter_web/pages/public/about/site.adoc +2 -2
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/000_intro.adoc +2 -2
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/100_converter.adoc +2 -2
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/200_themes.adoc +2 -2
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/attributes.asciidoc +1 -1
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/100_converter/112_getting_started.asciidoc +1 -1
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/a2p.bat +1 -1
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/a2p.sh +1 -1
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.a2p +1 -1
- data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.adoc +2 -2
- data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/multi.adoc +2 -2
- data/lib/starter_web/pages/public/asciidoc_skeletons/simple-document/simple.adoc +2 -2
- data/lib/starter_web/pages/public/blog/navigator/archive/allview.html +2 -2
- data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +2 -2
- data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +2 -2
- data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +2 -2
- data/lib/starter_web/pages/public/blog/navigator/index.html +2 -2
- data/lib/starter_web/pages/public/features/general.adoc +3 -3
- data/lib/starter_web/pages/public/features/template.adoc +15 -15
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_biography.adoc +2 -2
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_fantasy.adoc +2 -2
- data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_romance.adoc +2 -2
- data/lib/starter_web/pages/public/learn/bookshelf/jekyll_collections.adoc +2 -2
- data/lib/starter_web/pages/public/learn/bookshelf/viewer_all_books.adoc +2 -2
- data/lib/starter_web/pages/public/learn/where_to_go.adoc +2 -2
- data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +2 -2
- data/lib/starter_web/pages/public/legal/en/200_impress.adoc +2 -2
- data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +2 -2
- data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +2 -2
- data/lib/starter_web/pages/public/panels/intro_panel/_includes/attributes.asciidoc +6 -6
- data/lib/starter_web/pages/public/panels/intro_panel/panel.adoc +6 -6
- data/lib/starter_web/pages/public/plans/plans.adoc +2 -2
- data/lib/starter_web/pages/public/tools/previewer/_includes/attributes.asciidoc +5 -5
- data/lib/starter_web/pages/public/tools/previewer/preview_amplitudejs.adoc +84 -36
- data/lib/starter_web/pages/public/tools/previewer/preview_bootstrap_theme.adoc +5 -5
- data/lib/starter_web/pages/public/tools/previewer/preview_videojs.adoc +2 -2
- data/lib/starter_web/pages/public/tools/tester/{amplitude_yt_tester.adoc → app_tester_amplitudejs_yt.adoc} +75 -27
- data/lib/starter_web/pages/public/tools/tester/app_tester_swiperjs.adoc +1215 -0
- data/lib/starter_web/pages/public/tour/_includes/attributes.asciidoc +5 -8
- data/lib/starter_web/pages/public/tour/_includes/documents/419_advanced_modals_demo.asciidoc +2 -2
- data/lib/starter_web/pages/public/tour/asciidoc_extensions.adoc +4 -4
- data/lib/starter_web/pages/public/tour/bootstrap_themes.adoc +4 -4
- data/lib/starter_web/pages/public/tour/highlghter_rouge.adoc +2 -2
- data/lib/starter_web/pages/public/tour/icon_fonts.adoc +2 -2
- data/lib/starter_web/pages/public/tour/modal_extentions.adoc +2 -2
- data/lib/starter_web/pages/public/tour/play_audio.adoc +62 -72
- data/lib/starter_web/pages/public/tour/play_video.adoc +2 -2
- data/lib/starter_web/pages/public/tour/present_images.adoc +48 -62
- data/lib/starter_web/pages/public/tour/quicksearch.adoc +2 -2
- data/lib/starter_web/pages/public/tour/responsive_tables.adoc +2 -2
- data/lib/starter_web/pages/public/tour/typography.adoc +2 -2
- metadata +713 -731
- data/apps/private/README.txt +0 -1
- data/apps/protected/README.txt +0 -1
- data/apps/public/README.txt +0 -1
- data/apps/public/cc/cc.yml +0 -1649
- data/apps/public/cc/index.adoc +0 -111
- data/assets/data/swiper.html +0 -244
- data/assets/theme/j1/adapter/js/amplitude.30.js +0 -1177
- data/assets/theme/j1/core/css/animate.css.map +0 -1
- data/assets/theme/j1/core/css/animate.min.css.map +0 -1
- data/assets/theme/j1/core/css/icon-fonts/fontawesome.css.map +0 -1
- data/assets/theme/j1/core/css/icon-fonts/fontawesome.min.css.map +0 -1
- data/assets/theme/j1/core/css/icon-fonts/iconify.css.map +0 -1
- data/assets/theme/j1/core/css/icon-fonts/iconify.min.css.map +0 -1
- data/assets/theme/j1/core/css/icon-fonts/mdi.css.map +0 -1
- data/assets/theme/j1/core/css/icon-fonts/mdi.min.css.map +0 -1
- data/assets/theme/j1/core/css/icon-fonts/mdib.css.map +0 -1
- data/assets/theme/j1/core/css/icon-fonts/mdib.min.css.map +0 -1
- data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.css.map +0 -1
- data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.min.css.map +0 -1
- data/assets/theme/j1/core/css/themes/unodark/bootstrap.css.map +0 -1
- data/assets/theme/j1/core/css/themes/unodark/bootstrap.min.css.map +0 -1
- data/assets/theme/j1/core/css/themes/unolight/bootstrap.css.map +0 -1
- data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css.map +0 -1
- data/assets/theme/j1/core/css/vendor.css.map +0 -1
- data/assets/theme/j1/core/css/vendor.min.css.map +0 -1
- data/assets/theme/j1/core/js/template.min.js.map +0 -1
- data/assets/theme/j1/modules/amplitudejs/js/amplitude.map +0 -20
- data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.min.js +0 -14
- data/assets/theme/j1/modules/bootstrap/js/bootstrap.js.map +0 -1
- data/assets/theme/j1/modules/bootstrap/js/bootstrap.min.js.map +0 -1
- data/assets/theme/j1/modules/gemini/js/gemini.js.map +0 -1
- data/assets/theme/j1/modules/photoswipe/_info/.version_5.4.4 +0 -6
- data/assets/theme/j1/modules/photoswipe/_info/example/photoswipe-caption-plugin.html +0 -237
- data/assets/theme/j1/modules/photoswipe/_info/example/test-gallery.html +0 -36
- data/assets/theme/j1/modules/photoswipe/js/_info/README.md +0 -43
- data/assets/theme/j1/modules/photoswipe/js/photoswipe-lightbox.1.js +0 -1990
- data/assets/theme/j1/modules/swiper/_info/.version_1.2.0 +0 -15
- data/assets/theme/j1/modules/swiper/_info/swiperjs.com-demos.url +0 -2
- data/assets/theme/j1/modules/swiper/css/modules/effectThumbs.css +0 -44
- data/assets/theme/j1/modules/swiper/css/theme/uno.min.css +0 -144
- data/assets/theme/j1/modules/swiper/js/modules/!readme +0 -3
- data/assets/theme/j1/modules/swiper/js/swiper-bundle.js +0 -9791
- data/assets/theme/j1/modules/swiper/js/swiper-bundle.min.js +0 -23
- data/lib/starter_web/_data/modules/defaults/swiper.yml +0 -175
- data/lib/starter_web/_data/modules/swiper.yml +0 -655
- data/lib/starter_web/assets/image/custom/header/family.svg +0 -2209
- data/lib/starter_web/assets/image/icons/bokeh/bokeh-32x32.ico +0 -0
- data/lib/starter_web/assets/image/icons/bokeh/bokeh.ico +0 -0
- data/lib/starter_web/assets/image/icons/bokeh/logo-160x160.png +0 -0
- data/lib/starter_web/assets/image/icons/jupyter/jupyter-32x32.ico +0 -0
- data/lib/starter_web/assets/image/icons/jupyter/jupyter.ico +0 -0
- data/lib/starter_web/assets/image/icons/jupyter/logo.png +0 -0
- data/lib/starter_web/assets/image/modules/attics/1920x1280/alexey-ruban.jpg +0 -0
- data/lib/starter_web/assets/image/modules/attics/1920x1280/kristopher-roller.webp +0 -0
- data/lib/starter_web/assets/image/modules/attics/1920x1280/markus-spiske.jpg +0 -0
- data/lib/starter_web/assets/image/modules/attics/1920x1280/tiny_desk.jpg +0 -0
- data/lib/starter_web/assets/image/modules/attics/alice-donovan-rouse-2.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-1.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-2.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-3.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-4.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-5.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-6.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/295683517.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/andreas-brucker_b.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/banter-snaps_b.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/chicago-us.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/denys-nevozhai-1_b.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/denys-nevozhai-1_c.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/denys-nevozhai-2-bw.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/denys-nevozhai-2_b.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/denys-nevozhai-3_b.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/emmad-mazhari_c.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/federico-rizzarelli_b.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/federico-rizzarelli_c.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/gints-gailis_b.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/jakarta_indonesia.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/jakarta_indonesia_2.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/luca-bravo_b.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/melbourne_australia.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/melbourne_australia.webp +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/queen_bees_at_eureka_tower.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/shanghai_china.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/steven-diaz_b.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/thomas-tucker_b.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/mega_cities/tokyo_japan.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/neighbor_slider/guardians-of-the-galaxy.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/neighbor_slider/justice-league.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/neighbor_slider/spider-man.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/neighbor_slider/suicide-squad.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/neighbor_slider/thor-ragnarok.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/1.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/10.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/11.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/12.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/2.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/3.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/4.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/5.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/6.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/7.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/8.jpg +0 -0
- data/lib/starter_web/assets/image/modules/gallery/panorama/9.jpg +0 -0
- data/lib/starter_web/assets/image/modules/icons/algolia/search-by-algolia.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/asciidoc/logo-512x512.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/bootstrap/bootstrap-solid-32x32.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/bootstrap/bs-docs-masthead-pattern.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/bootstrap/scalable/bootstrap-outline.svg +0 -20
- data/lib/starter_web/assets/image/modules/icons/bootstrap/scalable/bootstrap-punchout.svg +0 -18
- data/lib/starter_web/assets/image/modules/icons/bootstrap/scalable/bootstrap-solid.svg +0 -17
- data/lib/starter_web/assets/image/modules/icons/components/angular.ui.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/angularjs.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/aws.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/bootstrap.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/c9.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/chai.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/emmet.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/express.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/git.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/github.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/gulp.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/heroku.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/htmlcss-1.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/htmlcss-2.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/jasmine.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/javascript.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/jquery.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/kanban.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/leanux.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/linkedin.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/mean.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/mongodb.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/node.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/postgresql.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/protractor.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/rails.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/ruby.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/sass.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/scrum.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/components/twitter.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/j1/favicon.ico +0 -0
- data/lib/starter_web/assets/image/modules/icons/j1/j1-256x256.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/j1/j1-32x32.ico +0 -0
- data/lib/starter_web/assets/image/modules/icons/j1/j1-512x512.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/j1/j1-64x64.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/j1/j1.ico +0 -0
- data/lib/starter_web/assets/image/modules/icons/j1/scalable/j1.svg +0 -2023
- data/lib/starter_web/assets/image/modules/icons/netlify/nf-logo.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/amazon.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/behance.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/blogger.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/dribbble.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/dropbox.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/facebook.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/forrst.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/github.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/googleplus.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/instagram.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/linkedin.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/pintrest.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/rss.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x-28 - social.svg +0 -86
- data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x-28.svg +0 -64
- data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x.svg +0 -1
- data/lib/starter_web/assets/image/modules/icons/social/skype.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/spotify.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/twitter.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/twitter_x.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/vimeo.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/vk.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/wordpress.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/xing.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/yahoo.png +0 -0
- data/lib/starter_web/assets/image/modules/icons/social/youtube.png +0 -0
- data/lib/starter_web/assets/video/poster/wistia/sources/banner.psd +0 -0
- data/lib/starter_web/assets/video/poster/wistia/sources/logo-text.png +0 -0
- data/lib/starter_web/assets/video/poster/wistia/sources/wistia-black.psd +0 -0
- data/lib/starter_web/assets/video/poster/wistia/sources/wistia_text_logo_black.jpg +0 -0
- data/lib/starter_web/assets/video/poster/youtube/taylor_swift/28-07-_2024_22-21-00.jpg +0 -0
- data/lib/starter_web/pages/public/features/template.asciidoc +0 -758
- data/lib/starter_web/pages/public/tools/tester/swiper_tester.adoc +0 -796
- /data/assets/{error_pages → page}/HTTP204.html +0 -0
- /data/assets/{error_pages → page}/HTTP400.html +0 -0
- /data/assets/{error_pages → page}/HTTP401.html +0 -0
- /data/assets/{error_pages → page}/HTTP403.html +0 -0
- /data/assets/{error_pages → page}/HTTP404.html +0 -0
- /data/assets/{error_pages → page}/HTTP444.html +0 -0
- /data/assets/{error_pages → page}/HTTP445.html +0 -0
- /data/assets/{error_pages → page}/HTTP446.html +0 -0
- /data/assets/{error_pages → page}/HTTP447.html +0 -0
- /data/assets/{error_pages → page}/HTTP448.html +0 -0
- /data/assets/{error_pages → page}/HTTP500.html +0 -0
- /data/assets/{error_pages → page}/HTTP501.html +0 -0
- /data/assets/{error_pages → page}/HTTP502.html +0 -0
- /data/assets/{error_pages → page}/HTTP503.html +0 -0
- /data/assets/theme/j1/modules/{js-cookies/js/js.cookie.js → cookiejs/js/.cookiejs.js} +0 -0
- /data/assets/theme/j1/modules/{js-cookies/js/js.cookie.min.js → cookiejs/js/jcookiejs.min.js} +0 -0
- /data/assets/theme/j1/modules/{swiper → swiperjs}/LICENSE +0 -0
- /data/assets/theme/j1/modules/{swiper → swiperjs}/README.md +0 -0
- /data/assets/theme/j1/modules/{swiper → swiperjs}/css/swiper-bundle.min..css +0 -0
- /data/lib/starter_web/assets/audio/album/royalty_free/{disco → !info/disco}/!sound.links.txt +0 -0
- /data/lib/starter_web/assets/audio/album/royalty_free/{pop → !info/pop}/!sound.links.txt +0 -0
- /data/lib/starter_web/assets/image/{backgrounds → background}/triangles-bg.png +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/configBinder.jpg +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/docsBinder.jpg +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/notebookBinder.jpg +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/png/configBinder.png +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/png/docsBinder.png +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/png/notebookBinder.png +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/scaleable/binder.svg +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/scaleable/configBinder.svg +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/scaleable/docsBinder.svg +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/scaleable/myBinder.svg +0 -0
- /data/lib/starter_web/assets/image/{badges → badge}/scaleable/notebookBinder.svg +0 -0
- /data/lib/starter_web/assets/image/{blocks → block}/waves/scalable/1920x100/wave-1.svg +0 -0
- /data/lib/starter_web/assets/image/{blocks → block}/waves/scalable/1920x100/wave-2.svg +0 -0
- /data/lib/starter_web/assets/image/{blocks → block}/waves/scalable/1920x100/wave-3.svg +0 -0
- /data/lib/starter_web/assets/image/{blocks → block}/waves/scalable/1920x100/wave-4.svg +0 -0
- /data/lib/starter_web/assets/image/{blocks → block}/waves/scalable/1920x100/wave-5.svg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/biography/a_life_in_questions.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/biography/becoming.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/biography/born_to_run.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/biography/forty_autumns.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/biography/not_dead_yet.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/biography/the_princess_diarist.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/biography/when_breath_becomes_air.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/harry-potter-deathly-hallows.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/harry-potter-philosophers-stone.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/mistborn-trilogy.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/ready-player-one.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/sword-of-destiny.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/terry-pratchet-diary.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/romance/breath-of-snow-and-ashes.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/romance/it-ends-with-us.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/romance/outlander-novel.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/romance/outlander-short-story.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/romance/the-fiery-cross.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/books/romance/the_dressmaker.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/people/diana-petersen.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/people/larry-parker.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/people/parveen-anand.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/portfolio/1.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/portfolio/2.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/portfolio/3.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/portfolio/4.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/portfolio/5.jpg +0 -0
- /data/lib/starter_web/assets/image/{collections → collection}/portfolio/6.jpg +0 -0
- /data/lib/starter_web/assets/image/custom/header/{avatar.svg → scalable/avatar.svg} +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/asciidoc/logo-512x512.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/bootstrap/bootstrap-solid-32x32.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/bootstrap/bs-docs-masthead-pattern.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/bootstrap/scalable/bootstrap-outline.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/bootstrap/scalable/bootstrap-punchout.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/bootstrap/scalable/bootstrap-solid.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/angular.ui.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/angularjs.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/aws.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/bootstrap.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/c9.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/chai.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/emmet.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/express.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/git.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/github.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/gulp.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/heroku.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/htmlcss-1.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/htmlcss-2.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/jasmine.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/javascript.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/jquery.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/kanban.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/leanux.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/linkedin.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/mean.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/mongodb.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/node.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/postgresql.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/protractor.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/rails.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/ruby.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/sass.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/scrum.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/components/twitter.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/controls/close-icon.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/controls/up.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/github/avatar-icon.png +0 -0
- /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/hyvore-talk.ico +0 -0
- /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/jpg/hyvor-logo.512x512.jpg +0 -0
- /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/png/hyvor-logo.24x24.jpg +0 -0
- /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/png/hyvor-logo.24x24.png +0 -0
- /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/png/hyvor-logo.512x512.png +0 -0
- /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/scalable/hyvor-logo.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/favicon.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/j1-256x256.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/j1-32x32.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/j1-512x512.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/j1-64x64.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/j1.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/jpg/j1-256x256.jpg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/jpg/j1-512x512.jpg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/jpg/j1-64x64.jpg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/png/j1-256x256.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/png/j1-512x512.jpg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/png/j1-512x512.jpg.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/png/j1-512x512.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/png/j1-64x64.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/j1/scalable/j1.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/jekyll/logo-2x.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/jekyll/octojekyll.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/lanus/favicon.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/lanus/lanus-512x512.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/lanus/lanus.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/lanus/lanus.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/lanus/scalable/lanus.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/lanus/scalable/lanus_sw.svg +0 -0
- /data/lib/starter_web/assets/image/{icons/mdi → icon/mdi/scalable}/mdi.svg +0 -0
- /data/lib/starter_web/assets/image/{icons/mdi → icon/mdi/scalable}/mdil.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/centos/centos-icon.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/centos/centos.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/suse/suse.gif +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/suse/suse.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/suse/suse.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/ubuntu/cof_black_hex.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/ubuntu/cof_orange_hex.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/ubuntu/cof_white-black_hex.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/ubuntu/cof_white-orange_hex.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/ubuntu/ubuntu.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/windows/windows.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/windows/windows_flags_color.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/windows/windows_hdd.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/os/windows/windows_store.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/amazon.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/behance.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/blogger.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/deviantart.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/dribbble.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/dropbox.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/evernote.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/facebook.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/forrst.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/github.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/googleplus.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/instagram.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/jolicloud.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/last-fm.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/linkedin.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/picasa.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/pintrest.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/rss.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon/social}/scalable/facebook.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon/social}/scalable/google.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon/social}/scalable/ibm.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon/social}/scalable/microsoft.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/skype.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/spotify.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/stumbleupon.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/tumblr.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/twitter.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/vimeo.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/vk.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/wordpress.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/xing.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/yahoo.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/social/youtube.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/Index of -tv-logos-.url +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/TV from Germany - LyngSat Logo.url +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/Zeichnung.svg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon-16x16.ico +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon-24x24.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon-512x512.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon.jpg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon.jpg (353/303/227353).url" +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-logo-png_seeklogo-428343.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/cytec-tvlogos- collection of mostly german tv channel logos.url +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/output_image.jpg +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/pang.ping +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/tv/tv-logos-countries-germany-0_all_logos_mosaic.md at main /302/267 tv-logo-tv-logos.url" +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/videojs/videojs-logo.png +0 -0
- /data/lib/starter_web/assets/image/{icons → icon}/videojs/videojs-poster.png +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/alexander-redl.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/alina-grubnyak.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/andrea-badino.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/brad-neathery.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/brigitta-schneiter.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/bruno-figueiredo.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/build-with-gemini.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/clem-onojeghuo.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/crawford-jolly.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/eleni-afiontzi.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/fly-d.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/guillaume-bolduc.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/harpal-singh.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/hayden-mills-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/isaac-davis.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/j1-content-mockup-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/j1-content-mockup-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/j1-content-mockup-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/j1-starter-mockup-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/john-schnobrich-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/josep-martins.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/josh-liu.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/kelly-sikkemal.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/kira-auf-der-heide.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/kristopher-roller.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/matthaeus.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/melanie-deziel.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/milad-fakurian.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/mohammad-rahmani.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/nasa.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/quino-al-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/recha-oktaviani.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/admin-dashboard-bootstrap-1280x600.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/building-blocks-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/christina-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/cookies-1920x1200.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/franck-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/giammarco-boscaro-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/ideas-start-here-1920x1280-bw.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/ideas-start-here-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/jessica-ruscello-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/joanna-kosinska-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/katie-moum-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/leon-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/lianhao-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/library-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/lunr-1280x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/machine-generator-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/markus-krisetya-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/markus-spiske-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/markus-spiske4-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/matthaeus-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/matthew-dockery-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/no-time-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/placeholder/1x1.png +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/placeholder/transparent-1920x1280.png +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/rirri-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/shubham-dhage-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/shutterstock_sponsor-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/sigmund-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/szabo-viktor-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/themes-1920x1280-bw.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/tldr-1920x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/vladislav-klapin-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/attics → module/attic}/yellow-cactus-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-4.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-5.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-6.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-7.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-8.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/mega_cities/andreas-brucker_b.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/mega_cities/denys-nevozhai-1_b.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/mega_cities/denys-nevozhai-2_b.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/mega_cities/luca-bravo_b.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/carousel/mega_cities/thomas-tucker_b.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/gallery/mega_cities/info/authors.txt → module/gallery/mega_citiy/!info/author.txt} +0 -0
- /data/lib/starter_web/assets/image/{modules/gallery/old_times/image_01.jpg → module/gallery/old_time/image/grand_pa/image-1.jpg} +0 -0
- /data/lib/starter_web/assets/image/{modules/gallery/old_times/image_02.jpg → module/gallery/old_time/image/grand_pa/image-2.jpg} +0 -0
- /data/lib/starter_web/assets/image/{modules/gallery/old_times/image_03.jpg → module/gallery/old_time/image/grand_pa/image-3.jpg} +0 -0
- /data/lib/starter_web/assets/image/{modules/gallery/old_times/image_04.jpg → module/gallery/old_time/image/grand_pa/image-4.jpg} +0 -0
- /data/lib/starter_web/assets/image/{modules/lightbox → module/lightbox/image}/close.png +0 -0
- /data/lib/starter_web/assets/image/{modules/lightbox → module/lightbox/image}/loading.gif +0 -0
- /data/lib/starter_web/assets/image/{modules/lightbox → module/lightbox/image}/next.png +0 -0
- /data/lib/starter_web/assets/image/{modules/lightbox → module/lightbox/image}/prev.png +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-4.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-5.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-6.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-7.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-8.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_10/panorama-bg-slide1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_10/panorama-bg-slide2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_2/andreas-brucker.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_2/denys-nevozhai-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_2/denys-nevozhai-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_2/luca-bravo.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_2/thomas-tucker.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_3/ms-free-food-family-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_3/ms-free-food-hamburger.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_3/ms-free-food-restaurant.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-1-100x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-2-100x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-3-100x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-4-100x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-4.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-5-100x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-5.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-6-100x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-6.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-7-100x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-7.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family-140x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family-2-140x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family-3-140x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-hamburger-140x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-hamburger.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-pizza-140x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-pizza.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-table-140x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-table.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-woman-hand-140x80.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-woman-hand.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_6_7/6876385555_74a0d7d7ee_b.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_6_7/6876387431_d86867a3d9_b.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_6_7/6876388511_d618d53455_b.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_6_7/6876389463_db27a377e1_b.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_6_7/6876390339_2e4dd9dbbb_b.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_8/postslider-5-img-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_8/postslider-5-img-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_8/postslider-5-img-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_8/postslider6-bg-slide2-1024x622.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/1-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/5-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/6-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/6-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/8-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/8.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/charity-white-tile-bg.png +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/fashion2-controller-arrow-next.png +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/fashion2-controller-arrow-prv.png +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/fashion2-img-slide1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/fashion2-img-slide2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/fashion2-img-slide3.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/wp-examples/ms-free-business-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/wp-examples/ms-free-business-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules → module}/masterslider/wp-examples/ms-free-business-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/asciidoc_skeletons/example-pdf-screenshot.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/core_web_vitals/200-create-a-link-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/core_web_vitals/core_web_vitals_best.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/core_web_vitals/core_web_vitals_best_full.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/bg.png +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/black_denim.png +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/explanation.png +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/html_markup.png +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/1.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/10.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/11.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/12.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/13.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/14.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/15.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/16.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/17.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/18.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/19.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/2.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/20.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/3.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/4.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/5.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/6.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/7.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/8.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/large/9.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/loading.gif +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/loading_dark.gif +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/nav-icon.png +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/nav.png +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/1.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/10.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/11.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/12.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/13.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/14.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/15.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/16.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/17.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/18.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/19.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/1a.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/2.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/20.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/3.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/4.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/5.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/6.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/7.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/8.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/egrid/small/9.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/blog-post-navigator-1280x1000.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/bootswatch-themes-1280x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/clipboard-1280x600.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/comments-1280x600.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/cookie-consent-1280x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/desktop-web-navigation-1280x1000.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/example-content-1280x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/example-content-present-videos-1280x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/fab-1280x500.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/full-text-search-1280x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/global-mobile-traffic-1920x1080.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/google-lighthouse-1080x300.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/intro-panel-1280x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/master-header-1280x600.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/mobile-navigation-600x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/native-speakers-by-language.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/nav-module-1280x300.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/nbi-barchart-1280x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/teaser-banner-1280x600.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/features/translator-1280x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/html_validator/appdevtools-html-validator.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/html_validator/freeformatter-html-validator.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/html_validator/w3c-nu-checker.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/html_validator/w3c-validator.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/modals/01_frame_modal.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/modals/02_site_modal.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/modals/03_central_modal.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/modals/04_fluid_modal.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/panels/florian-olivo-1920x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/panels/modules-apps-1920x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/panels/no-time-1920x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/panels/responsive-text-1920x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/panels/the-place-1920x800.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/adrien-olichon-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/alejandro-barba-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/andre-francois-mckenzie-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/andreas-steger-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/ansgar-scheffold-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/ben-white-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/craig-sybert-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/danielle-cerullo-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/deb-dowd-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/halgatewood-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/hans-eiskonen-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/ian-barsby-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/ivan-aleksic-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/markus-krisetya-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/markus-spiske-6-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/markus-winkler-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/markus-winkler-2-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/michelle-cassar-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/mika-baumeister-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/posts/science-in-hd-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/previewer/bs-color-palette.png +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/previewer/material-design-color-palette.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/previewer/material-design-color-palette.png +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/previewer/tunnel_bear_set_gatewy.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/previewer/tunnel_bear_subscribe.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/previewer/tunnel_bear_verify_email_address.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/skeleton/annie-spratt-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/skeleton/antonino-visalli-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/skeleton/humble-lamb-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/skeleton/library-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/skeleton/romain-vignes-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/skeleton/sigmund-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-image-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-image-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-image-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-thumb-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-thumb-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-thumb-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/410_bs_modals_extentions/avatar.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/410_bs_modals_extentions/marc.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/600_quicksearch/quicksearch_icon.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/600_quicksearch/quicksearch_input.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/600_quicksearch/quicksearch_results.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/bootstrap-1920x1000-bw.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/cards-1920x1280-bw.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/emojies-1920x1280-bw.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/icon-fonts-1920x1280-bw.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/images-1920x1280-bw.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/puzzle-1920x1280-bw.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/tables-1920x1280-bw.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/themes-1920x1280.jpg +0 -0
- /data/lib/starter_web/assets/image/{pages → page}/tour/typography-1920x1280-bw.jpg +0 -0
- /data/lib/starter_web/assets/image/{modules/patterns → pattern/image}/1x1.png +0 -0
- /data/lib/starter_web/assets/image/{modules/patterns → pattern/image}/gridtile.png +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/featured/dynamic-web-access.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/featured/jamstack-generators.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/featured/jekyll.1200x400.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/featured/jekyll.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/featured/static-web-access.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-10.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-11.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-12.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-13.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-3.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-4.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-5.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-6.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-7.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-8.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-9.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/post-img.jpg +0 -0
- /data/lib/starter_web/assets/image/{posts → post}/post-single.jpg +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/colored-1.jpg +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/colored-2.jpg +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/default.jpg +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/light-blue.jpg +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/people.jpg +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/promo/home/screenshot.jpg +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/promo/jekyll/jekyll-faq.jpg +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/promo/jekyll/jekyll-generator.jpg +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/promo/jekyll/jekyll-generator.png +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/promo/jekyll/jekyll-og.png +0 -0
- /data/lib/starter_web/assets/image/{quotes → quote}/promo/jekyll/scalable/jekyll-faq.psd +0 -0
@@ -6,8 +6,8 @@ regenerate: true
|
|
6
6
|
|
7
7
|
{% comment %}
|
8
8
|
# -----------------------------------------------------------------------------
|
9
|
-
# ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.js
|
10
|
-
# AmplitudeJS V5
|
9
|
+
# ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.31.js
|
10
|
+
# AmplitudeJS V5 Tech for J1 Template
|
11
11
|
#
|
12
12
|
# Product/Info:
|
13
13
|
# https://jekyll.one
|
@@ -43,7 +43,7 @@ regenerate: true
|
|
43
43
|
{% comment %} Set config data (settings only)
|
44
44
|
-------------------------------------------------------------------------------- {% endcomment %}
|
45
45
|
{% assign amplitude_defaults = modules.defaults.amplitude.defaults %}
|
46
|
-
{% assign amplitude_players = modules.
|
46
|
+
{% assign amplitude_players = modules.amplitude_app.settings %}
|
47
47
|
{% assign amplitude_playlists = modules.amplitude_playlists.settings %}
|
48
48
|
|
49
49
|
{% comment %} Set config options (settings only)
|
@@ -60,7 +60,7 @@ regenerate: true
|
|
60
60
|
|
61
61
|
/*
|
62
62
|
# -----------------------------------------------------------------------------
|
63
|
-
# ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.js
|
63
|
+
# ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.31.js
|
64
64
|
# AmplitudeJS V5 Plugin|Tech for J1 Template
|
65
65
|
#
|
66
66
|
# Product/Info:
|
@@ -74,95 +74,394 @@ regenerate: true
|
|
74
74
|
*/
|
75
75
|
"use strict";
|
76
76
|
|
77
|
-
// date|time monitoring
|
78
|
-
|
79
|
-
var startTime;
|
80
|
-
var endTime;
|
81
|
-
var startTimeModule;
|
82
|
-
var endTimeModule;
|
83
|
-
var timeSeconds;
|
84
|
-
|
85
|
-
// YT API settings
|
86
|
-
//
|
87
|
-
var YT_PLAYER_STATE = {
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
};
|
95
|
-
|
96
|
-
var
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
// var ytPlayers = {};
|
105
|
-
// var ytPlayersMap = new Map();
|
106
|
-
|
107
|
-
// AmplitudeJS API settings
|
108
|
-
// -----------------------------------------------------------------------------
|
109
|
-
|
110
|
-
var dependency;
|
111
|
-
var playerCounter = 0;
|
112
|
-
var load_dependencies = {};
|
113
|
-
|
114
|
-
// set default song index to FIRST item
|
115
|
-
var songIndex = 0;
|
116
|
-
var ytpSongIndex = 0;
|
117
|
-
|
118
|
-
var ytpAutoPlay = false;
|
119
|
-
var ytpLoop = true;
|
120
|
-
var playLists = {};
|
121
|
-
var playersUILoaded = { state: false };
|
122
|
-
var apiInitialized = { state: false };
|
123
|
-
|
124
|
-
var amplitudeDefaults = $.extend({}, {{amplitude_defaults | replace: 'nil', 'null' | replace: '=>', ':' }});
|
125
|
-
var amplitudePlayers = $.extend({}, {{amplitude_players | replace: 'nil', 'null' | replace: '=>', ':' }});
|
126
|
-
var amplitudePlaylists = $.extend({}, {{amplitude_playlists | replace: 'nil', 'null' | replace: '=>', ':' }});
|
127
|
-
var amplitudeOptions = $.extend(true, {}, amplitudeDefaults, amplitudePlayers, amplitudePlaylists);
|
128
|
-
|
129
|
-
var playerExistsInPage = false;
|
130
|
-
var ytpContainer = null;
|
131
|
-
var playerProperties = {};
|
132
|
-
var playList;
|
133
|
-
var playerProperties;
|
134
|
-
var playerID;
|
135
|
-
var playerType;
|
136
|
-
var playListTitle;
|
137
|
-
var playListName;
|
138
|
-
var amplitudePlayerState;
|
139
|
-
var ytPlayer;
|
140
|
-
var ytpPlaybackRate
|
141
|
-
|
142
|
-
var songs;
|
143
|
-
var songMetaData;
|
144
|
-
var songURL;
|
145
|
-
|
146
|
-
var progress;
|
147
|
-
|
148
|
-
// ---------------------------------------------------------------------------
|
149
|
-
// Base YT functions and events
|
150
|
-
// ---------------------------------------------------------------------------
|
151
|
-
|
152
|
-
// Recursive function to MERGE objects
|
153
|
-
var mergeObject = function() {
|
154
|
-
mergeObject = Object.assign || function mergeObject(t) {
|
155
|
-
for (var s, i=1, n=arguments.length; i<n; i++) {
|
156
|
-
s = arguments[i];
|
157
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
158
|
-
}
|
159
|
-
return t;
|
160
|
-
};
|
161
|
-
return mergeObject.apply(this, arguments);
|
77
|
+
// date|time monitoring
|
78
|
+
//----------------------------------------------------------------------------
|
79
|
+
var startTime;
|
80
|
+
var endTime;
|
81
|
+
var startTimeModule;
|
82
|
+
var endTimeModule;
|
83
|
+
var timeSeconds;
|
84
|
+
|
85
|
+
// YT API settings
|
86
|
+
// ---------------------------------------------------------------------------
|
87
|
+
var YT_PLAYER_STATE = {
|
88
|
+
UNSTARTED: -1,
|
89
|
+
ENDED: 0,
|
90
|
+
PLAYING: 1,
|
91
|
+
PAUSED: 2,
|
92
|
+
BUFFERING: 3,
|
93
|
+
CUED: 5
|
94
|
+
};
|
95
|
+
|
96
|
+
var YT_PLAYER_STATE_NAMES = {
|
97
|
+
0: "ended",
|
98
|
+
1: "playing",
|
99
|
+
2: "paused",
|
100
|
+
3: "buffering",
|
101
|
+
4: "not_used",
|
102
|
+
5: "cued",
|
103
|
+
6: "unstarted",
|
162
104
|
};
|
163
105
|
|
106
|
+
// date|time monitoring
|
107
|
+
//----------------------------------------------------------------------------
|
108
|
+
var startTime;
|
109
|
+
var endTime;
|
110
|
+
var startTimeModule;
|
111
|
+
var endTimeModule;
|
112
|
+
var timeSeconds;
|
113
|
+
|
114
|
+
// AmplitudeJS API settings
|
115
|
+
// ---------------------------------------------------------------------------
|
116
|
+
var firstScriptTag;
|
117
|
+
var ytPlayer;
|
118
|
+
var ytPlayerReady = false;
|
119
|
+
var ytApiReady = false;
|
120
|
+
var logger = log4javascript.getLogger('j1.adapter.amplitude.tech');
|
121
|
+
|
122
|
+
var dependency;
|
123
|
+
var playerCounter = 0;
|
124
|
+
var load_dependencies = {};
|
125
|
+
|
126
|
+
// set default song index to FIRST track (video) in playlist
|
127
|
+
var songIndex = 0;
|
128
|
+
var ytpSongIndex = 0;
|
129
|
+
|
130
|
+
var ytpAutoPlay = false;
|
131
|
+
var ytpLoop = true;
|
132
|
+
var playLists = {};
|
133
|
+
var playersUILoaded = { state: false };
|
134
|
+
var apiInitialized = { state: false };
|
135
|
+
|
136
|
+
var amplitudeDefaults = $.extend({}, {{amplitude_defaults | replace: 'nil', 'null' | replace: '=>', ':' }});
|
137
|
+
var amplitudePlayers = $.extend({}, {{amplitude_players | replace: 'nil', 'null' | replace: '=>', ':' }});
|
138
|
+
var amplitudePlaylists = $.extend({}, {{amplitude_playlists | replace: 'nil', 'null' | replace: '=>', ':' }});
|
139
|
+
var amplitudeOptions = $.extend(true, {}, amplitudeDefaults, amplitudePlayers, amplitudePlaylists);
|
140
|
+
|
141
|
+
var playerExistsInPage = false;
|
142
|
+
var ytpContainer = null;
|
143
|
+
var ytpBufferQuote = 0;
|
144
|
+
var playerProperties = {};
|
145
|
+
var activeVideoElement = {};
|
146
|
+
var ytPlayerCurrentTime = 0;
|
147
|
+
var singleAudio = false;
|
148
|
+
|
149
|
+
var playerScrollerSongElementMin = {{amplitude_defaults.player.player_scroller_song_element_min}};
|
150
|
+
var playerScrollControl = {{amplitude_defaults.player.player_scroll_control}};
|
151
|
+
var playerAutoScrollSongElement = {{amplitude_defaults.player.player_auto_scroll_song_element}};
|
152
|
+
var playerFadeAudio = {{amplitude_defaults.player.player_fade_audio}};
|
153
|
+
var playerPlaybackRate = '{{amplitude_defaults.player.player_playback_rate}}';
|
154
|
+
|
155
|
+
var muteAfterVideoSwitchInterval = {{amplitude_defaults.player.mute_after_video_switch_interval}};
|
156
|
+
var checkActiveVideoInterval = {{amplitude_defaults.player.check_active_video_interval}};
|
157
|
+
|
158
|
+
var playList;
|
159
|
+
var playerProperties;
|
160
|
+
var playerID;
|
161
|
+
var playerType;
|
162
|
+
var playListTitle;
|
163
|
+
var playListName;
|
164
|
+
var amplitudePlayerState;
|
165
|
+
|
166
|
+
var ytPlayer;
|
167
|
+
|
168
|
+
|
169
|
+
var songs;
|
170
|
+
var songMetaData;
|
171
|
+
var songURL;
|
172
|
+
|
173
|
+
var progress;
|
174
|
+
|
175
|
+
// ---------------------------------------------------------------------------
|
176
|
+
// Base YT functions
|
177
|
+
// ===========================================================================
|
178
|
+
|
179
|
+
// ---------------------------------------------------------------------------
|
180
|
+
// mergeObject
|
181
|
+
// ---------------------------------------------------------------------------
|
182
|
+
// function mergeObject() {
|
183
|
+
// mergeObject = Object.assign || function mergeObject(t) {
|
184
|
+
// for (var s, i=1, n=arguments.length; i<n; i++) {
|
185
|
+
// s = arguments[i];
|
186
|
+
// for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
187
|
+
// }
|
188
|
+
// return t;
|
189
|
+
// };
|
190
|
+
|
191
|
+
// return mergeObject.apply(this, arguments);
|
192
|
+
// } // END mergeObject
|
193
|
+
|
194
|
+
// ---------------------------------------------------------------------------
|
195
|
+
// processOnVideoStart(trackID, player, startSec)
|
196
|
+
//
|
197
|
+
// ---------------------------------------------------------------------------
|
198
|
+
function processOnVideoStart(player, startSec) {
|
199
|
+
var currentVolume, playlist, playerID,
|
200
|
+
videoID, songIndex, trackID;
|
201
|
+
|
202
|
+
playlist = activeVideoElement.playlist;
|
203
|
+
playerID = playlist + '_large';
|
204
|
+
videoID = player.options.videoId;
|
205
|
+
songIndex = activeVideoElement.index;
|
206
|
+
trackID = songIndex + 1;
|
207
|
+
|
208
|
+
// seek video to START position
|
209
|
+
ytpSeekTo(player, startSec, true);
|
210
|
+
|
211
|
+
// fade-in audio (if enabled)
|
212
|
+
if (playerFadeAudio) {
|
213
|
+
currentVolume = player.getVolume();
|
214
|
+
logger.debug('\n' + `FADE-IN audio on StateChange at trackID|VideoID: ${trackID}|${videoID}`);
|
215
|
+
ytpFadeInAudio({
|
216
|
+
playerID: playerID,
|
217
|
+
targetVolume: currentVolume,
|
218
|
+
speed: 'default'
|
219
|
+
});
|
220
|
+
} // END if playerFadeAudio
|
221
|
+
|
222
|
+
} // END processOnVideoStart
|
223
|
+
|
224
|
+
// ---------------------------------------------------------------------------
|
225
|
+
// processOnVideoEnd(player)
|
226
|
+
//
|
227
|
+
// TODO:
|
228
|
+
// ---------------------------------------------------------------------------
|
229
|
+
function processOnVideoEnd(player) {
|
230
|
+
var currentVideoTime,
|
231
|
+
playlist, playerID, songIndex, songs,
|
232
|
+
trackID, activeVideoID, previousVideoID, isVideoChanged;
|
233
|
+
|
234
|
+
playlist = activeVideoElement.playlist;
|
235
|
+
playerID = playlist + '_large';
|
236
|
+
currentVideoTime = player.getCurrentTime();
|
237
|
+
previousVideoID = player.options.videoId;
|
238
|
+
activeVideoID = activeVideoElement.videoID;
|
239
|
+
songIndex = activeVideoElement.index;
|
240
|
+
trackID = songIndex + 1;
|
241
|
+
songs = activeVideoElement.songs;
|
242
|
+
|
243
|
+
// check if video is changed (to detect multiple videoIDs in playlist)
|
244
|
+
if (songIndex > 0) {
|
245
|
+
isVideoChanged = (previousVideoID !== activeVideoID) ? true : false;
|
246
|
+
} else {
|
247
|
+
isVideoChanged = true;
|
248
|
+
}
|
249
|
+
|
250
|
+
// fade-out audio (if enabled)
|
251
|
+
if (isVideoChanged && playerFadeAudio) {
|
252
|
+
logger.debug('\n' + `FADE-OUT audio on processOnVideoEnd at trackID|VideoID: ${trackID}|${activeVideoID}`);
|
253
|
+
ytpFadeOutAudio({
|
254
|
+
playerID: playerID,
|
255
|
+
speed: 'default'
|
256
|
+
});
|
257
|
+
} // END if playerFadeAudio
|
258
|
+
|
259
|
+
// if (!activeVideoElement.audio_single) {
|
260
|
+
if (isVideoChanged) {
|
261
|
+
// load next video
|
262
|
+
logger.debug('\n' + `LOAD next VIDEO on processOnVideoEnd at trackID|playlist: ${trackID}|${playlist}`);
|
263
|
+
loadNextVideo(playlist, songIndex);
|
264
|
+
} else {
|
265
|
+
// skip loading next video if a single video is used for playlist
|
266
|
+
logger.debug('\n' + `LOAD next TRACK in video on processOnVideoEnd at trackID|playlist: ${trackID}|${playlist}`);
|
267
|
+
}
|
268
|
+
|
269
|
+
} // END processOnVideoEnd
|
270
|
+
|
271
|
+
// ---------------------------------------------------------------------------
|
272
|
+
// doNothingOnStateChange(state)
|
273
|
+
//
|
274
|
+
// ---------------------------------------------------------------------------
|
275
|
+
function doNothingOnStateChange(state) {
|
276
|
+
if (state > 0) {
|
277
|
+
logger.warn('\n' + `DO NOTHING on StateChange for state: ${YT_PLAYER_STATE_NAMES[state]}`);
|
278
|
+
} else {
|
279
|
+
logger.warn('\n' + `DO NOTHING on StateChange for state: ${YT_PLAYER_STATE_NAMES[6]}`);
|
280
|
+
}
|
281
|
+
} // ENS doNothingOnStateChange
|
282
|
+
|
283
|
+
// ---------------------------------------------------------------------------
|
284
|
+
// processOnStateChangePlaying()
|
285
|
+
//
|
286
|
+
// ---------------------------------------------------------------------------
|
287
|
+
function processOnStateChangePlaying(event, playlist, songIndex) {
|
288
|
+
var activeSong, playlist, playerID, videoID,
|
289
|
+
ytPlayer, songs, songIndex,
|
290
|
+
currentPlayer, previousPlayer, trackID;
|
291
|
+
|
292
|
+
ytPlayer = event.target;
|
293
|
+
|
294
|
+
// update active song settings (manually)
|
295
|
+
checkActiveVideoElementYTP();
|
296
|
+
|
297
|
+
// get active song settings (manually)
|
298
|
+
activeSong = getActiveSong();
|
299
|
+
|
300
|
+
playlist = activeSong.playlist;
|
301
|
+
playerID = activeSong.playerID;
|
302
|
+
videoID = activeSong.videoID;
|
303
|
+
songs = activeSong.songs;
|
304
|
+
songIndex = activeSong.index;
|
305
|
+
currentPlayer = activeSong.player;
|
306
|
+
previousPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player
|
307
|
+
|
308
|
+
// save YT player GLOBAL data for later use (e.g. events)
|
309
|
+
j1.adapter.amplitude.data.activePlayer = 'ytp';
|
310
|
+
j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
|
311
|
+
j1.adapter.amplitude.data.ytpGlobals['videoID'] = videoID;
|
312
|
+
|
313
|
+
// save YT player data for later use (e.g. events)
|
314
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
|
315
|
+
|
316
|
+
// update time container for the ACTIVE video
|
317
|
+
// -----------------------------------------------------------------
|
318
|
+
setInterval(function() {
|
319
|
+
updateCurrentTimeContainerYTP(ytPlayer, playlist);
|
320
|
+
}, 500);
|
321
|
+
|
322
|
+
// update time progressbar for the ACTIVE video
|
323
|
+
// -----------------------------------------------------------------
|
324
|
+
setInterval(function() {
|
325
|
+
updateProgressBarsYTP();
|
326
|
+
}, 500);
|
327
|
+
|
328
|
+
trackID = songIndex + 1;
|
329
|
+
logger.debug('\n' + `PLAY video on StateChange at trackID|VideoID: ${trackID}|${videoID}`);
|
330
|
+
|
331
|
+
// check|process video for configured START position (if set)
|
332
|
+
// -------------------------------------------------------------------------
|
333
|
+
var songStartSec = activeSong.startSec;
|
334
|
+
if (songStartSec) {
|
335
|
+
var tsStartSec = seconds2timestamp(songStartSec);
|
336
|
+
var songCurrentTime = ytPlayer.getCurrentTime();
|
337
|
+
|
338
|
+
if (songCurrentTime < songStartSec) {
|
339
|
+
logger.debug('\n' + `START video on StateChange at trackID|timestamp: ${trackID}|${tsStartSec}`);
|
340
|
+
processOnVideoStart(ytPlayer, songStartSec);
|
341
|
+
}
|
342
|
+
} // END if songStartEnabled
|
343
|
+
|
344
|
+
// check|process video for configured END position (if set)
|
345
|
+
// -------------------------------------------------------------------------
|
346
|
+
var songEndSec = activeSong.endSec;
|
347
|
+
if (songEndSec) {
|
348
|
+
var tsEndSec = seconds2timestamp(songEndSec);
|
349
|
+
|
350
|
+
var checkOnVideoEnd = setInterval(function() {
|
351
|
+
var songCurrentTime = ytPlayer.getCurrentTime();
|
352
|
+
|
353
|
+
if (songCurrentTime >= songEndSec) {
|
354
|
+
logger.debug('\n' + `STOP video on StateChange at trackID|timestamp: ${trackID}|${tsEndSec}`);
|
355
|
+
processOnVideoEnd(ytPlayer);
|
356
|
+
|
357
|
+
clearInterval(checkOnVideoEnd);
|
358
|
+
} // END if currentVideoTime
|
359
|
+
}, 500); // END checkOnVideoEnd
|
360
|
+
} // END if songEndEnabled
|
361
|
+
|
362
|
+
// stop active AT players running in parallel
|
363
|
+
// -------------------------------------------------------------------------
|
364
|
+
var atpPlayerState = Amplitude.getPlayerState();
|
365
|
+
if (atpPlayerState === 'playing') {
|
366
|
+
Amplitude.stop();
|
367
|
+
|
368
|
+
// clear button MINI PlayerPlayPause (AT player)
|
369
|
+
var buttonPlayerPlayPause = document.getElementsByClassName("mini-player-play-pause");
|
370
|
+
for (var i=0; i<buttonPlayerPlayPause.length; i++) {
|
371
|
+
var htmlElement = buttonPlayerPlayPause[i];
|
372
|
+
|
373
|
+
if (htmlElement.dataset.amplitudeSource === 'audio') {
|
374
|
+
htmlElement.classList.remove('amplitude-playing');
|
375
|
+
htmlElement.classList.add('amplitude-paused');
|
376
|
+
}
|
377
|
+
|
378
|
+
} // END for MINI buttonPlayerPlayPause
|
379
|
+
|
380
|
+
// clear button COMPACT PlayerPlayPause (AT player)
|
381
|
+
var buttonPlayerPlayPause = document.getElementsByClassName("compact-player-play-pause");
|
382
|
+
for (var i=0; i<buttonPlayerPlayPause.length; i++) {
|
383
|
+
var htmlElement = buttonPlayerPlayPause[i];
|
384
|
+
|
385
|
+
if (htmlElement.dataset.amplitudeSource === 'audio') {
|
386
|
+
htmlElement.classList.remove('amplitude-playing');
|
387
|
+
htmlElement.classList.add('amplitude-paused');
|
388
|
+
}
|
389
|
+
|
390
|
+
} // END for COMACT buttonPlayerPlayPause
|
391
|
+
|
392
|
+
// clear button LARGE PlayerPlayPause (AT player)
|
393
|
+
var buttonPlayerPlayPause = document.getElementsByClassName("large-player-play-pause");
|
394
|
+
for (var i=0; i<buttonPlayerPlayPause.length; i++) {
|
395
|
+
var htmlElement = buttonPlayerPlayPause[i];
|
396
|
+
|
397
|
+
if (htmlElement.dataset.amplitudeSource === 'audio') {
|
398
|
+
htmlElement.classList.remove('amplitude-playing');
|
399
|
+
htmlElement.classList.add('amplitude-paused');
|
400
|
+
}
|
401
|
+
|
402
|
+
} // END for LARGE buttonPlayerPlayPause
|
403
|
+
|
404
|
+
} // END if atpPlayerState 'playing'
|
405
|
+
|
406
|
+
// TODO: check if YT player stop is needed
|
407
|
+
// stop active YT players running in parallel except the current
|
408
|
+
// if (previousPlayer.options.videoId !== videoID) {
|
409
|
+
// logger.debug('\n' + `STOP all video on StateChange running in parallel at trackID|playerID: ${trackID}|${playerID}`);
|
410
|
+
// var playerState = (previousPlayer.getPlayerState() > 0) ? previousPlayer.getPlayerState() : 6;
|
411
|
+
// var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
|
412
|
+
|
413
|
+
// if (ytPlayerState === 'playing' || ytPlayerState === 'paused') {
|
414
|
+
// previousPlayer.stopVideo();
|
415
|
+
// }
|
416
|
+
// }
|
417
|
+
|
418
|
+
// stopAllActivePlayers(playerID);
|
419
|
+
|
420
|
+
} // END processOnStateChangePlaying
|
421
|
+
|
422
|
+
|
423
|
+
// ---------------------------------------------------------------------------
|
424
|
+
// processOnStateChangeEnded()
|
425
|
+
//
|
426
|
+
// ---------------------------------------------------------------------------
|
427
|
+
function processOnStateChangeEnded(event, playlist, songIndex) {
|
428
|
+
var videoID = event.target.options.videoId;
|
429
|
+
var trackID = songIndex + 1;
|
430
|
+
|
431
|
+
// save player current time data for later use
|
432
|
+
ytPlayerCurrentTime = ytPlayer.getCurrentTime();
|
433
|
+
|
434
|
+
logger.debug('\n' + `NEXT video on StateChange at trackID|VideoID: ${trackID}|${videoID}`);
|
435
|
+
|
436
|
+
// load NEXT song (video) in playlist
|
437
|
+
loadNextVideo(playlist, songIndex);
|
438
|
+
|
439
|
+
} // END processOnStateChangeEnded
|
440
|
+
|
441
|
+
// ---------------------------------------------------------------------------
|
442
|
+
// getSongIndex(songArray, videoID)
|
443
|
+
//
|
444
|
+
// TODO: Extend getSongIndex() for singleAudio
|
445
|
+
// ---------------------------------------------------------------------------
|
446
|
+
function getSongIndex(songArray, videoID) {
|
447
|
+
var index;
|
448
|
+
|
449
|
+
for (var i=0; i<songArray.length; i++) {
|
450
|
+
if (songArray[i].url.includes(videoID)) {
|
451
|
+
index = songArray[i].index;
|
452
|
+
break;
|
453
|
+
}
|
454
|
+
}
|
455
|
+
|
456
|
+
return index;
|
457
|
+
}
|
458
|
+
|
459
|
+
// ---------------------------------------------------------------------------
|
460
|
+
// addNestedProperty
|
461
|
+
//
|
164
462
|
// Add property path dynamically to an existing object
|
165
463
|
// Example: addNestedProperty(j1.adapter.amplitude.data, 'playlist.profile.name', 'Max Mustermann')
|
464
|
+
// ---------------------------------------------------------------------------
|
166
465
|
function addNestedProperty(obj, path, value) {
|
167
466
|
let current = obj;
|
168
467
|
const properties = path.split('.');
|
@@ -179,6 +478,9 @@ var progress;
|
|
179
478
|
});
|
180
479
|
}
|
181
480
|
|
481
|
+
// ---------------------------------------------------------------------------
|
482
|
+
// setNestedProperty
|
483
|
+
// ---------------------------------------------------------------------------
|
182
484
|
function setNestedProperty(obj, path, value) {
|
183
485
|
const keys = path.split('.');
|
184
486
|
|
@@ -198,8 +500,12 @@ var progress;
|
|
198
500
|
setNestedProperty(current, keys.slice(1).join('.'), value);
|
199
501
|
}
|
200
502
|
|
503
|
+
// ---------------------------------------------------------------------------
|
504
|
+
// addNestedObject
|
505
|
+
//
|
201
506
|
// Add (nested) object dynamically to an existing object
|
202
|
-
// Example: createNestedObject(myObject, ['level1', 'arrayProperty', 0], 'element1');
|
507
|
+
// Example: createNestedObject(myObject, ['level1', 'arrayProperty', 0], 'element1');
|
508
|
+
// ---------------------------------------------------------------------------
|
203
509
|
function addNestedObject(obj, path, value) {
|
204
510
|
const lastKey = path[path.length - 1];
|
205
511
|
let current = obj;
|
@@ -212,7 +518,157 @@ var progress;
|
|
212
518
|
current[lastKey] = value;
|
213
519
|
}
|
214
520
|
|
521
|
+
// ---------------------------------------------------------------------------
|
522
|
+
// timestamp2seconds
|
523
|
+
// ---------------------------------------------------------------------------
|
524
|
+
function timestamp2seconds(timestamp) {
|
525
|
+
// split timestamp
|
526
|
+
const parts = timestamp.split(':');
|
527
|
+
|
528
|
+
// check timestamp format
|
529
|
+
if (parts.length !== 3) {
|
530
|
+
// return "invalid timestamp";
|
531
|
+
return false;
|
532
|
+
}
|
533
|
+
|
534
|
+
// convert parts to integers
|
535
|
+
const hours = parseInt(parts[0], 10);
|
536
|
+
const minutes = parseInt(parts[1], 10);
|
537
|
+
const seconds = parseInt(parts[2], 10);
|
538
|
+
|
539
|
+
// check valid timestamp values
|
540
|
+
if (isNaN(hours) || isNaN(minutes) || isNaN(seconds) ||
|
541
|
+
hours < 0 || hours > 23 ||
|
542
|
+
minutes < 0 || minutes > 59 ||
|
543
|
+
seconds < 0 || seconds > 59) {
|
544
|
+
return "invalid timestamp";
|
545
|
+
}
|
546
|
+
|
547
|
+
const totalSeconds = (hours * 3600) + (minutes * 60) + seconds;
|
548
|
+
return totalSeconds;
|
549
|
+
} // END timestamp2seconds
|
550
|
+
|
551
|
+
// ---------------------------------------------------------------------------
|
552
|
+
// seconds2timestamp
|
553
|
+
// ---------------------------------------------------------------------------
|
554
|
+
function seconds2timestamp(seconds) {
|
555
|
+
const hours = Math.floor(seconds / 3600);
|
556
|
+
const minutes = Math.floor((seconds % 3600) / 60);
|
557
|
+
const remainSeconds = seconds % 60;
|
558
|
+
const tsHours = hours.toString().padStart(2, '0');
|
559
|
+
const tsMinutes = minutes.toString().padStart(2, '0');
|
560
|
+
const tsSeconds = remainSeconds.toString().padStart(2, '0');
|
561
|
+
|
562
|
+
return `${tsHours}:${tsMinutes}:${tsSeconds}`;
|
563
|
+
} // END seconds2timestamp
|
564
|
+
|
565
|
+
// ---------------------------------------------------------------------------
|
566
|
+
// ytpFadeInAudio
|
567
|
+
// ---------------------------------------------------------------------------
|
568
|
+
function ytpFadeInAudio(params) {
|
569
|
+
const cycle = 1;
|
570
|
+
var settings, currentStep, steps, sliderID, volumeSlider;
|
571
|
+
|
572
|
+
// current fade-in settings using DEFAULTS (if available)
|
573
|
+
settings = {
|
574
|
+
playerID: params.playerID,
|
575
|
+
targetVolume: params.targetVolume = 50,
|
576
|
+
speed: params.speed = 'default'
|
577
|
+
};
|
578
|
+
|
579
|
+
// number of iteration steps to INCREASE the players volume on fade-in
|
580
|
+
// NOTE: number of steps controls how long and smooth the fade-in
|
581
|
+
// transition will be
|
582
|
+
const iterationSteps = {
|
583
|
+
'default': 150,
|
584
|
+
'slow': 250,
|
585
|
+
'slower': 350,
|
586
|
+
'slowest': 500
|
587
|
+
};
|
588
|
+
|
589
|
+
sliderID = 'volume_slider_' + settings.playerID;
|
590
|
+
volumeSlider = document.getElementById(sliderID);
|
591
|
+
steps = iterationSteps[settings.speed];
|
592
|
+
currentStep = 1;
|
593
|
+
|
594
|
+
if (volumeSlider === undefined || volumeSlider === null) {
|
595
|
+
logger.warn('\n' + 'no volume slider found at playerID: ' + settings.playerID);
|
596
|
+
return;
|
597
|
+
}
|
598
|
+
|
599
|
+
// (ytPlayer.isMuted()) && ytPlayer.unMute();
|
600
|
+
|
601
|
+
// skip fade-in when volume is already at target value
|
602
|
+
// if (ytPlayer.getVolume() >= targetVolume) {
|
603
|
+
// logger.warn('\n' + 'skipped fade-in for current video on volume: ', targetVolume);
|
604
|
+
// return;
|
605
|
+
// }
|
606
|
+
|
607
|
+
// Start the players volume muted
|
608
|
+
ytPlayer.setVolume(0);
|
609
|
+
|
610
|
+
const fadeInInterval = setInterval(() => {
|
611
|
+
const newVolume = settings.targetVolume * (currentStep / steps);
|
612
|
+
|
613
|
+
ytPlayer.setVolume(newVolume);
|
614
|
+
volumeSlider.value = newVolume;
|
615
|
+
currentStep++;
|
616
|
+
|
617
|
+
(currentStep > steps) && clearInterval(fadeInInterval);
|
618
|
+
}, cycle);
|
619
|
+
|
620
|
+
} // END ytpFadeInAudio
|
621
|
+
|
622
|
+
// ---------------------------------------------------------------------------
|
623
|
+
// ytpFadeOutAudio
|
624
|
+
// ---------------------------------------------------------------------------
|
625
|
+
function ytpFadeOutAudio(params) {
|
626
|
+
const cycle = 1;
|
627
|
+
var settings, currentStep, steps, newVolume, startVolume,
|
628
|
+
playerID, sliderID, volumeSlider;
|
629
|
+
|
630
|
+
// current fade-in settings using DEFAULTS (if available)
|
631
|
+
settings = {
|
632
|
+
playerID: params.playerID,
|
633
|
+
speed: params.speed = 'default'
|
634
|
+
};
|
635
|
+
|
636
|
+
// number of iteration steps to DECREASE the volume
|
637
|
+
const iterationSteps = {
|
638
|
+
'default': 150,
|
639
|
+
'slow': 250,
|
640
|
+
'slower': 350,
|
641
|
+
'slowest': 500
|
642
|
+
};
|
643
|
+
|
644
|
+
sliderID = 'volume_slider_' + settings.playerID;
|
645
|
+
volumeSlider = document.getElementById(sliderID);
|
646
|
+
startVolume = ytPlayer.getVolume();
|
647
|
+
steps = iterationSteps[settings.speed];
|
648
|
+
currentStep = 0;
|
649
|
+
|
650
|
+
if (volumeSlider === undefined || volumeSlider === null) {
|
651
|
+
logger.warn('\n' + 'no volume slider found at playerID: ' + settings.playerID);
|
652
|
+
return;
|
653
|
+
}
|
654
|
+
|
655
|
+
const fadeOutInterval = setInterval(() => {
|
656
|
+
newVolume = startVolume * (1 - currentStep / steps);
|
657
|
+
|
658
|
+
ytPlayer.setVolume(newVolume);
|
659
|
+
volumeSlider.value = newVolume;
|
660
|
+
currentStep++;
|
661
|
+
|
662
|
+
(currentStep > steps) && clearInterval(fadeOutInterval);
|
663
|
+
}, cycle);
|
664
|
+
|
665
|
+
} // END ytpFadeOutAudio
|
666
|
+
|
667
|
+
// ---------------------------------------------------------------------------
|
668
|
+
// initYtAPI
|
669
|
+
//
|
215
670
|
// load YT Iframe player API
|
671
|
+
// ---------------------------------------------------------------------------
|
216
672
|
function initYtAPI() {
|
217
673
|
startTimeModule = Date.now();
|
218
674
|
|
@@ -227,10 +683,139 @@ var progress;
|
|
227
683
|
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
|
228
684
|
}
|
229
685
|
|
230
|
-
//
|
686
|
+
// ---------------------------------------------------------------------------
|
687
|
+
// loadNextVideo(list, index)
|
688
|
+
//
|
689
|
+
// load next video in playlist
|
690
|
+
// ---------------------------------------------------------------------------
|
691
|
+
function loadNextVideo(currentPlaylist, currentIndex) {
|
692
|
+
var activeSongSettings, trackID, songName, playlist, playerID, playerIFrame,
|
693
|
+
songs, songIndex, songMetaData, songURL, ytpVideoID;
|
694
|
+
|
695
|
+
// update active song settings (manually)
|
696
|
+
checkActiveVideoElementYTP();
|
697
|
+
|
698
|
+
// get active song settings (manually)
|
699
|
+
activeSongSettings = getActiveSong();
|
700
|
+
|
701
|
+
playlist = currentPlaylist;
|
702
|
+
playerID = playlist + '_large';
|
703
|
+
songs = activeSongSettings.songs;
|
704
|
+
ytPlayer = activeSongSettings.player;
|
705
|
+
songIndex = currentIndex;
|
706
|
+
trackID = songIndex + 1;
|
707
|
+
|
708
|
+
songIndex++;
|
709
|
+
|
710
|
+
ytpSongIndex = songIndex;
|
711
|
+
|
712
|
+
|
713
|
+
// play sonng (video) in playlist
|
714
|
+
if (songIndex <= songs.length - 1) {
|
715
|
+
songMetaData = songs[songIndex];
|
716
|
+
songURL = songMetaData.url;
|
717
|
+
ytVideoID = songURL.split('=')[1];
|
718
|
+
|
719
|
+
// save YT player data for later use (e.g. events)
|
720
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
|
721
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytVideoID;
|
722
|
+
|
723
|
+
|
724
|
+
logger.debug('\n' + `SWITCH video on loadNextVideo at trackID|VideoID: ${trackID}|${ytVideoID}`);
|
725
|
+
ytPlayer.loadVideoById(ytVideoID);
|
726
|
+
|
727
|
+
// delay after switch video
|
728
|
+
if (muteAfterVideoSwitchInterval) {
|
729
|
+
ytPlayer.mute();
|
730
|
+
setTimeout(() => {
|
731
|
+
ytPlayer.unMute();
|
732
|
+
}, muteAfterVideoSwitchInterval);
|
733
|
+
}
|
734
|
+
|
735
|
+
// update global song index
|
736
|
+
ytpSongIndex = songIndex;
|
737
|
+
|
738
|
+
// load the song cover image
|
739
|
+
loadCoverImage(songMetaData);
|
740
|
+
|
741
|
+
// update meta data
|
742
|
+
updatMetaContainers(songMetaData);
|
743
|
+
|
744
|
+
// set song (video) active at index in playlist
|
745
|
+
setSongActive(playlist, songIndex);
|
746
|
+
|
747
|
+
// reset progress bar settings
|
748
|
+
resetProgressBarYTP();
|
749
|
+
|
750
|
+
// scroll song active at index in player
|
751
|
+
if (playerAutoScrollSongElement) {
|
752
|
+
scrollToActiveElement(playlist);
|
753
|
+
}
|
754
|
+
} else {
|
755
|
+
// continue on FIRST track (video) in playlist
|
756
|
+
//
|
757
|
+
songIndex = 0;
|
758
|
+
var songMetaData = songs[songIndex];
|
759
|
+
var songURL = songMetaData.url;
|
760
|
+
var ytVideoID = songURL.split('=')[1];
|
761
|
+
|
762
|
+
// update global song index
|
763
|
+
ytpSongIndex = songIndex;
|
764
|
+
|
765
|
+
// load next video (paused)
|
766
|
+
// -----------------------------------------------------------------------
|
767
|
+
|
768
|
+
// save YT player data for later use (e.g. events)
|
769
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
|
770
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
|
771
|
+
|
772
|
+
logger.debug('\n' + `SWITCH video on loadNextVideo at trackID|VideoID: ${trackID}|${ytVideoID}`);
|
773
|
+
ytPlayer.loadVideoById(ytVideoID);
|
774
|
+
|
775
|
+
// delay after switch video
|
776
|
+
if (muteAfterVideoSwitchInterval) {
|
777
|
+
ytPlayer.mute();
|
778
|
+
setTimeout(() => {
|
779
|
+
ytPlayer.unMute();
|
780
|
+
}, muteAfterVideoSwitchInterval);
|
781
|
+
}
|
782
|
+
|
783
|
+
// load the song cover image
|
784
|
+
loadCoverImage(songMetaData);
|
785
|
+
|
786
|
+
// update meta data
|
787
|
+
updatMetaContainers(songMetaData);
|
788
|
+
|
789
|
+
// set AJS play_pause button paused
|
790
|
+
var playPauseButtonClass = `large-player-play-pause-${playerID}`
|
791
|
+
setPlayPauseButtonPaused(playPauseButtonClass);
|
792
|
+
|
793
|
+
// set song (video) active at index in playlist
|
794
|
+
setSongActive(playlist, songIndex);
|
795
|
+
|
796
|
+
// reset progress bar settings
|
797
|
+
resetProgressBarYTP();
|
798
|
+
|
799
|
+
// scroll song active at index in player
|
800
|
+
if (playerAutoScrollSongElement) {
|
801
|
+
scrollToActiveElement(playlist);
|
802
|
+
}
|
803
|
+
|
804
|
+
// TODO: check if SHUFFLE is enabled on PLAYLIST (PLAYER ???)
|
805
|
+
// set FIRST song (video) paused
|
806
|
+
ytPlayer.pauseVideo();
|
807
|
+
}
|
808
|
+
|
809
|
+
} // END loadVideo
|
810
|
+
|
811
|
+
// ---------------------------------------------------------------------------
|
812
|
+
// initUiEventsForAJS
|
813
|
+
//
|
814
|
+
// setup YTPlayerUiEvents for AJS players
|
815
|
+
// ---------------------------------------------------------------------------
|
231
816
|
function initUiEventsForAJS() {
|
232
817
|
|
233
|
-
|
818
|
+
var dependencies_ytp_ready = setInterval (() => {
|
234
819
|
var ytApiReady = (j1.adapter.amplitude.data.ytpGlobals['ytApiReady'] !== undefined) ? j1.adapter.amplitude.data.ytpGlobals['ytApiReady'] : false;
|
235
820
|
var ytPlayerReady = (j1.adapter.amplitude.data.ytpGlobals['ytPlayerReady'] !== undefined) ? j1.adapter.amplitude.data.ytpGlobals['ytPlayerReady'] : false;
|
236
821
|
|
@@ -245,7 +830,7 @@ var progress;
|
|
245
830
|
{% endif %}
|
246
831
|
|
247
832
|
{% if player_source == 'video' %}
|
248
|
-
|
833
|
+
playerID = '{{player.id}}';
|
249
834
|
mimikYTPlayerUiEventsForAJS(playerID);
|
250
835
|
{% endif %}
|
251
836
|
|
@@ -256,21 +841,19 @@ var progress;
|
|
256
841
|
} // END if ready
|
257
842
|
|
258
843
|
}, 10); // END dependencies_ytp_ready
|
844
|
+
|
259
845
|
} // END initUiEventsForAJS()
|
260
846
|
|
847
|
+
// ---------------------------------------------------------------------------
|
848
|
+
// onYouTubeIframeAPIReady
|
849
|
+
//
|
261
850
|
// Create a player after Iframe player API is ready to use
|
262
851
|
// ---------------------------------------------------------------------------
|
263
852
|
function onYouTubeIframeAPIReady() {
|
264
|
-
|
265
|
-
var playerSource;
|
266
|
-
|
267
|
-
ytApiReady = true;
|
268
|
-
// currentOptions = $.extend({}, {{amplitude_options | replace: 'nil', 'null' | replace: '=>', ':' }});
|
853
|
+
ytApiReady = true;
|
269
854
|
|
270
|
-
{% for player in amplitude_options.players %}{% if player.enabled %}
|
271
|
-
{% capture xhr_container_id %}{{player.id}}
|
272
|
-
|
273
|
-
playerSource = '{{player.source}}';
|
855
|
+
{% for player in amplitude_options.players %}{% if player.enabled and player.source == 'video' %}
|
856
|
+
{% capture xhr_container_id %}{{player.id}}_app{% endcapture %}
|
274
857
|
|
275
858
|
{% if player.source == empty %}
|
276
859
|
{% assign player_source = amplitude_defaults.player.source %}
|
@@ -282,7 +865,7 @@ var progress;
|
|
282
865
|
{% continue %}
|
283
866
|
{% else %}
|
284
867
|
// load players of type 'video' configured in current page
|
285
|
-
//
|
868
|
+
// ---------------------------------------------------------------------
|
286
869
|
playerExistsInPage = ($('#' + '{{xhr_container_id}}')[0] !== undefined) ? true : false;
|
287
870
|
if (playerExistsInPage) {
|
288
871
|
var playerSettings = $.extend({}, {{player | replace: 'nil', 'null' | replace: '=>', ':' }});
|
@@ -319,8 +902,8 @@ var progress;
|
|
319
902
|
loop: ytpLoop
|
320
903
|
},
|
321
904
|
events: {
|
322
|
-
'onReady':
|
323
|
-
'onStateChange':
|
905
|
+
'onReady': {{player.id}}OnPlayerReady,
|
906
|
+
'onStateChange': {{player.id}}OnPlayerStateChange
|
324
907
|
}
|
325
908
|
});
|
326
909
|
|
@@ -343,42 +926,78 @@ var progress;
|
|
343
926
|
// store player properties for later use
|
344
927
|
addNestedProperty(j1.adapter.amplitude.data.ytPlayers, '{{player.id}}', playerProperties);
|
345
928
|
|
346
|
-
// save YT player data for later use (e.g. events)
|
347
|
-
|
348
|
-
// j1.adapter.amplitude.data.ytpGlobals['ytPlayerDefaults'] = amplitudeDefaults.player;
|
349
|
-
// j1.adapter.amplitude.data.ytpGlobals['ytPlayerSettings'] = playerSettings;
|
350
|
-
j1.adapter.amplitude.data.ytpGlobals['ytApiReady'] = ytApiReady;
|
929
|
+
// save YT player GLOBAL data for later use (e.g. events)
|
930
|
+
j1.adapter.amplitude.data.ytpGlobals['ytApiReady'] = ytApiReady;
|
351
931
|
|
352
|
-
|
353
932
|
// reset current player
|
354
933
|
playerExistsInPage = false;
|
355
934
|
|
356
935
|
} // END if playerExistsInPage()
|
357
936
|
|
937
|
+
function checkPlayingStatus(player) {
|
938
|
+
if (player.getPlayerState() === YT_PLAYER_STATE.PLAYING) {
|
939
|
+
// code run after video is playing
|
940
|
+
// console.debug("checkPlayingStatus: AJS YouTube Player state: PLAYING");
|
941
|
+
// do nothing
|
942
|
+
return;
|
943
|
+
} else {
|
944
|
+
// re-check player state required
|
945
|
+
// console.debug("checkPlayingStatus: AJS YouTube Player state:", player.getPlayerState());
|
946
|
+
}
|
947
|
+
} // END checkPlayingStatus
|
948
|
+
|
358
949
|
// run AJS YouTube Player initialization
|
359
950
|
// ---------------------------------------------------------------------
|
360
951
|
function {{player.id}}OnPlayerReady(event) {
|
361
|
-
var hours, minutes, seconds
|
362
|
-
|
363
|
-
|
952
|
+
var hours, minutes, seconds,
|
953
|
+
ytPlayer, ytPlayerReady, playerVolumePreset,
|
954
|
+
playListName, songsInPlaylist, titleListLargePlayer;
|
955
|
+
|
956
|
+
ytPlayer = event.target;
|
957
|
+
ytPlayerReady = true;
|
958
|
+
playerVolumePreset = parseInt({{player.volume_slider.preset_value}});
|
959
|
+
|
960
|
+
logger.debug('\n' + `FOUND video ready at ID: {{player.id}}`);
|
961
|
+
|
962
|
+
// set video playback quality to a minimum
|
963
|
+
ytPlayer.setPlaybackQuality('small');
|
964
|
+
|
965
|
+
// set configured player volume preset
|
966
|
+
ytPlayer.setVolume(playerVolumePreset);
|
967
|
+
|
968
|
+
// enable|disable scrolling on playlist
|
969
|
+
// -------------------------------------------------------------------
|
970
|
+
if (document.getElementById('large_player_right') !== null) {
|
971
|
+
|
972
|
+
// show|hide scrollbar in playlist
|
973
|
+
// -----------------------------------------------------------------
|
974
|
+
playListName = j1.adapter.amplitude.data.ytPlayers.{{player.id}}.playerSettings.playlist.name;
|
975
|
+
songsInPlaylist = Amplitude.getSongsInPlaylist(playListName);
|
976
|
+
titleListLargePlayer = document.getElementById('large_player_title_list_' + playListName);
|
977
|
+
|
978
|
+
if (songsInPlaylist.length <= playerScrollerSongElementMin) {
|
979
|
+
if (titleListLargePlayer !== null) {
|
980
|
+
titleListLargePlayer.classList.add('hide-scrollbar');
|
981
|
+
}
|
982
|
+
}
|
983
|
+
}
|
364
984
|
|
365
985
|
logger.info('\n' + 'AJS YouTube Player on ID {{player.id}}: ready');
|
366
986
|
|
367
|
-
// save YT player data for later use (e.g. events)
|
987
|
+
// save YT player GLOBAL data for later use (e.g. events)
|
368
988
|
j1.adapter.amplitude.data.ytpGlobals['ytPlayerReady'] = ytPlayerReady;
|
369
|
-
j1.adapter.amplitude.data.ytPlayers.{{player.id}}.playerReady = ytPlayerReady;
|
370
989
|
|
371
|
-
//
|
372
|
-
//
|
990
|
+
// save YT player data for later use (e.g. events)
|
991
|
+
// j1.adapter.amplitude.data.ytPlayers.{{player.id}}.playerReady = ytPlayerReady;
|
373
992
|
|
374
993
|
// get duration hours (if configured)
|
375
994
|
if ({{player.display_hours}} ) {
|
376
|
-
hours = ytpGetDurationHours
|
995
|
+
hours = ytpGetDurationHours(ytPlayer);
|
377
996
|
}
|
378
997
|
|
379
998
|
// get duration minutes|seconds
|
380
|
-
minutes = ytpGetDurationMinutes
|
381
|
-
seconds = ytpGetDurationSeconds
|
999
|
+
minutes = ytpGetDurationMinutes(ytPlayer);
|
1000
|
+
seconds = ytpGetDurationSeconds(ytPlayer);
|
382
1001
|
|
383
1002
|
// set duration time values for current video
|
384
1003
|
// -------------------------------------------------------------------
|
@@ -409,210 +1028,243 @@ var progress;
|
|
409
1028
|
logger.warn('\n' + 'Found NO players of type video (YTP) in page');
|
410
1029
|
}
|
411
1030
|
|
1031
|
+
// update activeVideoElement data structure for the ACTIVE video
|
1032
|
+
// -------------------------------------------------------------------
|
1033
|
+
setInterval(function() {
|
1034
|
+
checkActiveVideoElementYTP();
|
1035
|
+
}, checkActiveVideoInterval);
|
1036
|
+
// END checkActiveVideoElementYTP
|
1037
|
+
|
412
1038
|
logger.info('\n' + 'plugin|tech initializing time: ' + (endTimeModule-startTimeModule) + 'ms');
|
413
1039
|
|
414
1040
|
} // END onPlayerReady()
|
415
1041
|
|
416
|
-
//
|
1042
|
+
// ---------------------------------------------------------------------
|
1043
|
+
// OnPlayerStateChange
|
1044
|
+
//
|
1045
|
+
// process Player|Video specific functions on state change
|
1046
|
+
// ---------------------------------------------------------------------
|
1047
|
+
// NOTE:
|
1048
|
+
// The YT API fires a lot of INTERMEDIATE states. MOST of them gets
|
1049
|
+
// ignored (do nothing). For state PLAYING, important initial values
|
1050
|
+
// are being set; e.g. start|stop positions for a video (when)
|
1051
|
+
// configured.
|
417
1052
|
// ---------------------------------------------------------------------
|
418
1053
|
function {{player.id}}OnPlayerStateChange(event) {
|
419
|
-
var playlist
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
j1.adapter.amplitude.data.
|
1054
|
+
var currentTime, playlist, ytPlayer, ytVideoID,
|
1055
|
+
songs, songIndex, trackID, playerID, songMetaData;
|
1056
|
+
|
1057
|
+
ytPlayer = event.target;
|
1058
|
+
ytVideoID = ytPlayer.options.videoId;
|
1059
|
+
playlist = '{{player.id}}'.replace('_large', '');
|
1060
|
+
playerID = '{{player.id}}';
|
1061
|
+
songs = j1.adapter.amplitude.data.ytPlayers.{{player.id}}.songs;
|
1062
|
+
songIndex = ytpSongIndex; // getSongIndex(songs, ytVideoID);
|
1063
|
+
trackID = songIndex + 1;
|
1064
|
+
// songMetaData = songs[songIndex];
|
1065
|
+
|
1066
|
+
// save YT player GLOBAL data for later use (e.g. events)
|
1067
|
+
j1.adapter.amplitude.data.activePlayer = 'ytp';
|
1068
|
+
j1.adapter.amplitude.data.ytpGlobals['activePlayer'] = ytPlayer;
|
1069
|
+
j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
|
1070
|
+
j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
|
427
1071
|
|
428
1072
|
// save YT player data for later use (e.g. events)
|
429
|
-
|
1073
|
+
j1.adapter.amplitude.data.ytPlayers.{{player.id}}.player = ytPlayer;
|
1074
|
+
j1.adapter.amplitude.data.ytPlayers.{{player.id}}.activeIndex = songIndex;
|
1075
|
+
|
1076
|
+
// reset time container|progressbar for the ACTIVE song (video)
|
1077
|
+
// -------------------------------------------------------------------
|
1078
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
1079
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
1080
|
+
resetProgressBarYTP();
|
1081
|
+
|
1082
|
+
// process all state changes fired by YT API
|
1083
|
+
// -------------------------------------------------------------------
|
1084
|
+
switch(event.data) {
|
1085
|
+
case YT_PLAYER_STATE.UNSTARTED:
|
1086
|
+
doNothingOnStateChange(YT_PLAYER_STATE.UNSTARTED);
|
1087
|
+
break;
|
1088
|
+
case YT_PLAYER_STATE.CUED:
|
1089
|
+
doNothingOnStateChange(YT_PLAYER_STATE.CUED);
|
1090
|
+
break;
|
1091
|
+
case YT_PLAYER_STATE.BUFFERING:
|
1092
|
+
doNothingOnStateChange(YT_PLAYER_STATE.BUFFERING);
|
1093
|
+
break;
|
1094
|
+
case YT_PLAYER_STATE.PAUSED:
|
1095
|
+
doNothingOnStateChange(YT_PLAYER_STATE.PAUSED);
|
1096
|
+
break;
|
1097
|
+
case YT_PLAYER_STATE.PLAYING:
|
1098
|
+
processOnStateChangePlaying(event, playlist, songIndex);
|
1099
|
+
break;
|
1100
|
+
case YT_PLAYER_STATE.ENDED:
|
1101
|
+
processOnStateChangeEnded(event, playlist, songIndex);
|
1102
|
+
break;
|
1103
|
+
default:
|
1104
|
+
logger.error('\n' + `UNKNOWN event on StateChange fired`);
|
1105
|
+
} // END case
|
430
1106
|
|
431
|
-
|
432
|
-
updateDurationTimeContainerYTP(ytPlayer);
|
1107
|
+
} // END {{player.id}}OnPlayerStateChange
|
433
1108
|
|
434
|
-
|
435
|
-
|
1109
|
+
{% endif %}
|
1110
|
+
{% endif %}{% endfor %}
|
436
1111
|
|
437
|
-
|
438
|
-
// ytpSetActiveIndex({{player.id}}, activeIndex);
|
1112
|
+
} // END onYouTubeIframeAPIReady
|
439
1113
|
|
440
|
-
if (event.data === YT_PLAYER_STATE.PLAYING || event.data === YT_PLAYER_STATE.BUFFERING) {
|
441
|
-
setInterval(updateCurrentTimeContainerYTP, 1000);
|
442
|
-
setInterval(updateProgressBarsYTP, 1000);
|
443
1114
|
|
444
|
-
|
445
|
-
|
1115
|
+
// ---------------------------------------------------------------------------
|
1116
|
+
// main
|
1117
|
+
// ===========================================================================
|
446
1118
|
|
447
|
-
|
448
|
-
|
1119
|
+
// ---------------------------------------------------------------------------
|
1120
|
+
// initYtAPI
|
1121
|
+
//
|
1122
|
+
// load|initialize YT Iframe player API
|
1123
|
+
// ---------------------------------------------------------------------------
|
1124
|
+
initYtAPI();
|
449
1125
|
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
1126
|
+
// ---------------------------------------------------------------------------
|
1127
|
+
// initUiEventsForAJS
|
1128
|
+
//
|
1129
|
+
// setup YTPlayerUiEvents for AJS players
|
1130
|
+
// ---------------------------------------------------------------------------
|
1131
|
+
initUiEventsForAJS();
|
454
1132
|
|
455
|
-
var songIndex;
|
456
|
-
songIndex = ytpSongIndex;
|
457
|
-
songIndex++;
|
458
|
-
ytpSongIndex = songIndex;
|
459
1133
|
|
460
|
-
|
461
|
-
|
1134
|
+
// ---------------------------------------------------------------------------
|
1135
|
+
// Base AJS Player functions
|
1136
|
+
// ===========================================================================
|
1137
|
+
|
1138
|
+
// ---------------------------------------------------------------------------
|
1139
|
+
// updatMetaContainers(metaData)
|
1140
|
+
//
|
1141
|
+
// update song name in meta-containers
|
1142
|
+
// ---------------------------------------------------------------------------
|
1143
|
+
function updatMetaContainers(metaData) {
|
1144
|
+
var playerID, playlist, songName, artistName, albumName,
|
1145
|
+
largePlayerSongAudioRating;
|
1146
|
+
|
1147
|
+
playlist = metaData.playlist;
|
1148
|
+
playerID = playlist + '_large';
|
1149
|
+
|
1150
|
+
var trackID = metaData.index + 1;
|
1151
|
+
logger.debug('\n' + `UPDATE metadata on updatMetaContainers for trackID|playlist at: ${trackID}|${playlist}`);
|
1152
|
+
|
1153
|
+
// update song name in meta-containers
|
1154
|
+
songName = document.getElementsByClassName("song-name");
|
1155
|
+
if (songName.length) {
|
1156
|
+
for (var i=0; i<songName.length; i++) {
|
1157
|
+
var currentPlaylist = songName[i].dataset.amplitudePlaylist;
|
1158
|
+
if (currentPlaylist === playlist) {
|
1159
|
+
songName[i].innerHTML = metaData.name;
|
1160
|
+
}
|
1161
|
+
}
|
1162
|
+
}
|
462
1163
|
|
463
|
-
|
464
|
-
|
1164
|
+
// update artist name in meta-containers
|
1165
|
+
artistName = document.getElementsByClassName("artist");
|
1166
|
+
if (artistName.length) {
|
1167
|
+
for (var i=0; i<artistName.length; i++) {
|
1168
|
+
var currentPlaylist = songName[i].dataset.amplitudePlaylist;
|
1169
|
+
if (currentPlaylist === playlist) {
|
1170
|
+
artistName[i].innerHTML = metaData.artist;
|
1171
|
+
}
|
1172
|
+
}
|
1173
|
+
}
|
465
1174
|
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
1175
|
+
// update album name in meta-containers
|
1176
|
+
albumName = document.getElementsByClassName("album");
|
1177
|
+
if (albumName.length) {
|
1178
|
+
for (var i=0; i<albumName.length; i++) {
|
1179
|
+
var currentPlaylist = songName[i].dataset.amplitudePlaylist;
|
1180
|
+
if (currentPlaylist === playlist) {
|
1181
|
+
albumName[i].innerHTML = metaData.album;
|
1182
|
+
}
|
1183
|
+
}
|
1184
|
+
}
|
470
1185
|
|
471
|
-
|
472
|
-
|
1186
|
+
// update song rating in screen controls
|
1187
|
+
largePlayerSongAudioRating = document.getElementsByClassName("audio-rating-screen-controls");
|
1188
|
+
if (largePlayerSongAudioRating.length) {
|
1189
|
+
for (var i=0; i<largePlayerSongAudioRating.length; i++) {
|
1190
|
+
var currentPlaylist = largePlayerSongAudioRating[i].dataset.amplitudePlaylist;
|
1191
|
+
if (currentPlaylist === playlist) {
|
1192
|
+
if (metaData.rating) {
|
1193
|
+
var trackID = metaData.index + 1;
|
473
1194
|
|
474
|
-
|
475
|
-
|
476
|
-
updateDurationTimeContainerYTP(ytPlayer);
|
1195
|
+
// save YT player data for later use (e.g. events)
|
1196
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].videoID = metaData.videoID;
|
477
1197
|
|
478
|
-
|
479
|
-
|
480
|
-
|
1198
|
+
logger.debug('\n' + `UPDATE song rating on updatMetaContainers for trackID|playlist at: ${trackID}|${playlist} with a value of: ${metaData.rating}`);
|
1199
|
+
largePlayerSongAudioRating[i].innerHTML = '<img src="/assets/image/pattern/rating/scalable/' + metaData.rating + '-star.svg"' + 'alt="song rating">';
|
1200
|
+
} else {
|
1201
|
+
largePlayerSongAudioRating[i].innerHTML = '';
|
1202
|
+
}
|
1203
|
+
}
|
1204
|
+
}
|
1205
|
+
} // END if largePlayerSongAudioRating
|
481
1206
|
|
482
|
-
|
483
|
-
// j1.adapter.amplitude.data.ytpGlobals['ytpSongIndex'] = ytpSongIndex;
|
484
|
-
|
485
|
-
// load cover image for next video
|
486
|
-
var coverImage;
|
487
|
-
var selector = ".cover-image-" + playlist;
|
488
|
-
coverImage = document.querySelector(selector);
|
489
|
-
coverImage.src = songMetaData.cover_art_url;
|
490
|
-
|
491
|
-
// replace song name in meta-containers for next video
|
492
|
-
var songName = document.getElementsByClassName("song-name");
|
493
|
-
songName[0].innerHTML = songMetaData.name; // player-bottom
|
494
|
-
songName[1].innerHTML = songMetaData.name; // playlist-screen-controls
|
495
|
-
|
496
|
-
// replace song rating (playlist-screen|meta-container)
|
497
|
-
var largetPlayerSongAudioRating = document.getElementsByClassName("audio-rating");
|
498
|
-
if (largetPlayerSongAudioRating.length) {
|
499
|
-
if (songMetaData.rating) {
|
500
|
-
largetPlayerSongAudioRating[0].innerHTML = songMetaData.rating + ' <i class="mdib mdib-star md-gray-400 mdib-18px"></i>';
|
501
|
-
} else {
|
502
|
-
largetPlayerSongAudioRating[0].innerHTML = '';
|
503
|
-
}
|
504
|
-
} // END if largetPlayerSongAudioRating
|
1207
|
+
} // END updatMetaContainers
|
505
1208
|
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
// set song active in playlist
|
515
|
-
// setSongPlayed(songIndex);
|
516
|
-
setSongPlayed(playerID, songIndex);
|
517
|
-
} else {
|
518
|
-
// select FIRST video
|
519
|
-
songIndex = 0;
|
520
|
-
var songMetaData = songs[songIndex];
|
521
|
-
var songURL = songMetaData.url;
|
522
|
-
var ytpVideoID = songURL.split('=')[1];
|
523
|
-
|
524
|
-
// ytpSetActiveIndex({{player.id}}, songIndex);
|
525
|
-
|
526
|
-
// continue (paused) on FIRST video
|
527
|
-
ytPlayer.loadVideoById(ytpVideoID);
|
528
|
-
// wait some time to make sure video is loaded|active
|
529
|
-
setTimeout(() => {
|
530
|
-
ytPlayer.pauseVideo();
|
531
|
-
// reset|update time settings
|
532
|
-
resetCurrentTimeContainerYTP();
|
533
|
-
updateDurationTimeContainerYTP(ytPlayer);
|
534
|
-
|
535
|
-
// update AJS play_pause button
|
536
|
-
var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
|
537
|
-
largePlayerPlayPauseButton.classList.remove('amplitude-playing');
|
538
|
-
largePlayerPlayPauseButton.classList.add('amplitude-paused');
|
539
|
-
}, 300);
|
540
|
-
|
541
|
-
// update global song index for first video
|
542
|
-
ytpSongIndex = songIndex;
|
543
|
-
|
544
|
-
// save YT player data for later use (e.g. events)
|
545
|
-
// j1.adapter.amplitude.data.ytpGlobals['ytpSongIndex'] = ytpSongIndex;
|
546
|
-
|
547
|
-
// load cover image for first video
|
548
|
-
var coverImage;
|
549
|
-
var selector = ".cover-image-" + playlist;
|
550
|
-
coverImage = document.querySelector(selector);
|
551
|
-
coverImage.src = songMetaData.cover_art_url;
|
552
|
-
|
553
|
-
// replace name in meta-containers for first video
|
554
|
-
var songName = document.getElementsByClassName("song-name");
|
555
|
-
songName[0].innerHTML = songMetaData.name; // player-bottom
|
556
|
-
songName[1].innerHTML = songMetaData.name; // playlist-screen-controls
|
557
|
-
|
558
|
-
// replace song rating (playlist-screen|meta-container)
|
559
|
-
var largetPlayerSongAudioRating = document.getElementsByClassName("audio-rating");
|
560
|
-
if (largetPlayerSongAudioRating.length) {
|
561
|
-
if (songMetaData.rating) {
|
562
|
-
largetPlayerSongAudioRating[0].innerHTML = songMetaData.rating + ' <i class="mdib mdib-star md-gray-400 mdib-18px"></i>';
|
563
|
-
} else {
|
564
|
-
largetPlayerSongAudioRating[0].innerHTML = '';
|
565
|
-
}
|
566
|
-
} // END if largetPlayerSongAudioRating
|
567
|
-
|
568
|
-
// replace artist name in meta-containers for next video
|
569
|
-
var artistName = document.getElementsByClassName("artist");
|
570
|
-
artistName.innerHTML = songMetaData.artist;
|
571
|
-
|
572
|
-
// replace album name in meta-containers for next video
|
573
|
-
var albumName = document.getElementsByClassName("album");
|
574
|
-
albumName.innerHTML = songMetaData.album;
|
575
|
-
|
576
|
-
// update AJS play_pause button
|
577
|
-
var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
|
578
|
-
largePlayerPlayPauseButton.classList.remove('amplitude-playing');
|
579
|
-
largePlayerPlayPauseButton.classList.add('amplitude-paused');
|
580
|
-
|
581
|
-
// set song (video) active in playlist
|
582
|
-
// setSongPlayed(songIndex);
|
583
|
-
setSongPlayed(playerID, songIndex);
|
584
|
-
}
|
585
|
-
} // END if YT_PLAYER_STATE.ENDED
|
586
|
-
|
587
|
-
} // END {{player.id}}OnPlayerStateChange
|
588
|
-
|
589
|
-
{% endif %}
|
590
|
-
{% endif %}{% endfor %}
|
591
|
-
|
592
|
-
} // END onYouTubeIframeAPIReady ()
|
1209
|
+
// ---------------------------------------------------------------------------
|
1210
|
+
// loadCoverImage(metaData)
|
1211
|
+
//
|
1212
|
+
// load the configured cover image for a specic song (metaData)
|
1213
|
+
// ---------------------------------------------------------------------------
|
1214
|
+
function loadCoverImage(metaData) {
|
1215
|
+
var selector;
|
1216
|
+
var coverImage = {};
|
593
1217
|
|
1218
|
+
selector = ".cover-image-" + metaData.playlist;
|
1219
|
+
coverImage = document.querySelector(selector);
|
1220
|
+
coverImage.src = metaData.cover_art_url;
|
1221
|
+
} // END loadCoverImage
|
594
1222
|
|
595
1223
|
// ---------------------------------------------------------------------------
|
596
|
-
//
|
597
|
-
// ---------------------------------------------------------------------------
|
598
|
-
// load|initialize YT Iframe player API
|
1224
|
+
// stopAllActivePlayers(exceptPlayer)
|
599
1225
|
//
|
600
|
-
|
1226
|
+
// if multiple players used on a page, stop ALL active AT|YT players
|
1227
|
+
// running in parallel execpet the exceptPlayer
|
1228
|
+
// ---------------------------------------------------------------------------
|
1229
|
+
function stopAllActivePlayers(exceptPlayer) {
|
601
1230
|
|
602
|
-
|
603
|
-
|
604
|
-
|
1231
|
+
// stop active AT players
|
1232
|
+
// -------------------------------------------------------------------------
|
1233
|
+
var atpPlayerState = Amplitude.getPlayerState();
|
1234
|
+
if (atpPlayerState === 'playing') {
|
1235
|
+
Amplitude.stop();
|
1236
|
+
} // END stop active AT players
|
605
1237
|
|
1238
|
+
// stop active YT players
|
1239
|
+
// -------------------------------------------------------------------------
|
1240
|
+
const ytPlayers = Object.keys(j1.adapter.amplitude.data.ytPlayers);
|
1241
|
+
for (let i=0; i<ytPlayers.length; i++) {
|
1242
|
+
const ytPlayerID = ytPlayers[i];
|
1243
|
+
const playerProperties = j1.adapter.amplitude.data.ytPlayers[ytPlayerID];
|
1244
|
+
|
1245
|
+
if (ytPlayerID !== exceptPlayer) {
|
1246
|
+
var player = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID]['player'];
|
1247
|
+
var playerState = (player.getPlayerState() > 0) ? player.getPlayerState() : 6;
|
1248
|
+
var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
|
1249
|
+
|
1250
|
+
// if (ytPlayerState === 'playing' || ytPlayerState === 'paused' || ytPlayerState === 'buffering' || ytPlayerState === 'cued' || ytPlayerState === 'unstarted') {
|
1251
|
+
if (ytPlayerState === 'playing' || ytPlayerState === 'paused' || ytPlayerState === 'buffering' || ytPlayerState === 'cued' || ytPlayerState === 'unstarted') {
|
1252
|
+
logger.debug('\n' + `STOP player at stopAllActivePlayers for id: ${ytPlayerID}`);
|
1253
|
+
// player.mute();
|
1254
|
+
player.stopVideo();
|
1255
|
+
j1.adapter.amplitude.data.ytpGlobals.activeIndex = 0;
|
1256
|
+
}
|
1257
|
+
}
|
1258
|
+
} // END stop active YT players
|
1259
|
+
|
1260
|
+
} // END stopAllActivePlayers
|
606
1261
|
|
607
1262
|
// ---------------------------------------------------------------------------
|
608
|
-
//
|
609
|
-
// ---------------------------------------------------------------------------
|
610
|
-
|
611
|
-
// ---------------------------------------------------------------------------
|
612
|
-
// Returns the index of the current video (song) in the songs array
|
613
|
-
// that is currently playing (starts by 0)
|
614
|
-
// ---------------------------------------------------------------------------
|
1263
|
+
// getSongPlayed
|
615
1264
|
//
|
1265
|
+
// Returns the index of the current video (song) in the songs array
|
1266
|
+
// that is currently playing (starts by 0)
|
1267
|
+
// ---------------------------------------------------------------------------
|
616
1268
|
function getSongPlayed() {
|
617
1269
|
var index = -1;
|
618
1270
|
var songContainers = document.getElementsByClassName("amplitude-active-song-container");
|
@@ -630,79 +1282,41 @@ var progress;
|
|
630
1282
|
} // END getSongPlayed
|
631
1283
|
|
632
1284
|
// ---------------------------------------------------------------------------
|
633
|
-
//
|
634
|
-
// visual information for the active song.
|
1285
|
+
// setSongActive(currentPlayList, currentIndex)
|
635
1286
|
//
|
636
|
-
//
|
1287
|
+
// set song (video) active at index in playlist
|
637
1288
|
// ---------------------------------------------------------------------------
|
638
|
-
|
639
|
-
|
640
|
-
var direct;
|
1289
|
+
function setSongActive(currentPlayList, currentIndex) {
|
1290
|
+
var playlist, songContainers, songIndex;
|
641
1291
|
|
642
|
-
|
643
|
-
direct = true;
|
1292
|
+
songIndex = currentIndex;
|
644
1293
|
|
645
|
-
//
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
for (var i = 0; i < songContainers.length; i++) {
|
1294
|
+
// clear ALL active song containers
|
1295
|
+
// -------------------------------------------------------------------------
|
1296
|
+
songContainers = document.getElementsByClassName("amplitude-song-container");
|
1297
|
+
for (var i=0; i<songContainers.length; i++) {
|
650
1298
|
songContainers[i].classList.remove("amplitude-active-song-container");
|
651
1299
|
}
|
652
1300
|
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
//
|
662
|
-
if (direct) {
|
663
|
-
// activeIndex = Amplitude.getActiveIndex();
|
664
|
-
activeIndex = index;
|
665
|
-
} else {
|
666
|
-
if (Amplitude.getConfig().shuffle_on) {
|
667
|
-
// activeIndex = Amplitude.getConfig().shuffle_list[Amplitude.getActiveIndex()];
|
668
|
-
} else {
|
669
|
-
// activeIndex = Amplitude.getActiveIndex();
|
670
|
-
activeIndex = index;
|
671
|
-
}
|
672
|
-
}
|
673
|
-
|
674
|
-
// activate playlist container
|
675
|
-
if (document.querySelectorAll('.amplitude-song-container[data-amplitude-song-index="' + activeIndex + '"]')) {
|
676
|
-
var _songContainers = document.querySelectorAll('.amplitude-song-container[data-amplitude-song-index="' + activeIndex + '"]');
|
677
|
-
for (var _i = 0; _i < _songContainers.length; _i++) {
|
678
|
-
if (_songContainers[_i].hasAttribute("data-amplitude-playlist")) {
|
679
|
-
var _playerID = _songContainers[_i].getAttribute("data-amplitude-playlist") + '_large';
|
680
|
-
if (_playerID === playerID) {
|
681
|
-
_songContainers[_i].classList.add("amplitude-active-song-container");
|
682
|
-
}
|
683
|
-
}
|
684
|
-
}
|
1301
|
+
// find current song container and activate the element
|
1302
|
+
// -------------------------------------------------------------------------
|
1303
|
+
songContainers = document.querySelectorAll('.amplitude-song-container[data-amplitude-song-index="' + songIndex + '"]');
|
1304
|
+
for (var i=0; i<songContainers.length; i++) {
|
1305
|
+
if (songContainers[i].hasAttribute("data-amplitude-playlist")) {
|
1306
|
+
playlist = songContainers[i].getAttribute("data-amplitude-playlist");
|
1307
|
+
if (playlist === currentPlayList) {
|
1308
|
+
songContainers[i].classList.add("amplitude-active-song-container");
|
685
1309
|
}
|
686
|
-
}
|
687
|
-
|
688
|
-
// song element, we ignore the shuffle.
|
689
|
-
//
|
690
|
-
if (Amplitude.getActivePlaylist() != null && Amplitude.getActivePlaylist() != "" || direct) {
|
691
|
-
var activePlaylistIndex = Amplitude.getActiveIndex();
|
692
|
-
} else {
|
693
|
-
var activePlaylistIndex = "";
|
1310
|
+
}
|
1311
|
+
}
|
694
1312
|
|
695
|
-
if (Amplitude.getActivePlaylist().shuffle) {
|
696
|
-
activePlaylistIndex = Amplitude.getActiveIndex();
|
697
|
-
} else {
|
698
|
-
activePlaylistIndex = Amplitude.getActiveIndex();
|
699
|
-
}
|
700
|
-
} // END if
|
701
|
-
} // END if
|
702
1313
|
} // END setSongPlayed
|
703
1314
|
|
1315
|
+
// ---------------------------------------------------------------------------
|
1316
|
+
// getProgressBarSelectedPositionPercentage
|
1317
|
+
//
|
704
1318
|
// Returns the position as a percentage the user clicked in player progressbar
|
705
|
-
// NOTE: The percentage is out of [0.00 .. 1.00]
|
1319
|
+
// NOTE: The percentage is out of [0.00 .. 1.00]
|
706
1320
|
// ---------------------------------------------------------------------------
|
707
1321
|
function getProgressBarSelectedPositionPercentage (event, progessBar) {
|
708
1322
|
var offset = progessBar.getBoundingClientRect();
|
@@ -710,8 +1324,11 @@ var progress;
|
|
710
1324
|
var percentage = (parseFloat(xpos) / parseFloat(progessBar.offsetWidth)).toFixed(2);
|
711
1325
|
|
712
1326
|
return percentage;
|
713
|
-
}
|
1327
|
+
} // END getProgressBarSelectedPositionPercentage
|
714
1328
|
|
1329
|
+
// ---------------------------------------------------------------------------
|
1330
|
+
// getTimeFromPercentage
|
1331
|
+
//
|
715
1332
|
// Returns the time in seconds calculated from a percentage value
|
716
1333
|
// NOTE: The percentage is out of [0.00 .. 1.00]
|
717
1334
|
// ---------------------------------------------------------------------------
|
@@ -720,154 +1337,373 @@ var progress;
|
|
720
1337
|
var time = parseFloat((videoDuration * percentage).toFixed(2));
|
721
1338
|
|
722
1339
|
return time;
|
1340
|
+
} // END getTimeFromPercentage
|
1341
|
+
|
1342
|
+
// ---------------------------------------------------------------------------
|
1343
|
+
// checkActiveVideoElementYTP
|
1344
|
+
//
|
1345
|
+
//
|
1346
|
+
// ---------------------------------------------------------------------------
|
1347
|
+
function checkActiveVideoElementYTP() {
|
1348
|
+
var activeVideoElements = document.getElementsByClassName("amplitude-active-song-container");
|
1349
|
+
if (activeVideoElements.length) {
|
1350
|
+
var classArray = [].slice.call(activeVideoElements[0].classList, 0);
|
1351
|
+
var classString = classArray.toString();
|
1352
|
+
|
1353
|
+
// activeVideoElement.html = activeVideoElements[0];
|
1354
|
+
activeVideoElement.playlist = activeVideoElements[0].dataset.amplitudePlaylist;
|
1355
|
+
activeVideoElement.index = parseInt(activeVideoElements[0].dataset.amplitudeSongIndex);
|
1356
|
+
activeVideoElement.playerType = (classString.includes('large') ? 'large' : 'compact');
|
1357
|
+
activeVideoElement.playerID = activeVideoElement.playlist + '_' + activeVideoElement.playerType;
|
1358
|
+
|
1359
|
+
if (j1.adapter.amplitude.data.ytPlayers[activeVideoElement.playerID] !== undefined) {
|
1360
|
+
activeVideoElement.player = j1.adapter.amplitude.data.ytPlayers[activeVideoElement.playerID].player;
|
1361
|
+
activeVideoElement.songs = j1.adapter.amplitude.data.ytPlayers[activeVideoElement.playerID].songs;
|
1362
|
+
|
1363
|
+
var activeSong = activeVideoElement.songs[activeVideoElement.index];
|
1364
|
+
|
1365
|
+
activeVideoElement.album = activeSong.album;
|
1366
|
+
activeVideoElement.artist = activeSong.artist;
|
1367
|
+
activeVideoElement.audio_info = activeSong.audio_info;
|
1368
|
+
activeVideoElement.audio_single = activeSong.audio_single;
|
1369
|
+
activeVideoElement.currentTime = parseFloat(activeVideoElement.player.getCurrentTime());
|
1370
|
+
activeVideoElement.cover_art_url = activeSong.cover_art_url;
|
1371
|
+
activeVideoElement.duration = activeSong.duration;
|
1372
|
+
activeVideoElement.endSec = timestamp2seconds(activeSong.end);
|
1373
|
+
activeVideoElement.endTS = activeSong.end;
|
1374
|
+
activeVideoElement.name = activeSong.name;
|
1375
|
+
activeVideoElement.rating = activeSong.album;
|
1376
|
+
activeVideoElement.startSec = timestamp2seconds(activeSong.start);
|
1377
|
+
activeVideoElement.startTS = activeSong.start;
|
1378
|
+
activeVideoElement.url = activeSong.url;
|
1379
|
+
|
1380
|
+
var videoArray = activeSong.url.split('=');
|
1381
|
+
|
1382
|
+
activeVideoElement.videoID = videoArray[1];
|
1383
|
+
|
1384
|
+
}
|
1385
|
+
}
|
723
1386
|
}
|
724
1387
|
|
1388
|
+
// ---------------------------------------------------------------------------
|
1389
|
+
// isObjectEmpty(obj)
|
1390
|
+
//
|
1391
|
+
// ---------------------------------------------------------------------------
|
1392
|
+
function isObjectEmpty(obj) {
|
1393
|
+
for (const prop in obj) {
|
1394
|
+
if (Object.hasOwn(obj, prop)) {
|
1395
|
+
return false;
|
1396
|
+
}
|
1397
|
+
}
|
1398
|
+
|
1399
|
+
return true;
|
1400
|
+
} // END isObjectEmpty
|
1401
|
+
|
1402
|
+
// ---------------------------------------------------------------------------
|
1403
|
+
// getActiveSong()
|
1404
|
+
//
|
1405
|
+
// Returns the time in seconds calculated from a percentage value
|
1406
|
+
// NOTE: The percentage is out of [0.00 .. 1.00]
|
1407
|
+
// ---------------------------------------------------------------------------
|
1408
|
+
function getActiveSong() {
|
1409
|
+
|
1410
|
+
if(!isObjectEmpty(activeVideoElement)) {
|
1411
|
+
return activeVideoElement;
|
1412
|
+
}
|
1413
|
+
|
1414
|
+
return false;
|
1415
|
+
} // END getActiveSong
|
1416
|
+
|
1417
|
+
|
1418
|
+
// ---------------------------------------------------------------------------
|
1419
|
+
// updateProgressBarsYTP
|
1420
|
+
//
|
725
1421
|
// Update YTP specific progress data
|
726
1422
|
// ---------------------------------------------------------------------------
|
727
1423
|
function updateProgressBarsYTP() {
|
728
|
-
var progress
|
729
|
-
|
730
|
-
var progressBars = document.getElementsByClassName("large-player-progress");
|
1424
|
+
var progress, progressBars, playlist, playerID,
|
1425
|
+
classArray, classString, activePlayer, activeClass;
|
731
1426
|
|
1427
|
+
progressBars = document.getElementsByClassName("large-player-progress");
|
732
1428
|
for (var i=0; i<progressBars.length; i++) {
|
733
|
-
if (
|
734
|
-
//
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
1429
|
+
if (progressBars[i].dataset.amplitudeSource === 'audio') {
|
1430
|
+
// do nothing (managed by adapter)
|
1431
|
+
} else {
|
1432
|
+
playlist = progressBars[i].getAttribute("data-amplitude-playlist");
|
1433
|
+
playerID = playlist + '_large';
|
1434
|
+
classArray = [].slice.call(progressBars[i].classList, 0);
|
1435
|
+
classString = classArray.toString();
|
1436
|
+
activePlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
|
1437
|
+
activeClass = 'large-player-progress-' + playlist;
|
1438
|
+
|
1439
|
+
if (activePlayer === undefined) {
|
1440
|
+
logger.error('\n' + 'YT player not defined');
|
1441
|
+
return;
|
1442
|
+
}
|
1443
|
+
|
1444
|
+
if (classString.includes(activeClass)) {
|
1445
|
+
// calc procent value (float, 2 decimals [0.00 .. 1.00])
|
1446
|
+
progress = parseFloat((activePlayer.getCurrentTime() / activePlayer.getDuration()).toFixed(2));
|
1447
|
+
|
1448
|
+
// set current progess value if valid
|
1449
|
+
if (isFinite(progress)) {
|
1450
|
+
progressBars[i].value = progress;
|
1451
|
+
}
|
740
1452
|
}
|
741
1453
|
}
|
742
1454
|
} // END for
|
743
1455
|
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
// // jadams, 2024-12-07: added check on finite value
|
748
|
-
// if (!isFinite(progress)) {
|
749
|
-
// // TODO: check why progress value may NOT finite
|
750
|
-
// progressBar.value = 0;
|
751
|
-
// } else if (progress === 1) {
|
752
|
-
// // reset progress value for next video
|
753
|
-
// progressBar.value = 0;
|
754
|
-
// } else {
|
755
|
-
// // calculate current progress
|
756
|
-
// progress = parseFloat((ytPlayer.getCurrentTime() / ytPlayer.getDuration()).toFixed(2));
|
757
|
-
// progressBar.value = progress;
|
758
|
-
|
759
|
-
// save YT player progress data for later use (e.g. events)
|
760
|
-
// j1.adapter.amplitude.data.ytpGlobals['ytPlayerProgress'] = progress;
|
761
|
-
//}
|
762
|
-
}
|
1456
|
+
return;
|
1457
|
+
} // END updateProgressBarsYTP
|
763
1458
|
|
764
|
-
// Update YTP specific duration time data
|
765
1459
|
// ---------------------------------------------------------------------------
|
766
|
-
|
1460
|
+
// updateDurationTimeContainerYTP(player, playlist)
|
1461
|
+
//
|
1462
|
+
// update time container values for current video
|
1463
|
+
// ---------------------------------------------------------------------------
|
1464
|
+
function updateDurationTimeContainerYTP(player, playlist) {
|
767
1465
|
var hours, minutes, seconds;
|
768
1466
|
var durationHours, durationMinutes, durationSeconds;
|
1467
|
+
var activeSongSettings, ytPlayer, activePlaylist;
|
769
1468
|
|
770
|
-
//
|
771
|
-
|
772
|
-
|
773
|
-
|
1469
|
+
// update active song settings (manually)
|
1470
|
+
checkActiveVideoElementYTP();
|
1471
|
+
|
1472
|
+
// get active song settings (manually)
|
1473
|
+
activeSongSettings = getActiveSong();
|
1474
|
+
if (!activeSongSettings) {
|
1475
|
+
return false;
|
1476
|
+
}
|
1477
|
+
|
1478
|
+
ytPlayer = activeSongSettings.player;
|
1479
|
+
activePlaylist = activeSongSettings.playlist;
|
774
1480
|
|
775
|
-
//
|
1481
|
+
// if (activeSongSettings) {
|
1482
|
+
// ytPlayer = activeSongSettings.player;
|
1483
|
+
// activePlaylist = activeSongSettings.playlist;
|
1484
|
+
// } else {
|
1485
|
+
// ytPlayer = player;
|
1486
|
+
// activePlaylist = playlist;
|
1487
|
+
// }
|
1488
|
+
|
1489
|
+
// get current hours|minutes|seconds
|
776
1490
|
// -------------------------------------------------------------------------
|
1491
|
+
hours = ytpGetDurationHours(ytPlayer);
|
1492
|
+
minutes = ytpGetDurationMinutes(ytPlayer);
|
1493
|
+
seconds = ytpGetDurationSeconds(ytPlayer);
|
777
1494
|
|
778
1495
|
// update current duration|hours
|
1496
|
+
// -------------------------------------------------------------------------
|
779
1497
|
durationHours = document.getElementsByClassName("amplitude-duration-hours");
|
780
1498
|
if (durationHours.length && !isNaN(hours)) {
|
781
|
-
durationHours
|
1499
|
+
for (var i=0; i<durationHours.length; i++) {
|
1500
|
+
var currentPlaylist = durationHours[i].dataset.amplitudePlaylist;
|
1501
|
+
if (currentPlaylist === activePlaylist) {
|
1502
|
+
durationHours[i].innerHTML = hours;
|
1503
|
+
}
|
1504
|
+
}
|
782
1505
|
}
|
783
1506
|
|
784
1507
|
// update current duration|minutes
|
1508
|
+
// -------------------------------------------------------------------------
|
785
1509
|
durationMinutes = document.getElementsByClassName("amplitude-duration-minutes");
|
786
1510
|
if (durationMinutes.length && !isNaN(minutes)) {
|
787
|
-
durationMinutes
|
1511
|
+
for (var i=0; i<durationMinutes.length; i++) {
|
1512
|
+
var currentPlaylist = durationMinutes[i].dataset.amplitudePlaylist;
|
1513
|
+
if (currentPlaylist === activePlaylist) {
|
1514
|
+
durationMinutes[i].innerHTML = minutes;
|
1515
|
+
}
|
1516
|
+
}
|
788
1517
|
}
|
789
1518
|
|
790
1519
|
// update duration|seconds
|
1520
|
+
// -------------------------------------------------------------------------
|
791
1521
|
durationSeconds = document.getElementsByClassName("amplitude-duration-seconds");
|
792
1522
|
if (durationSeconds.length && !isNaN(seconds)) {
|
793
|
-
durationSeconds
|
1523
|
+
for (var i=0; i<durationSeconds.length; i++) {
|
1524
|
+
var currentPlaylist = durationSeconds[i].dataset.amplitudePlaylist;
|
1525
|
+
if (currentPlaylist === activePlaylist) {
|
1526
|
+
durationSeconds[i].innerHTML = seconds;
|
1527
|
+
}
|
1528
|
+
}
|
794
1529
|
}
|
795
|
-
}
|
796
1530
|
|
797
|
-
|
1531
|
+
return;
|
1532
|
+
} // END updateDurationTimeContainerYTP
|
1533
|
+
|
1534
|
+
// ---------------------------------------------------------------------------
|
1535
|
+
// updateCurrentTimeContainerYTP(player, metaData)
|
1536
|
+
//
|
1537
|
+
// update time container values for current video
|
798
1538
|
// ---------------------------------------------------------------------------
|
799
|
-
function updateCurrentTimeContainerYTP() {
|
1539
|
+
function updateCurrentTimeContainerYTP(player, playlist) {
|
800
1540
|
var hours, minutes, seconds;
|
801
1541
|
var currentHours, currentMinutes, currentSeconds;
|
802
1542
|
|
803
1543
|
// get current hours|minutes|seconds
|
804
|
-
hours = ytpGetCurrentHours(
|
805
|
-
minutes = ytpGetCurrentMinutes(
|
806
|
-
seconds = ytpGetCurrentSeconds(
|
807
|
-
|
808
|
-
// update time container values for current video
|
809
|
-
// -------------------------------------------------------------------------
|
1544
|
+
hours = ytpGetCurrentHours(player);
|
1545
|
+
minutes = ytpGetCurrentMinutes(player);
|
1546
|
+
seconds = ytpGetCurrentSeconds(player);
|
810
1547
|
|
811
1548
|
// update current duration|hours
|
1549
|
+
// -------------------------------------------------------------------------
|
812
1550
|
if (hours !== '00') {
|
813
1551
|
currentHours = document.getElementsByClassName("amplitude-current-hours");
|
814
|
-
currentHours
|
1552
|
+
if (currentHours.length) {
|
1553
|
+
for (var i=0; i<currentHours.length; i++) {
|
1554
|
+
var currentPlaylist = currentHours[i].dataset.amplitudePlaylist;
|
1555
|
+
if (currentPlaylist === playlist) {
|
1556
|
+
currentHours[i].innerHTML = hours;
|
1557
|
+
}
|
1558
|
+
}
|
1559
|
+
}
|
815
1560
|
}
|
816
1561
|
|
817
1562
|
// update current duration|minutes
|
1563
|
+
// -------------------------------------------------------------------------
|
818
1564
|
currentMinutes = document.getElementsByClassName("amplitude-current-minutes");
|
819
|
-
currentMinutes
|
820
|
-
|
1565
|
+
if (currentMinutes.length) {
|
1566
|
+
for (var i=0; i<currentMinutes.length; i++) {
|
1567
|
+
var currentPlaylist = currentMinutes[i].dataset.amplitudePlaylist;
|
1568
|
+
if (currentPlaylist === playlist) {
|
1569
|
+
currentMinutes[i].innerHTML = minutes;
|
1570
|
+
}
|
1571
|
+
}
|
1572
|
+
}
|
1573
|
+
|
821
1574
|
// update duration|seconds
|
1575
|
+
// -------------------------------------------------------------------------
|
822
1576
|
currentSeconds = document.getElementsByClassName("amplitude-current-seconds");
|
823
|
-
currentSeconds
|
824
|
-
|
1577
|
+
if (currentSeconds.length) {
|
1578
|
+
for (var i=0; i<currentSeconds.length; i++) {
|
1579
|
+
var currentPlaylist = currentSeconds[i].dataset.amplitudePlaylist;
|
1580
|
+
if (currentPlaylist === playlist) {
|
1581
|
+
currentSeconds[i].innerHTML = seconds;
|
1582
|
+
}
|
1583
|
+
}
|
1584
|
+
}
|
1585
|
+
|
1586
|
+
return;
|
1587
|
+
} // END updateCurrentTimeContainerYTP
|
825
1588
|
|
826
|
-
// Reset YTP specific progress data
|
827
1589
|
// ---------------------------------------------------------------------------
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
1590
|
+
// resetProgressBarYTP()
|
1591
|
+
//
|
1592
|
+
// Reset ALL progress bars
|
1593
|
+
// ---------------------------------------------------------------------------
|
1594
|
+
function resetProgressBarYTP() {
|
1595
|
+
var progressBars = document.getElementsByClassName("large-player-progress");
|
1596
|
+
for (var i=0; i<progressBars.length; i++) {
|
1597
|
+
progressBars[i].value = 0;
|
832
1598
|
}
|
833
|
-
}
|
1599
|
+
} // END resetProgressBarYTP
|
834
1600
|
|
835
|
-
// Reset YTP specific CURRENT time data
|
836
1601
|
// ---------------------------------------------------------------------------
|
837
|
-
|
1602
|
+
// resetCurrentTimeContainerYTP
|
1603
|
+
//
|
1604
|
+
// Reset YTP specific CURRENT time data
|
1605
|
+
// ---------------------------------------------------------------------------
|
1606
|
+
function resetCurrentTimeContainerYTP(player, playlist) {
|
838
1607
|
|
839
1608
|
// reset duration|hours
|
840
1609
|
var currentHours = document.getElementsByClassName("amplitude-current-hours");
|
841
1610
|
if (currentHours.length) {
|
842
|
-
currentHours
|
1611
|
+
for (var i=0; i<currentHours.length; i++) {
|
1612
|
+
var currentPlaylist = currentHours[i].dataset.amplitudePlaylist;
|
1613
|
+
if (currentPlaylist === playlist) {
|
1614
|
+
currentHours[i].innerHTML = '00';
|
1615
|
+
}
|
1616
|
+
}
|
843
1617
|
}
|
844
1618
|
|
845
1619
|
// reset duration|minutes
|
846
1620
|
var currentMinutes = document.getElementsByClassName("amplitude-current-minutes");
|
847
|
-
currentMinutes
|
1621
|
+
if (currentMinutes.length) {
|
1622
|
+
for (var i=0; i<currentHours.length; i++) {
|
1623
|
+
var currentPlaylist = currentMinutes[i].dataset.amplitudePlaylist;
|
1624
|
+
if (currentPlaylist === playlist) {
|
1625
|
+
currentMinutes[i].innerHTML = '00';
|
1626
|
+
}
|
1627
|
+
}
|
1628
|
+
}
|
848
1629
|
|
849
1630
|
// reset duration|seconds
|
850
1631
|
var currentSeconds = document.getElementsByClassName("amplitude-current-seconds");
|
851
|
-
currentSeconds
|
852
|
-
|
1632
|
+
if (currentSeconds.length) {
|
1633
|
+
for (var i=0; i<currentSeconds.length; i++) {
|
1634
|
+
var currentPlaylist = currentSeconds[i].dataset.amplitudePlaylist;
|
1635
|
+
if (currentPlaylist === playlist) {
|
1636
|
+
currentSeconds[i].innerHTML = '00';
|
1637
|
+
}
|
1638
|
+
}
|
1639
|
+
}
|
1640
|
+
|
1641
|
+
return;
|
1642
|
+
} // END resetCurrentTimeContainerYTP
|
853
1643
|
|
854
1644
|
|
855
1645
|
// ---------------------------------------------------------------------------
|
856
1646
|
// Mimik Base AJS API functions
|
1647
|
+
// ===========================================================================
|
1648
|
+
|
857
1649
|
// ---------------------------------------------------------------------------
|
1650
|
+
// ytpLoadVideById
|
1651
|
+
//
|
1652
|
+
// ???????
|
1653
|
+
// ---------------------------------------------------------------------------
|
1654
|
+
function ytpLoadVideoById(player, id, bufferQuote) {
|
1655
|
+
const cycle = 250;
|
1656
|
+
|
1657
|
+
player.loadVideoById(id);
|
1658
|
+
|
1659
|
+
const videoLoaded = setInterval(() => {
|
1660
|
+
bufferQuote = ytpGetBuffered(player);
|
858
1661
|
|
859
|
-
|
1662
|
+
if (bufferQuote >= 3) {
|
1663
|
+
return true;
|
1664
|
+
|
1665
|
+
clearInterval(videoLoaded);
|
1666
|
+
} else {
|
1667
|
+
return false;
|
1668
|
+
}
|
1669
|
+
}, cycle);
|
1670
|
+
|
1671
|
+
} // END ytpLoadVideoById
|
1672
|
+
|
1673
|
+
// ---------------------------------------------------------------------------
|
1674
|
+
// ytpSeekTo
|
1675
|
+
//
|
1676
|
+
// Seek (skip) video to specified time (position)
|
860
1677
|
// ---------------------------------------------------------------------------
|
861
|
-
function ytpSeekTo(player, time) {
|
862
|
-
|
1678
|
+
function ytpSeekTo(player, time, seekAhead) {
|
1679
|
+
// const allowSeekAhead = true;
|
1680
|
+
// var buffered = ytpGetBuffered(player);
|
1681
|
+
|
1682
|
+
if (player.id !== undefined) {
|
1683
|
+
player.seekTo(time, seekAhead);
|
1684
|
+
// player.seekTo(time);
|
1685
|
+
|
1686
|
+
return true;
|
1687
|
+
} else {
|
1688
|
+
return false;
|
1689
|
+
}
|
1690
|
+
|
863
1691
|
} // END ytpSeekTo
|
864
1692
|
|
865
|
-
|
1693
|
+
|
1694
|
+
// ---------------------------------------------------------------------------
|
1695
|
+
// ytpGetBuffered
|
1696
|
+
//
|
1697
|
+
// Returns the buffered percentage of the video currently playing
|
866
1698
|
// ---------------------------------------------------------------------------
|
867
1699
|
function ytpGetBuffered(player) {
|
868
|
-
// to be defined
|
869
|
-
}
|
870
1700
|
|
1701
|
+
return (player.getVideoLoadedFraction() * 100).toFixed(2);
|
1702
|
+
} // END ytpGetBuffered
|
1703
|
+
|
1704
|
+
// ---------------------------------------------------------------------------
|
1705
|
+
// ytpGetActiveIndex
|
1706
|
+
//
|
871
1707
|
// Returns the active song index (in the songs array, starts by 0)
|
872
1708
|
// ---------------------------------------------------------------------------
|
873
1709
|
function ytpGetActiveIndex(playerID) {
|
@@ -880,6 +1716,10 @@ var progress;
|
|
880
1716
|
return activeIndex;
|
881
1717
|
} // END ytpGetActiveIndex
|
882
1718
|
|
1719
|
+
|
1720
|
+
// ---------------------------------------------------------------------------
|
1721
|
+
// ytpSetActiveIndex
|
1722
|
+
//
|
883
1723
|
// Set the index of the active song (index starts by 0)
|
884
1724
|
// ---------------------------------------------------------------------------
|
885
1725
|
function ytpSetActiveIndex(playerID, idx) {
|
@@ -894,35 +1734,45 @@ var progress;
|
|
894
1734
|
return success;
|
895
1735
|
} // END ytpSetActiveIndex
|
896
1736
|
|
1737
|
+
// ---------------------------------------------------------------------------
|
1738
|
+
// ytpGetPlayedPercentage
|
1739
|
+
//
|
897
1740
|
// Returns the percentage of the video played
|
898
1741
|
// ---------------------------------------------------------------------------
|
899
1742
|
function ytpGetPlayedPercentage(player) {
|
900
|
-
//
|
901
|
-
}
|
1743
|
+
// tbd
|
1744
|
+
} // END ytpGetPlayedPercentage
|
902
1745
|
|
1746
|
+
// ---------------------------------------------------------------------------
|
1747
|
+
// ytpGetAudio
|
1748
|
+
//
|
903
1749
|
// Returns the actual video element
|
904
1750
|
// ---------------------------------------------------------------------------
|
905
1751
|
function ytpGetAudio(player) {
|
906
|
-
//
|
907
|
-
}
|
1752
|
+
// tbd
|
1753
|
+
} // END ytpGetAudio
|
908
1754
|
|
1755
|
+
// ---------------------------------------------------------------------------
|
1756
|
+
// ytpGetPlaybackSpeeds
|
1757
|
+
//
|
909
1758
|
// Returns available playback speeds for the player
|
910
1759
|
// ---------------------------------------------------------------------------
|
911
1760
|
function ytpGetPlaybackSpeeds(player) {
|
912
|
-
//
|
913
|
-
}
|
1761
|
+
// tbd
|
1762
|
+
} // END ytpGetPlaybackSpeeds
|
914
1763
|
|
915
|
-
// Returns the current playback speed for the player
|
916
1764
|
// ---------------------------------------------------------------------------
|
917
|
-
|
918
|
-
|
919
|
-
|
1765
|
+
// ytpGetPlayerState
|
1766
|
+
//
|
920
1767
|
// Returns the current state of the player
|
921
1768
|
// ---------------------------------------------------------------------------
|
922
1769
|
function ytpGetPlayerState(player) {
|
923
|
-
//
|
924
|
-
}
|
1770
|
+
// tbd
|
1771
|
+
} // END ytpGetPlayerState
|
925
1772
|
|
1773
|
+
// ---------------------------------------------------------------------------
|
1774
|
+
// ytpGetDuration
|
1775
|
+
//
|
926
1776
|
// Returns the duration of the video
|
927
1777
|
// ---------------------------------------------------------------------------
|
928
1778
|
function ytpGetDuration(player) {
|
@@ -938,6 +1788,9 @@ var progress;
|
|
938
1788
|
}
|
939
1789
|
} // END ytpGetDuration
|
940
1790
|
|
1791
|
+
// ---------------------------------------------------------------------------
|
1792
|
+
// ytpGetCurrentTime
|
1793
|
+
//
|
941
1794
|
// Returns the current time of the video played
|
942
1795
|
// ---------------------------------------------------------------------------
|
943
1796
|
function ytpGetCurrentTime(player) {
|
@@ -955,6 +1808,9 @@ var progress;
|
|
955
1808
|
}
|
956
1809
|
} // END ytpGetCurrentTime
|
957
1810
|
|
1811
|
+
// ---------------------------------------------------------------------------
|
1812
|
+
// ytpGetDurationHours
|
1813
|
+
//
|
958
1814
|
// Returns the duration hours of the video
|
959
1815
|
// ---------------------------------------------------------------------------
|
960
1816
|
function ytpGetDurationHours(player) {
|
@@ -975,6 +1831,9 @@ var progress;
|
|
975
1831
|
}
|
976
1832
|
} // END ytpGetDurationHours
|
977
1833
|
|
1834
|
+
// ---------------------------------------------------------------------------
|
1835
|
+
// ytpGetDurationMinutes
|
1836
|
+
//
|
978
1837
|
// Returns the duration minutes of the video
|
979
1838
|
// ---------------------------------------------------------------------------
|
980
1839
|
function ytpGetDurationMinutes(player) {
|
@@ -995,6 +1854,10 @@ var progress;
|
|
995
1854
|
}
|
996
1855
|
} // END ytpGetDurationMinutes
|
997
1856
|
|
1857
|
+
|
1858
|
+
// ---------------------------------------------------------------------------
|
1859
|
+
// ytpGetDurationSeconds
|
1860
|
+
//
|
998
1861
|
// Returns the duration seconds of the video
|
999
1862
|
// ---------------------------------------------------------------------------
|
1000
1863
|
function ytpGetDurationSeconds(player) {
|
@@ -1015,6 +1878,9 @@ var progress;
|
|
1015
1878
|
}
|
1016
1879
|
} // END ytpGetDurationSeconds
|
1017
1880
|
|
1881
|
+
// ---------------------------------------------------------------------------
|
1882
|
+
// ytpGetCurrentHours
|
1883
|
+
//
|
1018
1884
|
// Returns the current hours the user is into the video
|
1019
1885
|
// ---------------------------------------------------------------------------
|
1020
1886
|
function ytpGetCurrentHours(player) {
|
@@ -1035,6 +1901,9 @@ var progress;
|
|
1035
1901
|
}
|
1036
1902
|
} // END ytpGetCurrentHours
|
1037
1903
|
|
1904
|
+
// ---------------------------------------------------------------------------
|
1905
|
+
// ytpGetCurrentMinutes
|
1906
|
+
//
|
1038
1907
|
// Returns the current minutes the user is into the video
|
1039
1908
|
// ---------------------------------------------------------------------------
|
1040
1909
|
function ytpGetCurrentMinutes (player) {
|
@@ -1055,6 +1924,9 @@ var progress;
|
|
1055
1924
|
}
|
1056
1925
|
} // END ytpGetCurrentMinutes
|
1057
1926
|
|
1927
|
+
// ---------------------------------------------------------------------------
|
1928
|
+
// ytpGetCurrentSeconds
|
1929
|
+
//
|
1058
1930
|
// Returns the current seconds the user is into the video
|
1059
1931
|
// ---------------------------------------------------------------------------
|
1060
1932
|
function ytpGetCurrentSeconds(player) {
|
@@ -1076,10 +1948,81 @@ var progress;
|
|
1076
1948
|
} // END ytpGetCurrentSeconds
|
1077
1949
|
|
1078
1950
|
// ---------------------------------------------------------------------------
|
1079
|
-
//
|
1080
|
-
//
|
1951
|
+
// togglePlayPauseButton
|
1952
|
+
//
|
1953
|
+
// toggle button play|pause
|
1954
|
+
// ---------------------------------------------------------------------------
|
1955
|
+
function togglePlayPauseButton(elementClass) {
|
1956
|
+
var button, htmlElement;
|
1957
|
+
|
1958
|
+
button = document.getElementsByClassName(elementClass);
|
1959
|
+
|
1960
|
+
if (button.length) {
|
1961
|
+
htmlElement = button[0];
|
1962
|
+
|
1963
|
+
if (htmlElement.classList.contains('amplitude-paused')) {
|
1964
|
+
htmlElement.classList.remove('amplitude-paused');
|
1965
|
+
htmlElement.classList.add('amplitude-playing');
|
1966
|
+
} else {
|
1967
|
+
htmlElement.classList.remove('amplitude-playing');
|
1968
|
+
htmlElement.classList.add('amplitude-paused');
|
1969
|
+
}
|
1970
|
+
} else {
|
1971
|
+
return false;
|
1972
|
+
}
|
1973
|
+
|
1974
|
+
} // END togglePlayPauseButton
|
1975
|
+
|
1976
|
+
// ---------------------------------------------------------------------------
|
1977
|
+
// setPlayPauseButtonPaused
|
1978
|
+
// ---------------------------------------------------------------------------
|
1979
|
+
function setPlayPauseButtonPaused(elementClass) {
|
1980
|
+
var button, htmlElement;
|
1981
|
+
|
1982
|
+
button = document.getElementsByClassName(elementClass);
|
1983
|
+
htmlElement = button[0];
|
1984
|
+
|
1985
|
+
htmlElement.classList.remove('amplitude-playing');
|
1986
|
+
htmlElement.classList.add('amplitude-paused');
|
1987
|
+
|
1988
|
+
} // END setPlayPauseButtonPaused
|
1989
|
+
|
1990
|
+
// ---------------------------------------------------------------------------
|
1991
|
+
// setPlayPauseButtonPlaying
|
1992
|
+
// ---------------------------------------------------------------------------
|
1993
|
+
function setPlayPauseButtonPlaying(elementClass) {
|
1994
|
+
var button, htmlElement;
|
1995
|
+
|
1996
|
+
button = document.getElementsByClassName(elementClass);
|
1997
|
+
htmlElement = button[0];
|
1998
|
+
|
1999
|
+
htmlElement.classList.remove('amplitude-paused');
|
2000
|
+
htmlElement.classList.add('amplitude-playing');
|
2001
|
+
|
2002
|
+
} // END setPlayPauseButtonPlaying
|
2003
|
+
|
1081
2004
|
// ---------------------------------------------------------------------------
|
2005
|
+
// scrollToActiveElement(playlist)
|
2006
|
+
// ---------------------------------------------------------------------------
|
2007
|
+
function scrollToActiveElement(activePlaylist) {
|
2008
|
+
const scrollableList = document.getElementById('large_player_title_list_' + activePlaylist);
|
2009
|
+
const activeElement = scrollableList.querySelector('.amplitude-active-song-container');
|
2010
|
+
var activeElementOffsetTop = activeElement.offsetTop;
|
2011
|
+
var songIndex = parseInt(activeElement.getAttribute("data-amplitude-song-index"));
|
2012
|
+
var activeElementOffsetTop = songIndex * j1.adapter.amplitude.data.playerSongElementHeigth;
|
2013
|
+
|
2014
|
+
if (scrollableList && activeElement) {
|
2015
|
+
scrollableList.scrollTop = activeElementOffsetTop;
|
2016
|
+
}
|
2017
|
+
} // END scrollToActiveElement
|
2018
|
+
|
2019
|
+
// ---------------------------------------------------------------------------
|
2020
|
+
// mimikYTPlayerUiEventsForAJS
|
2021
|
+
//
|
2022
|
+
// Mimik AJS button events for YT video
|
2023
|
+
// ---------------------------------------------------------------------------
|
1082
2024
|
function mimikYTPlayerUiEventsForAJS(ytPlayerID) {
|
2025
|
+
|
1083
2026
|
if (j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID] !== undefined) {
|
1084
2027
|
var playerDefaults = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].playerDefaults;
|
1085
2028
|
var playerSettings = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].playerSettings;
|
@@ -1087,59 +2030,198 @@ var progress;
|
|
1087
2030
|
|
1088
2031
|
// -----------------------------------------------------------------------
|
1089
2032
|
// Large AJS players
|
1090
|
-
//
|
1091
|
-
if (j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].playerSettings.type === 'large') {
|
2033
|
+
// -----------------------------------------------------------------------
|
2034
|
+
if (j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].playerSettings.type === 'large') {
|
2035
|
+
var playlist = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].playerSettings.playlist.name;
|
2036
|
+
var playerScrollList = document.getElementById('large_player_title_list_' + playlist);
|
2037
|
+
|
2038
|
+
if (playerScrollControl) {
|
2039
|
+
var listItemHeight = playerSongElementHeigth/2;
|
2040
|
+
var itemsPerBlock = 1;
|
2041
|
+
var isScrollingResetDelay = 150;
|
2042
|
+
var isScrolling = false;
|
2043
|
+
|
2044
|
+
playerScrollList.addEventListener('scroll', (event) => {
|
2045
|
+
// block multiple scroll events (while scrolling)
|
2046
|
+
if (isScrolling) {
|
2047
|
+
return;
|
2048
|
+
}
|
2049
|
+
isScrolling = true;
|
2050
|
+
|
2051
|
+
// calculate number of blocks already scrolled
|
2052
|
+
const scrolledBlocks = Math.round(list.scrollTop / (listItemHeight * itemsPerBlock));
|
2053
|
+
|
2054
|
+
// calculate top position based on number of blocks
|
2055
|
+
const targetScrollTop = scrolledBlocks * listItemHeight * itemsPerBlock;
|
2056
|
+
|
2057
|
+
// smooth scrolling
|
2058
|
+
list.scrollTo({
|
2059
|
+
top: targetScrollTop,
|
2060
|
+
behavior: 'smooth'
|
2061
|
+
});
|
2062
|
+
|
2063
|
+
// reset the scrolling flags
|
2064
|
+
setTimeout(() => {
|
2065
|
+
isScrolling = false;
|
2066
|
+
}, isScrollingResetDelay);
|
2067
|
+
});
|
2068
|
+
}
|
1092
2069
|
|
1093
2070
|
// Overload AJS play_pause button for YT
|
1094
|
-
//
|
2071
|
+
// TODO: Fix for multiple players in page
|
2072
|
+
// ---------------------------------------------------------------------
|
1095
2073
|
var largePlayerPlayPauseButton = document.getElementsByClassName(playerButton);
|
1096
|
-
for (var i=0; i<largePlayerPlayPauseButton.length; i++) {
|
2074
|
+
for (var i=0; i<largePlayerPlayPauseButton.length; i++) {
|
1097
2075
|
var classArray = [].slice.call(largePlayerPlayPauseButton[i].classList, 0);
|
1098
2076
|
var classString = classArray.toString();
|
1099
2077
|
|
1100
2078
|
if (classString.includes(ytPlayerID)) {
|
1101
2079
|
largePlayerPlayPauseButton[i].addEventListener('click', function(event) {
|
1102
|
-
var
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
2080
|
+
var activeSongSettings, songs, songMetaData, ytPlayer,
|
2081
|
+
playlist, playerID, songIndex;
|
2082
|
+
|
2083
|
+
playlist = this.getAttribute("data-amplitude-playlist");
|
2084
|
+
playerID = playlist + '_large';
|
2085
|
+
|
2086
|
+
// update active song settings (manually)
|
2087
|
+
checkActiveVideoElementYTP();
|
2088
|
+
|
2089
|
+
// get active song settings (manually)
|
2090
|
+
activeSongSettings = getActiveSong();
|
2091
|
+
|
2092
|
+
// TODO: Extend getSongIndex() for singleAudio
|
2093
|
+
// var songIndex = (singleAudio) ? ytpSongIndex : getSongIndex(songs, ytVideoID);
|
2094
|
+
if (!activeSongSettings) {
|
2095
|
+
songIndex = 0;
|
2096
|
+
ytpSongIndex = 0;
|
1113
2097
|
} else {
|
1114
|
-
|
2098
|
+
|
2099
|
+
// ytPlayerCurrentTime = activeSongSettings.currentTime;
|
2100
|
+
|
2101
|
+
if (activeSongSettings.playlist !== playlist) {
|
2102
|
+
songIndex = 0;
|
2103
|
+
ytpSongIndex = 0;
|
2104
|
+
|
2105
|
+
// reset previous player settings
|
2106
|
+
if (activeSongSettings.player !== undefined) {
|
2107
|
+
activeSongSettings.player.stopVideo();
|
2108
|
+
var playPauseButtonClass = `large-player-play-pause-${activeSongSettings.playerID}`;
|
2109
|
+
togglePlayPauseButton(playPauseButtonClass);
|
2110
|
+
}
|
2111
|
+
} else {
|
2112
|
+
songIndex = ytpSongIndex;
|
2113
|
+
}
|
1115
2114
|
}
|
1116
2115
|
|
1117
|
-
//
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
2116
|
+
// set song (video) active at index in playlist
|
2117
|
+
setSongActive(playlist, songIndex);
|
2118
|
+
|
2119
|
+
// reset progress bar settings
|
2120
|
+
resetProgressBarYTP();
|
2121
|
+
|
2122
|
+
// scroll song active at index in player
|
2123
|
+
if (playerAutoScrollSongElement) {
|
2124
|
+
scrollToActiveElement(playlist);
|
2125
|
+
}
|
2126
|
+
|
2127
|
+
// update activeAudio data (manually)
|
2128
|
+
checkActiveVideoElementYTP();
|
2129
|
+
|
2130
|
+
// get active song settings (manually)
|
2131
|
+
activeSongSettings = getActiveSong();
|
2132
|
+
|
2133
|
+
songs = activeSongSettings.songs;
|
2134
|
+
songMetaData = songs[songIndex];
|
2135
|
+
ytPlayer = activeSongSettings.player;
|
2136
|
+
|
2137
|
+
// update meta data
|
2138
|
+
updatMetaContainers(songMetaData);
|
2139
|
+
|
2140
|
+
// save player GLOBAL data for later use (e.g. events)
|
2141
|
+
j1.adapter.amplitude.data.activePlayer = 'ytp';
|
2142
|
+
j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
|
2143
|
+
j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
|
2144
|
+
|
2145
|
+
// YT play|pause video
|
2146
|
+
// ---------------------------------------------------------------
|
2147
|
+
var playerState = ytPlayer.getPlayerState();
|
2148
|
+
if (playerState < 0) {
|
2149
|
+
var ytPlayerState = YT_PLAYER_STATE_NAMES[6];
|
1122
2150
|
} else {
|
1123
|
-
|
1124
|
-
|
2151
|
+
var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
|
2152
|
+
}
|
2153
|
+
|
2154
|
+
if (ytPlayerState === 'playing') {
|
2155
|
+
ytPlayer.pauseVideo();
|
2156
|
+
|
2157
|
+
ytPlayerCurrentTime = ytPlayer.getCurrentTime();
|
2158
|
+
|
2159
|
+
var trackID = songIndex + 1;
|
2160
|
+
logger.debug('\n' + `PAUSE video for PlayPauseButton on playlist|trackID: ${playlist}|${trackID} at: ${ytPlayerCurrentTime}`);
|
2161
|
+
|
2162
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2163
|
+
togglePlayPauseButton(playPauseButtonClass);
|
2164
|
+
|
2165
|
+
// reset|update time settings
|
2166
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2167
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
2168
|
+
}
|
2169
|
+
|
2170
|
+
if (ytPlayerState === 'paused') {
|
2171
|
+
ytPlayer.playVideo();
|
2172
|
+
ytpSeekTo(ytPlayer, ytPlayerCurrentTime, true);
|
2173
|
+
|
2174
|
+
var trackID = songIndex + 1;
|
2175
|
+
logger.debug('\n' + `PLAY video for PlayPauseButton on playlist|trackID: ${playlist}|${trackID} at: ${ytPlayerCurrentTime}`);
|
2176
|
+
|
2177
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2178
|
+
togglePlayPauseButton(playPauseButtonClass);
|
2179
|
+
|
2180
|
+
// reset|update time settings
|
2181
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2182
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
1125
2183
|
}
|
1126
2184
|
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1130
|
-
|
1131
|
-
|
1132
|
-
|
2185
|
+
if (ytPlayerState === 'cued') {
|
2186
|
+
ytPlayer.playVideo();
|
2187
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2188
|
+
togglePlayPauseButton(playPauseButtonClass);
|
2189
|
+
|
2190
|
+
// set song at songIndex active in playlist
|
2191
|
+
setSongActive(playlist, songIndex);
|
2192
|
+
|
2193
|
+
// scroll song active at index in player
|
2194
|
+
if (playerAutoScrollSongElement) {
|
2195
|
+
scrollToActiveElement(playlist);
|
2196
|
+
}
|
2197
|
+
|
2198
|
+
// reset|update time settings
|
2199
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2200
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
2201
|
+
}
|
2202
|
+
|
2203
|
+
// TODO: unclear why state 'unstarted' is generated
|
2204
|
+
// on LAST item
|
2205
|
+
// workaround sofar
|
2206
|
+
if (ytPlayerState === 'unstarted') {
|
2207
|
+
ytPlayer.playVideo();
|
2208
|
+
// ytPlayer.mute();
|
2209
|
+
|
2210
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2211
|
+
togglePlayPauseButton(playPauseButtonClass);
|
2212
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2213
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
1133
2214
|
}
|
1134
2215
|
|
1135
|
-
//
|
1136
|
-
event.stopImmediatePropagation();
|
2216
|
+
// deactivate AJS events (if any)
|
2217
|
+
event.stopImmediatePropagation();
|
1137
2218
|
}); // END EventListener largePlayerPlayPauseButton 'click'
|
1138
|
-
}
|
2219
|
+
}
|
1139
2220
|
} // END for largePlayerPlayPauseButton
|
1140
2221
|
|
1141
2222
|
// Overload AJS largePlayerSkipBackward button for YT
|
1142
|
-
//
|
2223
|
+
// TODO: Fix for multiple players in page
|
2224
|
+
// ---------------------------------------------------------------------
|
1143
2225
|
var largePlayerSkipForwardButtons = document.getElementsByClassName("large-player-skip-forward");
|
1144
2226
|
for (var i=0; i<largePlayerSkipForwardButtons.length; i++) {
|
1145
2227
|
var classArray = [].slice.call(largePlayerSkipForwardButtons[i].classList, 0);
|
@@ -1148,19 +2230,19 @@ var progress;
|
|
1148
2230
|
// load player settings
|
1149
2231
|
var playerForwardBackwardSkipSeconds = (playerSettings.forward_backward_skip_seconds === undefined) ? playerDefaults.forward_backward_skip_seconds : playerSettings.forward_backward_skip_seconds;
|
1150
2232
|
|
1151
|
-
// if (largePlayerSkipForwardButtons[i].id === 'skip-forward_' + ytPlayerID) {
|
1152
|
-
// if (classString.includes(ytPlayerID)) && largePlayerSkipForwardButtons[i].id === 'skip-forkward_' + ytPlayerID) {
|
1153
2233
|
if (classString.includes(ytPlayerID)) {
|
1154
2234
|
largePlayerSkipForwardButtons[i].addEventListener('click', function(event) {
|
1155
|
-
var
|
2235
|
+
var currentVideoTime, playerState, skipOffset, ytPlayer;
|
1156
2236
|
|
1157
|
-
skipOffset
|
1158
|
-
ytPlayer
|
1159
|
-
playerState
|
1160
|
-
|
2237
|
+
skipOffset = parseInt(playerForwardBackwardSkipSeconds);
|
2238
|
+
ytPlayer = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].player;
|
2239
|
+
playerState = ytPlayer.getPlayerState();
|
2240
|
+
currentVideoTime = ytPlayer.getCurrentTime();
|
1161
2241
|
|
1162
2242
|
if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) {
|
1163
|
-
|
2243
|
+
logger.debug('\n' + `SKIP forward on Button skipForward for ${skipOffset} seconds`);
|
2244
|
+
ytpSeekTo(ytPlayer, currentVideoTime + skipOffset, true);
|
2245
|
+
|
1164
2246
|
}
|
1165
2247
|
|
1166
2248
|
// deactivate AJS events (if any)
|
@@ -1170,7 +2252,8 @@ var progress;
|
|
1170
2252
|
} // END for
|
1171
2253
|
|
1172
2254
|
// Overload AJS largePlayerSkipBackward button for YT
|
1173
|
-
//
|
2255
|
+
// TODO: Fix for multiple players in page
|
2256
|
+
// ---------------------------------------------------------------------
|
1174
2257
|
var largePlayerSkipBackwardButtons = document.getElementsByClassName("large-player-skip-backward");
|
1175
2258
|
for (var i=0; i<largePlayerSkipBackwardButtons.length; i++) {
|
1176
2259
|
var classArray = [].slice.call(largePlayerSkipBackwardButtons[i].classList, 0);
|
@@ -1181,29 +2264,28 @@ var progress;
|
|
1181
2264
|
|
1182
2265
|
if (classString.includes(ytPlayerID)) {
|
1183
2266
|
largePlayerSkipBackwardButtons[i].addEventListener('click', function(event) {
|
1184
|
-
var
|
2267
|
+
var currentVideoTime, playerState, skipOffset, ytPlayer;
|
1185
2268
|
|
1186
|
-
skipOffset
|
1187
|
-
ytPlayer
|
1188
|
-
playerState
|
1189
|
-
|
2269
|
+
skipOffset = parseInt(playerForwardBackwardSkipSeconds);
|
2270
|
+
ytPlayer = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].player;
|
2271
|
+
playerState = ytPlayer.getPlayerState();
|
2272
|
+
currentVideoTime = ytPlayer.getCurrentTime();
|
1190
2273
|
|
1191
2274
|
if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) {
|
1192
|
-
|
2275
|
+
logger.debug('\n' + `SKIP backward on Button skipBackward for ${skipOffset} seconds`);
|
2276
|
+
ytpSeekTo(ytPlayer, currentVideoTime - skipOffset, true);
|
1193
2277
|
}
|
1194
2278
|
|
1195
2279
|
// deactivate AJS events (if any)
|
1196
2280
|
event.stopImmediatePropagation();
|
1197
2281
|
}); // END Listener 'click'
|
1198
2282
|
} // END if skip-backward button
|
1199
|
-
} // END for
|
2283
|
+
} // END for
|
1200
2284
|
|
2285
|
+
// Overload AJS largePlayerNext button for YT
|
1201
2286
|
// click on (player) next button
|
1202
2287
|
// TODO: Fix for multiple players in page
|
1203
|
-
//
|
1204
|
-
|
1205
|
-
// Overload AJS largePlayerNext button for YT
|
1206
|
-
//
|
2288
|
+
// ---------------------------------------------------------------------
|
1207
2289
|
var largePlayerNextButton = document.getElementsByClassName("large-player-next");
|
1208
2290
|
for (var i=0; i<largePlayerNextButton.length; i++) {
|
1209
2291
|
var classArray = [].slice.call(largePlayerNextButton[i].classList, 0);
|
@@ -1211,426 +2293,563 @@ var progress;
|
|
1211
2293
|
|
1212
2294
|
if (classString.includes(ytPlayerID)) {
|
1213
2295
|
largePlayerNextButton[i].addEventListener('click', function(event) {
|
1214
|
-
var
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
if (songIndex < songs.length-1) {
|
1227
|
-
// set song on next item
|
1228
|
-
songIndex++;
|
1229
|
-
ytpSongIndex = songIndex;
|
1230
|
-
|
1231
|
-
// j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
|
2296
|
+
var playlist, playerID, songIndex, trackID,
|
2297
|
+
songs, songMetaData, songName, songURL,
|
2298
|
+
ytPlayer, ytpVideoID;
|
2299
|
+
|
2300
|
+
songIndex = ytpSongIndex;
|
2301
|
+
playlist = this.getAttribute("data-amplitude-playlist");
|
2302
|
+
playerID = playlist + '_large';
|
2303
|
+
songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
|
2304
|
+
ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
|
2305
|
+
|
2306
|
+
if (ytPlayer === undefined) {
|
2307
|
+
logger.error('\n' + 'YT player not defined');
|
1232
2308
|
}
|
1233
|
-
// else {
|
1234
|
-
// songIndex--;
|
1235
|
-
// }
|
1236
2309
|
|
1237
|
-
//
|
1238
|
-
//
|
2310
|
+
// stop active AT|YT players except the current
|
2311
|
+
// stopAllActivePlayers(playerID);
|
2312
|
+
|
2313
|
+
// select video
|
1239
2314
|
if (songIndex < songs.length-1) {
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
2315
|
+
// select NEXT video
|
2316
|
+
songIndex++;
|
2317
|
+
ytpSongIndex = songIndex;
|
1243
2318
|
} else {
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
songURL = songMetaData.url;
|
1248
|
-
ytpVideoID = songURL.split('=')[1];
|
2319
|
+
// select FIRST video
|
2320
|
+
songIndex = 0;
|
2321
|
+
ytpSongIndex = songIndex;
|
1249
2322
|
}
|
1250
2323
|
|
1251
|
-
//
|
1252
|
-
|
1253
|
-
|
1254
|
-
|
1255
|
-
|
1256
|
-
|
1257
|
-
|
1258
|
-
|
1259
|
-
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
2324
|
+
// set song (video)^meta data
|
2325
|
+
songMetaData = songs[songIndex];
|
2326
|
+
songURL = songMetaData.url;
|
2327
|
+
ytpVideoID = songURL.split('=')[1];
|
2328
|
+
|
2329
|
+
// load next video
|
2330
|
+
// ---------------------------------------------------------------
|
2331
|
+
|
2332
|
+
// save YT player GLOBAL data for later use (e.g. events)
|
2333
|
+
j1.adapter.amplitude.data.activePlayer = 'ytp';
|
2334
|
+
j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
|
2335
|
+
j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
|
2336
|
+
|
2337
|
+
// save YT player data for later use (e.g. events)
|
2338
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
|
2339
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
|
2340
|
+
|
2341
|
+
trackID = songIndex + 1;
|
2342
|
+
logger.debug('\n' + `SWITCH video for PlayerNextButton at trackID|VideoID: ${trackID}|${ytpVideoID}`);
|
2343
|
+
ytPlayer.loadVideoById(ytpVideoID);
|
2344
|
+
|
2345
|
+
// delay after switch video
|
2346
|
+
if (muteAfterVideoSwitchInterval) {
|
2347
|
+
ytPlayer.mute();
|
2348
|
+
setTimeout(() => {
|
2349
|
+
ytPlayer.unMute();
|
2350
|
+
}, muteAfterVideoSwitchInterval);
|
2351
|
+
}
|
2352
|
+
|
2353
|
+
if (songIndex === 0) {
|
2354
|
+
|
2355
|
+
// continue paused on FIRST video
|
2356
|
+
// TODO: handle on player|shuffle different (do play)
|
2357
|
+
ytPlayer.pauseVideo();
|
2358
|
+
|
2359
|
+
// reset|update time settings
|
2360
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2361
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
2362
|
+
resetProgressBarYTP();
|
2363
|
+
|
2364
|
+
// set AJS play_pause button paused
|
2365
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2366
|
+
// setPlayPauseButtonPlaying(playPauseButtonClass);
|
2367
|
+
togglePlayPauseButton(playPauseButtonClass);
|
1273
2368
|
} else {
|
1274
|
-
//
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1278
|
-
// update AJS play_pause button (set playing)
|
1279
|
-
var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
|
1280
|
-
largePlayerPlayPauseButton.classList.remove('amplitude-paused');
|
1281
|
-
largePlayerPlayPauseButton.classList.add('amplitude-playing');
|
1282
|
-
} else {
|
1283
|
-
// update AJS play_pause button (set paused)
|
1284
|
-
var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
|
1285
|
-
largePlayerPlayPauseButton.classList.remove('amplitude-playing');
|
1286
|
-
largePlayerPlayPauseButton.classList.add('amplitude-paused');
|
1287
|
-
}
|
2369
|
+
// toggle AJS play_pause button
|
2370
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2371
|
+
togglePlayPauseButton(playPauseButtonClass);
|
1288
2372
|
}
|
1289
2373
|
|
1290
2374
|
// reset|update current time settings
|
1291
|
-
resetCurrentTimeContainerYTP();
|
1292
|
-
updateDurationTimeContainerYTP(ytPlayer);
|
1293
|
-
|
1294
|
-
|
1295
|
-
|
1296
|
-
|
1297
|
-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1307
|
-
if (largetPlayerSongAudioRating.length) {
|
1308
|
-
if (songMetaData.rating) {
|
1309
|
-
largetPlayerSongAudioRating[0].innerHTML = songMetaData.rating + ' <i class="mdib mdib-star md-gray-400 mdib-18px"></i>';
|
1310
|
-
} else {
|
1311
|
-
largetPlayerSongAudioRating[0].innerHTML = '';
|
1312
|
-
}
|
1313
|
-
} // END if largetPlayerSongAudioRating
|
1314
|
-
|
1315
|
-
// replace artist name in meta-containers for next video
|
1316
|
-
var artistName = document.getElementsByClassName("artist");
|
1317
|
-
artistName[0].innerHTML = songMetaData.artist;
|
1318
|
-
|
1319
|
-
// replace album name in meta-containers for next video
|
1320
|
-
var albumName = document.getElementsByClassName("album");
|
1321
|
-
albumName[0].innerHTML = songMetaData.album;
|
1322
|
-
|
1323
|
-
// update AJS play_pause button
|
1324
|
-
var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
|
1325
|
-
largePlayerPlayPauseButton.classList.remove('amplitude-paused');
|
1326
|
-
largePlayerPlayPauseButton.classList.add('amplitude-playing');
|
1327
|
-
|
1328
|
-
// if (songIndex < songs.length) {
|
1329
|
-
if (songIndex < songs.length-1) {
|
1330
|
-
// set song active in playlist
|
1331
|
-
// setSongPlayed(songIndex);
|
1332
|
-
setSongPlayed(playerID, songIndex);
|
1333
|
-
// j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
|
2375
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2376
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
2377
|
+
resetProgressBarYTP();
|
2378
|
+
|
2379
|
+
// load the song cover image
|
2380
|
+
loadCoverImage(songMetaData);
|
2381
|
+
|
2382
|
+
// update meta data
|
2383
|
+
updatMetaContainers(songMetaData);
|
2384
|
+
|
2385
|
+
// set song at songIndex active in playlist
|
2386
|
+
setSongActive(playlist, songIndex);
|
2387
|
+
|
2388
|
+
// scroll song active at index in player
|
2389
|
+
if (playerAutoScrollSongElement) {
|
2390
|
+
scrollToActiveElement(playlist);
|
1334
2391
|
}
|
1335
2392
|
|
1336
2393
|
// deactivate AJS events (if any)
|
1337
2394
|
event.stopImmediatePropagation();
|
1338
|
-
|
1339
|
-
|
2395
|
+
|
2396
|
+
}); // END EventListener 'click' next button
|
2397
|
+
} // END if
|
2398
|
+
|
1340
2399
|
} // END for largePlayerNextButton
|
1341
2400
|
|
2401
|
+
// Overload AJS largePlayerPrevious button for YT
|
1342
2402
|
// click on (player) previous button
|
1343
2403
|
// TODO: Fix for multiple players in page
|
1344
2404
|
// -----------------------------------------------------------------------
|
1345
|
-
|
1346
|
-
// Overload AJS largePlayerPrevious button for YT
|
1347
|
-
//
|
1348
2405
|
var largePlayePreviousButton = document.getElementsByClassName("large-player-previous");
|
1349
2406
|
for (var i=0; i<largePlayePreviousButton.length; i++) {
|
1350
|
-
var classArray = [].slice.call(
|
2407
|
+
var classArray = [].slice.call(largePlayePreviousButton[i].classList, 0);
|
1351
2408
|
var classString = classArray.toString();
|
1352
2409
|
|
1353
2410
|
if (classString.includes(ytPlayerID)) {
|
1354
2411
|
largePlayePreviousButton[i].addEventListener('click', function(event) {
|
1355
|
-
var
|
1356
|
-
|
1357
|
-
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1362
|
-
|
1363
|
-
|
1364
|
-
|
1365
|
-
|
1366
|
-
|
1367
|
-
// j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
|
2412
|
+
var playlist, playerID, songIndex, trackID,
|
2413
|
+
songs, songMetaData, songName, songURL,
|
2414
|
+
ytPlayer, ytpVideoID;
|
2415
|
+
|
2416
|
+
songIndex = ytpSongIndex;
|
2417
|
+
playlist = this.getAttribute("data-amplitude-playlist");
|
2418
|
+
playerID = playlist + '_large';
|
2419
|
+
songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
|
2420
|
+
ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
|
2421
|
+
|
2422
|
+
if (ytPlayer === undefined) {
|
2423
|
+
logger.error('\n' + 'YT player not defined');
|
1368
2424
|
}
|
1369
2425
|
|
1370
|
-
//
|
1371
|
-
|
1372
|
-
|
1373
|
-
|
1374
|
-
|
1375
|
-
|
1376
|
-
|
2426
|
+
// stop active AT|YT players except the current
|
2427
|
+
// stopAllActivePlayers(playerID);
|
2428
|
+
|
2429
|
+
// select video
|
2430
|
+
if (songIndex > 0 && songIndex <= songs.length - 1) {
|
2431
|
+
// select NEXT video
|
2432
|
+
songIndex--;
|
2433
|
+
ytpSongIndex = songIndex;
|
1377
2434
|
} else {
|
1378
|
-
|
1379
|
-
|
1380
|
-
|
1381
|
-
songMetaData = songs[songIndex];
|
1382
|
-
songURL = songMetaData.url;
|
1383
|
-
ytpSongIndex = songIndex;
|
1384
|
-
ytpVideoID = songURL.split('=')[1];
|
2435
|
+
// select FIRST video
|
2436
|
+
songIndex = 0;
|
2437
|
+
ytpSongIndex = songIndex;
|
1385
2438
|
}
|
1386
2439
|
|
2440
|
+
// set song (video)^meta data
|
2441
|
+
songMetaData = songs[songIndex];
|
2442
|
+
songURL = songMetaData.url;
|
2443
|
+
ytpVideoID = songURL.split('=')[1];
|
2444
|
+
|
2445
|
+
// save YT player GLOBAL data for later use (e.g. events)
|
2446
|
+
j1.adapter.amplitude.data.activePlayer = 'ytp';
|
2447
|
+
j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
|
2448
|
+
j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
|
2449
|
+
|
2450
|
+
// load next video
|
2451
|
+
// -----------------------------------------------------------------
|
2452
|
+
|
1387
2453
|
// save YT player data for later use (e.g. events)
|
1388
|
-
|
2454
|
+
j1.adapter.amplitude.data.activePlayer = 'ytp';
|
2455
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
|
2456
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
|
1389
2457
|
|
1390
|
-
|
1391
|
-
|
1392
|
-
|
1393
|
-
ytpSongIndex = 0;
|
2458
|
+
trackID = songIndex + 1;
|
2459
|
+
logger.debug('\n' + `SWITCH video for PlayePreviousButton at trackID|VideoID: ${trackID}|${ytpVideoID}`);
|
2460
|
+
ytPlayer.loadVideoById(ytpVideoID);
|
1394
2461
|
|
1395
|
-
|
1396
|
-
|
1397
|
-
|
2462
|
+
// delay after switch video
|
2463
|
+
if (muteAfterVideoSwitchInterval) {
|
2464
|
+
ytPlayer.mute();
|
2465
|
+
setTimeout(() => {
|
2466
|
+
ytPlayer.unMute();
|
2467
|
+
}, muteAfterVideoSwitchInterval);
|
2468
|
+
}
|
1398
2469
|
|
1399
|
-
|
1400
|
-
|
1401
|
-
|
1402
|
-
|
1403
|
-
|
1404
|
-
|
1405
|
-
|
1406
|
-
|
1407
|
-
|
1408
|
-
|
1409
|
-
|
1410
|
-
|
1411
|
-
|
1412
|
-
|
2470
|
+
if (songIndex === 0) {
|
2471
|
+
|
2472
|
+
// continue paused on FIRST video
|
2473
|
+
// TODO: handle on player|shuffle different (do play)
|
2474
|
+
ytPlayer.pauseVideo();
|
2475
|
+
|
2476
|
+
// reset|update time settings
|
2477
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2478
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
2479
|
+
resetProgressBarYTP();
|
2480
|
+
|
2481
|
+
// set AJS play_pause button paused
|
2482
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2483
|
+
// setPlayPauseButtonPlaying(playPauseButtonClass);
|
2484
|
+
togglePlayPauseButton(playPauseButtonClass);
|
1413
2485
|
} else {
|
1414
|
-
//
|
1415
|
-
|
1416
|
-
|
1417
|
-
|
1418
|
-
// update AJS play_pause button (set playing)
|
1419
|
-
var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
|
1420
|
-
largePlayerPlayPauseButton.classList.remove('amplitude-paused');
|
1421
|
-
largePlayerPlayPauseButton.classList.add('amplitude-playing');
|
1422
|
-
} else {
|
1423
|
-
// update AJS play_pause button (set paused)
|
1424
|
-
var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
|
1425
|
-
largePlayerPlayPauseButton.classList.remove('amplitude-playing');
|
1426
|
-
largePlayerPlayPauseButton.classList.add('amplitude-paused');
|
1427
|
-
}
|
2486
|
+
// toggle AJS play_pause button
|
2487
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2488
|
+
togglePlayPauseButton(playPauseButtonClass);
|
1428
2489
|
}
|
1429
2490
|
|
1430
2491
|
// reset|update current time settings
|
1431
|
-
resetCurrentTimeContainerYTP();
|
1432
|
-
updateDurationTimeContainerYTP(ytPlayer);
|
1433
|
-
|
1434
|
-
// replace new song name (meta-container)
|
1435
|
-
var songName = document.getElementsByClassName("song-name");
|
1436
|
-
songName[0].innerHTML = songMetaData.name; // player-bottom
|
1437
|
-
songName[1].innerHTML = songMetaData.name; // playlist-screen
|
1438
|
-
|
1439
|
-
// load cover image for next video
|
1440
|
-
var coverImage;
|
1441
|
-
var selector = ".cover-image-" + playlist;
|
1442
|
-
coverImage = document.querySelector(selector);
|
1443
|
-
coverImage.src = songMetaData.cover_art_url;
|
1444
|
-
|
1445
|
-
// replace song rating (playlist-screen|meta-container)
|
1446
|
-
var largetPlayerSongAudioRating = document.getElementsByClassName("audio-rating");
|
1447
|
-
if (largetPlayerSongAudioRating.length) {
|
1448
|
-
if (songMetaData.rating) {
|
1449
|
-
largetPlayerSongAudioRating[0].innerHTML = songMetaData.rating + ' <i class="mdib mdib-star md-gray-400 mdib-18px"></i>';
|
1450
|
-
} else {
|
1451
|
-
largetPlayerSongAudioRating[0].innerHTML = '';
|
1452
|
-
}
|
1453
|
-
} // END if largetPlayerSongAudioRating
|
2492
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2493
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
2494
|
+
resetProgressBarYTP();
|
1454
2495
|
|
1455
|
-
//
|
1456
|
-
|
1457
|
-
|
1458
|
-
|
1459
|
-
|
1460
|
-
var albumName = document.getElementsByClassName("album");
|
1461
|
-
albumName[0].innerHTML = songMetaData.album;
|
1462
|
-
|
1463
|
-
// update AJS play_pause button
|
1464
|
-
var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
|
1465
|
-
largePlayerPlayPauseButton.classList.remove('amplitude-paused');
|
1466
|
-
largePlayerPlayPauseButton.classList.add('amplitude-playing');
|
1467
|
-
|
1468
|
-
// on LAST item, don't activate item in playlist
|
1469
|
-
if (songIndex !== songs.length - 1) {
|
1470
|
-
// set song active in playlist
|
1471
|
-
// setSongPlayed(songIndex);
|
1472
|
-
setSongPlayed(playerID, songIndex);
|
1473
|
-
}
|
2496
|
+
// load the song cover image
|
2497
|
+
loadCoverImage(songMetaData);
|
2498
|
+
|
2499
|
+
// update meta data
|
2500
|
+
updatMetaContainers(songMetaData);
|
1474
2501
|
|
1475
|
-
// set song active in playlist
|
1476
|
-
|
1477
|
-
|
2502
|
+
// set song at songIndex active in playlist
|
2503
|
+
setSongActive(playlist, songIndex);
|
2504
|
+
|
2505
|
+
// scroll song active at index in player
|
2506
|
+
if (playerAutoScrollSongElement) {
|
2507
|
+
scrollToActiveElement(playlist);
|
2508
|
+
}
|
1478
2509
|
|
1479
2510
|
// deactivate AJS events (if any)
|
1480
|
-
event.stopImmediatePropagation();
|
1481
|
-
|
2511
|
+
event.stopImmediatePropagation();
|
2512
|
+
|
2513
|
+
}); // END EventListener 'click' next button
|
1482
2514
|
} // END if
|
1483
|
-
} // END for
|
1484
2515
|
|
1485
|
-
|
1486
|
-
// TODO: Fix for multiple players in page
|
1487
|
-
// ---------------------------------------------------------------------
|
1488
|
-
var largetPlayerSongContainer = document.getElementsByClassName("amplitude-song-container");
|
1489
|
-
for (var i=0; i<largetPlayerSongContainer.length; i++) {
|
1490
|
-
var classArray = [].slice.call(largetPlayerSongContainer[i].classList, 0);
|
1491
|
-
var classString = classArray.toString();
|
1492
|
-
|
1493
|
-
if (classString.includes(ytPlayerID)) {
|
1494
|
-
largetPlayerSongContainer[i].addEventListener('click', function(event) {
|
1495
|
-
var ytpVideoID;
|
1496
|
-
var activeSongIndex;
|
1497
|
-
var success;
|
2516
|
+
} // END for largePlayerNextButton
|
1498
2517
|
|
1499
|
-
|
1500
|
-
|
1501
|
-
|
1502
|
-
|
2518
|
+
// click on song container
|
2519
|
+
// TODO: Fix for multiple players in page
|
2520
|
+
// -------------------------------------------------------------------------
|
2521
|
+
var largePlayerSongContainer = document.getElementsByClassName("amplitude-song-container");
|
2522
|
+
for (var i=0; i<largePlayerSongContainer.length; i++) {
|
2523
|
+
var classArray = [].slice.call(largePlayerSongContainer[i].classList, 0);
|
2524
|
+
var classString = classArray.toString();
|
2525
|
+
|
2526
|
+
if (classString.includes(ytPlayerID)) {
|
2527
|
+
largePlayerSongContainer[i].addEventListener('click', function(event) {
|
2528
|
+
var activeSongSettings, playlist, playerID, playerState,
|
2529
|
+
songs, songIndex, songName, singleAudio, trackID,
|
2530
|
+
ytPlayer, ytpVideoID;
|
2531
|
+
|
2532
|
+
// set (current) playlist|song data
|
2533
|
+
playlist = this.getAttribute("data-amplitude-playlist");
|
2534
|
+
playerID = playlist + '_large';
|
2535
|
+
songIndex = parseInt(this.getAttribute("data-amplitude-song-index"));
|
2536
|
+
trackID = songIndex + 1;
|
2537
|
+
|
2538
|
+
// update active song settings (manually)
|
2539
|
+
checkActiveVideoElementYTP();
|
2540
|
+
|
2541
|
+
// get active song settings (manually)
|
2542
|
+
activeSongSettings = getActiveSong();
|
2543
|
+
|
2544
|
+
if (activeSongSettings) {
|
2545
|
+
// ytpCurrentTime = activeSongSettings.currentTime;
|
2546
|
+
if (activeSongSettings.playlist !== playlist) {
|
2547
|
+
// set current player settings
|
2548
|
+
songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
|
2549
|
+
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
|
+
} else {
|
2558
|
+
// set current player settings
|
2559
|
+
songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
|
2560
|
+
ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
|
2561
|
+
}
|
2562
|
+
} else {
|
2563
|
+
// set current player settings
|
2564
|
+
songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
|
2565
|
+
ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
|
2566
|
+
}
|
1503
2567
|
|
1504
|
-
|
1505
|
-
|
2568
|
+
// set (current) song meta data
|
2569
|
+
songMetaData = songs[songIndex];
|
2570
|
+
songURL = songMetaData.url;
|
2571
|
+
ytpVideoID = songURL.split('=')[1];
|
2572
|
+
playerState = ytPlayer.getPlayerState();
|
1506
2573
|
|
1507
|
-
|
1508
|
-
|
2574
|
+
// TOGGLE state 'playing'|'paused' if video (audio) NOT changed
|
2575
|
+
var isItemChanged = (j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex !== songIndex) ? true : false;
|
2576
|
+
if (!isItemChanged && (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED)) {
|
1509
2577
|
|
1510
|
-
|
1511
|
-
|
1512
|
-
|
1513
|
-
// success = ytpSetActiveIndex(playerID, ytpSongIndex);
|
1514
|
-
// }
|
2578
|
+
if (playerState === YT_PLAYER_STATE.PLAYING) {
|
2579
|
+
ytPlayer.pauseVideo();
|
2580
|
+
ytPlayerCurrentTime = ytPlayer.getCurrentTime();
|
1515
2581
|
|
1516
|
-
|
1517
|
-
|
1518
|
-
// j1.adapter.amplitude.data.ytpGlobals['ytpSongIndex'] = ytpSongIndex;
|
2582
|
+
var trackID = songIndex + 1;
|
2583
|
+
logger.debug('\n' + `PAUSE video for PlayerSongContainer on playlist|trackID: ${playlist}|${trackID} at: ${ytPlayerCurrentTime}`);
|
1519
2584
|
|
1520
|
-
|
1521
|
-
|
1522
|
-
|
1523
|
-
|
1524
|
-
|
1525
|
-
|
1526
|
-
|
1527
|
-
songIndex = songMetaData.index;
|
1528
|
-
songURL = songMetaData.url;
|
1529
|
-
ytpSongIndex = songIndex;
|
1530
|
-
ytpVideoID = songURL.split('=')[1];
|
1531
|
-
// load new video
|
1532
|
-
ytPlayer.loadVideoById(ytpVideoID);
|
2585
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2586
|
+
togglePlayPauseButton(playPauseButtonClass);
|
2587
|
+
|
2588
|
+
// reset|update time settings
|
2589
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2590
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
2591
|
+
return;
|
1533
2592
|
}
|
1534
2593
|
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1538
|
-
|
1539
|
-
|
1540
|
-
|
1541
|
-
|
1542
|
-
|
1543
|
-
|
1544
|
-
|
1545
|
-
|
1546
|
-
|
1547
|
-
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
1551
|
-
|
1552
|
-
|
1553
|
-
|
1554
|
-
|
1555
|
-
|
1556
|
-
|
2594
|
+
if (playerState === YT_PLAYER_STATE.PAUSED) {
|
2595
|
+
ytPlayer.playVideo();
|
2596
|
+
ytpSeekTo(ytPlayer, ytPlayerCurrentTime, true);
|
2597
|
+
|
2598
|
+
var trackID = songIndex + 1;
|
2599
|
+
logger.debug('\n' + `PLAY video for PlayerSongContainer on playlist|trackID: ${playlist}|${trackID} at: ${ytPlayerCurrentTime}`);
|
2600
|
+
|
2601
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2602
|
+
togglePlayPauseButton(playPauseButtonClass);
|
2603
|
+
|
2604
|
+
// reset|update time settings
|
2605
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2606
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
2607
|
+
return;
|
2608
|
+
}
|
2609
|
+
|
2610
|
+
} // END !changedAudio
|
2611
|
+
|
2612
|
+
// update global song index (start at 0)
|
2613
|
+
ytpSongIndex = songIndex;
|
2614
|
+
|
2615
|
+
// stop active AT|YT players
|
2616
|
+
// stopAllActivePlayers(playerID);
|
2617
|
+
|
2618
|
+
// save YT player GLOBAL data for later use (e.g. events)
|
2619
|
+
j1.adapter.amplitude.data.activePlayer = 'ytp';
|
2620
|
+
j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
|
2621
|
+
j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
|
2622
|
+
|
2623
|
+
// save YT player data for later use (e.g. events)
|
2624
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
|
2625
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
|
2626
|
+
|
2627
|
+
// reset|update current time settings
|
2628
|
+
resetCurrentTimeContainerYTP(ytPlayer, playlist);
|
2629
|
+
updateDurationTimeContainerYTP(ytPlayer, playlist);
|
2630
|
+
resetProgressBarYTP();
|
2631
|
+
|
2632
|
+
// load the song cover image
|
2633
|
+
loadCoverImage(songMetaData);
|
2634
|
+
|
2635
|
+
// update meta data
|
2636
|
+
updatMetaContainers(songMetaData);
|
2637
|
+
|
2638
|
+
// set AJS play_pause button playing
|
2639
|
+
var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
|
2640
|
+
setPlayPauseButtonPlaying(playPauseButtonClass)
|
2641
|
+
|
2642
|
+
// set song at songIndex active in playlist
|
2643
|
+
setSongActive(playlist, songIndex);
|
2644
|
+
|
2645
|
+
// scroll song active at index in player
|
2646
|
+
if (playerAutoScrollSongElement) {
|
2647
|
+
scrollToActiveElement(playlist);
|
2648
|
+
}
|
2649
|
+
|
2650
|
+
// save YT player data for later use (e.g. events)
|
2651
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
|
2652
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
|
2653
|
+
|
2654
|
+
// load next video
|
2655
|
+
// -------------------------------------------------------------------
|
2656
|
+
trackID = songIndex + 1;
|
2657
|
+
logger.debug('\n' + `SWITCH video for PlayerSongContainer at trackID|VideoID: ${trackID}|${ytpVideoID}`);
|
2658
|
+
ytPlayer.loadVideoById(ytpVideoID);
|
2659
|
+
|
2660
|
+
// mute sound after next video load
|
2661
|
+
// -------------------------------------------------------------------
|
2662
|
+
if (muteAfterVideoSwitchInterval) {
|
2663
|
+
ytPlayer.mute();
|
2664
|
+
setTimeout(() => {
|
2665
|
+
ytPlayer.unMute();
|
2666
|
+
}, muteAfterVideoSwitchInterval);
|
2667
|
+
}
|
2668
|
+
|
2669
|
+
// deactivate AJS events (if any)
|
2670
|
+
event.stopImmediatePropagation();
|
2671
|
+
}); // END EventListener 'click' SongContainer
|
2672
|
+
} // END ifSWITCH video
|
2673
|
+
} // END for
|
2674
|
+
|
2675
|
+
// add listeners to all progress bars found
|
2676
|
+
// TODO: Fix for multiple players in page
|
2677
|
+
// -------------------------------------------------------------------------
|
2678
|
+
var progressBars = document.getElementsByClassName("large-player-progress");
|
2679
|
+
if (progressBars.length) {
|
2680
|
+
for (var i=0; i<progressBars.length; i++) {
|
2681
|
+
var classArray = [].slice.call(progressBars[i].classList, 0);
|
2682
|
+
var classString = classArray.toString();
|
2683
|
+
var progressId = progressBars[i].id;
|
2684
|
+
var playerID = progressId.split('large_player_progress_')[1];
|
2685
|
+
var progressClass = ('large-player-progress-' + playerID).replace('_large','');
|
2686
|
+
|
2687
|
+
if (progressBars[i].dataset.amplitudeSource === 'audio') {
|
2688
|
+
// do nothing (managed by adapter)
|
2689
|
+
} else {
|
2690
|
+
var progressBar = progressBars[i];
|
2691
|
+
if (classString.includes(progressClass)) {
|
2692
|
+
// save YT player data for later use (e.g. events)
|
2693
|
+
j1.adapter.amplitude.data.ytPlayers[playerID].progressBar = progressBar;
|
2694
|
+
|
2695
|
+
progressBars[i].addEventListener('click', function(event) {
|
2696
|
+
var activeSongSettings, playlist, ytPlayer,
|
2697
|
+
playerState, progressBar, percentage, time;
|
2698
|
+
|
2699
|
+
// update active song settings (manually)
|
2700
|
+
checkActiveVideoElementYTP();
|
2701
|
+
|
2702
|
+
// get active song settings (manually)
|
2703
|
+
activeSongSettings = getActiveSong();
|
2704
|
+
|
2705
|
+
if (!activeSongSettings) {
|
2706
|
+
// do nothing if current video (audio) item is NOT selected|active
|
2707
|
+
return;
|
1557
2708
|
}
|
1558
|
-
} // END if largetPlayerSongInfoLink
|
1559
2709
|
|
1560
|
-
|
1561
|
-
|
1562
|
-
|
1563
|
-
|
1564
|
-
largetPlayerSongAudioRating[0].innerHTML = songMetaData.rating + ' <i class="mdib mdib-star md-gray-400 mdib-18px"></i>';
|
1565
|
-
} else {
|
1566
|
-
largetPlayerSongAudioRating[0].innerHTML = '';
|
2710
|
+
playlist = this.getAttribute("data-amplitude-playlist");
|
2711
|
+
if (activeSongSettings.playlist !== playlist) {
|
2712
|
+
// do nothing on PREVIOUS playlist (player)
|
2713
|
+
return;
|
1567
2714
|
}
|
1568
|
-
} // END if largetPlayerSongAudioRating
|
1569
2715
|
|
1570
|
-
|
1571
|
-
|
1572
|
-
largePlayerPlayPauseButton.classList.remove('amplitude-paused');
|
1573
|
-
largePlayerPlayPauseButton.classList.add('amplitude-playing');
|
2716
|
+
ytPlayer = activeSongSettings.player;
|
2717
|
+
playerState = ytPlayer.getPlayerState();
|
1574
2718
|
|
1575
|
-
|
1576
|
-
|
1577
|
-
|
1578
|
-
|
2719
|
+
//if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.BUFFERING) {
|
2720
|
+
if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.BUFFERING) {
|
2721
|
+
progressBar = this;
|
2722
|
+
percentage = getProgressBarSelectedPositionPercentage(event, progressBar);
|
2723
|
+
time = getTimeFromPercentage(ytPlayer, percentage);
|
1579
2724
|
|
1580
|
-
|
1581
|
-
|
2725
|
+
// seek video to current time
|
2726
|
+
// var buffered = ytpSeekTo(ytPlayer, time, true);
|
2727
|
+
ytpSeekTo(ytPlayer, time, true);
|
2728
|
+
|
2729
|
+
// set current progess value if valid
|
2730
|
+
if (isFinite(percentage)) {
|
2731
|
+
progressBar.value = percentage;
|
2732
|
+
}
|
2733
|
+
} // END if ytPlayer
|
1582
2734
|
|
1583
|
-
|
1584
|
-
|
2735
|
+
// deactivate AJS events (if any)
|
2736
|
+
event.stopImmediatePropagation();
|
2737
|
+
}); // END EventListener 'click'
|
2738
|
+
} // END if classString includes
|
2739
|
+
} // END if amplitudeSource
|
2740
|
+
} // END for progressBars
|
2741
|
+
} // END if progressBars
|
2742
|
+
|
2743
|
+
// add listeners to all volume sliders found
|
2744
|
+
// TODO: Fix for multiple players in page
|
2745
|
+
// -------------------------------------------------------------------------
|
2746
|
+
var volumeSliders = document.getElementsByClassName("amplitude-volume-slider");
|
2747
|
+
for (var i=0; i<volumeSliders.length; i++) {
|
2748
|
+
if (volumeSliders[i].dataset.amplitudeSource === 'audio') {
|
2749
|
+
// do nothing (managed by adapter)
|
2750
|
+
var bla = 1;
|
2751
|
+
} else {
|
2752
|
+
if (volumeSliders[i]) {
|
2753
|
+
// for (var i=0; i<volumeSliders.length; i++) {
|
2754
|
+
var volumeSlider = volumeSliders[i];
|
2755
|
+
var sliderID = volumeSliders[i].id;
|
2756
|
+
var playerID = sliderID.split('volume_slider_')[1];
|
1585
2757
|
|
1586
|
-
//
|
1587
|
-
|
1588
|
-
}); // END EventListener 'click' SongContainer
|
1589
|
-
} // END if
|
1590
|
-
} // END for
|
2758
|
+
// save YT player data for later use (e.g. events)
|
2759
|
+
// j1.adapter.amplitude.data.ytPlayers[playerID].volumeSlider = volumeSlider;
|
1591
2760
|
|
1592
|
-
|
1593
|
-
|
1594
|
-
|
1595
|
-
|
1596
|
-
|
1597
|
-
|
1598
|
-
|
1599
|
-
|
1600
|
-
|
1601
|
-
|
1602
|
-
|
2761
|
+
volumeSliders[i].addEventListener('click', function(event) {
|
2762
|
+
|
2763
|
+
// update active song settings (manually)
|
2764
|
+
checkActiveVideoElementYTP();
|
2765
|
+
|
2766
|
+
// get active song settings (manually)
|
2767
|
+
var activeSongSettings = getActiveSong();
|
2768
|
+
|
2769
|
+
if (!activeSongSettings) {
|
2770
|
+
// do nothing if current video (audio) item is NOT selected|active
|
2771
|
+
return;
|
2772
|
+
}
|
2773
|
+
|
2774
|
+
var ytPlayer = activeSongSettings.player;
|
2775
|
+
var playerState = ytPlayer.getPlayerState();
|
2776
|
+
|
2777
|
+
if ((playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) && ytPlayer !== undefined) {
|
2778
|
+
var volumeSlider, volumeValue;
|
2779
|
+
var currenVolume = ytPlayer.getVolume();
|
2780
|
+
|
2781
|
+
volumeSlider = this;
|
2782
|
+
volumeValue = 50; // default
|
2783
|
+
|
2784
|
+
if (volumeSlider !== null) {
|
2785
|
+
volumeValue = parseInt(volumeSlider.value);
|
2786
|
+
}
|
2787
|
+
|
2788
|
+
ytPlayer.setVolume(volumeValue);
|
2789
|
+
} // END if ytPlayer
|
2790
|
+
|
2791
|
+
}); // END EventListener 'click'
|
2792
|
+
// } // END for
|
2793
|
+
} // END if volumeSliders
|
2794
|
+
} // END if volumeSliders
|
2795
|
+
} // END for volumeSliders
|
2796
|
+
|
2797
|
+
// add listeners to all mute buttons found
|
2798
|
+
// TODO: Fix for multiple buttons in page
|
2799
|
+
// -------------------------------------------------------------------------
|
2800
|
+
var volumeMutes = document.getElementsByClassName("amplitude-mute");
|
2801
|
+
for (var i=0; i<volumeMutes.length; i++) {
|
2802
|
+
if (volumeMutes[i].dataset.amplitudeSource === 'audio') {
|
2803
|
+
// do nothing (managed by adapter)
|
2804
|
+
var bla = 1;
|
2805
|
+
} else {
|
2806
|
+
if (volumeMutes[i]) {
|
2807
|
+
var volumMute = volumeMutes[i];
|
2808
|
+
var sliderID = volumeMutes[i].id;
|
2809
|
+
var playerID = sliderID.split('amplitude-mute_')[1];
|
1603
2810
|
|
1604
2811
|
// save YT player data for later use (e.g. events)
|
1605
|
-
// j1.adapter.amplitude.data.
|
1606
|
-
|
1607
|
-
|
1608
|
-
|
1609
|
-
|
1610
|
-
|
1611
|
-
|
1612
|
-
|
1613
|
-
|
1614
|
-
|
1615
|
-
|
1616
|
-
|
1617
|
-
|
1618
|
-
|
1619
|
-
|
1620
|
-
|
1621
|
-
|
1622
|
-
|
2812
|
+
// j1.adapter.amplitude.data.ytPlayers[playerID].volumMute = volumMute;
|
2813
|
+
|
2814
|
+
volumeMutes[i].addEventListener('click', function(event) {
|
2815
|
+
|
2816
|
+
// update active song settings (manually)
|
2817
|
+
checkActiveVideoElementYTP();
|
2818
|
+
|
2819
|
+
// get active song settings (manually)
|
2820
|
+
var activeSongSettings = getActiveSong();
|
2821
|
+
|
2822
|
+
if (!activeSongSettings) {
|
2823
|
+
// do nothing if current video (audio) item is NOT selected|active
|
2824
|
+
return;
|
2825
|
+
}
|
2826
|
+
|
2827
|
+
var ytPlayer = activeSongSettings.player;
|
2828
|
+
var playerState = ytPlayer.getPlayerState();
|
2829
|
+
var volumeSlider = j1.adapter.amplitude.data.ytPlayers[playerID].volumeSlider;
|
2830
|
+
var currenVolume = ytPlayer.getVolume();
|
2831
|
+
var playerVolumePreset = parseInt(j1.adapter.amplitude.data.ytPlayers[playerID].playerSettings.volume_slider.preset_value);
|
2832
|
+
|
2833
|
+
if ((playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) && ytPlayer !== undefined) {
|
2834
|
+
if (currenVolume > 0) {
|
2835
|
+
volumeSlider.value = 0;
|
2836
|
+
ytPlayer.setVolume(0);
|
2837
|
+
} else {
|
2838
|
+
volumeSlider.value = playerVolumePreset;
|
2839
|
+
ytPlayer.setVolume(playerVolumePreset);
|
1623
2840
|
}
|
1624
2841
|
} // END if ytPlayer
|
1625
2842
|
|
1626
|
-
// deactivate AJS events (if any)
|
1627
|
-
event.stopImmediatePropagation();
|
1628
2843
|
}); // END EventListener 'click'
|
1629
|
-
} // END for
|
1630
|
-
} // END if progressBars
|
1631
2844
|
|
1632
|
-
|
1633
|
-
|
2845
|
+
} // END if volumeMutes
|
2846
|
+
} // END if volumeSliders
|
2847
|
+
} // END for volumeSliders
|
2848
|
+
|
2849
|
+
} // END if playerSettings.type 'large'
|
2850
|
+
|
2851
|
+
}
|
2852
|
+
|
1634
2853
|
} // END mimikYTPlayerUiEventsForAJS
|
1635
2854
|
|
1636
2855
|
{%- endcapture -%}
|