Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add defaultQualityOrder prop #283

Merged
merged 3 commits into from
Sep 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/griffith/README-zh-Hans.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ render(<Player {...props} />)
| `duration` | `number` | | 初始视频时长。在视频元数据载入后使用实际值 |
| `sources` | `sources` | | 视频播放数据。具体见下, |
| `defaultQuality` | `ld \| sd \| hd \| fhd` | | 视频默认播放清晰度 |
| `defaultQualityOrder` | `asc \| desc` | `asc` | 视频默认选择清晰度的顺序 |
| `useAutoQuality` | `boolean` | `false` | 是否启用自动清晰度功能 |
| `standalone` | `boolean` | `false` | 是否启用 standalone 模式 |
| `onBeforePlay` | `function` | `void` | 视频播放之前回调函数 |
Expand Down
1 change: 1 addition & 0 deletions packages/griffith/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ render(<Player {...props} />)
| `duration` | `number` | | Initial video duration. Use actual values after video metadata is loaded |
| `sources` | `sources` | | Video playback data |
| `defaultQuality` | `ld \| sd \| hd \| fhd` | | Video default quality |
| `defaultQualityOrder` | `asc \| desc` | `asc` | the order for selecting default quality |
| `useAutoQuality` | `boolean` | `false` | Enable auto quality |
| `standalone` | `boolean` | `false` | Enable standalone mode |
| `onBeforePlay` | `function` | `void` | Callback function before video playback |
Expand Down
4 changes: 4 additions & 0 deletions packages/griffith/src/components/Player.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import {
ProgressDot,
ProgressValue,
RealQuality,
QualityOrder,
} from '../types'
import formatDuration from '../utils/formatDuration'
import getBufferedTime from '../utils/getBufferedTime'
Expand Down Expand Up @@ -99,6 +100,7 @@ type OuterPlayerProps = {
messageContextRef?: React.MutableRefObject<MessageContextValue | void>
initialObjectFit?: ObjectFit
defaultQuality?: RealQuality
defaultQualityOrder?: QualityOrder
playbackRates?: PlaybackRate[]
defaultPlaybackRate?: PlaybackRate
shouldObserveResize?: boolean
Expand Down Expand Up @@ -740,6 +742,7 @@ const Player: React.FC<PlayerProps> = ({
locale = defaultLocale,
localeConfig,
defaultQuality,
defaultQualityOrder = 'asc',
defaultPlaybackRate = DEFAULT_PLAYBACK_RATE,
playbackRates = DEFAULT_PLAYBACK_RATES,
useAutoQuality = false,
Expand All @@ -761,6 +764,7 @@ const Player: React.FC<PlayerProps> = ({
defaultQuality={defaultQuality}
useAutoQuality={useAutoQuality}
defaultPlaybackRate={defaultPlaybackRate}
defaultQualityOrder={defaultQualityOrder}
playbackRates={playbackRates}
>
<LocaleProvider locale={locale} localeConfig={localeConfig}>
Expand Down
3 changes: 1 addition & 2 deletions packages/griffith/src/components/items/QualityMenuItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import React from 'react'
import {css} from 'aphrodite/no-important'
import {Quality} from '../../types'
import VideoSourceContext from '../../contexts/VideoSourceContext'
import reverseArray from '../../utils/reverseArray'
import TranslatedText from '../TranslatedText'
import ControllerButton from './ControllerButton'
import styles from '../Controller.styles'
Expand Down Expand Up @@ -58,7 +57,7 @@ class QualityMenuItem extends React.PureComponent<QualityMenuItemProps, State> {
)}
>
<div className={css(styles.qualityMenu)}>
{reverseArray(qualities).map((q) => (
{qualities.map((q) => (
<button
key={q}
className={css(
Expand Down
25 changes: 18 additions & 7 deletions packages/griffith/src/contexts/VideoSourceProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
import React, {useContext, useEffect, useMemo, useState} from 'react'
import {PlaySourceMap, PlaybackRate, RealQuality, Quality} from '../types'
import {
PlaySourceMap,
PlaybackRate,
RealQuality,
Quality,
QualityOrder,
} from '../types'
import VideoSourceContext from './VideoSourceContext'
import {getQualities, getSources} from './parsePlaylist'
import {EVENTS} from 'griffith-message'
import {ua} from 'griffith-utils'
import reverseArray from '../utils/reverseArray'
import useHandler from '../hooks/useHandler'
import useChanged from '../hooks/useChanged'
import {InternalMessageContext} from './MessageContext'
Expand All @@ -14,6 +21,7 @@ const {isMobile} = ua
type VideoSourceProviderProps = {
sources: PlaySourceMap
defaultQuality?: RealQuality
defaultQualityOrder?: QualityOrder
useAutoQuality?: boolean
playbackRates: PlaybackRate[]
defaultPlaybackRate?: PlaybackRate
Expand All @@ -25,17 +33,19 @@ const VideoSourceProvider: React.FC<VideoSourceProviderProps> = ({
playbackRates,
defaultPlaybackRate,
defaultQuality,
defaultQualityOrder,
children,
}) => {
const {emitEvent} = useContext(InternalMessageContext)
const lastSourceMap = useChanged(sourceMap)
const {qualities, sources, format} = useMemo(() => {
const {qualities, sources, format, isDescOrder} = useMemo(() => {
// 其实视频源应当是必需参数
if (!lastSourceMap) {
return {qualities: [], sources: []}
}
const {format} = Object.values(lastSourceMap)[0]!
const qualities = getQualities(lastSourceMap, isMobile)
const isDescOrder = defaultQualityOrder === 'desc'
const qualities = getQualities(lastSourceMap, isMobile, isDescOrder)
const sources = getSources(qualities, lastSourceMap)

// 目前只有直播流实现了手动拼接 auto 清晰度的功能
Expand All @@ -48,11 +58,11 @@ const VideoSourceProvider: React.FC<VideoSourceProviderProps> = ({
qualities.unshift('auto')
}

return {qualities, sources, format}
}, [useAutoQuality, lastSourceMap])
return {qualities, sources, format, isDescOrder}
}, [useAutoQuality, lastSourceMap, defaultQualityOrder])

const [currentQuality, setCurrentQualityRaw] = useState(
defaultQuality && (qualities as Quality[]).indexOf(defaultQuality) !== -1
defaultQuality && (qualities as Quality[]).includes(defaultQuality)
? defaultQuality
: qualities[0]
)
Expand Down Expand Up @@ -99,7 +109,7 @@ const VideoSourceProvider: React.FC<VideoSourceProviderProps> = ({

const contextValue = useMemo(
() => ({
qualities,
qualities: isDescOrder ? qualities : reverseArray(qualities),
playbackRates,
format: format!,
sources,
Expand All @@ -116,6 +126,7 @@ const VideoSourceProvider: React.FC<VideoSourceProviderProps> = ({
format,
playbackRates,
qualities,
isDescOrder,
setCurrentPlaybackRate,
setCurrentQuality,
sources,
Expand Down
12 changes: 9 additions & 3 deletions packages/griffith/src/contexts/parsePlaylist.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import {Quality, FormattedPlaySource, PlaySourceMap} from '../types'
const QUALITY_ORDER: Quality[] = ['auto', 'ld', 'sd', 'hd', 'fhd']

export const getQualities = (sources: PlaySourceMap, isMobile: any) => {
const qualities = (Object.keys(sources) as Quality[]).sort(
(a, b) => QUALITY_ORDER.indexOf(a) - QUALITY_ORDER.indexOf(b)
export const getQualities = (
sources: PlaySourceMap,
isMobile: any,
isDescOrder: boolean
) => {
const qualities = (Object.keys(sources) as Quality[]).sort((a, b) =>
isDescOrder
? QUALITY_ORDER.indexOf(b) - QUALITY_ORDER.indexOf(a)
: QUALITY_ORDER.indexOf(a) - QUALITY_ORDER.indexOf(b)
)

if (qualities.length > 1) {
Expand Down
1 change: 1 addition & 0 deletions packages/griffith/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

export type RealQuality = 'ld' | 'sd' | 'hd' | 'fhd'
export type Quality = 'auto' | RealQuality
export type QualityOrder = 'asc' | 'desc'

export interface PlaySource {
bitrate?: number
Expand Down