Split remember speed into options (#2746)

This commit is contained in:
the1812 2022-02-13 10:22:11 +08:00
parent 48fcf5297f
commit d60eca961c
4 changed files with 285 additions and 15 deletions

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,6 @@ import { videoChange } from '@/core/observer'
import {
addListener,
calcOrder,
enabled,
extendedAgent,
formatSpeedText,
getAid,
@ -43,7 +42,7 @@ const getRememberSpeed = (aid?: string) => {
const getFallbackVideoSpeed = () => {
// 如果组件被启用才使用存储的后备值
if (enabled) {
if (options.remember) {
return parseFloat(options.speed)
}
return null
@ -231,8 +230,12 @@ export const createController = _.once(() => {
}
containerElement = tmpContainerElement
videoElement = tmpVideoElement
nameBtn = containerElement.querySelector(extendedAgent.custom.speedNameBtn.selector) as HTMLButtonElement
menuListElement = containerElement.querySelector(extendedAgent.custom.speedMenuList.selector) as HTMLElement
nameBtn = containerElement.querySelector(
extendedAgent.custom.speedNameBtn.selector,
) as HTMLButtonElement
menuListElement = containerElement.querySelector(
extendedAgent.custom.speedMenuList.selector,
) as HTMLElement
// 试图插入扩展的倍速菜单项
await extendListIfAllow()
// 为每一个倍速菜单项附加 dataset
@ -259,9 +262,9 @@ export const createController = _.once(() => {
menuListElement.querySelector(`${extendedAgent.custom.speedMenuItem.selector}.extended${extendedAgent.custom.active.selector}`)?.classList.remove(activeClassName)
}
// 记忆
// - `enabled` 表示是否启用记忆
// - `options.remember` 表示是否启用记忆
// - `options.individualRemember` 表示是否启用细化到视频级别的记忆
if (enabled) {
if (options.remember) {
if (options.individualRemember) {
rememberSpeed(
speed,
@ -284,7 +287,7 @@ export const createController = _.once(() => {
setTimeout(() => {
setVideoSpeed(
(
enabled
options.remember
&& options.individualRemember
&& getRememberSpeed()
)
@ -294,6 +297,14 @@ export const createController = _.once(() => {
}, 100)
})
return {
getSupportedRates, getExtendedSupportedRates, setVideoSpeed, videoSpeed, getRememberSpeed, rememberSpeed, forgetSpeed, resetVideoSpeed, toggleVideoSpeed,
getSupportedRates,
getExtendedSupportedRates,
setVideoSpeed,
videoSpeed,
getRememberSpeed,
rememberSpeed,
forgetSpeed,
resetVideoSpeed,
toggleVideoSpeed,
}
})

View File

@ -10,19 +10,19 @@ type Controller = ReturnType<typeof createController>
export const component: ComponentMetadata = {
name: componentName,
displayName: '倍速记忆',
displayName: '倍速增强',
author: {
name: 'JLoeve',
link: 'https://github.com/LonelySteve',
},
description: {
'zh-CN': '记忆上次选择的视频播放速度, 还可以使用更多倍速来扩展原生倍速菜单.',
'zh-CN': '可以记忆上次选择的视频播放速度, 还可以使用更多倍速来扩展原生倍速菜单.',
},
tags: [componentsTags.video],
urlInclude: playerUrls,
entry: async () => (await import('./controller')).createController(),
plugin: {
displayName: '倍速记忆 - 快捷键支持',
displayName: '倍速增强 - 快捷键支持',
setup: async ({ addData }) => {
const { getComponentSettings } = await import('@/core/settings')
@ -107,6 +107,10 @@ export const component: ComponentMetadata = {
defaultValue: [2.5, 3],
hidden: true,
},
remember: {
displayName: '启用倍速记忆',
defaultValue: true,
},
individualRemember: {
displayName: '各视频分别记忆',
defaultValue: false,

View File

@ -41,13 +41,16 @@ export interface Options {
speed: string
extend: boolean
extendList: number[]
remember: boolean
individualRemember: boolean
individualRememberList: Record<string, string[]>
}
export const { options, enabled } = getComponentSettings('rememberVideoSpeed') as ComponentSettings<Options>
export const { options } = getComponentSettings('rememberVideoSpeed') as ComponentSettings<Options>
export const getUniqueAscendingSortList = (values: number[]) => Array.from(new Set(values)).sort(ascendingSort())
export const getUniqueAscendingSortList = (values: number[]) => (
Array.from(new Set(values)).sort(ascendingSort())
)
export const getExtendedSupportedRates = () => getUniqueAscendingSortList(options.extendList)
@ -71,4 +74,6 @@ export const addListener = (element: HTMLElement, listener: Listener) => {
listeners.set(element, listener)
}
export const removeListeners = () => listeners.forEach((listener, element) => element.removeEventListener(...listener))
export const removeListeners = () => listeners.forEach(
(listener, element) => element.removeEventListener(...listener),
)