+
    Ci6                      a  0 t $ R t^ RIHt ^ RIt^ RIHtHt ^ RIHt ^ RI	H
t
 ^ RItRsR]R&   RsR]R	&   R
tRVR R lltR R ltR R ltRRRRRRRRRRRR/R R lltR R ltRWR R  lltR! R" ltR# R$ ltR% R& ltR'RR(RRR)/R* R+ lltR, R- ltR. R/ ltR0 R1 ltR2RR(RRR)/R3 R4 lltR5 R6 ltR7 R8 ltR9 R: lt R;RR<RR=RR>RR?RR@RRARRBRRCRRDRRERRFRG/RH RI llt!RJ RK lt"RL RM lt#RN RO lt$RP RQ lt%RR RS lt&RT RU lt'R# )Xu   
SQLite data access layer for the Video Production Pipeline.

Tables:
  projects – one row per pipeline run
  images   – one row per generated image (linked to project + scene)
)annotationsN)datetimetimezone)Path)AnyzPath | None_DB_PATHzaiosqlite.Connection | None_dba  
CREATE TABLE IF NOT EXISTS projects (
    id            TEXT PRIMARY KEY,
    status        TEXT NOT NULL DEFAULT 'pending',
    mode          TEXT NOT NULL DEFAULT 'plan',
    platform      TEXT NOT NULL DEFAULT 'tiktok',
    character     TEXT NOT NULL DEFAULT '',
    story_preview TEXT NOT NULL DEFAULT '',
    title         TEXT NOT NULL DEFAULT '',
    created_at    TEXT NOT NULL,
    result_json   TEXT
);

CREATE TABLE IF NOT EXISTS images (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    project_id    TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
    scene_number  INTEGER NOT NULL,
    image_prompt  TEXT NOT NULL DEFAULT '',
    file_path     TEXT NOT NULL DEFAULT '',
    status        TEXT NOT NULL DEFAULT 'pending',
    created_at    TEXT NOT NULL,
    updated_at    TEXT NOT NULL,
    UNIQUE(project_id, scene_number)
);

CREATE TABLE IF NOT EXISTS videos (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    project_id    TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
    scene_number  INTEGER NOT NULL,
    video_prompt  TEXT NOT NULL DEFAULT '',
    file_path     TEXT NOT NULL DEFAULT '',
    status        TEXT NOT NULL DEFAULT 'pending',
    created_at    TEXT NOT NULL,
    updated_at    TEXT NOT NULL,
    UNIQUE(project_id, scene_number)
);

CREATE TABLE IF NOT EXISTS characters (
    id                       TEXT PRIMARY KEY,
    name                     TEXT NOT NULL UNIQUE,
    physical_description     TEXT NOT NULL DEFAULT '',
    style_keywords           TEXT NOT NULL DEFAULT '[]',
    negative_keywords        TEXT NOT NULL DEFAULT '[]',
    hard_prohibitions        TEXT NOT NULL DEFAULT '[]',
    camera_settings          TEXT NOT NULL DEFAULT '',
    lighting_settings        TEXT NOT NULL DEFAULT '',
    pose_rule                TEXT NOT NULL DEFAULT '',
    environment_rule         TEXT NOT NULL DEFAULT '',
    clothing_rule            TEXT NOT NULL DEFAULT '',
    anatomical_highlight_rules TEXT NOT NULL DEFAULT '',
    thumbnail_path           TEXT NOT NULL DEFAULT '',
    is_default               INTEGER NOT NULL DEFAULT 0,
    created_at               TEXT NOT NULL,
    updated_at               TEXT NOT NULL
);
c                    V ^8  d   QhRRRR/# )   db_pathzstr | Path | NonereturnNone )formats   "I/home/gabslocked/Desktop/Projetos/Images/video_automation/web/database.py__annotate__r   O   s      ,      c                  "   V fW   \        \        4      P                  4       P                  P                  pVR,          pVP	                  RRR7       VR,          p \        V 4      s\
        P                  P	                  RRR7       \        P                  ! \        \
        4      4      G Rj  xL
 s	\        P                  \        n        \        P                  R4      G Rj  xL
  \        P                  R4      G Rj  xL
  \        P                  \        4      G Rj  xL
  \        P                  4       G Rj  xL
  R#  L Lb LG L( L5i)z9Initialise the database (create tables, enable WAL + FK).NdataT)parentsexist_okzpipeline.dbzPRAGMA journal_mode=WALzPRAGMA foreign_keys=ON)r   __file__resolveparentmkdirr   	aiosqliteconnectstrr   Rowrow_factoryexecuteexecutescriptSCHEMAcommit)r   project_rootdata_dirs   &  r   init_dbr&   O   s      H~--/66==&(td3]*G}HOO$6!!#h-0
0CmmCO
++/
000
++.
///


F
###
**, 10/#sZ   B-E/E05E%E&EE
 E#E$E?E EE
EEEc                   V ^8  d   QhRR/# )r
   r   zaiosqlite.Connectionr   )r   s   "r   r   r   d   s      * r   c                 <   "   \         f   \        R4      h\         # 5i)z&Return the shared database connection.u1   Database not initialised – call init_db() first)r   RuntimeErrorr   r   r   get_dbr*   d   s     
{NOOJs   c                   V ^8  d   QhRR/# )r
   r   r   r   )r   s   "r   r   r   k   s       r   c                 b   "   \         e!   \         P                  4       G Rj  xL
  Rs R# R#  L
5i)zClose the database connection.N)r   closer   r   r   close_dbr.   k   s(      iik s    /-/statusrunningmodeplanplatformtiktok	character story_previewtitlec               8    V ^8  d   QhRRRRRRRRRRRRRRR	R
/# )r
   idr   r/   r1   r3   r5   r7   r8   r   r   r   )r   s   "r   r   r   w   sZ        	
     
r   c                  "   \        4       G R j  xL
 p\        P                  ! \        P                  4      P                  4       pVP                  RWW#WEWh34      G R j  xL
  VP                  4       G R j  xL
  R #  Ln L  L
5i)NzINSERT INTO projects (id, status, mode, platform, character,
                                 story_preview, title, created_at)
           VALUES (?, ?, ?, ?, ?, ?, ?, ?)r*   r   nowr   utc	isoformatr    r#   )	r:   r/   r1   r3   r5   r7   r8   dbr=   s	   $$$$$$$  r   insert_projectrA   w   st      xB
,,x||
$
.
.
0C
**	. 
TYuJ	   ))+ 
 4   BA?AB B!B8B9BBBc               $    V ^8  d   QhRRRRRR/# )r
   
project_idr   r/   r   r   r   )r   s   "r   r   r      s!      C   r   c                   "   \        4       G R j  xL
 pVP                  RW34      G R j  xL
  VP                  4       G R j  xL
  R #  L9 L  L
5i)Nz+UPDATE projects SET status = ? WHERE id = ?)r*   r    r#   )rD   r/   r@   s   && r   update_project_statusrF      sL     xB
**57K   ))+	 
 s1   AA
AAAAAAAc               (    V ^8  d   QhRRRRRRRR/# )r
   rD   r   resultdict[str, Any]r8   r   r   r   )r   s   "r   r   r      s,      +47	r   c                J  "   \        4       G R j  xL
 p\        P                  ! V4      .pRpV'       d   VR,          pVP                  V4       VR,          pVP                  V 4       VP	                  WT4      G R j  xL
  VP                  4       G R j  xL
  R #  L L  L
5i)Nz#UPDATE projects SET result_json = ?z, title = ? WHERE id = ?)r*   jsondumpsappendr    r#   )rD   rH   r8   r@   paramssqls   &&&   r   update_project_resultrQ      s      xBF+,F
/C}e?C
MM*
**S
!!!
))+ 
 "s9   B#B$B#AB#>B?B#B!B#B#!B#c                    V ^8  d   QhRRRR/# )r
   rD   r   r   dict[str, Any] | Noner   )r   s   "r   r   r      s      # *? r   c                F  "   \        4       G R j  xL
 pVP                  RV 34      G R j  xL
 pVP                  4       G R j  xL
 pVf   R # \        V4      pVP	                  R4      '       d"   \
        P                  ! VR,          4      VR&   MR VR&   VR V#  L Lq L[5i)Nz#SELECT * FROM projects WHERE id = ?result_jsonrH   )r*   r    fetchonedictgetrL   loads)rD   r@   currowprojs   &    r   get_projectr]      s     xB

@:-P
PC
C
{9DxxD$78XX]K 

P
s2   B!BB!BB!BAB!B!B!c                    V ^8  d   QhRRRR/# )r
   rD   r   r   boolr   )r   s   "r   r   r      s      S T r   c                   "   \        4       G R j  xL
 pVP                  RV 34      G R j  xL
 pVP                  4       G R j  xL
  VP                  ^ 8  #  LF L- L5i)Nz!DELETE FROM projects WHERE id = ?r*   r    r#   rowcount)rD   r@   rZ   s   &  r   delete_projectrc      sM     xB

>N
NC
))+<<! 

N1   AAAAAAAAAc                   V ^8  d   QhRR/# r
   r   list[dict[str, Any]]r   )r   s   "r   r   r      s     # #1 #r   c                    "   \        4       G R j  xL
 p V P                  R4      G R j  xL
 pVP                  4       G R j  xL
 pV Uu. uF  p\        V4      NK  	  up#  LP L9 L#u upi 5i)NzSELECT id, status, mode, platform, character,
                  story_preview, title, created_at
           FROM projects ORDER BY created_at DESCr*   r    fetchallrW   r@   rZ   rowsrs       r   list_projectsrn      sa     xB

	5 C
 D!"TDGT"" 

  "C   A,A!A,A#A,A%A,
A'A,#A,%A,'A,image_prompt	file_path	generatedc               0    V ^8  d   QhRRRRRRRRRRRR	/# )
r
   rD   r   scene_numberintrp   rq   r/   r   r   r   )r   s   "r   r   r      F        	
   
r   c           
       "   \        4       G R j  xL
 p\        P                  ! \        P                  4      P                  4       pVP                  RWW#WFV34      G R j  xL
  VP                  4       G R j  xL
  R #  Ln L  L
5i)Na  INSERT INTO images (project_id, scene_number, image_prompt,
                               file_path, status, created_at, updated_at)
           VALUES (?, ?, ?, ?, ?, ?, ?)
           ON CONFLICT(project_id, scene_number)
           DO UPDATE SET image_prompt = excluded.image_prompt,
                         file_path = excluded.file_path,
                         status = excluded.status,
                         updated_at = excluded.updated_atr<   )rD   rt   rp   rq   r/   r@   r=   s   $$$$$  r   upsert_imagerx      t      xB
,,x||
$
.
.
0C
**	= 
<FM
 
 
 ))+ 

 rB   c               (    V ^8  d   QhRRRRRRRR/# r
   rD   r   rt   ru   r/   r   r   r   )r   s   "r   r   r      ,     
 

#&
03
	
r   c                
  "   \        4       G R j  xL
 p\        P                  ! \        P                  4      P                  4       pVP                  RW$W34      G R j  xL
  VP                  4       G R j  xL
  R #  Ll L  L
5i)NzaUPDATE images SET status = ?, updated_at = ?
           WHERE project_id = ? AND scene_number = ?r<   rD   rt   r/   r@   r=   s   &&&  r   update_image_statusr      n      xB
,,x||
$
.
.
0C
**	8	j/  
 ))+ 

 4   BA=ABA?B6B7B?BBc               (    V ^8  d   QhRRRRRRRR/# )r
   rD   r   rt   ru   rq   r   r   r   )r   s   "r   r   r      s,     
 

#&
36
	
r   c                
  "   \        4       G R j  xL
 p\        P                  ! \        P                  4      P                  4       pVP                  RW$W34      G R j  xL
  VP                  4       G R j  xL
  R #  Ll L  L
5i)NzzUPDATE images SET file_path = ?, status = 'generated', updated_at = ?
           WHERE project_id = ? AND scene_number = ?r<   )rD   rt   rq   r@   r=   s   &&&  r   update_image_pathr      sn      xB
,,x||
$
.
.
0C
**	8	2  
 ))+ 

 r   c                    V ^8  d   QhRRRR/# r
   rD   r   r   rg   r   )r   s   "r   r   r           
# 
# 
#1E 
#r   c                   "   \        4       G R j  xL
 pVP                  RV 34      G R j  xL
 pVP                  4       G R j  xL
 pV Uu. uF  p\        V4      NK  	  up#  LR L9 L#u upi 5i)NzSELECT id, project_id, scene_number, image_prompt,
                  file_path, status, created_at, updated_at
           FROM images WHERE project_id = ?
           ORDER BY scene_numberri   rD   r@   rZ   rl   rm   s   &    r   get_project_imagesr      h     xB

	$ 
 C D!"TDGT"" 
  "C   A.A#A.A%A.A'A.A) A.%A.'A.)A.video_promptc               0    V ^8  d   QhRRRRRRRRRRRR	/# )
r
   rD   r   rt   ru   r   rq   r/   r   r   r   )r   s   "r   r   r     rv   r   c           
       "   \        4       G R j  xL
 p\        P                  ! \        P                  4      P                  4       pVP                  RWW#WFV34      G R j  xL
  VP                  4       G R j  xL
  R #  Ln L  L
5i)Na  INSERT INTO videos (project_id, scene_number, video_prompt,
                               file_path, status, created_at, updated_at)
           VALUES (?, ?, ?, ?, ?, ?, ?)
           ON CONFLICT(project_id, scene_number)
           DO UPDATE SET video_prompt = excluded.video_prompt,
                         file_path = excluded.file_path,
                         status = excluded.status,
                         updated_at = excluded.updated_atr<   )rD   rt   r   rq   r/   r@   r=   s   $$$$$  r   upsert_videor     ry   rB   c                    V ^8  d   QhRRRR/# r   r   )r   s   "r   r   r   #  r   r   c                   "   \        4       G R j  xL
 pVP                  RV 34      G R j  xL
 pVP                  4       G R j  xL
 pV Uu. uF  p\        V4      NK  	  up#  LR L9 L#u upi 5i)NzSELECT id, project_id, scene_number, video_prompt,
                  file_path, status, created_at, updated_at
           FROM videos WHERE project_id = ?
           ORDER BY scene_numberri   r   s   &    r   get_project_videosr   #  r   r   c               (    V ^8  d   QhRRRRRRRR/# r{   r   )r   s   "r   r   r   0  r|   r   c                
  "   \        4       G R j  xL
 p\        P                  ! \        P                  4      P                  4       pVP                  RW$W34      G R j  xL
  VP                  4       G R j  xL
  R #  Ll L  L
5i)NzaUPDATE videos SET status = ?, updated_at = ?
           WHERE project_id = ? AND scene_number = ?r<   r~   s   &&&  r   update_video_statusr   0  r   r   c                    V ^8  d   QhRRRR/# )r
   r[   rI   r   r   )r   s   "r   r   r   A  s     	 	> 	n 	r   c                    \        V 4      pR FF  pVP                  VR4      p \        V\        4      '       d   \        P
                  ! V4      MTW&   KH  	  V#   \        P                  \        3 d	    . Y&    Kn  i ; i)z=Convert a character DB row to a dict with parsed JSON fields.z[]style_keywordsnegative_keywordshard_prohibitions)rW   rX   
isinstancer   rL   rY   JSONDecodeError	TypeError)r[   dkeyvals   &   r   _char_row_to_dictr   A  sr    S	AKeeC	(23(<(<TZZ_#AF L H $$i0 	AF	s   0AA=<A=physical_descriptionr   r   r   camera_settingslighting_settings	pose_ruleenvironment_ruleclothing_ruleanatomical_highlight_rulesthumbnail_path
is_defaultFc               T    V ^8  d   QhRRRRRRRRRRRRR	RR
RRRRRRRRRRRRRRR/# )r
   r:   r   namer   r   zlist[str] | Noner   r   r   r   r   r   r   r   r   r   r_   r   r   r   )r   s   "r   r   r   M  s     $ $$ $ 	$
 %$ ($ ($ $ $ $ $ $ !$$ $ $  
!$r   c                  "   \        4       G R j  xL
 p\        P                  ! \        P                  4      P                  4       pTP                  RYT\        P                  ! T;'       g    . 4      \        P                  ! T;'       g    . 4      \        P                  ! T;'       g    . 4      YgTYTY'       d   ^M^ W34      G R j  xL
  VP                  4       G R j  xL
  R #  L L  L
5i)Na  INSERT OR IGNORE INTO characters
           (id, name, physical_description, style_keywords, negative_keywords,
            hard_prohibitions, camera_settings, lighting_settings, pose_rule,
            environment_rule, clothing_rule, anatomical_highlight_rules,
            thumbnail_path, is_default, created_at, updated_at)
           VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?))
r*   r   r=   r   r>   r?   r    rL   rM   r#   )r:   r   r   r   r   r   r   r   r   r   r   r   r   r   r@   r=   s   $$$$$$$$$$$$$$  r   insert_characterr   M  s     " xB
,,x||
$
.
.
0C
**	F *JJ~++,JJ(..B/JJ(..B/	-GAC	
  " ))+' 
" sF   C0C*AC0.C0C0,C0C,C0#C.$C0,C0.C0c               $    V ^8  d   QhRRRRRR/# )r
   char_idr   updatesrI   r   r_   r   )r   s   "r   r   r   t  s!      C . T r   c                <  "   \        4       G Rj  xL
 pR FG  pW19   g   K  \        W,          \        4      '       g   K)  \        P                  ! W,          4      W&   KI  	  \
        P                  ! \        P                  4      P                  4       VR&   RP                  R V 4       4      p\        VP                  4       4      V .,           pVP                  RV R2V4      G Rj  xL
 pVP                  4       G Rj  xL
  VP                  ^ 8  #  EL L. L5i)z)Update one or more fields on a character.N
updated_atz, c              3  *   "   T F	  q R 2x  K  	  R# 5i)z = ?Nr   ).0ks   & r   	<genexpr>#update_character.<locals>.<genexpr>|  s     7w!S:ws   zUPDATE characters SET rK   r   )r*   r   listrL   rM   r   r=   r   r>   r?   joinvaluesr    r#   rb   )r   r   r@   r   
set_clausevalsrZ   s   &&     r   update_characterr   t  s     xBK>jt<<::gl3GL L %LL6@@BGL7w77J !WI-D


 M:D C ))+<<! 
 s?   DDDD B)D)D*DDDDDc                    V ^8  d   QhRRRR/# )r
   r   r   r   r_   r   )r   s   "r   r   r     s      C D r   c                   "   \        4       G R j  xL
 pVP                  RV 34      G R j  xL
 pVP                  4       G R j  xL
  VP                  ^ 8  #  LF L- L5i)Nz#DELETE FROM characters WHERE id = ?ra   )r   r@   rZ   s   &  r   delete_characterr     sM     xB

@7*M
MC
))+<<! 

Mrd   c                    V ^8  d   QhRRRR/# )r
   r   r   r   rS   r   )r   s   "r   r   r     s     3 3 3)> 3r   c                   "   \        4       G R j  xL
 pVP                  RV 34      G R j  xL
 pVP                  4       G R j  xL
 pV'       d   \        V4      # R #  LL L3 L5i)Nz%SELECT * FROM characters WHERE id = ?r*   r    rV   r   )r   r@   rZ   r[   s   &   r   get_characterr     sP     xB

BWJO
OC
C%(S!2d2 

O
7   A#AA#AA#A!A#A#A#!A#c                    V ^8  d   QhRRRR/# )r
   r   r   r   rS   r   )r   s   "r   r   r     s     3 3c 3.C 3r   c                   "   \        4       G R j  xL
 pVP                  RV 34      G R j  xL
 pVP                  4       G R j  xL
 pV'       d   \        V4      # R #  LL L3 L5i)Nz'SELECT * FROM characters WHERE name = ?r   )r   r@   rZ   r[   s   &   r   get_character_by_namer     sP     xB

DtgN
NC
C%(S!2d2 

N
r   c                   V ^8  d   QhRR/# rf   r   )r   s   "r   r   r     s     0 03 0r   c                    "   \        4       G R j  xL
 p V P                  R4      G R j  xL
 pVP                  4       G R j  xL
 pV Uu. uF  p\        V4      NK  	  up#  LP L9 L#u upi 5i)Nz;SELECT * FROM characters ORDER BY is_default DESC, name ASC)r*   r    rj   r   rk   s       r   list_charactersr     sa     xB

E C D*./$Qa $// 
  /ro   c                   V ^8  d   QhRR/# )r
   r   ru   r   )r   s   "r   r   r     s        s  r   c                    "   \        4       G R j  xL
 p V P                  R4      G R j  xL
 pVP                  4       G R j  xL
 pV'       d
   V^ ,          # ^ #  LH L1 L5i)NzSELECT COUNT(*) FROM characters)r*   r    rV   )r@   rZ   r[   s      r   character_countr     sJ     xB

<=
=C
C3q6a 

=
s7   AAAAAAAAAA)N)r6   )(__conditional_annotations____doc__
__future__r   rL   r   r   pathlibr   typingr   r   r   __annotations__r   r"   r&   r*   r.   rA   rF   rQ   r]   rc   rn   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   s   @r   <module>r      s   #  '   + #'  '7
t*  	
    *# 	
  0


#" 	
  0
#
"	$ !#	$
 (,$ +/$ +/$ $  $ $ $ $ ')$ $ $N"330 r   