From 11a0d390641f098496ea9f2dce1a673b0fb8fbd9 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 17 Sep 2024 20:27:11 +0900 Subject: [PATCH] fix(song-info-front): fix nullable issue --- src/providers/song-info-front.ts | 27 +++++++++++++-------- src/types/player-api-events.ts | 7 ++++++ src/types/youtube-music-desktop-internal.ts | 13 ++-------- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/providers/song-info-front.ts b/src/providers/song-info-front.ts index 63149d4e..0d8704c3 100644 --- a/src/providers/song-info-front.ts +++ b/src/providers/song-info-front.ts @@ -2,7 +2,7 @@ import { singleton } from './decorators'; import type { YoutubePlayer } from '@/types/youtube-player'; import type { GetState } from '@/types/datahost-get-state'; -import type { AlbumDetails, VideoDataChangeValue } from '@/types/player-api-events'; +import type { AlbumDetails, PlayerOverlays, VideoDataChangeValue } from '@/types/player-api-events'; import type { SongInfo } from './song-info'; import type { VideoDataChanged } from '@/types/video-data-changed'; @@ -208,28 +208,35 @@ export default (api: YoutubePlayer) => { list: playlistId } = api.getVideoData(); - const { playerOverlays } = api.getWatchNextResponse(); + const watchNextResponse = api.getWatchNextResponse(); - sendSongInfo({ + sendSongInfo({ title, author, videoId, playlistId, isUpcoming: false, lengthSeconds: video.duration, loading: true, - uhhh: { playerOverlays } - }); + ytmdWatchNextResponse: watchNextResponse, + } satisfies VideoDataChangeValue); } } function sendSongInfo(videoData: VideoDataChangeValue) { const data = api.getPlayerResponse(); - data.videoDetails.album = ( - Object.entries(videoData).find( - ([, value]) => value && Object.hasOwn(value, 'playerOverlays'), - ) as [string, AlbumDetails | undefined] - )?.[1]?.playerOverlays?.playerOverlayRenderer?.browserMediaSession?.browserMediaSessionRenderer?.album?.runs?.at( + let playerOverlay: PlayerOverlays | undefined; + + if (!videoData.ytmdWatchNextResponse) { + playerOverlay = ( + Object.entries(videoData).find( + ([, value]) => value && Object.hasOwn(value, 'playerOverlays'), + ) as [string, AlbumDetails | undefined] + )?.[1]?.playerOverlays; + } else { + playerOverlay = videoData.ytmdWatchNextResponse?.playerOverlays; + } + data.videoDetails.album = playerOverlay?.playerOverlayRenderer?.browserMediaSession?.browserMediaSessionRenderer?.album?.runs?.at( 0, )?.text; data.videoDetails.elapsedSeconds = 0; diff --git a/src/types/player-api-events.ts b/src/types/player-api-events.ts index e47d2e13..429afd08 100644 --- a/src/types/player-api-events.ts +++ b/src/types/player-api-events.ts @@ -1,3 +1,5 @@ +import type { WatchNextResponse } from '@/types/youtube-music-desktop-internal'; + export interface AlbumDetails { responseContext: ResponseContext; contents: Contents; @@ -252,6 +254,11 @@ export type VideoDataChangeValue = Record & { loading: boolean; lengthSeconds: number; + + /** + * YouTube Music Desktop internal variable (for album data) + **/ + ytmdWatchNextResponse?: WatchNextResponse; }; export interface PlayerAPIEvents { diff --git a/src/types/youtube-music-desktop-internal.ts b/src/types/youtube-music-desktop-internal.ts index 68e5fd3c..c46093b0 100644 --- a/src/types/youtube-music-desktop-internal.ts +++ b/src/types/youtube-music-desktop-internal.ts @@ -1,4 +1,5 @@ import type { QueueItem } from '@/types/datahost-get-state'; +import type { PlayerOverlays } from '@/types/player-api-events'; export interface QueueResponse { items?: QueueItem[]; @@ -7,15 +8,5 @@ export interface QueueResponse { } export interface WatchNextResponse { - playerOverlays: { - playerOverlayRenderer: { - browserMediaSession: { - browserMediaSessionRenderer: { - album: { - runs: { text: string; }[] - } - } - } - } - }; + playerOverlays?: PlayerOverlays; }