§
    #oj6)  ã                   ó  — d 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ZdZddddddœZ	d	Z
d
ZdZddiZd„ Z e¦   «         Zed         Ze                     dd¦  «        Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk    r e¦   «          dS dS )a¼  
Connect to Google Nest Mini and play the Adhan audio with layered redundancy.

Layer 1: mDNS name discovery (longer timeout)
Layer 2: Direct IP connect via get_chromecast_from_host (fixed for PyChromecast 14)
Layer 3: Full-network discovery scan for any device matching CAST_IP

The cascade repeats until the prayer's time window expires.
Audio URLs are tried in order: LOCAL (LAN HTTPS) -> TAILSCALE -> EXTERNAL.

Usage: cast_adhan.py "Fajr"
é    N)Údatetimez/home/user/adhan/config.envz/home/user/adhan/adhan.logé,  éx   )ÚFajrÚDhuhrÚAsrÚMaghribÚIshaé   é   g      $@r   zfajr_azaan.mp3c                  óP  — i } t          t          ¦  «        5 }|D ]s}|                     ¦   «         }|r[|                     d¦  «        sFd|v rB|                     dd¦  «        \  }}|                     ¦   «         | |                     ¦   «         <   Œt	 d d d ¦  «         n# 1 swxY w Y   | S )Nú#ú=é   )ÚopenÚCONFIG_FILEÚstripÚ
startswithÚsplit)ÚconfigÚfÚlineÚkeyÚvals        ú/home/user/adhan/cast_adhan.pyÚload_configr   *   sä   € Ø€FÝ	�kÑ	Ô	ð 2˜aØð 	2ð 	2ˆDØ—:’:‘<”<ˆDØð 2˜DŸOšO¨CÑ0Ô0ð 2°S¸D°[°[ØŸ:š: c¨1Ñ-Ô-‘��SØ&)§i¢i¡k¤k��s—y’y‘{”{Ñ#øð		2ð2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2ð €Ms   —A7BÂBÂ"BÚ	CAST_NAMEÚCAST_IPÚ c                 óL  — t          j        ¦   «                              d¦  «        }d                     || ¦  «        }t	          |¦  «         	 t          t          d¦  «        5 }|                     |dz   ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S # t          $ r Y d S w xY w)Nz%Y-%m-%d %H:%M:%Sz[{}] {}Úaú
)	r   ÚnowÚstrftimeÚformatÚprintr   ÚLOG_FILEÚwriteÚ	Exception)ÚmsgÚ	timestampr   r   s       r   Úlogr,   :   sê   € Ý”‘”×'Ò'Ð(;Ñ<Ô<€IØ×Ò˜I sÑ+Ô+€DÝ	ˆ$�K„K€KðÝ•(˜CÑ Ô ð 	! AØ�GŠG�D˜4‘KÑ Ô Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øåð ð ð Øˆˆðøøøs6   ÁB Á"BÁ;B ÂBÂB ÂBÂB Â
B#Â"B#c                 óZ  — t                                | t                               dd¦  «        ¦  «        }g }t                               dd¦  «        }t                               dd¦  «        }|r*|                     d                     |||¦  «        ¦  «         t                               dd¦  «        }|r)|                     d	                     ||¦  «        ¦  «         t                               d
¦  «        pt                               dd¦  «        }|r|                     |¦  «         |S )z=Ordered list of audio URLs for this prayer, most local first.Ú
AUDIO_FILEz	adhan.mp3ÚLOCAL_HTTPS_DOMAINr   ÚLOCAL_HTTPS_PORTÚ9443zhttps://{}:{}/{}ÚTAILSCALE_DOMAINzhttps://{}/{}ÚAUDIO_URL_EXTERNALÚ	AUDIO_URL)ÚPRAYER_AUDIO_FILESÚgetr   Úappendr%   )Úprayer_nameÚfnameÚurlsÚlocal_domainÚ
local_portÚtailscale_domainÚexternals          r   Úbuild_audio_urlsr?   E   s  € å×"Ò" ;Ý#)§:¢:¨l¸KÑ#HÔ#HñJô J€Eà€Dõ —:’:Ð2°BÑ7Ô7€LÝ—’Ð.°Ñ7Ô7€JØð PØ�ŠÐ&×-Ò-¨l¸JÈÑNÔNÑOÔOÐOõ —z’zÐ"4°bÑ9Ô9ÐØð EØ�Š�O×*Ò*Ð+;¸UÑCÔCÑDÔDÐDõ �zŠzÐ.Ñ/Ô/ÐNµ6·:²:¸kÈ2Ñ3NÔ3N€HØð Ø�Š�HÑÔÐà€Kó    c                  óœ  — 	 t          j        t          gt          ¬¦  «        \  } }|                     ¦   «          | r/t          d                     t          ¦  «        ¦  «         | d         S t          d                     t          ¦  «        ¦  «         n9# t          $ r,}t          d                     |¦  «        ¦  «         Y d}~nd}~ww xY wdS )z)Layer 1: mDNS discovery by friendly name.)Úfriendly_namesÚdiscovery_timeoutz#Layer 1 (name discovery) found "{}"r   z*Layer 1 (name discovery): not found in {}sz"Layer 1 (name discovery) error: {}N)ÚpychromecastÚget_listed_chromecastsr   ÚDISCOVERY_TIMEOUTÚstop_discoveryr,   r%   r)   )ÚchromecastsÚbrowserÚes      r   Útry_name_discoveryrK   `   sß   € ð<Ý+ÔBÝ%˜;Ý/ð 
ñ  
ô  
Ñˆ�Wð 	×ÒÑ Ô Ð Øð 	"ÝÐ7×>Ò>½yÑIÔIÑJÔJÐJØ˜q”>Ð!ÝÐ8×?Ò?Õ@QÑRÔRÑSÔSÐSÐSøÝð <ð <ð <ÝÐ0×7Ò7¸Ñ:Ô:Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;øøøøð<øøøàˆ4s   ‚A(B Á+'B Â
C	Â"CÃC	c                  óü  — t           sdS 	 t          j        t           dt          j        ¦   «         dt
          fddt          ¬¦  «        } |                      t          dz   ¬¦  «         | j        j	        r)t          d                     t           ¦  «        ¦  «         | S t          d	                     t           ¦  «        ¦  «         n9# t          $ r,}t          d
                     |¦  «        ¦  «         Y d}~nd}~ww xY wdS )z9Layer 2: direct IP connect -- proper PyChromecast 14 API.NiI  zGoogle Nest Minié   )ÚhostÚtriesÚ
retry_waitÚtimeouté   ©rQ   z(Layer 2 (direct IP) connected to {}:8009z*Layer 2 (direct IP): {}:8009 not reachablezLayer 2 (direct IP) error: {})r   rD   Úget_chromecast_from_hostÚuuidÚuuid4r   ÚCONNECT_TIMEOUTÚwaitÚsocket_clientÚis_connectedr,   r%   r)   )ÚcastrJ   s     r   Útry_direct_ipr\   q   s  € åð Øˆtð7ÝÔ4Ý˜4¥¤¡¤Ð/AÅ9ÐMØØÝ#ð	
ñ 
ô 
ˆð 	�	Š	�/¨AÑ-ˆ	Ñ.Ô.Ð.ØÔÔ*ð 	ÝÐ:×AÒAÅ'ÑJÔJÑKÔKÐKØˆKÝÐ8×?Ò?ÅÑHÔHÑIÔIÐIÐIøÝð 7ð 7ð 7ÝÐ+×2Ò2°1Ñ5Ô5Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð7øøøàˆ4s   ‹BC Â'C Ã
C9Ã"C4Ã4C9c                  ó"  — 	 t           j                             t          ¬¦  «        \  } }| D ]m}|j        t
          k    r[t          d                     |j        ¦  «        ¦  «         |                     ¦   «          t          j	        |dddt          ¬¦  «        c S Œn|                     ¦   «          t          d                     t
          ¦  «        ¦  «         n9# t          $ r,}t          d                     |¦  «        ¦  «         Y d}~nd}~ww xY wdS )zCLayer 3: scan the whole LAN, then connect to any device at CAST_IP.rS   z)Layer 3 (network scan) found device at {}NrM   )rO   rP   rQ   z-Layer 3 (network scan): no device at {} foundz Layer 3 (network scan) error: {})rD   Ú	discoveryÚdiscover_chromecastsrF   rN   r   r,   r%   rG   Úget_chromecast_from_cast_inforW   r)   )ÚdevicesrI   ÚinforJ   s       r   Útry_broadcast_discoveryrc   †   s<  € ð:Ý'Ô1×FÒFÝ%ð Gñ 
ô 
Ñˆ�ð ð 	Pð 	PˆDØŒy�GÒ#Ð#ÝÐ?×FÒFÀtÄyÑQÔQÑRÔRÐRØ×&Ò&Ñ(Ô(Ð(Ý#ÔAØ˜$ a°A½ðPñ Pô Pð Pð Pð Pð $ð
 	×ÒÑ Ô Ð ÝÐ;×BÒBÅ7ÑKÔKÑLÔLÐLÐLøÝð :ð :ð :ÝÐ.×5Ò5°aÑ8Ô8Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9øøøøð:øøøàˆ4s   ‚BC Â<C Ã
DÃ "DÄDc                 ó4	  — t          d                     |||¦  «        ¦  «         | j        }t          d                     |j        |j        |j        |j        ¦  «        ¦  «         	 | j        j        r$|  	                    d¦  «         t          d¦  «         | j        j
        dk     r$|                      d¦  «         t          d¦  «         t          d                     | j        j
        | j        j        rd	nd
¦  «        ¦  «         n9# t          $ r,}t          d                     |¦  «        ¦  «         Y d}~nd}~ww xY w	 | j        }	 |                     ¦   «          t          j        d¦  «         n# t          $ r Y nw xY w|                     |dd¬¦  «         t          d¦  «         	 |                     d¬¦  «         n# t          $ r Y nw xY wt          d                     |j        r|j        j        nd¦  «        ¦  «         |j        r�|j        j        dk    r€t          d¦  «         |                     ¦   «          t          j        d¦  «         |                     ¦   «          t          d                     |j        r|j        j        nd¦  «        ¦  «         d}d}|dk     r¦t          j        d¦  «         |dz  }|                     ¦   «          |j        }	|	r0|	j        dk    r%d}t          d                     |¦  «        ¦  «         n@|	r8|	j        dv r/|dk    r)t          d                     |	j        ¦  «        ¦  «         dS |dk     °¦|st          d ¦  «         dS d!}
||
k     r°t          j        d¦  «         |dz  }|                     ¦   «          |j        }	|	rt|	j        dv r*t          d"                     ||	j        ¦  «        ¦  «         dS |	j        dk    r6t          d#                     |¦  «        ¦  «         |                     ¦   «          ||
k     °°t          d$                     |
¦  «        ¦  «         dS # t          $ rR}t          d%                     |¦  «        ¦  «         ddl}t          |                     ¦   «         ¦  «         Y d}~dS d}~ww xY w)&z?Try playing one URL. Returns True if playback actually started.zAudio source [{}/{}]: {}zUsing "{}" ({} @ {}:{})FzUnmuted devicegš™™™™™É?g      à?zSet volume to 0.5zVolume: {:.0%}{}z (muted)r   zVolume check skipped: {}Nz
audio/mpegT)Úautoplayz,play_media sent, waiting for active state...é   rS   z)Player state after block_until_active: {}ÚunknownÚPAUSEDz1State is PAUSED - sending explicit play() commandé   zState after play(): {}r   é   rR   ÚPLAYINGzPlayback started after {}s)ÚIDLEÚSTOPPEDz.Playback never started (state={}) - URL failedz Playback never started after 30sià  z&Playback finished after {}s (state={})z'State PAUSED at {}s - attempting resumezPlayback timeout after {}szERROR during cast: {})r,   r%   Ú	cast_infoÚfriendly_nameÚ
model_namerN   ÚportÚstatusÚvolume_mutedÚset_volume_mutedÚvolume_levelÚ
set_volumer)   Úmedia_controllerÚstopÚtimeÚsleepÚ
play_mediaÚblock_until_activeÚplayer_stateÚplayÚupdate_statusÚ	tracebackÚ
format_exc)r[   Ú	audio_urlÚ	url_indexÚ	url_totalÚcirJ   ÚmcÚstartedÚwaitedrr   Úmax_waitr€   s               r   Úplay_urlrŠ   ›   s9  € åÐ"×)Ò)¨)°YÀ	ÑJÔJÑKÔKÐKØ	Œ€BÝÐ#×*Ò*Ø
Ô˜"œ-¨¬°"´'ñ	;ô 	;ñ <ô <ð <ð2ØŒ;Ô#ð 	"Ø×!Ò! %Ñ(Ô(Ð(ÝÐ Ñ!Ô!Ð!ØŒ;Ô# cÒ)Ð)Ø�OŠO˜CÑ Ô Ð ÝÐ#Ñ$Ô$Ð$ÝÐ×%Ò%ØŒKÔ$Øœ+Ô2Ð:ˆJˆJ¸ñ<ô <ñ 	=ô 	=ð 	=ð 	=øõ ð 2ð 2ð 2ÝÐ&×-Ò-¨aÑ0Ô0Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1øøøøð2øøøðCØÔ"ˆð	Ø�GŠG‰IŒIˆIÝŒJ�s‰OŒOˆOˆOøÝð 	ð 	ð 	ØˆDð	øøøð 	�Š�i ¸ˆÑ=Ô=Ð=ÝÐ:Ñ;Ô;Ð;ð	Ø×!Ò!¨"Ð!Ñ-Ô-Ð-Ð-øÝð 	ð 	ð 	ØˆDð	øøøåÐ7×>Ò>Ø&(¤iÐ>ˆBŒIÔ"Ð"°Yñ@ô @ñ 	Aô 	Að 	Að Œ9ð 	E˜œÔ/°8Ò;Ð;ÝÐCÑDÔDÐDØ�GŠG‰IŒIˆIÝŒJ�q‰MŒMˆMØ×ÒÑÔÐÝÐ(×/Ò/Ø*,¬)ÐB�”	Ô&Ð&¸ñDô Dñ Eô Eð Eð ˆØˆØ�rŠkˆkÝŒJ�q‰MŒMˆMØ�a‰KˆFØ×ÒÑÔÐØ”YˆFØð ˜&Ô-°Ò:Ð:Ø�ÝÐ0×7Ò7¸Ñ?Ô?Ñ@Ô@Ð@ØØð ˜&Ô-Ð1DÐDÐDÈÐSUÊÈÝÐD×KÒKØÔ'ñ)ô )ñ *ô *ð *à�uð �rŠkˆkð ð 	ÝÐ2Ñ3Ô3Ð3Ø�5ð ˆØ�xÒÐÝŒJ�q‰MŒMˆMØ�a‰KˆFØ×ÒÑÔÐØ”YˆFØð ØÔ&Ð*=Ð=Ð=ÝÐ@×GÒGØ Ô 3ñ5ô 5ñ 6ô 6ð 6à˜4ØÔ(¨HÒ4Ð4ÝÐA×HÒHÈÑPÔPÑQÔQÐQØ—G’G‘I”I�Ið �xÒÐõ 	Ð(×/Ò/°Ñ9Ô9Ñ:Ô:Ð:ØˆtøÝð ð ð ÝÐ#×*Ò*¨1Ñ-Ô-Ñ.Ô.Ð.ØÐÐÐÝˆI× Ò Ñ"Ô"Ñ#Ô#Ð#Øˆuˆuˆuˆuˆuøøøøð	øøøs�   Á&BD Ä
D<Ä"D7Ä7D<Å P; Å(E1 Å0P; Å1
E>Å;P; Å=E>Å>*P; Æ)G  Æ?P; Ç 
GÇ
P; ÇGÇE7P; ÍP; ÍA/P; ÏA)P; Ð;
RÑARÒRc            	      óH  — t          t          j        ¦  «        dk    rt          j        d         nd} t                               | d¦  «        }t          j        ¦   «         |z   }t          d                     | ¦  «        ¦  «         t          d                     |¦  «        ¦  «         t          | ¦  «        }t          d                     |rd 	                    |¦  «        nd¦  «        ¦  «         d }d	}t          j        ¦   «         |k     �r|dz  }t          d	t          |t          j        ¦   «         z
  ¦  «        ¦  «        }t          d
                     ||¦  «        ¦  «         t          ¦   «         }|rn¬t          ¦   «         }|rn›t          ¦   «         }|rnŠt          t           |t          j        ¦   «         z
  ¦  «        }|dk    rCt          d                     t          |¦  «        ¦  «        ¦  «         t          j        |¦  «         t          j        ¦   «         |k     �°|s#t          d¦  «         t          j        d¦  «         	 |                     t(          dz   ¬¦  «         n# t*          $ r Y nw xY w|j        j        sIt          d¦  «         	 |                     ¦   «          n# t*          $ r Y nw xY wt          j        d¦  «         d}t3          |d¬¦  «        D ]|\  }	}
t5          ||
|	t          |¦  «        ¦  «        rd} nU	 |                     ¦   «          n# t*          $ r Y nw xY wt          ¦   «         }|r|                     t(          dz   ¬¦  «         Œ}|s#t          d¦  «         t          j        d¦  «         t          d                     | ¦  «        ¦  «         d S )Nr   ÚAdhanr   z=== {} Adhan ===z&Time window: {}s (Maghrib=120s strict)zAudio fallback chain: {}z -> z(none configured)r   z'Connect attempt {} ({}s left in window)z%All layers failed. Retrying in {}s...zEERROR: could not connect to any cast device within window. Giving up.rR   rS   z+ERROR: cast socket not connected after waitF)ÚstartTz*ERROR: no audio source played successfullyz=== {} adhan complete ===)ÚlenÚsysÚargvÚPRAYER_WINDOW_SECONDSr6   ry   r,   r%   r?   ÚjoinÚmaxÚintrK   r\   rc   ÚminÚRETRY_INTERVALrz   ÚexitrX   rW   r)   rY   rZ   Ú
disconnectÚ	enumeraterŠ   )r8   ÚwindowÚdeadliner:   r[   ÚattemptÚ	remainingÚ	sleep_forÚplayedÚindexÚurls              r   Úmainr¢   ÷   s   € Ý!$¥S¤X¡¤°Ò!2Ð!2•#”(˜1”+�+¸€KÝ"×&Ò& {°CÑ8Ô8€FÝŒy‰{Œ{˜VÑ#€HåÐ×!Ò! +Ñ.Ô.Ñ/Ô/Ð/ÝÐ0×7Ò7¸Ñ?Ô?Ñ@Ô@Ð@Ý˜KÑ(Ô(€DÝÐ"×)Ò)Ø!Ð:ˆ�Š�DÑÔÐÐ':ñ	<ô 	<ñ =ô =ð =ð €DØ€GÝ
Œ)‰+Œ+˜Ò
 Ñ
 Ø�1‰ˆÝ˜�3˜x­$¬)©+¬+Ñ5Ñ6Ô6Ñ7Ô7ˆ	ÝÐ5×<Ò<¸WÀiÑPÔPÑQÔQÐQÝ!Ñ#Ô#ˆØð 	ØÝ‰ŒˆØð 	ØÝ&Ñ(Ô(ˆØð 	ØÝ�¨µ4´9±;´;Ñ(>Ñ?Ô?ˆ	Ø�qŠ=ˆ=ÝÐ7×>Ò>½sÀ9¹~¼~ÑNÔNÑOÔOÐOÝŒJ�yÑ!Ô!Ð!õ! Œ)‰+Œ+˜Ò
 Ñ
 ð$ ð ÝÐSÑTÔTÐTÝŒ�‰ŒˆðØ�	Š	�/¨AÑ-ˆ	Ñ.Ô.Ð.Ð.øÝð ð ð Øˆðøøøð ÔÔ*ð ÝÐ9Ñ:Ô:Ð:ð	Ø�OŠOÑÔÐÐøÝð 	ð 	ð 	ØˆDð	øøøåŒ�‰Œˆð €FÝ ¨AÐ.Ñ.Ô.ð 3ð 3‰
ˆˆsÝ�D˜#˜u¥c¨$¡i¤iÑ0Ô0ð 	ØˆFØˆEð	Ø�OŠOÑÔÐÐøÝð 	ð 	ð 	ØˆDð	øøøå‰ŒˆØð 	3Ø�IŠI�o°Ñ1ˆIÑ2Ô2Ð2øàð ÝÐ8Ñ9Ô9Ð9ÝŒ�‰ŒˆåÐ#×*Ò*¨;Ñ7Ô7Ñ8Ô8Ð8Ð8Ð8s6   ÉI& É&
I3É2I3ÊJ' Ê'
J4Ê3J4ÌLÌ
L)Ì(L)Ú__main__)Ú__doc__Úosr�   ry   rU   rD   r   r   r'   r‘   r–   rF   rW   r5   r   r   r   r6   r   r,   r?   rK   r\   rc   rŠ   r¢   Ú__name__© r@   r   ú<module>r¨      sk  ððð ð 
€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à+€Ø'€ð ØØØØðð Ð ð €ØÐ Ø€ð ÐðÐ ð
ð ð ð 
ˆ‰Œ€Ø�;Ô€	Ø
�*Š*�Y Ñ
#Ô
#€ðð ð ðð ð ð6ð ð ð"ð ð ð*ð ð ð*Wð Wð WðxD9ð D9ð D9ðN ˆzÒÐØ€D�F„F€F€F€Fð Ðr@   