package Ġinfo . ben jamin h ill . slide show Ċ Ċ import Ġcom . d rew . im aging . Image Metadata Reader Ċ import Ġcom . d rew . metadata . ex if . Ex if Sub IF DD irectory Ċ import Ġnet . co ob ird . thumbnail ator . Thumb nails Ċ import Ġjava . awt . Dimension Ċ import Ġjava . awt . image . Buffered Image Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġkotlin . time . Experimental Time Ċ Ċ /** Ċ Ġ* ĠAbstract Ġmedia Ġwrapper Ġthat Ġproduces Ġframes Ġthat Ġare Ġcorrectly Ġorient ed . Ċ Ġ*/ Ċ @ Experimental Time Ċ abstract Ġclass ĠClip ( val Ġfile : ĠFile ) Ġ: ĠComparable < Clip > Ġ{ ĊĊĠĠĠ Ġprotected Ġvar Ġorientation : ĠInt ĊĠĠĠ Ġprivate Ġval Ġcreation Date : ĠDate ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirs Ġ= ĠImage Metadata Reader . read Metadata ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. directories ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name . contains (" thumbnail ", Ġignore Case Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRot ated Ġ 9 0 Ġis Ġthe Ġonly Ġone Ġsupported ĊĠĠĠĠĠĠĠ Ġorientation Ġ= Ġdirs . first OrNull Ġ{ Ġit . contains Tag ( Ex if Sub IF DD irectory . TAG _ OR IENTATION ) Ġ} ?. let Ġ{ Ġdir Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( dir . getInt ( Ex if Sub IF DD irectory . TAG _ OR IENTATION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 Ġ-> Ġ 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠMinimum Ġof Ġany Ġdate Ġfound ĊĠĠĠĠĠĠĠ Ġcreation Date Ġ= Ġdirs . map Ġ{ Ġdir Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Sub IF DD irectory . TAG _ DATETIME _ ORIGIN AL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Sub IF DD irectory . TAG _ DATETIME _ DIGIT IZED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Sub IF DD irectory . TAG _ DATETIME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). filter Ġ{ Ġdir . contains Tag ( it ) Ġ}. map NotNull Ġ{ Ġdir . getDate ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}. flatten (). min () Ġ?: ĠDate () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġactual Ġcontent , Ġun modified , Ġpossibly Ġmis - rot ated Ġor Ġthe Ġwrong Ġsize . Ġ Ġ( Don 't Ġset Ġthe Ġthumbnail 's Ġsize ) Ġ*/ ĊĠĠĠ Ġinternal Ġabstract Ġfun Ġget Frames (): ĠSequence < Thumb nails . Builder < Buffered Image >> ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġactual Ġlength . Ġ ĠHealth y Ġto Ġmemo ize Ġthis . Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget NumberOf Frames (): ĠInt ĊĊĠĠĠ Ġ/** ĠRepeat Ġframes Ġas Ġnecessary Ġto Ġreach Ġthe Ġapprox Ġlength Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Correct ed Frames ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Res : ĠDimension , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Length Min : ĠInt Ġ= Ġget NumberOf Frames (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Length Max : ĠInt Ġ= Ġ 2 Ġ* Ġframe Length Min ĊĠĠĠ Ġ): ĠSequence < Buffered Image > Ġ= Ġsequence Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠDuplicate Ġframes Ġeven ly Ġto Ġstretch Ġout Ġthe Ġvideo ĊĠĠĠĠĠĠĠ Ġval Ġd uplic ator Ġ= Ġif Ġ( getNumberOf Frames () Ġ< Ġframe Length Min ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduplicate Count Ġ= Ġframe Length Min Ġ/ Ġget NumberOf Frames () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( duplicate Count Ġ> Ġ 1 Ġ&& Ġget NumberOf Frames () Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . fine Ġ{ Ġ"${ file . name } Ġstretch ing Ġclip Ġby Ġ${ duplicate Count } x " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduplicate Count ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠFrame s Ġto Ġdrop Ġoff Ġthe Ġbeginning Ġif Ġthe Ġclip Ġis Ġtoo Ġlong ĊĠĠĠĠĠĠĠ Ġval Ġtrim From Beginning Ġ= Ġif Ġ( getNumberOf Frames () Ġ* Ġd uplic ator Ġ> Ġframe Length Max ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrim Ġ= Ġ( getNumberOf Frames () Ġ* Ġd uplic ator ) Ġ- Ġframe Length Max ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . fine Ġ{ Ġ"${ file . name } Ġtri mm ing Ġ$ trim Ġframes Ġfrom Ġbeginning Ġof Ġclip Ġ( after Ġduplication )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( trim Ġ> Ġframe Length Max Ġ* Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ"${ file . name } Ġtri mm ing Ġmore Ġthan Ġ 2 x Ġ($ trim Ġof Ġ${ getNumberOf Frames ()} Ġremoved Ġfrom Ġbeginning , Ġd uplic ator :$ d uplic ator )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrim ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġoutput Frame Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġget Frames (). forEach Ġ{ Ġt mb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġt Ġ= Ġt mb . size ( max Res . width , Ġmax Res . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ= Ġt . rotate ( orientation . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( d uplic ator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Frame ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Frame Ġ! in Ġ 0 .. trim From Beginning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( t . as Buffered Image () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠFor Ġsorting Ġby Ġdate Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠClip ): ĠInt Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . creation Date Ġ< Ġother . creation Date Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠ Ġthis . creation Date Ġ> Ġother . creation Date Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis . file . name Without Extension . toLowerCase (). compareTo ( other . file . name Without Extension . toLowerCase ()) ĊĠĠĠ Ġ} Ċ Ċ }