1717package com .dunctebot .sourcemanagers .extra ;
1818
1919import com .sedmelluq .discord .lavaplayer .source .youtube .YoutubeHttpContextFilter ;
20+ import com .sedmelluq .discord .lavaplayer .tools .DataFormatTools ;
21+ import com .sedmelluq .discord .lavaplayer .tools .JsonBrowser ;
22+ import com .sedmelluq .discord .lavaplayer .tools .io .HttpInterface ;
2023import io .sentry .Sentry ;
24+ import org .apache .commons .io .IOUtils ;
25+ import org .apache .http .client .methods .CloseableHttpResponse ;
26+ import org .apache .http .client .methods .HttpGet ;
2127import org .apache .http .client .methods .HttpUriRequest ;
2228import org .apache .http .client .protocol .HttpClientContext ;
2329
2430import java .io .Closeable ;
2531import java .io .IOException ;
32+ import java .nio .charset .StandardCharsets ;
2633import java .util .concurrent .Executors ;
2734import java .util .concurrent .ScheduledExecutorService ;
2835import java .util .concurrent .TimeUnit ;
2936
30- import static com .dunctebot .sourcemanagers .extra .YoutubeUtils .getYoutubeHeaderDetails ;
31-
3237public class YoutubeContextFilterOverride extends YoutubeHttpContextFilter implements Closeable {
3338 private YoutubeVersionData youtubeVersionData = null ;
39+ private final HttpInterface httpInterface ;
3440 private final ScheduledExecutorService dataUpdateThread = Executors .newSingleThreadScheduledExecutor ((r ) -> {
3541 final Thread t = new Thread ();
3642 t .setName ("YouTube-data-updater" );
3743 t .setDaemon (true );
3844 return t ;
3945 });
4046
41- public YoutubeContextFilterOverride () {
42- this (true );
47+ public YoutubeContextFilterOverride (HttpInterface httpInterface ) {
48+ this (true , httpInterface );
4349 }
4450
45- public YoutubeContextFilterOverride (boolean shouldUpdate ) {
51+ public YoutubeContextFilterOverride (boolean shouldUpdate , HttpInterface httpInterface ) {
52+ this .httpInterface = httpInterface ;
53+
4654 if (shouldUpdate ) {
4755 dataUpdateThread .scheduleAtFixedRate (this ::updateYoutubeData , 0L , 1L , TimeUnit .DAYS );
4856 }
@@ -56,6 +64,22 @@ private void updateYoutubeData() {
5664 }
5765 }
5866
67+ private YoutubeVersionData getYoutubeHeaderDetails () throws IOException {
68+ final HttpGet httpGet = new HttpGet ("https://www.youtube.com/" );
69+ httpGet .setHeader ("User-Agent" , "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" );
70+
71+ try (final CloseableHttpResponse response = this .httpInterface .execute (httpGet )) {
72+ final String html = IOUtils .toString (response .getEntity ().getContent (), StandardCharsets .UTF_8 );
73+
74+ final String extracted = DataFormatTools .extractBetween (html ,
75+ "window.ytplayer = {};ytcfg.set(" ,
76+ ");ytcfg.set(" );
77+ final JsonBrowser json = JsonBrowser .parse (extracted );
78+
79+ return YoutubeVersionData .fromBrowser (json );
80+ }
81+ }
82+
5983 @ Override
6084 public void onRequest (HttpClientContext context , HttpUriRequest request , boolean isRepetition ) {
6185 super .onRequest (context , request , isRepetition );
@@ -71,7 +95,7 @@ public void onRequest(HttpClientContext context, HttpUriRequest request, boolean
7195 }
7296
7397 @ Override
74- public void close () throws IOException {
98+ public void close () {
7599 dataUpdateThread .shutdown ();
76100 }
77101}
0 commit comments