
    i%j*                        d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZmZmZmZmZmZmZmZ d%dZd&dZd'dZd(dZd)dZd*d+dZd,d Zd-d"Zd.d#Zd.d$Z dS )/    )annotationsN)Path)Any)HTTPException)Sessionselect)get_settings)ActivityEvent	PostDraftProviderUploadExecutorUploadRequest
VideoAssetWebsiteCompanionnow_utcexecutorr   returndict[str, Any]c                   | j         | j        | j        | j        | j        | j        | j        r| j        pi                     d          n&| j        dk    r| j        dk    rdn| j        dk    rdnd | j        r| j        pi                     d          n| j        dk    rdnd | j        r| j                                        nd | j	        r| j	                                        nd d	
S )
Ncredentialsexisting_jarvis_uploaderready	availabledashboard_oauthmissingmodeprivate_upload)
idnametypestatusdescriptionconfig_jsonr   r   
created_at
updated_at)
r   r   r    r!   r"   r#   getr$   	isoformatr%   )r   s    Q/home/agent/projects/AutoShorts_Dashboard/backend/app/services/upload_requests.pyserialize_executorr)      sg   k/++JRJ^  ,277FFFt|  uB  F`  u`  u`  em  et  x  e  eepep  RZ  R_  ct  Rt  Rt  EN  EN  z~<D<P  b%+00888kskx  }W  lW  lWWgWg  ]a9A9LVh)33555RV9A9LVh)33555RV      requestr   c                   i d| j         d| j        d| j        d| j        d| j        d| j        dk    r| j        dk    rd	n| j        d
| j        d| j        d| j        d| j        d| j	        d| j
        d| j        d| j        d| j        d| j        r| j                                        nd d| j        r| j                                        nd | j        r| j                                        nd | j        r| j                                        nd | j        r| j                                        nd | j        dS )Nr   video_asset_idpost_draft_idexecutor_typer!   workflow_statusapprovedr   waiting_for_executorapproval_textapproval_commandexpected_candidate_idexpected_video_shaexpected_privacymetadata_snapshot_jsonoutbox_pathupload_audit_idyoutube_video_idr$   approved_at)sent_atcompleted_atr%   error)r   r-   r.   r/   r!   r3   r4   r5   r6   r7   r8   r9   r:   r;   r$   r'   r<   r=   r>   r%   r?   )r+   s    r(   serialize_upload_requestr@      s   gj'0 	. 	.	
 	'. 	W^z5Q5QV]Vk  pJ  WJ  WJ11  PW  P^ 	. 	G4 	 !> 	g8 	G4 	!'"@ 	w* 	72 	G4  	8JTg(22444PT!" 	':MWw*44666SW#$ 3:/K7?,,...t<C<PZ,66888VZ8?8JTg(22444PT+   r*   sessionr   list[UploadExecutor]c                   g d}g }|D ]R\  }}}|                      t          t                                        t          j        |k                                                        }|sb|dk    rdn|dv rdnd}t          ||||          }|                     |           |                                  |                     |           nx||_	        ||_
        |dk    rd|_        dd	d
dd|_        t                      |_        |                     |           |                                  |                     |           |                    |           T|S )N))r   z Existing Jarvis YouTube uploaderzPrimary real private-upload route. Uses the existing Jarvis upload workflow after creator approval; no tokens are written to the dashboard repo.)r   zDashboard OAuth uploaderzTOptional direct Dashboard-managed Google OAuth. Disabled until account is connected.)dry_runzDry-run uploaderz;Does not call YouTube; exercises audit and dashboard state.)imported_existingzImported existing uploadz7Represents uploads found in existing Jarvis audit logs.r   r   >   rD   rE   activeconfigured_required)r   r    r"   r!   r   r   outbox_or_agent_pollingF)r   r   handofftokens_in_repo)execr   r   wherer    firstaddcommitrefreshr   r"   r!   r#   r   r%   append)rA   defaultsrowstypr   descrowr!   s           r(   ensure_default_executorsrW   7   s     H D#  T4ll6.11778Ks8RSSTTZZ\\ 	! #'A A AWWSVZzSzSzxx  AVF d$vVVVCKKNNOOC    CH"CO000$
2=GWd}  RW  #X  #X$YYCNKKNNOOC   CKr*   videor   strc                <    | j         p| j        p| j        d d         S )N   )checksumcandidate_idr   )rX   s    r(   _sha_prefixr^   U   s"    N<e0<EHcrcBBr*   r   c                 4    t                      j        dz  dz  S )Noutboxupload_requests)r	   storage_root r*   r(   _outbox_rootrd   Y   s    >>&14EEEr*   r.   payloaddict[str, Any] | Nonec                   |pi }|                      t          |          }|r|j        t          j        k    rt          dd          |                      t          |j                  }|st          dd          h d}t          |j	        d|j	                  }||v rt          dd          |                     d	          p|j
        pd
}|d
k    rt          dd          |j        }t          |          }	|                     d          pd| d|	 }
t          |j        |j        dd|                     d          pd|
||	d
t                      ||j        |j        |j        |j        |j        |dd          }|                     |           |                                  |                     |           t-                      }|                    dd           |j        |j        |j	        |j        ||j        |j        |	d
|j        d
}||j         dz  }|                    t9          j        |d          d           t=          |          |_        t                      |_         |                     |           |                     tC          d|j        dd ||
t=          |          d!"                     |                                  |                     |           tE          |          S )#N  zYouTube draft not foundstatus_codedetailzVideo not found>   failedarchivedrejectedneeds_changesquality_failedneeds_internal_fixvaluei  z'Video is not eligible for upload/exportr7   privatei  z.Sprint 8.1 only allows private upload requestsr4   zAPPROVE_UPLOAD  r   r1   r3   zMCreator approved private upload via Dashboard using existing Jarvis uploader.)r]   r-   r.   titler"   tagsprivacy_statusr/   )r-   r.   r/   r!   r3   r4   r5   r6   r7   r<   r8   T)parentsexist_ok)

request_idr/   r!   r4   r]   r-   r.   r6   r7   metadataz.json   )indentzutf-8)encodingupload_requestupload_request_approvedz)Existing Jarvis uploader request approved)r]   r4   r9   entity_type	entity_id
event_typelabelpayload_json)#r&   r   providerr   youtuber   r   r-   getattrr!   rw   r]   r^   r   r   r   ru   r"   	tags_jsonrN   rO   rP   rd   mkdirr/   r4   r8   
write_textjsondumpsrY   r9   r%   r
   r@   )rA   r.   re   draftrX   blocked_statusesvideo_statusr7   r]   
sha_prefixcommandr+   r`   outbox_payloadr9   s                  r(   create_existing_upload_requestr   ]   s^   mGKK	=11E OENh&6664MNNNNKK
E$899E G4EFFFFrrr5<%,??L'''4]^^^^{{#566[%:N[R[9$$4deeee%LU##Jkk,--^1^<1^1^R\1^1^Gxh0kk/22  F  7F *%"II(#h"X[ ,O.7	 
 	 
  G, KKNNOOG^^F
LLL---j ..#4$((%2 N gj////K4:nQ???'RRRk**G GKKKK*:gj]v  j  JV  ls  DG  HS  DT  DT  yU  yU  V  V  V  W  W  WNNOOG#G,,,r*   list[dict[str, Any]]c                   |                      t          t                                        t          j        dk                                  t          j                                                            }d |D             S )Nr1   c                ,    g | ]}t          |          S rc   )r@   ).0rs     r(   
<listcomp>z*pending_agent_requests.<locals>.<listcomp>   s!    666A$Q''666r*   )rK   r   r   rL   r!   order_byr$   all)rA   rS   s     r(   pending_agent_requestsr      si    <<}--33M4HJ4VWW``anayzz{{  B  BD666666r*   rz   c                R   |                      t          |          }|st          dd          d|_        t	                      |_        t	                      |_        |                     |           |                                  | 	                    |           t          |          S )Nrh   UploadRequest not foundri   sent_to_executor)r&   r   r   r!   r   r=   r%   rN   rO   rP   r@   )rA   rz   reqs      r(   	mark_sentr      s    
++mZ
0
0C O4MNNNN#CJ))CKYYCNKKgnn&&&(<(<(<#C(((r*   c                   |                      t          |          }|st          dd          d|_        |                     d|j                  |_        |                     d|j                  |_        |j        r|                      t          |j                  }|                      t          |j	                  }|r4|j        |_
        t                      |_        |                     |           |r4|j        |_        t                      |_        |                     |           |                     t!          t"                                        t"          j        |j        k                                                        }|st#          |j        |j	                  }|j        |_        d|j         |_        t+          |                     d	d
                    |_        |j        rdnd|_        t                      |_        |                     |           |                     t/          d|j        dd|j        |j        |j        d                     t                      |_        t                      |_        |                     |           |                                  |                     |           t9          |          S )Nrh   r   ri   	completedr;   r:   )r-   r.   zhttps://www.youtube.com/shorts/website_link_allowedFready_with_public_videoready_without_public_videowebsite_companionprivate_upload_companion_readyz7Website guide can be prepared without public video link)r-   r;   r   r   )r&   r   r   r!   r;   r:   r   r-   r   r.   external_youtube_idr   r%   rN   external_post_idrK   r   r   rL   rM   video_url_internalboolr   r
   r   r>   rO   rP   r@   )rA   rz   re   r   rX   r   comps          r(   complete_requestr      s   
++mZ
0
0C O4MNNNNCJ";;'93;OPPC!++&79LMMC
 WJ(:;;Is'899 	(+(<E%&yyEKK 	%(%9E"&yyEKK||F#344::;K;Z^a^p;pqqrrxxzz 	h#33EUXUfgggD # 4"ZCDX"Z"Z$(5KU)S)S$T$T!373Ln//Rn!))DM.ATW  bB  JC  eh  ew  MP  Ma  {  {T  RU  RU  V  V  V  	W  	W  	WyyCYYCNKKgnn&&&(<(<(<#C(((r*   c                d   |                      t          |          }|st          dd          d|_        |                     d          pd|_        t                      |_        |                     |           |                                  | 	                    |           t          |          S )Nrh   r   ri   rl   r?   zExecutor reported failure)r&   r   r   r!   r?   r   r%   rN   rO   rP   r@   )rA   rz   re   r   s       r(   fail_requestr      s    
++mZ
0
0C O4MNNNNCJG$$C(CCIYYCNKKgnn&&&(<(<(<#C(((r*   )r   r   r   r   )r+   r   r   r   )rA   r   r   rB   )rX   r   r   rY   )r   r   )N)rA   r   r.   rY   re   rf   r   r   )rA   r   r   r   )rA   r   rz   rY   r   r   )rA   r   rz   rY   re   r   r   r   )!
__future__r   r   pathlibr   typingr   fastapir   sqlmodelr   r   app.core.configr	   app.models.corer
   r   r   r   r   r   r   r   r)   r@   rW   r^   rd   r   r   r   r   r   rc   r*   r(   <module>r      s   " " " " " "              ! ! ! ! ! ! $ $ $ $ $ $ $ $ ( ( ( ( ( ( E  E  E  E  E  E  E  E  E  E  E  E  E  E  E  E  E  E  E  E      4   <C C C CF F F FA- A- A- A- A-H7 7 7 7
) ) ) )) ) ) )D) ) ) ) ) )r*   