package Ġblue . st arry . s aya . endpoints Ċ Ċ import Ġblue . st arry . s aya . common . Env Ċ import Ġblue . st arry . s aya . common . respond Or NotFound Ċ import Ġblue . st arry . s aya . common . to Boolean F uzzy Ċ import Ġblue . st arry . s aya . common . to FF M peg Preset Ċ import Ġblue . st arry . s aya . services . Comment Stream Manager . Streams Ċ import Ġblue . st arry . s aya . services . comments . with Session Ċ import Ġblue . st arry . s aya . services . ffmpeg . FF M peg Wrapper Ċ import Ġblue . st arry . s aya . services . mir ak ur un . Mir ak ur un Api Ċ import Ġblue . st arry . s aya . services . mir ak ur un . Mir ak ur un DataManager Ċ import Ġblue . st arry . s aya . services . mir ak ur un . Mir ak ur un Stream Manager Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . client . call .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . http . c io . websocket .* Ċ import Ġio . ktor . http . content .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . routing .* Ċ import Ġio . ktor . sessions .* Ċ import Ġio . ktor . util .* Ċ import Ġio . ktor . util . c io .* Ċ import Ġio . ktor . utils . io .* Ċ import Ġio . ktor . utils . io . jvm . nio .* Ċ import Ġio . ktor . websocket .* Ċ import Ġkotlinx . coroutines . channels . consume Each Ċ import Ġkotlinx . serialization . encode ToString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġjava . nio . file . Files Ċ Ċ internal Ġval Ġm 3 u 8 Ġ= ĠContentType (" application ", Ġ" x - mpeg URL ") Ċ Ċ fun ĠRoute . getService H LS ById () Ġ{ ĊĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġby Ġcall . parameters ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠMir ak ur un DataManager . Services . find Ġ{ Ġit . id Ġ== Ġid Ġ} Ġ?: Ġreturn @ get Ġcall . respond ( HttpStatusCode . NotFound ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpreset Ġ= Ġcall . parameters [" preset "]. to FF M peg Preset () Ġ?: ĠF FM peg Wrapper . Preset . High ĊĠĠĠĠĠĠĠ Ġval Ġsub Title Ġ= Ġcall . parameters [" subtitle "]. to Boolean F uzzy () ĊĊĠĠĠĠĠĠĠ Ġval Ġplaylist Ġ= ĠMir ak ur un Stream Manager . open Live H LS ( service , Ġpreset , Ġsub Title ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Files . exists ( playlist )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text Writer ( m 3 u 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("# EXT M 3 U ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("# EXT - X - VERSION : 3 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("# EXT - X - ALLOW - CACHE : YES ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("# EXT - X - TARGET DURATION : 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("# EXT - X - MEDIA - SEQUENCE : 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("# EXTINF : 1 . 0 1 7 0 0 0 , ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("${ Env . S AY A _ BASE _ URI . remove Suffix ("/") }/ segments / blank . ts ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( Local FileContent ( playlist . to File (), Ġm 3 u 8 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . get Services () Ġ{ ĊĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMir ak ur un DataManager . Services . toList () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . getService ById () Ġ{ ĊĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġby Ġcall . parameters ĊĊĠĠĠĠĠĠĠ Ġcall . respond Or NotFound ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMir ak ur un DataManager . Services . find Ġ{ Ġit . id Ġ== Ġid Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . getService Programs ById () Ġ{ ĊĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġby Ġcall . parameters ĊĊĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMir ak ur un DataManager . Programs . filter Ġ{ Ġit . id Ġ== Ġid Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . put Services () Ġ{ ĊĠĠĠ Ġput Ġ{ ĊĠĠĠĠĠĠĠ ĠMir ak ur un DataManager . Services . update () ĊĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . OK ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . getService M 2 TS ById () Ġ{ ĊĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġby Ġcall . parameters ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠMir ak ur un DataManager . Services . find Ġ{ Ġit . id Ġ== Ġid Ġ} Ġ?: Ġreturn @ get Ġcall . respond ( HttpStatusCode . NotFound ) ĊĠĠĠĠĠĠĠ Ġval Ġpriority Ġ= Ġcall . parameters [" priority "] ?. toInt OrNull () ĊĊĠĠĠĠĠĠĠ Ġcall . respond Bytes Writer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMir ak ur un Api . getService Stream ( service . id , Ġdecode Ġ= Ġtrue , Ġpriority Ġ= Ġpriority ). receive Ġ{ Ġchannel : ĠByte Read Channel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . copy To ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . getService X spf ById () Ġ{ ĊĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġby Ġcall . parameters ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠMir ak ur un DataManager . Services . find Ġ{ Ġit . id Ġ== Ġid Ġ} Ġ?: Ġreturn @ get Ġcall . respond ( HttpStatusCode . NotFound ) ĊĊĠĠĠĠĠĠĠ Ġcall . response . header ( HttpHeaders . Content Disposition , ĠContent Disposition . Attachment . with Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContent Disposition . Parameters . FileName , Ġ" watch . x spf " ĊĠĠĠĠĠĠĠ Ġ). toString ()) ĊĊĠĠĠĠĠĠĠ Ġcall . respond Text Writer ( ContentType (" application ", Ġ" x spf + xml ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line (" <? xml Ġversion =\" 1 . 0 \" Ġencoding =\" UTF - 8 \" ?> ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("< playlist Ġversion =\" 1 \" Ġxmlns =\" http :// x spf . org / ns / 0 / \"> ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("< track List >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("< track >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ( Env . S AY A _ URL _ PREFIX Ġ?: Ġ" http ://${ Env . S AY A _ HOST }:${ Env . S AY A _ PORT }") Ġ+ Ġ"${ Env . S AY A _ BASE _ URI . remove Suffix ("/") }/ services /${ service . id }/ m 2 ts " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("< location >$ url </ location >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("< title >${ service . name }</ title >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("</ track >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("</ track List >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ("</ playlist >") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . getM ir ak ur un Service ById () Ġ{ ĊĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġby Ġcall . parameters ĊĊĠĠĠĠĠĠĠ Ġcall . respond Or NotFound ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMir ak ur un DataManager . Services . find Ġ{ Ġit . id Ġ== Ġid Ġ} ?. json ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . getM ir ak ur un Services () Ġ{ ĊĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . respond ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMir ak ur un DataManager . Services . toList (). map Ġ{ Ġit . json Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . ws Service Comments ById () Ġ{ ĊĠĠĠ Ġweb Socket Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġby Ġcall . parameters ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠMir ak ur un DataManager . Services . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ== Ġid ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn @ web Socket Ġthis . close ( Close Reason ( Close Reason . Codes . CAN NOT _ ACCEPT , Ġ" Service Ġ$ id Ġis Ġnot Ġfound .")) ĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠStreams . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . channel . service Ids . contains ( service . actual Id ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn @ web Socket Ġthis . close ( Close Reason ( Close Reason . Codes . CAN NOT _ ACCEPT , Ġ" Service Ġ$ id Ġis Ġnot Ġfound .")) Ċ Ċ // ĠĠĠĠĠĠĠ Ġval Ġhas ht ag Ġ= Ġcall . parameters [" hasht ag "] Ċ // ĠĠĠĠĠĠĠ Ġval Ġsample Ġ= Ġcall . parameters [" sample "] Ġ== Ġ" 1 " Ċ // ĠĠĠĠĠĠĠ Ġval Ġtwitter Ġ= Ġif Ġ( sample ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġstream . get OrCreate Twitter Provider ( null ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġhas ht ag ?. let Ġ{ Ġstream . get OrCreate Twitter Provider ( it ) Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstream . get OrCreate N ico Live Provider (). with Session Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . comments . open Subscription (). consume Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( Json . encode ToString ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtwitter . with Session Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( twitter . comments . open Subscription () Ġ+ Ġn ico Live . comments . open Subscription ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ico Live . comments . open Subscription (). consume Each Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( Json . encode ToString ( it )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ