Vlogify
Turn any YouTube video into a polished, SEO-optimized WordPress blog post.
Overview
Vlogify converts YouTube videos into complete, ready-to-publish articles. You paste a video URL, choose how you want the article written, and the plugin handles the rest: Google Gemini reads the video directly, and the plugin creates a WordPress post with a title, meta description, keywords, headings, an FAQ section, and structured data (schema) for search engines.
🎬 Any YouTube link
Supports standard watch links, short youtu.be links, and Shorts.
🤖 Reads the video
Powered by Google Gemini, which watches the video itself — so it works even without captions.
🔍 SEO built in
SEO title, meta description, slug, keywords, and JSON-LD schema generated automatically.
❓ Automatic FAQ
5–10 frequently asked questions with FAQ schema for rich results.
🖼️ Featured image
Pulls the YouTube thumbnail into your media library automatically.
🧱 Editor sidebar
Generate posts and insert transcripts directly inside the block editor.
Requirements
| Item | Minimum | Notes |
|---|---|---|
| WordPress | 6.5 | Tested up to 7.0. |
| PHP | 8.1 | 8.2 recommended. |
| Google Gemini API key | — | Free tier available at aistudio.google.com. |
| Outbound HTTPS | — | Your server must be able to reach Google Gemini and YouTube. |
Installation & Activation
- Copy the
ai-video-to-blogfolder intowp-content/plugins/(or upload the ZIP via Plugins → Add New → Upload Plugin). - Go to Plugins in your WordPress admin and click Activate under “Vlogify”.
- On activation the plugin creates its database tables and grants administrators access. A new Vlogify menu appears in the left sidebar.
- Open Vlogify → Settings and enter your Google Gemini API key.
Quick Start
From a fresh install to your first article in five steps:
- Go to Vlogify → Settings, paste your Gemini API key, pick a model, and click Save Changes.
- Go to Vlogify → Create Post.
- Paste a YouTube URL into Video URL.
- Choose your length, style, tone, output type, and post status. If the video has no captions, paste a transcript into Manual Transcript (see Transcripts).
- Click Create Post. When it finishes, use the Edit Post link to review and publish.
Settings
The Settings page (built on the WordPress Settings API) is where you enter your Gemini API key and the default options applied to every new article. It has two sections: Google Gemini and Content Defaults.
Google Gemini & API Key
The plugin is powered by Google Gemini, which reads the YouTube video directly. This is what lets it work even when a video has no usable captions — there is no separate transcript step to fail.
| Item | Detail |
|---|---|
| Where to get a key | aistudio.google.com/app/apikey (free tier available) |
| Key format | Alphanumeric string |
| Models | 2.5 Flash (default), 2.5 Pro, 2.0 Flash, 2.5 Flash-Lite |
How to add your key
- Create a free key at
aistudio.google.com/app/apikey. - In Vlogify → Settings, paste it into Gemini API Key and choose a Gemini Model.
- Click Save Changes.
Choosing a model
- 2.5 Flash — recommended default; fast and supports video.
- 2.0 Flash — separate capacity, useful if 2.5 is busy; lower cost.
- 2.5 Pro — highest quality, slower and pricier.
- 2.5 Flash-Lite — cheapest.
Content Defaults
These values pre-fill the Generate Blog form and are used by the Block Editor sidebar and REST API. You can still override them per article.
| Setting | What it does |
|---|---|
| Default Length | Short (~800), Medium (~1500), or Long (~2500) words. |
| Default Style | Professional, Conversational, Technical, Educational, or Marketing. |
| Default Tone | Formal, Friendly, Expert, or Persuasive. |
| Default Post Status | Draft, Pending Review, or Publish for newly created posts. |
| Auto-create Category | When on, a category named after the video’s channel is created/assigned. |
| Featured Image Source | YouTube thumbnail (automatic), set manually later (on demand), default image, or none. |
| Generate FAQ | Adds an FAQ section and FAQ schema to each post. |
| Generate Schema (JSON-LD) | Outputs Article, VideoObject, and FAQ structured data on the post. |
Create Post
This is the main workspace. Paste a video URL, adjust the options, and click Create Post. The request runs in the background (AJAX) with a progress spinner — the page does not reload. When it completes you’ll see Edit Post and View buttons, plus the number of tokens used.
Supported URL formats
https://www.youtube.com/watch?v=VIDEO_ID
https://youtu.be/VIDEO_ID
https://www.youtube.com/shorts/VIDEO_ID
Generation Options
| Option | Choices | Effect |
|---|---|---|
| Article Length | Short / Medium / Long | Target word count (~800 / ~1500 / ~2500). |
| Writing Style | Professional, Conversational, Technical, Educational, Marketing | Sets the voice and structure of the writing. |
| Tone | Formal, Friendly, Expert, Persuasive | Adjusts the emotional register. |
| Output Type | Blog Post, Tutorial, Listicle, Review, Guide | Shapes the format (e.g. numbered steps for a tutorial). |
| Language | English | Output language of the article. |
| Post Status | Draft, Pending Review, Publish | The status of the created post. “Publish” requires publishing rights. |
| Manual Transcript | Free text (optional) | Used instead of automatic retrieval — see below. |
Transcripts
The article is written from the video’s transcript, so a transcript is required. The plugin tries to obtain one using this fallback chain:
- YouTube captions — automatic retrieval from the video.
- Manual transcript — text you paste into the form.
- Error — if neither is available, generation stops with a clear message.
Automatic retrieval discovers all of a video’s caption tracks and picks the best one for your language. If the captions are only available in another language (for example, a video captioned only in Hindi), the plugin asks YouTube to auto-translate them to your target language. So many videos work automatically — no pasting required.
- The video has no captions at all — nothing exists to fetch. “This video has no captions available…”
- YouTube is rate-limiting your server after many requests in a short time — wait a few minutes and retry. “YouTube is temporarily rate-limiting…”
- The captions are protected and YouTube returns them empty. “This video has captions, but YouTube did not return them…”
aistudio.google.com. Note that processing a video uses more tokens than text and is subject to Gemini's video length limits.How to get a transcript to paste
- On YouTube, open the video → click “…more” under the description → Show transcript → copy the text.
- Or use any transcript/caption tool, then paste the plain text into the Manual Transcript field.
Dashboard
The Dashboard gives you an at-a-glance summary:
- Videos Processed — how many unique videos have been handled.
- Posts Generated — total articles created by the plugin.
- API Tokens Used — cumulative AI tokens consumed (useful for tracking cost).
- Last Generated Post — quick link to your most recent article.
- Recent Activity — a live feed of successes and failures.
Generated Posts
A table of every video the plugin has processed, with its channel, status, the linked WordPress post (with Edit / View links), and the date. Use this to find and revisit articles created from your videos.
Logs
The Logs page records every processing attempt — the video, success or failure, tokens used, the message, and a timestamp. This is the first place to look when something doesn’t work. Use Clear Logs to empty the table.
error row. It tells you exactly what happened (e.g. an invalid API key, or no transcript available).Block Editor Sidebar
While editing any post you can open the Vlogify panel from the editor’s top-right plugin menu (the icon looks like a video screen). From there you can:
- Generate Post From Video — enter a URL, length, style, and tone, then create a fully written draft and jump straight to it.
- Insert Transcript — fetch a transcript and drop it into the editor as a paragraph block.
SEO Optimization
Every generated article is built for search from the ground up:
| Element | Details |
|---|---|
| SEO Title | Click-worthy, under 60 characters. |
| Meta Description | Under 160 characters; also used as the post excerpt. |
| Headings | Proper H2 sections and H3 subsections (the post title is your H1). |
| Slug | Clean, hyphenated URL slug. |
| Keywords | A primary keyword plus secondary keywords (added as tags). |
| Keyword density | Calculated and stored for reference. |
| SEO plugin fields | Title, description, and focus keyword are also written to Yoast SEO and Rank Math meta fields, so they appear automatically if you use those plugins. |
FAQ & Schema
When enabled in Settings, each post includes:
- A Key Takeaways list and a Frequently Asked Questions section (5–10 Q&As) in the post body.
- JSON-LD structured data printed in the page head:
Article,VideoObject, andFAQPage. This helps Google understand your content and can enable rich results (FAQ accordions, video badges).
Featured Image
Based on your Featured Image Source setting:
- YouTube Thumbnail (automatic) — downloads the video’s thumbnail into your Media Library and sets it as the featured image during creation.
- Default Image — uses a media item you specify.
- Set manually later (on demand) — no image is attached at creation; you add one yourself whenever you’re ready (see below).
- None — no featured image.
Setting the featured image “later” (on demand)
You don’t have to decide at creation time. You can attach the video’s thumbnail to any generated post whenever you want, from two places:
- Generated Posts screen — each post row has a Set Featured Image button (it becomes Replace Image once one is set). Click it and the thumbnail is downloaded and assigned instantly — no page reload.
- Block Editor sidebar — while editing the post, open the Vlogify panel and click Set Featured Image From Video. The editor’s Featured Image panel updates immediately.
REST API
The plugin registers authenticated REST endpoints under the avtb/v1 namespace. Every route requires a logged-in user with plugin access and a valid REST nonce.
| Method | Endpoint | Purpose |
|---|---|---|
| POST | /wp-json/avtb/v1/process-video | Validate a URL and store the video record. |
| POST | /wp-json/avtb/v1/generate-post | Run the full pipeline and create a post. |
| POST | /wp-json/avtb/v1/get-transcript | Resolve a transcript for a video. |
| POST | /wp-json/avtb/v1/set-featured-image | Set a post’s featured image from its source video thumbnail. |
| GET | /wp-json/avtb/v1/logs | Retrieve paginated log entries. |
For Developers
Add your own AI provider
Implement the provider interface and return your instance through the avtb_ai_provider filter:
add_filter( 'avtb_ai_provider', function ( $provider, $slug ) {
if ( 'my_llm' === $slug ) {
return new My_Local_LLM_Provider();
}
return $provider;
}, 10, 2 );
Useful hooks
| Hook | Type | Description |
|---|---|---|
avtb_loaded | action | Fires after components are wired; passes the Plugin instance. |
avtb_ai_provider | filter | Swap or extend the active AI provider. |
avtb_required_capability | filter | Change the capability required to use the plugin. |
Custom database tables
| Table | Stores |
|---|---|
{prefix}_avtb_videos | Processed videos and their metadata. |
{prefix}_avtb_transcripts | Resolved transcripts. |
{prefix}_avtb_logs | Activity and error logs. |
Security & Privacy
- Access control — only users with the plugin capability (granted to Administrators) can use it.
- Nonces & permission callbacks protect every form, AJAX call, and REST route against CSRF.
- Input is sanitized, output is escaped, and all database queries are prepared.
- API keys are encrypted at rest and never displayed in full.
- Data sent to Google Gemini — the YouTube URL (and the video title/transcript when used) is sent to Google Gemini, subject to Google's privacy policy. No data is sent anywhere else.
Troubleshooting
The admin menu doesn’t appear
- Make sure the plugin is Activated under Plugins.
- Hard refresh the admin (Ctrl + F5).
- Confirm you’re logged in as an Administrator.
“No transcript could be retrieved automatically”
Expected for most videos — YouTube restricts automatic captions. Paste the transcript into the Manual Transcript box and try again. See Transcripts.
“API key not valid” / authentication error
Your Gemini API key is wrong or incomplete. Re-copy the full key from aistudio.google.com/app/apikey and paste it into the Gemini API Key field in Settings.
The progress spinner never stops
Fixed in v1.0.0. If you upgraded from an earlier build, hard refresh (Ctrl + F5) so your browser loads the updated stylesheet.
“This model is currently experiencing high demand” (Gemini)
A temporary capacity error on Google's side (HTTP 503), not a plugin fault — most common on the free tier at peak times. The plugin automatically retries a few times with backoff, so brief spikes are usually absorbed. If it still fails: wait a minute and retry, switch to 2.0 Flash (separate capacity) in Settings, or enable billing on your Google AI key (the paid tier rarely overloads).
Generation fails or times out
- Check the Logs page for the exact error.
- Verify your server can make outbound HTTPS requests to your AI provider.
- Try a shorter article length, or a faster model in Settings.
Frequently Asked Questions
Do I need my own API key?
Yes. The plugin uses your account with OpenAI, Claude, or Gemini, so you’ll need an API key from one of them.
How much does each article cost?
It depends on the provider, model, and article length, but it’s typically a few cents per article on the default models. Track usage on the Dashboard’s “API Tokens Used” card.
Will the content be unique?
The AI rewrites the transcript into an original article. As with any AI tool, always review and edit before publishing.
Can I generate the same video twice?
Each video is recorded once to avoid accidental duplicates. The existing record is reused if you submit the same URL again.
Does it work with my SEO plugin?
Yes — the SEO title, description, and focus keyword are written to both Yoast SEO and Rank Math fields automatically.
What happens to my data if I delete the plugin?
Deleting (not just deactivating) the plugin removes its tables, options, and the metadata it added to posts. Your published posts themselves remain.