8 points par GN⁺ 1 일 전 | 2 commentaires | Partager sur WhatsApp
  • Castor est un outil en ligne de commande qui trouve le véritable flux vidéo depuis une page web ou une URL de flux directe, le convertit pour la TV et le transmet en temps réel en qualité d’origine, sans recopie d’écran
  • Il observe le trafic réseau avec Chrome en mode headless et le Chrome DevTools Protocol, puis extrait le flux en cliquant sur la page, en entrant dans le plus grand iframe et en recliquant si nécessaire, mais il peut ne pas fonctionner sur les pages qui n’autorisent pas l’autoplay
  • Il peut être utilisé avec les smart TV compatibles DLNA/UPnP ainsi qu’avec Kodi, VLC et Plex ; la prise en charge de Chromecast est implémentée mais reste expérimentale et non testée
  • Les vidéos H.264 lisibles sont transmises sans réencodage et, si besoin, converties avec un encodeur matériel ou libx264 ; il est aussi possible d’insérer dans la vidéo des sous-titres générés avec whisper
  • Il ne fournit ni vidéos, ni catalogue, ni sources, et ne contourne pas les DRM ; il est conçu pour ne transmettre que les pages et flux indiqués par l’utilisateur et pour lesquels il dispose des droits d’usage

Diffuser une vidéo web comme un vrai flux

  • Castor envoie un véritable flux vidéo en qualité intégrale, au lieu d’une diffusion web directe impossible sur certaines smart TV ou d’une recopie d’écran avec latence et perte de résolution
  • Il prend en entrée une page web ou une URL de flux directe, détecte la vidéo, extrait le flux, puis le transcode pour la TV et l’envoie en temps réel
  • Il peut rechercher des ID IMDB/TMDB à partir de sources configurées par l’utilisateur ou insérer dans la vidéo des sous-titres générés automatiquement
  • En lançant castor cast, on peut parcourir et diffuser des contenus via un navigateur interactif en terminal

Méthode d’extraction du flux et limites

  • Il lance Chrome en mode headless et observe le trafic réseau avec le Chrome DevTools Protocol pour trouver le flux
  • Il exécute un court pipeline d’actions pour démarrer la lecture
    • clic sur la page
    • navigation vers le plus grand iframe
    • nouveau clic comme action de secours
  • Il fonctionne sur les pages qui autorisent l’autoplay, mais ne prend pas en charge tous les sites

Installation et prérequis d’exécution

  • La méthode recommandée est d’utiliser un binaire natif exécuté sur le même réseau que la TV
  • Les outils suivants doivent être présents dans le PATH de l’environnement d’exécution
    • Chrome ou Chromium : extraction headless du flux
    • ffmpeg : transcodage
    • ffprobe : détection du format multimédia
  • Sur macOS, l’installation peut se faire avec Homebrew
brew install --cask stupside/tap/castor
  • La compilation depuis les sources nécessite Go 1.26+ et CMake
    • les bindings whisper.cpp utilisent cgo et se lient à un libwhisper.a compilé localement
    • go install ne fonctionne pas, car un replace local et des bibliothèques statiques précompilées sont nécessaires
git clone --recurse-submodules https://github.com/stupside/castor.git
cd castor
make

Flux d’utilisation de base

  • Utilisez castor scan pour trouver le nom de la TV, puis indiquez dans config.yaml le nom exact et le type d’appareil dans device
device:
  name: "Living Room TV"
  type: dlna
  • Une page web ou une URL de flux directe se diffuse avec cast player
castor cast player https://example.com/watch/some-video
  • La recherche interactive d’œuvres nécessite une clé API TMDB et des sources configurées par l’utilisateur ; la liste complète des commandes et options est disponible via castor --help

Configuration et sources fournies par l’utilisateur

  • config.yaml est lu depuis le répertoire courant ou depuis le chemin indiqué avec --config, et le seul élément obligatoire est la configuration de l’appareil de destination
  • Des valeurs par défaut sont fournies pour les délais, la navigation, la capture, le transcodage, l’interface réseau et la navigation Chrome
  • Les valeurs secrètes peuvent être surchargées via config.local.yaml exclu de Git ou via des variables d’environnement au format CASTOR_SECTION__FIELD
  • cast movie, cast episode et le navigateur interactif injectent des identifiants d’œuvres dans des sources configurées par l’utilisateur
    • Castor n’intègre ni source, ni catalogue, ni fonction de recherche
    • il injecte l’ID dans des templates définis par l’utilisateur, préfixe chaque URL avec les proxies, ouvre la page, puis extrait le flux de la même manière que cast player
    • plusieurs proxys sont essayés dans l’ordre indiqué
sources:
  - proxies: ["https://your-source.example";]
    templates:
      movie: "/embed/movie/{itemID}"
      episode: "/embed/tv/{itemID}/{season}-{episode}"

Recherche TMDB et sous-titres automatiques

  • Le navigateur interactif utilise une clé API TMDB pour rechercher les œuvres
    • la clé peut être obtenue sur themoviedb.org
    • les commandes directes comme cast movie <id> n’ont pas besoin de clé TMDB
  • Les sous-titres automatiques transcrivent l’audio avec whisper et les insèrent dans la vidéo ; cette fonction est désactivée par défaut
    • la langue par défaut est l’anglais
    • le modèle par défaut est ggml-tiny.en, d’environ 75 Mo, et il est téléchargé automatiquement

Appareils pris en charge

  • Prend en charge les TV implémentant le profil DLNA/UPnP MediaRenderer:1
    • Samsung a été testé, et LG, Sony Bravia, Panasonic Viera, Philips, Hisense, TCL, VIZIO et Sharp font partie des appareils visés
    • des lecteurs réseau comme Kodi, VLC et Plex peuvent aussi être utilisés
  • castor scan permet de découvrir les appareils présents sur le même réseau
  • La prise en charge de Chromecast est implémentée mais expérimentale et non testée

Contraintes Docker et configuration réseau

  • L’image Docker, réservée à Linux, fournit Chrome, ffmpeg et ffprobe
  • Avec Docker, il faut un hôte Linux sur le même LAN que la TV, et utiliser --network host pour la découverte SSDP en multicast et la connexion au serveur de lecture de Castor
  • Sur macOS et Windows avec Docker Desktop, --network host ne donne pas accès au LAN
    • le conteneur se retrouve sur le sous-réseau de la VM interne à Docker Desktop, ce qui empêche scan de trouver l’appareil et fait échouer la diffusion
    • sur macOS et Windows, il faut utiliser le binaire natif ou relier une VM Linux au LAN en mode bridge
  • On peut monter /config.yaml pour fournir la configuration et conserver dans un volume le modèle whisper téléchargé automatiquement
  • Utiliser un tag de release plutôt que latest permet de figer la version

Pass-through multimédia et encodage

  • Si la TV peut déjà lire une vidéo H.264 avec le profil et le niveau qu’elle accepte, Castor utilise une copie de flux pour ramener l’usage CPU à presque 0
  • Si la TV refuse le codec ou si des sous-titres doivent être incrustés, il réencode
    • il privilégie un encodeur H.264 matériel réellement fonctionnel, comme VA-API sous Linux ou VideoToolbox sur le binaire natif macOS
    • à défaut, il bascule sur libx264 en logiciel
  • Pour utiliser VA-API avec un GPU Intel dans un conteneur Docker, --device /dev/dri est requis ; --network host seul n’expose pas le GPU

Usages et limites

  • Castor est un outil de diffusion générique, pas un service lié à un site spécifique
  • Il n’héberge ni ne fournit de vidéos, de catalogue ou de sources, et ne traite que les pages, flux et sources indiqués par l’utilisateur et pour lesquels il dispose des droits d’usage
  • Il ne déchiffre ni ne contourne les DRM, et les services protégés par DRM ne peuvent pas être diffusés
  • L’utilisateur est responsable du respect des conditions d’utilisation des sites et du droit local, et l’outil est fourni en l’état pour des usages personnels ou pédagogiques légitimes

2 commentaires

 
xguru 1 일 전

Waouh, dans les commentaires ci-dessous, ce lien est vraiment pratique : https://tvexplorer.live/channel/EBS1TV.kr.SD/country/KR haha
Il semble être bloqué en Corée ; est-ce qu’on peut le regarder directement depuis l’étranger ?

 
GN⁺ 1 일 전
Avis sur Hacker News
  • J’ai créé TV Explorer, qui lit directement dans le navigateur les flux HLS publiés par les chaînes, sans contournement supplémentaire. Il s’appuie sur une liste publique GitHub contenant plus de 1000 chaînes gratuites
    https://tvexplorer.live

    • C’est étonnamment fluide et léger, presque instantané, et même le bouton retour fonctionne correctement. La fenêtre des sous-titres chevauche certains éléments de l’écran, mais le changement de chaîne est aussi rapide que lorsqu’on zappait à l’époque de l’analogique NTSC, même sur un desktop ordinaire
      Je me demande ce que les autres services TV font que celui-ci ne fait pas
    • Surtout pour les chaînes japonaises, il semble y avoir davantage de chaînes sur https://tv.garden/
    • Ça se charge très vite aussi sur mobile et on peut regarder des chaînes du monde entier, donc ça mériterait un billet à part entière
    • Ce serait bien d’en faire un plugin Jellyfin
    • C’est probablement le site IPTV le plus abouti que j’aie vu jusqu’ici
  • Le fait qu’un bot doive lancer un nouveau navigateur headless avec un profil neuf à chaque fois est absurde. Cloudflare n’arrive pas à bloquer les bots, ne fait que gaspiller les ressources des deux côtés, et revient à livrer les journaux d’accès et mots de passe à la NSA ; j’aimerais revenir à l’ancien Internet

  • L’explication dit : « je l’ai créé parce qu’il n’y a ni Chromecast ni AirPlay pour envoyer la vidéo web du laptop vers la TV », mais on dirait quelque chose fait par Claude

    • Il est vrai que j’ai été aidé par Claude, et je ne suis pas expert en DLNA ni en FFMPEG, mais l’important est que j’ai résolu le problème que je rencontrais. Si ça résout aussi celui d’autres personnes, tant mieux
    • On pourrait aussi dire qu’un compilateur crée les choses à l’aide de bibliothèques de Google ou d’ailleurs. Tant que Claude ne produit pas lui-même directement du code machine distribuable, ce n’est qu’une couche intermédiaire de plus entre l’intention humaine et le résultat final
  • Je croyais que le cœur de Turnstile consistait à détecter les navigateurs headless pour rendre le contournement difficile, donc je me demande s’il est vraiment possible de passer en imitant simplement un clic sur la case à cocher

    • Turnstile ressemble davantage à un outil qui vend aux exploitants de sites un vague sentiment de sécurité, bloque les utilisateurs de Tor qui ont désactivé JavaScript, et les pousse à fournir à Cloudflare une copie de tout leur trafic
      On dirait qu’ils accordent plus d’importance à cette fausse sécurité, où Cloudflare utilise en marketing le nombre d’utilisateurs bloqués sans distinguer humains et bots, qu’à la sécurité réelle
    • Si on imite correctement les événements, il est difficile de distinguer un navigateur headless d’un vrai navigateur sans détection au niveau de la plateforme. En revanche, repérer le rendu logiciel sous Linux n’est pas compliqué ; si ce type de contournement continue, ils pourraient imposer une ou plusieurs vérifications supplémentaires aux utilisateurs Linux
      La case à cocher n’est qu’une partie du processus ; avant cela, ils observent tous les comportements du navigateur et ses réactions aux événements pour décider, selon la probabilité qu’il s’agisse d’un bot, s’il faut une vérification supplémentaire
    • Il ne s’agit pas seulement d’imiter le clic sur la case, mais aussi d’usurper plusieurs propriétés du navigateur. Avec un navigateur headless classique, il y a de fortes chances d’être détecté
    • Même avec des systèmes de défense à plusieurs millions de dollars, les gens automatisent WoW depuis longtemps en scotchant des périphériques autour d’un ventilateur qui vibre. L’automatisation par navigateur headless ressemble aux cheats dans les FPS : l’attaquant a l’initiative, et avec assez de temps et d’argent, il peut finir par gagner
    • Si l’on peut construire un navigateur qui passe tous les autres contrôles effectués en arrière-plan, alors à la fin il ne reste plus que le clic sur la case à cocher
  • En général, les outils de piratage laissent au moins une forme de dénégation plausible, mais ici ils se vantent même d’aider à streamer un blockbuster à 250 millions de dollars qui sort ce week-end

    • Je pensais que la structure consistait à chercher un film dans les sources configurées et à renvoyer « introuvable » s’il n’y était pas. Stremio est aussi une application légale, mais si on y ajoute le plugin illégal Torrentio, on peut automatiser le piratage de médias, ce qui permet de développer ouvertement le cœur du projet
      C’est similaire avec l’émulateur Azahar et son fork illégal Azahar Plus qui déchiffre automatiquement les jeux, mais en regardant à nouveau, ce projet intègre des sites de streaming illégaux
    • L’interface affiche les films actuellement populaires de https://www.themoviedb.org/
    • Au départ, ça ressemblait à un outil pour envoyer sur la TV les vidéos de sites web déjà accessibles depuis un laptop. Mais avec cette explication qui fait très production IA sur des « sites web aléatoires » et l’option de clé API TVDB, je ne comprends pas bien quelle est la vraie priorité
    • Il est possible qu’il ne lise pas les films eux-mêmes, mais seulement les bandes-annonces
  • Ça a fonctionné immédiatement sur une Samsung TV ordinaire de plus de 15 ans. Je me demande si la meilleure approche est vraiment d’écrire soi-même une fonction de recherche qui analyse toutes les pages JSON comme https://vsembed.ru/movies/latest/page-1.json

  • La description manque de contexte, donc il est difficile de savoir à quoi sert l’outil, et s’il est destiné au piratage

    • C’est un outil en ligne de commande qui, lorsqu’on choisit un film, trouve une vidéo correspondante sur un site de streaming, la transcode, y incruste les sous-titres en temps réel, puis ordonne à la TV de la lire
    • Il ne lit que des flux déjà accessibles et ne casse aucun chiffrement, donc je ne vois pas clairement en quoi cela aide au piratage
    • C’est une méthode de transmission alternative qui extrait la vidéo en streaming d’un site web ou d’un service pour l’envoyer à une TV
    • Les grands services existants prennent déjà en charge le cast, donc on peut se demander si l’usage réel n’est pas surtout les flux sportifs illégaux
  • Ça demande à peu près autant d’efforts qu’utiliser des torrents, donc je ne vois pas trop l’intérêt

  • Avec la version Docker sur macOS, il se peut qu’on ne trouve pas la TV

    • Pour utiliser UPnP via la machine virtuelle nécessaire à Docker sur macOS, il faudra probablement configurer le réseau concerné pour l’exposer vers l’extérieur
  • J’ai perdu confiance en lisant le passage qui dit : « lance Chrome headless en masquant l’automatisation avec des empreintes aléatoires et des scripts stealth »

    • Je travaille dans le domaine du fingerprinting des navigateurs et, en regardant le dépôt, il semble ne modifier que navigator, l’Audio API et la Canvas API. C’est très basique, donc il y a de fortes chances que ce soit facilement détectable