
    K$j&                    0   d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
m	Z	mZ d dlmZ d dlmZ dZdZd	Zd
Ze G d d                      Zd1dZd2dZd3dZd4dZd5dZd6dZd5dZd6dZd7d!Zd8d%Zd9d&Zd:d(Z d9d)Z!d9d*Z"d9d+Z#d;d/Z$d<d0Z%dS )=    )annotationsN)	dataclassfield)datedatetimetimezone)parsedate_to_datetime)Anyyoutube_daily_totalsyoutube_video_tableyoutube_chartunknownc                      e Zd ZU ded<    ee          Zded<   dZded<    ee          Zd	ed
<    ee          Z	d	ed<   dZ
ded<   dZded<    ee          Zded<   edd            ZdS )	ParsedCsvstrdetected_type)default_factoryzlist[dict[str, Any]]rowsNzdict[str, Any] | None	total_row	list[str]warningserrorsdate | Nonedate_range_startdate_range_endzlist[dict[str, str]]raw_rowsreturnintc                *    t          | j                  S N)lenr   )selfs    W/home/agent/projects/AutoShorts_Dashboard/backend/app/services/analytics_youtube_csv.py	row_countzParsedCsv.row_count   s    4=!!!    )r   r   )__name__
__module____qualname____annotations__r   listr   r   r   r   r   r   r   propertyr$    r%   r#   r   r      s         !&t!<!<!<D<<<<'+I++++%555H5555d333F3333$((((("&N&&&&%*U4%@%@%@H@@@@" " " X" " "r%   r   contentbytesr   r   c                N    t          j        |                                           S r    )hashlibsha256	hexdigest)r-   s    r#   	file_hashr3   "   s    >'"",,...r%   &tuple[list[str], list[dict[str, str]]]c                P   |                      dd          }|                                sg g fS t          j        t	          j        |                    }t          |j        pg           }g }|D ]3}|                    d |	                                D                        4||fS )Nz	utf-8-sigreplace)r   c                V    i | ]&\  }}t          |pd           t          |pd           'S ) )r   ).0kvs      r#   
<dictcomp>zread_csv.<locals>.<dictcomp>.   s2    HHHDAqSb\\3qwB<<HHHr%   )
decodestripcsv
DictReaderioStringIOr*   
fieldnamesappenditems)r-   textreaderheadersr   rows         r#   read_csvrJ   &   s    >>+i>88D::<< 2v^BK--..F6$*++G!#D J JHHCIIKKHHHIIIID=r%   valuec                z    | pd                                                                                     dd          S )Nr8   u   ﻿)r>   lowerr6   rK   s    r#   normalize_headerrO   2   s4    KR  &&((002>>>r%   rH   r   c                    d | D             }|ddhk    rt           S h d                    |          rd|v sd|v rt          S t          S h d                    |          rt          S t          S )Nc                ,    h | ]}t          |          S r,   )rO   )r9   hs     r#   	<setcomp>z"detect_csv_type.<locals>.<setcomp>7   s!    777!"1%%777r%   datumaufrufe>   dauervideos
videotitel&   veröffentlichungszeitpunkt des videoszwiedergabezeit (stunden)impressionen>   rT   rV   rW   rU   rX   rY   )YOUTUBE_DAILY_TOTALSissubsetYOUTUBE_VIDEO_TABLEYOUTUBE_CHARTUNKNOWN)rH   
normalizeds     r#   detect_csv_typera   6   s    77w777Jgy)))##RRR[[\fgg %33~7S7S&&fffoopz{{ Nr%   r
   float | Nonec                   | d S t          |                                                               dd                              dd          }|dv rd S |                    dd          }d|v r/d|v r+|                    dd                              dd          }nd|v r|                    dd          }	 t          |          }n# t          $ r Y d S w xY wt          j        |          rd S |S )Nu    r8    >      —r8   -%,.)r   r>   r6   float
ValueErrormathisnan)rK   rF   value_floats      r#   parse_numberro   C   s
   }tu::%%h33;;CDDDt<<R  D
d{{sd{{||C$$,,S#66	||C%%Dkk   ttz+ ts   8C 
CC
int | Nonec                F    t          |           }|t          |          nd S r    )ro   r   )rK   numbers     r#   	parse_intrs   X   s$    %  F ,3v;;;$6r%   c                     t          |           S r    )ro   rN   s    r#   parse_percentru   ]   s    r%   c                   t          | pd                                          }|sd S |                    d          }	 d |D             }n# t          $ r Y d S w xY wt	          |          dk    r|d         S t	          |          dk    r|d         dz  |d         z   S t	          |          dk    r |d         d	z  |d         dz  z   |d         z   S d S )
Nr8   :c                F    g | ]}t          t          |                    S r,   )r   rj   )r9   ps     r#   
<listcomp>z*parse_duration_seconds.<locals>.<listcomp>g   s$    ---!E!HH---r%      r      <        )r   r>   splitrk   r!   )rK   rF   partsnumss       r#   parse_duration_secondsr   a   s    u{!!##D tJJsOOE--u---   tt
4yyA~~Aw
4yyA~~Aw|d1g%%
4yyA~~Aw~Q",tAw664s   A 
AAr   c                2   t          | pd                                          }|sd S dD ];}	 t          j        ||                                          c S # t
          $ r Y 8w xY w	 t          |                                          S # t          $ r Y d S w xY w)Nr8   )z%Y-%m-%dz	%b %d, %Yz	%B %d, %Yz%d.%m.%Yz%d/%m/%Y)r   r>   r   strptimer   rk   r	   	Exception)rK   rF   fmts      r#   parse_youtube_dater   s   s    u{!!##D tM  	$T3//4466666 	 	 	D	$T**//111   tts#   &A
A#"A#' B 
BBrI   dict[str, str]keyc                    t          |          }|                                 D ]\  }}t          |          |k    r|c S dS )Nr8   )rO   rE   )rI   r   wantedr:   r;   s        r#   getr      sP    c""F		  1A&((HHH )2r%   c                d   t          |           \  }}t          t          |          }t          |d          D ]\  }}t	          t          |d                    }t          t          |d                    }||j                            d| d           `||j                            d| d           |j	                            |||d	           d
 |j	        D             }|r(t          |          |_        t          |          |_        |s|j                            d           |S )Nr   r   r|   startDatumAufrufeRow z: missing/invalid datez: missing views)metric_dateviewsrawc                H    g | ]}|                     d           |d           S r   r   r9   rs     r#   rz   z2parse_youtube_daily_totals_csv.<locals>.<listcomp>   .    KKK!aeeM6J6JKQ}KKKr%   z%Header-only or empty daily totals CSV)rJ   r   r[   	enumerater   r   rs   r   rD   r   minr   maxr   )	r-   rH   r   parsedindexrI   r   r   datess	            r#   parse_youtube_daily_totals_csvr      sJ    ))GX%9HMMMF222 U U
s(S'):):;;#c9--..O""#G%#G#G#GHHH=O""#@%#@#@#@AAA;sSSTTTTKKv{KKKE +"%e** #E

 HFGGGMr%   boolc                    t          | d                                                                          }t          | d                                                                          }|dv p|dv S )NVideos
Videotitel>   r8   totalgesamt>   r   r   )r   r>   rM   )rI   video_idtitles      r#   is_total_rowr      sg    3!!''))//11H\""((**0022E..N%;N2NNr%   c                |   t          |           \  }}t          t          |          }t          |d          D ]\  }}t	          |d                                          t	          |d                                          t          t	          |d                    t          t	          |d                    t          t	          |d                    t          t	          |d	                    t          t	          |d
                    t          t	          |d                    t          t	          |d                    ||d}t          |          r	||_        )|d         s(|d         s |j                            d| d           Y|d         .|j                            d| d|d         p|d                     |j                            |           d |j        D             }|r(t!          |          |_        t%          |          |_        |s|j                            d           |S )Nr   r|   r   r   r   &   Veröffentlichungszeitpunkt des VideosDauerr   zWiedergabezeit (Stunden)
AbonnentenImpressionenzKlickrate der Impressionen (%))external_post_idr   published_atduration_secr   watch_time_hourssubscribers_deltaimpressionsimpression_ctr_pctr   
row_numberr   r   r   z: skipped empty video rowr   z%: partial snapshot without views for c                H    g | ]}|                     d           |d           S )r   r   r   s     r#   rz   z1parse_youtube_video_table_csv.<locals>.<listcomp>   s.    MMM1quu^7L7LMQ~MMMr%   z$Header-only or empty video table CSV)rJ   r   r]   r   r   r>   r   r   rs   ro   ru   r   r   r   rD   r   r   r   r   r   )r-   rH   r   r   r   rI   payloadr   s           r#   parse_youtube_video_table_csvr      s]    ))GX%88LLLF222 $ $
s #C 2 2 8 8 : :l++1133.s38`/a/abb23sG3D3DEEs3	2233 ,S6P-Q-Q R R!*3sL+A+A!B!B$Sn%=%=>>"/C9Y0Z0Z"["[
 
  	&F)* 	773C 	O""#J%#J#J#JKKK7#O""  $H%  $H  $HV]^pVq  WFu|  ~E  vF  $H  $H  I  I  I7####MMMMME +"%e** #E

 GEFFFMr%   c                   t          |           \  }}t          t          |          }t          |d          D ]\  }}t	          t          |d                    }|j                            |t          |d                                          t          |d                                          t	          t          |d                    t          t          |d                    t          t          |d	                    ||d
           |s|j                            d           d |j        D             }|r(t          |          |_        t          |          |_        |S )Nr   r|   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   zHeader-only chart CSV acceptedc                H    g | ]}|                     d           |d           S r   r   r   s     r#   rz   z+parse_youtube_chart_csv.<locals>.<listcomp>   r   r%   )rJ   r   r^   r   r   r   r   rD   r>   r   rs   r   r   r   r   r   )r-   rH   r   r   r   rI   r   r   s           r#   parse_youtube_chart_csvr      sa    ))GX]XFFFF222  
s(S'):):;;& #C 2 2 8 8 : :l++1133.s38`/a/abb23sG3D3DEEs3	2233	
 	
 		 		 		 		  A?@@@KKv{KKKE +"%e** #E

Mr%   c                J   t          |           \  }}t          |          }|t          k    rt          |           S |t          k    rt          |           S |t          k    rt          |           S t          t          |          }|j
                            d|            |S )Nr   zUnknown CSV header: )rJ   ra   r[   r   r]   r   r^   r   r   r_   r   rD   )r-   rH   r   detectedr   s        r#   parse_csv_by_typer      s    W%%MGTw''H'''-g666&&&,W555=  &w///Wt<<<F
M999:::Mr%   dict[str, Any]snapshot_atr   c                    |                      d          }|                      d          }|                      d          }|                      d          }|                      d          }|                      d          }d }d }	d }
d }d }|r"| |dz  |z  }|rt          d||z  d	z            }	||r||z  }
|
|r||z  d
z  }|4|r2t          d|                                |z
  j        dz             }||z  }||	|
||dS )Nr   r   r   r   r   r   r   g      Y@d   i  r{   )avg_view_duration_secretention_proxy_pctviews_per_impressionsubscribers_per_1000_viewsviews_per_day_since_publish)r   r   r   r   days)rI   r   r   
watch_timer   subscribersdurationr   r   r   r   r   r   r   s                 r#   compute_snapshot_metricsr      sW   GGGE+,,J''-((K''-..Kww~&&H77>**L !%"& W'!+d!2e ; 	W"%e.Ch.NRU-U"V"V[${25%05%84%?"\1{''))L8>BCC&+dl#!62 4&@'B  r%   c                 >    t          j        t          j                  S r    )r   nowr   utcr,   r%   r#   utcnowr     s    <%%%r%   )r-   r.   r   r   )r-   r.   r   r4   )rK   r   r   r   )rH   r   r   r   )rK   r
   r   rb   )rK   r
   r   rp   )rK   r
   r   r   )rI   r   r   r   r   r   )r-   r.   r   r   )rI   r   r   r   )rI   r   r   r   r   r   )r   r   )&
__future__r   r?   r0   rA   rl   dataclassesr   r   r   r   r   email.utilsr	   typingr
   r[   r]   r^   r_   r   r3   rJ   rO   ra   ro   rs   ru   r   r   r   r   r   r   r   r   r   r   r,   r%   r#   <module>r      sC   " " " " " " 



  				  ( ( ( ( ( ( ( ( - - - - - - - - - - - - - - - -      - + 
 " " " " " " " "/ / / /	 	 	 	? ? ? ?
 
 
 
   *7 7 7 7
      $         *O O O O       F   0      @& & & & & &r%   