§
    ¥‹jÊ'  ã                   ó    — 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	m
Z
 d dl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  G d„ d¦  «        ZdS )é    )ÚSession)ÚDictÚAnyÚOptionalÚList)ÚUUID)ÚdatetimeÚtimezoneNé   )ÚStream)ÚChatMessage)ÚChapter)ÚChatServicec                   ó2  — e Zd Zdefd„Zdeeef         deeef         fd„Z	 	 	 dde	d	e
e         d
eeef         de
e         dededefd„Zde	deeeef                  fd„Zde	deeeef                  deeef         fd„Zde
e         de
e         fd„ZdS )ÚChatJsonServiceÚdbc                 ó<   — || _         t          |¦  «        | _        d S )N)r   r   Úchat_service)Úselfr   s     ú&/app/app/services/chat_json_service.pyÚ__init__zChatJsonService.__init__   s   € ØˆŒÝ'¨™OœOˆÔÐÐó    Ú	json_dataÚreturnc                 óz  — |                      di ¦  «        }|                      di ¦  «        }|                      dg ¦  «        }|                      dg ¦  «        }|                      di ¦  «        }|                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d	¦  «        |                      d
¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        |||dœS )z)Parse chat.json and extract relevant dataÚvideoÚstreamerÚcommentsÚchaptersÚembeddedDataÚtitleÚdescriptionÚgameÚnameÚloginÚidÚlengthÚ
created_atÚ	viewCount)r!   r"   r#   r   Ústreamer_loginÚstreamer_idÚdurationr(   Ú
view_countÚvideo_idr   r   Úembedded_data)Úget)r   r   Ú
video_dataÚstreamer_datar   r   r/   s          r   Úparse_chat_jsonzChatJsonService.parse_chat_json   s  € à—]’] 7¨BÑ/Ô/ˆ
Ø!Ÿš j°"Ñ5Ô5ˆØ—=’= ¨RÑ0Ô0ˆØ—>’> *¨bÑ1Ô1ˆØ!Ÿš n°bÑ9Ô9ˆð  —^’^ GÑ,Ô,Ø%Ÿ>š>¨-Ñ8Ô8Ø—N’N 6Ñ*Ô*Ø%×)Ò)¨&Ñ1Ô1Ø+×/Ò/°Ñ8Ô8Ø(×,Ò,¨TÑ2Ô2Ø"Ÿš xÑ0Ô0Ø$Ÿ.š.¨Ñ6Ô6Ø$Ÿ.š.¨Ñ5Ô5Ø"Ÿš tÑ,Ô,Ø Ø Ø*ð
ð 
ð 	
r   NFÚuser_idÚhls_pathÚparsed_dataÚthumbnail_timestampÚ	is_publicÚis_twitch_importc                 óX  — |}|r|                      d¦  «        r
|dd…         }|sdnd}d}	|                     d¦  «        }
|
rd|
› d�}	t          |                     d	d
¦  «        |                     d¦  «        |pd|||                     dd¦  «        pdd||	|r%t          |                     dd¦  «        ¦  «        pdnd|                     d¦  «        |                      |                     d¦  «        ¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        dœ¬¦  «        }| j                             |¦  «         | j                             ¦   «          | j                             |¦  «         |dk    rK	 ddl	m
}  |¦   «          n9# t          $ r,}ddl}|j                             d|› d�¦  «         Y d}~nd}~ww xY w	 ddlm}  |¦   «          n9# t          $ r,}ddl}|j                             d|› d�¦  «         Y d}~nd}~ww xY w|S )z*Create a stream from parsed chat.json dataz/app/é   NÚpendingÚreadyr.   z4https://static-cdn.jtvnw.net/cf_vods/d2nvs3xx597ldy/z/thumb/thumb-640-360.jpgr!   zUntitled Streamr"   r,   r   Ú r   r(   r#   r*   r+   )r#   r*   r+   )r!   r"   r5   ÚstatusÚ
created_byÚduration_secondsr-   r8   Úthumbnail_urlÚtwitch_vod_idr   Ústream_dateÚstream_metadatar   )Úregenerate_master_ffconcatz>[FFCONCAT ERROR] Failed to regenerate after chat.json import: Ú
)Úrenumber_all_streamsz=[NUMBERING ERROR] Failed to renumber after chat.json import: )Ú
startswithr0   r   ÚstrÚ_parse_datetimer   ÚaddÚcommitÚrefreshÚservices.ffconcat_servicerF   Ú	ExceptionÚsysÚstderrÚwriteÚ!services.stream_numbering_servicerH   )r   r4   r5   r6   r7   r8   r9   Únormalized_pathr?   rB   r.   ÚstreamrF   ÚerQ   rH   s                   r   Úcreate_stream_from_chat_jsonz,ChatJsonService.create_stream_from_chat_json*   sÂ  € ð #ˆØð 	+˜×+Ò+¨GÑ4Ô4ð 	+Ø& q r rœlˆOð #2Ð>��°wˆð ˆØ—?’? :Ñ.Ô.ˆØð 	vàuÐS[ÐuÐuÐuˆMåØ—/’/ 'Ð+<Ñ=Ô=Ø#Ÿš¨Ñ6Ô6Ø$Ð,¨ØØØ(Ÿ_š_¨Z¸Ñ;Ô;Ð@¸qØØØ'ØJZÐd�#˜kŸošo¨j¸"Ñ=Ô=Ñ>Ô>ÐFÀ$øÐ`dØ —_’_ ZÑ0Ô0Ø×,Ò,¨[¯_ª_¸\Ñ-JÔ-JÑKÔKà#Ÿš¨Ñ/Ô/Ø"-§/¢/Ð2BÑ"CÔ"CØ*Ÿš¨}Ñ=Ô=ðð ð
ñ 
ô 
ˆð( 	Œ�Š�FÑÔÐØŒ�ŠÑÔÐØŒ�Š˜ÑÔÐð �WÒÐðiØRÐRÐRÐRÐRÐRØ*Ð*Ñ,Ô,Ð,Ð,øÝð ið ið iØ�
�
�
Ø”
× Ò Ð!gÐbcÐ!gÐ!gÐ!gÑhÔhÐhÐhÐhÐhÐhÐhøøøøðiøøøð
	dØPÐPÐPÐPÐPÐPØ Ð Ñ"Ô"Ð"Ð"øÝð 	dð 	dð 	dØˆJˆJˆJØŒJ×ÒÐbÐ]^ÐbÐbÐbÑcÔcÐcÐcÐcÐcÐcÐcøøøøð	døøøð ˆs0   ÆF& Æ&
GÆ0"GÇGÇ G1 Ç1
H'Ç;"H"È"H'Ú	stream_idÚchapters_datac                 óà  — |D ]Ñ}t          ||                     d|                     dd¦  «        ¦  «        t          |                     dd¦  «        ¦  «        pd|                     dd¦  «        |                     dd¦  «        pd|                     d	d¦  «        pd|                     d
d¦  «        ¬¦  «        }| j                             |¦  «         ŒÒ| j                             ¦   «          dS )zImport chapters from chat.jsonÚgameDisplayNamer"   r>   ÚgameIdNÚsubDescriptionÚstartMillisecondsr   ÚlengthMillisecondsÚthumbnailUrl)rY   Úgame_display_nameÚgame_idr"   Ústart_millisecondsÚlength_millisecondsrB   )r   r0   rJ   r   rL   rM   )r   rY   rZ   Úchapter_dataÚchapters        r   Úimport_chapters_from_chat_jsonz.ChatJsonService.import_chapters_from_chat_jsonn   sû   € ð *ð 
	!ð 
	!ˆLÝØ#Ø".×"2Ò"2Ð3DÀl×FVÒFVÐWdÐfhÑFiÔFiÑ"jÔ"jÝ˜L×,Ò,¨X°rÑ:Ô:Ñ;Ô;ÐC¸tØ(×,Ò,Ð-=¸rÑBÔBØ#/×#3Ò#3Ð4GÈÑ#KÔ#KÐ#PÈqØ$0×$4Ò$4Ð5IÈ1Ñ$MÔ$MÐ$RÐQRØ*×.Ò.¨~¸rÑBÔBðñ ô ˆGð ŒG�KŠK˜Ñ Ô Ð Ð àŒ�ŠÑÔÐÐÐr   Úcomments_datar/   c                 óò  — i }|                      dg ¦  «        }|D ]…}|                      d¦  «        }|rl||                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        ddœ||<   Œ†|                      d	g ¦  «        }|D ]…}|                      d¦  «        }|rl||                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        d	dœ||<   Œ†i }	|                      d
g ¦  «        }
t          |
t          ¦  «        rÉ|
D ]Æ}|                      d¦  «        }|r­t          |t          ¦  «        r˜d|v r”|                      di ¦  «        }|                     ¦   «         D ]i\  }}t          |t          ¦  «        rO|› d|› �}|||                      d|¦  «        |                      dd¦  «        |                      dd¦  «        d
dœ|	|<   ŒjŒÇ|D �]¾}|                      di ¦  «        }|                      di ¦  «        }|                      dg ¦  «        }g }|D ]c}|                      d¦  «        }|rJ||v rF|                     ||                      d¦  «        |                      d¦  «        ||         dœ¦  «         Œd|                      dg ¦  «        }g }|D ]o}|                      d¦  «        }|                      dd¦  «        }|› d|› �}||	v r"|                     i |¥d|	|         i¥¦  «         ŒZ|                     |¦  «         Œp| j                             ||                      dd¦  «        |                      dd¦  «        |                      d d!¦  «        pd!|                      d"d#¦  «        |||                      d$¦  «        ¬%¦  «         �ŒÀd&S )'z#Import chat messages from chat.jsonÚ
firstPartyr&   Ú
imageScaleÚdatar$   ÚwidthÚheight)r&   rl   rm   r$   rn   ro   ÚsourceÚ
thirdPartyÚtwitchBadgesÚversionsú:r!   r"   r>   Úbytes)r$   Úversionr!   r"   ru   rp   Ú	commenterÚmessageÚ	emoticonsÚ_idÚbeginÚend)r&   r{   r|   Ú
image_dataÚuser_badgesrv   Ú1r/   Údisplay_nameÚUnknownÚbodyÚcontent_offset_secondsr   Ú
user_colorz#9146FFÚlogo)rY   Úusernamerx   Útimestamp_offsetÚcolorÚemotesÚbadgesÚuser_avatar_urlN)r0   Ú
isinstanceÚlistÚdictÚitemsÚappendr   Úcreate_chat_message)r   rY   ri   r/   Úemote_mappingÚfirst_party_emotesÚemoteÚemote_idÚthird_party_emotesÚbadge_mappingÚtwitch_badgesÚbadgeÚ
badge_namers   Úversion_numÚversion_dataÚ	badge_keyÚcommentrw   rx   ry   Úmapped_emotesÚemoticonÚemoticon_idr~   Úmapped_badgesÚbadge_versions                              r   Ú#import_chat_messages_from_chat_jsonz3ChatJsonService.import_chat_messages_from_chat_json‚   sŠ  € ð ˆð +×.Ò.¨|¸RÑ@Ô@ÐØ'ð 	ð 	ˆEØ—y’y ‘”ˆHØð 	à"Ø"'§)¢)¨LÑ"9Ô"9Ø!ŸIšI fÑ-Ô-Ø!ŸIšI fÑ-Ô-Ø"ŸYšY wÑ/Ô/Ø#Ÿiši¨Ñ1Ô1Ø*ð+ð +�˜hÑ'øð +×.Ò.¨|¸RÑ@Ô@ÐØ'ð 	ð 	ˆEØ—y’y ‘”ˆHØð 	à"Ø"'§)¢)¨LÑ"9Ô"9Ø!ŸIšI fÑ-Ô-Ø!ŸIšI fÑ-Ô-Ø"ŸYšY wÑ/Ô/Ø#Ÿiši¨Ñ1Ô1Ø*ð+ð +�˜hÑ'øð ˆØ%×)Ò)¨.¸"Ñ=Ô=ˆÝ�m¥TÑ*Ô*ð 	Ø&ð ð �Ø"ŸYšY vÑ.Ô.�
Øð ¥*¨UµDÑ"9Ô"9ð ¸jÈEÐ>QÐ>QØ$Ÿyšy¨°RÑ8Ô8�HØ5=·^²^Ñ5EÔ5Eð 
ð 
Ñ1˜ \Ý% lµDÑ9Ô9ð 	Ø+5Ð(EÐ(E¸Ð(EÐ(E˜Ià(2Ø+6Ø)5×)9Ò)9¸'À:Ñ)NÔ)NØ/;×/?Ò/?ÀÈrÑ/RÔ/RØ)5×)9Ò)9¸'À2Ñ)FÔ)FØ*8ð8ð 8˜M¨)Ñ4øøð %ð *	ñ *	ˆGØŸš K°Ñ4Ô4ˆIØ—k’k )¨RÑ0Ô0ˆGð  Ÿš K°Ñ4Ô4ˆIØˆMØ%ð ð �Ø&Ÿlšl¨5Ñ1Ô1�Øð  ;°-Ð#?Ð#?Ø!×(Ò(Ø)Ø!)§¢¨gÑ!6Ô!6Ø'Ÿ|š|¨EÑ2Ô2Ø&3°KÔ&@ð	*ð *ñ ô ð øð "Ÿ+š+ m°RÑ8Ô8ˆKØˆMØ$ð 0ð 0�Ø"ŸYšY uÑ-Ô-�
Ø %§	¢	¨)°SÑ 9Ô 9�Ø)Ð;Ð;¨MÐ;Ð;�	Ø Ð-Ð-Ø!×(Ò(ð *Øð*à'¨°yÔ)Að*ð *ñ ô ð ð ð "×(Ò(¨Ñ/Ô/Ð/Ð/àÔ×1Ò1Ø#Ø"Ÿš ~°yÑAÔAØŸš F¨BÑ/Ô/Ø!(§¢Ð-EÀqÑ!IÔ!IÐ!NÈQØ—k’k ,°	Ñ:Ô:Ø$Ø$Ø )§¢¨fÑ 5Ô 5ð 2ñ 	ô 	ð 	ñ 	ðC*	ð *	r   Údatetime_strc                 óŒ   — |sdS 	 t          j        |                     dd¦  «        ¦  «        S # t          t          f$ r Y dS w xY w)z,Parse ISO datetime string to datetime objectNÚZz+00:00)r	   ÚfromisoformatÚreplaceÚ
ValueErrorÚAttributeError)r   r¥   s     r   rK   zChatJsonService._parse_datetimeê   s\   € àð 	Ø�4ð	ÝÔ)¨,×*>Ò*>¸sÀHÑ*MÔ*MÑNÔNÐNøÝ�NÐ+ð 	ð 	ð 	Ø�4�4ð	øøøs   †'. ®AÁA)NFF)Ú__name__Ú
__module__Ú__qualname__r   r   r   rJ   r   r3   r   r   ÚfloatÚboolr   rX   r   rh   r¤   r	   rK   © r   r   r   r      s‘  € € € € € ð,˜7ð ,ð ,ð ,ð ,ð
¨¨c°3¨h¬ð 
¸DÀÀcÀ¼Nð 
ð 
ð 
ð 
ð: 04ØØ!&ðBð BàðBð ˜3”-ðBð ˜#˜s˜(”^ð	Bð
 & eœ_ðBð ðBð ðBð 
ðBð Bð Bð BðHàðð ˜D  c œNÔ+ðð ð ð ð(fàðfð ˜D  c œNÔ+ðfð ˜C ˜H”~ð	fð fð fð fðP¨H°S¬Mð ¸hÀxÔ>Pð ð ð ð ð ð r   r   )Úsqlalchemy.ormr   Útypingr   r   r   r   Úuuidr   r	   r
   ÚrequestsÚosÚmodels.streamr   Úmodels.chat_messager   ÚChatMessageModelÚmodels.chapterr   Úservices.chat_servicer   r   r±   r   r   ú<module>r¼      sû   ðØ "Ð "Ð "Ð "Ð "Ð "Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø €€€Ø 	€	€	€	Ø "Ð "Ð "Ð "Ð "Ð "Ø AÐ AÐ AÐ AÐ AÐ AØ $Ð $Ð $Ð $Ð $Ð $Ø /Ð /Ð /Ð /Ð /Ð /ðdð dð dð dð dñ dô dð dð dð dr   