Zgloszenie de93ba42 ("Can't stream to Chrome cast"). Cast to natywny SDK, wiec NIE da
sie go wyslac przez OTA: to nowe APK, ktore ludzie musza pobrac sami. Klucz podpisujacy
ten sam, wiec ALLOWED_APP_SIG_HASH bez zmian i aktualizacja wchodzi na wierzch starej.
Argument, ktory przewazyl: od czerwca release ma wlaczone FLAG_SECURE, wiec zwykle
mirrorowanie ekranu na telewizor jest zablokowane. Cast jest jedyna droga na duzy ekran.
Zasieg: 77% udanych odtworzen konczy sie bezposrednim adresem, plus czesc hosterow
filmowych oddajacych gotowy plik. Okolo 13% (porndoe, mypornerleak, superporn) idzie
przez WebView i castowac sie NIE DA, tam przycisku nie ma.
Wpiete recznie, bez `expo prebuild`, bo katalog android/ jest w repo i ma reczne zmiany,
ktore prebuild by przepisal. Cztery edycje, dokladnie to co robi config plugin:
manifest (OPTIONS_PROVIDER + expanded controller), MainActivity, castFrameworkVersion
w rootProject.ext oraz JAWNA zaleznosc play-services-cast-framework w app/build.gradle.
Ta ostatnia jest konieczna, bo biblioteka deklaruje ja jako `implementation`, co nie
jest przechodnie na sciezke kompilacji, i bez niej build pada na compileReleaseKotlin.
Identyfikator odbiornika CELOWO zaden: bez wpisu biblioteka bierze domyslny odbiornik
Google. Rejestracja wlasnego wiazalaby konto Google z Goonem, a przy tresci dla
doroslych latwo o cofniecie.
Urzadzenia bez Google Play Services zabezpieczone w DWOCH miejscach, bo mamy uzytkownika
na LineageOS (GOON-3B) i sideload na zegarku (GOON-51): `getSharedInstance` w try/catch
po stronie natywnej, a po stronie JS cala obsluga w osobnym `CastControl`, montowanym
dopiero gdy `useCastAvailable` potwierdzi Play Services. To nie jest ostroznosc na
wyrost: hooki biblioteki synchronicznie subskrybuja natywne zdarzenia i bez GMS wywracaja
ekran, a hooka nie da sie wywolac warunkowo.
Chromecast pobiera plik SAM i nie wysyla naszych naglowkow, wiec zrodla wymagajace
Referera ida przez /proxy (dokłada go po stronie serwera), a reszta bezposrednio, zeby
nie obciazac VPS. Do tego proxy przestaje przekazywac CORS hostera: mixdrop oddawal
`Access-Control-Allow-Origin: https://mixdrop.my`, co odbiornik odrzucal przy HLS.
Przy okazji GOON-3B: doszedl brakujacy wpis `com.google.android.gms.version`, ktory
wywracal apke na LineageOS, gdy Chromium probowal podpiac skaner kodow.
Zweryfikowane na emulatorze na podpisanym APK: certyfikat identyczny ze starym
(3294aba5...), instalacja NA WIERZCH 0.2.2 udana, wersja 13/0.3.0, runtime 1.3 w
manifescie, aplikacja wstaje bez crasha, ExoPlayer gra (MediaCodec dla video), a SDK
Casta startuje poprawnie: dynamite sie laduje i `MediaRouterProxy` czyta NASZ CastOptions.
Logika wyboru adresu przetestowana osobno na osmiu przypadkach.
CZEGO NIE ZWERYFIKOWALEM: realnego rzutu na telewizor. W sieci emulatora nie ma zadnego
Chromecasta, wiec `loadMedia` i odtwarzanie po stronie odbiornika sa niesprawdzone.
Build wymaga SENTRY_DISABLE_AUTO_UPLOAD=true, bo sentry.properties czeka na
SENTRY_ORG/SENTRY_PROJECT/SENTRY_AUTH_TOKEN ze srodowiska (Infisical, workspace
goon-app). Skutek: slady JS z 0.3.0 beda w Sentry nieczytelne do czasu przebudowy z tymi
zmiennymi.
51 lines
1.5 KiB
JSON
51 lines
1.5 KiB
JSON
{
|
|
"name": "goon-mobile",
|
|
"version": "0.1.0",
|
|
"main": "App.tsx",
|
|
"scripts": {
|
|
"start": "expo start",
|
|
"android": "expo run:android",
|
|
"ios": "expo run:ios",
|
|
"web": "expo start --web",
|
|
"tsc": "tsc --noEmit"
|
|
},
|
|
"dependencies": {
|
|
"@react-navigation/native": "^7.0.0",
|
|
"@react-navigation/native-stack": "^7.0.0",
|
|
"@sentry/react-native": "~6.10.0",
|
|
"@tanstack/react-query": "^5.59.0",
|
|
"expo": "~52.0.0",
|
|
"expo-asset": "~11.0.5",
|
|
"expo-build-properties": "~0.13.3",
|
|
"expo-clipboard": "~7.0.1",
|
|
"expo-font": "~13.0.4",
|
|
"expo-haptics": "~14.0.1",
|
|
"expo-image": "~2.0.7",
|
|
"expo-intent-launcher": "~12.0.2",
|
|
"expo-keep-awake": "^14.0.3",
|
|
"expo-linear-gradient": "~14.0.2",
|
|
"expo-local-authentication": "~15.0.2",
|
|
"expo-screen-capture": "~7.0.1",
|
|
"expo-screen-orientation": "~8.0.4",
|
|
"expo-secure-store": "~14.0.0",
|
|
"expo-status-bar": "~2.0.0",
|
|
"expo-updates": "~0.27.5",
|
|
"expo-video": "~2.0.6",
|
|
"react": "18.3.1",
|
|
"react-native": "0.76.9",
|
|
"react-native-gesture-handler": "~2.20.0",
|
|
"react-native-google-cast": "^4.9.1",
|
|
"react-native-qrcode-svg": "^6.3.21",
|
|
"react-native-safe-area-context": "4.12.0",
|
|
"react-native-screens": "~4.4.0",
|
|
"react-native-svg": "15.8.0",
|
|
"react-native-view-shot": "^5.1.0",
|
|
"react-native-webview": "13.12.5"
|
|
},
|
|
"devDependencies": {
|
|
"@babel/core": "^7.25.0",
|
|
"@types/react": "~18.3.12",
|
|
"typescript": "~5.3.3"
|
|
},
|
|
"private": true
|
|
}
|