/** * Wybór adresu, który da się rzucić na Chromecasta, i jego typu MIME. * * Dlaczego to nie jest po prostu `url` z playera: **Chromecast pobiera plik SAM**, ze * swojego adresu w sieci lokalnej, i nie wysyła przy tym naszych nagłówków. Domyślny * odbiornik Google nie pozwala dołożyć Referera do żądania o media. Wszystko, co u nas * gra tylko dzięki nagłówkowi `Referer` (a takich CDN-ów jest sporo, patrz `paramHeaders` * w `PlayerScreen`), poleciałoby na telewizorze 403. * * Stąd zasada: gdy odtwarzanie wymaga własnych nagłówków, castujemy adres przez nasze * proxy, bo ono dokłada Referera po stronie serwera. Gdy nagłówki nie są potrzebne, * castujemy adres bezpośredni i ruch w ogóle nie dotyka naszego VPS. * * Token IP-bound nie jest tu problemem: Chromecast siedzi w tej samej sieci co telefon, * więc wychodzi na świat z tego samego adresu publicznego. */ /** Nagłówki, które zmieniają wynik pobrania. `User-Agent` sam z siebie nie wystarcza. */ const HEADERS_THAT_MATTER = ['referer', 'cookie', 'authorization']; export type CastTarget = { contentUrl: string; contentType: string; /** true = poszło przez nasze proxy, czyli transfer obciąża VPS. Do telemetrii i UI. */ viaProxy: boolean; }; function needsOwnHeaders(headers?: Record | null): boolean { if (!headers) return false; return Object.keys(headers).some((k) => HEADERS_THAT_MATTER.includes(k.toLowerCase())); } /** * HLS musi zostać rozpoznany jako HLS, bo odbiornik puszcza go przez MSE, a nie przez * zwykły `