
    [1^jH@                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
Z	d dlmZ d dlmZ  ed          ZdZdZdZ ej                    d	z  d
z  dz  ZdZdZ ed          ZddgZedz  dz  Zedz  dz  dz  Zedz  dz  Zedz  dz  Zedz  ZdAdZdBdZdCd Z dDd#Z!dEd%Z"dFd)Z#dGd,Z$dHd.Z%dId1Z&dId2Z'dJd4Z(dKd7Z)dLd9Z*dMd:Z+dNd<Z,dOd>Z-dCd?Z.e/d@k    r e.             dS dS )P    )annotationsN)Path)ZoneInfozE/data/video-pipeline/HaTramAudio/project/013-Ngay-Buu-Cuc-Cu-Sang-Denz013-Ngay-Buu-Cuc-Cu-Sang-Denzrun-20260720T110344Z-f6c08be9zoroz.configzha-tram-audioz
postiz.envcmrijlulx000jj7c8jo4ybyn6cmrhxbsdv000bj7c868iio3c7Asia/Ho_Chi_Minh)	      )   r   outputzfinal-upload.mp4image
normalizedzintro-poster-1920x1080.pngzinfo.txtlogzpublish-ready.jsonreturnstrc                     t           j                             t           j        j                                                                      dd          S )N+00:00Z)datetimenowtimezoneutc	isoformatreplace     \/data/video-pipeline/HaTramAudio/project/013-Ngay-Buu-Cuc-Cu-Sang-Den/work/publish_postiz.pyr   r      s<      !2!677AACCKKHVYZZZr   pathr   c                   t          j                    }|                     d          5 t          fdd          D ]}|                    |           	 d d d            n# 1 swxY w Y   |                                S )Nrbc                 .                          d          S )Ni   )read)fs   r   <lambda>zsha.<locals>.<lambda>&   s    !&&"9"9 r   r   )hashlibsha256openiterupdate	hexdigest)r   hblockr$   s      @r   shar.   #   s    A	4 A99993?? 	 	EHHUOOOO	               ;;==s   ,A##A'*A'Nonec                    t          j        t          dz                      d                    } t          t
          t          dd                                D ]0\  }}|                     |          |k    rt          d|           1d S )Nz.ownership-lock.jsonutf-8encodingactive)
project_idrun_idownerstatuszownership mismatch: )
jsonloadsROOT	read_text
PROJECT_IDRUN_IDOWNERitemsgetRuntimeError)lockkeyvalues      r   guardrF   +   s    :t44???QQRRD%/6E]effllnn = =
U88C==E!!;c;;<<< "= =r   rE   dictc                   t                       |                     d| j        z   dz             }|                    dd          5 }t	          j        ||dd           |                    d	           |                                 t          j	        |
                                           d d d            n# 1 swxY w Y   t          j        ||            d S )
N.z.tmpwr1   r2   F   )ensure_asciiindent
)rF   	with_namenamer(   r9   dumpwriteflushosfsyncfilenor   )r   rE   tmpr$   s       r   atomic_jsonrX   2   s    	GGG
..ty61
2
2C	#	(	( A	%q9999					
	              
 JsDs   A(B::B>B>dict[str, str]c                    t          t          j                  t                              d                                          D ]} |                                 }|r|                    d          sd|vr2|                    dd          \  }}	                    |                                |                                                    d                     g d}fd|D             }|r%t          d	d
                    |          z             d         t          k    sd         t          k    rt          d          d         dk    rt          d          S )Nr1   r2   #=   z"')POSTIZ_BASE_URLPOSTIZ_API_KEYPOSTIZ_FACEBOOK_INTEGRATION_IDPOSTIZ_YOUTUBE_INTEGRATION_IDPOSTIZ_TIMEZONEPOSTIZ_SLOTSc                >    g | ]}                     |          |S r   rA   ).0rD   valuess     r   
<listcomp>zload_env.<locals>.<listcomp>F   s(    >>>sfjjoo>s>>>r   z!missing Postiz config variables: z, r`   ra   zPostiz integration IDs mismatchrb   r	   zPostiz timezone mismatch)rG   rT   environCONFIGr<   
splitlinesstrip
startswithsplit
setdefaultrB   joinFBYT)rawlinerD   rE   requiredmissingrg   s         @r   load_envrw   =   sn   "*F11<<>> C Cyy{{ 	ts++ 	s$ZZQ''
U#))++u{{}}':':5'A'ABBBB [  [  [H>>>>h>>>G U>7ASASSTTT./255@_9`df9f9f<=== $6665666Mr   baserD   dict | listc                8   t           j                            |                     d          |z   |dd          }t           j                            |d          5 }t          j        |                                          cd d d            S # 1 swxY w Y   d S )N/application/json)AuthorizationAccept)headers-   timeout)urllibrequestRequestrstripurlopenr9   r:   r#   )rx   rD   r   r   responses        r   api_getr   P   s    n$$T[[%5%5%<X[gyFzFz${{G					4	4 +z(--//**+ + + + + + + + + + + + + + + + + +s   &BBBpayloadtuple[int, dict | list]c                   t           j                            |                     d          |z   t	          j        |d                              d          |dddd          }t           j                            |d	
          5 }|j        t	          j	        |
                                          fcd d d            S # 1 swxY w Y   d S )Nr{   FrL   r1   r|   )r}   zContent-Typer~   POST)datar   methodZ   r   )r   r   r   r   r9   dumpsencoder   r8   r:   r#   )rx   rD   r   r   r   r   s         r   api_postr   V   s    n$$C4Ze444;;GDD"%7IUghh	 %  G 
				4	4 <
8==?? ; ;;< < < < < < < < < < < < < < < < < <s   -C  CC
list[dict]c                    t          | t                    r|                     dg           }n| }t          |t                    r|ng S )Nposts)
isinstancerG   rA   list)rE   r   s     r   parse_postsr   a   sG    % 		'2&&ud++3553r   post
str | Nonec                    |                      d          }t          |t                    r|                     d          n|                      d          S )NintegrationidintegrationId)rA   r   rG   )r   r   s     r   post_integration_idr   i   sF    ((=))K$.{D$A$A`;??4   txxP_G`G``r   c                V    |                      d          p|                      d          S )NpublishDatedatere   )r   s    r   	post_dater   n   s%    88M""6dhhv&6&66r   datetime.datetimec                $   |                      d          r| d d         dz   } t          j                            |           }|j        %|                    t          j        j                  }|                    t          j        j                  S )Nr   r   )tzinfo)endswithr   fromisoformatr   r   r   r   
astimezone)rE   parseds     r   normalized_utcr   r   sy    ~~c &crc
X%,,U33F}x'8'<==X.2333r   startendc                   t           j                            |                    t          j        j                                                                      dd          |                    t          j        j                                                                      dd          d          }t          t          | |d|z                       S )Nr   r   )	startDateendDatez/posts?)r   parse	urlencoder   r   r   r   r   r   r   r   )rx   rD   r   r   paramss        r   calendarr   {   s    \##%%h&7&;<<FFHHPPQY[^__>>("3"788BBDDLLXWZ[[% %  F wtS)f*<==>>>r   tuple[datetime.datetime, dict]c           	        t           j                             t                    }|                    t           j        j                  t          j        d          z
  }|t          j        d          z   }t          | |||          }t          t                      t          t                      i}d}|D ]}t          |          }	t          |                    dd                                                    }
t          |          }|	|vr|dz  }_|
d	vs|sf||	                             t#          |                     g }t%          d
          D ]}|t          j        |          z                                   }t(          D ]Y\  }}t           j                             |t          j        ||          t                    }||k    r|                    |           Z|D ]~}|                    t           j        j                  }||t                   vrI||t                   vr:|t1          |t                             t1          |t                             |dfc S t3          d          )N   minutes   )daysr   state r]   >   QUEUE	PUBLISHED   )facebook_occupied_countyoutube_occupied_countother_posts_ignoredzno common slot found in 31 days)r   r   TZr   r   r   	timedeltar   rq   setrr   r   r   rA   upperr   addr   ranger   SLOTScombinetimeappendlenrB   )rx   rD   	local_nowr   r   r   occupiedotherr   iidr   raw_date
candidates
day_offsetdayhourminute	candidater   s                      r   	find_slotr      sk   !%%b))I  !2!677(:LUV:W:W:WWE
($"---
-CT3s++ECEE2suu%HE 	4 	4!$''DHHWb))**0022T??hQJE...h..223333JBii - -
8-:>>>>DDFF! 	- 	-LD& )11#x}T67R7RTVWWI9$$!!),,,	-   X X	""8#4#899hrl""s(2,'>'>#hrl:K:Kgjkstvkwgxgx  RW  X  X  X  X  X  X
8
9
99r   c                   d|                      d           d| d| d}t          j        g d|dt          j        t          j        d	          }|j        d
k    rt          d|j        dd          z             t          j        |j	                  }t          |t                    r|                    d|          n|}t          |t                    r|r|d
         ni }t          |t                    r*|                    d          r|                    d          st          d          |d         |d         dS )Nzurl = "r{   z"/upload"
header = "Authorization: z4"
header = "Accept: application/json"
form = "file=@z#"
silent
show-error
fail-with-body
)curlz--config-Ti  )inputtextstdoutstderrr   r   zPostiz upload failed: ir   r   r   z,Postiz upload response missing media id/path)r   r   )r   
subprocessrunPIPE
returncoderB   r   r9   r:   r   r   rG   rA   r   )rx   rD   r   cfgresultrE   medias          r   uploadr      sf    rDKK$$  r  r  r  r  EI  r  r  rC^!!!  F A3fmDEE6JJKKKJv}%%E(25$(?(?JEIIfe$$$UE% *!)areT"" K%))D// K6ARAR KIJJJ+uV}555r   tuple[str, str]c                 :   t                               d                                          } |                     d          \  }}}dt	          |          cxk    rdk    rn n|                                st          d          ||                                fS )Nr1   r2   z

rK   d   z*metadata title/description contract failed)INFOr<   rl   	partitionr   rB   )r   title_descriptions       r   
parse_infor      s    >>7>++1133D NN622E1kU""""s""""";+<+<+>+>"GHHH+##%%%%r   	list[str]c                z    g fd |            t          t                                                  S )Nc                   t          | t                    rt          |                     d          t                    rC|                     d                              d          r                    | d                    |                                 D ]} |           d S t          | t                    r| D ]} |           d S d S )Nr   cm)r   rG   rA   r   rm   r   rg   r   )itemchildfoundwalks     r   r   zresponse_post_ids.<locals>.walk   s    dD!! 	$((4..#.. )488D>>3L3LT3R3R )T$Z(((  U d## 	  U	 	 r   )r   rG   fromkeys)rE   r   r   s    @@r   response_post_idsr      sP    E      	DKKKe$$%%%r   c                    t                       t          j        t                              d                    } |                     d          t          k    sN|                     d          t          k    s0|                     d          dk    s|                     d          durt          d	          | d
         }t          t          d                                D ]6\  }}t          |          ||         d         k    rt          d|           7t                                          j        dk    rt          d          t          j        t          dz  dz                      d                    }t          t                     }|                    d          |k    s,|                    d          |                     d          k    rt          d          t#                      }|d         |d         }}t%          ||d          }	t'          |	t(                    r|	                    d          durt          d          t%          ||d          }
t'          |
t(                    r|
                    d|
          n|
}t'          |t*                    st          d          d |D             }t,          t.          fD ]2}||vs||                             d          du rt          d          3t1          ||          \  }}t3          t4          d z  d!t          t          d"d|                                |                    t:          j        j                                                                       d#d$          d%|d&tC                      i           t          t                    }t4          d'z  }|"                                rt          j        |                    d                    }|                    d(          |k    s5|                    d)          t                                          j        k    rt          d*          |d+         }n|tG          ||t                    }t3          |d!t          t          d,d| d         tI          t                    |t                                          j        |tC                      d-           t4          d.z  }|"                                rt          j        |                    d                    }|                    d(          |k    s5|                    d)          t                                           j        k    rt          d/          |d+         }n|tG          ||t                     }t3          |d!t          t          d,d| d         tI          t                     |t                                           j        |tC                      d-           t1          ||          \  }}|                    t:          j        j                                       d01          }tK                      \  }}d2|                                                     d#d$          d3g d4t,          i||gd5gd6d7id8d4t.          i||gd5gd9|d:d;|g d<d8gd=}t          j&        |d3d>          }t          j        |          }tO          |                    d?g                     d@k    s"dA |d?         D             t,          t.          hk    rt          dB          tQ          j)        t          | d         z   t          z   |d4         z   |z   |z   t,          z   t.          z   *                                          +                                }t4          dCz  } | "                                r_t          j        |                     d                    }!|!                    dD          |k    rt          dE          t          dF          t3          | i dGd!dt          dt          ddHdd3dD|d| d         dI|                                dJ|dK         dLtQ          j)        |*                                          +                                dM|dN|dO|d4         dP|d4         dQ|d&tC                                 tY          ||dR|          \  }"}#t[          |#          }$t]          |||t;          j/        dST          z
  |t;          j/        dST          z             }%g }&|%D ]}'ta          |'          }tc          |'          }(|t,          t.          hv r|(rte          |(          |k    rytI          |'                    dUdV                    3                                dWk    r@|&4                    |'                    d4          ||'                    dU          |(dX           t,          d0t.          d0i})|&D ]}*|)|*dY         xx         d!z  cc<   |)t,          d!t.          d!ik    rt          j        |                     d                    }!|!5                    tm          |)7                                          d!k    rdZnd[d3|"|$|&tC                      d\           t3          | |!           t          d]          d!t          t          d^ddd3| d         |                                |dK         |i ||t                                          j        d_i |d(|id`|&dddda|tC                      db}+t3          t4          dcz  |+           t          j        |                     d                    }!|!5                    d^ddd |&D             tC                      de           t3          | |!           tq          t          j&        d^|                                |&dfd3g                     d S )hNr1   r2   r5   r6   r8   readyverifiedTzpublish-ready gate failed	artifacts)upload_copymetadatar'   z publish artifact hash mismatch: i ʚ;z*upload copy is not under one billion bytesr   zposter.jsonnormalized_intro_poster_sha256source_canon_sha256zthumbnail gate failedr^   r_   z/is-connected	connectedzPostiz is not connectedz/integrationsintegrationszinvalid integrations responsec                d    i | ]-}t          |t                    |                    d           |.S )r   )r   rG   rA   )rf   r   s     r   
<dictcomp>zmain.<locals>.<dictcomp>   s3    UUUdjt>T>TUTXXd^^TUUUr   disabledz#target integration missing/disabledzcalendar-preflight.jsonr]   preflight_onlyr   r   )schema_versionr5   r6   r8   r  tentative_slot_localtentative_slot_utc
created_atzpostiz-upload-video.jsonlocal_sha256local_byteszstale video upload receiptr   uploaded)r  r5   r6   r8   r  r  
local_pathr  r  r   uploaded_atzpostiz-upload-thumbnail.jsonzstale thumbnail upload receiptr   )microsecondscheduleFr   )contentr   __typefacebook)r   rE   settingsyoutubepublicno)r  r   typeselfDeclaredMadeForKids	thumbnailtags)r   r   	shortLinkr#  r   )rL   	sort_keysr   rK   c                *    h | ]}|d          d         S )r   r   r   )rf   xs     r   	<setcomp>zmain.<locals>.<setcomp>  s"    ,],],]Q}-=d-C,],],]r   z,schedule payload integration contract failedzpostiz-schedule-intent.jsonidempotency_keyzforeign/stale schedule intentz?schedule intent already exists; reconcile calendar before retryr  creating
slot_localslot_utcr   payload_sha256video_sha256thumbnail_sha256video_media_idthumbnail_media_idcalendar_precheckz/posts
   r   r   r   r   )r   integration_idr   r   r4  partial_failure	ambiguous)r8   r  http_statusr   calendar_matches
updated_atzQPostiz calendar verification did not find exactly one queued post per integrationscheduled_verified)r  r  )videor"  )exact_one_per_integrationsame_timestamp
both_queue)r  r5   r6   r8   r  	scheduled	publishedr  r+  r,  r)  r   r   calendar_verificationverified_atzpostiz-schedule.jsonc                ,    i | ]}|d          |d         S )r4  r   r   )rf   rows     r   r  zmain.<locals>.<dictcomp>G  sA      RG  RG  RGwzRUVfRgilmqir  RG  RG  RGr   )r8   r  post_idsterminal_at)r8   r+  r   r   )9rF   r9   r:   READYr<   rA   r=   r>   rB   VIDEOr   r@   r.   statst_sizer;   THUMBrw   r   r   rG   r   rq   rr   r   rX   LOGr   r   r   r   r   r   r   existsr   r   r   r   r   r&   r'   r   r+   r   r   r   r   r   r   r   r   r   r*   sumrg   print),r  r  rP   r   poster_receipt
thumb_hashenvrx   rD   r  integrations_rawr	  by_idr   tentative_slottentative_scan
video_hashvideo_receipt_pathvideo_receiptvideo_mediathumb_receipt_paththumb_receiptthumb_mediaslotscanr,  r   r   r   
serializedr   idempotencyintent_pathintentstatus_coder   rE  verify_postsmatchedr   r   countsrD  receipts,                                               r   mainri     s   	GGGJu8899Eyy*,,		(0C0Cv0M0MQVQZQZ[cQdQdhoQoQosxs|s|  ~H  tI  tI  QU  tU  tU6777k"I&+>>DDFF J J
dt99	$111H$HHIII 2zz||},,GHHHZ!= H HRY H Z Z[[NUJ:;;zII^M_M_`uMvMvz  {D  {D  EZ  {[  {[  N[  N[2333
**C%&,<(=#Dc?33Ii&& 6)--*D*DD*P*P4555tS/::MWXhjnMoMo  F#''8HIII  vFLlD)) <:;;;UUlUUUEBx F FeuSz~~j99TAADEEE  B%.tS%9%9"NN//:Scqu . 8 8 : :R`RkRkltl}  mB  SC  SC  SM  SM  SO  SO  SW  SW  X`  be  Sf  Sf2 2 2 '2 2    UJ99  "" 
#5#?#?#?#Q#QRR^,,
::m>O>OP]>^>^bgblblbnbnbv>v>v;<<<#G,T3..&zVWaos#()>#?sSXzzku ::<</+VYV[V[)
 )
 	 	 	 ==  "" 
#5#?#?#?#Q#QRR^,,
::m>O>OP]>^>^bgblblbnbnbv>v>v?@@@#G,T3..&zVWaos#()>#?sSXzzku ::<</+VYV[V[)
 )
 	 	 	 4%%JD$x0455==!=LLH#E;H$6$6$8$8$@$@3$O$O^cmo!2JkU`Ta2b2b1crz  }G  rH  I  I!2JkU`Ta2b2b1c  }F  QV  `h  EI  Xc  mo  rp  rp  q  q
 G G%4HHHJZ
##F
6::gr""##q((,],]VT[_,],],]bdfhai,i,iIJJJ.*u5J/K"Kf"TWbcgWh"hku"u  yC  #C  FH  #H  KM  #M  "U  "U  "W  "W  X  X  b  b  d  dK55K ^K1171CCDD::'((K77>???\]]] !):7?IQS]_ikp;(=uEZ?[ 	dnn&& )3GFO FVW^WefpfwfwfyfyWzWz  XE  XE  XG  XG 	
	 %7
	 EUVabfVg	 j~  @K  LP  @Q	
 	T
 $0    %T3'BBK **HD#x(2DR2P2P2P'PRZ]e]oxz]{]{]{R{||LG  !$''T??2r(??x?N8,D,D,P,PUXY]YaYabikmYnYnUoUoUuUuUwUw  |C  VC  VCNN$((4..CRVRZRZ[bRcRct|}}~~~!R^F + +s#$%%%*%%%%"aQK1171CCDDc&--//6J6Ja6O6O!2!2U`ns  EP  go  EL  \_  \a  \a  b  b  	c  	c  	cK(((nooo:SguyeLaFbnn&&GFOXckkk:V[V`V`VbVbVjkkk  {f  ~I  {f  KY  [e  {f  {f  g  gQUim  ~B  4K  4K  FJ  4Kuu G ,,g666Z--w-??@@F
MM1t  RG  RG  F  RG  RG  RG  X[  X]  X]  ^  ^  _  _  _V$$$	$* 4DNNDTDT_fggv{
|
|
|}}}}}r   __main__)r   r   )r   r   r   r   )r   r/   )r   r   rE   rG   r   r/   )r   rY   )rx   r   rD   r   r   r   r   ry   )
rx   r   rD   r   r   r   r   rG   r   r   )rE   ry   r   r   )r   rG   r   r   )rE   r   r   r   )
rx   r   rD   r   r   r   r   r   r   r   )rx   r   rD   r   r   r   )rx   r   rD   r   r   r   r   rG   )r   r   )rE   ry   r   r   )0
__future__r   r   r&   r9   rT   r   tempfileurllib.parser   urllib.requestpathlibr   zoneinfor   r;   r=   r>   r?   homerj   rq   rr   r   r   rH  rK  r   rG  rL  r   r.   rF   rX   rw   r   r   r   r   r   r   r   r   r   r   r   ri  __name__r   r   r   <module>rs     s   " " " " " "    				                         tSTT+
	(	y	 ?	2\	A  X !!	'x,,w%(DDh#u++
Ul[ [ [ [   = = = =      &+ + + +< < < <4 4 4 4a a a a
7 7 7 74 4 4 4? ? ? ?: : : :>6 6 6 6,& & & && & & &z~ z~ z~ z~z zDFFFFF r   