{"id":353398,"date":"2026-09-14T02:33:17","date_gmt":"2026-09-14T02:33:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kreva-srt-subtitles-for-tutor-lms\/"},"modified":"2026-09-14T02:32:42","modified_gmt":"2026-09-14T02:32:42","slug":"kreva-srt-subtitles-for-tutor-lms","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/kreva-srt-subtitles-for-tutor-lms\/","author":20293960,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.4","stable_tag":"0.1.4","tested":"7.1","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Kreva SRT Subtitles for Tutor LMS","header_author":"Kreva Estudio","header_description":"Custom subtitles (.srt) for the YouTube videos in Tutor LMS lessons, independent from YouTube's native captions.","assets_banners_color":"354565","last_updated":"2026-09-14 02:32:42","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/krevaestudio.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":37,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"0.1.4":{"tag":"0.1.4","author":"krevaestudio","date":"2026-09-14 02:32:42","revision":3694365}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3694362,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3694362,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3694362,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3694362,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3694362,"resolution":"1","location":"assets","locale":"","width":802,"height":452},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3694362,"resolution":"2","location":"assets","locale":"","width":802,"height":452},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3694362,"resolution":"3","location":"assets","locale":"","width":254,"height":133}},"screenshots":{"1":"The Tutor LMS -&gt; SRT Subtitles admin screen: pick the .srt file for each lesson straight from the Media Library.","2":"A lesson with subtitles on: the plugin adds its own button to the player and renders the caption over the video.","3":"Close-up of the subtitles button the plugin adds to the player controls."}},"plugin_section":[],"plugin_tags":[1953,1981,42523,1982],"plugin_category":[34],"plugin_contributors":[280558],"plugin_business_model":[],"class_list":["post-353398","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-captions","plugin_tags-srt","plugin_tags-subtitles","plugin_category-accessibility","plugin_contributors-krevaestudio","plugin_committers-krevaestudio"],"banners":{"banner":"https:\/\/ps.w.org\/kreva-srt-subtitles-for-tutor-lms\/assets\/banner-772x250.png?rev=3694362","banner_2x":"https:\/\/ps.w.org\/kreva-srt-subtitles-for-tutor-lms\/assets\/banner-1544x500.png?rev=3694362","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kreva-srt-subtitles-for-tutor-lms\/assets\/icon-128x128.png?rev=3694362","icon_2x":"https:\/\/ps.w.org\/kreva-srt-subtitles-for-tutor-lms\/assets\/icon-256x256.png?rev=3694362","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/kreva-srt-subtitles-for-tutor-lms\/assets\/screenshot-1.png?rev=3694362","caption":"The Tutor LMS -&gt; SRT Subtitles admin screen: pick the .srt file for each lesson straight from the Media Library."},{"src":"https:\/\/ps.w.org\/kreva-srt-subtitles-for-tutor-lms\/assets\/screenshot-2.png?rev=3694362","caption":"A lesson with subtitles on: the plugin adds its own button to the player and renders the caption over the video."},{"src":"https:\/\/ps.w.org\/kreva-srt-subtitles-for-tutor-lms\/assets\/screenshot-3.png?rev=3694362","caption":"Close-up of the subtitles button the plugin adds to the player controls."}],"raw_content":"<!--section=description-->\n<p>Tutor LMS masks its YouTube videos with Plyr, which hides the player's native subtitle (CC) button. This plugin adds its own button that turns subtitles on\/off from an <code>.srt<\/code> file YOU attach per lesson \u2014 it doesn't depend on the video having captions on YouTube, manual or automatic.<\/p>\n\n<p><strong>Why custom subtitles instead of YouTube's captions:<\/strong><\/p>\n\n<ul>\n<li>Full quality control: you review the <code>.srt<\/code> yourself, instead of relying on YouTube's automatic speech recognition (which mangles negations and proper names).<\/li>\n<li>Works the same with third-party videos: the video owner doesn't need to have uploaded captions \u2014 only playback-time sync is needed, which YouTube's API exposes for any embed.<\/li>\n<li>Doesn't touch the player: it hooks into the extension point Tutor deliberately exposes (<code>window.TutorLessonPlayer<\/code> \/ <code>tutorLessonPlayerReady<\/code> event), it doesn't replace or interfere with Plyr.<\/li>\n<\/ul>\n\n<p><strong>How to use it:<\/strong><\/p>\n\n<ol>\n<li>Activate the plugin.<\/li>\n<li>Go to <em>Tutor LMS \u2192 SRT Subtitles<\/em>.<\/li>\n<li>Pick the <code>.srt<\/code> file for each lesson from the Media Library.<\/li>\n<li>The subtitles button appears automatically on that lesson \u2014 only on lessons that have an <code>.srt<\/code> uploaded.<\/li>\n<\/ol>\n\n<p>Both administrators and Tutor instructors can manage subtitles.<\/p>\n\n<p>This plugin requires the Tutor LMS plugin to be installed and active.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20the%20.srt%20file%20reachable%20at%20a%20public%20url%3F\"><h3>Is the .srt file reachable at a public URL?<\/h3><\/dt>\n<dd><p>Yes. The file is uploaded to the WordPress Media Library, which serves attachments at a public URL by default (this is standard WordPress behavior, not something this plugin decides). Even though Tutor requires enrollment to view the full lesson, anyone who knows or guesses the direct <code>.srt<\/code> URL could download the transcript without being enrolled. If your lessons are paid and the <code>.srt<\/code> content is sensitive, keep this in mind \u2014 consider a private-media plugin if that's a concern for your site.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20vimeo%20or%20html5%20video%3F\"><h3>Does it work with Vimeo or HTML5 video?<\/h3><\/dt>\n<dd><p>Syncing uses <code>plyr.currentTime<\/code>, which Plyr normalizes across providers. It hasn't been formally tested outside of YouTube, but nothing in it is YouTube-specific.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20upload%20an%20.srt%20with%20formatting%20tags%20%28%60%3Cfont%3E%60%2C%20%60%3Ci%3E%60%29%20exported%20from%20youtube%20studio%3F\"><h3>What happens if I upload an .srt with formatting tags (``, ``) exported from YouTube Studio?<\/h3><\/dt>\n<dd><p>The tags are stripped and the clean text is shown. Italics and color are not rendered.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Removed the bundled translation files (<code>.po<\/code>\/<code>.mo<\/code>\/<code>.pot<\/code>). Translations are handled through translate.wordpress.org once the plugin is hosted there.<\/li>\n<li>Renamed the internal function, constant, asset and CSS-class prefixes to a plugin-specific namespace, to rule out any collision with the host plugin's own identifiers.<\/li>\n<li>Declared the Tutor LMS dependency through the <code>Requires Plugins<\/code> header (WordPress 6.5+).<\/li>\n<li>Bounded the admin lesson query instead of loading every post at once.<\/li>\n<li>Hardening: unslash request input before sanitizing, and escape the post-save redirect URL.<\/li>\n<li><code>Tested up to<\/code> bumped to 7.1.<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Renamed from \"Tutor LMS \u2013 Custom SRT Subtitles\" (slug <code>tutor-srt-subtitles<\/code>) to \"SRT Subtitles for Tutor LMS\" (slug <code>srt-subtitles-for-tutor-lms<\/code>), per WordPress.org's plugin directory guideline on trademarks (a third-party product name can't be the sole or initial term of a plugin slug), and then to \"Kreva SRT Subtitles for Tutor LMS\" (slug <code>kreva-srt-subtitles-for-tutor-lms<\/code>) to add a distinctive brand identifier.<\/li>\n<li>Added <code>License<\/code> \/ <code>License URI<\/code> to the plugin header and removed the discouraged <code>load_plugin_textdomain()<\/code> call.<\/li>\n<li>Source strings (code and readme) switched from Spanish to English, the expected default for a WordPress.org plugin.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>The permission model now uses <code>manage_tutor_instructor<\/code> (covers both instructors and administrators) instead of restricting everything to administrators.<\/li>\n<li>The filter that allows uploading <code>.srt<\/code> files to the Media Library is now scoped by capability instead of being global.<\/li>\n<li>Added an activation hook that defensively grants <code>manage_tutor_instructor<\/code> to the administrator role, in case Tutor's own activation hook never ran on the site (e.g. cloned\/imported installs).<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Fix: <code>.srt<\/code> files exported from YouTube Studio carried formatting tags (<code>&lt;font&gt;<\/code>, <code>&lt;i&gt;<\/code>) that showed up as literal text in the overlay.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Custom subtitles (.srt) for the YouTube videos embedded in Tutor LMS lessons, without relying on YouTube&#039;s native captions.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/353398","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=353398"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/krevaestudio"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=353398"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=353398"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=353398"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=353398"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=353398"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=353398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}