blackroad-os-live / schedule.js
blackroadio's picture
BlackRoad Network v2: full broadcast system + modular codebase
e037c1e
Raw History Blame Contribute Delete
8.63 kB
// 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;
}