From 68e66a6d94ac35a7675f52777322e32a515a4ae1 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Fri, 22 Mar 2024 20:29:04 +0100 Subject: [PATCH] show loading indicator on subtitle selection, padding to progressbar --- .../components/player/CaptionsSelector.tsx | 46 ++-- apps/expo/src/components/player/Controls.tsx | 10 +- .../src/components/player/VideoPlayer.tsx | 1 + .../src/components/player/VideoSlider.tsx | 2 +- apps/expo/src/components/player/utils.ts | 199 ------------------ apps/expo/src/lib/language.ts | 198 +++++++++++++++++ 6 files changed, 232 insertions(+), 224 deletions(-) create mode 100644 apps/expo/src/lib/language.ts diff --git a/apps/expo/src/components/player/CaptionsSelector.tsx b/apps/expo/src/components/player/CaptionsSelector.tsx index ffb4da6..fca4844 100644 --- a/apps/expo/src/components/player/CaptionsSelector.tsx +++ b/apps/expo/src/components/player/CaptionsSelector.tsx @@ -4,21 +4,21 @@ import { useState } from "react"; import { MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons"; import { useMutation } from "@tanstack/react-query"; import { parse } from "subsrt-ts"; -import { useTheme, View } from "tamagui"; +import { Spinner, useTheme, View } from "tamagui"; import type { Stream } from "@movie-web/provider-utils"; import type { CaptionWithData } from "~/stores/captions"; +import { + getCountryCodeFromLanguage, + getPrettyLanguageNameFromLocale, +} from "~/lib/language"; import { useCaptionsStore } from "~/stores/captions"; import { usePlayerStore } from "~/stores/player/store"; import { FlagIcon } from "../FlagIcon"; import { MWButton } from "../ui/Button"; import { Controls } from "./Controls"; import { Settings } from "./settings/Sheet"; -import { - getCountryCodeFromLanguage, - getPrettyLanguageNameFromLocale, -} from "./utils"; const parseCaption = async ( caption: Stream["captions"][0], @@ -111,13 +111,15 @@ export const CaptionsSelector = () => { } title={"Off"} iconRight={ - !selectedCaption?.id && ( - - ) + <> + {!selectedCaption?.id && ( + + )} + } onPress={() => setSelectedCaption(null)} /> @@ -141,13 +143,19 @@ export const CaptionsSelector = () => { } title={getPrettyLanguageNameFromLocale(caption.language) ?? ""} iconRight={ - selectedCaption?.id === caption.id && ( - - ) + <> + {selectedCaption?.id === caption.id && ( + + )} + {downloadCaption.isPending && + downloadCaption.variables.id === caption.id && ( + + )} + } onPress={() => downloadCaption.mutate(caption)} key={caption.id} diff --git a/apps/expo/src/components/player/Controls.tsx b/apps/expo/src/components/player/Controls.tsx index f80710b..5f6b8ab 100644 --- a/apps/expo/src/components/player/Controls.tsx +++ b/apps/expo/src/components/player/Controls.tsx @@ -1,14 +1,14 @@ -import type { TouchableOpacity } from "react-native"; +import type { ViewProps } from "tamagui"; import React from "react"; -import { View } from "react-native"; +import { View } from "tamagui"; import { usePlayerStore } from "~/stores/player/store"; -interface ControlsProps extends React.ComponentProps { +interface ControlsProps extends ViewProps { children: React.ReactNode; } -export const Controls = ({ children }: ControlsProps) => { +export const Controls = ({ children, ...props }: ControlsProps) => { const idle = usePlayerStore((state) => state.interface.isIdle); - return {!idle && children}; + return {!idle && children}; }; diff --git a/apps/expo/src/components/player/VideoPlayer.tsx b/apps/expo/src/components/player/VideoPlayer.tsx index cb072b3..184a265 100644 --- a/apps/expo/src/components/player/VideoPlayer.tsx +++ b/apps/expo/src/components/player/VideoPlayer.tsx @@ -287,6 +287,7 @@ function GestureOverlay(props: { borderTopRightRadius: props.value.value >= 0.98 ? 44 : 0, }; }); + return ( { const status = usePlayerStore((state) => state.status); const setIsIdle = usePlayerStore((state) => state.setIsIdle); - const width = Dimensions.get("screen").width - 40; + const width = Dimensions.get("screen").width - 120; const knobSize_ = 20; const trackSize_ = 8; const minimumValue = 0; diff --git a/apps/expo/src/components/player/utils.ts b/apps/expo/src/components/player/utils.ts index b9d929b..ab8e2ef 100644 --- a/apps/expo/src/components/player/utils.ts +++ b/apps/expo/src/components/player/utils.ts @@ -1,6 +1,3 @@ -import type { LanguageCode } from "iso-639-1"; -import iso from "iso-639-1"; - export const mapMillisecondsToTime = (milliseconds: number): string => { const hours = Math.floor(milliseconds / (1000 * 60 * 60)); const minutes = Math.floor((milliseconds % (1000 * 60 * 60)) / (1000 * 60)); @@ -19,199 +16,3 @@ export const mapMillisecondsToTime = (milliseconds: number): string => { return formattedTime; }; - -export function getPrettyLanguageNameFromLocale(locale: string): string | null { - return iso.getName(locale); -} - -export const getCountryCodeFromLanguage = ( - languageCode: LanguageCode, -): string => { - return languageToCountryMap[languageCode] || ""; -}; - -const languageToCountryMap: Record = { - en: "US", // English - United States - es: "ES", // Spanish - Spain - fr: "FR", // French - France - zh: "CN", // Mandarin - China - ar: "SA", // Arabic - Saudi Arabia - de: "DE", // German - Germany - ru: "RU", // Russian - Russia - pt: "PT", // Portuguese - Portugal - it: "IT", // Italian - Italy - ja: "JP", // Japanese - Japan - ko: "KR", // Korean - South Korea - hi: "IN", // Hindi - India - sv: "SE", // Swedish - Sweden - nl: "NL", // Dutch - Netherlands - pl: "PL", // Polish - Poland - tr: "TR", // Turkish - Turkey - el: "GR", // Greek - Greece - he: "IL", // Hebrew - Israel - vi: "VN", // Vietnamese - Vietnam - th: "TH", // Thai - Thailand - cs: "CZ", // Czech - Czech Republic - da: "DK", // Danish - Denmark - fi: "FI", // Finnish - Finland - hu: "HU", // Hungarian - Hungary - no: "NO", // Norwegian - Norway - ro: "RO", // Romanian - Romania - sk: "SK", // Slovak - Slovakia - sl: "SI", // Slovenian - Slovenia - uk: "UA", // Ukrainian - Ukraine - bg: "BG", // Bulgarian - Bulgaria - hr: "HR", // Croatian - Croatia - lt: "LT", // Lithuanian - Lithuania - lv: "LV", // Latvian - Latvia - et: "EE", // Estonian - Estonia - sr: "RS", // Serbian - Serbia - bs: "BA", // Bosnian - Bosnia and Herzegovina - mk: "MK", // Macedonian - North Macedonia - sq: "AL", // Albanian - Albania - mt: "MT", // Maltese - Malta - is: "IS", // Icelandic - Iceland - ga: "IE", // Irish - Ireland - cy: "GB", // Welsh - United Kingdom - eu: "ES", // Basque - Spain - ca: "ES", // Catalan - Spain - gl: "ES", // Galician - Spain - af: "ZA", // Afrikaans - South Africa - sw: "TZ", // Swahili - Tanzania - am: "ET", // Amharic - Ethiopia - so: "SO", // Somali - Somalia - ha: "NG", // Hausa - Nigeria - ig: "NG", // Igbo - Nigeria - yo: "NG", // Yoruba - Nigeria - rw: "RW", // Kinyarwanda - Rwanda - ny: "MW", // Chichewa - Malawi - mg: "MG", // Malagasy - Madagascar - ln: "CD", // Lingala - Democratic Republic of the Congo - tg: "TJ", // Tajik - Tajikistan - uz: "UZ", // Uzbek - Uzbekistan - tk: "TM", // Turkmen - Turkmenistan - ky: "KG", // Kyrgyz - Kyrgyzstan - mn: "MN", // Mongolian - Mongolia - ps: "AF", // Pashto - Afghanistan - ur: "PK", // Urdu - Pakistan - fa: "IR", // Persian (Farsi) - Iran - ku: "IQ", // Kurdish - Iraq - sd: "PK", // Sindhi - Pakistan - ne: "NP", // Nepali - Nepal - si: "LK", // Sinhala - Sri Lanka - km: "KH", // Khmer - Cambodia - lo: "LA", // Lao - Laos - my: "MM", // Burmese - Myanmar - ka: "GE", // Georgian - Georgia - hy: "AM", // Armenian - Armenia - az: "AZ", // Azerbaijani - Azerbaijan - bm: "ML", // Bambara - Mali - ff: "SN", // Fulfulde - Senegal - ti: "ER", // Tigrinya - Eritrea - xh: "ZA", // Xhosa - South Africa - zu: "ZA", // Zulu - South Africa - ms: "MY", // Malay - Malaysia - id: "ID", // Indonesian - Indonesia - jv: "ID", // Javanese - Indonesia - su: "ID", // Sundanese - Indonesia - tl: "PH", // Tagalog - Philippines - ml: "IN", // Malayalam - India - te: "IN", // Telugu - India - ta: "IN", // Tamil - India - mr: "IN", // Marathi - India - bn: "BD", // Bengali - Bangladesh - gu: "IN", // Gujarati - India - kn: "IN", // Kannada - India - or: "IN", // Oriya - India - pa: "IN", // Punjabi - India - aa: "ET", // Afar - Ethiopia - ab: "GE", // Abkhazian - Georgia - ae: "IR", // Avestan - Iran - ak: "GH", // Akan - Ghana - an: "ES", // Aragonese - Spain - as: "IN", // Assamese - India - av: "RU", // Avaric - Russia - ay: "BO", // Aymara - Bolivia - ba: "RU", // Bashkir - Russia - be: "BY", // Belarusian - Belarus - bi: "VU", // Bislama - Vanuatu - bo: "CN", // Tibetan - China - br: "FR", // Breton - France - ce: "RU", // Chechen - Russia - ch: "GU", // Chamorro - Guam - co: "FR", // Corsican - France - cr: "CA", // Cree - Canada - cu: "RU", // Church Slavic - Russia - cv: "RU", // Chuvash - Russia - dv: "MV", // Dhivehi - Maldives - dz: "BT", // Dzongkha - Bhutan - ee: "GH", // Ewe - Ghana - eo: "—", // Esperanto - International (Constructed Language) - fj: "FJ", // Fijian - Fiji - fo: "FO", // Faroese - Faroe Islands - fy: "NL", // Western Frisian - Netherlands - gd: "GB", // Scottish Gaelic - United Kingdom - gn: "PY", // Guarani - Paraguay - gv: "IM", // Manx - Isle of Man - ho: "PG", // Hiri Motu - Papua New Guinea - ht: "HT", // Haitian Creole - Haiti - hz: "NA", // Herero - Namibia - ia: "—", // Interlingua - International (Constructed Language) - ie: "—", // Interlingue - International (Constructed Language) - ii: "CN", // Sichuan Yi - China - ik: "US", // Inupiaq - United States - io: "—", // Ido - International (Constructed Language) - iu: "CA", // Inuktitut - Canada - kg: "CG", // Kongo - Congo - ki: "KE", // Kikuyu - Kenya - kj: "AO", // Kuanyama - Angola - kk: "KZ", // Kazakh - Kazakhstan - kl: "GL", // Kalaallisut - Greenland - kr: "NE", // Kanuri - Niger - ks: "IN", // Kashmiri - India - kv: "RU", // Komi - Russia - kw: "GB", // Cornish - United Kingdom - la: "VA", // Latin - Vatican City - lb: "LU", // Luxembourgish - Luxembourg - lg: "UG", // Ganda - Uganda - li: "NL", // Limburgish - Netherlands - lu: "CD", // Luba-Katanga - Democratic Republic of the Congo - mh: "MH", // Marshallese - Marshall Islands - mi: "NZ", // Maori - New Zealand - na: "NR", // Nauru - Nauru - nb: "NO", // Norwegian Bokmål - Norway - nd: "ZW", // North Ndebele - Zimbabwe - ng: "NA", // Ndonga - Namibia - nn: "NO", // Norwegian Nynorsk - Norway - nr: "ZA", // South Ndebele - South Africa - nv: "US", // Navajo - United States - oc: "FR", // Occitan - France - oj: "CA", // Ojibwe - Canada - om: "ET", // Oromo - Ethiopia - os: "GE", // Ossetian - Georgia - pi: "IN", // Pali - India - qu: "PE", // Quechua - Peru - rm: "CH", // Romansh - Switzerland - rn: "BI", // Rundi - Burundi - sa: "IN", // Sanskrit - India - sc: "IT", // Sardinian - Italy - se: "NO", // Northern Sami - Norway - sg: "CF", // Sango - Central African Republic - sm: "WS", // Samoan - Samoa - sn: "ZW", // Shona - Zimbabwe - ss: "SZ", // Swati - Eswatini - st: "LS", // Southern Sotho - Lesotho - tn: "BW", // Tswana - Botswana - to: "TO", // Tonga - Tonga - ts: "ZA", // Tsonga - South Africa - tt: "RU", // Tatar - Russia - tw: "GH", // Twi - Ghana - ty: "PF", // Tahitian - French Polynesia - ug: "CN", // Uyghur - China - ve: "ZA", // Venda - South Africa - vo: "—", // Volapük - International (Constructed Language) - wa: "BE", // Walloon - Belgium - wo: "SN", // Wolof - Senegal - yi: "—", // Yiddish - International (Primarily spoken among Jewish communities) - za: "CN", // Zhuang - China -}; diff --git a/apps/expo/src/lib/language.ts b/apps/expo/src/lib/language.ts new file mode 100644 index 0000000..745ba19 --- /dev/null +++ b/apps/expo/src/lib/language.ts @@ -0,0 +1,198 @@ +import type { LanguageCode } from "iso-639-1"; +import iso from "iso-639-1"; + +export function getPrettyLanguageNameFromLocale(locale: string): string | null { + return iso.getName(locale); +} + +export const getCountryCodeFromLanguage = ( + languageCode: LanguageCode, +): string => { + return languageToCountryMap[languageCode] || ""; +}; + +const languageToCountryMap: Record = { + en: "US", // English - United States + es: "ES", // Spanish - Spain + fr: "FR", // French - France + zh: "CN", // Mandarin - China + ar: "SA", // Arabic - Saudi Arabia + de: "DE", // German - Germany + ru: "RU", // Russian - Russia + pt: "PT", // Portuguese - Portugal + it: "IT", // Italian - Italy + ja: "JP", // Japanese - Japan + ko: "KR", // Korean - South Korea + hi: "IN", // Hindi - India + sv: "SE", // Swedish - Sweden + nl: "NL", // Dutch - Netherlands + pl: "PL", // Polish - Poland + tr: "TR", // Turkish - Turkey + el: "GR", // Greek - Greece + he: "IL", // Hebrew - Israel + vi: "VN", // Vietnamese - Vietnam + th: "TH", // Thai - Thailand + cs: "CZ", // Czech - Czech Republic + da: "DK", // Danish - Denmark + fi: "FI", // Finnish - Finland + hu: "HU", // Hungarian - Hungary + no: "NO", // Norwegian - Norway + ro: "RO", // Romanian - Romania + sk: "SK", // Slovak - Slovakia + sl: "SI", // Slovenian - Slovenia + uk: "UA", // Ukrainian - Ukraine + bg: "BG", // Bulgarian - Bulgaria + hr: "HR", // Croatian - Croatia + lt: "LT", // Lithuanian - Lithuania + lv: "LV", // Latvian - Latvia + et: "EE", // Estonian - Estonia + sr: "RS", // Serbian - Serbia + bs: "BA", // Bosnian - Bosnia and Herzegovina + mk: "MK", // Macedonian - North Macedonia + sq: "AL", // Albanian - Albania + mt: "MT", // Maltese - Malta + is: "IS", // Icelandic - Iceland + ga: "IE", // Irish - Ireland + cy: "GB", // Welsh - United Kingdom + eu: "ES", // Basque - Spain + ca: "ES", // Catalan - Spain + gl: "ES", // Galician - Spain + af: "ZA", // Afrikaans - South Africa + sw: "TZ", // Swahili - Tanzania + am: "ET", // Amharic - Ethiopia + so: "SO", // Somali - Somalia + ha: "NG", // Hausa - Nigeria + ig: "NG", // Igbo - Nigeria + yo: "NG", // Yoruba - Nigeria + rw: "RW", // Kinyarwanda - Rwanda + ny: "MW", // Chichewa - Malawi + mg: "MG", // Malagasy - Madagascar + ln: "CD", // Lingala - Democratic Republic of the Congo + tg: "TJ", // Tajik - Tajikistan + uz: "UZ", // Uzbek - Uzbekistan + tk: "TM", // Turkmen - Turkmenistan + ky: "KG", // Kyrgyz - Kyrgyzstan + mn: "MN", // Mongolian - Mongolia + ps: "AF", // Pashto - Afghanistan + ur: "PK", // Urdu - Pakistan + fa: "IR", // Persian (Farsi) - Iran + ku: "IQ", // Kurdish - Iraq + sd: "PK", // Sindhi - Pakistan + ne: "NP", // Nepali - Nepal + si: "LK", // Sinhala - Sri Lanka + km: "KH", // Khmer - Cambodia + lo: "LA", // Lao - Laos + my: "MM", // Burmese - Myanmar + ka: "GE", // Georgian - Georgia + hy: "AM", // Armenian - Armenia + az: "AZ", // Azerbaijani - Azerbaijan + bm: "ML", // Bambara - Mali + ff: "SN", // Fulfulde - Senegal + ti: "ER", // Tigrinya - Eritrea + xh: "ZA", // Xhosa - South Africa + zu: "ZA", // Zulu - South Africa + ms: "MY", // Malay - Malaysia + id: "ID", // Indonesian - Indonesia + jv: "ID", // Javanese - Indonesia + su: "ID", // Sundanese - Indonesia + tl: "PH", // Tagalog - Philippines + ml: "IN", // Malayalam - India + te: "IN", // Telugu - India + ta: "IN", // Tamil - India + mr: "IN", // Marathi - India + bn: "BD", // Bengali - Bangladesh + gu: "IN", // Gujarati - India + kn: "IN", // Kannada - India + or: "IN", // Oriya - India + pa: "IN", // Punjabi - India + aa: "ET", // Afar - Ethiopia + ab: "GE", // Abkhazian - Georgia + ae: "IR", // Avestan - Iran + ak: "GH", // Akan - Ghana + an: "ES", // Aragonese - Spain + as: "IN", // Assamese - India + av: "RU", // Avaric - Russia + ay: "BO", // Aymara - Bolivia + ba: "RU", // Bashkir - Russia + be: "BY", // Belarusian - Belarus + bi: "VU", // Bislama - Vanuatu + bo: "CN", // Tibetan - China + br: "FR", // Breton - France + ce: "RU", // Chechen - Russia + ch: "GU", // Chamorro - Guam + co: "FR", // Corsican - France + cr: "CA", // Cree - Canada + cu: "RU", // Church Slavic - Russia + cv: "RU", // Chuvash - Russia + dv: "MV", // Dhivehi - Maldives + dz: "BT", // Dzongkha - Bhutan + ee: "GH", // Ewe - Ghana + eo: "—", // Esperanto - International (Constructed Language) + fj: "FJ", // Fijian - Fiji + fo: "FO", // Faroese - Faroe Islands + fy: "NL", // Western Frisian - Netherlands + gd: "GB", // Scottish Gaelic - United Kingdom + gn: "PY", // Guarani - Paraguay + gv: "IM", // Manx - Isle of Man + ho: "PG", // Hiri Motu - Papua New Guinea + ht: "HT", // Haitian Creole - Haiti + hz: "NA", // Herero - Namibia + ia: "—", // Interlingua - International (Constructed Language) + ie: "—", // Interlingue - International (Constructed Language) + ii: "CN", // Sichuan Yi - China + ik: "US", // Inupiaq - United States + io: "—", // Ido - International (Constructed Language) + iu: "CA", // Inuktitut - Canada + kg: "CG", // Kongo - Congo + ki: "KE", // Kikuyu - Kenya + kj: "AO", // Kuanyama - Angola + kk: "KZ", // Kazakh - Kazakhstan + kl: "GL", // Kalaallisut - Greenland + kr: "NE", // Kanuri - Niger + ks: "IN", // Kashmiri - India + kv: "RU", // Komi - Russia + kw: "GB", // Cornish - United Kingdom + la: "VA", // Latin - Vatican City + lb: "LU", // Luxembourgish - Luxembourg + lg: "UG", // Ganda - Uganda + li: "NL", // Limburgish - Netherlands + lu: "CD", // Luba-Katanga - Democratic Republic of the Congo + mh: "MH", // Marshallese - Marshall Islands + mi: "NZ", // Maori - New Zealand + na: "NR", // Nauru - Nauru + nb: "NO", // Norwegian Bokmål - Norway + nd: "ZW", // North Ndebele - Zimbabwe + ng: "NA", // Ndonga - Namibia + nn: "NO", // Norwegian Nynorsk - Norway + nr: "ZA", // South Ndebele - South Africa + nv: "US", // Navajo - United States + oc: "FR", // Occitan - France + oj: "CA", // Ojibwe - Canada + om: "ET", // Oromo - Ethiopia + os: "GE", // Ossetian - Georgia + pi: "IN", // Pali - India + qu: "PE", // Quechua - Peru + rm: "CH", // Romansh - Switzerland + rn: "BI", // Rundi - Burundi + sa: "IN", // Sanskrit - India + sc: "IT", // Sardinian - Italy + se: "NO", // Northern Sami - Norway + sg: "CF", // Sango - Central African Republic + sm: "WS", // Samoan - Samoa + sn: "ZW", // Shona - Zimbabwe + ss: "SZ", // Swati - Eswatini + st: "LS", // Southern Sotho - Lesotho + tn: "BW", // Tswana - Botswana + to: "TO", // Tonga - Tonga + ts: "ZA", // Tsonga - South Africa + tt: "RU", // Tatar - Russia + tw: "GH", // Twi - Ghana + ty: "PF", // Tahitian - French Polynesia + ug: "CN", // Uyghur - China + ve: "ZA", // Venda - South Africa + vo: "—", // Volapük - International (Constructed Language) + wa: "BE", // Walloon - Belgium + wo: "SN", // Wolof - Senegal + yi: "—", // Yiddish - International (Primarily spoken among Jewish communities) + za: "CN", // Zhuang - China +};