3
�b`0  ã               @   s`   d dl mZ d dlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZ G dd	„ d	eƒZdS )
é    )Úunicode_literalsNé   )ÚInfoExtractoré   )Ú
compat_str)Údetermine_extÚextract_attributesÚExtractorErrorÚurl_or_noneÚurlencode_postdataÚurljoinc               @   s€   e Zd ZdZdZdZdZddddd	gZd
ddddœddœdddœdddœdddœdddœdddœgZdd„ Z	dd„ Z
dd„ ZdS )ÚAnimeOnDemandIEz8https?://(?:www\.)?anime-on-demand\.de/anime/(?P<id>\d+)z,https://www.anime-on-demand.de/users/sign_inz)https://www.anime-on-demand.de/html5applyÚanimeondemandÚATÚCHÚDEÚLIÚLUz(https://www.anime-on-demand.de/anime/161Z161z"Grimgar, Ashes and Illusions (OmU)z$md5:6681ce3c07c7189d255ac6ab23812d31)ÚidÚtitleÚdescriptioné   )ÚurlÚ	info_dictÚplaylist_mincountz'https://www.anime-on-demand.de/anime/39T)r   Úonly_matchingz(https://www.anime-on-demand.de/anime/162z(https://www.anime-on-demand.de/anime/169z(https://www.anime-on-demand.de/anime/185z'https://www.anime-on-demand.de/anime/12c                sð   | j ƒ \}}|d krd S | j| jd dƒ}d|kr@| jd| j ƒ | jd|ƒ}|j||dœƒ | jd|d| jdd	�}|jd
ƒsˆt	| j|ƒ}| j|d dt
|ƒd| jid�‰ t‡ fdd„dD ƒƒrì| jdˆ dd dd	�}|rätd| dd�‚tdƒ‚d S )NzDownloading login pageza>Our licensing terms allow the distribution of animes only to German-speaking countries of Europez;%s is only available in German-speaking countries of EuropeZnew_user)zuser[login]zuser[password]z&<form[^>]+action=(["\'])(?P<url>.+?)\1zpost urlr   )ÚdefaultÚgroupÚhttpz
Logging inÚReferer)ÚdataÚheadersc             3   s   | ]}|ˆ kV  qd S )N© )Ú.0Úp)Úresponser"   úNC:\Users\Broad\Desktop\All-Down\binaries\youtube_dl\extractor\animeondemand.pyú	<genexpr>W   s    z)AnimeOnDemandIE._login.<locals>.<genexpr>ú>Logout<úhref="/users/sign_out"zQ<p[^>]+\bclass=(["\'])(?:(?!\1).)*\balert\b(?:(?!\1).)*\1[^>]*>(?P<error>.+?)</p>ÚerrorzUnable to login: %sT)ÚexpectedzUnable to log in)r(   r)   )Ú_get_login_infoÚ_download_webpageÚ
_LOGIN_URLÚraise_geo_restrictedÚIE_NAMEÚ_form_hidden_inputsÚupdateÚ_search_regexÚ
startswithr   r   Úallr	   )ÚselfÚusernameÚpasswordÚ
login_pageÚ
login_formÚpost_urlr*   r"   )r%   r&   Ú_login7   s8    

zAnimeOnDemandIE._loginc             C   s   | j ƒ  d S )N)r<   )r6   r"   r"   r&   Ú_real_initialize_   s    z AnimeOnDemandIE._real_initializec                sà   ˆj ˆƒ‰ˆjˆˆƒ}d|kr<ˆjˆjˆddƒ ˆjˆˆƒ}ˆjd|ddd�‰ˆjd|d	ƒ‰ˆjd
|dd d�‰ g ‰d‡‡‡fdd„	‰d‡‡‡‡fdd„	‰‡‡‡fdd„}‡ ‡‡‡fdd„}||ƒ ˆsÐ||ˆƒ ˆjˆˆˆˆ ƒS )Nzdata-playlist=zActivating HTML5 betazUnable to apply HTML5 betaz
csrf-tokenz
csrf tokenT)Úfatalz+(?s)<h1[^>]+itemprop="name"[^>]*>(.+?)</h1>z
anime namez4(?s)<div[^>]+itemprop="description"[^>]*>(.+?)</div>zanime description)r   c                s&  d gd \}}g }�xt jd| ƒD �]ò}t|ƒ}|jdƒ}g }x:d4D ]2}	|j|	ƒ}
t|
tƒrDt jd|
ƒrD|j||	 ƒ qDW |s€q"|jdƒ}|jd	ƒ}�x~|D �]t}
ˆjd
|
dd d�}g }|rÆ|j|ƒ |rÔ|j|ƒ | rð|d k	rð|jt|ƒƒ dj	|ƒ}dj	t
d ||fƒƒ}g }|�r"|j|ƒ |jdƒ ˆjtˆ|
ƒ|ddj	|ƒ dˆ ˆddœdd�}|�sbqœt|jdƒƒ}|�r¸t jd|ƒ}|�r¸|j|jdƒ|jdƒ|jdƒˆddddd œƒ qœ|jd!d"ƒ}|jd#ƒ}| sœt|tƒ �räqœ|| }|jd$ƒ}|�sþqœ|jd%ƒ}�x|jd&g ƒD ]ö}|jd'ƒ}|�s0�qt|ƒ}||g}|d(k�rV|jd)ƒ n$|jd*ƒd+k�sp|d,k�rz|jd-ƒ dj	t
d |ƒƒ}|d(k�r¬ˆj||d.d/|dd0�}n6|jd*ƒd+k�s|d,k�r�qˆj|||dd1�}n�qx|D ]}|j||d2œƒ �qèW |j|ƒ �qW qœW q"W |||d3œS )5Nr   z,<input[^>]+class=["\'].*?streamstarter[^>]+>zdata-dialog-headerúdata-playlistúdata-otherplaylistúdata-streamz/?[\da-zA-Z]+z	data-langÚvaluezvideomaterialurl/\d+/([^/]+)/z
media kind)r   ú-z, ZvideomaterialzDownloading %s JSONú ZXMLHttpRequestz.application/json, text/javascript, */*; q=0.01)zX-Requested-WithzX-CSRF-Tokenr   ÚAcceptF)r!   r>   Z	streamurlzF^(?P<url>rtmpe?://(?P<host>[^/]+)/(?P<app>.+/))(?P<playpath>mp[34]:.+)r   ÚappÚplaypathzYhttps://www.anime-on-demand.de/assets/jwplayer.flash-55abfb34080700304d49125ce9ffb4a6.swfTÚrtmpÚflv)r   rF   Ú	play_pathÚpage_urlÚ
player_urlÚrtmp_real_timeÚ	format_idÚextZ
startvideor   Úplaylistr   r   ÚsourcesÚfileÚm3u8ÚhlsÚtypez
video/dashÚmpdÚdashÚmp4Úm3u8_native)Úentry_protocolÚm3u8_idr>   )Úmpd_idr>   )ÚlanguageÚformat_note)r   r   Úformats)r?   r@   rA   )ÚreÚfindallr   ÚgetÚ
isinstancer   ÚmatchÚappendr3   ÚjoinÚfilterÚ_download_jsonr   r
   Úsearchr   Úlistr   Ú_extract_m3u8_formatsÚ_extract_mpd_formatsr2   Úextend)ÚhtmlÚvideo_idÚnumr   r   r_   Zinput_Z
attributesZplaylist_urlsZplaylist_keyZplaylist_urlÚlangZ	lang_noteÚkindZformat_id_listrN   r^   Zitem_id_listrP   Z
stream_urlrH   Zstart_videoÚsourceZfile_rO   Zfile_formatsÚf)Ú
csrf_tokenr6   r   r"   r&   Úextract_infoy   sÀ    



















z3AnimeOnDemandIE._real_extract.<locals>.extract_infoc                s¦   ˆ| ||ƒ}|d r>ˆj |d ƒ |jƒ }|j|ƒ ˆ j|ƒ |d s¢tjd| ƒ}|r¢|jƒ }|jd|d |jdƒjƒ f |jdƒtˆ|jdƒƒdœƒ ˆ j|ƒ d S )	Nr_   zidata-dialog-header=(["\'])(?P<title>.+?)\1[^>]+href=(["\'])(?P<href>.+?)\3[^>]*>(?P<kind>Teaser|Trailer)<z%s-%sr   rr   r   Úhref)r   r   r   )	Ú_sort_formatsÚcopyr2   re   r`   ri   r   Úlowerr   )rn   ro   Úcommon_inforp   Úinfort   Úm)Úentriesrv   r6   r   r"   r&   Úextract_entrieså   s"    

z6AnimeOnDemandIE._real_extract.<locals>.extract_entriesc                sˆ   x‚t tjd| ƒdƒD ]l\}}ˆjd|dd dd�}|s6qtˆjd|d	|d
�ƒ}ˆjd|dd d
�}d| }|ˆ ||dœ}ˆ|||ƒ qW d S )Nz7(?s)<h3[^>]+class="episodebox-title".+?>Episodeninhalt<r   ú:class="episodebox-title"[^>]+title=(["\'])(?P<title>.+?)\1ú-class="episodebox-title"[^>]+>(?P<title>.+?)<zepisodebox titler   )r   r   z(?:Episode|Film)\s*(\d+)zepisode number)r   z!(?:Episode|Film)\s*\d+\s*-\s*(.+)zepisode titlez
episode-%d)r   ÚseriesÚepisodeÚepisode_number)r€   r�   )Ú	enumerater`   ra   r3   Úint)rn   rp   Zepisode_htmlZepisodebox_titler„   Úepisode_titlero   r{   )Úanime_titler   r6   r"   r&   Úextract_episodesü   s(     z7AnimeOnDemandIE._real_extract.<locals>.extract_episodesc                s   ˆˆˆ dœ}ˆ| ||ƒ d S )N)r   r   r   r"   )rn   ro   r{   )Úanime_descriptionÚanime_idrˆ   r   r"   r&   Úextract_film  s    z3AnimeOnDemandIE._real_extract.<locals>.extract_film)N)N)Ú	_match_idr-   Ú_APPLY_HTML5_URLÚ_html_search_metaÚ_html_search_regexÚplaylist_result)r6   r   Úwebpager‰   rŒ   r"   )	rŠ   r‹   rˆ   ru   r~   r   rv   r6   r   r&   Ú_real_extractb   s0    
l
zAnimeOnDemandIE._real_extractN)Ú__name__Ú
__module__Ú__qualname__Ú
_VALID_URLr.   rŽ   Ú_NETRC_MACHINEÚ_GEO_COUNTRIESÚ_TESTSr<   r=   r“   r"   r"   r"   r&   r      s.   
(r   )Ú
__future__r   r`   Úcommonr   Úcompatr   Úutilsr   r   r	   r
   r   r   r   r"   r"   r"   r&   Ú<module>   s
    
