// schedule.js — BlackRoad Network Broadcast Schedule // 43 blocks x 20 min = 860 min (~14.3h) repeating cycle. // Intelligence + human reality + story + system. Full-spectrum curiosity network. export var SCHEDULE = [ // ── Opening: Core Intelligence ── { sourceId: '3blue1brown', title: 'Math Block', category: 'Math', fallbackSourceIds: ['numberphile','khanacademy'] }, { sourceId: 'computerphile', title: 'Systems Block', category: 'Systems', fallbackSourceIds: ['lowlevellearning','beneater'] }, { sourceId: 'veritasium', title: 'Deep Science', category: 'Science', fallbackSourceIds: ['sixtysymbols','sabinehossenfelder'] }, { sourceId: 'dwdocumentary', title: 'Documentary Hour', category: 'Documentary', fallbackSourceIds: ['freedocumentary','timeline'] }, { sourceId: 'lowlevellearning', title: 'Hacker Hour', category: 'Hacker', fallbackSourceIds: ['liveoverflow','computerphile'] }, { sourceId: 'blackroadosinc', title: 'Internal Broadcast', category: 'Internal', fallbackSourceIds: ['computerphile','veritasium'], pinned: true }, // ── Deep Layer: Meaning + Archive ── { sourceId: 'exurb1a', title: 'Philosophy Hour', category: 'Philosophy', fallbackSourceIds: ['pursuitofwonder','academyofideas'] }, { sourceId: 'realengineering', title: 'How It Works', category: 'Engineering', fallbackSourceIds: ['practicalengineering','wendover'] }, { sourceId: 'periscopefilm', title: 'Archive Block', category: 'Archive', fallbackSourceIds: ['timeline','dwdocumentary'] }, { sourceId: 'pbsspacetime', title: 'Deep Space', category: 'Deep Space', fallbackSourceIds: ['sabinehossenfelder','veritasium'] }, { sourceId: 'beneater', title: 'Hardware Block', category: 'Hardware', fallbackSourceIds: ['lowlevellearning','computerphile'] }, { sourceId: 'lemmino', title: 'Cinematic Stories', category: 'Cinematic', fallbackSourceIds: ['johnnyharris','neo'] }, { sourceId: 'twominutepapers', title: 'AI Edge', category: 'AI Edge', fallbackSourceIds: ['yannickilcher','coldfusion'] }, // ── Human Layer: Reality Check ── { sourceId: 'truly', title: 'Human Stories', category: 'Human Stories', fallbackSourceIds: ['softwhiteunderbelly','insider'] }, { sourceId: 'vox', title: 'Context', category: 'Context', fallbackSourceIds: ['insider','wendover'] }, { sourceId: 'numberphile', title: 'Numbers Block', category: 'Math', fallbackSourceIds: ['3blue1brown','sixtysymbols'] }, { sourceId: 'liveoverflow', title: 'Security Block', category: 'Security', fallbackSourceIds: ['lowlevellearning','computerphile'] }, { sourceId: 'sabinehossenfelder', title: 'Physics Frontier', category: 'Physics Frontier', fallbackSourceIds: ['pbsspacetime','veritasium'] }, { sourceId: 'johnnyharris', title: 'World Report', category: 'World Report', fallbackSourceIds: ['vox','wendover'] }, { sourceId: 'stuffmadehere', title: 'Invention Block', category: 'Invention', fallbackSourceIds: ['markrober','beneater'] }, // ── Education Layer: Foundations ── { sourceId: 'khanacademy', title: 'Foundations', category: 'Education', fallbackSourceIds: ['crashcourse','3blue1brown'] }, { sourceId: 'freedocumentary', title: 'Free Doc', category: 'Documentary', fallbackSourceIds: ['dwdocumentary','timeline'] }, { sourceId: 'mitocw', title: 'Lecture Hall', category: 'Lecture', fallbackSourceIds: ['khanacademy','computerphile'] }, { sourceId: 'timeline', title: 'History Block', category: 'History', fallbackSourceIds: ['dwdocumentary','periscopefilm'] }, { sourceId: 'coldfusion', title: 'Future Tech', category: 'Future Tech', fallbackSourceIds: ['twominutepapers','wendover'] }, { sourceId: 'academyofideas', title: 'Big Ideas', category: 'Big Ideas', fallbackSourceIds: ['exurb1a','pursuitofwonder'] }, { sourceId: 'wendover', title: 'Systems Logic', category: 'Systems Logic', fallbackSourceIds: ['realengineering','vox'] }, { sourceId: 'markrober', title: 'Engineering Play', category: 'Engineering Play', fallbackSourceIds: ['stuffmadehere','practicalengineering'] }, // ── Energy Layer: Pace Change ── { sourceId: 'crashcourse', title: 'Fast Track', category: 'Education', fallbackSourceIds: ['khanacademy','infographicsshow'] }, { sourceId: 'practicalengineering', title: 'Real World', category: 'Real World', fallbackSourceIds: ['realengineering','wendover'] }, { sourceId: 'softwhiteunderbelly', title: 'Underbelly', category: 'Human Stories', fallbackSourceIds: ['truly','pbsfrontline'] }, { sourceId: 'pursuitofwonder', title: 'Reflection', category: 'Reflection', fallbackSourceIds: ['exurb1a','closertotruth'] }, { sourceId: 'thecodingtrain', title: 'Creative Code', category: 'Creative Code', fallbackSourceIds: ['beneater','computerphile'] }, { sourceId: 'kurzgesagt', title: 'Visual Explainers', category: 'Visual Explainers', fallbackSourceIds: ['crashcourse','infographicsshow'] }, { sourceId: 'insider', title: 'Deep Dive', category: 'Features', fallbackSourceIds: ['vice','vox'] }, { sourceId: 'michaelreeves', title: 'Chaos Block', category: 'Chaos', fallbackSourceIds: ['stuffmadehere','markrober'] }, // ── Closing: Big Picture ── { sourceId: 'sixtysymbols', title: 'Physics Block', category: 'Physics', fallbackSourceIds: ['veritasium','pbsspacetime'] }, { sourceId: 'pbsfrontline', title: 'Frontline', category: 'Investigative', fallbackSourceIds: ['dwdocumentary','vice'] }, { sourceId: 'infographicsshow', title: 'Visual Data', category: 'Explainers', fallbackSourceIds: ['kurzgesagt','vox'] }, { sourceId: 'vice', title: 'On the Ground', category: 'Documentary', fallbackSourceIds: ['insider','johnnyharris'] }, { sourceId: 'closertotruth', title: 'Ultimate Questions', category: 'Ultimate Questions', fallbackSourceIds: ['exurb1a','academyofideas'] }, { sourceId: 'neo', title: 'Deep Story', category: 'Deep Story', fallbackSourceIds: ['lemmino','johnnyharris'] }, { sourceId: 'blackroadosinc', title: 'Night Broadcast', category: 'Internal', fallbackSourceIds: ['exurb1a','pursuitofwonder'], pinned: true }, ]; export var BLOCK_DURATION = 20; export var CYCLE_LENGTH = SCHEDULE.length * BLOCK_DURATION; // ── Time Helpers ── export function getCurrentTimeHHMM() { var now = new Date(); return String(now.getHours()).padStart(2, '0') + ':' + String(now.getMinutes()).padStart(2, '0'); } export function getCurrentBlockIndex() { var now = new Date(); var mins = now.getHours() * 60 + now.getMinutes(); var posInCycle = mins % CYCLE_LENGTH; return Math.floor(posInCycle / BLOCK_DURATION); } export function getCurrentBlock() { var idx = getCurrentBlockIndex(); return idx >= 0 && idx < SCHEDULE.length ? SCHEDULE[idx] : null; } export function getNextBlock() { var idx = getCurrentBlockIndex(); return SCHEDULE[(idx + 1) % SCHEDULE.length] || null; } export function getBlockAfterNext() { var idx = getCurrentBlockIndex(); return SCHEDULE[(idx + 2) % SCHEDULE.length] || null; } export function getPreviousBlock() { var idx = getCurrentBlockIndex(); return idx > 0 ? SCHEDULE[idx - 1] : SCHEDULE[SCHEDULE.length - 1]; } export function getUpcomingBlocks(count) { count = count || 4; var idx = getCurrentBlockIndex(); var blocks = []; for (var i = 1; i <= count; i++) { blocks.push(SCHEDULE[(idx + i) % SCHEDULE.length]); } return blocks; } export function formatTimeHHMM(hhmm) { if (typeof hhmm === 'number') { var wrapped = ((hhmm % 1440) + 1440) % 1440; var h = Math.floor(wrapped / 60); var m = wrapped % 60; var ampm = h >= 12 ? 'PM' : 'AM'; return (h % 12 || 12) + ':' + String(m).padStart(2, '0') + ' ' + ampm; } var parts = hhmm.split(':').map(Number); var ampm2 = parts[0] >= 12 ? 'PM' : 'AM'; return (parts[0] % 12 || 12) + ':' + String(parts[1]).padStart(2, '0') + ' ' + ampm2; }