Ë
    [·j«6  ã                   óÄ  — d Z ddlZddlZddlZddlZddlmZ ddlmZ i dddddœ“d	ddddœ“d
dd
ddœ“ddd
ddœ“ddd
ddœ“ddd
ddœ“ddd
ddœ“ddd
ddœ“dddddœ“dddddœ“dddddœ“dddddœ“dddddœ“d ddddœ“d!d"d#ddœ“d$d%d#ddœ“d&d%d#ddœ“d%d#ddœd'd(ddœd'd(ddœd)d*ddœd)d*ddœd+dddœd%d,ddœd-œ¥Zg d.¢Z	d/„ Z
d0„ Zd1„ Zd2„ Zd3„ Zd4„ Zed5k(  r e«        yy)6uá   Append ðŸŽ¬ Top 5 Video Opportunities to Reddit gaps reports.

Scores each gap post by engagement + vertical relevance + visual potential,
then appends a markdown table section matching the banger-x video opportunity format.
é    N)Údatetime)ÚPathÚsleepg      ø?ÚNestraSleep©ÚweightÚverticalÚproductÚinsomniaÚposturezNeckLog+Úbackpaingffffffö?ÚtmjçÍÌÌÌÌÌô?ÚchronicpainÚmigraineç333333ó?ÚfibromyalgiaÚhermesagentúai-toolszHermes AgentÚstableDiffusionzAI videoÚgenerativeAIÚ
vibecodingz	AI codingÚfrugalgš™™™™™ñ?ÚecomÚgeneralÚdigitalnomadÚ	adhdwomenç      ð?Ú	lifestyleÚsocialskillsgÍÌÌÌÌÌì?Údecidingtobebettergš™™™™™é?Útravelgffffffæ?Útechç333333ã?Úfitness)Ú
confidenceÚroadtripÚonebagÚ
technologyÚpcmasterraceÚ	askredditÚ	xxfitness)zhow.*fixzhow.*relievez	how.*stopzhow.*improvezany.*exercisÚstretchÚroutineÚ	techniqueÚguideÚtutorialÚ
demonstratzshow mezpain in.*sleepr   Ú	alignmentzbefore.*afterÚ	transformc                 ó0  — g }d}g }| j                  d«      D �]c  }t        j                  d|«      }|r+|r|r|j                  ||f«       |j	                  d«      }g }ŒG|sŒJt        j                  d|«      }|r3|j                  |j	                  d«      |j	                  d«      |dœ«       t        j
                  d|«      }|rb|r`t        |j	                  d«      j                  d	d
«      «      |d   d<   t        |j	                  d«      j                  d	d
«      «      |d   d<   t        j                  d|«      }|s�Œ)|s�Œ-d|d   vs�Œ6d|v r"|j                  d«      d   j                  «       nd
|d   d<   �Œf |r|r|j                  ||f«       |S )z=Parse gaps report markdown, extract (subreddit, posts) pairs.Nú
z^## r/(\w+)é   z\*\*\[(.+?)\]\((.+?)\)\*\*é   )ÚtitleÚurlÚlineu(   â¬†ï¸�\s*([\d,]+)\s*\|\s*ðŸ’¬\s*([\d,]+)ú,Ú éÿÿÿÿÚupvotesÚcommentsu   Â¹\s*(Score|Patterns):Úpatternsz	Patterns:)	ÚsplitÚreÚmatchÚappendÚgroupÚsearchÚintÚreplaceÚstrip)	ÚcontentÚsectionsÚcurrent_subÚcurrent_postsr;   ÚmÚpmÚemÚpm2s	            ú:/home/kiro/trend-engine/trends/reddit/append_video_opps.pyÚextract_subreddit_postsrT   8   s‰  € à€HØ€KØ€Mà—‘˜dÓ#ó wˆÜ�H‰H�^ TÓ*ˆÙÙ™}Ø—‘ ¨mÐ <Ô=ØŸ'™' !›*ˆKØˆMØâä—‘Ð7¸Ó>ˆBÙØ×$Ñ$ØŸX™X a›[ØŸ8™8 A›;Ø ñ&ô ô —‘ÐFÈÓMˆBÙ‘mÜ/2°2·8±8¸A³;×3FÑ3FÀsÈBÓ3OÓ/P�˜bÑ! )Ñ,Ü03°B·H±H¸Q³K×4GÑ4GÈÈRÓ4PÓ0Q�˜bÑ! *Ñ-ô —(‘(Ð4°dÓ;ˆCÛ“}Ø ]°2Ñ%6Ó6Ø[fÐjnÑ[n°D·J±J¸{Ó4KÈBÑ4O×4UÑ4UÔ4WÐtv�M "Ñ% jÓ1ð;wñ> ‘}Ø�‰˜ mÐ4Ô5à€Oó    c                 óà  ‡— | j                  dd«      }| j                  dd«      }| j                  dd«      j                  «       Š||z   dkD  r|dz  |dz  z   dz  nd}|j                  «       }t        j                  |d	d
ddœ«      }|d   }d}t        D ]  }	t	        j
                  |	‰«      sŒd} n d‰v rdnd}
t        ˆfd„dD «       «      rdnd}||z  |z  |
z  |z  }t        |d«      |fS )z5Score a post for video opportunity potential (0-100).r?   r   r@   r9   r=   r8   é   r$   g      à?Úotherr   r   r   r   ú?r   r   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w)N© )Ú.0Úwr9   s     €rS   ú	<genexpr>zscore_post.<locals>.<genexpr>z   s   øè ø€ ÒZ¨!˜1 œ:ÑZùs   ƒ)zhow zwhat zwhy zany ztips r7   )ÚgetÚlowerÚVERTICAL_WEIGHTSÚVISUAL_PATTERNSrC   rG   ÚanyÚround)ÚpostÚ	subredditr?   r@   Ú
engagementÚsub_keyÚ	vert_infoÚ
vert_bonusÚvisual_scoreÚpatÚquestion_bonusÚ	how_bonusÚscorer9   s                @rS   Ú
score_postrp   b   s  ø€ à�h‰h�y !Ó$€GØ�x‰x˜
 AÓ&€HØ�H‰H�W˜bÓ!×'Ñ'Ó)€Eð :AÀ8Ñ9KÈqÒ8P�'˜A‘+ ¨1¡Ñ,°Ò4ÐVW€Jð �o‰oÓ€GÜ ×$Ñ$ W¸È'Ð^gÑ.hÓi€IØ˜8Ñ$€Jð €LÜò ˆÜ�9‰9�S˜%Õ ØˆLÙðð   5™L‘S¨c€NäÓZÐ/YÔZÔZ‘Ð`c€Ià˜Ñ# lÑ2°^ÑCÀiÑO€EÜ�˜‹?˜IÐ%Ð%rU   c                 ób  — | j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  «       }d d„}|dk(  ry|d	k(  rd
|v sd|v ryd|v sd|v ryd|v ryy|dk(  rd|v sd|v ryd|v sd|v ryy|r
|dk7  r|› d�S  ||j                  dd«      d«      }d|› d�S )!z3Generate a punchy video hook based on post content.r9   r=   r	   r   r
   c                 óp   — | j                  «       }t        |«      |k  r| S dj                  |d | «      dz   S )Nú ú...)rB   ÚlenÚjoin)ÚtextÚ	max_wordsÚwordss      rS   Útruncate_wordsz%generate_hook.<locals>.truncate_wordsˆ   s9   € Ø—
‘
“ˆÜˆu‹:˜Ò"ØˆKØ�x‰x˜˜j˜yÐ)Ó*¨UÑ2Ð2rU   r   uD   Your sleep quality is wrecking your health â€” here's the fix in 60sr   ÚneckÚhumpu=   That neck hump isn't permanent â€” here's what actually worksÚjawr   uC   TMJ relief in under 60 seconds â€” the jaw trick nobody talks aboutÚpainu=   Stop chasing pain relief â€” fix the root cause in your sleepuD   Your posture is the problem nobody diagnoses â€” here's the real fixr   ÚhermesÚagentuF   Hermes Agent vs Claude Code â€” the honest comparison nobody's postingÚvideoÚanimeuB   Everyone's making AI video wrong â€” here's the $0.05/gen pipelineu;   The tool stack nobody's talking about â€” 10x your workflowz  solves this in under 60 secondsrY   é   zThe answer to "z" is simpler than you think)é
   )r_   r`   rI   )	re   rf   ri   r9   r	   r
   Útitle_lowerrz   Úcores	            rS   Úgenerate_hookr‡      sù   € à�H‰H�W˜bÓ!€EØ�}‰}˜Z¨Ó3€HØ�m‰m˜I rÓ*€Gà—+‘+“-€Kó3ð �7ÒØVØ	�YÒ	Ø�[Ñ  F¨kÑ$9ØSØ�kÑ! U¨kÑ%9ØYØ�{Ñ"ØSØVØ	�ZÒ	Ø�{Ñ" g°Ñ&<Ø\Ø˜Ñ# w°+Ñ'=ØXØMÙ	�W 	Ò)Ø�Ð:Ð;Ð;ñ ˜eŸm™m¨C°Ó4°aÓ8ˆØ! $ Ð'CÐDÐDrU   c                 óp  — | j                  dd«      }| j                  dd«      }|j                  dd«      }|j                  dd«      }g }|dkD  r|j                  d|› d	�«       n5|d
kD  r|j                  d|› d�«       n|dkD  r|j                  d|› d�«       |dk\  r|j                  d|› d�«       n,|dkD  r|j                  d|› d�«       n|j                  d«       |dk7  r|j                  d|› d�«       |dv r|j                  d«       |dk(  r|j                  d«       dj                  |«      S )z4Explain why this post is a strong video opportunity.r?   r   r@   r	   r   r
   é2   u   ðŸ”¸ u    upvotes â€” proven demandr„   u   ðŸ“ˆ u    upvotes â€” growing interestõ   â¬†ï¸� ú upvotesé   õ   ðŸ’¬ u0    comments â€” active thread, reply still visibleu1    replies â€” low competition for reply visibilityu2   New thread â€” zero replies, first-mover advantageu   ðŸŽ¯ Direct z product fit©r   r   u6   ðŸ“¹ Visually demonstrable â€” perfect for short videor   u/   ðŸ› ï¸� Tool demo opportunity â€” show vs. tellõ    Â· )r_   rE   rv   )re   rf   ri   r?   r@   r	   r
   Úreasonss           rS   Úgenerate_why_videor‘   ¥   s;  € à�h‰h�y !Ó$€GØ�x‰x˜
 AÓ&€HØ�}‰}˜Z¨Ó3€HØ�m‰m˜I yÓ1€Gà€Gà�‚|Ø�‰˜˜w˜iÐ'AÐBÕCØ	�2ŠØ�‰˜˜w˜iÐ'DÐEÕFØ	�1ŠØ�‰˜  	¨Ð2Ô3à�2‚~Ø�‰˜˜x˜jÐ(XÐYÕZØ	�AŠØ�‰˜˜x˜jÐ(YÐZÕ[à�‰ÐKÔLà�)ÒØ�‰˜ g Y¨lÐ;Ô<ØÐ'Ñ'Ø�‰ÐOÔPØ�:ÒØ�‰ÐHÔIà�;‰;�wÓÐrU   c                 ó4
  — t        | «      5 }|j                  «       }ddd«       dv sd|v rt        d«       yt        |«      }|st        d«       yg }|D ]0  \  }}|D ]&  }t	        ||«      \  }}	|j                  ||||	f«       Œ( Œ2 |j                  d„ d¬	«       |dd
 }
|
st        d«       yt        j                  «       j                  d«      }g }|j                  d«       |j                  d«       |j                  d|› d�«       |j                  d«       |j                  d«       |j                  d«       t        |
d«      D ]á  \  }\  }}}}	|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      j                  dd«      j                  «       }t        |«      d kD  r|dd! d"z   }d#|› d$|› �}t        |||	«      }t!        |||	«      }|j                  d%|› d&|› d'|› d(|› d)|› d*|› d*|› d+�«       Œã |j                  d,«       t#        |d-„ d¬	«      }|D �cg c]  }|d.   j                  dd«      dkD  sŒ|‘Œ }}|dd
 }|�r-|j                  d/«       |j                  d|› d�«       |j                  d0«       |j                  d1«       |j                  d2«       t        |d«      D �]³  \  }\  }}}}	|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      j                  dd«      j                  «       }t        |«      d kD  r|dd! d"z   }g }|d3k\  r|j                  d4|› d5�«       n0|d6k\  r|j                  d7|› d8�«       n|j                  d7|› d9�«       |d3kD  r|j                  d#|› d:�«       n|d;kD  r|j                  d#|› d<�«       |	j                  d=d>«      }|	j                  d?d>«      }|d>k7  r|j                  d@|› dA�«       |dBv r|j                  dC«       dDj%                  |«      }t!        |||	«      }|j                  d%|› d&|› d'|› d(|› dE|› d*|› d*|› d+�«       �Œ¶ |j                  d,«       dj%                  |«      }t        | dF«      5 }|j'                  |«       ddd«       t        dGt        |
«      › dH�«       y# 1 sw Y   �ŒáxY wc c}w # 1 sw Y   Œ4xY w)IzNProcess a single gaps report and append the Top 5 Video Opportunities section.Nu   ðŸŽ¬ Top 5 Video OpportunitieszTop 5 Videou>     â�­ï¸�  Already has video opportunities section â€” skippingFu%     âš ï¸�  No subreddit sections foundc                 ó   — | d   S )Nr   r[   ©Úxs    rS   ú<lambda>zprocess_file.<locals>.<lambda>Ü   s
   € ˜a ™d€ rU   T)ÚkeyÚreverseé   u     âš ï¸�  No posts to scorez%Y-%m-%d %H:%Mz
---
u"   
## ðŸŽ¬ Top 5 Video Opportunitiesz
**Auto-generated:** z  ub   **Source:** Gap post analysis â€” ranked by engagement Ã— vertical relevance Ã— visual potential  zX
| Rank | Subreddit | Post Title | Engagement | Why It's a Video Pick | Suggested Hook |zU|------|-----------|-----------|------------|----------------------|----------------|r7   r9   ÚUntitledr?   r   r@   r:   ú#ú|z\|r6   rs   éP   éM   rt   rŠ   u    | ðŸ’¬ z| z | r/z | [z](z) | z | z |r=   c                 ó,   — | d   j                  dd«      S )Nr8   r@   r   )r_   r”   s    rS   r–   zprocess_file.<locals>.<lambda>  s   € ¨q°©t¯x©x¸
ÀAÓ/F€ rU   r8   u#   
### ðŸ’¬ Top 5 by Comment Activityua   **Source:** Gap posts ranked by pure comment count â€” indicates active discussion & engagement  zP
| Rank | Subreddit | Post Title | Comments | Why It's Active | Suggested Hook |zN|------|-----------|-----------|----------|-----------------|----------------|r‰   u   ðŸ’¥ u    comments â€” hot threadrŒ   r�   u    comments â€” active debateu     comments â€” discussion growingu    upvotes â€” high visibilityr„   r‹   r	   r   r
   u   ðŸŽ¯ z opportunityrŽ   u   ðŸ“¹ Video-reply readyr�   u	   ) | ðŸ’¬ Úau     âœ… Appended top z video opportunities)ÚopenÚreadÚprintrT   rp   rE   Úsortr   ÚnowÚstrftimeÚ	enumerater_   rI   rJ   ru   r‘   r‡   Úsortedrv   Úwrite)ÚfilepathÚfrK   rL   Úscoredrf   Úpostsre   ro   ri   Útop5Ú	generatedÚlinesÚir9   r?   r@   r:   Ú
safe_titleÚengagement_strÚwhyÚhookÚby_commentsr•   Útop5_commentsr�   r	   r
   Ú
why_activeÚsection_texts                                 rS   Úprocess_filerº   Å   si  € ä	ˆh‹ð ˜1Ø—&‘&“(ˆ÷ð (¨7Ñ2°mÀwÑ6NÜÐNÔPØä& wÓ/€HÙÜÐ5Ô7Øð €FØ$ò ?Ñˆ	�5Øò 	?ˆDÜ)¨$°	Ó:ÑˆE�9Ø�M‰M˜5 )¨T°9Ð=Õ>ñ	?ð?ð ‡K�K‘N¨D€KÔ1ð �"�1ˆ:€DáÜÐ+Ô-Øô —‘“×'Ñ'Ð(8Ó9€IØ€EØ	‡L�L�7ÔØ	‡L�LÐ6Ô8Ø	‡L�LÐ)¨)¨°BÐ7Ô8Ø	‡L�LÐuÔwØ	‡L�LÐlÔnØ	‡L�LÐhÔjä2;¸DÀ!Ó2Dò mÑ.ˆÑ.ˆE�9˜d IØ—‘˜ *Ó-ˆØ—(‘(˜9 aÓ(ˆØ—8‘8˜J¨Ó*ˆØ�h‰h�u˜cÓ"ˆð —]‘] 3¨Ó.×6Ñ6°t¸SÓA×GÑGÓIˆ
äˆz‹?˜RÒØ# C R˜¨5Ñ0ˆJà" 7 )¨8°H°:Ð>ˆÜ   y°)Ó<ˆÜ˜T 9¨iÓ8ˆà�‰�r˜!˜˜E ) ¨D°°¸B¸s¸eÀ4ÈÐGWÐWZÐ[^ÐZ_Ð_bÐcgÐbhÐhjÐkÕlð!mð$ 
‡L�L�Ôô ˜Ñ%FÐPTÔU€Kà)ÖI˜¨Q¨q©T¯X©X°jÀ!Ó-DÀqÓ-H’1ÐI€KÐIØ  �O€MâØ�‰Ð;Ô=Ø�‰Ð-¨i¨[¸Ð;Ô<Ø�‰ÐxÔzØ�‰ÐhÔjØ�‰ÐeÔgä6?ÀÈqÓ6Qó "	wÑ2ˆAÑ2��y $¨	Ø—H‘H˜W jÓ1ˆEØ—x‘x 
¨AÓ.ˆHØ—h‘h˜y¨!Ó,ˆGØ—(‘(˜5 #Ó&ˆCàŸ™ s¨EÓ2×:Ñ:¸4ÀÓE×KÑKÓMˆJÜ�:‹ Ò#Ø'¨¨˜_¨uÑ4�
ð ˆGØ˜2Š~Ø—‘  x jÐ0HÐIÕJØ˜R’Ø—‘  x jÐ0KÐLÕMà—‘  x jÐ0PÐQÔRà˜Š|Ø—‘ ¨¨	Ð1MÐNÕOØ˜2’Ø—‘ ¨¨	°Ð:Ô;à —}‘} Z°Ó;ˆHØ—m‘m I¨yÓ9ˆGØ˜)Ò#Ø—‘  w i¨|Ð<Ô=ØÐ/Ñ/Ø—‘Ð7Ô8àŸ™ WÓ-ˆJÜ   y°)Ó<ˆDà�L‰L˜2˜a˜S  i [°°Z°LÀÀ3À%ÀyÐQYÐPZÐZ]Ð^hÐ]iÐilÐmqÐlrÐrtÐuÖvðE"	wðH 	�‰�RÔð —9‘9˜UÓ#€Lô 
ˆh˜Ó	ð  Ø	�‰�Ô÷ô 
Ð¤ D£	˜{Ð*>Ð
?Ô@Ø÷qñ üò@ J÷hð ús#   ŒS<ÉT	É1T	Ó	TÓ<TÔTc                  óf  — t        t        j                  «      dkD  rt        j                  dd  ng } | s t        d«       t        j                  d«       | D ]Y  }t        |«      }|j                  «       st        d|› �«       Œ-t        d|j                  › d�«       t        t        |«      «       Œ[ y )Nr7   zMUsage: python3 append_video_opps.py <gaps_report_1.md> [gaps_report_2.md ...]u     â�Œ Not found: u   ðŸ“„ rt   )
ru   ÚsysÚargvr£   Úexitr   ÚexistsÚnamerº   Ústr)ÚfilesÚfpÚpaths      rS   ÚmainrÅ   A  sŽ   € Ü¤§¡›M¨AÒ-ŒC�H‰H�Q�R‰L°2€EÙÜÐ]Ô^Ü�‰�Œàò  ˆÜ�B‹xˆØ�{‰{Œ}ÜÐ% b TÐ*Ô+ØÜ��d—i‘i�[ Ð$Ô%Ü”S˜“YÕñ rU   Ú__main__)Ú__doc__rC   ÚjsonÚosr¼   r   Úpathlibr   ra   rb   rT   rp   r‡   r‘   rº   rÅ   Ú__name__r[   rU   rS   ú<module>rÌ      sô  ðñó 
Û Û 	Û 
Ý Ý ðà˜s°ÀMÑRðð ˜s°ÀMÑRðð
 ˜s°	ÀjÑQðð ˜s°	ÀjÑQðð 
˜s°	ÀjÑQðð ˜s°	ÀjÑQðð ˜s°	ÀjÑQðð ˜s°	ÀjÑQðð ˜s°
À~ÑVðð  #°:È*ÑUðð ˜s°
ÀzÑRðð ˜s°
À{ÑSðð  ˜s°À9ÑMð!ð" ˜s°À9ÑMð#ð& ˜s°È	ÑRð'ð( ˜s°È	ÑRð)ð*  S°kÈiÑXð+ð,  #°È	ÑRØ"°ÀYÑOØ"°ÀYÑOØ"°À9ÑMØ"°À9ÑMØ"°	ÀiÑPØ"°	ÀiÑPò9Ð ò@€ò(òT&ò:$EòL ò@zòx ð ˆzÒÙ…Fð rU   