Skip to content

Commit

Permalink
feat: add defaultQualityOrder prop (#283)
Browse files Browse the repository at this point in the history
Co-authored-by: xiabaoying <xiabaoying@zhihu.com>
  • Loading branch information
xia5517 and xiabaoying authored Sep 27, 2022
1 parent d1bda55 commit 2c306be
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 12 deletions.
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

0 comments on commit 2c306be

Please sign in to comment.