diff --git a/common/src/main/java/dev/lavalink/youtube/clients/TvHtml5Kids.java b/common/src/main/java/dev/lavalink/youtube/clients/TvHtml5Kids.java new file mode 100644 index 00000000..4b6a255b --- /dev/null +++ b/common/src/main/java/dev/lavalink/youtube/clients/TvHtml5Kids.java @@ -0,0 +1,102 @@ +package dev.lavalink.youtube.clients; + +import com.sedmelluq.discord.lavaplayer.tools.ExceptionTools; +import com.sedmelluq.discord.lavaplayer.tools.io.HttpInterface; +import dev.lavalink.youtube.YoutubeAudioSourceManager; +import dev.lavalink.youtube.clients.skeleton.StreamingNonMusicClient; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.util.EntityUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Map; + +public class TvHtml5Kids extends StreamingNonMusicClient { + private static final Logger log = LoggerFactory.getLogger(TvHtml5Kids.class); + + public static ClientConfig BASE_CONFIG = new ClientConfig() + .withClientName("TVHTML5_KIDS") + .withUserAgent("Mozilla/5.0 (ChromiumStylePlatform) Cobalt/25.lts.30.1034943-gold (unlike Gecko), Unknown_TV_Unknown_0/Unknown (Unknown, Unknown)") + .withClientField("clientVersion", "3.20220918"); + + public static String poToken; + + protected ClientOptions options; + + public TvHtml5Kids() { + this(ClientOptions.DEFAULT); + } + + public TvHtml5Kids(@NotNull ClientOptions options) { + this.options = options; + } + + public static void setPoTokenAndVisitorData(String poToken, String visitorData) { + TvHtml5Kids.poToken = poToken; + + if (poToken == null || visitorData == null) { + BASE_CONFIG.getRoot().remove("serviceIntegrityDimensions"); + BASE_CONFIG.withVisitorData(null); + return; + } + + Map sid = BASE_CONFIG.putOnceAndJoin(BASE_CONFIG.getRoot(), "serviceIntegrityDimensions"); + sid.put("poToken", poToken); + BASE_CONFIG.withVisitorData(visitorData); + } + + @Override + @NotNull + protected ClientConfig getBaseClientConfig(@NotNull HttpInterface httpInterface) { + return BASE_CONFIG.copy(); + } + + @Override + @NotNull + public URI transformPlaybackUri(@NotNull URI originalUri, @NotNull URI resolvedPlaybackUri) { + if (poToken == null) { + return resolvedPlaybackUri; + } + + log.debug("Applying 'pot' parameter on playback URI: {}", resolvedPlaybackUri); + URIBuilder builder = new URIBuilder(resolvedPlaybackUri); + builder.addParameter("pot", poToken); + + try { + return builder.build(); + } catch (URISyntaxException e) { + log.debug("Failed to apply 'pot' parameter.", e); + return resolvedPlaybackUri; + } + } + + @Override + @NotNull + public String getPlayerParams() { + return WEB_PLAYER_PARAMS; + } + + @Override + @NotNull + public ClientOptions getOptions() { + return this.options; + } + + @Override + public boolean supportsOAuth() { + return true; + } + + @Override + @NotNull + public String getIdentifier() { + return BASE_CONFIG.getName(); + } +} diff --git a/plugin/src/main/java/dev/lavalink/youtube/plugin/ClientProviderV3.java b/plugin/src/main/java/dev/lavalink/youtube/plugin/ClientProviderV3.java index 2a9d7853..403f352c 100644 --- a/plugin/src/main/java/dev/lavalink/youtube/plugin/ClientProviderV3.java +++ b/plugin/src/main/java/dev/lavalink/youtube/plugin/ClientProviderV3.java @@ -17,6 +17,7 @@ private enum ClientMapping implements ClientReference { MUSIC(Music::new), TV(Tv::new), TVHTML5EMBEDDED(TvHtml5Embedded::new), + TVHTML5_KIDS(TvHtml5Kids::new), WEB(Web::new), WEBEMBEDDED(WebEmbedded::new), MWEB(MWeb::new); diff --git a/plugin/src/main/java/dev/lavalink/youtube/plugin/ClientProviderV4.java b/plugin/src/main/java/dev/lavalink/youtube/plugin/ClientProviderV4.java index 5c44f2dd..091360fe 100644 --- a/plugin/src/main/java/dev/lavalink/youtube/plugin/ClientProviderV4.java +++ b/plugin/src/main/java/dev/lavalink/youtube/plugin/ClientProviderV4.java @@ -17,6 +17,7 @@ private enum ClientMapping implements ClientReference { MUSIC(MusicWithThumbnail::new), TV(Tv::new), // This has no WithThumbnail companion as it's a playback-only client. TVHTML5EMBEDDED(TvHtml5EmbeddedWithThumbnail::new), + TVHTML5_KIDS(TvHtml5Kids::new), WEB(WebWithThumbnail::new), WEBEMBEDDED(WebEmbeddedWithThumbnail::new), MWEB(MWebWithThumbnail::new);