{"id":52781,"date":"2016-11-15T14:07:07","date_gmt":"2016-11-15T14:07:07","guid":{"rendered":"https:\/\/wordpress.org\/plugins-wp\/wp-youtube-live\/"},"modified":"2025-12-29T21:51:03","modified_gmt":"2025-12-29T21:51:03","slug":"wp-youtube-live","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/wp-youtube-live\/","author":8798390,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.10.1","stable_tag":"1.10.1","tested":"6.3.8","requires":"3.6","requires_php":"","requires_plugins":null,"header_name":"YouTube Live","header_author":"Andrew Minion","header_description":"","assets_banners_color":"3187d7","last_updated":"2025-12-29 21:51:03","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/cash.me\/$AndrewRMinionDesign","header_plugin_uri":"https:\/\/github.com\/macbookandrew\/wp-youtube-live","header_author_uri":"https:\/\/andrewrminion.com\/","rating":4,"author_block_rating":0,"active_installs":1000,"downloads":66838,"num_ratings":10,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.10.0":{"tag":"1.10.0","author":"macbookandrew","date":"2024-01-16 21:11:57"},"1.10.1":{"tag":"1.10.1","author":"macbookandrew","date":"2025-12-29 21:51:03"},"1.4.1":{"tag":"1.4.1","author":"macbookandrew","date":"2016-12-20 18:30:56"},"1.4.2":{"tag":"1.4.2","author":"macbookandrew","date":"2017-01-10 15:11:47"},"1.5":{"tag":"1.5","author":"macbookandrew","date":"2017-03-03 15:18:57"},"1.5.1":{"tag":"1.5.1","author":"macbookandrew","date":"2017-03-03 15:36:48"},"1.5.2":{"tag":"1.5.2","author":"macbookandrew","date":"2017-03-03 16:02:42"},"1.5.3":{"tag":"1.5.3","author":"macbookandrew","date":"2017-03-03 16:20:29"},"1.5.4":{"tag":"1.5.4","author":"macbookandrew","date":"2017-03-03 16:29:13"},"1.6.3":{"tag":"1.6.3","author":"macbookandrew","date":"2017-08-13 01:07:25"},"1.6.4":{"tag":"1.6.4","author":"macbookandrew","date":"2017-08-15 17:41:51"},"1.7.10":{"tag":"1.7.10","author":"macbookandrew","date":"2018-03-30 13:31:16"},"1.7.11":{"tag":"1.7.11","author":"macbookandrew","date":"2020-03-15 21:28:10"},"1.7.12":{"tag":"1.7.12","author":"macbookandrew","date":"2020-04-15 02:22:48"},"1.7.13":{"tag":"1.7.13","author":"macbookandrew","date":"2020-04-15 02:32:17"},"1.7.14":{"tag":"1.7.14","author":"macbookandrew","date":"2020-04-15 13:42:23"},"1.7.16":{"tag":"1.7.16","author":"macbookandrew","date":"2020-07-08 02:26:09"},"1.7.18":{"tag":"1.7.18","author":"macbookandrew","date":"2021-03-06 14:08:15"},"1.7.19":{"tag":"1.7.19","author":"macbookandrew","date":"2021-07-02 17:41:50"},"1.7.20":{"tag":"1.7.20","author":"macbookandrew","date":"2022-01-18 14:34:00"},"1.7.21":{"tag":"1.7.21","author":"macbookandrew","date":"2022-01-18 14:36:59"},"1.7.22":{"tag":"1.7.22","author":"macbookandrew","date":"2022-03-31 13:35:01"},"1.7.4":{"tag":"1.7.4","author":"macbookandrew","date":"2017-10-24 02:36:10"},"1.7.5":{"tag":"1.7.5","author":"macbookandrew","date":"2017-12-01 16:12:32"},"1.7.6":{"tag":"1.7.6","author":"macbookandrew","date":"2017-12-01 16:24:42"},"1.7.7":{"tag":"1.7.7","author":"macbookandrew","date":"2017-12-12 15:10:12"},"1.7.8":{"tag":"1.7.8","author":"macbookandrew","date":"2018-02-22 19:41:39"},"1.7.9":{"tag":"1.7.9","author":"macbookandrew","date":"2018-03-02 17:40:15"},"1.8.0":{"tag":"1.8.0","author":"macbookandrew","date":"2022-04-14 03:37:47"},"1.8.1":{"tag":"1.8.1","author":"macbookandrew","date":"2022-04-20 01:05:31"},"1.8.2":{"tag":"1.8.2","author":"macbookandrew","date":"2022-04-20 18:00:01"},"1.8.3":{"tag":"1.8.3","author":"macbookandrew","date":"2022-04-20 18:11:16"},"1.8.4":{"tag":"1.8.4","author":"macbookandrew","date":"2022-09-03 18:08:40"},"1.8.5":{"tag":"1.8.5","author":"macbookandrew","date":"2023-02-25 17:35:37"},"1.8.6":{"tag":"1.8.6","author":"macbookandrew","date":"2023-02-25 17:35:32"},"1.8.7":{"tag":"1.8.7","author":"macbookandrew","date":"2023-02-25 17:39:30"},"1.8.8":{"tag":"1.8.8","author":"macbookandrew","date":"2023-03-07 04:34:32"},"1.9.0":{"tag":"1.9.0","author":"macbookandrew","date":"2023-10-18 20:45:38"}},"upgrade_notice":[],"ratings":{"1":1,"2":2,"3":0,"4":0,"5":7},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":2711798,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":2711798,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":2711798,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":2711798,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.10.0","1.10.1","1.4.1","1.4.2","1.5","1.5.1","1.5.2","1.5.3","1.5.4","1.6.3","1.6.4","1.7.10","1.7.11","1.7.12","1.7.13","1.7.14","1.7.16","1.7.18","1.7.19","1.7.20","1.7.21","1.7.22","1.7.4","1.7.5","1.7.6","1.7.7","1.7.8","1.7.9","1.8.0","1.8.1","1.8.2","1.8.3","1.8.4","1.8.5","1.8.6","1.8.7","1.8.8","1.9.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":2488454,"resolution":"1","location":"assets","locale":""}},"screenshots":{"1":"Settings screen"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[230,581,222,1610],"plugin_category":[50,56],"plugin_contributors":[78963],"plugin_business_model":[],"class_list":["post-52781","plugin","type-plugin","status-publish","hentry","plugin_tags-embed","plugin_tags-live","plugin_tags-video","plugin_tags-youtube","plugin_category-media","plugin_category-social-and-sharing","plugin_contributors-macbookandrew","plugin_committers-macbookandrew"],"banners":{"banner":"https:\/\/ps.w.org\/wp-youtube-live\/assets\/banner-772x250.png?rev=2711798","banner_2x":"https:\/\/ps.w.org\/wp-youtube-live\/assets\/banner-1544x500.png?rev=2711798","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wp-youtube-live\/assets\/icon-128x128.png?rev=2711798","icon_2x":"https:\/\/ps.w.org\/wp-youtube-live\/assets\/icon-256x256.png?rev=2711798","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/wp-youtube-live\/assets\/screenshot-1.png?rev=2488454","caption":"Settings screen"}],"raw_content":"<!--section=description-->\n<p>Displays the current YouTube live video from a specified channel via the shortcode <code>[youtube_live]<\/code>.<\/p>\n\n<h4>Setup Notes<\/h4>\n\n<p>Your YouTube livestream must be set to \u201cPublic\u201d or it will not work. This is a security feature of YouTube\u2019s API and unfortunately there\u2019s no way to work around it.<\/p>\n\n<p>In addition, your live stream must be set to allow embedding on third-party sites. If that feature is unavailable, you may need to <a href=\"https:\/\/www.youtube.com\/account_monetization\">enable monetization<\/a> for your account. See YouTube documentation for more information or help with allowing embedding.<\/p>\n\n<h4>How It Works<\/h4>\n\n<p>If no live video is available, you can display a specified video or a \u201cchannel player\u201d showing all your recent videos.<\/p>\n\n<p>You can also enable auto-refresh to automatically check for a live video every 30 seconds (warning: will increase server load, so use with caution).<\/p>\n\n<p>By default, the server will check YouTube\u2019s API and then cache that response for 15 minutes before checking the API again (you may change this value in the admin settings). If auto-refresh is enabled, clients will check against your server every 30 seconds and likely will hit that cache as well, so it can potentially take up to 16 minutes before a client will get a live video.<\/p>\n\n<p>The length of both caches can be changed using the <code>wp_youtube_live_transient_timeout<\/code> filter (see below for more information).<\/p>\n\n<p>If no live video is available when a page is loaded, several fallback options are available:<\/p>\n\n<ul>\n<li>\u201cShow a custom HTML message\u201d allows you to specify a custom message to show<\/li>\n<li>\u201cShow scheduled live videos\u201d will show a player and countdown until your next live video<\/li>\n<li>\u201cShow last completed live video\u201d will show your most recently-completed live video<\/li>\n<li>\u201cShow recent videos from my channel\u201d will show a playlist of recent videos from your channel<\/li>\n<li>\u201cShow a specified playlist\u201d will show a specified playlist<\/li>\n<li>\u201cShow a specified video\u201d will show a specified video<\/li>\n<li>\u201cShow nothing at all\u201d will show nothing at all<\/li>\n<\/ul>\n\n<p>When a video ends, users\u2019 browsers will check your server again to see if a live video is available. If so, it will load that; if not, it will fall back as set in your options.<\/p>\n\n<h4>Shortcode Options<\/h4>\n\n<ul>\n<li><code>width<\/code>: player width in pixels; defaults to what you set on the settings page<\/li>\n<li><code>height<\/code>: player height in pixels; defaults to what you set on the settings page<\/li>\n<li><code>autoplay<\/code>: whether or not to start playing immediately on load; defaults to false<\/li>\n<li><code>auto_refresh<\/code>: (either <code>true<\/code> or <code>false<\/code>) overrides the auto-refresh setting on the settings page<\/li>\n<li><code>fallback_behavior<\/code>: choose from the following: <code>upcoming<\/code>, <code>completed<\/code>, <code>channel<\/code>, <code>playlist<\/code>, <code>video<\/code>, <code>message<\/code>, <code>no_message<\/code>\n\n<ul>\n<li><code>upcoming<\/code>: the next upcoming scheduled video on the specified channel<\/li>\n<li><code>playlist<\/code>: a specified playlist (shortcode must also include the <code>fallback_playlist<\/code> attribute)<\/li>\n<li><code>video<\/code>: a specified video (shortcode must also include the <code>fallback_video<\/code> attribute)<\/li>\n<li><code>message<\/code>: a specified message<\/li>\n<li><code>no_message<\/code>: nothing at all<\/li>\n<\/ul><\/li>\n<li><code>fallback_playlist<\/code>: a playlist URL to show when there are no live videos<\/li>\n<li><code>fallback_video<\/code>: a video URL to show when there are no live videos<\/li>\n<li><code>fallback_message<\/code>: a message to show when there are no live videos<\/li>\n<li><code>js_only<\/code>: (either <code>true<\/code> or <code>false<\/code>) workaround for some caching issues; if a caching plugin (W3 Total Cache, WP Super Cache, etc.) or proxy (CloudFlare, etc.) caches the HTML while a video is live, visitors may continue to see an old live video even if it has ended. If set <code>js_only<\/code> is set to <code>true<\/code>, the server never displays the player code in the initial request and instead sends it in response to uncached ajax requests. This may also result in the video player being slightly delayed on page load due to the extra request, depending on the clients\u2019 bandwidth and latency.<\/li>\n<\/ul>\n\n<p>Example shortcode: <code>[youtube_live width=\"720\" height=\"360\" autoplay=\"true\"]<\/code><\/p>\n\n<h4>Filters<\/h4>\n\n<p>The filter <code>wp_youtube_live_no_stream_available<\/code> will customize the message viewers see if there is no live stream currently playing, and takes effect <strong>after<\/strong> the <code>fallback_message<\/code> shortcode attribute is parsed (if <code>fallback_message=\"no_message\"<\/code> is set in a shortcode, it will override the filter). For example, add this to your theme\u2019s <code>functions.php<\/code> file:<\/p>\n\n<pre><code>add_filter( 'wp_youtube_live_no_stream_available', 'my_ytl_custom_message' );\nfunction my_ytl_custom_message( $message ) {\n    $message = '&lt;p&gt;Please check back later or subscribe to &lt;a target=\"_blank\" href=\"https:\/\/youtube.com\/channel\/UCH\u2026\"&gt;our YouTube channel&lt;\/a&gt;.&lt;\/p&gt;\n    &lt;p&gt;&lt;button type=\"button\" class=\"button\" id=\"check-again\"&gt;Check again&lt;\/button&gt;&lt;span class=\"spinner\" style=\"display:none;\"&gt;&lt;\/span&gt;&lt;\/p&gt;';\n    return $message;\n}\n<\/code><\/pre>\n\n<p>The filter <code>wp_youtube_live_transient_timeout<\/code> is available to customize the cache timeout length in seconds. For example, add this to your theme\u2019s <code>functions.php<\/code> file to set the cache length to 15 seconds instead of the default 900:<\/p>\n\n<pre><code>add_filter( 'wp_youtube_live_transient_timeout', 'my_ytl_custom_timeout' );\nfunction my_ytl_custom_timeout( $timeout ) {\n    return 15;\n}\n<\/code><\/pre>\n\n<h4>Event Listener<\/h4>\n\n<p>When a live stream is loaded, the <code>wpYouTubeLiveStarted<\/code> event is fired; you can use this to create custom front-end features on your site by adding an event listener:<\/p>\n\n<pre><code>window.addEventListener('wpYouTubeLiveStarted', function() {\n    \/* your code here *\/\n    console.log('stream started');\n    \/* your code here *\/\n});\n<\/code><\/pre>\n\n<p>Development of this plugin is done on <a href=\"https:\/\/github.com\/macbookandrew\/wp-youtube-live\/\">GitHub<\/a>. Pull requests are always welcome.<\/p>\n\n<!--section=installation-->\n<p>YouTube setup instructions: see <a href=\"https:\/\/andrewrminion.com\/2020\/03\/setting-up-youtube-live\/\">this article<\/a>.<\/p>\n\n<ol>\n<li>Upload this folder to the <code>\/wp-content\/plugins\/<\/code> directory or install from the Plugins menu in WordPress<\/li>\n<li>Activate the plugin through the Plugins menu in WordPress<\/li>\n<li>Add your Google API key and YouTube Channel ID in the settings page (Settings &gt; YouTube Live)<\/li>\n<li>Add the shortcode <code>[youtube_live]<\/code> into any post\/page to show the live player<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id='how%20does%20this%20work%3F'><h3>How does this work?<\/h3><\/dt>\n<dd><p>This plugin uses Google\u2019s <a href=\"https:\/\/developers.google.com\/youtube\/v3\/\">YouTube Data API<\/a> to search for in-progress live videos and if one is found, embeds it in the page.<\/p><\/dd>\n<dt id='api-what%3F'><h3>API-what?<\/h3><\/dt>\n<dd><p>API stands for \u201cApplication Programming Interface,\u201d which basically means computer code that is able to talk to other computer systems and get or send information. Most API providers require an API key of some sort (similar to a username and password) to ensure that only authorized people are able to use their services.<\/p><\/dd>\n<dt id='what%20info%20is%20sent%20or%20received%3F'><h3>What info is sent or received?<\/h3><\/dt>\n<dd><p>When the shortcode is used in a page, your web server makes a request to YouTube\u2019s servers asking for information about the videos in your channel, using your channel ID and API key to authenticate. If you don\u2019t have an API key set up or it\u2019s not authorized for the YouTube Data API, the request will be denied.<\/p>\n\n<p>For more information on setting up an API key, see the <a href=\"https:\/\/developers.google.com\/youtube\/registering_an_application\">YouTube Data API reference<\/a>; for purposes of this plugin, you\u2019ll need a \u201cbrowser key.\u201d<\/p><\/dd>\n<dt id='why%20doesn%E2%80%99t%20my%20live%20stream%20show%20up%20immediately%3F'><h3>Why doesn\u2019t my live stream show up immediately?<\/h3><\/dt>\n<dd><p>Generally, it can take up to 15 minutes for the streaming page with the shortcode to recognize that you have a live stream, for several reasons:<\/p>\n\n<ol>\n<li>YouTube\u2019s API caches information about your videos for a short time (seems to be 2 minutes max).<\/li>\n<li>To help you from exceeding the free API quota, this plugin caches YouTube\u2019s API response for 15 minutes (configurable using the transient timeout setting), instead of checking the API every time an update is requested by a client. See Quota Units below for more information.<\/li>\n<li>If you are using a caching plugin (WP Super Cache, W3 Total Cache, etc.), the generated page content is cached on your server, including whatever shortcode content is available when the cache is created. However, this plugin provides a workaround by sending an Ajax request from the user\u2019s browser when the page is loaded, and then every 30 seconds thereafter until a live video is available (also configurable using the <code>wp_youtube_live_transient_timeout<\/code> filter).<\/li>\n<\/ol>\n\n<p>In short, there\u2019s a tradeoff between showing the live video immediately and minimizing API quota and server resource usage, and I\u2019ve tried to strike a reasonable balance, while allowing you the ability to tweak the cache timeouts yourself to fit your needs.<\/p><\/dd>\n<dt id='quota%20units'><h3>Quota Units<\/h3><\/dt>\n<dd><ul>\n<li>The YouTube Data API used by this plugin enforces a daily quota limit. Each request to find live videos costs 100 quota units, and the current daily cap (as of April 14, 2020) is 10,000 daily quota units.<\/li>\n<li>Every time this plugin checks for live videos, it costs 100 quota units. The API responses are cached for 15 minutes (by default) on your server to help stay within the daily quota limit.<\/li>\n<li>End users\u2019 browsers will request an update from your site every 30 seconds.<\/li>\n<li>The admin settings panel has a field to configure how often to check the YouTube Data API for live videos. A value of 900 seconds (15 minutes) should stay pretty close to the default daily quota. If you have low traffic during \u201coff hours\u201d (when you\u2019re not likely to be broadcasting a live event), you may be able to experiment and set this lower, since the quota won\u2019t be consumed as much during the off hours.<\/li>\n<li>Fallback behavior:\n\n<ul>\n<li>\u201cShow a custom HTML message\u201d costs no additional quota units<\/li>\n<li>\u201cShow scheduled live videos\u201d fallback behavior costs an additional 100 quota units per API call plus 3 quota units for each scheduled video you have (until the next-scheduled video starts [plus a 15-minute \u201cgrace period\u201d to give some leeway for your actual start time], or for 5 minutes if there are no videos scheduled)<\/li>\n<li>\u201cShow last completed live video\u201d fallback behavior costs an additional 100 quota units per API call<\/li>\n<li>\u201cShow recent videos from my channel\u201d fallback behavior costs 1 quota unit for the call + 2 quota units for each video listed<\/li>\n<li>\u201cShow a specified playlist\u201d fallback behavior costs 1 quota unit for the call + 2 quota units for each video in the playlist<\/li>\n<li>\u201cShow a specified video\u201d costs no additional quota units<\/li>\n<li>\u201cShow nothing at all\u201d costs no additional quota units<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<p>Estimated quota usage:<\/p>\n\n<ul>\n<li>If the transient timeout is set to 900 seconds and the page containing the shortcode is open in a browser 24\/7, it should cost 9,600 quota units per day, regardless of how many visitors (due to the plugin\u2019s caching mechanism).<\/li>\n<li>If fallback behavior is set to \u201cscheduled live videos\u201d or \u201clast completed live video,\u201d it should cost an additional 100 quota units when the next-scheduled video begins (or every 5 minutes if no videos are scheduled).<\/li>\n<li>If fallback behavior is set to \u201cspecified playlist,\u201d it should cost an additional 1 quota unit per page load plus 2 quota units per video in the playlist.<\/li>\n<li>If fallback behavior is set to \u201cspecified playlist\u201d or \u201cspecified video,\u201d it should cost an additional 3 quota unit per page load.<\/li>\n<\/ul>\n\n<p>These are estimates; your usage may vary. To see your actual quota usage in real time, visit the <a href=\"https:\/\/console.developers.google.com\/apis\/api\/youtube\/usage\">API Usage page<\/a>.<\/p>\n\n<p>The YouTube quota limit has been tightened down in recent years: as of April 14, 2020, it allows a max of 10 thousand quota units per day. However, you can <a href=\"https:\/\/support.google.com\/youtube\/contact\/yt_api_form\">request a quota increase here<\/a>.<\/p>\n\n<p>If your API project has been active for more than 2 years or so, you may have a drastically higher quota limit and can set the transient lower.<\/p>\n\n<p>I am looking at other ways to accomplish the necessary behavior closer to realtime while remaining within the quota limits.<\/p><\/dd>\n<dt id='terms%20of%20service%20and%20privacy%20policy'><h3>Terms of Service and Privacy Policy<\/h3><\/dt>\n<dd><p>This plugin stores your channel ID and API token in your WordPress options table, but does not store or collect any other information.<\/p>\n\n<p>Because this plugin helps you use the YouTube service, you should refer to these documents as well:<\/p>\n\n<ul>\n<li><a href=\"https:\/\/www.youtube.com\/t\/terms\">YouTube Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a><\/li>\n<\/ul><\/dd>\n<dt id='how%20can%20i%20report%20security%20bugs%3F'><h3>How can I report security bugs?<\/h3><\/dt>\n<dd><p>You can report security bugs through the Patchstack Vulnerability Disclosure Program. The Patchstack team helps validate, triage and handle any security vulnerabilities. <a href=\"https:\/\/patchstack.com\/database\/vdp\/ba780b5d-5e4e-4b5a-aa46-21df29abcd05\">Report a security vulnerability.<\/a><\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.10.1<\/h4>\n\n<ul>\n<li>Add nonce to protect cache flush<\/li>\n<\/ul>\n\n<h4>1.10.0<\/h4>\n\n<ul>\n<li>Fix <code>show_related<\/code> parameter<\/li>\n<li>Fix debug output<\/li>\n<li>Add capability checking to see debug output<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>Add YouTube Terms of Service and Google Privacy Policy<\/li>\n<\/ul>\n\n<h4>1.8.8<\/h4>\n\n<ul>\n<li>Prevent undefined index error<\/li>\n<\/ul>\n\n<h4>1.8.7<\/h4>\n\n<ul>\n<li>Fix deployment<\/li>\n<\/ul>\n\n<h4>1.8.6<\/h4>\n\n<ul>\n<li>Fix undefined index error when no upcoming videos are available<\/li>\n<\/ul>\n\n<h4>1.8.5<\/h4>\n\n<ul>\n<li>Prevent any errors from showing up when debug mode is disabled<\/li>\n<\/ul>\n\n<h4>1.8.4<\/h4>\n\n<ul>\n<li>Fix \u201cundefined index\u201d issue in debug logs<\/li>\n<li>Fix persistent update notice<\/li>\n<\/ul>\n\n<h4>1.8.3<\/h4>\n\n<ul>\n<li>Escape admin-visible debug output<\/li>\n<\/ul>\n\n<h4>1.8.2<\/h4>\n\n<ul>\n<li>Escape oembed output<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>Update code documentation<\/li>\n<li>Update plugin branding images<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Fix reported security issues<\/li>\n<li>Update plugin branding images<\/li>\n<\/ul>\n\n<h4>1.7.22<\/h4>\n\n<ul>\n<li>Fix reflected cross-site scripting vulnerability<\/li>\n<\/ul>\n\n<h4>1.7.21<\/h4>\n\n<ul>\n<li>Fix error on activation<\/li>\n<\/ul>\n\n<h4>1.7.20<\/h4>\n\n<ul>\n<li>Fix error when no upcoming videos are cached<\/li>\n<\/ul>\n\n<h4>1.7.19<\/h4>\n\n<ul>\n<li>Add referer to API requests.<\/li>\n<\/ul>\n\n<h4>1.7.18<\/h4>\n\n<ul>\n<li>Test with WordPress 5.7<\/li>\n<li>Improve cache flush tool<\/li>\n<li>Improve deployment process<\/li>\n<\/ul>\n\n<h4>1.7.17<\/h4>\n\n<ul>\n<li>Fix issue with invalid videos response.<\/li>\n<\/ul>\n\n<h4>1.7.16<\/h4>\n\n<ul>\n<li>Add utility to flush cache.<\/li>\n<\/ul>\n\n<h4>1.7.15<\/h4>\n\n<ul>\n<li>Add Terms of Service and Privacy Policy.<\/li>\n<\/ul>\n\n<h4>1.7.14<\/h4>\n\n<ul>\n<li>Update FAQs and add admin notices.<\/li>\n<\/ul>\n\n<h4>1.7.13<\/h4>\n\n<ul>\n<li>Update FAQs.<\/li>\n<\/ul>\n\n<h4>1.7.12<\/h4>\n\n<ul>\n<li>Add transient timeout field.<\/li>\n<li>Update quota usage documentation due to recent changes.<\/li>\n<\/ul>\n\n<h4>1.7.11<\/h4>\n\n<ul>\n<li>Add link to setup instructions.<\/li>\n<\/ul>\n\n<h4>1.7.10<\/h4>\n\n<ul>\n<li>Fix a bug that could casue a player to show up even if no video is live.<\/li>\n<\/ul>\n\n<h4>1.7.9<\/h4>\n\n<ul>\n<li>Fix a bug causing duplicate players when the shortcode is inside a <code>&lt;p&gt;<\/code> element.<\/li>\n<\/ul>\n\n<h4>1.7.8<\/h4>\n\n<ul>\n<li>Fix some bugs with shortcode parameters<\/li>\n<li>Fix a bug where scheduled videos would cause an API error when checking for current live videos<\/li>\n<li>Add more documentation about available shortcode parameters<\/li>\n<li>Add a note about empty fallback video field<\/li>\n<\/ul>\n\n<h4>1.7.7<\/h4>\n\n<ul>\n<li>Add <code>js_only<\/code> shortcode parameter to work around some caching issues<\/li>\n<\/ul>\n\n<h4>1.7.6<\/h4>\n\n<ul>\n<li>Fix a typo in the admin<\/li>\n<li>Update the screenshot of the admin showing all the currently-available settings<\/li>\n<\/ul>\n\n<h4>1.7.5<\/h4>\n\n<ul>\n<li>Fix a typo related to \u201cshow related videos\u201d<\/li>\n<li>Add missing support for autoplay and \u201cshow related videos\u201d to playlist and video fallback options<\/li>\n<li>Add note in admin about Google Chrome\u2019s autoplay policy change<\/li>\n<\/ul>\n\n<h4>1.7.4<\/h4>\n\n<ul>\n<li>Fix issues with shortcode parameters being ignored<\/li>\n<li>Fix issues with errors being displayed when in fact there were none<\/li>\n<li>Fix issues with \u201cShow recent videos from my channel\u201d fallback behavior<\/li>\n<li>Fix typos and clarify some fallback behavior<\/li>\n<\/ul>\n\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>This update sponsored by <a href=\"https:\/\/internationalpodcastday.com\/\">International Podcast Day<\/a><\/li>\n<li>Fix issues with upcoming video caching<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>This update sponsored by <a href=\"https:\/\/internationalpodcastday.com\/\">International Podcast Day<\/a><\/li>\n<li>Automatically load fallback behavior when a video ends<\/li>\n<li>If fallback behavior is \u201cShow upcoming videos,\u201d cache a list of upcoming videos for 24 hours to save API quota unit cost<\/li>\n<li>Use YouTube\u2019s API instead of a <code>&lt;iframe<\/code> embed<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>This update sponsored by <a href=\"https:\/\/internationalpodcastday.com\/\">International Podcast Day<\/a><\/li>\n<li>Fix a few minor bugs introduced in v1.7.0<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>This update sponsored by <a href=\"https:\/\/internationalpodcastday.com\/\">International Podcast Day<\/a><\/li>\n<li>Improve fallback behavior by adding these options:\n\n<ul>\n<li>Next upcoming video<\/li>\n<li>Most recently-completed live video<\/li>\n<li>All videos in a channel<\/li>\n<li>A specified playlist<\/li>\n<li>A specified video<\/li>\n<li>A custom message<\/li>\n<li>Nothing at all<\/li>\n<\/ul><\/li>\n<li>Improve transient cache handling<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Fix error handling<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Add error handling for API key issues<\/li>\n<li>Fix some miscellaneous PHP issues<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Add a JS event for custom uses<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Add settings for default width and height<\/li>\n<li>Add setting for auto-refresh feature<\/li>\n<li>Add support for a fallback video if no live stream is available<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Add support for a channel player if no live stream is available<\/li>\n<li>Automatically recheck every 30 seconds to see if a live stream is available<\/li>\n<\/ul>\n\n<h4>1.5.4<\/h4>\n\n<ul>\n<li>Minor fix for <code>no_stream_message<\/code> attribute handling for real this time<\/li>\n<\/ul>\n\n<h4>1.5.3<\/h4>\n\n<ul>\n<li>Minor fix for <code>no_stream_message<\/code> attribute handling<\/li>\n<\/ul>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>Minor fix for <code>no_stream_message<\/code> attribute handling<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Minor fix for an upgrade issue if the subdomain was not set after an upgrade<\/li>\n<\/ul>\n\n<h4>1.5<\/h4>\n\n<ul>\n<li>Add support for pre-shortcode \u201cno stream available\u201d\u00a0message<\/li>\n<li>Add support for gaming.youtube.com subdomain<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Fix minor readme formatting issues<\/li>\n<\/ul>\n\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Fix minor issues<\/li>\n<\/ul>\n\n<h4>1.4<\/h4>\n\n<ul>\n<li>Use curl instead of file_get_contents as it didn\u2019t work reliably on some hosting environments.<\/li>\n<li>Add a visual spinner when checking via Ajax<\/li>\n<li>Cache results to reduce API calls (defaults to 30-second expiration)<\/li>\n<\/ul>\n\n<h4>1.3<\/h4>\n\n<ul>\n<li>Add Ajax button to check from client-side for live video<\/li>\n<\/ul>\n\n<h4>1.2<\/h4>\n\n<ul>\n<li>Add debugging information for logged-in users<\/li>\n<\/ul>\n\n<h4>1.1<\/h4>\n\n<ul>\n<li>Use PHP class instead of unreliable client-side JS to search for live videos<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Displays the current YouTube live video from a specified channel.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/52781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=52781"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/macbookandrew"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=52781"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=52781"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=52781"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=52781"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=52781"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=52781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}