{"id":301943,"date":"2026-05-12T18:47:31","date_gmt":"2026-05-12T18:47:31","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/webtv-webradio\/"},"modified":"2026-05-14T20:28:12","modified_gmt":"2026-05-14T20:28:12","slug":"ireplay-tv-channel-radio","status":"publish","type":"plugin","link":"https:\/\/cn.wordpress.org\/plugins\/ireplay-tv-channel-radio\/","author":23483149,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.13","stable_tag":"1.0.13","tested":"6.9.4","requires":"5.9","requires_php":"7.4","requires_plugins":null,"header_name":"iReplay TV Channel and Radio Station","header_author":"iReplay.TV","header_description":"Turn your WordPress site into a 24\/7 TV channel or radio station. Upload your videos, we handle transcoding, scheduling, and delivery.","assets_banners_color":"9961dc","last_updated":"2026-05-14 20:28:12","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/ireplay.tv\/tools\/wordpress-tv-channel-radio","header_author_uri":"https:\/\/ireplay.tv","rating":0,"author_block_rating":0,"active_installs":0,"downloads":190,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.10":{"tag":"1.0.10","author":"ireplaytv","date":"2026-05-14 17:19:02"},"1.0.11":{"tag":"1.0.11","author":"ireplaytv","date":"2026-05-14 17:31:37"},"1.0.12":{"tag":"1.0.12","author":"ireplaytv","date":"2026-05-14 18:38:10"},"1.0.13":{"tag":"1.0.13","author":"ireplaytv","date":"2026-05-14 20:28:12"},"1.0.9":{"tag":"1.0.9","author":"ireplaytv","date":"2026-05-12 18:47:25"}},"upgrade_notice":{"1.0.9":"<p>Tightened \/stream\/token permission check so non-public channels can no longer be requested by public visitors via a frontend nonce. Recommended for all users.<\/p>","1.0.8":"<p>All plugin identifiers renamed to a unified <code>irptvcr<\/code> prefix (WordPress.org review compliance). Update any embeds to [irptvcr_tv_player] \/ [irptvcr_radio_player], and any wp-config.php constants to IRPTVCR_API_KEY \/ IRPTVCR_API_SECRET.<\/p>","1.0.7":"<p>WordPress.org review compliance fixes; shortcodes renamed (see changelog).<\/p>","1.0.6":"<p>WordPress.org review compliance fixes; recommended for all users.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3530285,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3530285,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3530304,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3530304,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.10","1.0.11","1.0.12","1.0.13","1.0.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3530285,"resolution":"1","location":"assets","locale":"","width":1200,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3530285,"resolution":"2","location":"assets","locale":"","width":1200,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3530285,"resolution":"3","location":"assets","locale":"","width":1200,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3530285,"resolution":"4","location":"assets","locale":"","width":1200,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3530285,"resolution":"5","location":"assets","locale":"","width":1200,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3530285,"resolution":"6","location":"assets","locale":"","width":1200,"height":900}},"screenshots":{"1":"Dashboard showing channels and subscription info","2":"Channel creation form","3":"Asset upload with progress bars","4":"Settings page with API credentials","5":"WebTV player embedded on a page","6":"WebRadio player with now-playing info"}},"plugin_section":[],"plugin_tags":[1453,262726,17272,37155,262725],"plugin_category":[],"plugin_contributors":[262727],"plugin_business_model":[],"class_list":["post-301943","plugin","type-plugin","status-publish","hentry","plugin_tags-fast","plugin_tags-linear-tv","plugin_tags-live-streaming","plugin_tags-radio-station","plugin_tags-tv-channel","plugin_contributors-ireplaytv","plugin_committers-ireplaytv"],"banners":{"banner":"https:\/\/ps.w.org\/ireplay-tv-channel-radio\/assets\/banner-772x250.png?rev=3530304","banner_2x":"https:\/\/ps.w.org\/ireplay-tv-channel-radio\/assets\/banner-1544x500.png?rev=3530304","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ireplay-tv-channel-radio\/assets\/icon-128x128.png?rev=3530285","icon_2x":"https:\/\/ps.w.org\/ireplay-tv-channel-radio\/assets\/icon-256x256.png?rev=3530285","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ireplay-tv-channel-radio\/assets\/screenshot-1.png?rev=3530285","caption":"Dashboard showing channels and subscription info"},{"src":"https:\/\/ps.w.org\/ireplay-tv-channel-radio\/assets\/screenshot-2.png?rev=3530285","caption":"Channel creation form"},{"src":"https:\/\/ps.w.org\/ireplay-tv-channel-radio\/assets\/screenshot-3.png?rev=3530285","caption":"Asset upload with progress bars"},{"src":"https:\/\/ps.w.org\/ireplay-tv-channel-radio\/assets\/screenshot-4.png?rev=3530285","caption":"Settings page with API credentials"},{"src":"https:\/\/ps.w.org\/ireplay-tv-channel-radio\/assets\/screenshot-5.png?rev=3530285","caption":"WebTV player embedded on a page"},{"src":"https:\/\/ps.w.org\/ireplay-tv-channel-radio\/assets\/screenshot-6.png?rev=3530285","caption":"WebRadio player with now-playing info"}],"raw_content":"<!--section=description-->\n<p>iReplay TV Channel and Radio Station lets you create live, linear TV and radio channels from your video and audio content. Upload your media, and the plugin turns it into a 24\/7 broadcast-style stream that viewers can tune into at any time.<\/p>\n\n<p><strong>How it works:<\/strong><\/p>\n\n<ol>\n<li>Create a channel (WebTV or WebRadio)<\/li>\n<li>Upload video or audio files<\/li>\n<li>Files are transcoded into HLS format<\/li>\n<li>A 24\/7 schedule is generated automatically<\/li>\n<li>Embed the player on any page with a shortcode<\/li>\n<\/ol>\n\n<p><strong>Key features:<\/strong><\/p>\n\n<ul>\n<li>Create WebTV (video) and WebRadio (audio-only) channels<\/li>\n<li>Weighted random scheduling for varied programming<\/li>\n<li>HLS adaptive bitrate streaming (1080p, 540p, audio-only)<\/li>\n<li>Now-playing display with live program info<\/li>\n<li>Chunked file upload for large media files<\/li>\n<li>Dashboard with channel stats and viewer counts<\/li>\n<\/ul>\n\n<p><strong>Shortcodes:<\/strong><\/p>\n\n<ul>\n<li><code>[irptvcr_tv_player channel=\"my-channel\"]<\/code> - Embed a 24\/7 channel video player<\/li>\n<li><code>[irptvcr_radio_player channel=\"my-radio\"]<\/code> - Embed a 24\/7 channel audio player<\/li>\n<li><code>[irptvcr_vod_player asset_id=\"42\"]<\/code> - Embed a single asset for on-demand playback (with seek)<\/li>\n<\/ul>\n\n<h4>Third-Party Service: iReplay.TV<\/h4>\n\n<p><strong>This plugin relies on the iReplay.TV external service for core functionality.<\/strong> The following data is transmitted to iReplay.TV servers:<\/p>\n\n<p><strong>Connections made to iReplay.TV (<code>https:\/\/ireplay.tv\/api\/wp\/<\/code>):<\/strong><\/p>\n\n<ul>\n<li><strong>Site registration<\/strong> - Your site URL, WordPress version, and plugin version are sent when you first configure API credentials.<\/li>\n<li><strong>Heartbeat<\/strong> - Every 5 minutes, the plugin sends a heartbeat with your plugin and WordPress versions to confirm the site is active.<\/li>\n<li><strong>Channel management<\/strong> - When you create, update, or delete channels, channel metadata (name, handle, description, language) is synced to iReplay.TV.<\/li>\n<li><strong>Transcoding<\/strong> - When you upload media, the source file URL is sent to iReplay.TV for transcoding. Transcoded segments are pushed back to your WordPress server.<\/li>\n<li><strong>Schedule sync<\/strong> - Every hour, the plugin fetches the current program schedule from iReplay.TV for EPG display.<\/li>\n<li><strong>Stream tokens<\/strong> - When a viewer loads the player, a stream token request is proxied through your WordPress server to iReplay.TV. The viewer's IP address and user agent are forwarded for concurrent viewer enforcement.<\/li>\n<li><strong>Usage stats<\/strong> - Daily, the plugin fetches aggregated usage statistics (viewer counts, peak concurrent) from iReplay.TV.<\/li>\n<\/ul>\n\n<p><strong>What is NOT sent through iReplay.TV:<\/strong><\/p>\n\n<ul>\n<li>Actual video\/audio segment data is served directly from your WordPress server to viewers. iReplay.TV only hosts the HLS playlist files (.m3u8), not the media segments.<\/li>\n<li>No payment or billing information is handled by the plugin.<\/li>\n<\/ul>\n\n<p><strong>iReplay.TV service links:<\/strong><\/p>\n\n<ul>\n<li>Service website: <a href=\"https:\/\/ireplay.tv\">https:\/\/ireplay.tv<\/a><\/li>\n<li>Terms of Service: <a href=\"https:\/\/ireplay.tv\/terms\">https:\/\/ireplay.tv\/terms<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/ireplay.tv\/privacy\">https:\/\/ireplay.tv\/privacy<\/a><\/li>\n<\/ul>\n\n<p>An iReplay.TV account and API credentials are required to use this plugin. A free tier is available (1 channel, 5 concurrent viewers).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>webtv-webradio<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the 'Plugins' menu<\/li>\n<li>Go to <strong>WebTV &amp; Radio &gt; Settings<\/strong> and enter your iReplay.TV API credentials<\/li>\n<li>Click <strong>Test Connection<\/strong> to verify<\/li>\n<li>Create your first channel under <strong>WebTV &amp; Radio &gt; Channels<\/strong><\/li>\n<li>Upload media files to the channel<\/li>\n<li>Use <code>[irptvcr_tv_player channel=\"your-handle\"]<\/code> in any post or page<\/li>\n<\/ol>\n\n<h4>Nginx configuration<\/h4>\n\n<p>If your WordPress site uses Nginx, add this to your server block for proper HLS segment serving:<\/p>\n\n<pre><code>location ~* \/wp-content\/uploads\/ireplay\/.*\\.(m4s|ts|mp4|m3u8)$ {\n    add_header Access-Control-Allow-Origin \"*\";\n    add_header Cache-Control \"public, max-age=31536000\";\n}\n<\/code><\/pre>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20ireplay.tv%20account%3F\"><h3>Do I need an iReplay.TV account?<\/h3><\/dt>\n<dd><p>Yes. The plugin requires API credentials from iReplay.TV to function. A free tier is available with 1 channel and up to 5 concurrent viewers.<\/p><\/dd>\n<dt id=\"where%20are%20my%20video%20files%20stored%3F\"><h3>Where are my video files stored?<\/h3><\/dt>\n<dd><p>Your original uploads and transcoded HLS segments are stored on your own WordPress server in <code>wp-content\/uploads\/ireplay\/<\/code>. Only the playlist files (.m3u8) are hosted by iReplay.TV.<\/p><\/dd>\n<dt id=\"what%20video%20formats%20are%20supported%3F\"><h3>What video formats are supported?<\/h3><\/dt>\n<dd><p>Any format supported by FFmpeg can be uploaded. Files are transcoded to HLS with H.264 video and AAC audio at multiple quality levels (1080p, 540p, and audio-only).<\/p><\/dd>\n<dt id=\"can%20i%20have%20multiple%20channels%3F\"><h3>Can I have multiple channels?<\/h3><\/dt>\n<dd><p>Yes. The number of channels depends on your subscription tier: Free (1), Starter (3), Pro (10), Business (unlimited).<\/p><\/dd>\n<dt id=\"how%20does%20billing%20work%3F\"><h3>How does billing work?<\/h3><\/dt>\n<dd><p>Billing is based on concurrent viewer limits, not storage or bandwidth. The free tier allows up to 5 simultaneous viewers. All billing is handled by iReplay.TV.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.13<\/h4>\n\n<ul>\n<li>New VOD player shortcode: <code>[irptvcr_vod_player asset_id=\"42\"]<\/code> plays a single ready asset end-to-end with native HTML5 seek controls. Useful for blog posts where you want to embed a specific video rather than the 24\/7 channel rotation.<\/li>\n<li>Asset list admin: each ready asset now displays its VOD shortcode + master.m3u8 URL (copyable) for use in any HTML player or external embed.<\/li>\n<li>Per-asset playlists and segments are served entirely from the WordPress server via the existing REST proxy (<code>\/wp-json\/ireplay\/v1\/segment?f=\u2026<\/code>) \u2014 no iReplay.TV dependency at playback time.<\/li>\n<\/ul>\n\n<h4>1.0.12<\/h4>\n\n<ul>\n<li>Schema self-heal: plugin now checks on every load that its tables exist. If a previous uninstall dropped them, an update or page load auto-recreates them. Prevents the \"Table doesn't exist\" wedge that occurred when reinstalling after a delete.<\/li>\n<li>CORS fix for assets: per-asset segment_url_prefix now uses the REST proxy URL (<code>\/wp-json\/ireplay\/v1\/segment?f=\u2026<\/code>) instead of the direct uploads path. Eliminates hls.js fragLoadError when the playlist is served cross-origin (which is the normal case for cloud-hosted plugins).<\/li>\n<li>Schedule auto-retry on heartbeat: if a channel has 4+ ready assets but the schedule hasn't activated (e.g. initial trigger fired during a race condition with HLS metadata insertion), the next 5-min heartbeat retries generation. Channels self-heal without manual intervention.<\/li>\n<li>Migration on upgrade: existing channels created on prior versions have their asset segment URLs rewritten in place to the proxy form. Existing deployments fix automatically when they update to 1.0.12.<\/li>\n<li>Retry-sync code path now also uses the proxy URL (the 1.0.11 fix only updated create_channel; clicking \"Retry Sync\" silently reverted to the direct URL).<\/li>\n<li>Daily cleanup cron: orphaned chunked-upload temp directories older than 24h are removed automatically, preventing failed uploads from filling the WP host's uploads quota.<\/li>\n<li>Better diagnostics: when a local INSERT fails, the actual MySQL error is now surfaced in the admin alert message instead of a generic \"Failed to create\u2026\".<\/li>\n<\/ul>\n\n<h4>1.0.11<\/h4>\n\n<ul>\n<li>Register new channels with the REST proxy URL (<code>\/wp-json\/ireplay\/v1\/segment?f=<\/code>) as segment base, so HLS fragments carry CORS headers and play correctly when the playlist is served cross-origin (from iReplay.tv).<\/li>\n<li>Better \"Public channel\" label: now reads \"Allow public visitors to play this channel\" with a description explaining what it does (was wrongly described as \"visible in My TV Channel app\"). Default is now checked for new channels.<\/li>\n<li>uninstall.php now preserves data by default. Channels\/assets\/credentials are kept on plugin delete unless the admin explicitly opts in via Settings \u2192 \"Delete all plugin data on uninstall\". Prevents accidental data loss during plugin replacement flows.<\/li>\n<\/ul>\n\n<h4>1.0.10<\/h4>\n\n<ul>\n<li>Extend admin (edit_posts) bypass to \/now-playing and \/schedule REST endpoints. Channel admins can now preview Now Playing info and EPG for non-public channels (only \/stream\/token had the bypass before).<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Harden \/stream\/token permission check: public visitors must now pass both a wp_rest nonce AND request a public (is_public=1) channel; authenticated editors (edit_posts) bypass the public check so admin\/block-editor previews still work for non-public channels (WordPress.org review compliance)<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Rename all plugin identifiers to use the unified <code>irptvcr<\/code> \/ <code>IRPTVCR_<\/code> prefix \u2014 functions, classes, defines, options, hooks, transients, REST handlers, CSS classes, JS globals, admin page slugs, and shortcodes (WordPress.org review compliance for consistent prefixing)<\/li>\n<li>Shortcodes renamed: [irptvcr_tv_player] (was [ireplaytv_player]) and [irptvcr_radio_player] (was [ireplayradio_player])<\/li>\n<li>wp-config.php constants renamed: IRPTVCR_API_KEY, IRPTVCR_API_SECRET (were JEWEBTV_*)<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Rename shortcodes to [ireplaytv_player] and [ireplayradio_player] to use distinct, conflict-resistant prefixes<\/li>\n<li>Add channel visibility checks (is_active + is_public) to \/now-playing and \/schedule REST endpoints<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Align text domain with assigned plugin slug (ireplay-tv-channel-radio)<\/li>\n<li>Add sanitize_callback to all registered settings<\/li>\n<li>Harden \/stream\/token REST endpoint with nonce check, channel visibility check, and per-IP rate limit<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>WebTV and WebRadio channel support<\/li>\n<li>Chunked media upload with progress<\/li>\n<li>HLS transcoding via iReplay.TV<\/li>\n<li>Shortcode-based player embedding<\/li>\n<li>Now-playing info with live polling<\/li>\n<li>Admin dashboard with channel stats<\/li>\n<\/ul>","raw_excerpt":"Turn your WordPress site into a 24\/7 TV channel or radio station. Upload your videos, we turn them into a live linear broadcast.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/301943","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=301943"}],"author":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ireplaytv"}],"wp:attachment":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=301943"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=301943"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=301943"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=301943"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=301943"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=301943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}