<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://tbpedia.org/wiki/MediaWiki:TemplateVideo.js/history?feed=atom</id>
	<title>MediaWiki:TemplateVideo.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://tbpedia.org/wiki/MediaWiki:TemplateVideo.js/history?feed=atom"/>
	<link rel="alternate" type="text/html" href="https://tbpedia.org/wiki/MediaWiki:TemplateVideo.js/history"/>
	<updated>2026-09-10T16:17:45Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://tbpedia.org/w/index.php?title=MediaWiki:TemplateVideo.js&amp;diff=1636&amp;oldid=prev</id>
		<title>蓮花祖泉：​导入1个版本</title>
		<link rel="alternate" type="text/html" href="https://tbpedia.org/w/index.php?title=MediaWiki:TemplateVideo.js&amp;diff=1636&amp;oldid=prev"/>
		<updated>2024-03-02T09:37:00Z</updated>

		<summary type="html">&lt;p&gt;导入1个版本&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2024年3月2日 (六) 17:37的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;zh&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;（没有差异）&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>蓮花祖泉</name></author>
	</entry>
	<entry>
		<id>https://tbpedia.org/w/index.php?title=MediaWiki:TemplateVideo.js&amp;diff=1635&amp;oldid=prev</id>
		<title>Tbpedia&gt;Emilio：​Protected &quot;MediaWiki:TemplateVideo.js&quot;: Prevent accidental edits as we explore h5p functionality. ([Edit=Allow only administrators] (expires 20:34, 12 March 2024 (UTC)) [Move=Allow only administrators] (expires 20:34, 12 March 2024 (UTC)))</title>
		<link rel="alternate" type="text/html" href="https://tbpedia.org/w/index.php?title=MediaWiki:TemplateVideo.js&amp;diff=1635&amp;oldid=prev"/>
		<updated>2023-12-12T20:34:59Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/wiki/MediaWiki:TemplateVideo.js&quot; title=&quot;MediaWiki:TemplateVideo.js&quot;&gt;MediaWiki:TemplateVideo.js&lt;/a&gt;&amp;quot;: Prevent accidental edits as we explore h5p functionality. ([Edit=Allow only administrators] (expires 20:34, 12 March 2024 (UTC)) [Move=Allow only administrators] (expires 20:34, 12 March 2024 (UTC)))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * This script interacts with [[Template:Video]]&lt;br /&gt;
 * &lt;br /&gt;
 * Most of the complexity of this script stems from the fact that it's designed&lt;br /&gt;
 * to handle videos from YouTube, Vimeo, Commons or Appropedia&lt;br /&gt;
 * &lt;br /&gt;
 * [[Category:Template script pages]]&lt;br /&gt;
 */&lt;br /&gt;
window.TemplateVideo = {&lt;br /&gt;
&lt;br /&gt;
	init: function () {&lt;br /&gt;
		var $videos = $( '.template-video' );&lt;br /&gt;
&lt;br /&gt;
		// Give each video an id and an index&lt;br /&gt;
		$videos.each( function ( index ) {&lt;br /&gt;
			$( this ).attr( {&lt;br /&gt;
				'id': 'video-' + index,&lt;br /&gt;
				'data-video-index': index&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		// Replace plain timestamps for links&lt;br /&gt;
		$videos.find( '.template-video-annotations' ).html( function ( index, html ) {&lt;br /&gt;
			if ( /(\d\d?:\d\d)/.test( html ) ) {&lt;br /&gt;
				return html.replace( /(\d\d?:\d\d)/g, '&amp;lt;a class=&amp;quot;timestamp&amp;quot; href=&amp;quot;#$1&amp;quot;&amp;gt;$1&amp;lt;/a&amp;gt;' );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		// Play the relevant video when a timestamp is clicked&lt;br /&gt;
		$videos.find( '.template-video-annotations .timestamp' ).on( 'click', function () {&lt;br /&gt;
			var $link = $( this );&lt;br /&gt;
			var $video = $link.closest( '.template-video' );&lt;br /&gt;
			var index = $video.data( 'video-index' );&lt;br /&gt;
			var hash = $link.attr( 'href' );&lt;br /&gt;
			if ( $video.find( 'iframe, video' ).length ) {&lt;br /&gt;
				TemplateVideo.playVideoAtTime( index, hash );&lt;br /&gt;
			} else if ( $video.hasClass( 'youtube' ) ) {&lt;br /&gt;
				TemplateVideo.loadYouTubeVideo.bind( this )();&lt;br /&gt;
			} else if ( $video.hasClass( 'vimeo' ) ) {&lt;br /&gt;
				TemplateVideo.loadVimeoVideo.bind( this )();&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		// Add event listeners to highlight the relevant annotation&lt;br /&gt;
		$videos.filter( '.appropedia, .commons' ).each( function () {&lt;br /&gt;
			var $video = $( this );&lt;br /&gt;
			var player = $video.find( 'video' )[0];&lt;br /&gt;
			var previousTime = -1;&lt;br /&gt;
			player.addEventListener( 'timeupdate', function () {&lt;br /&gt;
				var currentTime = player.currentTime;&lt;br /&gt;
				currentTime = Math.floor( currentTime );&lt;br /&gt;
				if ( currentTime === previousTime ) {&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				previousTime = currentTime;&lt;br /&gt;
				TemplateVideo.highlightAnnotation( $video, currentTime );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		// Load a YouTube video when a YouTube play button or thumbnail is clicked&lt;br /&gt;
		$videos.filter( '.youtube' ).find( '.template-video-play, .template-video-thumb' ).on( 'click', TemplateVideo.loadYouTubeVideo );&lt;br /&gt;
&lt;br /&gt;
		// Load a Vimeo video when a Vimeo play button or thumbnail is clicked&lt;br /&gt;
		$videos.filter( '.vimeo' ).find( '.template-video-play, .template-video-thumb' ).on( 'click', TemplateVideo.loadVimeoVideo );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	isYouTubeLoaded: false,&lt;br /&gt;
	loadYouTubeVideo: function () {&lt;br /&gt;
		var $video = $( this ).closest( '.template-video' );&lt;br /&gt;
&lt;br /&gt;
		// Make the iframe&lt;br /&gt;
		var params = new URLSearchParams( {&lt;br /&gt;
			autoplay: 1,&lt;br /&gt;
			enablejsapi: 1,&lt;br /&gt;
			rel: 0,&lt;br /&gt;
			origin: window.location.origin&lt;br /&gt;
		} );&lt;br /&gt;
		var id = $video.data( 'video-id' );&lt;br /&gt;
		var url = 'https://www.youtube.com/embed/' + id + '?' + params.toString();&lt;br /&gt;
		var $iframe = $( '&amp;lt;iframe src=&amp;quot;' + url + '&amp;quot; width=&amp;quot;640&amp;quot; height=&amp;quot;360&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;' );&lt;br /&gt;
&lt;br /&gt;
		// Update the DOM&lt;br /&gt;
		$video.find( '.template-video-content' ).html( $iframe );&lt;br /&gt;
&lt;br /&gt;
		// Load the YouTube IFrame Player API code only once&lt;br /&gt;
		if ( TemplateVideo.isYouTubeLoaded === false ) {&lt;br /&gt;
			$.getScript( 'https://www.youtube.com/iframe_api' );&lt;br /&gt;
			window.onYouTubeIframeAPIReady = function () {&lt;br /&gt;
				TemplateVideo.isYouTubeLoaded = true;&lt;br /&gt;
				TemplateVideo.makeYouTubePlayer( $video );&lt;br /&gt;
			};	&lt;br /&gt;
		} else {&lt;br /&gt;
			TemplateVideo.makeYouTubePlayer( $video );&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	isVimeoLoaded: false,&lt;br /&gt;
	loadVimeoVideo: function () {&lt;br /&gt;
		var $video = $( this ).closest( '.template-video' );&lt;br /&gt;
&lt;br /&gt;
		// Make the iframe&lt;br /&gt;
		var id = $video.data( 'video-id' );&lt;br /&gt;
		var url = 'https://player.vimeo.com/video/' + id;&lt;br /&gt;
		var $iframe = $( '&amp;lt;iframe src=&amp;quot;' + url + '&amp;quot; width=&amp;quot;640&amp;quot; height=&amp;quot;360&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;autoplay; fullscreen; picture-in-picture&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;' );&lt;br /&gt;
&lt;br /&gt;
		// Update the DOM&lt;br /&gt;
		$video.find( '.template-video-content' ).html( $iframe );&lt;br /&gt;
&lt;br /&gt;
		// Load the Vimeo Player SDK code only once&lt;br /&gt;
		if ( TemplateVideo.isVimeoLoaded === false ) {&lt;br /&gt;
			$.getScript( 'https://player.vimeo.com/api/player.js' ).done( function () {&lt;br /&gt;
				TemplateVideo.isVimeoLoaded = true;&lt;br /&gt;
				TemplateVideo.makeVimeoPlayer( $video );&lt;br /&gt;
			} );&lt;br /&gt;
		} else {&lt;br /&gt;
			TemplateVideo.makeVimeoPlayer( $video );&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	// This will hold both YouTube and Vimeo players&lt;br /&gt;
	players: [],&lt;br /&gt;
&lt;br /&gt;
	// Create a YouTube player&lt;br /&gt;
	makeYouTubePlayer: function ( $video ) {&lt;br /&gt;
		var $iframe = $video.find( 'iframe' );&lt;br /&gt;
		var index = $video.data( 'video-index' );&lt;br /&gt;
		var id = 'video-iframe-' + index;&lt;br /&gt;
		$iframe.attr( 'id', id );&lt;br /&gt;
		var player = new YT.Player( id, { origin: window.location.origin } );&lt;br /&gt;
		TemplateVideo.players[ index ] = player;&lt;br /&gt;
&lt;br /&gt;
		player.addEventListener( 'onReady', function () {&lt;br /&gt;
			TemplateVideo.playVideoAtTime( index );&lt;br /&gt;
&lt;br /&gt;
			// Highlight the relevant annotation&lt;br /&gt;
			var previousTime = -1;&lt;br /&gt;
			setInterval( function () {&lt;br /&gt;
				var currentTime = player.getCurrentTime();&lt;br /&gt;
				currentTime = Math.floor( currentTime );&lt;br /&gt;
				if ( currentTime === previousTime ) {&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				previousTime = currentTime;&lt;br /&gt;
				TemplateVideo.highlightAnnotation( $video, currentTime );&lt;br /&gt;
			}, 1000 );&lt;br /&gt;
		} );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	// Create a Vimeo player&lt;br /&gt;
	makeVimeoPlayer: function ( $video ) {&lt;br /&gt;
		var $iframe = $video.find( 'iframe' );&lt;br /&gt;
		var index = $video.data( 'video-index' );&lt;br /&gt;
		var iframe = $iframe[0];&lt;br /&gt;
		var player = new Vimeo.Player( iframe );&lt;br /&gt;
		TemplateVideo.players[ index ] = player;&lt;br /&gt;
&lt;br /&gt;
		player.on( 'loaded', function () {&lt;br /&gt;
			TemplateVideo.playVideoAtTime( index );&lt;br /&gt;
&lt;br /&gt;
			// Highlight the relevant annotation&lt;br /&gt;
			var previousTime = -1;&lt;br /&gt;
			setInterval( function () {&lt;br /&gt;
				player.getCurrentTime().then( function ( currentTime ) {&lt;br /&gt;
					currentTime = Math.floor( currentTime );&lt;br /&gt;
					if ( currentTime === previousTime ) {&lt;br /&gt;
						return;&lt;br /&gt;
					}&lt;br /&gt;
					previousTime = currentTime;&lt;br /&gt;
					TemplateVideo.highlightAnnotation( $video, currentTime );&lt;br /&gt;
				} );&lt;br /&gt;
			}, 1000 );&lt;br /&gt;
		} );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	// Play the specified video at the specified time&lt;br /&gt;
	playVideoAtTime: function ( index, hash ) {&lt;br /&gt;
&lt;br /&gt;
		// Figure out the intended video and time&lt;br /&gt;
		if ( !Number.isInteger( index ) ) {&lt;br /&gt;
			index = 0;&lt;br /&gt;
		}&lt;br /&gt;
		if ( !hash ) {&lt;br /&gt;
			hash = window.location.hash;&lt;br /&gt;
		}&lt;br /&gt;
		var time = hash.substr( 1 ).split( ':' );&lt;br /&gt;
		var minutes = time[1] ? parseInt( time[0], 10 ) : 0;&lt;br /&gt;
		var seconds = time[1] ? parseInt( time[1], 10 ) + minutes * 60 : parseInt( time[0], 10 );&lt;br /&gt;
		if ( !Number.isInteger( seconds ) ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		var $video = $( '#video-' + index );&lt;br /&gt;
&lt;br /&gt;
		// Play the specified video at the specified time&lt;br /&gt;
		var player;&lt;br /&gt;
		if ( $video.hasClass( 'youtube' ) ) {&lt;br /&gt;
			player = TemplateVideo.players[ index ];&lt;br /&gt;
			player.seekTo( seconds );&lt;br /&gt;
			player.playVideo();&lt;br /&gt;
		} else if ( $video.hasClass( 'vimeo' ) ) {&lt;br /&gt;
			player = TemplateVideo.players[ index ];&lt;br /&gt;
			player.setCurrentTime( seconds );&lt;br /&gt;
			player.play();&lt;br /&gt;
		} else {&lt;br /&gt;
			player = $video.find( 'video' )[0];&lt;br /&gt;
			player.currentTime = seconds;&lt;br /&gt;
			player.play();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Center the video&lt;br /&gt;
		$video.find( '.template-video-content' )[0].scrollIntoView( { behavior: 'smooth', block: 'center' } );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	// Find the relevant annotation and highlight it&lt;br /&gt;
	highlightAnnotation: function ( $video, currentTime ) {&lt;br /&gt;
		$video.find( '.template-video-annotations a' ).each( function () {&lt;br /&gt;
			var $link = $( this );&lt;br /&gt;
			var href = $link.attr( 'href' );&lt;br /&gt;
			var time = href.substr( 1 ).split( ':' );&lt;br /&gt;
			var minutes = time[1] ? parseInt( time[0], 10 ) : 0;&lt;br /&gt;
			var seconds = time[1] ? parseInt( time[1], 10 ) + minutes * 60 : parseInt( time[0], 10 );&lt;br /&gt;
			var $item = $link.closest( 'li' );&lt;br /&gt;
			if ( currentTime === seconds ) {&lt;br /&gt;
				var $annotations = $item.closest( '.template-video-annotations' );&lt;br /&gt;
				$annotations.find( '.highlight' ).removeClass( 'highlight' );&lt;br /&gt;
				$item.addClass( 'highlight' );&lt;br /&gt;
				$annotations.find( '.mw-collapsible' ).hide();&lt;br /&gt;
				if ( $item.is( ':last-child' ) ) {&lt;br /&gt;
					$item.closest( 'ul' ).next( '.mw-collapsible' ).show();&lt;br /&gt;
				}&lt;br /&gt;
				return false; // Break the loop&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
$( TemplateVideo.init );&lt;/div&gt;</summary>
		<author><name>Tbpedia&gt;Emilio</name></author>
	</entry>
</feed>