package Ġme . me li jn . me lij nb ot . internals . utils Ċ Ċ import Ġcom . sed mell uq . discord . lav ap layer . tools . Friendly Exception Ċ import Ġcom . sed mell uq . discord . lav ap layer . track . Audio Track Ċ import Ġcom . sed mell uq . discord . lav ap layer . track . Basic Audio Playlist Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . as Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . launch Ċ import Ġme . me li jn . ll k lient . io . L aval ink RestClient Ċ import Ġme . me li jn . ll k lient . utils . L aval ink Util Ċ import Ġme . me li jn . me lij nb ot . Container Ċ import Ġme . me li jn . me lij nb ot . enums . Search Type Ċ import Ġme . me li jn . me lij nb ot . internals . music . Sus pending Audio Load Result Handler Ċ import Ġnet . dv 8 tion . j da . api . utils . data . DataObject Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ Ċ val ĠURL _ PATTERN Ġ= ĊĠĠĠ ĠRegex ("^ https ? :// (?: \\ S + (? :: \\ S *) ? @ )? (?: (? ! 1 0 (?: \\. \\ d { 1 , 3 } ){ 3 }) (? ! 1 2 7 (?: \\. \\ d { 1 , 3 } ){ 3 }) (? ! 1 6 9 \\. 2 5 4 (?: \\. \\ d { 1 , 3 } ){ 2 }) (? ! 1 9 2 \\. 1 6 8 (?: \\. \\ d { 1 , 3 } ){ 2 }) (? ! 1 7 2 \\ .( ?: 1 [ 6 - 9 ]| 2 \\ d | 3 [ 0 - 1 ]) (?: \\. \\ d { 1 , 3 } ){ 2 }) (?: [ 1 - 9 ]\\ d ?| 1 \\ d \\ d | 2 [ 0 1 ]\\ d | 2 2 [ 0 - 3 ]) (?: \\ .( ?: 1 ? \\ d { 1 , 2 }| 2 [ 0 - 4 ]\\ d | 2 5 [ 0 - 5 ])) { 2 }( ?: \\ .( ?: [ 1 - 9 ]\\ d ?| 1 \\ d \\ d | 2 [ 0 - 4 ]\\ d | 2 5 [ 0 - 4 ])) |( ?: (?: [ a - z \\ x { 0 0 a 1 }- \\ x { ffff } 0 - 9 ]+ - ? )* [ a - z \\ x { 0 0 a 1 }- \\ x { ffff } 0 - 9 ]+ )( ?: \\ .( ?: [ a - z \\ x { 0 0 a 1 }- \\ x { ffff } 0 - 9 ]+ - ? )* [ a - z \\ x { 0 0 a 1 }- \\ x { ffff } 0 - 9 ]+ )* (?: \\ .( ?: [ a - z \\ x { 0 0 a 1 }- \\ x { ffff } ]{ 2 , })) )( ? :: \\ d { 2 , 5 }) ?( ?: / [^ \\ s ]*) ?$ ") Ċ Ċ private Ġconst Ġval ĠPROTO COL _ REGEX Ġ= Ġ" https ? ://" Ċ private Ġconst Ġval ĠDO MAIN _ REGEX Ġ= Ġ"( ?: www \\ .| m \\ .| music \\ .| ) youtube \\. com " Ċ private Ġconst Ġval ĠSH ORT _ DOMAIN _ REGEX Ġ= Ġ"( ?: www \\ .| ) youtu \\. be " Ċ val Ġy t 1 Ġ= ĠRegex ("^ ${ PROTOCOL _ REGEX }${ DOMAIN _ REGEX }/ .* ", ĠRegex Option . IGNORE _ CASE ) Ċ val Ġy t 2 Ġ= ĠRegex ("^ ${ PROTOCOL _ REGEX }${ SHORT _ DOMAIN _ REGEX }/ .* ", ĠRegex Option . IGNORE _ CASE ) Ċ Ċ class ĠY T Search Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġis Unknown HTTP ( query : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( URL _ PATTERN . matches ( query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ!( query . startsWith (" https :// twitch . tv /", Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy t 1 . matches ( query ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy t 2 . matches ( query ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery . startsWith (" https :// sound cloud . com /", Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery . startsWith (" https :// v imeo . com /", Ġtrue ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery . startsWith (" https :// get yarn . io /", Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġyoutube Service : ĠExecutor Service Ġ= ĊĠĠĠĠĠĠĠ ĠExec utors . new Cached ThreadPool Ġ{ Ġr : ĠRunnable Ġ-> ĠThread ( r , Ġ" Y outube - Search - Thread ") Ġ} ĊĠĠĠ Ġprivate Ġval Ġyoutube Scope Ġ= ĠCor outine Scope ( youtube Service . as Coroutine Dispatcher ()) ĊĊĠĠĠ Ġfun Ġsearch ( ĊĠĠĠĠĠĠĠ Ġquery : ĠString , Ġsearch Type : ĠSearch Type , ĊĠĠĠĠĠĠĠ Ġaudio Track CallBack : Ġsuspend Ġ( audio Track : ĠList < Audio Track >) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġll Disabled And Not YT : Ġsuspend Ġ() Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġlp Callback : ĠS us pending Audio Load Result Handler ĊĠĠĠ Ġ) Ġ= Ġyoutube Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Manager Ġ= ĠContainer . instance . l ava Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Manager . l aval ink Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Link Ġ= Ġl Manager . j da L ava Link ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Client Ġ= Ġl Link ?. load Balancer ?. getRandom Socket (" normal ") ?. rest Client ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtracks Ġ= Ġwhen Ġ( search Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Type . SC Ġ-> Ġrest Client ?. get Sound Cloud SearchResult ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Type . YT Ġ-> Ġrest Client ?. getY outube SearchResult ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Container . instance . settings . l aval ink . enabled _ http _ nodes Ġ&& Ġis Unknown HTTP ( query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhttp RestClient Ġ= Ġl Link ?. load Balancer ?. getRandom Socket (" http ") ?. rest Client ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttp RestClient ?. load Item ( query , Ġlp Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrest Client ?. load Item ( query , Ġlp Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracks Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track CallBack ( tracks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġll Disabled And Not YT () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Callback ( lp Callback ). invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Object . empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" load Type ", Ġ" LOAD _ FAILED ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" exception ", ĠData Object . empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" message ", Ġ" unknown ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" severity ", ĠFriend ly Exception . Severity . SUS PIC IOUS . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun ĠL aval ink RestClient . load Item ( query : ĠString , Ġlp Callback : ĠS us pending Audio Load Result Handler ) Ġ{ ĊĠĠĠ Ġconsume Callback ( lp Callback ). invoke ( load ( query )) Ċ } Ċ Ċ suspend Ġfun Ġconsume Callback ( callback : ĠS us pending Audio Load Result Handler ): Ġsuspend Ġ( DataObject ?) Ġ-> ĠUnit Ġ{ ĊĠĠĠ Ġreturn Ġlabel @{ Ġload Result : ĠData Object ? Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( load Result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . no Matches () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ label ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġload Type Ġ= Ġload Result . getString (" load Type ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TRACK _ LOADED " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrack Data Single Ġ= Ġload Result . get Array (" tracks ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrack Object Ġ= Ġtrack Data Single . getObject ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsingle Track Base 6 4 Ġ= Ġtrack Object . getString (" track ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsingle Audio Track Ġ= ĠL aval ink Util . to Audio Track ( single Track Base 6 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . track Loaded ( single Audio Track ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" PLAY LIST _ LOADED " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrack Data Ġ= Ġload Result . get Array (" tracks ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtracks : ĠMutable List < Audio Track > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġtrack Data . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrack Ġ= Ġtrack Data . getObject ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrack Base 6 4 Ġ= Ġtrack . getString (" track ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Track Ġ= ĠL aval ink Util . to Audio Track ( track Base 6 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracks . add ( audio Track ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplaylist Info Ġ= Ġload Result . getObject (" playlist Info ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Track Id Ġ= Ġplaylist Info . getInt (" selected Track ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Track : ĠAudio Track Ġ= Ġif Ġ( selected Track Id Ġ< Ġtracks . size Ġ&& Ġselected Track Id Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracks [ selected Track Id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracks . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . load Failed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFriend ly Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Playlist Ġis Ġempty ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFriend ly Exception . Severity . SUS PIC IOUS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIllegalStateException (" Empty Ġplaylist ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracks [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplaylist Name Ġ= Ġplaylist Info . getString (" name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplaylist Ġ= ĠBasic Audio Playlist ( playlist Name , Ġtracks , Ġselected Track , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . playlist Loaded ( playlist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" NO _ MATCH ES " Ġ-> Ġcallback . no Matches () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" LOAD _ FAILED " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġload Result . getObject (" exception ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġexception . getString (" message ", Ġ" unknown ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseverity Ġ= ĠFriend ly Exception . Severity . valueOf ( exception . getString (" severity ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfriendly Exception Ġ= ĠFriend ly Exception ( message , Ġseverity , ĠThrowable ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . load Failed ( friendly Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġload Type : Ġ$ load Type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . load Failed ( Friendly Exception ( ex . message , ĠFriend ly Exception . Severity . FAULT , Ġex )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }