Skip to content

Commit 747bde2

Browse files
committed
fix(synced-lyrics): fix lyric load
fix #2295
1 parent eabc28b commit 747bde2

File tree

3 files changed

+16
-15
lines changed

3 files changed

+16
-15
lines changed

src/plugins/synced-lyrics/renderer/index.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { createRenderer } from '@/utils';
2+
import { waitForElement } from '@/utils/wait-for-element';
23

34
import { makeLyricsRequest } from './lyrics';
45
import { selectors, tabStates } from './utils';
@@ -15,10 +16,9 @@ export let _ytAPI: YoutubePlayer | null = null;
1516

1617
export const renderer = createRenderer<{
1718
observerCallback: MutationCallback;
18-
onPlayerApiReady: (api: YoutubePlayer) => void;
1919
hasAddedEvents: boolean;
2020
observer?: MutationObserver;
21-
videoDataChange: () => void;
21+
videoDataChange: () => Promise<void>;
2222
progressCallback: (evt: Event) => void;
2323
}, SyncedLyricsPluginConfig>({
2424
onConfigChange(newConfig) {
@@ -42,17 +42,17 @@ export const renderer = createRenderer<{
4242
}
4343
},
4444

45-
onPlayerApiReady(api: YoutubePlayer) {
45+
async onPlayerApiReady(api: YoutubePlayer) {
4646
_ytAPI = api;
4747

4848
api.addEventListener('videodatachange', this.videoDataChange);
4949

50-
this.videoDataChange();
50+
await this.videoDataChange();
5151
},
5252

5353
hasAddedEvents: false,
5454

55-
videoDataChange() {
55+
async videoDataChange() {
5656
if (!this.hasAddedEvents) {
5757
const video = document.querySelector('video');
5858

@@ -61,15 +61,14 @@ export const renderer = createRenderer<{
6161
if (video) this.hasAddedEvents = true;
6262
}
6363

64-
const header = document.querySelector<HTMLElement>(selectors.head);
65-
if (!header) return;
66-
6764
this.observer ??= new MutationObserver(
6865
this.observerCallback,
6966
);
7067

7168
// Force the lyrics tab to be enabled at all times.
7269
this.observer.disconnect();
70+
71+
const header = await waitForElement<HTMLElement>(selectors.head);
7372
this.observer.observe(header, { attributes: true });
7473
header.removeAttribute('disabled');
7574
},

src/plugins/synced-lyrics/renderer/utils.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { render } from 'solid-js/web';
22

3+
import { waitForElement } from '@/utils/wait-for-element';
4+
35
import { LyricsRenderer, setIsVisible, setPlayerState } from './renderer';
46

57
import type { VideoDetails } from '@/types/video-details';
@@ -13,18 +15,17 @@ export const selectors = {
1315
};
1416

1517
export const tabStates = {
16-
true: (data?: VideoDetails) => {
18+
true: async (data?: VideoDetails) => {
1719
setIsVisible(true);
1820
setPlayerState(data ?? null);
1921

20-
const tabRenderer = document.querySelector<HTMLElement>(
21-
selectors.body.tabRenderer,
22-
);
23-
if (!tabRenderer) return;
24-
2522
let container = document.querySelector('#synced-lyrics-container');
2623
if (container) return;
2724

25+
const tabRenderer = await waitForElement<HTMLElement>(
26+
selectors.body.tabRenderer,
27+
);
28+
2829
container = Object.assign(document.createElement('div'), {
2930
id: 'synced-lyrics-container',
3031
});

src/types/player-api-events.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,8 @@ export interface FlagEndpoint {
241241
flagAction: string;
242242
}
243243

244-
export type VideoDataChangeValue = {
244+
// see song-info-front.ts
245+
export type VideoDataChangeValue = Record<string, unknown> & {
245246
videoId: string;
246247
title: string;
247248
author: string;

0 commit comments

Comments
 (0)