인터넷 아카이브의 VHS 영상을 24시간 실시간 TV 채널로 바꿔주는 '대안 케이블 TV' 네트워크를 만들고 있습니다.
I'm building an "alternative cable TV" network that transforms the Internet Archive's ephemeral VHS media into 24/7 live-synced television stations.
핵심 요약
인터넷 아카이브의 방대한 VHS 영상을 활용해 24시간 실시간 스트리밍 채널을 제공하는 'spelunkr' 프로젝트입니다.
- 프로젝트 개요 — 인터넷 아카이브 영상을 활용해 24시간 실시간 케이블 TV 경험을 재현함
- 기술 스택 — Claude Code를 활용해 8만 7천 줄 규모의 코드로 개발 및 850개 이상의 단위 테스트 수행
- 주요 기능 — 실시간 동기화 스트리밍, 기계 학습 기반 자막 생성, 타임라인 기반 댓글 및 반응 기능 제공
- 콘텐츠 구성 — VHS 녹화본 기반의 REWIND 채널과 특정 장르별 영화 채널 등 총 28개 채널 운영
spelunkr.tv
원문 사이트로 이동
이름은 spelunkr라고 해.
지금까지 28개 채널의 잊혀진 영상들을 테마별 "케이블 TV 채널"로 묶어서 24시간 내내 동기화된 일정으로 틀어주는 서비스야.
지금까지 모은 영상만 2,700시간 분량이고, 24시간 내내 돌아가. 옛날 TV처럼 채널을 틀면 다른 시청자들과 똑같은 시간에, 지금 나오고 있는 영상을 바로 보게 되는 거지.
코드베이스는 총 87,000줄 정도 돼. 앱 코드 24,000줄, CSS 13,000줄, 툴링 스크립트 28,000줄, 테스트 코드 16,000줄, SQL 5,000줄로 구성됐어. 8개월 동안 커밋 670번 찍었고, 유닛 테스트 850개랑 브라우저 테스트 160개 넘게 돌리고 있어. 진짜 애정을 쏟은 프로젝트고, Claude로 뭘 만들지 고민하다 처음 떠올린 아이디어라 시간 날 때마다 조금씩 키워왔지.
지난 8개월 동안 틈틈이 매달렸는데, 총 작업 시간으로 치면 한 40일 정도 될 거야. 거의 다 Claude Code로 만들었어. 내부 구조는 대충 이래:
웹사이트의 모든 영상은 Internet Archive에서 직접 스트리밍해. 플레이어는 Archive의 파일 주소를 가리키는 순수 HTML <video> 요소야. iframe도 없고, 프록시도 없고, 재인코딩도 없고, 복사본도 없어. Spelunkr 자체는 페이지(gzip 압축 시 자바스크립트 약 110KB), 작은 JSON 일정표, 그리고 쉬는 시간에 나올 퍼블릭 도메인이나 CC BY, BY-SA 음악 트랙 200개 정도만 제공해. 모든 영상 제목은 Archive에 있는 해당 테이프 페이지로 연결돼.
채널 사이사이에는 예전 Adult Swim 감성을 살린 "범프(bump)" 광고가 들어가.
채널은 Archive 검색 결과를 바탕으로 만들어. IA에 채널 하나를 꽉 채울 만큼 콘텐츠가 있는지 확인하는 거지. 어떤 채널은 "REWIND"라고 분류되는데, 보통 1993년에 누군가 VCR로 녹화한 실제 케이블 TV 방송을 2~6시간 분량으로 립(rip)한 거야. 공포, 괴수물, 탐정 느와르, 서부극 같은 고전 영화 채널도 있어. 심지어 '그림을 그립시다(The Joy of Painting)' 전 에피소드를 다 찾아서 12번 채널 'HAPPY TREES'로 만들기도 했지.
Claude가 테이프가 제대로 된 건지 다 확인하고, 내가 승인할 수 있게 설명이랑 정보, 편성표를 짜줘. 채널마다 고유한 브랜딩이 있는데, 8가지 색상 토큰으로 그린 32x32 픽셀 로고랑 채널 고유의 쉬는 시간 안내 멘트, 그리고 음악 리스트가 따로 있어.
채널에서 테이프를 순서대로 트는 방식은 세 가지야: 연도별(8개 채널), 랜덤(12개 채널), 블록 로테이션(4개 채널). 블록 로테이션은 한 프로그램 에피소드 몇 개 틀고, 다음 프로그램으로 넘어가는 식으로 계속 돌아가는 방식이지.
채널은 시작 시간이 정해진 테이프 목록이야.
"지금 뭐 나오는지"는 산수야. 시작 시간부터 현재까지 일정표를 쭉 훑으면 되거든. 브라우저, 퍼블리싱 툴, 테스트 코드에서 똑같은 코드가 밀리초 단위까지 똑같이 돌아가니까, 전 세계 어디서든 모든 기기가 채널 일정의 똑같은 지점을 가리키게 돼.
계산할 때 쉬는 시간 범프도 고려하는데, 라인업을 한 바퀴 돌 때마다 새로 뽑아. 브라우저는 서버랑 시계를 한 번 맞추고(HTTP Date 헤더 사용), 2초 이상 차이 날 때만 보정해. 새로운 라인업은 최소 2분 전에 게시되고 쉬는 시간이 끝나면 바로 적용돼. 탭을 열어둔 상태라면 웹소켓으로 신호를 받아서 새로고침 없이 바로 전환되지.
구현된 주요 기능:
-
일시 정지, 15초 뒤로 가기, 혹은 현재 재생 중인 테이프 안에서 탐색 가능. 플레이어에 실시간 방송보다 얼마나 뒤처져 있는지 표시되고, LIVE 버튼 누르면 바로 돌아와. (일시 정지하면 1초씩 더 뒤처지게 됨)
