- Castor ist ein Terminal-Tool, das in Webseiten oder direkten Stream-URLs den eigentlichen Videostream findet, ihn für den Fernseher umwandelt und in Echtzeit ohne Screen Mirroring in Originalqualität überträgt
- Mit Headless Chrome und dem Chrome DevTools Protocol beobachtet es den Netzwerkverkehr und extrahiert den Stream über Seitenklicks, das Betreten des größten iframe und erneute Klicks, funktioniert aber möglicherweise nicht auf Seiten, die Autoplay nicht erlauben
- Es kann mit Smart-TVs verwendet werden, die DLNA/UPnP unterstützen, sowie mit Kodi, VLC und Plex; Chromecast-Unterstützung ist implementiert, aber noch experimentell und ungetestet
- Abspielbares H.264-Video wird ohne Re-Encoding weitergereicht, bei Bedarf mit einem Hardware-Encoder oder
libx264 umgewandelt, und mit whisper erzeugte Untertitel können in das Video eingebettet werden
- Es stellt weder Videos, Kataloge noch Quellen bereit und umgeht kein DRM; es ist so konzipiert, dass nur vom Nutzer direkt angegebene Seiten und Streams mit Nutzungsberechtigung übertragen werden
Webvideos als echte Streams übertragen
- Castor überträgt echte Videostreams in voller Qualität und ersetzt damit Smart-TVs, die beliebige Webvideos nicht direkt abspielen können, sowie Screen Mirroring mit Latenz und Auflösungsverlust
- Gibt man eine Webseite oder eine direkte Stream-URL an, findet es das Video, extrahiert den Stream und transkodiert ihn passend für den Fernseher zur Echtzeitübertragung
- Es kann IMDB/TMDB-IDs aus vom Nutzer konfigurierten Quellen nachschlagen oder automatisch erzeugte Untertitel in das Video einbetten
- Mit
castor cast lassen sich Inhalte in einem terminalbasierten interaktiven Browser durchsuchen und übertragen
Funktionsweise und Grenzen der Stream-Extraktion
- Es startet Headless Chrome und beobachtet mit dem Chrome DevTools Protocol den Netzwerkverkehr, um Streams zu finden
- Zum Starten der Wiedergabe führt es eine kurze Aktions-Pipeline aus
- Auf die Seite klicken
- Zum größten iframe wechseln
- Als Ausweichaktion erneut klicken
- Es funktioniert auf Seiten, die Autoplay erlauben, unterstützt aber nicht alle Websites
Installations- und Laufzeitvoraussetzungen
- Empfohlen wird eine native Binärdatei, die im selben Netzwerk wie der Fernseher läuft
- Im
PATH der Laufzeitumgebung werden folgende Tools benötigt
- Chrome oder Chromium: Headless-Stream-Extraktion
ffmpeg: Transkodierung
ffprobe: Erkennung des Medienformats
- Unter macOS kann die Installation per Homebrew erfolgen
brew install --cask stupside/tap/castor
- Für den Build aus dem Quellcode werden Go 1.26+ und CMake benötigt
- Die whisper.cpp-Bindings verwenden cgo und linken gegen ein lokal gebautes
libwhisper.a
- Wegen lokalem
replace und vorkompilierten statischen Bibliotheken funktioniert go install nicht
git clone --recurse-submodules https://github.com/stupside/castor.git
cd castor
make
Grundlegender Nutzungsablauf
- Mit
castor scan wird der TV-Name gefunden, anschließend werden in config.yaml der exakte Name und der Gerätetyp unter device eingetragen
device:
name: "Living Room TV"
type: dlna
- Eine Webseite oder direkte Stream-URL wird mit
cast player übertragen
castor cast player https://example.com/watch/some-video
- Für die interaktive Werkssuche sind ein TMDB-API-Key und vom Nutzer konfigurierte Quellen nötig; alle Befehle und Flags sind unter
castor --help zu finden
Konfiguration und vom Nutzer bereitgestellte Quellen
config.yaml wird aus dem aktuellen Verzeichnis oder aus dem mit --config angegebenen Pfad gelesen; der einzige Pflichtteil ist die Gerätekonfiguration für das Zielgerät
- Für Timeouts, Navigation, Capture, Transkodierung, Netzwerkschnittstelle und Chrome-Navigation gibt es Standardwerte
- Geheimwerte können über
config.local.yaml, das in Git ausgeschlossen ist, überschrieben oder als Umgebungsvariablen im Format CASTOR_SECTION__FIELD gesetzt werden
cast movie, cast episode und der interaktive Browser setzen Werks-IDs in vom Nutzer konfigurierte Quellen ein
- Castor selbst enthält keine Quellen, Kataloge oder Lookup-Funktionen
- Es setzt IDs in vom Nutzer geschriebene
templates ein, setzt davor jeweils die proxies, öffnet die Seite und extrahiert den Stream wie bei cast player
- Mehrere Proxys werden in der angegebenen Reihenfolge ausprobiert
sources:
- proxies: ["https://your-source.example"]
templates:
movie: "/embed/movie/{itemID}"
episode: "/embed/tv/{itemID}/{season}-{episode}"
TMDB-Suche und automatische Untertitel
- Der interaktive Browser nutzt für die Werkssuche einen TMDB-API-Key
- Der Key kann unter themoviedb.org bezogen werden
- Für direkte Befehle wie
cast movie <id> ist kein TMDB-Key erforderlich
- Automatische Untertitel transkribieren Sprache mit whisper und betten sie ins Video ein; standardmäßig sind sie deaktiviert
- Standardsprache ist Englisch
- Standardmodell ist
ggml-tiny.en mit etwa 75 MB und wird automatisch heruntergeladen
Unterstützte Geräte
- Unterstützt werden Fernseher, die das Profil DLNA/UPnP
MediaRenderer:1 implementieren
- Samsung wurde getestet; LG, Sony Bravia, Panasonic Viera, Philips, Hisense, TCL, VIZIO und Sharp gehören zu den unterstützten Geräten
- Auch Netzwerk-Player wie Kodi, VLC und Plex können verwendet werden
- Mit
castor scan lassen sich Geräte im selben Netzwerk finden
- Chromecast-Unterstützung ist implementiert, aber experimentell und ungetestet
Docker-Einschränkungen und Netzwerkkonfiguration
- Das Linux-only-Docker-Image bringt Chrome,
ffmpeg und ffprobe mit
- In Docker wird ein Linux-Host im selben LAN wie der Fernseher benötigt, und für SSDP-Multicast-Erkennung sowie die Verbindung zum Castor-Wiedergabeserver muss
--network host verwendet werden
- Unter macOS und Windows verbindet Docker Desktop
--network host nicht mit dem LAN
- Der Container landet im internen VM-Subnetz von Docker Desktop, sodass
scan keine Geräte findet und die Übertragung ebenfalls fehlschlägt
- Unter macOS und Windows sollte die native Binärdatei verwendet oder eine Linux-VM ans LAN gebridged werden
- Die Konfiguration kann durch Mounten von
/config.yaml bereitgestellt werden; in einem Volume lassen sich automatisch heruntergeladene whisper-Modelle erhalten
- Mit einem Release-Tag statt
latest lässt sich die Version fixieren
Media-Passthrough und Encoding
- Wenn der Fernseher H.264-Video mit zulässigem Profil und Level bereits abspielen kann, wird Stream Copy verwendet, um die CPU-Auslastung nahezu auf 0 zu senken
- Lehnt der Fernseher den Codec ab oder müssen Untertitel eingebettet werden, wird re-encodiert
- Bevorzugt werden tatsächlich funktionierende Hardware-H.264-Encoder wie VA-API unter Linux oder VideoToolbox in der nativen macOS-Binärdatei
- Falls nicht verfügbar, wird auf Software-
libx264 zurückgegriffen
- Um VA-API auf einer Intel-GPU im Docker-Container zu nutzen, ist
--device /dev/dri erforderlich; --network host allein macht die GPU nicht verfügbar
Einsatzzweck und Einschränkungen
- Castor ist kein an eine bestimmte Website gebundener Dienst, sondern ein universelles Übertragungstool
- Es hostet oder bündelt keine Videos, Kataloge oder Quellen und verarbeitet nur Seiten, Streams und Quellen, die der Nutzer angibt und für die er Nutzungsrechte hat
- Es entschlüsselt oder umgeht kein DRM; DRM-geschützte Dienste können nicht übertragen werden
- Für die Einhaltung von Website-Nutzungsbedingungen und lokalem Recht ist der Nutzer selbst verantwortlich; das Tool wird im Ist-Zustand für legale private und Bildungszwecke bereitgestellt
2 Kommentare
Und der Link im Kommentar unten, https://tvexplorer.live/channel/EBS1TV.kr.SD/country/KR, ist auch super praktisch. Haha.
Scheint in Korea gesperrt zu sein, aber kann man es im Ausland vielleicht direkt ansehen?
Meinungen auf Hacker News
Ich habe TV Explorer gebaut, das HLS-Streams, die von den Sendern öffentlich bereitgestellt werden, ohne Umweg direkt im Browser abspielt. Es nutzt eine öffentliche GitHub-Liste mit mehr als 10.000 kostenlosen Sendern.
https://tvexplorer.live
Ich frage mich, was andere TV-Dienste tun, was hier nicht gemacht wird.
Es ist absurd, dass ein Bot jedes Mal einen Headless-Browser mit neuem Profil starten muss. Cloudflare hält Bots nicht auf, verschwendet nur Ressourcen auf beiden Seiten und übergibt der NSA gewissermaßen Zugriffsverläufe und Passwörter. Ich will das alte Internet zurück.
Die Erklärung lautet: „Ich habe es gebaut, weil ich ohne Chromecast oder AirPlay Webvideos vom Laptop nicht auf den Fernseher übertragen konnte“, aber es sieht aus, als hätte Claude es gebaut.
Ich dachte, der Kern von Turnstile bestehe darin, Headless-Browser zu erkennen und eine Umgehung schwierig zu machen; daher frage ich mich, ob es wirklich genügt, einfach das Anklicken des Häkchens nachzuahmen.
Wichtiger als echte Sicherheit scheint eine Scheinsicherheit zu sein, bei der Cloudflare die aggregierte Zahl blockierter Nutzer – egal ob Mensch oder Bot – fürs Marketing nutzt.
Die Checkbox ist nur ein Teil davon; bis dahin werden alle Aktionen und Event-Reaktionen des Browsers beobachtet, um je nach Bot-Wahrscheinlichkeit zu entscheiden, ob zusätzliche Verifizierung nötig ist.
Piraterie-Tools lassen normalerweise zumindest eine plausible Abstreitbarkeit übrig, aber hier wird ausdrücklich damit geworben, sogar einen Blockbuster mit 250 Millionen Dollar Budget, der dieses Wochenende startet, streamen zu helfen.
Ähnlich ist es beim Emulator Azahar und dem illegalen Fork Azahar Plus, der Spiele automatisch entschlüsselt; beim erneuten Hinsehen ist in diesem Projekt jedoch eine illegale Streaming-Site eingebaut.
Auf einem ganz normalen, über 15 Jahre alten Samsung-TV funktionierte es sofort. Ich frage mich, ob es am besten ist, eine eigene Suchfunktion zu schreiben, die alle JSON-Seiten wie https://vsembed.ru/movies/latest/page-1.json analysiert.
Der Beschreibung fehlt Kontext; es ist schwer zu erkennen, wofür das Tool gedacht ist und ob es für Piraterie genutzt wird.
Der Aufwand ist ähnlich wie bei Torrents, daher sehe ich keinen Grund, es zu nutzen.
In der Docker-Version unter macOS kann es sein, dass der Fernseher nicht gefunden wird.
Bei der Stelle „führt ein Headless Chrome aus, der Automatisierung mit zufälligen Fingerprints und Stealth-Skripten verbirgt“ habe ich das Vertrauen verloren.
navigator, Audio API und Canvas API verändert. Das ist sehr grundlegend und dürfte leicht zu erkennen sein.