package Ġdev . d res . api . cli Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . github . aj alt . cli kt . core . Cli kt Command Ċ import Ġcom . github . aj alt . cli kt . core . No Op Cli kt Command Ċ import Ġcom . github . aj alt . cli kt . core . sub commands Ċ import Ġcom . github . aj alt . cli kt . parameters . options .* Ċ import Ġcom . github . aj alt . cli kt . parameters . types . enum Ċ import Ġcom . github . aj alt . cli kt . parameters . types . float Ċ import Ġcom . github . aj alt . cli kt . parameters . types . long Ċ import Ġcom . github . do y aaaa aken . kotlin csv . dsl . csv Reader Ċ import Ġcom . github . do y aaaa aken . kotlin csv . dsl . csv Writer Ċ import Ġcom . jak ew h art on . pic nic . table Ċ import Ġdev . d res . data . dbo . DAO Ċ import Ġdev . d res . data . dbo . Dao Indexer Ċ import Ġdev . d res . data . model . UID Ċ import Ġdev . d res . data . model . basics . media . Media Collection Ċ import Ġdev . d res . data . model . basics . media . Media Item Ċ import Ġdev . d res . data . model . basics . media . Media Item Segment Ċ import Ġdev . d res . data . model . basics . media . Media Item Segment List Ċ import Ġdev . d res . data . model . basics . time . Temporal Range Ċ import Ġdev . d res . utilities . FF mpeg Util Ċ import Ġdev . d res . utilities . extensions . UID Ċ import Ġdev . d res . utilities . extensions . clean Path String Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . slf 4 j . Marker Factory Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠMedia Collection Command ( val Ġcollections : ĠDAO < Media Collection >, Ġval Ġitems : ĠDAO < Media Item >, Ġval Ġitem Path Index : ĠDao Indexer < Media Item , ĠString >, Ġval Ġmedia Item Collection Index : ĠDao Indexer < Media Item , ĠUID >, Ġval Ġsegments : ĠDAO < Media Item Segment List >) Ġ: ĊĠĠĠĠĠĠĠ ĠNo Op Cli kt Command ( name Ġ= Ġ" collection ") Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Marker Ġ= ĠMarker Factory . get Marker (" CLI ") ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( this . java Class ) ĊĊĠĠĠ Ġoverride Ġfun Ġaliases (): ĠMap < String , ĠList < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ls " Ġto ĠlistOf (" list "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" remove " Ġto ĠlistOf (" delete "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" drop " Ġto ĠlistOf (" delete ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠSort Field Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠID , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNAME , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOC ATION , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD URATION , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF PS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . sub commands ( Create Collection Command (), Update Collection Command (), ĠList Collections Command (), ĠShow Collection Command (), ĠCheck Collection Command (), ĠScan Collection Command (), ĠAdd Media Item Command (), ĠDelete Item Command (), ĠExport Collection Command (), ĠImport Collection Command (), ĠDelete Collection Command (), ĠImport Media Segments Command ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġinner Ġclass ĠAbstract Collection Command ( name : ĠString , Ġhelp : ĠString ) Ġ: ĠCli kt Command ( name Ġ= Ġname , Ġhelp Ġ= Ġhelp , Ġprint Help On Empty Args Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcollection Name Input : ĠString ? Ġby Ġoption ("- c ", Ġ"-- collection ", Ġhelp Ġ= Ġ" Name Ġof Ġthe ĠCollection ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcollection Id Input : ĠUID ? Ġby Ġoption ("- i ", Ġ"-- id ", Ġhelp Ġ= Ġ" Id Ġof Ġthe ĠCollection "). convert Ġ{ Ġit . UID () Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġactual Collection Id (): ĠUID ? Ġ= Ġthis . collection Id Input Ġ?: Ġthis . collection Name Input ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . collections . find Ġ{ Ġc Ġ-> Ġc . name Ġ== Ġit Ġ} ?. id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCreate Collection Command Ġ: ĠCli kt Command ( name Ġ= Ġ" create ", Ġhelp Ġ= Ġ" Creates Ġa Ġnew ĠCollection ", Ġprint Help On Empty Args Ġ= Ġtrue ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġname : ĠString Ġby Ġoption ("- n ", Ġ"-- name ", Ġhelp Ġ= Ġ" Name Ġof Ġthe ĠCollection Ġto Ġbe Ġcreated ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. required () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. validate Ġ{ Ġrequire (! this @ Media Collection Command . collections . any Ġ{ Ġc Ġ-> Ġc . name Ġ== Ġit Ġ}) Ġ{ Ġ" collection Ġwith Ġname Ġ'$ it ' Ġalready Ġexists " Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdescription : ĠString Ġby Ġoption ("- d ", Ġ"-- description ", Ġhelp Ġ= Ġ" Description Ġof Ġthe ĠCollection Ġto Ġbe Ġcreated ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. default ("") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠbasePath : ĠString Ġby Ġoption ("- p ", Ġ"-- path ", Ġhelp Ġ= Ġ" Base Ġpath Ġof Ġthe ĠCollection Ġall Ġcontained ĠItems Ġwill Ġbe Ġspecified Ġrelative Ġto ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. required () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . collections . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Collection ( name Ġ= Ġname . trim (), Ġdescription Ġ= Ġdescription , ĠbasePath Ġ= ĠbasePath . clean Path String ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Successfully Ġadded Ġcollection ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠUpdate Collection Command Ġ: ĠAbstract Collection Command ( name Ġ= Ġ" update ", Ġhelp Ġ= Ġ" Updates Ġan Ġexisting ĠCollection ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġname : ĠString ? Ġby Ġoption ("- n ", Ġ"-- name ", Ġhelp Ġ= Ġ" The Ġnew Ġname Ġof Ġthe Ġcollection ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. validate Ġ{ Ġrequire (! this @ Media Collection Command . collections . any Ġ{ Ġc Ġ-> Ġc . name Ġ== Ġit Ġ}) Ġ{ Ġ" collection Ġwith Ġname Ġ'$ it ' Ġalready Ġexists " Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdescription : ĠString ? Ġby Ġoption ("- d ", Ġ"-- description ", Ġhelp Ġ= Ġ" Description Ġof Ġthe ĠCollection Ġto Ġbe Ġcreated ") ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠbasePath : ĠString ? Ġby Ġoption ("- p ", Ġ"-- path ", Ġhelp Ġ= Ġ" Base Ġpath Ġof Ġthe ĠCollection Ġall Ġcontained ĠItems Ġwill Ġbe Ġspecified Ġrelative Ġto ") ĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġactual Collection Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Couldn 't Ġfind Ġthe Ġgiven Ġcollection ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdirty Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= Ġthis @ Media Collection Command . collections [ id ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewName Ġ= Ġif ( name Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Desc Ġ= if ( description Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection . description Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew BasePath Ġ= Ġif ( basePath Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbasePath !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection . basePath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( dirty ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . collections . delete ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Collection Ġ= ĠMedia Collection ( id , ĠnewName , Ġnew Desc , Ġnew BasePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . collections . append ( new Collection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Updated Ġcollection Ġwith Ġid Ġ${ id . string }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Done . ĠNothing Ġto Ġupdate ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinner Ġclass ĠList Collections Command Ġ: ĠCli kt Command ( name Ġ= Ġ" list ", Ġhelp Ġ= Ġ" Lists Ġall ĠCollections ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplain Ġby Ġoption ("- p ", Ġ"-- plain ", Ġhelp Ġ= Ġ" Plain Ġprint : ĠNo Ġfancy Ġtable Ġpresentation Ġfor Ġmachine Ġreadable Ġoutput "). flag ( default Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Available Ġmedia Ġcollections Ġ${ this @ Media Collection Command . collections . toSet (). size }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( plain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . collections . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Style Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Right Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow (" id ", Ġ" name ", Ġ" description ", Ġ" basePath ", Ġ"# Ġitems ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . collections . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( it . id . string , Ġit . name , Ġit . description Ġ?: Ġ"", Ġit . basePath , Ġthis @ Media Collection Command . media Item Collection Index . filter Ġ{ Ġuid Ġ-> Ġit . id . equals ( uid ) Ġ}. size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠShow Collection Command Ġ: ĠAbstract Collection Command (" show ", Ġhelp Ġ= Ġ" Shows Ġthe Ġcontent Ġof Ġa ĠCollection ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsort Ġby Ġoption ("- s ", Ġ"-- sort ", Ġhelp Ġ= Ġ" Ch ose Ġwhich Ġsorting Ġto Ġuse "). enum < Sort Field >( ignore Case Ġ= Ġtrue ). default Lazy Ġ{ ĠSort Field . NAME Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġplain Ġby Ġoption ("- p ", Ġ"-- plain ", Ġhelp Ġ= Ġ" Plain Ġformatting . ĠNo Ġfancy Ġtables "). flag ( default Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Id Ġ= Ġthis . actual Collection Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collection Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Collection Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Items Ġ= Ġthis @ Media Collection Command ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. items . filter Ġ{ Ġit . collection Ġ== Ġcollection Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġsort Ġreversed Ġby Ġtype Ġ( i . e . ĠVideo Ġbefore ĠImage ), Ġthen Ġby Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( compare By < Media Item > Ġ{ Ġit . java Class . name Ġ}. reversed (). then By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( sort ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort Field . ID Ġ-> Ġit . id . string ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort Field . NAME Ġ-> Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort Field . LOCATION Ġ-> Ġit . location ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠSmall Ġhack Ġas Ġimages Ġdo Ġnot Ġhave Ġthese Ġproperties Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort Field . DURATION Ġ-> Ġif Ġ( it Ġis ĠMedia Item . Video Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . duration Ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort Field . FPS Ġ-> Ġif Ġ( it Ġis ĠMedia Item . Video Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . fps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( plain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Items . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Style Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Right Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow (" id ", Ġ" name ", Ġ" location ", Ġ" type ", Ġ" duration Ms ", Ġ" fps ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Items . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell ( it . id . string ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell ( it . location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMedia Item . Image Item Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell (" image ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Span Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMedia Item . Video Item Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell (" video ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell ( it . duration Ms ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell ( it . fps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" listed Ġ${ collection Items . size } ĠMedia ĠItems ") ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCheck Collection Command Ġ: ĠAbstract Collection Command (" check ", Ġhelp Ġ= Ġ" Checks Ġif Ġall Ġthe Ġfiles Ġin Ġa Ġcollection Ġare Ġpresent Ġand Ġaccessible ") Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Id Ġ= Ġthis . actual Collection Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collection Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Collection Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= Ġthis @ Media Collection Command . collections [ collection Id ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Items Ġ= Ġthis @ Media Collection Command . items . filter Ġ{ Ġit . collection Ġ== Ġcollection Id Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase File Ġ= ĠFile ( collection . basePath ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcounter Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Items . forEach Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( base File , Ġit . location ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . can Read ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ counter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" item Ġ${ it . name } Ġat Ġ${ file . absolute Path } Ġnot Ġreadable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" item Ġ${ it . name } Ġat Ġ${ file . absolute Path } Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" successfully Ġchecked Ġ$ counter Ġof Ġ${ collection Items . size } ĠMedia ĠItems ") ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠScan Collection Command Ġ: ĠAbstract Collection Command (" scan ", Ġhelp Ġ= Ġ" Sc ans Ġa Ġcollection Ġdirectory Ġand Ġadds Ġfound Ġitems ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġimage Types Ġby Ġoption ("- it ", Ġ"-- image Type ", Ġhelp Ġ= Ġ" Image Ġfile Ġtypes Ġ( end ings ) Ġto Ġbe Ġconsidered Ġin Ġthe Ġscan "). convert Ġ{ Ġit . toLowerCase () Ġ}. multiple () ĊĠĠĠĠĠĠĠ Ġval Ġvideo Types Ġby Ġoption ("- vt ", Ġ"-- video Type ", Ġhelp Ġ= Ġ" Video Ġfile Ġtypes Ġ( end ings ) Ġto Ġbe Ġconsidered Ġin Ġthe Ġscan "). convert Ġ{ Ġit . toLowerCase () Ġ}. multiple () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Id Ġ= Ġthis . actual Collection Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collection Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Collection Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= Ġthis @ Media Collection Command . collections [ collection Id ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( image Types . isEmpty () Ġ&& Ġvideo Types . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" No Ġfile Ġtypes Ġspecified .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Ġ= ĠFile ( collection . basePath ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! base . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Cannot Ġscan Ġcollection , Ġ'${ collection . basePath }' Ġdoes Ġnot Ġexist .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! base . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Cannot Ġscan Ġcollection , Ġ'${ collection . basePath }' Ġis Ġno Ġdirectory .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! base . can Read ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Cannot Ġscan Ġcollection , Ġ'${ collection . basePath }' Ġis Ġnot Ġreadable .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġbase . walk Top Down (). filter Ġ{ Ġit . isFile Ġ&& Ġ( it . extension . toLowerCase () Ġin Ġimage Types Ġ|| Ġit . extension Ġin Ġvideo Types ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġmutable ListOf < Media Item >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġissues Ġ= Ġmutable Map Of < String , ĠString >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfile Counter Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . forEach Ġ{ Ġfile Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" found Ġ${ file . absolute Path }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelative Path Ġ= Ġfile . relative To ( base ). path ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġthis @ Media Collection Command . item Path Index [ relative Path ]. find Ġ{ Ġit . collection Ġ== Ġcollection Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( file . extension . toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġimage Types Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Ġ== Ġnull ) Ġ{ Ġ// add ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Item Ġ= ĠMedia Item . Image Item ( UID . EMPTY , Ġfile . name Without Extension , Ġrelative Path , Ġcollection . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . add ( new Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// skip ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Image Ġ${ existing . name } Ġalready Ġpresent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġvideo Types Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Analy zing Ġ${ file . absolute Path }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠFF mpeg Util . analyze ( file . to Path ()). streams . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfps Ġ= Ġ( result . r Frame Rate Ġ?: Ġresult . avg Frame Rate !! ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġresult . get Duration ( TimeUnit . MILLISECONDS ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Cannot Ġread Ġduration Ġfrom Ġfile , Ġcounting Ġframes ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanalysis Ġ= ĠFF mpeg Util . analyze ( file . to Path (), Ġcount Frames Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġframes Ġ= Ġanalysis . streams . first (). nb Read Frames ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Count ed Ġ$ frames Ġframes ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( frames Ġ* Ġ 1 0 0 0 ) Ġ/ Ġfps ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Found Ġframe Ġrate Ġto Ġbe Ġ$ fps Ġframes Ġper Ġseconds Ġand Ġduration Ġ$ duration Ġms ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Ġ== Ġnull ) Ġ{ Ġ// add ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Item Ġ= ĠMedia Item . Video Item ( UID . EMPTY , Ġfile . name Without Extension , Ġrelative Path , Ġcollection . id , Ġduration , Ġfps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . add ( new Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// skip ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Item Ġ= ĠMedia Item . Video Item ( existing . id , Ġexisting . name , Ġrelative Path , Ġcollection . id , Ġduration , Ġfps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . items . update ( new Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Updated ĠVideo Ġ${ new Item . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch ( e : Throwable ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . logger . error ( this @ Media Collection Command . log Marker , Ġ" An Ġerror Ġoccurred Ġwith Ġ$ file . ĠNot ing Ġand Ġskipping ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" An Ġerror Ġoccurred Ġwith Ġ$ file . ĠNot ing Ġand Ġskipping ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissues [ file . path ] Ġ= Ġe . stack Trace ToString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer . size Ġ>= Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" St oring Ġbuffer ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . items . batch Append ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ file Counter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" St oring Ġbuffer ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . items . batch Append ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( issues . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile (" issues - scan -${ collection . name }-${ System . currentTimeMillis ()}. json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" There Ġhave Ġbeen Ġ${ issues . size } Ġissues Ġwhile Ġscanning . ĠYou Ġmight Ġwant Ġto Ġcheck Ġthem Ġat Ġ${ file . path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġom Ġ= Ġj ack son ObjectMapper () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġom . writeValue ( file , Ġissues ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("\ n Added Ġ$ file Counter Ġelements Ġto Ġcollection ") ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠDelete Collection Command Ġ: ĠAbstract Collection Command (" delete ", Ġhelp Ġ= Ġ" Deletes Ġa ĠCollection ") Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Id Ġ= Ġthis . actual Collection Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collection Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Collection Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" looking Ġup ĠMedia ĠItems ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ids Ġ= Ġthis @ Media Collection Command . items . filter Ġ{ Ġit . collection Ġ== Ġcollection Id Ġ}. map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done , Ġfound Ġ${ item Ids . size } ĠItems ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" looking Ġup ĠMedia ĠItem ĠSe gments ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠitemId Set Ġ= Ġitem Ids . toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsegment Ids Ġ= Ġthis @ Media Collection Command . segments . filter Ġ{ ĠitemId Set . contains ( it . media ItemId ) Ġ}. map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done , Ġfound Ġ${ segment Ids . size } ĠSe gments ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" Deleting ĠMedia ĠItem ĠSe gments ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . segments . batch Delete ( segment Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" Deleting ĠMedia ĠItems ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . items . batch Delete ( item Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" Deleting ĠCollection ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . collections . delete ( collection Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done ") ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠDelete Item Command Ġ: ĠAbstract Collection Command (" delete Item ", Ġhelp Ġ= Ġ" Deletes ĠMedia ĠItem ( s )") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġitem Name : ĠString Ġby Ġoption ("- in ", Ġ"-- itemName ", Ġhelp Ġ= Ġ" Name Ġof Ġthe ĠItem "). default ("") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠitemId Input : ĠUID ? Ġby Ġoption ("- ii ", Ġ"-- itemId ", Ġhelp Ġ= Ġ" Id Ġof Ġthe ĠItem "). convert Ġ{ Ġit . UID () Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġname Regex : ĠRegex ? Ġby Ġoption ("- e ", Ġ"-- regex ", Ġhelp =" Regex Ġfor Ġitem Ġnames "). convert Ġ{ Ġit . to Regex () Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Id Ġ= Ġthis . actual Collection Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collection Id Ġ== Ġnull Ġ&& ĠitemId Input Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Collection Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( itemName . isBlank () Ġ&& ĠitemId Input Ġ== Ġnull ) Ġ&& Ġname Regex Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Item ( s ) Ġnot Ġspecified .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( itemName . isNotBlank () Ġ|| ĠitemId Input Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠitemId Ġ= ĠitemId Input ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthis @ Media Collection Command . items . find Ġ{ Ġit . collection Ġ== Ġcollection Id Ġ&& Ġit . name Ġ== Ġitem Name Ġ} ?. id ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( itemId Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Item Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . items . delete ( itemId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Item Ġ'${ itemId . string }' Ġdeleted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġif ( name Regex Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregex Ġ= Ġname Regex !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġids Ġ= Ġthis @ Media Collection Command . items . filter Ġ{ Ġit . collection Ġ== Ġcollection Id Ġ&& Ġregex . matches ( it . name ) Ġ}. map { it . id } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ids . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" No Ġitems Ġfound Ġfor Ġregex Ġ$ regex ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġids . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . items . delete ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Item Ġ'$ it ' Ġdeleted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Nothing Ġwas Ġspecified , Ġhence Ġno Ġdeletion Ġoccured ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠAdd Media Item Command Ġ: ĠNo Op Cli kt Command ( name Ġ= Ġ" add ", Ġhelp Ġ= Ġ" Adds Ġa ĠMedia ĠItem Ġto Ġa ĠCollection ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . sub commands ( Add Image Command (), ĠAdd Video Command ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠAdd Image Command Ġ: ĠAbstract Collection Command ( name Ġ= Ġ" image ", Ġhelp Ġ= Ġ" Adds Ġa Ġnew ĠImage ĠMedia ĠItem ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġname : ĠString Ġby Ġoption ("- n ", Ġ"-- name ", Ġhelp Ġ= Ġ" Name Ġof Ġthe ĠItem "). required () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġpath : ĠString Ġby Ġoption ("- p ", Ġ"-- path ", Ġhelp Ġ= Ġ" Path Ġof Ġthe ĠItem Ġrelative Ġto Ġthe ĠCollection Ġbase Ġpath ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. required () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Id Ġ= Ġthis . actual Collection Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collection Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Collection Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġthis @ Media Collection Command . items . filter Is Instance < Media Item . Image Item >(). find Ġ{ Ġit . collection Ġ== Ġcollection Id Ġ&& Ġit . name Ġ== Ġname Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" item Ġwith Ġname Ġ'$ name ' Ġalready Ġexists Ġin Ġcollection :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( existing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . items . append ( Media Item . Image Item ( name Ġ= Ġname . trim (), Ġlocation Ġ= Ġpath . clean Path String (), Ġcollection Ġ= Ġcollection Id , Ġid Ġ= ĠUID . EMPTY )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" item Ġadded ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠAdd Video Command Ġ: ĠAbstract Collection Command ( name Ġ= Ġ" video ", Ġhelp Ġ= Ġ" Adds Ġa Ġnew ĠVideo ĠMedia ĠItem ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġname : ĠString Ġby Ġoption ("- n ", Ġ"-- name ", Ġhelp Ġ= Ġ" Name Ġof Ġthe ĠItem "). required () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġpath : ĠString Ġby Ġoption ("- p ", Ġ"-- path ", Ġhelp Ġ= Ġ" Path Ġof Ġthe ĠItem Ġrelative Ġto Ġthe ĠCollection Ġbase Ġpath ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. required () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġduration : ĠLong Ġby Ġoption ("- d ", Ġ"-- duration ", Ġhelp Ġ= Ġ" video Ġduration Ġin Ġseconds "). long (). required () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġfps : ĠFloat Ġby Ġoption ("- f ", Ġ"-- fps "). float (). required () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Id Ġ= Ġthis . actual Collection Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collection Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Collection Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġthis @ Media Collection Command . items . filter Is Instance < Media Item . Video Item >(). find Ġ{ Ġit . collection Ġ== Ġcollection Id Ġ&& Ġit . name Ġ== Ġname Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" item Ġwith Ġname Ġ'$ name ' Ġalready Ġexists Ġin Ġcollection :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( existing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . items . append ( Media Item . Video Item ( name Ġ= Ġname , Ġlocation Ġ= Ġpath , Ġcollection Ġ= Ġcollection Id , Ġduration Ms Ġ= Ġduration , Ġfps Ġ= Ġfps , Ġid Ġ= ĠUID . EMPTY )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" item Ġadded ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠExport Collection Command Ġ: ĠAbstract Collection Command (" export ", Ġhelp Ġ= Ġ" Exports Ġa ĠCollection Ġto Ġa ĠCSV Ġfile ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfile OutputStream ( file : ĠString ): ĠOutputStream Ġ= ĠFileOutputStream ( file ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠoutputStream : ĠOutputStream Ġby Ġoption ("- f ", Ġ"-- file ", Ġhelp Ġ= Ġ" Path Ġof Ġthe Ġfile Ġthe ĠCollection Ġis Ġto Ġbe Ġexported Ġto ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. convert Ġ{ Ġfile OutputStream ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. default ( System . out ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Row ( item : ĠMedia Item ): ĠList < String ?> Ġ= Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMedia Item . Image Item Ġ-> ĠlistOf (" image ", Ġitem . name , Ġitem . location , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMedia Item . Video Item Ġ-> ĠlistOf (" video ", Ġitem . name , Ġitem . location , Ġitem . duration . to Millis (). toString (), Ġitem . fps . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġheader Ġ= ĠlistOf (" item Type ", Ġ" name ", Ġ" location ", Ġ" duration ", Ġ" fps ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcsv Writer (). open ( output Stream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Row ( header ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . items . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Row ( to Row ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠImport Collection Command Ġ: ĠAbstract Collection Command (" import ", Ġhelp Ġ= Ġ" Imports Ġa ĠCollection Ġfrom Ġa ĠCSV Ġfile ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinput File : ĠFile Ġby Ġoption ("- f ", Ġ"-- file ", Ġhelp Ġ= Ġ" Path Ġof Ġthe Ġfile Ġthe ĠCollection Ġis Ġto Ġbe Ġimported Ġfrom ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. convert Ġ{ ĠFile ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. required () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. validate Ġ{ Ġrequire ( it . exists ()) Ġ{ Ġ" Input ĠFile Ġnot Ġfound " Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfrom Row ( map : ĠMap < String , ĠString >, Ġcollection Id : ĠUID ): ĠMedia Item ? Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! map . containsKey (" item Type ") Ġ|| Ġ! map . containsKey (" name ") Ġ|| Ġ! map . containsKey (" location ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( map . getValue (" item Type ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" image " Ġ-> ĠMedia Item . Image Item ( UID . EMPTY , Ġmap . getValue (" name "), Ġmap . getValue (" location "), Ġcollection Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" video " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( map . containsKey (" duration ") Ġ&& Ġmap . containsKey (" fps ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMedia Item . Video Item ( UID . EMPTY , Ġmap . getValue (" name "), Ġmap . getValue (" location "), Ġcollection Id , Ġmap . getValue (" duration "). to Long (), Ġmap . getValue (" fps "). toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Id Ġ= Ġthis . actual Collection Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collection Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Collection Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows : ĠList < Map < String , ĠString >> Ġ= Ġcsv Reader (). read All With Header ( inputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems FromFile Ġ= Ġrows . map NotNull Ġ{ Ġthis . from Row ( it , Ġcollection Id ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Items Ġ= Ġthis @ Media Collection Command . items . filter Ġ{ Ġit . collection Ġ== Ġcollection Id Ġ}. toList () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems To Insert Ġ= Ġitems FromFile . filter Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Items . none Ġ{ Ġit . name Ġ== Ġitem . name Ġ&& Ġit . location Ġ== Ġitem . location Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . items . batch Append ( items To Insert ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Successfully Ġimported Ġ${ items To Insert . size } Ġof Ġ${ rows . size } Ġrows ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠImport Media Segments Command Ġ: ĠAbstract Collection Command (" import Segments ", Ġ" Imports Ġthe ĠSegment Ġinformation Ġfor Ġthe ĠItems Ġin Ġa ĠCollection Ġfrom Ġa ĠCSV Ġfile ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinput File : ĠFile Ġby Ġoption ("- f ", Ġ"-- file ", Ġhelp Ġ= Ġ" Path Ġof Ġthe Ġfile Ġthe ĠSe gments Ġare Ġto Ġbe Ġimported Ġfrom ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. convert Ġ{ ĠFile ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. required () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. validate Ġ{ Ġrequire ( it . exists ()) Ġ{ Ġ" Input ĠFile Ġnot Ġfound " Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Id Ġ= Ġthis . actual Collection Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collection Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Collection Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" loading Ġcollection Ġinformation ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ids Ġ= Ġthis @ Media Collection Command . items . filter Ġ{ Ġit . collection Ġ== Ġcollection Id Ġ}. map Ġ{ Ġit . name Ġto Ġit . id Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Item Ids Ġ= Ġitem Ids . values . toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (".") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Segments Ġ= Ġthis @ Media Collection Command . segments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmedia Item Ids . contains ( it . media ItemId ) Ġ}. flatMap Ġ{ Ġit . segments . map Ġ{ Ġs Ġ-> Ġit . media ItemId Ġto Ġs . name Ġ} Ġ}. to Mutable Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" reading Ġinput Ġfile ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows : ĠList < Map < String , ĠString >> Ġ= Ġcsv Reader (). read All With Header ( inputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done , Ġread Ġ${ rows . size } Ġrows ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" analy zing Ġsegments ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsegments Ġ= Ġrows . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Ġ= Ġit [" video "] Ġ?: Ġreturn @ map Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit [" name "] Ġ?: Ġreturn @ map Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġit [" start "] ?. to Long () Ġ?: Ġreturn @ map Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġit [" end "] ?. to Long () Ġ?: Ġreturn @ map Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Id Ġ= Ġitem Ids [ video ] Ġ?: Ġreturn @ map Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġfor Ġduplicates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġvideo Id Ġto Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Segments . contains ( pair )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Segments . add ( pair ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Item Segment ( video Id , Ġname , ĠTemp oral Range ( start , Ġend )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done , Ġgenerated Ġ${ segments . size } Ġvalid , Ġnon - duplicate Ġsegments ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrouped Ġ= Ġsegments . groupBy Ġ{ Ġit . media ItemId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaffected Ġ= Ġthis @ Media Collection Command . segments . filter Ġ{ Ġgrouped . keys . contains ( it . media ItemId ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaffected . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . segments . addAll ( grouped [ it . media ItemId ] Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaffected Media Item Ids Ġ= Ġaffected . map Ġ{ Ġit . media ItemId Ġ}. toSet () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġgrouped . filter Ġ{ Ġ! affected Media Item Ids . contains ( it . key ) Ġ}. map Ġ{ ĠMedia Item Segment List ( UID . EMPTY , Ġit . key , Ġit . value . to Mutable List ()) Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" st oring Ġsegments ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaffected . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . segments . update ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Media Collection Command . segments . batch Append ( new ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" done ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ