
    i52                         d dl Z d dlZd dlZd dlmZmZmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZmZmZ  e       Z G d d      Z G d	 d
      Z G d d      Z G d d      Z G d de      Zy)    N)urlparseparse_qs	urlencode
urlunparse)DictAny)BeautifulSoup)Console)create_clientget_userAgentcreate_client_curlc                   (    e Zd Zdeeef   fdZd Zy)WindowVideodatac                 h   || _         |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  d	d      | _	        |j                  d
d      | _
        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        y )Nid namefilenamesizequalitydurationviewsis_viewablestatusfpslegacy	folder_idcreated_at_diff)r   getr   r   r   r   r   r   r   r   r   r   r   r   r   )selfr   s     W/home/nidran/Documenti/script/streaming-community/StreamingCommunity/player/vixcloud.py__init__zWindowVideo.__init__   s    	xxb)&"-	!XXj"5&"-	 HHY3!XXj"5((7B/
!%-!<88Hb1((5"- HHXr2"hh{B7$(HH->$C    c                 Z   d| j                    d| j                   d| j                   d| j                   d| j                   d| j
                   d| j                   d| j                   d	| j                   d
| j                   d| j                   d| j                   d| j                   dS )NzWindowVideo(id=z, name='z', filename='z	', size='z', quality='z', duration='z	', views=z, is_viewable=z
, status='z', fps=z	, legacy=z, folder_id=z, created_at_diff='z'))r   r   r   r   r   r   r   r   r   r   r   r   r   r!   s    r"   __str__zWindowVideo.__str__(   sv    	$))M$--Xabfbkbkallxy}  zF  zF  yG  GT  UY  Ub  Ub  Tc  cl  mq  mw  mw  lx  xF  GK  GW  GW  FX  Xb  cg  cn  cn  bo  ov  w{  w  w  v@  @I  JN  JU  JU  IV  Vb  cg  cq  cq  br  rE  FJ  FZ  FZ  E[  []  ^  	^r$   N__name__
__module____qualname__r   strr   r#   r'    r$   r"   r   r      s    DT#s(^ D ^r$   r   c                   (    e Zd Zdeeef   fdZd Zy)WindowParameterr   c                     || _         |j                  di       }|j                  dd      | _        t        |j                  dd            | _        |j                  d      | _        y )Nparamstokenr   expiresurl)r   r    r2   r,   r3   r4   )r!   r   r1   s      r"   r#   zWindowParameter.__init__-   sQ    	(B' **Wb1


9b 9:88E?r$   c           	      p    d| j                    d| j                   d| j                   d| j                   d	S )NzWindowParameter(token='z', expires='z', url='z', data=))r2   r3   r4   r   r&   s    r"   r'   zWindowParameter.__str__4   s=    )$**\$,,xX\X`X`Waaijnjsjsittuvwr$   Nr(   r-   r$   r"   r/   r/   ,   s    #T#s(^ #xr$   r/   c                   l    e Zd Zed        Zed        Zed        Zed        Zed        Ze	d        Z
y)JavaScriptParserc                     | y t        |       } | j                  d      j                  d      } | j                  d      } | j                         } | S )Nzutf-8zunicode-escapez"')r,   encodedecodestrip)sss    r"   
fix_stringzJavaScriptParser.fix_string9   sJ    :WYYw&&'78XXe_XXZ	r$   c                 0    | y | j                  dd      } | S )Nz\//)replace)r4   s    r"   fix_urlzJavaScriptParser.fix_urlE   s    ;kk%%
r$   c                    t         j                  |       } dt        |       v sdt        |       v rt         j                  |       S | t        |       j	                         dk(  ry t        |       j	                         dk(  ryt        |       j	                         dk(  ry	 t        |       S # t        $ r  	 t        |       cY S # t        $ r Y Y | S w xY ww xY w)NhttphttpsnulltrueTfalseF)r8   r>   r,   rB   lowerint
ValueErrorfloat)values    r"   parse_valuezJavaScriptParser.parse_valueM   s     ++E2SZ7c%j#8#++E22=CJ,,.&8u:'u:(	u: 	U|# 	s0   
B* *	C4
C>C	C
CCCc                    | j                  d      j                         } i }t        j                  d|       }|D ]  \  }}t        j	                  |      }|j                         }|j                  d      rt        j                  |      ||<   U|j                  d      rt        j                  |      ||<   t        j                  |      ||<    |S )Nz{}zI([\'"]?[\w]+[\'"]?)\s*:\s*([^,{}]+|{[^}]*}|\[[^\]]*\]|\'[^\']*\'|"[^"]*"){[)	r<   refindallr8   r>   
startswithparse_objectparse_arrayrN   )obj_strresultkey_value_pairskeyrM   s        r"   rU   zJavaScriptParser.parse_objecte   s    --%++-**%qsz{) 		BJC"--c2CKKME$.;;EBs!!#&.::5As.::5As		B r$   c                 @   | j                  d      j                         } g }g }d}d}d}d }| D ]_  }|dv r|sd}|}n	||k(  rd}d }|sB|dk(  r|dz  }n7|d	k(  r|dz  }n,|d
k(  r'|dk(  r"|j                  |j                                d}[||z  }a |j                         r|j                  |j                                |D ]  }|j                         }|j                  d      r%|j                  t        j	                  |             Id|v sd|v rft        j                  d|      }	|	sj|	j                  d      }
|	j                  d      }t        j                  |j                  d            |d   |
<   |j                  t        j                  |              |S )Nz[]r   r   F)"'TrP      },activer4   z([\w]+)\":([^,}]+)   z"\)	r<   appendrT   r8   rU   rR   searchgrouprN   )arr_strrX   elementscurrent_elembrace_count	in_string
quote_typecharelemkey_value_matchrZ   rM   s               r"   rV   zJavaScriptParser.parse_arrayy   s   --%++-	
 	!Dz!  $I!%J4' %I!%J3;1$KS[1$KS[[A%5OOL$6$6$89#%LD L'	!* OOL..01 	BD::<Ds#.;;DABT!Ud]"$)),A4"H")//2C+11!4E&6&B&B5;;uCU&VF2JsO.::4@A	B r$   c                    t        j                  d|t         j                        }i }|D ]u  \  }}|j                         }|j	                  d      r| j                  |      ||<   <|j	                  d      r| j                  |      ||<   b| j                  |      ||<   w t        j                  d|      }|r#| j                  |j                  d            |d<   |S )Nzwindow\.(\w+)\s*=\s*([^;]+);?rP   rQ   z window\.canPlayFHD\s*=\s*(\w+);?r^   
canPlayFHD)
rR   rS   DOTALLr<   rT   rU   rV   rN   re   rf   )cls	js_stringassignmentsrX   var_namerM   can_play_fhd_matchs          r"   parsezJavaScriptParser.parse   s    jj!A9biiX* 	:OHeKKME$#&#3#3E#:x !!#&#&??5#9x #&??5#9x 	:  YY'JIV#&??3E3K3KA3N#OF< r$   N)r)   r*   r+   staticmethodr>   rB   rN   rU   rV   classmethodrx   r-   r$   r"   r8   r8   8   sy    	 	    .  & 1 1f  r$   r8   c                   d    e Zd Zddedededeeef   fdZdeddfd	Z	d
eddfdZ
ddZdefdZy)VideoSourceNr4   	is_seriesmedia_id	tmdb_datac                     dt               i| _        || _        || _        || _        d| _        d| _        |C|j                  d      | _        |j                  d      | _	        |j                  d      | _
        yd| _        d| _	        d| _
        y)aq  
        Initialize video source for streaming site.
        
        Args:
            - url (str): The URL of the streaming site.
            - is_series (bool): Flag for series or movie content
            - media_id (int, optional): Unique identifier for media item
            - tmdb_data (dict, optional): TMDB data with 'id', 's' (season), 'e' (episode)
        
user-agentNr   se)r   headersr4   r}   r~   
iframe_srcwindow_parameterr    tmdb_idseason_numberepisode_number)r!   r4   r}   r~   r   s        r"   r#   zVideoSource.__init__   s     %mo6"  $  $==.DL!*s!3D"+--"4DDL!%D"&Dr$   
episode_idreturnc                    i }| j                   r|dd}	 t        | j                        j                  | j                   d| j
                   |      }|j                          t        |j                  d      }|j                  d      j                  d      | _
        y
# t        $ r}t        j                  d	|         d
}~ww xY w)z
        Retrieve iframe source for specified episode.
        
        Args:
            episode_id (int): Unique identifier for episode
        1)r   next_episoder   z/iframe/)r1   html.parseriframesrczError getting iframe source: N)r}   r   r   r    r4   r~   raise_for_statusr	   textfindr   	Exceptionloggingerror)r!   r   r1   responsesoupr   s         r"   
get_iframezVideoSource.get_iframe   s     >>( #F

	$T\\:>>$((8TXTaTaSb?clr>sH%%' !>D"ii155e<DO 	MM9!=>	s   BB! !	C*CCscript_textc                 |   	 t         j                  t        |            }t        |j	                  d            | _        t        |j	                  d            | _        t        |j	                  d            | _	        t        j                  d       y# t        $ r}t        j                  d|         d}~ww xY w)z
        Convert raw script to structured video metadata.
        
        Args:
            script_text (str): Raw JavaScript/HTML script content
        )rt   rq   videomasterPlaylistg      ?zError parsing script: N)r8   rx   r,   boolr    rq   r   window_videor/   r   timesleepr   r   r   )r!   r   	converterr   s       r"   parse_scriptzVideoSource.parse_script   s    	(..[9I.JI #9==#>?DO +IMM',B CD$3IMMBR4S$TD!JJsO 	MM21#67	s   BB 	B;B66B;c                    	 | j                   ~t        j                  d       | j                  rH| j                  Q| j
                  Ed| j                    d| j                   d| j
                   d| _        nd| j                    d| _        | j                  t        | j                        j                  | j                        }|j                          t        |j                  d      }|j                  d	      j                  d
      j                  }| j                  |       yy# t        $ r}t!        j"                  d|         d}~ww xY w)zE
        Fetch and process video content from iframe source.
        Nz[red]Using API V.2zhttps://vixsrc.to/tv/r@   z	/?lang=itzhttps://vixsrc.to/movie/r   r   bodyscript)r   zError getting content: )r   consoleprintr}   r   r   r   r   r   r    r   r	   r   r   r   r   r   r   )r!   r   r   r   r   s        r"   get_contentzVideoSource.get_content  s0   	||'23>>))5$:M:M:Y,A$,,qQUQcQcPddefjfyfyez  {D  +E(@i&XDO *(>BB4??S))+ %X]]MB6*//9>> !!f!5 +  	MM3A378	s   D'D+ +	E4EEc                    | j                   syi }| j                  rd|d<   t        | j                   j                        }t	        |j
                        }d|v r|d   dgk(  rd|d<   |j                  | j                   j                  | j                   j                  d       t        |      }t        |j                  |            S )z
        Generate authenticated playlist URL.

        Returns:
            str: Fully constructed playlist URL with authentication parameters, or None if content unavailable
        Nr^   hbr   )r2   r3   )query)r   rq   r   r4   r   r   updater2   r3   r   r   _replace)r!   r1   
parsed_urlquery_paramsquery_strings        r"   get_playlistzVideoSource.get_playlist,  s     $$??F3Kd33778

 0 01,<#4#=F3K**00,,44
 	
 !(*--L-ABBr$   )NN)r   N)r)   r*   r+   r,   r   rJ   r   r   r#   r   r   r   r   r-   r$   r"   r|   r|      si    'C 'D 'C 'SWX[]`X`Sa '6S T 6  (<Cc Cr$   r|   c                   .    e Zd ZdefdZddededefdZy)	VideoSourceAnimer4   c                 l    dt               i| _        || _        d| _        d| _        d| _        d| _        y)z
        Initialize anime-specific video source.
        
        Args:
            - url (str): The URL of the streaming site.
        
        Extends base VideoSource with anime-specific initialization
        r   N)r   r   r4   src_mp4master_playlistr   r   )r!   r4   s     r"   r#   zVideoSourceAnime.__init__K  s6     %mo6#r$   r   
prefer_mp4r   c                    	 t        | j                        j                  | j                   d|       }|j	                          |j
                  j                         }|| _        t        | j                        j                  |      }|j	                          t        |j
                  d      }|j                  d      j                  d      j
                  }|j                  d      j                  d      d   j
                  j                  d      d   j                  dd	      | _        |s%| j                          | j!                         | _        |S # t$        $ r"}t'        j(                  d
|        Y d}~yd}~ww xY w)z
        Retrieve embed URL and extract video source.
        
        Args:
            episode_id (int): Unique identifier for episode
        
        Returns:
            str: Parsed script content
        r   z/embed-url/r   r   r   r^   z = r]   r   zError fetching embed URL: N)r   r   r    r4   r   r   r<   r   r   r	   r   find_allsplitrA   r   r   r   r   r   r   r   )	r!   r   r   r   	embed_urlvideo_responser   r   r   s	            r"   	get_embedzVideoSourceAnime.get_embed[  sE   	)$,,?CCtxxjP[\f[gDhiH%%' !++-I'DO +4<<@DDYON++- !!4!4mDDYYv&++H5::F99V,55h?BGGMMeTUVW__`ceghDL  "'+'8'8':$M 	MM6qc:;	s   EE 	F"E??FN)T)r)   r*   r+   r,   r#   rJ   r   r   r-   r$   r"   r   r   J  s(    C  #C #T #S #r$   r   )rR   r   r   urllib.parser   r   r   r   typingr   r   bs4r	   rich.consoler
   $StreamingCommunity.utils.http_clientr   r   r   r   r   r/   r8   r|   r   r-   r$   r"   <module>r      ss    
   B B     b a )^ ^*	x 	xH HVDC DCN4{ 4r$   