From 58ed44bd7ab2271d744eb027c74f0a97e7200079 Mon Sep 17 00:00:00 2001 From: teststation5 Date: Tue, 2 Jun 2026 14:24:12 -0600 Subject: [PATCH] fix YouTube Music search: add fallback videoId extraction paths YouTube removed the videoId from playlistItemData in music search results, breaking all music_songs searches with "Could not get URL". Added two fallback paths verified against current YouTube Music response format: - overlay.musicItemThumbnailOverlayRenderer play button watchEndpoint - flexColumns[0] song title navigationEndpoint The original playlistItemData path is retained for backward compatibility. --- ...tubeMusicSongOrVideoInfoItemExtractor.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeMusicSongOrVideoInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeMusicSongOrVideoInfoItemExtractor.java index 11b220288c..73c7e9385a 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeMusicSongOrVideoInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeMusicSongOrVideoInfoItemExtractor.java @@ -37,10 +37,37 @@ public YoutubeMusicSongOrVideoInfoItemExtractor(final JsonObject songOrVideoInfo @Override public String getUrl() throws ParsingException { + // Primary: playlistItemData.videoId (legacy, may be absent) final String id = songOrVideoInfoItem.getObject("playlistItemData").getString("videoId"); if (!isNullOrEmpty(id)) { return "https://music.youtube.com/watch?v=" + id; } + + // Fallback: overlay play button watchEndpoint + final String overlayId = songOrVideoInfoItem.getObject("overlay") + .getObject("musicItemThumbnailOverlayRenderer") + .getObject("content") + .getObject("musicPlayButtonRenderer") + .getObject("playNavigationEndpoint") + .getObject("watchEndpoint") + .getString("videoId"); + if (!isNullOrEmpty(overlayId)) { + return "https://music.youtube.com/watch?v=" + overlayId; + } + + // Fallback: song title navigationEndpoint + final String flexUrl = getUrlFromNavigationEndpoint( + songOrVideoInfoItem.getArray("flexColumns") + .getObject(0) + .getObject("musicResponsiveListItemFlexColumnRenderer") + .getObject("text") + .getArray("runs") + .getObject(0) + .getObject("navigationEndpoint")); + if (!isNullOrEmpty(flexUrl)) { + return flexUrl; + } + throw new ParsingException("Could not get URL"); }