o
    iSr                     @   s  d dl 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dud	d
ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZG d'd( d(eZG d)d* d*eZG d+d, d,eZG d-d. d.eZ G d/d0 d0e Z!G d1d2 d2e Z"G d3d4 d4e Z#G d5d6 d6eZ$G d7d8 d8e$Z%G d9d: d:e$Z&G d;d< d<e$Z'G d=d> d>eZ(G d?d@ d@e(Z)G dAdB dBe(Z*G dCdD dDe(Z+G dEdF dFeZ,G dGdH dHe,Z-G dIdJ dJe,Z.G dKdL dLe,Z/G dMdN dNeZ0G dOdP dPe0Z1G dQdR dRe0Z2G dSdT dTe0Z3G dUdV dVeZ4G dWdX dXe4Z5G dYdZ dZe4Z6G d[d\ d\e4Z7G d]d^ d^eZ8G d_d` d`e8Z9G dadb dbe8Z:G dcdd dde8Z;G dedf dfeZ<G dgdh dhe<Z=G didj dje<Z>G dkdl dle<Z?G dmdn dneZ@G dodp dpe@ZAG dqdr dre@ZBG dsdt dte@ZCdS )v    N   )InfoExtractor   )	HTTPError)ExtractorErrorint_or_nonejoin_nonemptytry_geturl_or_noneurlencode_postdatac                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdddZd ddZdd Zdd Zdd Zdd ZdS )!ZattooPlatformBaseIENc                 C   s   dt | dr
| j S | j S )Nz
https://%s	_API_HOST)hasattrr   _HOSTself r   K/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/zattoo.py	_host_url   s   zZattooPlatformBaseIE._host_urlc                 C   s   | j s| jddd d S d S )Nz)An account is needed to access this mediapassword)method)_power_guide_hashraise_login_requiredr   r   r   r   _real_initialize   s   z%ZattooPlatformBaseIE._real_initializec              
   C   s   z| j |   dd dt||dd|   dddd}W n ty> } zt|jtr9|jjd	kr9td
dd d }~ww |d d | _d S )Nz/zapi/v2/account/loginz
Logging intrue)loginr   rememberz/loginz0application/x-www-form-urlencoded; charset=UTF-8)RefererzContent-Type)dataheadersi  z3Unable to login: incorrect username and/or passwordT)expectedsessionpower_guide_hash)	_download_jsonr   r   r   
isinstancecauser   statusr   )r   usernamer   r   er   r   r   _perform_login   s,   

z#ZattooPlatformBaseIE._perform_loginc                 C   sT   |  |   dd dd }| j|   dd dttt ddd|d	d
 d S )Nz/token.jsonzDownloading session tokensession_tokenz/zapi/v3/session/hellozOpening sessionenz1.8.2json)uuidlangapp_versionformatclient_app_token)r   )r#   r   _request_webpager   strr-   uuid4)r   r*   r   r   r   _initialize_pre_login/   s   

z*ZattooPlatformBaseIE._initialize_pre_loginc              	      sP   |  |   d d}zt fdd|d D W S  ttfy'   tdw )Nz/zapi/v2/playlistzDownloading playlistc                 3   s8    | ]}| d rt| d krt|d  V  qdS )
program_ididN)getr3   ).0itemrecidr   r   	<genexpr>B   s    
zHZattooPlatformBaseIE._extract_video_id_from_recording.<locals>.<genexpr>
recordingsz)Could not extract video id from recording)r#   r   nextStopIterationKeyErrorr   )r   r<   playlistr   r;   r    _extract_video_id_from_recording>   s   
z5ZattooPlatformBaseIE._extract_video_id_from_recordingc                    sv   | j |   d| j |dddidd }g }|D ]	}||d  qzt fdd	|D W S  ty:   td
w )Nz/zapi/v2/cached/channels/zDownloading channel listdetailsFquerychannel_groupschannelsc                 3   s>    | ]}| d r| d ks| d  kr|d  V  qdS )ciddisplay_aliasN)r8   )r9   chanchannel_namer   r   r=   Q   s    z4ZattooPlatformBaseIE._extract_cid.<locals>.<genexpr>zCould not extract channel id)r#   r   r   extendr?   r@   r   )r   video_idrM   rG   channel_listchgrpr   rL   r   _extract_cidH   s"   
z!ZattooPlatformBaseIE._extract_cidc                 C   s   | j |   d| j |d|ddd}|d d }|d }||d	p'|d
 |d|d|d|d
t|dt|dt|dt|dd tt|dd td}||fS )Nz&/zapi/v2/cached/program/power_details/zDownloading video informationT)program_idscompleterE   programsr   rI   tetdi_urlrM   e_nos_noyearc                 S      | d S )Ncr   xr   r   r   <lambda>p       zBZattooPlatformBaseIE._extract_cid_and_video_info.<locals>.<lambda>c                 S   r]   )Ngr   r_   r   r   r   ra   q   rb   )r7   titledescription	thumbnailcreatorepisodeepisode_numberseason_numberrelease_year
categoriestags)r#   r   r   r8   r   r	   list)r   rO   r   prI   	info_dictr   r   r   _extract_cid_and_video_infoY   s.   	z0ZattooPlatformBaseIE._extract_cid_and_video_infoc                 C   s   |  |   d| |d}||d|dt|dt|dt|dt|dt|d	d
 td}|d d d d d |d |fS )zH
        @returns    (ondemand_token, ondemand_type, info_dict)
        z/zapi/vod/movies/z Downloading ondemand informationrd   re   durationr\   ri   rj   c                 S   r]   )Nrl   r   r_   r   r   r   ra      rb   z=ZattooPlatformBaseIE._extract_ondemand_info.<locals>.<lambda>)r7   rd   re   rr   rk   ri   rj   rl   terms_catalogr   termstokentype)r#   r   r8   r   r	   rn   )r   ondemand_idr   rp   r   r   r   _extract_ondemand_infov   s   "
z+ZattooPlatformBaseIE._extract_ondemand_infoFc              
   C   s   ddi}|r| ddi |   d| }	n+|r#|   d| }	n|r6| |||d |   d}	n|   d	| d
| }	g }
i }dD ]}| }||d< | j|	|d|  dt|dd}|sgqHt|dd t}|srqH|D ]}t|t	s|qtt
|d}|sqt|d}|dkrdnd }t||d|}|dr| j|||dd\}}| j||d n8|dr| j||dd|dd\}}| j||d n|dkr| j|||dd }n|d!kr| j|||dd"}nJ |D ]}||d#< q|
| qtqH|
|fS )$Nhttps_watch_urlsT	timeshifti0*  z/zapi/watch/live/z/zapi/watch/recording/)teasable_id
term_tokenteasable_typez/zapi/watch/vod/videoz/zapi/v3/watch/replay//)dashhls7stream_typezDownloading z formatsF)r   fatalc                 S   s   | d d S )Nstream
watch_urlsr   r_   r   r   r   ra      s    z7ZattooPlatformBaseIE._extract_formats.<locals>.<lambda>urlaudio_channelAr   maxrater   )mpd_idr   )targethlsmp4m3u8_native)entry_protocolm3u8_idr   hds)f4m_idr   smooth_playready)ism_idr   quality)updater   copyr#   upperr   r	   rn   r$   dictr
   r8   r   
startswith"_extract_mpd_formats_and_subtitles_merge_subtitles#_extract_m3u8_formats_and_subtitles_extract_f4m_formats_extract_ism_formatsrN   )r   rI   rO   	record_idrw   ondemand_termtokenondemand_typeis_livepostdata_commonr   formats	subtitlesr   postdatar   r   watch	watch_urlr   
preference	format_idthis_formatssubsthis_formatr   r   r   _extract_formats   s   







z%ZattooPlatformBaseIE._extract_formatsc                 C   s.   |  |\}}| j|||d\|d< |d< |S N)r   r   r   )rq   r   )r   rO   r   rI   rp   r   r   r   _extract_video   s   z#ZattooPlatformBaseIE._extract_videoc                 C   s0   |  ||}| j||dd\}}||d||dS )NT)r   )r7   rd   r   r   r   )rR   r   )r   rM   rI   r   r   r   r   r   _extract_live   s   z"ZattooPlatformBaseIE._extract_livec                 C   s8   |  |}| |\}}| j|||d\|d< |d< |S r   )rC   rq   r   )r   r   rO   rI   rp   r   r   r   _extract_record   s   
z$ZattooPlatformBaseIE._extract_recordc                 C   s4   |  |\}}}| jd ||||d\|d< |d< |S )N)rw   r   r   r   r   )rx   r   )r   rw   r   r   rp   r   r   r   _extract_ondemand   s   z&ZattooPlatformBaseIE._extract_ondemandc                 C   s,   |  | \}}t| d| j |p|S )N	_extract_)_match_valid_urlgroupsgetattr_TYPE)r   r   rO   r   r   r   r   _real_extract   s   z"ZattooPlatformBaseIE._real_extract)NNNNFN)__name__
__module____qualname__r   r   r   r)   r5   rC   rR   rq   rx   r   r   r   r   r   r   r   r   r   r   r      s     


Dr   c              	   C   s>   |rd| d| dnd}dt |  d| d| d| d		S )
N|z
/(?P<vid1>)z
(?P<vid1>)z(?x)https?://(?:www\.)?z /(?:
        [^?#]+\?(?:[^#]+&)?z
=(?P<vid2>z
)
        z
    ))reescape)hostmatchqsbase_re
match_baser   r   r   _create_valid_url   s   r   c                   @      e Zd ZdZdZdS )ZattooBaseIEzattoo
zattoo.comNr   r   r   _NETRC_MACHINEr   r   r   r   r   r          r   c                   @   sX   e Zd ZeejdddZdZddddd	d
dddddd
ddidddddddgZdS )ZattooIE\d+program(?:program|watch)/[^/]+videoz(https://zattoo.com/program/zdf/250170418	250170418r   zMarkus Lanzz$md5:e41cb1257de008ca62a73bb876ffa7fcz5re:http://images.zattic.com/cms/.+/format_480x360.jpgzZDF HDi  z
Folge 1655zcount:1zcount:2)
r7   extrd   re   rf   rg   rk   rh   rl   rm   skip_downloadm3u8)r   rp   paramsz-https://zattoo.com/program/daserste/210177916Tr   only_matchingz>https://zattoo.com/guide/german?channel=srf1&program=169860555N	r   r   r   r   r   r   
_VALID_URLr   _TESTSr   r   r   r   r      s0    r   c                       H   e Zd ZeejdddZdZddddddgZe	 fdd	Z
  ZS )
ZattooLiveIE[^/?&#]+channellivez3https://zattoo.com/channels/german?channel=srf_zweiTr   zhttps://zattoo.com/live/srf1c                       t |rdS t |S NF)r   suitablesuperclsr   	__class__r   r   r   "     zZattooLiveIE.suitable)r   r   r   r   r   r   r   r   r   classmethodr   __classcell__r   r   r   r   r         r   c                   @   4   e Zd ZeejdddZdZddddddgZd	S )
ZattooMoviesIEz\w+movie_idz
vod/moviesondemandz"https://zattoo.com/vod/movies/7521Tr   zIhttps://zattoo.com/ondemand?movie_id=7521&term_token=9f00f43183269484eddeNr   r   r   r   r   r   '      r   c                   @   s0   e Zd ZedddZdZddddddgZd	S )
ZattooRecordingsIEr   r   	recordingrecordz1https://zattoo.com/recordings?recording=193615508Tr   zGhttps://zattoo.com/tc/ptc_recordings_all_recordings?recording=193615420N)r   r   r   r   r   r   r   r   r   r   r   r   3  s    r   c                   @      e Zd ZdZdZde ZdS )NetPlusTVBaseIEnetplusz
netplus.tvwww.Nr   r   r   r   r   r   r   r   r   r   r   ?      r   c                   @   r   )
NetPlusTVIEr   r   r   r   z-https://netplus.tv/program/daserste/210177916Tr   z>https://netplus.tv/guide/german?channel=srf1&program=169860555N	r   r   r   r   r   r   r   r   r   r   r   r   r   r   E  r   r   c                       r   )
NetPlusTVLiveIEr   r   r   z3https://netplus.tv/channels/german?channel=srf_zweiTr   zhttps://netplus.tv/live/srf1c                    r   r   )r   r   r   r   r   r   r   r   \  r   zNetPlusTVLiveIE.suitable)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Q  r   r   c                   @   2   e Zd ZeejddZdZddddddgZdS )	NetPlusTVRecordingsIEr   r   r   z1https://netplus.tv/recordings?recording=193615508Tr   zGhttps://netplus.tv/tc/ptc_recordings_all_recordings?recording=193615420Nr   r   r   r   r   r  a      r  c                   @   r   )MNetTVBaseIEmnettvztvplus.m-net.deNr   r   r   r   r   r  m  r   r  c                   @   r   )
MNetTVIEr   r   r   r   z2https://tvplus.m-net.de/program/daserste/210177916Tr   zChttps://tvplus.m-net.de/guide/german?channel=srf1&program=169860555N	r   r   r   r   r  r   r   r   r   r   r   r   r   r  r  r   r  c                       r   )
MNetTVLiveIEr   r   r   z8https://tvplus.m-net.de/channels/german?channel=srf_zweiTr   z!https://tvplus.m-net.de/live/srf1c                    r   r   )r  r   r   r   r   r   r   r     r   zMNetTVLiveIE.suitable)r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r  ~  r   r  c                   @   r   )	MNetTVRecordingsIEr   r   r   z6https://tvplus.m-net.de/recordings?recording=193615508Tr   zLhttps://tvplus.m-net.de/tc/ptc_recordings_all_recordings?recording=193615420Nr  r   r   r   r   r    r  r  c                   @   r   )WalyTVBaseIEwalytvzplayer.waly.tvNr   r   r   r   r   r	    r   r	  c                   @   r   )
WalyTVIEr   r   r   r   z1https://player.waly.tv/program/daserste/210177916Tr   zBhttps://player.waly.tv/guide/german?channel=srf1&program=169860555N	r   r   r   r   r	  r   r   r   r   r   r   r   r   r    r   r  c                       r   )
WalyTVLiveIEr   r   r   z7https://player.waly.tv/channels/german?channel=srf_zweiTr   z https://player.waly.tv/live/srf1c                    r   r   )r  r   r   r   r   r   r   r     r   zWalyTVLiveIE.suitable)r   r   r   r   r	  r   r   r   r   r   r   r   r   r   r   r   r    r   r  c                   @   r   )	WalyTVRecordingsIEr   r   r   z5https://player.waly.tv/recordings?recording=193615508Tr   zKhttps://player.waly.tv/tc/ptc_recordings_all_recordings?recording=193615420Nr  r   r   r   r   r    r  r  c                   @   r   )BBVTVBaseIEbbvtvz
bbv-tv.netr   Nr   r   r   r   r   r    r   r  c                   @   r   )
BBVTVIEr   r   r   r   z-https://bbv-tv.net/program/daserste/210177916Tr   z>https://bbv-tv.net/guide/german?channel=srf1&program=169860555N	r   r   r   r   r  r   r   r   r   r   r   r   r   r    r   r  c                       r   )
BBVTVLiveIEr   r   r   z3https://bbv-tv.net/channels/german?channel=srf_zweiTr   zhttps://bbv-tv.net/live/srf1c                    r   r   )r  r   r   r   r   r   r   r     r   zBBVTVLiveIE.suitable)r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r    r   r  c                   @   r   )	BBVTVRecordingsIEr   r   r   z1https://bbv-tv.net/recordings?recording=193615508Tr   zGhttps://bbv-tv.net/tc/ptc_recordings_all_recordings?recording=193615420Nr  r   r   r   r   r    r  r  c                   @   r   )VTXTVBaseIEvtxtvzvtxtv.chr   Nr   r   r   r   r   r    r   r  c                   @   r   )
VTXTVIEr   r   r   r   z+https://vtxtv.ch/program/daserste/210177916Tr   z<https://vtxtv.ch/guide/german?channel=srf1&program=169860555N	r   r   r   r   r  r   r   r   r   r   r   r   r   r    r   r  c                       r   )
VTXTVLiveIEr   r   r   z1https://vtxtv.ch/channels/german?channel=srf_zweiTr   zhttps://vtxtv.ch/live/srf1c                    r   r   )r  r   r   r   r   r   r   r     r   zVTXTVLiveIE.suitable)r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r    r   r  c                   @   r   )	VTXTVRecordingsIEr   r   r   z/https://vtxtv.ch/recordings?recording=193615508Tr   zEhttps://vtxtv.ch/tc/ptc_recordings_all_recordings?recording=193615420Nr  r   r   r   r   r    r  r  c                   @   r   )GlattvisionTVBaseIEglattvisiontvziptv.glattvision.chNr   r   r   r   r   r  #  r   r  c                   @   r   )
GlattvisionTVIEr   r   r   r   z6https://iptv.glattvision.ch/program/daserste/210177916Tr   zGhttps://iptv.glattvision.ch/guide/german?channel=srf1&program=169860555N	r   r   r   r   r  r   r   r   r   r   r   r   r   r  (  r   r  c                       r   )
GlattvisionTVLiveIEr   r   r   z<https://iptv.glattvision.ch/channels/german?channel=srf_zweiTr   z%https://iptv.glattvision.ch/live/srf1c                    r   r   )r  r   r   r   r   r   r   r   ?  r   zGlattvisionTVLiveIE.suitable)r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r  4  r   r  c                   @   r   )	GlattvisionTVRecordingsIEr   r   r   z:https://iptv.glattvision.ch/recordings?recording=193615508Tr   zPhttps://iptv.glattvision.ch/tc/ptc_recordings_all_recordings?recording=193615420Nr  r   r   r   r   r   D  r  r   c                   @   r   )SAKTVBaseIEsaktvzsaktv.chr   Nr   r   r   r   r   r!  P  r   r!  c                   @   r   )
SAKTVIEr   r   r   r   z+https://saktv.ch/program/daserste/210177916Tr   z<https://saktv.ch/guide/german?channel=srf1&program=169860555N	r   r   r   r   r!  r   r   r   r   r   r   r   r   r#  V  r   r#  c                       r   )
SAKTVLiveIEr   r   r   z1https://saktv.ch/channels/german?channel=srf_zweiTr   zhttps://saktv.ch/live/srf1c                    r   r   )r#  r   r   r   r   r   r   r   m  r   zSAKTVLiveIE.suitable)r   r   r   r   r!  r   r   r   r   r   r   r   r   r   r   r   r%  b  r   r%  c                   @   r   )	SAKTVRecordingsIEr   r   r   z/https://saktv.ch/recordings?recording=193615508Tr   zEhttps://saktv.ch/tc/ptc_recordings_all_recordings?recording=193615420Nr$  r   r   r   r   r&  r  r  r&  c                   @   r   )EWETVBaseIEewetvztvonline.ewe.deNr   r   r   r   r   r'  ~  r   r'  c                   @   r   )
EWETVIEr   r   r   r   z2https://tvonline.ewe.de/program/daserste/210177916Tr   zChttps://tvonline.ewe.de/guide/german?channel=srf1&program=169860555N	r   r   r   r   r'  r   r   r   r   r   r   r   r   r)    r   r)  c                       r   )
EWETVLiveIEr   r   r   z8https://tvonline.ewe.de/channels/german?channel=srf_zweiTr   z!https://tvonline.ewe.de/live/srf1c                    r   r   )r)  r   r   r   r   r   r   r     r   zEWETVLiveIE.suitable)r   r   r   r   r'  r   r   r   r   r   r   r   r   r   r   r   r+    r   r+  c                   @   r   )	EWETVRecordingsIEr   r   r   z6https://tvonline.ewe.de/recordings?recording=193615508Tr   zLhttps://tvonline.ewe.de/tc/ptc_recordings_all_recordings?recording=193615420Nr*  r   r   r   r   r,    r  r,  c                   @   r   )QuantumTVBaseIE	quantumtvzquantum-tv.comr   Nr   r   r   r   r   r-    r   r-  c                   @   r   )
QuantumTVIEr   r   r   r   z1https://quantum-tv.com/program/daserste/210177916Tr   zBhttps://quantum-tv.com/guide/german?channel=srf1&program=169860555N	r   r   r   r   r-  r   r   r   r   r   r   r   r   r/    r   r/  c                       r   )
QuantumTVLiveIEr   r   r   z7https://quantum-tv.com/channels/german?channel=srf_zweiTr   z https://quantum-tv.com/live/srf1c                    r   r   )r/  r   r   r   r   r   r   r     r   zQuantumTVLiveIE.suitable)r   r   r   r   r-  r   r   r   r   r   r   r   r   r   r   r   r1    r   r1  c                   @   r   )	QuantumTVRecordingsIEr   r   r   z5https://quantum-tv.com/recordings?recording=193615508Tr   zKhttps://quantum-tv.com/tc/ptc_recordings_all_recordings?recording=193615420Nr0  r   r   r   r   r2    r  r2  c                   @   r   )OsnatelTVBaseIE	osnateltvztvonline.osnatel.deNr   r   r   r   r   r3    r   r3  c                   @   r   )
OsnatelTVIEr   r   r   r   z6https://tvonline.osnatel.de/program/daserste/210177916Tr   zGhttps://tvonline.osnatel.de/guide/german?channel=srf1&program=169860555N	r   r   r   r   r3  r   r   r   r   r   r   r   r   r5    r   r5  c                       r   )
OsnatelTVLiveIEr   r   r   z<https://tvonline.osnatel.de/channels/german?channel=srf_zweiTr   z%https://tvonline.osnatel.de/live/srf1c                    r   r   )r5  r   r   r   r   r   r   r     r   zOsnatelTVLiveIE.suitable)r   r   r   r   r3  r   r   r   r   r   r   r   r   r   r   r   r7    r   r7  c                   @   r   )	OsnatelTVRecordingsIEr   r   r   z:https://tvonline.osnatel.de/recordings?recording=193615508Tr   zPhttps://tvonline.osnatel.de/tc/ptc_recordings_all_recordings?recording=193615420Nr6  r   r   r   r   r8    r  r8  c                   @   r   )EinsUndEinsTVBaseIE1und1tvz1und1.tvr   Nr   r   r   r   r   r9    r   r9  c                   @   r   )
EinsUndEinsTVIEr   r   r   r   z+https://1und1.tv/program/daserste/210177916Tr   z<https://1und1.tv/guide/german?channel=srf1&program=169860555N	r   r   r   r   r9  r   r   r   r   r   r   r   r   r;    r   r;  c                       r   )
EinsUndEinsTVLiveIEr   r   r   z1https://1und1.tv/channels/german?channel=srf_zweiTr   zhttps://1und1.tv/live/srf1c                    r   r   )r;  r   r   r   r   r   r   r   #  r   zEinsUndEinsTVLiveIE.suitable)r   r   r   r   r9  r   r   r   r   r   r   r   r   r   r   r   r=    r   r=  c                   @   r   )	EinsUndEinsTVRecordingsIEr   r   r   z/https://1und1.tv/recordings?recording=193615508Tr   zEhttps://1und1.tv/tc/ptc_recordings_all_recordings?recording=193615420Nr<  r   r   r   r   r>  (  r  r>  c                   @   r   )SaltTVBaseIEsalttvz
tv.salt.chNr   r   r   r   r   r?  4  r   r?  c                   @   r   )
SaltTVIEr   r   r   r   z-https://tv.salt.ch/program/daserste/210177916Tr   z>https://tv.salt.ch/guide/german?channel=srf1&program=169860555N	r   r   r   r   r?  r   r   r   r   r   r   r   r   rA  9  r   rA  c                       r   )
SaltTVLiveIEr   r   r   z3https://tv.salt.ch/channels/german?channel=srf_zweiTr   zhttps://tv.salt.ch/live/srf1c                    r   r   )rA  r   r   r   r   r   r   r   P  r   zSaltTVLiveIE.suitable)r   r   r   r   r?  r   r   r   r   r   r   r   r   r   r   r   rC  E  r   rC  c                   @   r   )	SaltTVRecordingsIEr   r   r   z1https://tv.salt.ch/recordings?recording=193615508Tr   zGhttps://tv.salt.ch/tc/ptc_recordings_all_recordings?recording=193615420NrB  r   r   r   r   rD  U  r  rD  r   )Dr   r-   commonr   networking.exceptionsr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r#  r%  r&  r'  r)  r+  r,  r-  r/  r1  r2  r3  r5  r7  r8  r9  r;  r=  r>  r?  rA  rC  rD  r   r   r   r   <module>   sz     
 
`