
    yEi                     v    d 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 ddl	m
Z
mZ dd	lmZmZ  G d
 de
      Zy)z2YouTube Data API v3 collector for trending videos.    N)List)datetime)build)	HttpError   )BaseCollector	TrendItem)YOUTUBE_CATEGORIESMAX_ITEMS_PER_SOURCEc                   8     e Zd ZdZ fdZdedee   fdZ xZ	S )YouTubeCollectorz2Collects trending videos from YouTube Data API v3.c                     t         |   d       t        j                  j	                  d      | _        d | _        | j
                  rt        dd| j
                        | _        y y )NyoutubeYOUTUBE_API_KEYv3)developerKey)super__init__osenvirongetapi_keyr   r   )self	__class__s    </home/sietch6/trending-topics-pipeline/collectors/youtube.pyr   zYouTubeCollector.__init__   sL    #zz~~&78<< Dt||LDL     regionreturnc                    | j                   st        d      t               }g }	 | j                   j                         j	                  dd|d      j                         }|j                  dg       D ]  }|d   }||v r|j                  |       |d   }|j                  d	i       }t        |j                  d
d      xs d      }	|j                  t        |d   dd|t        j                         j                         d| ||j                  dd      dd|j                  d
d      |	|j                  dd      |j                  dd      d              	 t!        j"                         D ]D  \  }}	 | j                   j                         j	                  dd|t%        |      d      j                         }|j                  dg       D ]  }|d   }||v r|j                  |       |d   }|j                  d	i       }t        |j                  d
d      xs d      }	|j                  t        |d   dd|t        j                         j                         d| ||j                  dd      |||j                  d
d      |	|j                  dd      |j                  dd      d              G |j'                  d d       t)        |d !      D ]  \  }}||_         |S # t        $ r)}
| j                  j                  d|
        Y d}
~
d}
~
ww xY w# t        $ r/}
| j                  j                  d| d| d|
        Y d}
~
d}
~
ww xY w)"aQ  
        Collect trending videos from YouTube mostPopular chart.

        Queries each category separately (since unified trending was removed July 2025),
        then deduplicates and ranks by view count.

        Args:
            region: Two-letter region code (US, CA)

        Returns:
            List of TrendItem objects
        z,YOUTUBE_API_KEY environment variable not setzsnippet,statisticsmostPopular2   )partchart
regionCode
maxResultsitemsidsnippet
statistics	viewCountr   titler   zhttps://youtube.com/watch?v=channelTitle zGeneral/MixedN0	likeCountpublishedAt)video_idchannelcategorycategory_idviews
view_countlikespublished_at)
topic_namesourcerankr   	timestampurlmetadatazGeneral mostPopular: )r"   r#   r$   videoCategoryIdr%   z	Category z (z): c                 T    t        | j                  j                  dd      xs d      S )Nr5   r   )intr>   r   )xs    r   <lambda>z*YouTubeCollector.collect.<locals>.<lambda>   s    #ajjnnWa8=A> r   T)keyreverser   )start)r   
ValueErrorsetvideoslistexecuter   addrA   appendr	   r   utcnow	isoformatr   errorsr
   r&   strsort	enumerater;   )r   r   seen_idsr&   responsevideovid_idr(   statsr6   ecat_idcat_nameiitems                  r   collectzYouTubeCollector.collect   sk    ||KLL5+	<##%-'%!	     "gr2 tX%V$	*		,3 ;!:!?a@
#*7#3(%"*//"3"="="?:6(C(.'.{{>2'F(7+/%*YY{C%@*4%*YY{C%@,3KKr,J	"D !3 8 8 : 1	FH0LL'')T1+#)(+F#%   WY  &\\'26 E"4[F ) LL(#I.G!IIlB7E!$UYY{A%>%C!!DJLL!'.w'7#,!"#)&.oo&7&A&A&C">vh G,2+2;;~r+J,4/5).;)D.8).;)D07M20N	&1	h 	

> 	 	

 !a0 	GAtDI	 A  	<KK!6qc:;;	<f  ""Yvhb
#aS#IJs1   D3K' 5D=L'	L0LL	M%$MM)
__name__
__module____qualname____doc__r   rQ   r   r	   r^   __classcell__)r   s   @r   r   r      s&    <M~c ~d9o ~r   r   )rb   r   typingr   r   googleapiclient.discoveryr   googleapiclient.errorsr   baser   r	   configr
   r   r    r   r   <module>rj      s+    8 	   + , * ;I} Ir   