+
    #jU/                        R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtH	t	 R9R lt
R9R ltR tR tR tR tR	 tR
 tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR t R t!R t"R t#R. R:OR!RR".R#R$R".R%R$.R&R'R(.R)R R.R*R"R.R+R'R,.R-R.R".R/R0R".R1R2R".R3R4R$./t$R]]3R]]3R ]]3R$]]3R"]]3R']]3R,]]3R.]]3R0]]3R2]]3R(] ]!3R4]"]#3/t%R5 t&R;R6 lt'R7 t(])R88X  d
   ](! 4        R# R# )<u  Pixel art video — overlay procedural animations onto a source image.

Takes any image (typically pre-processed with pixel_art()) and overlays
animated pixel effects (stars, rain, fireflies, etc.), then encodes to MP4
(and optionally GIF) via ffmpeg.

Scene animations ported from pixel-art-studio (MIT) — see ATTRIBUTION.md.
The generative/Pollinations code is intentionally dropped — Hermes uses
`image_generate` + `pixel_art()` for base frames instead.

Usage (import):
    from pixel_art_video import pixel_art_video
    pixel_art_video("frame.png", "out.mp4", scene="night", duration=6)

Usage (CLI):
    python pixel_art_video.py frame.png out.mp4 --scene night --duration 6 --gif
N)Image	ImageDrawc                    \        V4      \        V4      r!V P                  P                  w  rV^ Tu;8:  d   V8  dL   M R# ^ Tu;8:  d   V8  d7   M R# V P                  WW,           ^,
          W$,           ^,
          .VR7       R# R# R# )    )fillN)intimsize	rectangle)drawxycolorr	   WHs   &&&&&  k/opt/hermes-venv/lib/python3.14/site-packages/../../../skills/creative/pixel-art/scripts/pixel_art_video.py_pxr      sc    q63q6q77<<DAAzzza1jqjjahlAHqL9F !z    c                     \        V4      \        V4      r!\        V) V^,           4       F+  p\        WV,           W#^4       \        WW%,           V^4       K-  	  R# )   N)r   ranger   )r   r   r   r   armis   &&&&& r   _pixel_crossr   &   sH    q63q6qC4q!Da%1%DQUE1% "r   c           	          \        ^4       Uu. uF-  q0P                  ^ V4      V P                  ^ V^,          4      3NK/  	  up# u upi )   )r   randintrngr   r   _s   &&& r   
init_starsr    /   s;    AFrKA[[AAqAv 67KKKs   3Ac           	          \        V4       FI  w  pw  rg\        P                  ! VR ,          VR,          ,           4      R8  g   K:  \        WVR^R7       KK  	  R# )       @ffffff?g?r   N)   r%      )	enumeratemathsinr   )r   starstr   r   r   sxsys   &&&&&   r   
draw_starsr.   2   sC     '8B88AGa#g%&-2A> (r   c                     \        ^
4       Uu. uFb  pRV P                  ^V^,
          4      RV P                  V^,          V^,
          4      RV P                  ^ R4      RV P                  RR4      /NKd  	  up# u upi )
   r   r   phaseQ@speed333333?皙?r   r   uniformr   s   &&& r   init_firefliesr8   8   sz     2Y  #++b!b&)3AFAF0Kckk!T*GS[[c5JL     s   A(A9c                    V F  p\         P                  ! VR ,          VR,          ,           4      R8  d   K5  \        V VR,          \         P                  ! W%R,          ,          VR,          ,           4      ^,          ,           VR,          \         P                  ! W%R,          ,          R,          4      ^,          ,           R^4       K  	  R# )	      ?r1   g333333?r   r3   r   r#   N)   r%   d   )r(   r)   r   cos)r   ffr+   r   r   fs   &&&&& r   draw_firefliesr@   =   s    88AGaj()D0DcFTXXaG*nqz9:Q>>cFTXXaG*ns23a77Q	  r   c                    \        ^4       Uu. uFs  pRV P                  ^ V4      RV P                  V) ^ 4      RV P                  RR4      RV P                  RR4      R	V P                  ^ R
4      RV P                  . RO4      /NKu  	  up# u upi )   r   r   r3         ?r:   wobbleg{Gz?g?r1   r2   r   ))   x   2   )   r<   (   )r;      <   r   r   r7   choicer   s   &&& r   init_leavesrN   G   s    
 2Y	  	 #++a#S#++qb!*<ckk#s+Xs{{47Nckk!T*cjj!QRT 	     s   A9B
c           
      :   V F  p\        V VR ,          \        P                  ! W%R,          ,          VR,          ,           4      ^,          ,           VR,          W%R,          ,          ^,          ,           V^(,           ,          ^,
          VR,          ^4       K  	  R# )r   rD   r1   r   r3   r   N)r   r(   r)   )r   leavesr+   r   r   leafs   &&&&& r   draw_leavesrR   N   so    DI(^!3d7m!CDrII#Y']*R//AF;b@M1	 r   c                    \        ^4       Uu. uFm  pRV P                  ^V^,
          4      RV P                  ^V^,
          4      RV P                  ^ R4      RV P                  RR4      RV P                  ^^4      /NKo  	  up# u upi )	   r   r   r1   r2   r3   皙?rC   ampr6   r   s   &&& r   init_dust_motesrW   V   s     16b	;091 #++b!b&)3BB0Gckk!T*GS[[c5JCKK1%'09; ; ;s   A3Bc           
      x   V F  p\         P                  ! VR ,          VR,          ,           4      R8  g   K5  \        V VR,          \         P                  ! VR,          VR,          ,           4      VR,          ,          ,           VR,          VR,          V,          ^,          V,          ,
          R^4       K  	  R# )	r"   r1   r4   r   rV   r   r3   N)r%      r<   r(   r)   r   )r   motesr+   r   r   ms   &&&&& r   draw_dust_motesr]   [   s    88AGaj()C/#!c'AgJ"67!E(BB#!G*q.2-22$ r   c           
          \        ^
4       Uu. uFt  pV P                  V^,          ^V,          ^,          4      V P                  V^,          ^V,          ^,          4      V P                  ^ R4      V P                  . RO4      3NKv  	  up# u upi )r0   r2   ))rE   r;   r%   )r%   r&      )r;   rE   r%   rL   r   s   &&& r   init_sparklesr`   d   s     2Y   [[aQ!,ckk!q&!a%1*.M[[D!ZZKLN      s   A:Bc           	          V F?  w  rVrx\         P                  ! VR ,          V,           4      R8  g   K1  \        WWh^R7       KA  	  R# )g?333333?r$   Nr(   r)   r   )	r   sparklesr+   r   r   r,   r-   r1   r   s	   &&&&&    r   draw_sparklesre   j   s6     (88AGeO$s*2!4 !)r   c                     \        ^4       Uu. uF;  pRV P                  ^ V4      RV P                  ^ V4      RV P                  ^^4      /NK=  	  up# u upi )   r   r   r3   r6   r   s   &&& r   	init_rainrh   p   s\    27)=2;Q #++a#S#++a*;ckk!Q')2;= = =s   AAc                     V F_  pVR ,          W%R,          ,          ^,          ,           V,          p\        WR,          VR^4       \        WR,          V^,           R^4       Ka  	  R# )r   r3   r   N)rF   r_   r;   )r<      rE   )r   )r   rainr+   r   r   rr   s   &&&&&  r   	draw_rainrm   t   sR    sVaG*nr))Q.DC&!_a0DC&!a%!4 r   c                     R ^ RRRV /# )timerflashFr    )r   r   r   s   &&&r   init_lightningrr   {   s    Qs33r   c           	      z   VR ;;,          ^,          uu&   VR ,          ^-8  d'   VR,          P                  4       R8  d   RVR&   ^ VR &   VR,          '       dc   \        ^ V^4       FJ  p\        ^ V^,          ^4       F/  pVR,          P                  4       R8  g   K!  \        WVR^4       K1  	  KL  	  RVR&   R# R# )	ro   r   {Gz?Trp   gQ?FN)r%   r%      )randomr   r   )r   stater+   r   r   r   r   s   &&&&&  r   draw_lightningrx   ~   s    	'NaNW~uU|224t;ggW~~q!QA1a1fa(<&&(4/OQ7 )   g r   c                     \        ^4       Uu. uF[  pRV P                  ^V^,
          4      RV P                  W"^,          4      RV P                  RR4      RV P                  . RO4      /NK]  	  up# u upi )r   r   r   r3   r4   r5   r	   )r      rz   rL   r   s   &&& r   init_bubblesr{      sr     2Y  #++b!b&)3A1u0Eckk#s+VSZZ	5JL     s   A!A2c           	      P   V F  pVR ,          \         P                  ! VR,          VR ,          ,           4      ^,          ,           pVR,          W%R,          ,          ^,          V^(,           ,          ,
          p^ Tu;8  d
   V8  g   K  M K  \        WVRVR,          4       K  	  R# )r   rC   r   r3   r	   N)r_   r;   r%   rZ   )r   bubblesr+   r   r   br   r   s   &&&&&   r   draw_bubblesr      sv    cFTXXa#g#./!33cFaG*nr)a"f55q9199OQvY7	 r   c                     \        ^4       Uu. uF`  pRV P                  ^ V4      RV P                  ^ V4      RV P                  RR4      RV P                  ^ R4      RV P                  . R	O4      /NKb  	  up# u upi )
   r   r   r3   r4   g?r1   r2   r   ))r%   r_   rg   )r%   r<   rT   )r%   r;   rG   rL   r   s   &&& r   init_embersr      s     2Y   #++a#S#++a*;ckk#s+Wckk!T6Jcjj!QRT      s   A&A7c                 z   V F  pVR ,          \         P                  ! VR,          VR,          ,           4      ^,          ,           pVR,          W%R,          ,          ^,          V,          ,
          p\         P                  ! VR,          VR,          ,           4      R8  g   K  \        WWuR,          ^4       K  	  R# )	r   g?r1   r   r3         @rU   r   NrZ   )r   embersr+   r   r   er   r   s   &&&&&   r   draw_embersr      s    cFTXXa#g'
23a77cFaG*nr)Q..88AGaj()C/gJ*	 r   c                     \        ^(4       Uu. uFa  pRV P                  ^ V4      RV P                  V) ^ 4      RV P                  RR4      RV P                  RR4      R	V P                  . R
O4      /NKc  	  up# u upi )rI   r   r   r3   r4   rb   rD   rt   g
ףp=
?r	   )rz   rz      rL   r   s   &&& r   init_snowflakesr      s     2Y   #++a#S#++qb!*<ckk#s+Xs{{47NSZZ	*,      s   A'A8c           	      p   V F  pVR ,          \         P                  ! W%R,          ,          VR ,          ,           4      ^,          ,           pVR,          W%R,          ,          ^,          ,           V^,           ,          ^
,
          pVR,          ^8  d   \        WVR^R7       K  \        WVR^4       K  	  R# )r   rD   r   r3   r	   r$   N)      r%   )r(   r)   r   r   )r   flakesr+   r   r   r?   r   r   s   &&&&&   r   draw_snowflakesr      s    cFTXXaH+o#67"<<sVaG*nq((QV4r9V9>!_!<OQ/ r   c           
          \        ^4       Uu. uFJ  pV P                  ^ V4      V P                  ^ V4      V P                  ^ R4      V P                  . RO4      3NKL  	  up# u upi )   r2   ))r%   r   r;   )r   r%   r%   )r%   rG   r_   rL   r   s   &&& r   init_neon_pulser      se     1X [[AAq 13;;q$3GZZFGI  s   AA!c           	          V F?  w  rVrx\         P                  ! VR ,          V,           4      R8  g   K1  \        WWh^R7       KA  	  R# )r   rC   r$   Nrc   )	r   pointsr+   r   r   r   r   r1   r   s	   &&&&&    r   draw_neon_pulser      s6    $e88AGeO$s*!2 %r   c                     \        ^4       Uu. uFB  pRV P                  ^ V4      RV P                  V^,          V4      RV P                  ^ R4      /NKD  	  up# u upi )rB   r   r   r1   r2   r6   r   s   &&& r   init_heat_shimmerr      sd    5:2Y@5> #++a#S#++a1fa*@ckk!T*,5>@ @ @s   AAc                    V F  pVR ,          \         P                  ! VR,          VR,          ,           4      ^,          ,           pVR,          \         P                  ! VR,          VR,          ,           4      ^,          ,           p\        \         P                  ! VR,          VR,          ,           4      4      R8  g   K  \        WVR^4       K  	  R# )	r   r5   r1   r   g333333?r:   rb   N)r%   r;   r<   )r(   r)   absr   )r   r   r+   r   r   pr   r   s   &&&&&   r   draw_heat_shimmerr      s    cFTXXa#g'
23a77cFTXXa#g'
23a77txxC!G*,-.4OQ/	 r   nightr*   	firefliesrP   duskrd   tavern
dust_motesindoorurbanrk   
neon_pulsenaturemagicstorm	lightning
underwaterr}   firer   snow
snowflakesdesertheat_shimmerc                  L    \         P                  ! R 4      f   \        R4      hR# )ffmpegNz_ffmpeg not found on PATH. Install via your package manager or download from https://ffmpeg.org/)shutilwhichRuntimeErrorrq   r   r   _ensure_ffmpegr      s(    ||H%0
 	
 &r   c                p   V\         9  d    \        RV: R\        \         4       24      h\        4        \        P
                  ! V 4      P                  R4      pVP                  w  r\        P                  ! Ve   TM^*4      p
. p\         V,           F+  p\        V,          w  rVP                  W! WV	4      34       K-  	  WC,          p\        P                  ! \        P                  P                  \        P                  P!                  V4      4      ;'       g    RRR7       \"        P$                  ! RR	7      ;_uu_ 4       p\'        V4       F}  pVP)                  4       p\*        P,                  ! V4      pVV,          pV F  w  ppV! VVVW4       K  	  VP/                  \        P                  P1                  VR
VR R24      4       K  	  \2        P4                  ! RRRRR\7        V4      R\        P                  P1                  VR4      RRRRRRV.RR7       RpV'       dm   VP9                  R^4      ^ ,          R,           p\2        P4                  ! RRRRR\7        V4      R\        P                  P1                  VR4      RRRRV.RR7       RRR4       VV3#   + '       g   i     TX3# ; i) a  Overlay pixel animations onto a base image and encode to MP4.

Args:
    base_image: path to source image (ideally already pixel-art styled)
    output_path: path to MP4 output (GIF sibling written if export_gif=True)
    scene: key from SCENES (night, urban, storm, snow, fire, ...)
    duration: seconds of animation
    fps: frames per second (default 15 for retro feel)
    seed: optional int for reproducible animation placement
    export_gif: also write a GIF alongside the MP4

Returns:
    (mp4_path, gif_path_or_None)
zUnknown scene z. Choose from: RGBN.T)exist_okpixelart_frames_)prefixframe_04dz.pngr   z-yz	-loglevelerrorz
-frameratez-izframe_%04d.pngz-c:vlibx264z-pix_fmtyuv420pz-crf18)checkz.gifz-vfzMscale=320:-1:flags=neighbor,split[s0][s1];[s0]palettegen[p];[s1][p]paletteusez-loop0)SCENES
ValueErrorsortedr   r   openconvertr	   rv   Random_LAYERSappendosmakedirspathdirnameabspathtempfileTemporaryDirectoryr   copyr   Drawsavejoin
subprocessrunstrrsplit)
base_imageoutput_pathscenedurationfpsseed
export_gifbaser   r   r   layersnameinit_fndraw_fnn_frames
frames_dir	frame_idxcanvasr   r+   rw   gif_paths   &&&&&&&                r   pixel_art_videor      sT   . FUI_VF^4DE
 	
 ::j!))%0D99DA
-- 0b
9CFu"4=w 234  ~HKK <=DDtT		$	$,>	?	?:xIYY[F>>&)DCA"(eQ- #)KKZ6)C1MNO ) 	t['3s8277<<
,<=Y
Ivt	
 	
 "))#q1!4v=HNN4gs3xrww||J0@A`# 	+ 
@@   A 
@	?@   s   EJ""J5	c            
         ^ RI p V P                  RR7      pVP                  R4       VP                  R4       VP                  RR\        \        4      R7       VP                  R	\
        ^R
7       VP                  R\
        ^R
7       VP                  R\
        RR
7       VP                  RRR7       VP                  4       p\        VP                  VP                  VP                  VP                  VP                  VP                  VP                  R7      w  r4\        RV 24       V'       d   \        RV 24       R# R# )r   Nu/   Overlay pixel animations onto an image → MP4.)descriptionr   outputz--scener   )defaultchoicesz
--duration)typer   z--fpsz--seedz--gif
store_true)action)r   r   r   r   r   zWrote )argparseArgumentParseradd_argumentr   r   r   
parse_argsr   r   r   r   r   r   r   gifprint)r   r   argsmp4r   s        r   mainr   C  s    ,]^ANN< NN8NN9gvf~NFNN<c1N5NN7bN1NN8#tN4NN7<N0<<>Djj4==HH499HC
 
F3%.
sen r   __main__)rz   )r*   r   rP   )r      r   NF)*__doc__r(   r   rv   r   r   r   PILr   r   r   r   r    r.   r8   r@   rN   rR   rW   r]   r`   re   rh   rm   rr   rx   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __name__rq   r   r   <module>r     s  $  	      
G&L? 
  ;
$ 5=54
 
8 + 0
3@0 2
;
+<,<.6<(8[):{+6;'9j)
8Z(
<,><0
" Z,^^4[+._o6]M2
Y	*^^4\<0[+._o6_o6&(9: 
I!X* zF r   