
    i+                     P    d dl Z d dlmZ d dlmZmZ d dlmZmZm	Z	  G d d      Z
y)    N)BeautifulSoup)create_clientget_userAgent)SeasonManagerEpisodeSeasonc                   Z    e Zd Zd ZddZddZddZdefdZdede	fd	Z
ded
edefdZy)GetSerieInfoc                 R    dt               i| _        || _        t               | _        y)z
        Initialize the GetSerieInfo class for scraping TV series information.
        
        Args:
            - url (str): The URL of the streaming site.
        z
user-agentN)r   headersurlr   seasons_manager)selfr   s     i/home/nidran/Documenti/script/streaming-community/StreamingCommunity/services/altadefinizione/scrapper.py__init__zGetSerieInfo.__init__   s#     %mo6,    returnNc                    t        | j                        j                  | j                        }t	        |j
                  d      }|j                  d      }|r*|j                  d      j                  d      d   | _	        nd| _	        |j                  d	d
      }|r| j                  |       y| j                  |       y)z8
        Retrieve all episodes for all seasons.
        )r   zhtml.parsertitleTstripz - r   zUnknown Seriesdivzseries-selectclass_N)r   r   getr   r   textfindget_textsplitseries_name_parse_dropdown_structure_parse_tabs_structure)r   responsesoup	title_tagseries_selects        r   collect_seasonzGetSerieInfo.collect_season   s     !6::488DX]]M: IIg&	(111=CCEJ1MD/D 		%	@**=9 &&t,r   c           	         |j                  dd      }|st        j                  d       y|j                  dddi      }|D ]  }	 t	        |j                  d            }|j                  d	      }| j                  j                  t        ||
            }|j                  dddt        |      i      }|st        j                  d| d       |j                  dddi      }	|	D ]  }
	 |
j                  d      }|s|j                  d      }t        |      dk7  r9t	        |d         }|
j                  d	      }|j                  ddt        |      |d      }d}|rC|j                  dddi      }|D ]*  }|j                  dd      j                         }d|v s(|} n |r*|r(|j                  j                  t        |||             nt        j                  d| d|        	  y# t         $ r#}t        j"                  d|        Y d}~5d}~ww xY w# t         $ r#}t        j"                  d|        Y d}~d}~ww xY w)z9
        Parse the new dropdown-based structure.
        r   zdropdown seasonsr   zSeason dropdown not foundNspandata-seasonTr   numbernamezdropdown episodesr   attrszEpisode dropdown for season 
 not founddata-episode-      zdropdown mirrors)r*   r1   	data-link 
supervideor,   r-   r   )Supervideo link not available for Season 
, Episode Error parsing episode: Error parsing season: )r   loggingwarningfind_allintr   r   r   addr   strr   lenr   episodesr   	Exceptionerror)r   r&   season_dropdownseason_itemsseason_item
season_numseason_namecurrent_seasonepisode_dropdownepisode_itemsep_itemdata_episodepartsep_numep_titlemirrors_dropdownsupervideo_urlmirror_linksmirrorlinkes                        r   r!   z&GetSerieInfo._parse_dropdown_structure1   s   
 (,,U;M,NOO78&//8MN' =	K< !?@
)222> "&!5!5!9!9&%$; " $1#5#5eDW`mors}o~_#5  $A 'OO&B:,j$YZ 0 9 9&>SWBX Y, &!G%!'.{{>'B+$ !- 2 23 7u:?$!$U1X#*#3#3$#3#? ,9+=+=eL^vy  {E  wF  Xd  ge+=  ,f()-++;+D+DVk[_M`+aL*6 *'-zz+r'B'H'H'J#/4#759N$)	* *n*3377'-%-$29  $OO.WXbWccmntmu,vwE&!'=	n % !(?s&CD !   6qc:;si   BH'H'/G8H'G8"H'#BG8%AG81H'8	H$HH'H$$H''	I0IIc           	      .   |j                  dd      }|st        j                  d       y|j                  dd      }|st        j                  d       y|j                  d	d
di      }|D ]G  }	 |j	                  dd      }|j                  d      s)t        |j                  dd            }d| }| j                  j                  t        ||            }	|j                  dd|       }
|
st        j                  d| d       |
j                  d      }|D ]  }	 |j                  d	ddi      }|s|j	                  dd      }|j	                  dd      }|j	                  dd      j                         }|sc|j                  d      }t        |      dk7  rt        |d         }d| }|rO|j                  d| d      r!|t        d| d      d j                         }n|j                  d|       r|}n|}|r|dk(  rS|j                  dd       }|r>|j                  d	d!ddi"      }|r&|j	                  dd      j                         }d#|v r|}|r3|dk7  r.d#|v r*|	r(|	j                  j                  t        |||$             nt        j                  d%| d&|         J y# t         $ r#}t        j"                  d'|        Y d}~d}~ww xY w# t         $ r#}t        j"                  d(|        Y d}~d}~ww xY w))z5
        Parse the old tabs-based structure.
        r   tabs_holder)idztabs_holder div not foundN	tt_seasonr   ztt_season div not foundazdata-toggletabhrefr6   z#season-z	Stagione r+   zseason-zTab pane for season r0   lir5   Tzdata-numz
data-titlexr3   r4   z	Episodio :z: #mirrorsmrr.   r7   r8   r9   r:   r;   r<   )r   r=   r>   r?   r   
startswithr@   replacer   rA   r   r   r   rC   rD   r   rE   rF   )r   r$   r[   r]   season_linksseason_linkr`   rJ   rK   rL   tab_panerN   rO   ep_linkdata_num
data_titlerU   rQ   rR   rS   mirrors_divsupervideo_linklink_urlrY   s                           r   r"   z"GetSerieInfo._parse_tabs_structure|   sS   
 ii-i8OO78  $$U;$?	OO56 ))#u/EF' U	KT"vr2z2 j"!=>
 )*6 "&!5!5!9!9&%$; " '++E
|6L+MOO&::,j$QR !) 1 1$ 7, 8!G7!"),,s[$4G"H&$ $+;;z2#>%,[[r%B
)0[")E)K)K)M'$ !)s 3u:?$!$U1X &/vh#7%)44y5JK+5cIfXR:P6Q6R+S+Y+Y+[!+!6!66(7K!L+5+5  .31F*1,,uY,*OK*2=2B2B3t\gim[n2B2o#2/>/B/B;PR/S/Y/Y/[H'3x'?9A *n.CXfHfky*3377'-%-$29  $OO.WXbWccmntmu,vwi8!3U	^ % !(?s&CD !   6qc:;su   2#K(A7K(K(&J9<K(=AJ9K(J9#K($DJ92K(9	K%K K( K%%K((	L1LLc                     | j                   j                  s| j                          t        | j                   j                        S )zK
        Get the total number of seasons available for the series.
        )r   seasonsr'   rC   )r   s    r   getNumberSeasonzGetSerieInfo.getNumberSeason   s6     ##++!4''//00r   season_numberc                     | j                   j                  s| j                          | j                   j                  |      }|r|j                  j                  S g S )z9
        Get all episodes for a specific season.
        )r   rs   r'   get_season_by_numberrD   )r   ru   seasons      r   getEpisodeSeasonszGetSerieInfo.getEpisodeSeasons   sN     ##++! %%::=I+1v''9r9r   episode_indexc                     | j                  |      }|r|dk  s|t        |      k\  rt        j                  d| d|        y||   S )zN
        Get information for a specific episode in a specific season.
        r   zEpisode index z is out of range for season N)ry   rC   r=   rF   )r   ru   rz   rD   s       r   selectEpisodezGetSerieInfo.selectEpisode   sS     ))-8=1,X0NMMN=/9UVcUdef&&r   )r   N)__name__
__module____qualname__r   r'   r!   r"   r@   rt   listry   r   r|    r   r   r
   r
      sS    	/-,IVgV1 1	:s 	:t 	:	'3 	's 	'w 	'r   r
   )r=   bs4r   $StreamingCommunity.utils.http_clientr   r   (StreamingCommunity.services._base.objectr   r   r   r
   r   r   r   <module>r      s'      N S Su' u'r   