
    lj                     L    d Z ddlZddlZ G d d      Zd Zedk(  r e        yy)a[  
Support for discovery using GDM (Good Day Mate), multicast protocol by Plex.

# Licensed Apache 2.0
# From https://github.com/home-assistant/netdisco/netdisco/gdm.py

Inspired by:
  hippojay's plexGDM: https://github.com/hippojay/script.plexbmc.helper/resources/lib/plexgdm.py
  iBaa's PlexConnect: https://github.com/iBaa/PlexConnect/PlexAPI.py
    Nc                   8    e Zd ZdZd Zd	dZd	dZd Zd Zd Z	y)
GDMzBase class to discover GDM services.

       Attributes:
           entries (List<dict>): List of server and/or client data discovered.
    c                     g | _         y )N)entries)selfs    8/DATA/.local/lib/python3.12/site-packages/plexapi/gdm.py__init__zGDM.__init__   s	        c                 &    | j                  |       y)zScan the network.N)updater   scan_for_clientss     r   scanzGDM.scan   s    $%r
   c                 N    | j                  |       t        | j                        S )zZReturn all found entries.

        Will scan for entries if not scanned recently.
        )r   listr   r   s     r   allzGDM.all   s     
 			"#DLL!!r
   c                 t    | j                          | j                  D cg c]  }||d   d   v r| c}S c c}w )z5Return a list of entries that match the content_type.datazContent-Type)r   r   )r   valueentrys      r   find_by_content_typezGDM.find_by_content_type%   sC    		#'<< ;<%E&M.99 < ; 	; ;s   5c                     | j                          | j                  D cg c]&  t        fd|j                         D              r( c}S c c}w )z:Return a list of entries that match the search parameters.c              3   H   K   | ]  }|d    j                         v   yw)r   N)items).0itemr   s     r   	<genexpr>z#GDM.find_by_data.<locals>.<genexpr>/   s+      3#14 uV}2244#1s   ")r   r   r   r   )r   valuesr   s     `r   find_by_datazGDM.find_by_data+   sN    		#'<< 4<% 3#)<<>3 3 < 4 	4 4s   +Ac                 F   dj                  d      }d}g | _        g }t        j                  t        j                  t        j                        }|j                  |       |j                  t        j                  t        j                  t        j                  d|             |rc|j                  t        j                  t        j                  d       |j                  t        j                  t        j                  d       d}d}nd}d}	 |j                  |||f       	 	 |j                  d	      \  }}	|j!                  d
      }
d|
j#                         d   v rd |
j#                         D        D ci c]  \  }}||j%                          }}}|j'                  d      }|r||v r|j)                  |       | j                  j)                  ||	d       c c}}w # t        j*                  $ r Y nw xY w	 |j-                          y# |j-                          w xY w)a   Scan for new GDM services.

        Examples of the dict list assigned to self.entries by this function:

            Server:

                [{'data': {
                     'Content-Type': 'plex/media-server',
                     'Host': '53f4b5b6023d41182fe88a99b0e714ba.plex.direct',
                     'Name': 'myfirstplexserver',
                     'Port': '32400',
                     'Resource-Identifier': '646ab0aa8a01c543e94ba975f6fd6efadc36b7',
                     'Updated-At': '1585769946',
                     'Version': '1.18.8.2527-740d4c206',
                },
                 'from': ('10.10.10.100', 32414)}]

            Clients:

                [{'data': {'Content-Type': 'plex/media-player',
                     'Device-Class': 'stb',
                     'Name': 'plexamp',
                     'Port': '36000',
                     'Product': 'Plexamp',
                     'Protocol': 'plex',
                     'Protocol-Capabilities': 'timeline,playback,playqueues,playqueues-creation',
                     'Protocol-Version': '1',
                     'Resource-Identifier': 'b6e57a3f-e0f8-494f-8884-f4b58501467e',
                     'Version': '1.1.0',
                },
                 'from': ('10.10.10.101', 32412)}]
        zM-SEARCH * HTTP/1.0ascii   Bz255.255.255.255i~  z239.0.0.250i~  i   zutf-8z200 OKr   c              3   F   K   | ]  }d |v r|j                  d         yw):N)split)r   lines     r   r   zGDM.update.<locals>.<genexpr>x   s*      =>- 1514 !JJsO-s   !zResource-Identifier)r   fromN)encoder   socketAF_INET
SOCK_DGRAM
settimeout
setsockopt
IPPROTO_IPIP_MULTICAST_TTLstructpack
SOL_SOCKETSO_REUSEADDRSO_BROADCASTsendtorecvfromdecode
splitlinesstripgetappendtimeoutclose)r   r   gdm_msggdm_timeoutknown_responsessockgdm_ipgdm_portbdatahostr   kvddata
identifiers                  r   r   z
GDM.update2   s   D (..w7 }}V^^V->->?$ 	))//C5	7 OOF--v/B/BAFOOF--v/B/BAF&FH #FH	KK&(!34 "&--"5KE4 <<0D4??#4Q#77=> OO-=> !? =>&1aAGGI => !? &+YY/D%E
%**G$'..z:++U59-; < 
!? ~~ JJLDJJLsO   H #AG# 7GG# ,H -/G# H G# #G96H 8G99H H N)F)
__name__
__module____qualname____doc__r	   r   r   r   r   r    r
   r   r   r      s&    &";4Rr
   r   c                      ddl m }  t               } | d       |j                           | |j                          | d       |j                  d        | |j                         y)zTest GDM discovery.r   )pprintzScanning GDM for servers...zScanning GDM for clients...T)r   N)rQ   r   r   r   )rQ   gdms     r   mainrS      sM    
%C
()HHJ
3;;
()HHdH#
3;;r
   __main__)rN   r*   r1   r   rS   rK   rO   r
   r   <module>rU      s8   	  u up zF r
   