
    ho                         d dl mZmZ d dlZd dlZd dlZd dlZ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mZ e	rddlmZ ddlmZ dd	lmZ d
Z G d de      Z G d de      Z G d de      Zy)    )print_functionunicode_literalsN   )TYPE_CHECKING)MC_SckMCast)	CachedSet
formatdatehtml_escapemin_ex)	BrokerCli)HttpCli)SvcHubz239.255.255.250c                        e Zd Z fdZ xZS )SSDP_Sckc                 4    t        t        | 
  |  d| _        y )Nr   )superr   __init__hport)selfa	__class__s     C/jellyfin/media/venv/lib/python3.12/site-packages/copyparty/ssdp.pyr   zSSDP_Sck.__init__   s    h&*
    )__name__
__module____qualname__r   __classcell__r   s   @r   r   r      s     r   r   c                   "    e Zd ZdZd Zd Zd Zy)SSDPrz$generates http responses for httpclic                 4    || _         |j                  | _        y N)brokerargs)r   r$   s     r   r   zSSDPr.__init__   s    KK	r   c                     |j                   j                  d      r| j                  |      S |j                  dd       y)Nz
device.xmls   unknown requesti  F)vpathendswith	tx_devicereply)r   hcs     r   r*   zSSDPr.reply#   s5    88\*>>"%%
#S)r   c                 B   d}t         }|j                  j                         d d \  }}|j                  dd      }| j                  j
                  rdnd}dj                  |||      }| j                  j                  }d|v r|n|d	z   |j                  d	      z   }	| j                  j                  }
|j                         j                   ||       ||	       ||
       || j                  j                              }|j                  |j                  d
d             y)Na@  
<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
    <specVersion>
        <major>1</major>
        <minor>0</minor>
    </specVersion>
    <URLBase>{}</URLBase>
    <device>
        <presentationURL>{}</presentationURL>
        <deviceType>urn:schemas-upnp-org:device:Basic:1</deviceType>
        <friendlyName>{}</friendlyName>
        <modelDescription>file server</modelDescription>
        <manufacturer>ed</manufacturer>
        <manufacturerURL>https://ocv.me/</manufacturerURL>
        <modelName>copyparty</modelName>
        <modelURL>https://github.com/9001/copyparty/</modelURL>
        <UDN>{}</UDN>
        <serviceList>
            <service>
                <serviceType>urn:schemas-upnp-org:device:Basic:1</serviceType>
                <serviceId>urn:schemas-upnp-org:device:Basic</serviceId>
                <controlURL>/.cpr/ssdp/services.xml</controlURL>
                <eventSubURL>/.cpr/ssdp/services.xml</eventSubURL>
                <SCPDURL>/.cpr/ssdp/services.xml</SCPDURL>
            </service>
        </serviceList>
    </device>
</root>   ::ffff: httpshttpz
{}://{}:{}z:///utf-8replaceF)r   sgetsocknamer4   r%   
https_onlyformatzsllstripdoctitlestripzsidr*   encode)r   r+   zscsipsportprotoubaser9   urlnames              r   r)   zSSDPr.tx_device*   s    < TT%%'+
Ukk)R(99//V##E36iimmc\cus{SZZ_'Dyy!!XXZqx34!DIINN:KL
7I./r   N)r   r   r   __doc__r   r*   r)    r   r   r!   r!      s    . )r   r!   c                   B     e Zd ZdZ fdZddZd Zd Zd Zd Z	 xZ
S )	SSDPdz-communicates with ssdp clients over multicastc           
         |j                   }|j                  xr |j                   }t        t        |   |t        |j                  |j                  t        dd|       i | _
        dj                  |      | _        || _        t        d      | _        t        d      | _        t#        j$                  dt"        j&                        | _        y )Nr/   il  zSSDP-{}gffffff?   s   
st: *upnp:rootdevice)r%   zsvzmvr   rJ   r   r   zs_onzs_offGRPsrvr8   logsrcngenr	   rxctxcrecompileIptn_st)r   hubrT   alvinitr   s        r   r   zSSDPd.__init__Y   s    XX%rvv:eT#288RYYRu	
 &&t,	S>Q<jj!:BDDAr   c                 >    | j                  | j                  ||       y r#   )log_funcrS   )r   msgr@   s      r   logz	SSDPd.logg   s    dkk3*r   c                    	 | j                         }|s| j                  dd       y | j                  j                         D ]  | j                  j                  j                  }t        fd|D        d      }|xs t        d |D        d      }|s4|d   d   }| j                  dj                  |j                        d       |_         | j                  d	       	 | j                          | j                  dd       y #  d}| j                  |j                  t                     d       g }Y $xY w# t        $ rI}|j                  t        j                  k7  r | j                  d
j                  |      d       Y d }~d }~ww xY w)Nz'no server IP matches the ssdp config
{}r   z4failed to announce copyparty services on the network   c              3   P   K   | ]  }|d    dj                   fv s|d     yw)r   z0.0.0.0r   N)ip).0xrR   s     r   	<genexpr>zSSDPd.run.<locals>.<genexpr>y   s)     IQqTi5H-HqtIs   &
&r   c              3   8   K   | ]  }|d    dk(  s|d     yw)r   z::r   NrH   )rf   rg   s     r   rh   zSSDPd.run.<locals>.<genexpr>z   s     @a1Q44<QqT@s   
zassuming port {} for {}	listeningzstopping due to {}90stoppedr-   )create_serversra   r8   r   rR   valuesr[   tcpsrvboundnextre   r   run2OSErrorerrnoEBADF)r   rp   ttcpshpexrR   s         @r   runz	SSDPd.runj   sS   	'')E HHKQO 88??$ 	C88??((DITI1MBDt@4@!DB!WQZ299"cffEqICI	 		<IIK 	A9	:AHHQXXfh'+E&  	<xx5;;&HH)004d;;		<s#   D "D: /D7:	F?FFc           
      z   	 | j                   j                  r
t               i }t        j                         }| j
                  D ]7  }|j                         }|||<   |j                  |t        j                         9 	 | j                  r|rY|j	                  | j                   j                  xs ddz        }|D cg c]!  }|d   t        j                  z  s|d      # }	}n?t        j                  | j
                  g g | j                   j                  xs d      }
|
d   }	| j                  j                          d}d}|	D ])  }	 |j                  d	      \  }}| j                  ||       + | j                  ry y # t        $ r;}d }| j                   j                  sd}| j                  ||fz  d       Y d }~@d }~ww xY wc c}w #  | j                  sY  ld
j!                  | j
                  |   j"                  |t%        |      t'        |      dd t)                     }| j                  |d       Y xY w)Nz8WARNING: failed to poll(), will use select() instead: %rrc      i  r   r   r   )0r   i   z{} {} [33m|{}| {}
{}r-      )r%   no_poll	ExceptionselectpollrR   filenoregisterPOLLINra   runningz_chkrU   clnrecvfromeatr8   rF   lenreprr   )r   fd2scksrvpollsckfdry   rv   prrg   rxrdybufaddrs                r   rr   z
SSDPd.run2   s   	'yy  k!FkkmGxx 4ZZ\ r
  V]]34 ll\\499??#9cT"AB,.Gq!A$2FfQqTlGGmmDHHb"diioo6LM!fHHLLNCD #
# #T 2ICHHS$'# ll  	'G99$$NbUA&		' H#<<3::**D#c(DIaOVXA HHQNs7   A<F  =G
G	&G 	G	0F??GH:AH:c                     d| _         | j                  j                         D ]  }	 |j                  j	                           | j                  j                          y #  Y ?xY w)NF)r   rR   rn   r   closeclear)r   rR   s     r   stopz
SSDPd.stop   sO    88??$ 	C	 	s   AA!c           
      (   |d   }|j                  d      r| j                  sy || j                  j                  v ry | j	                  |      }|sy | j                  j                  |       |j                  d      sy | j                  j                  |      sy | j                  j                  rCd}| j                  |j                  |j                  |j                  |t        |            d       d}|j                  j                  dd      }|j                  t!               ||j"                  | j                  j$                        }|d	d  j                  d
d      j'                  dd      }|j(                  j+                  ||d d        || j,                  j                  vr7| j                  dj                  |j                  |j                  |      d       | j,                  j                  |       | j,                  j/                          y )Nr   z169.254s   M-SEARCH * HTTP/1.z{} [{}] [36m{} [0m|{}|rk   a  
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
DATE: {0}
EXT:
LOCATION: http://{1}:{2}/.cpr/ssdp/device.xml
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: {3}
SERVER: UPnP/1.0
ST: upnp:rootdevice
USN: {3}::upnp:rootdevice
BOOTID.UPNP.ORG: 0
CONFIGID.UPNP.ORG: 1

r.   r/   r   
z
r3   r4   r-   z{} [{}] --> {}r   )
startswithll_okrU   r@   
map_clientaddrZ   searchr%   rM   ra   r8   rF   re   r   r4   r
   r   r=   r>   r   sendtorV   r   )	r   r   r   ciprR   rv   r?   v4zbs	            r   r   z	SSDPd.eat   s   1g>>)$TZZ$((**s#S~~34{{!!#&99==0AHHQXXchhSX>E VV^^Ir*YYz|RDIINNCV^^D&)00)Dr48$dhhjj HH%,,SXXsvvsCQGSr   )r   )r   r   r   rG   r   ra   rz   rr   r   r   r   r   s   @r   rJ   rJ   V   s'    7B+B&#P/r   rJ   )
__future__r   r   rt   rW   r   sockettimer   r   	multicastr   r   utilr	   r
   r   r   broker_utilr   httpclir   svchubr   rQ   r   objectr!   rJ   rH   r   r   <module>r      s[    7  	    # $ < <& v 7F 7tVE Vr   