mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-23 22:01:20 -08:00
压缩字符
This commit is contained in:
1 parent
7ff61b4660
commit
0cf455ced3
27 files changed
+171
-239
No files matched your search
@@ -1,5 +1,64 @@
|
||||
import video from './video';
|
||||
|
||||
export default {
|
||||
video,
|
||||
propertys: [
|
||||
'audioTracks',
|
||||
'autoplay',
|
||||
'buffered',
|
||||
'controller',
|
||||
'controls',
|
||||
'crossOrigin',
|
||||
'currentSrc',
|
||||
'currentTime',
|
||||
'defaultMuted',
|
||||
'defaultPlaybackRate',
|
||||
'duration',
|
||||
'ended',
|
||||
'error',
|
||||
'loop',
|
||||
'mediaGroup',
|
||||
'muted',
|
||||
'networkState',
|
||||
'paused',
|
||||
'playbackRate',
|
||||
'played',
|
||||
'preload',
|
||||
'readyState',
|
||||
'seekable',
|
||||
'seeking',
|
||||
'src',
|
||||
'startDate',
|
||||
'textTracks',
|
||||
'videoTracks',
|
||||
'volume',
|
||||
],
|
||||
methods: [
|
||||
'addTextTrack',
|
||||
'canPlayType',
|
||||
'load',
|
||||
'play',
|
||||
'pause'
|
||||
],
|
||||
events: [
|
||||
'abort',
|
||||
'canplay',
|
||||
'canplaythrough',
|
||||
'durationchange',
|
||||
'emptied',
|
||||
'ended',
|
||||
'error',
|
||||
'loadeddata',
|
||||
'loadedmetadata',
|
||||
'loadstart',
|
||||
'pause',
|
||||
'play',
|
||||
'playing',
|
||||
'progress',
|
||||
'ratechange',
|
||||
'seeked',
|
||||
'seeking',
|
||||
'stalled',
|
||||
'suspend',
|
||||
'timeupdate',
|
||||
'volumechange',
|
||||
'waiting',
|
||||
],
|
||||
};
|
||||
@@ -1,64 +0,0 @@
|
||||
export default {
|
||||
propertys: [
|
||||
'audioTracks',
|
||||
'autoplay',
|
||||
'buffered',
|
||||
'controller',
|
||||
'controls',
|
||||
'crossOrigin',
|
||||
'currentSrc',
|
||||
'currentTime',
|
||||
'defaultMuted',
|
||||
'defaultPlaybackRate',
|
||||
'duration',
|
||||
'ended',
|
||||
'error',
|
||||
'loop',
|
||||
'mediaGroup',
|
||||
'muted',
|
||||
'networkState',
|
||||
'paused',
|
||||
'playbackRate',
|
||||
'played',
|
||||
'preload',
|
||||
'readyState',
|
||||
'seekable',
|
||||
'seeking',
|
||||
'src',
|
||||
'startDate',
|
||||
'textTracks',
|
||||
'videoTracks',
|
||||
'volume',
|
||||
],
|
||||
methods: [
|
||||
'addTextTrack',
|
||||
'canPlayType',
|
||||
'load',
|
||||
'play',
|
||||
'pause'
|
||||
],
|
||||
events: [
|
||||
'abort',
|
||||
'canplay',
|
||||
'canplaythrough',
|
||||
'durationchange',
|
||||
'emptied',
|
||||
'ended',
|
||||
'error',
|
||||
'loadeddata',
|
||||
'loadedmetadata',
|
||||
'loadstart',
|
||||
'pause',
|
||||
'play',
|
||||
'playing',
|
||||
'progress',
|
||||
'ratechange',
|
||||
'seeked',
|
||||
'seeking',
|
||||
'stalled',
|
||||
'suspend',
|
||||
'timeupdate',
|
||||
'volumechange',
|
||||
'waiting',
|
||||
],
|
||||
};
|
||||
@@ -28,7 +28,7 @@ export default function quality(option) {
|
||||
const { url, name } = quality[index];
|
||||
if (url && name && playIndex !== index) {
|
||||
player.switchQuality(url, name);
|
||||
$qualityName.innerHTML = name;
|
||||
$qualityName.innerText = name;
|
||||
playIndex = index;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -15,15 +15,11 @@ export default function setting(option) {
|
||||
append($control, icons.setting);
|
||||
|
||||
proxy($control, 'click', () => {
|
||||
setting.toggle();
|
||||
setting.toggle = true;
|
||||
});
|
||||
|
||||
art.on('setting:toggle', value => {
|
||||
if (value) {
|
||||
tooltip($control, i18n.get('Hide setting'));
|
||||
} else {
|
||||
tooltip($control, i18n.get('Show setting'));
|
||||
}
|
||||
tooltip($control, i18n.get(value ? 'Hide setting' : 'Show setting'));
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
export default function clickInit(art, events) {
|
||||
const {
|
||||
template: { $player },
|
||||
} = art;
|
||||
const { $player } = art.template;
|
||||
events.proxy(document, ['click', 'contextmenu'], event => {
|
||||
if (event.composedPath().indexOf($player) > -1) {
|
||||
art.isFocus = true;
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import { addClass, removeClass } from '../utils';
|
||||
|
||||
export default function hoverInit(art, events) {
|
||||
const {
|
||||
template: { $player },
|
||||
} = art;
|
||||
const { $player } = art.template;
|
||||
events.hover(
|
||||
$player,
|
||||
() => {
|
||||
|
||||
@@ -4,12 +4,13 @@ export default function mousemoveInitInit(art, events) {
|
||||
const {
|
||||
template: { $player, $video },
|
||||
player,
|
||||
controls,
|
||||
} = art;
|
||||
|
||||
const autoHide = debounce(() => {
|
||||
addClass($player, 'art-hide-cursor');
|
||||
removeClass($player, 'art-hover');
|
||||
art.controls.show = false;
|
||||
controls.show = false;
|
||||
}, 3000);
|
||||
|
||||
art.on('hoverleave', () => {
|
||||
@@ -21,8 +22,8 @@ export default function mousemoveInitInit(art, events) {
|
||||
events.proxy($player, 'mousemove', event => {
|
||||
autoHide.clearTimeout();
|
||||
removeClass($player, 'art-hide-cursor');
|
||||
art.controls.show = true;
|
||||
if (!art.player.pip && player.playing && event.target === $video) {
|
||||
controls.show = true;
|
||||
if (!player.pip && player.playing && event.target === $video) {
|
||||
autoHide();
|
||||
}
|
||||
art.emit('mousemove');
|
||||
|
||||
@@ -19,13 +19,13 @@ export default function resizeInit(art, events) {
|
||||
playerWidth = player.width;
|
||||
playerHeight = player.height;
|
||||
if (option.autoSize) {
|
||||
if (!art.player.fullscreen && !art.player.fullscreenWeb && !art.player.pip) {
|
||||
art.player.autoSize = true;
|
||||
if (!player.fullscreen && !player.fullscreenWeb && !player.pip) {
|
||||
player.autoSize = true;
|
||||
} else {
|
||||
art.player.autoSize = false;
|
||||
player.autoSize = false;
|
||||
}
|
||||
}
|
||||
art.player.aspectRatioReset = true;
|
||||
player.aspectRatioReset = true;
|
||||
art.emit('resize', {
|
||||
width: player.width,
|
||||
height: player.height,
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
"Exit web fullscreen": "退出网页全屏",
|
||||
"Mini player": "迷你播放器",
|
||||
"Exit mini player": "退出迷你播放器",
|
||||
"Does not support fullscreen": "不支持全屏",
|
||||
"Local Subtitle": "本地字幕",
|
||||
"Local Video": "本地视频",
|
||||
"Subtitle offset time": "字幕偏移时间",
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
"Exit web fullscreen": "退出網頁全屏",
|
||||
"Mini player": "迷你播放器",
|
||||
"Exit mini player": "退出迷你播放器",
|
||||
"Does not support fullscreen": "不支持全屏",
|
||||
"Local Subtitle": "本地字幕",
|
||||
"Local Video": "本地視頻",
|
||||
"Subtitle offset time": "字幕偏移時間",
|
||||
|
||||
@@ -14,23 +14,21 @@ import pip from './pip.svg';
|
||||
|
||||
export default class Icons {
|
||||
constructor(art) {
|
||||
const icons = Object.assign(
|
||||
{
|
||||
loading,
|
||||
state,
|
||||
play,
|
||||
pause,
|
||||
volume,
|
||||
volumeClose,
|
||||
subtitle,
|
||||
screenshot,
|
||||
setting,
|
||||
fullscreen,
|
||||
fullscreenWeb,
|
||||
pip,
|
||||
},
|
||||
art.option.icons,
|
||||
);
|
||||
const icons = {
|
||||
loading,
|
||||
state,
|
||||
play,
|
||||
pause,
|
||||
volume,
|
||||
volumeClose,
|
||||
subtitle,
|
||||
screenshot,
|
||||
setting,
|
||||
fullscreen,
|
||||
fullscreenWeb,
|
||||
pip,
|
||||
...art.option.icons,
|
||||
};
|
||||
|
||||
Object.keys(icons).forEach(key => {
|
||||
const icon = document.createElement('i');
|
||||
|
||||
@@ -9,7 +9,7 @@ export default class Mobile {
|
||||
template: { $video },
|
||||
} = art;
|
||||
|
||||
config.video.events.forEach(eventName => {
|
||||
config.events.forEach(eventName => {
|
||||
proxy($video, eventName, event => {
|
||||
art.emit(`video:${event.type}`, event);
|
||||
});
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import { setStyle, addClass, removeClass, hasClass, def } from '../utils';
|
||||
|
||||
export default function resizeMix(art, player) {
|
||||
const {
|
||||
template: { $container, $player, $video },
|
||||
} = art;
|
||||
const { $container, $player, $video } = art.template;
|
||||
|
||||
def(player, 'autoSize', {
|
||||
get() {
|
||||
|
||||
@@ -17,7 +17,7 @@ export default function eventInit(art, player) {
|
||||
player.toggle = true;
|
||||
});
|
||||
|
||||
config.video.events.forEach(eventName => {
|
||||
config.events.forEach(eventName => {
|
||||
proxy($video, eventName, event => {
|
||||
art.emit(`video:${event.type}`, event);
|
||||
});
|
||||
@@ -72,7 +72,7 @@ export default function eventInit(art, player) {
|
||||
addClass($player, 'art-error');
|
||||
sleep(1000).then(() => {
|
||||
notice.show = i18n.get('Video load failed');
|
||||
art.destroy();
|
||||
art.destroy(false);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
import { errorHandle, def } from '../utils';
|
||||
|
||||
export default function flipMix(art, player) {
|
||||
const { $player } = art.template;
|
||||
def(player, 'flip', {
|
||||
get() {
|
||||
return art.template.$player.dataset.flip;
|
||||
return $player.dataset.flip;
|
||||
},
|
||||
set(flip) {
|
||||
if (flip) {
|
||||
const flipList = ['normal', 'horizontal', 'vertical'];
|
||||
errorHandle(flipList.includes(flip), `'flip' only accept ${flipList.toString()} as parameters`);
|
||||
art.template.$player.dataset.flip = flip;
|
||||
$player.dataset.flip = flip;
|
||||
art.emit('flipChange', flip);
|
||||
} else {
|
||||
delete art.template.$player.dataset.flip;
|
||||
delete $player.dataset.flip;
|
||||
art.emit('flipRemove');
|
||||
}
|
||||
},
|
||||
|
||||
@@ -2,8 +2,9 @@ import { def } from '../utils';
|
||||
|
||||
export default function seekMix(art, player) {
|
||||
const { $video } = art.template;
|
||||
|
||||
def(player, 'loaded', {
|
||||
get: () => ($video.buffered.length ? $video.buffered.end($video.buffered.length - 1) / $video.duration : 0),
|
||||
get: () => player.loadedTime / $video.duration,
|
||||
});
|
||||
|
||||
def(player, 'loadedTime', {
|
||||
|
||||
@@ -119,7 +119,7 @@ function customPip(art, player) {
|
||||
player.aspectRatio = false;
|
||||
player.playbackRate = false;
|
||||
art.emit('pipChange', true);
|
||||
} else {
|
||||
} else if (player.pip) {
|
||||
$player.style.cssText = cacheStyle;
|
||||
removeClass($player, 'art-pip');
|
||||
setStyle($player, 'top', null);
|
||||
|
||||
@@ -4,6 +4,7 @@ export default function playMix(art, player) {
|
||||
const {
|
||||
i18n,
|
||||
notice,
|
||||
constructor: { instances },
|
||||
option: { mutex },
|
||||
template: { $video },
|
||||
} = art;
|
||||
@@ -12,7 +13,7 @@ export default function playMix(art, player) {
|
||||
set(value) {
|
||||
if (value) {
|
||||
const promise = $video.play();
|
||||
if (promise !== undefined) {
|
||||
if (promise.then) {
|
||||
promise.then().catch(err => {
|
||||
notice.show = err;
|
||||
throw err;
|
||||
@@ -20,7 +21,7 @@ export default function playMix(art, player) {
|
||||
}
|
||||
|
||||
if (mutex) {
|
||||
art.constructor.instances
|
||||
instances
|
||||
.filter(item => item !== art)
|
||||
.forEach(item => {
|
||||
item.player.pause = true;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { def } from '../utils';
|
||||
|
||||
export default function seekMix(art, player) {
|
||||
export default function playedMix(art, player) {
|
||||
def(player, 'played', {
|
||||
get: () => art.template.$video.currentTime / art.template.$video.duration,
|
||||
get: () => player.currentTime / player.duration,
|
||||
});
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { query, append, setStyle, setStyles, errorHandle, getExt, vttToBlob, srtToVtt, assToVtt } from '../utils';
|
||||
import { query, append, setStyle, setStyles, errorHandle, getExt } from '../utils';
|
||||
|
||||
export default function localSubtitle(art) {
|
||||
const {
|
||||
@@ -12,31 +12,9 @@ export default function localSubtitle(art) {
|
||||
if (file) {
|
||||
const type = getExt(file.name);
|
||||
if (['ass', 'vtt', 'srt'].includes(type)) {
|
||||
const reader = new FileReader();
|
||||
proxy(reader, 'load', event => {
|
||||
const text = event.target.result;
|
||||
switch (type) {
|
||||
case 'srt': {
|
||||
const url = vttToBlob(srtToVtt(text));
|
||||
subtitle.switch(url, file.name);
|
||||
break;
|
||||
}
|
||||
case 'ass': {
|
||||
const url = vttToBlob(assToVtt(text));
|
||||
subtitle.switch(url, file.name);
|
||||
break;
|
||||
}
|
||||
case 'vtt': {
|
||||
const url = vttToBlob(text);
|
||||
subtitle.switch(url, file.name);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
art.emit('localSubtitle', file);
|
||||
});
|
||||
reader.readAsText(file);
|
||||
const url = URL.createObjectURL(file);
|
||||
subtitle.switch(url, file.name, type);
|
||||
art.emit('localSubtitle', file);
|
||||
} else {
|
||||
errorHandle(false, 'Only supports subtitle files in .ass, .vtt and .srt format');
|
||||
}
|
||||
|
||||
@@ -43,9 +43,9 @@ export default class Subtitle extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
switch(url, name) {
|
||||
switch(url, name, ext) {
|
||||
const { i18n, notice } = this.art;
|
||||
return this.init(url).then(subUrl => {
|
||||
return this.init(url, ext).then(subUrl => {
|
||||
if (name) {
|
||||
notice.show = `${i18n.get('Switch subtitle')}: ${name}`;
|
||||
}
|
||||
@@ -54,7 +54,7 @@ export default class Subtitle extends Component {
|
||||
});
|
||||
}
|
||||
|
||||
init(url) {
|
||||
init(url, ext) {
|
||||
const {
|
||||
notice,
|
||||
template: { $subtitle, $track },
|
||||
@@ -66,7 +66,7 @@ export default class Subtitle extends Component {
|
||||
})
|
||||
.then(text => {
|
||||
this.art.emit('subtitle:load', url);
|
||||
switch (getExt(url)) {
|
||||
switch (ext || getExt(url)) {
|
||||
case 'srt':
|
||||
return vttToBlob(srtToVtt(text));
|
||||
case 'ass':
|
||||
|
||||
Reference in new issue
Block a user