#!/ usr / bin / env Ġkotlin Ċ @ file : Dep ends On (" com . squareup . okhttp 3 : okhttp : 4 . 9 . 3 ") Ċ @ file : Dep ends On (" com . squareup . okhttp 3 : logging - interceptor : 4 . 9 . 3 ") Ċ @ file : Dep ends On (" com . squareup . mos hi : mos hi : 1 . 8 . 0 ") Ċ @ file : Dep ends On (" com . github . aj alt : cli kt : 2 . 6 . 0 ") Ċ @ file : Dep ends On (" org . nano httpd : nano httpd : 2 . 2 . 0 ") Ċ @ file : Dep ends On (" com . univ oc ity : univ oc ity - parsers : 2 . 8 . 4 ") Ċ Ċ import Ġcom . github . aj alt . cli kt . core . Cli kt Command Ċ import Ġcom . github . aj alt . cli kt . core . sub commands Ċ import Ġcom . github . aj alt . cli kt . parameters . options . option Ċ import Ġcom . github . aj alt . cli kt . parameters . options . required Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġcom . univ oc ity . parsers . csv . Csv Parser Ċ import Ġcom . univ oc ity . parsers . csv . Csv Parser Settings Ċ import Ġokhttp 3 . Interceptor Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType OrNull Ċ import Ġokhttp 3 . Multipart Body Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . RequestBody . Companion . as RequestBody Ċ import Ġokhttp 3 . RequestBody . Companion . to RequestBody Ċ import Ġokhttp 3 . logging . Http Logging Interceptor Ċ import Ġjava . io . File Ċ Ċ val Ġm oshi Ġ= ĠM oshi . Builder (). build () !! Ċ val Ġany Adapter Ġ= Ġm oshi . adapter ( Any :: class . java ) Ċ Ċ inline Ġfun Ġ< re ified ĠT > ĠAny ?. cast (): ĠT Ġ= Ġthis Ġas ĠT Ċ fun ĠAny ?. as Map () Ġ= Ġthis . cast < Map < String , ĠAny ? >>() Ċ fun ĠAny ?. asList () Ġ= Ġthis . cast < List < Any ? >>() Ċ Ċ val Ġconfig Path Ġ= Ġ"${ System . getenv (" HOME ") }/. am _ youtube _ tool " Ċ Ċ fun ĠgetToken (): ĠString Ġ{ ĊĊĠĠĠ Ġif Ġ( File ( config Path ). exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( config Path ). read Text () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln (""" ĊĠĠĠĠĠĠĠ Ġ| This Ġscript Ġrequires Ġa Ġtoken Ġwith ĠY outube ĠData ĠAPI Ġv 3 Ġscope . ĠGo Ġto Ġhttps :// developers . google . com / oauth playground Ġto Ġget Ġone . ĊĠĠĠĠĠĠĠ Ġ| This Ġis Ġneed lessly Ġcon vol uted Ġbecause Ġwe Ġneed Ġto Ġaccess Ġthe Ġdata Ġof Ġa ĠBrand Ġaccount Ġand Ġbrand Ġaccounts Ġcannot Ġbe Ġregistered Ġas Ġtest Ġusers . ĊĠĠĠĠĠĠĠ Ġ| 1 . ĠCreate Ġa ĠG CP Ġproject Ġand Ġenable ĠY outube ĠData ĠAPI Ġv 3 ĊĠĠĠĠĠĠĠ Ġ| 2 . ĠConfigure Ġa Ġsimple Ġexternal Ġoauth Ġconsent Ġscreen Ġand Ġleave Ġit Ġin Ġ' testing ' ĠĊĠĠĠĠĠĠĠ Ġ| 3 . ĠCreate Ġa Ġweb Ġapplication Ġcredential Ġand Ġconfigure Ġthe Ġoauth Ġplay ground Ġas Ġa Ġredirect Ġuri ĊĠĠĠĠĠĠĠ Ġ| 4 . ĠIn Ġplay ground , Ġhit Ġthe Ġgrey Ġc og Ġand Ġconfigure Ġit Ġto Ġuse Ġthe Ġclient _ secret Ġand Ġclient _ id Ġof Ġthe Ġweb Ġapplication Ġjust Ġcreate ĊĠĠĠĠĠĠĠ Ġ| 5 . ĠAdd ĠY outube ĠData ĠAPI Ġv 3 Ġin Ġyour Ġscope ĊĠĠĠĠĠĠĠ Ġ| 6 . ĠAuthor ize Ġand Ġexchange Ġyour Ġcode . ĠThis Ġtoken Ġshould Ġbe Ġwhat Ġyou Ġcopy / paste Ġhere ĊĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠ Ġprint (" Token : Ġ") ĊĠĠĠ Ġval Ġtoken Ġ= Ġread Line () Ġ?: Ġerror (" a Ġtoken Ġis Ġrequired ") ĊĠĠĠ Ġprintln ("") ĊĠĠĠ ĠFile ( config Path ). write Text ( token ) ĊĠĠĠ Ġreturn Ġtoken Ċ } Ċ Ċ val ĠaccessToken Ġby Ġlazy Ġ{ ĊĠĠĠ ĠgetToken () Ċ } Ċ Ċ val Ġok HttpClient Ġby Ġlazy Ġ{ ĊĠĠĠ ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠ Ġ. add Interceptor ( Http Logging Interceptor (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= ĠHttp Logging Interceptor . Level . BODY ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ. add Interceptor ( Interceptor Ġ{ Ġchain Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchain . proceed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchain . request (). newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Authorization ", Ġ" Bearer Ġ$ accessToken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}). build () Ċ } Ċ Ċ class ĠVideo Info ( ĊĠĠĠ Ġval Ġwebsite Id : ĠString , ĊĠĠĠ Ġval Ġyoutube Id : ĠString , ĊĠĠĠ Ġval Ġtitle : ĠString , ĊĠĠĠ Ġval Ġdescription : ĠString , ĊĠĠĠ Ġval Ġtags : ĠList < String > Ċ ) Ċ Ċ fun Ġget Video Infos ( json File : ĠFile , Ġcsv File : ĠFile ): ĠList < Video Info > Ġ{ ĊĠĠĠ Ġval Ġmapping Ġ= Ġcsv File ĊĠĠĠĠĠĠĠ Ġ. reader () ĊĠĠĠĠĠĠĠ Ġ. use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCsv Parser ( Csv Parser Settings ()). parse All ( reader ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwebsite Id Ġ= Ġit [ 4 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyoutube Link Ġ= Ġit [ 1 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( youtube Link Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġwork shops , Ġwe Ġdo Ġnot Ġupload Ġto ĠY T ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" No Ġyoutube Link Ġfor Ġ$ website Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull Ġ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregex 1 Ġ= ĠRegex (" https :// www . youtube . com / watch \\ ? v =( .* )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregex 2 Ġ= ĠRegex (" https :// youtu . be /( .* )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmatch Result Ġ= Ġregex 1 . match Ent ire ( youtube Link ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyoutube Id : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyoutube Id Ġ= Ġmatch Result . group Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Result Ġ= Ġregex 2 . match Ent ire ( youtube Link ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyoutube Id Ġ= Ġmatch Result . group Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Cannot Ġfind Ġyoutube Ġid Ġin Ġ${ youtube Link }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwebsite Id Ġto Ġyoutube Id ĊĠĠĠĠĠĠĠ Ġ}. toMap () ĊĊĊĠĠĠ Ġval Ġrecords Ġ= Ġany Adapter . fromJson ( json File . read Text ()). asList () ĊĊĠĠĠ Ġreturn Ġrecords . map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= Ġit . as Map () ĊĠĠĠĠĠĠĠ Ġval Ġwebsite Id Ġ= Ġrecord [" id "]. cast < String ?> () Ġ?: Ġerror (" No Ġwebsite Id Ġfound Ġfor Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġval Ġtags Ġ= Ġrecord [" tags "]. cast < String ?> ()?. split (",") ?. map Ġ{ Ġit . trim () Ġ} Ġ?: Ġerror (" No Ġtags Ġfound Ġfor Ġ$ it ") ĊĠĠĠĠĠĠĠ ĠVideo Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyoutube Id Ġ= Ġmapping [ website Id ] Ġ?: Ġerror (" No Ġyoutube Id Ġfound Ġfor Ġ$ website Id "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwebsite Id Ġ= Ġwebsite Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġrecord [" youtube Description "]. cast () Ġ?: Ġerror (" No Ġyoutube Id Ġfound Ġfor Ġ$ website Id "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġrecord [" youtube Title "]. cast () Ġ?: Ġerror (" No Ġyoutube Id Ġfound Ġfor Ġ$ website Id "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġtags ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ val Ġupdate Command Ġ= Ġobject Ġ: ĠCli kt Command ( ĊĠĠĠ Ġname Ġ= Ġ" update ", ĊĠĠĠ Ġhelp Ġ= Ġ" updates Ġthe Ġmetadata Ġof Ġthe Ġgiven Ġvideos " Ċ ) Ġ{ ĊĠĠĠ Ġval Ġmapping Csv Ġby Ġoption ( ĊĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA ĠCSV Ġfile Ġcontaining Ġthe Ġwebsite ĠID Ġ< -> Ġyoutube ĠID Ġmapping ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠ Ġ). required () ĊĊĠĠĠ Ġval Ġonly Ġby Ġoption ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA Ġlist Ġof Ġcom a Ġseparated ĠI ds Ġto Ġlimit Ġthe Ġupdate Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġmetadata Json Ġby Ġoption ( ĊĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA ĠJson Ġfile Ġcontaining Ġthe Ġmetadata ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠ Ġ). required () ĊĠĠĠ Ġval Ġthumb nails Ġby Ġoption (). required () ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvideo Infos Ġ= Ġget Video Infos ( File ( metadata Json ), ĠFile ( mapping Csv )) ĊĊĠĠĠĠĠĠĠ Ġvideo Infos . forEach Ġ{ Ġit Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( only Ġ!= Ġnull Ġ&& Ġ! only !!. split ("," ). map Ġ{ Ġit . trim () Ġ}. contains ( it . website Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthumbnail Ġ= ĠFile ( thumb nails , Ġ"${ it . website Id }. png ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate MetaData ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Thumbnail ( it . youtube Id , Ġthumbnail ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 _ 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate MetaData ( video Info : ĠVideo Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Json Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" id " Ġto Ġvideo Info . youtube Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" snippet " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" title " Ġto Ġvideo Info . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" description " Ġto Ġvideo Info . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" tags " Ġto Ġvideo Info . tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" categoryId " Ġto Ġ" 2 8 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsnippet Body Ġ= Ġany Adapter . toJson ( root Json ). to RequestBody (" application / json ". to MediaType ()) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( snippet Body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url (" https :// www . googleapis . com / youtube / v 3 / videos ? part = snippet ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġok HttpClient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. new Call ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Body Ġ= Ġresponse . body ?. string () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Thumbnail ( video Id : ĠString , Ġthumbnail File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimage Bytes Ġ= Ġthumbnail File . read Bytes () ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġok HttpClient . new Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( image Bytes . to RequestBody (" image / png ". to MediaType ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url (" https :// www . googleapis . com / upload / youtube / v 3 / thumb nails / set ? video Id =$ video Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Body Ġ= Ġresponse . body ?. string () ĊĠĠĠ Ġ} Ċ } Ċ Ċ val Ġupload Command Ġ= Ġobject Ġ: ĠCli kt Command ( name Ġ= Ġ" upload ") Ġ{ ĊĠĠĠ Ġval Ġinput Data Path Ġby Ġoption (). required () ĊĠĠĠ Ġval Ġpath Ġby Ġoption (). required () ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Json Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" snippet " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" title " Ġto Ġ" title ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" description " Ġto Ġ" description " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" status " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" privacy Status " Ġto Ġ" un listed " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsnippet Body Ġ= Ġany Adapter . toJson ( root Json ). to RequestBody (" application / json ". to MediaType ()) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Body Ġ= ĠFile ( path ). as RequestBody (" application / octet - stream ". to MediaType OrNull ()) ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠMultip art Body . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add FormData Part (" snippet ", Ġ" snippet ", Ġsnippet Body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add FormData Part (" video ", Ġpath . substring After Last ("/ "), Ġvideo Body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url (" https :// www . googleapis . com / upload / youtube / v 3 / videos ? part = snippet , status ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġok HttpClient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. new Call ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Body Ġ= Ġresponse . body ?. string () ĊĊĠĠĠĠĠĠĠ Ġval Ġy t Video Ġ= Ġany Adapter . fromJson ( response Body ) !!. as Map () ĊĠĠĠĠĠĠĠ Ġval Ġinput Data Ġ= Ġany Adapter . fromJson ( File ( input Data Path !! ). read Text ()) !!. asList () ĊĊĠĠĠĠĠĠĠ Ġval Ġnew InputData Ġ= Ġinput Data . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġit Ġas ĠMap < String , ĠAny > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . get (" da ") Ġ== Ġpath . substring After Last ("/ "). substring Before (". ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġit . to Mutable Map () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . put (" yt Id ", Ġy t Video . get (" id ") Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsave Ġthe Ġyoutube Id Ġsomewhere ĊĠĠĠĠĠĠĠ ĠFile ( input Data Path ). write Text ( any Adapter . toJson ( new InputData )) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ object Ġ: ĠCli kt Command () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠ Ġ} Ċ }. sub commands ( ĊĠĠĠ Ġupdate Command , ĊĠĠĠ Ġupload Command Ċ ) ĊĠĠĠ Ġ. main ( args ) Ċ Ċ fun Ġshow Categories () Ġ{ ĊĠĠĠ Ġval Ġresponse Ġ= Ġok HttpClient ĊĠĠĠĠĠĠĠ Ġ. new Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url (" https :// www . googleapis . com / youtube / v 3 / video Categories ? part = snippet & region Code = US ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. execute () ĊĊĠĠĠ Ġval Ġresponse Body Ġ= Ġresponse . body ?. string () Ċ } Ċ Ċ fun Ġshow Channels () Ġ{ ĊĠĠĠ Ġval Ġresponse Ġ= Ġok HttpClient ĊĠĠĠĠĠĠĠ Ġ. new Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url (" https :// www . googleapis . com / youtube / v 3 / channels ? part = snippet & mine = true ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. execute () ĊĊĠĠĠ Ġval Ġresponse Body Ġ= Ġresponse . body ?. string () Ċ } ĊĊĊ