Vlogging Schedule Generator

Vlogging Content Schedule Generator

Organize Titles, Topics, and Production Workflow

Total Videos Planned: 0

My Vlog Channel

Period: November 2025 | Vlogger: N/A


Upload Timeline

Upload Date Video Title / Topic Format Production Status

Channel & Scheduling Context


Default Upload Settings

This day is used as a reference for your planning period.

Video Log

Log your videos chronologically. Click a row to remove it.


Current Log

Log is empty.

"; return; } sortedVideos.forEach(video => { const row = document.createElement('div'); row.className = 'vsg-video-row'; const uploadDateFmt = new Date(video.date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); row.innerHTML = `
[${uploadDateFmt}] ${video.title}
`; outputs.listEditor.appendChild(row); }); } // --- 5. EVENT LISTENERS & ACTIONS --- function attachListeners() { // Meta Inputs const metaInputs = [inputs.channelName, inputs.vlogger, inputs.period, inputs.defaultDay]; metaInputs.forEach(inp => inp.addEventListener('input', renderAll)); // Add Video Button document.getElementById('btn-add-video').addEventListener('click', addVideo); } function addVideo() { const date = inputs.uploadDate.value; const format = inputs.format.value; const title = inputs.title.value.trim(); const status = inputs.status.value; if (!date || !title) { alert("Please enter a valid Upload Date and Video Title."); return; } const newVideo = { id: Date.now(), date: date, format: format, title: title, status: status }; vsgData.videos.push(newVideo); // Clear inputs inputs.title.value = ""; renderAll(); } window.removeVideo = function(id) { if(confirm("Remove this video from the schedule?")) { vsgData.videos = vsgData.videos.filter(v => v.id !== id); renderAll(); } }; // --- 6. TAB NAVIGATION --- window.vsgSwitchTab = function(tabId) { document.querySelectorAll('.vsg-tab-pane').forEach(p => p.classList.remove('active')); document.querySelectorAll('.vsg-tab-btn').forEach(b => b.classList.remove('active')); document.getElementById(tabId).classList.add('active'); document.querySelector(`.vsg-tab-btn[data-tab="${tabId}"]`).classList.add('active'); document.getElementById('vlog-schedule-tool').scrollIntoView({behavior: 'smooth'}); }; document.querySelectorAll('.vsg-tab-btn').forEach(btn => { btn.addEventListener('click', function() { vsgSwitchTab(this.dataset.tab); }); }); // --- 7. PDF EXPORT --- const btnDown = document.getElementById('vsg-download-btn'); if(btnDown) { btnDown.addEventListener('click', function() { renderAll(); const element = document.getElementById('vsg-render-area'); const filename = (inputs.channelName.value || 'Schedule').replace(/\s+/g,'_'); const opt = { margin: 0.4, filename: `${filename}_Schedule.pdf`, image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2, useCORS: true }, jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' } }; const origText = btnDown.innerText; btnDown.innerText = "Generating Schedule..."; html2pdf().set(opt).from(element).save().then(() => { btnDown.innerText = origText; }); }); } // Start init(); });
Scroll to Top