/*! * lazyYT (lazy load YouTube videos) * v1.0.1 - 2014-12-30 * (CC) This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. * http://creativecommons.org/licenses/by-sa/4.0/ * Contributors: https://github.com/tylerpearson/lazyYT/graphs/contributors || https://github.com/daugilas/lazyYT/graphs/contributors * * Usage:
loading...
* * Note: Discourse has forked this from the original, beware when updating the file. * */ import escape from "discourse-common/lib/escape"; export default function initLazyYt($) { "use strict"; function setUp($el, settings) { let width = $el.data("width"), height = $el.data("height"), ratio = $el.data("ratio") ? $el.data("ratio") : settings.default_ratio, id = $el.data("youtube-id"), title = $el.data("youtube-title"), padding_bottom, innerHtml = [], $thumb, thumb_img, youtube_parameters = $el.data("parameters") || ""; ratio = ratio.split(":"); // width and height might override default_ratio value if (typeof width === "number" && typeof height === "number") { $el.width(width); padding_bottom = height + "px"; } else if (typeof width === "number") { $el.width(width); padding_bottom = (width * ratio[1]) / ratio[0] + "px"; } else { width = $el.width(); // no width means that container is fluid and will be the size of its parent if (width === 0) { width = $el.parent().width(); } padding_bottom = (ratio[1] / ratio[0]) * 100 + "%"; } // // This HTML will be placed inside 'lazyYT' container innerHtml.push('
'); // Play button from YouTube (exactly as it is in YouTube) innerHtml.push('
"); innerHtml.push(""); innerHtml.push( '' ); innerHtml.push( '' ); innerHtml.push(""); innerHtml.push("
"); // end of .ytp-large-play-button innerHtml.push("
"); // end of .ytp-thumbnail // Video title (info bar) innerHtml.push('
'); innerHtml.push('
'); innerHtml.push('"); // .html5-title innerHtml.push("
"); // .html5-title-text-wrapper innerHtml.push("
"); // end of Video title .html5-info-bar let prefetchedThumbnail = $el[0].querySelector(".ytp-thumbnail-image"); $el .css({ "padding-bottom": padding_bottom, }) .html(innerHtml.join("")); if (width > 640) { thumb_img = "maxresdefault.jpg"; } else if (width > 480) { thumb_img = "sddefault.jpg"; } else if (width > 320) { thumb_img = "hqdefault.jpg"; } else if (width > 120) { thumb_img = "mqdefault.jpg"; } else if (width === 0) { // sometimes it fails on fluid layout thumb_img = "hqdefault.jpg"; } else { thumb_img = "default.jpg"; } if (prefetchedThumbnail) { $el.find(".ytp-thumbnail").append(prefetchedThumbnail); } else { // Fallback for old posts which were baked before the lazy-yt onebox prefetched a thumbnail $el .find(".ytp-thumbnail") .append( $( [ '', ].join("") ) ); } $thumb = $el .find(".ytp-thumbnail") .addClass("lazyYT-image-loaded") .on("keypress click", function (e) { // Only support Enter for keypress if (e.type === "keypress" && e.keyCode !== 13) { return; } e.preventDefault(); if ( !$el.hasClass("lazyYT-video-loaded") && $thumb.hasClass("lazyYT-image-loaded") ) { $el .html( '' ) .addClass("lazyYT-video-loaded"); } if (settings.onPlay) { settings.onPlay(e, $el); } }); } $.fn.lazyYT = function (newSettings) { let defaultSettings = { default_ratio: "16:9", callback: null, // TODO: execute callback if given container_class: "lazyYT-container", }; let settings = Object.assign(defaultSettings, newSettings); return this.each(function () { let $el = $(this).addClass(settings.container_class); setUp($el, settings); }); }; }