mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-25 08:01:20 -08:00
添加ass格式字幕支持
This commit is contained in:
1 parent
1644a7530f
commit
2fbacf77a6
5 files changed
+131
-15
No files matched your search
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Support `vtt` and `srt` subtitles
|
- Support `vtt`, `ass` and `srt` subtitles
|
||||||
- Support video quality switching
|
- Support video quality switching
|
||||||
- Support for custom `control`, `layer`, `contextmenu`, `setting`
|
- Support for custom `control`, `layer`, `contextmenu`, `setting`
|
||||||
- Support `playback rate`, `aspect ratio`, `flip`, `window fullscreen` or `web fullscreen` adjustment
|
- Support `playback rate`, `aspect ratio`, `flip`, `window fullscreen` or `web fullscreen` adjustment
|
||||||
|
|||||||
@@ -2903,7 +2903,7 @@
|
|||||||
|
|
||||||
function version(menuOption) {
|
function version(menuOption) {
|
||||||
return _objectSpread$f({}, menuOption, {
|
return _objectSpread$f({}, menuOption, {
|
||||||
html: '<a href="https://artplayer.org" target="_blank">ArtPlayer 3.1.15</a>'
|
html: '<a href="https://artplayer.org" target="_blank">ArtPlayer 3.1.16</a>'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3087,7 +3087,7 @@
|
|||||||
key: "creatInfo",
|
key: "creatInfo",
|
||||||
value: function creatInfo() {
|
value: function creatInfo() {
|
||||||
var infoHtml = [];
|
var infoHtml = [];
|
||||||
infoHtml.push("\n <div class=\"art-info-item \">\n <div class=\"art-info-title\">Player version:</div>\n <div class=\"art-info-content\">3.1.15</div>\n </div>\n ");
|
infoHtml.push("\n <div class=\"art-info-item \">\n <div class=\"art-info-title\">Player version:</div>\n <div class=\"art-info-content\">3.1.16</div>\n </div>\n ");
|
||||||
infoHtml.push("\n <div class=\"art-info-item\">\n <div class=\"art-info-title\">Video url:</div>\n <div class=\"art-info-content\">".concat(this.art.option.url, "</div>\n </div>\n "));
|
infoHtml.push("\n <div class=\"art-info-item\">\n <div class=\"art-info-title\">Video url:</div>\n <div class=\"art-info-content\">".concat(this.art.option.url, "</div>\n </div>\n "));
|
||||||
infoHtml.push("\n <div class=\"art-info-item\">\n <div class=\"art-info-title\">Video volume:</div>\n <div class=\"art-info-content\" data-video=\"volume\"></div>\n </div>\n ");
|
infoHtml.push("\n <div class=\"art-info-item\">\n <div class=\"art-info-title\">Video volume:</div>\n <div class=\"art-info-content\" data-video=\"volume\"></div>\n </div>\n ");
|
||||||
infoHtml.push("\n <div class=\"art-info-item\">\n <div class=\"art-info-title\">Video time:</div>\n <div class=\"art-info-content\" data-video=\"currentTime\"></div>\n </div>\n ");
|
infoHtml.push("\n <div class=\"art-info-item\">\n <div class=\"art-info-title\">Video time:</div>\n <div class=\"art-info-content\" data-video=\"currentTime\"></div>\n </div>\n ");
|
||||||
@@ -3209,6 +3209,52 @@
|
|||||||
|
|
||||||
var slicedToArray = _slicedToArray;
|
var slicedToArray = _slicedToArray;
|
||||||
|
|
||||||
|
function assToVtt(ass) {
|
||||||
|
var reAss = new RegExp('Dialogue:\\s\\d,' + '(\\d+:\\d\\d:\\d\\d.\\d\\d),' + '(\\d+:\\d\\d:\\d\\d.\\d\\d),' + '([^,]*),' + '([^,]*),' + '(?:[^,]*,){4}' + '([\\s\\S]*)$', 'i');
|
||||||
|
|
||||||
|
function fixTime() {
|
||||||
|
var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
||||||
|
return time.split(/[:.]/).map(function (item, index, arr) {
|
||||||
|
if (index === arr.length - 1) {
|
||||||
|
if (item.length === 1) {
|
||||||
|
return ".".concat(item, "00");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.length === 2) {
|
||||||
|
return ".".concat(item, "0");
|
||||||
|
}
|
||||||
|
} else if (item.length === 1) {
|
||||||
|
return (index === 0 ? '0' : ':0') + item;
|
||||||
|
} // eslint-disable-next-line no-nested-ternary
|
||||||
|
|
||||||
|
|
||||||
|
return index === 0 ? item : index === arr.length - 1 ? ".".concat(item) : ":".concat(item);
|
||||||
|
}).join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
return "WEBVTT\n\n".concat(ass.split(/\r?\n/).map(function (line) {
|
||||||
|
var m = line.match(reAss);
|
||||||
|
if (!m) return null;
|
||||||
|
return {
|
||||||
|
start: fixTime(m[1].trim()),
|
||||||
|
end: fixTime(m[2].trim()),
|
||||||
|
text: m[5].replace(/{[\s\S]*?}/g, '').replace(/(\\N)/g, '\n').trim().split(/\r?\n/).map(function (item) {
|
||||||
|
return item.trim();
|
||||||
|
}).join('\n')
|
||||||
|
};
|
||||||
|
}).filter(function (line) {
|
||||||
|
return line;
|
||||||
|
}).map(function (line, index) {
|
||||||
|
if (line) {
|
||||||
|
return "".concat(index + 1, "\n").concat(line.start, " --> ").concat(line.end, "\n").concat(line.text);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}).filter(function (line) {
|
||||||
|
return line.trim();
|
||||||
|
}).join('\n\n'));
|
||||||
|
}
|
||||||
|
|
||||||
var Subtitle =
|
var Subtitle =
|
||||||
/*#__PURE__*/
|
/*#__PURE__*/
|
||||||
function () {
|
function () {
|
||||||
@@ -3286,13 +3332,18 @@
|
|||||||
key: "load",
|
key: "load",
|
||||||
value: function load(url) {
|
value: function load(url) {
|
||||||
var notice = this.art.notice;
|
var notice = this.art.notice;
|
||||||
var type;
|
|
||||||
return fetch(url).then(function (response) {
|
return fetch(url).then(function (response) {
|
||||||
type = response.headers.get('Content-Type');
|
|
||||||
return response.text();
|
return response.text();
|
||||||
}).then(function (text) {
|
}).then(function (text) {
|
||||||
if (/x-subrip/gi.test(type)) {
|
var type = getExt(url);
|
||||||
return vttToBlob(srtToVtt(text));
|
var formatText = text.replace(/{[\s\S]*?}/g, '');
|
||||||
|
|
||||||
|
if (type === 'srt') {
|
||||||
|
return vttToBlob(srtToVtt(formatText));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type === 'ass') {
|
||||||
|
return vttToBlob(assToVtt(formatText));
|
||||||
}
|
}
|
||||||
|
|
||||||
return url;
|
return url;
|
||||||
@@ -4463,7 +4514,7 @@
|
|||||||
_this.id = id;
|
_this.id = id;
|
||||||
Artplayer.instances.push(assertThisInitialized(_this)); // eslint-disable-next-line no-console
|
Artplayer.instances.push(assertThisInitialized(_this)); // eslint-disable-next-line no-console
|
||||||
|
|
||||||
console.log('%c ArtPlayer %c 3.1.15 %c https://artplayer.org', 'color: #fff; background: #5f5f5f', 'color: #fff; background: #4bc729', '');
|
console.log('%c ArtPlayer %c 3.1.16 %c https://artplayer.org', 'color: #fff; background: #5f5f5f', 'color: #fff; background: #4bc729', '');
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4480,7 +4531,7 @@
|
|||||||
}], [{
|
}], [{
|
||||||
key: "version",
|
key: "version",
|
||||||
get: function get() {
|
get: function get() {
|
||||||
return '3.1.15';
|
return '3.1.16';
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
key: "env",
|
key: "env",
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"artplayer.js","sources":["../../node_modules/@babel/runtime/helpers/classCallCheck.js","../../node_modules/@babel/runtime/helpers/createClass.js","../../node_modules/@babel/runtime/helpers/typeof.js","../../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../../node_modules/@babel/runtime/helpers/inherits.js","../../packages/artplayer/node_modules/option-validator/dist/option-validator.js","../../packages/artplayer/src/emitter.js","../../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js","../../node_modules/@babel/runtime/helpers/iterableToArray.js","../../node_modules/@babel/runtime/helpers/nonIterableSpread.js","../../node_modules/@babel/runtime/helpers/toConsumableArray.js","../../node_modules/@babel/runtime/helpers/isNativeFunction.js","../../node_modules/@babel/runtime/helpers/construct.js","../../node_modules/@babel/runtime/helpers/wrapNativeSuper.js","../../packages/artplayer/src/utils/ArtPlayerError.js","../../packages/artplayer/src/utils/index.js","../../packages/artplayer/src/scheme/index.js","../../packages/artplayer/src/config/mimeCodec.js","../../packages/artplayer/src/config/mse.js","../../packages/artplayer/src/config/video.js","../../packages/artplayer/src/config/index.js","../../packages/artplayer/src/whitelist.js","../../packages/artplayer/src/template.js","../../packages/artplayer/src/i18n/index.js","../../packages/artplayer/src/player/attachUrlMix.js","../../packages/artplayer/src/player/attrInit.js","../../packages/artplayer/src/player/eventInit.js","../../packages/artplayer/src/player/playMix.js","../../packages/artplayer/src/player/pauseMix.js","../../packages/artplayer/src/player/toggleMix.js","../../packages/artplayer/src/player/seekMix.js","../../packages/artplayer/src/player/volumeMix.js","../../packages/artplayer/src/player/currentTimeMix.js","../../packages/artplayer/src/player/durationMix.js","../../packages/artplayer/src/player/switchMix.js","../../packages/artplayer/src/player/playbackRateMix.js","../../packages/artplayer/src/player/aspectRatioMix.js","../../packages/artplayer/src/player/screenshotMix.js","../../packages/artplayer/node_modules/screenfull/dist/screenfull.js","../../packages/artplayer/src/player/fullscreenMix.js","../../packages/artplayer/src/player/fullscreenWebMix.js","../../packages/artplayer/src/player/pipMix.js","../../packages/artplayer/src/player/loadedMix.js","../../packages/artplayer/src/player/playedMix.js","../../packages/artplayer/src/player/playingMix.js","../../packages/artplayer/src/player/autoSizeMix.js","../../packages/artplayer/src/player/rectMix.js","../../packages/artplayer/src/player/flipMix.js","../../packages/artplayer/src/player/index.js","../../packages/artplayer/src/utils/component.js","../../node_modules/@babel/runtime/helpers/defineProperty.js","../../packages/artplayer/src/controls/fullscreen.js","../../packages/artplayer/src/controls/fullscreenWeb.js","../../packages/artplayer/src/controls/pip.js","../../packages/artplayer/src/controls/playAndPause.js","../../packages/artplayer/src/controls/progress.js","../../packages/artplayer/src/controls/subtitle.js","../../packages/artplayer/src/controls/time.js","../../packages/artplayer/src/controls/volume.js","../../packages/artplayer/src/controls/setting.js","../../packages/artplayer/src/controls/thumbnails.js","../../packages/artplayer/src/controls/screenshot.js","../../packages/artplayer/src/controls/quality.js","../../packages/artplayer/src/controls/index.js","../../packages/artplayer/src/contextmenu/playbackRate.js","../../packages/artplayer/src/contextmenu/aspectRatio.js","../../packages/artplayer/src/contextmenu/info.js","../../packages/artplayer/src/contextmenu/version.js","../../packages/artplayer/src/contextmenu/close.js","../../packages/artplayer/src/contextmenu/index.js","../../packages/artplayer/src/info.js","../../node_modules/@babel/runtime/helpers/arrayWithHoles.js","../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","../../node_modules/@babel/runtime/helpers/nonIterableRest.js","../../node_modules/@babel/runtime/helpers/slicedToArray.js","../../packages/artplayer/src/subtitle.js","../../packages/artplayer/src/events/clickInit.js","../../packages/artplayer/src/events/hoverInit.js","../../packages/artplayer/src/events/mousemoveInit.js","../../packages/artplayer/src/events/resizeInit.js","../../packages/artplayer/src/events/index.js","../../packages/artplayer/src/hotkey.js","../../packages/artplayer/src/layers.js","../../packages/artplayer/src/loading.js","../../packages/artplayer/src/notice.js","../../packages/artplayer/src/mask.js","../../packages/artplayer/src/icons/index.js","../../packages/artplayer/src/setting/flip.js","../../packages/artplayer/src/setting/aspectRatio.js","../../packages/artplayer/src/setting/playbackRaLine truncated
|
{"version":3,"file":"artplayer.js","sources":["../../node_modules/@babel/runtime/helpers/classCallCheck.js","../../node_modules/@babel/runtime/helpers/createClass.js","../../node_modules/@babel/runtime/helpers/typeof.js","../../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../../node_modules/@babel/runtime/helpers/inherits.js","../../packages/artplayer/node_modules/option-validator/dist/option-validator.js","../../packages/artplayer/src/emitter.js","../../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js","../../node_modules/@babel/runtime/helpers/iterableToArray.js","../../node_modules/@babel/runtime/helpers/nonIterableSpread.js","../../node_modules/@babel/runtime/helpers/toConsumableArray.js","../../node_modules/@babel/runtime/helpers/isNativeFunction.js","../../node_modules/@babel/runtime/helpers/construct.js","../../node_modules/@babel/runtime/helpers/wrapNativeSuper.js","../../packages/artplayer/src/utils/ArtPlayerError.js","../../packages/artplayer/src/utils/index.js","../../packages/artplayer/src/scheme/index.js","../../packages/artplayer/src/config/mimeCodec.js","../../packages/artplayer/src/config/mse.js","../../packages/artplayer/src/config/video.js","../../packages/artplayer/src/config/index.js","../../packages/artplayer/src/whitelist.js","../../packages/artplayer/src/template.js","../../packages/artplayer/src/i18n/index.js","../../packages/artplayer/src/player/attachUrlMix.js","../../packages/artplayer/src/player/attrInit.js","../../packages/artplayer/src/player/eventInit.js","../../packages/artplayer/src/player/playMix.js","../../packages/artplayer/src/player/pauseMix.js","../../packages/artplayer/src/player/toggleMix.js","../../packages/artplayer/src/player/seekMix.js","../../packages/artplayer/src/player/volumeMix.js","../../packages/artplayer/src/player/currentTimeMix.js","../../packages/artplayer/src/player/durationMix.js","../../packages/artplayer/src/player/switchMix.js","../../packages/artplayer/src/player/playbackRateMix.js","../../packages/artplayer/src/player/aspectRatioMix.js","../../packages/artplayer/src/player/screenshotMix.js","../../packages/artplayer/node_modules/screenfull/dist/screenfull.js","../../packages/artplayer/src/player/fullscreenMix.js","../../packages/artplayer/src/player/fullscreenWebMix.js","../../packages/artplayer/src/player/pipMix.js","../../packages/artplayer/src/player/loadedMix.js","../../packages/artplayer/src/player/playedMix.js","../../packages/artplayer/src/player/playingMix.js","../../packages/artplayer/src/player/autoSizeMix.js","../../packages/artplayer/src/player/rectMix.js","../../packages/artplayer/src/player/flipMix.js","../../packages/artplayer/src/player/index.js","../../packages/artplayer/src/utils/component.js","../../node_modules/@babel/runtime/helpers/defineProperty.js","../../packages/artplayer/src/controls/fullscreen.js","../../packages/artplayer/src/controls/fullscreenWeb.js","../../packages/artplayer/src/controls/pip.js","../../packages/artplayer/src/controls/playAndPause.js","../../packages/artplayer/src/controls/progress.js","../../packages/artplayer/src/controls/subtitle.js","../../packages/artplayer/src/controls/time.js","../../packages/artplayer/src/controls/volume.js","../../packages/artplayer/src/controls/setting.js","../../packages/artplayer/src/controls/thumbnails.js","../../packages/artplayer/src/controls/screenshot.js","../../packages/artplayer/src/controls/quality.js","../../packages/artplayer/src/controls/index.js","../../packages/artplayer/src/contextmenu/playbackRate.js","../../packages/artplayer/src/contextmenu/aspectRatio.js","../../packages/artplayer/src/contextmenu/info.js","../../packages/artplayer/src/contextmenu/version.js","../../packages/artplayer/src/contextmenu/close.js","../../packages/artplayer/src/contextmenu/index.js","../../packages/artplayer/src/info.js","../../node_modules/@babel/runtime/helpers/arrayWithHoles.js","../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","../../node_modules/@babel/runtime/helpers/nonIterableRest.js","../../node_modules/@babel/runtime/helpers/slicedToArray.js","../../packages/artplayer/src/utils/assToVtt.js","../../packages/artplayer/src/subtitle.js","../../packages/artplayer/src/events/clickInit.js","../../packages/artplayer/src/events/hoverInit.js","../../packages/artplayer/src/events/mousemoveInit.js","../../packages/artplayer/src/events/resizeInit.js","../../packages/artplayer/src/events/index.js","../../packages/artplayer/src/hotkey.js","../../packages/artplayer/src/layers.js","../../packages/artplayer/src/loading.js","../../packages/artplayer/src/notice.js","../../packages/artplayer/src/mask.js","../../packages/artplayer/src/icons/index.js","../../packages/artplayer/src/setting/flip.js","../../packages/artplayer/src/setting/aspectRatio.js"Line truncated
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import { setStyles, srtToVtt, vttToBlob } from './utils';
|
import { setStyles, srtToVtt, vttToBlob, getExt } from './utils';
|
||||||
|
import assToVtt from './utils/assToVtt';
|
||||||
|
|
||||||
export default class Subtitle {
|
export default class Subtitle {
|
||||||
constructor(art) {
|
constructor(art) {
|
||||||
@@ -60,15 +61,18 @@ export default class Subtitle {
|
|||||||
|
|
||||||
load(url) {
|
load(url) {
|
||||||
const { notice } = this.art;
|
const { notice } = this.art;
|
||||||
let type;
|
|
||||||
return fetch(url)
|
return fetch(url)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
type = response.headers.get('Content-Type');
|
|
||||||
return response.text();
|
return response.text();
|
||||||
})
|
})
|
||||||
.then(text => {
|
.then(text => {
|
||||||
if (/x-subrip/gi.test(type)) {
|
const type = getExt(url);
|
||||||
return vttToBlob(srtToVtt(text));
|
const formatText = text.replace(/{[\s\S]*?}/g, '');
|
||||||
|
if (type === 'srt') {
|
||||||
|
return vttToBlob(srtToVtt(formatText));
|
||||||
|
}
|
||||||
|
if (type === 'ass') {
|
||||||
|
return vttToBlob(assToVtt(formatText));
|
||||||
}
|
}
|
||||||
return url;
|
return url;
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
export default function assToVtt(ass) {
|
||||||
|
const reAss = new RegExp(
|
||||||
|
'Dialogue:\\s\\d,' +
|
||||||
|
'(\\d+:\\d\\d:\\d\\d.\\d\\d),' +
|
||||||
|
'(\\d+:\\d\\d:\\d\\d.\\d\\d),' +
|
||||||
|
'([^,]*),' +
|
||||||
|
'([^,]*),' +
|
||||||
|
'(?:[^,]*,){4}' +
|
||||||
|
'([\\s\\S]*)$',
|
||||||
|
'i',
|
||||||
|
);
|
||||||
|
|
||||||
|
function fixTime(time = '') {
|
||||||
|
return time
|
||||||
|
.split(/[:.]/)
|
||||||
|
.map((item, index, arr) => {
|
||||||
|
if (index === arr.length - 1) {
|
||||||
|
if (item.length === 1) {
|
||||||
|
return `.${item}00`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.length === 2) {
|
||||||
|
return `.${item}0`;
|
||||||
|
}
|
||||||
|
} else if (item.length === 1) {
|
||||||
|
return (index === 0 ? '0' : ':0') + item;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-nested-ternary
|
||||||
|
return index === 0 ? item : index === arr.length - 1 ? `.${item}` : `:${item}`;
|
||||||
|
})
|
||||||
|
.join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
return `WEBVTT\n\n${ass
|
||||||
|
.split(/\r?\n/)
|
||||||
|
.map(line => {
|
||||||
|
const m = line.match(reAss);
|
||||||
|
if (!m) return null;
|
||||||
|
return {
|
||||||
|
start: fixTime(m[1].trim()),
|
||||||
|
end: fixTime(m[2].trim()),
|
||||||
|
text: m[5]
|
||||||
|
.replace(/{[\s\S]*?}/g, '')
|
||||||
|
.replace(/(\\N)/g, '\n')
|
||||||
|
.trim()
|
||||||
|
.split(/\r?\n/)
|
||||||
|
.map(item => item.trim())
|
||||||
|
.join('\n'),
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.filter(line => line)
|
||||||
|
.map((line, index) => {
|
||||||
|
if (line) {
|
||||||
|
return `${index + 1}\n${line.start} --> ${line.end}\n${line.text}`;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
})
|
||||||
|
.filter(line => line.trim())
|
||||||
|
.join('\n\n')}`;
|
||||||
|
}
|
||||||
Reference in new issue
Block a user