U
    $Pf0                     @   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/html5applyZanimeondemandATZCHZDEZLIZLUz(https://www.anime-on-demand.de/anime/161Z161z"Grimgar, Ashes and Illusions (OmU)z$md5:6681ce3c07c7189d255ac6ab23812d31idtitledescription   )urlZ	info_dictZplaylist_mincountz'https://www.anime-on-demand.de/anime/39T)r   Z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   |   \}}|d krd S | | jd d}d|kr@| d| j  | d|}|||d | jd|d| jdd	}|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   F/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/extractor/animeondemand.py	<genexpr>W   s     z)AnimeOnDemandIE._login.<locals>.<genexpr>)z>Logout<z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)Z_get_login_info_download_webpage
_LOGIN_URLZraise_geo_restrictedZIE_NAMEZ_form_hidden_inputsupdate_search_regex
startswithr   r   allr	   )selfusernamepasswordZ
login_pageZ
login_formZpost_urlr$   r   r    r"   _login7   s\         
      zAnimeOnDemandIE._loginc                 C   s   |    d S r   )r/   )r,   r   r   r"   _real_initialize_   s    z AnimeOnDemandIE._real_initializec                    s    		
d
kr<jdd 	
jd
dddd
d	jd

dd d d	fdd	d	fdd	fdd fdd
fdd}|  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 }t d| D ]}t|}|d}g }dD ]2}	||	}
t|
tr>t d|
r>|||	  q>|sxq|d}|d}|D ]d}
jd|
d	d d
}g }|r|| |r|| |s|d k	r|t| d	|}d	t
d ||f}g }|r|| |d jt|
|dd	| d dddd}|sTqt|d}|rt d|}|r||d|d|dddddd q|dd }|d!}|rt|tsq|| }|d"}|sq|d#}|d$g D ]}|d%}|sqt|}||g}|d&kr@|d' n$|d(d)ksZ|d*krd|d+ d	t
d |}|d&krj||d,d-|dd.}n6|d(d)ks|d*krqj|||dd/}nq|D ]}|||d0 q|| qqq|||d1S )2Nr   z,<input[^>]+class=["\'].*?streamstarter[^>]+>zdata-dialog-header)zdata-playlistzdata-otherplaylistzdata-streamz/?[\da-zA-Z]+z	data-langvaluezvideomaterialurl/\d+/([^/]+)/z
media kindr2   -z, ZvideomaterialzDownloading %s JSON ZXMLHttpRequestz.application/json, text/javascript, */*; q=0.01)zX-Requested-WithzX-CSRF-Tokenr   AcceptF)r   r1   Z	streamurlzF^(?P<url>rtmpe?://(?P<host>[^/]+)/(?P<app>.+/))(?P<playpath>mp[34]:.+)r   appZplaypathzYhttps://www.anime-on-demand.de/assets/jwplayer.flash-55abfb34080700304d49125ce9ffb4a6.swfTrtmpZflv)r   r7   Z	play_pathpage_urlZ
player_urlZrtmp_real_time	format_idextZ
startvideor   playlistr   r   sourcesfileZm3u8Zhlstypez
video/dashZmpdZdashZmp4Zm3u8_native)Zentry_protocolZm3u8_idr1   )Zmpd_idr1   )languageformat_note)r   r   formats)refindallr   get
isinstancer   matchappendr)   joinfilterZ_download_jsonr   r
   searchr   listr   Z_extract_m3u8_formatsZ_extract_mpd_formatsr(   extend)htmlvideo_idnumr   r   rB   Zinput_
attributesZplaylist_urlsZplaylist_keyZplaylist_urllangZ	lang_notekindZformat_id_listr:   rA   Zitem_id_listr<   Z
stream_urlr8   Zstart_videosourcefile_r;   Zfile_formatsf)
csrf_tokenr,   r   r   r"   extract_infow   s     


 


  




 	







       z3AnimeOnDemandIE._real_extract.<locals>.extract_infoc              	   3   s    | ||}|d r: |d  | }|| |V  |d std| }|r| }|d|d |d f |dt|dd |V  d S )	NrB   zidata-dialog-header=(["\'])(?P<title>.+?)\1[^>]+href=(["\'])(?P<href>.+?)\3[^>]*>(?P<kind>Teaser|Trailer)<z%s-%sr   rS   r   href)r   r   r   )Z_sort_formatscopyr(   rC   rK   r   lowerr   )rN   rO   common_inforP   inforV   m)rX   r,   r   r   r"   extract_entries   s&    
z6AnimeOnDemandIE._real_extract.<locals>.extract_entriesc           	      3   s   t td| dD ]x\}}jd|dd dd}|s4qtjd|d|d	}jd
|dd d	}d| }| ||d}|||D ]
}|V  q~qd S )Nz7(?s)<h3[^>]+class="episodebox-title".+?>Episodeninhalt<r   )z:class="episodebox-title"[^>]+title=(["\'])(?P<title>.+?)\1z-class="episodebox-title"[^>]+>(?P<title>.+?)<zepisodebox titler   r   z(?:Episode|Film)\s*(\d+)zepisode numberr2   z!(?:Episode|Film)\s*\d+\s*-\s*(.+)zepisode titlez
episode-%d)r   ZseriesZepisodeepisode_number)	enumeraterC   rD   r)   int)	rN   rP   Zepisode_htmlZepisodebox_titler`   Zepisode_titlerO   r\   e)anime_titler_   r,   r   r"   extract_episodes   sF            z7AnimeOnDemandIE._real_extract.<locals>.extract_episodesc                 3   s(    d}| ||D ]
}|V  qd S )Nr   r   )rN   rO   r\   rc   )anime_descriptionanime_idrd   r_   r   r"   extract_film  s    z3AnimeOnDemandIE._real_extract.<locals>.extract_filmc                  3   s:   d} D ]}d} |V  q| s6 D ]
}|V  q*d S )NFTr   )Zhas_episodesrc   )rg   re   rh   webpager   r"   entries   s    z.AnimeOnDemandIE._real_extract.<locals>.entries)N)N)Z	_match_idr&   _APPLY_HTML5_URLZ_html_search_metaZ_html_search_regexZplaylist_result)r,   r   rj   r   )rf   rg   rd   rW   r_   re   rh   rX   r,   r   ri   r"   _real_extractb   sL    
        l	
   zAnimeOnDemandIE._real_extractN)__name__
__module____qualname__Z
_VALID_URLr'   rk   Z_NETRC_MACHINEZ_GEO_COUNTRIESZ_TESTSr/   r0   rl   r   r   r   r"   r      s>   (r   )
__future__r   rC   commonr   compatr   utilsr   r   r	   r
   r   r   r   r   r   r   r"   <module>   s
    
