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
st	| j|}| j|d dt
|d| jid t fdddD r| jd dd dd	}|rt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 |sq"|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}|sbqt|jd}|rt jd|}|r|j|jd|jd|jdddddd  q|jd!d"}|jd#}| st|t rq|| }|jd$}|sq|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 qW |j| qW qW 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 st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   xt 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
    
