fix: subtitles
This commit is contained in:
@@ -97,9 +97,13 @@ class YouTubeCaptionProvider {
|
|||||||
#findCaptionTrack(ytPlayer) {
|
#findCaptionTrack(ytPlayer) {
|
||||||
const captionTracks =
|
const captionTracks =
|
||||||
ytPlayer?.captions?.playerCaptionsTracklistRenderer?.captionTracks || [];
|
ytPlayer?.captions?.playerCaptionsTracklistRenderer?.captionTracks || [];
|
||||||
let captionTrack = captionTracks.find((item) => item.vssId === ".en");
|
let captionTrack = captionTracks.find((item) =>
|
||||||
|
item.vssId?.startsWith(".en")
|
||||||
|
);
|
||||||
if (!captionTrack) {
|
if (!captionTrack) {
|
||||||
captionTrack = captionTracks.find((item) => item.vssId === "a.en");
|
captionTrack = captionTracks.find((item) =>
|
||||||
|
item.vssId?.startsWith("a.en")
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return captionTrack;
|
return captionTrack;
|
||||||
}
|
}
|
||||||
@@ -107,7 +111,7 @@ class YouTubeCaptionProvider {
|
|||||||
async #getSubtitleEvents(captionTrack, potUrl, responseText) {
|
async #getSubtitleEvents(captionTrack, potUrl, responseText) {
|
||||||
if (potUrl.searchParams.get("lang") === captionTrack.languageCode) {
|
if (potUrl.searchParams.get("lang") === captionTrack.languageCode) {
|
||||||
try {
|
try {
|
||||||
return JSON.parse(responseText)?.events;
|
return JSON.parse(responseText);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error("parse responseText", err);
|
logger.error("parse responseText", err);
|
||||||
return null;
|
return null;
|
||||||
@@ -126,8 +130,7 @@ class YouTubeCaptionProvider {
|
|||||||
|
|
||||||
const res = await fetch(baseUrl);
|
const res = await fetch(baseUrl);
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
const json = await res.json();
|
return res.json();
|
||||||
return json?.events;
|
|
||||||
}
|
}
|
||||||
logger.error(
|
logger.error(
|
||||||
`Youtube Provider: Failed to fetch subtitles: ${res.status}`
|
`Youtube Provider: Failed to fetch subtitles: ${res.status}`
|
||||||
@@ -170,14 +173,20 @@ class YouTubeCaptionProvider {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.#onCaptionsReady(videoId, subtitleEvents);
|
const subtitles = this.#formatSubtitles(subtitleEvents);
|
||||||
|
if (subtitles.length === 0) {
|
||||||
|
logger.warn("Youtube Provider: No subtitles after format.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.#onCaptionsReady(videoId, subtitles);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error("Youtube Provider: unknow error", error);
|
logger.error("Youtube Provider: unknow error", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#onCaptionsReady(videoId, subtitleEvents) {
|
#onCaptionsReady(videoId, subtitles) {
|
||||||
this.#subtitles = this.#formatSubtitles(subtitleEvents);
|
this.#subtitles = subtitles;
|
||||||
this.#videoId = videoId;
|
this.#videoId = videoId;
|
||||||
|
|
||||||
this.#destroyManager();
|
this.#destroyManager();
|
||||||
@@ -231,7 +240,8 @@ class YouTubeCaptionProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// todo: 没有标点断句的处理
|
// todo: 没有标点断句的处理
|
||||||
#formatSubtitles(events) {
|
#formatSubtitles(data) {
|
||||||
|
const events = data?.events;
|
||||||
if (!Array.isArray(events)) return [];
|
if (!Array.isArray(events)) return [];
|
||||||
|
|
||||||
const lines = [];
|
const lines = [];
|
||||||
@@ -263,7 +273,9 @@ class YouTubeCaptionProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const isEndOfSentence = /[.?!\]]$/.test(trimmedText);
|
const isEndOfSentence = /[.?!\]]$/.test(trimmedText);
|
||||||
if (currentLine && trimmedText && isEndOfSentence) {
|
const isEnoughLong =
|
||||||
|
(currentLine?.text.length ?? 0) > 50 && /[,]\s*$/.test(trimmedText);
|
||||||
|
if (currentLine && trimmedText && (isEndOfSentence || isEnoughLong)) {
|
||||||
const isLastSegmentInEvent =
|
const isLastSegmentInEvent =
|
||||||
segIndex === (event.segs?.length ?? 0) - 1;
|
segIndex === (event.segs?.length ?? 0) - 1;
|
||||||
if (isLastSegmentInEvent && event.dDurationMs) {
|
if (isLastSegmentInEvent && event.dDurationMs) {
|
||||||
|
|||||||
Reference in New Issue
Block a user