8P by GN⁺ | ★ favorite | 댓글 2개
  • Castor는 웹 페이지나 직접 스트림 URL에서 실제 영상 스트림을 찾아 TV에 맞게 변환하고, 화면 미러링 없이 원본 품질로 실시간 전송하는 터미널 도구임
  • 헤드리스 Chrome과 Chrome DevTools Protocol로 네트워크 트래픽을 관찰하며, 페이지 클릭·최대 iframe 진입·재클릭을 거쳐 스트림을 추출하지만 자동 재생을 허용하지 않는 페이지에서는 작동하지 않을 수 있음
  • DLNA/UPnP를 지원하는 스마트 TV와 Kodi·VLC·Plex에서 사용할 수 있고, Chromecast 지원은 구현됐지만 아직 실험적이며 테스트되지 않음
  • 재생 가능한 H.264 영상은 재인코딩 없이 전달하고, 필요하면 하드웨어 인코더나 libx264로 변환하며 whisper로 생성한 자막을 영상에 삽입할 수도 있음
  • 영상·카탈로그·소스를 제공하거나 DRM을 우회하지 않으며, 사용자가 직접 지정하고 이용 권한을 가진 페이지와 스트림만 전송하도록 설계됨

웹 영상을 실제 스트림으로 전송

  • Castor는 임의의 웹 영상을 직접 전송하지 못하는 스마트 TV와 지연·해상도 저하가 있는 화면 미러링을 대신해, 실제 영상 스트림을 전체 품질로 전송함
  • 웹 페이지 또는 직접 스트림 URL을 입력하면 영상을 탐색하고 스트림을 추출한 뒤 TV에 맞게 트랜스코딩해 실시간으로 전송함
  • 사용자가 구성한 소스에서 IMDB/TMDB ID를 조회하거나 자동 생성 자막을 영상에 삽입할 수 있음
  • castor cast를 실행하면 터미널 기반 대화형 브라우저에서 작품을 탐색하고 전송할 수 있음

스트림 추출 방식과 한계

  • 헤드리스 Chrome을 실행하고 Chrome DevTools Protocol로 네트워크 트래픽을 관찰해 스트림을 찾음
  • 재생 시작을 위해 짧은 동작 파이프라인을 수행함
    • 페이지 클릭
    • 가장 큰 iframe으로 이동
    • 대체 동작으로 다시 클릭
  • 자동 재생을 허용하는 페이지에서 작동하며, 모든 사이트를 지원하지는 않음

설치와 실행 요건

  • 권장 방식은 TV와 같은 네트워크에서 실행되는 네이티브 바이너리
  • 실행 환경의 PATH에 다음 도구가 필요함
    • Chrome 또는 Chromium: 헤드리스 스트림 추출
    • ffmpeg: 트랜스코딩
    • ffprobe: 미디어 형식 감지
  • macOS에서는 Homebrew로 설치할 수 있음
brew install --cask stupside/tap/castor
  • 소스 빌드에는 Go 1.26+ 와 CMake가 필요함
    • whisper.cpp 바인딩이 cgo를 사용하며 로컬에서 빌드한 libwhisper.a에 연결됨
    • 로컬 replace와 사전 빌드된 정적 라이브러리가 필요하므로 go install은 작동하지 않음
git clone --recurse-submodules https://github.com/stupside/castor.git
cd castor
make

기본 사용 흐름

  • castor scan으로 TV 이름을 찾고 config.yamldevice에 정확한 이름과 장치 유형을 지정함
device:
  name: "Living Room TV"
  type: dlna
  • 웹 페이지나 직접 스트림 URL은 cast player로 전송함
castor cast player https://example.com/watch/some-video
  • 대화형 작품 검색에는 TMDB API 키와 사용자가 구성한 소스가 필요하며, 전체 명령과 플래그는 castor --help에서 확인할 수 있음

구성과 사용자 제공 소스

  • config.yaml은 현재 디렉터리 또는 --config로 지정한 경로에서 읽으며, 필수 항목은 전송 대상 장치 설정뿐임
  • 시간 제한, 탐색, 캡처, 트랜스코딩, 네트워크 인터페이스, Chrome 탐색에는 기본값이 제공됨
  • 비밀 값은 Git에서 제외한 config.local.yaml로 덮어쓰거나 CASTOR_SECTION__FIELD 형식의 환경 변수로 지정할 수 있음
  • cast movie, cast episode, 대화형 브라우저는 사용자가 구성한 소스에 작품 ID를 대입함
    • Castor 자체에는 소스, 카탈로그, 조회 기능이 포함되지 않음
    • 사용자가 작성한 templates에 ID를 대입하고 각 proxies를 앞에 붙여 페이지를 연 뒤 cast player와 같은 방식으로 스트림을 추출함
    • 여러 프록시는 지정된 순서대로 시도함
sources:
  - proxies: ["https://your-source.example";]
    templates:
      movie: "/embed/movie/{itemID}"
      episode: "/embed/tv/{itemID}/{season}-{episode}"

TMDB 검색과 자동 자막

  • 대화형 브라우저는 작품 검색에 TMDB API 키를 사용함
    • 키는 themoviedb.org에서 받을 수 있음
    • cast movie <id> 같은 직접 명령에는 TMDB 키가 필요하지 않음
  • 자동 자막은 whisper로 음성을 전사해 영상에 삽입하며 기본적으로 비활성화돼 있음
    • 기본 언어는 영어임
    • 기본 모델은 약 75MB인 ggml-tiny.en이며 자동 다운로드됨

지원 장치

  • DLNA/UPnP MediaRenderer:1 프로필을 구현한 TV를 지원함
    • Samsung은 테스트됐으며 LG, Sony Bravia, Panasonic Viera, Philips, Hisense, TCL, VIZIO, Sharp가 지원 대상임
    • Kodi, VLC, Plex 같은 네트워크 플레이어도 사용할 수 있음
  • castor scan으로 같은 네트워크의 장치를 조회함
  • Chromecast 지원은 구현됐지만 실험적이며 테스트되지 않음

Docker 제약과 네트워크 구성

  • Linux 전용 Docker 이미지는 Chrome, ffmpeg, ffprobe를 함께 제공함
  • Docker에서는 TV와 같은 LAN의 Linux 호스트가 필요하며, SSDP 멀티캐스트 검색과 Castor 재생 서버 연결을 위해 --network host를 사용해야 함
  • Docker Desktop의 macOS·Windows에서는 --network host가 LAN으로 연결되지 않음
    • 컨테이너가 Docker Desktop 내부 VM 서브넷에 배치돼 scan이 장치를 찾지 못하고 전송도 실패함
    • macOS·Windows에서는 네이티브 바이너리를 사용하거나 Linux VM을 LAN에 브리지해야 함
  • /config.yaml을 마운트해 설정을 제공하고, 볼륨에 자동 다운로드된 whisper 모델을 보존할 수 있음
  • latest 대신 릴리스 태그를 사용하면 버전을 고정할 수 있음

미디어 패스스루와 인코딩

  • TV가 허용하는 프로필과 레벨의 H.264 영상을 이미 재생할 수 있으면 스트림 복사를 사용해 CPU 사용량을 거의 0으로 낮춤
  • TV가 코덱을 거부하거나 자막을 삽입해야 하면 재인코딩함
    • Linux의 VA-API 또는 네이티브 macOS 바이너리의 VideoToolbox처럼 실제로 작동하는 하드웨어 H.264 인코더를 우선 선택함
    • 사용할 수 없으면 소프트웨어 libx264로 대체함
  • Docker 컨테이너에서 Intel GPU의 VA-API를 사용하려면 --device /dev/dri가 필요하며, --network host만으로는 GPU가 노출되지 않음

용도와 제한

  • Castor는 특정 사이트에 연결된 서비스가 아닌 범용 전송 도구
  • 영상, 카탈로그, 소스를 호스팅하거나 번들로 제공하지 않으며, 사용자가 지정하고 이용 권한을 가진 페이지·스트림·소스만 처리함
  • DRM을 해독하거나 우회하지 않으며 DRM 보호 서비스는 전송할 수 없음
  • 사이트 이용약관과 현지 법률을 준수할 책임은 사용자에게 있으며, 합법적인 개인·교육 용도로 현 상태 그대로 제공됨

댓글과 토론

와 아래 댓글에 https://tvexplorer.live/channel/EBS1TV.kr.SD/country/KR 이거 너무 편하네요. ㅎㅎ
한국엔 막혀있는거 같던데, 해외에서는 바로 볼수 있으려나요?

그 아래 있는 tv.garden 은 일부는 유튜브로 연결해서 바로 볼수 있어서 더 좋네요 https://famelack.com/tv/kr/jvEnH2enN4Ahyj

Hacker News 의견들
  • 별도 우회 없이 채널이 공개한 HLS 스트림을 브라우저에서 바로 재생하는 TV Explorer를 만들었음. 1만 개 이상의 무료 채널이 담긴 공개 GitHub 목록을 활용함
    https://tvexplorer.live

    • 놀라울 정도로 매끄럽고 가벼우며 거의 즉시 반응하고, 뒤로 가기도 제대로 작동함. 자막 팝업이 일부 화면 요소와 겹치지만, 평범한 데스크톱에서도 아날로그 NTSC 시절 채널을 돌리던 것만큼 채널 전환이 빠름
      다른 TV 서비스들이 하는 것 중 여기서는 하지 않는 게 무엇인지 궁금함
    • 특히 일본 채널을 보면 https://tv.garden/ 쪽에 채널이 더 많은 듯함
    • 모바일에서도 매우 빠르게 로드되고 세계 각지의 채널을 볼 수 있어 별도 글로 소개할 만함
    • Jellyfin 플러그인으로 나오면 좋겠음
    • 지금까지 본 IPTV 사이트 중 가장 완성도가 높아 보임
  • 봇이 매번 새 프로필의 헤드리스 브라우저를 실행해야 하는 상황은 터무니없음. Cloudflare는 봇을 막지 못하면서 양쪽의 자원만 낭비시키고, 접속 기록과 비밀번호를 NSA에 넘기는 셈이니 예전 인터넷으로 돌아가고 싶음

  • “Chromecast나 AirPlay가 없어 노트북의 웹 영상을 TV로 전송하지 못해 만들었다”는 설명이지만, Claude가 만든 것처럼 보임

    • Claude의 도움을 받은 건 맞고 DLNA나 FFMPEG 전문가도 아니지만, 내가 겪던 문제를 해결했다는 게 중요함. 다른 사람의 문제까지 해결한다면 더 좋음
    • 컴파일러가 Google 등의 라이브러리를 이용해 만들었다고도 할 수 있음. Claude가 배포 가능한 기계어를 직접 출력하기 전까지는 인간의 의도와 최종 결과물 사이에 있는 또 하나의 중간 계층일 뿐임
  • Turnstile의 핵심은 헤드리스 브라우저를 탐지해 우회하기 어렵게 만드는 것이라고 알았는데, 단순히 체크 표시 클릭을 흉내 내는 것만으로 정말 통과할 수 있는지 의문임

    • Turnstile은 사이트 운영자에게 막연한 보안감을 팔고, JavaScript를 끈 Tor 사용자를 차단하며, 모든 트래픽의 사본을 Cloudflare에 제공하도록 유도하는 도구에 가까움
      실제 보안보다 Cloudflare가 사람과 봇을 가리지 않고 집계한 차단 사용자 수를 마케팅에 활용하는 가짜 보안이 더 중요해 보임
    • 적절한 이벤트를 흉내 내면 플랫폼 탐지 없이는 헤드리스 브라우저와 실제 브라우저를 구분하기 어려움. 다만 Linux의 소프트웨어 렌더러를 찾는 건 어렵지 않아 이런 우회가 계속되면 Linux 사용자에게 하나 이상의 추가 인증을 강제할 가능성이 있음
      체크박스는 일부일 뿐이며, 그전까지 브라우저의 모든 동작과 이벤트 반응을 관찰해 봇일 가능성에 따라 추가 인증 여부를 결정함
    • 체크 클릭만 흉내 내는 게 아니라 여러 브라우저 속성도 위조함. 일반적인 헤드리스 브라우저라면 탐지될 가능성이 큼
    • 수백만 달러 규모의 방어 체계가 있어도 사람들은 진동하는 선풍기에 주변기기를 테이프로 붙이는 식으로 오랫동안 WoW를 자동화해 왔음. 헤드리스 브라우저 자동화도 FPS 부정행위와 같아서, 공격 측이 주도권을 쥐고 충분한 시간과 돈을 쓰면 결국 이길 수 있음
    • 백그라운드에서 수행되는 다른 검사를 모두 통과하도록 브라우저를 만들 수 있다면, 마지막에 남는 건 체크 표시 클릭뿐임
  • 보통 불법 복제 도구는 최소한 그럴듯한 부인 가능성을 남기는데, 여기서는 이번 주말에 개봉하는 제작비 2억 5천만 달러짜리 대작까지 스트리밍하도록 도와준다고 내세움

    • 설정된 소스에서 영화를 찾고 없으면 “찾을 수 없음”을 반환하는 구조라고 생각했음. Stremio도 합법적인 앱이지만 불법 Torrentio 플러그인을 추가하면 미디어를 자동으로 불법 복제할 수 있어 핵심 개발은 공개적으로 진행 가능함
      에뮬레이터 Azahar와 게임을 자동 복호화하는 불법 포크 Azahar Plus도 비슷하지만, 다시 살펴보니 이 프로젝트는 불법 스트리밍 사이트를 내장하고 있음
    • 인터페이스는 https://www.themoviedb.org/현재 인기 영화를 보여주는 것임
    • 처음에는 이미 접근 가능한 웹사이트의 영상을 노트북에서 TV로 전송하는 도구처럼 보였음. 하지만 “무작위 웹사이트”라는 AI 생성물 같은 설명과 TVDB API 키 옵션 때문에 실제 초점이 무엇인지 혼란스러움
    • 실제 영화가 아니라 예고편만 재생하는 것일 수도 있음
  • 15년도 넘은 평범한 Samsung TV에서 즉시 작동했음. https://vsembed.ru/movies/latest/page-1.json 같은 모든 JSON 페이지를 분석하도록 직접 검색 기능을 작성하는 게 최선인지 궁금함

  • 설명에 맥락이 부족해 무엇에 쓰는 도구인지, 불법 복제용인지 알기 어려움

    • 영화를 선택하면 스트리밍 사이트에서 일치하는 영상을 찾아 트랜스코딩하고, 자막을 실시간으로 입힌 뒤 TV에 재생을 지시하는 명령줄 도구
    • 이미 접근할 수 있는 스트림만 재생하며 암호화를 깨는 것도 아니어서, 이것이 불법 복제에 어떻게 도움이 되는지는 확실하지 않음
    • 웹사이트나 서비스에서 스트리밍 영상을 추출해 TV로 보내는 대체 전송 방식
    • 기존 대형 서비스는 이미 화면 전송을 지원하니, 실제 용도는 결국 불법 스포츠 스트림 같은 것인지 의문임
  • 토렌트를 쓰는 것과 수고가 비슷해 굳이 사용할 이유를 모르겠음

  • macOS의 Docker 버전에서는 TV를 찾지 못할 수 있음

    • macOS에서 Docker에 필요한 가상 머신을 거쳐 UPnP를 사용하려면 관련 네트워크를 외부에 노출하도록 설정해야 할 가능성이 큼
  • “무작위 지문과 스텔스 스크립트로 자동화를 숨기는 헤드리스 Chrome을 실행한다”는 부분에서 신뢰를 잃었음

    • 브라우저 지문 분야에서 일해 저장소를 살펴보니 navigator, Audio API, Canvas API만 수정하는 듯함. 매우 기본적인 수준이라 쉽게 탐지될 가능성이 큼