From de885ba44d33c03bfdd7bc01adf46d5e155f0438 Mon Sep 17 00:00:00 2001 From: Jip Fr Date: Tue, 17 Oct 2023 17:43:50 +0200 Subject: [PATCH] Quality sorting, language selection UI for captions Co-authored-by: mrjvs --- package.json | 1 + pnpm-lock.yaml | 7 ++++ src/components/player/atoms/Settings.tsx | 52 +++++++++++++++++++++++- src/stores/player/utils/qualities.ts | 25 +++++++++--- tailwind.config.js | 1 + 5 files changed, 78 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 5a880018..f3f7b5e2 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "core-js": "^3.29.1", "crypto-js": "^4.1.1", "dompurify": "^3.0.1", + "flag-icons": "^6.11.1", "fscreen": "^1.2.0", "fuse.js": "^6.4.6", "hls.js": "^1.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43a2da12..694d52bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,6 +38,9 @@ dependencies: dompurify: specifier: ^3.0.1 version: 3.0.5 + flag-icons: + specifier: ^6.11.1 + version: 6.11.1 fscreen: specifier: ^1.2.0 version: 1.2.0 @@ -3770,6 +3773,10 @@ packages: path-exists: 4.0.0 dev: true + /flag-icons@6.11.1: + resolution: {integrity: sha512-c2UMJTFZoVQ47/sE1mb+9b5S1pi8SjXsx0MR063O31GV+O2EN4FMwMdEYSQItpien2bl9w1viLUoo2R3r6OK3g==} + dev: false + /flat-cache@3.1.0: resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} engines: {node: '>=12.0.0'} diff --git a/src/components/player/atoms/Settings.tsx b/src/components/player/atoms/Settings.tsx index e2ca4a9c..9b0f7173 100644 --- a/src/components/player/atoms/Settings.tsx +++ b/src/components/player/atoms/Settings.tsx @@ -1,3 +1,5 @@ +import "flag-icons/css/flag-icons.min.css"; + import classNames from "classnames"; import { useCallback, useEffect, useState } from "react"; @@ -141,15 +143,61 @@ function CaptionSettingsView({ id }: { id: string }) { ); } +function CaptionOption(props: { + countryCode?: string; + children: React.ReactNode; + selected?: boolean; +}) { + return ( +
+
+ +
+ + {props.children} + + {props.selected ? ( + + ) : null} +
+ ); +} + function CaptionsView({ id }: { id: string }) { const router = useOverlayRouter(id); return ( <> - router.navigate("/captions")}> + router.navigate("/")} + rightSide={ + + } + > Captions - Yee! + + Off + + Nederlands + + Idk Gibraltar of zo? + ); } diff --git a/src/stores/player/utils/qualities.ts b/src/stores/player/utils/qualities.ts index 2def1113..b83ef303 100644 --- a/src/stores/player/utils/qualities.ts +++ b/src/stores/player/utils/qualities.ts @@ -22,6 +22,17 @@ export type SourceSliceSource = url: string; }; +const qualitySorting: Record = { + "1080": 40, + "360": 10, + "480": 20, + "720": 30, + unknown: 0, +}; +const sortedQualities: SourceQuality[] = Object.entries(qualitySorting) + .sort((a, b) => b[1] - a[1]) + .map((v) => v[0] as SourceQuality); + export function selectQuality(source: SourceSliceSource): { stream: LoadableSource; quality: null | SourceQuality; @@ -32,12 +43,14 @@ export function selectQuality(source: SourceSliceSource): { quality: null, }; if (source.type === "file") { - const firstQuality = Object.keys( - source.qualities - )[0] as keyof typeof source.qualities; - const stream = source.qualities[firstQuality]; - if (stream) { - return { stream, quality: firstQuality }; + const bestQuality = sortedQualities.find( + (v) => source.qualities[v] && (source.qualities[v]?.url.length ?? 0) > 0 + ); + if (bestQuality) { + const stream = source.qualities[bestQuality]; + if (stream) { + return { stream, quality: bestQuality }; + } } } throw new Error("couldn't select quality"); diff --git a/tailwind.config.js b/tailwind.config.js index 2dac6a03..b04e5b6a 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -136,6 +136,7 @@ module.exports = { light: "#4D79A8", border: "#4F5C66", buttonFocus: "#202836", + flagBg: "#202836", type: { main: "#617A8A",