
    Pdj                        S r SSKJr  SSKrSSKJrJrJr  SSKJr  SSK	r	\" \" SS95      r
SrS	rS
rSSS.rSSSSS.rSrSrSS jrSS jrS S jrS!S jrS"S jrS#S jrS$S jrS!S jr    S%S jrg)&u  SQLite → md-архивы в волте.

Формат повторяет TGStat-архив канала: планёрка уже умеет его читать, и учить
её новому синтаксису незачем. Медианы считаются здесь и кладутся готовыми в
шапку — чтобы у планёрки была одна точка истины, а не свой пересчёт.
    )annotationsN)datetime	timedeltatimezone)Path   )hours   Z      	InstagramThreads)	instagramthreadsu   рилсu   карусельu
   видеоu   фото)REELSN)FEEDCAROUSEL_ALBUM)r   VIDEO)r   IMAGE)viewsu   Просмотры)reachu
   Охватlikesu
   Лайки)commentsu   Комменты)savedu   Сохраненияsharesu   Шеры)followsu   Подписки)profile_visitsu   Заходы в профиль)r   r   )repliesu   Ответы)repostsu   Репосты)quotesu   Цитатыr   c                N    [         R                  " U R                  SS5      5      $ )NZz+00:00)r   fromisoformatreplacemoments     /home/rasp/meta-puller/render.py_parser,   -   s    !!&..h"?@@    c                \    [        U 5      R                  [        5      R                  S5      $ )Nz%Y-%m-%d %H:%M)r,   
astimezoneMSKstrftimer)   s    r+   _mskr2   1   s#    &>$$S)223CDDr-   c                ^    U S   nUS:X  a	  [         S   $ [         R                  XS   4S5      $ )Nmedia_product_typer   r   
media_typeu   пост)IG_KINDSget)rowproducts     r+   ig_kindr:   5   s9    &'G'((<<l"34jAAr-   c                    [         R                  " U 5       nUR                  SR                  [         R                  U   5      5      R                  5       sS S S 5        $ ! , (       d  f       g = f)Nz=SELECT * FROM {} WHERE is_deleted = 0 ORDER BY timestamp DESC)dbconnectexecuteformatTABLESfetchall)db_pathplatformconns      r+   _live_postsrE   <   sI    	G	||&&,fRYYx-@&A
 (*	 
		s   ?A  
A.c           
        [        U5      [        [        S9-
  n[        U5      [        [        S9-
  n0 n[	        X5       HZ  n[        US   5      nXGs=::  a  U::  d  O  M!  US   c  M)  US:X  a  US   OSnUR                  U/ 5      R                  US   5        M\     UR                  5        VV	s0 s H:  u  pU[        U	5      [        :  a  [        [        R                  " U	5      5      OS_M<     sn	n$ s  sn	nf )u|   Медиана просмотров по типам контента (для Threads — единственный ключ).)days	timestampr   Nr   r4   ALL)r,   r   MEDIAN_MIN_AGE_DAYSMEDIAN_WINDOW_DAYSrE   
setdefaultappenditemslenMEDIAN_MIN_POSTSint
statisticsmedian)
rB   rC   nownewest_allowedoldest_allowedbucketsr8   postedkeyvaluess
             r+   mediansr[   D   s    C[92E#FFNC[92D#EEN!G7-K():N:w<+3{+Bc&'3#**3w<8 .  '}}0. [$44 j''/0:>?.0 0 0s   1AC6c           
     v   U S:X  a+  UR                  S5      nU(       a  SR                  U5      $ S$ SSS.n[        UR                  5       5       VVs/ s H/  u  pEU(       d  M  SR                  UR                  XD5      U5      PM1     nnnU(       a   S	R                  S
R	                  U5      5      $ S$ s  snnf )Nr   rI   u9   Медиана просмотров за 90 дней: {}.uZ   Медиана просмотров: пока мало постов для расчёта.u
   рилсыu
   лента)r   r   u   {} — {} просмотровu9   Медианы просмотров за 90 дней: {}.z, uZ   Медианы просмотров: пока мало постов для расчёта.)r7   r?   sortedrN   join)rC   rZ   rS   namedrY   valuepartss          r+   _median_linerb   X   s    9E"^dKRRSYZ 	sq	s"L9E%flln5@5 Q-44UYYs5H%P5 
 @diGNNtyyY^O_` omo@s   B5$%B5c                ,   [         R                  " XUS S S9nUS   c  SO[        US   5      nUS   b  USR                  US   US   5      -  nSR                  [        U   U5      S	S
R                  US S XF5      S	[        U[        XU5      5      S	/$ )N
   )today	followersu   —growthu    ({:+d} за {} дн.)growth_daysu    # {} архив постов @{} uN   Обновлено: {}. Всего постов: {}. Подписчики: {}.)r<   account_statestrr?   PLATFORM_TITLESrb   r[   )rB   rC   rT   usernametotalstaterf   s          r+   _headerrp   d   s    Wc#2h?E{+3U;=O9PIX"-44U8_eMFZ[[	*11/(2KXV
X__He	(
Xww#>?
 r-   c           	        U S:X  a  [         O[        nU VVs/ s H   u  p4X   c  M  SR                  XAU   5      PM"     nnn[        US   5      nU S:X  a  US[	        U5      -   -  nOUS   (       a  US-  nUS   =(       d    SnU S:X  a  US	   OUS
   =(       d    SR                  5       nSR                  XgU5      U(       a  SSR                  U5      -   S-   OSU=(       d    SS/$ s  snnf )Nr   z{}: {}rH   u    — is_quote_postu    — цитата	permalinkri   captiontextu   ### {} — [{}]({})z**u    · u-   _(метрики ещё не собраны)_u   _(без текста)_)IG_METRIC_LABELSTH_METRIC_LABELSr?   r2   r:   stripr^   )	rC   r8   labelsfieldlabelmetricstitlelinkru   s	            r+   _post_blockr   t   s   !)[!8>NF#)E#)<5SZ 2xu%j1#)  E [!"E;73<''	_	$${!rD';6S^CKNBUUWD$$U$7.5v{{7##d*;j))
	 Es
   C)C)c           	        [        X5      n[        XX4[        U5      S9nUSS/-  nU H  nU[        X5      -  nM     [	        U5      nUR
                  R                  SSS9  UR                  SR                  U5      SS9  g	)
u  Пишет архив ровно в out_path — корень волта решает вызывающий код.

Путь приходит аргументом намеренно: в соседнем tgstat-puller рендер брал
его из переменной окружения и в тестах уехал в боевой волт, обнулив там
архив канала.
)rn   u.   ## Все посты (новые сверху)ri   T)parentsexist_ok
zutf-8)encodingN)	rE   rp   rO   r   r   parentmkdir
write_textr^   )rB   rC   out_pathrT   rm   rowslinesr8   s           r+   render_archiver      s     w)DGsCIFE	>CCEX++  H~HOO$6		%(7;r-   )r*   rk   returnr   )r*   rk   r   rk   )r   rk   )rC   rk   r   list)rC   rk   rT   rk   r   dict)rC   rk   rZ   r   r   rk   )
rC   rk   rT   rk   rm   rk   rn   rQ   r   r   )
rC   rk   r   r   rT   rk   rm   rk   r   None)__doc__
__future__r   rR   r   r   r   pathlibr   r<   r0   rJ   rK   rP   rl   r6   rv   rw   r,   r2   r:   rE   r[   rb   rp   r   r    r-   r+   <module>r      s    #  2 2  	yq!"     +	B
   2#!	 
 AEB0(	o *< <%)<r-   