§
    3$oj  ã                   óL  — 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mZ dZdZ	dZ
i Z ee¦  «        5 ZeD ]sZe                     ¦   «         Zer[e                     d¦  «        sFdev rBe                     dd	¦  «        \  ZZe                     ¦   «         ee                     ¦   «         <   Œt	 ddd¦  «         n# 1 swxY w Y   ed
         Zed         Zed         ZdZe                     dd¦  «        ZdZdZdZg d¢Z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 )aF  
Fetch daily prayer times and schedule at jobs.

Redundancy for prayer times (in order):
  1. Aladhan API (online) -- saves result to a 7-day cache
  2. Cache file (last successful API response, up to 7 days old)
  3. Offline calculation with adhanpy (MWL method, Canberra coords)

Run this once per day via cron at midnight.
é    N)ÚdatetimeÚ	timedeltaz/home/user/adhan/config.envz#/home/user/adhan/.prayer_cache.jsoné   ú#ú=é   ÚCITYÚCOUNTRYÚMETHODz/home/user/adhan/cast_adhan.pyÚVENV_PYTHONz /home/user/adhan/venv/bin/pythong$¹ü‡ô£AÀg\�Âõ(¤b@zAustralia/Sydney)ÚFajrÚDhuhrÚAsrÚMaghribÚIshaz'http://api.aladhan.com/v1/timingsByCityc                  ó`  ‡— t           t          t          dœ} 	 t          j        t
          | d¬¦  «        }|                     ¦   «          |                     ¦   «         }|d         d         Šˆfd„t          D ¦   «         }	 t          t          d¦  «        5 }t          j        t          j        ¦   «                              d¦  «        |d	œ|¦  «         d
d
d
¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY w|S # t          $ r)}t!          d|› �t"          j        ¬¦  «         Y d
}~d
S d
}~ww xY w)zGFetch prayer times from Aladhan API. Returns {prayer: "HH:MM"} or None.)ÚcityÚcountryÚmethodé
   )ÚparamsÚtimeoutÚdataÚtimingsc                 ó"   •— i | ]}|‰|         “ŒS © r   ©Ú.0Úpr   s     €ú"/home/user/adhan/schedule_adhan.pyú
<dictcomp>z"fetch_from_api.<locals>.<dictcomp>6   s   ø€ Ð1Ð1Ð1 A�!�W˜Q”ZÐ1Ð1Ð1ó    Úwú%Y-%m-%d)Údater   Nz[WARN] API fetch failed: ©Úfile)r	   r
   r   ÚrequestsÚgetÚALADHAN_URLÚraise_for_statusÚjsonÚPRAYERSÚopenÚ
CACHE_FILEÚdumpr   ÚnowÚstrftimeÚ	ExceptionÚprintÚsysÚstderr)r   Úrespr   ÚresultÚfÚer   s         @r    Úfetch_from_apir;   .   sŠ  ø€ å¥w½&ÐAÐA€FðÝŒ|�K°ÀÐCÑCÔCˆØ×ÒÑÔÐØ�yŠy‰{Œ{ˆØ�v”,˜yÔ)ˆØ1Ð1Ð1Ð1­Ð1Ñ1Ô1ˆð	Ý•j #Ñ&Ô&ð _¨!Ý”	¥8¤<¡>¤>×#:Ò#:¸:Ñ#FÔ#FÐSYÐZÐZÐ\]Ñ^Ô^Ð^ð_ð _ð _ñ _ô _ð _ð _ð _ð _ð _ð _øøøð _ð _ð _ð _øøåð 	ð 	ð 	ØˆDð	øøøàˆøÝð ð ð ÝÐ-¨!Ð-Ð-µC´JÐ?Ñ?Ô?Ð?Øˆtˆtˆtˆtˆtøøøøðøøøs`   ˜A%C: Á>C( Â=CÃC( ÃC Ã C( Ã#C Ã$C( Ã'C: Ã(
C5Ã2C: Ã4C5Ã5C: Ã:
D-ÄD(Ä(D-c                  óB  ‡— 	 t          t          ¦  «        5 } t          j        | ¦  «        }ddd¦  «         n# 1 swxY w Y   t	          j        |d         d¦  «        }t	          j        ¦   «         |z
  t          t          ¬¦  «        k    r|d         Šˆfd„t          D ¦   «         S t          d                     t          ¦  «        t          j        ¬¦  «         nE# t          $ r8}t          d	                     |¦  «        t          j        ¬¦  «         Y d}~nd}~ww xY wdS )
zDLoad cached API response if it's fresh enough. Returns dict or None.Nr%   r$   )Údaysr   c                 ó"   •— i | ]}|‰|         “ŒS r   r   r   s     €r    r!   z$fetch_from_cache.<locals>.<dictcomp>K   s   ø€ Ð3Ð3Ð3 a�A�w˜q”zÐ3Ð3Ð3r"   z)[WARN] Cache older than {} days, ignoringr&   z[WARN] Cache unreadable: {})r.   r/   r,   Úloadr   Ústrptimer1   r   ÚCACHE_MAX_AGE_DAYSr-   r4   Úformatr5   r6   r3   )r9   ÚcacheÚ
cache_dater:   r   s       @r    Úfetch_from_cacherE   C   s`  ø€ ð
HÝ•*ÑÔð 	! Ý”I˜a‘L”LˆEð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!åÔ& u¨V¤}°jÑAÔAˆ
ÝŒ<‰>Œ>˜JÑ&­)Õ9KÐ*LÑ*LÔ*LÒLÐLØ˜IÔ&ˆGØ3Ð3Ð3Ð3­7Ð3Ñ3Ô3Ð3ÝÐ9×@Ò@ÕASÑTÔTÝ”:ð	ñ 	ô 	ð 	ð 	øåð Hð Hð HÝÐ+×2Ò2°1Ñ5Ô5½C¼JÐGÑGÔGÐGÐGÐGÐGÐGÐGøøøøðHøøøàˆ4s:   ƒC —8¬C ¸<¼C ¿<Á A%C Â&3C Ã
DÃ$.DÄDc                  óþ  — 	 ddl m}  ddlm} ddlm}  |t          ¦  «        } | t          t          ft          j
        |¦  «        |j        |¬¦  «        }i }t          D ]<}t          ||                     ¦   «         ¦  «        }|                     d¦  «        ||<   Œ=t!          dt"          j        ¬¦  «         |S # t&          $ r9}t!          d	                     |¦  «        t"          j        ¬¦  «         Y d
}~d
S d
}~ww xY w)zCCalculate prayer times locally with adhanpy (zero internet needed).r   )ÚPrayerTimes)ÚCalculationMethod)ÚZoneInfo)Ú	time_zonez%H:%Mz4[INFO] Computed prayer times offline (MWL, Canberra)r&   z&[ERROR] Offline calculation failed: {}N)Úadhanpy.PrayerTimesrG   Ú%adhanpy.calculation.CalculationMethodrH   ÚzoneinforI   ÚTIMEZONEÚLATITUDEÚ	LONGITUDEr   r1   ÚMUSLIM_WORLD_LEAGUEr-   ÚgetattrÚlowerr2   r4   r5   r6   r3   rB   )	rG   rH   rI   ÚtzÚptr8   r   Útr:   s	            r    Úfetch_offlinerW   S   s/  € ðØ3Ð3Ð3Ð3Ð3Ð3ØKÐKÐKÐKÐKÐKØ%Ð%Ð%Ð%Ð%Ð%àˆX•hÑÔˆØˆ[Ý•yÐ!ÝŒL˜ÑÔØÔ1Øð	
ñ 
ô 
ˆð ˆÝð 	,ð 	,ˆAÝ˜˜AŸGšG™IœIÑ&Ô&ˆAØŸ
š
 7Ñ+Ô+ˆF�1‰IˆIÝÐDÍ3Ì:ÐVÑVÔVÐVØˆøÝð ð ð ÝÐ6×=Ò=¸aÑ@Ô@ÅsÄzÐRÑRÔRÐRØˆtˆtˆtˆtˆtøøøøðøøøs   ‚B6B9 Â9
C<Ã.C7Ã7C<c                  ór  — t          ¦   «         } | rt          dt          j        ¬¦  «         | S t	          ¦   «         } | rt          dt          j        ¬¦  «         | S t          ¦   «         } | rt          dt          j        ¬¦  «         | S t          dt          j        ¬¦  «         t          j        d¦  «         dS )z3Try sources in order: API -> cache -> offline calc.z([INFO] Got prayer times from Aladhan APIr&   z"[INFO] Got prayer times from cachez0[INFO] Got prayer times from offline calculationz&[ERROR] All prayer time sources failedr   N)r;   r4   r5   r6   rE   rW   Úexit)r8   s    r    Úfetch_prayer_timesrZ   l   s±   € åÑÔ€FØð ÝÐ8½s¼zÐJÑJÔJÐJØˆÝÑÔ€FØð ÝÐ2½¼ÐDÑDÔDÐDØˆÝ‰_Œ_€FØð ÝÐ@ÅsÄzÐRÑRÔRÐRØˆÝ	Ð
2½¼ÐDÑDÔDÐDÝ„HˆQ�K„K€K€K€Kr"   c                  óD  — t          j        dgdd¬¦  «        } | j                             ¦   «                              d¦  «        D ]Z}|                     ¦   «         rD|                     ¦   «                              ¦   «         d         }t          j        d|gd¬¦  «         Œ[d S )NÚatqT)Úcapture_outputÚtextú
r   Úatrm)r]   )Ú
subprocessÚrunÚstdoutÚstripÚsplit)r8   ÚlineÚjob_ids      r    Úclear_old_jobsrh   ~   s�   € ÝŒ^˜U˜G°D¸tÐDÑDÔD€FØ”×#Ò#Ñ%Ô%×+Ò+¨DÑ1Ô1ð Bð BˆØ�:Š:‰<Œ<ð 	BØ—Z’Z‘\”\×'Ò'Ñ)Ô)¨!Ô,ˆFÝŒN˜F FÐ+¸DÐAÑAÔAÐAøðBð Br"   c                 óÐ  — d                      t          t          | ¦  «        }	 t          j        d|g|dz   dd¬¦  «        }|j        dk    r%t          d                      | |¦  «        ¦  «         d S t          d                      | ||j                             ¦   «         ¦  «        ¦  «         d S # t          $ r.}t          d	                      | |¦  «        ¦  «         Y d }~d S d }~ww xY w)
Nz
{} {} "{}"Úatr_   T)Úinputr]   r^   r   z  [OK] {} scheduled for {}z  [FAIL] {} at {}: {}z  [ERROR] {}: {})
rB   r   ÚCAST_SCRIPTra   rb   Ú
returncoder4   r6   rd   r3   )Úprayer_nameÚtime_strÚcmdr8   r:   s        r    Úschedule_jobrq   †   s  € Ø
×
Ò
¥­[¸+Ñ
FÔ
F€Cð9Ý”Ø�8ÐØ˜‘*ØØð	
ñ 
ô 
ˆð Ô Ò!Ð!ÝÐ.×5Ò5°kÀ8ÑLÔLÑMÔMÐMÐMÐMåÐ)×0Ò0°¸hÈÌ×H[ÒH[ÑH]ÔH]Ñ^Ô^Ñ_Ô_Ð_Ð_Ð_øÝð 9ð 9ð 9ÝÐ ×'Ò'¨°QÑ7Ô7Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð9øøøs   £AB- Á0;B- Â-
C%Â7#C Ã C%c                  óô  — t          j        ¦   «                              d¦  «        } t          d                     | t
          t          t          ¦  «        ¦  «         t          ¦   «         }t          d¦  «         t          ¦   «          t          d¦  «         t          D ]L}|                     |¦  «        }|rt          ||¦  «         Œ*t          d                     |¦  «        ¦  «         ŒMt          d¦  «         d S )Nz%Y-%m-%d %H:%M:%Sz4[{}] Fetching prayer times for {}, {} (method {})...zClearing old jobs...zScheduling prayers:z  [WARN] {} time not foundz%Done. Use atq to view scheduled jobs.)r   r1   r2   r4   rB   r	   r
   r   rZ   rh   r-   r)   rq   )Únow_strÚprayer_timesÚprayerro   s       r    Úmainrv   —   sñ   € ÝŒl‰nŒn×%Ò%Ð&9Ñ:Ô:€GÝ	Ð
@×
GÒ
GØ••w¥ñ(ô (ñ )ô )ð )å%Ñ'Ô'€LÝ	Ð
 Ñ!Ô!Ð!ÝÑÔÐÝ	Ð
Ñ Ô Ð Ýð ?ð ?ˆØ×#Ò# FÑ+Ô+ˆØð 	?Ý˜ Ñ*Ô*Ð*Ð*åÐ.×5Ò5°fÑ=Ô=Ñ>Ô>Ð>Ð>Ý	Ð
1Ñ2Ô2Ð2Ð2Ð2r"   Ú__main__)'Ú__doc__Úosr5   r,   ra   r(   r   r   ÚCONFIG_FILEr/   rA   Úconfigr.   r9   rf   rd   Ú
startswithre   ÚkeyÚvalr	   r
   r   rl   r)   r   rO   rP   rN   r-   r*   r;   rE   rW   rZ   rh   rq   rv   Ú__name__r   r"   r    ú<module>r€      s/  ðð	ð 	ð 
€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à+€Ø2€
ØÐ à	€Ø	€Tˆ+ÑÔð .˜!Øð .ð .ˆØ�zŠz‰|Œ|ˆØð 	.˜Ÿš¨Ñ,Ô,ð 	.°¸°°Ø—z’z # qÑ)Ô)‰HˆC�Ø"%§)¢)¡+¤+ˆF�3—9’9‘;”;Ñøð	.ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð ˆf„~€Ø
�Ô
€Ø	�Ô	€Ø.€Ø�jŠj˜Ð(JÑKÔK€ð €Ø€	Ø€à
5Ð
5Ð
5€Ø7€ðð ð ð*ð ð ð ð ð ð2ð ð ð$Bð Bð Bð9ð 9ð 9ð"3ð 3ð 3ð" ˆzÒÐØ€D�F„F€F€F€Fð Ðs   ²A7B6Â6B:Â=B: