
    ߻i                         d Z ddlZddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZmZ ddlmZm Z  de!fdZ"de!fdZ# G d d      Z$y)u   에피소드 관리 서비스.    N)datetimetimezone)Path)AnyDictListOptional)Session)settings)AppError)t)ActivityLogger)EpisodeEntityEpisodeLink
ImageAssetPipelineProgress
SceneStillWebbookPackage
WorldGuide)extract_text_from_pdfdetect_languagereturnc                  d    t        j                  t        j                        j	                         S N)r   nowr   utc	isoformat     R/Users/manta/Documents/Projects/TheRoad-I1/backend/app/services/episode_service.py_nowr!      s    <<%//11r   c                  <    t        t        j                               S r   )struuiduuid4r   r   r    _new_idr&      s    tzz|r   c                       e Zd ZdedededdfdZdee   fdZdedefd	Z		 dd
e
dedededee   defdZ	 ddedeeef   dee   defdZ	 ddedee   ddfdZy)EpisodeServicedb
project_idactor_idr   Nc                 N    || _         t        |      | _        || _        || _        y r   )_dbr   _logger_project_id	_actor_id)selfr)   r*   r+   s       r    __init__zEpisodeService.__init__#   s&     %b)%!r   c                     | j                   j                  t              j                  t        j                  | j
                  k(        j                  t        j                        j                         S r   )	r-   queryr   filterr*   r/   order_byepisode_numberall)r1   s    r    list_episodeszEpisodeService.list_episodes0   sI    HHNN7#VG&&$*:*::;Xg,,-SU		
r   
episode_idc                 
   | j                   j                  t              j                  t        j                  |k(  t        j
                  | j                  k(        j                         }|st        dt        d      d      |S )Nzepisode.not_foundi  codemessagestatus_code)
r-   r4   r   r5   idr*   r/   firstr   r   )r1   r:   eps      r    get_episodezEpisodeService.get_episode8   sl    HHNN7#VGJJ*,g.@.@DDTDT.TUUW 	
 (-. 
 	r   r7   titlepdf_file_bytesfilenameipc                    | j                   j                  t              j                  t        j                  | j
                  k(  t        j                  |k(        j                         }|rt        dt        d      d      t        |      j                  }|sd}t        t        j                        | j
                  z  dz  dz  }|j                  dd       ||z  }	|	j                         r/|	j                   }
|	j"                  }||
 d	t%               d d
  | z  }		 |	j'                  |       	 t+        |	      \  }}t-        |      }t/               }t%               }t        || j
                  |||t1        |	      |||d||      }| j                   j3                  |       | j                   j5                          | j6                  j9                  | j:                  dd|| j
                  |||d|       |S # t(        $ r t        dt        d      d      w xY w# t(        $ r t        dt        d      d      w xY w)Nepisode.duplicate_number  r<   zuploaded.pdfassetsscreenplaysT)parentsexist_ok_   zepisode.upload_failedi  zepisode.invalid_pdfuploaded)r@   r*   r7   rD   source_filenamesource_pathfulltextlanguage
page_countstatus
created_at
updated_atzepisode.createepisode)r7   rD   rF   r+   actionresource_typeresource_idr*   detail
ip_address)r-   r4   r   r5   r*   r/   r7   rA   r   r   r   namer   projects_dirmkdirexistsstemsuffixr&   write_bytes	Exceptionr   r   r!   r#   addcommitr.   logr0   )r1   r7   rD   rE   rF   rG   existingsafe_filenamescreenplay_dirpdf_pathre   rf   rT   rV   rU   r   r:   rZ   s                     r    create_episodezEpisodeService.create_episodeH   s=    HHNN7#VG&&$*:*::G<R<RVd<deUW 	
 /45  X++*Mh334t7G7GG(RUbbTD9!M1 ??==D__F%4&')BQ-(IIH	  0	#8#B Hj #8,fY
'')$H!
 	W^^##"''&4uRZ[ 	 	
 a  	,12 	  	*/0 	s    G: 2H :!H!H?updatesc           
         | j                  |      }i }i }d|v r|d   |d   }||j                  k7  r| j                  j                  t              j                  t        j                  | j                  k(  t        j                  |k(  t        j                  |k7        j                         }|rt        dt        d      d      |j                  |d<   ||_        ||d<   d|v r&|d   !|j                  |d<   |d   |_        |d   |d<   t               |_        | j                  j                          | j                   j#                  | j$                  dd|| j                  ||d|	       |S )
Nr7   rI   rJ   r<   rD   zepisode.updaterZ   )beforeafterr[   )rC   r7   r-   r4   r   r5   r*   r/   r@   rA   r   r   rD   r!   rY   rj   r.   rk   r0   )	r1   r:   rq   rG   rZ   rs   rt   new_numdups	            r    update_episodezEpisodeService.update_episode   sz    "":.!# "w&73C+D+P./G'000HHNN7+V**d.>.>>..'9

j0
 UW  "7 !"< =$' 
 ,3+A+A'()0&*1&'g''"2">%mmF7O#G,GM$W-E'N!V^^##"''$u5 	 	
 r   c           
      "   | j                  |      }t        |j                        }|j                         }t        t        j
                        j                         }t        |      j                  t        |      dz         r |j                         r|j                          t        t        t        t        t        t        fD ]G  }| j                   j#                  |      j%                  |j&                  |k(        j)                          I | j                   j)                  |       | j                   j+                          | j,                  j/                  | j0                  dd|| j2                  |j4                  |j6                  d|       y )N/zepisode.deleterZ   )r7   rD   r[   )rC   r   rS   resolver   rb   r#   
startswithrd   unlinkr   r   r   r   r   r   r-   r4   r5   r:   deleterj   r.   rk   r0   r/   r7   rD   )r1   r:   rG   rZ   sourceresolved_sourceproject_dirmodels           r    delete_episodezEpisodeService.delete_episode   s/   
 "":. g))* ..*800199;**3{+;c+ABv}}MMO 
E HHNN5!(()9)9Z)GHOOQ
 	 ^^##"''&-&<&<w}}U 	 	
r   r   )__name__
__module____qualname__
OrmSessionr#   r2   r   r   r9   rC   intbytesr	   rp   r   r   rw   r   r   r   r    r(   r(   "   s   	"	" 	" 		"
 
	"
tG} 
c g , !UU U 	U
 U SMU 
Uv !	33 c3h3 SM	3
 
3p !$
$
 SM$
 
	$
r   r(   )%__doc__r$   r   r   pathlibr   typingr   r   r   r	   sqlalchemy.ormr
   r   app.core.configr   app.core.errorsr   app.i18n.loaderr   app.logging.activity_loggerr   app.models.projectr   r   r   r   r   r   r   app.modules.pdf_parserr   r   r#   r!   r&   r(   r   r   r    <module>r      s_    $  '  , , 0 $ $  6   J2c 2 V
 V
r   